syncope-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fmarte...@apache.org
Subject [2/2] syncope git commit: [SYNCOPE-820] provides user / group / any object template(s) for pull tasks
Date Tue, 10 May 2016 15:36:54 GMT
[SYNCOPE-820] provides user / group / any object template(s) for pull tasks


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

Branch: refs/heads/master
Commit: 1c281801661afcbd0b204b63364598f772db5b53
Parents: ce4b80f
Author: fmartelli <fabio.martelli@gmail.com>
Authored: Tue May 10 17:36:34 2016 +0200
Committer: fmartelli <fabio.martelli@gmail.com>
Committed: Tue May 10 17:36:34 2016 +0200

----------------------------------------------------------------------
 .../client/console/commons/Constants.java       | 10 ++-
 .../console/tasks/PullTaskDirectoryPanel.java   |  1 +
 .../syncope/client/console/tasks/PullTasks.java |  3 +-
 .../syncope/client/console/tasks/PushTasks.java |  3 +-
 .../console/tasks/SchedTaskDirectoryPanel.java  | 13 +++-
 .../client/console/tasks/SchedTasks.java        |  3 +-
 .../console/tasks/TaskDirectoryPanel.java       |  2 +-
 .../console/tasks/TemplatesTogglePanel.java     | 54 ++++++++------
 .../markup/html/form/AjaxTextFieldPanel.java    | 12 ++++
 .../client/console/wizards/AjaxWizard.java      | 12 ++++
 .../console/wizards/AjaxWizardBuilder.java      |  1 +
 .../console/wizards/AjaxWizardMgtButtonBar.java |  1 +
 .../client/console/wizards/WizardMgtPanel.java  |  6 ++
 .../any/AnyObjectTemplateWizardBuilder.java     | 76 ++++++++++++++++++++
 .../console/wizards/any/GroupDetails.java       |  4 +-
 .../wizards/any/GroupTemplateWizardBuilder.java | 73 +++++++++++++++++++
 .../console/wizards/any/GroupWizardBuilder.java |  5 +-
 .../client/console/wizards/any/PlainAttrs.java  | 26 +++++--
 .../wizards/any/TemplateWizardBuilder.java      | 30 ++++++++
 .../client/console/wizards/any/UserDetails.java |  7 +-
 .../wizards/any/UserTemplateWizardBuilder.java  | 73 +++++++++++++++++++
 .../console/wizards/any/UserWizardBuilder.java  |  3 +-
 .../client/console/wizards/any/VirAttrs.java    |  2 +-
 .../resources/ResourceProvisionPanel.java       | 18 +++--
 .../console/tasks/TaskDirectoryPanel.properties |  6 +-
 .../tasks/TaskDirectoryPanel_it.properties      |  6 +-
 .../tasks/TaskDirectoryPanel_pt_BR.properties   |  6 +-
 .../tasks/TaskDirectoryPanel_ru.properties      |  6 +-
 .../markup/html/form/AjaxTextFieldPanel.html    |  1 +
 .../client/console/wizards/WizardMgtPanel.html  | 13 +++-
 .../resources/ResourceProvisionPanel.properties |  2 +
 .../ResourceProvisionPanel_it.properties        |  2 +
 .../ResourceProvisionPanel_pt_BR.properties     |  2 +
 .../ResourceProvisionPanel_ru.properties        |  2 +
 34 files changed, 430 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/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 38dba85..6c6d4fa 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
@@ -170,7 +170,15 @@ public final class Constants {
         return new Label(id, Model.of()).add(new PopoverBehavior(
                 Model.<String>of(),
                 msg,
-                new PopoverConfig().withHtml(true).withPlacement(placement)));
+                new PopoverConfig().withHtml(true).withPlacement(placement)) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected String createRelAttribute() {
+                return id;
+            }
+        });
     }
 
     public static Component getJEXLPopover(final Component caller, final TooltipConfig.Placement placement) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/tasks/PullTaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PullTaskDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PullTaskDirectoryPanel.java
index 459e82d..c3d48b1 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PullTaskDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PullTaskDirectoryPanel.java
@@ -60,6 +60,7 @@ public abstract class PullTaskDirectoryPanel extends ProvisioningTaskDirectoryPa
 
             @Override
             public void onClick(final AjaxRequestTarget target, final PullTaskTO ignore) {
+                templates.setTask(model.getObject());
                 templates.toggle(target, true);
             }
         }, ActionLink.ActionType.TEMPLATE, StandardEntitlement.TASK_UPDATE);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/tasks/PullTasks.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PullTasks.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PullTasks.java
