From 485276fef3d75327309998cb63559c824c66a78e Mon Sep 17 00:00:00 2001 From: Giancarlo Panichi Date: Mon, 18 May 2015 15:10:35 +0000 Subject: [PATCH] 81: Allow the creation and use of expressions on multi column in TDM portlet Task-Url: https://support.d4science.org/issues/81 Updated Rules Widget to create expression on multi column git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/tabular-data-rule-widget@114781 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 48 ++ .project | 53 ++ RuleWidget.launch | 17 + config/profile.xml | 29 + distro/INSTALL | 0 distro/LICENSE | 6 + distro/MAINTAINERS | 1 + distro/README | 48 ++ distro/changelog.xml | 6 + distro/svnpath.txt | 1 + pom.xml | 360 +++++++++++ .../user/td/rulewidget/RuleWidget.gwt.xml | 66 ++ .../rulewidget/client/RuleActiveDialog.java | 63 ++ .../td/rulewidget/client/RuleActivePanel.java | 481 ++++++++++++++ .../td/rulewidget/client/RuleApplyDialog.java | 172 +++++ .../td/rulewidget/client/RuleApplyPanel.java | 602 ++++++++++++++++++ .../rulewidget/client/RuleDeleteDialog.java | 103 +++ .../td/rulewidget/client/RuleDeletePanel.java | 430 +++++++++++++ .../td/rulewidget/client/RuleInfoDialog.java | 98 +++ .../td/rulewidget/client/RuleOpenDialog.java | 105 +++ .../td/rulewidget/client/RuleOpenPanel.java | 436 +++++++++++++ .../td/rulewidget/client/RuleShareDialog.java | 76 +++ .../td/rulewidget/client/RuleSharePanel.java | 422 ++++++++++++ .../td/rulewidget/client/RuleWidgetEntry.java | 83 +++ .../td/rulewidget/client/resources/Dialog.css | 3 + .../client/resources/DialogCSS.java | 19 + .../client/resources/ResourceBundle.java | 130 ++++ .../td/rulewidget/client/resources/accept.png | Bin 0 -> 781 bytes .../td/rulewidget/client/resources/add.png | Bin 0 -> 660 bytes .../td/rulewidget/client/resources/add_32.png | Bin 0 -> 1486 bytes .../client/resources/arrow-refresh_16.png | Bin 0 -> 572 bytes .../client/resources/arrow-refresh_32.png | Bin 0 -> 1182 bytes .../rulewidget/client/resources/close-red.png | Bin 0 -> 693 bytes .../client/resources/close-red_32.png | Bin 0 -> 1610 bytes .../td/rulewidget/client/resources/close.png | Bin 0 -> 693 bytes .../rulewidget/client/resources/close_32.png | Bin 0 -> 1610 bytes .../td/rulewidget/client/resources/delete.png | Bin 0 -> 614 bytes .../rulewidget/client/resources/delete_32.png | Bin 0 -> 1360 bytes .../td/rulewidget/client/resources/disk.png | Bin 0 -> 482 bytes .../rulewidget/client/resources/disk_32.png | Bin 0 -> 886 bytes .../td/rulewidget/client/resources/error.png | Bin 0 -> 701 bytes .../client/resources/information.png | Bin 0 -> 695 bytes .../client/resources/information_32.png | Bin 0 -> 1582 bytes .../rulewidget/client/resources/loading.gif | Bin 0 -> 771 bytes .../rulewidget/client/resources/magnifier.png | Bin 0 -> 548 bytes .../client/resources/magnifier_32.png | Bin 0 -> 1243 bytes .../rulewidget/client/resources/rule-add.png | Bin 0 -> 1597 bytes .../client/resources/rule-add_32.png | Bin 0 -> 2267 bytes .../client/resources/rule-apply.png | Bin 0 -> 819 bytes .../client/resources/rule-apply_32.png | Bin 0 -> 1802 bytes .../client/resources/rule-close.png | Bin 0 -> 819 bytes .../client/resources/rule-close_32.png | Bin 0 -> 1988 bytes .../client/resources/rule-column-add.png | Bin 0 -> 882 bytes .../client/resources/rule-column-add_32.png | Bin 0 -> 2031 bytes .../client/resources/rule-column-apply.png | Bin 0 -> 863 bytes .../client/resources/rule-column-apply_32.png | Bin 0 -> 1926 bytes .../client/resources/rule-column-close.png | Bin 0 -> 877 bytes .../client/resources/rule-column-close_32.png | Bin 0 -> 2012 bytes .../client/resources/rule-column-detach.png | Bin 0 -> 862 bytes .../resources/rule-column-detach_32.png | Bin 0 -> 1918 bytes .../client/resources/rule-delete.png | Bin 0 -> 861 bytes .../client/resources/rule-delete_32.png | Bin 0 -> 2064 bytes .../rulewidget/client/resources/rule-edit.png | Bin 0 -> 839 bytes .../client/resources/rule-edit_32.png | Bin 0 -> 1940 bytes .../rulewidget/client/resources/rule-open.png | Bin 0 -> 969 bytes .../client/resources/rule-open_32.png | Bin 0 -> 2549 bytes .../client/resources/rule-share.png | Bin 0 -> 958 bytes .../client/resources/rule-share_32.png | Bin 0 -> 2341 bytes .../client/resources/rule-tabularresource.png | Bin 0 -> 719 bytes .../resources/rule-tabularresource_32.png | Bin 0 -> 1571 bytes .../user/td/rulewidget/RuleWidget.gwt.xml | 61 ++ .../td/rulewidget/client/resources/Dialog.css | 3 + .../td/rulewidget/client/resources/accept.png | Bin 0 -> 781 bytes .../td/rulewidget/client/resources/add.png | Bin 0 -> 660 bytes .../td/rulewidget/client/resources/add_32.png | Bin 0 -> 1486 bytes .../client/resources/arrow-refresh_16.png | Bin 0 -> 572 bytes .../client/resources/arrow-refresh_32.png | Bin 0 -> 1182 bytes .../rulewidget/client/resources/close-red.png | Bin 0 -> 693 bytes .../client/resources/close-red_32.png | Bin 0 -> 1610 bytes .../td/rulewidget/client/resources/close.png | Bin 0 -> 693 bytes .../rulewidget/client/resources/close_32.png | Bin 0 -> 1610 bytes .../td/rulewidget/client/resources/delete.png | Bin 0 -> 614 bytes .../rulewidget/client/resources/delete_32.png | Bin 0 -> 1360 bytes .../td/rulewidget/client/resources/disk.png | Bin 0 -> 482 bytes .../rulewidget/client/resources/disk_32.png | Bin 0 -> 886 bytes .../td/rulewidget/client/resources/error.png | Bin 0 -> 701 bytes .../client/resources/information.png | Bin 0 -> 695 bytes .../client/resources/information_32.png | Bin 0 -> 1582 bytes .../rulewidget/client/resources/loading.gif | Bin 0 -> 771 bytes .../rulewidget/client/resources/magnifier.png | Bin 0 -> 548 bytes .../client/resources/magnifier_32.png | Bin 0 -> 1243 bytes .../rulewidget/client/resources/rule-add.png | Bin 0 -> 1597 bytes .../client/resources/rule-add_32.png | Bin 0 -> 2267 bytes .../client/resources/rule-apply.png | Bin 0 -> 819 bytes .../client/resources/rule-apply_32.png | Bin 0 -> 1802 bytes .../client/resources/rule-close.png | Bin 0 -> 819 bytes .../client/resources/rule-close_32.png | Bin 0 -> 1988 bytes .../client/resources/rule-column-add.png | Bin 0 -> 882 bytes .../client/resources/rule-column-add_32.png | Bin 0 -> 2031 bytes .../client/resources/rule-column-apply.png | Bin 0 -> 863 bytes .../client/resources/rule-column-apply_32.png | Bin 0 -> 1926 bytes .../client/resources/rule-column-close.png | Bin 0 -> 877 bytes .../client/resources/rule-column-close_32.png | Bin 0 -> 2012 bytes .../client/resources/rule-column-detach.png | Bin 0 -> 862 bytes .../resources/rule-column-detach_32.png | Bin 0 -> 1918 bytes .../client/resources/rule-delete.png | Bin 0 -> 861 bytes .../client/resources/rule-delete_32.png | Bin 0 -> 2064 bytes .../rulewidget/client/resources/rule-edit.png | Bin 0 -> 839 bytes .../client/resources/rule-edit_32.png | Bin 0 -> 1940 bytes .../rulewidget/client/resources/rule-open.png | Bin 0 -> 969 bytes .../client/resources/rule-open_32.png | Bin 0 -> 2549 bytes .../client/resources/rule-share.png | Bin 0 -> 958 bytes .../client/resources/rule-share_32.png | Bin 0 -> 2341 bytes .../client/resources/rule-tabularresource.png | Bin 0 -> 719 bytes .../resources/rule-tabularresource_32.png | Bin 0 -> 1571 bytes src/main/webapp/RuleWidget.css | 34 + src/main/webapp/RuleWidget.html | 50 ++ src/main/webapp/WEB-INF/web.xml | 35 + .../rulewidget/client/GwtTestRuleWidget.java | 64 ++ .../td/rulewidget/RuleWidgetJUnit.gwt.xml | 13 + templates/INSTALL | 0 templates/LICENSE | 6 + templates/MAINTAINERS | 1 + templates/README | 48 ++ templates/changelog.xml | 6 + templates/descriptor.xml | 39 ++ templates/profile.xml | 29 + templates/svnpath.txt | 1 + 128 files changed, 4248 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 RuleWidget.launch create mode 100644 config/profile.xml create mode 100644 distro/INSTALL create mode 100644 distro/LICENSE create mode 100644 distro/MAINTAINERS create mode 100644 distro/README create mode 100644 distro/changelog.xml create mode 100644 distro/svnpath.txt create mode 100644 pom.xml create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/RuleWidget.gwt.xml create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleActiveDialog.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleActivePanel.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleApplyDialog.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleApplyPanel.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleDeleteDialog.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleDeletePanel.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleInfoDialog.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleOpenDialog.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleOpenPanel.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleShareDialog.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleSharePanel.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleWidgetEntry.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/Dialog.css create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/DialogCSS.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/ResourceBundle.java create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/accept.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/add.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/add_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/arrow-refresh_16.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/arrow-refresh_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/close-red.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/close-red_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/close.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/close_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/delete.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/delete_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/disk.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/disk_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/error.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/information.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/information_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/loading.gif create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/magnifier.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/magnifier_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-close.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-close_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-add.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-add_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-apply.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-apply_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-close.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-close_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-detach.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-detach_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-edit.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-edit_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-open.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-open_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-tabularresource.png create mode 100644 src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-tabularresource_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/RuleWidget.gwt.xml create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/Dialog.css create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/accept.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/add.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/add_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/arrow-refresh_16.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/arrow-refresh_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/close-red.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/close-red_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/close.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/close_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/delete.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/delete_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/disk.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/disk_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/error.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/information.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/information_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/loading.gif create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/magnifier.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/magnifier_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-close.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-close_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-add.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-add_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-apply.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-apply_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-close.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-close_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-detach.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-detach_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-edit.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-edit_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-open.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-open_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share_32.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-tabularresource.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-tabularresource_32.png create mode 100644 src/main/webapp/RuleWidget.css create mode 100644 src/main/webapp/RuleWidget.html create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/test/java/org/gcube/portlets/user/td/rulewidget/client/GwtTestRuleWidget.java create mode 100644 src/test/resources/org/gcube/portlets/user/td/rulewidget/RuleWidgetJUnit.gwt.xml create mode 100644 templates/INSTALL create mode 100644 templates/LICENSE create mode 100644 templates/MAINTAINERS create mode 100644 templates/README create mode 100644 templates/changelog.xml create mode 100644 templates/descriptor.xml create mode 100644 templates/profile.xml create mode 100644 templates/svnpath.txt diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..eeee3e0 --- /dev/null +++ b/.classpath @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..b6d5d88 --- /dev/null +++ b/.project @@ -0,0 +1,53 @@ + + + tabular-data-rule-widget + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + com.google.gdt.eclipse.core.webAppProjectValidator + + + + + com.google.gwt.eclipse.core.gwtProjectValidator + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + com.google.gwt.eclipse.core.gwtNature + + diff --git a/RuleWidget.launch b/RuleWidget.launch new file mode 100644 index 0000000..6098c85 --- /dev/null +++ b/RuleWidget.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/config/profile.xml b/config/profile.xml new file mode 100644 index 0000000..fd635b8 --- /dev/null +++ b/config/profile.xml @@ -0,0 +1,29 @@ + + + + Service + + tabular-data-rule-widget allows to manage rules + PortletsUser + tabular-data-rule-widget + 1.0.0-SNAPSHOT + + + tabular-data-rule-widget allows to manage rules + tabular-data-rule-widget + 1.0.0-SNAPSHOT + + org.gcube.portlets.user + tabular-data-rule-widget + 1.0.0-SNAPSHOT + + library + + tabular-data-rule-widget-1.0.0-SNAPSHOT.jar + + + + + + + diff --git a/distro/INSTALL b/distro/INSTALL new file mode 100644 index 0000000..e69de29 diff --git a/distro/LICENSE b/distro/LICENSE new file mode 100644 index 0000000..cc51139 --- /dev/null +++ b/distro/LICENSE @@ -0,0 +1,6 @@ +gCube System - License +------------------------------------------------------------ + +The gCube/gCore software is licensed as Free Open Source software conveying to the EUPL (http://ec.europa.eu/idabc/eupl). +The software and documentation is provided by its authors/distributors "as is" and no expressed or +implied warranty is given for its use, quality or fitness for a particular case. \ No newline at end of file diff --git a/distro/MAINTAINERS b/distro/MAINTAINERS new file mode 100644 index 0000000..0bc9be3 --- /dev/null +++ b/distro/MAINTAINERS @@ -0,0 +1 @@ +Giancarlo Panichi (giancarlo.panichi@isti.cnr.it), CNR Pisa, Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" diff --git a/distro/README b/distro/README new file mode 100644 index 0000000..9d76855 --- /dev/null +++ b/distro/README @@ -0,0 +1,48 @@ +The gCube System - tabular-data-rule-widget +------------------------------------------------------------ + +This work has been supported by the following European projects: iMarine (FP7-INFRASTRUCTURES-2011-2) + +Authors +------- + +Giancarlo Panichi (giancarlo.panichi@isti.cnr.it), CNR Pisa, +Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" + + +Version and Release Date +------------------------ + +v. 1.0.0-SNAPSHOT (2015-04-30) + + +Description +----------- + +tabular-data-rule-widget allows to manage rules + + +Download information +-------------------- +Source code is available from SVN: + https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/tabular-data-rule-widget + +Binaries can be downloaded from: + http://software.d4science.research-infrastructures.eu/ + + +Documentation +------------- + +tabular-data-rule-widget allows to manage rules + +Documentation is available on-line from the Projects Documentation Wiki: + https://gcube.wiki.gcube-system.org/gcube/index.php/Tabular_Data_Manager + + +Licensing +--------- + +This software is licensed under the terms you may find in the file named "LICENSE" in this directory. + + diff --git a/distro/changelog.xml b/distro/changelog.xml new file mode 100644 index 0000000..f36766d --- /dev/null +++ b/distro/changelog.xml @@ -0,0 +1,6 @@ + + + First Release + + \ No newline at end of file diff --git a/distro/svnpath.txt b/distro/svnpath.txt new file mode 100644 index 0000000..28c302e --- /dev/null +++ b/distro/svnpath.txt @@ -0,0 +1 @@ +https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/tabular-data-rule-widget \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2fb9608 --- /dev/null +++ b/pom.xml @@ -0,0 +1,360 @@ + + + + + maven-parent + org.gcube.tools + 1.0.0 + + + + + 4.0.0 + org.gcube.portlets.user + tabular-data-rule-widget + 1.0.0-SNAPSHOT + + + tabular-data-rule-widget + tabular-data-rule-widget allows to manage rules + + + https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/tabular-data-rule-widget + + + + + Giancarlo Panichi + g.panichi@isti.cnr.it + CNR Pisa, Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" + + architect + developer + + + + + + ${project.basedir}/distro + ${project.build.directory}/${project.build.finalName} + 2015-04-30 + https://gcube.wiki.gcube-system.org/gcube/index.php/Tabular_Data_Manager + templates + distro + config + + + 2.6.1 + 3.3.2 + 3.1.1 + + ${env.KEYS} + + + UTF-8 + UTF-8 + + + + + + + localRun + + + org.slf4j + slf4j-api + compile + + + ch.qos.logback + logback-classic + 1.0.1 + runtime + + + org.gcube.common + home-library + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + + org.gcube.data.analysis.tabulardata + service-client-impl + [2.0.0-SNAPSHOT,3.0.0-SNAPSHOT) + + + org.gcube.core + common-scope-maps + [1.0.2-SNAPSHOT,2.0.0-SNAPSHOT) + compile + + + org.gcube.applicationsupportlayer + aslsocial + + + org.gcube.portal + custom-portal-handler + + + org.gcube.applicationsupportlayer + aslcore + + + org.gcube.applicationsupportlayer + accesslogger + + + + + + + + + com.google.gwt + gwt-servlet + ${gwtVersion} + + + com.google.gwt + gwt-user + ${gwtVersion} + + + + com.sencha.gxt + gxt + ${gxtVersion} + + + + + org.gcube.portlets.user + tabular-data-widget-common-event + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + provided + + + + + org.gcube.portlets.user + tabular-data-gwt-service + [2.0.0-SNAPSHOT,3.0.0-SNAPSHOT) + provided + + + + + org.gcube.portlets.user + tabular-data-expression-widget + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + + + + + org.gcube.portlets.user + tabular-data-monitor-widget + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + provided + + + + + org.gcube.portlets.user + tabular-data-wizard-widget + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + provided + + + + + + org.gcube.portlets.user + tabular-data-share-widget + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + provided + + + + + + com.allen-sauer.gwt.log + gwt-log + ${gwtLogVersion} + provided + + + + org.slf4j + slf4j-api + + + + + junit + junit + 4.8.1 + test + + + + + + + + ${webappDirectory}/WEB-INF/classes + + + src/main/resources + + **/*.* + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.16 + + true + + + + + org.apache.maven.surefire + surefire-junit47 + 2.16 + + + + + + + org.codehaus.mojo + gwt-maven-plugin + ${gwtVersion} + + + + resources + + + + + RuleWidget.html + ${webappDirectory} + org.gcube.portlets.user.td.rulewidget.RuleWidget + + + + + + maven-resources-plugin + 2.6 + + + copy-profile + process-resources + + copy-resources + + + ${configDirectory} + + + ${templatesDirectory} + + profile.xml + + true + + + + + + copy-distro-resources + process-resources + + copy-resources + + + ${distroDirectory} + + + ${templatesDirectory} + + profile.xml + descriptor.xml + + true + + + + + + + + maven-clean-plugin + 2.5 + + + + ${distroDirectory} + + ** + + false + + + ${configDirectory} + + ** + + false + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.2 + + + ${templatesDirectory}/descriptor.xml + + + + + servicearchive + package + + single + + + + + + + + + + + + + org.gcube.distribution + maven-portal-bom + LATEST + pom + import + + + + diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/RuleWidget.gwt.xml b/src/main/java/org/gcube/portlets/user/td/rulewidget/RuleWidget.gwt.xml new file mode 100644 index 0000000..4a8c7d8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/RuleWidget.gwt.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleActiveDialog.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleActiveDialog.java new file mode 100644 index 0000000..d308e8c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleActiveDialog.java @@ -0,0 +1,63 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; + +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.widget.core.client.Window; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class RuleActiveDialog extends Window { + private static final String WIDTH = "720px"; + private static final String HEIGHT = "428px"; + public RuleActiveDialog(TRId trId, EventBus eventBus) { + initWindow(); + + RuleActivePanel ruleActivePanel = new RuleActivePanel(this, + trId, eventBus); + add(ruleActivePanel); + } + + protected void initWindow() { + setWidth(WIDTH); + setHeight(HEIGHT); + setBodyBorder(false); + setResizable(false); + setHeadingText("Active Rules On TabularResource"); + setClosable(true); + setModal(true); + forceLayoutOnResize = true; + getHeader().setIcon(ResourceBundle.INSTANCE.ruleTabularResource()); + + } + + /** + * {@inheritDoc} + */ + @Override + protected void initTools() { + super.initTools(); + + closeBtn.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + close(); + } + }); + + } + + protected void close() { + hide(); + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleActivePanel.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleActivePanel.java new file mode 100644 index 0000000..03c3c5f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleActivePanel.java @@ -0,0 +1,481 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.td.expressionwidget.client.rpc.ExpressionServiceAsync; +import org.gcube.portlets.user.td.expressionwidget.shared.rule.RuleDescriptionDataProperties; +import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTIsFinalException; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTIsLockedException; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException; +import org.gcube.portlets.user.td.gwtservice.shared.rule.AppliedRulesResponseData; +import org.gcube.portlets.user.td.gwtservice.shared.rule.DetachColumnRulesSession; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.widgetcommonevent.client.event.SessionExpiredEvent; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType; +import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; +import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.column.ColumnData; +import org.gcube.portlets.user.td.wizardwidget.client.util.UtilsGXT3; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.logical.shared.SelectionEvent; +import com.google.gwt.event.logical.shared.SelectionHandler; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.data.shared.ListStore; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer.HBoxLayoutAlign; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; +import com.sencha.gxt.widget.core.client.form.FieldLabel; +import com.sencha.gxt.widget.core.client.form.FieldSet; +import com.sencha.gxt.widget.core.client.grid.ColumnConfig; +import com.sencha.gxt.widget.core.client.grid.ColumnModel; +import com.sencha.gxt.widget.core.client.grid.Grid; +import com.sencha.gxt.widget.core.client.grid.filters.GridFilters; +import com.sencha.gxt.widget.core.client.grid.filters.StringFilter; +import com.sencha.gxt.widget.core.client.menu.Item; +import com.sencha.gxt.widget.core.client.menu.Menu; +import com.sencha.gxt.widget.core.client.menu.MenuItem; + +/** + * + * @author giancarlo email: g.panichi@isti.cnr.it + * + */ +public class RuleActivePanel extends FramedPanel { + private static final int RULE_ON_COLUMN_FIELDSET_HEIGHT = 348; + private static final String RULES_GRID_HEIGHT = "102px"; + private static final String WIDTH = "630px"; + private static final String HEIGHT = "418px"; + + interface RuleApplyTemplates extends XTemplates { + @XTemplate("{value}") + SafeHtml format(String value); + } + + private EventBus eventBus; + private RuleActiveDialog parent; + private TRId trId; + private ArrayList columns; + + private AppliedRulesResponseData appliedRuleResponseData; + + private TextButton btnClose; + private VerticalLayoutContainer mainLayoutContainer; + + public RuleActivePanel(RuleActiveDialog parent, TRId trId, + EventBus eventBus) { + this.parent = parent; + this.trId = trId; + + Log.debug("RuleActivePanel"); + setWidth(WIDTH); + setHeight(HEIGHT); + setHeaderVisible(false); + setBodyBorder(false); + this.eventBus = eventBus; + retrieveColumns(); + + } + + protected void retrieveColumns() { + TDGWTServiceAsync.INSTANCE.getColumns(trId, + new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + if (caught instanceof TDGWTIsLockedException) { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert("Error Locked", + caught.getLocalizedMessage()); + } else { + if (caught instanceof TDGWTIsFinalException) { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert("Error Final", + caught.getLocalizedMessage()); + } else { + Log.debug("Error retrieving columns: " + + caught.getLocalizedMessage()); + UtilsGXT3 + .alert("Error retrieving columns", + "Error retrieving column on server!"); + } + } + } + + } + + @Override + public void onSuccess(ArrayList result) { + Log.debug("Retrieved Columns"); + if (result == null) { + UtilsGXT3.alert("Error", + "The requested columns is null"); + } + columns = result; + + getActiveRulesOnColumn(); + + } + }); + } + + protected void create() { + + Log.debug("Create RuleActivePanel(): " + trId); + + // SimpleContainer rulesOnColumnContainer=new SimpleContainer(); + FieldSet columnRulesFieldSet = new FieldSet(); + columnRulesFieldSet.setHeadingText("Rules On Column"); + columnRulesFieldSet.setCollapsible(false); + + VerticalLayoutContainer columnRulesFieldSetLayout = new VerticalLayoutContainer(); + columnRulesFieldSetLayout.setScrollMode(ScrollMode.AUTO); + columnRulesFieldSetLayout.setAdjustForScroll(true); + + columnRulesFieldSet.add(columnRulesFieldSetLayout); + + HashMap> columnRuleMapping = appliedRuleResponseData + .getColumnRuleMapping(); + if (columnRuleMapping != null && columnRuleMapping.size() > 0) { + + for (ColumnData column : columns) { + ArrayList columnAppliedRules = columnRuleMapping + .get(column.getColumnId()); + if (columnAppliedRules != null && columnAppliedRules.size() > 0) { + FieldLabel columnLabel = createColumnRules(column, + columnAppliedRules); + columnRulesFieldSetLayout.add(columnLabel, + new VerticalLayoutData(1, -1, new Margins(0))); + } + } + } else { + FieldLabel noRulesLabel = new FieldLabel(null, "No rules applied!"); + noRulesLabel.setLabelSeparator(""); + columnRulesFieldSetLayout.add(noRulesLabel, new VerticalLayoutData( + 1, -1, new Margins(0))); + + } + + btnClose = new TextButton("Close"); + btnClose.setIcon(ResourceBundle.INSTANCE.close()); + btnClose.setIconAlign(IconAlign.RIGHT); + btnClose.setToolTip("Close"); + btnClose.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + Log.debug("Pressed Close"); + close(); + } + }); + + HBoxLayoutContainer flowButton = new HBoxLayoutContainer(); + flowButton.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE); + flowButton.setPack(BoxLayoutPack.CENTER); + flowButton.add(btnClose, new BoxLayoutData(new Margins(2, 4, 2, 4))); + + mainLayoutContainer = new VerticalLayoutContainer(); + mainLayoutContainer.add(columnRulesFieldSet, new VerticalLayoutData(-1, + RULE_ON_COLUMN_FIELDSET_HEIGHT, new Margins(0))); + mainLayoutContainer.add(flowButton, + new VerticalLayoutData(1, 36, new Margins(5, 2, 5, 2))); + add(mainLayoutContainer); + + } + + private FieldLabel createColumnRules(ColumnData column, + ArrayList columnAppliedRules) { + // Rules + + RuleDescriptionDataProperties propsRules = GWT + .create(RuleDescriptionDataProperties.class); + + ColumnConfig nameCol = new ColumnConfig( + propsRules.name(), 120, "Name"); + + nameCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleApplyTemplates ruleApplyTemplates = GWT + .create(RuleApplyTemplates.class); + sb.append(ruleApplyTemplates.format(value)); + } + }); + + ColumnConfig descriptionCol = new ColumnConfig( + propsRules.description(), 120, "Description"); + descriptionCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleApplyTemplates ruleApplyTemplates = GWT + .create(RuleApplyTemplates.class); + sb.append(ruleApplyTemplates.format(value)); + } + }); + + ColumnConfig ownerCol = new ColumnConfig( + propsRules.ownerLogin(), 70, "Owner"); + ownerCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleApplyTemplates ruleApplyTemplates = GWT + .create(RuleApplyTemplates.class); + sb.append(ruleApplyTemplates.format(value)); + } + }); + + /* + ColumnConfig readableExpressionCol = new ColumnConfig( + propsRules.readableExpression(), 160, "Expression"); + + + readableExpressionCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleApplyTemplates ruleApplyTemplates = GWT + .create(RuleApplyTemplates.class); + sb.append(ruleApplyTemplates.format(value)); + } + });*/ + + List> l = new ArrayList>(); + l.add(nameCol); + l.add(descriptionCol); + l.add(ownerCol); + //l.add(readableExpressionCol); + + ColumnModel cm = new ColumnModel( + l); + + StringFilter nameFilter = new StringFilter( + propsRules.name()); + StringFilter descriptionFilter = new StringFilter( + propsRules.description()); + + // Applies Rules + ListStore appliedRulesStore = new ListStore( + propsRules.id()); + + if (columnAppliedRules != null && columnAppliedRules.size() > 0) { + appliedRulesStore.addAll(columnAppliedRules); + } + + final Grid gridAppliedRules = new Grid( + appliedRulesStore, cm); + gridAppliedRules.setItemId(column.getColumnId()); + gridAppliedRules.setHeight(RULES_GRID_HEIGHT); + gridAppliedRules.getView().setStripeRows(true); + gridAppliedRules.getView().setColumnLines(true); + gridAppliedRules.getView().setAutoFill(true); + gridAppliedRules.setBorders(false); + gridAppliedRules.setLoadMask(true); + gridAppliedRules.setColumnReordering(true); + gridAppliedRules.setColumnResize(true); + gridAppliedRules.getView().setAutoExpandColumn(descriptionCol); + + GridFilters filtersAppliesRules = new GridFilters(); + filtersAppliesRules.initPlugin(gridAppliedRules); + filtersAppliesRules.setLocal(true); + filtersAppliesRules.addFilter(nameFilter); + filtersAppliesRules.addFilter(descriptionFilter); + + createContextMenu(gridAppliedRules); + + FieldLabel rulesAppliedLabel = new FieldLabel(gridAppliedRules, + column.getLabel()); + + return rulesAppliedLabel; + } + + protected void getActiveRulesOnColumn() { + + ExpressionServiceAsync.INSTANCE.getActiveRulesByTabularResourceId( + trId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert("Error retrieving active rules", + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(AppliedRulesResponseData result) { + Log.trace("AppliedRuleResponseData: " + result); + appliedRuleResponseData = result; + create(); + } + }); + + } + + + protected void updateActiveRulesOnColumn() { + + ExpressionServiceAsync.INSTANCE.getActiveRulesByTabularResourceId( + trId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert("Error retrieving applied rules", + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(AppliedRulesResponseData result) { + Log.trace("AppliedRuleResponseData: " + result); + appliedRuleResponseData = result; + recreate(); + } + }); + + } + + + protected void close() { + parent.close(); + } + + + + + protected void requestInfo(RuleDescriptionData rule) { + final RuleInfoDialog infoRuleDialog = new RuleInfoDialog(rule); + infoRuleDialog.show(); + + + } + + protected void createContextMenu(final Grid grid) { + Menu contextMenu = new Menu(); + + MenuItem infoItem = new MenuItem(); + infoItem.setText("Info"); + infoItem.setToolTip("Info"); + infoItem.setIcon(ResourceBundle.INSTANCE.information()); + infoItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + RuleDescriptionData selected = grid.getSelectionModel() + .getSelectedItem(); + Log.debug(selected.toString()); + requestInfo(selected); + } + }); + + MenuItem detachItem = new MenuItem(); + detachItem.setText("Detach"); + detachItem.setToolTip("Detach rule"); + detachItem.setIcon(ResourceBundle.INSTANCE.ruleColumnDetach()); + detachItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + RuleDescriptionData selected = grid.getSelectionModel() + .getSelectedItem(); + Log.debug(selected.toString()); + requestDetach(selected, grid); + } + + + }); + + + contextMenu.add(infoItem); + contextMenu.add(detachItem); + + grid.setContextMenu(contextMenu); + + } + + protected void requestDetach(RuleDescriptionData selected, + final Grid grid) { + + String columnLocalId=grid.getItemId(); + ColumnData columnData=new ColumnData(); + columnData.setColumnId(columnLocalId); + ArrayList detachRules=new ArrayList(); + detachRules.add(selected); + + DetachColumnRulesSession detachColumnRulesSession=new DetachColumnRulesSession(trId, columnData, detachRules); + + ExpressionServiceAsync.INSTANCE.setDetachColumnRules(detachColumnRulesSession, + new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert("Error in detach rules", + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(Void result) { + updateActiveRulesOnColumn(); + Log.debug("The rule is detached!"); + UtilsGXT3.info("Detach Rule", + "The rule is detached!"); + + } + }); + + } + + + protected void recreate(){ + remove(mainLayoutContainer); + create(); + forceLayout(); + + + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleApplyDialog.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleApplyDialog.java new file mode 100644 index 0000000..57cf27c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleApplyDialog.java @@ -0,0 +1,172 @@ +package org.gcube.portlets.user.td.rulewidget.client; + + +import org.gcube.portlets.user.td.expressionwidget.client.rpc.ExpressionServiceAsync; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTIsFinalException; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTIsLockedException; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException; +import org.gcube.portlets.user.td.gwtservice.shared.rule.ApplyAndDetachColumnRulesSession; +import org.gcube.portlets.user.td.monitorwidget.client.MonitorDialog; +import org.gcube.portlets.user.td.monitorwidget.client.MonitorDialogListener; +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.widgetcommonevent.client.event.ChangeTableRequestEvent; +import org.gcube.portlets.user.td.widgetcommonevent.client.event.SessionExpiredEvent; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.ChangeTableRequestType; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.ChangeTableWhy; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType; +import org.gcube.portlets.user.td.widgetcommonevent.shared.OperationResult; +import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; +import org.gcube.portlets.user.td.wizardwidget.client.util.UtilsGXT3; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.widget.core.client.Window; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class RuleApplyDialog extends Window implements + MonitorDialogListener { + private static final String WIDTH = "720px"; + private static final String HEIGHT = "530px"; + private EventBus eventBus; + + public RuleApplyDialog(TRId trId, EventBus eventBus) { + this.eventBus = eventBus; + initWindow(); + + RuleApplyPanel ruleApplyPanel = new RuleApplyPanel(this, + trId, eventBus); + add(ruleApplyPanel); + } + + protected void initWindow() { + setWidth(WIDTH); + setHeight(HEIGHT); + setBodyBorder(false); + setResizable(false); + setHeadingText("Apply Rules On Column"); + setClosable(true); + setModal(true); + forceLayoutOnResize = true; + getHeader().setIcon(ResourceBundle.INSTANCE.ruleColumnApply()); + + } + + /** + * {@inheritDoc} + */ + @Override + protected void initTools() { + super.initTools(); + + closeBtn.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + close(); + } + }); + + } + + protected void close() { + hide(); + } + + protected void applyRules(ApplyAndDetachColumnRulesSession applyColumnRulesSession) { + ExpressionServiceAsync.INSTANCE.startApplyAndDetachColumnRules(applyColumnRulesSession, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + if (caught instanceof TDGWTIsLockedException) { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert("Error Locked", + caught.getLocalizedMessage()); + } else { + if (caught instanceof TDGWTIsFinalException) { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert("Error Is Final", + caught.getLocalizedMessage()); + } else { + Log.debug("Apply Rules On Column Error: " + + caught.getLocalizedMessage()); + UtilsGXT3 + .alert("Apply Rules On Column", + caught.getLocalizedMessage()); + } + } + } + + } + + @Override + public void onSuccess(String taskId) { + if(taskId!=null){ + openMonitorDialog(taskId); + } else { + close(); + } + + } + + + + }); + + } + + protected void openMonitorDialog(String taskId) { + MonitorDialog monitorDialog = new MonitorDialog(taskId, eventBus); + monitorDialog.addProgressDialogListener(this); + monitorDialog.show(); + } + + @Override + public void operationComplete(OperationResult operationResult) { + ChangeTableWhy why = ChangeTableWhy.TABLEUPDATED; + ChangeTableRequestEvent changeTableRequestEvent = new ChangeTableRequestEvent( + ChangeTableRequestType.RULESONCOLUMNAPPLY, operationResult.getTrId(), why); + eventBus.fireEvent(changeTableRequestEvent); + close(); + } + + @Override + public void operationFailed(Throwable caught, String reason, String details) { + UtilsGXT3.alert(reason, details); + close(); + + } + + @Override + public void operationStopped(OperationResult operationResult, String reason, String details) { + ChangeTableWhy why = ChangeTableWhy.TABLECURATION; + ChangeTableRequestEvent changeTableRequestEvent = new ChangeTableRequestEvent( + ChangeTableRequestType.RULESONCOLUMNAPPLY, operationResult.getTrId(), why); + eventBus.fireEvent(changeTableRequestEvent); + close(); + + } + + @Override + public void operationAborted() { + close(); + + } + + @Override + public void operationPutInBackground() { + close(); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleApplyPanel.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleApplyPanel.java new file mode 100644 index 0000000..8397a41 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleApplyPanel.java @@ -0,0 +1,602 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.user.td.expressionwidget.client.properties.ColumnDataPropertiesCombo; +import org.gcube.portlets.user.td.expressionwidget.client.rpc.ExpressionServiceAsync; +import org.gcube.portlets.user.td.expressionwidget.shared.rule.RuleDescriptionDataProperties; +import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTIsFinalException; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTIsLockedException; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException; +import org.gcube.portlets.user.td.gwtservice.shared.rule.AppliedRulesResponseData; +import org.gcube.portlets.user.td.gwtservice.shared.rule.ApplyAndDetachColumnRulesSession; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.widgetcommonevent.client.event.SessionExpiredEvent; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType; +import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; +import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.column.ColumnData; +import org.gcube.portlets.user.td.wizardwidget.client.util.UtilsGXT3; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.logical.shared.SelectionEvent; +import com.google.gwt.event.logical.shared.SelectionHandler; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.HTML; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; +import com.sencha.gxt.cell.core.client.form.ComboBoxCell.TriggerAction; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.data.shared.LabelProvider; +import com.sencha.gxt.data.shared.ListStore; +import com.sencha.gxt.dnd.core.client.GridDragSource; +import com.sencha.gxt.dnd.core.client.GridDropTarget; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer.HBoxLayoutAlign; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; +import com.sencha.gxt.widget.core.client.form.ComboBox; +import com.sencha.gxt.widget.core.client.form.FieldLabel; +import com.sencha.gxt.widget.core.client.form.FieldSet; +import com.sencha.gxt.widget.core.client.grid.ColumnConfig; +import com.sencha.gxt.widget.core.client.grid.ColumnModel; +import com.sencha.gxt.widget.core.client.grid.Grid; +import com.sencha.gxt.widget.core.client.grid.filters.GridFilters; +import com.sencha.gxt.widget.core.client.grid.filters.StringFilter; +import com.sencha.gxt.widget.core.client.info.Info; +import com.sencha.gxt.widget.core.client.menu.Item; +import com.sencha.gxt.widget.core.client.menu.Menu; +import com.sencha.gxt.widget.core.client.menu.MenuItem; + +/** + * + * @author giancarlo email: g.panichi@isti.cnr.it + * + */ +public class RuleApplyPanel extends FramedPanel { + private static final String RULE_TIP = "

