You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by ma...@apache.org on 2016/12/30 13:05:40 UTC

syncope git commit: [SYNCOPE-773] allow edit and view in job dashboard widget

Repository: syncope
Updated Branches:
  refs/heads/2_0_X 02722801b -> 9ed1a00c2


[SYNCOPE-773] allow edit and view in job dashboard widget


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

Branch: refs/heads/2_0_X
Commit: 9ed1a00c27440bf1eddfbef559088afdc8bfec4a
Parents: 0272280
Author: Matteo Di Carlo <ma...@tirasa.net>
Authored: Fri Dec 23 17:09:15 2016 +0100
Committer: Matteo Di Carlo <ma...@tirasa.net>
Committed: Fri Dec 30 13:02:42 2016 +0100

----------------------------------------------------------------------
 .../client/console/panels/ExecMessageModal.java |  34 ++++++
 .../console/tasks/ExecutionsDirectoryPanel.java |   2 +-
 .../client/console/widgets/ActionColumn.java    |  27 +++++
 .../console/widgets/ActionLinksPanel.java       |  27 +++++
 .../client/console/widgets/ExecActionPanel.java |  41 +++++++
 .../client/console/widgets/JobActionPanel.java  | 103 +++++++++++++++++-
 .../client/console/widgets/JobWidget.java       | 107 ++++++++++++++++++-
 .../client/console/panels/ExecMessageModal.html |  25 +++++
 .../client/console/widgets/JobActionPanel.html  |  14 +--
 .../JobWidget$AvailableJobsPanel.properties     |  21 ++++
 .../JobWidget$AvailableJobsPanel_it.properties  |  21 ++++
 ...obWidget$AvailableJobsPanel_pt_BR.properties |  21 ++++
 .../JobWidget$AvailableJobsPanel_ru.properties  |  21 ++++
 .../client/console/widgets/JobWidget.html       |   2 +
 .../client/console/widgets/JobWidget.properties |   1 +
 .../console/widgets/JobWidget_it.properties     |   1 +
 .../console/widgets/JobWidget_pt_BR.properties  |   1 +
 .../console/widgets/JobWidget_ru.properties     |  19 ++--
 18 files changed, 461 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/java/org/apache/syncope/client/console/panels/ExecMessageModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ExecMessageModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ExecMessageModal.java