index 120998e..ca8bf34 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PullTasks.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PullTasks.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.tasks;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -45,7 +46,7 @@ public class PullTasks extends AbstractTasks {
             @Override
             protected void viewTask(final PullTaskTO taskTO, final AjaxRequestTarget target) {
                 mlp.next(
-                        new StringResourceModel("task.view", this, new Model<>(taskTO)).getObject(),
+                        new StringResourceModel("task.view", this, new Model<>(Pair.of(null, taskTO))).getObject(),
                         new TaskExecutionDetails<>(baseModal, taskTO, pageRef), target);
             }
         });

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTasks.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTasks.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTasks.java
index d23e980..56dea3a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTasks.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTasks.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.tasks;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -45,7 +46,7 @@ public class PushTasks extends AbstractTasks {
             @Override
             protected void viewTask(final PushTaskTO taskTO, final AjaxRequestTarget target) {
                 mlp.next(
-                        new StringResourceModel("task.view", this, new Model<>(taskTO)).getObject(),
+                        new StringResourceModel("task.view", this, new Model<>(Pair.of(null, taskTO))).getObject(),
                         new TaskExecutionDetails<>(baseModal, taskTO, pageReference), target);
             }
         });

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
index 1f36f95..2b72125 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
@@ -25,6 +25,7 @@ import java.util.Iterator;
 import java.util.List;
 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.TaskDataProvider;
@@ -191,7 +192,11 @@ public abstract class SchedTaskDirectoryPanel<T extends SchedTaskTO>
                                 send(SchedTaskDirectoryPanel.this, Broadcast.EXACT,
                                         new AjaxWizard.EditItemActionEvent<>(
                                                 restClient.readSchedTask(reference, model.getObject().getKey()),
-                                                target));
+                                                target).setResourceModel(
+                                                new StringResourceModel("inner.task.edit",
+                                                        SchedTaskDirectoryPanel.this,
+                                                        Model.of(Pair.of(
+                                                                ActionLink.ActionType.EDIT, model.getObject())))));
                             }
                         }, ActionLink.ActionType.EDIT, StandardEntitlement.TASK_UPDATE).
                         add(new ActionLink<T>() {
@@ -203,7 +208,11 @@ public abstract class SchedTaskDirectoryPanel<T extends SchedTaskTO>
                                 final T clone = SerializationUtils.clone(model.getObject());
                                 clone.setKey(null);
                                 send(SchedTaskDirectoryPanel.this, Broadcast.EXACT,
-                                        new AjaxWizard.EditItemActionEvent<>(clone, target));
+                                        new AjaxWizard.EditItemActionEvent<>(clone, target).setResourceModel(
+                                                new StringResourceModel("inner.task.clone",
+                                                        SchedTaskDirectoryPanel.this,
+                                                        Model.of(Pair.of(
+                                                                ActionLink.ActionType.CLONE, model.getObject())))));
                             }
                         }, ActionLink.ActionType.CLONE, StandardEntitlement.TASK_CREATE).
                         add(new ActionLink<T>() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTasks.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTasks.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTasks.java
index b88dd31..d0e8907 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTasks.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTasks.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.tasks;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -45,7 +46,7 @@ public class SchedTasks extends AbstractTasks {
             @Override
             protected void viewTask(final SchedTaskTO taskTO, final AjaxRequestTarget target) {
                 mlp.next(
-                        new StringResourceModel("task.view", this, new Model<>(taskTO)).getObject(),
+                        new StringResourceModel("task.view", this, new Model<>(Pair.of(null, taskTO))).getObject(),
                         new TaskExecutionDetails<>(baseModal, taskTO, pageReference), target);
             }
         });

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
index 99c5c76..41ae2ff 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
@@ -46,7 +46,7 @@ public abstract class TaskDirectoryPanel<T extends AbstractTaskTO>
 
     private static final long serialVersionUID = 4984337552918213290L;
 
-    private final BaseModal<?> baseModal;
+    protected final BaseModal<?> baseModal;
 
     private final MultilevelPanel multiLevelPanelRef;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/tasks/TemplatesTogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TemplatesTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TemplatesTogglePanel.java
index 5cec257..1690126 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TemplatesTogglePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TemplatesTogglePanel.java
@@ -20,10 +20,10 @@ package org.apache.syncope.client.console.tasks;
 
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import org.apache.commons.collections4.CollectionUtils;
 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.layout.AnyObjectFormLayoutInfo;
 import org.apache.syncope.client.console.layout.GroupFormLayoutInfo;
