/* 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.task; import java.util.Collection; import java.util.List; import org.activiti.engine.ProcessEngines; import org.activiti.engine.TaskService; import org.activiti.engine.task.IdentityLink; import org.activiti.engine.task.IdentityLinkType; import org.activiti.engine.task.Task; import org.activiti.explorer.ExplorerApp; import org.activiti.explorer.I18nManager; import org.activiti.explorer.Messages; import org.activiti.explorer.ViewManager; import org.activiti.explorer.ui.custom.SelectUsersPopupWindow; import org.activiti.explorer.ui.event.SubmitEvent; import org.activiti.explorer.ui.event.SubmitEventListener; import org.activiti.explorer.ui.mainlayout.ExplorerLayout; import org.activiti.explorer.ui.task.listener.ChangeOwnershipListener; import org.activiti.explorer.ui.task.listener.ReassignAssigneeListener; import org.activiti.explorer.ui.task.listener.RemoveInvolvedPersonListener; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.GridLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.VerticalLayout; /** * Component for a {@link TaskPage} that displays all people involved with the task. * * @author Joram Barrez */ public class TaskInvolvedPeopleComponent extends CustomComponent { private static final long serialVersionUID = 1L; protected I18nManager i18nManager; protected ViewManager viewManager; protected TaskService taskService; protected Task task; protected TaskDetailPanel taskDetailPanel; protected VerticalLayout layout; protected Label title; protected Button addPeopleButton; protected GridLayout peopleGrid; public TaskInvolvedPeopleComponent(Task task, TaskDetailPanel taskDetailPanel) { this.task = task; this.taskDetailPanel = taskDetailPanel; this.i18nManager = ExplorerApp.get().getI18nManager(); this.viewManager = ExplorerApp.get().getViewManager(); this.taskService = ProcessEngines.getDefaultProcessEngine().getTaskService(); initUi(); } protected void initUi() { addStyleName(ExplorerLayout.STYLE_DETAIL_BLOCK); addStyleName(ExplorerLayout.STYLE_INVOLVE_PEOPLE); initLayout(); initHeader(); initPeopleGrid(); } protected void initLayout() { this.layout = new VerticalLayout(); setCompositionRoot(layout); } protected void initHeader() { HorizontalLayout headerLayout = new HorizontalLayout(); headerLayout.setWidth(100, UNITS_PERCENTAGE); layout.addComponent(headerLayout); initTitle(headerLayout); initAddPeopleButton(headerLayout); } protected void initTitle(HorizontalLayout headerLayout) { title = new Label(i18nManager.getMessage(Messages.TASK_PEOPLE)); title.addStyleName(ExplorerLayout.STYLE_H3); title.setWidth(100, UNITS_PERCENTAGE); headerLayout.addComponent(title); headerLayout.setExpandRatio(title, 1.0f); } protected void initAddPeopleButton(HorizontalLayout headerLayout) { addPeopleButton = new Button(); addPeopleButton.addStyleName(ExplorerLayout.STYLE_ADD); headerLayout.addComponent(addPeopleButton); addPeopleButton.addListener(new ClickListener() { public void buttonClick(ClickEvent event) { final SelectUsersPopupWindow involvePeoplePopupWindow = new SelectUsersPopupWindow(i18nManager.getMessage(Messages.PEOPLE_INVOLVE_POPUP_CAPTION), true); involvePeoplePopupWindow.addListener(new SubmitEventListener() { protected void submitted(SubmitEvent event) { Collection<String> selectedUserIds = involvePeoplePopupWindow.getSelectedUserIds(); for (String userId : selectedUserIds) { String role = involvePeoplePopupWindow.getSelectedUserRole(userId); taskService.addUserIdentityLink(task.getId(), userId, role); } taskDetailPanel.notifyPeopleInvolvedChanged(); } protected void cancelled(SubmitEvent event) { } }); viewManager.showPopupWindow(involvePeoplePopupWindow); } }); } protected void initPeopleGrid() { peopleGrid = new GridLayout(); peopleGrid.setColumns(2); peopleGrid.setSpacing(true); peopleGrid.setMargin(true, false, false, false); peopleGrid.setWidth(100, UNITS_PERCENTAGE); layout.addComponent(peopleGrid); populatePeopleGrid(); } protected void populatePeopleGrid() { initOwner(); initAssignee(); initInvolvedPeople(); } protected void initOwner() { UserDetailsComponent ownerDetails = createOwnerComponent(); peopleGrid.addComponent(ownerDetails); } protected UserDetailsComponent createOwnerComponent() { String roleMessage = task.getOwner() != null ? Messages.TASK_OWNER : Messages.TASK_NO_OWNER; return new UserDetailsComponent( task.getOwner(), i18nManager.getMessage(roleMessage), i18nManager.getMessage(Messages.TASK_OWNER_TRANSFER), new ChangeOwnershipListener(task, taskDetailPanel)); } protected void initAssignee() { UserDetailsComponent assigneeDetails = createAssigneeComponent(); peopleGrid.addComponent(assigneeDetails); } protected UserDetailsComponent createAssigneeComponent() { String roleMessage = task.getAssignee() != null ? Messages.TASK_ASSIGNEE : Messages.TASK_NO_ASSIGNEE; return new UserDetailsComponent( task.getAssignee(), i18nManager.getMessage(roleMessage), i18nManager.getMessage(Messages.TASK_ASSIGNEE_REASSIGN), new ReassignAssigneeListener(task, taskDetailPanel)); } protected void initInvolvedPeople() { List<IdentityLink> identityLinks = taskService.getIdentityLinksForTask(task.getId()); for (final IdentityLink identityLink : identityLinks) { if (identityLink.getUserId() != null) { // only user identity links, ignoring the group ids if (!IdentityLinkType.ASSIGNEE.equals(identityLink.getType()) && !IdentityLinkType.OWNER.equals(identityLink.getType())) { UserDetailsComponent involvedDetails = new UserDetailsComponent( identityLink.getUserId(), identityLink.getType(), i18nManager.getMessage(Messages.TASK_INVOLVED_REMOVE), new RemoveInvolvedPersonListener(identityLink, task, taskDetailPanel)); peopleGrid.addComponent(involvedDetails); } } } } public void refreshPeopleGrid() { task = taskService.createTaskQuery().taskId(task.getId()).singleResult(); peopleGrid.removeAllComponents(); populatePeopleGrid(); } public void refreshAssignee() { task = taskService.createTaskQuery().taskId(task.getId()).singleResult(); peopleGrid.removeComponent(1, 0); peopleGrid.addComponent(createAssigneeComponent(), 1, 0); } public void refreshOwner() { task = taskService.createTaskQuery().taskId(task.getId()).singleResult(); peopleGrid.removeComponent(0, 0); peopleGrid.addComponent(createOwnerComponent(), 0, 0); } }