Introduce People and Environment functional areas.
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 26 Jan 2021 09:37:59 +0000 (10:37 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 26 Jan 2021 09:37:59 +0000 (10:37 +0100)
28 files changed:
core/.gitignore [new file with mode: 0644]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/AdminEntryArea.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUserUiProvider.java [deleted file]
dep/org.argeo.suite.dep.ui.rap/pom.xml
environment/.gitignore [new file with mode: 0644]
environment/org.argeo.geo.ui/.classpath [new file with mode: 0644]
environment/org.argeo.geo.ui/.gitignore [new file with mode: 0644]
environment/org.argeo.geo.ui/.project [new file with mode: 0644]
environment/org.argeo.geo.ui/META-INF/.gitignore [new file with mode: 0644]
environment/org.argeo.geo.ui/bnd.bnd [new file with mode: 0644]
environment/org.argeo.geo.ui/build.properties [new file with mode: 0644]
environment/org.argeo.geo.ui/pom.xml [new file with mode: 0644]
environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java [new file with mode: 0644]
environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java [new file with mode: 0644]
environment/pom.xml [new file with mode: 0644]
lib/pom.xml
people/.gitignore [new file with mode: 0644]
people/org.argeo.people.ui/.classpath [new file with mode: 0644]
people/org.argeo.people.ui/.gitignore [new file with mode: 0644]
people/org.argeo.people.ui/.project [new file with mode: 0644]
people/org.argeo.people.ui/META-INF/.gitignore [new file with mode: 0644]
people/org.argeo.people.ui/bnd.bnd [new file with mode: 0644]
people/org.argeo.people.ui/build.properties [new file with mode: 0644]
people/org.argeo.people.ui/pom.xml [new file with mode: 0644]
people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUserUiProvider.java [new file with mode: 0644]
people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java [new file with mode: 0644]
people/pom.xml [new file with mode: 0644]
pom.xml

diff --git a/core/.gitignore b/core/.gitignore
new file mode 100644 (file)
index 0000000..b83d222
--- /dev/null
@@ -0,0 +1 @@
+/target/
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/AdminEntryArea.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/AdminEntryArea.java
deleted file mode 100644 (file)
index 8c75f22..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-package org.argeo.suite.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.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 AdminEntryArea 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/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUserUiProvider.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUserUiProvider.java
deleted file mode 100644 (file)
index 04d7a7b..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.argeo.suite.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.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 SuiteUserUiProvider 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 53342ee6970f21e0742182c5e1ec4852c1ffc956..ad52013171f097afefe255c285dd32951a418890 100644 (file)
                        <version>2.1.18-SNAPSHOT</version>
                </dependency>
                
+               <!-- Argeo People -->
+               <dependency>
+                       <groupId>org.argeo.suite</groupId>
+                       <artifactId>org.argeo.people.ui</artifactId>
+                       <version>2.1.18-SNAPSHOT</version>
+               </dependency>
+
                <!-- Argeo Library -->
                <dependency>
                        <groupId>org.argeo.suite</groupId>
                        <version>2.1.18-SNAPSHOT</version>
                </dependency>
 
+               <!-- Argeo Environment -->
+               <dependency>
+                       <groupId>org.argeo.suite</groupId>
+                       <artifactId>org.argeo.geo.ui</artifactId>
+                       <version>2.1.18-SNAPSHOT</version>
+               </dependency>
+
                <!-- Argeo Publishing -->
                <dependency>
                        <groupId>org.argeo.suite</groupId>
diff --git a/environment/.gitignore b/environment/.gitignore
new file mode 100644 (file)
index 0000000..b83d222
--- /dev/null
@@ -0,0 +1 @@
+/target/
diff --git a/environment/org.argeo.geo.ui/.classpath b/environment/org.argeo.geo.ui/.classpath
new file mode 100644 (file)
index 0000000..e801ebf
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/environment/org.argeo.geo.ui/.gitignore b/environment/org.argeo.geo.ui/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/environment/org.argeo.geo.ui/.project b/environment/org.argeo.geo.ui/.project
new file mode 100644 (file)
index 0000000..7956c34
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.geo.ui</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/environment/org.argeo.geo.ui/META-INF/.gitignore b/environment/org.argeo.geo.ui/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/environment/org.argeo.geo.ui/bnd.bnd b/environment/org.argeo.geo.ui/bnd.bnd
new file mode 100644 (file)
index 0000000..30cf566
--- /dev/null
@@ -0,0 +1,9 @@
+Import-Package:\
+javax.jcr.nodetype,\
+org.osgi.service.event,\
+org.argeo.suite.ui,\
+org.argeo.api,\
+org.eclipse.swt,\
+org.eclipse.jface.viewers,\
+org.osgi.framework,\
+*
diff --git a/environment/org.argeo.geo.ui/build.properties b/environment/org.argeo.geo.ui/build.properties
new file mode 100644 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/environment/org.argeo.geo.ui/pom.xml b/environment/org.argeo.geo.ui/pom.xml
new file mode 100644 (file)
index 0000000..f7d6d2b
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.suite</groupId>
+               <artifactId>environment</artifactId>
+               <version>2.1.18-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.geo.ui</artifactId>
+       <name>Geography UI</name>
+       <packaging>jar</packaging>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.suite</groupId>
+                       <artifactId>org.argeo.suite.ui</artifactId>
+                       <version>2.1.18-SNAPSHOT</version>
+               </dependency>
+
+               <!-- Eclipse E4 -->
+               <dependency>
+                       <groupId>org.argeo.tp</groupId>
+                       <artifactId>argeo-tp-rap-e4</artifactId>
+                       <version>${version.argeo-tp}</version>
+                       <type>pom</type>
+                       <scope>provided</scope>
+               </dependency>
+               <!-- Specific -->
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
+                       <version>${version.argeo-commons}</version>
+                       <scope>provided</scope>
+               </dependency>
+
+       </dependencies>
+</project>
diff --git a/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java b/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java
new file mode 100644 (file)
index 0000000..6a45c0d
--- /dev/null
@@ -0,0 +1,5 @@
+package org.argeo.geo;
+
+public class GeoJsonToSvg {
+
+}
diff --git a/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java b/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java
new file mode 100644 (file)
index 0000000..622f5a4
--- /dev/null
@@ -0,0 +1,250 @@
+package org.argeo.support.openlayers;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.api.NodeConstants;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.entity.EntityNames;
+import org.argeo.entity.EntityType;
+import org.argeo.suite.ui.SuiteEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.BrowserFunction;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/** Display a map. */
+public class OpenLayersMap extends Composite {
+       private static final long serialVersionUID = 1055893020490283622L;
+
+       private final static Log log = LogFactory.getLog(OpenLayersMap.class);
+
+       private Browser browser;
+       private boolean renderCompleted = false;
+
+       private Double centerLng = null, centerLat = null;
+       private Integer zoom = null;
+       private String vectorSource = null;
+       private String gpxSource = null;
+
+       private List<String> geoJsonSources = new ArrayList<>();
+
+       private CmsView cmsView;
+
+       public OpenLayersMap(Composite parent, int style, URL mapHtml) {
+               super(parent, style);
+               cmsView = CmsView.getCmsView(parent);
+               setLayout(new GridLayout());
+
+               browser = new Browser(this, SWT.BORDER);
+               browser.setLayoutData(CmsUiUtils.fillAll());
+               String html;
+               try (InputStream in = mapHtml.openStream()) {
+                       html = IOUtils.toString(in, StandardCharsets.UTF_8);
+               } catch (IOException e) {
+                       throw new RuntimeException(e);
+               }
+               new RenderCompleted(browser, "renderCompleted");
+               new OnFeatureSelect(browser, "onFeatureSelect");
+               new OnFeatureUnselect(browser, "onFeatureUnselect");
+               new OnFeatureClick(browser, "onFeatureClick");
+               browser.setText(html);
+       }
+
+       public void setCenter(Double lng, Double lat) {
+               if (isRenderCompleted())
+                       browser.evaluate("map.getView().setCenter(ol.proj.fromLonLat([" + lng + ", " + lat + "]))");
+               this.centerLat = lat;
+               this.centerLng = lng;
+       }
+
+       public synchronized void setRenderCompleted(boolean renderCompleted) {
+               this.renderCompleted = renderCompleted;
+               notifyAll();
+       }
+
+       public synchronized boolean isRenderCompleted() {
+               return renderCompleted;
+       }
+
+       @Override
+       public synchronized void dispose() {
+               long timeout = 500;
+               long begin = System.currentTimeMillis();
+               while (!isRenderCompleted() && ((System.currentTimeMillis() - begin) < timeout)) {
+                       try {
+                               wait(50);
+                       } catch (InterruptedException e) {
+                               // silent
+                       }
+               }
+               super.dispose();
+       }
+
+       public void setZoom(int zoom) {
+               if (isRenderCompleted())
+                       browser.evaluate("map.getView().setZoom(" + zoom + ")");
+               this.zoom = zoom;
+       }
+
+       public void addPoints(List<Node> geoPoints) throws RepositoryException {
+               boolean first = true;
+               StringBuffer sb = new StringBuffer("new ol.source.Vector({ features: [");
+               for (int i = 0; i < geoPoints.size(); i++) {
+                       Node node = geoPoints.get(i);
+                       if (node.isNodeType(EntityType.geopoint.get()) && !node.isCheckedOut()) {
+                               if (first)
+                                       first = false;
+                               else
+                                       sb.append(",");
+                               Double lng = node.getProperty(EntityNames.GEO_LONG).getDouble();
+                               Double lat = node.getProperty(EntityNames.GEO_LAT).getDouble();
+                               sb.append("new ol.Feature({ geometry:");
+                               sb.append("new ol.geom.Point(ol.proj.fromLonLat([");
+                               sb.append(lng).append(',').append(lat);
+                               sb.append("]))");
+                               sb.append(",path:'").append(node.getPath()).append("'");
+                               sb.append("})");
+                       }
+               }
+               sb.append("] })");
+               this.vectorSource = sb.toString();
+               if (log.isTraceEnabled())
+                       log.trace("Vector source: " + vectorSource);
+               renderVectorSource();
+       }
+
+       protected void renderVectorSource() {
+               if (vectorSource == null)
+                       return;
+               if (isRenderCompleted())
+                       browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + vectorSource + "}));");
+       }
+
+       public void addPoint(Double lng, Double lat) {
+               this.vectorSource = "new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
+                               + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] })";
+//             if (renderCompleted) {
+//                     browser.evaluate(
+//                                     "map.addLayer(new ol.layer.Vector({ source: new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
+//                                                     + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] }) }));");
+//             }
+               renderVectorSource();
+       }
+
+       public void addGpx(String path) {
+               this.gpxSource = "new ol.source.Vector({ url: '" + path + "', format: new ol.format.GPX() })";
+               renderGpxSource();
+       }
+
+       protected void renderGpxSource() {
+               if (gpxSource == null)
+                       return;
+               if (isRenderCompleted())
+                       browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + gpxSource + "}));");
+       }
+
+       public void addGeoJson(String path) {
+               String geoJsonSource = "new ol.source.Vector({ url: '" + path + "', format: new ol.format.GeoJSON() })";
+               geoJsonSources.add(geoJsonSource);
+               renderGeoJsonSources();
+       }
+
+       protected void renderGeoJsonSources() {
+               if (geoJsonSources.isEmpty())
+                       return;
+               if (isRenderCompleted()) {
+                       for (String geoJson : geoJsonSources) {
+                               browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + geoJson + "}));");
+                       }
+               }
+       }
+
+       private class RenderCompleted extends BrowserFunction {
+
+               RenderCompleted(Browser browser, String name) {
+                       super(browser, name);
+               }
+
+               @Override
+               public Object function(Object[] arguments) {
+                       try {
+                               if (!isRenderCompleted()) {
+                                       setRenderCompleted(true);
+                                       if (zoom != null)
+                                               setZoom(zoom);
+                                       if (centerLat != null && centerLng != null) {
+                                               setCenter(centerLng, centerLat);
+                                       }
+                                       if (vectorSource != null)
+                                               renderVectorSource();
+                                       if (gpxSource != null)
+                                               renderGpxSource();
+                                       if (!geoJsonSources.isEmpty())
+                                               renderGeoJsonSources();
+                               }
+                               return null;
+                       } catch (Exception e) {
+                               log.error("Cannot render map", e);
+                               return null;
+                       }
+               }
+       }
+
+       private class OnFeatureSelect extends BrowserFunction {
+
+               OnFeatureSelect(Browser browser, String name) {
+                       super(browser, name);
+               }
+
+               @Override
+               public Object function(Object[] arguments) {
+                       if (arguments.length == 0)
+                               return null;
+                       String path = arguments[0].toString();
+                       Map<String, Object> properties = new HashMap<>();
+                       properties.put(SuiteEvent.NODE_PATH, path);
+                       properties.put(SuiteEvent.WORKSPACE, NodeConstants.SYS_WORKSPACE);
+                       cmsView.sendEvent(SuiteEvent.refreshPart.topic(), properties);
+                       return null;
+               }
+       }
+
+       private class OnFeatureUnselect extends BrowserFunction {
+
+               OnFeatureUnselect(Browser browser, String name) {
+                       super(browser, name);
+               }
+
+               @Override
+               public Object function(Object[] arguments) {
+                       return null;
+               }
+       }
+
+       private class OnFeatureClick extends BrowserFunction {
+
+               OnFeatureClick(Browser browser, String name) {
+                       super(browser, name);
+               }
+
+               @Override
+               public Object function(Object[] arguments) {
+                       return null;
+               }
+       }
+}
diff --git a/environment/pom.xml b/environment/pom.xml
new file mode 100644 (file)
index 0000000..a8ede8b
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.suite</groupId>
+               <artifactId>argeo-suite</artifactId>
+               <version>2.1.18-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>environment</artifactId>
+       <name>Argeo Environment Components</name>
+       <packaging>pom</packaging>
+       <modules>
+               <module>org.argeo.geo.ui</module>
+       </modules>
+</project>
index df4af653305372f203d53410c684acede709fbd9..987c0c4a346ce44b3f55310c68ed867626613f52 100644 (file)
@@ -15,9 +15,7 @@
                <!-- Dependencies -->
                <version.argeo-tp>2.1.27</version.argeo-tp>
                <version.argeo-tp-extras>2.1.13</version.argeo-tp-extras>
