Skip to content

Commit

Permalink
MID-2541 server items menu
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Feb 24, 2016
1 parent 3614c58 commit ca47953
Show file tree
Hide file tree
Showing 3 changed files with 158 additions and 40 deletions.
Expand Up @@ -19,6 +19,7 @@
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.model.api.ModelPublicConstants;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule;
Expand Down Expand Up @@ -49,6 +50,7 @@
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction;
import com.evolveum.midpoint.web.page.admin.server.dto.*;
import com.evolveum.midpoint.web.page.admin.users.dto.UserListItemDto;
import com.evolveum.midpoint.web.page.admin.workflow.PageProcessInstance;
import com.evolveum.midpoint.web.session.TasksStorage;
import com.evolveum.midpoint.web.session.UserProfileStorage;
Expand Down Expand Up @@ -134,6 +136,9 @@ public class PageTasks extends PageAdminTasks {
private IModel<TasksSearchDto> searchModel;
private String searchText = "";

//used for confirmation modal, cleaner implementation needed probaly :)
private List<TaskDto> tasksToBeDeleted = new ArrayList<>();

public PageTasks() {
this(true);
}
Expand Down Expand Up @@ -209,6 +214,14 @@ protected void saveProviderPaging(ObjectQuery query, ObjectPaging paging) {
TasksStorage storage = getSessionStorage().getTasks();
storage.setTasksPaging(paging);
}

@Override
public TaskDto createTaskDto(PrismObject<TaskType> task, OperationResult result) throws SchemaException, ObjectNotFoundException {
TaskDto dto = super.createTaskDto(task, result);
addInlineMenuToTaskRow(dto);

return dto;
}
};

provider.setQuery(createTaskQuery());
Expand Down Expand Up @@ -263,9 +276,9 @@ public void yesPerformed(AjaxRequestTarget target) {
}

