Add People and Map to the default layers.
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 1 May 2021 08:06:29 +0000 (10:06 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 1 May 2021 08:06:29 +0000 (10:06 +0200)
20 files changed:
core/org.argeo.suite.ui/OSGI-INF/leadPane.xml
environment/org.argeo.geo.ui/.project
environment/org.argeo.geo.ui/OSGI-INF/mapLayer.xml [new file with mode: 0644]
environment/org.argeo.geo.ui/OSGI-INF/overviewMap.xml [new file with mode: 0644]
environment/org.argeo.geo.ui/bnd.bnd
environment/org.argeo.geo.ui/config/mapLayer.properties [new file with mode: 0644]
environment/org.argeo.geo.ui/config/overviewMap.properties [new file with mode: 0644]
environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OverviewMap.java [new file with mode: 0644]
environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/map-osm.html [new file with mode: 0644]
people/org.argeo.people.ui/.project
people/org.argeo.people.ui/OSGI-INF/peopleEntryArea.xml [new file with mode: 0644]
people/org.argeo.people.ui/OSGI-INF/peopleLayer.xml [new file with mode: 0644]
people/org.argeo.people.ui/OSGI-INF/personUiProvider.xml [new file with mode: 0644]
people/org.argeo.people.ui/bnd.bnd
people/org.argeo.people.ui/config/peopleEntryArea.properties [new file with mode: 0644]
people/org.argeo.people.ui/config/peopleLayer.properties [new file with mode: 0644]
people/org.argeo.people.ui/config/personUiProvider.properties [new file with mode: 0644]
people/org.argeo.people.ui/src/org/argeo/people/ui/PeopleEntryArea.java [new file with mode: 0644]
people/org.argeo.people.ui/src/org/argeo/people/ui/PersonUiProvider.java [new file with mode: 0644]
sdk/argeo-suite-rap.properties

index 0775c5790f6044fdfefb49254e963f442381ecef..1aeec0ab8efef0d329f9f537b2354dd12d31dfd0 100644 (file)
@@ -7,6 +7,8 @@
    <properties entry="config/leadPane.properties"/>
    <property name="defaultLayers" type="String">argeo.suite.ui.dashboardLayer
 argeo.documents.ui.documentsLayer
+argeo.people.ui.peopleLayer
+argeo.geo.ui.mapLayer
    </property>
    <reference bind="addLayer" cardinality="1..n" interface="org.argeo.suite.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
 </scr:component>
index 7956c3413c069b551427fc0c1e019eeb4fd62dac..a25e06f913454f03db66c43d48cbdbe9e91bdb83 100644 (file)
                        <arguments>
                        </arguments>
                </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
        </buildSpec>
        <natures>
                <nature>org.eclipse.pde.PluginNature</nature>
diff --git a/environment/org.argeo.geo.ui/OSGI-INF/mapLayer.xml b/environment/org.argeo.geo.ui/OSGI-INF/mapLayer.xml
new file mode 100644 (file)
index 0000000..7cf8487
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy">
+   <implementation class="org.argeo.suite.ui.DefaultEditionLayer"/>
+   <properties entry="config/mapLayer.properties"/>
+   <service>
+      <provide interface="org.argeo.suite.ui.SuiteLayer"/>
+   </service>
+   <reference bind="setWorkArea" cardinality="1..1" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.geo.ui.overviewMap)"/>
+</scr:component>
diff --git a/environment/org.argeo.geo.ui/OSGI-INF/overviewMap.xml b/environment/org.argeo.geo.ui/OSGI-INF/overviewMap.xml
new file mode 100644 (file)
index 0000000..c75200a
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.support.openlayers.OverviewMap"/>
+   <properties entry="config/overviewMap.properties"/>
+   <service>
+      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+   </service>
+</scr:component>
index 9a3ff7b250253711e818b06c8b81f9a84b4579a5..a50ed4316ed5fbf11471f50e2d8b12a806e7bd2e 100644 (file)
@@ -8,3 +8,7 @@ org.eclipse.swt,\
 org.eclipse.jface.viewers,\
 org.osgi.framework,\
 *