Tip.: Use drag and drop in order to change selected rules.

"; + private static final String RULES_GRID_HEIGHT = "184px"; + private static final String SET_RULES = "SetRules"; + + interface RuleApplyTemplates extends XTemplates { + @XTemplate("{value}") + SafeHtml format(String value); + } + + private static final String WIDTH = "630px"; + private static final String HEIGHT = "520px"; + + private EventBus eventBus; + private RuleApplyDialog parent; + private TRId trId; + private ArrayList columns; + private ColumnData column; + private AppliedRulesResponseData appliedRuleResponseData; + private ArrayList applicableRules; + private ArrayList appliedRules; + + private TextButton btnApply; + private TextButton btnClose; + + private ComboBox comboColumns; + private ListStore applicableRulesStore; + private Grid gridApplicableRules; + private ListStore selectedRulesStore; + private Grid gridSelectedRules; + + public RuleApplyPanel(RuleApplyDialog parent, TRId trId, EventBus eventBus) { + this.parent = parent; + this.trId = trId; + applicableRules = new ArrayList(); + + Log.debug("RuleApplyPanel"); + setWidth(WIDTH); + setHeight(HEIGHT); + setHeaderVisible(false); + setBodyBorder(false); + this.eventBus = eventBus; + retrieveColumns(); + + } + + protected void retrieveColumns() { + TDGWTServiceAsync.INSTANCE.getColumns(trId, + new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + if (caught instanceof TDGWTIsLockedException) { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert("Error Locked", + caught.getLocalizedMessage()); + } else { + if (caught instanceof TDGWTIsFinalException) { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert("Error Final", + caught.getLocalizedMessage()); + } else { + Log.debug("Error retrieving columns: " + + caught.getLocalizedMessage()); + UtilsGXT3 + .alert("Error retrieving columns", + "Error retrieving column on server!"); + } + } + } + + } + + @Override + public void onSuccess(ArrayList result) { + Log.debug("Retrieved Columns"); + if (result == null) { + UtilsGXT3.alert("Error", + "The requested columns is null"); + } + columns = result; + + getAppliedBaseColumnRules(); + + } + }); + } + + protected void create() { + + Log.debug("Create RuleApplyPanel(): " + trId); + + FieldSet configurationFieldSet = new FieldSet(); + configurationFieldSet.setHeadingText("Configuration"); + configurationFieldSet.setCollapsible(false); + + VerticalLayoutContainer configurationFieldSetLayout = new VerticalLayoutContainer(); + configurationFieldSet.add(configurationFieldSetLayout); + + // Column Data + ColumnDataPropertiesCombo propsColumnData = GWT + .create(ColumnDataPropertiesCombo.class); + ListStore storeCombo = new ListStore( + propsColumnData.id()); + storeCombo.addAll(columns); + + Log.trace("StoreCombo created"); + comboColumns = new ComboBox(storeCombo, + propsColumnData.label()); + + Log.trace("Combo ColumnData created"); + + addHandlersForComboColumn(propsColumnData.label()); + comboColumns.setEmptyText("Select a column..."); + comboColumns.setWidth(191); + comboColumns.setTypeAhead(false); + comboColumns.setEditable(false); + comboColumns.setTriggerAction(TriggerAction.ALL); + + FieldLabel comboColumnsLabel = new FieldLabel(comboColumns, "Column"); + configurationFieldSetLayout.add(comboColumnsLabel, + new VerticalLayoutData(1, -1, new Margins(0))); + + // Rules + + RuleDescriptionDataProperties propsRules = GWT + .create(RuleDescriptionDataProperties.class); + + ColumnConfig nameCol = new ColumnConfig( + propsRules.name(), 120, "Name"); + + nameCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleApplyTemplates ruleApplyTemplates = GWT + .create(RuleApplyTemplates.class); + sb.append(ruleApplyTemplates.format(value)); + } + }); + + ColumnConfig descriptionCol = new ColumnConfig( + propsRules.description(), 120, "Description"); + descriptionCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleApplyTemplates ruleApplyTemplates = GWT + .create(RuleApplyTemplates.class); + sb.append(ruleApplyTemplates.format(value)); + } + }); + + ColumnConfig ownerCol = new ColumnConfig( + propsRules.ownerLogin(), 70, "Owner"); + ownerCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleApplyTemplates ruleApplyTemplates = GWT + .create(RuleApplyTemplates.class); + sb.append(ruleApplyTemplates.format(value)); + } + }); + + List> l = new ArrayList>(); + l.add(nameCol); + l.add(descriptionCol); + l.add(ownerCol); + // l.add(readableExpressionCol); + + ColumnModel cm = new ColumnModel( + l); + + StringFilter nameFilter = new StringFilter( + propsRules.name()); + StringFilter descriptionFilter = new StringFilter( + propsRules.description()); + + // Applicable Rules + applicableRulesStore = new ListStore( + propsRules.id()); + + gridApplicableRules = new Grid( + applicableRulesStore, cm); + gridApplicableRules.setHeight(RULES_GRID_HEIGHT); + gridApplicableRules.getView().setStripeRows(true); + gridApplicableRules.getView().setColumnLines(true); + gridApplicableRules.getView().setAutoFill(true); + gridApplicableRules.setBorders(false); + gridApplicableRules.setLoadMask(true); + gridApplicableRules.setColumnReordering(true); + gridApplicableRules.setColumnResize(true); + gridApplicableRules.getView().setAutoExpandColumn(descriptionCol); + + GridFilters filtersApplicableRules = new GridFilters(); + filtersApplicableRules.initPlugin(gridApplicableRules); + filtersApplicableRules.setLocal(true); + filtersApplicableRules.addFilter(nameFilter); + filtersApplicableRules.addFilter(descriptionFilter); + + createContextMenu(gridApplicableRules); + + // Selected Rules + selectedRulesStore = new ListStore(propsRules.id()); + + gridSelectedRules = new Grid(selectedRulesStore, + cm); + gridSelectedRules.setHeight(RULES_GRID_HEIGHT); + gridSelectedRules.getView().setStripeRows(true); + gridSelectedRules.getView().setColumnLines(true); + gridSelectedRules.getView().setAutoFill(true); + gridSelectedRules.setBorders(false); + gridSelectedRules.setLoadMask(true); + gridSelectedRules.setColumnReordering(true); + gridSelectedRules.setColumnResize(true); + gridSelectedRules.getView().setAutoExpandColumn(descriptionCol); + + GridFilters filtersSelectedRules = new GridFilters(); + filtersSelectedRules.initPlugin(gridSelectedRules); + filtersSelectedRules.setLocal(true); + filtersSelectedRules.addFilter(nameFilter); + filtersSelectedRules.addFilter(descriptionFilter); + + createContextMenu(gridSelectedRules); + + // + + new GridDragSource(gridApplicableRules) + .setGroup(SET_RULES); + new GridDragSource(gridSelectedRules) + .setGroup(SET_RULES); + + new GridDropTarget(gridApplicableRules) + .setGroup(SET_RULES); + new GridDropTarget(gridSelectedRules) + .setGroup(SET_RULES); + + // + FieldLabel rulesApplicableLabel = new FieldLabel(gridApplicableRules, + "Applicable Rules"); + + configurationFieldSetLayout.add(rulesApplicableLabel, + new VerticalLayoutData(1, -1, new Margins(0))); + + FieldLabel rulesSelectedLabel = new FieldLabel(gridSelectedRules, + "Selected Rules"); + + configurationFieldSetLayout.add(rulesSelectedLabel, + new VerticalLayoutData(1, -1, new Margins(0))); + + // + HTML rulesNote = new HTML(RULE_TIP); + configurationFieldSetLayout.add(rulesNote, + new VerticalLayoutData(-1, -1, new Margins(0))); + // Button + btnApply = new TextButton("Apply"); + btnApply.setIcon(ResourceBundle.INSTANCE.ruleColumnApply()); + btnApply.setIconAlign(IconAlign.RIGHT); + btnApply.setToolTip("Apply Rule"); + btnApply.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + Log.debug("Pressed Apply"); + apply(); + + } + }); + + btnClose = new TextButton("Close"); + btnClose.setIcon(ResourceBundle.INSTANCE.close()); + btnClose.setIconAlign(IconAlign.RIGHT); + btnClose.setToolTip("Close"); + btnClose.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + Log.debug("Pressed Close"); + close(); + } + }); + + HBoxLayoutContainer flowButton = new HBoxLayoutContainer(); + flowButton.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE); + flowButton.setPack(BoxLayoutPack.CENTER); + + flowButton.add(btnApply, new BoxLayoutData(new Margins(2, 4, 2, 4))); + flowButton.add(btnClose, new BoxLayoutData(new Margins(2, 4, 2, 4))); + + VerticalLayoutContainer v = new VerticalLayoutContainer(); + v.add(configurationFieldSet, new VerticalLayoutData(-1, -1, + new Margins(0))); + v.add(flowButton, + new VerticalLayoutData(1, 36, new Margins(5, 2, 5, 2))); + add(v); + + } + + private void addHandlersForComboColumn( + final LabelProvider labelProvider) { + comboColumns.addSelectionHandler(new SelectionHandler() { + public void onSelection(SelectionEvent event) { + Info.display( + "Column Selected", + "You selected " + + (event.getSelectedItem() == null ? "nothing" + : labelProvider.getLabel(event + .getSelectedItem()) + "!")); + Log.debug("ComboColumn selected: " + event.getSelectedItem()); + ColumnData columnData = event.getSelectedItem(); + updateRulesInGrids(columnData); + } + + }); + + } + + protected void updateRulesInGrids(ColumnData columnData) { + column = columnData; + applicableRulesStore.clear(); + selectedRulesStore.clear(); + HashMap> columnRuleMapping = appliedRuleResponseData + .getColumnRuleMapping(); + + if (columnRuleMapping != null) { + ArrayList applied = columnRuleMapping + .get(columnData.getColumnId()); + + if (applied != null) { + appliedRules = applied; + selectedRulesStore.addAll(new ArrayList( + applied)); + + } + } + getApplicableBaseColumnRules(); + + } + + protected void getApplicableBaseColumnRules() { + ExpressionServiceAsync.INSTANCE.getApplicableBaseColumnRules(column, + new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert( + "Error retrieving applicable rules", + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(ArrayList result) { + Log.trace("loaded " + result.size() + " Rules"); + if (appliedRules != null && appliedRules.size() > 0) { + ArrayList removableRules = new ArrayList(); + for (RuleDescriptionData ruleApplied : appliedRules) { + for (RuleDescriptionData ruleApplicable : result) { + if (ruleApplicable.equals(ruleApplied)) { + removableRules.add(ruleApplicable); + break; + } + } + + } + result.removeAll(removableRules); + + } + applicableRules = result; + applicableRulesStore + .addAll(new ArrayList( + applicableRules)); + + forceLayout(); + + } + }); + + } + + protected void getAppliedBaseColumnRules() { + + ExpressionServiceAsync.INSTANCE.getActiveRulesByTabularResourceId(trId, + new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + Log.error(caught.getLocalizedMessage()); + UtilsGXT3.alert("Error retrieving selected rules", + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(AppliedRulesResponseData result) { + Log.trace("AppliedRuleResponseData: " + result); + appliedRuleResponseData = result; + create(); + } + }); + + } + + protected ArrayList getSelectedItems() { + List selectedItems = selectedRulesStore.getAll(); + ArrayList rulesSelected = new ArrayList( + selectedItems); + return rulesSelected; + } + + protected void apply() { + ColumnData column = comboColumns.getCurrentValue(); + if (column != null) { + ArrayList selectedRules = getSelectedItems(); + if(selectedRules==null){ + selectedRules=new ArrayList(); + } + ArrayList rulesThatWillBeDetach = new ArrayList(); + ArrayList rulesThatWillBeApplied = new ArrayList(); + HashMap> columnRuleMapping = appliedRuleResponseData + .getColumnRuleMapping(); + if (columnRuleMapping != null) { + ArrayList rulesApplied = columnRuleMapping + .get(column.getColumnId()); + if (rulesApplied != null && rulesApplied.size() > 0) { + for (RuleDescriptionData ruleApplied : rulesApplied) { + boolean ruleStillApplied = false; + for (RuleDescriptionData ruleSelected : selectedRules) { + if (ruleSelected.getId() == ruleApplied.getId()) { + ruleStillApplied = true; + break; + } + } + + if (!ruleStillApplied) { + rulesThatWillBeDetach.add(ruleApplied); + } + } + } + } + + for (RuleDescriptionData ruleSelected : selectedRules) { + boolean ruleApplied = false; + + if (columnRuleMapping != null) { + ArrayList rulesApplied = columnRuleMapping + .get(column.getColumnId()); + if (rulesApplied != null) { + for (RuleDescriptionData ruleAlreadyApplied : rulesApplied) { + if (ruleSelected.getId() == ruleAlreadyApplied + .getId()) { + ruleApplied = true; + break; + } + } + } else { + + } + } else { + + } + + if (ruleApplied == false) { + rulesThatWillBeApplied.add(ruleSelected); + } + } + + if(rulesThatWillBeApplied.size()<=0&&rulesThatWillBeDetach.size()<=0){ + Log.error("Select a rule!"); + UtilsGXT3.alert("Attention", "Select a rule!"); + return; + } + + ApplyAndDetachColumnRulesSession applyColumnRulesSession = new ApplyAndDetachColumnRulesSession( + trId, column, rulesThatWillBeApplied, rulesThatWillBeDetach); + parent.applyRules(applyColumnRulesSession); + + } else { + Log.error("No column selected"); + UtilsGXT3.alert("Attention", "Select a column"); + } + } + + protected void close() { + parent.close(); + } + + protected void requestInfo(RuleDescriptionData rule) { + final RuleInfoDialog infoRuleDialog = new RuleInfoDialog(rule); + infoRuleDialog.show(); + + + } + + protected void createContextMenu(final Grid grid) { + Menu contextMenu = new Menu(); + + MenuItem infoItem = new MenuItem(); + infoItem.setText("Info"); + infoItem.setIcon(ResourceBundle.INSTANCE.information()); + infoItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + RuleDescriptionData selected = grid.getSelectionModel() + .getSelectedItem(); + Log.debug(selected.toString()); + requestInfo(selected); + } + }); + + contextMenu.add(infoItem); + + grid.setContextMenu(contextMenu); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleDeleteDialog.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleDeleteDialog.java new file mode 100644 index 0000000..153449a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleDeleteDialog.java @@ -0,0 +1,103 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import java.util.ArrayList; + +import org.gcube.portlets.user.td.expressionwidget.client.rpc.ExpressionServiceAsync; +import org.gcube.portlets.user.td.expressionwidget.client.utils.UtilsGXT3; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.widgetcommonevent.client.event.SessionExpiredEvent; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.widget.core.client.Window; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class RuleDeleteDialog extends Window { + private static final String WIDTH = "720px"; + private static final String HEIGHT = "530px"; + private EventBus eventBus; + private RuleDeletePanel ruleDeletePanel; + + public RuleDeleteDialog(EventBus eventBus) { + this.eventBus = eventBus; + initWindow(); + + ruleDeletePanel = new RuleDeletePanel(this, eventBus); + add(ruleDeletePanel); + } + + protected void initWindow() { + setWidth(WIDTH); + setHeight(HEIGHT); + setBodyBorder(false); + setResizable(false); + setHeadingText("Delete Rule"); + setClosable(true); + setModal(true); + forceLayoutOnResize = true; + getHeader().setIcon(ResourceBundle.INSTANCE.ruleDelete()); + + } + + /** + * {@inheritDoc} + */ + @Override + protected void initTools() { + super.initTools(); + + closeBtn.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + close(); + } + }); + + } + + protected void close() { + hide(); + } + + protected void removeRule(ArrayList rules) { + + ExpressionServiceAsync.INSTANCE.removeRulesById(rules, + new AsyncCallback() { + + @Override + public void onSuccess(Void v) { + Log.debug("Rule is deleted!"); + UtilsGXT3.info("Delete Rule", "The rule is deleted!"); + ruleDeletePanel.gridReload(); + } + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + Log.error("Error deleting column rule: " + + caught.getLocalizedMessage()); + caught.printStackTrace(); + UtilsGXT3.alert("Error deleting column rule", + caught.getLocalizedMessage()); + } + ruleDeletePanel.gridReload(); + + } + }); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleDeletePanel.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleDeletePanel.java new file mode 100644 index 0000000..d79e14c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleDeletePanel.java @@ -0,0 +1,430 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.td.expressionwidget.client.rpc.ExpressionServiceAsync; +import org.gcube.portlets.user.td.expressionwidget.shared.rule.RuleDescriptionDataProperties; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleScopeType; +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.widgetcommonevent.client.event.SessionExpiredEvent; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType; +import org.gcube.portlets.user.td.wizardwidget.client.util.UtilsGXT3; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.event.dom.client.KeyUpEvent; +import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.event.logical.shared.SelectionEvent; +import com.google.gwt.event.logical.shared.SelectionHandler; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; +import com.sencha.gxt.core.client.IdentityValueProvider; +import com.sencha.gxt.core.client.Style.SelectionMode; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.resources.ThemeStyles; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.data.client.loader.RpcProxy; +import com.sencha.gxt.data.shared.ListStore; +import com.sencha.gxt.data.shared.ModelKeyProvider; +import com.sencha.gxt.data.shared.Store; +import com.sencha.gxt.data.shared.Store.StoreFilter; +import com.sencha.gxt.data.shared.loader.ListLoadConfig; +import com.sencha.gxt.data.shared.loader.ListLoadResult; +import com.sencha.gxt.data.shared.loader.ListLoadResultBean; +import com.sencha.gxt.data.shared.loader.ListLoader; +import com.sencha.gxt.data.shared.loader.LoadResultListStoreBinding; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer.HBoxLayoutAlign; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; +import com.sencha.gxt.widget.core.client.form.TextField; +import com.sencha.gxt.widget.core.client.grid.CheckBoxSelectionModel; +import com.sencha.gxt.widget.core.client.grid.ColumnConfig; +import com.sencha.gxt.widget.core.client.grid.ColumnModel; +import com.sencha.gxt.widget.core.client.grid.Grid; +import com.sencha.gxt.widget.core.client.menu.Item; +import com.sencha.gxt.widget.core.client.menu.Menu; +import com.sencha.gxt.widget.core.client.menu.MenuItem; +import com.sencha.gxt.widget.core.client.toolbar.LabelToolItem; +import com.sencha.gxt.widget.core.client.toolbar.ToolBar; + +public class RuleDeletePanel extends FramedPanel { + private static final String WIDTH = "630px"; + private static final String HEIGHT = "520px"; + + interface RuleDeleteTemplates extends XTemplates { + @XTemplate("{value}") + SafeHtml format(String value); + } + + private EventBus eventBus; + private RuleDeleteDialog parent; + + private TextButton btnDelete; + private TextButton btnClose; + + private ListLoader> loader; + private Grid grid; + private ExtendedListStore store; + + public RuleDeletePanel(RuleDeleteDialog parent, EventBus eventBus) { + this.parent = parent; + Log.debug("RuleDeletePanel"); + setWidth(WIDTH); + setHeight(HEIGHT); + setHeaderVisible(false); + setBodyBorder(false); + this.eventBus = eventBus; + + create(); + + } + + protected void create() { + ToolBar toolBarHead = new ToolBar(); + toolBarHead.add(new LabelToolItem("Search: ")); + final TextField searchField = new TextField(); + toolBarHead.add(searchField); + + TextButton btnReload = new TextButton(); + // btnReload.setText("Reload"); + btnReload.setIcon(ResourceBundle.INSTANCE.refresh()); + btnReload.setToolTip("Reload"); + toolBarHead.add(btnReload); + + IdentityValueProvider identity = new IdentityValueProvider(); + CheckBoxSelectionModel sm = new CheckBoxSelectionModel( + identity); + + RuleDescriptionDataProperties props = GWT + .create(RuleDescriptionDataProperties.class); + + ColumnConfig nameCol = new ColumnConfig( + props.name(), 120, "Name"); + + nameCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleDeleteTemplates ruleDeleteTemplates = GWT + .create(RuleDeleteTemplates.class); + sb.append(ruleDeleteTemplates.format(value)); + } + }); + + ColumnConfig scopeCol = new ColumnConfig( + props.scopeLabel(), 40, "Scope"); + + nameCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleDeleteTemplates ruleDeleteTemplates = GWT + .create(RuleDeleteTemplates.class); + sb.append(ruleDeleteTemplates.format(value)); + } + }); + + ColumnConfig descriptionCol = new ColumnConfig( + props.description(), 120, "Description"); + descriptionCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleDeleteTemplates ruleDeleteTemplates = GWT + .create(RuleDeleteTemplates.class); + sb.append(ruleDeleteTemplates.format(value)); + } + }); + + ColumnConfig ownerCol = new ColumnConfig( + props.ownerLogin(), 70, "Owner"); + ownerCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleDeleteTemplates ruleDeleteTemplates = GWT + .create(RuleDeleteTemplates.class); + sb.append(ruleDeleteTemplates.format(value)); + } + }); + + /* + ColumnConfig readableExpressionCol = new ColumnConfig( + props.readableExpression(), 160, "Expression"); + + readableExpressionCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleDeleteTemplates ruleDeleteTemplates = GWT + .create(RuleDeleteTemplates.class); + sb.append(ruleDeleteTemplates.format(value)); + } + });*/ + + List> l = new ArrayList>(); + l.add(nameCol); + l.add(scopeCol); + l.add(descriptionCol); + l.add(ownerCol); + //l.add(readableExpressionCol); + + ColumnModel cm = new ColumnModel( + l); + + store = new ExtendedListStore(props.id()); + + searchField.addKeyUpHandler(new KeyUpHandler() { + + public void onKeyUp(KeyUpEvent event) { + Log.trace("searchTerm: " + searchField.getCurrentValue()); + store.applyFilters(); + } + }); + + store.addFilter(new StoreFilter() { + + @Override + public boolean select(Store store, + RuleDescriptionData parent, RuleDescriptionData item) { + String searchTerm = searchField.getCurrentValue(); + if (searchTerm == null) + return true; + return RuleDeletePanel.this.select(item, searchTerm); + } + }); + + store.setEnableFilters(true); + + RpcProxy> proxy = new RpcProxy>() { + + public void load( + ListLoadConfig loadConfig, + final AsyncCallback> callback) { + loadData(loadConfig, callback); + } + }; + loader = new ListLoader>( + proxy); + + loader.setRemoteSort(false); + loader.addLoadHandler(new LoadResultListStoreBinding>( + store) { + }); + + SelectHandler sh = new SelectHandler() { + public void onSelect(SelectEvent event) { + loader.load(); + } + }; + + btnReload.addSelectHandler(sh); + + grid = new Grid(store, cm) { + @Override + protected void onAfterFirstAttach() { + super.onAfterFirstAttach(); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + public void execute() { + loader.load(); + } + }); + } + }; + + sm.setSelectionMode(SelectionMode.MULTI); + grid.setLoader(loader); + grid.setSelectionModel(sm); + grid.setHeight("384px"); + grid.getView().setStripeRows(true); + grid.getView().setColumnLines(true); + grid.getView().setAutoFill(true); + grid.setBorders(false); + grid.setLoadMask(true); + grid.setColumnReordering(true); + grid.setColumnResize(true); + grid.getView().setAutoExpandColumn(descriptionCol); + + createContextMenu(); + + ToolBar toolBar = new ToolBar(); + toolBar.add(grid); + toolBar.addStyleName(ThemeStyles.get().style().borderTop()); + toolBar.getElement().getStyle().setProperty("borderBottom", "none"); + + btnDelete = new TextButton("Delete"); + btnDelete.setIcon(ResourceBundle.INSTANCE.ruleDelete()); + btnDelete.setIconAlign(IconAlign.RIGHT); + btnDelete.setToolTip("Delete"); + btnDelete.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + Log.debug("Pressed Delete"); + delete(); + + } + }); + + btnClose = new TextButton("Close"); + btnClose.setIcon(ResourceBundle.INSTANCE.close()); + btnClose.setIconAlign(IconAlign.RIGHT); + btnClose.setToolTip("Close"); + btnClose.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + Log.debug("Pressed Close"); + close(); + } + }); + + HBoxLayoutContainer flowButton = new HBoxLayoutContainer(); + flowButton.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE); + flowButton.setPack(BoxLayoutPack.CENTER); + + BoxLayoutData boxLayoutData = new BoxLayoutData(new Margins(2, 4, 2, 4)); + flowButton.add(btnDelete, boxLayoutData); + flowButton.add(btnClose, boxLayoutData); + + VerticalLayoutContainer v = new VerticalLayoutContainer(); + v.add(toolBarHead, new VerticalLayoutData(1, -1, new Margins(0))); + v.add(grid, new VerticalLayoutData(1, -1, new Margins(0))); + v.add(toolBar, new VerticalLayoutData(1, 25, new Margins(0))); + v.add(flowButton, + new VerticalLayoutData(1, 36, new Margins(5, 2, 5, 2))); + add(v); + + } + + protected void loadData(ListLoadConfig loadConfig, + final AsyncCallback> callback) { + + ExpressionServiceAsync.INSTANCE.getRules(RuleScopeType.COLUMN, + new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + Log.error("Load rules failure:" + + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error retrieving rules", + "Error retrieving rules"); + } + callback.onFailure(caught); + + } + + @Override + public void onSuccess(ArrayList result) { + Log.trace("loaded " + result.size() + " Rules"); + callback.onSuccess(new ListLoadResultBean( + result)); + + } + }); + } + + protected ArrayList getSelectedItem() { + ArrayList rules = new ArrayList(); + for (RuleDescriptionData rule : grid.getSelectionModel() + .getSelectedItems()) { + rules.add(rule); + } + return rules; + } + + protected void delete() { + ArrayList rules = getSelectedItem(); + if (rules == null || rules.size() == 0) { + UtilsGXT3.info("Attention", "Select the rule to be deleted"); + } else { + Log.debug("Rules Delete: " + rules); + parent.removeRule(rules); + + } + + } + + protected void close() { + parent.close(); + } + + protected class ExtendedListStore extends ListStore { + + public ExtendedListStore(ModelKeyProvider keyProvider) { + super(keyProvider); + } + + public void applyFilters() { + super.applyFilters(); + } + + } + + public void gridReload() { + grid.getLoader().load(); + } + + protected boolean select(RuleDescriptionData item, String searchTerm) { + if (item.getName() != null + && item.getName().toLowerCase() + .contains(searchTerm.toLowerCase())) + return true; + if (item.getDescription() != null + && item.getDescription().toLowerCase() + .contains(searchTerm.toLowerCase())) + return true; + return false; + } + + protected void requestInfo(RuleDescriptionData rule) { + + final RuleInfoDialog infoRuleDialog = new RuleInfoDialog(rule); + infoRuleDialog.show(); + + + } + + protected void createContextMenu() { + Menu contextMenu = new Menu(); + + MenuItem infoItem = new MenuItem(); + infoItem.setText("Info"); + infoItem.setIcon(ResourceBundle.INSTANCE.information()); + infoItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + RuleDescriptionData selected = grid.getSelectionModel() + .getSelectedItem(); + Log.debug(selected.toString()); + requestInfo(selected); + } + }); + + contextMenu.add(infoItem); + + grid.setContextMenu(contextMenu); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleInfoDialog.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleInfoDialog.java new file mode 100644 index 0000000..4e6fdd9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleInfoDialog.java @@ -0,0 +1,98 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; + +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.Dialog; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.form.FieldLabel; +import com.sencha.gxt.widget.core.client.form.FieldSet; +import com.sencha.gxt.widget.core.client.form.TextArea; +import com.sencha.gxt.widget.core.client.form.TextField; + + +/** + * + * @author giancarlo + * email: g.panichi@isti.cnr.it + * + */ +public class RuleInfoDialog extends Dialog { + RuleDescriptionData ruleDescriptionData; + + public RuleInfoDialog(RuleDescriptionData ruleDescriptionData){ + this.ruleDescriptionData=ruleDescriptionData; + initWindow(); + create(); + } + + protected void initWindow(){ + setModal(true); + setHeadingText("Info Rule"); + getHeader().setIcon( + ResourceBundle.INSTANCE.information()); + setPredefinedButtons(PredefinedButton.OK); + setHideOnButtonClick(true); + setButtonAlign(BoxLayoutPack.CENTER); + setWidth(500); + + } + + protected void create(){ + FieldSet configurationFieldSet = new FieldSet(); + configurationFieldSet.setHeadingText("Configuration"); + configurationFieldSet.setCollapsible(false); + configurationFieldSet.setBorders(true); + + VerticalLayoutContainer configurationFieldSetLayout = new VerticalLayoutContainer(); + configurationFieldSet.add(configurationFieldSetLayout, + new MarginData(0)); + + TextField ruleName = new TextField(); + ruleName.setValue(ruleDescriptionData.getName()); + ruleName.setReadOnly(true); + FieldLabel ruleNameLabel = new FieldLabel(ruleName, "Name"); + configurationFieldSetLayout.add(ruleNameLabel, new VerticalLayoutData( + 1, -1, new Margins(0))); + + TextField ruleScope = new TextField(); + ruleScope.setValue(ruleDescriptionData.getScopeLabel()); + ruleScope.setReadOnly(true); + FieldLabel ruleScopeLabel = new FieldLabel(ruleScope, "Scope"); + configurationFieldSetLayout.add(ruleScopeLabel, new VerticalLayoutData( + 1, -1, new Margins(0))); + + TextArea ruleDescription = new TextArea(); + ruleDescription.setValue(ruleDescriptionData.getDescription()); + ruleDescription.setReadOnly(true); + FieldLabel ruleDescriptionLabel = new FieldLabel(ruleDescription, + "Description"); + configurationFieldSetLayout.add(ruleDescriptionLabel, + new VerticalLayoutData(1, -1, new Margins(0))); + + TextField ruleOwner = new TextField(); + ruleOwner.setValue(ruleDescriptionData.getOwnerLogin()); + ruleOwner.setReadOnly(true); + FieldLabel ruleOwnerLabel = new FieldLabel(ruleOwner, "Owner"); + configurationFieldSetLayout.add(ruleOwnerLabel, new VerticalLayoutData( + 1, -1, new Margins(0))); + + TextArea ruleExpression = new TextArea(); + ruleExpression.setValue(ruleDescriptionData.getReadableExpression()); + ruleExpression.setReadOnly(true); + ruleExpression.setHeight("82px"); + FieldLabel ruleExpressionLabel = new FieldLabel(ruleExpression, + "Expression"); + configurationFieldSetLayout.add(ruleExpressionLabel, + new VerticalLayoutData(1, -1, new Margins(0))); + + add(configurationFieldSet, new MarginData(0)); + + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleOpenDialog.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleOpenDialog.java new file mode 100644 index 0000000..38a0801 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleOpenDialog.java @@ -0,0 +1,105 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import org.gcube.portlets.user.td.expressionwidget.client.RuleEditDialog; +import org.gcube.portlets.user.td.expressionwidget.client.notification.RuleEditDialogNotification; +import org.gcube.portlets.user.td.expressionwidget.client.notification.RuleEditDialogNotification.RuleEditDialogNotificationListener; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.widget.core.client.Window; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class RuleOpenDialog extends Window implements RuleEditDialogNotificationListener { + private static final String WIDTH = "720px"; + private static final String HEIGHT = "530px"; + private RuleOpenPanel rulesOpenPanel; + private EventBus eventBus; + + public RuleOpenDialog(EventBus eventBus) { + this.eventBus=eventBus; + initWindow(); + rulesOpenPanel= new RuleOpenPanel(this, + eventBus); + add(rulesOpenPanel); + } + + protected void initWindow() { + setWidth(WIDTH); + setHeight(HEIGHT); + setBodyBorder(false); + setResizable(false); + setHeadingText("Open Rule"); + setClosable(true); + setModal(true); + forceLayoutOnResize = true; + getHeader().setIcon(ResourceBundle.INSTANCE.ruleOpen()); + + } + + /** + * {@inheritDoc} + */ + @Override + protected void initTools() { + super.initTools(); + + closeBtn.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + close(); + } + }); + + } + + protected void close() { + hide(); + } + + public void ruleEdit(RuleDescriptionData ruleDescriptionData) { + openRuleDialog(ruleDescriptionData); + + } + + protected void openRuleDialog(RuleDescriptionData ruleDescriptionData) { + Log.debug("Request Open New Rule Dialog"); + RuleEditDialog reDialog = new RuleEditDialog(ruleDescriptionData,eventBus); + reDialog.addRuleEditDialogNotificationListener(this); + reDialog.show(); + + + } + + @Override + public void onNotification(RuleEditDialogNotification ruleEditDialogNotification) { + rulesOpenPanel.gridReload(); + + } + + @Override + public void aborted() { + + } + + @Override + public void failed(Throwable throwable) { + Log.debug("Error in edit rule: "+throwable.getLocalizedMessage()); + + } + + + + + + + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleOpenPanel.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleOpenPanel.java new file mode 100644 index 0000000..cde304a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleOpenPanel.java @@ -0,0 +1,436 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.td.expressionwidget.client.rpc.ExpressionServiceAsync; +import org.gcube.portlets.user.td.expressionwidget.shared.rule.RuleDescriptionDataProperties; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleScopeType; +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.widgetcommonevent.client.event.SessionExpiredEvent; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType; +import org.gcube.portlets.user.td.wizardwidget.client.util.UtilsGXT3; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.event.dom.client.KeyUpEvent; +import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.event.logical.shared.SelectionEvent; +import com.google.gwt.event.logical.shared.SelectionHandler; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; +import com.sencha.gxt.core.client.IdentityValueProvider; +import com.sencha.gxt.core.client.Style.SelectionMode; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.resources.ThemeStyles; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.data.client.loader.RpcProxy; +import com.sencha.gxt.data.shared.ListStore; +import com.sencha.gxt.data.shared.ModelKeyProvider; +import com.sencha.gxt.data.shared.Store; +import com.sencha.gxt.data.shared.Store.StoreFilter; +import com.sencha.gxt.data.shared.loader.ListLoadConfig; +import com.sencha.gxt.data.shared.loader.ListLoadResult; +import com.sencha.gxt.data.shared.loader.ListLoadResultBean; +import com.sencha.gxt.data.shared.loader.ListLoader; +import com.sencha.gxt.data.shared.loader.LoadResultListStoreBinding; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer.HBoxLayoutAlign; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; +import com.sencha.gxt.widget.core.client.form.TextField; +import com.sencha.gxt.widget.core.client.grid.CheckBoxSelectionModel; +import com.sencha.gxt.widget.core.client.grid.ColumnConfig; +import com.sencha.gxt.widget.core.client.grid.ColumnModel; +import com.sencha.gxt.widget.core.client.grid.Grid; +import com.sencha.gxt.widget.core.client.menu.Item; +import com.sencha.gxt.widget.core.client.menu.Menu; +import com.sencha.gxt.widget.core.client.menu.MenuItem; +import com.sencha.gxt.widget.core.client.toolbar.LabelToolItem; +import com.sencha.gxt.widget.core.client.toolbar.ToolBar; + +/** + * + * @author giancarlo email: g.panichi@isti.cnr.it + * + */ +public class RuleOpenPanel extends FramedPanel { + private static final String WIDTH = "630px"; + private static final String HEIGHT = "520px"; + + interface RuleOpenTemplates extends XTemplates { + @XTemplate("{value}") + SafeHtml format(String value); + } + + private EventBus eventBus; + private RuleOpenDialog parent; + + private TextButton btnOpen; + private TextButton btnClose; + + private ListLoader> loader; + private Grid grid; + private ExtendedListStore store; + + public RuleOpenPanel(RuleOpenDialog parent, EventBus eventBus) { + this.parent = parent; + Log.debug("RuleOpenPanel"); + setWidth(WIDTH); + setHeight(HEIGHT); + setHeaderVisible(false); + setBodyBorder(false); + this.eventBus = eventBus; + + create(); + + } + + protected void create() { + ToolBar toolBarHead = new ToolBar(); + toolBarHead.add(new LabelToolItem("Search: ")); + final TextField searchField = new TextField(); + toolBarHead.add(searchField); + + TextButton btnReload = new TextButton(); + // btnReload.setText("Reload"); + btnReload.setIcon(ResourceBundle.INSTANCE.refresh()); + btnReload.setToolTip("Reload"); + toolBarHead.add(btnReload); + + IdentityValueProvider identity = new IdentityValueProvider(); + CheckBoxSelectionModel sm = new CheckBoxSelectionModel( + identity); + + RuleDescriptionDataProperties props = GWT + .create(RuleDescriptionDataProperties.class); + + ColumnConfig nameCol = new ColumnConfig( + props.name(), 120, "Name"); + + nameCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleOpenTemplates ruleOpenTemplates = GWT + .create(RuleOpenTemplates.class); + sb.append(ruleOpenTemplates.format(value)); + } + }); + + ColumnConfig scopeCol = new ColumnConfig( + props.scopeLabel(), 40, "Scope"); + + nameCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleOpenTemplates ruleOpenTemplates = GWT + .create(RuleOpenTemplates.class); + sb.append(ruleOpenTemplates.format(value)); + } + }); + + ColumnConfig descriptionCol = new ColumnConfig( + props.description(), 120, "Description"); + descriptionCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleOpenTemplates ruleOpenTemplates = GWT + .create(RuleOpenTemplates.class); + sb.append(ruleOpenTemplates.format(value)); + } + }); + + ColumnConfig ownerCol = new ColumnConfig( + props.ownerLogin(), 70, "Owner"); + ownerCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleOpenTemplates ruleOpenTemplates = GWT + .create(RuleOpenTemplates.class); + sb.append(ruleOpenTemplates.format(value)); + } + }); + + /* + ColumnConfig readableExpressionCol = new ColumnConfig( + props.readableExpression(), 160, "Expression"); + + readableExpressionCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleOpenTemplates ruleOpenTemplates = GWT + .create(RuleOpenTemplates.class); + sb.append(ruleOpenTemplates.format(value)); + } + });*/ + + List> l = new ArrayList>(); + l.add(nameCol); + l.add(scopeCol); + l.add(descriptionCol); + l.add(ownerCol); + //l.add(readableExpressionCol); + + ColumnModel cm = new ColumnModel( + l); + + store = new ExtendedListStore(props.id()); + + searchField.addKeyUpHandler(new KeyUpHandler() { + + public void onKeyUp(KeyUpEvent event) { + Log.trace("searchTerm: " + searchField.getCurrentValue()); + store.applyFilters(); + } + }); + + store.addFilter(new StoreFilter() { + + @Override + public boolean select(Store store, + RuleDescriptionData parent, RuleDescriptionData item) { + String searchTerm = searchField.getCurrentValue(); + if (searchTerm == null) + return true; + return RuleOpenPanel.this.select(item, searchTerm); + } + }); + + store.setEnableFilters(true); + + RpcProxy> proxy = new RpcProxy>() { + + public void load( + ListLoadConfig loadConfig, + final AsyncCallback> callback) { + loadData(loadConfig, callback); + } + }; + loader = new ListLoader>( + proxy); + + loader.setRemoteSort(false); + loader.addLoadHandler(new LoadResultListStoreBinding>( + store) { + }); + + SelectHandler sh = new SelectHandler() { + public void onSelect(SelectEvent event) { + loader.load(); + } + }; + + btnReload.addSelectHandler(sh); + + grid = new Grid(store, cm) { + @Override + protected void onAfterFirstAttach() { + super.onAfterFirstAttach(); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + public void execute() { + loader.load(); + } + }); + } + }; + + sm.setSelectionMode(SelectionMode.SINGLE); + grid.setLoader(loader); + grid.setSelectionModel(sm); + grid.setHeight("384px"); + grid.getView().setStripeRows(true); + grid.getView().setColumnLines(true); + grid.getView().setAutoFill(true); + grid.setBorders(false); + grid.setLoadMask(true); + grid.setColumnReordering(true); + grid.setColumnResize(true); + grid.getView().setAutoExpandColumn(descriptionCol); + + createContextMenu(); + + ToolBar toolBar = new ToolBar(); + toolBar.add(grid); + toolBar.addStyleName(ThemeStyles.get().style().borderTop()); + toolBar.getElement().getStyle().setProperty("borderBottom", "none"); + + btnOpen = new TextButton("Edit"); + btnOpen.setIcon(ResourceBundle.INSTANCE.ruleEdit()); + btnOpen.setIconAlign(IconAlign.RIGHT); + btnOpen.setToolTip("Edit Rule"); + btnOpen.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + Log.debug("Pressed Open"); + edit(); + + } + }); + + btnClose = new TextButton("Close"); + btnClose.setIcon(ResourceBundle.INSTANCE.close()); + btnClose.setIconAlign(IconAlign.RIGHT); + btnClose.setToolTip("Close"); + btnClose.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + Log.debug("Pressed Close"); + close(); + } + }); + + HBoxLayoutContainer flowButton = new HBoxLayoutContainer(); + flowButton.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE); + flowButton.setPack(BoxLayoutPack.CENTER); + + BoxLayoutData boxLayoutData = new BoxLayoutData(new Margins(2, 4, 2, 4)); + flowButton.add(btnOpen, boxLayoutData); + flowButton.add(btnClose, boxLayoutData); + + VerticalLayoutContainer v = new VerticalLayoutContainer(); + v.add(toolBarHead, new VerticalLayoutData(1, -1, new Margins(0))); + v.add(grid, new VerticalLayoutData(1, -1, new Margins(0))); + v.add(toolBar, new VerticalLayoutData(1, 25, new Margins(0))); + v.add(flowButton, + new VerticalLayoutData(1, 36, new Margins(5, 2, 5, 2))); + add(v); + + } + + protected void loadData(ListLoadConfig loadConfig, + final AsyncCallback> callback) { + + ExpressionServiceAsync.INSTANCE.getRules(RuleScopeType.COLUMN, + new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + Log.error("Load rules failure:" + + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error retrieving rules", + "Error retrieving rules"); + } + callback.onFailure(caught); + + } + + @Override + public void onSuccess(ArrayList result) { + if (result != null) { + Log.trace("loaded " + result.size() + " Rules"); + } else { + Log.trace("get Rules return: null"); + } + callback.onSuccess(new ListLoadResultBean( + result)); + + } + }); + + } + + protected RuleDescriptionData getSelectedItem() { + RuleDescriptionData template = grid.getSelectionModel() + .getSelectedItem(); + return template; + } + + protected void edit() { + + RuleDescriptionData rule = getSelectedItem(); + if (rule == null) { + UtilsGXT3.info("Attention", "Select the rule"); + } else { + parent.ruleEdit(rule); + + } + + } + + protected void close() { + parent.close(); + } + + protected class ExtendedListStore extends ListStore { + + public ExtendedListStore(ModelKeyProvider keyProvider) { + super(keyProvider); + } + + public void applyFilters() { + super.applyFilters(); + } + + } + + public void gridReload() { + grid.getLoader().load(); + } + + protected boolean select(RuleDescriptionData item, String searchTerm) { + if (item.getName() != null + && item.getName().toLowerCase() + .contains(searchTerm.toLowerCase())) + return true; + if (item.getDescription() != null + && item.getDescription().toLowerCase() + .contains(searchTerm.toLowerCase())) + return true; + return false; + } + + protected void requestInfo(RuleDescriptionData rule) { + final RuleInfoDialog infoRuleDialog = new RuleInfoDialog(rule); + infoRuleDialog.show(); + + + } + + protected void createContextMenu() { + Menu contextMenu = new Menu(); + + MenuItem infoItem = new MenuItem(); + infoItem.setText("Info"); + infoItem.setIcon(ResourceBundle.INSTANCE.information()); + infoItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + RuleDescriptionData selected = grid.getSelectionModel() + .getSelectedItem(); + Log.debug(selected.toString()); + requestInfo(selected); + } + }); + + contextMenu.add(infoItem); + + grid.setContextMenu(contextMenu); + + } +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleShareDialog.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleShareDialog.java new file mode 100644 index 0000000..0e58702 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleShareDialog.java @@ -0,0 +1,76 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.sharewidget.client.RuleShare; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.widget.core.client.Window; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class RuleShareDialog extends Window { + private static final String WIDTH = "720px"; + private static final String HEIGHT = "530px"; + + private EventBus eventBus; + + public RuleShareDialog(EventBus eventBus) { + this.eventBus = eventBus; + initWindow(); + + RuleSharePanel templateDeletePanel = new RuleSharePanel(this, + eventBus); + add(templateDeletePanel); + } + + protected void initWindow() { + setWidth(WIDTH); + setHeight(HEIGHT); + setBodyBorder(false); + setResizable(false); + setHeadingText("Share Rule"); + setClosable(true); + setModal(true); + forceLayoutOnResize = true; + getHeader().setIcon(ResourceBundle.INSTANCE.ruleShare()); + + } + + /** + * {@inheritDoc} + */ + @Override + protected void initTools() { + super.initTools(); + + closeBtn.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + close(); + } + }); + + } + + protected void close() { + hide(); + } + + + public void ruleShare(RuleDescriptionData ruleDescriptionData) { + Log.debug("Share Window"); + @SuppressWarnings("unused") + RuleShare ruleShare = new RuleShare(ruleDescriptionData, eventBus); + close(); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleSharePanel.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleSharePanel.java new file mode 100644 index 0000000..272ddd8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleSharePanel.java @@ -0,0 +1,422 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.td.expressionwidget.client.rpc.ExpressionServiceAsync; +import org.gcube.portlets.user.td.expressionwidget.shared.rule.RuleDescriptionDataProperties; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleScopeType; +import org.gcube.portlets.user.td.rulewidget.client.RuleDeletePanel.RuleDeleteTemplates; +import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.widgetcommonevent.client.event.SessionExpiredEvent; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType; +import org.gcube.portlets.user.td.wizardwidget.client.util.UtilsGXT3; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.event.dom.client.KeyUpEvent; +import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.event.logical.shared.SelectionEvent; +import com.google.gwt.event.logical.shared.SelectionHandler; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; +import com.sencha.gxt.core.client.IdentityValueProvider; +import com.sencha.gxt.core.client.Style.SelectionMode; +import com.sencha.gxt.core.client.resources.ThemeStyles; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.data.client.loader.RpcProxy; +import com.sencha.gxt.data.shared.ListStore; +import com.sencha.gxt.data.shared.ModelKeyProvider; +import com.sencha.gxt.data.shared.Store; +import com.sencha.gxt.data.shared.Store.StoreFilter; +import com.sencha.gxt.data.shared.loader.ListLoadConfig; +import com.sencha.gxt.data.shared.loader.ListLoadResult; +import com.sencha.gxt.data.shared.loader.ListLoadResultBean; +import com.sencha.gxt.data.shared.loader.ListLoader; +import com.sencha.gxt.data.shared.loader.LoadResultListStoreBinding; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer.HBoxLayoutAlign; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; +import com.sencha.gxt.widget.core.client.form.TextField; +import com.sencha.gxt.widget.core.client.grid.CheckBoxSelectionModel; +import com.sencha.gxt.widget.core.client.grid.ColumnConfig; +import com.sencha.gxt.widget.core.client.grid.ColumnModel; +import com.sencha.gxt.widget.core.client.grid.Grid; +import com.sencha.gxt.widget.core.client.menu.Item; +import com.sencha.gxt.widget.core.client.menu.Menu; +import com.sencha.gxt.widget.core.client.menu.MenuItem; +import com.sencha.gxt.widget.core.client.toolbar.LabelToolItem; +import com.sencha.gxt.widget.core.client.toolbar.ToolBar; + +/** + * + * @author giancarlo email: g.panichi@isti.cnr.it + * + */ +public class RuleSharePanel extends FramedPanel { + private static final String WIDTH = "630px"; + private static final String HEIGHT = "520px"; + private EventBus eventBus; + private RuleShareDialog parent; + + private TextButton btnClose; + private TextButton btnShare; + + private ListLoader> loader; + private Grid grid; + private ExtendedListStore store; + + public RuleSharePanel(RuleShareDialog parent, EventBus eventBus) { + this.parent = parent; + Log.debug("RuleSharePanel"); + setWidth(WIDTH); + setHeight(HEIGHT); + setHeaderVisible(false); + setBodyBorder(false); + this.eventBus = eventBus; + + create(); + + } + + protected void create() { + ToolBar toolBarHead = new ToolBar(); + toolBarHead.add(new LabelToolItem("Search: ")); + final TextField searchField = new TextField(); + toolBarHead.add(searchField); + + TextButton btnReload = new TextButton(); + // btnReload.setText("Reload"); + btnReload.setIcon(ResourceBundle.INSTANCE.refresh()); + btnReload.setToolTip("Reload"); + toolBarHead.add(btnReload); + + IdentityValueProvider identity = new IdentityValueProvider(); + CheckBoxSelectionModel sm = new CheckBoxSelectionModel( + identity); + + RuleDescriptionDataProperties props = GWT + .create(RuleDescriptionDataProperties.class); + + ColumnConfig nameCol = new ColumnConfig( + props.name(), 120, "Name"); + + nameCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleDeleteTemplates ruleDeleteTemplates = GWT + .create(RuleDeleteTemplates.class); + sb.append(ruleDeleteTemplates.format(value)); + } + }); + + ColumnConfig scopeCol = new ColumnConfig( + props.scopeLabel(), 40, "Scope"); + + nameCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleDeleteTemplates ruleDeleteTemplates = GWT + .create(RuleDeleteTemplates.class); + sb.append(ruleDeleteTemplates.format(value)); + } + }); + + ColumnConfig descriptionCol = new ColumnConfig( + props.description(), 120, "Description"); + descriptionCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleDeleteTemplates ruleDeleteTemplates = GWT + .create(RuleDeleteTemplates.class); + sb.append(ruleDeleteTemplates.format(value)); + } + }); + + ColumnConfig ownerCol = new ColumnConfig( + props.ownerLogin(), 70, "Owner"); + ownerCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + RuleDeleteTemplates ruleDeleteTemplates = GWT + .create(RuleDeleteTemplates.class); + sb.append(ruleDeleteTemplates.format(value)); + } + }); + + + List> l = new ArrayList>(); + l.add(nameCol); + l.add(scopeCol); + l.add(descriptionCol); + l.add(ownerCol); + + + ColumnModel cm = new ColumnModel(l); + + store = new ExtendedListStore(props.id()); + + searchField.addKeyUpHandler(new KeyUpHandler() { + + public void onKeyUp(KeyUpEvent event) { + Log.trace("searchTerm: " + searchField.getCurrentValue()); + store.applyFilters(); + } + }); + + store.addFilter(new StoreFilter() { + + @Override + public boolean select(Store store, + RuleDescriptionData parent, RuleDescriptionData item) { + String searchTerm = searchField.getCurrentValue(); + if (searchTerm == null) + return true; + return RuleSharePanel.this.select(item, searchTerm); + } + }); + + store.setEnableFilters(true); + + RpcProxy> proxy = new RpcProxy>() { + + public void load(ListLoadConfig loadConfig, + final AsyncCallback> callback) { + loadData(loadConfig, callback); + } + }; + loader = new ListLoader>( + proxy); + + loader.setRemoteSort(false); + loader.addLoadHandler(new LoadResultListStoreBinding>( + store) { + }); + + SelectHandler sh = new SelectHandler() { + public void onSelect(SelectEvent event) { + loader.load(); + } + }; + + btnReload.addSelectHandler(sh); + + grid = new Grid(store, cm) { + @Override + protected void onAfterFirstAttach() { + super.onAfterFirstAttach(); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + public void execute() { + loader.load(); + } + }); + } + }; + + sm.setSelectionMode(SelectionMode.SINGLE); + grid.setLoader(loader); + grid.setSelectionModel(sm); + grid.setHeight("384px"); + grid.getView().setStripeRows(true); + grid.getView().setColumnLines(true); + grid.getView().setAutoFill(true); + grid.setBorders(false); + grid.setLoadMask(true); + grid.setColumnReordering(true); + grid.setColumnResize(true); + grid.getView().setAutoExpandColumn(descriptionCol); + + createContextMenu(); + + + ToolBar toolBar = new ToolBar(); + toolBar.add(grid); + toolBar.addStyleName(ThemeStyles.get().style().borderTop()); + toolBar.getElement().getStyle().setProperty("borderBottom", "none"); + + + + btnClose = new TextButton("Close"); + btnClose.setIcon(ResourceBundle.INSTANCE.close()); + btnClose.setIconAlign(IconAlign.RIGHT); + btnClose.setToolTip("Close"); + btnClose.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + Log.debug("Pressed Close"); + close(); + } + }); + + btnShare = new TextButton("Share"); + btnShare.setIcon(ResourceBundle.INSTANCE.ruleShare()); + btnShare.setIconAlign(IconAlign.RIGHT); + btnShare.setToolTip("Share"); + btnShare.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + Log.debug("Pressed Share"); + share(); + } + }); + + HBoxLayoutContainer flowButton = new HBoxLayoutContainer(); + flowButton.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE); + flowButton.setPack(BoxLayoutPack.CENTER); + + BoxLayoutData boxLayoutData = new BoxLayoutData(new Margins(2, 4, 2, 4)); + flowButton.add(btnShare, boxLayoutData); + flowButton.add(btnClose, boxLayoutData); + + VerticalLayoutContainer v = new VerticalLayoutContainer(); + v.add(toolBarHead, new VerticalLayoutData(1, -1, new Margins(0))); + v.add(grid, new VerticalLayoutData(1, -1, new Margins(0))); + v.add(toolBar, new VerticalLayoutData(1, 25, new Margins(0))); + v.add(flowButton, + new VerticalLayoutData(1, 36, new Margins(5, 2, 5, 2))); + add(v); + + } + + protected void loadData(ListLoadConfig loadConfig, + final AsyncCallback> callback) { + + ExpressionServiceAsync.INSTANCE.getRules(RuleScopeType.COLUMN, + new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + Log.error("Load rules failure:" + + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error retrieving rules", + "Error retrieving rules"); + } + callback.onFailure(caught); + + } + + @Override + public void onSuccess(ArrayList result) { + Log.trace("loaded " + result.size() + " Rules"); + callback.onSuccess(new ListLoadResultBean( + result)); + + } + }); + + } + + + + protected ArrayList getSelectedItem() { + ArrayList rules = new ArrayList(); + for (RuleDescriptionData rule : grid.getSelectionModel() + .getSelectedItems()) { + rules.add(rule); + } + return rules; + } + + + protected void share() { + + ArrayList rules = getSelectedItem(); + if (rules == null || rules.size() == 0) { + UtilsGXT3.info("Attention", "Select the rule"); + } else { + RuleDescriptionData rule = rules.get(0); + Log.debug("templateShare: " + rule); + parent.ruleShare(rule); + + } + + } + + protected void close() { + parent.close(); + } + + protected class ExtendedListStore extends ListStore { + + public ExtendedListStore(ModelKeyProvider keyProvider) { + super(keyProvider); + } + + public void applyFilters() { + super.applyFilters(); + } + + } + + public void gridReload() { + grid.getLoader().load(); + } + + protected boolean select(RuleDescriptionData item, String searchTerm) { + if (item.getName() != null + && item.getName().toLowerCase() + .contains(searchTerm.toLowerCase())) + return true; + if (item.getDescription() != null + && item.getDescription().toLowerCase() + .contains(searchTerm.toLowerCase())) + return true; + return false; + } + + protected void requestInfo(RuleDescriptionData rule) { + final RuleInfoDialog infoRuleDialog = new RuleInfoDialog(rule); + infoRuleDialog.show(); + + } + + protected void createContextMenu() { + Menu contextMenu = new Menu(); + + MenuItem infoItem = new MenuItem(); + infoItem.setText("Info"); + infoItem.setIcon(ResourceBundle.INSTANCE.information()); + infoItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + RuleDescriptionData selected = grid.getSelectionModel() + .getSelectedItem(); + Log.debug(selected.toString()); + requestInfo(selected); + } + }); + + contextMenu.add(infoItem); + + grid.setContextMenu(contextMenu); + + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleWidgetEntry.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleWidgetEntry.java new file mode 100644 index 0000000..df91380 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/RuleWidgetEntry.java @@ -0,0 +1,83 @@ +package org.gcube.portlets.user.td.rulewidget.client; + +import org.gcube.portlets.user.td.expressionwidget.client.utils.UtilsGXT3; +import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException; +import org.gcube.portlets.user.td.gwtservice.shared.user.UserInfo; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.user.client.rpc.AsyncCallback; + + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class RuleWidgetEntry implements EntryPoint { + + public void onModuleLoad() { + callHello(); + } + + protected void test() { + + // EventBus eventBus= new SimpleEventBus(); + // TRId trId=new TRId("86",TabResourceType.STANDARD, "1159"); + + + + + /* + * RemoveColumnDialog dialog=new RemoveColumnDialog(trId); + * dialog.show(); ChangeToAnnotationColumnDialog changeToAnnotation=new + * ChangeToAnnotationColumnDialog(trId); changeToAnnotation.show(); + */ + /* + * ChangeColumnTypeDialog changeColumnType=new + * ChangeColumnTypeDialog(trId,eventBus); changeColumnType.show(); + */ + + /* + * ChangeColumnTypeProgressDialog c=new + * ChangeColumnTypeProgressDialog(eventBus); + * c.addProgressDialogListener(changeColumnType); c.show(); + */ + + /* + * DialogCodelistSelection dcs=new DialogCodelistSelection(); + * dcs.show(); + */ + + Log.info("Hello!"); + + } + + protected void callHello() { + TDGWTServiceAsync.INSTANCE.hello(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.info("No valid user found: " + caught.getMessage()); + caught.printStackTrace(); + if (caught instanceof TDGWTSessionExpiredException) { + UtilsGXT3.alert("Error", "Expired Session"); + + } else { + UtilsGXT3.alert("Error", "No user found"); + } + } + + @Override + public void onSuccess(UserInfo result) { + Log.info("Hello: " + result.getUsername()); + test(); + } + + }); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/Dialog.css b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/Dialog.css new file mode 100644 index 0000000..d44d232 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/Dialog.css @@ -0,0 +1,3 @@ +@CHARSET "UTF-8"; + + diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/DialogCSS.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/DialogCSS.java new file mode 100644 index 0000000..97b503a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/DialogCSS.java @@ -0,0 +1,19 @@ +/** + * + */ +package org.gcube.portlets.user.td.rulewidget.client.resources; + +import com.google.gwt.resources.client.CssResource; + +/** + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public interface DialogCSS extends CssResource { + + + + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/ResourceBundle.java b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/ResourceBundle.java new file mode 100644 index 0000000..fda8029 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/ResourceBundle.java @@ -0,0 +1,130 @@ +package org.gcube.portlets.user.td.rulewidget.client.resources; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ImageResource; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public interface ResourceBundle extends ClientBundle { + + public static final ResourceBundle INSTANCE = GWT + .create(ResourceBundle.class); + + @Source("Dialog.css") + DialogCSS dialogCSS(); + + @Source("arrow-refresh_16.png") + ImageResource refresh(); + + @Source("arrow-refresh_32.png") + ImageResource refresh32(); + + @Source("magnifier.png") + ImageResource magnifier(); + + @Source("magnifier_32.png") + ImageResource magnifier32(); + + @Source("close-red.png") + ImageResource close(); + + @Source("close-red_32.png") + ImageResource close32(); + + @Source("disk.png") + ImageResource save(); + + @Source("disk_32.png") + ImageResource save32(); + + @Source("add.png") + ImageResource add(); + + @Source("add_32.png") + ImageResource add32(); + + @Source("delete.png") + ImageResource delete(); + + @Source("delete_32.png") + ImageResource delete32(); + + + @Source("rule-add_32.png") + ImageResource ruleAdd32(); + + @Source("rule-add.png") + ImageResource ruleAdd(); + + @Source("rule-edit_32.png") + ImageResource ruleEdit32(); + + @Source("rule-edit.png") + ImageResource ruleEdit(); + + @Source("rule-close_32.png") + ImageResource ruleClose32(); + + @Source("rule-close.png") + ImageResource ruleClose(); + + @Source("rule-open_32.png") + ImageResource ruleOpen32(); + + @Source("rule-open.png") + ImageResource ruleOpen(); + + @Source("rule-delete.png") + ImageResource ruleDelete(); + + @Source("rule-delete_32.png") + ImageResource ruleDelete32(); + + @Source("rule-apply.png") + ImageResource ruleApply(); + + @Source("rule-apply_32.png") + ImageResource ruleApply32(); + + @Source("rule-share.png") + ImageResource ruleShare(); + + @Source("rule-share_32.png") + ImageResource ruleShare32(); + + @Source("rule-column-add.png") + ImageResource ruleColumnAdd(); + + @Source("rule-column-add_32.png") + ImageResource ruleColumnAdd32(); + + @Source("rule-column-apply.png") + ImageResource ruleColumnApply(); + + @Source("rule-column-apply_32.png") + ImageResource ruleColumnApply32(); + + @Source("rule-column-detach.png") + ImageResource ruleColumnDetach(); + + @Source("rule-column-detach_32.png") + ImageResource ruleColumnDetach32(); + + @Source("rule-tabularresource.png") + ImageResource ruleTabularResource(); + + @Source("rule-tabularresource_32.png") + ImageResource ruleActive32(); + + @Source("information_32.png") + ImageResource information32(); + + @Source("information.png") + ImageResource information(); + +} diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/accept.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..89c8129a490b329f3165f32fa0781701aab417ea GIT binary patch literal 781 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 KMNUMnLSTYm0R)}^ literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/arrow-refresh_32.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/arrow-refresh_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f3521ea5e0d148384d82c3cba4376972090af7f6 GIT binary patch literal 1182 zcmV;P1Y!G$P)wK~z|UwU%8>TXh)5pK}h{F>r;#a2qh7O*95Kj84sVVF)0>j3^p4 z+l*P3Eir0LTz2J!<8Y-HvXPiwPGd;)!W+UC21FUogb~TIiJNG@z%fz>w6Ox~fS&j9 zq93%-(+`60&1wHVeSgpYJ@0v+Kd?n{?7O!1&HPW@DgiX8zuo<6&LXxPhL`+uFTI{=s0ET(5DM0+0|3RW)->y1X^LMNzi6%mh zaL+wATz6f7fsXz&!@8M(JOGF`TtT(1IvGylVK{`T*(vxJ{dn;3!CC`~#6L%NN;DmK zIVU&(CT!i#wJy1XDI_V6P48>^{5k7tSZfwB&QVyQ zC<>l*Jdrdd@Bi(KG`L7#Ry~jix0l;7Ffw3j$%#WsRW;N-y&q*e%i;qrY#10C`VpZ} zC>&PRnv4}#50B4^H1K>&K1xeUVXv~ovdxk-UA-PRLZJ{K{CfP0@q1}2U%2{A+r%9-)=6PIEb&5ZB7;vIH0S1EyDpq>PZt;Go^ zAoH_9IBZ~fIfVIuAKu9++`M%Q{&_zr{8ym7HGcm0?nF+;x1hQ6C7r_dno0*8d+h*- zD_8r?EqUVsHY^6e(kS|kXxS6Pv;wj44E{B2Z`!N)|MAz8fX!-y)9XwJUlI|okYkES zS6I_N__g!)x4zN&#Z>vT_JW4b4(TFncU0No^t$l#*FO))9Z>% wu`P<6%;?&uqdEm0*?7VK8i&pv(6=hre}=nUJq4NLMgRZ+07*qoM6N<$f|YC_5&!@I literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/close-red.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/close-red.png new file mode 100644 index 0000000000000000000000000000000000000000..978f945b8468139d545f89624e17f62f2f20629c GIT binary patch literal 693 zcmV;m0!safP)U<^{h;=59XSA+U1e>a-noAIA@jsc5i;D&|qOGH8Ru+6e~sqTM*vw>j|} zjnjjf+fSMTtC@7t_*Sm_@cxeIriU$pluJ+z1&F%P-i7Z((5VqBZ{F3EZAMa=yPgHG zy`?X<^!Ii|f;zScYWf1!nadD~LDWUfUc)*+hrO|mQ}u}U_jH=Ne+j?=5Mw6YL>E?R z1u@$pdS43b+!aIw)xQTR_#ofL{d5rcy)x@Z7{M zd_wIW#!k;eYdg}}jbE)HT7PH~pv}@&{_~;e;BF%8WmLT9H@4B(>3LLlAF3;XpBiE_ z{~3%~Y{r;7doqb~a(%~+bhx!uoWLN(0#f!u?ACTvR|4a-&=?x$+w)g7-#8-^*=!i& z=%c5lpwXD|Uc8ceTLK-66DS1|-Vi&2NewfObznTc%H+wscpPfeaw77K0r zhCAB^Q#kR?&|#&<=E@f~KISVT%uYO6+WE>&k*VVeA#w@D6v9}T0n5Omg?=!x_{{rz b=fCO)OBE^E@HZAAg2s45|fh^mx` zl$fMdUs^>WjoL_Us-RL3rH~4wr0RY>C=8Vps^L=NXf1SMt{?~`hccPg|>K8{htFlu>wga_5-T3J~ zpwHkhqVnh3eFy#_BKBVqFf&QLex$|V2u5DxdoR#nd8WD^pJ zfEsT26Xeb<$P6R-9C*bR#GrH$T3LfFtpVq-z%zXP2BWv{0*o5=#6yRUU6@m#^YD+G z9Q++)S)#s%vQ-TLxS>H@>IRa_V5*=B-j9Ede^-x{l%h@RvFdsN?tR=vt|tXTI)LWJ z!^dw<<+*9q199G;#Otz>$|aOF)`KZ7b(2U}JCe^n5RO;K+{3l~4e4kDRmvLciB&8H zugjv|PTHq#dYVAjfmd40>lTSdDO=kVP8jGUlI{i!n?O4sIusDb%=Aw&>)d?PYD0|i%`EB+4*fGxoKwj zv)@CS)`t?&1-K9Y3B8?&b1ZCF0jfCDqf@IeA<(n$0(jhHA_J~ky|&xEAsSS zSg~q6H4fSJJhEA>eXkXKK%!fT+XH_TnUssdCI3!a)mKp!=)#40N$ z+N}^c`&TRW)~}~aIEUAneS#45@$ub9`z3e%$#0zRk%AsUZ^ z8D#HGOS@gW41q^>@0|p?X&Igojw!t|3zd)M~+Su?UzVqxqt=+qFyJ zJ+kMedBgD@GWWxFjzz<&&Ln{Mp@>;nfmvG3OlN<8n-#-V0m01B!gZ&NDH-tnri#zz zK@D@!SzE2>?#Ca8`_8M#m%cI`t_me_P(!nMOchh@D-s~EKD^>HSun*)O6P_b08=C) zFYHG)Z<{>lJz7x(rUduzhgJ02Q!Jo*!BiO;NP`(#RyikJ-+Ti-@p`eucMl@Xk4*-+ zZY7v8l1hgaFg;%+;BD*=s3+Ikk9kGQDzRt@W`;CBK5MIK>v{aIjulC`$9IL9NR(mq zD>1L+`v<}<@MC9-1XiCo)n;Bhf=rHVXAdCwx>XPa=x>f=|Gr)XF9gmmpU405wFwEk z{x1IbD_G$18y^9LY-bNaCWooEuRd|At-y^G4t@r_ykY%-V9$;X4O7~%0xMkvKEU0+ zgq5$w;E(+f%Vf~x7qGP(u(5zUSKh_O#z5`Gs%z~X1@5$t zGLVnHwfhpr)_C=Ds`2%9M7lo$4clnORx2DESP-CVKaYNKD*%J7SIMW+AY5Mk zyEBgnOzab<^^<@FUcZ5AI^UmS=vpZ18`cu6-Gs#w4~DB^@rC#=@0frOz1L2@Zva%& z5#zb3@S+M7#)o^Jdeq<@AQrD(PUV)3xM(z7PSbtJtzO)nLCD?@;juVcUV&COU@IEH zMX<4e!7FX#Q?~#{5!tck_kS$f7tZ=p`(XEz+dxhuER7@*EME68r40`u?!lWBm%1Y0# z1*VBSxnq+!`U<^{h;=59XSA+U1e>a-noAIA@jsc5i;D&|qOGH8Ru+6e~sqTM*vw>j|} zjnjjf+fSMTtC@7t_*Sm_@cxeIriU$pluJ+z1&F%P-i7Z((5VqBZ{F3EZAMa=yPgHG zy`?X<^!Ii|f;zScYWf1!nadD~LDWUfUc)*+hrO|mQ}u}U_jH=Ne+j?=5Mw6YL>E?R z1u@$pdS43b+!aIw)xQTR_#ofL{d5rcy)x@Z7{M zd_wIW#!k;eYdg}}jbE)HT7PH~pv}@&{_~;e;BF%8WmLT9H@4B(>3LLlAF3;XpBiE_ z{~3%~Y{r;7doqb~a(%~+bhx!uoWLN(0#f!u?ACTvR|4a-&=?x$+w)g7-#8-^*=!i& z=%c5lpwXD|Uc8ceTLK-66DS1|-Vi&2NewfObznTc%H+wscpPfeaw77K0r zhCAB^Q#kR?&|#&<=E@f~KISVT%uYO6+WE>&k*VVeA#w@D6v9}T0n5Omg?=!x_{{rz b=fCO)OBE^E@HZAAg2s45|fh^mx` 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 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/information.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/information.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2adeaeb60296fe841f3e988d059c5bc4e6bb03 GIT binary patch literal 695 zcmV;o0!aOdP)N@vp2x#!*%={Kmf>MURG z^PGDQ2mZ6H@xj_N4OuSZtTq-KfVm@ar-3@B(SHqzUcX80m z%=AeBMEicz^tPWT9Y5kqo67nlD{fB^tUL9vB7KVMW>s09Wq{XRF?#xcp+)eerBayd z#p!Tz`QAGd8ywzJe{A(FTd?-Toh+v#we!%X1@4}Bf>$5=(IU+Ery*L?`r$hw!qVV$ z0yEs4t&PM6#RMOmDD6!F(87Um$mcd#HmpV1zABHMYw{5hwAM7XMHw1O5DsN{Tx#eb zKneg#Z7d4BuY`xhY=~a1zM?je&1AkW*GtYuA9&P z^#wMpMTmZjlbtaItyIVs7^MI+1{M+CL}LIpthGi&NHU`WQIW2mI6il3vYXa`;qQ); zaF%x}pL^pNQ60$<5~}WbYc~Zs9veQoZ7D&2IshkkudshnvTzoSE!`NUY5|-8%E*OB zP4BChFABJq1T%Tj_J!j$&&G7tB7_TP<8nG^Xnq&7l;b>r1K`t(+XI2c%1ZL_c_wr5#xpZ8Ftp?0mCEJ`rySmOd9%yuxVEx*j%V4T zTynC#0DSt|$McsTdEE5AFQN3Fr!`d*PkFS8wqKf_YN>-*lmnrWR}qY<9oDW3P1pDJ dj%WU>{s4a>U~;FXK~z|U?U!F{TXz-5zrX8SC$8f-sS}d8ZkD8FO`}#_TUuzv+HMk{ zso9XWqOvzM0TSAf%F7TERBTg0lMw7-f)|7YLa3z+s+xi z8asdN+4aBc^F2J=B#Y-dSyA8MyxiaY{mwnV&pE$8=Um`_UCgIdR8@2O?OUHK3Hy~e zEW!>_!z3ZXIF<1-bxSozGP0C)O!uBYFJ{!$`8+Gd})Y%pkK+!29R}>^tMZ_2K z$Q8;EAxOPkM)}x}pWHQZ*8l^5OB{5d10-8K7SPdbqcz}#0Z{3ZREjI(RIARD3X##l%b+v*`jdxgw~9zs^QW zV?DatgXj(i;V~8*5e$vZ;^u4)Buk`x`KM3qdt*(2f#I1Rr-XM%wzdRpYzlc{3@|Zs z8&}>>AeAdZNl?{&l2CQ`fs$zSdvTyIjLne^Pz6S!a~PdULCB=z$iA1pvwvdcd{#v; zRgF_Jr%1L2d>(8Hd7)5TiO%7|KR(1qd8gKjElWCEz`1wE@z&p`piu1k>;{BGK9JgK z3{F9{!fDUSmu+8p`fH>d_gKLF;d*#1gLlUla6OiSx(f`20;<^7*^HQJU`n@=I=>9wET)7cPbb1c!Y=fPfLs+~sURW80Wq?0iytP-Ty|zcu z8t{TtjC`=LX2{o)H?K~BBzhx3tgo{n)ZTBuba7V|0IB^X(d4sX0L13<$P~&o4WGIA zZ=`OQkjfTuYViG;mRHFam^ zGf)7H>%E|Rb%&S6RxUvYNqB9yt5A|v0q#b!IrsQB`0T~J!8-xCiN(EG*G^>ThNtcl zL!pZ04}g8#mP7Gk`6T5EMW(mR_nIE>r;!dX}PyFXW)Ah_v|7 zP;XZmdt^@pKl|nvaAa?1MgPms9L8h&d#d!C0`=IusTmZ-d$D;46;4^sRRJ9D-*Qz{ z#&QM0WFiL(2D`hPstg|7-ci%jhj(>W^*#7N7c5w~7ENLyQv_8Y^5MZ9?eN+Lq+%*@8&io466rj$xzb`u=0T{@ zhpx5&?(1lT$5<#jf>#E|mnJVsS-*7t#jjS?g*A)P@Bez_AW62@I_W&zEp8Cb$9w?4b^f1YdLN|pAd6U$*2rnpb?(7Rk gM%J46|FR_i0iOb-U2dns ~NwO_yO%;SvZ5MdNYf|QNy-I*%yJaj+uTdt+qbZ z4E`Fzb8m}I&!N8OKmWEcCmrLs^Hs&3i)mt@hQVdcqghkaBs*D}tG_lKew4?rTjzIZ z9tSone1TS+TR7tu^CunG)Y7Jg#sw#)sG9C!c0I%LEzP)9;hqRf&)s$D8d5Db{TBs% zgl0~5QQ91luq4Q9tJgt4QLbaxZvAaKeCM9!oy85dg4k>TdBSVqjHub_PG=PO&J-rx z7oYTuF+kH|tG-UK+EkUhDjYx?zW?T|lx>+aOQm zzL$v$zBLo4Cj=G&tw{H}dW?tlTkS)SY4<#NS92z*EY-MMB6Ftp`R=*=*Ev7cS+X%W zMCur^FdlokL}1Y+&aasU2J4#EOuNlnb9CmqgLCGTSY!1BD42pkHY^XidQ5=>YQx%` z*%Pm9D!CkBu&tMWm(%-ejACVWGS2RX5=QOJ$1*tr7F}F+*-OA+Ly&Isg|AEuUYicA z#%IG6kPXkHt{zk2M6zK@Vu^4Q(1zE$?yY6M!^&jQ+2^E?!p7{g*|X6}vuRC3p@jk0 W117c83?+LXEZI4G$p&LV25SKE>nb+@ literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/magnifier.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/magnifier.png new file mode 100644 index 0000000000000000000000000000000000000000..13024cda5cd8129ca34d7a802a3793e9c697a236 GIT binary patch literal 548 zcmV+<0^9wGP)dSB78i#s1-B0E7AWXnpouSZk*-aGNQ#gM=@2PYW15oYHc9U}&vA$qnioDvOBtF6f*2U``*3VnFH~u?z1#CQ&!xKo3qUI#MM5@B zWoWboC7`6UZh0^n8Ah}`?lnON&}wEhVADJhi~%tQW55`2Jz;Fb!Sf{67f`wrq$?~2 z_|Z*ZZ}F|xLTR1r3y3F+rEM3-hTsVcd|>$uLC3)zo8s@@{?{9)X0%x{1 mH>O2&@^x3P)3e~hy!iH7VuF9j3s6|cF2capXnK-dM_IN!1&tmMT z50ctdkdWYP?wxz@%>T{NIp-eWzi!4>n^SX&CxX%l$x$+Vjlv#MptMNphmguUndSW0 zz(8%=0WMuH9w&8%QXff3LPLCG6a`ZA3VG_iw|l?d7J#WKS*iWSGof&T6dW7KcG&1l zn25!q<9>}OlmjfeHI)21NFo$J?_Sw+YHZ91+X1kjUP$gQei{lNi^86ag=}XGh5$A8 zB_J6$k%&9k-R2@@dT)rD$61YtyC znn1!fkc^uE0Jjw2r-cH-kO;}q@!`GswgIN*6nBE+4O07F&Dh9x+6W1(RYC-zA`dh? zAw|!&X`nl4!7zZuM;>n6Uk9bz&hC|iA09p&v;tr@C-I;(N@|~D13NoyKwFDLKoAOU zC4>OZKy7DV+`e(xG-)dL#t2Kx~B5opP7|#{A%&0Poz}-KJAO(pn7orUSC$pTV zbh}io2@|#nzyJ&wh*<_Y6DD@1ZCC*QEL1SN;DRE07AI4tH#0Ro-tV*m@XT%a z)px(01#v4iACY=`E@K8eB6Cl#9GM*MI1=n!{DwJRM#J2 z?s6VA-vh{*bbWnGh)o-kiRn8dqH$JYKgC9cd#n*@G$xksdOeHhQadX*aPX~TNT$2t z6;?2NHIKmeKxw9{UfLAG{JTW}7$4r7cfIm}7><#eBz2QgSyY+QO%jtKG`8#Em6y|N zKhD(r3g#~7;T2Yp=M#n#l{B#l)69VXHPh-tUy1%mqn9cHF_C!J|l~ zyHQ?S!R*zG2pTaF&thaOH}^#UxTy!)vEhk%zr$Z01vwM=9%ipzM0srmsdN_x29Lsu zIgmKyFNdd}es@~{nh@#w`Y5HDpxS^ax=5zFF!1I(fB;G# literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ee5c2d319c96effac875db3b13e01f6c74abbe GIT binary patch literal 1597 zcmV-D2EzG?P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*z_ z4KE#r2mKZR00q5CL_t(Y$EB5TY~58E$G^|{o%_4({YTpYcXXxKbzQqjJF2|EWvDM^ zi7e4gAfUs_k(KhwcV2(?r5~Tc)Jv&UYG*Q;gyT5O z%$(2XX<}jm|BAdUzbD}|j^5RJUjjn#d)@_FR#`AJ95_fdwQ+mX*2a_XoESb<8u;?p zIv=~ewXKzznXI)Wr9>u^!POAGFLd4*q3Ge>o4=5NBQRTfmr5$fu5jU!3tv}pt~5(k zQ{>&<_lp&=e0wEYVlc>B3nIe!_&Da~=JHa?+y^sY`eZ8J+3q?K%#_Z6m=WlJ`aYh9 zWrNXozK47*$LGsSw54eqZExR!SO5G=YG2pE1R~$}IhV^(Bof)u*VmUF9v=RNQmRQQ zg-|F28KSz~t+7qGSo(=4LD`EI>MNdSdQ%$ol6g;zaQETfc>-y6ZtiU}k)K`!RUB zijg-5@P6ezw8Yy{Q67Bdq27r=N=Yp(Ep};X>E}cQDJA#x^gv34vugZSaZ(Z*8HL}?(&Ck#Owp1#;NC0r#NbB8+x~Aiw>%KSC5KZ8G zVS)1gC1$o1l?iN!r=T?9r@#A=xihuf*}Ls4ynJaHQ&Ur9tp$L!n}eAzXsw?t6bdH> z2L~&())2RSKh*~-pSokyryDzxTPWm&i2x|Akhz$_?NfJN z>+dF8+sZQ+Dx8vk$~NkmmmlpN=0|%};D&(1mbLbu21K=QbHNJJfF}k~J zli)}=Aj?2l)*%S$$qT?v4CFXboL$;{)1v4o0%;5l4PpQO{rGoWDbXXNv)?7gz}8fR zo14O9EC4XdzD3bfaD-q-fIQz|`dk(HvN|@F?mB?~0`)&TCp7qRYk9D1W0W_n3zIgM z0iv>RQ1La01Un8WU($SPzC_G4@Uw#-J+$}mG{(}m{O14Wa@7sgr^ zLQt`yQK@MV5riNV%9>9vlt^nH7)y5@!ZjkSH4m+C3}an91Y;QlLB*;;$=4tv7DAxx z8JwE?yZnJ8)7R>UWQ#iz5eKw7l3>}w3k)1V>ZAq$B1FOhL_~#(;?wgbGMD85F!mwj03g`VbLZaoQK~3j&4E$x3K(NC zK2!Xk%JR=YnxI$wz?^*jY++B!^)BjMiIt*4=As8?JaIhT_4ETr&U~n{e4q~=eCFLc vW4TuwJjl!`WAO$NjcTQ*PCT*A;{V`pJ@Q28{BDrO00000NkvXXu0mjf;EMa8 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add_32.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add_32.png new file mode 100644 index 0000000000000000000000000000000000000000..269e9276ecdf3cc3255d516098b8f6d17e60763c GIT binary patch literal 2267 zcmV<12qgE3P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*z_ z4KEDrx839b00>)2L_t(o!?l)sY+Th5hrc;@U*3(^UMF^*IOO5Pv8f#h5Gaq9P$=c4 z7LiIIR79Zyi9{q0G)@I7ttvsF7&j_Xc&HCr_@jkVrK(C>QY0vk6o)ja3~^#Zz}T@J zXC3dZ_kGUvkL#EOLfeRRq@$yIukQVRGjnF{2$S}}AFgH7HQTu2xg|k7mN^%^PE;;X zl?7@wW}T*;b^C4E{=HNxKkqrO_q99ryETvB#!qj5imh9>MpX41&beDv^<1D*RgZq2 zwQJW3ColnM`VGAEO<48ZqM2c@;z!Qub+r|q>S>(+#G?#)OfvZTJgo=7Bu`X>2&o_+iFv1ZMh6AB2d-*qXEp1GaN ze&4XjlkhL5dDR!TOkc_3swNO2Z?jmnRLgWuPb}fA+2?8Z(C)gO{W~_;oG!ZVv1NBT z=U%F-t7~X&ZB;;=a~$2X*(}FK;!^@1J##x>*|xOCbHOKPgl1j1YVNff420>=9gy+j z7)~v!4ir2*szcM|jM>X|PJEvH@n0`|JvA}W608g?Xl-p(RTWj`=mHoR82FC@%tg;H zHbED>Z<-gscqY1rq>6Mxxv+!_y z7{MF|ch1q()unxXeW+^rGX+F#u-;mCLsQKPV!=4?W%g09SwulpxPH;i+|sm`t4?2y zhXI9bDZ~5YJu)vbPtKZuE-w%LNs_tIDWR%LI-Mq&Op51u-&NK6&rE@OTpSBl)izW$ zF`Pe0wwys!K*6b_A<;x-C{9Hn>I3k@IZ;e;IDd$ixvl)8_YHOr?c}1OBP%8M|qf_rRH#f_iIdd2t9VHYBQCnLpkw^sR9L_lfBw($M zP82hEVh{{qIXKZzxY1CS|u7ooICnVRCPR{&g~o+|M1JLGtVJpLX>ThS3dePuk^o&qHJ3E5LMv>BNGSt`JPU! zE#uT82+?31=akX(VH#(D0fA4|{IP9n+f7OhpyvEY?|^ zv&VhNIg6?VRSbq1vDq9-9U_$(r=@N=f;p}a9J?R8L_~*%hA5ZIPX=)8$QQC7>>Av$ z_~M0^lP->Nq%i73o#Ta`rx6Uf(geewt|p(_5;wVj5VMjC6Iaq6bTesVt+ zJ~%ii{r&wt#+Ys1huf0b`m1Y7$%(PACZaXog2WQdl_#WVbD%IhG04co0Lk1T|G;6W ziOynfe4%#rc1hR1U3&Z3Yh-TaJOFaJ9Qk~nVzEf6RH9fcQYaL(R4Pe6pXb1V1Jc*m z*W-EK`I|Ov$_PN{HoWD_7d})GoVM;ui!YOcMkOFtjKD)bH!B$m!1}z zJu)(?d-m)WRUH$N%QtM;(DhmEck|}WY}~l<<9T55PoVcMSkX}*u+CiLT& zbj6aG1U(n>Mr&`7)je zB8mXvpyBPlw0>}?AOU0Ue`aIzrkgf*pOgRrXnVZ(ZdH9a5;A)JviKx?vW&!sXYyr? z03!ICu&Xzv$#hwO`=8m^{DW^j{4P)5v+U#qtb5|U1){b)6p+Zu#<+w6N82fg5z<-T za}giPq~|;Kj%zYg7SxB|w7HvKZ*1nIQy^Ntv0T=Qruu1 zV4UMJV}!cu;3V81yR22R1v?dXR0xNJxA&)f&-wgteg#gHGHHfJ9<)DC^>?jA>auI$BMkPE2*iR{lCDc`oL|E4F#n% z_L@`9DU}`JphwXvrIN!K$vLO@J=@;=$feEiDoxL}H$QUYgQp%2@NbMk51b829B=>t002ovPDHLkV1l{kQV9S6 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply.png new file mode 100644 index 0000000000000000000000000000000000000000..edf83f0415251dff05555470f00b01bdc59496e2 GIT binary patch literal 819 zcmV-31I+x1P)DW` zK~y-)g_281RACr~-~Zg^sOK;?9xoAHXCO*J5(}XS7f}#xGpJ>kMK>~tC?yBUTI5Kf zLRc+Aj3|PLGAe{xnl@fa>|&YP5H?=s%s5BS%ztSS4k3l#_Tzcp55AXRnF)nLx@B31 zHBGDGoUe3Ucha`)((3B!NdQom6IhmYytueHWSS;)T}L<^CXq-avtL%AC`!mQO%OuR z-QA7R(b3mluh-Mi&`?MSSzaK7fDi(dQY4c}sH%E4olZAdmQ~3Z6Vm^{=H_Mq0OuTx zF#v$y?-zz){4flos-mKzK-cv`vJ^af>noa$`WGc9Ow(*BFE0n@JafsScyMs=r}8iO zOxsA4Mq}$#sb{x85P(D^BvP~RNI4nUaU4)e>*b~J>6;^U8wxxZDA6_*`f}o%*XL!E zg&fqq-G@2b;dH_v6FZXDmHhM>wi2m}NGpRp1Z>nic6uOp}`o=zo8 zlg{~zbO3;zWJt_2MHtoCgL6AT;z-~vv19$lY0p($Cdy%(o?6fUp=0Js1o z0IE#T`xy|Di{~F6fN~DXDO6c!+XK7gXYU^&;U-S@*V?TBpv05x`nO51 zi?Nw^_0KM*>VV-)M|L)@5|8`uBgJWJf34kG*5E_9W(MTgjgKD6_yJ9o&rl|2Y=<^# xsoWRHnid`BOEZG4SMvnr>_}ft?9Sii`wi{9TcG~w2KE2|002ovPDHLkV1nI%YD544 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply_32.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply_32.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea6ae598186401d0758f17862537a96108f9c21 GIT binary patch literal 1802 zcmV+l2le=gP)|e>3Oo#n{HTn8XM+36~Hq1&ab{T0f9BiWK#!QlHv9L`_R@gAfG~ zJ54K0)Hb#d2tx}FREjFmy!P_YrV0%pN(#b2Y?X*QtP_I)6MVzi-rJe)>%;Dvbs z;jBh;_UxYdegFCX^UW9@@M>#oWBvN|w6(Pr0pAgkS5$R1P^zk^D#jQ#Y}jD#^uGU~ z0p#G7s(LaKi7br8Vnm}+092JkB0*PI*InO#pa2dWI6x+oiK^gwtRwY9b6Rp;B- z*w{VCun!Wzx^?UDJny^FXmmksZ7m{#h@h&72mn{ET$#9kC@FBxZH&cY6N-U}Allp8 z85kJA7~>ww3;-BoR!5`JNpOIXkr9T5hOpMYuBx$zHUowE&cjueWHO0}uxZn#9RRJZ zt&fVxB~=XRYgTb#e=0_|Ni~d*Vj);MWGLtEnCLW&=CFo{e(gx zX3d&KBodjlTK=y9_Uze1eSJOq_U&681i{2$h4B3M^73*jDk>&H3);xEQ?U79eByrN z#*OUVyLY~G?r*A!@B33sSlFC%6Tjty$UQslPZz%HNAuZyF#anQbYA)|zca>kib$lo zx|*`Gvb)0Xlp13UeSLj6=MMV+1AH4IZ>Sm_v2)kXbe~6RYUc3t(~AmxAVj?qRFzba zAkfT|;$)2B+O=z3zI?gM81pA@x^NX~iiR!DsTrnbZutz(ty%G8O>TTtl_I~C%}2h$ z;Y)|`2=R#bIO$B9bSh0cohF$~($mvJJRa}zJnz}Y#>QJ_y6~c~WzC|Q+#Cxy-E|99 z<+*wNR~N_1W(O`?X}`ESKwHl`d=tfqV{WigW2rSJ&~)A-r$nUHTKk8_#>QlGb2DbT z@Mjm7VGJ1H(v2jYpN)~oSiZgJ`qf2qN@jm?qo4B~7dT$pig6)Cl|VC$n&FLq|8f7` z!tq;LT4-o!0Kl6LeDzZ^@jQd767tHZES*7dq=ZtxJ%CSdp_JsIFf0fi$nWyYFJXUnpBWP)ZxV8Ci(y;0jfeGJ%;av znO*)kAumkNU^l?pInU4FWJCY4Rc}|~?|gLuTi&_2RqmiXe~pYgMw5<+2Tm0yn)86= z^MMOkGug|9uRC=_L&YqaUCYhn5FcM|2Tapf->x+6Zwxm1KRM9-q^f%>;+si1&nq7p zcZ{VR)?`blQ$e}Csh9%X)HR)5IoT8$oG7BXq-pl=KI*=oaT;AQuat1;_Our&&%&7~ zsZJ#8Y<0}3Sb*j~swg0;hy~A3B+|E)8z2UZoloRnIbo91o1r)%~zB!1m zP;AW|k2;X6dhNtC&kNyuVSF1RIk@WfLk(Zq z_EO9Fd!8Re1kZ*z+Vy^ZrQ8)hv2uR+o4$|@hCgz`s=x`6kVh&If@-W!xDRJz}i=IbxT* s*SK`&_nPky&$>K!_(XnsKRCdD0C{?~QMf)lr~m)}07*qoM6N<$g83V5O8@`> literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-close.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-close.png new file mode 100644 index 0000000000000000000000000000000000000000..3f05d50b601f60721c19b95598be16316fa52a81 GIT binary patch literal 819 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 IM6N<$f(<&3R{#J2 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-add_32.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-add_32.png new file mode 100644 index 0000000000000000000000000000000000000000..230cb1bff7d3c0335db8037d29c4823552b58c8a GIT binary patch literal 2031 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 pb|IMU5(n6(#!jx?g|FV;{U14<2E(Rcp$~;p zydjztgQ%d0(iYJ^c!QFNn6yYW)`})H8lsYrrn#JC%w=YpOy-uEbJ_d**79NRv(K5^ zg9ze*!#R6>-`?xL*INJoS|9vBd=8z{|GCctht2_DnueeKdFo*=dPGIbB8q7GRaHb3 zRq!IHvdAv^y5dDqTG#11h-UYt_B(<;{@o{coB#-$0KC^Ds#31Sii#q%9H^}PaG$M7 zJD8<5vTFemp%~e+7x@jaeh~mwE!Se@seS!4oI;irCH=4YzNVebuDPwX-m>M_z?wq9 zGe0>`F|zBL`*Q#yDbj{h;zYq(R29@La+ZTx;#^UJARN_ zE)=kq$?;K)v00fYh7^dQ6^-^Hvexj&H{M|H-n}^I@-+oigs5u}C3POET?K%&;^v&k z*vw_~l}+=B?W7sqgW)2LKJ8;Vm58w z#Q69)s><;2W*Tvlr?N@aWdOVg+TtEbk|2S$rQQ(7G2`Q71Yt-aicnQ%XJ^^4aU*?w zeOc|qcoBw%hN#tQs8)~;PkJ!v4$gVFq+cHLOSf@X230TeyI zMtRrJ5H4w;KEWk*#7jzA1s^-SOHfQ!=z@q{g#}p+Sn-S%A0iA4#-s(-XpGTU7|jY+ zh~t>6S4Zg_-bJ-%i0Sz|1Vih%x*)9S-AE8bd1Rf3`^A9`P+^q_WZK@$mBAAjL+k`F zc<)dZM5Gld6)=Xz%uS{$Csvc~5{a;xQl^_V%vSkZbDu2a$VPNA%wr<_ZwQJY-;QQ9o+g}FY<>M1r+oEX7 zG_!I9WJ!UTwvCf_rt`ON)BQfskFlDr%aSAddpcrD+PC}jw?566vKeYc}K%; z=RNmWtT8yB@XF;EnW&DktLGE+G6aBgj_&SmcJJOz7=|nP&wL1~!Ro!BTKD|w#3aSg zGBRAEk-+K8mOs5+<+1IKiLsm9o_>c(8RxZymw002X?AaYjLyzA^p*R8fYk~>)u6)a z-Ov~~a`FzfhO*<`CBnckT|dpba?GXi8h6jmVdpQfU>4{u^@RaJNUz;uX26%FJvP??tB>o+V!Rxfp35QUY>cr(p|56HuMy@e{+c_ zuy|D#>Yl`V9vps{4c(jYDyXIm5R||KJhF8kuU~kTORjdIg%GGzO z)MCe*mDllE6Y(lIpD@@v%+7lr<=ES=GBG{J2JO zzrfcovt*Z`!bgTkhvfRd4hA^GCTg-C)3eg*E0u zBy^|-t)tqaqn#pw$(-xQbD93!_utwA=IEw!amP@(K;q%@%_`&5@$csD`cM7#n-9z` z)s**ttM{l%_)#zZX5wp~IlI4p>_0u6K5^g>hYx%b^Sy&7IkTpBi!t)FDi4WJPrSTl z6Z_IHzcw=c`2K%zc!(18f#sw@@&xTL1t6 M07*qoM6N<$f}L=#X8-^I literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-close.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-close.png new file mode 100644 index 0000000000000000000000000000000000000000..90c75ed270ee1c6eb6326b30873cb090ac666970 GIT binary patch literal 877 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 Ef}6mhK>z>% literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete.png new file mode 100644 index 0000000000000000000000000000000000000000..744f6d8ab2d9556608f24e0876b1e1f4c0f24475 GIT binary patch literal 861 zcmV-j1ETziP)>Du{vzBBG$HxT<85X(U>t z>7o!Zq6npnE+S}=E?i_++_`aK69XX{YcrE3nNFsYj(vIaX5PGa-@PtM5VfKQzU4Xm z_yoYlnW?08Ao-G=ZXXk-F`%KM8vfuC4+x(rX9b8A-*k7VCzPo+pC5-cq(iBhS=K4SBO ziPt)w=)00~x8ZgPLWyqrASKbrD5XM`;Kf%kEQ{skWs1e(m1Ht`+I8KQ5CY3g#K+?G z3hZpc-X7X-f*(K_B7XXT^s%R?{$3;OJc#Fc*tR_phT*4OU0u&bQKT&*IbhZu=l;5goX&>Uo&v0=D9Rv_csO_TT z2Z%z60wO6%r_*9^a1ekX2+&%WE$KLy{YQ?SPnNgPJGUSR?)@MLP*0!4T`!^@J&x8I zr4#^4DH@FiQp$6dzjJ%O8p`}b*`b5>Zz~u#*U@$yoqdM-^+MFlo-~74oaJlR5JI4o z+P_?>RGJq6zq~v;WZKrH)X<6kL|fcYTHtI|STIk}{%rppS^PfXHT{@~sEliyyN%3he8n`3fv@~;86qer}V z@y17;?dF-oJxA~mxJ`-Mh_Fpar);WD$0qO(8NhI4_`=by*xBPf?U)9*4N1dS#4N!| z!DIDiedf!2Z|<$xRqlt8j2Wjh4<`U{ya=}$VH&VrZc?uKGv7@2pM7(7m9O6KyKlf! znoa&~C@*Z(2|7<*pyS)tOR6+~dbX4PkV_y5TNV(jy^xQx{6G20xM nk*+xn`AIC~DhZ+gO9uD@F%5p};2yIa00000NkvXXu0mjfjRKrU literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete_32.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9ace2f1e61efb775f69d3fec1a2a878c81d0d8fd GIT binary patch literal 2064 zcmV+r2=DiaP)ph_qzZIPfYc|es~R8b1*18EAj zg56Re(56j5F-Zg{B^8w_f>iNP^?{eFC`G80h_pdgV~9Tjj^o&g6K~kHv%B}+bEXfw z-q;Cg8#RnHI(wv*{xkoX|D3r($qqjMBpaXD&g9d5F&p@Na)<3-T65rXpnSJ~ArGQP&xgVTM3KF0*$#IDC_ z>3NY8zkIqy(CvcU>(^G+#p-MDD^iH(;ewDTJ4=wxIF~DoBl1d9sQt3-7ty|b`>s>f z_Y;XkTT4p|$z&1$RVA0pF*G!E#Q^++Pd-FT&x?#b*Sk(!bil7jb)}kDl5D8M*boXi zumPkz^t$EPrsXC#ab|V?^y!`B65a6EUC%u=sQS0YhKAPl>(?`%^}Nr`&GDbi-?;rX z#-I90i$)yqYbv^GI$QBwfHyXXd^Q6?08t1|Q8CcCimK*TVl|ay28SQ6zYu+?^15W} z`t|E^&Y`LRIOh-%CMG6u&RscxlTU1kIqPrtE8|@?Yu6A9X7NrALGA)rTl6S`sCb&; zf5G$=iLTqJZe4A{!I4`#sw&YE<@4aG%HhL@Id|?HB4V!;fN|Yy`ty+%f0=)4B z;89d|EuCU5a(V*!@b4t*tEpI0Oa0g=8U|lh(r+7;S&>uYuyUN#suko94^TKYfi^Xln=hZwA>i-{0$;!x%$*dpp(D)n#?~ zL{So>C7MeV#}h~_er4@gE&ex`0~Zw~S11(2R4wlyH)jaWp-Y$HoDyZS*si6Ez!&hbD zLT7hSF$-8xFYIapcZ9K|kzUJ4}nH|{|zs{qL7^ArjNf*>FW0>UsX-}CuAV`F2Cj*bp_p0}Z| zuP-YAhwlA~UzezV*~DXy)ZMa9Dpxcj=`)y#Pm%OlB%jB{6KH({y5>e~MKzg^N6CJA zBC_|~=Z9Ul0C4KmDUKaGwkX?6df||BZjUkMk9~c8`5ilUAP4Wfla24Z!|=DiRb?gE zEyg@hv1(;w1TPs^Kca(vU>u|nkT_M_lY67jqIij*hG6c~es5q55t zP-0{{HZan*k#}e6h@A4}#)+f(sSi7?(}FRkv%9-{w7n=M)r_W$fP9{JTn zY<=bEGmSH!Y+I8(&MMB~MFniCnnL4ha;rNySKG{7KB5p<29D2?k35>?$a@WP@&}K1 zcMt8|yO%9nw(!4LIe_l{qx3&=1Ks;apHZjVk_p3YH`Nl48B~k&NCdKTA#?c%0gS+0 zpnN!zA&gK9zdo?F{YkFE%;n&2TPiNxv9^Y|(TlI2vt(xjW^+Yw1Q4MzZfIJXL{Smv z3|DEU=QkslfE#YRu?7(qXP&dn6)Z-IcR`5zh9jdHPMpaT^USla_jdmDft^RMDgXiK z`OU~yhd!T*8#c7pBBjF2KW^EaWj0>~rvxqnM@BNt%vwbC+1GnJw|)PGkNEx8_Nxov z@mG(p5w(MHUy`@4ttIA58CV1|7mArnX@mkK;)X*XonHk0z|Nz*-rLDlmjJcj3#}&G zTdIi17H`g(3&qS!zaRWU}WihGC@Gymss=9+^S1Bm2+2n-yb zEw5DbmP{C`lOFFLO@ATa#U?boi}Jzg^C5>m{)~L+@IApZ!c;ooFGps`TyS3qczF&y z{PI-HMCaeLj$0$^NW?q}kt2#6VkGaZ{``%;&Ry3U9Kif&?=Zi8bb07P?f~~yW6bXg uq5X$CJt)RJg)<#*^mXp~?v85@4)AXPTKcU{zH-h00000sX6~euOftF55VdHTXlO_Lk$|L{MNsHppk|>Ku?ta&7&9o+ zjcv)I=oEFNu7n5*Md-?nS*c*eP-BB33!$1AGmR~2$Ru;`bmrdseJ*SVu@!ycz=6Z_ zp7$J?dlD%O?;k4M_t2qO2iyMccZ)+un|s_)rBZP{&pVb(CXX9q23oDwm3qDY;MCOA z6#(TOysI?$`1Jhe7u5Mi&vRd8@0s|Rzsd8wmrJG6hr`3e17l-j^!4>gqtWQhwbk|B zYa8G8zVOr&L~@nJ=GqIBO)v;EU>z|`gJy&P0h^A6hs8QuaK9X zdvjvl-$|wOw43|mQ?rmH5~Zv-+B&HWN~f_l zHeZ6RR;vIQV~FDzfMT&|GnvdrCX;!3baXWDx^6*Ztwuxvpakq+{p92%)oS$>V+__> zj4@=hSs57_0ifM(W3AoPD91`CuVCXSeD$MC71!<@NT>@(ii3llQ;ad4R6!6BMbSwu zNg@vPLY1(z?ne$afQTrQvGA5uy=H$E<4EeWk~97VHjI6S0T-pcncHXfcU zm&<1>l?t~Q5VakYAWET}BsOfZ(}>t@#wbUT?b3v*cO77Qdiqv_#qCFX*1!3l+Wa}T zE}my6Xc2@$QVYw!`mFrcIPppO(A2Z1SGb+jkGbP71${@j`;iZ5wg>nreF`lxzic+y z+`fL|+*|j*{mkhVK7F%vdjqQyxjza=dFSLY=9?2FrN#1^&!x*j2mb6|U;wq-Xur3% z=aC&hgU%gf{c6C**7g4d1IUZ-|C|b=Xu?gquZ3Z>z2k@PCPU_M#r_uz@F$KpMqy>w RHje-R002ovPDHLkV1mZCkk9}C literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-edit_32.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-edit_32.png new file mode 100644 index 0000000000000000000000000000000000000000..55b7db8e2b41a1317896e5dc22d9da30d29e4db4 GIT binary patch literal 1940 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 LNkvXXu0mjfvNydd literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8164da4c66d9c45e3ccc943861e815db43ea55 GIT binary patch literal 958 zcmV;v13~-od4g4x%tTV`Xyh! zOFqFm2!%pk(=?wn4C6H^WqBr(i6s(=y4Kd#7=X5(fN7d7wY9aOKp=qE>t$eIKtv*u z8@vXfltKu>Qsj!iujeiQ-OZiL-h%QJfTn4oKp=n+g8u$~CMPG)27^IQdwYAS5aODE z5Q4dhKewJfcJRyD@MziC;2kScsRvy`TvSS-l)|=cQmGWWu0Nm6W{;Vs+2lBma$UD_ z;p^jj3^zMAZrf2DkHJN0EuKc9k zeyk)|=>Uya4w+x1Pb@SBa|>&C-{!jc_Irq49bzSXVaN97&xZiCakVp5m+bBc6h8Xw zx99#TnuuCdmUw8a(<$58#8lif}qc>z$Q<0SA3^*a!n3r2qf`07*qoM6N<$f-$YVe*gdg literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share_32.png b/src/main/java/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share_32.png new file mode 100644 index 0000000000000000000000000000000000000000..04b84b141d80f9f85bed1a81c644d447b5c2f6fe GIT binary patch literal 2341 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/Dialog.css b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/Dialog.css new file mode 100644 index 0000000..d44d232 --- /dev/null +++ b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/Dialog.css @@ -0,0 +1,3 @@ +@CHARSET "UTF-8"; + + diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/accept.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..89c8129a490b329f3165f32fa0781701aab417ea GIT binary patch literal 781 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 KMNUMnLSTYm0R)}^ literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/arrow-refresh_32.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/arrow-refresh_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f3521ea5e0d148384d82c3cba4376972090af7f6 GIT binary patch literal 1182 zcmV;P1Y!G$P)wK~z|UwU%8>TXh)5pK}h{F>r;#a2qh7O*95Kj84sVVF)0>j3^p4 z+l*P3Eir0LTz2J!<8Y-HvXPiwPGd;)!W+UC21FUogb~TIiJNG@z%fz>w6Ox~fS&j9 zq93%-(+`60&1wHVeSgpYJ@0v+Kd?n{?7O!1&HPW@DgiX8zuo<6&LXxPhL`+uFTI{=s0ET(5DM0+0|3RW)->y1X^LMNzi6%mh zaL+wATz6f7fsXz&!@8M(JOGF`TtT(1IvGylVK{`T*(vxJ{dn;3!CC`~#6L%NN;DmK zIVU&(CT!i#wJy1XDI_V6P48>^{5k7tSZfwB&QVyQ zC<>l*Jdrdd@Bi(KG`L7#Ry~jix0l;7Ffw3j$%#WsRW;N-y&q*e%i;qrY#10C`VpZ} zC>&PRnv4}#50B4^H1K>&K1xeUVXv~ovdxk-UA-PRLZJ{K{CfP0@q1}2U%2{A+r%9-)=6PIEb&5ZB7;vIH0S1EyDpq>PZt;Go^ zAoH_9IBZ~fIfVIuAKu9++`M%Q{&_zr{8ym7HGcm0?nF+;x1hQ6C7r_dno0*8d+h*- zD_8r?EqUVsHY^6e(kS|kXxS6Pv;wj44E{B2Z`!N)|MAz8fX!-y)9XwJUlI|okYkES zS6I_N__g!)x4zN&#Z>vT_JW4b4(TFncU0No^t$l#*FO))9Z>% wu`P<6%;?&uqdEm0*?7VK8i&pv(6=hre}=nUJq4NLMgRZ+07*qoM6N<$f|YC_5&!@I literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/close-red.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/close-red.png new file mode 100644 index 0000000000000000000000000000000000000000..978f945b8468139d545f89624e17f62f2f20629c GIT binary patch literal 693 zcmV;m0!safP)U<^{h;=59XSA+U1e>a-noAIA@jsc5i;D&|qOGH8Ru+6e~sqTM*vw>j|} zjnjjf+fSMTtC@7t_*Sm_@cxeIriU$pluJ+z1&F%P-i7Z((5VqBZ{F3EZAMa=yPgHG zy`?X<^!Ii|f;zScYWf1!nadD~LDWUfUc)*+hrO|mQ}u}U_jH=Ne+j?=5Mw6YL>E?R z1u@$pdS43b+!aIw)xQTR_#ofL{d5rcy)x@Z7{M zd_wIW#!k;eYdg}}jbE)HT7PH~pv}@&{_~;e;BF%8WmLT9H@4B(>3LLlAF3;XpBiE_ z{~3%~Y{r;7doqb~a(%~+bhx!uoWLN(0#f!u?ACTvR|4a-&=?x$+w)g7-#8-^*=!i& z=%c5lpwXD|Uc8ceTLK-66DS1|-Vi&2NewfObznTc%H+wscpPfeaw77K0r zhCAB^Q#kR?&|#&<=E@f~KISVT%uYO6+WE>&k*VVeA#w@D6v9}T0n5Omg?=!x_{{rz b=fCO)OBE^E@HZAAg2s45|fh^mx` zl$fMdUs^>WjoL_Us-RL3rH~4wr0RY>C=8Vps^L=NXf1SMt{?~`hccPg|>K8{htFlu>wga_5-T3J~ zpwHkhqVnh3eFy#_BKBVqFf&QLex$|V2u5DxdoR#nd8WD^pJ zfEsT26Xeb<$P6R-9C*bR#GrH$T3LfFtpVq-z%zXP2BWv{0*o5=#6yRUU6@m#^YD+G z9Q++)S)#s%vQ-TLxS>H@>IRa_V5*=B-j9Ede^-x{l%h@RvFdsN?tR=vt|tXTI)LWJ z!^dw<<+*9q199G;#Otz>$|aOF)`KZ7b(2U}JCe^n5RO;K+{3l~4e4kDRmvLciB&8H zugjv|PTHq#dYVAjfmd40>lTSdDO=kVP8jGUlI{i!n?O4sIusDb%=Aw&>)d?PYD0|i%`EB+4*fGxoKwj zv)@CS)`t?&1-K9Y3B8?&b1ZCF0jfCDqf@IeA<(n$0(jhHA_J~ky|&xEAsSS zSg~q6H4fSJJhEA>eXkXKK%!fT+XH_TnUssdCI3!a)mKp!=)#40N$ z+N}^c`&TRW)~}~aIEUAneS#45@$ub9`z3e%$#0zRk%AsUZ^ z8D#HGOS@gW41q^>@0|p?X&Igojw!t|3zd)M~+Su?UzVqxqt=+qFyJ zJ+kMedBgD@GWWxFjzz<&&Ln{Mp@>;nfmvG3OlN<8n-#-V0m01B!gZ&NDH-tnri#zz zK@D@!SzE2>?#Ca8`_8M#m%cI`t_me_P(!nMOchh@D-s~EKD^>HSun*)O6P_b08=C) zFYHG)Z<{>lJz7x(rUduzhgJ02Q!Jo*!BiO;NP`(#RyikJ-+Ti-@p`eucMl@Xk4*-+ zZY7v8l1hgaFg;%+;BD*=s3+Ikk9kGQDzRt@W`;CBK5MIK>v{aIjulC`$9IL9NR(mq zD>1L+`v<}<@MC9-1XiCo)n;Bhf=rHVXAdCwx>XPa=x>f=|Gr)XF9gmmpU405wFwEk z{x1IbD_G$18y^9LY-bNaCWooEuRd|At-y^G4t@r_ykY%-V9$;X4O7~%0xMkvKEU0+ zgq5$w;E(+f%Vf~x7qGP(u(5zUSKh_O#z5`Gs%z~X1@5$t zGLVnHwfhpr)_C=Ds`2%9M7lo$4clnORx2DESP-CVKaYNKD*%J7SIMW+AY5Mk zyEBgnOzab<^^<@FUcZ5AI^UmS=vpZ18`cu6-Gs#w4~DB^@rC#=@0frOz1L2@Zva%& z5#zb3@S+M7#)o^Jdeq<@AQrD(PUV)3xM(z7PSbtJtzO)nLCD?@;juVcUV&COU@IEH zMX<4e!7FX#Q?~#{5!tck_kS$f7tZ=p`(XEz+dxhuER7@*EME68r40`u?!lWBm%1Y0# z1*VBSxnq+!`U<^{h;=59XSA+U1e>a-noAIA@jsc5i;D&|qOGH8Ru+6e~sqTM*vw>j|} zjnjjf+fSMTtC@7t_*Sm_@cxeIriU$pluJ+z1&F%P-i7Z((5VqBZ{F3EZAMa=yPgHG zy`?X<^!Ii|f;zScYWf1!nadD~LDWUfUc)*+hrO|mQ}u}U_jH=Ne+j?=5Mw6YL>E?R z1u@$pdS43b+!aIw)xQTR_#ofL{d5rcy)x@Z7{M zd_wIW#!k;eYdg}}jbE)HT7PH~pv}@&{_~;e;BF%8WmLT9H@4B(>3LLlAF3;XpBiE_ z{~3%~Y{r;7doqb~a(%~+bhx!uoWLN(0#f!u?ACTvR|4a-&=?x$+w)g7-#8-^*=!i& z=%c5lpwXD|Uc8ceTLK-66DS1|-Vi&2NewfObznTc%H+wscpPfeaw77K0r zhCAB^Q#kR?&|#&<=E@f~KISVT%uYO6+WE>&k*VVeA#w@D6v9}T0n5Omg?=!x_{{rz b=fCO)OBE^E@HZAAg2s45|fh^mx` zl$fMdUs^>WjoL_Us-RL3rH~4wr0RY>C=8Vps^L=NXf1SMt{?~`hccPg|>K8{htFlu>wga_5-T3J~ zpwHkhqVnh3eFy#_BKBVqFf&QLex$|V2u5DxdoR#nd8WD^pJ zfEsT26Xeb<$P6R-9C*bR#GrH$T3LfFtpVq-z%zXP2BWv{0*o5=#6yRUU6@m#^YD+G z9Q++)S)#s%vQ-TLxS>H@>IRa_V5*=B-j9Ede^-x{l%h@RvFdsN?tR=vt|tXTI)LWJ z!^dw<<+*9q199G;#Otz>$|aOF)`KZ7b(2U}JCe^n5RO;K+{3l~4e4kDRmvLciB&8H zugjv|PTHq#dYVAjfmd40>lTSdDO=kVP8jGUlI{i!n?O4sIusDb%=Aw&>)d?PYD0|i%`EB+4*fGxoKwj zv)@CS)`t?&1-K9Y3B8?&b1ZCF0jfCDqf@IeA<(n$0(jhHA_J~ky|&xEAsSS zSg~q6H4fSJJhEA>eXkXKK%!fT+XH_TnUssdCI3!a)mKp!=)#40N$ z+N}^c`&TRW)~}~aIEUAneS#45@$ub9`z3e%$#0zRk%AsUZ^ z8D#HGOS@gW41q^>@0|p?X&Igojw!t|3zd)M~+Su?UzVqxqt=+qFyJ zJ+kMedBgD@GWWxFjzz<&&Ln{Mp@>;nfmvG3OlN<8n-#-V0m01B!gZ&NDH-tnri#zz zK@D@!SzE2>?#Ca8`_8M#m%cI`t_me_P(!nMOchh@D-s~EKD^>HSun*)O6P_b08=C) zFYHG)Z<{>lJz7x(rUduzhgJ02Q!Jo*!BiO;NP`(#RyikJ-+Ti-@p`eucMl@Xk4*-+ zZY7v8l1hgaFg;%+;BD*=s3+Ikk9kGQDzRt@W`;CBK5MIK>v{aIjulC`$9IL9NR(mq zD>1L+`v<}<@MC9-1XiCo)n;Bhf=rHVXAdCwx>XPa=x>f=|Gr)XF9gmmpU405wFwEk z{x1IbD_G$18y^9LY-bNaCWooEuRd|At-y^G4t@r_ykY%-V9$;X4O7~%0xMkvKEU0+ zgq5$w;E(+f%Vf~x7qGP(u(5zUSKh_O#z5`Gs%z~X1@5$t zGLVnHwfhpr)_C=Ds`2%9M7lo$4clnORx2DESP-CVKaYNKD*%J7SIMW+AY5Mk zyEBgnOzab<^^<@FUcZ5AI^UmS=vpZ18`cu6-Gs#w4~DB^@rC#=@0frOz1L2@Zva%& z5#zb3@S+M7#)o^Jdeq<@AQrD(PUV)3xM(z7PSbtJtzO)nLCD?@;juVcUV&COU@IEH zMX<4e!7FX#Q?~#{5!tck_kS$f7tZ=p`(XEz+dxhuER7@*EME68r40`u?!lWBm%1Y0# z1*VBSxnq+!`li^|sBsmue{0{Byw ztBuLFXhX1BSB%zJAKnmJbqOcqEqc=*0k8m!)&owW6>DX&uJ~V0eSC|PXvK&O0)zmJ zNN*?-K`j+P1nb7*|Bg&wIgMKWjva|$M0&OZFoC~SRo5T72%s>&Uvah#FsBQ}{%}JC zwZ4vj{o)SWMx=7r8WV5FUoB!pK2`q!(KF@T5;}gcrswTqL**>W2)yyN z&+}`ZAHq*|))o8demp0}dUn1jo_e%nk>)O(9kLzgS>ogg)u_u@3$v)7KPtAPtpwdi z@tR_|FJBp5@`lqB&!=iud3I>voU(Y@e7Livxg$j=)>7%PP^7f@m5ndCf-zi9PtMe? zauqUoDq(0CK{1G-2f)A_Fl`~@>FF2lZq1(JFFZax1!6p-|`vdZbV&P)NiOEX0@qUO)&!G*W}c zKfo&!qmjrVNI;{B@gMMpD-w{D5ET-*K}?JSN)4J8Ii=@rSz72}58ZzAzFvH7+0sJ0 z;GI4ex)pvjVty#!d*F9t zjQ%SCs%m0i9cfTFf>Jk2-WG!%D%<;M<4hn=1&AFzSmOnPCknw*hZklhC}34R}d*J1~Wrw zs-%1SNVaz&BclLugEUke{QRd`19TicxW%ZP2STCZ0_N8(!vq2#iXFUO}PKzs9y<~V`jL2T2{n3g6GA-|@IP~m)VvM}iMgg&|C+fFT%(fGQ-1CQWMhe?uY3CDR~^+Ti3p&sEvI5srW;l1!r_s7UvC*`owJ?Z#-W zOC$;AMbK~_CNVV8aBly*vuZe|X-p|B1{J*FVZV8yb4mh;Tv8E6dgGvqtaARYqcQKLM4CQvjTfowXP{QHEM>`{SM*G@w%e0BVn)YE*TXy+nfktABuVxXM~w*^=DNSG|C& z-2l$f|63DYGJ&eQy!`m7GufV#01T+-7Ez^f42DjQN0Rp)p|6XH>*8&uWUtL z+z7zH^=8uDy&w_~D0{M3Kjt}Ax8B;dS>XZ@ij*&+sD2$b81(;=ctrQ^h>FVl5Fc>u;nH$od$@b+OYEUx!GSz$JO%2_N5kc0@w%;$cqv!FC|*Oh`_wL z1R@atTq=c2BuMqdN%i#Nk|`esei3WlS#$ba+mk$IelY>__v_ns8{r6s)ic$P{i@lh zJ+$Kc^QRx*^PB-Df$Z42-dKH2VGB^nqo-OI&~1#lC}PgmoxN~vCgcA#u73bYx+8E} Sl2Y9O0000=xo?f(~-YcTw9|5aM)Z|U8$Rm_~b3th~?T(}E!$QfojiL*wWo{Q59WBcHk zPdh*P_4|B~kuY<<4F4d3B%Z(hfubf=PPiB+ZcKFQiU+*~5oRJkQ~ z;ew-+hVHcvAToplNw|ari9oM1q!ePa_yEo>40A_7Ah;uWL4em!m!a5?>d+Ji0P-k` zL@mHf$i>U|Lxhk#+&Cq1AX4_%XXh~w;2K5_M0f6HORP&`$xAFy%^ZLliN<{V(==kq zF;9U2luMjmEQ!WwBgEmGM~h6e`kRMwZzBY=r~xrB!vmafQ7Y)_!k5df?6tA zSoqQzTR}9$e;`N-8?90V5i|->>}=vkv@o5Gd3!AG&g|@cc`D{U-N((_x7j=A%*>hD zmGMhY&r)z7;6dmhk%pU-?pMCvYkykNztUcwJ2#_S3JUN2D{uf1hW6;>!cF^q;_?#$ zz}&S{2qZ`%1Y%@p5P_8)l5UQ;4+sPVz`y`d7J`8S*a*Nzhv^B#j}Gzj-B&EFtYK+o zP5HH#=g-fS%EW^+0w{OoU(Iu$M1VpBg;a#9_hAG>K(t3p9BUzvc=l!uB503JK0;~X zjo^=8eFsU54DGB)L^40MUzD8pO?kZt>AQ zAtdqn2v@cvL5-qr(EOKh11+?ZdkNLb^c^@M8f z$Z6@;!fS7n*s;6iBAsGuRiOFN6f_B*zG-^Vc$PX*4Jg3i-c|(im63?_0{8oSf&1#P zDoEn+UN#GEB6N`|bYf-LPjKYbRz-k$3i=7Iwtau-Ndu1Tf%*fU%5ak^ z&@xo;+ZT?a$#Lb*YinA18WQd}&dZR!?ELl6NZJi4E_U6BQrN38yLfR+z}HVdPzunN ztql+GRp3uU^dkcCET}nHDx4RG?^F|q&oo1zVgXXJ8&PT9p6t3r0KoQbgN+c-)TYz0 zeik@zPh#=?!!6-z1Wkm@?bj})DwO6mkclwee!Fi($B&fRg(0bUYvaHk-_WmtA&u$06+W>a1l=Z1PCaN#0$9Ug7g~-`rQ^qx~m@y2OU8A z#zh~=7n#Z$Z*fx-GOtDf07cgx0suCz_W(2~Y(0tf@FX@P6EPuM_dgn$vj9LucO)%W zw%HgMW>=#oL>nZ>M&NEf08>)#)k<{$fCT_r>rPi=BV=hFh6WS^qqze>C6Ek}o{M5% za|@JGowu0t{&hgNzySHZxy@LTNh);YzZ2zSp_ zl$^T&Dnc|NLb&RD_!4>pt@VHdP)ZGER%5ZmWEe$lryR&y;2u^3cOkO4#6c%-(EY6a{600000NkvXXu0mjfxS2AI literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/information.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/information.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2adeaeb60296fe841f3e988d059c5bc4e6bb03 GIT binary patch literal 695 zcmV;o0!aOdP)N@vp2x#!*%={Kmf>MURG z^PGDQ2mZ6H@xj_N4OuSZtTq-KfVm@ar-3@B(SHqzUcX80m z%=AeBMEicz^tPWT9Y5kqo67nlD{fB^tUL9vB7KVMW>s09Wq{XRF?#xcp+)eerBayd z#p!Tz`QAGd8ywzJe{A(FTd?-Toh+v#we!%X1@4}Bf>$5=(IU+Ery*L?`r$hw!qVV$ z0yEs4t&PM6#RMOmDD6!F(87Um$mcd#HmpV1zABHMYw{5hwAM7XMHw1O5DsN{Tx#eb zKneg#Z7d4BuY`xhY=~a1zM?je&1AkW*GtYuA9&P z^#wMpMTmZjlbtaItyIVs7^MI+1{M+CL}LIpthGi&NHU`WQIW2mI6il3vYXa`;qQ); zaF%x}pL^pNQ60$<5~}WbYc~Zs9veQoZ7D&2IshkkudshnvTzoSE!`NUY5|-8%E*OB zP4BChFABJq1T%Tj_J!j$&&G7tB7_TP<8nG^Xnq&7l;b>r1K`t(+XI2c%1ZL_c_wr5#xpZ8Ftp?0mCEJ`rySmOd9%yuxVEx*j%V4T zTynC#0DSt|$McsTdEE5AFQN3Fr!`d*PkFS8wqKf_YN>-*lmnrWR}qY<9oDW3P1pDJ dj%WU>{s4a>U~;FXK~z|U?U!F{TXz-5zrX8SC$8f-sS}d8ZkD8FO`}#_TUuzv+HMk{ zso9XWqOvzM0TSAf%F7TERBTg0lMw7-f)|7YLa3z+s+xi z8asdN+4aBc^F2J=B#Y-dSyA8MyxiaY{mwnV&pE$8=Um`_UCgIdR8@2O?OUHK3Hy~e zEW!>_!z3ZXIF<1-bxSozGP0C)O!uBYFJ{!$`8+Gd})Y%pkK+!29R}>^tMZ_2K z$Q8;EAxOPkM)}x}pWHQZ*8l^5OB{5d10-8K7SPdbqcz}#0Z{3ZREjI(RIARD3X##l%b+v*`jdxgw~9zs^QW zV?DatgXj(i;V~8*5e$vZ;^u4)Buk`x`KM3qdt*(2f#I1Rr-XM%wzdRpYzlc{3@|Zs z8&}>>AeAdZNl?{&l2CQ`fs$zSdvTyIjLne^Pz6S!a~PdULCB=z$iA1pvwvdcd{#v; zRgF_Jr%1L2d>(8Hd7)5TiO%7|KR(1qd8gKjElWCEz`1wE@z&p`piu1k>;{BGK9JgK z3{F9{!fDUSmu+8p`fH>d_gKLF;d*#1gLlUla6OiSx(f`20;<^7*^HQJU`n@=I=>9wET)7cPbb1c!Y=fPfLs+~sURW80Wq?0iytP-Ty|zcu z8t{TtjC`=LX2{o)H?K~BBzhx3tgo{n)ZTBuba7V|0IB^X(d4sX0L13<$P~&o4WGIA zZ=`OQkjfTuYViG;mRHFam^ zGf)7H>%E|Rb%&S6RxUvYNqB9yt5A|v0q#b!IrsQB`0T~J!8-xCiN(EG*G^>ThNtcl zL!pZ04}g8#mP7Gk`6T5EMW(mR_nIE>r;!dX}PyFXW)Ah_v|7 zP;XZmdt^@pKl|nvaAa?1MgPms9L8h&d#d!C0`=IusTmZ-d$D;46;4^sRRJ9D-*Qz{ z#&QM0WFiL(2D`hPstg|7-ci%jhj(>W^*#7N7c5w~7ENLyQv_8Y^5MZ9?eN+Lq+%*@8&io466rj$xzb`u=0T{@ zhpx5&?(1lT$5<#jf>#E|mnJVsS-*7t#jjS?g*A)P@Bez_AW62@I_W&zEp8Cb$9w?4b^f1YdLN|pAd6U$*2rnpb?(7Rk gM%J46|FR_i0iOb-U2dns ~NwO_yO%;SvZ5MdNYf|QNy-I*%yJaj+uTdt+qbZ z4E`Fzb8m}I&!N8OKmWEcCmrLs^Hs&3i)mt@hQVdcqghkaBs*D}tG_lKew4?rTjzIZ z9tSone1TS+TR7tu^CunG)Y7Jg#sw#)sG9C!c0I%LEzP)9;hqRf&)s$D8d5Db{TBs% zgl0~5QQ91luq4Q9tJgt4QLbaxZvAaKeCM9!oy85dg4k>TdBSVqjHub_PG=PO&J-rx z7oYTuF+kH|tG-UK+EkUhDjYx?zW?T|lx>+aOQm zzL$v$zBLo4Cj=G&tw{H}dW?tlTkS)SY4<#NS92z*EY-MMB6Ftp`R=*=*Ev7cS+X%W zMCur^FdlokL}1Y+&aasU2J4#EOuNlnb9CmqgLCGTSY!1BD42pkHY^XidQ5=>YQx%` z*%Pm9D!CkBu&tMWm(%-ejACVWGS2RX5=QOJ$1*tr7F}F+*-OA+Ly&Isg|AEuUYicA z#%IG6kPXkHt{zk2M6zK@Vu^4Q(1zE$?yY6M!^&jQ+2^E?!p7{g*|X6}vuRC3p@jk0 W117c83?+LXEZI4G$p&LV25SKE>nb+@ literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/magnifier.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/magnifier.png new file mode 100644 index 0000000000000000000000000000000000000000..13024cda5cd8129ca34d7a802a3793e9c697a236 GIT binary patch literal 548 zcmV+<0^9wGP)dSB78i#s1-B0E7AWXnpouSZk*-aGNQ#gM=@2PYW15oYHc9U}&vA$qnioDvOBtF6f*2U``*3VnFH~u?z1#CQ&!xKo3qUI#MM5@B zWoWboC7`6UZh0^n8Ah}`?lnON&}wEhVADJhi~%tQW55`2Jz;Fb!Sf{67f`wrq$?~2 z_|Z*ZZ}F|xLTR1r3y3F+rEM3-hTsVcd|>$uLC3)zo8s@@{?{9)X0%x{1 mH>O2&@^x3P)3e~hy!iH7VuF9j3s6|cF2capXnK-dM_IN!1&tmMT z50ctdkdWYP?wxz@%>T{NIp-eWzi!4>n^SX&CxX%l$x$+Vjlv#MptMNphmguUndSW0 zz(8%=0WMuH9w&8%QXff3LPLCG6a`ZA3VG_iw|l?d7J#WKS*iWSGof&T6dW7KcG&1l zn25!q<9>}OlmjfeHI)21NFo$J?_Sw+YHZ91+X1kjUP$gQei{lNi^86ag=}XGh5$A8 zB_J6$k%&9k-R2@@dT)rD$61YtyC znn1!fkc^uE0Jjw2r-cH-kO;}q@!`GswgIN*6nBE+4O07F&Dh9x+6W1(RYC-zA`dh? zAw|!&X`nl4!7zZuM;>n6Uk9bz&hC|iA09p&v;tr@C-I;(N@|~D13NoyKwFDLKoAOU zC4>OZKy7DV+`e(xG-)dL#t2Kx~B5opP7|#{A%&0Poz}-KJAO(pn7orUSC$pTV zbh}io2@|#nzyJ&wh*<_Y6DD@1ZCC*QEL1SN;DRE07AI4tH#0Ro-tV*m@XT%a z)px(01#v4iACY=`E@K8eB6Cl#9GM*MI1=n!{DwJRM#J2 z?s6VA-vh{*bbWnGh)o-kiRn8dqH$JYKgC9cd#n*@G$xksdOeHhQadX*aPX~TNT$2t z6;?2NHIKmeKxw9{UfLAG{JTW}7$4r7cfIm}7><#eBz2QgSyY+QO%jtKG`8#Em6y|N zKhD(r3g#~7;T2Yp=M#n#l{B#l)69VXHPh-tUy1%mqn9cHF_C!J|l~ zyHQ?S!R*zG2pTaF&thaOH}^#UxTy!)vEhk%zr$Z01vwM=9%ipzM0srmsdN_x29Lsu zIgmKyFNdd}es@~{nh@#w`Y5HDpxS^ax=5zFF!1I(fB;G# literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ee5c2d319c96effac875db3b13e01f6c74abbe GIT binary patch literal 1597 zcmV-D2EzG?P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*z_ z4KE#r2mKZR00q5CL_t(Y$EB5TY~58E$G^|{o%_4({YTpYcXXxKbzQqjJF2|EWvDM^ zi7e4gAfUs_k(KhwcV2(?r5~Tc)Jv&UYG*Q;gyT5O z%$(2XX<}jm|BAdUzbD}|j^5RJUjjn#d)@_FR#`AJ95_fdwQ+mX*2a_XoESb<8u;?p zIv=~ewXKzznXI)Wr9>u^!POAGFLd4*q3Ge>o4=5NBQRTfmr5$fu5jU!3tv}pt~5(k zQ{>&<_lp&=e0wEYVlc>B3nIe!_&Da~=JHa?+y^sY`eZ8J+3q?K%#_Z6m=WlJ`aYh9 zWrNXozK47*$LGsSw54eqZExR!SO5G=YG2pE1R~$}IhV^(Bof)u*VmUF9v=RNQmRQQ zg-|F28KSz~t+7qGSo(=4LD`EI>MNdSdQ%$ol6g;zaQETfc>-y6ZtiU}k)K`!RUB zijg-5@P6ezw8Yy{Q67Bdq27r=N=Yp(Ep};X>E}cQDJA#x^gv34vugZSaZ(Z*8HL}?(&Ck#Owp1#;NC0r#NbB8+x~Aiw>%KSC5KZ8G zVS)1gC1$o1l?iN!r=T?9r@#A=xihuf*}Ls4ynJaHQ&Ur9tp$L!n}eAzXsw?t6bdH> z2L~&())2RSKh*~-pSokyryDzxTPWm&i2x|Akhz$_?NfJN z>+dF8+sZQ+Dx8vk$~NkmmmlpN=0|%};D&(1mbLbu21K=QbHNJJfF}k~J zli)}=Aj?2l)*%S$$qT?v4CFXboL$;{)1v4o0%;5l4PpQO{rGoWDbXXNv)?7gz}8fR zo14O9EC4XdzD3bfaD-q-fIQz|`dk(HvN|@F?mB?~0`)&TCp7qRYk9D1W0W_n3zIgM z0iv>RQ1La01Un8WU($SPzC_G4@Uw#-J+$}mG{(}m{O14Wa@7sgr^ zLQt`yQK@MV5riNV%9>9vlt^nH7)y5@!ZjkSH4m+C3}an91Y;QlLB*;;$=4tv7DAxx z8JwE?yZnJ8)7R>UWQ#iz5eKw7l3>}w3k)1V>ZAq$B1FOhL_~#(;?wgbGMD85F!mwj03g`VbLZaoQK~3j&4E$x3K(NC zK2!Xk%JR=YnxI$wz?^*jY++B!^)BjMiIt*4=As8?JaIhT_4ETr&U~n{e4q~=eCFLc vW4TuwJjl!`WAO$NjcTQ*PCT*A;{V`pJ@Q28{BDrO00000NkvXXu0mjf;EMa8 literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add_32.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-add_32.png new file mode 100644 index 0000000000000000000000000000000000000000..269e9276ecdf3cc3255d516098b8f6d17e60763c GIT binary patch literal 2267 zcmV<12qgE3P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*z_ z4KEDrx839b00>)2L_t(o!?l)sY+Th5hrc;@U*3(^UMF^*IOO5Pv8f#h5Gaq9P$=c4 z7LiIIR79Zyi9{q0G)@I7ttvsF7&j_Xc&HCr_@jkVrK(C>QY0vk6o)ja3~^#Zz}T@J zXC3dZ_kGUvkL#EOLfeRRq@$yIukQVRGjnF{2$S}}AFgH7HQTu2xg|k7mN^%^PE;;X zl?7@wW}T*;b^C4E{=HNxKkqrO_q99ryETvB#!qj5imh9>MpX41&beDv^<1D*RgZq2 zwQJW3ColnM`VGAEO<48ZqM2c@;z!Qub+r|q>S>(+#G?#)OfvZTJgo=7Bu`X>2&o_+iFv1ZMh6AB2d-*qXEp1GaN ze&4XjlkhL5dDR!TOkc_3swNO2Z?jmnRLgWuPb}fA+2?8Z(C)gO{W~_;oG!ZVv1NBT z=U%F-t7~X&ZB;;=a~$2X*(}FK;!^@1J##x>*|xOCbHOKPgl1j1YVNff420>=9gy+j z7)~v!4ir2*szcM|jM>X|PJEvH@n0`|JvA}W608g?Xl-p(RTWj`=mHoR82FC@%tg;H zHbED>Z<-gscqY1rq>6Mxxv+!_y z7{MF|ch1q()unxXeW+^rGX+F#u-;mCLsQKPV!=4?W%g09SwulpxPH;i+|sm`t4?2y zhXI9bDZ~5YJu)vbPtKZuE-w%LNs_tIDWR%LI-Mq&Op51u-&NK6&rE@OTpSBl)izW$ zF`Pe0wwys!K*6b_A<;x-C{9Hn>I3k@IZ;e;IDd$ixvl)8_YHOr?c}1OBP%8M|qf_rRH#f_iIdd2t9VHYBQCnLpkw^sR9L_lfBw($M zP82hEVh{{qIXKZzxY1CS|u7ooICnVRCPR{&g~o+|M1JLGtVJpLX>ThS3dePuk^o&qHJ3E5LMv>BNGSt`JPU! zE#uT82+?31=akX(VH#(D0fA4|{IP9n+f7OhpyvEY?|^ zv&VhNIg6?VRSbq1vDq9-9U_$(r=@N=f;p}a9J?R8L_~*%hA5ZIPX=)8$QQC7>>Av$ z_~M0^lP->Nq%i73o#Ta`rx6Uf(geewt|p(_5;wVj5VMjC6Iaq6bTesVt+ zJ~%ii{r&wt#+Ys1huf0b`m1Y7$%(PACZaXog2WQdl_#WVbD%IhG04co0Lk1T|G;6W ziOynfe4%#rc1hR1U3&Z3Yh-TaJOFaJ9Qk~nVzEf6RH9fcQYaL(R4Pe6pXb1V1Jc*m z*W-EK`I|Ov$_PN{HoWD_7d})GoVM;ui!YOcMkOFtjKD)bH!B$m!1}z zJu)(?d-m)WRUH$N%QtM;(DhmEck|}WY}~l<<9T55PoVcMSkX}*u+CiLT& zbj6aG1U(n>Mr&`7)je zB8mXvpyBPlw0>}?AOU0Ue`aIzrkgf*pOgRrXnVZ(ZdH9a5;A)JviKx?vW&!sXYyr? z03!ICu&Xzv$#hwO`=8m^{DW^j{4P)5v+U#qtb5|U1){b)6p+Zu#<+w6N82fg5z<-T za}giPq~|;Kj%zYg7SxB|w7HvKZ*1nIQy^Ntv0T=Qruu1 zV4UMJV}!cu;3V81yR22R1v?dXR0xNJxA&)f&-wgteg#gHGHHfJ9<)DC^>?jA>auI$BMkPE2*iR{lCDc`oL|E4F#n% z_L@`9DU}`JphwXvrIN!K$vLO@J=@;=$feEiDoxL}H$QUYgQp%2@NbMk51b829B=>t002ovPDHLkV1l{kQV9S6 literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply.png new file mode 100644 index 0000000000000000000000000000000000000000..edf83f0415251dff05555470f00b01bdc59496e2 GIT binary patch literal 819 zcmV-31I+x1P)DW` zK~y-)g_281RACr~-~Zg^sOK;?9xoAHXCO*J5(}XS7f}#xGpJ>kMK>~tC?yBUTI5Kf zLRc+Aj3|PLGAe{xnl@fa>|&YP5H?=s%s5BS%ztSS4k3l#_Tzcp55AXRnF)nLx@B31 zHBGDGoUe3Ucha`)((3B!NdQom6IhmYytueHWSS;)T}L<^CXq-avtL%AC`!mQO%OuR z-QA7R(b3mluh-Mi&`?MSSzaK7fDi(dQY4c}sH%E4olZAdmQ~3Z6Vm^{=H_Mq0OuTx zF#v$y?-zz){4flos-mKzK-cv`vJ^af>noa$`WGc9Ow(*BFE0n@JafsScyMs=r}8iO zOxsA4Mq}$#sb{x85P(D^BvP~RNI4nUaU4)e>*b~J>6;^U8wxxZDA6_*`f}o%*XL!E zg&fqq-G@2b;dH_v6FZXDmHhM>wi2m}NGpRp1Z>nic6uOp}`o=zo8 zlg{~zbO3;zWJt_2MHtoCgL6AT;z-~vv19$lY0p($Cdy%(o?6fUp=0Js1o z0IE#T`xy|Di{~F6fN~DXDO6c!+XK7gXYU^&;U-S@*V?TBpv05x`nO51 zi?Nw^_0KM*>VV-)M|L)@5|8`uBgJWJf34kG*5E_9W(MTgjgKD6_yJ9o&rl|2Y=<^# xsoWRHnid`BOEZG4SMvnr>_}ft?9Sii`wi{9TcG~w2KE2|002ovPDHLkV1nI%YD544 literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply_32.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-apply_32.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea6ae598186401d0758f17862537a96108f9c21 GIT binary patch literal 1802 zcmV+l2le=gP)|e>3Oo#n{HTn8XM+36~Hq1&ab{T0f9BiWK#!QlHv9L`_R@gAfG~ zJ54K0)Hb#d2tx}FREjFmy!P_YrV0%pN(#b2Y?X*QtP_I)6MVzi-rJe)>%;Dvbs z;jBh;_UxYdegFCX^UW9@@M>#oWBvN|w6(Pr0pAgkS5$R1P^zk^D#jQ#Y}jD#^uGU~ z0p#G7s(LaKi7br8Vnm}+092JkB0*PI*InO#pa2dWI6x+oiK^gwtRwY9b6Rp;B- z*w{VCun!Wzx^?UDJny^FXmmksZ7m{#h@h&72mn{ET$#9kC@FBxZH&cY6N-U}Allp8 z85kJA7~>ww3;-BoR!5`JNpOIXkr9T5hOpMYuBx$zHUowE&cjueWHO0}uxZn#9RRJZ zt&fVxB~=XRYgTb#e=0_|Ni~d*Vj);MWGLtEnCLW&=CFo{e(gx zX3d&KBodjlTK=y9_Uze1eSJOq_U&681i{2$h4B3M^73*jDk>&H3);xEQ?U79eByrN z#*OUVyLY~G?r*A!@B33sSlFC%6Tjty$UQslPZz%HNAuZyF#anQbYA)|zca>kib$lo zx|*`Gvb)0Xlp13UeSLj6=MMV+1AH4IZ>Sm_v2)kXbe~6RYUc3t(~AmxAVj?qRFzba zAkfT|;$)2B+O=z3zI?gM81pA@x^NX~iiR!DsTrnbZutz(ty%G8O>TTtl_I~C%}2h$ z;Y)|`2=R#bIO$B9bSh0cohF$~($mvJJRa}zJnz}Y#>QJ_y6~c~WzC|Q+#Cxy-E|99 z<+*wNR~N_1W(O`?X}`ESKwHl`d=tfqV{WigW2rSJ&~)A-r$nUHTKk8_#>QlGb2DbT z@Mjm7VGJ1H(v2jYpN)~oSiZgJ`qf2qN@jm?qo4B~7dT$pig6)Cl|VC$n&FLq|8f7` z!tq;LT4-o!0Kl6LeDzZ^@jQd767tHZES*7dq=ZtxJ%CSdp_JsIFf0fi$nWyYFJXUnpBWP)ZxV8Ci(y;0jfeGJ%;av znO*)kAumkNU^l?pInU4FWJCY4Rc}|~?|gLuTi&_2RqmiXe~pYgMw5<+2Tm0yn)86= z^MMOkGug|9uRC=_L&YqaUCYhn5FcM|2Tapf->x+6Zwxm1KRM9-q^f%>;+si1&nq7p zcZ{VR)?`blQ$e}Csh9%X)HR)5IoT8$oG7BXq-pl=KI*=oaT;AQuat1;_Our&&%&7~ zsZJ#8Y<0}3Sb*j~swg0;hy~A3B+|E)8z2UZoloRnIbo91o1r)%~zB!1m zP;AW|k2;X6dhNtC&kNyuVSF1RIk@WfLk(Zq z_EO9Fd!8Re1kZ*z+Vy^ZrQ8)hv2uR+o4$|@hCgz`s=x`6kVh&If@-W!xDRJz}i=IbxT* s*SK`&_nPky&$>K!_(XnsKRCdD0C{?~QMf)lr~m)}07*qoM6N<$g83V5O8@`> literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-close.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-close.png new file mode 100644 index 0000000000000000000000000000000000000000..3f05d50b601f60721c19b95598be16316fa52a81 GIT binary patch literal 819 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 IM6N<$f(<&3R{#J2 literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-add_32.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-add_32.png new file mode 100644 index 0000000000000000000000000000000000000000..230cb1bff7d3c0335db8037d29c4823552b58c8a GIT binary patch literal 2031 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 pb|IMU5(n6(#!jx?g|FV;{U14<2E(Rcp$~;p zydjztgQ%d0(iYJ^c!QFNn6yYW)`})H8lsYrrn#JC%w=YpOy-uEbJ_d**79NRv(K5^ zg9ze*!#R6>-`?xL*INJoS|9vBd=8z{|GCctht2_DnueeKdFo*=dPGIbB8q7GRaHb3 zRq!IHvdAv^y5dDqTG#11h-UYt_B(<;{@o{coB#-$0KC^Ds#31Sii#q%9H^}PaG$M7 zJD8<5vTFemp%~e+7x@jaeh~mwE!Se@seS!4oI;irCH=4YzNVebuDPwX-m>M_z?wq9 zGe0>`F|zBL`*Q#yDbj{h;zYq(R29@La+ZTx;#^UJARN_ zE)=kq$?;K)v00fYh7^dQ6^-^Hvexj&H{M|H-n}^I@-+oigs5u}C3POET?K%&;^v&k z*vw_~l}+=B?W7sqgW)2LKJ8;Vm58w z#Q69)s><;2W*Tvlr?N@aWdOVg+TtEbk|2S$rQQ(7G2`Q71Yt-aicnQ%XJ^^4aU*?w zeOc|qcoBw%hN#tQs8)~;PkJ!v4$gVFq+cHLOSf@X230TeyI zMtRrJ5H4w;KEWk*#7jzA1s^-SOHfQ!=z@q{g#}p+Sn-S%A0iA4#-s(-XpGTU7|jY+ zh~t>6S4Zg_-bJ-%i0Sz|1Vih%x*)9S-AE8bd1Rf3`^A9`P+^q_WZK@$mBAAjL+k`F zc<)dZM5Gld6)=Xz%uS{$Csvc~5{a;xQl^_V%vSkZbDu2a$VPNA%wr<_ZwQJY-;QQ9o+g}FY<>M1r+oEX7 zG_!I9WJ!UTwvCf_rt`ON)BQfskFlDr%aSAddpcrD+PC}jw?566vKeYc}K%; z=RNmWtT8yB@XF;EnW&DktLGE+G6aBgj_&SmcJJOz7=|nP&wL1~!Ro!BTKD|w#3aSg zGBRAEk-+K8mOs5+<+1IKiLsm9o_>c(8RxZymw002X?AaYjLyzA^p*R8fYk~>)u6)a z-Ov~~a`FzfhO*<`CBnckT|dpba?GXi8h6jmVdpQfU>4{u^@RaJNUz;uX26%FJvP??tB>o+V!Rxfp35QUY>cr(p|56HuMy@e{+c_ zuy|D#>Yl`V9vps{4c(jYDyXIm5R||KJhF8kuU~kTORjdIg%GGzO z)MCe*mDllE6Y(lIpD@@v%+7lr<=ES=GBG{J2JO zzrfcovt*Z`!bgTkhvfRd4hA^GCTg-C)3eg*E0u zBy^|-t)tqaqn#pw$(-xQbD93!_utwA=IEw!amP@(K;q%@%_`&5@$csD`cM7#n-9z` z)s**ttM{l%_)#zZX5wp~IlI4p>_0u6K5^g>hYx%b^Sy&7IkTpBi!t)FDi4WJPrSTl z6Z_IHzcw=c`2K%zc!(18f#sw@@&xTL1t6 M07*qoM6N<$f}L=#X8-^I literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-close.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-column-close.png new file mode 100644 index 0000000000000000000000000000000000000000..90c75ed270ee1c6eb6326b30873cb090ac666970 GIT binary patch literal 877 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 Ef}6mhK>z>% literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete.png new file mode 100644 index 0000000000000000000000000000000000000000..744f6d8ab2d9556608f24e0876b1e1f4c0f24475 GIT binary patch literal 861 zcmV-j1ETziP)>Du{vzBBG$HxT<85X(U>t z>7o!Zq6npnE+S}=E?i_++_`aK69XX{YcrE3nNFsYj(vIaX5PGa-@PtM5VfKQzU4Xm z_yoYlnW?08Ao-G=ZXXk-F`%KM8vfuC4+x(rX9b8A-*k7VCzPo+pC5-cq(iBhS=K4SBO ziPt)w=)00~x8ZgPLWyqrASKbrD5XM`;Kf%kEQ{skWs1e(m1Ht`+I8KQ5CY3g#K+?G z3hZpc-X7X-f*(K_B7XXT^s%R?{$3;OJc#Fc*tR_phT*4OU0u&bQKT&*IbhZu=l;5goX&>Uo&v0=D9Rv_csO_TT z2Z%z60wO6%r_*9^a1ekX2+&%WE$KLy{YQ?SPnNgPJGUSR?)@MLP*0!4T`!^@J&x8I zr4#^4DH@FiQp$6dzjJ%O8p`}b*`b5>Zz~u#*U@$yoqdM-^+MFlo-~74oaJlR5JI4o z+P_?>RGJq6zq~v;WZKrH)X<6kL|fcYTHtI|STIk}{%rppS^PfXHT{@~sEliyyN%3he8n`3fv@~;86qer}V z@y17;?dF-oJxA~mxJ`-Mh_Fpar);WD$0qO(8NhI4_`=by*xBPf?U)9*4N1dS#4N!| z!DIDiedf!2Z|<$xRqlt8j2Wjh4<`U{ya=}$VH&VrZc?uKGv7@2pM7(7m9O6KyKlf! znoa&~C@*Z(2|7<*pyS)tOR6+~dbX4PkV_y5TNV(jy^xQx{6G20xM nk*+xn`AIC~DhZ+gO9uD@F%5p};2yIa00000NkvXXu0mjfjRKrU literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete_32.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-delete_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9ace2f1e61efb775f69d3fec1a2a878c81d0d8fd GIT binary patch literal 2064 zcmV+r2=DiaP)ph_qzZIPfYc|es~R8b1*18EAj zg56Re(56j5F-Zg{B^8w_f>iNP^?{eFC`G80h_pdgV~9Tjj^o&g6K~kHv%B}+bEXfw z-q;Cg8#RnHI(wv*{xkoX|D3r($qqjMBpaXD&g9d5F&p@Na)<3-T65rXpnSJ~ArGQP&xgVTM3KF0*$#IDC_ z>3NY8zkIqy(CvcU>(^G+#p-MDD^iH(;ewDTJ4=wxIF~DoBl1d9sQt3-7ty|b`>s>f z_Y;XkTT4p|$z&1$RVA0pF*G!E#Q^++Pd-FT&x?#b*Sk(!bil7jb)}kDl5D8M*boXi zumPkz^t$EPrsXC#ab|V?^y!`B65a6EUC%u=sQS0YhKAPl>(?`%^}Nr`&GDbi-?;rX z#-I90i$)yqYbv^GI$QBwfHyXXd^Q6?08t1|Q8CcCimK*TVl|ay28SQ6zYu+?^15W} z`t|E^&Y`LRIOh-%CMG6u&RscxlTU1kIqPrtE8|@?Yu6A9X7NrALGA)rTl6S`sCb&; zf5G$=iLTqJZe4A{!I4`#sw&YE<@4aG%HhL@Id|?HB4V!;fN|Yy`ty+%f0=)4B z;89d|EuCU5a(V*!@b4t*tEpI0Oa0g=8U|lh(r+7;S&>uYuyUN#suko94^TKYfi^Xln=hZwA>i-{0$;!x%$*dpp(D)n#?~ zL{So>C7MeV#}h~_er4@gE&ex`0~Zw~S11(2R4wlyH)jaWp-Y$HoDyZS*si6Ez!&hbD zLT7hSF$-8xFYIapcZ9K|kzUJ4}nH|{|zs{qL7^ArjNf*>FW0>UsX-}CuAV`F2Cj*bp_p0}Z| zuP-YAhwlA~UzezV*~DXy)ZMa9Dpxcj=`)y#Pm%OlB%jB{6KH({y5>e~MKzg^N6CJA zBC_|~=Z9Ul0C4KmDUKaGwkX?6df||BZjUkMk9~c8`5ilUAP4Wfla24Z!|=DiRb?gE zEyg@hv1(;w1TPs^Kca(vU>u|nkT_M_lY67jqIij*hG6c~es5q55t zP-0{{HZan*k#}e6h@A4}#)+f(sSi7?(}FRkv%9-{w7n=M)r_W$fP9{JTn zY<=bEGmSH!Y+I8(&MMB~MFniCnnL4ha;rNySKG{7KB5p<29D2?k35>?$a@WP@&}K1 zcMt8|yO%9nw(!4LIe_l{qx3&=1Ks;apHZjVk_p3YH`Nl48B~k&NCdKTA#?c%0gS+0 zpnN!zA&gK9zdo?F{YkFE%;n&2TPiNxv9^Y|(TlI2vt(xjW^+Yw1Q4MzZfIJXL{Smv z3|DEU=QkslfE#YRu?7(qXP&dn6)Z-IcR`5zh9jdHPMpaT^USla_jdmDft^RMDgXiK z`OU~yhd!T*8#c7pBBjF2KW^EaWj0>~rvxqnM@BNt%vwbC+1GnJw|)PGkNEx8_Nxov z@mG(p5w(MHUy`@4ttIA58CV1|7mArnX@mkK;)X*XonHk0z|Nz*-rLDlmjJcj3#}&G zTdIi17H`g(3&qS!zaRWU}WihGC@Gymss=9+^S1Bm2+2n-yb zEw5DbmP{C`lOFFLO@ATa#U?boi}Jzg^C5>m{)~L+@IApZ!c;ooFGps`TyS3qczF&y z{PI-HMCaeLj$0$^NW?q}kt2#6VkGaZ{``%;&Ry3U9Kif&?=Zi8bb07P?f~~yW6bXg uq5X$CJt)RJg)<#*^mXp~?v85@4)AXPTKcU{zH-h00000sX6~euOftF55VdHTXlO_Lk$|L{MNsHppk|>Ku?ta&7&9o+ zjcv)I=oEFNu7n5*Md-?nS*c*eP-BB33!$1AGmR~2$Ru;`bmrdseJ*SVu@!ycz=6Z_ zp7$J?dlD%O?;k4M_t2qO2iyMccZ)+un|s_)rBZP{&pVb(CXX9q23oDwm3qDY;MCOA z6#(TOysI?$`1Jhe7u5Mi&vRd8@0s|Rzsd8wmrJG6hr`3e17l-j^!4>gqtWQhwbk|B zYa8G8zVOr&L~@nJ=GqIBO)v;EU>z|`gJy&P0h^A6hs8QuaK9X zdvjvl-$|wOw43|mQ?rmH5~Zv-+B&HWN~f_l zHeZ6RR;vIQV~FDzfMT&|GnvdrCX;!3baXWDx^6*Ztwuxvpakq+{p92%)oS$>V+__> zj4@=hSs57_0ifM(W3AoPD91`CuVCXSeD$MC71!<@NT>@(ii3llQ;ad4R6!6BMbSwu zNg@vPLY1(z?ne$afQTrQvGA5uy=H$E<4EeWk~97VHjI6S0T-pcncHXfcU zm&<1>l?t~Q5VakYAWET}BsOfZ(}>t@#wbUT?b3v*cO77Qdiqv_#qCFX*1!3l+Wa}T zE}my6Xc2@$QVYw!`mFrcIPppO(A2Z1SGb+jkGbP71${@j`;iZ5wg>nreF`lxzic+y z+`fL|+*|j*{mkhVK7F%vdjqQyxjza=dFSLY=9?2FrN#1^&!x*j2mb6|U;wq-Xur3% z=aC&hgU%gf{c6C**7g4d1IUZ-|C|b=Xu?gquZ3Z>z2k@PCPU_M#r_uz@F$KpMqy>w RHje-R002ovPDHLkV1mZCkk9}C literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-edit_32.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-edit_32.png new file mode 100644 index 0000000000000000000000000000000000000000..55b7db8e2b41a1317896e5dc22d9da30d29e4db4 GIT binary patch literal 1940 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 LNkvXXu0mjfvNydd literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8164da4c66d9c45e3ccc943861e815db43ea55 GIT binary patch literal 958 zcmV;v13~-od4g4x%tTV`Xyh! zOFqFm2!%pk(=?wn4C6H^WqBr(i6s(=y4Kd#7=X5(fN7d7wY9aOKp=qE>t$eIKtv*u z8@vXfltKu>Qsj!iujeiQ-OZiL-h%QJfTn4oKp=n+g8u$~CMPG)27^IQdwYAS5aODE z5Q4dhKewJfcJRyD@MziC;2kScsRvy`TvSS-l)|=cQmGWWu0Nm6W{;Vs+2lBma$UD_ z;p^jj3^zMAZrf2DkHJN0EuKc9k zeyk)|=>Uya4w+x1Pb@SBa|>&C-{!jc_Irq49bzSXVaN97&xZiCakVp5m+bBc6h8Xw zx99#TnuuCdmUw8a(<$58#8lif}qc>z$Q<0SA3^*a!n3r2qf`07*qoM6N<$f-$YVe*gdg literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share_32.png b/src/main/resources/org/gcube/portlets/user/td/rulewidget/client/resources/rule-share_32.png new file mode 100644 index 0000000000000000000000000000000000000000..04b84b141d80f9f85bed1a81c644d447b5c2f6fe GIT binary patch literal 2341 zcmV+=3EK9FP)KvRMj2FKj+?kve`V?yae4eLJgHuV(x9?M~nhDdhu7sbavbltL+m5Q25<)`_X+ zTP~Hr82EIhRIS}^pO=}LiNoOlKq*Ba5TL24>A%juBmz5j?7%P#hf=C8B_$c# zAV#9TzMj6mK7Y_3JlCDeqTG*_=)%IXO850s)$vn1+ z8>va0P=ZOKFeUrjs!m&=96<3TA^v1Q8^C8gXXgdjgZ zACJdFQc}{?5$Nx1UDVxtB=5%M_cAjlAB)w-zW4vhp^raeG!P=v*~JHM?})tg(o3va zvt}akNqJCMSjfP@0O!x2$7;2bnwpB;ZojBnCK0gc7UJD55|dMLPK!g+b$;-p6NsnRG~TB=0{b*K{e6A-{iB#l5b%$%_JzH) z_ZxV?RljLvs_<;t7QW z4V{oX*F*D}c8s8NMtq{ynds8orUZSk1O0Rmx(fyHd? z4IUmG94OZ`?H3gl6~mi0Z9)fl=lCFhS)F&l^eiiPW-TBzGlQX^KuL%gV1~g6LpTI| zevOjL-0Xg9A9uyQ<*ql2I@8>^Pp0|%O(B{P!8NqD}Fg-4a$L%Lh@8$SM$GLr8H#g62Kv-<(0uFhz z3%W#JoiAiDPSyO2pnn)MVqkCq6j_XHU28Dil=58kxdeC{2>8X6*?PbWJij?}((>JEL$ z%H_Fb-&vAgm6-bggDtN{2|W683!5Lz<&mnhzfn>?>9lDS&yUAy5sa;-2m!uP6Mx7= zj6H(@-AY5-2;HsSTzO>%y(t-V`2{F}G{G>y3@NhX6`8V!Ge_H~eEi`;sBMVlz~%>Y zdGzI$Uyg$>%}>B;x!5Y-sL4n$3O;_3Xk25wLs3U1o#z8MvuEJ-3y@%rC2u6C2#4U) za{@DQI*lCxc9zet`C#qL{1}0UceKt?sHg1~LGk=}gouV)si@N7KvcOVqD!biV7F-; zJ3CBgTPv3*Hc^z&Le0T;lAWL;3L_M)93!LUv?$39x+X|VvSLKWPB(xl6@lJ_&hd*=Q> zJl(52UtS;pE^VqUNhuIf%LO1bV&Folr*>5oJoUusW|6gU-mD3;5~kYRb^?cwwrL4@ z+0&yV=PxWo5_vKZl8gk+n0loYnkI;|Ma$4((>U7fi-EsUQSjuCf7d|%!g=cJ9^Z?v z$e!}&K$8)%O9(jGI)WNkKGqy|4Yxz*K*PW!@HZ+7_$Hc$#sL(Ey9W*G&I}PWqTcD6 zz&jA8`dB}{QTeTa$Ex~gFLhU)>6m0&c!2z@f zw>I<2+H^x2Tn+MiP19Zr8Riis)rUgUo@nBCseI~&>|sKZN&oW01`idnYrr14`X7}aP zlmR7SDE&Zf?4*rJ+}OT{sZrCGD_!a8oO|B)J&yqxz~k-h?bS3*3;utMR;zX7`~I)N zU~oAt0t%>Vt^a7P2Qw3fF@5KGZge`G!}ay`=V2HcQ4~$CdJ32m5z$&pmSr*?k0nVG zIX^#_IF9A`_*g_l&d$zce}DfQuu-qqZGh5EN7FR1ENgmg+ooJD15l|{Xfzs|dwYBD zdcEEMDj|5JeH~ zcAG|{!O6)9TU%Sx^izQ>%joy}BuT<(G{W;d!Z5_LEV|t;j^nVqyUWtj5~I;*YHD4N z4G@MQzV8#qG3|C6*L4{Vhxoovv)N=anN0uAKvYUGKQ~7|j!1?Vc&e z3QxDUxBu8^G?oDeC{1GEM=FH)$t9&k)3mXBI3A9LVwxtVX<}Jc_T|f$A7nyKqA^@N z1n@p^@B1DyV45bnt`mtwvV}t7X(Ex(faTGckhl4A)WVy}MnQzvC;(m8F$^OFlYQ~x z#oquISidy}CV^2(0T2Yib-aY%Z@S=ytODK9y+)r_u@GWRVQB3rn450+&~j5{0l;7| zKnQVdiR-#3r7#TR8q6p&K@f0$evWCHD5dZ`kHKJoVHl*-Y3`JUtyYWY&!3}d8aq2X z06cs4j35Yj^5hA&ZI8LZbzNS+e$Dy$Ih&iCB$G)F4h|@lN^ERwd=S8UgD_movMgNJ z<@orRd_GU7(?QpDUcGvS>$+osStu0fcDtlfDUObgsMqTpA0LxUCVBJb4YgWrdI0r$ z9oKb9CX-l}MWs@qTrOi-7O_~2a=Faz?k{B@&5X z+cwc?l#`Q_=>d!eTRa}e^E?1jsT3C%7g(0X#l;2re4bLN#Qy$1wrz8Ec7|aX%+Jr$ z?RLpzGH9Ci-hE;sfJ7pJVHmVpEi_FdolcWZrwM`p$8pGJv&3RCy4^0#W)mUA_4h`j zK|CHOlgVJ)Hm>W^Y&OYcGSdUFEQ?2v9?@>MX*QeJ)2YD2+yggM$MW7Z<}F zk7~7w@B2t8ab1^cwaUiE21`pz(*p=u*xufzSS;eYE}rL6tJR1^BJ_GaOw%Nr&9c6} zPCOpR_kDW39)@AiZnyD$pJK5{I-O>9b(Lw$@tDlb%>x3@^YQ%vO*eS>@Cz!H3Y|{p zx&V2eN2O9Bx0)rnkic^t5Q2WMM>3HZ+oGr52VBqRKl?4-4sulAnRtFcr@KO;5@BoW zm+bC7Czs11rKDIalFQ}zG70DZeagTC*@|LcR$0uSAr`)dXp}ql1Cry4hdH|phQzt_ z2xbC~N)Er@TE;X?`n?{u9i`jp^5FB&k;mVXc78z2rBVG;m~o(14|eexNbm=F)W0Rg;Tkm&5)Mn?ZmPU4(@-M7so+9Rk0B6d&ONRLI0t z`B0z&5JK_t;yaF(zsD329OdB5Ikdaq@<1(PTooq}!wFJ@2}MeuTm`RysPW3^E1%`a zGK-N#nqGsx->2vIhf0MUnK;BQKMsIG1w-@INDcLa0D(XXi9{d}Cu~tK15ZLSg8jNr4{-q!1(ag}+K9^2%2VbQ81)2sz0E6Pi*fF%1pZQ%E70wKSAc z*rp&LK&fD8@f8Rq1j@9)9Sl*=#KBGs>ws?D9e}9|*3%Z}%>mW6OSSFN?09Ug&0=U* zy&*&DrIZB9htvbmBT#<}oeGo>;j=H0cH-k)@T;H2_-ZqLWvSv1zgghR`!RH(5#S>b zL}e5c6Cnk9;vW3&8;H!pWgG54hTncYbjOrIsK#1rUGiiz!Q;)u7}~XHjyL@R1LYtQ zwEQ;r>>QS6!O9k_{NgHS^$7|7(+2U^Qyxwgl7(;n^`}3tWLCaHpua1heD}}4{Nu0A zzkA=`(vT|CG~ + + + + + + + + + + + + + + + + + + + Web Application Starter Project + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..1ff4adb --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,35 @@ + + + + + + + + TDGWTService + org.gcube.portlets.user.td.gwtservice.server.TDGWTServiceImpl + + + + jUnitHostImpl + com.google.gwt.junit.server.JUnitHostImpl + + + + + TDGWTService + /RuleWidget/TDGWTService + + + jUnitHostImpl + /RuleWidget/junithost/* + + + + + + ColumnWidget.html + + + diff --git a/src/test/java/org/gcube/portlets/user/td/rulewidget/client/GwtTestRuleWidget.java b/src/test/java/org/gcube/portlets/user/td/rulewidget/client/GwtTestRuleWidget.java new file mode 100644 index 0000000..c3399ab --- /dev/null +++ b/src/test/java/org/gcube/portlets/user/td/rulewidget/client/GwtTestRuleWidget.java @@ -0,0 +1,64 @@ +package org.gcube.portlets.user.td.rulewidget.client; + + + +import com.google.gwt.junit.client.GWTTestCase; + +/** + * GWT JUnit integration tests must extend GWTTestCase. + * Using "GwtTest*" naming pattern exclude them from running with + * surefire during the test phase. + * + * If you run the tests using the Maven command line, you will have to + * navigate with your browser to a specific url given by Maven. + * See http://mojo.codehaus.org/gwt-maven-plugin/user-guide/testing.html + * for details. + */ +public class GwtTestRuleWidget extends GWTTestCase { + + /** + * Must refer to a valid module that sources this class. + */ + public String getModuleName() { + return "org.gcube.portlets.user.td.rulewidget.RuleWidgetJUnit"; + } + + + /** + * This test will send a request to the server using the greetServer method in + * GreetingService and verify the response. + */ + public void testGreetingService() { + // Create the service that we will test. + //GreetingServiceAsync greetingService = GWT.create(GreetingService.class); + //ServiceDefTarget target = (ServiceDefTarget) greetingService; + //target.setServiceEntryPoint(GWT.getModuleBaseURL() + "SDMXImportWizardTD/greet"); + + // Since RPC calls are asynchronous, we will need to wait for a response + // after this test method returns. This line tells the test runner to wait + // up to 10 seconds before timing out. + //delayTestFinish(10000); + + // Send a request to the server. + /* greetingService.greetServer("GWT User", new AsyncCallback() { + public void onFailure(Throwable caught) { + // The request resulted in an unexpected error. + fail("Request failure: " + caught.getMessage()); + } + + + public void onSuccess(String result) { + // Verify that the response is correct. + assertTrue(result.startsWith("Hello, GWT User!")); + + // Now that we have received a response, we need to tell the test runner + // that the test is complete. You must call finishTest() after an + // asynchronous test finishes successfully, or the test will time out. + finishTest(); + } + });*/ + + } + + +} diff --git a/src/test/resources/org/gcube/portlets/user/td/rulewidget/RuleWidgetJUnit.gwt.xml b/src/test/resources/org/gcube/portlets/user/td/rulewidget/RuleWidgetJUnit.gwt.xml new file mode 100644 index 0000000..fb7c226 --- /dev/null +++ b/src/test/resources/org/gcube/portlets/user/td/rulewidget/RuleWidgetJUnit.gwt.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/INSTALL b/templates/INSTALL new file mode 100644 index 0000000..e69de29 diff --git a/templates/LICENSE b/templates/LICENSE new file mode 100644 index 0000000..cc51139 --- /dev/null +++ b/templates/LICENSE @@ -0,0 +1,6 @@ +gCube System - License +------------------------------------------------------------ + +The gCube/gCore software is licensed as Free Open Source software conveying to the EUPL (http://ec.europa.eu/idabc/eupl). +The software and documentation is provided by its authors/distributors "as is" and no expressed or +implied warranty is given for its use, quality or fitness for a particular case. \ No newline at end of file diff --git a/templates/MAINTAINERS b/templates/MAINTAINERS new file mode 100644 index 0000000..0bc9be3 --- /dev/null +++ b/templates/MAINTAINERS @@ -0,0 +1 @@ +Giancarlo Panichi (giancarlo.panichi@isti.cnr.it), CNR Pisa, Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" diff --git a/templates/README b/templates/README new file mode 100644 index 0000000..7e3ad55 --- /dev/null +++ b/templates/README @@ -0,0 +1,48 @@ +The gCube System - ${name} +------------------------------------------------------------ + +This work has been supported by the following European projects: iMarine (FP7-INFRASTRUCTURES-2011-2) + +Authors +------- + +Giancarlo Panichi (giancarlo.panichi@isti.cnr.it), CNR Pisa, +Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" + + +Version and Release Date +------------------------ + +v. ${version} (${release.date}) + + +Description +----------- + +${project.description} + + +Download information +-------------------- +Source code is available from SVN: + ${scm.url} + +Binaries can be downloaded from: + http://software.d4science.research-infrastructures.eu/ + + +Documentation +------------- + +${project.description} + +Documentation is available on-line from the Projects Documentation Wiki: + ${wikiurl} + + +Licensing +--------- + +This software is licensed under the terms you may find in the file named "LICENSE" in this directory. + + diff --git a/templates/changelog.xml b/templates/changelog.xml new file mode 100644 index 0000000..c1bd89a --- /dev/null +++ b/templates/changelog.xml @@ -0,0 +1,6 @@ + + + First Release + + \ No newline at end of file diff --git a/templates/descriptor.xml b/templates/descriptor.xml new file mode 100644 index 0000000..b978636 --- /dev/null +++ b/templates/descriptor.xml @@ -0,0 +1,39 @@ + + servicearchive + + tar.gz + + / + + + ${distroDirectory} + / + true + + README + LICENSE + INSTALL + MAINTAINERS + changelog.xml + + 755 + + + + + ${distroDirectory}/svnpath.txt + /${artifactId} + + + ${configDirectory}/profile.xml + / + + + target/${build.finalName}.${packaging} + /${artifactId} + + + \ No newline at end of file diff --git a/templates/profile.xml b/templates/profile.xml new file mode 100644 index 0000000..19ed5bc --- /dev/null +++ b/templates/profile.xml @@ -0,0 +1,29 @@ + + + + Service + + ${project.description} + PortletsUser + ${project.name} + ${version} + + + ${project.description} + ${project.name} + ${version} + + ${project.groupId} + ${project.artifactId} + ${project.version} + + library + + ${project.build.finalName}.${project.packaging} + + + + + + + diff --git a/templates/svnpath.txt b/templates/svnpath.txt new file mode 100644 index 0000000..dcd0d22 --- /dev/null +++ b/templates/svnpath.txt @@ -0,0 +1 @@ +${scm.url} \ No newline at end of file