private List<IColumn<NodeDto, String>> initNodeColumns() {
List<IColumn<NodeDto, String>> columns = new ArrayList<IColumn<NodeDto, String>>();
List<IColumn<NodeDto, String>> columns = new ArrayList<>();

IColumn column = new CheckBoxHeaderColumn<NodeDto>();
IColumn column = new CheckBoxHeaderColumn<>();
columns.add(column);

column = new LinkColumn<NodeDto>(createStringResource("pageTasks.node.name"), "name", "name") {
Expand Down Expand Up @@ -361,7 +374,7 @@ public void onClick(AjaxRequestTarget target) {
private List<IColumn<TaskDto, String>> initTaskColumns() {
List<IColumn<TaskDto, String>> columns = new ArrayList<IColumn<TaskDto, String>>();

IColumn column = new CheckBoxHeaderColumn<TaskType>();
IColumn column = new CheckBoxHeaderColumn<>();
columns.add(column);

column = createTaskNameColumn(this, "pageTasks.task.name");
Expand Down Expand Up @@ -467,7 +480,7 @@ public String getObject() {
}

private List<InlineMenuItem> createTasksInlineMenu() {
List<InlineMenuItem> items = new ArrayList<InlineMenuItem>();
List<InlineMenuItem> items = new ArrayList<>();
items.add(new InlineMenuItem(createStringResource("pageTasks.button.suspendTask"), false,
new HeaderMenuAction(this) {

Expand Down Expand Up @@ -772,16 +785,10 @@ private boolean isSomeNodeSelected(List<NodeDto> nodes, AjaxRequestTarget target
return false;
}

//region Task-level actions
private void suspendTasksPerformed(AjaxRequestTarget target) {
List<TaskDto> taskTypeList = WebComponentUtil.getSelectedData(getTaskTable());
if (!isSomeTaskSelected(taskTypeList, target)) {
return;
}

private void suspendTasksPerformed(AjaxRequestTarget target, List<String> oidList) {
OperationResult result = new OperationResult(OPERATION_SUSPEND_TASKS);
try {
boolean suspended = getTaskService().suspendTasks(TaskDto.getOids(taskTypeList), WAIT_FOR_TASK_STOP, result);
boolean suspended = getTaskService().suspendTasks(oidList, WAIT_FOR_TASK_STOP, result);
result.computeStatus();
if (result.isSuccess()) {
if (suspended) {
Expand All @@ -799,15 +806,24 @@ private void suspendTasksPerformed(AjaxRequestTarget target) {
refreshTables(target);
}

private void resumeTasksPerformed(AjaxRequestTarget target) {
List<TaskDto> taskDtoList = WebComponentUtil.getSelectedData(getTaskTable());
if (!isSomeTaskSelected(taskDtoList, target)) {
private void suspendTaskPerformed(AjaxRequestTarget target, TaskDto dto) {
suspendTasksPerformed(target, Arrays.asList(dto.getOid()));
}

//region Task-level actions
private void suspendTasksPerformed(AjaxRequestTarget target) {
List<TaskDto> taskTypeList = WebComponentUtil.getSelectedData(getTaskTable());
if (!isSomeTaskSelected(taskTypeList, target)) {
return;
}

suspendTasksPerformed(target, TaskDto.getOids(taskTypeList));
}

private void resumeTasksPerformed(AjaxRequestTarget target, List<String> oids) {
OperationResult result = new OperationResult(OPERATION_RESUME_TASKS);
try {
getTaskService().resumeTasks(TaskDto.getOids(taskDtoList), result);
getTaskService().resumeTasks(oids, result);
result.computeStatus();
if (result.isSuccess()) {
result.recordStatus(OperationResultStatus.SUCCESS, "The task(s) have been successfully resumed.");
Expand All @@ -821,29 +837,50 @@ private void resumeTasksPerformed(AjaxRequestTarget target) {
refreshTables(target);
}

private void deleteTasksPerformed(AjaxRequestTarget target) {
private void resumeTaskPerformed(AjaxRequestTarget target, TaskDto dto) {
resumeTasksPerformed(target, Arrays.asList(dto.getOid()));
}

private void resumeTasksPerformed(AjaxRequestTarget target) {
List<TaskDto> taskDtoList = WebComponentUtil.getSelectedData(getTaskTable());
if (!isSomeTaskSelected(taskDtoList, target)) {
return;
}
ModalWindow dialog = (ModalWindow) get(ID_DELETE_TASKS_POPUP);
dialog.show(target);

resumeTasksPerformed(target, TaskDto.getOids(taskDtoList));
}

private void deleteAllClosedTasksPerformed(AjaxRequestTarget target) {
ModalWindow dialog = (ModalWindow) get(ID_DELETE_ALL_CLOSED_TASKS_POPUP);
private void deleteTaskPerformed(AjaxRequestTarget target, TaskDto dto) {
tasksToBeDeleted.clear();
tasksToBeDeleted.add(dto);

ModalWindow dialog = (ModalWindow) get(ID_DELETE_TASKS_POPUP);
dialog.show(target);
}

private void scheduleTasksPerformed(AjaxRequestTarget target) {
private void deleteTasksPerformed(AjaxRequestTarget target) {
tasksToBeDeleted.clear();

List<TaskDto> taskDtoList = WebComponentUtil.getSelectedData(getTaskTable());
if (!isSomeTaskSelected(taskDtoList, target)) {
return;
}

tasksToBeDeleted = taskDtoList;

ModalWindow dialog = (ModalWindow) get(ID_DELETE_TASKS_POPUP);
dialog.show(target);
}

private void deleteAllClosedTasksPerformed(AjaxRequestTarget target) {
ModalWindow dialog = (ModalWindow) get(ID_DELETE_ALL_CLOSED_TASKS_POPUP);
dialog.show(target);
}

private void scheduleTasksPerformed(AjaxRequestTarget target, List<String> oids) {
OperationResult result = new OperationResult(OPERATION_SCHEDULE_TASKS);
try {
getTaskService().scheduleTasksNow(TaskDto.getOids(taskDtoList), result);
getTaskService().scheduleTasksNow(oids, result);
result.computeStatus();
if (result.isSuccess()) {
result.recordStatus(OperationResultStatus.SUCCESS, "The task(s) have been successfully scheduled.");
Expand All @@ -856,6 +893,19 @@ private void scheduleTasksPerformed(AjaxRequestTarget target) {
//refresh feedback and table
refreshTables(target);
}

private void scheduleTaskPerformed(AjaxRequestTarget target, TaskDto dto) {
scheduleTasksPerformed(target, Arrays.asList(dto.getOid()));
}

private void scheduleTasksPerformed(AjaxRequestTarget target) {
List<TaskDto> taskDtoList = WebComponentUtil.getSelectedData(getTaskTable());
if (!isSomeTaskSelected(taskDtoList, target)) {
return;
}

scheduleTasksPerformed(target, TaskDto.getOids(taskDtoList));
}
//endregion

//region Node-level actions
Expand Down Expand Up @@ -1130,30 +1180,22 @@ private IModel<String> createDeleteConfirmString(final String oneDeleteKey, fina

@Override
public String getObject() {
Table table = getTaskTable();
List<TaskDto> selected = WebComponentUtil.getSelectedData(table);

switch (selected.size()) {
switch (tasksToBeDeleted.size()) {
case 1:
TaskDto first = selected.get(0);
TaskDto first = tasksToBeDeleted.get(0);
String name = first.getName();
return createStringResource(oneDeleteKey, name).getString();
default:
return createStringResource(moreDeleteKey, selected.size()).getString();
return createStringResource(moreDeleteKey, tasksToBeDeleted.size()).getString();
}
}
};
}

private void deleteTaskConfirmedPerformed(AjaxRequestTarget target) {
List<TaskDto> taskDtoList = WebComponentUtil.getSelectedData(getTaskTable());
if (!isSomeTaskSelected(taskDtoList, target)) {
return;
}

OperationResult result = new OperationResult(OPERATION_DELETE_TASKS);
try {
getTaskService().suspendAndDeleteTasks(TaskDto.getOids(taskDtoList), WAIT_FOR_TASK_STOP, true, result);
getTaskService().suspendAndDeleteTasks(TaskDto.getOids(tasksToBeDeleted), WAIT_FOR_TASK_STOP, true, result);
result.computeStatus();
if (result.isSuccess()) {
result.recordStatus(OperationResultStatus.SUCCESS, "The task(s) have been successfully deleted.");
Expand All @@ -1170,7 +1212,6 @@ private void deleteTaskConfirmedPerformed(AjaxRequestTarget target) {
refreshTables(target);
}


private static class SearchFragment extends Fragment {

public SearchFragment(String id, String markupId, MarkupContainer markupProvider,
Expand Down Expand Up @@ -1320,4 +1361,61 @@ private void deleteAllClosedTasksConfirmedPerformed(AjaxRequestTarget target) {
target.add(getFeedbackPanel());
}

private void addInlineMenuToTaskRow(TaskDto dto) {
addInlineMenuToTaskDto(dto);

List<TaskDto> list = new ArrayList<>();
if (dto.getSubtasks() != null) {
list.addAll(dto.getTransientSubtasks());
}
if (dto.getTransientSubtasks() != null) {
list.addAll(dto.getSubtasks());
}

for (TaskDto task : list) {
addInlineMenuToTaskDto(task);
}
}

private void addInlineMenuToTaskDto(final TaskDto dto) {
List<InlineMenuItem> items = dto.getMenuItems();
if (!items.isEmpty()) {
//menu was already added
return;
}

items.add(new InlineMenuItem(createStringResource("pageTasks.button.suspendTask"), false,
new HeaderMenuAction(this) {

@Override
public void onClick(AjaxRequestTarget target) {
suspendTaskPerformed(target, dto);
}
}));
items.add(new InlineMenuItem(createStringResource("pageTasks.button.resumeTask"), false,
new HeaderMenuAction(this) {

@Override
public void onClick(AjaxRequestTarget target) {
resumeTaskPerformed(target, dto);
}
}));
items.add(new InlineMenuItem(createStringResource("pageTasks.button.scheduleTask"), false,
new HeaderMenuAction(this) {

@Override
public void onClick(AjaxRequestTarget target) {
scheduleTaskPerformed(target, dto);
}
}));
items.add(new InlineMenuItem());
items.add(new InlineMenuItem(createStringResource("pageTasks.button.deleteTask"), false,
new HeaderMenuAction(this) {

@Override
public void onClick(AjaxRequestTarget target) {
deleteTaskPerformed(target, dto);
}
}));
}
}
Expand Up @@ -46,6 +46,8 @@
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.data.column.InlineMenuable;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.model.delta.DeltaDto;
import com.evolveum.midpoint.web.component.model.operationStatus.ModelOperationStatusDto;
import com.evolveum.midpoint.web.component.util.Selectable;
Expand All @@ -64,7 +66,7 @@
/**
* @author lazyman
*/
public class TaskDto extends Selectable {
public class TaskDto extends Selectable implements InlineMenuable {

public static final String CLASS_DOT = TaskDto.class.getName() + ".";
public static final String OPERATION_NEW = CLASS_DOT + "new";
Expand Down Expand Up @@ -93,6 +95,8 @@ public class TaskDto extends Selectable {
public static final String F_WORKER_THREADS = "workerThreads";
public static final String F_RESOURCE_REFERENCE = "resourceRef";

private List<InlineMenuItem> menuItems;

private List<String> handlerUriList;
private String parentTaskName;
private String parentTaskOid;
Expand Down Expand Up @@ -178,6 +182,14 @@ public TaskDto(TaskType taskType, ModelService modelService, TaskService taskSer
}
}

@Override
public List<InlineMenuItem> getMenuItems() {
if (menuItems == null) {
menuItems = new ArrayList<>();
}
return menuItems;
}

private void fillInResourceReference(TaskType task, TaskManager manager, OperationResult result, ModelService service, PageBase pageBase){
ObjectReferenceType ref = task.getObjectRef();

Expand Down Expand Up @@ -754,7 +766,7 @@ public OperationResult getTaskOperationResult() {
//endregion

public static List<String> getOids(List<TaskDto> taskDtoList) {
List<String> retval = new ArrayList<String>();
List<String> retval = new ArrayList<>();
for (TaskDto taskDto : taskDtoList) {
retval.add(taskDto.getOid());
}
Expand Down
Expand Up @@ -24,6 +24,8 @@
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
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;
Expand Down Expand Up @@ -87,8 +89,7 @@ public Iterator<? extends TaskDto> internalIterator(long first, long count) {
List<PrismObject<TaskType>> tasks = getModel().searchObjects(TaskType.class, query, searchOptions, operationTask, result);
for (PrismObject<TaskType> task : tasks) {
try {
TaskDto taskDto = new TaskDto(task.asObjectable(), getModel(), getTaskService(),
getModelInteractionService(), getTaskManager(), options, result, (PageBase)component);
TaskDto taskDto = createTaskDto(task, result);
getAvailableData().add(taskDto);
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Unhandled exception when getting task {} details", ex, task.getOid());
Expand All @@ -107,6 +108,13 @@ public Iterator<? extends TaskDto> internalIterator(long first, long count) {
return getAvailableData().iterator();
}

public TaskDto createTaskDto(PrismObject<TaskType> task, OperationResult result)
throws SchemaException, ObjectNotFoundException {

return new TaskDto(task.asObjectable(), getModel(), getTaskService(),
getModelInteractionService(), getTaskManager(), options, result, (PageBase)component);
}

@Override
protected int internalSize() {
int count = 0;
Expand Down

0 comments on commit ca47953

Please sign in to comment.