/* * 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) 2014, MPL CodeInside http://codeinside.ru */ package ru.codeinside.adm.ui.employee; 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.Compare; import com.vaadin.ui.Button; 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; /** * Виджет для просмотра всех сотрудников */ public class TableAllEmployee extends TableEmployee { final FilterTable table = new FilterTable(); HorizontalLayout hl = new HorizontalLayout(); private Button show = createButton("Просмотр"); private Button edit = createButton("Редактирование"); private Button unblock = createButton("Разблокировать"); private Button block = createButton("Заблокировать"); public TableAllEmployee(final boolean lockedFilterValue) { super(); this.lockedFilterValue = lockedFilterValue; setSizeFull(); setSpacing(true); table.setSizeFull(); table.setFilterBarVisible(true); table.setSelectable(true); table.setImmediate(true); table.setRowHeaderMode(Table.ROW_HEADER_MODE_HIDDEN); table.setColumnCollapsingAllowed(true); table.setColumnReorderingAllowed(true); table.setMultiSelect(false); table.addListener(new Property.ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { if (event.getProperty().getValue() == null) { buttonVisibleFalse(); } else { show.setVisible(true); edit.setVisible(true); if (lockedFilterValue) { hl.removeComponent(block); unblock.setVisible(true); hl.addComponent(unblock); } else { hl.removeComponent(unblock); block.setVisible(true); hl.addComponent(block); } } } }); buildContainer(table); table.setColumnHeaders(new String[]{ "Логин", "ФИО", "Права", "Дата регистрации", "Создатель", "Организация"}); table.setFilterDecorator(new FilterDecorator_()); buttonVisibleFalse(); addContextMenu(table); addComponent(table); setExpandRatio(table, 1f); } private void buildContainer(FilterTable table) { 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.addNestedContainerProperty("organization.name"); container.addContainerFilter(new Compare.Equal("locked", lockedFilterValue)); table.setContainerDataSource(container); table.setVisibleColumns(new Object[]{"login", "fio", "roles", "date", "creator", "organization.name"}); 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", 1f); table.setColumnExpandRatio("creator", 1f); table.setColumnExpandRatio("organization.name", 1f); } public void addButtonToLayout(HorizontalLayout hr) { this.hr = hr; hl.setSpacing(true); hl.addComponent(show); hl.addComponent(edit); hr.addComponent(hl); } private Button createButton(String caption) { Button button = null; if (caption.equals("Просмотр")) { button = new Button(caption, new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { view(table); buttonVisibleFalse(); hr.setVisible(false); } }); } else if (caption.equals("Редактирование")) { button = new Button(caption, new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { edit(table); buttonVisibleFalse(); hr.setVisible(false); } }); } else if (caption.equals("Разблокировать")) { button = new Button(caption, new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { unlockUserActionHandler(table); } }); } else if (caption.equals("Заблокировать")) { button = new Button(caption, new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { lockUserActionHandler(table); } }); } return button; } private void buttonVisibleFalse() { show.setVisible(false); edit.setVisible(false); unblock.setVisible(false); block.setVisible(false); } }