]> git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java
Add new icons
[gpl/argeo-suite.git] / org.argeo.app.ui / src / org / argeo / app / ui / people / PeopleEntryArea.java
1 package org.argeo.app.ui.people;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.jcr.Node;
7 import javax.jcr.RepositoryException;
8
9 import org.argeo.api.acr.Content;
10 import org.argeo.api.acr.ContentRepository;
11 import org.argeo.api.acr.ContentSession;
12 import org.argeo.api.cms.ux.CmsIcon;
13 import org.argeo.api.cms.ux.CmsView;
14 import org.argeo.app.ui.SuiteEvent;
15 import org.argeo.app.ui.SuiteIcon;
16 import org.argeo.cms.CmsUserManager;
17 import org.argeo.cms.acr.ContentUtils;
18 import org.argeo.cms.auth.CmsRole;
19 import org.argeo.cms.auth.CurrentUser;
20 import org.argeo.cms.auth.UserAdminUtils;
21 import org.argeo.cms.jcr.acr.JcrContent;
22 import org.argeo.cms.swt.CmsSwtTheme;
23 import org.argeo.cms.swt.CmsSwtUtils;
24 import org.argeo.cms.swt.Selected;
25 import org.argeo.cms.swt.acr.SwtUiProvider;
26 import org.argeo.cms.swt.widgets.SwtGuidedFormDialog;
27 import org.argeo.cms.swt.widgets.SwtTableView;
28 import org.argeo.cms.swt.widgets.SwtTreeView;
29 import org.argeo.cms.ui.CmsUiProvider;
30 import org.argeo.cms.ux.widgets.AbstractHierarchicalPart;
31 import org.argeo.cms.ux.widgets.Column;
32 import org.argeo.cms.ux.widgets.DefaultTabularPart;
33 import org.argeo.cms.ux.widgets.GuidedForm;
34 import org.argeo.cms.ux.widgets.HierarchicalPart;
35 import org.argeo.osgi.useradmin.UserDirectory;
36 import org.argeo.util.directory.HierarchyUnit;
37 import org.argeo.util.directory.ldap.IpaUtils;
38 import org.argeo.util.naming.LdapAttrs;
39 import org.argeo.util.naming.LdapObjs;
40 import org.eclipse.jface.window.Window;
41 import org.eclipse.swt.SWT;
42 import org.eclipse.swt.custom.SashForm;
43 import org.eclipse.swt.layout.GridData;
44 import org.eclipse.swt.layout.GridLayout;
45 import org.eclipse.swt.widgets.Composite;
46 import org.eclipse.swt.widgets.Control;
47 import org.eclipse.swt.widgets.ToolBar;
48 import org.eclipse.swt.widgets.ToolItem;
49 import org.osgi.service.useradmin.Role;
50 import org.osgi.service.useradmin.User;
51
52 /** Entry to the admin area. */
53 public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
54
55 private CmsUserManager cmsUserManager;
56
57 private ContentRepository contentRepository;
58
59 @Override
60 public Control createUiPart(Composite parent, Content context) {
61 CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
62 CmsView cmsView = CmsSwtUtils.getCmsView(parent);
63 parent.setLayout(new GridLayout());
64
65 ContentSession contentSession = contentRepository.get();
66 SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
67 CmsSwtUtils.fill(sashForm);
68
69 // MODEL
70 // List<UserDirectory> directories = new ArrayList<>();
71 // // List<User> orgs = cmsUserManager.listGroups(null, true, false);
72 // for (UserDirectory directory : cmsUserManager.getUserDirectories()) {
73 // if (CurrentUser.implies(CmsRole.userAdmin, directory.getContext())) {
74 // directories.add(directory);
75 // }
76 //
77 // }
78
79 // VIEW
80 HierarchicalPart<HierarchyUnit> hierarchyPart = new AbstractHierarchicalPart<>() {
81
82 @Override
83 public List<HierarchyUnit> getChildren(HierarchyUnit parent) {
84 List<HierarchyUnit> visible = new ArrayList<>();
85 if (parent != null) {
86 for (HierarchyUnit hu : parent.getDirectHierarchyUnits(true)) {
87 if (CurrentUser.implies(CmsRole.userAdmin, hu.getBase()) //
88 ) // IPA
89 {
90 visible.add(hu);
91 }
92 }
93 } else {
94 for (UserDirectory directory : cmsUserManager.getUserDirectories()) {
95 if (CurrentUser.implies(CmsRole.userAdmin, directory.getBase()) //
96 || CurrentUser.implies(CmsRole.userAdmin,
97 IpaUtils.IPA_ACCOUNTS_RDN + "," + directory.getBase())) // IPA
98 {
99 // we do not show the base level
100 for (HierarchyUnit hu : directory.getDirectHierarchyUnits(true)) {
101 visible.add(hu);
102 }
103 }
104
105 }
106 }
107 return visible;
108 }
109
110 @Override
111 public String getText(HierarchyUnit model) {
112 return model.getHierarchyUnitLabel(CurrentUser.locale());
113 }
114
115 @Override
116 public CmsIcon getIcon(HierarchyUnit model) {
117 Content content = ContentUtils.hierarchyUnitToContent(contentSession, model);
118 if (content.hasContentClass(LdapObjs.organization.qName()))
119 return SuiteIcon.organisation;
120 else if (content.hasContentClass(LdapObjs.posixGroup.qName()))
121 return SuiteIcon.users;
122 else
123 return SuiteIcon.addressBook;
124 }
125
126 };
127 SwtTreeView<HierarchyUnit> directoriesView = new SwtTreeView<>(sashForm, SWT.NONE, hierarchyPart);
128
129 DefaultTabularPart<HierarchyUnit, Content> usersPart = new DefaultTabularPart<>() {
130
131 @Override
132 protected List<Content> asList(HierarchyUnit hu) {
133 List<Content> roles = new ArrayList<>();
134 UserDirectory ud = (UserDirectory) hu.getDirectory();
135 if (ud.getRealm().isPresent()) {
136 for (Role r : ud.getHierarchyUnitRoles(ud, null, true)) {
137 Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, r);
138 // if (r instanceof Person || r instanceof Organization)
139 if (content.hasContentClass(LdapObjs.inetOrgPerson.qName(), LdapObjs.organization.qName()))
140 roles.add(content);
141 }
142
143 } else {
144 for (HierarchyUnit directChild : hu.getDirectHierarchyUnits(false)) {
145 if (!directChild.isFunctional()) {
146 for (Role r : ud.getHierarchyUnitRoles(directChild, null, false)) {
147 Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, r);
148 // if (r instanceof Person || r instanceof Organization)
149 if (content.hasContentClass(LdapObjs.inetOrgPerson.qName(),
150 LdapObjs.organization.qName()))
151 roles.add(content);
152 }
153 }
154 }
155 }
156 return roles;
157 }
158 };
159 usersPart.addColumn(new Column<Content>() {
160
161 @Override
162 public String getText(Content role) {
163 if (role.isContentClass(LdapObjs.inetOrgPerson.qName()))
164 return UserAdminUtils.getUserDisplayName(role.adapt(User.class));
165 else if (role.isContentClass(LdapObjs.organization.qName()))
166 return role.attr(LdapAttrs.o.qName());
167 else if (role.isContentClass(LdapObjs.groupOfNames.qName()))
168 return role.attr(LdapAttrs.cn.qName());
169 else
170 return null;
171 }
172
173 @Override
174 public CmsIcon getIcon(Content role) {
175 if (role.hasContentClass(LdapObjs.posixAccount.qName()))
176 return SuiteIcon.user;
177 else if (role.isContentClass(LdapObjs.inetOrgPerson.qName()))
178 return SuiteIcon.person;
179 else if (role.isContentClass(LdapObjs.organization.qName()))
180 return SuiteIcon.organisationContact;
181 else if (role.isContentClass(LdapObjs.groupOfNames.qName()))
182 return SuiteIcon.group;
183 else
184 return null;
185 }
186
187 @Override
188 public int getWidth() {
189 return 300;
190 }
191
192 });
193 usersPart.addColumn((Column<Content>) (role) -> role.attr(LdapAttrs.mail.qName()));
194
195 SwtTableView<HierarchyUnit, Content> usersView = new SwtTableView<>(sashForm, SWT.NONE, usersPart);
196
197 // toolbar
198 Composite bottom = new Composite(parent, SWT.NONE);
199 bottom.setLayoutData(CmsSwtUtils.fillWidth());
200 bottom.setLayout(CmsSwtUtils.noSpaceGridLayout());
201 ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
202 bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
203 ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
204 deleteItem.setEnabled(false);
205 // CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
206 deleteItem.setImage(theme.getSmallIcon(SuiteIcon.delete));
207 ToolItem addItem = new ToolItem(bottomToolBar, SWT.FLAT);
208 addItem.setImage(theme.getSmallIcon(SuiteIcon.add));
209
210 sashForm.setWeights(new int[] { 30, 70 });
211
212 // CONTROLLER
213 hierarchyPart.onSelected((o) -> {
214 if (o instanceof HierarchyUnit) {
215 HierarchyUnit hierarchyUnit = (HierarchyUnit) o;
216 usersPart.setInput(hierarchyUnit);
217 cmsView.sendEvent(SuiteEvent.refreshPart.topic(),
218 SuiteEvent.eventProperties(ContentUtils.hierarchyUnitToContent(contentSession, hierarchyUnit)));
219 }
220 });
221
222 usersPart.onSelected((o) -> {
223 Content user = (Content) o;
224 if (user != null) {
225 cmsView.sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(user));
226 deleteItem.setEnabled(true);
227 } else {
228 deleteItem.setEnabled(false);
229 }
230 });
231
232 usersPart.onAction((o) -> {
233 Content user = (Content) o;
234 if (user != null) {
235 cmsView.sendEvent(SuiteEvent.openNewPart.topic(), SuiteEvent.eventProperties(user));
236 }
237 });
238
239 addItem.addSelectionListener((Selected) (e) -> {
240 HierarchyUnit hierarchyUnit = usersPart.getInput();
241 Content huContent = ContentUtils.hierarchyUnitToContent(contentSession, hierarchyUnit);
242 GuidedForm wizard = new NewUserForm(cmsUserManager, huContent);
243 SwtGuidedFormDialog dialog = new SwtGuidedFormDialog(parent.getShell(), wizard);
244 // WizardDialog dialog = new WizardDialog(shell, wizard);
245 if (dialog.open() == Window.OK) {
246 // TODO create
247 }
248 });
249
250 directoriesView.refresh();
251 // usersView.refresh();
252
253 return sashForm;
254 }
255
256 // static String getProperty(Role role, LdapAttrs attr) {
257 // Object value = role.getProperties().get(attr.name());
258 // return value != null ? value.toString() : null;
259 // }
260
261 // private boolean isOrganisation(Role role) {
262 // String[] objectClasses = role.getProperties().get(LdapAttrs.objectClasses.name()).toString().split("\\n");
263 // for (String objectClass : objectClasses) {
264 // if (LdapObjs.organization.name().equalsIgnoreCase(objectClass))
265 // return true;
266 // }
267 // return false;
268 // }
269
270 public void setCmsUserManager(CmsUserManager cmsUserManager) {
271 this.cmsUserManager = cmsUserManager;
272 }
273
274 @Override
275 public Control createUi(Composite parent, Node context) throws RepositoryException {
276 return createUiPart(parent, JcrContent.nodeToContent(context));
277 }
278
279 public void setContentRepository(ContentRepository contentRepository) {
280 this.contentRepository = contentRepository;
281 }
282
283 }