<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>
<arguments>
</arguments>
</buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
org.eclipse.jface.viewers,\
org.osgi.framework,\
*
+
+Service-Component:\
+OSGI-INF/mapLayer.xml,\
+OSGI-INF/overviewMap.xml
--- /dev/null
+service.pid=argeo.geo.ui.mapLayer
+
+title=%map
+icon=map
\ No newline at end of file
--- /dev/null
+service.pid=argeo.geo.ui.overviewMap
--- /dev/null
+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);
+ }
+}
--- /dev/null
+<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
<arguments>
</arguments>
</buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
org.eclipse.jface.window,\
org.osgi.framework,\
*
+
+Service-Component:\
+OSGI-INF/peopleLayer.xml,\
+OSGI-INF/personUiProvider.xml,\
+OSGI-INF/peopleEntryArea.xml
+
--- /dev/null
+service.pid=argeo.people.ui.peopleEntryArea
--- /dev/null
+service.pid=argeo.people.ui.peopleLayer
+
+icon=people
+weights=5000,5000
+title=%people
+
+entity.type=entity:person
\ No newline at end of file
--- /dev/null
+service.pid=argeo.people.ui.personUiProvider
+
+entity.type=entity:person
\ No newline at end of file
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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");
+ }
+}
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