[SYNCOPE-1067] Management from Admin Console
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/52bd7eb0 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/52bd7eb0 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/52bd7eb0 Branch: refs/heads/master Commit: 52bd7eb0d8331b884e8b8cdf598670d1a03ccad1 Parents: f74ce5d Author: Francesco Chicchiriccò <ilgro...@apache.org> Authored: Fri Jun 9 17:59:22 2017 +0200 Committer: Francesco Chicchiriccò <ilgro...@apache.org> Committed: Fri Jun 9 18:00:11 2017 +0200 ---------------------------------------------------------------------- .../client/console/commons/Constants.java | 2 + .../console/layout/AbstractAnyFormLayout.java | 10 + .../console/layout/AnyObjectFormLayoutInfo.java | 10 - .../console/layout/UserFormLayoutInfo.java | 10 - .../console/notifications/TemplateModal.java | 4 +- .../client/console/pages/Administration.java | 83 ++++++ .../syncope/client/console/pages/BasePage.java | 6 +- .../syncope/client/console/pages/Roles.java | 52 ---- .../console/panels/DynRealmDirectoryPanel.java | 186 +++++++++++++ .../console/panels/DynRealmModalPanel.java | 109 ++++++++ .../console/panels/RoleDirectoryPanel.java | 2 +- .../console/panels/SecurityQuestionsPanel.java | 4 +- .../client/console/rest/DynRealmRestClient.java | 47 ++++ .../client/console/rest/RoleRestClient.java | 4 - .../html/form/ActionLinksTogglePanel.java | 8 +- .../wicket/markup/html/form/ActionPanel.java | 2 +- .../console/widgets/CompletenessWidget.java | 4 +- .../client/console/widgets/NumberWidget.java | 4 +- .../client/console/wizards/DynRealmWrapper.java | 69 +++++ .../client/console/wizards/WizardMgtPanel.java | 4 +- .../console/wizards/any/AnyWizardBuilder.java | 6 +- .../console/wizards/any/GroupWizardBuilder.java | 2 +- .../client/console/wizards/any/Groups.java | 260 +++++++++++-------- .../console/wizards/role/RoleWizardBuilder.java | 20 +- .../src/main/resources/console.properties | 2 +- .../SyncopeConsoleApplication.properties | 1 + .../SyncopeConsoleApplication_it.properties | 1 + .../SyncopeConsoleApplication_pt_BR.properties | 1 + .../SyncopeConsoleApplication_ru.properties | 1 + .../console/notifications/TemplateModal.html | 13 +- .../client/console/pages/Administration.html | 36 +++ .../console/pages/Administration.properties | 18 ++ .../console/pages/Administration_it.properties | 18 ++ .../pages/Administration_pt_BR.properties | 18 ++ .../console/pages/Administration_ru.properties | 20 ++ .../syncope/client/console/pages/BasePage.html | 2 +- .../syncope/client/console/pages/Roles.html | 36 --- .../client/console/pages/Roles.properties | 17 -- .../client/console/pages/Roles_it.properties | 17 -- .../client/console/pages/Roles_pt_BR.properties | 17 -- .../client/console/pages/Roles_ru.properties | 19 -- .../panels/DynRealmDirectoryPanel.properties | 18 ++ .../panels/DynRealmDirectoryPanel_it.properties | 18 ++ .../DynRealmDirectoryPanel_pt_BR.properties | 18 ++ .../panels/DynRealmDirectoryPanel_ru.properties | 19 ++ .../console/panels/DynRealmModalPanel.html | 26 ++ .../panels/RoleDirectoryPanel.properties | 1 - .../panels/RoleDirectoryPanel_it.properties | 1 - .../panels/RoleDirectoryPanel_pt_BR.properties | 1 - .../panels/RoleDirectoryPanel_ru.properties | 1 - .../client/console/wizards/any/Groups.html | 17 +- .../console/wizards/any/Groups.properties | 1 + .../console/wizards/any/Groups_it.properties | 1 + .../console/wizards/any/Groups_pt_BR.properties | 1 + .../console/wizards/any/Groups_ru.properties | 1 + .../role/RoleWizardBuilder$DynRealms.html | 28 ++ .../java/data/DynRealmDataBinderImpl.java | 7 +- .../src/main/resources/console.properties | 2 +- .../syncope/fit/console/AjaxBrowseITCase.java | 6 +- .../apache/syncope/fit/console/RolesITCase.java | 55 ++-- .../apache/syncope/fit/console/UsersITCase.java | 4 +- .../src/test/resources/console.properties | 2 +- 62 files changed, 1002 insertions(+), 371 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/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 1eedd67..e49f10d 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 @@ -121,6 +121,8 @@ public final class Constants { public static final String PREF_ROLE_PAGINATOR_ROWS = "role.paginator.rows"; + public static final String PREF_DYNREALM_PAGINATOR_ROWS = "dynRealm.paginator.rows"; + public static final String PREF_ACCESS_TOKEN_PAGINATOR_ROWS = "accessToken.paginator.rows"; public static final String PREF_WORKFLOW_FORM_PAGINATOR_ROWS = "role.paginator.workflow.form"; http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java b/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java index 91c887a..6b85887 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java @@ -31,6 +31,8 @@ public abstract class AbstractAnyFormLayout<A extends AnyTO, F extends AnyForm<A private boolean auxClasses = true; + private boolean groups = true; + private boolean plainAttrs = true; private final List<String> whichPlainAttrs = new ArrayList<>(); @@ -63,6 +65,14 @@ public abstract class AbstractAnyFormLayout<A extends AnyTO, F extends AnyForm<A this.auxClasses = auxClasses; } + public boolean isGroups() { + return groups; + } + + public void setGroups(final boolean groups) { + this.groups = groups; + } + public boolean isPlainAttrs() { return plainAttrs; } http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java b/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java index 2d275c3..211aa25 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java @@ -25,8 +25,6 @@ public class AnyObjectFormLayoutInfo extends AbstractAnyFormLayout<AnyObjectTO, private static final long serialVersionUID = -5573691733739618500L; - private boolean groups = true; - private boolean relationships = true; @Override @@ -34,14 +32,6 @@ public class AnyObjectFormLayoutInfo extends AbstractAnyFormLayout<AnyObjectTO, return AnyObjectWizardBuilder.class; } - public boolean isGroups() { - return groups; - } - - public void setGroups(final boolean groups) { - this.groups = groups; - } - public boolean isRelationships() { return relationships; } http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java b/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java index 68a67b9..c100143 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java @@ -29,8 +29,6 @@ public class UserFormLayoutInfo extends AbstractAnyFormLayout<UserTO, UserForm> private boolean roles = true; - private boolean groups = true; - private boolean relationships = true; @Override @@ -54,14 +52,6 @@ public class UserFormLayoutInfo extends AbstractAnyFormLayout<UserTO, UserForm> this.roles = roles; } - public boolean isGroups() { - return groups; - } - - public void setGroups(final boolean groups) { - this.groups = groups; - } - public boolean isRelationships() { return relationships; } http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java index 57bb761..d802f66 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java @@ -50,8 +50,8 @@ public class TemplateModal<T extends EntityTO, F> extends AbstractModalPanel<T> this.restClient = restClient; this.templateTO = templateTO; - final AjaxTextFieldPanel key - = new AjaxTextFieldPanel("key", "key", new PropertyModel<String>(templateTO, "key"), false); + AjaxTextFieldPanel key = new AjaxTextFieldPanel( + "key", "key", new PropertyModel<String>(templateTO, "key"), false); key.setOutputMarkupPlaceholderTag(true); add(key.setRenderBodyOnly(true)); } http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java new file mode 100644 index 0000000..6f4423f --- /dev/null +++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java @@ -0,0 +1,83 @@ +/* + * 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.pages; + +import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel; +import java.util.ArrayList; +import java.util.List; +import org.apache.syncope.client.console.BookmarkablePageLinkBuilder; +import org.apache.syncope.client.console.panels.DynRealmDirectoryPanel; +import org.apache.syncope.client.console.panels.RoleDirectoryPanel; +import org.apache.syncope.client.console.wizards.role.RoleWizardBuilder; +import org.apache.syncope.common.lib.to.RoleTO; +import org.apache.wicket.extensions.markup.html.tabs.AbstractTab; +import org.apache.wicket.extensions.markup.html.tabs.ITab; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.ResourceModel; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +public class Administration extends BasePage { + + private static final long serialVersionUID = -1100228004207271271L; + + public Administration(final PageParameters parameters) { + super(parameters); + + body.add(BookmarkablePageLinkBuilder.build("dashboard", "dashboardBr", Dashboard.class)); + WebMarkupContainer content = new WebMarkupContainer("content"); + content.setOutputMarkupId(true); + content.setMarkupId("administration"); + content.add(new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList())); + body.add(content); + } + + private List<ITab> buildTabList() { + final List<ITab> tabs = new ArrayList<>(); + + tabs.add(new AbstractTab(new ResourceModel("roles")) { + + private static final long serialVersionUID = -6815067322125799251L; + + @Override + public Panel getPanel(final String panelId) { + return new RoleDirectoryPanel.Builder(getPageReference()) { + + private static final long serialVersionUID = -5960765294082359003L; + + }.addNewItemPanelBuilder(new RoleWizardBuilder(new RoleTO(), getPageReference()), true).build(panelId); + } + }); + + tabs.add(new AbstractTab(new ResourceModel("dynRealms")) { + + private static final long serialVersionUID = -6815067322125799251L; + + @Override + public Panel getPanel(final String panelId) { + return new DynRealmDirectoryPanel.Builder(getPageReference()) { + + private static final long serialVersionUID = -5960765294082359003L; + + }.build(panelId); + } + }); + return tabs; + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java index e7e23ae..1a94309 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java @@ -206,9 +206,9 @@ public class BasePage extends WebPage implements IAjaxIndicatorAware { MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, StandardEntitlement.SCHEMA_LIST); liContainer.add(link); - liContainer = new WebMarkupContainer(getLIContainerId("roles")); + liContainer = new WebMarkupContainer(getLIContainerId("administration")); confULContainer.add(liContainer); - link = BookmarkablePageLinkBuilder.build("roles", Roles.class); + link = BookmarkablePageLinkBuilder.build("administration", Administration.class); MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, StandardEntitlement.ROLE_LIST); liContainer.add(link); @@ -317,7 +317,7 @@ public class BasePage extends WebPage implements IAjaxIndicatorAware { // Extensions ClassPathScanImplementationLookup classPathScanImplementationLookup = (ClassPathScanImplementationLookup) SyncopeConsoleApplication.get(). - getServletContext().getAttribute(ConsoleInitializer.CLASSPATH_LOOKUP); + getServletContext().getAttribute(ConsoleInitializer.CLASSPATH_LOOKUP); List<Class<? extends BaseExtPage>> extPageClasses = classPathScanImplementationLookup.getExtPageClasses(); WebMarkupContainer extensionsLI = new WebMarkupContainer(getLIContainerId("extensions")); http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java deleted file mode 100644 index d02345c..0000000 --- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.pages; - -import org.apache.syncope.client.console.BookmarkablePageLinkBuilder; -import org.apache.syncope.client.console.panels.RoleDirectoryPanel; -import org.apache.syncope.client.console.wizards.WizardMgtPanel; -import org.apache.syncope.client.console.wizards.role.RoleWrapper; -import org.apache.syncope.client.console.wizards.role.RoleWizardBuilder; -import org.apache.syncope.common.lib.to.RoleTO; -import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.request.mapper.parameter.PageParameters; - -public class Roles extends BasePage { - - private static final long serialVersionUID = -1100228004207271271L; - - public Roles(final PageParameters parameters) { - super(parameters); - - body.add(BookmarkablePageLinkBuilder.build("dashboard", "dashboardBr", Dashboard.class)); - - WebMarkupContainer content = new WebMarkupContainer("content"); - content.setOutputMarkupId(true); - body.add(content); - - WizardMgtPanel<RoleWrapper> rolesPanel = new RoleDirectoryPanel.Builder(getPageReference()) { - - private static final long serialVersionUID = -5960765294082359003L; - - }.addNewItemPanelBuilder( - new RoleWizardBuilder(new RoleTO(), getPageReference()), true).build("rolesPanel"); - - content.add(rolesPanel); - } -} http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java new file mode 100644 index 0000000..c20efb5 --- /dev/null +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java @@ -0,0 +1,186 @@ +/* + * 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 de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import org.apache.syncope.client.console.SyncopeConsoleSession; +import org.apache.syncope.client.console.commons.Constants; +import org.apache.syncope.client.console.commons.DirectoryDataProvider; +import org.apache.syncope.client.console.commons.SortableDataProviderComparator; +import org.apache.syncope.client.console.panels.DynRealmDirectoryPanel.DynRealmDataProvider; +import org.apache.syncope.client.console.rest.DynRealmRestClient; +import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink; +import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel; +import org.apache.syncope.client.console.wizards.DynRealmWrapper; +import org.apache.syncope.client.console.wizards.WizardMgtPanel; +import org.apache.syncope.common.lib.to.DynRealmTO; +import org.apache.syncope.common.lib.types.StandardEntitlement; +import org.apache.wicket.PageReference; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy; +import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; +import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.model.CompoundPropertyModel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.ResourceModel; +import org.apache.wicket.model.StringResourceModel; + +public class DynRealmDirectoryPanel extends + DirectoryPanel<DynRealmTO, DynRealmWrapper, DynRealmDataProvider, DynRealmRestClient> { + + private static final long serialVersionUID = -5491515010207202168L; + + protected DynRealmDirectoryPanel(final String id, final Builder builder) { + super(id, builder); + MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, RENDER, StandardEntitlement.DYNREALM_CREATE); + setReadOnly(!SyncopeConsoleSession.get().owns(StandardEntitlement.DYNREALM_UPDATE)); + + disableCheckBoxes(); + setShowResultPage(true); + + modal.size(Modal.Size.Large); + modal.addSubmitButton(); + setFooterVisibility(true); + modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() { + + private static final long serialVersionUID = 8804221891699487139L; + + @Override + public void onClose(final AjaxRequestTarget target) { + updateResultTable(target); + modal.show(false); + } + }); + + AjaxLink<Void> newDynReamlLink = new AjaxLink<Void>("add") { + + private static final long serialVersionUID = -7978723352517770644L; + + @Override + public void onClick(final AjaxRequestTarget target) { + modal.header(new StringResourceModel("any.new")); + modal.setContent(new DynRealmModalPanel(new DynRealmWrapper(new DynRealmTO()), true, modal, pageRef)); + modal.show(true); + target.add(modal); + } + }; + ((WebMarkupContainer) get("container:content")).addOrReplace(newDynReamlLink); + MetaDataRoleAuthorizationStrategy.authorize(newDynReamlLink, RENDER, StandardEntitlement.DYNREALM_CREATE); + + initResultTable(); + } + + @Override + protected DynRealmDataProvider dataProvider() { + return new DynRealmDataProvider(rows); + } + + @Override + protected String paginatorRowsKey() { + return Constants.PREF_DYNREALM_PAGINATOR_ROWS; + } + + @Override + protected List<IColumn<DynRealmTO, String>> getColumns() { + final List<IColumn<DynRealmTO, String>> columns = new ArrayList<>(); + + columns.add(new PropertyColumn<DynRealmTO, String>(new ResourceModel("key"), "key", "key")); + + return columns; + } + + @Override + public ActionsPanel<DynRealmTO> getActions(final IModel<DynRealmTO> model) { + final ActionsPanel<DynRealmTO> panel = super.getActions(model); + + panel.add(new ActionLink<DynRealmTO>() { + + private static final long serialVersionUID = -7978723352517770644L; + + @Override + public void onClick(final AjaxRequestTarget target, final DynRealmTO ignore) { + modal.header(new StringResourceModel("any.edit", model)); + modal.setContent(new DynRealmModalPanel(new DynRealmWrapper(model.getObject()), false, modal, pageRef)); + modal.show(true); + target.add(modal); + } + }, ActionLink.ActionType.EDIT, StandardEntitlement.DYNREALM_UPDATE); + + return panel; + } + + @Override + protected Collection<ActionLink.ActionType> getBulkActions() { + return Collections.<ActionLink.ActionType>emptyList(); + } + + public abstract static class Builder + extends DirectoryPanel.Builder<DynRealmTO, DynRealmWrapper, DynRealmRestClient> { + + private static final long serialVersionUID = 5530948153889495221L; + + public Builder(final PageReference pageRef) { + super(new DynRealmRestClient(), pageRef); + } + + @Override + protected WizardMgtPanel<DynRealmWrapper> newInstance(final String id, final boolean wizardInModal) { + return new DynRealmDirectoryPanel(id, this); + } + } + + protected class DynRealmDataProvider extends DirectoryDataProvider<DynRealmTO> { + + private static final long serialVersionUID = 3124431855954382273L; + + private final SortableDataProviderComparator<DynRealmTO> comparator; + + private final DynRealmRestClient restClient = new DynRealmRestClient(); + + public DynRealmDataProvider(final int paginatorRows) { + super(paginatorRows); + this.comparator = new SortableDataProviderComparator<>(this); + } + + @Override + public Iterator<DynRealmTO> iterator(final long first, final long count) { + List<DynRealmTO> result = restClient.list(); + Collections.sort(result, comparator); + return result.subList((int) first, (int) first + (int) count).iterator(); + } + + @Override + public long size() { + return restClient.list().size(); + } + + @Override + public IModel<DynRealmTO> model(final DynRealmTO object) { + return new CompoundPropertyModel<>(object); + } + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java new file mode 100644 index 0000000..dd22e23 --- /dev/null +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java @@ -0,0 +1,109 @@ +/* + * 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 java.util.Collections; +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.pages.BasePage; +import org.apache.syncope.client.console.panels.search.SearchClause; +import org.apache.syncope.client.console.panels.search.UserSearchPanel; +import org.apache.syncope.client.console.rest.DynRealmRestClient; +import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal; +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.wizards.DynRealmWrapper; +import org.apache.wicket.PageReference; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.extensions.markup.html.tabs.AbstractTab; +import org.apache.wicket.extensions.markup.html.tabs.ITab; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.model.ResourceModel; + +public class DynRealmModalPanel extends AbstractModalPanel<DynRealmWrapper> { + + private static final long serialVersionUID = -3773196441177699452L; + + private final DynRealmRestClient restClient = new DynRealmRestClient(); + + private final DynRealmWrapper dynRealmWrapper; + + private final boolean create; + + public DynRealmModalPanel( + final DynRealmWrapper dynRealmWrapper, + final boolean create, + final BaseModal<DynRealmWrapper> modal, + final PageReference pageRef) { + + super(modal, pageRef); + this.dynRealmWrapper = dynRealmWrapper; + this.create = create; + modal.setFormModel(dynRealmWrapper); + + AjaxTextFieldPanel key = new AjaxTextFieldPanel( + "key", "key", new PropertyModel<String>(dynRealmWrapper.getInnerObject(), "key"), false); + key.setReadOnly(!create); + add(key); + + add(new Accordion("cond", Collections.<ITab>singletonList( + new AbstractTab(new ResourceModel("cond", "Dynamic Condition")) { + + private static final long serialVersionUID = 1037272333056449378L; + + @Override + public Panel getPanel(final String panelId) { + return new UserSearchPanel.Builder( + new PropertyModel<List<SearchClause>>(dynRealmWrapper, "dynClauses")). + required(false).build(panelId); + } + }), Model.of(StringUtils.isBlank(dynRealmWrapper.getCond()) ? -1 : 0)).setOutputMarkupId(true)); + } + + @Override + public DynRealmWrapper getItem() { + return dynRealmWrapper; + } + + @Override + public void onSubmit(final AjaxRequestTarget target, final Form<?> form) { + try { + dynRealmWrapper.fillDynamicConditions(); + if (create) { + restClient.create(dynRealmWrapper.getInnerObject()); + } else { + restClient.update(dynRealmWrapper.getInnerObject()); + } + SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED)); + this.modal.close(target); + } catch (Exception e) { + LOG.error("While creating/updating dynamic realm", e); + SyncopeConsoleSession.get().error( + StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage()); + } + ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target); + + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java index 1251b6d..f037a33 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java @@ -300,7 +300,7 @@ public class RoleDirectoryPanel extends DirectoryPanel<RoleTO, RoleWrapper, Role @Override public long size() { - return restClient.count(); + return restClient.list().size(); } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java index c7748d0..fb14b54 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java @@ -87,8 +87,8 @@ public class SecurityQuestionsPanel extends DirectoryPanel< @Override public WizardModalPanel<SecurityQuestionTO> build( final String id, final int index, final AjaxWizard.Mode mode) { - final SecurityQuestionTO modelObject = newModelObject(); - return new SecurityQuestionsModalPanel(modal, modelObject, pageRef); + + return new SecurityQuestionsModalPanel(modal, newModelObject(), pageRef); } }, true); http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java new file mode 100644 index 0000000..5bc61d4 --- /dev/null +++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java @@ -0,0 +1,47 @@ +/* + * 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.rest; + +import java.util.List; +import org.apache.syncope.common.lib.to.DynRealmTO; +import org.apache.syncope.common.rest.api.service.DynRealmService; + +/** + * Console client for invoking REST DynRealm's services. + */ +public class DynRealmRestClient extends BaseRestClient { + + private static final long serialVersionUID = -8549081557283519638L; + + public List<DynRealmTO> list() { + return getService(DynRealmService.class).list(); + } + + public void create(final DynRealmTO dynRealmTO) { + getService(DynRealmService.class).create(dynRealmTO); + } + + public void update(final DynRealmTO dynRealmTO) { + getService(DynRealmService.class).update(dynRealmTO); + } + + public void delete(final String key) { + getService(DynRealmService.class).delete(key); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java index 32404e1..743bfb5 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java @@ -55,10 +55,6 @@ public class RoleRestClient extends BaseRestClient { return getService(RoleService.class).list(); } - public int count() { - return getService(RoleService.class).list().size(); - } - public String readConsoleLayoutInfo(final String roleKey) { try { return IOUtils.toString(InputStream.class.cast( http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/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 5788759..78c175a 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 @@ -140,16 +140,16 @@ public class ActionLinksTogglePanel<T extends Serializable> extends TogglePanel< @Override public void onEvent(final IEvent<?> event) { - if (event.getPayload() instanceof ActionLinkTogleCloseEventPayload) { - close(ActionLinkTogleCloseEventPayload.class.cast(event.getPayload()).getTarget()); + if (event.getPayload() instanceof ActionLinkToggleCloseEventPayload) { + close(ActionLinkToggleCloseEventPayload.class.cast(event.getPayload()).getTarget()); } } - public static class ActionLinkTogleCloseEventPayload { + public static class ActionLinkToggleCloseEventPayload { private final AjaxRequestTarget target; - public ActionLinkTogleCloseEventPayload(final AjaxRequestTarget target) { + public ActionLinkToggleCloseEventPayload(final AjaxRequestTarget target) { this.target = target; } http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/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 4e39205..6f147c0 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,7 +185,7 @@ public final class ActionPanel<T extends Serializable> extends Panel { case CREATE: case MEMBERS: case CLAIM: - send(this, Broadcast.BUBBLE, new ActionLinksTogglePanel.ActionLinkTogleCloseEventPayload(target)); + send(this, Broadcast.BUBBLE, new ActionLinksTogglePanel.ActionLinkToggleCloseEventPayload(target)); break; default: break; http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java index ab74021..fe80ac9 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java @@ -25,7 +25,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.syncope.client.console.BookmarkablePageLinkBuilder; import org.apache.syncope.client.console.pages.Notifications; import org.apache.syncope.client.console.pages.Policies; -import org.apache.syncope.client.console.pages.Roles; +import org.apache.syncope.client.console.pages.Administration; import org.apache.syncope.client.console.pages.SecurityQuestions; import org.apache.syncope.client.console.pages.Types; import org.apache.syncope.client.console.topology.Topology; @@ -112,7 +112,7 @@ public class CompletenessWidget extends BaseWidget { actions.add(securityquestions); securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION)); - roles = BookmarkablePageLinkBuilder.build("roles", Roles.class); + roles = BookmarkablePageLinkBuilder.build("roles", Administration.class); roles.setOutputMarkupPlaceholderTag(true); MetaDataRoleAuthorizationStrategy.authorize(roles, WebPage.ENABLE, StandardEntitlement.ROLE_LIST); actions.add(roles); http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java index fe5ef29..15bf597 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java @@ -30,7 +30,7 @@ import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.ajax.AjaxEventBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.syncope.client.console.pages.Realms; -import org.apache.syncope.client.console.pages.Roles; +import org.apache.syncope.client.console.pages.Administration; import org.apache.syncope.client.console.topology.Topology; import org.apache.syncope.common.lib.types.StandardEntitlement; import org.apache.wicket.request.component.IRequestablePage; @@ -81,7 +81,7 @@ public class NumberWidget extends BaseWidget { responsePage = Realms.class; isAuthorized = SyncopeConsoleSession.get().owns(label + "_SEARCH"); } else { - responsePage = Roles.class; + responsePage = Administration.class; isAuthorized = SyncopeConsoleSession.get().owns(StandardEntitlement.ROLE_LIST); } break; http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java new file mode 100644 index 0000000..e9f5acc --- /dev/null +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java @@ -0,0 +1,69 @@ +/* + * 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; + +import java.io.Serializable; +import java.util.List; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.syncope.client.console.panels.search.SearchClause; +import org.apache.syncope.client.console.panels.search.SearchUtils; +import org.apache.syncope.client.lib.SyncopeClient; +import org.apache.syncope.common.lib.to.DynRealmTO; + +public class DynRealmWrapper implements Serializable { + + private static final long serialVersionUID = 7226128615964284614L; + + private final DynRealmTO dynRealmTO; + + private List<SearchClause> dynClauses; + + public DynRealmWrapper(final DynRealmTO dynRealmTO) { + this.dynRealmTO = dynRealmTO; + getDynClauses(); + } + + public final List<SearchClause> getDynClauses() { + if (this.dynClauses == null) { + this.dynClauses = SearchUtils.getSearchClauses(this.dynRealmTO.getCond()); + } + return this.dynClauses; + } + + public void setDynClauses(final List<SearchClause> dynClauses) { + this.dynClauses = dynClauses; + } + + public String getCond() { + if (CollectionUtils.isEmpty(this.dynClauses)) { + return null; + } else { + return SearchUtils.buildFIQL(this.dynClauses, SyncopeClient.getUserSearchConditionBuilder()); + } + } + + public DynRealmTO fillDynamicConditions() { + this.dynRealmTO.setCond(this.getCond()); + return this.dynRealmTO; + } + + public DynRealmTO getInnerObject() { + return this.dynRealmTO; + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/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 3891908..0ade92c 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 @@ -124,9 +124,9 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple @Override public void onClick(final AjaxRequestTarget target) { send(WizardMgtPanel.this, Broadcast.BREADTH, - new ActionLinksTogglePanel.ActionLinkTogleCloseEventPayload(target)); + new ActionLinksTogglePanel.ActionLinkToggleCloseEventPayload(target)); send(WizardMgtPanel.this, Broadcast.EXACT, - new AjaxWizard.NewItemActionEvent<T>(null, target)); + new AjaxWizard.NewItemActionEvent<>(null, target)); } }; http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java index 1253f20..9f1d3d2 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java @@ -103,11 +103,7 @@ public abstract class AnyWizardBuilder<A extends AnyTO> extends AjaxWizardBuilde wizardModel.add(new AuxClasses(modelObject.getInnerObject(), anyTypeClasses)); } - if (formLayoutInfo instanceof UserFormLayoutInfo - && UserFormLayoutInfo.class.cast(formLayoutInfo).isGroups() - || formLayoutInfo instanceof AnyObjectFormLayoutInfo - && AnyObjectFormLayoutInfo.class.cast(formLayoutInfo).isGroups()) { - + if (formLayoutInfo.isGroups()) { wizardModel.add(new Groups(modelObject.getInnerObject(), mode == AjaxWizard.Mode.TEMPLATE)); } http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/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 6c1e166..e5cb435 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 @@ -47,7 +47,7 @@ public class GroupWizardBuilder extends AnyWizardBuilder<GroupTO> implements Gro } /** - * This method has been overridden to manage asynchronous translation of FIQL string to search clases list and + * This method has been overridden to manage asynchronous translation of FIQL string to search classes list and * viceversa. * * @param item wizard backend item. http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java index 184f657..6525be5 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java @@ -27,170 +27,202 @@ import org.apache.commons.collections4.Transformer; import org.apache.commons.lang3.StringUtils; import org.apache.cxf.jaxrs.ext.search.client.CompleteCondition; import org.apache.syncope.client.console.SyncopeConsoleApplication; +import org.apache.syncope.client.console.rest.DynRealmRestClient; import org.apache.syncope.client.console.rest.GroupRestClient; import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel; import org.apache.syncope.client.lib.SyncopeClient; +import org.apache.syncope.common.lib.EntityTOUtils; import org.apache.syncope.common.lib.search.GroupFiqlSearchConditionBuilder; -import org.apache.syncope.common.lib.to.AnyObjectTO; import org.apache.syncope.common.lib.to.AnyTO; +import org.apache.syncope.common.lib.to.DynRealmTO; import org.apache.syncope.common.lib.to.GroupTO; import org.apache.syncope.common.lib.to.MembershipTO; -import org.apache.syncope.common.lib.to.UserTO; import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; import org.apache.wicket.extensions.wizard.WizardStep; import org.apache.wicket.markup.html.form.IChoiceRenderer; import org.apache.wicket.model.IModel; import org.apache.wicket.model.util.ListModel; -import org.apache.wicket.util.lang.Args; import org.apache.syncope.common.lib.to.GroupableRelatableTO; import org.apache.wicket.authroles.authorization.strategies.role.metadata.ActionPermissions; import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy; import org.apache.wicket.extensions.wizard.WizardModel.ICondition; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.model.PropertyModel; public class Groups extends WizardStep implements ICondition { private static final long serialVersionUID = 552437609667518888L; + private static final int MAX_GROUP_LIST_CARDINALITY = 30; + private final GroupRestClient groupRestClient = new GroupRestClient(); - private final List<GroupTO> allGroups; + private final List<DynRealmTO> allDynRealms = new DynRealmRestClient().list(); - private static final int MAX_GROUP_LIST_CARDINALITY = 30; + private List<GroupTO> allGroups; + + private final AnyTO anyTO; public <T extends AnyTO> Groups(final T anyTO, final boolean templateMode) { super(); + this.anyTO = anyTO; final String realm = templateMode ? "/" : anyTO.getRealm(); // ----------------------------------------------------------------- // Pre-Authorizations // ----------------------------------------------------------------- - final ActionPermissions permissions = new ActionPermissions(); + ActionPermissions permissions = new ActionPermissions(); setMetaData(MetaDataRoleAuthorizationStrategy.ACTION_PERMISSIONS, permissions); permissions.authorizeAll(RENDER); // ----------------------------------------------------------------- setOutputMarkupId(true); - Args.isTrue((anyTO instanceof UserTO) || (anyTO instanceof AnyObjectTO), "Expected user or anyObject"); - - AjaxPalettePanel.Builder<MembershipTO> builder = new AjaxPalettePanel.Builder<MembershipTO>(). - setRenderer(new IChoiceRenderer<MembershipTO>() { - - private static final long serialVersionUID = -3086661086073628855L; - - @Override - public Object getDisplayValue(final MembershipTO object) { - return object.getGroupName(); - } - - @Override - public String getIdValue(final MembershipTO object, final int index) { - return object.getGroupName(); - } - - @Override - public MembershipTO getObject( - final String id, final IModel<? extends List<? extends MembershipTO>> choices) { - - return IterableUtils.find(choices.getObject(), new Predicate<MembershipTO>() { - - @Override - public boolean evaluate(final MembershipTO object) { - return id.equalsIgnoreCase(object.getGroupName()); - } - }); - } - }); - - allGroups = groupRestClient.search( - realm, - SyncopeClient.getGroupSearchConditionBuilder().isAssignable().query(), - 1, - MAX_GROUP_LIST_CARDINALITY, - new SortParam<>("name", true), - null); - - // --------------------------------- - // Retrieve group memberships - // --------------------------------- - add(builder.setAllowOrder(true).withFilter().build("groups", - new ListModel<>(GroupableRelatableTO.class.cast(anyTO).getMemberships()), - new AjaxPalettePanel.Builder.Query<MembershipTO>() { - - private static final long serialVersionUID = -7223078772249308813L; - - @Override - public List<MembershipTO> execute(final String filter) { - return CollectionUtils.collect( - StringUtils.isEmpty(filter) || "*".equals(filter) - ? allGroups - : groupRestClient.search( - realm, - SyncopeClient.getGroupSearchConditionBuilder(). - isAssignable().and().is("name").equalTo(filter).query(), - 1, MAX_GROUP_LIST_CARDINALITY, - new SortParam<>("name", true), - null), - new Transformer<GroupTO, MembershipTO>() { - - @Override - public MembershipTO transform(final GroupTO input) { - return new MembershipTO.Builder(). - group(input.getKey(), input.getName()). - build(); - } - }, new ArrayList<MembershipTO>()); + WebMarkupContainer groupsContainer = new WebMarkupContainer("groupsContainer"); + groupsContainer.setOutputMarkupId(true); + groupsContainer.setOutputMarkupPlaceholderTag(true); + add(groupsContainer); + + WebMarkupContainer dyngroupsContainer = new WebMarkupContainer("dyngroupsContainer"); + dyngroupsContainer.setOutputMarkupId(true); + dyngroupsContainer.setOutputMarkupPlaceholderTag(true); + add(dyngroupsContainer); + + if (anyTO instanceof GroupTO) { + groupsContainer.add(new Label("groups").setVisible(false)); + groupsContainer.setVisible(false); + dyngroupsContainer.add(new Label("dyngroups").setVisible(false)); + dyngroupsContainer.setVisible(false); + } else { + AjaxPalettePanel.Builder<MembershipTO> builder = new AjaxPalettePanel.Builder<MembershipTO>(). + setRenderer(new IChoiceRenderer<MembershipTO>() { + + private static final long serialVersionUID = -3086661086073628855L; + + @Override + public Object getDisplayValue(final MembershipTO object) { + return object.getGroupName(); + } + + @Override + public String getIdValue(final MembershipTO object, final int index) { + return object.getGroupName(); + } + + @Override + public MembershipTO getObject( + final String id, final IModel<? extends List<? extends MembershipTO>> choices) { + + return IterableUtils.find(choices.getObject(), new Predicate<MembershipTO>() { + + @Override + public boolean evaluate(final MembershipTO object) { + return id.equalsIgnoreCase(object.getGroupName()); + } + }); + } + }); + + allGroups = groupRestClient.search( + realm, + SyncopeClient.getGroupSearchConditionBuilder().isAssignable().query(), + 1, + MAX_GROUP_LIST_CARDINALITY, + new SortParam<>("name", true), + null); + + // --------------------------------- + // Retrieve group memberships + // --------------------------------- + groupsContainer.add(builder.setAllowOrder(true).withFilter().build("groups", + new ListModel<>(GroupableRelatableTO.class.cast(anyTO).getMemberships()), + new AjaxPalettePanel.Builder.Query<MembershipTO>() { + + private static final long serialVersionUID = -7223078772249308813L; + + @Override + public List<MembershipTO> execute(final String filter) { + return CollectionUtils.collect( + StringUtils.isEmpty(filter) || "*".equals(filter) + ? allGroups + : groupRestClient.search( + realm, + SyncopeClient.getGroupSearchConditionBuilder(). + isAssignable().and().is("name").equalTo(filter).query(), + 1, MAX_GROUP_LIST_CARDINALITY, + new SortParam<>("name", true), + null), + new Transformer<GroupTO, MembershipTO>() { + + @Override + public MembershipTO transform(final GroupTO input) { + return new MembershipTO.Builder(). + group(input.getKey(), input.getName()). + build(); + } + }, new ArrayList<MembershipTO>()); + } + }).hideLabel().setOutputMarkupId(true)); + // --------------------------------- + + // --------------------------------- + // Retrieve dyn group memberships + // --------------------------------- + GroupFiqlSearchConditionBuilder searchConditionBuilder = SyncopeClient.getGroupSearchConditionBuilder(); + + List<CompleteCondition> conditions = new ArrayList<>(); + for (String groupKey : GroupableRelatableTO.class.cast(anyTO).getDynGroups()) { + conditions.add(searchConditionBuilder.is("key").equalTo(groupKey).wrap()); } - }).hideLabel().setOutputMarkupId(true)); - // --------------------------------- - // --------------------------------- - // Retrieve dyn group memberships - // --------------------------------- - final GroupFiqlSearchConditionBuilder searchConditionBuilder = SyncopeClient.getGroupSearchConditionBuilder(); + List<GroupTO> dynGroups = new ArrayList<>(); + if (!conditions.isEmpty()) { + dynGroups.addAll(groupRestClient.search( + "/", + searchConditionBuilder.or(conditions).query(), + -1, + -1, + new SortParam<>("name", true), + null)); + } - List<CompleteCondition> conditions = new ArrayList<>(); - for (String groupKey : GroupableRelatableTO.class.cast(anyTO).getDynGroups()) { - conditions.add(searchConditionBuilder.is("key").equalTo(groupKey).wrap()); - } + dyngroupsContainer.add(new AjaxPalettePanel.Builder<String>().setAllowOrder(true).build("dyngroups", + new ListModel<>(CollectionUtils.collect(dynGroups, new Transformer<GroupTO, String>() { - final List<GroupTO> dynGroups = new ArrayList<>(); - if (!conditions.isEmpty()) { - dynGroups.addAll(groupRestClient.search( - "/", - searchConditionBuilder.or(conditions).query(), - -1, - -1, - new SortParam<>("name", true), - null)); + @Override + public String transform(final GroupTO input) { + return input.getName(); + } + }, new ArrayList<String>())), + new ListModel<>(CollectionUtils.collect(allGroups, new Transformer<GroupTO, String>() { + + @Override + public String transform(final GroupTO input) { + return input.getName(); + } + }, new ArrayList<String>()))). + hideLabel().setEnabled(false).setOutputMarkupId(true)); + + // --------------------------------- } - add(new AjaxPalettePanel.Builder<String>().setAllowOrder(true).build("dyngroups", - new ListModel<>(CollectionUtils.collect(dynGroups, - new Transformer<GroupTO, String>() { - - @Override - public String transform(final GroupTO input) { - return input.getName(); - } - }, new ArrayList<String>())), - new ListModel<>(CollectionUtils.collect(allGroups, new Transformer<GroupTO, String>() { - - @Override - public String transform(final GroupTO input) { - return input.getName(); - } - }, new ArrayList<String>()))). + add(new AjaxPalettePanel.Builder<String>().build("dynrealms", + new PropertyModel<List<String>>(anyTO, "dynRealms"), + new ListModel<>( + CollectionUtils.collect(allDynRealms, + EntityTOUtils.keyTransformer(), + new ArrayList<String>()))). hideLabel().setEnabled(false).setOutputMarkupId(true)); - - // --------------------------------- } @Override public boolean evaluate() { - return CollectionUtils.isNotEmpty(allGroups) + return ((anyTO instanceof GroupTO) + ? CollectionUtils.isNotEmpty(allDynRealms) + : CollectionUtils.isNotEmpty(allDynRealms) || CollectionUtils.isNotEmpty(allGroups)) && SyncopeConsoleApplication.get().getSecuritySettings().getAuthorizationStrategy(). - isActionAuthorized(this, RENDER); + isActionAuthorized(this, RENDER); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java index 7841c8e..49f377b 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java @@ -27,12 +27,14 @@ import org.apache.commons.collections4.Transformer; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.client.console.panels.search.SearchClause; import org.apache.syncope.client.console.panels.search.UserSearchPanel; +import org.apache.syncope.client.console.rest.DynRealmRestClient; import org.apache.syncope.client.console.rest.RealmRestClient; import org.apache.syncope.client.console.rest.RoleRestClient; import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accordion; import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel; import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel; import org.apache.syncope.client.console.wizards.AjaxWizardBuilder; +import org.apache.syncope.common.lib.EntityTOUtils; import org.apache.syncope.common.lib.to.RealmTO; import org.apache.syncope.common.lib.to.RoleTO; import org.apache.wicket.PageReference; @@ -63,7 +65,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> { } /** - * This method has been overridden to manage asynchronous translation of FIQL string to search clases list and + * This method has been overridden to manage asynchronous translation of FIQL string to search classes list and * viceversa. * * @param item wizard backend item. @@ -93,6 +95,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> { wizardModel.add(new Details(modelObject)); wizardModel.add(new Entitlements(modelObject.getInnerObject())); wizardModel.add(new Realms(modelObject.getInnerObject())); + wizardModel.add(new DynRealms(modelObject.getInnerObject())); return wizardModel; } @@ -169,4 +172,19 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> { } } + public static class DynRealms extends WizardStep { + + private static final long serialVersionUID = 6846234574424462255L; + + public DynRealms(final RoleTO modelObject) { + setTitleModel(new ResourceModel("dynRealms")); + add(new AjaxPalettePanel.Builder<String>().build("dynRealms", + new PropertyModel<List<String>>(modelObject, "dynRealms"), + new ListModel<>( + CollectionUtils.collect(new DynRealmRestClient().list(), + EntityTOUtils.keyTransformer(), + new ArrayList<String>()))).hideLabel().setOutputMarkupId(true)); + } + } + } http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/console.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/console.properties b/client/console/src/main/resources/console.properties index a3c44f8..c9c0cdd 100644 --- a/client/console/src/main/resources/console.properties +++ b/client/console/src/main/resources/console.properties @@ -34,6 +34,7 @@ activitiModelerDirectory=${activiti-modeler.directory} reconciliationReportKey=c3520ad9-179f-49e7-b315-d684d216dd97 +page.administration=org.apache.syncope.client.console.pages.Administration page.dashboard=org.apache.syncope.client.console.pages.Dashboard page.realms=org.apache.syncope.client.console.pages.Realms page.topology=org.apache.syncope.client.console.topology.Topology @@ -43,7 +44,6 @@ page.audit=org.apache.syncope.client.console.pages.Audit page.logs=org.apache.syncope.client.console.pages.Logs page.securityquestions=org.apache.syncope.client.console.pages.SecurityQuestions page.types=org.apache.syncope.client.console.pages.Types -page.roles=org.apache.syncope.client.console.pages.Roles page.policies=org.apache.syncope.client.console.pages.Policies page.notifications=org.apache.syncope.client.console.pages.Notifications page.parameters=org.apache.syncope.client.console.pages.Parameters http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties index 77841d6..56df013 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties @@ -69,3 +69,4 @@ audit=Audit connectors.confirm.reload=This request is potentially dangerous for running operations, continue? intAttrNameInfo.help=Besides auto-completed attributes, you can also refer to groups, any objects or memberships (if applicable); for example: confirmGlobalLogout=Do you really want to perform global logout? +administration=Administration http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties index 8c2df2f..f039403 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties @@ -69,3 +69,4 @@ audit=Audit connectors.confirm.reload=Questa richiesta \u00e8 potenzialmente dannosa per le operazioni in corso, proseguire? intAttrNameInfo.help=Oltre agli attributi auto-completati, \u00e8 possibile fare riferimento anche a gruppi, any object e membership (se applicabile); ad esempio: confirmGlobalLogout=Vuoi davvero procedere al logout globale? +administration=Amministrazione http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties index 043df29..c746a66 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties @@ -69,3 +69,4 @@ audit=Audit connectors.confirm.reload=Esta requis\u00e7\u00e3o \u00e9 potencialmente perigosa para opera\u00e7\u00f5es em execu\u00e7\u00e3o, prosseguir? intAttrNameInfo.help=Besides auto-completed attributes, you can also refer to groups, any objects or memberships (if applicable); for example: confirmGlobalLogout=Do you really want to perform global logout? +administration=Administra\u00e7\u00e3o http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties index c661008..ef6ea6e 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties @@ -68,3 +68,4 @@ audit=\u0410\u0443\u0434\u0438\u0442 connectors.confirm.reload=\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? intAttrNameInfo.help=\u041f\u043e\u043c\u0438\u043c\u043e \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0447\u043b\u0435\u043d\u0441\u0442\u0432\u043e (\u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: confirmGlobalLogout=Do you really want to perform global logout? +administration=Administration http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html index 3a0676c..ab3df26 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html +++ b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html @@ -17,12 +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"> - <head><title></title></head> - <body> - <wicket:panel> - <div class="form-group"> - <span wicket:id="key"/> - </div> - </wicket:panel> - </body> + <wicket:panel> + <div class="form-group"> + <span wicket:id="key"/> + </div> + </wicket:panel> </html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html new file mode 100644 index 0000000..0c79945 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html @@ -0,0 +1,36 @@ +<!-- +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:extend> + <section class="content-header"> + <h1> </h1> + <ol class="breadcrumb"> + <li><a wicket:id="dashboardBr"><i class="fa fa-dashboard"></i> <wicket:message key="dashboard"/></a></li> + <li class="active"><wicket:message key="configuration"/></li> + <li class="active"><wicket:message key="administration"/></li> + </ol> + </section> + + <section class="content" wicket:id="content"> + <div class="box"> + <div class="box-body" wicket:id="tabbedPanel"/> + </div> + </section> + </wicket:extend> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties new file mode 100644 index 0000000..8788d48 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties @@ -0,0 +1,18 @@ +# 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. +add=Create new Role +dynRealms=Dynamic Realms http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties new file mode 100644 index 0000000..becfb71 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties @@ -0,0 +1,18 @@ +# 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. +add=Crea un nuovo Ruolo +dynRealms=Realm dinamici http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties new file mode 100644 index 0000000..e6d08f9 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties @@ -0,0 +1,18 @@ +# 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. +add=Cria um novo fun\u00e7\u00e3o +dynRealms=Realm din\u00e2micos http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties new file mode 100644 index 0000000..e933b31 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties @@ -0,0 +1,20 @@ +# 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. +# +# add=\u00d0\u00a1\u00d0\u00be\u00d0\u00b7\u00d0\u00b4\u00d0\u00b0\u00d1\u0082\u00d1\u008c \u00d1\u0080\u00d0\u00be\u00d0\u00bb\u00d1\u008c +add=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u043e\u043b\u044c +dynRealms=Dynamic Realms http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html index 7b2ccc6..ed0444a 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html +++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html @@ -108,12 +108,12 @@ under the License. <li wicket:id="configurationLI" class="treeview"> <a href="#"><i class="fa fa-edit"></i><span><wicket:message key="configuration"/></span> <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span></a> <ul wicket:id="configurationUL" class="treeview-menu"> + <li wicket:id="administrationLI"><a href="#" wicket:id="administration"><i class="fa fa-lock"></i><wicket:message key="administration"/></a></li> <li wicket:id="auditLI"><a href="#" wicket:id="audit"><i class="fa fa-check-square-o"></i><wicket:message key="audit"/></a></li> <li wicket:id="logsLI"><a href="#" wicket:id="logs"><i class="fa fa-file-text-o"></i><wicket:message key="logs"/></a></li> <li wicket:id="notificationsLI"><a href="#" wicket:id="notifications"><i class="fa fa-envelope-o"></i><wicket:message key="notifications"/></a></li> <li wicket:id="parametersLI"><a href="#" wicket:id="parameters"><i class="fa fa-cog"></i><wicket:message key="parameters"/></a></li> <li wicket:id="policiesLI"><a href="#" wicket:id="policies"><i class="fa fa-list"></i><wicket:message key="policies"/></a></li> - <li wicket:id="rolesLI"><a href="#" wicket:id="roles"><i class="fa fa-users"></i><wicket:message key="roles"/></a></li> <li wicket:id="securityquestionsLI"><a href="#" wicket:id="securityquestions"><i class="fa fa-question"></i><wicket:message key="securityQuestions"/></a></li> <li wicket:id="typesLI"><a href="#" wicket:id="types"><i class="fa fa-wrench"></i><wicket:message key="types"/></a></li> <li wicket:id="workflowLI"><a href="#" wicket:id="workflow"><i class="fa fa-share-alt"></i><wicket:message key="workflow"/></a></li>