This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch 4_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/4_1_X by this push:
     new 101c2969e0 Fixing ordering issues with display columns for Realms and 
Anys
101c2969e0 is described below

commit 101c2969e02ce124e98cf6d1b880784c3d54ddd9
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Thu Mar 5 09:58:00 2026 +0100

    Fixing ordering issues with display columns for Realms and Anys
---
 .../syncope/client/console/PreferenceManager.java  |  2 -
 .../panels/AnyDisplayAttributesModalPanel.java     |  2 +-
 .../console/panels/AnyObjectDirectoryPanel.java    |  5 +-
 .../client/console/panels/GroupDirectoryPanel.java |  5 +-
 .../panels/GroupDisplayAttributesModalPanel.java   |  1 +
 .../client/console/panels/RealmDirectoryPanel.java | 84 +++++++++++++++-------
 .../panels/RealmDisplayAttributesModalPanel.java   |  7 +-
 .../client/console/panels/UserDirectoryPanel.java  |  5 +-
 .../panels/UserDisplayAttributesModalPanel.java    |  1 +
 9 files changed, 72 insertions(+), 40 deletions(-)

diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/PreferenceManager.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/PreferenceManager.java
index ad6c0f49c6..3624b6e34e 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/PreferenceManager.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/PreferenceManager.java
@@ -25,7 +25,6 @@ import java.io.Serializable;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Base64;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -121,7 +120,6 @@ public final class PreferenceManager implements 
Serializable {
             result.addAll(List.of(items));
         }
 
-        Collections.sort(result);
         return result;
     }
 
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyDisplayAttributesModalPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyDisplayAttributesModalPanel.java
index 3d62cce046..46100a2845 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyDisplayAttributesModalPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyDisplayAttributesModalPanel.java
@@ -51,7 +51,7 @@ public abstract class AnyDisplayAttributesModalPanel<T 
extends Serializable> ext
         super(
                 modal,
                 pageRef,
-                
SearchableFields.get(getTOClass(type)).keySet().stream().toList(),
+                
SearchableFields.get(getTOClass(type)).keySet().stream().sorted().toList(),
                 pSchemaNames,
                 dSchemaNames,
                 getPrefDetailView(type),
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
index f8fa5d00a2..848d9a48f5 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.panels;
 
 import java.io.Serializable;
 import java.util.List;
-import java.util.stream.Collectors;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.SyncopeWebApplication;
@@ -90,8 +89,8 @@ public class AnyObjectDirectoryPanel extends 
AnyDirectoryPanel<AnyObjectTO, AnyO
                 target.add(displayAttributeModal.setContent(new 
AnyObjectDisplayAttributesModalPanel<>(
                         displayAttributeModal,
                         page.getPageReference(),
-                        
plainSchemas.stream().map(PlainSchemaTO::getKey).collect(Collectors.toList()),
-                        
derSchemas.stream().map(DerSchemaTO::getKey).collect(Collectors.toList()),
+                        
plainSchemas.stream().map(PlainSchemaTO::getKey).sorted().toList(),
+                        
derSchemas.stream().map(DerSchemaTO::getKey).sorted().toList(),
                         type)));
                 displayAttributeModal.addSubmitButton();
                 displayAttributeModal.header(new 
ResourceModel("any.attr.display"));
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
index 96f8f872f3..76c47bfacd 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
@@ -21,7 +21,6 @@ package org.apache.syncope.client.console.panels;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
 import java.util.List;
-import java.util.stream.Collectors;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
@@ -226,8 +225,8 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
                 target.add(displayAttributeModal.setContent(new 
GroupDisplayAttributesModalPanel<>(
                         displayAttributeModal,
                         page.getPageReference(),
-                        
plainSchemas.stream().map(PlainSchemaTO::getKey).collect(Collectors.toList()),
-                        
derSchemas.stream().map(DerSchemaTO::getKey).collect(Collectors.toList()))));
+                        
plainSchemas.stream().map(PlainSchemaTO::getKey).sorted().toList(),
+                        
derSchemas.stream().map(DerSchemaTO::getKey).sorted().toList())));
                 displayAttributeModal.header(new 
ResourceModel("any.attr.display"));
                 displayAttributeModal.show(true);
             }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDisplayAttributesModalPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDisplayAttributesModalPanel.java
index e6a0472d73..cd80da5313 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDisplayAttributesModalPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDisplayAttributesModalPanel.java
@@ -41,6 +41,7 @@ public class GroupDisplayAttributesModalPanel<T extends 
Serializable> extends An
             final PageReference pageRef,
             final List<String> schemaNames,
             final List<String> dSchemaNames) {
+
         super(modal, pageRef, schemaNames, dSchemaNames, 
AnyTypeKind.GROUP.name());
     }
 }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDirectoryPanel.java
