Group management
authorMathieu <mbaudier@argeo.org>
Sun, 13 Nov 2022 08:35:49 +0000 (09:35 +0100)
committerMathieu <mbaudier@argeo.org>
Sun, 13 Nov 2022 08:35:49 +0000 (09:35 +0100)
swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties
swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteMsg.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/ChooseUserDialog.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/GroupUiProvider.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewOrgForm.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UserColumn.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UsersPart.java

index 121548596ff830e50a91bf38a1a8294979924307..0cd0f2f21fefd7c9cd3afe70e0446c2fce045053 100644 (file)
@@ -36,6 +36,9 @@ groupAdminRole=Can create groups and organisations and modify them
 publisherRole=Can validate and publish content
 coworkerRole=Is an active user of the organisation
 
+# Group
+chooseAMember=Choose a member
+
 # ContextAddressComposite
 chooseAnOrganisation=Choose an organisation
 street=Street
index 22c5de62d4aa3a17ab7f9c8ef573a4898014e9fb..e0520a58b2b4464fce26c86cc3b8e6d20a48fcf3 100644 (file)
@@ -40,6 +40,9 @@ groupAdminRole=Peut cr
 publisherRole=Peut publier et valider du contenu
 coworkerRole=Est un membre en activité de l'organisation
 
+# Group
+chooseAMember=Choisir un membre
+
 # ContextAddressComposite
 chooseAnOrganisation=Choisir une organisation
 street=Rue
