diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index e7e918594dd..6dd9916b265 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -647,6 +647,48 @@ public static TaskType createSingleRecurrenceTask(String taskName, QName applica return task; } + public static boolean canSuspendTask(TaskType task, PageBase pageBase) { + return pageBase.isAuthorized(ModelAuthorizationAction.SUSPEND_TASK, task.asPrismObject()) + && (isRunnableTask(task) || isRunningTask(task)) + && !isWorkflowTask(task); + } + + public static boolean canResumeTask(TaskType task, PageBase pageBase) { + return pageBase.isAuthorized(ModelAuthorizationAction.RESUME_TASK, task.asPrismObject()) + && (isSuspendedTask(task) || (isClosedTask(task) && isRecurringTask(task))) + && !isWorkflowTask(task); + } + + public static boolean canRunNowTask(TaskType task, PageBase pageBase) { + return pageBase.isAuthorized(ModelAuthorizationAction.RUN_TASK_IMMEDIATELY, task.asPrismObject()) + && (isRunnableTask(task) || (isClosedTask(task) && !isRecurringTask(task))) + && !isWorkflowTask(task); + } + + public static boolean isRunnableTask(TaskType task) { + return task != null && TaskExecutionStatusType.RUNNABLE == task.getExecutionStatus(); + } + + public static boolean isRunningTask(TaskType task) { + return task != null && task.getNodeAsObserved() != null; + } + + public static boolean isSuspendedTask(TaskType task) { + return task != null && TaskExecutionStatusType.SUSPENDED == task.getExecutionStatus(); + } + + public static boolean isClosedTask(TaskType task) { + return task != null && TaskExecutionStatusType.CLOSED == task.getExecutionStatus(); + } + + public static boolean isRecurringTask(TaskType task) { + return task != null && TaskRecurrenceType.RECURRING == task.getRecurrence(); + } + + public static boolean isWorkflowTask(TaskType task) { + return task != null && TaskCategory.WORKFLOW.equals(task.getCategory()); + } + public static void iterativeExecuteBulkAction(PageBase pageBase, ExecuteScriptType script, Task task, OperationResult result ) throws SchemaException, SecurityViolationException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException{ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/column/InlineMenuButtonColumn.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/column/InlineMenuButtonColumn.java index d4e484b2d99..efaea3a857c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/column/InlineMenuButtonColumn.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/column/InlineMenuButtonColumn.java @@ -72,7 +72,7 @@ public Component getHeader(String componentId) { private Component getPanel(String componentId, IModel rowModel, int numberOfButtons, boolean isHeaderPanel) { List filteredMenuItems = new ArrayList<>(); - List cloneMenuItems = cloneColumnMenuActionIfUse(menuItems); + List cloneMenuItems = cloneColumnMenuActionIfUse(menuItems, rowModel); for (InlineMenuItem menuItem : (rowModel != null && rowModel.getObject() instanceof InlineMenuable ? ((InlineMenuable)rowModel.getObject()).getMenuItems() : cloneMenuItems)){ if (isHeaderPanel && !menuItem.isHeaderMenuItem()){ @@ -97,14 +97,14 @@ private Component getPanel(String componentId, IModel rowModel, List buttonMenuItems = new ArrayList<>(); menuItems.forEach(menuItem -> { if (menuItem instanceof ButtonInlineMenuItem){ - if (isHeaderPanel && !menuItem.isHeaderMenuItem()){ + if (isHeaderPanel && !menuItem.isHeaderMenuItem() || !menuItem.getVisible().getObject()){ return; } buttonMenuItems.add((ButtonInlineMenuItem) menuItem); } }); - return new MenuMultiButtonPanel(componentId, rowModel, numberOfButtons, Model.ofList(filteredMenuItems)) { + return new MenuMultiButtonPanel(componentId, rowModel, buttonMenuItems.size(), Model.ofList(filteredMenuItems)) { private static final long serialVersionUID = 1L; @@ -247,10 +247,11 @@ private boolean isPanelVisible(boolean isHeaderPanel){ return false; } - private List cloneColumnMenuActionIfUse(List menuItems) { + private List cloneColumnMenuActionIfUse(List menuItems, IModel rowModel) { List clonedMenuItems = new ArrayList(menuItems.size()); for (InlineMenuItem item : menuItems) { if (item.getAction() instanceof ColumnMenuAction) { + ((ColumnMenuAction)item.getAction()).setRowModel(rowModel); InlineMenuItem clonedItem; ColumnMenuAction clonedAction = new ColumnMenuAction() { @@ -273,6 +274,7 @@ public void onError(AjaxRequestTarget target) { } }; + clonedAction.setRowModel(rowModel); if (item instanceof ButtonInlineMenuItem) { clonedItem = new ButtonInlineMenuItem(item.getLabel(), item.isSubmit()) { 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 6bcfacc066e..34703f4dd6b 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 @@ -2,14 +2,12 @@ import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.model.LoadableModel; -import com.evolveum.midpoint.gui.api.prism.ItemWrapper; import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; import com.evolveum.midpoint.gui.api.prism.PrismObjectWrapper; 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.model.api.ModelAuthorizationAction; import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -160,7 +158,7 @@ public void onClick(AjaxRequestTarget target) { afterOperation(target, result); } }; - suspend.add(new VisibleBehaviour(this::canSuspend)); + suspend.add(new VisibleBehaviour(() -> WebComponentUtil.canSuspendTask(getTask(), PageTask.this))); suspend.add(AttributeAppender.append("class", "btn-danger")); repeatingView.add(suspend); @@ -173,7 +171,7 @@ public void onClick(AjaxRequestTarget target) { } }; resume.add(AttributeAppender.append("class", "btn-primary")); - resume.add(new VisibleBehaviour(this::canResume)); + resume.add(new VisibleBehaviour(() -> WebComponentUtil.canResumeTask(getTask(), PageTask.this))); repeatingView.add(resume); AjaxButton runNow = new AjaxButton(repeatingView.newChildId(), createStringResource("pageTaskEdit.button.runNow")) { @@ -186,7 +184,7 @@ public void onClick(AjaxRequestTarget target) { } }; runNow.add(AttributeAppender.append("class", "btn-success")); - runNow.add(new VisibleBehaviour(this::canRunNow)); + runNow.add(new VisibleBehaviour(() -> WebComponentUtil.canRunNowTask(getTask(), PageTask.this))); repeatingView.add(runNow); AjaxIconButton refreshNow = new AjaxIconButton(repeatingView.newChildId(), new Model<>("fa fa-refresh"), createStringResource("autoRefreshPanel.refreshNow")) { @@ -301,65 +299,6 @@ private String createResumePauseButton() { return "fa fa-play"; } - private boolean canSuspend() { - PrismObject task = getObjectWrapper().getObject(); - TaskType taskType = task.asObjectable(); - return isAuthorized(ModelAuthorizationAction.SUSPEND_TASK, task) - && isRunnable(taskType) || isRunning() - && !isWorkflow(task.asObjectable()); - } - - private boolean canResume() { - PrismObject task = getObjectWrapper().getObject(); - TaskType taskType = task.asObjectable(); - return isAuthorized(ModelAuthorizationAction.RESUME_TASK, task) - && (isSuspended(taskType) || (isClosed(taskType) && isRecurring(taskType))) - && !isWorkflow(taskType); - } - - - private boolean canRunNow() { - PrismObject task = getObjectWrapper().getObject(); - TaskType taskType = task.asObjectable(); - return isAuthorized(ModelAuthorizationAction.RUN_TASK_IMMEDIATELY, task) - && (isRunnable(taskType) || (isClosed(taskType) && !isRecurring(taskType))) - && !isWorkflow(taskType); - } - - private boolean isRunnable(TaskType task) { - return TaskExecutionStatusType.RUNNABLE == task.getExecutionStatus(); - } - - private boolean isRunning() { - PrismObject task = getObjectWrapper().getObject(); - TaskType taskType = task.asObjectable(); - return taskType.getNodeAsObserved() != null; - } - - private boolean isNotRunning(){ - return !isRunning(); - } - - private boolean isSuspended(TaskType task) { - return TaskExecutionStatusType.SUSPENDED == task.getExecutionStatus(); - } - - private boolean isClosed(TaskType task) { - return TaskExecutionStatusType.CLOSED == task.getExecutionStatus(); - } - - private boolean isRecurring(TaskType task) { - return TaskRecurrenceType.RECURRING == task.getRecurrence(); - } - - private boolean isWorkflow(TaskType task) { - return TaskCategory.WORKFLOW.equals(task.getCategory()); - } - - private TaskType getTask(){ - return getObjectWrapper().getObject().asObjectable(); - } - private IModel createSummaryPanelModel() { return isEditingFocus() ? @@ -533,10 +472,14 @@ private ItemVisibility getBasicTabVisibility(ItemPath path) { } private ItemEditabilityHandler getTaskEditabilityHandler(){ - ItemEditabilityHandler editableHandler = wrapper -> !isRunning(); + ItemEditabilityHandler editableHandler = wrapper -> !WebComponentUtil.isRunningTask(getTask()); return editableHandler; } + private TaskType getTask(){ + return getObjectWrapper().getObject().asObjectable(); + } + @Override protected Class getRestartResponsePage() { return PageTasks.class; @@ -573,7 +516,7 @@ protected boolean shouldTrigger() { @Override public int getRefreshInterval() { - TaskType task = getObjectWrapper().getObject().asObjectable(); + TaskType task = getTask(); TaskDtoExecutionStatus exec = TaskDtoExecutionStatus.fromTaskExecutionStatus(task.getExecutionStatus(), task.getNodeAsObserved() != null); if (exec == null) { return REFRESH_INTERVAL_IF_CLOSED; @@ -613,9 +556,13 @@ public void refresh(AjaxRequestTarget target) { } + private boolean isNotRunning(){ + return !WebComponentUtil.isRunningTask(getTask()); + } + public boolean isRefreshEnabled() { if (refreshEnabled == null) { - return isRunning(); + return WebComponentUtil.isRunningTask(getTask()); } return refreshEnabled; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java index 257a98922db..f334c8330c8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java @@ -9,6 +9,7 @@ import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.component.MainObjectListPanel; +import com.evolveum.midpoint.gui.api.model.ReadOnlyModel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.model.api.ModelPublicConstants; import com.evolveum.midpoint.model.api.TaskService; @@ -407,6 +408,17 @@ public IModel getConfirmationMessageModel() { String actionName = createStringResource("pageTasks.message.suspendAction").getString(); return TaskTablePanel.this.getTaskConfirmationMessageModel((ColumnMenuAction) getAction(), actionName); } + + @Override + public IModel getVisible() { + IModel> rowModel = ((ColumnMenuAction) getAction()).getRowModel(); + if (rowModel == null){ + return Model.of(Boolean.TRUE); + } + SelectableBean rowModelObj = (SelectableBean)rowModel.getObject(); + boolean visible = WebComponentUtil.canSuspendTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase()); + return Model.of(visible); + } }); items.add(new ButtonInlineMenuItem(createStringResource("pageTasks.button.resumeTask")) { private static final long serialVersionUID = 1L; @@ -433,8 +445,20 @@ public IModel getConfirmationMessageModel() { String actionName = createStringResource("pageTasks.message.resumeAction").getString(); return TaskTablePanel.this.getTaskConfirmationMessageModel((ColumnMenuAction) getAction(), actionName); } + + @Override + public IModel getVisible() { + IModel> rowModel = ((ColumnMenuAction) getAction()).getRowModel(); + if (rowModel == null){ + return Model.of(Boolean.TRUE); + } + SelectableBean rowModelObj = (SelectableBean)rowModel.getObject(); + boolean visible = WebComponentUtil.canResumeTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase()); + return Model.of(visible); + } + }); - items.add(new InlineMenuItem(createStringResource("pageTasks.button.scheduleTask")) { + items.add(new ButtonInlineMenuItem(createStringResource("pageTasks.button.scheduleTask")) { private static final long serialVersionUID = 1L; @Override @@ -449,11 +473,27 @@ public void onClick(AjaxRequestTarget target) { }; } + @Override + public String getButtonIconCssClass() { + return GuiStyleConstants.CLASS_START_MENU_ITEM; + } + @Override public IModel getConfirmationMessageModel() { String actionName = createStringResource("pageTasks.message.runNowAction").getString(); return TaskTablePanel.this.getTaskConfirmationMessageModel((ColumnMenuAction) getAction(), actionName); } + + @Override + public IModel getVisible() { + IModel> rowModel = ((ColumnMenuAction) getAction()).getRowModel(); + if (rowModel == null){ + return Model.of(Boolean.TRUE); + } + SelectableBean rowModelObj = (SelectableBean)rowModel.getObject(); + return Model.of(WebComponentUtil.canRunNowTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase())); + } + }); items.add(new InlineMenuItem(createStringResource("pageTasks.button.deleteTask")) { private static final long serialVersionUID = 1L; @@ -617,6 +657,17 @@ public IModel getConfirmationMessageModel() { String actionName = createStringResource("pageTasks.message.deleteWorkState").getString(); return TaskTablePanel.this.getTaskConfirmationMessageModel((ColumnMenuAction) getAction(), actionName); } + + @Override + public IModel getVisible() { + IModel> rowModel = ((ColumnMenuAction) getAction()).getRowModel(); + if (rowModel == null){ + return Model.of(Boolean.TRUE); + } + SelectableBean rowModelObj = (SelectableBean)rowModel.getObject(); + return Model.of(WebComponentUtil.canSuspendTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase())); + } + }; items.add(deleteWorkState);