+
+Service-Component:\
+OSGI-INF/mapLayer.xml,\
+OSGI-INF/overviewMap.xml
diff --git a/environment/org.argeo.geo.ui/config/mapLayer.properties b/environment/org.argeo.geo.ui/config/mapLayer.properties
new file mode 100644 (file)
index 0000000..2931c2d
--- /dev/null
@@ -0,0 +1,4 @@
+service.pid=argeo.geo.ui.mapLayer
+
+title=%map
+icon=map
\ No newline at end of file
diff --git a/environment/org.argeo.geo.ui/config/overviewMap.properties b/environment/org.argeo.geo.ui/config/overviewMap.properties
new file mode 100644 (file)
index 0000000..d842c98
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.geo.ui.overviewMap
diff --git a/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OverviewMap.java b/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OverviewMap.java
new file mode 100644 (file)
index 0000000..33e888f
--- /dev/null
@@ -0,0 +1,72 @@
+package org.argeo.support.openlayers;
+
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.observation.Event;
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+import javax.jcr.query.Query;
+
+import org.argeo.api.NodeConstants;
+import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.entity.EntityType;
+import org.argeo.jcr.JcrException;
+import org.argeo.jcr.JcrUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Displays an overview map. */
+public class OverviewMap implements CmsUiProvider {
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               parent.setLayout(new GridLayout());
+               refreshUi(parent, context);
+
+               try {
+                       String[] nodeTypes = { EntityType.geopoint.get() };
+                       context.getSession().getWorkspace().getObservationManager().addEventListener(new EventListener() {
+
+                               @Override
+                               public void onEvent(EventIterator events) {
+                                       if (!parent.isDisposed())
+                                               parent.getDisplay().asyncExec(() -> {
+                                                       try {
+                                                               refreshUi(parent, context);
+                                                       } catch (RepositoryException e) {
+                                                               throw new JcrException(e);
+                                                       }
+                                               });
+                               }
+                       }, Event.PROPERTY_CHANGED | Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED,
+                                       "/", true, null, nodeTypes, false);
+               } catch (RepositoryException e) {
+                       throw new IllegalStateException("Cannot add JCR observer", e);
+               }
+
+               return parent;
+       }
+
+       protected void refreshUi(Composite parent, Node context) throws RepositoryException {
+               CmsUiUtils.clear(parent);
+               boolean coworker = CmsView.getCmsView(parent).doAs(() -> CurrentUser.isInRole(NodeConstants.ROLE_USER_ADMIN));
+               Query query = context.getSession().getWorkspace().getQueryManager()
+                               .createQuery("SELECT * FROM [" + EntityType.local.get() + "] WHERE [entity:type]='"
+                                               + EntityType.geopoint.get() + "'",
+                                               Query.JCR_SQL2);
+               List<Node> geoPoints = JcrUtils.nodeIteratorToList(query.execute().getNodes());
+               OpenLayersMap apafMap = new OpenLayersMap(parent, SWT.NONE, getClass().getResource("map-osm.html"));
+               apafMap.setLayoutData(CmsUiUtils.fillAll());
+
+               // apafMap.setZoom(7);
+               // apafMap.setCenter(-2.472, 8.010);
+               apafMap.addPoints(geoPoints);
+       }
+}
diff --git a/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/map-osm.html b/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/map-osm.html
new file mode 100644 (file)
index 0000000..157d708
--- /dev/null
@@ -0,0 +1,41 @@
+<html lang="en">
+<head>
+<link rel="stylesheet"
+       href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css"
+       type="text/css">
+<style>
+</style>
+<script
+       src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
+</head>
+<body>
+       <div id="map" class="map"></div>
+       <script type="text/javascript">
+       // default OSM
+       var source_OSM = new ol.source.OSM();
+       
+       var map = new ol.Map({
+                       target : 'map',
+                       layers : [ new ol.layer.Tile({
+                               source : source_OSM
+                       }) ],
+                       view : new ol.View({
+                               center : ol.proj.fromLonLat([ 34, 34 ]),
+                               zoom : 4
+                       })
+               });
+               map.on('rendercomplete', e => {
+                       console.log('Render completed.');
+                       renderCompleted();
+               });
+               var select = new ol.interaction.Select();
+               map.addInteraction(select);
+           select.on('select',function (e) {
+               if(e.selected.length>0){
+                               console.log('Feature selected: '+e.selected[0].get('path'));
+                       onFeatureSelect(e.selected[0].get('path'));
+               }
+           });
+       </script>
+</body>
+</html>
\ No newline at end of file
index 1df2bced95f444aec1f7efc4a88e5afa8ed7f2e0..b3d17dfd4aaf985a4e3f56c665b3b320330663a7 100644 (file)
                        <arguments>
                        </arguments>
                </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
        </buildSpec>
        <natures>
                <nature>org.eclipse.pde.PluginNature</nature>