index 84ba5f06ae5a49f3d3f684f2d70f50c2d7d1954b..4bbcb62d215f354de362cc0e69b10664d665d8a6 100644 (file)
@@ -14,6 +14,8 @@ public enum SuiteMsg implements Localized {
        orgWizardWindowTitle, orgWizardPageTitle, legalName, legalForm, vatId,
        // Roles
        userAdminRole, groupAdminRole, publisherRole, coworkerRole,
+       // Group
+       chooseAMember,
        // ContextAddressComposite
        chooseAnOrganisation, street, streetComplement, zipCode, city, state, country, geopoint,
        // FilteredOrderableEntityTable
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/ChooseUserDialog.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/ChooseUserDialog.java
new file mode 100644 (file)
index 0000000..60c79b4
--- /dev/null
@@ -0,0 +1,75 @@
+package org.argeo.app.ui.people;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.dialogs.CmsMessageDialog;
+import org.argeo.cms.swt.widgets.SwtTableView;
+import org.argeo.cms.swt.widgets.SwtTreeView;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+public class ChooseUserDialog extends CmsMessageDialog {
+       private ContentSession contentSession;
+       private CmsUserManager cmsUserManager;
+       private HierarchyUnit defaultHierarchyUnit;
+
+       private Content selected;
+
+       public ChooseUserDialog(Shell parentShell, String message, ContentSession contentSession,
+                       CmsUserManager cmsUserManager, HierarchyUnit defaultHierarchyUnit) {
+               super(parentShell, message, CmsMessageDialog.QUESTION);
+               this.contentSession = contentSession;
+               this.cmsUserManager = cmsUserManager;
+               this.defaultHierarchyUnit = defaultHierarchyUnit;
+       }
+
+       @Override
+       protected Control createInputArea(Composite parent) {
+               SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
+               CmsSwtUtils.fill(sashForm);
+
+               HierarchyUnitPart hierarchyPart = new HierarchyUnitPart(contentSession, cmsUserManager);
+               SwtTreeView<HierarchyUnit> directoriesView = new SwtTreeView<>(sashForm, SWT.BORDER, hierarchyPart);
+
+               UsersPart usersPart = new UsersPart(contentSession, cmsUserManager);
+
+               SwtTableView<?, ?> usersView = new SwtTableView<>(sashForm, SWT.BORDER, usersPart);
+               usersView.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+               // CONTROLLER
+               hierarchyPart.onSelected((o) -> {
+                       if (o instanceof HierarchyUnit) {
+                               HierarchyUnit hierarchyUnit = (HierarchyUnit) o;
+                               usersPart.setInput(hierarchyUnit);
+                       }
+               });
+
+               usersPart.onSelected((o) -> {
+                       Content user = (Content) o;
+                       selected = user;
+               });
+
+               hierarchyPart.refresh();
+
+               sashForm.setWeights(new int[] { 30, 70 });
+               return sashForm;
+       }
+
+       public Content getSelected() {
+               return selected;
+       }
+
+       @Override
+       protected Point getInitialSize() {
+               return new Point(600, 800);
+       }
+
+}
index f0a5b38a90dbe6a442632f93b830b51280159932..8cf24f00c0e7851cd0160be65ef751b96b2e5a4f 100644 (file)
@@ -1,18 +1,34 @@
 package org.argeo.app.ui.people;
 
 import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentSession;
 import org.argeo.api.acr.ldap.LdapAttr;
 import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.cms.directory.CmsGroup;
 import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.app.ui.SuiteIcon;
 import org.argeo.app.ui.SuiteMsg;
 import org.argeo.app.ui.SuiteUiUtils;
 import org.argeo.cms.CurrentUser;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.Selected;
+import org.argeo.cms.swt.acr.SwtSection;
 import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.widgets.SwtTableView;
+import org.argeo.cms.ux.widgets.AbstractTabularPart;
+import org.argeo.cms.ux.widgets.CmsDialog;
+import org.argeo.cms.ux.widgets.TabularPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
 import org.osgi.service.useradmin.Role;
 
 public class GroupUiProvider implements SwtUiProvider {
@@ -20,10 +36,37 @@ public class GroupUiProvider implements SwtUiProvider {
 
        @Override
        public Control createUiPart(Composite parent, Content context) {
-               CmsGroup group = context.adapt(CmsGroup.class);
+               CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+
                Content hierarchyUnitContent = context.getParent().getParent();
                HierarchyUnit hierarchyUnit = hierarchyUnitContent.adapt(HierarchyUnit.class);
 
+               ContentSession contentSession = ((ProvidedContent) context).getSession();
+
+               TabularPart<Content, Content> membersPart = new AbstractTabularPart<Content, Content>() {
+                       Role[] roles = context.adapt(CmsGroup.class).getMembers();
+
+                       @Override
+                       public int getItemCount() {
+                               return roles.length;
+                       }
+
+                       @Override
+                       public Content getData(int row) {
+                               Role role = roles[row];
+                               Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, role);
+                               return content;
+                       }
+
+               };
+               membersPart.addColumn(new UserColumn());
+
+               // VIEW
+               SwtSection area = new SwtSection(parent, 0, context);
+               area.setLayoutData(CmsSwtUtils.fillAll());
+               area.setLayout(new GridLayout());
+
+               // title
                // TODO localise at content level
                String title;
                if (context.hasContentClass(LdapObj.organization))
@@ -32,12 +75,32 @@ public class GroupUiProvider implements SwtUiProvider {
                else
                        title = SuiteMsg.group.lead() + " " + context.attr(LdapAttr.cn) + " ("
                                        + hierarchyUnit.getHierarchyUnitLabel(CurrentUser.locale()) + ")";
-               SuiteUiUtils.addFormLabel(parent, title);
+               SuiteUiUtils.addFormLabel(area, title);
+
+               // toolbar
+               ToolBar toolBar = new ToolBar(area, SWT.NONE);
+               toolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
+
+               ToolItem deleteItem = new ToolItem(toolBar, SWT.FLAT);
+               deleteItem.setEnabled(false);
+               deleteItem.setImage(theme.getSmallIcon(SuiteIcon.delete));
+
+               ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
+               addItem.setImage(theme.getSmallIcon(SuiteIcon.add));
+               addItem.addSelectionListener((Selected) (e) -> {
+                       ChooseUserDialog chooseUserDialog = new ChooseUserDialog(parent.getDisplay().getActiveShell(),
+                                       SuiteMsg.chooseAMember.lead(), contentSession, cmsUserManager, hierarchyUnit);
+                       if (chooseUserDialog.open() == CmsDialog.OK) {
+                               Content chosen = chooseUserDialog.getSelected();
+                               // TODO add
+                       }
+               });
 
-               for (Role member : group.getMembers()) {
-                       new Label(parent, 0).setText(member.getName());
-               }
-               return null;
+               // members view
+               SwtTableView<Content, Content> membersView = new SwtTableView<>(area, SWT.BORDER, membersPart);
+               membersView.setLayoutData(CmsSwtUtils.fillAll());
+               membersView.refresh();
+               return membersView;
 
        }
 
index 7af60b5f66df85135059ccb6adc6a27cf1b36732..a9800e696bae1d1d64079fafb0222174fd82e1de 100644 (file)
@@ -21,7 +21,7 @@ public class NewOrgForm extends AbstractGuidedForm {
        private Content hierarchyUnit;
        private CmsUserManager cmsUserManager;
 
-       protected Text firstNameT;
+       protected Text orgNameT;
 
        public NewOrgForm(CmsUserManager cmsUserManager, Content hierarchyUnit) {
                this.hierarchyUnit = hierarchyUnit;
@@ -55,7 +55,7 @@ public class NewOrgForm extends AbstractGuidedForm {
 
        @Override
        public boolean canFinish() {
-               String firstName = firstNameT.getText();
+               String firstName = orgNameT.getText();
                if (isEmpty(firstName)) {
                        return false;
                } else
@@ -74,9 +74,9 @@ public class NewOrgForm extends AbstractGuidedForm {
 
                        // FirstName
                        SuiteUiUtils.createBoldLabel(parent, SuiteMsg.org);
-                       firstNameT = new Text(parent, SWT.BORDER);
+                       orgNameT = new Text(parent, SWT.BORDER);
                        // firstNameTxt.setMessage("a first name");
-                       firstNameT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+                       orgNameT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
 
                        ModifyListener ml = new ModifyListener() {
                                private static final long serialVersionUID = 1939491923843870844L;
@@ -87,9 +87,9 @@ public class NewOrgForm extends AbstractGuidedForm {
                                }
                        };
 
-                       firstNameT.addModifyListener(ml);
+                       orgNameT.addModifyListener(ml);
 
-                       firstNameT.setFocus();
+                       orgNameT.setFocus();
                }
        }
 }
index 1cbd9be76759f04be480510522b0733b47cfb4f8..e2339919bec00a17f3c7eee8e3b0e6612ddc8777 100644 (file)
@@ -23,9 +23,9 @@ import org.argeo.cms.swt.widgets.SwtGuidedFormDialog;
 import org.argeo.cms.swt.widgets.SwtTableView;
 import org.argeo.cms.swt.widgets.SwtTreeView;
 import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ux.widgets.CmsDialog;
 import org.argeo.cms.ux.widgets.Column;
 import org.argeo.cms.ux.widgets.GuidedForm;
-import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.SashForm;
 import org.eclipse.swt.graphics.Point;
@@ -83,7 +83,6 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
 
                ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
                deleteItem.setEnabled(false);
-//             CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
                deleteItem.setImage(theme.getSmallIcon(SuiteIcon.delete));
 
                Menu menu = new Menu(Display.getCurrent().getActiveShell(), SWT.POP_UP);
@@ -97,7 +96,7 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
                        Content huContent = ContentUtils.hierarchyUnitToContent(contentSession, hierarchyUnit);
                        GuidedForm wizard = new NewUserForm(cmsUserManager, huContent);
                        SwtGuidedFormDialog dialog = new SwtGuidedFormDialog(parent.getShell(), wizard);
-                       if (dialog.open() == Window.OK) {
+                       if (dialog.open() == CmsDialog.OK) {
                                // TODO create
                        }
                });
@@ -110,7 +109,7 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
                        Content huContent = ContentUtils.hierarchyUnitToContent(contentSession, hierarchyUnit);
                        GuidedForm wizard = new NewOrgForm(cmsUserManager, huContent);
                        SwtGuidedFormDialog dialog = new SwtGuidedFormDialog(parent.getShell(), wizard);
-                       if (dialog.open() == Window.OK) {
+                       if (dialog.open() == CmsDialog.OK) {
                                // TODO create
                        }
                });
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UserColumn.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UserColumn.java
new file mode 100644 (file)
index 0000000..c8c4ae1
--- /dev/null
@@ -0,0 +1,39 @@
+package org.argeo.app.ui.people;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.cms.ux.CmsIcon;
+import org.argeo.app.ui.SuiteIcon;
+import org.argeo.cms.auth.UserAdminUtils;
+import org.argeo.cms.ux.widgets.Column;
+import org.osgi.service.useradmin.User;
+
+public class UserColumn implements Column<Content> {
+       @Override
+       public String getText(Content role) {
+               if (role.hasContentClass(LdapObj.inetOrgPerson))
+                       return UserAdminUtils.getUserDisplayName(role.adapt(User.class));
+               else if (role.hasContentClass(LdapObj.organization))
+                       return role.attr(LdapAttr.o);
+               else if (role.hasContentClass(LdapObj.groupOfNames))
+                       return role.attr(LdapAttr.cn);
+               else
+                       return null;
+       }
+
+       @Override
+       public CmsIcon getIcon(Content role) {
+               if (role.hasContentClass(LdapObj.posixAccount))
+                       return SuiteIcon.user;
+               else if (role.hasContentClass(LdapObj.inetOrgPerson))
+                       return SuiteIcon.person;
+               else if (role.hasContentClass(LdapObj.organization))
+                       return SuiteIcon.organisationContact;
+               else if (role.hasContentClass(LdapObj.groupOfNames))
+                       return SuiteIcon.group;
+               else
+                       return null;
+       }
+
+}
index 96e24444cfe2a2c60c7910bf173daa0f10a5df80..c615ebff81aa174d0e1d223e4943ea369e9c0bd7 100644 (file)
@@ -5,19 +5,13 @@ import java.util.List;
 
 import org.argeo.api.acr.Content;
 import org.argeo.api.acr.ContentSession;
-import org.argeo.api.acr.ldap.LdapAttr;
 import org.argeo.api.acr.ldap.LdapObj;
 import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
 import org.argeo.api.cms.directory.UserDirectory;
-import org.argeo.api.cms.ux.CmsIcon;
-import org.argeo.app.ui.SuiteIcon;
 import org.argeo.cms.acr.ContentUtils;
-import org.argeo.cms.auth.UserAdminUtils;
-import org.argeo.cms.ux.widgets.Column;
 import org.argeo.cms.ux.widgets.DefaultTabularPart;
 import org.osgi.service.useradmin.Role;
-import org.osgi.service.useradmin.User;
 
 public class UsersPart extends DefaultTabularPart<HierarchyUnit, Content> {
        private ContentSession contentSession;
@@ -26,33 +20,7 @@ public class UsersPart extends DefaultTabularPart<HierarchyUnit, Content> {
        public UsersPart(ContentSession contentSession, CmsUserManager cmsUserManager) {
                this.contentSession = contentSession;
                this.cmsUserManager = cmsUserManager;
-               addColumn(new Column<Content>() {
-
-                       @Override
-                       public String getText(Content role) {
-                               if (role.hasContentClass(LdapObj.inetOrgPerson))
-                                       return UserAdminUtils.getUserDisplayName(role.adapt(User.class));
-                               else if (role.hasContentClass(LdapObj.organization))
-                                       return role.attr(LdapAttr.o);
-                               else if (role.hasContentClass(LdapObj.groupOfNames))
-                                       return role.attr(LdapAttr.cn);
-                               else
-                                       return null;
-                       }
-
-                       @Override
-                       public CmsIcon getIcon(Content role) {
-                               if (role.hasContentClass(LdapObj.posixAccount))
-                                       return SuiteIcon.user;
-                               else if (role.hasContentClass(LdapObj.inetOrgPerson))
-                                       return SuiteIcon.person;
-                               else if (role.hasContentClass(LdapObj.organization))
-                                       return SuiteIcon.organisationContact;
-                               else if (role.hasContentClass(LdapObj.groupOfNames))
-                                       return SuiteIcon.group;
-                               else
-                                       return null;
-                       }
+               addColumn(new UserColumn() {
 
                        @Override
                        public int getWidth() {
@@ -79,8 +47,7 @@ public class UsersPart extends DefaultTabularPart<HierarchyUnit, Content> {
                                                || directChild.isType(HierarchyUnit.Type.ROLES))) {
                                        for (Role r : ud.getHierarchyUnitRoles(directChild, null, false)) {
                                                Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, r);
-                                               if (content.hasContentClass(LdapObj.inetOrgPerson, LdapObj.organization,
-                                                               LdapObj.groupOfNames))
+                                               if (content.hasContentClass(LdapObj.inetOrgPerson, LdapObj.organization, LdapObj.groupOfNames))
                                                        roles.add(content);
                                        }
                                }