Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Sep 5, 2018
2 parents b8ea6b4 + 44e1b37 commit 0509133
Show file tree
Hide file tree
Showing 15 changed files with 315 additions and 29 deletions.
Expand Up @@ -30,16 +30,16 @@
* Base class for most midPoint GUI panels. It has a constructor and
* utility methods for convenient handling of the model. It also has
* other utility methods often used in reusable components.
*
* <p>
* Almost all reusable components should extend this class.
*
* @author lazyman
* @author semancik
*/
public class BasePanel<T> extends Panel {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;

private IModel<T> model;
private IModel<T> model;

public BasePanel(String id) {
this(id, null);
Expand All @@ -66,10 +66,14 @@ public String getString(String resourceKey, Object... objects) {
return createStringResource(resourceKey, objects).getString();
}

public String getString(Enum e) {
return createStringResource(e).getString();
}

public StringResourceModel createStringResource(String resourceKey, Object... objects) {
return new StringResourceModel(resourceKey, this).setModel(null)
.setDefaultValue(resourceKey)
.setParameters(objects);
return new StringResourceModel(resourceKey, this).setModel(null)
.setDefaultValue(resourceKey)
.setParameters(objects);
// return StringResourceModelMigration.of(resourceKey, this, null, resourceKey, objects);
}

Expand Down
@@ -0,0 +1,21 @@
<!--
~ Copyright (c) 2010-2018 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.
-->

<wicket:panel xmlns:wicket="http://wicket.apache.org">
<div wicket:id="operation">
<span class="label" wicket:id="label"><span wicket:id="text"/></span>
</div>
</wicket:panel>
@@ -0,0 +1,177 @@
/*
* Copyright (c) 2010-2018 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.gui.api.component;

import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.web.util.InfoTooltipBehavior;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.PendingOperationExecutionStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.PendingOperationType;
import org.apache.wicket.AttributeModifier;
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.ListView;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;

import java.util.List;

/**
* Created by Viliam Repan (lazyman).
*/
public class PendingOperationPanel extends BasePanel<List<PendingOperationType>> {

private static final String ID_LABEL = "label";
private static final String ID_OPERATION = "operation";
private static final String ID_TEXT = "text";

public PendingOperationPanel(String id, IModel<List<PendingOperationType>> model) {
super(id, model);
}

@Override
protected void onInitialize() {
super.onInitialize();

initLayout();
}

private void initLayout() {
ListView<PendingOperationType> operation = new ListView<PendingOperationType>(ID_OPERATION, getModel()) {

private static final long serialVersionUID = 1L;

@Override
protected void populateItem(ListItem<PendingOperationType> item) {
item.setRenderBodyOnly(true);

WebMarkupContainer label = new WebMarkupContainer(ID_LABEL);
item.add(label);

Label text = new Label(ID_TEXT, createLabelText(item.getModel()));
text.setRenderBodyOnly(true);
label.add(text);

label.add(AttributeAppender.append("class", createTextClass(item.getModel())));

label.add(AttributeModifier.replace("title", createTextTooltipModel(item.getModel())));
label.add(new InfoTooltipBehavior() {

@Override
public String getCssClass() {
return null;
}
});
}
};
add(operation);
}

private IModel<String> createTextClass(IModel<PendingOperationType> model) {
return new AbstractReadOnlyModel<String>() {

private static final long serialVersionUID = 1L;

@Override
public String getObject() {
PendingOperationType op = model.getObject();
OperationResultStatusType rStatus = op.getResultStatus();
PendingOperationExecutionStatusType eStatus = op.getExecutionStatus();

if (rStatus != null &&
(rStatus == OperationResultStatusType.FATAL_ERROR || rStatus == OperationResultStatusType.PARTIAL_ERROR)) {
return "label-danger";
}

if (rStatus != null &&
(rStatus == OperationResultStatusType.UNKNOWN || rStatus == OperationResultStatusType.WARNING)) {
return "label-warning";
}

if ((rStatus != null && rStatus == OperationResultStatusType.SUCCESS)
|| (eStatus != null && eStatus == PendingOperationExecutionStatusType.COMPLETED)) {
return "label-success";
}

if ((rStatus != null &&
(rStatus == OperationResultStatusType.IN_PROGRESS || rStatus == OperationResultStatusType.NOT_APPLICABLE || rStatus == OperationResultStatusType.HANDLED_ERROR))) {
return "label-info";
}

return "label-default";
}
};
}

private IModel<String> createTextTooltipModel(IModel<PendingOperationType> model) {
return new AbstractReadOnlyModel<String>() {

private static final long serialVersionUID = 1L;

@Override
public String getObject() {
StringBuilder sb = new StringBuilder();

PendingOperationType op = model.getObject();

buildStringItem(sb, "PendingOperationPanel.resultStatus", op.getResultStatus());
buildStringItem(sb, "PendingOperationPanel.executionStatus", op.getExecutionStatus());
buildStringItem(sb, "PendingOperationPanel.attempt", op.getAttemptNumber());
buildStringItem(sb, "PendingOperationPanel.pendingOperationType", op.getType());
buildStringItem(sb, "PendingOperationPanel.lastAttemptTimestamp", WebComponentUtil.formatDate(op.getLastAttemptTimestamp()));
buildStringItem(sb, "PendingOperationPanel.completionTimestamp", WebComponentUtil.formatDate(op.getCompletionTimestamp()));

return sb.toString();
}
};
}

private void buildStringItem(StringBuilder sb, String key, Object obj) {
if (obj == null) {
return;
}

sb.append(getString(key)).append(" ");

String value = obj instanceof Enum ? getString((Enum) obj) : obj.toString();

sb.append(value);
sb.append('\n');
}

private IModel<String> createLabelText(IModel<PendingOperationType> model) {
return new AbstractReadOnlyModel<String>() {

private static final long serialVersionUID = 1L;

@Override
public String getObject() {
PendingOperationType op = model.getObject();
OperationResultStatusType rStatus = op.getResultStatus();
PendingOperationExecutionStatusType eStatus = op.getExecutionStatus();

if (rStatus == null) {
return getString(eStatus);
}

return getString(rStatus);
}
};
}
}
Expand Up @@ -24,7 +24,9 @@

<a class="check-table-header-name" wicket:id="link"><span class="name" wicket:id="name"/></a>
<span class="check-table-header-description" wicket:id="description"/>


<span wicket:id="pendingOperation" style="margin-right: 10px;"/>

<i class="check-table-header-additional-icon fa fa-clock-o text-success" wicket:id="trigger"/>
<span class="check-table-header-status" wicket:id="status"/>
<a class="check-table-header-show-more" wicket:id="showMore"><wicket:message key="CheckTableHeader.showMore"/></a>
Expand Down
Expand Up @@ -18,6 +18,7 @@

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.component.PendingOperationPanel;
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;
Expand All @@ -28,6 +29,7 @@
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.VisibleBehaviour;
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.*;
Expand All @@ -37,7 +39,6 @@
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.markup.html.form.Form;
import org.apache.wicket.model.*;

import javax.xml.datatype.XMLGregorianCalendar;
Expand All @@ -59,6 +60,7 @@ public class CheckTableHeader<O extends ObjectType> extends BasePanel<ObjectWrap
private static final String ID_SHOW_MORE = "showMore";
private static final String ID_TRIGGER = "trigger";
private static final String ID_EXPAND = "expand";
private static final String ID_PENDING_OPERATION = "pendingOperation";

public CheckTableHeader(String id, IModel<ObjectWrapper<O>> model) {
super(id, model);
Expand All @@ -78,6 +80,10 @@ protected void onUpdate(AjaxRequestTarget target) {
};
add(check);

PendingOperationPanel pendingPanel = new PendingOperationPanel(ID_PENDING_OPERATION, createPendingOperationsModel());
pendingPanel.add(new VisibleBehaviour(() -> ShadowType.class.equals(getModelObject().getDefinition().getCompileTimeClass())));
add(pendingPanel);

Label icon = new Label(ID_ICON);
icon.add(AttributeModifier.replace("class", new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
Expand Down Expand Up @@ -171,6 +177,30 @@ public boolean isOn() {

}

private IModel<List<PendingOperationType>> createPendingOperationsModel() {
return new AbstractReadOnlyModel<List<PendingOperationType>>() {

private static final long serialVersionUID = 1L;

@Override
public List<PendingOperationType> getObject() {
List<PendingOperationType> list = new ArrayList<>();

ObjectWrapper wrapper = getModelObject();
ContainerWrapper operations = wrapper.findContainerWrapper(new ItemPath(ShadowType.F_PENDING_OPERATION));
if (operations == null) {
return list;
}

for (ContainerValueWrapper<PendingOperationType> cw : (List<ContainerValueWrapper>) operations.getValues()) {
list.add(cw.getContainerValue().asContainerable());
}

return list;
}
};
}

private String createAccountIcon() {
ObjectWrapper<O> wrapper = getModelObject();
PrismObject<O> object = wrapper.getObject();
Expand Down
Expand Up @@ -23,7 +23,10 @@
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.api.GuiConstants;
import com.evolveum.midpoint.gui.api.component.PendingOperationPanel;
import com.evolveum.midpoint.web.component.menu.cog.ButtonInlineMenuItem;
import com.evolveum.midpoint.web.component.prism.ObjectWrapper;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
Expand Down Expand Up @@ -112,15 +115,6 @@
import com.evolveum.midpoint.web.session.SessionStorage;
import com.evolveum.midpoint.web.session.UserProfileStorage.TableId;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;

/**
* Implementation classes : ResourceContentResourcePanel,
Expand Down Expand Up @@ -690,6 +684,27 @@ public void onClick(AjaxRequestTarget target, IModel<SelectableBean<ShadowType>>

}
});

columns.add(new AbstractColumn<SelectableBean<ShadowType>, String>(
createStringResource("PageAccounts.accounts.pendingOperations")) {

private static final long serialVersionUID = 1L;

@Override
public void populateItem(Item<ICellPopulator<SelectableBean<ShadowType>>> cellItem,
String componentId, IModel<SelectableBean<ShadowType>> rowModel) {
cellItem.add(new PendingOperationPanel(componentId, new AbstractReadOnlyModel<List<PendingOperationType>>() {

private static final long serialVersionUID = 1L;

@Override
public List<PendingOperationType> getObject() {
SelectableBean<ShadowType> bean = rowModel.getObject();
return bean.getValue().getPendingOperation();
}
}));
}
});
return columns;
}

Expand Down
Expand Up @@ -51,7 +51,10 @@ public String getModalContainer(Component component) {
public void onConfigure(Component component) {
super.onConfigure(component);

component.add(AttributeModifier.replace("class", getCssClass()));
String cssClass = getCssClass();
if (cssClass != null) {
component.add(AttributeModifier.replace("class", cssClass));
}
}

@Override
Expand Down

0 comments on commit 0509133

Please sign in to comment.