Repository: syncope Updated Branches: refs/heads/2_0_X 36f2537e7 -> 31e884a9f
[SYNCOPE-1176] provides action toggle panel for the list view panel Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/31e884a9 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/31e884a9 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/31e884a9 Branch: refs/heads/2_0_X Commit: 31e884a9fda21702fb04b5ecfa711b50de6d7452 Parents: 36f2537 Author: fmartelli <fabio.marte...@gmail.com> Authored: Thu Aug 17 15:30:42 2017 +0200 Committer: fmartelli <fabio.marte...@gmail.com> Committed: Thu Aug 17 15:30:42 2017 +0200 ---------------------------------------------------------------------- .../client/console/panels/ListViewPanel.java | 49 +++++++++++++++++++- .../console/wicket/markup/html/form/Action.java | 5 ++ .../html/form/ActionLinksTogglePanel.java | 3 ++ .../wicket/markup/html/form/ActionPanel.java | 3 ++ .../wicket/markup/html/form/ActionsPanel.java | 14 ++++++ .../resources/ResourceProvisionPanel.java | 15 +++++- .../resources/ResourceProvisionPanel.html | 3 +- .../syncope/fit/console/TopologyITCase.java | 18 ++++--- 8 files changed, 99 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/31e884a9/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java index e028cc3..6dce4eb 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java @@ -29,13 +29,17 @@ import java.util.List; import org.apache.commons.collections4.IteratorUtils; import org.apache.commons.collections4.Predicate; import org.apache.commons.lang3.StringUtils; +import org.apache.syncope.client.console.commons.Constants; import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormChoiceComponentUpdatingBehavior; import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink; +import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksTogglePanel; import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel; import org.apache.syncope.client.console.wizards.AjaxWizard; import org.apache.syncope.client.console.wizards.WizardMgtPanel; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.PageReference; +import org.apache.wicket.ajax.AjaxEventBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.core.util.lang.PropertyResolver; import org.apache.wicket.event.IEvent; @@ -58,6 +62,8 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan private static final Logger LOG = LoggerFactory.getLogger(ListViewPanel.class); + private ActionLinksTogglePanel<T> togglePanel; + public enum CheckAvailability { /** @@ -105,6 +111,8 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan super(id, wizardInModal); setOutputMarkupId(true); + togglePanel = getTogglePanel(); + this.check = Model.of(check); addInnerObject(new Label("caption", new ResourceModel("listview.caption", StringUtils.EMPTY))); @@ -176,10 +184,36 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan @Override protected void populateItem(final ListItem<String> fieldItem) { fieldItem.add(getValueComponent(fieldItem.getModelObject(), bean)); + if (togglePanel != null) { + fieldItem.add(new AttributeModifier("style", "cursor: pointer;")); + fieldItem.add(new AjaxEventBehavior(Constants.ON_CLICK) { + + private static final long serialVersionUID = -9027652037484739586L; + + @Override + protected String findIndicatorId() { + return StringUtils.EMPTY; + } + + @Override + protected void onEvent(final AjaxRequestTarget target) { + togglePanel.toggleWithContent( + target, + actions.cloneWithLabels("actions", new Model<>(bean)), + bean); + } + }); + } } }; + beanItem.add(fields); - beanItem.add(actions.clone("actions", new Model<>(bean))); + + if (togglePanel == null) { + beanItem.add(actions.clone("actions", new Model<>(bean))); + } else { + beanItem.add(new ActionsPanel<>("actions", new Model<>(bean)).setVisible(false).setEnabled(false)); + } } }; beans.setOutputMarkupId(true); @@ -402,9 +436,18 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan protected void customActionOnCancelCallback(final AjaxRequestTarget target) { Builder.this.customActionOnCancelCallback(target); } + + @Override + protected ActionLinksTogglePanel<T> getTogglePanel() { + return Builder.this.getTogglePanel(); + } }; } + protected ActionLinksTogglePanel<T> getTogglePanel() { + return null; + } + protected void customActionCallback(final AjaxRequestTarget target) { } @@ -478,4 +521,8 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan return items; } } + + protected ActionLinksTogglePanel<T> getTogglePanel() { + return null; + } } http://git-wip-us.apache.org/repos/asf/syncope/blob/31e884a9/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java index 15d99dd..98d2556 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java @@ -104,6 +104,11 @@ public final class Action<T extends Serializable> implements Serializable { this.visibleLabel = false; return this; } + + public Action<T> showLabel() { + this.visibleLabel = true; + return this; + } public boolean isVisibleLabel() { return visibleLabel; http://git-wip-us.apache.org/repos/asf/syncope/blob/31e884a9/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java index fb8ab83..aac5942 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java @@ -26,6 +26,7 @@ import org.apache.syncope.client.console.commons.status.StatusBean; import org.apache.syncope.client.console.panels.TogglePanel; import org.apache.syncope.client.console.policies.PolicyRuleDirectoryPanel.PolicyRuleWrapper; import org.apache.syncope.client.console.reports.ReportletDirectoryPanel.ReportletWrapper; +import org.apache.syncope.client.console.wizards.resources.ResourceProvision; import org.apache.syncope.common.lib.to.AnyObjectTO; import org.apache.syncope.common.lib.to.EntityTO; import org.apache.syncope.common.lib.to.GroupTO; @@ -109,6 +110,8 @@ public class ActionLinksTogglePanel<T extends Serializable> extends TogglePanel< } else if (modelObject instanceof JobTO) { header = ((JobTO) modelObject).getRefKey() == null ? ((JobTO) modelObject).getRefDesc() : ((JobTO) modelObject).getRefKey(); + } else if (modelObject instanceof ResourceProvision) { + header = ((ResourceProvision) modelObject).getAnyType(); } else { header = new ResourceModel("actions", StringUtils.EMPTY).getObject(); } http://git-wip-us.apache.org/repos/asf/syncope/blob/31e884a9/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java index 8eb3135..73fdbf3 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java @@ -185,6 +185,9 @@ public final class ActionPanel<T extends Serializable> extends Panel { case DELETE: case CREATE: case MEMBERS: + case MAPPING: + case SET_LATEST_SYNC_TOKEN: + case REMOVE_SYNC_TOKEN: case CLAIM: send(this, Broadcast.BUBBLE, new ActionLinksTogglePanel.ActionLinkToggleCloseEventPayload(target)); break; http://git-wip-us.apache.org/repos/asf/syncope/blob/31e884a9/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java index 71d342c..c708624 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java @@ -82,6 +82,20 @@ public final class ActionsPanel<T extends Serializable> extends Panel { return panel; } + /** + * Use this with toggle panels. + * @param componentId Component Id. + * @param model Model. + * @return Actions panel. + */ + public ActionsPanel<T> cloneWithLabels(final String componentId, final IModel<T> model) { + final ActionsPanel<T> panel = new ActionsPanel<>(componentId, model); + for (Action<T> action : actions) { + panel.actions.add(action.showLabel()); + } + return panel; + } + public boolean isEmpty() { return this.actions.isEmpty(); } http://git-wip-us.apache.org/repos/asf/syncope/blob/31e884a9/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 be20666..f9fea37 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 @@ -76,6 +76,8 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> { private final AjaxLink<ResourceProvision> addAjaxLink; + protected ActionLinksTogglePanel<ResourceProvision> actionTogglePanel; + public ResourceProvisionPanel( final BaseModal<Serializable> modal, final ResourceTO resourceTO, @@ -87,6 +89,9 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> { setOutputMarkupId(true); + actionTogglePanel = new ActionLinksTogglePanel<>("toggle", pageRef); + add(actionTogglePanel); + wizard = new ProvisionWizardBuilder(resourceTO, pageRef); final ListViewPanel.Builder<ResourceProvision> builder = new ListViewPanel.Builder<ResourceProvision>( @@ -134,6 +139,11 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> { // change modal footer visibility send(ResourceProvisionPanel.this, Broadcast.BUBBLE, new BaseModal.ChangeFooterVisibilityEvent(target)); } + + @Override + protected ActionLinksTogglePanel<ResourceProvision> getTogglePanel() { + return actionTogglePanel; + } }; provisions = new ArrayList<>(); @@ -234,6 +244,8 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> { @Override public void onClick(final AjaxRequestTarget target) { + send(ResourceProvisionPanel.this, Broadcast.BREADTH, + new ActionLinksTogglePanel.ActionLinkToggleCloseEventPayload(target)); objectTypeTogglePanel.setHeaderLabel(target); objectTypeTogglePanel.toggle(target, true); } @@ -348,8 +360,7 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> { } private void checkAddButton(final String adminRealm) { - boolean enabled = - SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_UPDATE, adminRealm) + boolean enabled = SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_UPDATE, adminRealm) && !getAnyTypes().getObject().isEmpty(); addAjaxLink.setVisible(enabled); objectTypeTogglePanel.setEnabled(enabled); http://git-wip-us.apache.org/repos/asf/syncope/blob/31e884a9/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.html index 1998775..f82b16f 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.html +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.html @@ -17,8 +17,9 @@ specific language governing permissions and limitations under the License. --> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org"> - <wicket:extend> + <wicket:extend> <span wicket:id="provision">[PROVISION]</span> <span wicket:id="objectTypeToggle"/> + <div wicket:id="toggle"/> </wicket:extend> </html> http://git-wip-us.apache.org/repos/asf/syncope/blob/31e884a9/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java index 67afad7..48963a2 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java @@ -112,8 +112,11 @@ public class TopologyITCase extends AbstractConsoleITCase { TESTER.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK); TESTER.clickLink("body:toggle:container:content:togglePanelContainer:container:actions:provision"); - TESTER.clickLink("body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:" - + "content:group:beans:0:actions:actionRepeater:0:action:action"); + TESTER.executeAjaxEvent("body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:" + + "content:group:beans:0:fields:0", Constants.ON_CLICK); + + TESTER.clickLink("body:toggle:outerObjectsRepeater:3:outer:form:content:toggle:container:content:" + + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action"); FormTester formTester = TESTER.newFormTester( "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:wizard:form"); @@ -232,11 +235,12 @@ public class TopologyITCase extends AbstractConsoleITCase { TESTER.assertNoErrorMessage(); TESTER.assertInfoMessages("Operation executed successfully"); - TESTER.clickLink("body:toggle:container:content:togglePanelContainer:container:actions:provision"); - - TESTER.clickLink("body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:" - + "content:group:beans:0:actions:actionRepeater:0:action:action"); - + TESTER.executeAjaxEvent("body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:" + + "content:group:beans:0:fields:0", Constants.ON_CLICK); + + TESTER.clickLink("body:toggle:outerObjectsRepeater:3:outer:form:content:toggle:container:content:" + + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action"); + formTester = TESTER.newFormTester( "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:wizard:form"); formTester.submit("buttons:next");