index 35803257ab..c2b3a3c2b6 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDirectoryPanel.java
@@ -20,9 +20,12 @@ package org.apache.syncope.client.console.panels;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.time.OffsetDateTime;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
@@ -45,6 +48,8 @@ import 
org.apache.syncope.client.console.rest.SchemaRestClient;
 import org.apache.syncope.client.console.tasks.RealmPropagationTasks;
 import org.apache.syncope.client.console.tasks.TemplatesTogglePanel;
 import 
org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AttrColumn;
+import 
org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.BooleanPropertyColumn;
+import 
org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
 import 
org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
 import 
org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
@@ -83,6 +88,7 @@ import org.apache.wicket.model.StringResourceModel;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.springframework.util.ReflectionUtils;
 
 public class RealmDirectoryPanel
         extends DirectoryPanel<RealmTO, RealmTO, 
RealmDirectoryPanel.RealmDataProvider, RealmRestClient> {
@@ -154,35 +160,63 @@ public class RealmDirectoryPanel
 
     @Override
     protected List<IColumn<RealmTO, String>> getColumns() {
-        List<String> selectedColumns = 
PreferenceManager.getList(IdRepoConstants.PREF_REALM_DETAILS_VIEW);
-        
selectedColumns.retainAll(RealmDisplayAttributesModalPanel.AVAILABLE_COLUMNS);
-        if (selectedColumns.isEmpty()) {
-            selectedColumns = new 
ArrayList<>(RealmDisplayAttributesModalPanel.DEFAULT_COLUMNS);
-            PreferenceManager.setList(IdRepoConstants.PREF_REALM_DETAILS_VIEW, 
selectedColumns);
-        }
-        List<String> selectedPlainSchemas = 
PreferenceManager.getList(IdRepoConstants.PREF_REALM_PLAIN_ATTRS_VIEW);
-        
selectedPlainSchemas.retainAll(plainSchemas.stream().map(PlainSchemaTO::getKey).toList());
+        List<IColumn<RealmTO, String>> columns = new ArrayList<>();
+        columns.add(new KeyPropertyColumn<>(
+                new ResourceModel(Constants.KEY_FIELD_NAME, 
Constants.KEY_FIELD_NAME), Constants.KEY_FIELD_NAME));
+
+        List<IColumn<RealmTO, String>> prefcolumns = new ArrayList<>();
+        
PreferenceManager.getList(IdRepoConstants.PREF_REALM_DETAILS_VIEW).stream().
+                filter(name -> 
!Constants.KEY_FIELD_NAME.equalsIgnoreCase(name)).
+                forEach(name -> addPropertyColumn(
+                name,
+                ReflectionUtils.findField(RealmTO.class, name),
+                prefcolumns));
+
+        
PreferenceManager.getList(IdRepoConstants.PREF_REALM_PLAIN_ATTRS_VIEW).stream().
+                map(a -> plainSchemas.stream().filter(p -> 
p.getKey().equals(a)).findFirst()).
+                flatMap(Optional::stream).
+                forEach(s -> prefcolumns.add(new AttrColumn<>(
+                s.getKey(), 
s.getLabel(SyncopeConsoleSession.get().getLocale()), SchemaType.PLAIN)));
+
+        
PreferenceManager.getList(IdRepoConstants.PREF_REALM_DER_ATTRS_VIEW).stream().
+                map(a -> derSchemas.stream().filter(p -> 
p.getKey().equals(a)).findFirst()).
+                flatMap(Optional::stream).
+                forEach(s -> prefcolumns.add(new AttrColumn<>(
+                s.getKey(), 
s.getLabel(SyncopeConsoleSession.get().getLocale()), SchemaType.DERIVED)));
+
+        // Add defaults in case of no selection
+        if (prefcolumns.isEmpty()) {
+            for (String name : 
RealmDisplayAttributesModalPanel.DEFAULT_COLUMNS) {
+                addPropertyColumn(
+                        name,
+                        ReflectionUtils.findField(RealmTO.class, name),
+                        prefcolumns);
+            }
 
-        List<String> selectedDerSchemas = 
PreferenceManager.getList(IdRepoConstants.PREF_REALM_DER_ATTRS_VIEW);
-        
selectedDerSchemas.retainAll(derSchemas.stream().map(DerSchemaTO::getKey).toList());
+            PreferenceManager.setList(
+                    IdRepoConstants.PREF_REALM_DETAILS_VIEW,
+                    RealmDisplayAttributesModalPanel.DEFAULT_COLUMNS);
+        }
 
-        List<IColumn<RealmTO, String>> columns = new ArrayList<>();
-        selectedColumns.forEach(column -> addPropertyColumn(column, columns));
-        plainSchemas.stream().
-                filter(schema -> 
selectedPlainSchemas.contains(schema.getKey())).
-                forEach(schema -> columns.add(new AttrColumn<>(
-                schema.getKey(), schema.getLabel(getLocale()), 
SchemaType.PLAIN)));
-
-        derSchemas.stream().
-                filter(schema -> selectedDerSchemas.contains(schema.getKey())).
-                forEach(schema -> columns.add(new AttrColumn<>(
-                schema.getKey(), schema.getLabel(getLocale()), 
SchemaType.DERIVED)));
+        columns.addAll(prefcolumns);
         return columns;
     }
 
-    protected void addPropertyColumn(final String name, final 
List<IColumn<RealmTO, String>> columns) {
+    protected void addPropertyColumn(
+            final String name,
+            final Field field,
+            final List<IColumn<RealmTO, String>> columns) {
+
         if (Constants.KEY_FIELD_NAME.equalsIgnoreCase(name)) {
-            columns.add(new KeyPropertyColumn<>(new 
StringResourceModel(Constants.KEY_FIELD_NAME, this), name));
+            columns.add(new KeyPropertyColumn<>(new ResourceModel(name, name), 
name, name));
+        } else if (field != null && !field.isSynthetic()
+                && (field.getType().equals(Boolean.class) || 
field.getType().equals(boolean.class))) {
+
+            columns.add(new BooleanPropertyColumn<>(new ResourceModel(name, 
name), name, name));
+        } else if (field != null && !field.isSynthetic()
+                && (field.getType().equals(Date.class) || 
field.getType().equals(OffsetDateTime.class))) {
+
+            columns.add(new DatePropertyColumn<>(new ResourceModel(name, 
name), name, name));
         } else {
             columns.add(new PropertyColumn<>(new ResourceModel(name, name), 
name, name));
         }
@@ -201,8 +235,8 @@ public class RealmDirectoryPanel
                         displayAttributeModal,
                         page.getPageReference(),
                         RealmDisplayAttributesModalPanel.AVAILABLE_COLUMNS,
-                        
plainSchemas.stream().map(PlainSchemaTO::getKey).toList(),
-                        
derSchemas.stream().map(DerSchemaTO::getKey).toList())));
+                        
plainSchemas.stream().map(PlainSchemaTO::getKey).sorted().toList(),
+                        
derSchemas.stream().map(DerSchemaTO::getKey).sorted().toList())));
                 displayAttributeModal.header(new 
ResourceModel("any.attr.display"));
                 displayAttributeModal.show(true);
             }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDisplayAttributesModalPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDisplayAttributesModalPanel.java
