/* * 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; import com.vaadin.addon.jpacontainer.JPAContainer; import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; import com.vaadin.data.Container; import com.vaadin.data.Item; import com.vaadin.event.Action; import org.tepi.filtertable.FilterTable; import org.vaadin.dialogs.ConfirmDialog; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.adm.database.BusinessCalendarDate; import ru.codeinside.gses.activiti.Pair; import ru.codeinside.jpa.ActivitiEntityManager; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import static com.vaadin.ui.Window.Notification.TYPE_TRAY_NOTIFICATION; final class BusinessDatesTable extends FilterTable { static final Action ACTION_DELETE = new Action("Удалить"); static final Action[] ACTIONS = new Action[]{ACTION_DELETE}; BusinessDatesTable() { super("Производственный календарь"); addStyleName("small striped"); setImmediate(true); setFilterBarVisible(true); setSelectable(true); setSizeFull(); addContainerProperty("date", Date.class, null); addContainerProperty("workedDay", Boolean.class, null); setVisibleColumns(new String[]{"date", "workedDay"}); setColumnHeaders(new String[]{"Дата", "Рабочий день"}); setColumnExpandRatio("date", 0.8f); setPageLength(0); setSortContainerPropertyId("date"); setFilterDecorator(new FilterDecorator_() { @Override public DateFormat getDateFormat(Object propertyId) { return new SimpleDateFormat("dd.MM.yyyy"); } }); setFilterGenerator(new FilterGenerator_(null, Arrays.asList("workedDay"))); final JPAContainer<BusinessCalendarDate> container = new JPAContainer<BusinessCalendarDate>(BusinessCalendarDate.class); container.setReadOnly(true); container.setEntityProvider(new CachingLocalEntityProvider<BusinessCalendarDate>(BusinessCalendarDate.class, ActivitiEntityManager.INSTANCE)); setContainerDataSource(container); addGeneratedColumn("date", new DateColumnGenerator("dd.MM.yyyy")); addGeneratedColumn("workedDay", new BooleanColumnGenerator()); addContextMenu(); } protected void addContextMenu() { addActionHandler(new Action.Handler() { private static final long serialVersionUID = 1L; public Action[] getActions(Object target, Object sender) { ArrayList<Action> result = new ArrayList<Action>(ACTIONS.length + 1); result.addAll(Arrays.asList(ACTIONS)); return result.toArray(new Action[result.size()]); } public void handleAction(Action action, Object sender, Object target) { final Item item = getItem(getValue()); if (item != null) { if (ACTION_DELETE == action) { deleteBusinessCalendarItem(); refresh(); } } } }); } public void deleteBusinessCalendarItem() { final Item item = getItem(getValue()); ConfirmDialog.show(getWindow(), "Производственный календарь", "Подтвердите удаление", "Подтверждаю", "Отмена", new ConfirmDialog.Listener() { public void onClose(ConfirmDialog dialog) { if (dialog.isConfirmed()) { deleteCalendarItem(item); } } }); } private void deleteCalendarItem(Item item) { final Date dateForRemove = (Date) item.getItemProperty("date").getValue(); Pair<Integer, Integer> count = AdminServiceProvider.get().deleteDateFromBusinessCalendar(dateForRemove); refresh(); getWindow().showNotification( "Удаление записи календаря", "Обновлено заявок: " + count.get_1() + ", этапов: " + count.get_2(), TYPE_TRAY_NOTIFICATION); } public void refresh() { setValue(null); Container container = getContainerDataSource(); if (container instanceof JPAContainer) { ((JPAContainer) container).getEntityProvider().refresh(); } refreshRowCache(); } }