-               <version.argeo-commons>2.1.89</version.argeo-commons>
-               <!-- <version.argeo-connect>2.1.82-SNAPSHOT</version.argeo-connect> -->
-               <!-- <version.argeo-slc>2.1.17-SNAPSHOT</version.argeo-slc> -->
+               <version.argeo-commons>2.1.91-SNAPSHOT</version.argeo-commons>
 
                <argeo.rpm.stagingRepository>/srv/rpmfactory/argeo-osgi-2-gpl/el7</argeo.rpm.stagingRepository>
                <git.rw />
diff --git a/people/.gitignore b/people/.gitignore
new file mode 100644 (file)
index 0000000..b83d222
--- /dev/null
@@ -0,0 +1 @@
+/target/
diff --git a/people/org.argeo.people.ui/.classpath b/people/org.argeo.people.ui/.classpath
new file mode 100644 (file)
index 0000000..e801ebf
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/people/org.argeo.people.ui/.gitignore b/people/org.argeo.people.ui/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/people/org.argeo.people.ui/.project b/people/org.argeo.people.ui/.project
new file mode 100644 (file)
index 0000000..1df2bce
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.people.ui</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/people/org.argeo.people.ui/META-INF/.gitignore b/people/org.argeo.people.ui/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/people/org.argeo.people.ui/bnd.bnd b/people/org.argeo.people.ui/bnd.bnd
new file mode 100644 (file)
index 0000000..50f4364
--- /dev/null
@@ -0,0 +1,10 @@
+Import-Package:\
+javax.jcr.nodetype,\
+org.osgi.service.event,\
+org.argeo.suite.ui,\
+org.argeo.api,\
+org.eclipse.swt,\
+org.eclipse.jface.viewers,\
+org.eclipse.jface.window,\
+org.osgi.framework,\
+*
diff --git a/people/org.argeo.people.ui/build.properties b/people/org.argeo.people.ui/build.properties
new file mode 100644 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/people/org.argeo.people.ui/pom.xml b/people/org.argeo.people.ui/pom.xml
new file mode 100644 (file)
index 0000000..2167104
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.suite</groupId>
+               <artifactId>people</artifactId>
+               <version>2.1.18-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.people.ui</artifactId>
+       <name>People UI</name>
+       <packaging>jar</packaging>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.suite</groupId>
+                       <artifactId>org.argeo.suite.ui</artifactId>
+                       <version>2.1.18-SNAPSHOT</version>
+               </dependency>
+
+               <!-- Eclipse E4 -->
+               <dependency>
+                       <groupId>org.argeo.tp</groupId>
+                       <artifactId>argeo-tp-rap-e4</artifactId>
+                       <version>${version.argeo-tp}</version>
+                       <type>pom</type>
+                       <scope>provided</scope>
+               </dependency>
+               <!-- Specific -->
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
+                       <version>${version.argeo-commons}</version>
+                       <scope>provided</scope>
+               </dependency>
+
+       </dependencies>
+</project>
diff --git a/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUserUiProvider.java b/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUserUiProvider.java
new file mode 100644 (file)
index 0000000..aa83cd2
--- /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 SuiteUserUiProvider 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");
+       }
+}
diff --git a/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java b/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java
new file mode 100644 (file)
index 0000000..66f3eda
--- /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 SuiteUsersEntryArea 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/pom.xml b/people/pom.xml
new file mode 100644 (file)
index 0000000..cd9716e
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.suite</groupId>
+               <artifactId>argeo-suite</artifactId>
+               <version>2.1.18-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>people</artifactId>
+       <name>Argeo People Components</name>
+       <packaging>pom</packaging>
+       <modules>
+               <module>org.argeo.people.ui</module>
+       </modules>
+</project>
diff --git a/pom.xml b/pom.xml
index 36bd192644f29f7ca0bc8ca6b03dab2d27b9fbcb..a43adf14d8a931885075c9da0f40017cc9cb8f6e 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,9 @@
        <modules>
                <module>core</module>
                <!-- Functional areas -->
+               <module>people</module>
                <module>library</module>
+               <module>environment</module>
                <module>publishing</module>
                <module>knowledge</module>