index 018b9cc668..4d2a1e3502 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDisplayAttributesModalPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDisplayAttributesModalPanel.java
@@ -36,16 +36,16 @@ public class RealmDisplayAttributesModalPanel<T extends 
Serializable> extends Ab
             "parent",
             "plainAttrs",
             "derAttrs",
-            "templates",
             "accountPolicy",
             "passwordPolicy",
             "authPolicy",
             "accessPolicy",
             "attrReleasePolicy",
-            "ticketExpirationPolicy");
+            "ticketExpirationPolicy",
+            "actions",
+            "templates");
 
     protected static final List<String> DEFAULT_COLUMNS = List.of(
-            Constants.KEY_FIELD_NAME,
             Constants.NAME_FIELD_NAME,
             "fullPath",
             "anyTypeClasses");
@@ -54,6 +54,7 @@ public class RealmDisplayAttributesModalPanel<T extends 
Serializable> extends Ab
             filter(field -> !Modifier.isStatic(field.getModifiers())).
             map(Field::getName).
             filter(fieldName -> !EXCLUDED_COLUMNS.contains(fieldName)).
+            sorted().
             toList();
 
     private static final long serialVersionUID = 4055453846383559861L;
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
index ef5dea5ba2..e2944e20cb 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
@@ -23,7 +23,6 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.stream.Collectors;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.SyncopeWebApplication;
@@ -110,8 +109,8 @@ public class UserDirectoryPanel extends 
AnyDirectoryPanel<UserTO, UserRestClient
                 target.add(displayAttributeModal.setContent(new 
UserDisplayAttributesModalPanel<>(
                         displayAttributeModal,
                         page.getPageReference(),
-                        
plainSchemas.stream().map(PlainSchemaTO::getKey).collect(Collectors.toList()),
-                        
derSchemas.stream().map(DerSchemaTO::getKey).collect(Collectors.toList()))));
+                        
plainSchemas.stream().map(PlainSchemaTO::getKey).sorted().toList(),
+                        
derSchemas.stream().map(DerSchemaTO::getKey).sorted().toList())));
 
                 displayAttributeModal.header(new 
ResourceModel("any.attr.display"));
                 displayAttributeModal.addSubmitButton();
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
index 7863e292f0..580c33b635 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
@@ -41,6 +41,7 @@ public class UserDisplayAttributesModalPanel<T extends 
Serializable> extends Any
             final PageReference pageRef,
             final List<String> schemaNames,
             final List<String> dSchemaNames) {
+
         super(modal, pageRef, schemaNames, dSchemaNames, 
AnyTypeKind.USER.name());
     }
 }

Reply via email to