diff --git a/people/org.argeo.people.ui/OSGI-INF/peopleEntryArea.xml b/people/org.argeo.people.ui/OSGI-INF/peopleEntryArea.xml
new file mode 100644 (file)
index 0000000..9601294
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.people.ui.PeopleEntryArea"/>
+   <service>
+      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+   </service>
+   <properties entry="config/peopleEntryArea.properties"/>
+   <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.cms.CmsUserManager" name="CmsUserManager" policy="static"/>
+</scr:component>
diff --git a/people/org.argeo.people.ui/OSGI-INF/peopleLayer.xml b/people/org.argeo.people.ui/OSGI-INF/peopleLayer.xml
new file mode 100644 (file)
index 0000000..09392aa
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy">
+   <implementation class="org.argeo.suite.ui.DefaultEditionLayer"/>
+   <properties entry="config/peopleLayer.properties"/>
+   <service>
+      <provide interface="org.argeo.suite.ui.SuiteLayer"/>
+   </service>
+   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.people.ui.peopleEntryArea)"/>
+</scr:component>
diff --git a/people/org.argeo.people.ui/OSGI-INF/personUiProvider.xml b/people/org.argeo.people.ui/OSGI-INF/personUiProvider.xml
new file mode 100644 (file)
index 0000000..f727bf8
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init">
+   <implementation class="org.argeo.people.ui.PersonUiProvider"/>
+   <service>
+      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+   </service>
+   <properties entry="config/personUiProvider.properties"/>
+   <property name="availableRoles" type="String">
+cn=APAF Internationale,ou=Groups,dc=apaf,dc=on,dc=djapps,dc=org
+cn=APAF Côte d'Ivoire Admin,ou=Groups,dc=apaf,dc=on,dc=djapps,dc=org
+cn=APAF Côte d'Ivoire,ou=Groups,dc=apaf,dc=on,dc=djapps,dc=org
+cn=APAF Togo Admin,ou=Groups,dc=apaf,dc=on,dc=djapps,dc=org
+cn=APAF Togo,ou=Groups,dc=apaf,dc=on,dc=djapps,dc=org
+   </property>
+   <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.cms.CmsUserManager" name="CmsUserManager" policy="static"/>
+</scr:component>
index 50f43644e62d4f921cc7134008c77e07c85b132d..1b92ebbbde79a8000f995d1ef0f1849ee6a663e4 100644 (file)
@@ -8,3 +8,9 @@ org.eclipse.jface.viewers,\
 org.eclipse.jface.window,\
 org.osgi.framework,\
 *
