Repository: syncope Updated Branches: refs/heads/master e4f1f0237 -> 142467929
[SYNCOPE-932] fixes Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/14246792 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/14246792 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/14246792 Branch: refs/heads/master Commit: 14246792934da9a365a82643c46c359cc805c0bb Parents: e4f1f02 Author: fmartelli <fabio.marte...@gmail.com> Authored: Thu Sep 8 15:05:20 2016 +0200 Committer: fmartelli <fabio.marte...@gmail.com> Committed: Thu Sep 8 15:05:48 2016 +0200 ---------------------------------------------------------------------- .../syncope/client/console/panels/AnyPanel.java | 24 +++++- .../panels/search/AbstractSearchPanel.java | 10 ++- .../panels/search/SearchClausePanel.java | 87 +++++++++++++++++++- .../ajax/form/IndicatorAjaxEventBehavior.java | 48 +++++++++++ .../markup/html/form/AbstractMultiPanel.java | 1 + .../html/form/AjaxDropDownChoicePanel.java | 2 +- .../client/console/wizards/any/Ownership.java | 6 +- .../console/wizards/any/Relationships.java | 2 +- .../syncope/fit/console/AnyObjectsITCase.java | 2 +- .../syncope/fit/console/GroupsITCase.java | 2 +- .../apache/syncope/fit/console/UsersITCase.java | 2 +- 11 files changed, 172 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java index 3f940dc..950e546 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java @@ -20,6 +20,7 @@ package org.apache.syncope.client.console.panels; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Map; import org.apache.commons.lang3.tuple.Triple; import org.apache.syncope.client.console.layout.AnyObjectFormLayoutInfo; @@ -173,18 +174,35 @@ public class AnyPanel extends Panel implements ModalPanel { private AbstractSearchPanel getSearchPanel(final String id) { final AbstractSearchPanel panel; + + final List<SearchClause> clauses = new ArrayList<>(); + final SearchClause clause = new SearchClause(); + clauses.add(clause); + switch (anyTypeTO.getKind()) { case USER: + clause.setComparator(SearchClause.Comparator.EQUALS); + clause.setType(SearchClause.Type.ATTRIBUTE); + clause.setProperty("username"); + panel = new UserSearchPanel.Builder( - new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch().build(id); + new ListModel<>(clauses)).required(false).enableSearch().build(id); break; case GROUP: + clause.setComparator(SearchClause.Comparator.EQUALS); + clause.setType(SearchClause.Type.ATTRIBUTE); + clause.setProperty("name"); + panel = new GroupSearchPanel.Builder( - new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch().build(id); + new ListModel<>(clauses)).required(false).enableSearch().build(id); break; case ANY_OBJECT: + clause.setComparator(SearchClause.Comparator.EQUALS); + clause.setType(SearchClause.Type.ATTRIBUTE); + clause.setProperty("name"); + panel = new AnyObjectSearchPanel.Builder(anyTypeTO.getKey(), - new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch().build(id); + new ListModel<>(clauses)).required(false).enableSearch().build(id); break; default: panel = null; http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java index 3c46a9e..93ed552 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java @@ -33,6 +33,7 @@ import org.apache.syncope.common.lib.to.AbstractSchemaTO; import org.apache.syncope.common.lib.to.ResourceTO; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.SchemaType; +import org.apache.wicket.event.IEventSink; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; @@ -87,10 +88,17 @@ public abstract class AbstractSearchPanel extends Panel { protected boolean enableSearch = false; + protected IEventSink resultContainer; + public Builder(final IModel<List<SearchClause>> model) { this.model = model; } + public Builder<T> enableSearch(final IEventSink resultContainer) { + this.resultContainer = resultContainer; + return enableSearch(); + } + public Builder<T> enableSearch() { this.enableSearch = true; return this; @@ -132,7 +140,7 @@ public abstract class AbstractSearchPanel extends Panel { types, anames, dnames, groupNames, roleNames, resourceNames); if (enableSearch) { - searchClausePanel.enableSearch(); + searchClausePanel.enableSearch(builder.resultContainer); } final MultiFieldPanel.Builder<SearchClause> searchView = new MultiFieldPanel.Builder<SearchClause>(model) { http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java index d72c8ba..e4327cb 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java @@ -35,17 +35,23 @@ import org.apache.syncope.client.console.commons.Constants; import org.apache.syncope.client.console.panels.search.SearchClause.Comparator; import org.apache.syncope.client.console.panels.search.SearchClause.Operator; import org.apache.syncope.client.console.panels.search.SearchClause.Type; +import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxEventBehavior; import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior; import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel; 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.RelationshipTypeTO; import org.apache.syncope.common.rest.api.service.RelationshipTypeService; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; +import org.apache.wicket.ajax.AjaxEventBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.attributes.AjaxCallListener; +import org.apache.wicket.ajax.attributes.AjaxRequestAttributes; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.event.Broadcast; +import org.apache.wicket.event.IEventSink; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; @@ -88,6 +94,8 @@ public class SearchClausePanel extends FieldPanel<SearchClause> { private final AjaxSubmitLink searchButton; + private IEventSink resultContainer; + public SearchClausePanel( final String id, final String name, @@ -118,7 +126,11 @@ public class SearchClausePanel extends FieldPanel<SearchClause> { @Override protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) { - send(this, Broadcast.BUBBLE, new SearchEvent(target)); + if (resultContainer == null) { + send(this, Broadcast.BUBBLE, new SearchEvent(target)); + } else { + send(resultContainer, Broadcast.EXACT, new SearchEvent(target)); + } } }; @@ -224,8 +236,42 @@ public class SearchClausePanel extends FieldPanel<SearchClause> { }; } - public void enableSearch() { + public void enableSearch(final IEventSink resultContainer) { + this.resultContainer = resultContainer; this.searchButton.setEnabled(true); + + field.add(AttributeModifier.replace( + "onkeydown", + Model.of("if(event.keyCode == 13) {event.preventDefault();}"))); + + field.add(new AjaxEventBehavior("onkeydown") { + + private static final long serialVersionUID = -7133385027739964990L; + + @Override + protected void onEvent(final AjaxRequestTarget target) { + if (resultContainer == null) { + send(SearchClausePanel.this, Broadcast.BUBBLE, new SearchEvent(target)); + } else { + send(resultContainer, Broadcast.EXACT, new SearchEvent(target)); + } + } + + @Override + protected void updateAjaxAttributes(final AjaxRequestAttributes attributes) { + super.updateAjaxAttributes(attributes); + + attributes.getAjaxCallListeners().add(new AjaxCallListener() { + + private static final long serialVersionUID = 7160235486520935153L; + + @Override + public CharSequence getPrecondition(final Component component) { + return "if (Wicket.Event.keyCode(attrs.event) == 13) { return true; } else { return false; }"; + } + }); + } + }); } @Override @@ -345,6 +391,41 @@ public class SearchClausePanel extends FieldPanel<SearchClause> { value.hideLabel().setOutputMarkupId(true); field.add(value); + value.getField().add(AttributeModifier.replace( + "onkeydown", + Model.of("if(event.keyCode == 13) {event.preventDefault();}"))); + + value.getField().add(new IndicatorAjaxEventBehavior("onkeydown") { + + private static final long serialVersionUID = -7133385027739964990L; + + @Override + protected void onEvent(final AjaxRequestTarget target) { + target.focusComponent(null); + value.getField().inputChanged(); + value.getField().validate(); + if (value.getField().isValid()) { + value.getField().valid(); + value.getField().updateModel(); + } + } + + @Override + protected void updateAjaxAttributes(final AjaxRequestAttributes attributes) { + super.updateAjaxAttributes(attributes); + + attributes.getAjaxCallListeners().add(new AjaxCallListener() { + + private static final long serialVersionUID = 7160235486520935153L; + + @Override + public CharSequence getPrecondition(final Component component) { + return "if (Wicket.Event.keyCode(attrs.event) == 13) { return true; } else { return false; }"; + } + }); + } + }); + final AjaxDropDownChoicePanel<SearchClause.Type> type = new AjaxDropDownChoicePanel<>( "type", "type", new PropertyModel<SearchClause.Type>(searchClause, "type")); type.setChoices(types).hideLabel().setRequired(required).setOutputMarkupId(true); @@ -669,7 +750,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> { panel.setReadOnly(this.isReadOnly()); panel.setRequired(this.isRequired()); if (searchButton.isEnabled()) { - panel.enableSearch(); + panel.enableSearch(resultContainer); } return panel; } http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/IndicatorAjaxEventBehavior.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/IndicatorAjaxEventBehavior.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/IndicatorAjaxEventBehavior.java new file mode 100644 index 0000000..a62e6ae --- /dev/null +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/IndicatorAjaxEventBehavior.java @@ -0,0 +1,48 @@ +/* + * 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.wicket.ajax.form; + +import org.apache.commons.lang3.StringUtils; +import org.apache.wicket.ajax.AjaxEventBehavior; +import org.apache.wicket.ajax.IAjaxIndicatorAware; + +/** + * An {@link AjaxEventBehavior} not showin veil. + */ +public abstract class IndicatorAjaxEventBehavior + extends AjaxEventBehavior implements IAjaxIndicatorAware { + + private static final long serialVersionUID = -5144403874783384604L; + + private final String indicator; + + public IndicatorAjaxEventBehavior(final String event) { + this(event, StringUtils.EMPTY); + } + + public IndicatorAjaxEventBehavior(final String event, final String indicator) { + super(event); + this.indicator = indicator; + } + + @Override + public String getAjaxIndicatorMarkupId() { + return indicator; + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractMultiPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractMultiPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractMultiPanel.java index 34c9c8c..19c7cdf 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractMultiPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractMultiPanel.java @@ -59,6 +59,7 @@ public abstract class AbstractMultiPanel<INNER> extends AbstractFieldPanel<List< add(container); form = new Form<>("innerForm"); + form.setDefaultButton(null); container.add(form); // ----------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDropDownChoicePanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDropDownChoicePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDropDownChoicePanel.java index 7a1bfc4..6b9696f 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDropDownChoicePanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDropDownChoicePanel.java @@ -59,7 +59,7 @@ public class AjaxDropDownChoicePanel<T extends Serializable> extends FieldPanel< } }); } - + setNullValid(true); } http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java index 8eb7ab0..eb5b318 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java @@ -173,7 +173,8 @@ public class Ownership extends WizardStep implements WizardModel.ICondition { groupSearchFragment = new Fragment("search", "groupSearchFragment", this); groupSearchPanel = new GroupSearchPanel.Builder( - new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch().build("groupsearch"); + new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch(Ownership.this). + build("groupsearch"); groupSearchFragment.add(groupSearchPanel.setRenderBodyOnly(true)); AnyTypeTO anyTypeTO = anyTypeRestClient.read(AnyTypeKind.GROUP.name()); @@ -187,7 +188,8 @@ public class Ownership extends WizardStep implements WizardModel.ICondition { userSearchFragment = new Fragment("search", "userSearchFragment", this); userSearchPanel = UserSearchPanel.class.cast(new UserSearchPanel.Builder( - new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch().build("usersearch")); + new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch(Ownership.this). + build("usersearch")); userSearchFragment.add(userSearchPanel.setRenderBodyOnly(true)); anyTypeTO = anyTypeRestClient.read(AnyTypeKind.USER.name()); http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java index 99d2821..b73f73f 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java @@ -328,7 +328,7 @@ public class Relationships extends WizardStep { anyObjectSearchPanel = new AnyObjectSearchPanel.Builder( anyType.getKey(), new ListModel<>(new ArrayList<SearchClause>())). - enableSearch(). + enableSearch(Specification.this). build("searchPanel"); fragment.add(anyObjectSearchPanel.setRenderBodyOnly(true)); http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java index 740ad9a..e7f7d89 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java @@ -50,7 +50,7 @@ public class AnyObjectsITCase extends AbstractConsoleITCase { TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:title"); TESTER.executeAjaxEvent("body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:body:" - + "content:searchFormContainer:search:multiValueContainer:innerForm:content:panelPlus:add", + + "content:searchFormContainer:search:multiValueContainer:innerForm:content:view:0:panelPlus:add", Constants.ON_CLICK); TESTER.assertComponent( http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java index f71fa63..9b0ff4f 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java @@ -76,7 +76,7 @@ public class GroupsITCase extends AbstractConsoleITCase { TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:title"); TESTER.executeAjaxEvent("body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:body:" - + "content:searchFormContainer:search:multiValueContainer:innerForm:content:panelPlus:add", + + "content:searchFormContainer:search:multiValueContainer:innerForm:content:view:0:panelPlus:add", Constants.ON_CLICK); TESTER.assertComponent("body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:body:" http://git-wip-us.apache.org/repos/asf/syncope/blob/14246792/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java index 7a6d343..f44121f 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java @@ -49,7 +49,7 @@ public class UsersITCase extends AbstractConsoleITCase { TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:title"); TESTER.executeAjaxEvent("body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:body:" - + "content:searchFormContainer:search:multiValueContainer:innerForm:content:panelPlus:add", + + "content:searchFormContainer:search:multiValueContainer:innerForm:content:view:0:panelPlus:add", Constants.ON_CLICK); TESTER.assertComponent(