[SYNCOPE-745] report reportlet management

Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/2b0960de
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/2b0960de
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/2b0960de

Branch: refs/heads/master
Commit: 2b0960de57a0faa07fe470003f4f0901ad4a8ad4
Parents: c6ad727
Author: fmartelli <fabio.marte...@gmail.com>
Authored: Tue May 3 20:48:55 2016 +0200
Committer: fmartelli <fabio.marte...@gmail.com>
Committed: Tue May 3 20:48:55 2016 +0200

----------------------------------------------------------------------
 .../client/console/commons/Constants.java       |   4 +
 .../panels/ParametersCreateWizardPanel.java     |   4 -
 .../panels/search/SearchClausePanel.java        |   2 +-
 .../console/panels/search/SearchUtils.java      |  29 +-
 .../console/reports/ReportDirectoryPanel.java   |  39 +-
 .../reports/ReportTemplateDirectoryPanel.java   |   4 -
 .../reports/ReportletDirectoryPanel.java        | 334 ++++++++++++++++
 .../console/reports/ReportletWizardBuilder.java | 386 +++++++++++++++++++
 .../client/console/rest/SchemaRestClient.java   |  44 +++
 .../markup/html/bootstrap/dialog/BaseModal.java |   7 +-
 .../wicket/markup/html/form/ActionLink.java     |   1 +
 .../markup/html/form/ActionLinksPanel.java      |  24 ++
 .../markup/html/form/AjaxPalettePanel.java      |  11 +-
 .../console/wizards/AjaxWizardBuilder.java      |   4 +
 .../client/console/wizards/WizardMgtPanel.java  |  54 ++-
 .../META-INF/resources/css/syncopeConsole.css   |  10 +-
 .../reports/ReportDirectoryPanel.properties     |   2 +
 .../reports/ReportDirectoryPanel_it.properties  |   2 +
 .../ReportDirectoryPanel_pt_BR.properties       |   2 +
 .../reports/ReportDirectoryPanel_ru.properties  |   2 +
 .../reports/ReportWizardBuilder$Profile.html    |   2 +-
 .../reports/ReportletDirectoryPanel.properties  |  19 +
 .../ReportletDirectoryPanel_it.properties       |  19 +
 .../ReportletDirectoryPanel_pt_BR.properties    |  19 +
 .../ReportletDirectoryPanel_ru.properties       |  19 +
 .../ReportletWizardBuilder$Configuration.html   |  28 ++
 ...ortletWizardBuilder$Configuration.properties |  24 ++
 ...letWizardBuilder$Configuration_it.properties |  24 ++
 ...WizardBuilder$Configuration_pt_BR.properties |  24 ++
 ...letWizardBuilder$Configuration_ru.properties |  26 ++
 .../reports/ReportletWizardBuilder$Profile.html |  24 ++
 .../ReportletWizardBuilder$Profile.properties   |  18 +
 ...ReportletWizardBuilder$Profile_it.properties |  18 +
 ...ortletWizardBuilder$Profile_pt_BR.properties |  18 +
 ...ReportletWizardBuilder$Profile_ru.properties |  20 +
 .../markup/html/form/ActionLinksPanel.html      |   5 +
 .../markup/html/form/AjaxPalettePanel.html      |   4 +-
 .../client/console/wizards/WizardMgtPanel.html  |   3 +
 .../lib/report/AbstractAnyReportletConf.java    |  43 ---
 .../common/lib/report/GroupReportletConf.java   |  42 ++
 .../lib/report/ReconciliationReportletConf.java |   3 +
 .../syncope/common/lib/report/Schema.java       |  32 ++
 .../common/lib/report/SearchCondition.java      |  31 ++
 .../common/lib/report/UserReportletConf.java    |  42 ++
 44 files changed, 1394 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
