From: Mathieu Baudier Date: Tue, 26 Jan 2021 09:37:59 +0000 (+0100) Subject: Introduce People and Environment functional areas. X-Git-Tag: argeo-suite-2.1.18~18 X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=commitdiff_plain;h=096e9828998febd0faffe0c369b897d4826a2bc1 Introduce People and Environment functional areas. --- diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/core/.gitignore @@ -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 index 8c75f22..0000000 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/AdminEntryArea.java +++ /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 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 index 04d7a7b..0000000 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUserUiProvider.java +++ /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 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 properties) { - availableRoles = (String[]) properties.get("availableRoles"); - } -} diff --git a/dep/org.argeo.suite.dep.ui.rap/pom.xml b/dep/org.argeo.suite.dep.ui.rap/pom.xml index 53342ee..ad52013 100644 --- a/dep/org.argeo.suite.dep.ui.rap/pom.xml +++ b/dep/org.argeo.suite.dep.ui.rap/pom.xml @@ -50,6 +50,13 @@ 2.1.18-SNAPSHOT + + + org.argeo.suite + org.argeo.people.ui + 2.1.18-SNAPSHOT + + org.argeo.suite @@ -57,6 +64,13 @@ 2.1.18-SNAPSHOT + + + org.argeo.suite + org.argeo.geo.ui + 2.1.18-SNAPSHOT + + org.argeo.suite diff --git a/environment/.gitignore b/environment/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/environment/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/environment/org.argeo.geo.ui/.classpath b/environment/org.argeo.geo.ui/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/environment/org.argeo.geo.ui/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/environment/org.argeo.geo.ui/.gitignore b/environment/org.argeo.geo.ui/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/environment/org.argeo.geo.ui/.gitignore @@ -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 index 0000000..7956c34 --- /dev/null +++ b/environment/org.argeo.geo.ui/.project @@ -0,0 +1,28 @@ + + + org.argeo.geo.ui + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/environment/org.argeo.geo.ui/META-INF/.gitignore b/environment/org.argeo.geo.ui/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/environment/org.argeo.geo.ui/META-INF/.gitignore @@ -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 index 0000000..30cf566 --- /dev/null +++ b/environment/org.argeo.geo.ui/bnd.bnd @@ -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 index 0000000..34d2e4d --- /dev/null +++ b/environment/org.argeo.geo.ui/build.properties @@ -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 index 0000000..f7d6d2b --- /dev/null +++ b/environment/org.argeo.geo.ui/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + org.argeo.suite + environment + 2.1.18-SNAPSHOT + .. + + org.argeo.geo.ui + Geography UI + jar + + + org.argeo.suite + org.argeo.suite.ui + 2.1.18-SNAPSHOT + + + + + org.argeo.tp + argeo-tp-rap-e4 + ${version.argeo-tp} + pom + provided + + + + org.argeo.commons + org.argeo.eclipse.ui.rap + ${version.argeo-commons} + provided + + + + 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 index 0000000..6a45c0d --- /dev/null +++ b/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java @@ -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 index 0000000..622f5a4 --- /dev/null +++ b/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java @@ -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 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 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 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 index 0000000..a8ede8b --- /dev/null +++ b/environment/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.1.18-SNAPSHOT + .. + + environment + Argeo Environment Components + pom + + org.argeo.geo.ui + + diff --git a/lib/pom.xml b/lib/pom.xml index df4af65..987c0c4 100644 --- a/lib/pom.xml +++ b/lib/pom.xml @@ -15,9 +15,7 @@ 2.1.27 2.1.13 - 2.1.89 - - + 2.1.91-SNAPSHOT /srv/rpmfactory/argeo-osgi-2-gpl/el7 diff --git a/people/.gitignore b/people/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/people/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/people/org.argeo.people.ui/.classpath b/people/org.argeo.people.ui/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/people/org.argeo.people.ui/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/people/org.argeo.people.ui/.gitignore b/people/org.argeo.people.ui/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/people/org.argeo.people.ui/.gitignore @@ -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 index 0000000..1df2bce --- /dev/null +++ b/people/org.argeo.people.ui/.project @@ -0,0 +1,28 @@ + + + org.argeo.people.ui + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/people/org.argeo.people.ui/META-INF/.gitignore b/people/org.argeo.people.ui/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/people/org.argeo.people.ui/META-INF/.gitignore @@ -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 index 0000000..50f4364 --- /dev/null +++ b/people/org.argeo.people.ui/bnd.bnd @@ -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 index 0000000..34d2e4d --- /dev/null +++ b/people/org.argeo.people.ui/build.properties @@ -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 index 0000000..2167104 --- /dev/null +++ b/people/org.argeo.people.ui/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + org.argeo.suite + people + 2.1.18-SNAPSHOT + .. + + org.argeo.people.ui + People UI + jar + + + org.argeo.suite + org.argeo.suite.ui + 2.1.18-SNAPSHOT + + + + + org.argeo.tp + argeo-tp-rap-e4 + ${version.argeo-tp} + pom + provided + + + + org.argeo.commons + org.argeo.eclipse.ui.rap + ${version.argeo-commons} + provided + + + + 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 index 0000000..aa83cd2 --- /dev/null +++ b/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUserUiProvider.java @@ -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 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 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 index 0000000..66f3eda --- /dev/null +++ b/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java @@ -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 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 index 0000000..cd9716e --- /dev/null +++ b/people/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.1.18-SNAPSHOT + .. + + people + Argeo People Components + pom + + org.argeo.people.ui + + diff --git a/pom.xml b/pom.xml index 36bd192..a43adf1 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,9 @@ core + people library + environment publishing knowledge