/* 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 org.activiti.explorer.ui.process.simple.editor.table; import java.util.ArrayList; import java.util.List; import org.activiti.engine.ProcessEngines; import org.activiti.engine.identity.Group; import org.activiti.engine.identity.User; import org.activiti.explorer.ExplorerApp; import org.activiti.explorer.I18nManager; import org.activiti.explorer.Messages; import org.activiti.explorer.ui.process.simple.editor.listener.AddTaskClickListener; import org.activiti.explorer.ui.process.simple.editor.listener.DeleteTaskClickListener; import org.activiti.explorer.ui.process.simple.editor.listener.ShowFormClickListener; import org.activiti.explorer.ui.process.simple.editor.listener.TaskFormModelListener; import org.activiti.workflow.simple.definition.HumanStepDefinition; import org.activiti.workflow.simple.definition.form.FormDefinition; import org.apache.commons.lang3.StringUtils; import com.vaadin.data.Item; import com.vaadin.ui.Button; import com.vaadin.ui.CheckBox; import com.vaadin.ui.ComboBox; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Table; import com.vaadin.ui.TextField; /** * @author Joram Barrez */ public class TaskTable extends Table implements TaskFormModelListener { private static final long serialVersionUID = -2578437667358797351L; public static final String ID_NAME = "name"; public static final String ID_ASSIGNEE = "assignee"; public static final String ID_GROUPS = "groups"; public static final String ID_DESCRIPTION = "description"; public static final String ID_START_WITH_PREVIOUS = "startWithPrevious"; public static final String ID_ACTIONS = "actions"; protected I18nManager i18nManager; protected TaskFormModel taskFormModel = new TaskFormModel(); public TaskTable() { this.i18nManager = ExplorerApp.get().getI18nManager(); this.taskFormModel.addFormModelListener(this); setEditable(true); setColumnReorderingAllowed(true); setSizeFull(); setPageLength(0); addContainerProperty(ID_NAME, String.class, null); addContainerProperty(ID_ASSIGNEE, ComboBox.class, null); addContainerProperty(ID_GROUPS, ComboBox.class, null); addContainerProperty(ID_DESCRIPTION, TextField.class, null); addContainerProperty(ID_START_WITH_PREVIOUS, CheckBox.class, null); addContainerProperty(ID_ACTIONS, HorizontalLayout.class, null); setColumnHeader(ID_NAME, i18nManager.getMessage(Messages.PROCESS_EDITOR_TASK_NAME)); setColumnHeader(ID_ASSIGNEE, i18nManager.getMessage(Messages.PROCESS_EDITOR_TASK_ASSIGNEE)); setColumnHeader(ID_GROUPS, i18nManager.getMessage(Messages.PROCESS_EDITOR_TASK_GROUPS)); setColumnHeader(ID_DESCRIPTION, i18nManager.getMessage(Messages.PROCESS_EDITOR_TASK_DESCRIPTION)); setColumnHeader(ID_START_WITH_PREVIOUS, i18nManager.getMessage(Messages.PROCESS_EDITOR_TASK_CONCURRENCY)); setColumnHeader(ID_ACTIONS, i18nManager.getMessage(Messages.PROCESS_EDITOR_ACTIONS)); setColumnAlignment(ID_NAME, ALIGN_CENTER); setColumnAlignment(ID_ASSIGNEE, ALIGN_CENTER); setColumnAlignment(ID_GROUPS, ALIGN_CENTER); setColumnAlignment(ID_START_WITH_PREVIOUS, ALIGN_CENTER); setColumnAlignment(ID_START_WITH_PREVIOUS, ALIGN_CENTER); setColumnWidth(ID_ACTIONS, 170); } public void addTaskRow(HumanStepDefinition humanStepDefinition) { Object taskItemId = addTaskRow(null, humanStepDefinition.getName(), humanStepDefinition.getAssignee(), getCommaSeperated(humanStepDefinition.getCandidateGroups()), humanStepDefinition.getDescription(), humanStepDefinition.isStartsWithPrevious()); if (humanStepDefinition.getForm() != null) { taskFormModel.addForm(taskItemId, humanStepDefinition.getForm()); } } protected String getCommaSeperated(List<String> list) { if(list != null && !list.isEmpty()) { return StringUtils.join(list, ", "); } return null; } public void addDefaultTaskRow() { addDefaultTaskRowAfter(null); } public void addDefaultTaskRowAfter(Object itemId) { addTaskRow(itemId, null, null, null, null, null); } protected Object addTaskRow(Object previousTaskItemId, String taskName, String taskAssignee, String taskGroups, String taskDescription, Boolean startWithPrevious) { Object newItemId = null; if (previousTaskItemId == null) { // add at the end of list newItemId = addItem(); } else { newItemId = addItemAfter(previousTaskItemId); } Item newItem = getItem(newItemId); // name newItem.getItemProperty(ID_NAME).setValue(taskName == null ? "my task" : taskName); // assignee ComboBox assigneeComboBox = new ComboBox(); assigneeComboBox.setNullSelectionAllowed(true); try { for (User user : ProcessEngines.getDefaultProcessEngine().getIdentityService().createUserQuery().orderByUserFirstName().asc().list()) { assigneeComboBox.addItem(user.getId()); assigneeComboBox.setItemCaption(user.getId(), user.getFirstName() + " " + user.getLastName()); } } catch(Exception e) { // Don't do anything. Will be an empty dropdown. } if (taskAssignee != null) { assigneeComboBox.select(taskAssignee); } newItem.getItemProperty(ID_ASSIGNEE).setValue(assigneeComboBox); // groups ComboBox groupComboBox = new ComboBox(); groupComboBox.setNullSelectionAllowed(true); try { for (Group group : ProcessEngines.getDefaultProcessEngine().getIdentityService().createGroupQuery().orderByGroupName().asc().list()) { groupComboBox.addItem(group.getId()); groupComboBox.setItemCaption(group.getId(), group.getName()); } } catch (Exception e) { // Don't do anything. Will be an empty dropdown. } if (taskGroups != null) { groupComboBox.select(taskGroups); } newItem.getItemProperty(ID_GROUPS).setValue(groupComboBox); // description TextField descriptionTextField = new TextField(); descriptionTextField.setColumns(16); descriptionTextField.setRows(1); if (taskDescription != null) { descriptionTextField.setValue(taskDescription); } newItem.getItemProperty(ID_DESCRIPTION).setValue(descriptionTextField); // concurrency CheckBox startWithPreviousCheckBox = new CheckBox(i18nManager.getMessage(Messages.PROCESS_EDITOR_TASK_START_WITH_PREVIOUS)); startWithPreviousCheckBox.setValue(startWithPrevious == null ? false : startWithPrevious); newItem.getItemProperty(ID_START_WITH_PREVIOUS).setValue(startWithPreviousCheckBox); // actions newItem.getItemProperty(ID_ACTIONS).setValue(generateActionButtons(newItemId)); return newItemId; } protected HorizontalLayout generateActionButtons(Object taskItemId) { HorizontalLayout actionButtons = new HorizontalLayout(); FormDefinition form = taskFormModel.getForm(taskItemId); Button formButton = new Button(form == null ? i18nManager.getMessage(Messages.PROCESS_EDITOR_TASK_FORM_CREATE) : i18nManager.getMessage(Messages.PROCESS_EDITOR_TASK_FORM_EDIT)); formButton.addListener(new ShowFormClickListener(taskFormModel, taskItemId)); formButton.setData(taskItemId); actionButtons.addComponent(formButton); Button deleteTaskButton = new Button("-"); deleteTaskButton.setData(taskItemId); deleteTaskButton.addListener(new DeleteTaskClickListener(this)); actionButtons.addComponent(deleteTaskButton); Button addTaskButton = new Button("+"); addTaskButton.setData(taskItemId); addTaskButton.addListener(new AddTaskClickListener(this)); actionButtons.addComponent(addTaskButton); return actionButtons; } public List<HumanStepDefinition> getSteps() { List<HumanStepDefinition> steps = new ArrayList<HumanStepDefinition>(); for (Object itemId : getItemIds()) { Item item = getItem(itemId); HumanStepDefinition humanStepDefinition = new HumanStepDefinition(); String name = (String) item.getItemProperty(ID_NAME).getValue(); if (name != null && name.length() > 0) { humanStepDefinition.setName(name); } String assignee = (String) ((ComboBox) item.getItemProperty(ID_ASSIGNEE).getValue()).getValue(); if (assignee != null && assignee.length() > 0) { humanStepDefinition.setAssignee(assignee); } String groups = (String) ((ComboBox) item.getItemProperty("groups").getValue()).getValue(); List<String> candidateGroups = new ArrayList<String>(); if (groups != null && groups.length() > 0) { for (String group : groups.split(",")) { candidateGroups.add(group.trim()); } } humanStepDefinition.setCandidateGroups(candidateGroups); String description = (String) ((TextField) item.getItemProperty(ID_DESCRIPTION).getValue()).getValue(); if (description != null && description.length() > 0) { humanStepDefinition.setDescription(description); } humanStepDefinition.setStartsWithPrevious((boolean) ((CheckBox) item.getItemProperty(ID_START_WITH_PREVIOUS).getValue()).booleanValue()); FormDefinition formDefinition = taskFormModel.getForm(itemId); humanStepDefinition.setForm(formDefinition); steps.add(humanStepDefinition); } return steps; } /** Implements FormModelListener */ public void formAdded(Object taskItemId) { getItem(taskItemId).getItemProperty(ID_ACTIONS).setValue(generateActionButtons(taskItemId)); } /** Implements FormModelListener */ public void formRemoved(Object taskItemId) { getItem(taskItemId).getItemProperty(ID_ACTIONS).setValue(generateActionButtons(taskItemId)); } }