Group management
authorMathieu <mbaudier@argeo.org>
Mon, 14 Nov 2022 08:00:06 +0000 (09:00 +0100)
committerMathieu <mbaudier@argeo.org>
Mon, 14 Nov 2022 08:00:06 +0000 (09:00 +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/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/NewUserForm.java
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java

index 0cd0f2f21fefd7c9cd3afe70e0446c2fce045053..d4bf08ada4aa90cfcb452176066f239f901393c7 100644 (file)
@@ -22,6 +22,7 @@ salutation=Salutation
 email=Email
 personWizardWindowTitle=New person
 personWizardPageTitle=Create a contact
+personWizardFeedback=Contact was created
 
 # NewOrgWizard
 legalName=Legal name
@@ -29,6 +30,7 @@ legalForm=Legal form
 vatId=VAT ID
 orgWizardWindowTitle=New organisation
 orgWizardPageTitle=Create an organisation
+orgWizardFeedback=Organisation was created
 
 # Roles
 userAdminRole=Can create users and modify them
index e0520a58b2b4464fce26c86cc3b8e6d20a48fcf3..0015269d92af3898c8dd486e358b34c715d8beee 100644 (file)
@@ -26,6 +26,7 @@ salutation=Salutation
 email=Email
 personWizardWindowTitle=Nouvelle personne
 personWizardPageTitle=Créer un contact
+personWizardFeedback=Le contact a été créé
 
 # NewOrgWizard
 legalName=Nom
@@ -33,6 +34,7 @@ legalForm=Forme l
 vatId=ID TVA
 orgWizardWindowTitle=Nouvelle organisation
 orgWizardPageTitle=Créer une organisation
+orgWizardFeedback=L'organisation a été crée
 
 # Roles
 userAdminRole=Peut créer des utilisateurs et les modifier
index 4bbcb62d215f354de362cc0e69b10664d665d8a6..4d515d7220e7c8453aefeb70bf856cc3fe69928c 100644 (file)
@@ -9,9 +9,9 @@ public enum SuiteMsg implements Localized {
        // UI parts
        dashboard, people, documents, locations, recentItems,
        // NewPersonWizard
-       firstName, lastName, salutation, email, personWizardWindowTitle, personWizardPageTitle,
+       firstName, lastName, salutation, email, personWizardWindowTitle, personWizardPageTitle, personWizardFeedback,
        // NewOrgWizard
-       orgWizardWindowTitle, orgWizardPageTitle, legalName, legalForm, vatId,
+       orgWizardWindowTitle, orgWizardPageTitle, orgWizardFeedback, legalName, legalForm, vatId,
        // Roles
        userAdminRole, groupAdminRole, publisherRole, coworkerRole,
        // Group
index 8cf24f00c0e7851cd0160be65ef751b96b2e5a4f..25a72584dce442aedabf6154c4661712a6d83842 100644 (file)
@@ -6,6 +6,7 @@ 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.CmsUser;
 import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
 import org.argeo.app.ui.SuiteIcon;
@@ -13,6 +14,7 @@ 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.auth.CmsRole;
 import org.argeo.cms.swt.CmsSwtTheme;
 import org.argeo.cms.swt.CmsSwtUtils;
 import org.argeo.cms.swt.Selected;
@@ -44,10 +46,11 @@ public class GroupUiProvider implements SwtUiProvider {
                ContentSession contentSession = ((ProvidedContent) context).getSession();
 
                TabularPart<Content, Content> membersPart = new AbstractTabularPart<Content, Content>() {
-                       Role[] roles = context.adapt(CmsGroup.class).getMembers();
+                       Role[] roles;
 
                        @Override
                        public int getItemCount() {
+                               roles = context.adapt(CmsGroup.class).getMembers();
                                return roles.length;
                        }
 
@@ -87,19 +90,37 @@ public class GroupUiProvider implements SwtUiProvider {
 
                ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
                addItem.setImage(theme.getSmallIcon(SuiteIcon.add));
+               addItem.setEnabled(CurrentUser.implies(CmsRole.groupAdmin, hierarchyUnit.getBase()));
+
+               // members view
+               SwtTableView<Content, Content> membersView = new SwtTableView<>(area, SWT.BORDER, membersPart);
+               membersView.setLayoutData(CmsSwtUtils.fillAll());
+               membersView.refresh();
+
+               // CONTROLLER
+               membersPart.onSelected((model) -> {
+                       deleteItem.setEnabled(CurrentUser.implies(CmsRole.groupAdmin, hierarchyUnit.getBase()));
+                       deleteItem.setData(model);
+               });
+
                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
+                               cmsUserManager.addMember(context.adapt(CmsGroup.class), chosen.adapt(CmsUser.class));
+                               membersPart.refresh();
+                       }
+               });
+
+               deleteItem.addSelectionListener((Selected) (e) -> {
+                       if (deleteItem.getData() != null) {
+                               Content chosen = (Content) deleteItem.getData();
+                               cmsUserManager.removeMember(context.adapt(CmsGroup.class), chosen.adapt(CmsUser.class));
+                               membersPart.refresh();
                        }
                });
 
-               // members view
-               SwtTableView<Content, Content> membersView = new SwtTableView<>(area, SWT.BORDER, membersPart);
-               membersView.setLayoutData(CmsSwtUtils.fillAll());
-               membersView.refresh();
                return membersView;
 
        }
index a9800e696bae1d1d64079fafb0222174fd82e1de..e39ba0a5e13901c1fd412ea42514bfbe0feedeef 100644 (file)
@@ -2,12 +2,23 @@ package org.argeo.app.ui.people;
 
 import static org.argeo.eclipse.ui.EclipseUiUtils.isEmpty;
 
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
 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.directory.CmsGroup;
 import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.api.cms.directory.HierarchyUnit;
 import org.argeo.app.ui.SuiteMsg;
 import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
 import org.argeo.cms.swt.widgets.SwtGuidedFormPage;
 import org.argeo.cms.ux.widgets.AbstractGuidedForm;
+import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
@@ -39,13 +50,26 @@ public class NewOrgForm extends AbstractGuidedForm {
                setFormTitle(SuiteMsg.orgWizardWindowTitle.lead());
        }
 
-       /**
-        * Called when the user click on 'Finish' in the wizard. The task is then
-        * created and the corresponding session saved.
-        */
        @Override
        public boolean performFinish() {
-               return false;
+               String orgName = orgNameT.getText();
+               if (EclipseUiUtils.isEmpty(orgName)) {
+                       CmsFeedback.show(SuiteMsg.allFieldsMustBeSet.lead());
+                       return false;
+               } else {
+                       HierarchyUnit hu = hierarchyUnit.adapt(HierarchyUnit.class);
+                       String dn = "cn=" + orgName + ",ou=Groups," + hu.getBase();
+
+                       CmsGroup user = cmsUserManager.createGroup(dn);
+
+                       Map<String, Object> additionalProperties = new HashMap<>();
+                       additionalProperties.put(LdapAttr.o.name(), orgName);
+
+                       Set<String> objectClasses = new HashSet<>();
+                       objectClasses.add(LdapObj.organization.name());
+                       cmsUserManager.addObjectClasses(user, objectClasses, additionalProperties);
+                       return true;
+               }
        }
 
        @Override
index e45197323d4e5c6d72464617b55b6831d9abc734..5a73b1b15f6000cd13e1b272dd81d42e8cd3b5a9 100644 (file)
@@ -11,6 +11,7 @@ import java.util.UUID;
 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.directory.CmsUser;
 import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
 import org.argeo.app.core.SuiteUtils;
@@ -27,7 +28,6 @@ import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Text;
-import org.osgi.service.useradmin.User;
 
 /** Ask first & last name. Update the passed node on finish */
 public class NewUserForm extends AbstractGuidedForm {
@@ -83,7 +83,7 @@ public class NewUserForm extends AbstractGuidedForm {
                        properties.put(LdapAttr.employeeNumber.name(), uuid.toString());
 
                        Map<String, Object> credentials = new HashMap<>();
-                       User user = cmsUserManager.createUser(username, properties, credentials);
+                       CmsUser user = cmsUserManager.createUser(username, properties, credentials);
 
                        Long huGidNumber = hierarchyUnit.get(LdapAttr.gidNumber.qName(), Long.class).orElseThrow();
                        Long nextUserId = SuiteUtils.findNextId(hierarchyUnit, LdapObj.posixAccount.qName());
index e2339919bec00a17f3c7eee8e3b0e6612ddc8777..f7141a4ecb8386f16a466a158ff7562d9896fc82 100644 (file)
@@ -13,12 +13,15 @@ import org.argeo.api.cms.ux.CmsView;
 import org.argeo.app.ui.SuiteIcon;
 import org.argeo.app.ui.SuiteMsg;
 import org.argeo.app.ui.SuiteUxEvent;
+import org.argeo.cms.CurrentUser;
 import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.auth.CmsRole;
 import org.argeo.cms.jcr.acr.JcrContent;
 import org.argeo.cms.swt.CmsSwtTheme;
 import org.argeo.cms.swt.CmsSwtUtils;
 import org.argeo.cms.swt.Selected;
 import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
 import org.argeo.cms.swt.widgets.SwtGuidedFormDialog;
 import org.argeo.cms.swt.widgets.SwtTableView;
 import org.argeo.cms.swt.widgets.SwtTreeView;
@@ -81,9 +84,9 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
                ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
                bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
 
-               ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
-               deleteItem.setEnabled(false);
-               deleteItem.setImage(theme.getSmallIcon(SuiteIcon.delete));
+//             ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
+//             deleteItem.setEnabled(false);
+//             deleteItem.setImage(theme.getSmallIcon(SuiteIcon.delete));
 
                Menu menu = new Menu(Display.getCurrent().getActiveShell(), SWT.POP_UP);
                // TODO display add user only if hierarchy unit is a POSIX group
@@ -97,7 +100,8 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
                        GuidedForm wizard = new NewUserForm(cmsUserManager, huContent);
                        SwtGuidedFormDialog dialog = new SwtGuidedFormDialog(parent.getShell(), wizard);
                        if (dialog.open() == CmsDialog.OK) {
-                               // TODO create
+                               CmsFeedback.show(SuiteMsg.personWizardFeedback.lead());
+                               usersPart.refresh();
                        }
                });
 
@@ -110,7 +114,8 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
                        GuidedForm wizard = new NewOrgForm(cmsUserManager, huContent);
                        SwtGuidedFormDialog dialog = new SwtGuidedFormDialog(parent.getShell(), wizard);
                        if (dialog.open() == CmsDialog.OK) {
-                               // TODO create
+                               CmsFeedback.show(SuiteMsg.orgWizardFeedback.lead());
+                               usersPart.refresh();
                        }
                });
 
@@ -129,6 +134,9 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
                                HierarchyUnit hierarchyUnit = (HierarchyUnit) o;
                                usersPart.setInput(hierarchyUnit);
                                addItem.setEnabled(true);
+
+                               addOrgItem.setEnabled(usersPart.getInput() != null
+                                               && CurrentUser.implies(CmsRole.groupAdmin, usersPart.getInput().getBase()));
 //                             cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent
 //                                             .eventProperties(ContentUtils.hierarchyUnitToContent(contentSession, hierarchyUnit)));
                        }
@@ -138,9 +146,9 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
                        Content user = (Content) o;
                        if (user != null) {
                                cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent.eventProperties(user));
-                               deleteItem.setEnabled(true);
+//                             deleteItem.setEnabled(true);
                        } else {
-                               deleteItem.setEnabled(false);
+//                             deleteItem.setEnabled(false);
                        }
                });