new file mode 100644
index 0000000..23f411b
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ExecMessageModal.java
@@ -0,0 +1,34 @@
+/*
+ * 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.panels;
+
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.panel.Panel;
+
+public class ExecMessageModal extends Panel implements ModalPanel {
+
+    private static final long serialVersionUID = 1L;
+
+    public ExecMessageModal(final PageReference pageRef, final String executionMessage) {
+        super(BaseModal.CONTENT_ID);
+        add(new Label("executionMessage", executionMessage).setOutputMarkupId(true));
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
index 1e39479..4daa2a7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
@@ -88,7 +88,7 @@ public abstract class ExecutionsDirectoryPanel
         this.key = key;
         initResultTable();
     }
-
+        
     @Override
     protected void resultTableCustomChanges(final AjaxDataTablePanel.Builder<ExecTO, String> resultTableBuilder) {
         resultTableBuilder.setMultiLevelPanel(baseModal, multiLevelPanelRef);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/java/org/apache/syncope/client/console/widgets/ActionColumn.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ActionColumn.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ActionColumn.java
new file mode 100644
index 0000000..ddef2dd
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ActionColumn.java
@@ -0,0 +1,27 @@
+/*
+ * 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.widgets;
+
+/**
+ *
+ * @author matt3o
+ */
+public class ActionColumn {
+    
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/java/org/apache/syncope/client/console/widgets/ActionLinksPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ActionLinksPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ActionLinksPanel.java
new file mode 100644
index 0000000..cb2ea92
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ActionLinksPanel.java
@@ -0,0 +1,27 @@
+/*
+ * 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.widgets;
+
+/**
+ *
+ * @author matt3o
+ */
+class ActionLinksPanel<T> {
+    
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/java/org/apache/syncope/client/console/widgets/ExecActionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ExecActionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ExecActionPanel.java
new file mode 100644
index 0000000..f66bd6b
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ExecActionPanel.java
@@ -0,0 +1,41 @@
+/*
+ * 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.widgets;
+
+import static de.agilecoders.wicket.core.util.CssClassNames.Grid.container;
+
+import java.io.Serializable;
+import org.apache.syncope.client.console.panels.ExecMessageModal;
+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.common.lib.to.ExecTO;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.StringResourceModel;
+
+public class ExecActionPanel {
+
+    public ExecActionPanel(String stringResourceModel,final JobWidget widget,
+            final BaseModal<Serializable> jobModal, final PageReference pageRef){
+        
+                
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobActionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobActionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobActionPanel.java
index bdaf0dd..7f2c43a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobActionPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobActionPanel.java
@@ -23,28 +23,106 @@ 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.pages.BasePage;
+import org.apache.syncope.client.console.reports.ReportWizardBuilder;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import org.apache.syncope.client.console.rest.TaskRestClient;
+import org.apache.syncope.client.console.tasks.SchedTaskWizardBuilder;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.IndicatorAjaxLink;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.common.lib.to.JobTO;
+import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.syncope.common.lib.to.SchedTaskTO;
 import org.apache.syncope.common.lib.types.JobAction;
+import org.apache.syncope.common.lib.types.JobType;
 import org.apache.syncope.common.rest.api.service.NotificationService;
 import org.apache.syncope.common.rest.api.service.ReportService;
 import org.apache.syncope.common.rest.api.service.TaskService;
+import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.event.IEvent;
 import org.apache.wicket.markup.html.panel.Fragment;
-import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.StringResourceModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class JobActionPanel extends Panel {
+public class JobActionPanel extends WizardMgtPanel<Serializable> {
 
     private static final long serialVersionUID = 6645135178773151224L;
 
     private static final Logger LOG = LoggerFactory.getLogger(JobActionPanel.class);
 
-    public JobActionPanel(final String id, final JobTO jobTO, final JobWidget widget) {
-        super(id);
+    private final BaseModal<Serializable> jobModal;
+
+    public JobActionPanel(final String id, final JobTO jobTO, final JobWidget widget,
+            final BaseModal<Serializable> jobModal, final PageReference pageRef) {
+        super(id, true);
+        this.jobModal = jobModal;
         setOutputMarkupId(true);
+        setWindowClosedReloadCallback(modal);
+
+        IndicatorAjaxLink<Void> link = new IndicatorAjaxLink<Void>("edit") {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+
+                if (null != jobTO.getType()) {
+                    switch (jobTO.getType()) {
+
+                        case NOTIFICATION:
+                            break;
+
+                        case REPORT:
+
+                            final ReportTO reportTO = new ReportRestClient().read(jobTO.getRefKey());
+
+                            final ReportWizardBuilder rwb = new ReportWizardBuilder(reportTO, pageRef);
+                            rwb.setEventSink(JobActionPanel.this);
+
+                            target.add(jobModal.setContent(rwb.build(BaseModal.CONTENT_ID, AjaxWizard.Mode.EDIT)));
+
+                            jobModal.header(new StringResourceModel(
+                                    "any.edit",
+                                    this,
+                                    new Model<>(reportTO)));
+
+                            jobModal.show(true);
+
+                            break;
+
+                        case TASK:
+
+                            final SchedTaskTO schedTaskTO = new TaskRestClient().
+                                    readSchedTask(SchedTaskTO.class, jobTO.getRefKey());
+
+                            final SchedTaskWizardBuilder swb = new SchedTaskWizardBuilder(schedTaskTO, pageRef);
+                            swb.setEventSink(JobActionPanel.this);
+
+                            target.add(jobModal.setContent(swb.build(BaseModal.CONTENT_ID, AjaxWizard.Mode.EDIT)));
+
+                            jobModal.header(new StringResourceModel(
+                                    "any.edit",
+                                    this,
+                                    new Model<>(schedTaskTO)));
+
+                            jobModal.show(true);
+
+                            break;
+
+                        default:
+                            break;
+                    }
+                }
+            }
+        };
+        link.setOutputMarkupPlaceholderTag(true);
+        link.setVisible(!(null != jobTO.getType() && JobType.NOTIFICATION.equals(jobTO.getType())));
+        addInnerObject(link);
 
         Fragment controls;
         if (jobTO.isRunning()) {
@@ -122,7 +200,7 @@ public class JobActionPanel extends Panel {
                 }
             });
         }
-        add(controls);
+        addInnerObject(controls);
     }
 
     public static class JobActionPayload implements Serializable {
@@ -140,4 +218,19 @@ public class JobActionPanel extends Panel {
         }
 
     }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void onEvent(final IEvent<?> event) {
+        if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
+            final AjaxRequestTarget target = AjaxWizard.NewItemEvent.class.cast(event.getPayload()).getTarget();
+
+            if (event.getPayload() instanceof AjaxWizard.NewItemCancelEvent
+                    || event.getPayload() instanceof AjaxWizard.NewItemFinishEvent) {
+                jobModal.close(target);
+            }
+        }
+
+        super.onEvent(event);
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
index 410d576..d70c449 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
@@ -30,10 +30,14 @@ import org.apache.syncope.client.console.SyncopeConsoleSession;
 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.ExecMessageModal;
 import org.apache.syncope.client.console.rest.BaseRestClient;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
 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.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.ActionLinksPanel;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.JobTO;
@@ -44,8 +48,10 @@ import org.apache.syncope.common.rest.api.service.TaskService;
 import org.apache.wicket.Application;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ThreadContext;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
 import org.apache.wicket.event.IEvent;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 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;
@@ -60,6 +66,7 @@ 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;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
 import org.apache.wicket.protocol.ws.api.WebSocketPushBroadcaster;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
@@ -77,6 +84,28 @@ public class JobWidget extends BaseWidget {
 
     private static final int ROWS = 5;
 
+    private final BaseModal<Serializable> modal = new BaseModal<Serializable>("modal") {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void onConfigure() {
+            super.onConfigure();
+            setFooterVisible(false);
+        }
+    };
+
+    private final BaseModal<Serializable> detailModal = new BaseModal<Serializable>("detailModal") {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void onConfigure() {
+            super.onConfigure();
+            setFooterVisible(true);
+        }
+    };
+
     private static List<JobTO> getAvailable(final SyncopeConsoleSession session) {
         List<JobTO> available = new ArrayList<>();
 
@@ -120,6 +149,27 @@ public class JobWidget extends BaseWidget {
     public JobWidget(final String id, final PageReference pageRef) {
         super(id);
         setOutputMarkupId(true);
+        add(modal);
+        modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
+
+            private static final long serialVersionUID = 8804221891699487139L;
+
+            @Override
+            public void onClose(final AjaxRequestTarget target) {
+                modal.show(false);
+            }
+        });
+
+        add(detailModal);
+        detailModal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onClose(final AjaxRequestTarget target) {
+                detailModal.show(false);
+            }
+        });
 
         available = getAvailable(SyncopeConsoleSession.get());
         recent = getRecent(SyncopeConsoleSession.get());
@@ -190,8 +240,7 @@ public class JobWidget extends BaseWidget {
         }
     }
 
-    private class AvailableJobsPanel extends DirectoryPanel<
-        JobTO, JobTO, AvailableJobsProvider, BaseRestClient> {
+    private class AvailableJobsPanel extends DirectoryPanel<JobTO, JobTO, AvailableJobsProvider, BaseRestClient> {
 
         private static final long serialVersionUID = -8214546246301342868L;
 
@@ -242,11 +291,14 @@ public class JobWidget extends BaseWidget {
                         final IModel<JobTO> rowModel) {
 
                     JobTO jobTO = rowModel.getObject();
-                    JobActionPanel panel = new JobActionPanel(componentId, jobTO, JobWidget.this);
+                    JobActionPanel panel = new JobActionPanel(componentId, jobTO, JobWidget.this, JobWidget.this.modal,
+                            pageRef);
                     MetaDataRoleAuthorizationStrategy.authorize(panel, WebPage.ENABLE,
-                            String.format("%s,%s",
+                            String.format("%s,%s%s,%s",
                                     StandardEntitlement.TASK_EXECUTE,
-                                    StandardEntitlement.REPORT_EXECUTE));
+                                    StandardEntitlement.REPORT_EXECUTE,
+                                    StandardEntitlement.TASK_UPDATE,
+                                    StandardEntitlement.REPORT_UPDATE));
                     cellItem.add(panel);
                 }
 
@@ -342,6 +394,51 @@ public class JobWidget extends BaseWidget {
 
             columns.add(new PropertyColumn<ExecTO, String>(new ResourceModel("status"), "status", "status"));
 
+            columns.add(new ActionColumn<ExecTO, String>(new ResourceModel("actions")) {
+
+                private static final long serialVersionUID = -3503023501954863131L;
+
+                @Override
+                public ActionLinksPanel<ExecTO> getActions(final String componentId, final IModel<ExecTO> model) {
+
+                    final ActionLinksPanel.Builder<ExecTO> panel = ActionLinksPanel.<ExecTO>builder().
+                            add(new ActionLink<ExecTO>() {
+
+                                private static final long serialVersionUID=  -3722207913631435501L;
+
+                                @Override
+                                public void onClick(final AjaxRequestTarget target, final ExecTO ignore) {
+
+                                    StringResourceModel stringResourceModel =
+                                            new StringResourceModel("execution.view", JobWidget.this, model);
+                                    detailModal.header(stringResourceModel);
+                                    detailModal.
+                                            setContent(new ExecMessageModal(pageRef, model.getObject().getMessage()));
+                                    detailModal.show(true);
+                                    target.add(detailModal);
+                                }
+                            }, ActionLink.ActionType.VIEW, StandardEntitlement.TASK_READ);
+                    return panel.build(componentId, model.getObject());
+                }
+
+                @Override
+                public ActionLinksPanel<Serializable> getHeader(final String componentId) {
+                    final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder();
+
+                    return panel.add(new ActionLink<Serializable>() {
+
+                        private static final long serialVersionUID = -7978723352517770644L;
+
+                        @Override
+                        public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+                            if (target != null) {
+                                target.add(container);
+                            }
+                        }
+                    }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).build(componentId);
+                }
+            });
+
             return columns;
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ExecMessageModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ExecMessageModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ExecMessageModal.html
new file mode 100644
index 0000000..5158d82
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ExecMessageModal.html
@@ -0,0 +1,25 @@
+<!--
+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>
+    <pre wicket:id="executionMessage">
+            [executionMessage]
+    </pre>
+  </wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobActionPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobActionPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobActionPanel.html
index 51dedbd..6be7c2b 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobActionPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobActionPanel.html
@@ -17,17 +17,17 @@ 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="controls" style="text-align: right;"></div>
-
+  <wicket:extend>
+    &nbsp;<div style="float: left; margin-left: 10px"  wicket:id="controls"></div>
     <wicket:fragment wicket:id="runningFragment">
-      <i class="fa fa-refresh fa-spin"></i>
+      <i id="actionLink" class="fa fa-refresh fa-spin"></i>
       &nbsp;
       <a href="#" wicket:id="stop" class="fa fa-stop-circle"></a>
     </wicket:fragment>
-
     <wicket:fragment wicket:id="notRunningFragment">
       <a href="#" wicket:id="start" class="fa fa-play-circle"></a>
     </wicket:fragment>
-  </wicket:panel>
-</html>
\ No newline at end of file
+    <!--<div wicket:id="modal"/>-->
+    <a href="#" wicket:id="edit" ><i id="actionLink" class="glyphicon glyphicon-pencil" alt="edit icon" title="Edit"></i></a> 
+  </wicket:extend>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel.properties
new file mode 100644
index 0000000..8e33220
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel.properties
@@ -0,0 +1,21 @@
+# 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.
+
+any.edit=Edit ${name}
+any.new=New
+any.finish=Submit
+any.cancel=Cancel

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_it.properties
new file mode 100644
index 0000000..c719734
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_it.properties
@@ -0,0 +1,21 @@
+# 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.
+
+any.edit=Modifica ${name}
+any.new=Nuovo
+any.finish=Conferma
+any.cancel=Annulla

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_pt_BR.properties
new file mode 100644
index 0000000..8e33220
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_pt_BR.properties
@@ -0,0 +1,21 @@
+# 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.
+
+any.edit=Edit ${name}
+any.new=New
+any.finish=Submit
+any.cancel=Cancel

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_ru.properties
new file mode 100644
index 0000000..8e33220
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget$AvailableJobsPanel_ru.properties
@@ -0,0 +1,21 @@
+# 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.
+
+any.edit=Edit ${name}
+any.new=New
+any.finish=Submit
+any.cancel=Cancel

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget.html b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget.html
index fdf5373..2aa16c3 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget.html
@@ -29,5 +29,7 @@ under the License.
         <div class="box-body" wicket:id="tabbedPanel"/>
       </div>
     </div>
+    <div wicket:id="modal"/>
+    <div wicket:id="detailModal"/>
   </wicket:panel>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget.properties
index 273253a..eb9f6d3 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget.properties
@@ -23,3 +23,4 @@ end=End
 available=Available
 recent=Recent
 jobs=Jobs
+execution.view=Result status of execution '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_it.properties
index 19a26b9..e898e38 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_it.properties
@@ -23,3 +23,4 @@ end=Fine
 available=Disponibili
 recent=Recenti
 jobs=Job
+execution.view=Stato dell'esecuzione'${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_pt_BR.properties
index e300f11..109f3df 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_pt_BR.properties
@@ -23,3 +23,4 @@ end=Final
 available=Dispon\u00edvel
 recent=Recente
 jobs=Job
+execution.view=Status do resultado da execu\u00e7\u00e3o '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ed1a00c/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_ru.properties
index 4c6d274..e2b39d5 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/JobWidget_ru.properties
@@ -15,21 +15,22 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-# refDesc=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435
+# refDesc=\u00d0\u009d\u00d0\u00b0\u00d0\u00b7\u00d0\u00b2\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5
 refDesc=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435
-# running=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f
+# running=\u00d0\u0092\u00d1\u008b\u00d0\u00bf\u00d0\u00be\u00d0\u00bb\u00d0\u00bd\u00d1\u008f\u00d0\u00b5\u00d1\u0082\u00d1\u0081\u00d1\u008f
 running=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f
-# scheduled=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e
+# scheduled=\u00d0\u0097\u00d0\u00b0\u00d0\u00bf\u00d0\u00bb\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d1\u0080\u00d0\u00be\u00d0\u00b2\u00d0\u00b0\u00d0\u00bd\u00d0\u00be
 scheduled=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e
-# start=\u041d\u0430\u0447\u0430\u043b\u043e
+# start=\u00d0\u009d\u00d0\u00b0\u00d1\u0087\u00d0\u00b0\u00d0\u00bb\u00d0\u00be
 start=\u041d\u0430\u0447\u0430\u043b\u043e
-# message=\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435
+# message=\u00d0\u00a1\u00d0\u00be\u00d0\u00be\u00d0\u00b1\u00d1\u0089\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5
 message=\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435
-# end=\u041e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435
+# end=\u00d0\u009e\u00d0\u00ba\u00d0\u00be\u00d0\u00bd\u00d1\u0087\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5
 end=\u041e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435
-# available=\u0412\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438
+# available=\u00d0\u0092\u00d1\u0081\u00d0\u00b5 \u00d0\u00b7\u00d0\u00b0\u00d0\u00b4\u00d0\u00b0\u00d1\u0087\u00d0\u00b8
 available=\u0412\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438
-# recent=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435
+# recent=\u00d0\u009f\u00d0\u00be\u00d1\u0081\u00d0\u00bb\u00d0\u00b5\u00d0\u00b4\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5 \u00d0\u00b2\u00d1\u008b\u00d0\u00bf\u00d0\u00be\u00d0\u00bb\u00d0\u00bd\u00d0\u00b5\u00d0\u00bd\u00d0\u00bd\u00d1\u008b\u00d0\u00b5
 recent=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435
-# jobs=\u0417\u0430\u0434\u0430\u0447\u0438
+# jobs=\u00d0\u0097\u00d0\u00b0\u00d0\u00b4\u00d0\u00b0\u00d1\u0087\u00d0\u00b8
 jobs=\u0417\u0430\u0434\u0430\u0447\u0438
+execution.view=\u0421\u0442\u0430\u0442\u0443\u0441 \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f '${key}'