/* * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.evolveum.midpoint.web.component.prism; 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.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.web.component.BootstrapLabel; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.util.TooltipBehavior; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.StringUtils; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.*; import javax.xml.datatype.XMLGregorianCalendar; import java.util.ArrayList; import java.util.List; /** * @author lazyman */ public class CheckTableHeader<O extends ObjectType> extends BasePanel<ObjectWrapper<O>> { private static final long serialVersionUID = 1L; private static final String ID_CHECK = "check"; private static final String ID_ICON = "icon"; private static final String ID_NAME = "name"; private static final String ID_DESCRIPTION = "description"; private static final String ID_LINK = "link"; private static final String ID_STATUS = "status"; private static final String ID_SHOW_MORE = "showMore"; private static final String ID_TRIGGER = "trigger"; private static final String ID_EXPAND = "expand"; public CheckTableHeader(String id, IModel<ObjectWrapper<O>> model) { super(id, model); initLayout(); } private void initLayout() { AjaxCheckBox check = new AjaxCheckBox(ID_CHECK, new PropertyModel<Boolean>(getModel(), ObjectWrapper.F_SELECTED)) { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { } }; add(check); Label icon = new Label(ID_ICON); icon.add(AttributeModifier.replace("class", new AbstractReadOnlyModel<String>() { private static final long serialVersionUID = 1L; @Override public String getObject() { return "check-table-header-icon " + createAccountIcon(); } })); add(icon); Label trigger = new Label(ID_TRIGGER); trigger.add(AttributeModifier.replace("title", new AbstractReadOnlyModel<String>() { private static final long serialVersionUID = 1L; @Override public String getObject() { return createTriggerTooltip(); } })); trigger.add(new TooltipBehavior()); trigger.add(new VisibleEnableBehaviour() { private static final long serialVersionUID = 1L; @Override public boolean isVisible() { return hasTriggers(); } }); add(trigger); BootstrapLabel status = new BootstrapLabel(ID_STATUS, createStringResource("CheckTableHeader.label.error"), new Model<>(BootstrapLabel.State.DANGER)); status.add(createFetchErrorVisibleBehaviour()); add(status); AjaxLink showMore = new AjaxLink(ID_SHOW_MORE) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { onShowMorePerformed(target); } }; showMore.add(createFetchErrorVisibleBehaviour()); add(showMore); AjaxLink link = new AjaxLink(ID_LINK) { @Override public void onClick(AjaxRequestTarget target) { onClickPerformed(target); } }; add(link); Label name = new Label(ID_NAME, new AbstractReadOnlyModel<String>() { private static final long serialVersionUID = 1L; @Override public String getObject() { return getDisplayName(); } }); link.add(name); Label description = new Label(ID_DESCRIPTION, new AbstractReadOnlyModel<String>() { private static final long serialVersionUID = 1L; @Override public String getObject() { return getDescription(); } }); add(description); ToggleIconButton expandButton = new ToggleIconButton(ID_EXPAND, GuiStyleConstants.CLASS_ICON_EXPAND, GuiStyleConstants.CLASS_ICON_COLLAPSE) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { onClickPerformed(target); } @Override public boolean isOn() { return !CheckTableHeader.this.getModelObject().isMinimalized(); } }; add(expandButton); } private String createAccountIcon() { ObjectWrapper<O> wrapper = getModelObject(); PrismObject<O> object = wrapper.getObject(); PrismProperty<ActivationStatusType> status = object.findProperty(new ItemPath(ShadowType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS)); if (status != null && status.getRealValue() != null) { ActivationStatusType value = status.getRealValue(); if (ActivationStatusType.DISABLED.equals(value)) { return "fa fa-male text-muted"; } } return "fa fa-male"; } private String createTriggerTooltip() { ObjectWrapper<O> wrapper = getModelObject(); PrismObject<O> obj = wrapper.getObject(); PrismContainer<TriggerType> container = obj.findContainer(ObjectType.F_TRIGGER); if (container == null || container.isEmpty()) { return null; } List<String> triggers = new ArrayList<>(); for (PrismContainerValue<TriggerType> val : container.getValues()) { XMLGregorianCalendar time = val.getPropertyRealValue(TriggerType.F_TIMESTAMP, XMLGregorianCalendar.class); if (time == null) { triggers.add(getString("CheckTableHeader.triggerUnknownTime")); } else { triggers.add(getString("CheckTableHeader.triggerPlanned", WebComponentUtil.formatDate(time))); } } return StringUtils.join(triggers, '\n'); } private boolean hasTriggers() { ObjectWrapper<O> wrapper = getModelObject(); PrismObject<O> obj = wrapper.getObject(); PrismContainer<TriggerType> container = obj.findContainer(ObjectType.F_TRIGGER); return container != null && !container.isEmpty(); } private VisibleEnableBehaviour createFetchErrorVisibleBehaviour() { return new VisibleEnableBehaviour() { private static final long serialVersionUID = 1L; @Override public boolean isVisible() { OperationResult fetchResult = getModelObject().getFetchResult(); if (fetchResult != null && !WebComponentUtil.isSuccessOrHandledError(fetchResult)) { return true; } OperationResult result = getModelObject().getResult(); if (result != null && !WebComponentUtil.isSuccessOrHandledError(result)) { return true; } return false; } }; } private String getDisplayName() { ObjectWrapper<O> wrapper = getModel().getObject(); String key = wrapper.getDisplayName(); return translate(key); } private String getDescription() { ObjectWrapper<O> wrapper = getModel().getObject(); String key = wrapper.getDescription(); return translate(key); } private String translate(String key) { if (key == null) { key = ""; } return PageBase.createStringResourceStatic(getPage(), key).getString(); // return new StringResourceModel(key, getPage(), null, key).getString(); } protected void onClickPerformed(AjaxRequestTarget target) { ObjectWrapper<O> wrapper = getModelObject(); wrapper.setMinimalized(!wrapper.isMinimalized()); } protected void onShowMorePerformed(AjaxRequestTarget target){ showResult(getModelObject().getFetchResult()); showResult(getModelObject().getResult()); target.add(getPageBase().getFeedbackPanel()); } private void showResult(OperationResult result) { PageBase page = getPageBase(); if (!WebComponentUtil.isSuccessOrHandledError(result)) { page.showResult(result); } } }