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.3.0, 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

              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