From: Mathieu Date: Tue, 8 Nov 2022 04:31:17 +0000 (+0100) Subject: Improve people UI X-Git-Tag: v2.3.9~23 X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=commitdiff_plain;h=b4debb80c8209d35f546da421020449a5d84049a Improve people UI --- 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 0dd3532..b99fff6 100644 --- a/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties +++ b/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties @@ -28,6 +28,11 @@ vatId=VAT ID orgWizardWindowTitle=New organisation orgWizardPageTitle=Create an organisation +# Roles +userAdminRole=Can create users and modify them +groupAdminRole=Can create groups and organisations and modify them +publisherRole=Can validate and publish content +coworkerRole=Is an active user of the organisation # ContextAddressComposite chooseAnOrganisation=Choose an organisation 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 3a9ad4d..6744ee8 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 @@ -32,6 +32,11 @@ vatId=ID TVA orgWizardWindowTitle=Nouvelle organisation orgWizardPageTitle=Créer une organisation +# Roles +userAdminRole=Peut créer des utilisateurs et les modifier +groupAdminRole=Peut créer des groupes et des organisations et les modifier +publisherRole=Peut publier et valider du contenu +coworkerRole=Est un membre en activité de l'organisation # ContextAddressComposite chooseAnOrganisation=Choisir une organisation diff --git a/swt/org.argeo.app.ui/config/peopleLayer.properties b/swt/org.argeo.app.ui/config/peopleLayer.properties index 8924015..2faf172 100644 --- a/swt/org.argeo.app.ui/config/peopleLayer.properties +++ b/swt/org.argeo.app.ui/config/peopleLayer.properties @@ -1,7 +1,7 @@ service.pid=argeo.people.ui.peopleLayer icon=people -weights=3000,7000 +weights=5000,5000 title=%people entity.type=ldap:inetOrgPerson,ldap:groupOfNames,ldap:organizationalUnit,ldap:nsContainer,ldap:dcObject \ No newline at end of file diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultHeader.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultHeader.java index b8d78c9..abef647 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultHeader.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultHeader.java @@ -12,11 +12,8 @@ import org.argeo.cms.ui.CmsUiProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLeadPane.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLeadPane.java index 7b7a031..74a950d 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLeadPane.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLeadPane.java @@ -3,7 +3,6 @@ package org.argeo.app.ui; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; 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 1162144..6fc72c6 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,6 +9,8 @@ public enum SuiteMsg implements Localized { firstName, lastName, salutation, email, personWizardWindowTitle, personWizardPageTitle, // NewOrgWizard orgWizardWindowTitle, orgWizardPageTitle, legalName, legalForm, vatId, + // Roles + userAdminRole, groupAdminRole, publisherRole, coworkerRole, // ContextAddressComposite chooseAnOrganisation, street, streetComplement, zipCode, city, state, country, geopoint, // FilteredOrderableEntityTable @@ -31,7 +33,7 @@ public enum SuiteMsg implements Localized { label, aCustomLabel, description, value, name, primary, add, save, pickup, // Tag confirmNewTag, cannotCreateTag, - // Feddback messages + // Feedback messages allFieldsMustBeSet, // ; diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUiUtils.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUiUtils.java index 2ba4314..59d1134 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUiUtils.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUiUtils.java @@ -71,6 +71,10 @@ public class SuiteUiUtils { } } + public static Label addFormLabel(Composite parent, Localized msg) { + return addFormLabel(parent, msg.lead()); + } + public static Label addFormLabel(Composite parent, String label) { Label lbl = new Label(parent, SWT.WRAP); lbl.setText(label); 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 f367814..81463a2 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 @@ -66,16 +66,6 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider { SashForm sashForm = new SashForm(parent, SWT.VERTICAL); CmsSwtUtils.fill(sashForm); - // MODEL -// List directories = new ArrayList<>(); -// // List orgs = cmsUserManager.listGroups(null, true, false); -// for (UserDirectory directory : cmsUserManager.getUserDirectories()) { -// if (CurrentUser.implies(CmsRole.userAdmin, directory.getContext())) { -// directories.add(directory); -// } -// -// } - // VIEW HierarchicalPart hierarchyPart = new AbstractHierarchicalPart<>() { @@ -132,17 +122,16 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider { if (ud.getRealm().isPresent()) { for (Role r : ud.getHierarchyUnitRoles(ud, null, true)) { Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, r); - // if (r instanceof Person || r instanceof Organization) if (content.hasContentClass(LdapObjs.inetOrgPerson.qName(), LdapObjs.organization.qName())) roles.add(content); } } else { for (HierarchyUnit directChild : hu.getDirectHierarchyUnits(false)) { - if (!directChild.isFunctional()) { + if (!(directChild.isType(HierarchyUnit.Type.FUNCTIONAL) + || directChild.isType(HierarchyUnit.Type.ROLES))) { for (Role r : ud.getHierarchyUnitRoles(directChild, null, false)) { Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, r); - // if (r instanceof Person || r instanceof Organization) if (content.hasContentClass(LdapObjs.inetOrgPerson.qName(), LdapObjs.organization.qName(), LdapObjs.groupOfNames.qName())) roles.add(content); @@ -189,7 +178,7 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider { }); usersPart.addColumn((Column) (role) -> role.attr(LdapAttrs.mail.qName())); - SwtTableView usersView = new SwtTableView<>(sashForm, SWT.BORDER, usersPart); + new SwtTableView<>(sashForm, SWT.BORDER, usersPart); // toolbar Composite bottom = new Composite(parent, SWT.NONE); @@ -211,8 +200,8 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider { if (o instanceof HierarchyUnit) { HierarchyUnit hierarchyUnit = (HierarchyUnit) o; usersPart.setInput(hierarchyUnit); - cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent - .eventProperties(ContentUtils.hierarchyUnitToContent(contentSession, hierarchyUnit))); +// cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent +// .eventProperties(ContentUtils.hierarchyUnitToContent(contentSession, hierarchyUnit))); } }); @@ -250,20 +239,6 @@ public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider { return sashForm; } -// static String getProperty(Role role, LdapAttrs attr) { -// Object value = role.getProperties().get(attr.name()); -// return value != null ? value.toString() : null; -// } - -// private boolean isOrganisation(Role role) { -// String[] objectClasses = role.getProperties().get(LdapAttrs.objectClasses.name()).toString().split("\\n"); -// for (String objectClass : objectClasses) { -// if (LdapObjs.organization.name().equalsIgnoreCase(objectClass)) -// return true; -// } -// return false; -// } - public void setCmsUserManager(CmsUserManager cmsUserManager) { this.cmsUserManager = cmsUserManager; } diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java index bbb9a7c..e296315 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java @@ -7,14 +7,22 @@ import java.util.Map; import org.argeo.api.acr.Content; import org.argeo.api.acr.ldap.LdapAttrs; import org.argeo.api.acr.ldap.LdapObjs; +import org.argeo.app.api.SuiteRole; import org.argeo.app.ui.SuiteMsg; import org.argeo.app.ui.SuiteStyle; import org.argeo.app.ui.SuiteUiUtils; +import org.argeo.cms.CmsMsg; import org.argeo.cms.CmsUserManager; import org.argeo.cms.Localized; +import org.argeo.cms.auth.CmsRole; +import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.auth.RoleNameUtils; +import org.argeo.cms.auth.SystemRole; 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.dialogs.CmsFeedback; import org.argeo.cms.swt.widgets.EditableText; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; @@ -31,7 +39,6 @@ import org.osgi.service.useradmin.User; /** Edit a suite user. */ public class PersonUiProvider implements SwtUiProvider { - private String[] availableRoles; private CmsUserManager cmsUserManager; @Override @@ -43,22 +50,24 @@ public class PersonUiProvider implements SwtUiProvider { User user = context.adapt(User.class); + String roleContext = RoleNameUtils.getContext(user.getName()); + if (context.hasContentClass(LdapObjs.person.qName())) { + addFormLine(main, SuiteMsg.firstName, context, LdapAttrs.givenName); addFormLine(main, SuiteMsg.lastName, context, LdapAttrs.sn); addFormLine(main, SuiteMsg.email, context, LdapAttrs.mail); + } + + if (context.hasContentClass(LdapObjs.posixAccount.qName())) { - Composite rolesSection = new Composite(main, SWT.NONE); - rolesSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); + SwtSection rolesSection = new SwtSection(main, SWT.NONE); + rolesSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); rolesSection.setLayout(new GridLayout()); List roles = Arrays.asList(cmsUserManager.getUserRoles(user.getName())); - for (String role : roles) { - // new Label(rolesSection, SWT.NONE).setText(role); - Button radio = new Button(rolesSection, SWT.CHECK); - radio.setText(role); - if (roles.contains(role)) - radio.setSelection(true); - } + addRoleCheckBox(rolesSection, SuiteMsg.coworkerRole, SuiteRole.coworker, roleContext, roles); + addRoleCheckBox(rolesSection, SuiteMsg.publisherRole, SuiteRole.publisher, roleContext, roles); + addRoleCheckBox(rolesSection, SuiteMsg.userAdminRole, CmsRole.userAdmin, roleContext, roles); // Composite facetsSection = new Composite(main, SWT.NONE); // facetsSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); @@ -69,52 +78,40 @@ public class PersonUiProvider implements SwtUiProvider { // new Label(facetsSection, SWT.NONE).setText(member); // } // } + if (CurrentUser.implies(CmsRole.userAdmin, roleContext)) { + SwtSection changePasswordSection = new SwtSection(main, SWT.BORDER); + changePasswordSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); + changePasswordSection.setLayout(new GridLayout(2, false)); +// SuiteUiUtils.addFormLabel(changePasswordSection, CmsMsg.changePassword) +// .setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false, 2, 1)); + SuiteUiUtils.addFormLabel(changePasswordSection, CmsMsg.newPassword); + Text newPasswordT = SuiteUiUtils.addFormTextField(changePasswordSection, null, null, + SWT.PASSWORD | SWT.BORDER); + newPasswordT.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + SuiteUiUtils.addFormLabel(changePasswordSection, CmsMsg.repeatNewPassword); + Text repeatNewPasswordT = SuiteUiUtils.addFormTextField(changePasswordSection, null, null, + SWT.PASSWORD | SWT.BORDER); + repeatNewPasswordT.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + Button apply = new Button(changePasswordSection, SWT.FLAT); + apply.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false, 2, 1)); + apply.setText(CmsMsg.changePassword.lead()); + apply.addSelectionListener((Selected) (e) -> { + try { + char[] newPassword = newPasswordT.getTextChars(); + char[] repeatNewPassword = repeatNewPasswordT.getTextChars(); + if (newPassword.length > 0 && Arrays.equals(newPassword, repeatNewPassword)) { + cmsUserManager.resetPassword(user.getName(), newPassword); + CmsFeedback.show(CmsMsg.passwordChanged.lead()); + } else { + CmsFeedback.error(CmsMsg.invalidPassword.lead(), null); + } + } catch (Exception e1) { + CmsFeedback.error(CmsMsg.invalidPassword.lead(), e1); + } + }); + } } -// if (user instanceof Group) { -// String cn = context.getName().getLocalPart(); -// Text cnT = SuiteUiUtils.addFormLine(main, "uid", getUserProperty(user, LdapAttrs.uid.name())); -// cnT.setText(cn); -// -// } else { -// String uid = context.getName().getLocalPart(); -// -//// Text givenName = new Text(main, SWT.SINGLE); -//// givenName.setText(getUserProperty(user, LdapAttrs.givenName.name())); -// Text givenName = SuiteUiUtils.addFormInput(main, SuiteMsg.firstName.lead(), -// getUserProperty(user, LdapAttrs.givenName.name())); -// -// Text sn = SuiteUiUtils.addFormInput(main, SuiteMsg.lastName.lead(), -// getUserProperty(user, LdapAttrs.sn.name())); -// // sn.setText(getUserProperty(user, LdapAttrs.sn.name())); -// -// Text email = SuiteUiUtils.addFormInput(main, SuiteMsg.email.lead(), -// getUserProperty(user, LdapAttrs.mail.name())); -// // email.setText(getUserProperty(user, LdapAttrs.mail.name())); -// -// Text uidT = SuiteUiUtils.addFormLine(main, "uid", getUserProperty(user, LdapAttrs.uid.name())); -// uidT.setText(uid); -// -//// Label dnL = new Label(main, SWT.NONE); -//// dnL.setText(user.getName()); -// -// // roles -// // Section rolesSection = new Section(main, SWT.NONE, context); -// Composite rolesSection = new Composite(main, SWT.NONE); -// // rolesSection.setText("Roles"); -// rolesSection.setLayoutData(CmsSwtUtils.fillWidth()); -// rolesSection.setLayout(new GridLayout()); -// // new Label(rolesSection, SWT.NONE).setText("Roles:"); -// List roles = Arrays.asList(cmsUserManager.getUserRoles(user.getName())); -// for (String role : availableRoles) { -// // new Label(rolesSection, SWT.NONE).setText(role); -// Button radio = new Button(rolesSection, SWT.CHECK); -// radio.setText(role); -// if (roles.contains(role)) -// radio.setSelection(true); -// } -// } - return main; } @@ -153,17 +150,33 @@ public class PersonUiProvider implements SwtUiProvider { }); } + private void addRoleCheckBox(SwtSection parent, Localized msg, SystemRole systemRole, String roleContext, + List roles) { + Button radio = new Button(parent, SWT.CHECK); + radio.setText(msg.lead()); + radio.setSelection(false); + roles: for (String dn : roles) { + if (systemRole.implied(dn, roleContext)) { + radio.setSelection(true); + break roles; + } + } + if (CurrentUser.implies(CmsRole.userAdmin, roleContext)) + radio.setEnabled(true); + else + radio.setEnabled(false); + + } + public void setCmsUserManager(CmsUserManager cmsUserManager) { this.cmsUserManager = cmsUserManager; } - private String getUserProperty(Object element, String key) { - Object value = ((User) element).getProperties().get(key); - return value != null ? value.toString() : null; - } +// private String getUserProperty(Object element, String key) { +// Object value = ((User) element).getProperties().get(key); +// return value != null ? value.toString() : null; +// } public void init(Map properties) { - availableRoles = (String[]) properties.get("availableRoles"); - // cmsUserManager.getRoles(null); } }