+
+Service-Component:\
+OSGI-INF/peopleLayer.xml,\
+OSGI-INF/personUiProvider.xml,\
+OSGI-INF/peopleEntryArea.xml
+
diff --git a/people/org.argeo.people.ui/config/peopleEntryArea.properties b/people/org.argeo.people.ui/config/peopleEntryArea.properties
new file mode 100644 (file)
index 0000000..37b28f9
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.people.ui.peopleEntryArea
diff --git a/people/org.argeo.people.ui/config/peopleLayer.properties b/people/org.argeo.people.ui/config/peopleLayer.properties
new file mode 100644 (file)
index 0000000..adadb7b
--- /dev/null
@@ -0,0 +1,7 @@
+service.pid=argeo.people.ui.peopleLayer
+
+icon=people
+weights=5000,5000
+title=%people
+
+entity.type=entity:person
\ No newline at end of file
diff --git a/people/org.argeo.people.ui/config/personUiProvider.properties b/people/org.argeo.people.ui/config/personUiProvider.properties
new file mode 100644 (file)
index 0000000..8c40c7d
--- /dev/null
@@ -0,0 +1,3 @@
+service.pid=argeo.people.ui.personUiProvider
+
+entity.type=entity:person
\ No newline at end of file
diff --git a/people/org.argeo.people.ui/src/org/argeo/people/ui/PeopleEntryArea.java b/people/org.argeo.people.ui/src/org/argeo/people/ui/PeopleEntryArea.java
new file mode 100644 (file)
index 0000000..2fd38da
--- /dev/null
@@ -0,0 +1,184 @@
+package org.argeo.people.ui;
+
+import java.util.Set;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.CmsUserManager;
+import org.argeo.cms.ui.CmsTheme;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.dialogs.CmsWizardDialog;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.eclipse.ui.Selected;
+import org.argeo.naming.LdapAttrs;
+import org.argeo.suite.SuiteRole;
+import org.argeo.suite.ui.SuiteEvent;
+import org.argeo.suite.ui.SuiteIcon;
+import org.argeo.suite.ui.dialogs.NewUserWizard;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.Wizard;
+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.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.osgi.service.useradmin.User;
+
+/** Entry to the admin area. */
+public class PeopleEntryArea implements CmsUiProvider {
+
+       private CmsUserManager cmsUserManager;
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               CmsTheme theme = CmsTheme.getCmsTheme(parent);
+               parent.setLayout(new GridLayout());
+               TableViewer usersViewer = new TableViewer(parent);
+               usersViewer.setContentProvider(new UsersContentProvider());
+
+               TableViewerColumn idCol = new TableViewerColumn(usersViewer, SWT.NONE);
+               idCol.getColumn().setWidth(70);
+               idCol.setLabelProvider(new ColumnLabelProvider() {
+
+                       @Override
+                       public String getText(Object element) {
+
+                               return getUserProperty(element, LdapAttrs.uid.name());
+                       }
+               });
+
+               TableViewerColumn givenNameCol = new TableViewerColumn(usersViewer, SWT.NONE);
+               givenNameCol.getColumn().setWidth(150);
+               givenNameCol.setLabelProvider(new ColumnLabelProvider() {
+
+                       @Override
+                       public String getText(Object element) {
+
+                               return getUserProperty(element, LdapAttrs.givenName.name());
+                       }
+               });
+
+               TableViewerColumn snCol = new TableViewerColumn(usersViewer, SWT.NONE);
+               snCol.getColumn().setWidth(150);
+               snCol.setLabelProvider(new ColumnLabelProvider() {
+
+                       @Override
+                       public String getText(Object element) {
+
+                               return getUserProperty(element, LdapAttrs.sn.name());
+                       }
+               });
+
+               TableViewerColumn mailCol = new TableViewerColumn(usersViewer, SWT.NONE);
+               mailCol.getColumn().setWidth(400);
+               mailCol.setLabelProvider(new ColumnLabelProvider() {
+
+                       @Override
+                       public String getText(Object element) {
+
+                               return getUserProperty(element, LdapAttrs.mail.name());
+                       }
+               });
+
+               Composite bottom = new Composite(parent, SWT.NONE);
+               bottom.setLayoutData(CmsUiUtils.fillWidth());
+               bottom.setLayout(CmsUiUtils.noSpaceGridLayout());
+               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);
+//             CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
+               deleteItem.setImage(SuiteIcon.delete.getSmallIcon(theme));
+               ToolItem addItem = new ToolItem(bottomToolBar, SWT.FLAT);
+               addItem.setImage(SuiteIcon.add.getSmallIcon(theme));
+               usersViewer.addDoubleClickListener(new IDoubleClickListener() {
+
+                       @Override
+                       public void doubleClick(DoubleClickEvent event) {
+                               User user = (User) usersViewer.getStructuredSelection().getFirstElement();
+                               if (user != null) {
+//                                     Node userNode = getOrCreateUserNode(user, context);
+                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
+                                                       SuiteEvent.eventProperties(user));
+                               }
+
+                       }
+               });
+               usersViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+                       public void selectionChanged(SelectionChangedEvent event) {
+                               User user = (User) usersViewer.getStructuredSelection().getFirstElement();
+                               if (user != null) {
+//                                     Node userNode = getOrCreateUserNode(user, context);
+                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
+                                                       SuiteEvent.eventProperties(user));
+                                       deleteItem.setEnabled(true);
+                               } else {
+                                       deleteItem.setEnabled(false);
+                               }
+                       }
+               });
+
+               addItem.addSelectionListener((Selected) (e) -> {
+                       // SuiteUtils.getOrCreateUserNode(adminSession, userDn);
+                       Wizard wizard = new NewUserWizard(null);
+                       CmsWizardDialog dialog = new CmsWizardDialog(parent.getShell(), wizard);
+                       // WizardDialog dialog = new WizardDialog(shell, wizard);
+                       if (dialog.open() == Window.OK) {
+                               // TODO create
+                       }
+               });
+
+               usersViewer.getTable().setLayoutData(CmsUiUtils.fillAll());
+               usersViewer.setInput(cmsUserManager);
+
+               return usersViewer.getTable();
+       }
+
+//     private Node getOrCreateUserNode(User user, Node context) {
+//             return JcrUtils.mkdirs(Jcr.getSession(context),
+//                             "/" + EntityType.user.name() + "/" + getUserProperty(user, LdapAttrs.uid.name()),
+//                             EntityType.user.get());
+//     }
+
+       private String getUserProperty(Object element, String key) {
+               Object value = ((User) element).getProperties().get(key);
+               return value != null ? value.toString() : null;
+       }
+
+       class UsersContentProvider implements IStructuredContentProvider {
+
+               @Override
+               public Object[] getElements(Object inputElement) {
+                       CmsUserManager cum = (CmsUserManager) inputElement;
+                       Set<User> users = cum.listUsersInGroup(SuiteRole.coworker.dn(), null);
+                       return users.toArray();
+               }
+
+               @Override
+               public void dispose() {
+               }
+
+               @Override
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+               }
+
+       }
+
+       public void setCmsUserManager(CmsUserManager cmsUserManager) {
+               this.cmsUserManager = cmsUserManager;
+       }
+
+}
diff --git a/people/org.argeo.people.ui/src/org/argeo/people/ui/PersonUiProvider.java b/people/org.argeo.people.ui/src/org/argeo/people/ui/PersonUiProvider.java
new file mode 100644 (file)
index 0000000..d2ea2fe
--- /dev/null
@@ -0,0 +1,88 @@
+package org.argeo.people.ui;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.CmsUserManager;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.cms.ui.viewers.Section;
+import org.argeo.naming.LdapAttrs;
+import org.argeo.suite.ui.SuiteMsg;
+import org.argeo.suite.ui.SuiteUiUtils;
+import org.eclipse.swt.SWT;
+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.Group;
+import org.eclipse.swt.widgets.Text;
+import org.osgi.service.useradmin.User;
+
+/** Edit a suite user. */
+public class PersonUiProvider implements CmsUiProvider {
+       private String[] availableRoles;
+       private CmsUserManager cmsUserManager;
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               Section main = new Section(parent, SWT.NONE, context);
+               main.setLayoutData(CmsUiUtils.fillAll());
+
+               String uid = context.getName();
+               User user = cmsUserManager.getUserFromLocalId(uid);
+
+//             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);
+               Group rolesSection = new Group(main, SWT.NONE);
+               rolesSection.setText("Roles");
+               rolesSection.setLayoutData(CmsUiUtils.fillWidth());
+               rolesSection.setLayout(new GridLayout());
+               // new Label(rolesSection, SWT.NONE).setText("Roles:");
+               List<String> 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;
+       }
+
+       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;
+       }
+
+       public void init(Map<String, Object> properties) {
+               availableRoles = (String[]) properties.get("availableRoles");
+       }
+}
index b9981f98cf1c070588222b3dc9554c4f0ba560d5..60f0b9b0b62984c44451308b654bc3bf2d2bc8b9 100644 (file)
@@ -17,7 +17,10 @@ org.argeo.suite.theme.default,\
 org.argeo.suite.ui.rap
 
 argeo.osgi.start.6.suite=\
-org.argeo.documents.ui
+org.argeo.documents.ui,\
+org.argeo.people.ui,\
+org.argeo.geo.ui
+
 
 # Local
 argeo.node.repo.type=h2