index 141b7e5..38dba85 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
@@ -110,6 +110,10 @@ public final class Constants {
 
     public static final String PREF_PROPAGATION_TASKS_PAGINATOR_ROWS = 
"proagationtasks.paginator.rows";
 
+    public static final String PREF_REPORT_TASKS_PAGINATOR_ROWS = 
"report.paginator.rows";
+
+    public static final String PREF_REPORTLET_TASKS_PAGINATOR_ROWS = 
"reportlet.paginator.rows";
+
     public static final String PREF_TASK_EXECS_PAGINATOR_ROWS = 
"task.execs.paginator.rows";
 
     public static final String PREF_NOTIFICATION_TASKS_PAGINATOR_ROWS = 
"notificationtasks.paginator.rows";

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
index eace16b..b3a2c93 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
@@ -28,15 +28,11 @@ import 
org.apache.syncope.common.rest.api.service.ConfigurationService;
 import org.apache.syncope.common.rest.api.service.SchemaService;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.extensions.wizard.WizardModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class ParametersCreateWizardPanel extends 
AjaxWizardBuilder<ParametersCreateWizardPanel.ParametersForm> {
 
     private static final long serialVersionUID = -2868592590785581481L;
 
-    private static final Logger LOG = 
LoggerFactory.getLogger(ParametersCreateWizardPanel.class);
-
     public ParametersCreateWizardPanel(final ParametersForm defaultItem, final 
PageReference pageRef) {
         super(defaultItem, pageRef);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
index 05c5157..3271647 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
@@ -690,7 +690,7 @@ public class SearchClausePanel extends 
FieldPanel<SearchClause> {
 
         @Override
         public Object getDisplayValue(final String object) {
-            return groupNames.getObject().get(Long.parseLong(object));
+            return groupNames.getObject().get(object);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
index 83960e1..6857e20 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
@@ -117,7 +117,16 @@ public final class SearchUtils implements Serializable {
 
         LOG.info("Condition: " + sc.getCondition());
 
-        if (SpecialAttr.GROUPS.toString().equals(property)) {
+        if (SpecialAttr.ROLES.toString().equals(property)) {
+            res.setType(SearchClause.Type.ROLE_MEMBERSHIP);
+            res.setProperty(value);
+        } else if (SpecialAttr.RELATIONSHIPS.toString().equals(property)) {
+            res.setType(SearchClause.Type.RELATIONSHIP);
+            res.setProperty(value);
+        } else if (SpecialAttr.RELATIONSHIP_TYPES.toString().equals(property)) 
{
+            res.setType(SearchClause.Type.RELATIONSHIP);
+            res.setProperty(value);
+        } else if (SpecialAttr.GROUPS.toString().equals(property)) {
             res.setType(SearchClause.Type.GROUP_MEMBERSHIP);
             res.setProperty(value);
         } else if (SpecialAttr.RESOURCES.toString().equals(property)) {
@@ -129,13 +138,23 @@ public final class SearchUtils implements Serializable {
 
         switch (sc.getConditionType()) {
             case EQUALS:
-                res.setComparator(SpecialAttr.NULL.toString().equals(value)
-                        ? SearchClause.Comparator.IS_NULL : 
SearchClause.Comparator.EQUALS);
+                if 
(SpecialAttr.RELATIONSHIP_TYPES.toString().equals(property)) {
+                    res.setComparator(SpecialAttr.NULL.toString().equals(value)
+                            ? SearchClause.Comparator.EQUALS : 
SearchClause.Comparator.IS_NULL);
+                } else {
+                    res.setComparator(SpecialAttr.NULL.toString().equals(value)
+                            ? SearchClause.Comparator.IS_NULL : 
SearchClause.Comparator.EQUALS);
+                }
                 break;
 
             case NOT_EQUALS:
-                res.setComparator(SpecialAttr.NULL.toString().equals(value)
-                        ? SearchClause.Comparator.IS_NOT_NULL : 
SearchClause.Comparator.NOT_EQUALS);
+                if 
(SpecialAttr.RELATIONSHIP_TYPES.toString().equals(property)) {
+                    res.setComparator(SpecialAttr.NULL.toString().equals(value)
+                            ? SearchClause.Comparator.NOT_EQUALS : 
SearchClause.Comparator.IS_NOT_NULL);
+                } else {
+                    res.setComparator(SpecialAttr.NULL.toString().equals(value)
+                            ? SearchClause.Comparator.IS_NOT_NULL : 
SearchClause.Comparator.NOT_EQUALS);
+                }
                 break;
 
             case GREATER_OR_EQUALS:

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
index 1f56083..cb5336b 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.reports;
 
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -36,6 +37,7 @@ import 
org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.
 import 
org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.BooleanPropertyColumn;
 import 
org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
 import 
org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
+import 
org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import 
org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
 import 
org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
@@ -52,6 +54,7 @@ import 
org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import 
org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.StringResourceModel;
 
@@ -63,6 +66,8 @@ public abstract class ReportDirectoryPanel
 
     private static final long serialVersionUID = 4984337552918213290L;
 
+    private final BaseModal<ReportTO> reportletModal = new 
BaseModal<ReportTO>("outer");
+
     private final ReportStartAtTogglePanel startAt;
 
     protected ReportDirectoryPanel(final MultilevelPanel multiLevelPanelRef, 
final PageReference pageRef) {
@@ -72,6 +77,7 @@ public abstract class ReportDirectoryPanel
         this.addNewItemPanelBuilder(new ReportWizardBuilder(new ReportTO(), 
pageRef), true);
         MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, 
StandardEntitlement.REPORT_CREATE);
 
+        modal.size(Modal.Size.Large);
         initResultTable();
 
         startAt = new ReportStartAtTogglePanel(container);
@@ -113,15 +119,31 @@ public abstract class ReportDirectoryPanel
             @Override
             public ActionLinksPanel<ReportTO> getActions(final String 
componentId, final IModel<ReportTO> model) {
 
-                final ReportTO reportTO = model.getObject();
-
                 final ActionLinksPanel<ReportTO> panel = 
ActionLinksPanel.<ReportTO>builder().
                         add(new ActionLink<ReportTO>() {
 
                             private static final long serialVersionUID = 
-3722207913631435501L;
 
                             @Override
-                            public void onClick(final AjaxRequestTarget 
target, final ReportTO modelObject) {
+                            public void onClick(final AjaxRequestTarget 
target, final ReportTO ignore) {
+                                target.add(modal.setContent(new 
ReportletDirectoryPanel(
+                                        modal, model.getObject().getKey(), 
pageRef)));
+
+                                modal.header(new StringResourceModel(
+                                        "reportlet.conf", 
ReportDirectoryPanel.this, Model.of(model.getObject())));
+
+                                MetaDataRoleAuthorizationStrategy.authorize(
+                                        modal.getForm(), ENABLE, 
StandardEntitlement.RESOURCE_UPDATE);
+
+                                modal.show(true);
+                            }
+                        }, ActionLink.ActionType.COMPOSE, 
StandardEntitlement.REPORT_UPDATE).
+                        add(new ActionLink<ReportTO>() {
+
+                            private static final long serialVersionUID = 
-3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget 
target, final ReportTO ignore) {
                                 final ReportTO clone = 
SerializationUtils.clone(model.getObject());
                                 clone.setKey(null);
                                 send(ReportDirectoryPanel.this, 
Broadcast.EXACT,
@@ -133,7 +155,7 @@ public abstract class ReportDirectoryPanel
                             private static final long serialVersionUID = 
-3722207913631435501L;
 
                             @Override
-                            public void onClick(final AjaxRequestTarget 
target, final ReportTO modelObject) {
+                            public void onClick(final AjaxRequestTarget 
target, final ReportTO ignore) {
                                 send(ReportDirectoryPanel.this, 
Broadcast.EXACT,
                                         new AjaxWizard.EditItemActionEvent<>(
                                                 
restClient.read(model.getObject().getKey()), target));
@@ -144,8 +166,8 @@ public abstract class ReportDirectoryPanel
                             private static final long serialVersionUID = 
-3722207913631435501L;
 
                             @Override
-                            public void onClick(final AjaxRequestTarget 
target, final ReportTO modelObject) {
-                                viewTask(reportTO, target);
+                            public void onClick(final AjaxRequestTarget 
target, final ReportTO ignore) {
+                                viewTask(model.getObject(), target);
                             }
                         }, ActionLink.ActionType.VIEW, 
StandardEntitlement.REPORT_READ).
                         add(new ActionLink<ReportTO>() {
@@ -164,7 +186,8 @@ public abstract class ReportDirectoryPanel
                             private static final long serialVersionUID = 
-3722207913631435501L;
 
                             @Override
-                            public void onClick(final AjaxRequestTarget 
target, final ReportTO modelObject) {
+                            public void onClick(final AjaxRequestTarget 
target, final ReportTO ignore) {
+                                final ReportTO reportTO = model.getObject();
                                 try {
                                     restClient.delete(reportTO.getKey());
                                     
info(getString(Constants.OPERATION_SUCCEEDED));
@@ -217,7 +240,7 @@ public abstract class ReportDirectoryPanel
 
     @Override
     protected String paginatorRowsKey() {
-        return Constants.PREF_PROPAGATION_TASKS_PAGINATOR_ROWS;
+        return Constants.PREF_REPORT_TASKS_PAGINATOR_ROWS;
     }
 
     protected abstract void viewTask(final ReportTO reportTO, final 
AjaxRequestTarget target);

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
index 31e84f1..f2ddf6b 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
@@ -68,10 +68,6 @@ public class ReportTemplateDirectoryPanel
         super(id, pageReference, true);
         disableCheckBoxes();
 
-        modal.size(Modal.Size.Small);
-        modal.addSubmitButton();
-        setFooterVisibility(true);
-
         addOuterObject(utilityModal);
         setWindowClosedReloadCallback(utilityModal);
         utilityModal.size(Modal.Size.Large);

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
new file mode 100644
index 0000000..15f754a
--- /dev/null
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
@@ -0,0 +1,334 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.reports;
+
+import static org.apache.wicket.Component.ENABLE;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.commons.collections4.Transformer;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import 
org.apache.syncope.client.console.commons.SortableDataProviderComparator;
+import org.apache.syncope.client.console.panels.DirectoryPanel;
+import org.apache.syncope.client.console.panels.ModalPanel;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import 
org.apache.syncope.client.console.reports.ReportletDirectoryPanel.ReportletWrapper;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import 
org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
+import 
org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.report.AbstractReportletConf;
+import org.apache.syncope.common.lib.report.ReportletConf;
+import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
+import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import 
org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.event.IEvent;
+import 
org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
+import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
+import 
org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import 
org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+
+/**
+ * Reportlets page.
+ */
+public class ReportletDirectoryPanel extends DirectoryPanel<
+        ReportletWrapper, ReportletWrapper, 
DirectoryDataProvider<ReportletWrapper>, ReportRestClient>
+        implements ModalPanel {
+
+    private static final long serialVersionUID = 4984337552918213290L;
+
+    private final BaseModal<ReportTO> baseModal;
+
+    private final String report;
+
+    protected ReportletDirectoryPanel(
+            final BaseModal<ReportTO> baseModal, final String report, final 
PageReference pageRef) {
+        super(BaseModal.CONTENT_ID, pageRef, false);
+        this.baseModal = baseModal;
+        this.report = report;
+        this.restClient = new ReportRestClient();
+
+        enableExitButton();
+
+        this.addNewItemPanelBuilder(new ReportletWizardBuilder(
+                report, new ReportletWrapper(), 
pageRef).setEventSink(ReportletDirectoryPanel.this), true);
+
+        MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, 
StandardEntitlement.REPORT_UPDATE);
+        restClient = new ReportRestClient();
+        initResultTable();
+    }
+
+    @Override
+    protected List<IColumn<ReportletWrapper, String>> getColumns() {
+        final List<IColumn<ReportletWrapper, String>> columns = new 
ArrayList<>();
+
+        columns.add(new PropertyColumn<ReportletWrapper, String>(
+                new StringResourceModel("reportlet", this, null), "name", 
"name"));
+
+        columns.add(new AbstractColumn<ReportletWrapper, String>(
+                new StringResourceModel("configuration", this, null)) {
+
+            private static final long serialVersionUID = -4008579357070833846L;
+
+            @Override
+            public void populateItem(
+                    final Item<ICellPopulator<ReportletWrapper>> cellItem,
+                    final String componentId,
+                    final IModel<ReportletWrapper> rowModel) {
+                cellItem.add(new Label(componentId, 
rowModel.getObject().getConf().getClass().getName()));
+            }
+        });
+
+        columns.add(new ActionColumn<ReportletWrapper, String>(new 
ResourceModel("actions")) {
+
+            private static final long serialVersionUID = 2054811145491901166L;
+
+            @Override
+            public ActionLinksPanel<ReportletWrapper> getActions(final String 
componentId,
+                    final IModel<ReportletWrapper> model) {
+
+                final ActionLinksPanel<ReportletWrapper> panel = 
ActionLinksPanel.<ReportletWrapper>builder().
+                        add(new ActionLink<ReportletWrapper>() {
+
+                            private static final long serialVersionUID = 
-3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget 
target, final ReportletWrapper ignore) {
+                                AbstractReportletConf clone = 
SerializationUtils.clone(model.getObject().getConf());
+                                clone.setName(null);
+
+                                send(ReportletDirectoryPanel.this, 
Broadcast.EXACT,
+                                        new AjaxWizard.EditItemActionEvent<>(
+                                                new 
ReportletWrapper().setConf(clone),
+                                                target));
+                            }
+                        }, ActionLink.ActionType.CLONE, 
StandardEntitlement.REPORT_UPDATE).
+                        add(new ActionLink<ReportletWrapper>() {
+
+                            private static final long serialVersionUID = 
-3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget 
target, final ReportletWrapper ignore) {
+                                send(ReportletDirectoryPanel.this, 
Broadcast.EXACT,
+                                        new 
AjaxWizard.EditItemActionEvent<>(model.getObject(), target));
+                            }
+                        }, ActionLink.ActionType.EDIT, 
StandardEntitlement.REPORT_UPDATE).
+                        add(new ActionLink<ReportletWrapper>() {
+
+                            private static final long serialVersionUID = 
-3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget 
target, final ReportletWrapper ignore) {
+                                final ReportletConf reportlet = 
model.getObject().getConf();
+                                try {
+                                    final ReportTO actual = 
restClient.read(report);
+                                    
CollectionUtils.filter(actual.getReportletConfs(), new 
Predicate<ReportletConf>() {
+
+                                        @Override
+                                        public boolean evaluate(final 
ReportletConf object) {
+                                            return 
!object.getName().equals(reportlet.getName());
+                                        }
+                                    });
+                                    restClient.update(actual);
+                                    
info(getString(Constants.OPERATION_SUCCEEDED));
+                                    customActionOnCloseCallback(target);
+                                } catch (SyncopeClientException e) {
+                                    LOG.error("While deleting {}", 
reportlet.getName(), e);
+                                    error(StringUtils.isBlank(e.getMessage())
+                                            ? e.getClass().getName() : 
e.getMessage());
+                                }
+                                
SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+                            }
+                        }, ActionLink.ActionType.DELETE, 
StandardEntitlement.REPORT_UPDATE).build(componentId);
+
+                return panel;
+            }
+
+            @Override
+            public ActionLinksPanel<ReportletWrapper> getHeader(final String 
componentId) {
+                final ActionLinksPanel.Builder<ReportletWrapper> panel = 
ActionLinksPanel.builder();
+
+                return panel.add(new ActionLink<ReportletWrapper>() {
+
+                    private static final long serialVersionUID = 
-7978723352517770644L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final 
ReportletWrapper ignore) {
+                        if (target != null) {
+                            customActionOnCloseCallback(target);
+                        }
+                    }
+                }, ActionLink.ActionType.RELOAD, 
StandardEntitlement.TASK_LIST).build(componentId);
+            }
+        });
+
+        return columns;
+    }
+
+    @Override
+    protected Collection<ActionType> getBulkActions() {
+        final List<ActionType> bulkActions = new ArrayList<>();
+        bulkActions.add(ActionType.DELETE);
+        return bulkActions;
+    }
+
+    @Override
+    protected ReportDataProvider dataProvider() {
+        return new ReportDataProvider(rows);
+    }
+
+    @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_REPORTLET_TASKS_PAGINATOR_ROWS;
+    }
+
+    protected class ReportDataProvider extends 
DirectoryDataProvider<ReportletWrapper> {
+
+        private static final long serialVersionUID = 4725679400450513556L;
+
+        private final SortableDataProviderComparator<ReportletWrapper> 
comparator;
+
+        public ReportDataProvider(final int paginatorRows) {
+            super(paginatorRows);
+
+            //Default sorting
+            setSort("name", SortOrder.DESCENDING);
+            comparator = new SortableDataProviderComparator<>(this);
+        }
+
+        @Override
+        public Iterator<ReportletWrapper> iterator(final long first, final 
long count) {
+            final ReportTO actual = restClient.read(report);
+
+            final ArrayList<ReportletWrapper> reportlets = 
CollectionUtils.collect(
+                    actual.getReportletConfs(),
+                    new Transformer<AbstractReportletConf, ReportletWrapper>() 
{
+
+                @Override
+                public ReportletWrapper transform(final AbstractReportletConf 
input) {
+                    return new 
ReportletWrapper(input.getName()).setName(input.getName()).setConf(input);
+                }
+            }, new ArrayList<ReportletWrapper>());
+
+            Collections.sort(reportlets, comparator);
+            return reportlets.subList((int) first, (int) (first + 
count)).iterator();
+        }
+
+        @Override
+        public long size() {
+            final ReportTO actual = restClient.read(report);
+            return actual.getReportletConfs().size();
+        }
+
+        @Override
+        public IModel<ReportletWrapper> model(final ReportletWrapper object) {
+            return new CompoundPropertyModel<>(object);
+        }
+    }
+
+    public static class ReportletWrapper implements Serializable {
+
+        private static final long serialVersionUID = 2472755929742424558L;
+
+        private String oldname;
+
+        private String name;
+
+        private AbstractReportletConf conf;
+
+        private final Map<String, Pair<AbstractFiqlSearchConditionBuilder, 
List<SearchClause>>> scondWrapper;
+
+        public ReportletWrapper() {
+            this(null);
+        }
+
+        public ReportletWrapper(final String name) {
+            this.oldname = name;
+            this.scondWrapper = new HashMap<>();
+        }
+
+        public boolean isNew() {
+            return oldname == null;
+        }
+
+        public String getOldName() {
+            return this.oldname;
+        }
+
+        public String getName() {
+            return this.name;
+        }
+
+        public ReportletWrapper setName(final String name) {
+            this.name = name;
+            return this;
+        }
+
+        public AbstractReportletConf getConf() {
+            return conf;
+        }
+
+        public ReportletWrapper setConf(final AbstractReportletConf conf) {
+            this.conf = conf;
+            return this;
+        }
+
+        public Map<String, Pair<AbstractFiqlSearchConditionBuilder, 
List<SearchClause>>> getSCondWrapper() {
+            return scondWrapper;
+        }
+    }
+
+    @Override
+    public void onEvent(final IEvent<?> event) {
+        super.onEvent(event);
+        if (event.getPayload() instanceof ExitEvent && modal != null) {
+            final AjaxRequestTarget target = 
ExitEvent.class.cast(event.getPayload()).getTarget();
+            baseModal.show(false);
+            baseModal.close(target);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
new file mode 100644
index 0000000..cf94ddf
--- /dev/null
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
@@ -0,0 +1,386 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.reports;
+
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.commons.collections4.Transformer;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.panels.search.AnyObjectSearchPanel;
+import org.apache.syncope.client.console.panels.search.GroupSearchPanel;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import org.apache.syncope.client.console.panels.search.SearchUtils;
+import org.apache.syncope.client.console.panels.search.UserSearchPanel;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import org.apache.syncope.client.console.rest.SchemaRestClient;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxSpinnerFieldPanel;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.DateTimeFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
+import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
+import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.report.AbstractReportletConf;
+import org.apache.syncope.common.lib.report.Schema;
+import org.apache.syncope.common.lib.to.AbstractSchemaTO;
+import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.SchemaType;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.util.ListModel;
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.PropertyAccessorFactory;
+import org.springframework.util.ClassUtils;
+import org.apache.syncope.common.lib.report.SearchCondition;
+import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
+import org.apache.wicket.event.IEventSink;
+
+public class ReportletWizardBuilder extends 
AjaxWizardBuilder<ReportletDirectoryPanel.ReportletWrapper> {
+
+    private static final long serialVersionUID = 5945391813567245081L;
+
+    private final ReportRestClient restClient = new ReportRestClient();
+
+    private final String report;
+
+    public ReportletWizardBuilder(
+            final String report,
+            final ReportletDirectoryPanel.ReportletWrapper reportlet,
+            final PageReference pageRef) {
+        super(reportlet, pageRef);
+        this.report = report;
+    }
+
+    public ReportletWizardBuilder setEventSink(final IEventSink eventSink) {
+        this.eventSink = eventSink;
+        return this;
+    }
+
+    @Override
+    protected Serializable onApplyInternal(final 
ReportletDirectoryPanel.ReportletWrapper modelObject) {
+        modelObject.getConf().setName(modelObject.getName());
+
+        final ReportTO reportTO = restClient.read(report);
+
+        if (modelObject.isNew()) {
+            reportTO.getReportletConfs().add(modelObject.getConf());
+        } else {
+            CollectionUtils.filter(
+                    reportTO.getReportletConfs(), new 
Predicate<AbstractReportletConf>() {
+
+                @Override
+                public boolean evaluate(final AbstractReportletConf object) {
+                    return !object.getName().equals(modelObject.getOldName());
+                }
+            });
+            reportTO.getReportletConfs().add(modelObject.getConf());
+        }
+
+        BeanWrapper wrapper = 
PropertyAccessorFactory.forBeanPropertyAccess(modelObject.getConf());
+        for (Map.Entry<String, Pair<AbstractFiqlSearchConditionBuilder, 
List<SearchClause>>> entry
+                : modelObject.getSCondWrapper().entrySet()) {
+            wrapper.setPropertyValue(entry.getKey(),
+                    SearchUtils.buildFIQL(entry.getValue().getRight(), 
entry.getValue().getLeft()));
+        }
+
+        restClient.update(reportTO);
+        return modelObject;
+    }
+
+    @Override
+    protected WizardModel buildModelSteps(
+            final ReportletDirectoryPanel.ReportletWrapper modelObject, final 
WizardModel wizardModel) {
+        wizardModel.add(new Profile(modelObject));
+        wizardModel.add(new Configuration(modelObject));
+        return wizardModel;
+    }
+
+    public class Profile extends WizardStep {
+
+        private static final long serialVersionUID = -3043839139187792810L;
+
+        public Profile(final ReportletDirectoryPanel.ReportletWrapper 
reportlet) {
+
+            final AjaxTextFieldPanel name = new AjaxTextFieldPanel(
+                    "name", "reportlet", new PropertyModel<String>(reportlet, 
"name"), false);
+            name.addRequiredLabel();
+            name.setEnabled(true);
+            add(name);
+
+            final AjaxDropDownChoicePanel<String> conf = new 
AjaxDropDownChoicePanel<>(
+                    "configuration", getString("configuration"), new 
PropertyModel<String>(reportlet, "conf") {
+
+                private static final long serialVersionUID = 
-6427731218492117883L;
+
+                @Override
+                public String getObject() {
+                    return reportlet.getConf() == null ? null : 
reportlet.getConf().getClass().getName();
+                }
+
+                @Override
+                public void setObject(final String object) {
+                    AbstractReportletConf conf = null;
+
+                    try {
+                        conf = 
AbstractReportletConf.class.cast(Class.forName(object).newInstance());
+                    } catch (ClassNotFoundException | InstantiationException | 
IllegalAccessException e) {
+                        LOG.warn("Error retrieving reportlet configuration 
instance", e);
+                    }
+
+                    reportlet.setConf(conf);
+                }
+            });
+
+            conf.setChoices(new 
ArrayList<>(SyncopeConsoleSession.get().getPlatformInfo().getReportletConfs()));
+
+            conf.addRequiredLabel();
+            add(conf);
+        }
+    }
+
+    public class Configuration extends WizardStep {
+
+        private static final long serialVersionUID = -785981096328637758L;
+
+        private final String[] excluded = new String[] { "serialVersionUID", 
"class", "name", "reportletClassName" };
+
+        private final ReportletDirectoryPanel.ReportletWrapper reportlet;
+
+        public Configuration(final ReportletDirectoryPanel.ReportletWrapper 
reportlet) {
+            this.reportlet = reportlet;
+
+            LoadableDetachableModel<List<String>> propViewModel = new 
LoadableDetachableModel<List<String>>() {
+
+                private static final long serialVersionUID = 
5275935387613157437L;
+
+                @Override
+                protected List<String> load() {
+                    List<String> result = new ArrayList<String>();
+                    if (Configuration.this.reportlet.getConf() != null) {
+                        for (Field field : 
Configuration.this.reportlet.getConf().getClass().getDeclaredFields()) {
+                            if (!ArrayUtils.contains(excluded, 
field.getName())) {
+                                result.add(field.getName());
+                            }
+                        }
+                    }
+
+                    return result;
+                }
+            };
+
+            add(new ListView<String>("propView", propViewModel) {
+
+                private static final long serialVersionUID = 
9101744072914090143L;
+
+                @SuppressWarnings({ "unchecked", "rawtypes" })
+                @Override
+                protected void populateItem(final ListItem<String> item) {
+                    final String fieldName = item.getModelObject();
+
+                    item.add(new Label("fieldName", new 
ResourceModel(fieldName, fieldName)));
+
+                    Field field = null;
+                    try {
+                        field = 
reportlet.getConf().getClass().getDeclaredField(fieldName);
+                    } catch (NoSuchFieldException | SecurityException e) {
+                        LOG.error("Could not find field {} in class {}", 
fieldName, reportlet.getConf().getClass(), e);
+                    }
+
+                    if (field == null) {
+                        return;
+                    }
+
+                    final SearchCondition scondAnnot = 
field.getAnnotation(SearchCondition.class);
+                    final Schema schemaAnnot = 
field.getAnnotation(Schema.class);
+
+                    BeanWrapper wrapper = 
PropertyAccessorFactory.forBeanPropertyAccess(reportlet.getConf());
+
+                    Panel panel;
+
+                    if (scondAnnot != null) {
+                        final String fiql = (String) 
wrapper.getPropertyValue(fieldName);
+
+                        final List<SearchClause> clauses;
+                        if (StringUtils.isEmpty(fiql)) {
+                            clauses = new ArrayList<>();
+                        } else {
+                            clauses = SearchUtils.getSearchClauses(fiql);
+                        }
+
+                        final AbstractFiqlSearchConditionBuilder builder;
+
+                        switch (scondAnnot.type()) {
+                            case "USER":
+                                panel = new UserSearchPanel.Builder(
+                                        new 
ListModel<SearchClause>(clauses)).required(false).build("value");
+                                builder = 
SyncopeClient.getUserSearchConditionBuilder();
+                                break;
+                            case "GROUP":
+                                panel = new GroupSearchPanel.Builder(
+                                        new 
ListModel<SearchClause>(clauses)).required(false).build("value");
+                                builder = 
SyncopeClient.getGroupSearchConditionBuilder();
+                                break;
+                            default:
+                                panel = new AnyObjectSearchPanel.Builder(
+                                        scondAnnot.type(),
+                                        new 
ListModel<SearchClause>(clauses)).required(false).build("value");
+                                builder = 
SyncopeClient.getAnyObjectSearchConditionBuilder(null);
+                        }
+
+                        reportlet.getSCondWrapper().put(fieldName, 
Pair.of(builder, clauses));
+                    } else if (List.class.equals(field.getType())) {
+                        Class<?> listItemType = String.class;
+                        if (field.getGenericType() instanceof 
ParameterizedType) {
+                            listItemType = (Class<?>) ((ParameterizedType) 
field.getGenericType()).
+                                    getActualTypeArguments()[0];
+                        }
+
+                        if (listItemType.equals(String.class) && schemaAnnot 
!= null) {
+                            SchemaRestClient schemaRestClient = new 
SchemaRestClient();
+
+                            List<AbstractSchemaTO> choices;
+                            switch (schemaAnnot.schema()) {
+                                case UserPlainSchema:
+                                    choices = 
schemaRestClient.getSchemas(SchemaType.PLAIN, AnyTypeKind.USER);
+                                    break;
+
+                                case UserDerivedSchema:
+                                    choices = 
schemaRestClient.getSchemas(SchemaType.DERIVED, AnyTypeKind.USER);
+                                    break;
+
+                                case UserVirtualSchema:
+                                    choices = 
schemaRestClient.getSchemas(SchemaType.VIRTUAL, AnyTypeKind.USER);
+                                    break;
+
+                                case GroupPlainSchema:
+                                    choices = 
schemaRestClient.getSchemas(SchemaType.PLAIN, AnyTypeKind.GROUP);
+                                    break;
+
+                                case GroupDerivedSchema:
+                                    choices = 
schemaRestClient.getSchemas(SchemaType.DERIVED, AnyTypeKind.GROUP);
+                                    break;
+
+                                case GroupVirtualSchema:
+                                    choices = 
schemaRestClient.getSchemas(SchemaType.VIRTUAL, AnyTypeKind.GROUP);
+                                    break;
+
+                                case AnyObjectPlainSchema:
+                                    choices = 
schemaRestClient.getSchemas(SchemaType.PLAIN, AnyTypeKind.ANY_OBJECT);
+                                    break;
+
+                                case AnyObjectDerivedSchema:
+                                    choices = 
schemaRestClient.getSchemas(SchemaType.DERIVED, AnyTypeKind.ANY_OBJECT);
+                                    break;
+
+                                case AnyObjectVirtualSchema:
+                                    choices = 
schemaRestClient.getSchemas(SchemaType.VIRTUAL, AnyTypeKind.ANY_OBJECT);
+                                    break;
+
+                                default:
+                                    choices = Collections.emptyList();
+                            }
+
+                            panel = new 
AjaxPalettePanel.Builder<String>().setName(fieldName).build(
+                                    "value",
+                                    new 
PropertyModel<List<String>>(reportlet.getConf(), fieldName),
+                                    new ListModel<String>(
+                                            CollectionUtils.collect(
+                                                    choices, new 
Transformer<AbstractSchemaTO, String>() {
+
+                                                @Override
+                                                public String transform(final 
AbstractSchemaTO input) {
+                                                    return input.getKey();
+                                                }
+                                            }, new 
ArrayList<String>()))).hideLabel();
+                        } else if (listItemType.isEnum()) {
+                            panel = new 
AjaxPalettePanel.Builder<String>().setName(fieldName).build(
+                                    "value",
+                                    new 
PropertyModel<List<String>>(reportlet.getConf(), fieldName),
+                                    new 
ListModel(Arrays.asList(listItemType.getEnumConstants()))).hideLabel();
+                        } else {
+                            if (((List) 
wrapper.getPropertyValue(fieldName)).isEmpty()) {
+                                ((List) 
wrapper.getPropertyValue(fieldName)).add(null);
+                            }
+
+                            panel = new MultiFieldPanel.Builder<String>(
+                                    new 
PropertyModel<List<String>>(reportlet.getConf(), fieldName)).build(
+                                    "value",
+                                    fieldName,
+                                    buildSinglePanel(field.getType(), 
fieldName, "panel")).hideLabel();
+                        }
+                    } else {
+                        panel = buildSinglePanel(field.getType(), fieldName, 
"value").hideLabel();
+                    }
+
+                    item.add(panel.setRenderBodyOnly(true));
+                }
+            });
+        }
+
+        @SuppressWarnings({ "unchecked", "rawtypes" })
+        private FieldPanel buildSinglePanel(final Class<?> type, final String 
fieldName, final String id) {
+            FieldPanel result = null;
+            PropertyModel model = new PropertyModel(reportlet.getConf(), 
fieldName);
+            if (ClassUtils.isAssignable(Boolean.class, type)) {
+                result = new AjaxCheckBoxPanel(id, fieldName, model);
+            } else if (ClassUtils.isAssignable(Number.class, type)) {
+                result = new AjaxSpinnerFieldPanel.Builder<Number>().build(
+                        id, fieldName, (Class<Number>) 
ClassUtils.resolvePrimitiveIfNecessary(type), model);
+            } else if (Date.class.equals(type)) {
+                result = new DateTimeFieldPanel(id, fieldName, model, 
SyncopeConstants.DEFAULT_DATE_PATTERN);
+            } else if (type.isEnum()) {
+                result = new AjaxDropDownChoicePanel(id, fieldName, 
model).setChoices(
+                        Arrays.asList(type.getEnumConstants()));
+            }
+
+            // treat as String if nothing matched above
+            if (result == null) {
+                result = new AjaxTextFieldPanel(id, fieldName, model);
+            }
+
+            result.hideLabel();
+            return result;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
index b7b1b45..570c969 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
@@ -18,17 +18,22 @@
  */
 package org.apache.syncope.client.console.rest;
 
+import static org.apache.syncope.client.console.rest.BaseRestClient.getService;
+
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
+import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.to.DerSchemaTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.VirSchemaTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.common.rest.api.beans.SchemaQuery;
+import org.apache.syncope.common.rest.api.service.AnyTypeService;
 import org.apache.syncope.common.rest.api.service.SchemaService;
 
 /**
@@ -38,6 +43,45 @@ public class SchemaRestClient extends BaseRestClient {
 
     private static final long serialVersionUID = -2479730152700312373L;
 
+    public <T extends AbstractSchemaTO> List<T> getSchemas(final SchemaType 
schemaType, final AnyTypeKind kind) {
+        final AnyTypeService client = getService(AnyTypeService.class);
+
+        final List<String> classes = new ArrayList<>();
+
+        switch (kind) {
+            case USER:
+            case GROUP:
+                final AnyTypeTO type = client.read(kind.name());
+                if (type != null) {
+                    classes.addAll(type.getClasses());
+                }
+                break;
+            default:
+                for (AnyTypeTO anyTypeTO : 
getService(AnyTypeService.class).list()) {
+                    if (anyTypeTO.getKind() != AnyTypeKind.USER && 
anyTypeTO.getKind() != AnyTypeKind.GROUP) {
+                        classes.addAll(anyTypeTO.getClasses());
+                    }
+                }
+        }
+        return getSchemas(schemaType, classes.toArray(new String[] {}));
+    }
+
+    public <T extends AbstractSchemaTO> List<T> getSchemas(final SchemaType 
schemaType, final String typeName) {
+        AnyTypeTO type = null;
+
+        try {
+            type = getService(AnyTypeService.class).read(typeName);
+        } catch (SyncopeClientException e) {
+            LOG.error("While reading all any types", e);
+        }
+
+        if (type == null) {
+            return getSchemas(schemaType);
+        } else {
+            return getSchemas(schemaType, type.getClasses().toArray(new 
String[] {}));
+        }
+    }
+
     public <T extends AbstractSchemaTO> List<T> getSchemas(final SchemaType 
schemaType, final String... kind) {
         List<T> schemas = new ArrayList<>();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
index bc62538..b28998f 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
@@ -144,8 +144,13 @@ public class BaseModal<T extends Serializable> extends 
Modal<T> {
         return this;
     }
 
-    public BaseModal<T> changeCloseButtonLabel(final String label, final 
AjaxRequestTarget target) {
+    public BaseModal<T> changeCloseButtonLabel(final String label) {
         defaultModalCloseButton.getModel().setObject(label);
+        return this;
+    }
+
+    public BaseModal<T> changeCloseButtonLabel(final String label, final 
AjaxRequestTarget target) {
+        changeCloseButtonLabel(label);
         target.add(defaultModalCloseButton);
         return this;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
index 0d9c074..a79e4a7 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
@@ -50,6 +50,7 @@ public abstract class ActionLink<T extends Serializable> 
implements Serializable
         FO_EDIT("read"),
         HTML_EDIT("read"),
         TEXT_EDIT("read"),
+        COMPOSE("update"),
         LAYOUT_EDIT("read"),
         RESET("update"),
         ENABLE("update"),

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
index 69bb761..85bfb20 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
@@ -65,6 +65,7 @@ public final class ActionLinksPanel<T extends Serializable> 
extends Panel {
         super.add(new Fragment("panelFoEdit", "emptyFragment", this));
         super.add(new Fragment("panelHtmlEdit", "emptyFragment", this));
         super.add(new Fragment("panelTextEdit", "emptyFragment", this));
+        super.add(new Fragment("panelCompose", "emptyFragment", this));
         super.add(new Fragment("panelLayoutEdit", "emptyFragment", this));
         super.add(new Fragment("panelReset", "emptyFragment", this));
         super.add(new Fragment("panelEnable", "emptyFragment", this));
@@ -388,6 +389,25 @@ public final class ActionLinksPanel<T extends 
Serializable> extends Panel {
                 }.setVisible(link.isEnabled(model.getObject())));
                 break;
 
+            case COMPOSE:
+                fragment = new Fragment("panelCompose", "fragmentCompose", 
this);
+
+                fragment.addOrReplace(new 
IndicatingAjaxLink<Void>("composeLink") {
+
+                    private static final long serialVersionUID = 
-1876519166660008562L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target) {
+                        link.onClick(target, model.getObject());
+                    }
+
+                    @Override
+                    public String getAjaxIndicatorMarkupId() {
+                        return disableIndicator ? StringUtils.EMPTY : 
super.getAjaxIndicatorMarkupId();
+                    }
+                }.setVisible(link.isEnabled(model.getObject())));
+                break;
+
             case LAYOUT_EDIT:
                 fragment = new Fragment("panelLayoutEdit", 
"fragmentLayoutEdit", this);
 
@@ -904,6 +924,10 @@ public final class ActionLinksPanel<T extends 
Serializable> extends Panel {
                 super.addOrReplace(new Fragment("panelCreate", 
"emptyFragment", this));
                 break;
 
+            case COMPOSE:
+                super.addOrReplace(new Fragment("panelCompose", 
"emptyFragment", this));
+                break;
+
             case EDIT:
                 super.addOrReplace(new Fragment("panelEdit", "emptyFragment", 
this));
                 break;

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
index b0b5e94..bf16686 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
@@ -58,7 +58,7 @@ public class AjaxPalettePanel<T extends Serializable> extends 
AbstractFieldPanel
 
     public AjaxPalettePanel(
             final String id, final IModel<List<T>> model, final 
Builder.Query<T> choices, final Builder<T> builder) {
-        super(id, id, model);
+        super(id, builder.name == null ? id : builder.name, model);
 
         choicesModel = new PaletteLoadableDetachableModel(builder) {
 
@@ -74,7 +74,7 @@ public class AjaxPalettePanel<T extends Serializable> extends 
AbstractFieldPanel
 
     public AjaxPalettePanel(
             final String id, final IModel<List<T>> model, final ListModel<T> 
choices, final Builder<T> builder) {
-        super(id, id, model);
+        super(id, builder.name == null ? id : builder.name, model);
 
         choicesModel = new PaletteLoadableDetachableModel(builder) {
 
@@ -218,6 +218,8 @@ public class AjaxPalettePanel<T extends Serializable> 
extends AbstractFieldPanel
 
         private String filter = conf.getDefaultFilter();
 
+        private String name;
+
         public Builder() {
             this.allowMoveAll = false;
             this.allowOrder = false;
@@ -225,6 +227,11 @@ public class AjaxPalettePanel<T extends Serializable> 
extends AbstractFieldPanel
             this.renderer = new SelectChoiceRenderer<>();
         }
 
+        public Builder<T> setName(final String name) {
+            this.name = name;
+            return this;
+        }
+
         public Builder<T> setAllowOrder(final boolean allowOrder) {
             this.allowOrder = allowOrder;
             return this;

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
index 9d6d76a..65dc06a 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
@@ -24,11 +24,15 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.event.IEventSink;
 import org.apache.wicket.extensions.wizard.WizardModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public abstract class AjaxWizardBuilder<T extends Serializable> extends 
AbstractModalPanelBuilder<T> {
 
     private static final long serialVersionUID = 5241745929825564456L;
 
+    protected static final Logger LOG = 
LoggerFactory.getLogger(AjaxWizardBuilder.class);
+
     protected AjaxWizard.Mode mode = AjaxWizard.Mode.CREATE;
 
     protected IEventSink eventSink = null;

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
index 74ad18d..430ed35 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
@@ -67,6 +67,8 @@ public abstract class WizardMgtPanel<T extends Serializable> 
extends Panel imple
 
     protected final AjaxLink<?> addAjaxLink;
 
+    protected final AjaxLink<?> exitAjaxLink;
+
     protected ModalPanelBuilder<T> newItemPanelBuilder;
 
     protected NotificationPanel notificationPanel;
@@ -123,6 +125,20 @@ public abstract class WizardMgtPanel<T extends 
Serializable> extends Panel imple
         addAjaxLink.setVisible(false);
         initialFragment.addOrReplace(addAjaxLink);
 
+        exitAjaxLink = new AjaxLink<T>("exit") {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+                send(WizardMgtPanel.this, Broadcast.EXACT, new 
ExitEvent(target));
+            }
+        };
+
+        exitAjaxLink.setEnabled(false);
+        exitAjaxLink.setVisible(false);
+        initialFragment.addOrReplace(exitAjaxLink);
+
         add(new ListView<Component>("outerObjectsRepeater", outerObjects) {
 
             private static final long serialVersionUID = -9180479401817023838L;
@@ -138,7 +154,11 @@ public abstract class WizardMgtPanel<T extends 
Serializable> extends Panel imple
     @Override
     @SuppressWarnings("unchecked")
     public void onEvent(final IEvent<?> event) {
-        if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
+        if (event.getPayload() instanceof ExitEvent && modal != null) {
+            final AjaxRequestTarget target = 
ExitEvent.class.cast(event.getPayload()).getTarget();
+            // default behaviour: change it catching the event if needed
+            modal.close(target);
+        } else if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
             final AjaxWizard.NewItemEvent<T> newItemEvent = 
AjaxWizard.NewItemEvent.class.cast(event.getPayload());
             final AjaxRequestTarget target = newItemEvent.getTarget();
             final T item = newItemEvent.getItem();
@@ -169,7 +189,6 @@ public abstract class WizardMgtPanel<T extends 
Serializable> extends Panel imple
                 }
             } else if (event.getPayload() instanceof 
AjaxWizard.NewItemCancelEvent) {
                 if (wizardInModal) {
-                    modal.show(false);
                     modal.close(target);
                 } else {
                     container.addOrReplace(initialFragment);
@@ -187,23 +206,21 @@ public abstract class WizardMgtPanel<T extends 
Serializable> extends Panel imple
 
                         @Override
                         protected void closeAction(final AjaxRequestTarget 
target) {
-                            modal.show(false);
                             modal.close(target);
                         }
 
                         @Override
-                        protected Panel customResultBody(
-                                final String id, final T item, final 
Serializable result) {
+                        protected Panel customResultBody(final String id, 
final T item, final Serializable result) {
                             return WizardMgtPanel.this.customResultBody(id, 
item, result);
                         }
                     });
                     target.add(modal.getForm());
                 } else if (wizardInModal) {
-                    modal.show(false);
                     modal.close(target);
                 } else {
                     container.addOrReplace(initialFragment);
                 }
+                customActionOnCloseCallback(target);
             }
 
             if (containerAutoRefresh) {
@@ -230,6 +247,17 @@ public abstract class WizardMgtPanel<T extends 
Serializable> extends Panel imple
     }
 
     /**
+     * Show exit butto sending ExitEvent paylad.
+     *
+     * @return the current instance.
+     */
+    protected final WizardMgtPanel<T> enableExitButton() {
+        exitAjaxLink.setEnabled(true);
+        exitAjaxLink.setVisible(true);
+        return this;
+    }
+
+    /**
      * Add object inside the main container.
      *
      * @param childs components to be added.
@@ -298,7 +326,6 @@ public abstract class WizardMgtPanel<T extends 
Serializable> extends Panel imple
             @Override
             public void onClose(final AjaxRequestTarget target) {
                 modal.show(false);
-                customActionOnCloseCallback(target);
             }
         });
     }
@@ -384,4 +411,17 @@ public abstract class WizardMgtPanel<T extends 
Serializable> extends Panel imple
             return this;
         }
     }
+
+    public static class ExitEvent {
+
+        private final AjaxRequestTarget target;
+
+        public ExitEvent(final AjaxRequestTarget target) {
+            this.target = target;
+        }
+
+        public AjaxRequestTarget getTarget() {
+            return target;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css 
b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
index c854b05..5e3db1b 100644
--- 
a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
+++ 
b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
@@ -261,7 +261,7 @@ div.wizard-view div.wizard-view{
 
 .wizard-view > div {
   display: block;
-  height: 98%;
+  height: 95%;
   position: relative;
 }
 
@@ -640,10 +640,18 @@ START - Search - AjaxDateTimePicker
   width: 120px !important;
 }
 
+.clause .type button{
+  width: 120px !important;
+}
+
 .clause .property{
   width: 190px;
 }
 
+.clause .property button{
+  width: 190px;
+}
+
 .clause .comparator{
   width: 100px;
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
index 5b05753..d63f1c0 100644
--- 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
@@ -33,3 +33,5 @@ any.new=New Report
 any.finish=Submit Report
 any.cancel=Cancel Report
 report.view=Executions of report '${key}'
+reportlet.conf=Reportlet configuration for ${key}
+close=Close

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
index 89ec0ab..8449d96 100644
--- 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
@@ -33,3 +33,5 @@ any.new=Nuovo Report
 any.finish=Conferma Report
 any.cancel=Annulla Report
 report.view=Esecuzioni del report '${key}'
+reportlet.conf=Configurazione reportlet per ${key}
+close=Close

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
index d13bf06..a0ad069 100644
--- 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
@@ -33,3 +33,5 @@ any.new=New Report
 any.finish=Submit Report
 any.cancel=Cancel Report
 report.view=Executions of report '${key}'
+reportlet.conf=Reportlet configuration for ${key}
+close=Close

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
index 18fee1d..f6124f7 100644
--- 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
@@ -41,3 +41,5 @@ any.finish=Submit Report
 any.cancel=Cancel Report
 # 
task.view=\u00d0\u0097\u00d0\u00b0\u00d0\u00bf\u00d1\u0083\u00d1\u0081\u00d0\u00ba\u00d0\u00b8
 \u00d0\u00b7\u00d0\u00b0\u00d0\u00b4\u00d0\u00b0\u00d1\u0087\u00d0\u00b8
 report.view=Executions of report '${key}'
+reportlet.conf=Reportlet configuration for ${key}
+close=Close

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
index b090ddd..1345bdb 100644
--- 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
@@ -18,7 +18,7 @@ under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml"; 
xmlns:wicket="http://wicket.apache.org";>
   <wicket:panel>
-    <div class="form-group"><span wicket:id="name">[id]</span></div>
+    <div class="form-group"><span wicket:id="name">[name]</span></div>
     <div class="form-group"><span wicket:id="template">[template]</span></div>
     <div class="form-group"><span wicket:id="active">[active]</span></div>
   </wicket:panel>

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties
new file mode 100644
index 0000000..680d073
--- /dev/null
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+reportlet=Reportlet
+profile=Profile
+configuration=Configuration

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties
new file mode 100644
index 0000000..7a16c3b
--- /dev/null
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+reportlet=Reportlet
+profile=Profilo
+configuration=Configurazione

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties
new file mode 100644
index 0000000..680d073
--- /dev/null
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+reportlet=Reportlet
+profile=Profile
+configuration=Configuration

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties
new file mode 100644
index 0000000..680d073
--- /dev/null
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+reportlet=Reportlet
+profile=Profile
+configuration=Configuration

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html
new file mode 100644
index 0000000..3d58410
--- /dev/null
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html
@@ -0,0 +1,28 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml"; 
xmlns:wicket="http://wicket.apache.org";>
+  <wicket:panel>
+    <div wicket:id="propView">
+      <div class="form-group inforow">
+        <label wicket:id="fieldName">[LABEL]</label>
+        <span wicket:id="value">[value]</span>
+      </div>
+    </div>
+  </wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties
new file mode 100644
index 0000000..8d2c500
--- /dev/null
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+plainAttrs=Plain Attributes
+derAttrs=Derived Attributes
+virAttrs=Virtual Attributes
+features=Features
+matchingCond=Matching Condition
+userMatchingCond=User Matching Condition
+groupMatchingCond=Group Matching Condition
+anyObjectMatchingCond=AnyObject Matching Condition

http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties
new file mode 100644
index 0000000..6688f85
--- /dev/null
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+plainAttrs=Attributi
+derAttrs=Attributi Derivati
+virAttrs=Attributi Virtuali
+features=Features
+matchingCond=Condizione di matching
+userMatchingCond=Condizione di matching utente
+groupMatchingCond=Condizione di matching gruppo
+anyObjectMatchingCond=Condizione di matching any

Reply via email to