Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Mar 15, 2023
2 parents c4fa60b + 63cd29d commit 721a02d
Show file tree
Hide file tree
Showing 13 changed files with 351 additions and 83 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,8 @@ public class GuiStyleConstants {
public static final String CLASS_ICON_NOT_SHOW_EMPTY_FIELDS = "fa fa-square";
public static final String CLASS_ICON_SHOW_METADATA = "fa fa-asterisk";
public static final String CLASS_ICON_SUPERUSER = "fa fa-shield-alt";
public static final String CLASS_ICON_NO_OBJECTS = "fa fa-times";
public static final String CLASS_ICON_ACTIVATION_ACTIVE = "fa fa-check";
public static final String CLASS_ICON_NO_OBJECTS = "fa fa-fw fa-times";
public static final String CLASS_ICON_ACTIVATION_ACTIVE = "fa fa-fw fa-check";
public static final String CLASS_ICON_ACTIVATION_INACTIVE = "fa fa-times";
public static final String CLASS_ICON_RESOURCE_BROKEN = "fa fa-exclamation";
public static final String CLASS_ICON_RESOURCE_UNKNOWN = "fa fa-question";
Expand Down Expand Up @@ -245,6 +245,7 @@ public class GuiStyleConstants {

public static final String CLASS_ICON_SIGN_OUT = "fa fa-sign-out-alt";
public static final String CLASS_ICON_CLAIM = "far fa-paper-plane";
public static final String CLASS_ICON_RELEASE = "fa fa-fw fa-repeat";
public static final String CLASS_ICON_TEXT = "fa fa-text-width";

public static final String CLASS_ICON_TRASH = "far fa-trash-alt";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4745,7 +4745,7 @@ public static void claimWorkItemActionPerformed(CaseWorkItemType workItemToClaim
} catch (ObjectNotFoundException | SecurityViolationException | RuntimeException | SchemaException |
ObjectAlreadyExistsException | CommunicationException | ConfigurationException |
ExpressionEvaluationException e) {
result.recordPartialError(pageBase.createStringResource("pageWorkItems.message.partialError.claimed").getString(), e);
result.recordPartialError(pageBase.createStringResource("pageWorkItems.message.partialError.released").getString(), e);
}
if (mainResult.isUnknown()) {
mainResult.recomputeStatus();
Expand All @@ -4763,6 +4763,34 @@ public static void claimWorkItemActionPerformed(CaseWorkItemType workItemToClaim

}

public static void releaseWorkItemActionPerformed(CaseWorkItemType workItemToClaim,
String operation, AjaxRequestTarget target, PageBase pageBase) {
Task task = pageBase.createSimpleTask(operation);
OperationResult mainResult = task.getResult();
CaseService caseService = pageBase.getCaseService();
OperationResult result = mainResult.createSubresult(operation);

try {
caseService.releaseWorkItem(WorkItemId.of(workItemToClaim), task, result);
result.computeStatusIfUnknown();
} catch (ObjectNotFoundException | SecurityViolationException | RuntimeException | SchemaException |
ObjectAlreadyExistsException | CommunicationException | ConfigurationException |
ExpressionEvaluationException e) {
result.recordPartialError(pageBase.createStringResource("pageWorkItems.message.partialError.released").getString(), e);
}
if (mainResult.isUnknown()) {
mainResult.recomputeStatus();
}

if (mainResult.isSuccess()) {
mainResult.recordStatus(OperationResultStatus.SUCCESS,
pageBase.createStringResource("pageWorkItems.message.success.simple.released").getString());
}

pageBase.showResult(mainResult);
target.add(pageBase);
}

public static void assumePowerOfAttorneyIfRequested(OperationResult result, PrismObject<UserType> powerDonor, PageBase pageBase) {
if (powerDonor != null) {
WebModelServiceUtils.assumePowerOfAttorney(powerDonor, pageBase.getModelInteractionService(), pageBase.getTaskManager(), result);
Expand Down Expand Up @@ -5370,7 +5398,7 @@ public static <C extends Containerable> GuiObjectListViewType getPrincipalUserOb
}

public static <T> DropDownChoicePanel createDropDownChoices(String id, IModel<DisplayableValue<T>> model,
IModel<List<DisplayableValue<T>>> choices, boolean allowNull) {
IModel<List<DisplayableValue<T>>> choices, boolean allowNull) {
return new DropDownChoicePanel(id, model, choices, new DisplayableChoiceRenderer(), allowNull);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<wicket:panel>
<a class="btn btn-default" wicket:id="workItemReleaseButton"/>
<a class="btn btn-danger" wicket:id="workItemRejectButton"/>
<a class="btn btn-success" wicket:id="workItemApproveButton"/>
<a class="btn btn-primary" wicket:id="workItemForwardButton"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public class CaseWorkItemActionsPanel extends BasePanel<CaseWorkItemType> {

private static final String DOT_CLASS = CaseWorkItemActionsPanel.class.getName() + ".";
private static final String OPERATION_CLAIM_ITEMS = DOT_CLASS + "claimItem";
private static final String OPERATION_RELEASE_ITEMS = DOT_CLASS + "releaseWorkItem";
private static final String OPERATION_FORWARD_WORK_ITEM = DOT_CLASS + "forwardWorkItem";
private static final String OPERATION_COMPLETE_WORK_ITEM = DOT_CLASS + "completeWorkItem";
private static final String OPERATION_CHECK_SUBMIT_ACTION_AUTHORIZATION = DOT_CLASS + "isAuthorizedToApproveAndReject";
Expand All @@ -50,6 +51,7 @@ public class CaseWorkItemActionsPanel extends BasePanel<CaseWorkItemType> {
private static final String ID_WORK_ITEM_REJECT_BUTTON = "workItemRejectButton";
private static final String ID_WORK_ITEM_FORWARD_BUTTON = "workItemForwardButton";
private static final String ID_WORK_ITEM_CLAIM_BUTTON = "workItemClaimButton";
private static final String ID_WORK_ITEM_RELEASE_BUTTON = "workItemReleaseButton";

public CaseWorkItemActionsPanel(String id, IModel<CaseWorkItemType> caseWorkItemModel) {
super(id, caseWorkItemModel);
Expand Down Expand Up @@ -82,6 +84,21 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) {
workItemApproveButton.setOutputMarkupId(true);
add(workItemApproveButton);

AjaxButton workItemUnclaimedButton = new AjaxButton(ID_WORK_ITEM_RELEASE_BUTTON,
createStringResource("pageWorkItems.button.reconsider")) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
releaseWorkItemPerformed(ajaxRequestTarget);
afterActionFinished(ajaxRequestTarget);

}
};
workItemUnclaimedButton.add(new VisibleBehaviour(this::isReleaseButtonVisible));
workItemUnclaimedButton.setOutputMarkupId(true);
add(workItemUnclaimedButton);

AjaxButton workItemRejectButton = new AjaxButton(ID_WORK_ITEM_REJECT_BUTTON, getRejectButtonTitleModel()) {
private static final long serialVersionUID = 1L;

Expand Down Expand Up @@ -117,9 +134,10 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) {
@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
claimWorkItemPerformed(ajaxRequestTarget);
afterActionFinished(ajaxRequestTarget);
}
};
workItemClaimButton.add(new VisibleBehaviour(() -> isClaimButtonVisible()));
workItemClaimButton.add(new VisibleBehaviour(this::isClaimButtonVisible));
workItemClaimButton.setOutputMarkupId(true);

add(workItemClaimButton);
Expand Down Expand Up @@ -183,6 +201,10 @@ private void claimWorkItemPerformed(AjaxRequestTarget target) {

}

private void releaseWorkItemPerformed(AjaxRequestTarget target) {
WebComponentUtil.releaseWorkItemActionPerformed(getModelObject(), OPERATION_RELEASE_ITEMS, target, getPageBase());
}

protected void afterActionFinished(AjaxRequestTarget target) {
getPageBase().redirectBack();
}
Expand Down Expand Up @@ -250,6 +272,12 @@ private boolean isForwardButtonVisible() {
}
}

private boolean isReleaseButtonVisible() {
return CaseTypeUtil.isCaseWorkItemNotClosed(getModelObject()) &&
CaseTypeUtil.isWorkItemReleasable(getModelObject()) &&
getPageBase().getCaseManager().isCurrentUserAuthorizedToClaim(getModelObject());
}

private boolean isClaimButtonVisible() {
return CaseTypeUtil.isCaseWorkItemNotClosed(getModelObject()) &&
CaseTypeUtil.isWorkItemClaimable(getModelObject()) &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,14 @@
import org.apache.wicket.request.mapper.parameter.PageParameters;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.data.provider.ISelectableDataProvider;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismValueWrapper;
import com.evolveum.midpoint.gui.api.util.GuiDisplayTypeUtil;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.component.ContainerableListPanel;
import com.evolveum.midpoint.gui.impl.component.data.provider.ContainerListDataProvider;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder;
import com.evolveum.midpoint.gui.impl.component.search.Search;
import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.AssignmentHolderDetailsModel;
Expand All @@ -39,12 +42,10 @@
import com.evolveum.midpoint.schema.util.WorkItemId;
import com.evolveum.midpoint.schema.util.cases.CaseTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.gui.api.component.data.provider.ISelectableDataProvider;
import com.evolveum.midpoint.web.component.data.column.*;
import com.evolveum.midpoint.web.component.menu.cog.ButtonInlineMenuItem;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction;
import com.evolveum.midpoint.gui.impl.component.data.provider.ContainerListDataProvider;
import com.evolveum.midpoint.web.page.admin.workflow.PageAttorneySelection;
import com.evolveum.midpoint.web.session.PageStorage;
import com.evolveum.midpoint.web.session.SessionStorage;
Expand All @@ -63,6 +64,8 @@ public class CaseWorkItemsPanel extends ContainerableListPanel<CaseWorkItemType,
private static final String DOT_CLASS = CaseWorkItemsPanel.class.getName() + ".";
private static final String OPERATION_LOAD_POWER_DONOR_OBJECT = DOT_CLASS + "loadPowerDonorObject";
private static final String OPERATION_COMPLETE_WORK_ITEM = DOT_CLASS + "completeWorkItem";
private static final String OPERATION_RELEASE_ITEMS = DOT_CLASS + "releaseWorkItem";


public CaseWorkItemsPanel(String id) {
super(id, CaseWorkItemType.class);
Expand Down Expand Up @@ -101,7 +104,7 @@ protected ISelectableDataProvider<PrismContainerValueWrapper<CaseWorkItemType>>

@Override
public List<CaseWorkItemType> getSelectedRealObjects() {
return getSelectedObjects().stream().map(o -> o.getRealValue()).collect(Collectors.toList());
return getSelectedObjects().stream().map(PrismValueWrapper::getRealValue).collect(Collectors.toList());
}

@Override
Expand Down Expand Up @@ -172,7 +175,7 @@ protected ObjectQuery getCustomizeContentQuery() {
}

private IColumn<PrismContainerValueWrapper<CaseWorkItemType>, String> createNameColumn() {
return new LinkColumn<PrismContainerValueWrapper<CaseWorkItemType>>(createStringResource("PolicyRulesPanel.nameColumn")) {
return new LinkColumn<>(createStringResource("PolicyRulesPanel.nameColumn")) {
private static final long serialVersionUID = 1L;

@Override
Expand Down Expand Up @@ -300,6 +303,53 @@ public IModel<Boolean> getVisible() {
}
});

menu.add(new ButtonInlineMenuItem(createStringResource("pageWorkItems.button.reconsider")) {
private static final long serialVersionUID = 1L;

@Override
public InlineMenuItemAction initAction() {
return new ColumnMenuAction<PrismContainerValueWrapper<CaseWorkItemType>>() {

@Override
public void onClick(AjaxRequestTarget target) {
workItemActionReleasePerformed(getRowModel(), target);
}
};
}

@Override
public CompositedIconBuilder getIconCompositedBuilder() {
return getDefaultCompositedIconBuilder(GuiStyleConstants.CLASS_ICON_RELEASE);
}

@Override
public IModel<Boolean> getEnabled() {
IModel<PrismContainerValueWrapper<CaseWorkItemType>> rowModel = ((ColumnMenuAction<PrismContainerValueWrapper<CaseWorkItemType>>) getAction()).getRowModel();
if (rowModel != null && rowModel.getObject() != null && rowModel.getObject().getRealValue() != null) {
CaseWorkItemType workItem = rowModel.getObject().getRealValue();
return Model.of(isReleasable(workItem));
} else {
return super.getEnabled();
}
}

@Override
public IModel<String> getConfirmationMessageModel() {
return createStringResource("CaseWorkItemsPanel.confirmWorkItemsReleaseAction");
}

@Override
public IModel<Boolean> getVisible() {
IModel<PrismContainerValueWrapper<CaseWorkItemType>> rowModel = ((ColumnMenuAction<PrismContainerValueWrapper<CaseWorkItemType>>) getAction()).getRowModel();
if (rowModel != null && rowModel.getObject() != null && rowModel.getObject().getRealValue() != null) {
CaseWorkItemType workItem = rowModel.getObject().getRealValue();
return Model.of(isReleasable(workItem));
} else {
return super.getVisible();
}
}
});

return menu;
}

Expand All @@ -323,10 +373,45 @@ private void workItemActionPerformed(IModel<PrismContainerValueWrapper<CaseWorkI
WebModelServiceUtils.loadObject(UserType.class, getPowerDonorOidParameterValue(),
CaseWorkItemsPanel.this.getPageBase(), task, result) : null;
OperationResult completeWorkItemResult = new OperationResult(OPERATION_COMPLETE_WORK_ITEM);
selectedWorkItems.forEach(workItemToReject -> {
WebComponentUtil.workItemApproveActionPerformed(target, workItemToReject.getRealValue(),
null, powerDonor, approved, completeWorkItemResult, CaseWorkItemsPanel.this.getPageBase());
});
selectedWorkItems.forEach(workItemToReject -> WebComponentUtil.workItemApproveActionPerformed(target,
workItemToReject.getRealValue(), null, powerDonor, approved, completeWorkItemResult,
CaseWorkItemsPanel.this.getPageBase()));

WebComponentUtil.clearProviderCache(getTable().getDataTable().getDataProvider());

target.add(getPageBase().getFeedbackPanel());
target.add(CaseWorkItemsPanel.this);

}

private boolean isReleasable(CaseWorkItemType workItem) {
return CaseTypeUtil.isCaseWorkItemNotClosed(workItem) &&
CaseTypeUtil.isWorkItemReleasable(workItem) &&
getPageBase().getCaseManager().isCurrentUserAuthorizedToClaim(workItem);
}


private void workItemActionReleasePerformed(IModel<PrismContainerValueWrapper<CaseWorkItemType>> rowModel,
AjaxRequestTarget target) {
List<PrismContainerValueWrapper<CaseWorkItemType>> selectedWorkItems = new ArrayList<>();
if (rowModel == null) {
selectedWorkItems.addAll(getSelectedObjects());
} else {
selectedWorkItems.addAll(Collections.singletonList(rowModel.getObject()));
}

if (selectedWorkItems.size() == 0) {
warn(getString("CaseWorkItemsPanel.noWorkItemIsSelected"));
target.add(getPageBase().getFeedbackPanel());
return;
}

for (PrismContainerValueWrapper<CaseWorkItemType> workItemToReject : selectedWorkItems) {
if(isReleasable(workItemToReject.getRealValue())) {
WebComponentUtil.releaseWorkItemActionPerformed(workItemToReject.getRealValue(), OPERATION_RELEASE_ITEMS,
target, CaseWorkItemsPanel.this.getPageBase());
}
}

WebComponentUtil.clearProviderCache(getTable().getDataTable().getDataProvider());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ public boolean isVisible() {
additionalAttributes.add(new Label(ID_CUSTOM_FORM));
}

Form evidenceForm = new Form(ID_CASE_WORK_ITEM_EVIDENCE_FORM);
Form<?> evidenceForm = new Form<>(ID_CASE_WORK_ITEM_EVIDENCE_FORM);
evidenceForm.add(new VisibleBehaviour(() -> CaseTypeUtil.isManualProvisioningCase(parentCase) &&
(!isParentCaseClosed() || WorkItemTypeUtil.getEvidence(getModelObject()) != null)));
evidenceForm.setMultiPart(true);
Expand Down Expand Up @@ -295,21 +295,30 @@ public boolean isVisible() {

WebMarkupContainer commentContainer = new WebMarkupContainer(ID_APPROVER_CONTAINER);
commentContainer.setOutputMarkupId(true);
commentContainer.add(new VisibleBehaviour(() -> isAuthorizedForActions()));
commentContainer.add(new VisibleBehaviour(this::isAuthorizedForActions));
add(commentContainer);

String key = CaseTypeUtil.isCorrelationCase(caseModel.getObject().asObjectable()) ? "PageCaseWorkItem.caseWorkItem.comment" : "workItemPanel.approverComment";
Label commentLabel = new Label(ID_COMMENT_LABEL, createStringResource(key));
commentLabel.setOutputMarkupId(true);
commentLabel.add(new VisibleBehaviour(this::isApproveCommentVisible));
commentContainer.add(commentLabel);

TextArea<String> approverComment = new TextArea<>(ID_APPROVER_COMMENT, new PropertyModel<>(getModel(), "output.comment"));
approverComment.add(new EnableBehaviour(() -> !isParentCaseClosed()));
approverComment.add(new VisibleBehaviour(this::isApproveCommentVisible));
approverComment.setOutputMarkupId(true);
approverComment.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
commentContainer.add(approverComment);

}

private boolean isApproveCommentVisible() {
return CaseTypeUtil.isCaseWorkItemNotClosed(getModelObject()) &&
!CaseTypeUtil.isWorkItemClaimable(getModelObject()) &&
getPageBase().getCaseManager().isCurrentUserAuthorizedToClaim(getModelObject()) &&
!isParentCaseClosed();
}
private boolean isAuthorizedForActions() {
Task task = getPageBase().createSimpleTask(OPERATION_CHECK_ACTIONS_AUTHORIZATION);
OperationResult result = task.getResult();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,12 @@ public static boolean isWorkItemClaimable(CaseWorkItemType workItem) {
&& !doesAssigneeExist(workItem) && CollectionUtils.isNotEmpty(workItem.getCandidateRef());
}

public static boolean isWorkItemReleasable(CaseWorkItemType workItem) {
return workItem != null
&& (workItem.getOriginalAssigneeRef() == null || StringUtils.isEmpty(workItem.getOriginalAssigneeRef().getOid()))
&& doesAssigneeExist(workItem) && CollectionUtils.isNotEmpty(workItem.getCandidateRef());
}

public static boolean doesAssigneeExist(CaseWorkItemType workItem) {
if (workItem == null || CollectionUtils.isEmpty(workItem.getAssigneeRef())) {
return false;
Expand Down

0 comments on commit 721a02d

Please sign in to comment.