/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.adm.ui.employee; import com.google.common.collect.ImmutableList; import com.vaadin.addon.jpacontainer.JPAContainer; import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; import com.vaadin.addon.jpacontainer.util.DefaultQueryModifierDelegate; import com.vaadin.data.Property; import com.vaadin.data.util.filter.And; import com.vaadin.data.util.filter.Compare; import com.vaadin.ui.Button; import com.vaadin.ui.CustomTable; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Table; import org.tepi.filtertable.FilterTable; import ru.codeinside.adm.database.Employee; import ru.codeinside.adm.ui.DateColumnGenerator; import ru.codeinside.adm.ui.FilterDecorator_; import ru.codeinside.jpa.ActivitiEntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import javax.persistence.criteria.Selection; import java.util.List; /** * Виджет для отображения сотрудников организации */ public class TableOrganizationEmployee extends TableEmployee { final static String[] NAMES = {"Логин", "ФИО", "Права", "Дата регистрации", "Создатель"}; public TableOrganizationEmployee(long orgId) { setWidth("100%"); this.lockedFilterValue = false; final FilterTable table = new FilterTable(); table.setSizeFull(); table.setSelectable(true); table.setMultiSelect(false); table.setRowHeaderMode(Table.ROW_HEADER_MODE_HIDDEN); table.setColumnCollapsingAllowed(true); table.setColumnReorderingAllowed(true); table.setImmediate(true); addComponent(table); addContainerProperty(table, orgId); table.setFilterBarVisible(true); table.setColumnHeaders(NAMES); table.setFilterDecorator(new FilterDecorator_()); addContextMenu(table); final EmployeeEditorButtonGroup buttonGroup = new EmployeeEditorButtonGroup(this, table); addComponent(buttonGroup, 0); } private void addContainerProperty(final CustomTable table, long orgId) { final JPAContainer<Employee> container = new JPAContainer<Employee>(Employee.class); container.setReadOnly(true); container.setEntityProvider(new CachingLocalEntityProvider<Employee>(Employee.class, ActivitiEntityManager.INSTANCE)); container.getEntityProvider().setQueryModifierDelegate(new DefaultQueryModifierDelegate() { @Override public void queryHasBeenBuilt(CriteriaBuilder criteriaBuilder, CriteriaQuery<?> query) { if (query.getSelection().getJavaType().equals(Long.class)) { Root root = query.getRoots().iterator().next(); Selection x = criteriaBuilder.countDistinct(root); query.select(x); } else { query.distinct(true); } } }); container.addContainerFilter(new And(new Compare.Equal("locked", lockedFilterValue), new Compare.Equal("organization.id", orgId))); table.setContainerDataSource(container); table.setVisibleColumns(new Object[]{"login", "fio", "roles", "date", "creator"}); table.addGeneratedColumn("date", new DateColumnGenerator("dd.MM.yyyy HH:mm:ss")); table.addGeneratedColumn("roles", new RolesColumn()); table.setColumnExpandRatio("login", 1f); table.setColumnExpandRatio("fio", 1.5f); table.setColumnExpandRatio("roles", 4f); table.setColumnExpandRatio("date", 1.2f); table.setColumnExpandRatio("creator", 1f); } class EmployeeEditorButtonGroup extends HorizontalLayout { private List<Button> buttons; EmployeeEditorButtonGroup(final TableEmployee tableEmployee, final CustomTable customTable) { setSpacing(true); setMargin(false, true, true, false); buttons = ImmutableList.of(createEditButton(tableEmployee, customTable), createViewButton(tableEmployee, customTable), createLockButton(tableEmployee, customTable)); for (Button button : buttons) { this.addComponent(button); } setEnabled(customTable.getValue() != null); customTable.addListener(new Property.ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(Property.ValueChangeEvent event) { setEnabled(customTable.getValue() != null); } }); } private Button createEditButton(final TableEmployee tableEmployee, final CustomTable customTable) { Button editButton = new Button("Редактировать"); editButton.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { tableEmployee.edit(customTable); setEnabled(false); } }); return editButton; } private Button createViewButton(final TableEmployee tableEmployee, final CustomTable customTable) { Button viewButton = new Button("Просмотр"); viewButton.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { tableEmployee.view(customTable); setEnabled(false); } }); return viewButton; } private Button createLockButton(final TableEmployee tableEmployee, final CustomTable customTable) { Button lockButton = new Button("Заблокировать"); lockButton.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { tableEmployee.lockUserActionHandler(customTable); } }); return lockButton; } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); for (Button button : buttons) { button.setEnabled(enabled); } } } }