From c27f28501458ac3be0bc85a78116d136569f148c Mon Sep 17 00:00:00 2001 From: Mathieu Date: Mon, 14 Nov 2022 09:00:06 +0100 Subject: [PATCH] Group management --- .../OSGI-INF/l10n/bundle.properties | 2 ++ .../OSGI-INF/l10n/bundle_fr.properties | 2 ++ .../src/org/argeo/app/ui/SuiteMsg.java | 4 +-- .../argeo/app/ui/people/GroupUiProvider.java | 33 ++++++++++++++---- .../org/argeo/app/ui/people/NewOrgForm.java | 34 ++++++++++++++++--- .../org/argeo/app/ui/people/NewUserForm.java | 4 +-- .../argeo/app/ui/people/PeopleEntryArea.java | 22 ++++++++---- 7 files changed, 79 insertions(+), 22 deletions(-) diff --git a/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties b/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties index 0cd0f2f..d4bf08a 100644 --- a/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties +++ b/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties @@ -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 diff --git a/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties b/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties index e0520a5..0015269 100644 --- a/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties +++ b/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties @@ -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 diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteMsg.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteMsg.java index 4bbcb62..4d515d7 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteMsg.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteMsg.java @@ -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 diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/GroupUiProvider.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/GroupUiProvider.java index 8cf24f0..25a7258 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/GroupUiProvider.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/GroupUiProvider.java @@ -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 membersPart = new AbstractTabularPart() { - 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 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 membersView = new SwtTableView<>(area, SWT.BORDER, membersPart); - membersView.setLayoutData(CmsSwtUtils.fillAll()); - membersView.refresh(); return membersView; } diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewOrgForm.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewOrgForm.java index a9800e6..e39ba0a 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewOrgForm.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewOrgForm.java @@ -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 additionalProperties = new HashMap<>(); + additionalProperties.put(LdapAttr.o.name(), orgName); + + Set objectClasses = new HashSet<>(); + objectClasses.add(LdapObj.organization.name()); + cmsUserManager.addObjectClasses(user, objectClasses, additionalProperties); + return true; + } } @Override diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java index e451973..5a73b1b 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java @@ -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 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()); diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java index e233991..f7141a4 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java @@ -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); } }); -- 2.30.2