From 6ea43e692a805528f40aeca051c25894d65a8f75 Mon Sep 17 00:00:00 2001 From: kate Date: Tue, 29 Aug 2017 00:30:59 +0200 Subject: [PATCH] policy rules: constraints editable panel --- .../assignment/PolicyRulePropertiesPanel.java | 39 ++++- .../multivalue/MultiValueExpandablePanel.html | 46 ++++++ .../multivalue/MultiValueExpandablePanel.java | 154 ++++++++++++++++++ .../resources/localization/schema.properties | 3 + 4 files changed, 240 insertions(+), 2 deletions(-) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/multivalue/MultiValueExpandablePanel.html create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/multivalue/MultiValueExpandablePanel.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/PolicyRulePropertiesPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/PolicyRulePropertiesPanel.java index 61d3cbac86f..5ed774c68a0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/PolicyRulePropertiesPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/PolicyRulePropertiesPanel.java @@ -18,11 +18,18 @@ import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.prism.PrismContainer; +import com.evolveum.midpoint.web.component.form.multivalue.MultiValueExpandablePanel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractPolicyConstraintType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ExclusionPolicyConstraintType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyConstraintsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyRuleType; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; +import java.util.ArrayList; +import java.util.List; + /** * Created by honchar * Panel displays specific for policy rule object @@ -46,7 +53,8 @@ private void initLayout(){ AssignmentDto policyRuleDto = getModelObject(); PolicyRuleType policyRuleContainer = policyRuleDto.getAssignment().getPolicyRule(); - add(new Label(ID_CONSTRAINTS_VALUE, Model.of(PolicyRuleUtil.convertPolicyConstraintsContainerToString(policyRuleContainer, pageBase)))); + add(new MultiValueExpandablePanel(ID_CONSTRAINTS_VALUE, + Model.ofList(getAllPolicyConstraintsList(policyRuleContainer.getPolicyConstraints())))); add(new Label(ID_SITUATION_VALUE, Model.of(policyRuleContainer == null ? "" : policyRuleContainer.getPolicySituation()))); @@ -54,5 +62,32 @@ private void initLayout(){ } - + private List getAllPolicyConstraintsList(PolicyConstraintsType constraintsType){ + List constraintsList = new ArrayList<>(); + if (constraintsType == null){ + return constraintsList; + } + if (constraintsType.getExclusion() != null){ + constraintsList.addAll(constraintsType.getExclusion()); + } + if (constraintsType.getMinAssignees() != null){ + constraintsList.addAll(constraintsType.getMinAssignees()); + } + if (constraintsType.getMaxAssignees() != null){ + constraintsList.addAll(constraintsType.getMaxAssignees()); + } + if (constraintsType.getModification() != null){ + constraintsList.addAll(constraintsType.getModification()); + } + if (constraintsType.getAssignment() != null){ + constraintsList.addAll(constraintsType.getAssignment()); + } + if (constraintsType.getTimeValidity() != null){ + constraintsList.addAll(constraintsType.getTimeValidity()); + } + if (constraintsType.getSituation() != null){ + constraintsList.addAll(constraintsType.getSituation()); + } + return constraintsList; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/multivalue/MultiValueExpandablePanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/multivalue/MultiValueExpandablePanel.html new file mode 100644 index 00000000000..a0b14feb45c --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/multivalue/MultiValueExpandablePanel.html @@ -0,0 +1,46 @@ + + + + + + + + +
+
+
+
+ +
+ + +
+
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/multivalue/MultiValueExpandablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/multivalue/MultiValueExpandablePanel.java new file mode 100644 index 00000000000..46249b7c4d4 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/multivalue/MultiValueExpandablePanel.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2010-2017 Evolveum + * + * Licensed 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 com.evolveum.midpoint.web.component.form.multivalue; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.web.component.AjaxButton; +import com.evolveum.midpoint.web.component.input.TextPanel; +import com.evolveum.midpoint.web.page.admin.configuration.component.ChooseTypePanel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.markup.html.WebMarkupContainer; +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.markup.repeater.RepeatingView; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by honchar. + */ +public class MultiValueExpandablePanel extends BasePanel> { + private static final String ID_REPEATER = "repeater"; + private static final String ID_BOX_TITLE = "boxTitle"; + private static final String ID_REMOVE_BUTTON = "removeButton"; + private static final String ID_BOX_BODY = "boxBody"; + private static final String ID_ATTRIBUTE_REPEATER = "attributeRepeater"; + private static final String ID_ATTRIBUTE_LABEL = "attributeLabel"; + private static final String ID_ATTRIBUTE_VALUE = "attributeValue"; + + public MultiValueExpandablePanel(String id, IModel> model){ + super(id, model); + initLayout(); + } + + private void initLayout(){ + ListView repeater = new ListView(ID_REPEATER, getModel()) { + + @Override + protected void populateItem(final ListItem listItem) { + Label boxTitle = new Label(ID_BOX_TITLE, listItem.getModel().getObject().asPrismContainerValue().getPath().last()); + listItem.add(boxTitle); + + AjaxButton removeRowButton = new AjaxButton(ID_REMOVE_BUTTON) { + @Override + public void onClick(AjaxRequestTarget ajaxRequestTarget) { + } + }; + listItem.add(removeRowButton); + + T itemModel = listItem.getModelObject(); + PrismContainerValue containerValue = itemModel.asPrismContainerValue(); + + List items = containerValue.getItems(); + Map attributesDefinitionValueMap = new HashMap<>(); + for (ItemDefinition itemDefinition : containerValue.getComplexTypeDefinition().getDefinitions()){ + attributesDefinitionValueMap.put(itemDefinition, containerValue.findItem(itemDefinition.getName())); + } + + RepeatingView attributesPanel = new RepeatingView(ID_ATTRIBUTE_REPEATER); + for (ItemDefinition itemDefinition : attributesDefinitionValueMap.keySet()){ + WebMarkupContainer attributePanelContainer = new WebMarkupContainer(attributesPanel.newChildId()); + attributesPanel.add(attributePanelContainer); + + attributePanelContainer.add(new Label(ID_ATTRIBUTE_LABEL, Model.of(itemDefinition.getName().getLocalPart()))); + + Item item = attributesDefinitionValueMap.get(itemDefinition); + IModel itemValueModel = item != null ? Model.of(item.getValue(0)) : null; + attributePanelContainer.add(createTypedAttributePanel(ID_ATTRIBUTE_VALUE, + getItemType(itemDefinition), itemValueModel, "value")); + } + listItem.add(attributesPanel); + } + }; + + add(repeater); + + } + + private Class getItemType(ItemDefinition itemDefinition){ + Class type = WebComponentUtil.qnameToClass(itemDefinition.getPrismContext(), itemDefinition.getTypeName()); + if (type == null){ + type = itemDefinition.getPrismContext().getSchemaRegistry().determineClassForType(itemDefinition.getTypeName()); + } + if (type == null){ + type = itemDefinition.getTypeClass(); + } + return type; + } + + private Component createTypedAttributePanel(String componentId, Class type, IModel model, String expression) { + Panel panel; + if (type == null){ + return new WebMarkupContainer(componentId); + } + if (type.isEnum()) { + panel = WebComponentUtil.createEnumPanel(type, componentId, model != null ? new PropertyModel<>(model, expression) : null, this); + } else if (ObjectReferenceType.class.isAssignableFrom(type)) { + ObjectReferenceType ort = new ObjectReferenceType(); + ort.setupReferenceValue((PrismReferenceValue) model.getObject()); + panel = new ChooseTypePanel(componentId, ort) { + + private static final long serialVersionUID = 1L; + + + @Override + protected void executeCustomRemoveAction(AjaxRequestTarget target) { + + } + + @Override + protected ObjectQuery getChooseQuery() { + return new ObjectQuery(); + } + + + @Override + public Class getObjectTypeClass() { + return AbstractRoleType.class; + } + + }; + } else { + panel = new TextPanel<>(componentId, Model.of(""), type); + } + + panel.setOutputMarkupId(true); + return panel; + } + +} diff --git a/infra/schema/src/main/resources/localization/schema.properties b/infra/schema/src/main/resources/localization/schema.properties index d48b35eee1e..1c317723bae 100644 --- a/infra/schema/src/main/resources/localization/schema.properties +++ b/infra/schema/src/main/resources/localization/schema.properties @@ -398,3 +398,6 @@ AdditionalInformationGenerator.exclusionsTitle=Exclusions to be approved AdditionalInformationGenerator.assignmentOf=Assignment of {0} AdditionalInformationGenerator.isInConflictWithAssignmentOf=is in conflict with assignment of {0} AdditionalInformationGenerator.notes=Notes +ExclusionPolicyType.ENFORCE=Enforce +ExclusionPolicyType.APPROVE=Approve +ExclusionPolicyType.REPORT=Report