X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=swt%2Forg.argeo.app.ui%2Fsrc%2Forg%2Fargeo%2Fapp%2Fui%2Fpeople%2FGroupUiProvider.java;h=f0de1ca59d356e9b4c5f4453a87a15ee7e2d6367;hb=8ff5ddc4f02cb29cc3c1d5d06958bc495b9f9531;hp=f0a5b38a90dbe6a442632f93b830b51280159932;hpb=932dbdce11c1a862b6a7babcb91bfec8e491e0b8;p=gpl%2Fargeo-suite.git 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 f0a5b38..f0de1ca 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 @@ -1,18 +1,37 @@ package org.argeo.app.ui.people; import org.argeo.api.acr.Content; +import org.argeo.api.acr.ContentSession; +import org.argeo.api.acr.ldap.LdapAcrUtils; 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; 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; +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,24 +39,86 @@ 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 membersPart = new AbstractTabularPart() { + Role[] roles; + + @Override + public int getItemCount() { + roles = context.adapt(CmsGroup.class).getMembers(); + 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)) - title = SuiteMsg.org.lead() + " " + context.attr(LdapAttr.cn) + " (" - + hierarchyUnit.getHierarchyUnitLabel(CurrentUser.locale()) + ")"; - else - title = SuiteMsg.group.lead() + " " + context.attr(LdapAttr.cn) + " (" - + hierarchyUnit.getHierarchyUnitLabel(CurrentUser.locale()) + ")"; - SuiteUiUtils.addFormLabel(parent, title); - - for (Role member : group.getMembers()) { - new Label(parent, 0).setText(member.getName()); - } - return null; + String title = (context.hasContentClass(LdapObj.organization) ? SuiteMsg.org.lead() : SuiteMsg.group.lead()) + + " " + LdapAcrUtils.getLocalized(context, LdapAttr.cn.qName(), CurrentUser.locale()) + " (" + + hierarchyUnit.getHierarchyUnitLabel(CurrentUser.locale()) + ")"; + 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.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(); + 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(); + } + }); + + return membersView; }