@@ -33,15 +33,14 @@ import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
-import org.apache.syncope.client.console.wizards.any.AnyObjectWizardBuilder;
-import org.apache.syncope.client.console.wizards.any.AnyWizardBuilder;
-import org.apache.syncope.client.console.wizards.any.GroupWizardBuilder;
-import org.apache.syncope.client.console.wizards.any.UserWizardBuilder;
+import org.apache.syncope.client.console.wizards.any.AnyObjectTemplateWizardBuilder;
+import org.apache.syncope.client.console.wizards.any.GroupTemplateWizardBuilder;
+import org.apache.syncope.client.console.wizards.any.TemplateWizardBuilder;
+import org.apache.syncope.client.console.wizards.any.UserTemplateWizardBuilder;
 import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
-import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.PullTaskTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -50,11 +49,14 @@ import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.StringResourceModel;
 
 public class TemplatesTogglePanel extends TogglePanel<Serializable> {
 
     private static final long serialVersionUID = -3195479265440591519L;
 
+    private PullTaskTO task;
+
     protected final Form<?> form;
 
     protected final Model<String> typeModel = new Model<>();
@@ -94,37 +96,39 @@ public class TemplatesTogglePanel extends TogglePanel<Serializable> {
             protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                 try {
                     final AjaxWizard.NewItemActionEvent<UserTO> payload
-                            = new AjaxWizard.NewItemActionEvent<>(null, target);
+                            = new AjaxWizard.NewItemActionEvent<UserTO>(null, target);
+
+                    payload.setResourceModel(new StringResourceModel("inner.template.edit", container,
+                            Model.of(Pair.of(typeModel.getObject(), task.getName()))).setDefaultValue("Edit template"));
+
+                    final List<String> classes = new AnyTypeRestClient().read(typeModel.getObject()).getClasses();
 
-                    final AnyWizardBuilder<?> builder;
+                    final TemplateWizardBuilder<?> builder;
 
                     switch (typeModel.getObject()) {
                         case "USER":
-                            builder = new UserWizardBuilder(
-                                    new UserTO(),
-                                    Collections.<String>emptyList(),
+                            builder = new UserTemplateWizardBuilder(
+                                    task,
+                                    classes,
                                     new UserFormLayoutInfo(),
                                     pageRef);
                             break;
                         case "GROUP":
-                            builder = new GroupWizardBuilder(
-                                    new GroupTO(),
-                                    Collections.<String>emptyList(),
+                            builder = new GroupTemplateWizardBuilder(
+                                    task,
+                                    classes,
                                     new GroupFormLayoutInfo(),
                                     pageRef);
                             break;
                         default:
-                            AnyObjectTO anyObjectTO = new AnyObjectTO();
-                            anyObjectTO.setType(typeModel.getObject());
-                            builder = new AnyObjectWizardBuilder(
-                                    anyObjectTO,
-                                    Collections.<String>emptyList(),
+                            builder = new AnyObjectTemplateWizardBuilder(
+                                    task,
+                                    typeModel.getObject(),
+                                    classes,
                                     new AnyObjectFormLayoutInfo(),
                                     pageRef);
                     }
-                    payload.forceModalPanel(builder.build(
-                            container.getActualId(), payload.getIndex(), AjaxWizard.Mode.TEMPLATE));
-
+                    payload.forceModalPanel(builder.setEventSink(container).build(container.getActualId()));
                     send(container, Broadcast.EXACT, payload);
                     toggle(target, false);
                 } catch (SyncopeClientException e) {
@@ -140,4 +144,8 @@ public class TemplatesTogglePanel extends TogglePanel<Serializable> {
             }
         });
     }
+
+    public void setTask(final PullTaskTO task) {
+        this.task = task;
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
index eb85677..31a5d9f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.wicket.markup.html.form;
 
+import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
@@ -25,6 +26,7 @@ import java.util.List;
 import java.util.regex.Pattern;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings;
 import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
@@ -36,6 +38,8 @@ public class AjaxTextFieldPanel extends FieldPanel<String> implements Cloneable
 
     private static final long serialVersionUID = 238940918106696068L;
 
+    private final Component questionMarkJexlHelp;
+
     private List<String> choices = Collections.emptyList();
 
     public AjaxTextFieldPanel(final String id, final String name, final IModel<String> model) {
@@ -46,6 +50,9 @@ public class AjaxTextFieldPanel extends FieldPanel<String> implements Cloneable
             final String id, final String name, final IModel<String> model, final boolean enableOnChange) {
         super(id, name, model);
 
+        questionMarkJexlHelp = Constants.getJEXLPopover(this, TooltipConfig.Placement.right);
+        add(questionMarkJexlHelp.setVisible(false));
+
         final AutoCompleteSettings settings = new AutoCompleteSettings();
         settings.setShowCompleteListOnFocusGain(true);
         settings.setShowListOnEmptyInput(true);
@@ -94,6 +101,11 @@ public class AjaxTextFieldPanel extends FieldPanel<String> implements Cloneable
         }
     }
 
+    public FieldPanel<String> enableJextHelp() {
+        questionMarkJexlHelp.setVisible(true);
+        return this;
+    }
+
     @Override
     public FieldPanel<String> clone() {
         final AjaxTextFieldPanel panel = (AjaxTextFieldPanel) super.clone();

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
index 688535a..f8b774f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
@@ -42,6 +42,7 @@ import org.apache.syncope.client.console.panels.SubmitableModalPanel;
 import org.apache.syncope.client.console.panels.WizardModalPanel;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.IModel;
 
 public abstract class AjaxWizard<T extends Serializable> extends Wizard
         implements SubmitableModalPanel, WizardModalPanel<T> {
@@ -199,6 +200,8 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard
 
         private final T item;
 
+        private IModel<String> resourceModel;
+
         private final AjaxRequestTarget target;
 
         private WizardModalPanel<?> modalPanel;
@@ -225,6 +228,15 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard
             return this;
         }
 
+        public IModel<String> getResourceModel() {
+            return resourceModel;
+        }
+
+        public NewItemEvent<T> setResourceModel(final IModel<String> resourceModel) {
+            this.resourceModel = resourceModel;
+            return this;
+        }
+
         public abstract String getEventDescription();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/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 7afef4d..f241b91 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
@@ -112,6 +112,7 @@ public abstract class AjaxWizardBuilder<T extends Serializable> extends Abstract
                         payload = getCreateCustomPayloadEvent(res, target);
                         break;
                     case EDIT:
+                    case TEMPLATE:
                         payload = getEditCustomPayloadEvent(res, target);
                         break;
                     default:

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardMgtButtonBar.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardMgtButtonBar.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardMgtButtonBar.java
index 157fea7..2b70466 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardMgtButtonBar.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardMgtButtonBar.java
@@ -111,6 +111,7 @@ public class AjaxWizardMgtButtonBar<T extends Serializable> extends WizardButton
             public final boolean isEnabled() {
                 switch (mode) {
                     case EDIT:
+                    case TEMPLATE:
                         return true;
                     case READONLY:
                         return false;

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/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 bf00efc..423b459 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
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.NotificationPanel;
@@ -46,6 +47,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.StringResourceModel;
 import org.apache.syncope.client.console.panels.WizardModalPanel;
+import org.apache.wicket.markup.html.basic.Label;
 
 public abstract class WizardMgtPanel<T extends Serializable> extends Panel implements IEventSource {
 
@@ -195,6 +197,10 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
                     modal.show(true);
                 } else {
                     final Fragment fragment = new Fragment("content", "wizard", WizardMgtPanel.this);
+
+                    fragment.add(new Label("title", newItemEvent.getResourceModel() == null
+                            ? Model.of(StringUtils.EMPTY) : newItemEvent.getResourceModel()));
+
                     fragment.add(Component.class.cast(modalPanel));
                     container.addOrReplace(fragment);
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectTemplateWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectTemplateWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectTemplateWizardBuilder.java
new file mode 100644
index 0000000..8c77ba9
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectTemplateWizardBuilder.java
@@ -0,0 +1,76 @@
+/*
+ * 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.wizards.any;
+
+import java.io.Serializable;
+import java.util.List;
+import org.apache.syncope.client.console.layout.AnyObjectFormLayoutInfo;
+import org.apache.syncope.client.console.rest.TaskRestClient;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.to.AnyObjectTO;
+import org.apache.syncope.common.lib.to.PullTaskTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.event.IEventSink;
+
+public class AnyObjectTemplateWizardBuilder extends AnyObjectWizardBuilder
+        implements TemplateWizardBuilder<AnyObjectTO> {
+
+    private static final long serialVersionUID = 6716803168859873877L;
+
+    private final PullTaskTO task;
+
+    private final String anyType;
+
+    public AnyObjectTemplateWizardBuilder(
+            final PullTaskTO task,
+            final String anyType,
+            final List<String> anyTypeClasses,
+            final AnyObjectFormLayoutInfo formLayoutInfo,
+            final PageReference pageRef) {
+        super(null, anyTypeClasses, formLayoutInfo, pageRef);
+        this.task = task;
+        this.anyType = anyType;
+
+        if (task.getTemplates().containsKey(this.anyType)) {
+            setItem(new AnyWrapper<>(AnyObjectTO.class.cast(task.getTemplates().get(this.anyType))));
+        } else {
+            AnyObjectTO anyObjectTO = new AnyObjectTO();
+            anyObjectTO.setType(this.anyType);
+            setItem(new AnyWrapper<>(new AnyObjectTO()));
+        }
+    }
+
+    @Override
+    public AjaxWizard<AnyWrapper<AnyObjectTO>> build(final String id) {
+        return super.build(id, AjaxWizard.Mode.TEMPLATE);
+    }
+
+    @Override
+    protected Serializable onApplyInternal(final AnyWrapper<AnyObjectTO> modelObject) {
+        task.getTemplates().put(anyType, modelObject.getInnerObject());
+        new TaskRestClient().update(task);
+        return task;
+    }
+
+    @Override
+    public TemplateWizardBuilder<AnyObjectTO> setEventSink(final IEventSink eventSink) {
+        this.eventSink = eventSink;
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupDetails.java
index e110a7e..05f9794 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupDetails.java
@@ -43,7 +43,9 @@ public class GroupDetails extends Details<GroupTO> {
 
         final AjaxTextFieldPanel name = new AjaxTextFieldPanel("name", "name",
                 new PropertyModel<String>(groupTO, "name"), false);
-        if (!templateMode) {
+        if (templateMode) {
+            name.enableJextHelp();
+        } else {
             name.addRequiredLabel();
         }
         this.add(name);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupTemplateWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupTemplateWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupTemplateWizardBuilder.java
new file mode 100644
index 0000000..bee17c0
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupTemplateWizardBuilder.java
@@ -0,0 +1,73 @@
+/*
+ * 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.wizards.any;
+
+import java.io.Serializable;
+import java.util.List;
+import org.apache.syncope.client.console.layout.GroupFormLayoutInfo;
+import org.apache.syncope.client.console.rest.TaskRestClient;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.PullTaskTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.event.IEventSink;
+
+public class GroupTemplateWizardBuilder extends GroupWizardBuilder implements TemplateWizardBuilder<GroupTO> {
+
+    private static final long serialVersionUID = 6716803168859873877L;
+
+    private final PullTaskTO task;
+
+    private final String anyType;
+
+    public GroupTemplateWizardBuilder(
+            final PullTaskTO task,
+            final List<String> anyTypeClasses,
+            final GroupFormLayoutInfo formLayoutInfo,
+            final PageReference pageRef) {
+        super(null, anyTypeClasses, formLayoutInfo, pageRef);
+        this.task = task;
+        this.anyType = AnyTypeKind.GROUP.name();
+
+        if (task.getTemplates().containsKey(this.anyType)) {
+            setItem(new GroupWrapper(GroupTO.class.cast(task.getTemplates().get(this.anyType))));
+        } else {
+            setItem(new GroupWrapper(new GroupTO()));
+        }
+    }
+
+    @Override
+    public AjaxWizard<AnyWrapper<GroupTO>> build(final String id) {
+        return super.build(id, AjaxWizard.Mode.TEMPLATE);
+    }
+
+    @Override
+    protected Serializable onApplyInternal(final AnyWrapper<GroupTO> modelObject) {
+        task.getTemplates().put(anyType, modelObject.getInnerObject());
+        new TaskRestClient().update(task);
+        return task;
+    }
+
+    @Override
+    public TemplateWizardBuilder<GroupTO> setEventSink(final IEventSink eventSink) {
+        this.eventSink = eventSink;
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
index e6637c0..2306fb0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
@@ -25,6 +25,7 @@ import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.layout.GroupForm;
 import org.apache.syncope.client.console.layout.GroupFormLayoutInfo;
 import org.apache.syncope.client.console.rest.GroupRestClient;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
 import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.GroupPatch;
@@ -46,7 +47,7 @@ public class GroupWizardBuilder extends AnyWizardBuilder<GroupTO> implements Gro
             final GroupFormLayoutInfo formLayoutInfo,
             final PageReference pageRef) {
 
-        super(new GroupWrapper(groupTO), anyTypeClasses, formLayoutInfo, pageRef);
+        super(groupTO == null ? null : new GroupWrapper(groupTO), anyTypeClasses, formLayoutInfo, pageRef);
     }
 
     /**
@@ -92,7 +93,7 @@ public class GroupWizardBuilder extends AnyWizardBuilder<GroupTO> implements Gro
         wizardModel.add(new GroupDetails(
                 GroupWrapper.class.cast(modelObject),
                 new ListModel<>(Collections.<StatusBean>emptyList()),
-                false,
+                mode == AjaxWizard.Mode.TEMPLATE,
                 modelObject.getInnerObject().getKey() != null, pageRef));
         return this;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
index cb73c3c..29e357b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
@@ -142,13 +142,23 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
 
     @SuppressWarnings({ "rawtypes", "unchecked" })
     private FieldPanel getFieldPanel(final PlainSchemaTO schemaTO) {
-        boolean required = mode == AjaxWizard.Mode.TEMPLATE
-                ? false
-                : schemaTO.getMandatoryCondition().equalsIgnoreCase("true");
+        final boolean required;
+        final boolean readOnly;
+        final AttrSchemaType type;
+        final boolean jexlHelp;
+
+        if (mode == AjaxWizard.Mode.TEMPLATE) {
+            required = false;
+            readOnly = false;
+            type = AttrSchemaType.String;
+            jexlHelp = true;
+        } else {
+            required = schemaTO.getMandatoryCondition().equalsIgnoreCase("true");
+            readOnly = schemaTO.isReadonly();
+            type = schemaTO.getType();
+            jexlHelp = false;
 
-        boolean readOnly = mode == AjaxWizard.Mode.TEMPLATE ? false : schemaTO.isReadonly();
-
-        AttrSchemaType type = mode == AjaxWizard.Mode.TEMPLATE ? AttrSchemaType.String : schemaTO.getType();
+        }
 
         FieldPanel panel;
         switch (type) {
@@ -240,6 +250,10 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
             default:
                 panel = new AjaxTextFieldPanel("panel", schemaTO.getKey(), new Model<String>(), false);
 
+                if (jexlHelp) {
+                    AjaxTextFieldPanel.class.cast(panel).enableJextHelp();
+                }
+
                 if (required) {
                     panel.addRequiredLabel();
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/TemplateWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/TemplateWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/TemplateWizardBuilder.java
new file mode 100644
index 0000000..7f85936
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/TemplateWizardBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * 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.wizards.any;
+
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.to.AnyTO;
+import org.apache.wicket.event.IEventSink;
+
+public interface TemplateWizardBuilder<T extends AnyTO> {
+
+    AjaxWizard<AnyWrapper<T>> build(String id);
+
+    TemplateWizardBuilder<T> setEventSink(IEventSink eventSink);
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserDetails.java
index 71eb007..166f94d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserDetails.java
@@ -24,7 +24,6 @@ import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.panels.ListViewPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accordion;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.wicket.Component;
 import org.apache.wicket.PageReference;
@@ -59,10 +58,12 @@ public class UserDetails extends Details<UserTO> {
         // ------------------------
         // Username
         // ------------------------
-        final FieldPanel<String> username = new AjaxTextFieldPanel(
+        final AjaxTextFieldPanel username = new AjaxTextFieldPanel(
                 "username", "username", new PropertyModel<String>(userTO, "username"), false);
 
-        if (!templateMode) {
+        if (templateMode) {
+            username.enableJextHelp();
+        } else {
             username.addRequiredLabel();
         }
         add(username);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserTemplateWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserTemplateWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserTemplateWizardBuilder.java
new file mode 100644
index 0000000..b20fe24
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserTemplateWizardBuilder.java
@@ -0,0 +1,73 @@
+/*
+ * 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.wizards.any;
+
+import java.io.Serializable;
+import java.util.List;
+import org.apache.syncope.client.console.layout.UserFormLayoutInfo;
+import org.apache.syncope.client.console.rest.TaskRestClient;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.to.PullTaskTO;
+import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.event.IEventSink;
+
+public class UserTemplateWizardBuilder extends UserWizardBuilder implements TemplateWizardBuilder<UserTO> {
+
+    private static final long serialVersionUID = 6716803168859873877L;
+
+    private final PullTaskTO task;
+
+    private final String anyType;
+
+    public UserTemplateWizardBuilder(
+            final PullTaskTO task,
+            final List<String> anyTypeClasses,
+            final UserFormLayoutInfo formLayoutInfo,
+            final PageReference pageRef) {
+        super(null, anyTypeClasses, formLayoutInfo, pageRef);
+        this.task = task;
+        this.anyType = AnyTypeKind.USER.name();
+
+        if (task.getTemplates().containsKey(this.anyType)) {
+            setItem(new UserWrapper(UserTO.class.cast(task.getTemplates().get(this.anyType))));
+        } else {
+            setItem(new UserWrapper(new UserTO()));
+        }
+    }
+
+    @Override
+    public AjaxWizard<AnyWrapper<UserTO>> build(final String id) {
+        return super.build(id, AjaxWizard.Mode.TEMPLATE);
+    }
+
+    @Override
+    protected Serializable onApplyInternal(final AnyWrapper<UserTO> modelObject) {
+        task.getTemplates().put(anyType, modelObject.getInnerObject());
+        new TaskRestClient().update(task);
+        return task;
+    }
+
+    @Override
+    public TemplateWizardBuilder<UserTO> setEventSink(final IEventSink eventSink) {
+        this.eventSink = eventSink;
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
index 66bb62c..c04bafc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
@@ -27,6 +27,7 @@ import org.apache.syncope.client.console.commons.status.StatusUtils;
 import org.apache.syncope.client.console.layout.UserForm;
 import org.apache.syncope.client.console.layout.UserFormLayoutInfo;
 import org.apache.syncope.client.console.rest.UserRestClient;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
@@ -86,7 +87,7 @@ public class UserWizardBuilder extends AnyWizardBuilder<UserTO> implements UserF
             final AnyWrapper<UserTO> modelObject, final WizardModel wizardModel) {
 
         wizardModel.add(new UserDetails(
-                UserWrapper.class.cast(modelObject), statusModel, false,
+                UserWrapper.class.cast(modelObject), statusModel, mode == AjaxWizard.Mode.TEMPLATE,
                 modelObject.getInnerObject().getKey() != null,
                 UserFormLayoutInfo.class.cast(formLayoutInfo).isPasswordManagement(),
                 pageRef));

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
index 76a8e90..dd67e42 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
@@ -73,7 +73,7 @@ public class VirAttrs extends AbstractAttrs<VirSchemaTO> {
                         = new AjaxTextFieldPanel("panel", attrTO.getSchema(), new Model<String>(), false);
 
                 if (mode == AjaxWizard.Mode.TEMPLATE) {
-                    item.add(panel.setEnabled(!attrTO.isReadonly()));
+                    item.add(panel.enableJextHelp().setEnabled(!attrTO.isReadonly()));
                 } else {
                     item.add(new MultiFieldPanel.Builder<>(
                             new PropertyModel<List<String>>(attrTO, "values")).build(

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
index 97680bd..82392a7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
@@ -44,6 +44,7 @@ import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.Model;
 import org.apache.wicket.model.StringResourceModel;
 
 public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
@@ -96,8 +97,11 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
-                        send(pageRef.getPage(), Broadcast.DEPTH,
-                                new AjaxWizard.NewItemActionEvent<>(provisionTO, 2, target));
+                        send(ResourceProvisionPanel.this, Broadcast.DEPTH,
+                                new AjaxWizard.NewItemActionEvent<>(provisionTO, 2, target).setResourceModel(
+                                        new StringResourceModel("inner.provision.mapping",
+                                                ResourceProvisionPanel.this,
+                                                Model.of(provisionTO))));
                     }
                 }, ActionLink.ActionType.MAPPING, StandardEntitlement.RESOURCE_UPDATE).
                 addAction(new ActionLink<ProvisionTO>() {
@@ -107,7 +111,7 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
                     @Override
                     public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
                         provisionTO.setSyncToken(null);
-                        send(pageRef.getPage(), Broadcast.DEPTH, new ListViewPanel.ListViewReload(target));
+                        send(ResourceProvisionPanel.this, Broadcast.DEPTH, new ListViewPanel.ListViewReload(target));
                     }
                 }, ActionLink.ActionType.RESET_TIME, StandardEntitlement.RESOURCE_UPDATE).
                 addAction(new ActionLink<ProvisionTO>() {
@@ -120,7 +124,11 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
                         clone.setKey(null);
                         clone.setAnyType(null);
                         clone.setObjectClass(null);
-                        send(pageRef.getPage(), Broadcast.DEPTH, new AjaxWizard.NewItemActionEvent<>(clone, target));
+                        send(ResourceProvisionPanel.this, Broadcast.DEPTH,
+                                new AjaxWizard.NewItemActionEvent<>(clone, target).setResourceModel(
+                                        new StringResourceModel("inner.provision.clone",
+                                                ResourceProvisionPanel.this,
+                                                Model.of(provisionTO))));
                     }
                 }, ActionLink.ActionType.CLONE, StandardEntitlement.RESOURCE_CREATE).
                 addAction(new ActionLink<ProvisionTO>() {
@@ -130,7 +138,7 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
                     @Override
                     public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
                         resourceTO.getProvisions().remove(provisionTO);
-                        send(pageRef.getPage(), Broadcast.DEPTH, new ListViewPanel.ListViewReload(target));
+                        send(ResourceProvisionPanel.this, Broadcast.DEPTH, new ListViewPanel.ListViewReload(target));
                     }
                 }, ActionLink.ActionType.DELETE, StandardEntitlement.RESOURCE_DELETE);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.properties
index 0d7b3df..c5da136 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.properties
@@ -21,4 +21,8 @@ start=Start date
 end=End date
 latestExecStatus=Last execution status
 
-task.view=Executions of task '${key}'
+task.view=Executions of task '${right.name}'
+inner.template.edit=Edit ${left} template for task '${right}'
+inner.task.edit=Edit task '${right.name}'
+inner.task.new=New task
+inner.task.clone=Clone task '${right.name}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_it.properties
index 6ed659d..a39915a 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_it.properties
@@ -21,4 +21,8 @@ start=Data di avvio
 end=Data di conclusione
 latestExecStatus=Stato ultima esecuzione
 
-task.view=Esecuzioni del task '${key}'
+task.view=Esecuzioni del task '${right.name}'
+inner.template.edit=Modifica ${left} template per il task '${right}'
+inner.task.edit=Modifica task '${right.name}'
+inner.task.new=Nuovo task
+inner.task.clone=Clona task '${right.name}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_pt_BR.properties
index 63f8935..9960aea 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_pt_BR.properties
@@ -21,4 +21,8 @@ start=Data inicial
 end=Data Final
 latestExecStatus=Stato ultima esecuzione
 
-task.view=Executions of task '${key}'
+task.view=Executions of task '${right.name}'
+inner.template.edit=Edit ${left} template for task '${right}'
+inner.task.edit=Edit task '${right.name}'
+inner.task.new=New task
+inner.task.clone=Clone task '${right.name}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_ru.properties
index 4edfdb1..1f94715 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskDirectoryPanel_ru.properties
@@ -29,4 +29,8 @@ end=\u0414\u0430\u0442\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0
 latestExecStatus=\u0421\u0442\u0430\u0442\u0443\u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430
 
 # 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
-task.view=\u0417\u0430\u043f\u0443\u0441\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 '${key}'
+task.view=\u0417\u0430\u043f\u0443\u0441\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 '${right.name}'
+inner.template.edit=Edit ${left} template for task '${right}'
+inner.task.edit=Edit task '${right.name}'
+inner.task.new=New task
+inner.task.clone=Clone task '${right.name}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.html
index b067820..0b29bba 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.html
@@ -24,6 +24,7 @@ under the License.
     <wicket:extend>
       <wicket:enclosure child="field-label">
         <label wicket:id="field-label">[LABEL]</label><span wicket:id="required"/>
+        <span wicket:id="jexlInfo" class="glyphicon glyphicon-info-sign" style="cursor: pointer"></span>
         <span wicket:id="externalAction"/>
       </wicket:enclosure>
       <fieldset class="input-group">

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/resources/org/apache/syncope/client/console/wizards/WizardMgtPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/WizardMgtPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/WizardMgtPanel.html
index 463c7db..0a0d409 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/WizardMgtPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/WizardMgtPanel.html
@@ -23,7 +23,18 @@ under the License.
     </span>
 
     <wicket:fragment wicket:id="wizard">
-      <span wicket:id="wizard"/>
+      <div class="col-xs-12">
+        <div class="box">
+          <div class="box-header">
+            <h3 class="box-title">
+              <span wicket:id="title">[TITLE]</span>
+            </h3>
+          </div>
+          <div class="box-body">
+            <span wicket:id="wizard"/>
+          </div>
+        </div>
+      </div>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="default">

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.properties
index d9fabb4..51201d4 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.properties
@@ -40,3 +40,5 @@ connObjectKeyValidation=There must be exactly one AccountId
 propagationMode=Propagation mode
 connObjectLink=Remote ID
 enable=Enable
+inner.provision.mapping=Change mapping for provision '${key}'
+inner.provision.clone=Clone provision '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_it.properties
index 67c2ddb..bf69414 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_it.properties
@@ -40,3 +40,5 @@ connObjectKeyValidation=Deve essere definito esattamente un AccountId
 propagationMode=Modalit\u00e0 di propagazione
 connObjectLink=ID Remoto
 enable=Abilita
+inner.provision.mapping=Cambia il mapping per il provision '${key}'
+inner.provision.clone=Clona il provision '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_pt_BR.properties
index 2d43ac4..edf80c1 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_pt_BR.properties
@@ -40,3 +40,5 @@ connObjectKeyValidation=Precisa ser exatamente um Identificador de Conta
 propagationMode=Modo de propaga\u00e7\u00e3o
 connObjectLink=Remote ID
 enable=Habilitado
+inner.provision.mapping=Change mapping for provision '${key}'
+inner.provision.clone=Clone provision '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/1c281801/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_ru.properties
index bf1188f..ca685ce 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_ru.properties
@@ -64,3 +64,5 @@ propagationMode=\u0420\u0435\u0436\u0438\u043c \u0432\u044b\u043f\u043e\u043b\u0
 connObjectLink=\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f
 # enable=\u00d0\u0092\u00d0\u00ba\u00d0\u00bb\u00d1\u008e\u00d1\u0087\u00d0\u00b8\u00d1\u0082\u00d1\u008c
 enable=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c
+inner.provision.mapping=Change mapping for provision '${key}'
+inner.provision.clone=Clone provision '${key}'


Mime
View raw message