diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemMandatoryHandler.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemMandatoryHandler.java new file mode 100644 index 00000000000..997130ffda7 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemMandatoryHandler.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.gui.impl.prism; + +import com.evolveum.midpoint.gui.api.prism.ItemWrapper; + +import java.io.Serializable; + +@FunctionalInterface +public interface ItemMandatoryHandler extends Serializable { + + boolean isMandatory(ItemWrapper itemWrapper); + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanel.java index 545e8fd9ed5..8cd87d9344e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanel.java @@ -1,327 +1,334 @@ -/* - * Copyright (c) 2010-2018 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.gui.impl.prism; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import com.evolveum.midpoint.prism.PrismValue; - -import com.evolveum.midpoint.web.page.admin.server.RefreshableTabPanel; - -import org.apache.wicket.AttributeModifier; -import org.apache.wicket.Component; -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.ajax.markup.html.AjaxLink; -import org.apache.wicket.markup.html.WebMarkupContainer; -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.IModel; -import org.apache.wicket.model.PropertyModel; - -import com.evolveum.midpoint.gui.api.component.BasePanel; -import com.evolveum.midpoint.gui.api.factory.GuiComponentFactory; -import com.evolveum.midpoint.gui.api.prism.ItemWrapper; -import com.evolveum.midpoint.gui.api.util.WebPrismUtil; -import com.evolveum.midpoint.gui.impl.component.data.column.AbstractItemWrapperColumnPanel; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.component.prism.ValueStatus; -import com.evolveum.midpoint.web.component.util.VisibleBehaviour; - -/** - * @author katka - * - */ -public abstract class ItemPanel extends BasePanel implements RefreshableTabPanel { - - private static final long serialVersionUID = 1L; - - private static final Trace LOGGER = TraceManager.getTrace(ItemPanel.class); - - private static final String DOT_CLASS = ItemPanel.class.getName() + "."; - private static final String OPERATION_CREATE_NEW_VALUE = DOT_CLASS + "createNewValue"; - - private static final String ID_HEADER = "header"; - private static final String ID_VALUES = "values"; - - private static final String ID_ADD_BUTTON = "addButton"; - private static final String ID_REMOVE_BUTTON = "removeButton"; - private static final String ID_BUTTON_CONTAINER = "buttonContainer"; - - protected ItemPanelSettings itemPanelSettings; - - - public ItemPanel(String id, IModel model, ItemPanelSettings itemPanelSettings) { - super(id, model); - this.itemPanelSettings = itemPanelSettings; - } - - @Override - protected void onInitialize() { - super.onInitialize(); - initLayout(); - setOutputMarkupId(true); - } - - private void initLayout() { - - //ugly hack TODO FIME - prism context is lost during srialization/deserialization.. find better way how to do it. - if (getModelObject() != null) { - getModelObject().revive(getPrismContext()); - } - - Panel headerPanel = createHeaderPanel(); - headerPanel.add(new VisibleBehaviour(() -> getHeaderVisibility())); - add(headerPanel); - - ListView valuesPanel = createValuesPanel(); - add(valuesPanel); - - } - - protected boolean getHeaderVisibility() { - if (!isHeaderVisible()) { - return false; - } - return getParent().findParent(AbstractItemWrapperColumnPanel.class) == null; - } - - protected abstract Panel createHeaderPanel(); - - protected ListView createValuesPanel() { - - ListView values = new ListView(ID_VALUES, new PropertyModel<>(getModel(), "values")) { - - private static final long serialVersionUID = 1L; - - @Override - protected void populateItem(ListItem item) { - GuiComponentFactory componentFactory = getPageBase().getRegistry() - .findValuePanelFactory(ItemPanel.this.getModelObject()); - - Component panel = createValuePanel(item, componentFactory, getVisibilityHandler(), getEditabilityHandler()); -// panel.add(getEnableBehaviourOfValuePanel(ItemPanel.this.getModelObject())); - createButtons(item); - } - - }; - -// values.setReuseItems(true); -// customValuesPanel(values); - return values; - } - - @Override - public boolean isEnabled() { - return !getModelObject().isReadOnly(); - } - - // VALUE REGION - - protected abstract Component createValuePanel(ListItem item, GuiComponentFactory componentFactory, - ItemVisibilityHandler visibilityHandler, ItemEditabilityHandler editabilityHandler); - - protected void createButtons(ListItem item) { - WebMarkupContainer buttonContainer = new WebMarkupContainer(ID_BUTTON_CONTAINER); - buttonContainer.add(new AttributeModifier("class", getButtonsCssClass())); - - item.add(buttonContainer); - // buttons - AjaxLink addButton = new AjaxLink(ID_ADD_BUTTON) { - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget target) { - addValue(target); - } - }; - addButton.add(new VisibleBehaviour(() -> isAddButtonVisible())); - buttonContainer.add(addButton); - - AjaxLink removeButton = new AjaxLink(ID_REMOVE_BUTTON) { - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget target) { - try { - removeValue(item.getModelObject(), target); - } catch (SchemaException e) { - LOGGER.error("Cannot remove value: {}", item.getModelObject()); - getSession().error("Cannot remove value "+ item.getModelObject()); - target.add(getPageBase().getFeedbackPanel()); - target.add(ItemPanel.this); - } - } - }; - removeButton.add(new VisibleBehaviour(() -> isRemoveButtonVisible())); - buttonContainer.add(removeButton); - - - item.add(AttributeModifier.append("class", createStyleClassModel(item.getModel()))); - - item.add(new VisibleBehaviour(() -> isVisibleValue(item.getModel()))); - } - - - protected String getButtonsCssClass() { - return"col-xs-2"; - } - - protected IModel createStyleClassModel(final IModel value) { - return new IModel() { - private static final long serialVersionUID = 1L; - - @Override - public String getObject() { - if (getIndexOfValue(value.getObject()) > 0) { - return getItemCssClass(); - } - - return null; - } - }; - } - - private int getIndexOfValue(VW value) { - IW property = (IW) value.getParent(); - List values = property.getValues(); - for (int i = 0; i < values.size(); i++) { - if (values.get(i).equals(value)) { - return i; - } - } - - return -1; - } - - protected String getItemCssClass() { - return " col-sm-offset-0 col-md-offset-4 col-lg-offset-2 prism-value "; - } - - protected void addValue(AjaxRequestTarget target) { - IW propertyWrapper = getModel().getObject(); - PrismPropertyValue newValue = getPrismContext().itemFactory().createPropertyValue(); - - WebPrismUtil.createNewValueWrapper(propertyWrapper, createNewValue(propertyWrapper), getPageBase(), target); - - target.add(ItemPanel.this); - } - - protected abstract PV createNewValue(IW itemWrapper); - - protected void removeValue(VW valueToRemove, AjaxRequestTarget target) throws SchemaException { - LOGGER.debug("Removing value of {}", valueToRemove); - List values = getModelObject().getValues(); - - switch (valueToRemove.getStatus()) { - case ADDED: - values.remove(valueToRemove); - getModelObject().getItem().remove(valueToRemove.getOldValue()); - getModelObject().getItem().remove(valueToRemove.getNewValue()); - break; - case DELETED: - valueToRemove.setStatus(ValueStatus.NOT_CHANGED); - break; - case NOT_CHANGED: - valueToRemove.setStatus(ValueStatus.DELETED); - break; - } - - int count = countUsableValues(values); - - if (count == 0 && !hasEmptyPlaceholder(values)) { - addValue(target); - } - - target.add(ItemPanel.this); - } - - private int countUsableValues(List values) { - int count = 0; - for (VW value : values) { -// if (ValueStatus.DELETED.equals(value.getStatus())) { -// continue; -// } - if (ValueStatus.ADDED.equals(value.getStatus())) { - continue; - } - count++; - } - return count; - } - - private boolean hasEmptyPlaceholder(List values) { - for (VW value : values) { - if (ValueStatus.ADDED.equals(value.getStatus()) ) {//&& !value.hasValueChanged()) { - return true; - } - } - - return false; - } - - private boolean isAddButtonVisible() { - return getModelObject().isMultiValue(); - } - - - - protected boolean isRemoveButtonVisible() { - return !getModelObject().isReadOnly(); - - } - - - private boolean isVisibleValue(IModel model) { - VW value = model.getObject(); - return !ValueStatus.DELETED.equals(value.getStatus()); - } - - public ItemVisibilityHandler getVisibilityHandler() { - if (itemPanelSettings == null) { - return null; - } - return itemPanelSettings.getVisibilityHandler(); - } - - public ItemEditabilityHandler getEditabilityHandler() { - if (itemPanelSettings == null) { - return null; - } - return itemPanelSettings.getEditabilityHandler(); - } - - protected boolean isShowOnTopLevel() { - if (itemPanelSettings == null) { - return false; - } - return itemPanelSettings.isShowOnTopLevel(); - } - - - protected boolean isHeaderVisible() { - if (itemPanelSettings == null) { - return true; - } - - return itemPanelSettings.isHeaderVisible(); - } - - public ItemPanelSettings getSettings() { - return itemPanelSettings; - } - - @Override - public Collection getComponentsToUpdate() { - return Collections.singleton(this); - } -} +/* + * Copyright (c) 2010-2018 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.gui.impl.prism; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import com.evolveum.midpoint.prism.PrismValue; + +import com.evolveum.midpoint.web.page.admin.server.RefreshableTabPanel; + +import org.apache.wicket.AttributeModifier; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.markup.html.WebMarkupContainer; +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.IModel; +import org.apache.wicket.model.PropertyModel; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.factory.GuiComponentFactory; +import com.evolveum.midpoint.gui.api.prism.ItemWrapper; +import com.evolveum.midpoint.gui.api.util.WebPrismUtil; +import com.evolveum.midpoint.gui.impl.component.data.column.AbstractItemWrapperColumnPanel; +import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.component.prism.ValueStatus; +import com.evolveum.midpoint.web.component.util.VisibleBehaviour; + +/** + * @author katka + * + */ +public abstract class ItemPanel extends BasePanel implements RefreshableTabPanel { + + private static final long serialVersionUID = 1L; + + private static final Trace LOGGER = TraceManager.getTrace(ItemPanel.class); + + private static final String DOT_CLASS = ItemPanel.class.getName() + "."; + private static final String OPERATION_CREATE_NEW_VALUE = DOT_CLASS + "createNewValue"; + + private static final String ID_HEADER = "header"; + private static final String ID_VALUES = "values"; + + private static final String ID_ADD_BUTTON = "addButton"; + private static final String ID_REMOVE_BUTTON = "removeButton"; + private static final String ID_BUTTON_CONTAINER = "buttonContainer"; + + private ItemPanelSettings itemPanelSettings; + + + public ItemPanel(String id, IModel model, ItemPanelSettings itemPanelSettings) { + super(id, model); + this.itemPanelSettings = itemPanelSettings; + } + + @Override + protected void onInitialize() { + super.onInitialize(); + initLayout(); + setOutputMarkupId(true); + } + + private void initLayout() { + + //ugly hack TODO FIME - prism context is lost during srialization/deserialization.. find better way how to do it. + if (getModelObject() != null) { + getModelObject().revive(getPrismContext()); + } + + Panel headerPanel = createHeaderPanel(); + headerPanel.add(new VisibleBehaviour(() -> getHeaderVisibility())); + add(headerPanel); + + ListView valuesPanel = createValuesPanel(); + add(valuesPanel); + + } + + protected boolean getHeaderVisibility() { + if (!isHeaderVisible()) { + return false; + } + return getParent().findParent(AbstractItemWrapperColumnPanel.class) == null; + } + + protected abstract Panel createHeaderPanel(); + + protected ListView createValuesPanel() { + + ListView values = new ListView(ID_VALUES, new PropertyModel<>(getModel(), "values")) { + + private static final long serialVersionUID = 1L; + + @Override + protected void populateItem(ListItem item) { + GuiComponentFactory componentFactory = getPageBase().getRegistry() + .findValuePanelFactory(ItemPanel.this.getModelObject()); + + Component panel = createValuePanel(item, componentFactory, getVisibilityHandler(), getEditabilityHandler()); +// panel.add(getEnableBehaviourOfValuePanel(ItemPanel.this.getModelObject())); + createButtons(item); + } + + }; + +// values.setReuseItems(true); +// customValuesPanel(values); + return values; + } + + @Override + public boolean isEnabled() { + return !getModelObject().isReadOnly(); + } + + // VALUE REGION + + protected abstract Component createValuePanel(ListItem item, GuiComponentFactory componentFactory, + ItemVisibilityHandler visibilityHandler, ItemEditabilityHandler editabilityHandler); + + protected void createButtons(ListItem item) { + WebMarkupContainer buttonContainer = new WebMarkupContainer(ID_BUTTON_CONTAINER); + buttonContainer.add(new AttributeModifier("class", getButtonsCssClass())); + + item.add(buttonContainer); + // buttons + AjaxLink addButton = new AjaxLink(ID_ADD_BUTTON) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + addValue(target); + } + }; + addButton.add(new VisibleBehaviour(() -> isAddButtonVisible())); + buttonContainer.add(addButton); + + AjaxLink removeButton = new AjaxLink(ID_REMOVE_BUTTON) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + try { + removeValue(item.getModelObject(), target); + } catch (SchemaException e) { + LOGGER.error("Cannot remove value: {}", item.getModelObject()); + getSession().error("Cannot remove value "+ item.getModelObject()); + target.add(getPageBase().getFeedbackPanel()); + target.add(ItemPanel.this); + } + } + }; + removeButton.add(new VisibleBehaviour(() -> isRemoveButtonVisible())); + buttonContainer.add(removeButton); + + + item.add(AttributeModifier.append("class", createStyleClassModel(item.getModel()))); + + item.add(new VisibleBehaviour(() -> isVisibleValue(item.getModel()))); + } + + + protected String getButtonsCssClass() { + return"col-xs-2"; + } + + protected IModel createStyleClassModel(final IModel value) { + return new IModel() { + private static final long serialVersionUID = 1L; + + @Override + public String getObject() { + if (getIndexOfValue(value.getObject()) > 0) { + return getItemCssClass(); + } + + return null; + } + }; + } + + private int getIndexOfValue(VW value) { + IW property = (IW) value.getParent(); + List values = property.getValues(); + for (int i = 0; i < values.size(); i++) { + if (values.get(i).equals(value)) { + return i; + } + } + + return -1; + } + + protected String getItemCssClass() { + return " col-sm-offset-0 col-md-offset-4 col-lg-offset-2 prism-value "; + } + + protected void addValue(AjaxRequestTarget target) { + IW propertyWrapper = getModel().getObject(); + PrismPropertyValue newValue = getPrismContext().itemFactory().createPropertyValue(); + + WebPrismUtil.createNewValueWrapper(propertyWrapper, createNewValue(propertyWrapper), getPageBase(), target); + + target.add(ItemPanel.this); + } + + protected abstract PV createNewValue(IW itemWrapper); + + protected void removeValue(VW valueToRemove, AjaxRequestTarget target) throws SchemaException { + LOGGER.debug("Removing value of {}", valueToRemove); + List values = getModelObject().getValues(); + + switch (valueToRemove.getStatus()) { + case ADDED: + values.remove(valueToRemove); + getModelObject().getItem().remove(valueToRemove.getOldValue()); + getModelObject().getItem().remove(valueToRemove.getNewValue()); + break; + case DELETED: + valueToRemove.setStatus(ValueStatus.NOT_CHANGED); + break; + case NOT_CHANGED: + valueToRemove.setStatus(ValueStatus.DELETED); + break; + } + + int count = countUsableValues(values); + + if (count == 0 && !hasEmptyPlaceholder(values)) { + addValue(target); + } + + target.add(ItemPanel.this); + } + + private int countUsableValues(List values) { + int count = 0; + for (VW value : values) { +// if (ValueStatus.DELETED.equals(value.getStatus())) { +// continue; +// } + if (ValueStatus.ADDED.equals(value.getStatus())) { + continue; + } + count++; + } + return count; + } + + private boolean hasEmptyPlaceholder(List values) { + for (VW value : values) { + if (ValueStatus.ADDED.equals(value.getStatus()) ) {//&& !value.hasValueChanged()) { + return true; + } + } + + return false; + } + + private boolean isAddButtonVisible() { + return getModelObject().isMultiValue(); + } + + + + protected boolean isRemoveButtonVisible() { + return !getModelObject().isReadOnly(); + + } + + + private boolean isVisibleValue(IModel model) { + VW value = model.getObject(); + return !ValueStatus.DELETED.equals(value.getStatus()); + } + + public ItemVisibilityHandler getVisibilityHandler() { + if (itemPanelSettings == null) { + return null; + } + return itemPanelSettings.getVisibilityHandler(); + } + + public ItemEditabilityHandler getEditabilityHandler() { + if (itemPanelSettings == null) { + return null; + } + return itemPanelSettings.getEditabilityHandler(); + } + + public ItemMandatoryHandler getMandatoryHandler() { + if (itemPanelSettings == null) { + return null; + } + return itemPanelSettings.getMandatoryHandler(); + } + + protected boolean isShowOnTopLevel() { + if (itemPanelSettings == null) { + return false; + } + return itemPanelSettings.isShowOnTopLevel(); + } + + + protected boolean isHeaderVisible() { + if (itemPanelSettings == null) { + return true; + } + + return itemPanelSettings.isHeaderVisible(); + } + + public ItemPanelSettings getSettings() { + return itemPanelSettings; + } + + @Override + public Collection getComponentsToUpdate() { + return Collections.singleton(this); + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanelSettings.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanelSettings.java index e4c57fa26a0..ec7d74ee028 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanelSettings.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanelSettings.java @@ -14,6 +14,7 @@ public class ItemPanelSettings implements Serializable { private ItemEditabilityHandler editabilityHandler = wrapper -> true; private boolean showOnTopLevel; private boolean headerVisible = true; + private ItemMandatoryHandler mandatoryHandler; public ItemVisibilityHandler getVisibilityHandler() { @@ -48,7 +49,12 @@ void setHeaderVisible(boolean headerVisible) { this.headerVisible = headerVisible; } + public ItemMandatoryHandler getMandatoryHandler() { + return mandatoryHandler; + } - + public void setMandatoryHandler(ItemMandatoryHandler mandatoryHandler) { + this.mandatoryHandler = mandatoryHandler; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanelSettingsBuilder.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanelSettingsBuilder.java index ba726e2cfe7..384b2d48a49 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanelSettingsBuilder.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanelSettingsBuilder.java @@ -24,6 +24,11 @@ public ItemPanelSettingsBuilder editabilityHandler(ItemEditabilityHandler handle return this; } + public ItemPanelSettingsBuilder mandatoryHandler(ItemMandatoryHandler handler) { + settings.setMandatoryHandler(handler); + return this; + } + public ItemPanelSettingsBuilder showOnTopLevel(boolean showOnTopLevel) { settings.setShowOnTopLevel(showOnTopLevel); return this; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerPanel.java index a234e4456e3..3a87663b614 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerPanel.java @@ -1,140 +1,141 @@ -/* - * Copyright (c) 2010-2018 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.gui.impl.prism; - -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.util.exception.SchemaException; - -import org.apache.wicket.AttributeModifier; -import org.apache.wicket.Component; -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.markup.html.list.ListItem; -import org.apache.wicket.markup.html.panel.Panel; -import org.apache.wicket.model.IModel; - -import com.evolveum.midpoint.gui.api.factory.GuiComponentFactory; -import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; -import com.evolveum.midpoint.gui.impl.factory.PrismContainerPanelContext; -import com.evolveum.midpoint.prism.Containerable; - -/** - * @author katka - * - */ -public class PrismContainerPanel extends ItemPanel, PrismContainerWrapper>{ - - private static final long serialVersionUID = 1L; - - private static final String ID_HEADER = "header"; - - /** - * @param id - * @param model - */ - public PrismContainerPanel(String id, IModel> model, ItemPanelSettings settings) { - super(id, model, settings); - } - - @Override - protected void onInitialize() { - super.onInitialize(); - - - add(AttributeModifier.append("class", () -> { - String cssClasses = ""; - - if (isShowOnTopLevel() || (getModelObject() != null && getModelObject().isVirtual()) || (!(getParent() instanceof PrismContainerValuePanel) && getParent()!=null - && getParent().getParent() instanceof PrismContainerValuePanel)) { - cssClasses = "top-level-prism-container"; - } - - if (getModelObject() != null && getModelObject().isMultiValue()) { - cssClasses = " multivalue-container"; - } - return cssClasses; - })); - - } - - @Override - public boolean isVisible() { - return getModelObject()!= null && getModelObject().isVisible(getModelObject().getParent(), getVisibilityHandler()); - } - - @Override - protected Panel createHeaderPanel() { - return new PrismContainerHeaderPanel(ID_HEADER, getModel()); - } - - @Override - protected boolean getHeaderVisibility() { - if(!super.getHeaderVisibility()) { - return false; - } - return getModelObject() != null && getModelObject().isMultiValue(); - } - - @Override - protected Component createValuePanel(ListItem> item, GuiComponentFactory componentFactory, - ItemVisibilityHandler visibilityHandler, ItemEditabilityHandler editabilityHandler) { - if (componentFactory == null) { - ItemPanelSettings settings = new ItemPanelSettingsBuilder() - .visibilityHandler(visibilityHandler) - .editabilityHandler(editabilityHandler) - .showOnTopLevel(itemPanelSettings == null ? false : itemPanelSettings.isShowOnTopLevel()) - .build(); - PrismContainerValuePanel> valuePanel = new PrismContainerValuePanel>("value", item.getModel(), - settings) { - - @Override - protected void removePerformed(PrismContainerValueWrapper containerValueWrapper, AjaxRequestTarget target) throws SchemaException { - PrismContainerPanel.this.removeValue(containerValueWrapper, target); - } - - }; - valuePanel.setOutputMarkupId(true); - item.add(valuePanel); - item.setOutputMarkupId(true); - return valuePanel; - } - - - PrismContainerPanelContext panelCtx = new PrismContainerPanelContext<>(getModel()); - panelCtx.setComponentId("value"); - panelCtx.setRealValueModel(item.getModel()); - Panel panel = componentFactory.createPanel(panelCtx); - panel.setOutputMarkupId(true); - item.add(panel); - return panel; - - } - -// @Override -// protected EnableBehaviour getEnableBehaviourOfValuePanel(PrismContainerWrapper iw) { -// return new EnableBehaviour(() -> true); -// } - - @Override - public boolean isEnabled() { - return true; - } - -// @Override -// protected void customValuesPanel(ListView> values) { -// values.add(new VisibleBehaviour(() -> getModelObject() != null && (getModelObject().isExpanded() || getModelObject().isSingleValue()))); -// } - - @Override - protected void createButtons(ListItem> item) { - //nothing to do.. buttons are in the prism container panel header/ prism container value header - } - - @Override - protected PV createNewValue(PrismContainerWrapper itemWrapper) { - return (PV) itemWrapper.getItem().createNewValue(); - } -} +/* + * Copyright (c) 2010-2018 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.gui.impl.prism; + +import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.util.exception.SchemaException; + +import org.apache.wicket.AttributeModifier; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.IModel; + +import com.evolveum.midpoint.gui.api.factory.GuiComponentFactory; +import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; +import com.evolveum.midpoint.gui.impl.factory.PrismContainerPanelContext; +import com.evolveum.midpoint.prism.Containerable; + +/** + * @author katka + * + */ +public class PrismContainerPanel extends ItemPanel, PrismContainerWrapper>{ + + private static final long serialVersionUID = 1L; + + private static final String ID_HEADER = "header"; + + /** + * @param id + * @param model + */ + public PrismContainerPanel(String id, IModel> model, ItemPanelSettings settings) { + super(id, model, settings); + } + + @Override + protected void onInitialize() { + super.onInitialize(); + + + add(AttributeModifier.append("class", () -> { + String cssClasses = ""; + + if (isShowOnTopLevel() || (getModelObject() != null && getModelObject().isVirtual()) || (!(getParent() instanceof PrismContainerValuePanel) && getParent()!=null + && getParent().getParent() instanceof PrismContainerValuePanel)) { + cssClasses = "top-level-prism-container"; + } + + if (getModelObject() != null && getModelObject().isMultiValue()) { + cssClasses = " multivalue-container"; + } + return cssClasses; + })); + + } + + @Override + public boolean isVisible() { + return getModelObject()!= null && getModelObject().isVisible(getModelObject().getParent(), getVisibilityHandler()); + } + + @Override + protected Panel createHeaderPanel() { + return new PrismContainerHeaderPanel(ID_HEADER, getModel()); + } + + @Override + protected boolean getHeaderVisibility() { + if(!super.getHeaderVisibility()) { + return false; + } + return getModelObject() != null && getModelObject().isMultiValue(); + } + + @Override + protected Component createValuePanel(ListItem> item, GuiComponentFactory componentFactory, + ItemVisibilityHandler visibilityHandler, ItemEditabilityHandler editabilityHandler) { + if (componentFactory == null) { + ItemPanelSettings settings = new ItemPanelSettingsBuilder() + .visibilityHandler(visibilityHandler) + .editabilityHandler(editabilityHandler) + .showOnTopLevel(isShowOnTopLevel()) + .mandatoryHandler(getMandatoryHandler()) + .build(); + PrismContainerValuePanel> valuePanel = new PrismContainerValuePanel>("value", item.getModel(), + settings) { + + @Override + protected void removePerformed(PrismContainerValueWrapper containerValueWrapper, AjaxRequestTarget target) throws SchemaException { + PrismContainerPanel.this.removeValue(containerValueWrapper, target); + } + + }; + valuePanel.setOutputMarkupId(true); + item.add(valuePanel); + item.setOutputMarkupId(true); + return valuePanel; + } + + + PrismContainerPanelContext panelCtx = new PrismContainerPanelContext<>(getModel()); + panelCtx.setComponentId("value"); + panelCtx.setRealValueModel(item.getModel()); + Panel panel = componentFactory.createPanel(panelCtx); + panel.setOutputMarkupId(true); + item.add(panel); + return panel; + + } + +// @Override +// protected EnableBehaviour getEnableBehaviourOfValuePanel(PrismContainerWrapper iw) { +// return new EnableBehaviour(() -> true); +// } + + @Override + public boolean isEnabled() { + return true; + } + +// @Override +// protected void customValuesPanel(ListView> values) { +// values.add(new VisibleBehaviour(() -> getModelObject() != null && (getModelObject().isExpanded() || getModelObject().isSingleValue()))); +// } + + @Override + protected void createButtons(ListItem> item) { + //nothing to do.. buttons are in the prism container panel header/ prism container value header + } + + @Override + protected PV createNewValue(PrismContainerWrapper itemWrapper) { + return (PV) itemWrapper.getItem().createNewValue(); + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValuePanel.java index e4332d9ee69..1f63eee3afc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValuePanel.java @@ -1,624 +1,632 @@ -/* - * Copyright (c) 2010-2018 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.gui.impl.prism; - -import java.text.Collator; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Locale; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; -import com.evolveum.midpoint.gui.api.util.WebPrismUtil; -import com.evolveum.midpoint.prism.*; - -import com.evolveum.midpoint.web.component.prism.ItemVisibility; - -import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.wicket.AttributeModifier; -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.ajax.markup.html.AjaxLink; -import org.apache.wicket.behavior.AttributeAppender; -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.ListItemModel; -import org.apache.wicket.markup.html.list.ListView; -import org.apache.wicket.markup.html.panel.Panel; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.LambdaModel; -import org.apache.wicket.model.LoadableDetachableModel; -import org.apache.wicket.model.PropertyModel; -import org.apache.wicket.model.StringResourceModel; - -import com.evolveum.midpoint.gui.api.GuiStyleConstants; -import com.evolveum.midpoint.gui.api.component.BasePanel; -import com.evolveum.midpoint.gui.api.component.togglebutton.ToggleIconButton; -import com.evolveum.midpoint.gui.api.prism.ItemWrapper; -import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; -import com.evolveum.midpoint.gui.impl.factory.WrapperContext; -import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.midpoint.web.component.AjaxButton; -import com.evolveum.midpoint.web.component.prism.ValueStatus; -import com.evolveum.midpoint.web.component.util.EnableBehaviour; -import com.evolveum.midpoint.web.component.util.VisibleBehaviour; -import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.util.InfoTooltipBehavior; - -/** - * @author katka - * - */ -public class PrismContainerValuePanel> extends BasePanel{ - - private static final long serialVersionUID = 1L; - - protected static final String ID_LABEL = "label"; - protected static final String ID_LABEL_CONTAINER = "labelContainer"; - protected static final String ID_HELP = "help"; - - - private static final String ID_SORT_PROPERTIES = "sortProperties"; - private static final String ID_SHOW_METADATA = "showMetadata"; - private static final String ID_ADD_CHILD_CONTAINER = "addChildContainer"; - private static final String ID_REMOVE_CONTAINER = "removeContainer"; - - private static final String ID_EXPAND_COLLAPSE_BUTTON = "expandCollapseButton"; - private static final String ID_PROPERTIES_LABEL = "propertiesLabel"; - private static final String ID_SHOW_EMPTY_BUTTON = "showEmptyButton"; - - private ItemPanelSettings settings; - - public PrismContainerValuePanel(String id, IModel model, ItemPanelSettings settings) { - super(id, model); - this.settings = settings; - } - - @Override - public boolean isVisible() { - CVW modelObject = getModelObject(); - if (modelObject == null) { - return false; - } - - ItemWrapper parent = modelObject.getParent(); - if (!PrismContainerWrapper.class.isAssignableFrom(parent.getClass())) { - return false; - } - - if (MetadataType.COMPLEX_TYPE.equals(parent.getTypeName()) && (modelObject.isShowMetadata())) { - return false; - } - - - if (!isShowOnTopLevel() && !((PrismContainerWrapper) parent).isExpanded() && parent.isMultiValue()) { - return false; - } - return true; - } - - @Override - protected void onInitialize() { - super.onInitialize(); - initLayout(); - setOutputMarkupId(true); - - add(AttributeModifier.append("class", () -> { - String cssClasses = ""; - if (getModelObject() != null && ValueStatus.ADDED == getModelObject().getStatus()) { - cssClasses = " added-value-background"; - } - if (getModelObject() != null && ValueStatus.DELETED == getModelObject().getStatus()) { - cssClasses = " removed-value-background"; - } - return cssClasses; - })); - - } - - private void initLayout() { - initHeader(); - initValues(); - } - - private void initHeader() { - WebMarkupContainer labelContainer = new WebMarkupContainer(ID_LABEL_CONTAINER); - labelContainer.setOutputMarkupId(true); - - add(labelContainer); - - LoadableDetachableModel headerLabelModel = getLabelModel(); - AjaxButton labelComponent = new AjaxButton(ID_LABEL, headerLabelModel) { - private static final long serialVersionUID = 1L; - @Override - public void onClick(AjaxRequestTarget target) { - onExpandClick(target); - } - }; - labelComponent.setOutputMarkupId(true); - labelComponent.setOutputMarkupPlaceholderTag(true); - labelComponent.add(AttributeAppender.append("style", "cursor: pointer;")); - labelContainer.add(labelComponent); - - labelContainer.add(getHelpLabel()); - - initButtons(); - - //TODO always visible if isObject - } - - protected LoadableDetachableModel getLabelModel() { - return getPageBase().createStringResource(getModel().getObject().getDisplayName()); - } - - private void initValues() { - - createNonContainersPanel(); - - createContainersPanel(); - - } - - private , ID extends ItemDefinition, IW extends ItemWrapper> void createNonContainersPanel() { - WebMarkupContainer propertiesLabel = new WebMarkupContainer(ID_PROPERTIES_LABEL); - propertiesLabel.setOutputMarkupId(true); - - IModel> nonContainerWrappers = createNonContainerWrappersModel(); - - ListView properties = new ListView("properties", nonContainerWrappers) { - - private static final long serialVersionUID = 1L; - - @Override - protected void populateItem(final ListItem item) { - populateNonContainer(item); - } - }; - properties.setReuseItems(true); - properties.setOutputMarkupId(true); - add(propertiesLabel); - propertiesLabel.add(properties); - - AjaxButton labelShowEmpty = new AjaxButton(ID_SHOW_EMPTY_BUTTON) { - private static final long serialVersionUID = 1L; - @Override - public void onClick(AjaxRequestTarget target) { - onShowEmptyClick(target); - } - - @Override - public IModel getBody() { - return getNameOfShowEmptyButton(); - } - }; - labelShowEmpty.setOutputMarkupId(true); - labelShowEmpty.add(AttributeAppender.append("style", "cursor: pointer;")); - labelShowEmpty.add(new VisibleEnableBehaviour() { - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible() { - return nonContainerWrappers.getObject() != null && !nonContainerWrappers.getObject().isEmpty() - && getModelObject().isExpanded();// && !model.getObject().isShowEmpty(); - } - }); - add(labelShowEmpty); - } - - private void createContainersPanel() { - ListView> containers = new ListView>("containers", new PropertyModel<>(getModel(), "containers")) { - private static final long serialVersionUID = 1L; - - @Override - protected void populateItem(final ListItem> item) { - populateContainer(item); - } - }; - - containers.setReuseItems(true); - containers.setOutputMarkupId(true); - add(containers); - - } - - private > IModel> createNonContainerWrappersModel() { - return new IModel>() { - - private static final long serialVersionUID = 1L; - - @Override - public List getObject() { - return getNonContainerWrappers(); - } - }; - } - - private > List getNonContainerWrappers() { - CVW containerValueWrapper = getModelObject(); - List> nonContainers = containerValueWrapper.getNonContainers(); - - Locale locale = WebModelServiceUtils.getLocale(); - if (locale == null) { - locale = Locale.getDefault(); - } - Collator collator = Collator.getInstance(locale); - collator.setStrength(Collator.SECONDARY); // e.g. "a" should be different from "รก" - collator.setDecomposition(Collator.FULL_DECOMPOSITION); - ItemWrapperComparator comparator = new ItemWrapperComparator<>(collator, getModelObject().isSorted()); - if (CollectionUtils.isNotEmpty(nonContainers)) { - nonContainers.sort((Comparator) comparator); - - int visibleProperties = 0; - - for (ItemWrapper item : nonContainers) { - if (item.isVisible(containerValueWrapper, getVisibilityHandler())) { - visibleProperties++; - } - - if (visibleProperties % 2 == 0) { - item.setStripe(false); - } else { - item.setStripe(true); - } - - } - } - - return (List) nonContainers; - } - - private ItemVisibilityHandler getVisibilityHandler() { - if (settings == null) { - return null; - } - - return settings.getVisibilityHandler(); - } - - private ItemEditabilityHandler getReadabilityHandler() { - if (settings == null) { - return null; - } - - return settings.getEditabilityHandler(); - } - - private boolean isShowOnTopLevel() { - if (settings == null) { - return false; - } - - return settings.isShowOnTopLevel(); - } - - private > void populateNonContainer(ListItem item) { - item.setOutputMarkupId(true); - IW itemWrapper = item.getModelObject(); - try { - QName typeName = itemWrapper.getTypeName(); - if(item.getModelObject() instanceof ResourceAttributeWrapper) { - typeName = new QName("ResourceAttributeDefinition"); - } - - ItemPanelSettingsBuilder builder = new ItemPanelSettingsBuilder() - .visibilityHandler(getVisibilityHandler()) - .editabilityHandler(getReadabilityHandler()) - .showOnTopLevel(isShowOnTopLevel()); - Panel panel = getPageBase().initItemPanel("property", typeName, item.getModel(), builder.build()); - panel.setOutputMarkupId(true); - panel.add(new VisibleEnableBehaviour() { - - private static final long serialVersionUID = 1L; - - //TODO decide if we need to set enable behavior here - //see also ItemPanel.getEnableBehaviourOfValuePanel(), may be it's enough -// @Override -// public boolean isEnabled() { -// return !item.getModelObject().isReadOnly(); -// } - - @Override - public boolean isVisible() { - CVW parent = PrismContainerValuePanel.this.getModelObject(); - return item.getModelObject().isVisible(parent, getVisibilityHandler()); - } - }); - item.add(panel); - } catch (SchemaException e1) { - throw new SystemException("Cannot instantiate " + itemWrapper.getTypeName()); - } - - item.add(AttributeModifier.append("class", createStyleClassModel(item.getModel()))); - } - - private void populateContainer(ListItem> container) { - PrismContainerWrapper itemWrapper = container.getModelObject(); - try { -// ItemPanelSettingsBuilder builder = new ItemPanelSettingsBuilder().visibilityHandler(getVisibilityHandler()); - Panel panel = getPageBase().initItemPanel("container", itemWrapper.getTypeName(), container.getModel(), settings); - panel.setOutputMarkupId(true); -// panel.add(new VisibleBehaviour(() -> { -// CVW parent = PrismContainerValuePanel.this.getModelObject(); -// return container.getModelObject().isVisible(parent, visibilityHandler); -// })); - container.add(panel); - } catch (SchemaException e) { - throw new SystemException("Cannot instantiate panel for: " + itemWrapper.getDisplayName()); - } - - } - - private StringResourceModel getNameOfShowEmptyButton() { - return getPageBase().createStringResource("ShowEmptyButton.showMore.${showEmpty}", getModel()); - - } - - private void onShowEmptyClick(AjaxRequestTarget target) { - - PrismContainerValueWrapper wrapper = getModelObject(); - wrapper.setShowEmpty(!wrapper.isShowEmpty()); - refreshPanel(target); - } - - private > IModel createStyleClassModel(final IModel wrapper) { - return new IModel() { - private static final long serialVersionUID = 1L; - - @Override - public String getObject() { - ItemWrapper property = wrapper.getObject(); - return property.isStripe() ? "stripe" : null; - } - }; - } - - private void initButtons() { - initExpandCollapseButton(); - initMetadataButton(); - initSortButton(); - initAddMoreButton(); - initRemoveButton(); - } - - private void onExpandClick(AjaxRequestTarget target) { - - CVW wrapper = getModelObject(); - wrapper.setExpanded(!wrapper.isExpanded()); - refreshPanel(target); - } - - protected Label getHelpLabel() { - - Label help = new Label(ID_HELP); - help.add(AttributeModifier.replace("title", LambdaModel.of(getModel(), CVW::getHelpText))); - help.add(new InfoTooltipBehavior()); - help.add(new VisibleBehaviour(() -> StringUtils.isNotEmpty(getModelObject().getHelpText()))); - help.setOutputMarkupId(true); - return help; - } - - private void initMetadataButton() { - ToggleIconButton showMetadataButton = new ToggleIconButton(ID_SHOW_METADATA, - GuiStyleConstants.CLASS_ICON_SHOW_METADATA, GuiStyleConstants.CLASS_ICON_SHOW_METADATA) { - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget target) { - onShowMetadataClicked(target); - } - - @Override - public boolean isOn() { - return PrismContainerValuePanel.this.getModelObject().isShowMetadata(); - } - - - }; - showMetadataButton.add(new AttributeModifier("title", new StringResourceModel("PrismContainerValuePanel.showMetadata.${showMetadata}", getModel()))); - showMetadataButton.add(new VisibleBehaviour(() -> getModelObject().hasMetadata() && shouldBeButtonsShown())); - showMetadataButton.setOutputMarkupId(true); - showMetadataButton.setOutputMarkupPlaceholderTag(true); - add(showMetadataButton); - - } - - private void initSortButton() { - ToggleIconButton sortPropertiesButton = new ToggleIconButton(ID_SORT_PROPERTIES, - GuiStyleConstants.CLASS_ICON_SORT_ALPHA_ASC, GuiStyleConstants.CLASS_ICON_SORT_AMOUNT_ASC) { - - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget target) { - onSortClicked(target); - } - - @Override - public boolean isOn() { - return PrismContainerValuePanel.this.getModelObject().isSorted(); - } - }; - sortPropertiesButton.add(new VisibleBehaviour(() -> shouldBeButtonsShown())); - sortPropertiesButton.setOutputMarkupId(true); - sortPropertiesButton.setOutputMarkupPlaceholderTag(true); - add(sortPropertiesButton); - } - - private void initAddMoreButton() { - - AjaxLink addChildContainerButton = new AjaxLink(ID_ADD_CHILD_CONTAINER, new StringResourceModel("PrismContainerValuePanel.addMore")) { - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget target) { - initMoreContainersPopup(target); - } - }; - - addChildContainerButton.add(new VisibleEnableBehaviour() { - - private static final long serialVersionUID = 1L; - - @Override - public boolean isEnabled() { - if (getModelObject() != null) { - if(getModelObject().getParent() != null) { - return !getModelObject().getParent().isReadOnly(); - } else { - return !getModelObject().isReadOnly(); - } - } - return false; - } - - @Override - public boolean isVisible() { - return shouldBeButtonsShown() && getModelObject()!= null && getModelObject().isHeterogenous(); - } - }); - addChildContainerButton.setOutputMarkupId(true); - addChildContainerButton.setOutputMarkupPlaceholderTag(true); - add(addChildContainerButton); - - } - - private void initMoreContainersPopup(AjaxRequestTarget parentTarget) { - - - ListContainersPopup listContainersPopup = new ListContainersPopup(getPageBase().getMainPopupBodyId(), getModel()) { - - private static final long serialVersionUID = 1L; - - @Override - protected void processSelectedChildren(AjaxRequestTarget target, List> selected) { - prepareNewContainers(target, selected); - } - - }; - listContainersPopup.setOutputMarkupId(true); - - getPageBase().showMainPopup(listContainersPopup, parentTarget); - } - - private void prepareNewContainers(AjaxRequestTarget target, List> containers) { - getPageBase().hideMainPopup(target); - - Task task = getPageBase().createSimpleTask("Create child containers"); - WrapperContext ctx = new WrapperContext(task, task.getResult()); - containers.forEach(container -> { - try { - ItemWrapper iw = getPageBase().createItemWrapper(container, getModelObject(), ctx); - if (iw != null) { - ((List) getModelObject().getItems()).add(iw); - } - } catch (SchemaException e) { - OperationResult result = ctx.getResult(); - result.recordFatalError(createStringResource("PrismContainerValuePanel.message.prepareNewContainers.fatalError", container).getString(), e); - getPageBase().showResult(ctx.getResult()); - } - }); - - refreshPanel(target); - - } - - private void initRemoveButton() { - AjaxLink removeContainerButton = new AjaxLink(ID_REMOVE_CONTAINER) { - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget target) { - try { - removePerformed(PrismContainerValuePanel.this.getModelObject(), target); - } catch (SchemaException e) { - e.printStackTrace(); - } - } - - }; - - removeContainerButton.add(new VisibleEnableBehaviour() { - - private static final long serialVersionUID = 1L; - - @Override - public boolean isEnabled() { - if (getModelObject() != null) { - if(getModelObject().getParent() != null) { - return !getModelObject().getParent().isReadOnly(); - } else { - return !getModelObject().isReadOnly(); - } - } - return false; - } - - @Override - public boolean isVisible() { - return shouldBeButtonsShown(); - } - }); - add(removeContainerButton); - - } - - protected void removePerformed(CVW containerValueWrapper, AjaxRequestTarget target) throws SchemaException { - - } - - private boolean shouldBeButtonsShown() { - return getModelObject().isExpanded(); - } - - private void onSortClicked(AjaxRequestTarget target) { - CVW wrapper = getModelObject(); - wrapper.setSorted(!wrapper.isSorted()); - - refreshPanel(target); - } - - private void onShowMetadataClicked(AjaxRequestTarget target) { - CVW wrapper = getModelObject(); - wrapper.setShowMetadata(!wrapper.isShowMetadata()); - refreshPanel(target); - } - - - private void refreshPanel(AjaxRequestTarget target) { - target.add(PrismContainerValuePanel.this); - target.add(getPageBase().getFeedbackPanel()); - } - - protected void initExpandCollapseButton() { - ToggleIconButton expandCollapseButton = new ToggleIconButton(ID_EXPAND_COLLAPSE_BUTTON, - GuiStyleConstants.CLASS_ICON_EXPAND_CONTAINER, GuiStyleConstants.CLASS_ICON_COLLAPSE_CONTAINER) { - - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget target) { - onExpandClick(target); - } - - @Override - public boolean isOn() { - return PrismContainerValuePanel.this.getModelObject().isExpanded(); - } - }; - expandCollapseButton.setOutputMarkupId(true); - add(expandCollapseButton); - } -} +/* + * Copyright (c) 2010-2018 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.gui.impl.prism; + +import java.text.Collator; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; +import com.evolveum.midpoint.gui.api.util.WebPrismUtil; +import com.evolveum.midpoint.prism.*; + +import com.evolveum.midpoint.web.component.prism.ItemVisibility; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.wicket.AttributeModifier; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.behavior.AttributeAppender; +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.ListItemModel; +import org.apache.wicket.markup.html.list.ListView; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.LambdaModel; +import org.apache.wicket.model.LoadableDetachableModel; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.model.StringResourceModel; + +import com.evolveum.midpoint.gui.api.GuiStyleConstants; +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.component.togglebutton.ToggleIconButton; +import com.evolveum.midpoint.gui.api.prism.ItemWrapper; +import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; +import com.evolveum.midpoint.gui.impl.factory.WrapperContext; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.web.component.AjaxButton; +import com.evolveum.midpoint.web.component.prism.ValueStatus; +import com.evolveum.midpoint.web.component.util.EnableBehaviour; +import com.evolveum.midpoint.web.component.util.VisibleBehaviour; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.util.InfoTooltipBehavior; + +/** + * @author katka + * + */ +public class PrismContainerValuePanel> extends BasePanel{ + + private static final long serialVersionUID = 1L; + + protected static final String ID_LABEL = "label"; + protected static final String ID_LABEL_CONTAINER = "labelContainer"; + protected static final String ID_HELP = "help"; + + + private static final String ID_SORT_PROPERTIES = "sortProperties"; + private static final String ID_SHOW_METADATA = "showMetadata"; + private static final String ID_ADD_CHILD_CONTAINER = "addChildContainer"; + private static final String ID_REMOVE_CONTAINER = "removeContainer"; + + private static final String ID_EXPAND_COLLAPSE_BUTTON = "expandCollapseButton"; + private static final String ID_PROPERTIES_LABEL = "propertiesLabel"; + private static final String ID_SHOW_EMPTY_BUTTON = "showEmptyButton"; + + private ItemPanelSettings settings; + + public PrismContainerValuePanel(String id, IModel model, ItemPanelSettings settings) { + super(id, model); + this.settings = settings; + } + + @Override + public boolean isVisible() { + CVW modelObject = getModelObject(); + if (modelObject == null) { + return false; + } + + ItemWrapper parent = modelObject.getParent(); + if (!PrismContainerWrapper.class.isAssignableFrom(parent.getClass())) { + return false; + } + + if (MetadataType.COMPLEX_TYPE.equals(parent.getTypeName()) && (modelObject.isShowMetadata())) { + return false; + } + + + if (!isShowOnTopLevel() && !((PrismContainerWrapper) parent).isExpanded() && parent.isMultiValue()) { + return false; + } + return true; + } + + @Override + protected void onInitialize() { + super.onInitialize(); + initLayout(); + setOutputMarkupId(true); + + add(AttributeModifier.append("class", () -> { + String cssClasses = ""; + if (getModelObject() != null && ValueStatus.ADDED == getModelObject().getStatus()) { + cssClasses = " added-value-background"; + } + if (getModelObject() != null && ValueStatus.DELETED == getModelObject().getStatus()) { + cssClasses = " removed-value-background"; + } + return cssClasses; + })); + + } + + private void initLayout() { + initHeader(); + initValues(); + } + + private void initHeader() { + WebMarkupContainer labelContainer = new WebMarkupContainer(ID_LABEL_CONTAINER); + labelContainer.setOutputMarkupId(true); + + add(labelContainer); + + LoadableDetachableModel headerLabelModel = getLabelModel(); + AjaxButton labelComponent = new AjaxButton(ID_LABEL, headerLabelModel) { + private static final long serialVersionUID = 1L; + @Override + public void onClick(AjaxRequestTarget target) { + onExpandClick(target); + } + }; + labelComponent.setOutputMarkupId(true); + labelComponent.setOutputMarkupPlaceholderTag(true); + labelComponent.add(AttributeAppender.append("style", "cursor: pointer;")); + labelContainer.add(labelComponent); + + labelContainer.add(getHelpLabel()); + + initButtons(); + + //TODO always visible if isObject + } + + protected LoadableDetachableModel getLabelModel() { + return getPageBase().createStringResource(getModel().getObject().getDisplayName()); + } + + private void initValues() { + + createNonContainersPanel(); + + createContainersPanel(); + + } + + private , ID extends ItemDefinition, IW extends ItemWrapper> void createNonContainersPanel() { + WebMarkupContainer propertiesLabel = new WebMarkupContainer(ID_PROPERTIES_LABEL); + propertiesLabel.setOutputMarkupId(true); + + IModel> nonContainerWrappers = createNonContainerWrappersModel(); + + ListView properties = new ListView("properties", nonContainerWrappers) { + + private static final long serialVersionUID = 1L; + + @Override + protected void populateItem(final ListItem item) { + populateNonContainer(item); + } + }; + properties.setReuseItems(true); + properties.setOutputMarkupId(true); + add(propertiesLabel); + propertiesLabel.add(properties); + + AjaxButton labelShowEmpty = new AjaxButton(ID_SHOW_EMPTY_BUTTON) { + private static final long serialVersionUID = 1L; + @Override + public void onClick(AjaxRequestTarget target) { + onShowEmptyClick(target); + } + + @Override + public IModel getBody() { + return getNameOfShowEmptyButton(); + } + }; + labelShowEmpty.setOutputMarkupId(true); + labelShowEmpty.add(AttributeAppender.append("style", "cursor: pointer;")); + labelShowEmpty.add(new VisibleEnableBehaviour() { + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible() { + return nonContainerWrappers.getObject() != null && !nonContainerWrappers.getObject().isEmpty() + && getModelObject().isExpanded();// && !model.getObject().isShowEmpty(); + } + }); + add(labelShowEmpty); + } + + private void createContainersPanel() { + ListView> containers = new ListView>("containers", new PropertyModel<>(getModel(), "containers")) { + private static final long serialVersionUID = 1L; + + @Override + protected void populateItem(final ListItem> item) { + populateContainer(item); + } + }; + + containers.setReuseItems(true); + containers.setOutputMarkupId(true); + add(containers); + + } + + private > IModel> createNonContainerWrappersModel() { + return new IModel>() { + + private static final long serialVersionUID = 1L; + + @Override + public List getObject() { + return getNonContainerWrappers(); + } + }; + } + + private > List getNonContainerWrappers() { + CVW containerValueWrapper = getModelObject(); + List> nonContainers = containerValueWrapper.getNonContainers(); + + Locale locale = WebModelServiceUtils.getLocale(); + if (locale == null) { + locale = Locale.getDefault(); + } + Collator collator = Collator.getInstance(locale); + collator.setStrength(Collator.SECONDARY); // e.g. "a" should be different from "รก" + collator.setDecomposition(Collator.FULL_DECOMPOSITION); + ItemWrapperComparator comparator = new ItemWrapperComparator<>(collator, getModelObject().isSorted()); + if (CollectionUtils.isNotEmpty(nonContainers)) { + nonContainers.sort((Comparator) comparator); + + int visibleProperties = 0; + + for (ItemWrapper item : nonContainers) { + if (item.isVisible(containerValueWrapper, getVisibilityHandler())) { + visibleProperties++; + } + + if (visibleProperties % 2 == 0) { + item.setStripe(false); + } else { + item.setStripe(true); + } + + } + } + + return (List) nonContainers; + } + + private ItemVisibilityHandler getVisibilityHandler() { + if (settings == null) { + return null; + } + + return settings.getVisibilityHandler(); + } + + private ItemEditabilityHandler getReadabilityHandler() { + if (settings == null) { + return null; + } + + return settings.getEditabilityHandler(); + } + + private ItemMandatoryHandler getMandatoryHandler() { + if (settings == null) { + return null; + } + return settings.getMandatoryHandler(); + } + + private boolean isShowOnTopLevel() { + if (settings == null) { + return false; + } + + return settings.isShowOnTopLevel(); + } + + private > void populateNonContainer(ListItem item) { + item.setOutputMarkupId(true); + IW itemWrapper = item.getModelObject(); + try { + QName typeName = itemWrapper.getTypeName(); + if(item.getModelObject() instanceof ResourceAttributeWrapper) { + typeName = new QName("ResourceAttributeDefinition"); + } + + ItemPanelSettingsBuilder builder = new ItemPanelSettingsBuilder() + .visibilityHandler(getVisibilityHandler()) + .editabilityHandler(getReadabilityHandler()) + .mandatoryHandler(getMandatoryHandler()) + .showOnTopLevel(isShowOnTopLevel()); + Panel panel = getPageBase().initItemPanel("property", typeName, item.getModel(), builder.build()); + panel.setOutputMarkupId(true); + panel.add(new VisibleEnableBehaviour() { + + private static final long serialVersionUID = 1L; + + //TODO decide if we need to set enable behavior here + //see also ItemPanel.getEnableBehaviourOfValuePanel(), may be it's enough +// @Override +// public boolean isEnabled() { +// return !item.getModelObject().isReadOnly(); +// } + + @Override + public boolean isVisible() { + CVW parent = PrismContainerValuePanel.this.getModelObject(); + return item.getModelObject().isVisible(parent, getVisibilityHandler()); + } + }); + item.add(panel); + } catch (SchemaException e1) { + throw new SystemException("Cannot instantiate " + itemWrapper.getTypeName()); + } + + item.add(AttributeModifier.append("class", createStyleClassModel(item.getModel()))); + } + + private void populateContainer(ListItem> container) { + PrismContainerWrapper itemWrapper = container.getModelObject(); + try { +// ItemPanelSettingsBuilder builder = new ItemPanelSettingsBuilder().visibilityHandler(getVisibilityHandler()); + Panel panel = getPageBase().initItemPanel("container", itemWrapper.getTypeName(), container.getModel(), settings); + panel.setOutputMarkupId(true); +// panel.add(new VisibleBehaviour(() -> { +// CVW parent = PrismContainerValuePanel.this.getModelObject(); +// return container.getModelObject().isVisible(parent, visibilityHandler); +// })); + container.add(panel); + } catch (SchemaException e) { + throw new SystemException("Cannot instantiate panel for: " + itemWrapper.getDisplayName()); + } + + } + + private StringResourceModel getNameOfShowEmptyButton() { + return getPageBase().createStringResource("ShowEmptyButton.showMore.${showEmpty}", getModel()); + + } + + private void onShowEmptyClick(AjaxRequestTarget target) { + + PrismContainerValueWrapper wrapper = getModelObject(); + wrapper.setShowEmpty(!wrapper.isShowEmpty()); + refreshPanel(target); + } + + private > IModel createStyleClassModel(final IModel wrapper) { + return new IModel() { + private static final long serialVersionUID = 1L; + + @Override + public String getObject() { + ItemWrapper property = wrapper.getObject(); + return property.isStripe() ? "stripe" : null; + } + }; + } + + private void initButtons() { + initExpandCollapseButton(); + initMetadataButton(); + initSortButton(); + initAddMoreButton(); + initRemoveButton(); + } + + private void onExpandClick(AjaxRequestTarget target) { + + CVW wrapper = getModelObject(); + wrapper.setExpanded(!wrapper.isExpanded()); + refreshPanel(target); + } + + protected Label getHelpLabel() { + + Label help = new Label(ID_HELP); + help.add(AttributeModifier.replace("title", LambdaModel.of(getModel(), CVW::getHelpText))); + help.add(new InfoTooltipBehavior()); + help.add(new VisibleBehaviour(() -> StringUtils.isNotEmpty(getModelObject().getHelpText()))); + help.setOutputMarkupId(true); + return help; + } + + private void initMetadataButton() { + ToggleIconButton showMetadataButton = new ToggleIconButton(ID_SHOW_METADATA, + GuiStyleConstants.CLASS_ICON_SHOW_METADATA, GuiStyleConstants.CLASS_ICON_SHOW_METADATA) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + onShowMetadataClicked(target); + } + + @Override + public boolean isOn() { + return PrismContainerValuePanel.this.getModelObject().isShowMetadata(); + } + + + }; + showMetadataButton.add(new AttributeModifier("title", new StringResourceModel("PrismContainerValuePanel.showMetadata.${showMetadata}", getModel()))); + showMetadataButton.add(new VisibleBehaviour(() -> getModelObject().hasMetadata() && shouldBeButtonsShown())); + showMetadataButton.setOutputMarkupId(true); + showMetadataButton.setOutputMarkupPlaceholderTag(true); + add(showMetadataButton); + + } + + private void initSortButton() { + ToggleIconButton sortPropertiesButton = new ToggleIconButton(ID_SORT_PROPERTIES, + GuiStyleConstants.CLASS_ICON_SORT_ALPHA_ASC, GuiStyleConstants.CLASS_ICON_SORT_AMOUNT_ASC) { + + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + onSortClicked(target); + } + + @Override + public boolean isOn() { + return PrismContainerValuePanel.this.getModelObject().isSorted(); + } + }; + sortPropertiesButton.add(new VisibleBehaviour(() -> shouldBeButtonsShown())); + sortPropertiesButton.setOutputMarkupId(true); + sortPropertiesButton.setOutputMarkupPlaceholderTag(true); + add(sortPropertiesButton); + } + + private void initAddMoreButton() { + + AjaxLink addChildContainerButton = new AjaxLink(ID_ADD_CHILD_CONTAINER, new StringResourceModel("PrismContainerValuePanel.addMore")) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + initMoreContainersPopup(target); + } + }; + + addChildContainerButton.add(new VisibleEnableBehaviour() { + + private static final long serialVersionUID = 1L; + + @Override + public boolean isEnabled() { + if (getModelObject() != null) { + if(getModelObject().getParent() != null) { + return !getModelObject().getParent().isReadOnly(); + } else { + return !getModelObject().isReadOnly(); + } + } + return false; + } + + @Override + public boolean isVisible() { + return shouldBeButtonsShown() && getModelObject()!= null && getModelObject().isHeterogenous(); + } + }); + addChildContainerButton.setOutputMarkupId(true); + addChildContainerButton.setOutputMarkupPlaceholderTag(true); + add(addChildContainerButton); + + } + + private void initMoreContainersPopup(AjaxRequestTarget parentTarget) { + + + ListContainersPopup listContainersPopup = new ListContainersPopup(getPageBase().getMainPopupBodyId(), getModel()) { + + private static final long serialVersionUID = 1L; + + @Override + protected void processSelectedChildren(AjaxRequestTarget target, List> selected) { + prepareNewContainers(target, selected); + } + + }; + listContainersPopup.setOutputMarkupId(true); + + getPageBase().showMainPopup(listContainersPopup, parentTarget); + } + + private void prepareNewContainers(AjaxRequestTarget target, List> containers) { + getPageBase().hideMainPopup(target); + + Task task = getPageBase().createSimpleTask("Create child containers"); + WrapperContext ctx = new WrapperContext(task, task.getResult()); + containers.forEach(container -> { + try { + ItemWrapper iw = getPageBase().createItemWrapper(container, getModelObject(), ctx); + if (iw != null) { + ((List) getModelObject().getItems()).add(iw); + } + } catch (SchemaException e) { + OperationResult result = ctx.getResult(); + result.recordFatalError(createStringResource("PrismContainerValuePanel.message.prepareNewContainers.fatalError", container).getString(), e); + getPageBase().showResult(ctx.getResult()); + } + }); + + refreshPanel(target); + + } + + private void initRemoveButton() { + AjaxLink removeContainerButton = new AjaxLink(ID_REMOVE_CONTAINER) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + try { + removePerformed(PrismContainerValuePanel.this.getModelObject(), target); + } catch (SchemaException e) { + e.printStackTrace(); + } + } + + }; + + removeContainerButton.add(new VisibleEnableBehaviour() { + + private static final long serialVersionUID = 1L; + + @Override + public boolean isEnabled() { + if (getModelObject() != null) { + if(getModelObject().getParent() != null) { + return !getModelObject().getParent().isReadOnly(); + } else { + return !getModelObject().isReadOnly(); + } + } + return false; + } + + @Override + public boolean isVisible() { + return shouldBeButtonsShown(); + } + }); + add(removeContainerButton); + + } + + protected void removePerformed(CVW containerValueWrapper, AjaxRequestTarget target) throws SchemaException { + + } + + private boolean shouldBeButtonsShown() { + return getModelObject().isExpanded(); + } + + private void onSortClicked(AjaxRequestTarget target) { + CVW wrapper = getModelObject(); + wrapper.setSorted(!wrapper.isSorted()); + + refreshPanel(target); + } + + private void onShowMetadataClicked(AjaxRequestTarget target) { + CVW wrapper = getModelObject(); + wrapper.setShowMetadata(!wrapper.isShowMetadata()); + refreshPanel(target); + } + + + private void refreshPanel(AjaxRequestTarget target) { + target.add(PrismContainerValuePanel.this); + target.add(getPageBase().getFeedbackPanel()); + } + + protected void initExpandCollapseButton() { + ToggleIconButton expandCollapseButton = new ToggleIconButton(ID_EXPAND_COLLAPSE_BUTTON, + GuiStyleConstants.CLASS_ICON_EXPAND_CONTAINER, GuiStyleConstants.CLASS_ICON_COLLAPSE_CONTAINER) { + + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + onExpandClick(target); + } + + @Override + public boolean isOn() { + return PrismContainerValuePanel.this.getModelObject().isExpanded(); + } + }; + expandCollapseButton.setOutputMarkupId(true); + add(expandCollapseButton); + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismPropertyPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismPropertyPanel.java index caef89e4861..2b9238bd82b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismPropertyPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismPropertyPanel.java @@ -1,235 +1,235 @@ -/* - * Copyright (c) 2010-2019 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ - -package com.evolveum.midpoint.gui.impl.prism; - -import com.evolveum.midpoint.gui.api.Validatable; -import com.evolveum.midpoint.gui.api.factory.GuiComponentFactory; -import com.evolveum.midpoint.gui.api.prism.PrismObjectWrapper; -import com.evolveum.midpoint.gui.impl.error.ErrorPanel; -import com.evolveum.midpoint.gui.impl.factory.PrismPropertyPanelContext; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.LoggingUtils; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.component.message.FeedbackAlerts; -import com.evolveum.midpoint.web.component.prism.InputPanel; -import com.evolveum.midpoint.web.component.util.EnableBehaviour; -import com.evolveum.midpoint.web.util.ExpressionValidator; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import org.apache.wicket.AttributeModifier; -import org.apache.wicket.Component; -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; -import org.apache.wicket.feedback.ComponentFeedbackMessageFilter; -import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.FormComponent; -import org.apache.wicket.markup.html.form.TextField; -import org.apache.wicket.markup.html.list.ListItem; -import org.apache.wicket.markup.html.panel.Panel; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.LambdaModel; - -import java.util.List; - -/** - * @author katkav - */ -public class PrismPropertyPanel extends ItemPanel, PrismPropertyWrapper> { - - private static final long serialVersionUID = 1L; - private static final Trace LOGGER = TraceManager.getTrace(PrismPropertyPanel.class); - - private static final String ID_HEADER = "header"; - - private static final String ID_FEEDBACK = "feedback"; - private static final String ID_VALUE_CONTAINER = "valueContainer"; - - private static final String ID_FORM = "form"; - private static final String ID_INPUT = "input"; - - - /** - * @param id - * @param model - */ - public PrismPropertyPanel(String id, IModel> model, ItemPanelSettings settings) { - super(id, model, settings); - } - - - @Override - protected Panel createHeaderPanel() { - return new PrismPropertyHeaderPanel<>(ID_HEADER, getModel()); - } - - - @Override - protected Component createValuePanel(ListItem> item, GuiComponentFactory factory, - ItemVisibilityHandler visibilityHandler, ItemEditabilityHandler editabilityHandler) { - - return createInputPanel(item, factory); - - - - } - - private WebMarkupContainer createInputPanel(ListItem> item, GuiComponentFactory factory) { - - WebMarkupContainer valueContainer = new WebMarkupContainer(ID_VALUE_CONTAINER); - valueContainer.setOutputMarkupId(true); - item.add(valueContainer); - // feedback - FeedbackAlerts feedback = new FeedbackAlerts(ID_FEEDBACK); - feedback.setOutputMarkupId(true); - item.add(feedback); - - PrismPropertyWrapper modelObject = getModelObject(); - - LOGGER.trace("create input component for: {}", modelObject.debugDump()); - - Panel component = null; - - Form form = new Form<>(ID_FORM); - valueContainer.add(form); - - if (factory == null) { - if (getPageBase().getApplication().usesDevelopmentConfig()) { - form.add(new ErrorPanel(ID_INPUT, createStringResource("Cannot create component for: " + modelObject.getItem()))); - } else { - Label noComponent = new Label(ID_INPUT); - noComponent.setVisible(false); - form.add(noComponent); - } - return valueContainer; - } - - if (factory != null) { - - PrismPropertyPanelContext panelCtx = new PrismPropertyPanelContext(getModel()); - panelCtx.setForm(form); - panelCtx.setRealValueModel(item.getModel()); - panelCtx.setComponentId(ID_INPUT); - panelCtx.setParentComponent(this); - - try { - component = factory.createPanel(panelCtx); - form.add(component); - } catch (Throwable e) { - LoggingUtils.logUnexpectedException(LOGGER, "Cannot create panel", e); - getSession().error("Cannot create panel"); - throw new RuntimeException(e); - } - } - - if (component instanceof Validatable) { - Validatable inputPanel = (Validatable) component; - // adding valid from/to date range validator, if necessary - ExpressionValidator expressionValidator = new ExpressionValidator( - LambdaModel.of(modelObject::getFormComponentValidator), getPageBase()) { - - private static final long serialVersionUID = 1L; - - @Override - protected O getObjectType() { - return getObject(); - } - }; - inputPanel.getValidatableComponent().add(expressionValidator); - - inputPanel.getValidatableComponent().add(new AjaxFormComponentUpdatingBehavior("change") { - - private static final long serialVersionUID = 1L; - - @Override - protected void onUpdate(AjaxRequestTarget target) { - target.add(getPageBase().getFeedbackPanel()); - target.add(feedback); - } - - @Override - protected void onError(AjaxRequestTarget target, RuntimeException e) { - target.add(getPageBase().getFeedbackPanel()); - target.add(feedback); - } - - }); - feedback.setFilter(new ComponentFeedbackMessageFilter(inputPanel.getValidatableComponent())); - } else { - feedback.setFilter(new ComponentFeedbackMessageFilter(component)); - } - - if (component instanceof InputPanel) { - InputPanel inputPanel = (InputPanel) component; - - final List formComponents = inputPanel.getFormComponents(); - for (FormComponent formComponent : formComponents) { - IModel label = LambdaModel.of(modelObject::getDisplayName); - formComponent.setLabel(label); - formComponent.setRequired(modelObject.isMandatory()); - - if (formComponent instanceof TextField) { - formComponent.add(new AttributeModifier("size", "42")); - } - formComponent.add(new AjaxFormComponentUpdatingBehavior("change") { - - private static final long serialVersionUID = 1L; - - @Override - protected void onUpdate(AjaxRequestTarget target) { - target.add(getPageBase().getFeedbackPanel()); - target.add(feedback); - } - - @Override - protected void onError(AjaxRequestTarget target, RuntimeException e) { - target.add(getPageBase().getFeedbackPanel()); - target.add(feedback); - } - - }); - formComponent.add(new EnableBehaviour(() -> itemPanelSettings == null || itemPanelSettings.getEditabilityHandler() == null || - itemPanelSettings.getEditabilityHandler().isEditable(getModelObject()))); - } - - - } - if (component == null) { - WebMarkupContainer cont = new WebMarkupContainer(ID_INPUT); - cont.setOutputMarkupId(true); - return cont; - } - return valueContainer; - - } - - private , O extends ObjectType, C extends Containerable> O getObject() { - - OW objectWrapper = getModelObject().findObjectWrapper(); - if (objectWrapper == null) { - return null; - } - - try { - PrismObject objectNew = objectWrapper.getObjectApplyDelta(); - return objectNew.asObjectable(); - } catch (SchemaException e) { - LOGGER.error("Cannot apply deltas to object for validation: {}", e.getMessage(), e); - return null; - } - } - - @Override - protected PV createNewValue(PrismPropertyWrapper itemWrapper) { - return (PV) getPrismContext().itemFactory().createPropertyValue(); - } -} +/* + * Copyright (c) 2010-2019 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.gui.impl.prism; + +import com.evolveum.midpoint.gui.api.Validatable; +import com.evolveum.midpoint.gui.api.factory.GuiComponentFactory; +import com.evolveum.midpoint.gui.api.prism.PrismObjectWrapper; +import com.evolveum.midpoint.gui.impl.error.ErrorPanel; +import com.evolveum.midpoint.gui.impl.factory.PrismPropertyPanelContext; +import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.LoggingUtils; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.component.message.FeedbackAlerts; +import com.evolveum.midpoint.web.component.prism.InputPanel; +import com.evolveum.midpoint.web.component.util.EnableBehaviour; +import com.evolveum.midpoint.web.util.ExpressionValidator; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import org.apache.wicket.AttributeModifier; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; +import org.apache.wicket.feedback.ComponentFeedbackMessageFilter; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.FormComponent; +import org.apache.wicket.markup.html.form.TextField; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.LambdaModel; + +import java.util.List; + +/** + * @author katkav + */ +public class PrismPropertyPanel extends ItemPanel, PrismPropertyWrapper> { + + private static final long serialVersionUID = 1L; + private static final Trace LOGGER = TraceManager.getTrace(PrismPropertyPanel.class); + + private static final String ID_HEADER = "header"; + + private static final String ID_FEEDBACK = "feedback"; + private static final String ID_VALUE_CONTAINER = "valueContainer"; + + private static final String ID_FORM = "form"; + private static final String ID_INPUT = "input"; + + + /** + * @param id + * @param model + */ + public PrismPropertyPanel(String id, IModel> model, ItemPanelSettings settings) { + super(id, model, settings); + } + + + @Override + protected Panel createHeaderPanel() { + return new PrismPropertyHeaderPanel<>(ID_HEADER, getModel()); + } + + + @Override + protected Component createValuePanel(ListItem> item, GuiComponentFactory factory, + ItemVisibilityHandler visibilityHandler, ItemEditabilityHandler editabilityHandler) { + + return createInputPanel(item, factory); + + + + } + + private WebMarkupContainer createInputPanel(ListItem> item, GuiComponentFactory factory) { + + WebMarkupContainer valueContainer = new WebMarkupContainer(ID_VALUE_CONTAINER); + valueContainer.setOutputMarkupId(true); + item.add(valueContainer); + // feedback + FeedbackAlerts feedback = new FeedbackAlerts(ID_FEEDBACK); + feedback.setOutputMarkupId(true); + item.add(feedback); + + PrismPropertyWrapper modelObject = getModelObject(); + + LOGGER.trace("create input component for: {}", modelObject.debugDump()); + + Panel component = null; + + Form form = new Form<>(ID_FORM); + valueContainer.add(form); + + if (factory == null) { + if (getPageBase().getApplication().usesDevelopmentConfig()) { + form.add(new ErrorPanel(ID_INPUT, createStringResource("Cannot create component for: " + modelObject.getItem()))); + } else { + Label noComponent = new Label(ID_INPUT); + noComponent.setVisible(false); + form.add(noComponent); + } + return valueContainer; + } + + if (factory != null) { + + PrismPropertyPanelContext panelCtx = new PrismPropertyPanelContext(getModel()); + panelCtx.setForm(form); + panelCtx.setRealValueModel(item.getModel()); + panelCtx.setComponentId(ID_INPUT); + panelCtx.setParentComponent(this); + + try { + component = factory.createPanel(panelCtx); + form.add(component); + } catch (Throwable e) { + LoggingUtils.logUnexpectedException(LOGGER, "Cannot create panel", e); + getSession().error("Cannot create panel"); + throw new RuntimeException(e); + } + } + + if (component instanceof Validatable) { + Validatable inputPanel = (Validatable) component; + // adding valid from/to date range validator, if necessary + ExpressionValidator expressionValidator = new ExpressionValidator( + LambdaModel.of(modelObject::getFormComponentValidator), getPageBase()) { + + private static final long serialVersionUID = 1L; + + @Override + protected O getObjectType() { + return getObject(); + } + }; + inputPanel.getValidatableComponent().add(expressionValidator); + + inputPanel.getValidatableComponent().add(new AjaxFormComponentUpdatingBehavior("change") { + + private static final long serialVersionUID = 1L; + + @Override + protected void onUpdate(AjaxRequestTarget target) { + target.add(getPageBase().getFeedbackPanel()); + target.add(feedback); + } + + @Override + protected void onError(AjaxRequestTarget target, RuntimeException e) { + target.add(getPageBase().getFeedbackPanel()); + target.add(feedback); + } + + }); + feedback.setFilter(new ComponentFeedbackMessageFilter(inputPanel.getValidatableComponent())); + } else { + feedback.setFilter(new ComponentFeedbackMessageFilter(component)); + } + + if (component instanceof InputPanel) { + InputPanel inputPanel = (InputPanel) component; + + final List formComponents = inputPanel.getFormComponents(); + for (FormComponent formComponent : formComponents) { + IModel label = LambdaModel.of(modelObject::getDisplayName); + formComponent.setLabel(label); + formComponent.setRequired(getMandatoryHandler() == null ? modelObject.isMandatory() : getMandatoryHandler().isMandatory(modelObject)); + + if (formComponent instanceof TextField) { + formComponent.add(new AttributeModifier("size", "42")); + } + formComponent.add(new AjaxFormComponentUpdatingBehavior("change") { + + private static final long serialVersionUID = 1L; + + @Override + protected void onUpdate(AjaxRequestTarget target) { + target.add(getPageBase().getFeedbackPanel()); + target.add(feedback); + } + + @Override + protected void onError(AjaxRequestTarget target, RuntimeException e) { + target.add(getPageBase().getFeedbackPanel()); + target.add(feedback); + } + + }); + formComponent.add(new EnableBehaviour(() -> getEditabilityHandler() == null || + getEditabilityHandler().isEditable(getModelObject()))); + } + + + } + if (component == null) { + WebMarkupContainer cont = new WebMarkupContainer(ID_INPUT); + cont.setOutputMarkupId(true); + return cont; + } + return valueContainer; + + } + + private , O extends ObjectType, C extends Containerable> O getObject() { + + OW objectWrapper = getModelObject().findObjectWrapper(); + if (objectWrapper == null) { + return null; + } + + try { + PrismObject objectNew = objectWrapper.getObjectApplyDelta(); + return objectNew.asObjectable(); + } catch (SchemaException e) { + LOGGER.error("Cannot apply deltas to object for validation: {}", e.getMessage(), e); + return null; + } + } + + @Override + protected PV createNewValue(PrismPropertyWrapper itemWrapper) { + return (PV) getPrismContext().itemFactory().createPropertyValue(); + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java index 16bdd93a6d0..97c36943e6b 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java @@ -920,7 +920,7 @@ public void saveOrPreviewPerformed(AjaxRequestTarget target, OperationResult res LOGGER.trace("returning from saveOrPreviewPerformed"); } - + protected boolean processDeputyAssignments(boolean previewOnly){ return false; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTask.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTask.java index 1d4ae1cc2f1..5314b297b71 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTask.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTask.java @@ -4,9 +4,19 @@ import java.util.Collection; import java.util.Collections; +import com.evolveum.midpoint.gui.impl.prism.PrismPropertyValueWrapper; +import com.evolveum.midpoint.gui.impl.prism.PrismReferenceValueWrapperImpl; +import com.evolveum.midpoint.gui.impl.prism.PrismReferenceWrapper; +import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipal; import com.evolveum.midpoint.model.api.util.ModelContextUtil; +import com.evolveum.midpoint.prism.Referencable; import com.evolveum.midpoint.schema.ObjectDeltaOperation; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.web.security.util.SecurityUtils; + +import org.apache.commons.collections4.CollectionUtils; import org.apache.wicket.Page; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.AttributeAppender; @@ -417,8 +427,12 @@ public void saveAndRunPerformed(AjaxRequestTarget target) { try { PrismPropertyWrapper executionStatus = taskWrapper.findProperty(ItemPath.create(TaskType.F_EXECUTION_STATUS)); executionStatus.getValue().setRealValue(TaskExecutionStatusType.RUNNABLE); + + setupOwner(taskWrapper); + setupRecurrence(taskWrapper); + } catch (SchemaException e) { - LoggingUtils.logUnexpectedException(LOGGER, "Error while setting task execution status", e); + LoggingUtils.logUnexpectedException(LOGGER, "Error while finishing task settings.", e); target.add(getFeedbackPanel()); return; } @@ -432,6 +446,45 @@ public void saveAndRunPerformed(AjaxRequestTarget target) { super.savePerformed(target); } + private void setupOwner(PrismObjectWrapper taskWrapper) throws SchemaException { + PrismReferenceWrapper taskOwner = taskWrapper.findReference(ItemPath.create(TaskType.F_OWNER_REF)); + if (taskOwner == null) { + return; + } + PrismReferenceValueWrapperImpl taskOwnerValue = taskOwner.getValue(); + if (taskOwnerValue == null){ + return; + } + + if (taskOwnerValue.getNewValue() == null || taskOwnerValue.getNewValue().isEmpty()) { + GuiProfiledPrincipal guiPrincipal = SecurityUtils.getPrincipalUser(); + if (guiPrincipal == null) { + //BTW something very strange must happened + return; + } + FocusType focus = guiPrincipal.getFocus(); + taskOwnerValue.setRealValue(ObjectTypeUtil.createObjectRef(focus, SchemaConstants.ORG_DEFAULT)); + } + } + + private void setupRecurrence(PrismObjectWrapper taskWrapper) throws SchemaException { + PrismPropertyWrapper recurrenceWrapper = taskWrapper.findProperty(ItemPath.create(TaskType.F_RECURRENCE)); + if (recurrenceWrapper == null) { + return; + } + + PrismPropertyValueWrapper recurrenceWrapperValue = recurrenceWrapper.getValue(); + if (recurrenceWrapperValue == null) { + return; + } + + if (recurrenceWrapperValue.getNewValue() == null || recurrenceWrapperValue.getNewValue().isEmpty()) { + recurrenceWrapperValue.setRealValue(TaskRecurrenceType.SINGLE); + } + + + } + @Override public void finishProcessing(AjaxRequestTarget target, Collection> executedDeltas, boolean returningFromAsync, OperationResult result) { if (isPreviewRequested()) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskMainPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskMainPanel.java index 419a26d1f1e..3997039e422 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskMainPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskMainPanel.java @@ -1,357 +1,420 @@ -/* - * Copyright (c) 2010-2017 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.web.page.admin.server; - -import com.evolveum.midpoint.gui.api.ComponentConstants; -import com.evolveum.midpoint.gui.api.component.tabs.PanelTab; -import com.evolveum.midpoint.gui.api.model.LoadableModel; -import com.evolveum.midpoint.gui.api.prism.ItemStatus; -import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; -import com.evolveum.midpoint.gui.api.prism.PrismObjectWrapper; -import com.evolveum.midpoint.gui.api.util.ObjectTabVisibleBehavior; -import com.evolveum.midpoint.gui.api.util.WebComponentUtil; -import com.evolveum.midpoint.gui.impl.prism.ItemEditabilityHandler; -import com.evolveum.midpoint.gui.impl.prism.ItemPanelSettingsBuilder; -import com.evolveum.midpoint.gui.impl.prism.ItemVisibilityHandler; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.component.AjaxSubmitButton; -import com.evolveum.midpoint.web.component.objectdetails.AbstractObjectMainPanel; -import com.evolveum.midpoint.web.component.objectdetails.AssignmentHolderTypeMainPanel; -import com.evolveum.midpoint.web.component.prism.ItemVisibility; -import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.model.PrismContainerWrapperModel; -import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; - -import org.apache.wicket.ajax.AjaxRequestTarget; -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.IModel; -import org.apache.wicket.model.Model; - -import javax.xml.namespace.QName; -import java.util.ArrayList; -import java.util.List; - -public class TaskMainPanel extends AssignmentHolderTypeMainPanel { - - private static final transient Trace LOGGER = TraceManager.getTrace(TaskMainPanel.class); - - private static final String ID_SAVE_AND_RUN = "saveAndRun"; - private static final String ID_FORM = "taskForm"; - - public TaskMainPanel(String id, LoadableModel> objectModel, PageAdminObjectDetails parentPage) { - super(id, objectModel, parentPage); - } - - @Override - protected boolean getOptionsPanelVisibility() { - return false; - } - - @Override - protected void initLayoutButtons(PageAdminObjectDetails parentPage) { - super.initLayoutButtons(parentPage); - initLayoutSaveAndRunButton(); - } - - @Override - protected List createTabs(PageAdminObjectDetails parentPage) { - List tabs = new ArrayList<>(); - TaskTabsVisibility taskTabsVisibility = new TaskTabsVisibility(); - taskTabsVisibility.computeAll((PageTask) parentPage, getObjectWrapper()); - - ObjectTabVisibleBehavior basicTabVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_BASIC_URL, (PageTask) parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isBasicVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTask.basic.title"), basicTabVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - ItemVisibilityHandler visibilityHandler = wrapper -> getBasicTabVisibility(wrapper.getPath()); - return createContainerPanel(panelId, TaskType.COMPLEX_TYPE, getObjectModel(), visibilityHandler); - } - }); - - ObjectTabVisibleBehavior scheduleTabVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_SCHEDULE_URL, parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isSchedulingVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTask.schedule.title"), scheduleTabVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - ItemVisibilityHandler visibilityHandler = wrapper -> ItemVisibility.AUTO; - return createContainerPanel(panelId, TaskType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getObjectModel(), TaskType.F_SCHEDULE), visibilityHandler); - } - }); - - ObjectTabVisibleBehavior workManagementTabVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_WORK_MANAGEMENT_URL, parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isWorkManagementVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTask.workManagement.title"), workManagementTabVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - ItemVisibilityHandler visibilityHandler = wrapper -> ItemVisibility.AUTO; - return createContainerPanel(panelId, TaskType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getObjectModel(), TaskType.F_WORK_MANAGEMENT), visibilityHandler); - } - }); - - ObjectTabVisibleBehavior cleanupPoliciesTabVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_CLEANUP_POLICIES_URL, parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isCleanupPolicyVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTask.cleanupPolicies.title"), cleanupPoliciesTabVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - ItemVisibilityHandler visibilityHandler = wrapper -> ItemVisibility.AUTO; - return createContainerPanel(panelId, TaskType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getObjectModel(), ItemPath.create(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_CLEANUP_POLICIES)), visibilityHandler); - } - }); - - ObjectTabVisibleBehavior subtasksTabVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_SUBTASKS_URL, parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isSubtasksAndThreadsVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTask.subtasks.title"), subtasksTabVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - return new TaskSubtasksAndThreadsTabPanel(panelId, getObjectModel()); - } - - }); - - ObjectTabVisibleBehavior operationStatsAndInternalPerfTabsVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_OPERATION_STATISTICS_URL, parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isInternalPerformanceVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTask.operationStats.title"), operationStatsAndInternalPerfTabsVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - return new TaskOperationStatisticsPanel(panelId, getObjectModel()); - } - - }); - - ObjectTabVisibleBehavior envPerfTabVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_ENVIRONMENTAL_PERFORMANCE_URL, parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isEnvironmentalPerformanceVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTask.environmentalPerformance.title"), envPerfTabVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - return new TaskPerformanceTabPanel(panelId, getObjectModel()); - } - - }); - - ObjectTabVisibleBehavior operationTabVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_OPERATION_URL, parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isOperationVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTaskEdit.operation"), operationTabVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - return new TaskOperationTabPanel(panelId, PrismContainerWrapperModel.fromContainerWrapper(getObjectModel(), TaskType.F_MODEL_OPERATION_CONTEXT)); - } - }); - - ObjectTabVisibleBehavior internalPerfTabsVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_INTERNAL_PERFORMANCE_URL, parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isInternalPerformanceVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTask.internalPerformance.title"), internalPerfTabsVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - return new TaskInternalPerformanceTabPanel(panelId, PrismContainerWrapperModel.fromContainerWrapper(getObjectModel(), TaskType.F_OPERATION_STATS)); - } - }); - - ObjectTabVisibleBehavior resultTabVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_RESULT_URL, parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isResultVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTask.result.title"), resultTabVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - return new TaskResultTabPanel(panelId, getObjectModel()); - } - }); - - - ObjectTabVisibleBehavior errorsTabVisibility = new ObjectTabVisibleBehavior - (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_ERRORS_URL, parentPage){ - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible(){ - return super.isVisible() && taskTabsVisibility.isErrorsVisible(); - } - }; - tabs.add(new PanelTab(parentPage.createStringResource("pageTask.errors.title"), errorsTabVisibility) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - return new TaskErrorsTabPanel(panelId, getObjectModel()); - } - }); - - return tabs; - } - - protected void initLayoutSaveAndRunButton() { - AjaxSubmitButton saveButton = new AjaxSubmitButton(ID_SAVE_AND_RUN, getDetailsPage().createStringResource("TaskMainPanel.button.saveAndRun")) { - private static final long serialVersionUID = 1L; - - @Override - protected void onSubmit(AjaxRequestTarget target) { - ((PageTask)getDetailsPage()).saveAndRunPerformed(target); - } - - @Override - protected void onError(AjaxRequestTarget target) { - target.add(getDetailsPage().getFeedbackPanel()); - } - }; - saveButton.add(new VisibleEnableBehaviour(){ - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible() { - return !getObjectWrapper().isReadOnly() && - !getDetailsPage().isForcedPreview(); - } - - @Override - public boolean isEnabled() { - return !ItemStatus.NOT_CHANGED.equals(getObjectWrapper().getStatus()) - || getObjectWrapper().canModify(); - } - }); - saveButton.setOutputMarkupId(true); - saveButton.setOutputMarkupPlaceholderTag(true); - getMainForm().add(saveButton); - } - - - private Panel createContainerPanel(String id, QName typeName, IModel> model, ItemVisibilityHandler visibilityHandler) { - try { - ItemPanelSettingsBuilder builder = new ItemPanelSettingsBuilder() - .visibilityHandler(visibilityHandler) - .editabilityHandler(getTaskEditabilityHandler()) - .showOnTopLevel(true); - Panel panel = getDetailsPage().initItemPanel(id, typeName, model, builder.build()); - return panel; - } catch (SchemaException e) { - LOGGER.error("Cannot create panel for {}, {}", typeName, e.getMessage(), e); - getSession().error("Cannot create panel for " + typeName); // TODO opertion result? localization? - } - - return null; - } - - private ItemVisibility getBasicTabVisibility(ItemPath path) { - if (ItemPath.create(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_CLEANUP_POLICIES).equivalent(path)) { - return ItemVisibility.HIDDEN; - } - return ItemVisibility.AUTO; - } - - - private ItemEditabilityHandler getTaskEditabilityHandler(){ - ItemEditabilityHandler editableHandler = wrapper -> !WebComponentUtil.isRunningTask(((PageTask)getDetailsPage()).getTask()); - return editableHandler; - } -} +/* + * Copyright (c) 2010-2017 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.page.admin.server; + +import com.evolveum.midpoint.gui.api.ComponentConstants; +import com.evolveum.midpoint.gui.api.component.tabs.PanelTab; +import com.evolveum.midpoint.gui.api.model.LoadableModel; +import com.evolveum.midpoint.gui.api.prism.ItemStatus; +import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; +import com.evolveum.midpoint.gui.api.prism.PrismObjectWrapper; +import com.evolveum.midpoint.gui.api.util.ObjectTabVisibleBehavior; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.gui.impl.prism.ItemEditabilityHandler; +import com.evolveum.midpoint.gui.impl.prism.ItemMandatoryHandler; +import com.evolveum.midpoint.gui.impl.prism.ItemPanelSettingsBuilder; +import com.evolveum.midpoint.gui.impl.prism.ItemVisibilityHandler; +import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.component.AjaxSubmitButton; +import com.evolveum.midpoint.web.component.objectdetails.AbstractObjectMainPanel; +import com.evolveum.midpoint.web.component.objectdetails.AssignmentHolderTypeMainPanel; +import com.evolveum.midpoint.web.component.prism.ItemVisibility; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.model.PrismContainerWrapperModel; +import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.wicket.ajax.AjaxRequestTarget; +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.IModel; +import org.apache.wicket.model.Model; + +import javax.xml.namespace.QName; +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class TaskMainPanel extends AssignmentHolderTypeMainPanel { + + private static final transient Trace LOGGER = TraceManager.getTrace(TaskMainPanel.class); + + private static final String ID_SAVE_AND_RUN = "saveAndRun"; + private static final String ID_FORM = "taskForm"; + + public TaskMainPanel(String id, LoadableModel> objectModel, PageAdminObjectDetails parentPage) { + super(id, objectModel, parentPage); + } + + @Override + protected boolean getOptionsPanelVisibility() { + return false; + } + + @Override + protected void initLayoutButtons(PageAdminObjectDetails parentPage) { + super.initLayoutButtons(parentPage); + initLayoutSaveAndRunButton(); + } + + @Override + protected List createTabs(PageAdminObjectDetails parentPage) { + List tabs = new ArrayList<>(); + TaskTabsVisibility taskTabsVisibility = new TaskTabsVisibility(); + taskTabsVisibility.computeAll((PageTask) parentPage, getObjectWrapper()); + + ObjectTabVisibleBehavior basicTabVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_BASIC_URL, (PageTask) parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isBasicVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTask.basic.title"), basicTabVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + ItemVisibilityHandler visibilityHandler = wrapper -> getBasicTabVisibility(wrapper.getPath()); + ItemEditabilityHandler editabilityHandler = wrapper -> getBasicTabEditability(wrapper.getPath()); + return createContainerPanel(panelId, TaskType.COMPLEX_TYPE, getObjectModel(), visibilityHandler, editabilityHandler); + } + }); + + ObjectTabVisibleBehavior scheduleTabVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_SCHEDULE_URL, parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isSchedulingVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTask.schedule.title"), scheduleTabVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + ItemVisibilityHandler visibilityHandler = wrapper -> ItemVisibility.AUTO; + return createContainerPanel(panelId, TaskType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getObjectModel(), TaskType.F_SCHEDULE), visibilityHandler, getTaskEditabilityHandler()); + } + }); + + ObjectTabVisibleBehavior workManagementTabVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_WORK_MANAGEMENT_URL, parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isWorkManagementVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTask.workManagement.title"), workManagementTabVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + ItemVisibilityHandler visibilityHandler = wrapper -> ItemVisibility.AUTO; + return createContainerPanel(panelId, TaskType.COMPLEX_TYPE, + PrismContainerWrapperModel.fromContainerWrapper(getObjectModel(), TaskType.F_WORK_MANAGEMENT), visibilityHandler, getTaskEditabilityHandler()); + } + }); + + ObjectTabVisibleBehavior cleanupPoliciesTabVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_CLEANUP_POLICIES_URL, parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isCleanupPolicyVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTask.cleanupPolicies.title"), cleanupPoliciesTabVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + ItemVisibilityHandler visibilityHandler = wrapper -> ItemVisibility.AUTO; + return createContainerPanel(panelId, TaskType.COMPLEX_TYPE, + PrismContainerWrapperModel.fromContainerWrapper(getObjectModel(), ItemPath.create(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_CLEANUP_POLICIES)), + visibilityHandler, getTaskEditabilityHandler()); + } + }); + + ObjectTabVisibleBehavior subtasksTabVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_SUBTASKS_URL, parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isSubtasksAndThreadsVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTask.subtasks.title"), subtasksTabVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + return new TaskSubtasksAndThreadsTabPanel(panelId, getObjectModel()); + } + + }); + + ObjectTabVisibleBehavior operationStatsAndInternalPerfTabsVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_OPERATION_STATISTICS_URL, parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isInternalPerformanceVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTask.operationStats.title"), operationStatsAndInternalPerfTabsVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + return new TaskOperationStatisticsPanel(panelId, getObjectModel()); + } + + }); + + ObjectTabVisibleBehavior envPerfTabVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_ENVIRONMENTAL_PERFORMANCE_URL, parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isEnvironmentalPerformanceVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTask.environmentalPerformance.title"), envPerfTabVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + return new TaskPerformanceTabPanel(panelId, getObjectModel()); + } + + }); + + ObjectTabVisibleBehavior operationTabVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_OPERATION_URL, parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isOperationVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTaskEdit.operation"), operationTabVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + return new TaskOperationTabPanel(panelId, PrismContainerWrapperModel.fromContainerWrapper(getObjectModel(), TaskType.F_MODEL_OPERATION_CONTEXT)); + } + }); + + ObjectTabVisibleBehavior internalPerfTabsVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_INTERNAL_PERFORMANCE_URL, parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isInternalPerformanceVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTask.internalPerformance.title"), internalPerfTabsVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + return new TaskInternalPerformanceTabPanel(panelId, PrismContainerWrapperModel.fromContainerWrapper(getObjectModel(), TaskType.F_OPERATION_STATS)); + } + }); + + ObjectTabVisibleBehavior resultTabVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_RESULT_URL, parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isResultVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTask.result.title"), resultTabVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + return new TaskResultTabPanel(panelId, getObjectModel()); + } + }); + + + ObjectTabVisibleBehavior errorsTabVisibility = new ObjectTabVisibleBehavior + (Model.of(getObjectWrapper().getObject()), ComponentConstants.UI_TASK_TAB_ERRORS_URL, parentPage){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return super.isVisible() && taskTabsVisibility.isErrorsVisible(); + } + }; + tabs.add(new PanelTab(parentPage.createStringResource("pageTask.errors.title"), errorsTabVisibility) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + return new TaskErrorsTabPanel(panelId, getObjectModel()); + } + }); + + return tabs; + } + + protected void initLayoutSaveAndRunButton() { + AjaxSubmitButton saveButton = new AjaxSubmitButton(ID_SAVE_AND_RUN, getDetailsPage().createStringResource("TaskMainPanel.button.saveAndRun")) { + private static final long serialVersionUID = 1L; + + @Override + protected void onSubmit(AjaxRequestTarget target) { + ((PageTask)getDetailsPage()).saveAndRunPerformed(target); + } + + @Override + protected void onError(AjaxRequestTarget target) { + target.add(getDetailsPage().getFeedbackPanel()); + } + }; + saveButton.add(new VisibleEnableBehaviour(){ + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible() { + return !getObjectWrapper().isReadOnly() && + !getDetailsPage().isForcedPreview(); + } + + @Override + public boolean isEnabled() { + return !ItemStatus.NOT_CHANGED.equals(getObjectWrapper().getStatus()) + || getObjectWrapper().canModify(); + } + }); + saveButton.setOutputMarkupId(true); + saveButton.setOutputMarkupPlaceholderTag(true); + getMainForm().add(saveButton); + } + + + private Panel createContainerPanel(String id, QName typeName, IModel> model, ItemVisibilityHandler visibilityHandler, ItemEditabilityHandler editabilityHandler) { + try { + ItemPanelSettingsBuilder builder = new ItemPanelSettingsBuilder() + .visibilityHandler(visibilityHandler) + .editabilityHandler(editabilityHandler) + .mandatoryHandler(getItemMandatoryHandler()) + .showOnTopLevel(true); + Panel panel = getDetailsPage().initItemPanel(id, typeName, model, builder.build()); + return panel; + } catch (SchemaException e) { + LOGGER.error("Cannot create panel for {}, {}", typeName, e.getMessage(), e); + getSession().error("Cannot create panel for " + typeName); // TODO opertion result? localization? + } + + return null; + } + + private ItemVisibility getBasicTabVisibility(ItemPath path) { + if (ItemPath.create(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_CLEANUP_POLICIES).equivalent(path)) { + return ItemVisibility.HIDDEN; + } + + if (TaskType.F_SUBTASK_REF.equivalent(path)) { + return ItemVisibility.HIDDEN; + } + + if (TaskType.F_SUBTYPE.equivalent(path)) { + return ItemVisibility.HIDDEN; + } + + if (TaskType.F_LIFECYCLE_STATE.equivalent(path)) { + return ItemVisibility.HIDDEN; + } + +// if (TaskType.F_HANDLER_URI.equivalent(path)) { +// if (CollectionUtils.isNotEmpty(getTask().getArchetypeRef())) { +// return ItemVisibility.HIDDEN; +// } +// } + + + return ItemVisibility.AUTO; + } + + private boolean getBasicTabEditability(ItemPath path) { + if (WebComponentUtil.isRunningTask(getTask())) { + return false; + } + + List pathsToHide = Arrays.asList(TaskType.F_EXECUTION_STATUS, TaskType.F_NODE, TaskType.F_NODE_AS_OBSERVED,TaskType.F_RESULT_STATUS, + TaskType.F_RESULT, TaskType.F_NEXT_RUN_START_TIMESTAMP, TaskType.F_NEXT_RETRY_TIMESTAMP, TaskType.F_UNPAUSE_ACTION, TaskType.F_TASK_IDENTIFIER, + TaskType.F_PARENT, TaskType.F_WAITING_REASON, TaskType.F_STATE_BEFORE_SUSPEND, TaskType.F_CATEGORY, TaskType.F_OTHER_HANDLERS_URI_STACK, + TaskType.F_CHANNEL, TaskType.F_DEPENDENT_TASK_REF, TaskType.F_LAST_RUN_START_TIMESTAMP, TaskType.F_LAST_RUN_FINISH_TIMESTAMP, TaskType.F_COMPLETION_TIMESTAMP + ); + + for (ItemPath pathToHide : pathsToHide) { + if (pathToHide.equivalent(path)) { + return false; + } + } + + return true; + + } + + private ItemMandatoryHandler getItemMandatoryHandler() { + return itemWrapper -> { + if (TaskType.F_RECURRENCE.equivalent(itemWrapper.getPath())) { + return false; + } + return itemWrapper.isMandatory(); + }; + } + + + private ItemEditabilityHandler getTaskEditabilityHandler(){ + ItemEditabilityHandler editableHandler = wrapper -> !WebComponentUtil.isRunningTask(getTask()); + return editableHandler; + } + + private TaskType getTask() { + return getObject().asObjectable(); + } +}