[SYNCOPE-745] report reportlet management
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/2b0960de Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/2b0960de Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/2b0960de Branch: refs/heads/master Commit: 2b0960de57a0faa07fe470003f4f0901ad4a8ad4 Parents: c6ad727 Author: fmartelli <fabio.marte...@gmail.com> Authored: Tue May 3 20:48:55 2016 +0200 Committer: fmartelli <fabio.marte...@gmail.com> Committed: Tue May 3 20:48:55 2016 +0200 ---------------------------------------------------------------------- .../client/console/commons/Constants.java | 4 + .../panels/ParametersCreateWizardPanel.java | 4 - .../panels/search/SearchClausePanel.java | 2 +- .../console/panels/search/SearchUtils.java | 29 +- .../console/reports/ReportDirectoryPanel.java | 39 +- .../reports/ReportTemplateDirectoryPanel.java | 4 - .../reports/ReportletDirectoryPanel.java | 334 ++++++++++++++++ .../console/reports/ReportletWizardBuilder.java | 386 +++++++++++++++++++ .../client/console/rest/SchemaRestClient.java | 44 +++ .../markup/html/bootstrap/dialog/BaseModal.java | 7 +- .../wicket/markup/html/form/ActionLink.java | 1 + .../markup/html/form/ActionLinksPanel.java | 24 ++ .../markup/html/form/AjaxPalettePanel.java | 11 +- .../console/wizards/AjaxWizardBuilder.java | 4 + .../client/console/wizards/WizardMgtPanel.java | 54 ++- .../META-INF/resources/css/syncopeConsole.css | 10 +- .../reports/ReportDirectoryPanel.properties | 2 + .../reports/ReportDirectoryPanel_it.properties | 2 + .../ReportDirectoryPanel_pt_BR.properties | 2 + .../reports/ReportDirectoryPanel_ru.properties | 2 + .../reports/ReportWizardBuilder$Profile.html | 2 +- .../reports/ReportletDirectoryPanel.properties | 19 + .../ReportletDirectoryPanel_it.properties | 19 + .../ReportletDirectoryPanel_pt_BR.properties | 19 + .../ReportletDirectoryPanel_ru.properties | 19 + .../ReportletWizardBuilder$Configuration.html | 28 ++ ...ortletWizardBuilder$Configuration.properties | 24 ++ ...letWizardBuilder$Configuration_it.properties | 24 ++ ...WizardBuilder$Configuration_pt_BR.properties | 24 ++ ...letWizardBuilder$Configuration_ru.properties | 26 ++ .../reports/ReportletWizardBuilder$Profile.html | 24 ++ .../ReportletWizardBuilder$Profile.properties | 18 + ...ReportletWizardBuilder$Profile_it.properties | 18 + ...ortletWizardBuilder$Profile_pt_BR.properties | 18 + ...ReportletWizardBuilder$Profile_ru.properties | 20 + .../markup/html/form/ActionLinksPanel.html | 5 + .../markup/html/form/AjaxPalettePanel.html | 4 +- .../client/console/wizards/WizardMgtPanel.html | 3 + .../lib/report/AbstractAnyReportletConf.java | 43 --- .../common/lib/report/GroupReportletConf.java | 42 ++ .../lib/report/ReconciliationReportletConf.java | 3 + .../syncope/common/lib/report/Schema.java | 32 ++ .../common/lib/report/SearchCondition.java | 31 ++ .../common/lib/report/UserReportletConf.java | 42 ++ 44 files changed, 1394 insertions(+), 78 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/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 141b7e5..38dba85 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 @@ -110,6 +110,10 @@ public final class Constants { public static final String PREF_PROPAGATION_TASKS_PAGINATOR_ROWS = "proagationtasks.paginator.rows"; + public static final String PREF_REPORT_TASKS_PAGINATOR_ROWS = "report.paginator.rows"; + + public static final String PREF_REPORTLET_TASKS_PAGINATOR_ROWS = "reportlet.paginator.rows"; + public static final String PREF_TASK_EXECS_PAGINATOR_ROWS = "task.execs.paginator.rows"; public static final String PREF_NOTIFICATION_TASKS_PAGINATOR_ROWS = "notificationtasks.paginator.rows"; http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java index eace16b..b3a2c93 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java @@ -28,15 +28,11 @@ import org.apache.syncope.common.rest.api.service.ConfigurationService; import org.apache.syncope.common.rest.api.service.SchemaService; import org.apache.wicket.PageReference; import org.apache.wicket.extensions.wizard.WizardModel; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class ParametersCreateWizardPanel extends AjaxWizardBuilder<ParametersCreateWizardPanel.ParametersForm> { private static final long serialVersionUID = -2868592590785581481L; - private static final Logger LOG = LoggerFactory.getLogger(ParametersCreateWizardPanel.class); - public ParametersCreateWizardPanel(final ParametersForm defaultItem, final PageReference pageRef) { super(defaultItem, pageRef); http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/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 05c5157..3271647 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 @@ -690,7 +690,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> { @Override public Object getDisplayValue(final String object) { - return groupNames.getObject().get(Long.parseLong(object)); + return groupNames.getObject().get(object); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java index 83960e1..6857e20 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java @@ -117,7 +117,16 @@ public final class SearchUtils implements Serializable { LOG.info("Condition: " + sc.getCondition()); - if (SpecialAttr.GROUPS.toString().equals(property)) { + if (SpecialAttr.ROLES.toString().equals(property)) { + res.setType(SearchClause.Type.ROLE_MEMBERSHIP); + res.setProperty(value); + } else if (SpecialAttr.RELATIONSHIPS.toString().equals(property)) { + res.setType(SearchClause.Type.RELATIONSHIP); + res.setProperty(value); + } else if (SpecialAttr.RELATIONSHIP_TYPES.toString().equals(property)) { + res.setType(SearchClause.Type.RELATIONSHIP); + res.setProperty(value); + } else if (SpecialAttr.GROUPS.toString().equals(property)) { res.setType(SearchClause.Type.GROUP_MEMBERSHIP); res.setProperty(value); } else if (SpecialAttr.RESOURCES.toString().equals(property)) { @@ -129,13 +138,23 @@ public final class SearchUtils implements Serializable { switch (sc.getConditionType()) { case EQUALS: - res.setComparator(SpecialAttr.NULL.toString().equals(value) - ? SearchClause.Comparator.IS_NULL : SearchClause.Comparator.EQUALS); + if (SpecialAttr.RELATIONSHIP_TYPES.toString().equals(property)) { + res.setComparator(SpecialAttr.NULL.toString().equals(value) + ? SearchClause.Comparator.EQUALS : SearchClause.Comparator.IS_NULL); + } else { + res.setComparator(SpecialAttr.NULL.toString().equals(value) + ? SearchClause.Comparator.IS_NULL : SearchClause.Comparator.EQUALS); + } break; case NOT_EQUALS: - res.setComparator(SpecialAttr.NULL.toString().equals(value) - ? SearchClause.Comparator.IS_NOT_NULL : SearchClause.Comparator.NOT_EQUALS); + if (SpecialAttr.RELATIONSHIP_TYPES.toString().equals(property)) { + res.setComparator(SpecialAttr.NULL.toString().equals(value) + ? SearchClause.Comparator.NOT_EQUALS : SearchClause.Comparator.IS_NOT_NULL); + } else { + res.setComparator(SpecialAttr.NULL.toString().equals(value) + ? SearchClause.Comparator.IS_NOT_NULL : SearchClause.Comparator.NOT_EQUALS); + } break; case GREATER_OR_EQUALS: http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java index 1f56083..cb5336b 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java @@ -18,6 +18,7 @@ */ package org.apache.syncope.client.console.reports; +import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -36,6 +37,7 @@ import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater. import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.BooleanPropertyColumn; import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn; import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn; +import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal; import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink; import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType; import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel; @@ -52,6 +54,7 @@ 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.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; @@ -63,6 +66,8 @@ public abstract class ReportDirectoryPanel private static final long serialVersionUID = 4984337552918213290L; + private final BaseModal<ReportTO> reportletModal = new BaseModal<ReportTO>("outer"); + private final ReportStartAtTogglePanel startAt; protected ReportDirectoryPanel(final MultilevelPanel multiLevelPanelRef, final PageReference pageRef) { @@ -72,6 +77,7 @@ public abstract class ReportDirectoryPanel this.addNewItemPanelBuilder(new ReportWizardBuilder(new ReportTO(), pageRef), true); MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.REPORT_CREATE); + modal.size(Modal.Size.Large); initResultTable(); startAt = new ReportStartAtTogglePanel(container); @@ -113,15 +119,31 @@ public abstract class ReportDirectoryPanel @Override public ActionLinksPanel<ReportTO> getActions(final String componentId, final IModel<ReportTO> model) { - final ReportTO reportTO = model.getObject(); - final ActionLinksPanel<ReportTO> panel = ActionLinksPanel.<ReportTO>builder(). add(new ActionLink<ReportTO>() { private static final long serialVersionUID = -3722207913631435501L; @Override - public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) { + public void onClick(final AjaxRequestTarget target, final ReportTO ignore) { + target.add(modal.setContent(new ReportletDirectoryPanel( + modal, model.getObject().getKey(), pageRef))); + + modal.header(new StringResourceModel( + "reportlet.conf", ReportDirectoryPanel.this, Model.of(model.getObject()))); + + MetaDataRoleAuthorizationStrategy.authorize( + modal.getForm(), ENABLE, StandardEntitlement.RESOURCE_UPDATE); + + modal.show(true); + } + }, ActionLink.ActionType.COMPOSE, StandardEntitlement.REPORT_UPDATE). + add(new ActionLink<ReportTO>() { + + private static final long serialVersionUID = -3722207913631435501L; + + @Override + public void onClick(final AjaxRequestTarget target, final ReportTO ignore) { final ReportTO clone = SerializationUtils.clone(model.getObject()); clone.setKey(null); send(ReportDirectoryPanel.this, Broadcast.EXACT, @@ -133,7 +155,7 @@ public abstract class ReportDirectoryPanel private static final long serialVersionUID = -3722207913631435501L; @Override - public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) { + public void onClick(final AjaxRequestTarget target, final ReportTO ignore) { send(ReportDirectoryPanel.this, Broadcast.EXACT, new AjaxWizard.EditItemActionEvent<>( restClient.read(model.getObject().getKey()), target)); @@ -144,8 +166,8 @@ public abstract class ReportDirectoryPanel private static final long serialVersionUID = -3722207913631435501L; @Override - public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) { - viewTask(reportTO, target); + public void onClick(final AjaxRequestTarget target, final ReportTO ignore) { + viewTask(model.getObject(), target); } }, ActionLink.ActionType.VIEW, StandardEntitlement.REPORT_READ). add(new ActionLink<ReportTO>() { @@ -164,7 +186,8 @@ public abstract class ReportDirectoryPanel private static final long serialVersionUID = -3722207913631435501L; @Override - public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) { + public void onClick(final AjaxRequestTarget target, final ReportTO ignore) { + final ReportTO reportTO = model.getObject(); try { restClient.delete(reportTO.getKey()); info(getString(Constants.OPERATION_SUCCEEDED)); @@ -217,7 +240,7 @@ public abstract class ReportDirectoryPanel @Override protected String paginatorRowsKey() { - return Constants.PREF_PROPAGATION_TASKS_PAGINATOR_ROWS; + return Constants.PREF_REPORT_TASKS_PAGINATOR_ROWS; } protected abstract void viewTask(final ReportTO reportTO, final AjaxRequestTarget target); http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java index 31e84f1..f2ddf6b 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java @@ -68,10 +68,6 @@ public class ReportTemplateDirectoryPanel super(id, pageReference, true); disableCheckBoxes(); - modal.size(Modal.Size.Small); - modal.addSubmitButton(); - setFooterVisibility(true); - addOuterObject(utilityModal); setWindowClosedReloadCallback(utilityModal); utilityModal.size(Modal.Size.Large); http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java new file mode 100644 index 0000000..15f754a --- /dev/null +++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java @@ -0,0 +1,334 @@ +/* + * 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.reports; + +import static org.apache.wicket.Component.ENABLE; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.lang3.SerializationUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.syncope.client.console.SyncopeConsoleSession; +import org.apache.syncope.client.console.commons.Constants; +import org.apache.syncope.client.console.commons.DirectoryDataProvider; +import org.apache.syncope.client.console.commons.SortableDataProviderComparator; +import org.apache.syncope.client.console.panels.DirectoryPanel; +import org.apache.syncope.client.console.panels.ModalPanel; +import org.apache.syncope.client.console.panels.search.SearchClause; +import org.apache.syncope.client.console.reports.ReportletDirectoryPanel.ReportletWrapper; +import org.apache.syncope.client.console.rest.ReportRestClient; +import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn; +import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal; +import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink; +import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType; +import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel; +import org.apache.syncope.client.console.wizards.AjaxWizard; +import org.apache.syncope.common.lib.types.StandardEntitlement; +import org.apache.syncope.common.lib.SyncopeClientException; +import org.apache.syncope.common.lib.report.AbstractReportletConf; +import org.apache.syncope.common.lib.report.ReportletConf; +import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder; +import org.apache.syncope.common.lib.to.ReportTO; +import org.apache.wicket.PageReference; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy; +import org.apache.wicket.event.Broadcast; +import org.apache.wicket.event.IEvent; +import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; +import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder; +import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; +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.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.CompoundPropertyModel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.ResourceModel; +import org.apache.wicket.model.StringResourceModel; + +/** + * Reportlets page. + */ +public class ReportletDirectoryPanel extends DirectoryPanel< + ReportletWrapper, ReportletWrapper, DirectoryDataProvider<ReportletWrapper>, ReportRestClient> + implements ModalPanel { + + private static final long serialVersionUID = 4984337552918213290L; + + private final BaseModal<ReportTO> baseModal; + + private final String report; + + protected ReportletDirectoryPanel( + final BaseModal<ReportTO> baseModal, final String report, final PageReference pageRef) { + super(BaseModal.CONTENT_ID, pageRef, false); + this.baseModal = baseModal; + this.report = report; + this.restClient = new ReportRestClient(); + + enableExitButton(); + + this.addNewItemPanelBuilder(new ReportletWizardBuilder( + report, new ReportletWrapper(), pageRef).setEventSink(ReportletDirectoryPanel.this), true); + + MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.REPORT_UPDATE); + restClient = new ReportRestClient(); + initResultTable(); + } + + @Override + protected List<IColumn<ReportletWrapper, String>> getColumns() { + final List<IColumn<ReportletWrapper, String>> columns = new ArrayList<>(); + + columns.add(new PropertyColumn<ReportletWrapper, String>( + new StringResourceModel("reportlet", this, null), "name", "name")); + + columns.add(new AbstractColumn<ReportletWrapper, String>( + new StringResourceModel("configuration", this, null)) { + + private static final long serialVersionUID = -4008579357070833846L; + + @Override + public void populateItem( + final Item<ICellPopulator<ReportletWrapper>> cellItem, + final String componentId, + final IModel<ReportletWrapper> rowModel) { + cellItem.add(new Label(componentId, rowModel.getObject().getConf().getClass().getName())); + } + }); + + columns.add(new ActionColumn<ReportletWrapper, String>(new ResourceModel("actions")) { + + private static final long serialVersionUID = 2054811145491901166L; + + @Override + public ActionLinksPanel<ReportletWrapper> getActions(final String componentId, + final IModel<ReportletWrapper> model) { + + final ActionLinksPanel<ReportletWrapper> panel = ActionLinksPanel.<ReportletWrapper>builder(). + add(new ActionLink<ReportletWrapper>() { + + private static final long serialVersionUID = -3722207913631435501L; + + @Override + public void onClick(final AjaxRequestTarget target, final ReportletWrapper ignore) { + AbstractReportletConf clone = SerializationUtils.clone(model.getObject().getConf()); + clone.setName(null); + + send(ReportletDirectoryPanel.this, Broadcast.EXACT, + new AjaxWizard.EditItemActionEvent<>( + new ReportletWrapper().setConf(clone), + target)); + } + }, ActionLink.ActionType.CLONE, StandardEntitlement.REPORT_UPDATE). + add(new ActionLink<ReportletWrapper>() { + + private static final long serialVersionUID = -3722207913631435501L; + + @Override + public void onClick(final AjaxRequestTarget target, final ReportletWrapper ignore) { + send(ReportletDirectoryPanel.this, Broadcast.EXACT, + new AjaxWizard.EditItemActionEvent<>(model.getObject(), target)); + } + }, ActionLink.ActionType.EDIT, StandardEntitlement.REPORT_UPDATE). + add(new ActionLink<ReportletWrapper>() { + + private static final long serialVersionUID = -3722207913631435501L; + + @Override + public void onClick(final AjaxRequestTarget target, final ReportletWrapper ignore) { + final ReportletConf reportlet = model.getObject().getConf(); + try { + final ReportTO actual = restClient.read(report); + CollectionUtils.filter(actual.getReportletConfs(), new Predicate<ReportletConf>() { + + @Override + public boolean evaluate(final ReportletConf object) { + return !object.getName().equals(reportlet.getName()); + } + }); + restClient.update(actual); + info(getString(Constants.OPERATION_SUCCEEDED)); + customActionOnCloseCallback(target); + } catch (SyncopeClientException e) { + LOG.error("While deleting {}", reportlet.getName(), e); + error(StringUtils.isBlank(e.getMessage()) + ? e.getClass().getName() : e.getMessage()); + } + SyncopeConsoleSession.get().getNotificationPanel().refresh(target); + } + }, ActionLink.ActionType.DELETE, StandardEntitlement.REPORT_UPDATE).build(componentId); + + return panel; + } + + @Override + public ActionLinksPanel<ReportletWrapper> getHeader(final String componentId) { + final ActionLinksPanel.Builder<ReportletWrapper> panel = ActionLinksPanel.builder(); + + return panel.add(new ActionLink<ReportletWrapper>() { + + private static final long serialVersionUID = -7978723352517770644L; + + @Override + public void onClick(final AjaxRequestTarget target, final ReportletWrapper ignore) { + if (target != null) { + customActionOnCloseCallback(target); + } + } + }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).build(componentId); + } + }); + + return columns; + } + + @Override + protected Collection<ActionType> getBulkActions() { + final List<ActionType> bulkActions = new ArrayList<>(); + bulkActions.add(ActionType.DELETE); + return bulkActions; + } + + @Override + protected ReportDataProvider dataProvider() { + return new ReportDataProvider(rows); + } + + @Override + protected String paginatorRowsKey() { + return Constants.PREF_REPORTLET_TASKS_PAGINATOR_ROWS; + } + + protected class ReportDataProvider extends DirectoryDataProvider<ReportletWrapper> { + + private static final long serialVersionUID = 4725679400450513556L; + + private final SortableDataProviderComparator<ReportletWrapper> comparator; + + public ReportDataProvider(final int paginatorRows) { + super(paginatorRows); + + //Default sorting + setSort("name", SortOrder.DESCENDING); + comparator = new SortableDataProviderComparator<>(this); + } + + @Override + public Iterator<ReportletWrapper> iterator(final long first, final long count) { + final ReportTO actual = restClient.read(report); + + final ArrayList<ReportletWrapper> reportlets = CollectionUtils.collect( + actual.getReportletConfs(), + new Transformer<AbstractReportletConf, ReportletWrapper>() { + + @Override + public ReportletWrapper transform(final AbstractReportletConf input) { + return new ReportletWrapper(input.getName()).setName(input.getName()).setConf(input); + } + }, new ArrayList<ReportletWrapper>()); + + Collections.sort(reportlets, comparator); + return reportlets.subList((int) first, (int) (first + count)).iterator(); + } + + @Override + public long size() { + final ReportTO actual = restClient.read(report); + return actual.getReportletConfs().size(); + } + + @Override + public IModel<ReportletWrapper> model(final ReportletWrapper object) { + return new CompoundPropertyModel<>(object); + } + } + + public static class ReportletWrapper implements Serializable { + + private static final long serialVersionUID = 2472755929742424558L; + + private String oldname; + + private String name; + + private AbstractReportletConf conf; + + private final Map<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> scondWrapper; + + public ReportletWrapper() { + this(null); + } + + public ReportletWrapper(final String name) { + this.oldname = name; + this.scondWrapper = new HashMap<>(); + } + + public boolean isNew() { + return oldname == null; + } + + public String getOldName() { + return this.oldname; + } + + public String getName() { + return this.name; + } + + public ReportletWrapper setName(final String name) { + this.name = name; + return this; + } + + public AbstractReportletConf getConf() { + return conf; + } + + public ReportletWrapper setConf(final AbstractReportletConf conf) { + this.conf = conf; + return this; + } + + public Map<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> getSCondWrapper() { + return scondWrapper; + } + } + + @Override + public void onEvent(final IEvent<?> event) { + super.onEvent(event); + if (event.getPayload() instanceof ExitEvent && modal != null) { + final AjaxRequestTarget target = ExitEvent.class.cast(event.getPayload()).getTarget(); + baseModal.show(false); + baseModal.close(target); + } + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java new file mode 100644 index 0000000..cf94ddf --- /dev/null +++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java @@ -0,0 +1,386 @@ +/* + * 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.reports; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.syncope.client.console.SyncopeConsoleSession; +import org.apache.syncope.client.console.panels.search.AnyObjectSearchPanel; +import org.apache.syncope.client.console.panels.search.GroupSearchPanel; +import org.apache.syncope.client.console.panels.search.SearchClause; +import org.apache.syncope.client.console.panels.search.SearchUtils; +import org.apache.syncope.client.console.panels.search.UserSearchPanel; +import org.apache.syncope.client.console.rest.ReportRestClient; +import org.apache.syncope.client.console.rest.SchemaRestClient; +import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel; +import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel; +import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel; +import org.apache.syncope.client.console.wicket.markup.html.form.AjaxSpinnerFieldPanel; +import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel; +import org.apache.syncope.client.console.wicket.markup.html.form.DateTimeFieldPanel; +import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel; +import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel; +import org.apache.syncope.client.console.wizards.AjaxWizardBuilder; +import org.apache.syncope.client.lib.SyncopeClient; +import org.apache.syncope.common.lib.SyncopeConstants; +import org.apache.syncope.common.lib.report.AbstractReportletConf; +import org.apache.syncope.common.lib.report.Schema; +import org.apache.syncope.common.lib.to.AbstractSchemaTO; +import org.apache.syncope.common.lib.to.ReportTO; +import org.apache.syncope.common.lib.types.AnyTypeKind; +import org.apache.syncope.common.lib.types.SchemaType; +import org.apache.wicket.PageReference; +import org.apache.wicket.extensions.wizard.WizardModel; +import org.apache.wicket.extensions.wizard.WizardStep; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.list.ListView; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.LoadableDetachableModel; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.model.ResourceModel; +import org.apache.wicket.model.util.ListModel; +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.PropertyAccessorFactory; +import org.springframework.util.ClassUtils; +import org.apache.syncope.common.lib.report.SearchCondition; +import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder; +import org.apache.wicket.event.IEventSink; + +public class ReportletWizardBuilder extends AjaxWizardBuilder<ReportletDirectoryPanel.ReportletWrapper> { + + private static final long serialVersionUID = 5945391813567245081L; + + private final ReportRestClient restClient = new ReportRestClient(); + + private final String report; + + public ReportletWizardBuilder( + final String report, + final ReportletDirectoryPanel.ReportletWrapper reportlet, + final PageReference pageRef) { + super(reportlet, pageRef); + this.report = report; + } + + public ReportletWizardBuilder setEventSink(final IEventSink eventSink) { + this.eventSink = eventSink; + return this; + } + + @Override + protected Serializable onApplyInternal(final ReportletDirectoryPanel.ReportletWrapper modelObject) { + modelObject.getConf().setName(modelObject.getName()); + + final ReportTO reportTO = restClient.read(report); + + if (modelObject.isNew()) { + reportTO.getReportletConfs().add(modelObject.getConf()); + } else { + CollectionUtils.filter( + reportTO.getReportletConfs(), new Predicate<AbstractReportletConf>() { + + @Override + public boolean evaluate(final AbstractReportletConf object) { + return !object.getName().equals(modelObject.getOldName()); + } + }); + reportTO.getReportletConfs().add(modelObject.getConf()); + } + + BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(modelObject.getConf()); + for (Map.Entry<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> entry + : modelObject.getSCondWrapper().entrySet()) { + wrapper.setPropertyValue(entry.getKey(), + SearchUtils.buildFIQL(entry.getValue().getRight(), entry.getValue().getLeft())); + } + + restClient.update(reportTO); + return modelObject; + } + + @Override + protected WizardModel buildModelSteps( + final ReportletDirectoryPanel.ReportletWrapper modelObject, final WizardModel wizardModel) { + wizardModel.add(new Profile(modelObject)); + wizardModel.add(new Configuration(modelObject)); + return wizardModel; + } + + public class Profile extends WizardStep { + + private static final long serialVersionUID = -3043839139187792810L; + + public Profile(final ReportletDirectoryPanel.ReportletWrapper reportlet) { + + final AjaxTextFieldPanel name = new AjaxTextFieldPanel( + "name", "reportlet", new PropertyModel<String>(reportlet, "name"), false); + name.addRequiredLabel(); + name.setEnabled(true); + add(name); + + final AjaxDropDownChoicePanel<String> conf = new AjaxDropDownChoicePanel<>( + "configuration", getString("configuration"), new PropertyModel<String>(reportlet, "conf") { + + private static final long serialVersionUID = -6427731218492117883L; + + @Override + public String getObject() { + return reportlet.getConf() == null ? null : reportlet.getConf().getClass().getName(); + } + + @Override + public void setObject(final String object) { + AbstractReportletConf conf = null; + + try { + conf = AbstractReportletConf.class.cast(Class.forName(object).newInstance()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { + LOG.warn("Error retrieving reportlet configuration instance", e); + } + + reportlet.setConf(conf); + } + }); + + conf.setChoices(new ArrayList<>(SyncopeConsoleSession.get().getPlatformInfo().getReportletConfs())); + + conf.addRequiredLabel(); + add(conf); + } + } + + public class Configuration extends WizardStep { + + private static final long serialVersionUID = -785981096328637758L; + + private final String[] excluded = new String[] { "serialVersionUID", "class", "name", "reportletClassName" }; + + private final ReportletDirectoryPanel.ReportletWrapper reportlet; + + public Configuration(final ReportletDirectoryPanel.ReportletWrapper reportlet) { + this.reportlet = reportlet; + + LoadableDetachableModel<List<String>> propViewModel = new LoadableDetachableModel<List<String>>() { + + private static final long serialVersionUID = 5275935387613157437L; + + @Override + protected List<String> load() { + List<String> result = new ArrayList<String>(); + if (Configuration.this.reportlet.getConf() != null) { + for (Field field : Configuration.this.reportlet.getConf().getClass().getDeclaredFields()) { + if (!ArrayUtils.contains(excluded, field.getName())) { + result.add(field.getName()); + } + } + } + + return result; + } + }; + + add(new ListView<String>("propView", propViewModel) { + + private static final long serialVersionUID = 9101744072914090143L; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + protected void populateItem(final ListItem<String> item) { + final String fieldName = item.getModelObject(); + + item.add(new Label("fieldName", new ResourceModel(fieldName, fieldName))); + + Field field = null; + try { + field = reportlet.getConf().getClass().getDeclaredField(fieldName); + } catch (NoSuchFieldException | SecurityException e) { + LOG.error("Could not find field {} in class {}", fieldName, reportlet.getConf().getClass(), e); + } + + if (field == null) { + return; + } + + final SearchCondition scondAnnot = field.getAnnotation(SearchCondition.class); + final Schema schemaAnnot = field.getAnnotation(Schema.class); + + BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(reportlet.getConf()); + + Panel panel; + + if (scondAnnot != null) { + final String fiql = (String) wrapper.getPropertyValue(fieldName); + + final List<SearchClause> clauses; + if (StringUtils.isEmpty(fiql)) { + clauses = new ArrayList<>(); + } else { + clauses = SearchUtils.getSearchClauses(fiql); + } + + final AbstractFiqlSearchConditionBuilder builder; + + switch (scondAnnot.type()) { + case "USER": + panel = new UserSearchPanel.Builder( + new ListModel<SearchClause>(clauses)).required(false).build("value"); + builder = SyncopeClient.getUserSearchConditionBuilder(); + break; + case "GROUP": + panel = new GroupSearchPanel.Builder( + new ListModel<SearchClause>(clauses)).required(false).build("value"); + builder = SyncopeClient.getGroupSearchConditionBuilder(); + break; + default: + panel = new AnyObjectSearchPanel.Builder( + scondAnnot.type(), + new ListModel<SearchClause>(clauses)).required(false).build("value"); + builder = SyncopeClient.getAnyObjectSearchConditionBuilder(null); + } + + reportlet.getSCondWrapper().put(fieldName, Pair.of(builder, clauses)); + } else if (List.class.equals(field.getType())) { + Class<?> listItemType = String.class; + if (field.getGenericType() instanceof ParameterizedType) { + listItemType = (Class<?>) ((ParameterizedType) field.getGenericType()). + getActualTypeArguments()[0]; + } + + if (listItemType.equals(String.class) && schemaAnnot != null) { + SchemaRestClient schemaRestClient = new SchemaRestClient(); + + List<AbstractSchemaTO> choices; + switch (schemaAnnot.schema()) { + case UserPlainSchema: + choices = schemaRestClient.getSchemas(SchemaType.PLAIN, AnyTypeKind.USER); + break; + + case UserDerivedSchema: + choices = schemaRestClient.getSchemas(SchemaType.DERIVED, AnyTypeKind.USER); + break; + + case UserVirtualSchema: + choices = schemaRestClient.getSchemas(SchemaType.VIRTUAL, AnyTypeKind.USER); + break; + + case GroupPlainSchema: + choices = schemaRestClient.getSchemas(SchemaType.PLAIN, AnyTypeKind.GROUP); + break; + + case GroupDerivedSchema: + choices = schemaRestClient.getSchemas(SchemaType.DERIVED, AnyTypeKind.GROUP); + break; + + case GroupVirtualSchema: + choices = schemaRestClient.getSchemas(SchemaType.VIRTUAL, AnyTypeKind.GROUP); + break; + + case AnyObjectPlainSchema: + choices = schemaRestClient.getSchemas(SchemaType.PLAIN, AnyTypeKind.ANY_OBJECT); + break; + + case AnyObjectDerivedSchema: + choices = schemaRestClient.getSchemas(SchemaType.DERIVED, AnyTypeKind.ANY_OBJECT); + break; + + case AnyObjectVirtualSchema: + choices = schemaRestClient.getSchemas(SchemaType.VIRTUAL, AnyTypeKind.ANY_OBJECT); + break; + + default: + choices = Collections.emptyList(); + } + + panel = new AjaxPalettePanel.Builder<String>().setName(fieldName).build( + "value", + new PropertyModel<List<String>>(reportlet.getConf(), fieldName), + new ListModel<String>( + CollectionUtils.collect( + choices, new Transformer<AbstractSchemaTO, String>() { + + @Override + public String transform(final AbstractSchemaTO input) { + return input.getKey(); + } + }, new ArrayList<String>()))).hideLabel(); + } else if (listItemType.isEnum()) { + panel = new AjaxPalettePanel.Builder<String>().setName(fieldName).build( + "value", + new PropertyModel<List<String>>(reportlet.getConf(), fieldName), + new ListModel(Arrays.asList(listItemType.getEnumConstants()))).hideLabel(); + } else { + if (((List) wrapper.getPropertyValue(fieldName)).isEmpty()) { + ((List) wrapper.getPropertyValue(fieldName)).add(null); + } + + panel = new MultiFieldPanel.Builder<String>( + new PropertyModel<List<String>>(reportlet.getConf(), fieldName)).build( + "value", + fieldName, + buildSinglePanel(field.getType(), fieldName, "panel")).hideLabel(); + } + } else { + panel = buildSinglePanel(field.getType(), fieldName, "value").hideLabel(); + } + + item.add(panel.setRenderBodyOnly(true)); + } + }); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private FieldPanel buildSinglePanel(final Class<?> type, final String fieldName, final String id) { + FieldPanel result = null; + PropertyModel model = new PropertyModel(reportlet.getConf(), fieldName); + if (ClassUtils.isAssignable(Boolean.class, type)) { + result = new AjaxCheckBoxPanel(id, fieldName, model); + } else if (ClassUtils.isAssignable(Number.class, type)) { + result = new AjaxSpinnerFieldPanel.Builder<Number>().build( + id, fieldName, (Class<Number>) ClassUtils.resolvePrimitiveIfNecessary(type), model); + } else if (Date.class.equals(type)) { + result = new DateTimeFieldPanel(id, fieldName, model, SyncopeConstants.DEFAULT_DATE_PATTERN); + } else if (type.isEnum()) { + result = new AjaxDropDownChoicePanel(id, fieldName, model).setChoices( + Arrays.asList(type.getEnumConstants())); + } + + // treat as String if nothing matched above + if (result == null) { + result = new AjaxTextFieldPanel(id, fieldName, model); + } + + result.hideLabel(); + return result; + } + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java index b7b1b45..570c969 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java @@ -18,17 +18,22 @@ */ package org.apache.syncope.client.console.rest; +import static org.apache.syncope.client.console.rest.BaseRestClient.getService; + import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.CollectionUtils; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.EntityTOUtils; import org.apache.syncope.common.lib.to.AbstractSchemaTO; +import org.apache.syncope.common.lib.to.AnyTypeTO; import org.apache.syncope.common.lib.to.DerSchemaTO; import org.apache.syncope.common.lib.to.PlainSchemaTO; import org.apache.syncope.common.lib.to.VirSchemaTO; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.SchemaType; import org.apache.syncope.common.rest.api.beans.SchemaQuery; +import org.apache.syncope.common.rest.api.service.AnyTypeService; import org.apache.syncope.common.rest.api.service.SchemaService; /** @@ -38,6 +43,45 @@ public class SchemaRestClient extends BaseRestClient { private static final long serialVersionUID = -2479730152700312373L; + public <T extends AbstractSchemaTO> List<T> getSchemas(final SchemaType schemaType, final AnyTypeKind kind) { + final AnyTypeService client = getService(AnyTypeService.class); + + final List<String> classes = new ArrayList<>(); + + switch (kind) { + case USER: + case GROUP: + final AnyTypeTO type = client.read(kind.name()); + if (type != null) { + classes.addAll(type.getClasses()); + } + break; + default: + for (AnyTypeTO anyTypeTO : getService(AnyTypeService.class).list()) { + if (anyTypeTO.getKind() != AnyTypeKind.USER && anyTypeTO.getKind() != AnyTypeKind.GROUP) { + classes.addAll(anyTypeTO.getClasses()); + } + } + } + return getSchemas(schemaType, classes.toArray(new String[] {})); + } + + public <T extends AbstractSchemaTO> List<T> getSchemas(final SchemaType schemaType, final String typeName) { + AnyTypeTO type = null; + + try { + type = getService(AnyTypeService.class).read(typeName); + } catch (SyncopeClientException e) { + LOG.error("While reading all any types", e); + } + + if (type == null) { + return getSchemas(schemaType); + } else { + return getSchemas(schemaType, type.getClasses().toArray(new String[] {})); + } + } + public <T extends AbstractSchemaTO> List<T> getSchemas(final SchemaType schemaType, final String... kind) { List<T> schemas = new ArrayList<>(); http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java index bc62538..b28998f 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java @@ -144,8 +144,13 @@ public class BaseModal<T extends Serializable> extends Modal<T> { return this; } - public BaseModal<T> changeCloseButtonLabel(final String label, final AjaxRequestTarget target) { + public BaseModal<T> changeCloseButtonLabel(final String label) { defaultModalCloseButton.getModel().setObject(label); + return this; + } + + public BaseModal<T> changeCloseButtonLabel(final String label, final AjaxRequestTarget target) { + changeCloseButtonLabel(label); target.add(defaultModalCloseButton); return this; } http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java index 0d9c074..a79e4a7 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java @@ -50,6 +50,7 @@ public abstract class ActionLink<T extends Serializable> implements Serializable FO_EDIT("read"), HTML_EDIT("read"), TEXT_EDIT("read"), + COMPOSE("update"), LAYOUT_EDIT("read"), RESET("update"), ENABLE("update"), http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java index 69bb761..85bfb20 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java @@ -65,6 +65,7 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel { super.add(new Fragment("panelFoEdit", "emptyFragment", this)); super.add(new Fragment("panelHtmlEdit", "emptyFragment", this)); super.add(new Fragment("panelTextEdit", "emptyFragment", this)); + super.add(new Fragment("panelCompose", "emptyFragment", this)); super.add(new Fragment("panelLayoutEdit", "emptyFragment", this)); super.add(new Fragment("panelReset", "emptyFragment", this)); super.add(new Fragment("panelEnable", "emptyFragment", this)); @@ -388,6 +389,25 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel { }.setVisible(link.isEnabled(model.getObject()))); break; + case COMPOSE: + fragment = new Fragment("panelCompose", "fragmentCompose", this); + + fragment.addOrReplace(new IndicatingAjaxLink<Void>("composeLink") { + + private static final long serialVersionUID = -1876519166660008562L; + + @Override + public void onClick(final AjaxRequestTarget target) { + link.onClick(target, model.getObject()); + } + + @Override + public String getAjaxIndicatorMarkupId() { + return disableIndicator ? StringUtils.EMPTY : super.getAjaxIndicatorMarkupId(); + } + }.setVisible(link.isEnabled(model.getObject()))); + break; + case LAYOUT_EDIT: fragment = new Fragment("panelLayoutEdit", "fragmentLayoutEdit", this); @@ -904,6 +924,10 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel { super.addOrReplace(new Fragment("panelCreate", "emptyFragment", this)); break; + case COMPOSE: + super.addOrReplace(new Fragment("panelCompose", "emptyFragment", this)); + break; + case EDIT: super.addOrReplace(new Fragment("panelEdit", "emptyFragment", this)); break; http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java index b0b5e94..bf16686 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java @@ -58,7 +58,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel public AjaxPalettePanel( final String id, final IModel<List<T>> model, final Builder.Query<T> choices, final Builder<T> builder) { - super(id, id, model); + super(id, builder.name == null ? id : builder.name, model); choicesModel = new PaletteLoadableDetachableModel(builder) { @@ -74,7 +74,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel public AjaxPalettePanel( final String id, final IModel<List<T>> model, final ListModel<T> choices, final Builder<T> builder) { - super(id, id, model); + super(id, builder.name == null ? id : builder.name, model); choicesModel = new PaletteLoadableDetachableModel(builder) { @@ -218,6 +218,8 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel private String filter = conf.getDefaultFilter(); + private String name; + public Builder() { this.allowMoveAll = false; this.allowOrder = false; @@ -225,6 +227,11 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel this.renderer = new SelectChoiceRenderer<>(); } + public Builder<T> setName(final String name) { + this.name = name; + return this; + } + public Builder<T> setAllowOrder(final boolean allowOrder) { this.allowOrder = allowOrder; return this; http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java index 9d6d76a..65dc06a 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java @@ -24,11 +24,15 @@ import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.event.Broadcast; import org.apache.wicket.event.IEventSink; import org.apache.wicket.extensions.wizard.WizardModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public abstract class AjaxWizardBuilder<T extends Serializable> extends AbstractModalPanelBuilder<T> { private static final long serialVersionUID = 5241745929825564456L; + protected static final Logger LOG = LoggerFactory.getLogger(AjaxWizardBuilder.class); + protected AjaxWizard.Mode mode = AjaxWizard.Mode.CREATE; protected IEventSink eventSink = null; http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/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 74ad18d..430ed35 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 @@ -67,6 +67,8 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple protected final AjaxLink<?> addAjaxLink; + protected final AjaxLink<?> exitAjaxLink; + protected ModalPanelBuilder<T> newItemPanelBuilder; protected NotificationPanel notificationPanel; @@ -123,6 +125,20 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple addAjaxLink.setVisible(false); initialFragment.addOrReplace(addAjaxLink); + exitAjaxLink = new AjaxLink<T>("exit") { + + private static final long serialVersionUID = -7978723352517770644L; + + @Override + public void onClick(final AjaxRequestTarget target) { + send(WizardMgtPanel.this, Broadcast.EXACT, new ExitEvent(target)); + } + }; + + exitAjaxLink.setEnabled(false); + exitAjaxLink.setVisible(false); + initialFragment.addOrReplace(exitAjaxLink); + add(new ListView<Component>("outerObjectsRepeater", outerObjects) { private static final long serialVersionUID = -9180479401817023838L; @@ -138,7 +154,11 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple @Override @SuppressWarnings("unchecked") public void onEvent(final IEvent<?> event) { - if (event.getPayload() instanceof AjaxWizard.NewItemEvent) { + if (event.getPayload() instanceof ExitEvent && modal != null) { + final AjaxRequestTarget target = ExitEvent.class.cast(event.getPayload()).getTarget(); + // default behaviour: change it catching the event if needed + modal.close(target); + } else if (event.getPayload() instanceof AjaxWizard.NewItemEvent) { final AjaxWizard.NewItemEvent<T> newItemEvent = AjaxWizard.NewItemEvent.class.cast(event.getPayload()); final AjaxRequestTarget target = newItemEvent.getTarget(); final T item = newItemEvent.getItem(); @@ -169,7 +189,6 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple } } else if (event.getPayload() instanceof AjaxWizard.NewItemCancelEvent) { if (wizardInModal) { - modal.show(false); modal.close(target); } else { container.addOrReplace(initialFragment); @@ -187,23 +206,21 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple @Override protected void closeAction(final AjaxRequestTarget target) { - modal.show(false); modal.close(target); } @Override - protected Panel customResultBody( - final String id, final T item, final Serializable result) { + protected Panel customResultBody(final String id, final T item, final Serializable result) { return WizardMgtPanel.this.customResultBody(id, item, result); } }); target.add(modal.getForm()); } else if (wizardInModal) { - modal.show(false); modal.close(target); } else { container.addOrReplace(initialFragment); } + customActionOnCloseCallback(target); } if (containerAutoRefresh) { @@ -230,6 +247,17 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple } /** + * Show exit butto sending ExitEvent paylad. + * + * @return the current instance. + */ + protected final WizardMgtPanel<T> enableExitButton() { + exitAjaxLink.setEnabled(true); + exitAjaxLink.setVisible(true); + return this; + } + + /** * Add object inside the main container. * * @param childs components to be added. @@ -298,7 +326,6 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple @Override public void onClose(final AjaxRequestTarget target) { modal.show(false); - customActionOnCloseCallback(target); } }); } @@ -384,4 +411,17 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple return this; } } + + public static class ExitEvent { + + private final AjaxRequestTarget target; + + public ExitEvent(final AjaxRequestTarget target) { + this.target = target; + } + + public AjaxRequestTarget getTarget() { + return target; + } + } } http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css index c854b05..5e3db1b 100644 --- a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css +++ b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css @@ -261,7 +261,7 @@ div.wizard-view div.wizard-view{ .wizard-view > div { display: block; - height: 98%; + height: 95%; position: relative; } @@ -640,10 +640,18 @@ START - Search - AjaxDateTimePicker width: 120px !important; } +.clause .type button{ + width: 120px !important; +} + .clause .property{ width: 190px; } +.clause .property button{ + width: 190px; +} + .clause .comparator{ width: 100px; } http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties index 5b05753..d63f1c0 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties @@ -33,3 +33,5 @@ any.new=New Report any.finish=Submit Report any.cancel=Cancel Report report.view=Executions of report '${key}' +reportlet.conf=Reportlet configuration for ${key} +close=Close http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties index 89ec0ab..8449d96 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties @@ -33,3 +33,5 @@ any.new=Nuovo Report any.finish=Conferma Report any.cancel=Annulla Report report.view=Esecuzioni del report '${key}' +reportlet.conf=Configurazione reportlet per ${key} +close=Close http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties index d13bf06..a0ad069 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties @@ -33,3 +33,5 @@ any.new=New Report any.finish=Submit Report any.cancel=Cancel Report report.view=Executions of report '${key}' +reportlet.conf=Reportlet configuration for ${key} +close=Close http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties index 18fee1d..f6124f7 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties @@ -41,3 +41,5 @@ any.finish=Submit Report any.cancel=Cancel Report # task.view=\u00d0\u0097\u00d0\u00b0\u00d0\u00bf\u00d1\u0083\u00d1\u0081\u00d0\u00ba\u00d0\u00b8 \u00d0\u00b7\u00d0\u00b0\u00d0\u00b4\u00d0\u00b0\u00d1\u0087\u00d0\u00b8 report.view=Executions of report '${key}' +reportlet.conf=Reportlet configuration for ${key} +close=Close http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html index b090ddd..1345bdb 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html @@ -18,7 +18,7 @@ under the License. --> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org"> <wicket:panel> - <div class="form-group"><span wicket:id="name">[id]</span></div> + <div class="form-group"><span wicket:id="name">[name]</span></div> <div class="form-group"><span wicket:id="template">[template]</span></div> <div class="form-group"><span wicket:id="active">[active]</span></div> </wicket:panel> http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties new file mode 100644 index 0000000..680d073 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties @@ -0,0 +1,19 @@ +# 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. +reportlet=Reportlet +profile=Profile +configuration=Configuration http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties new file mode 100644 index 0000000..7a16c3b --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties @@ -0,0 +1,19 @@ +# 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. +reportlet=Reportlet +profile=Profilo +configuration=Configurazione http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties new file mode 100644 index 0000000..680d073 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties @@ -0,0 +1,19 @@ +# 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. +reportlet=Reportlet +profile=Profile +configuration=Configuration http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties new file mode 100644 index 0000000..680d073 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties @@ -0,0 +1,19 @@ +# 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. +reportlet=Reportlet +profile=Profile +configuration=Configuration http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html new file mode 100644 index 0000000..3d58410 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html @@ -0,0 +1,28 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org"> + <wicket:panel> + <div wicket:id="propView"> + <div class="form-group inforow"> + <label wicket:id="fieldName">[LABEL]</label> + <span wicket:id="value">[value]</span> + </div> + </div> + </wicket:panel> +</html> http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties new file mode 100644 index 0000000..8d2c500 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties @@ -0,0 +1,24 @@ +# 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. +plainAttrs=Plain Attributes +derAttrs=Derived Attributes +virAttrs=Virtual Attributes +features=Features +matchingCond=Matching Condition +userMatchingCond=User Matching Condition +groupMatchingCond=Group Matching Condition +anyObjectMatchingCond=AnyObject Matching Condition http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties new file mode 100644 index 0000000..6688f85 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties @@ -0,0 +1,24 @@ +# 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. +plainAttrs=Attributi +derAttrs=Attributi Derivati +virAttrs=Attributi Virtuali +features=Features +matchingCond=Condizione di matching +userMatchingCond=Condizione di matching utente +groupMatchingCond=Condizione di matching gruppo +anyObjectMatchingCond=Condizione di matching any