Uploaded image for project: 'Magnolia UI'
  1. Magnolia UI
  2. MGNLUI-8725

HierarchicalJcrDataProvider doesn't support initial sort by node name (jcrName)

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Major Major
    • 6.2.44
    • 6.2.43
    • content app
    • None

      Steps to reproduce

      1. app.yaml
        datasource:
           $type: jcrDatasource
           sortBy:
              jcrName: ascending
         

      info.magnolia.ui.contentapp.HierarchicalJcrDataProvider

      private Comparator<Item> createComparator() {
          Comparator<Item> comparators = null;
      
          for (Map.Entry<String, SortDirection> entry : datasourceDefinition.getSortBy().entrySet()) {
              Comparator<Item> comparator = Comparator.comparing(item -> {
                  if (item.isNode()) {
                      if ("jcrPath".equals(entry.getKey())) {
                          return NodeUtil.getPathIfPossible((Node) item);
                      }
                      return PropertyUtil.getString((Node) item, entry.getKey(), "");
                  }
                  return "";
              });
              comparator = isReversed(entry.getValue()) ? comparator.reversed() : comparator;
              comparators = comparators == null ? comparator : comparators.thenComparing(comparator);
          }
          return comparators;
      } 

      info.magnolia.ui.contentapp.JcrQueryBuilder (ListView) already supports sortBy node name (https://jira.magnolia-cms.com/browse/MGNLUI-6725)

      Fix:

      info.magnolia.ui.contentapp.HierarchicalJcrDataProvider

      private Comparator<Item> createComparator() {
          Comparator<Item> comparators = null;
      
          for (Map.Entry<String, SortDirection> entry : datasourceDefinition.getSortBy().entrySet()) {
             Comparator<Item> comparator = Comparator.comparing(item -> {
                if (item.isNode()) {
                   if ("jcrPath".equals(entry.getKey())) {
                      return NodeUtil.getPathIfPossible((Node) item);
                   }
                   if (getNodeNameProperty().equals(entry.getKey())) {
                      return NodeUtil.getName((Node) item);
                   }
                   return PropertyUtil.getString((Node) item, entry.getKey(), "");
                }
                return "";
             });
             comparator = isReversed(entry.getValue()) ? comparator.reversed() : comparator;
             comparators = comparators == null ? comparator : comparators.thenComparing(comparator);
          }
          return comparators;
      }
      
      private String getNodeNameProperty() {
          return Optional.ofNullable(datasourceDefinition.getNodeNameProperty()).orElse("jcrName");
      }

       

      Expected results

      nodes are sorted based on name

      Actual results

      nodes are not sorted

      Workaround

      add additional sortBy "jcrPath"

      Development notes

        Acceptance criteria

          1. image-2024-03-06-07-57-19-219.png
            23 kB
            Björn Eschle
          2. image-2024-03-06-07-57-22-586.png
            23 kB
            Björn Eschle
          3. image-2024-03-06-07-57-45-386.png
            14 kB
            Björn Eschle
          4. image-2024-03-06-07-58-01-120.png
            14 kB
            Björn Eschle
          5. image-2024-03-06-07-58-16-154.png
            23 kB
            Björn Eschle
          6. image-2024-03-06-07-58-49-988.png
            20 kB
            Björn Eschle

              asiska Adam Siska
              beschle Björn Eschle
              Nucleus
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Created:
                Updated:
                Resolved:
                Work Started:

                  Bug DoR
                  Task DoD