///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.web.timesheet; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder; import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.spring.injection.annot.SpringBean; import org.projectforge.common.MyBeanComparator; import org.projectforge.task.TaskTree; import org.projectforge.timesheet.TimesheetDO; import org.projectforge.timesheet.TimesheetDao; import org.projectforge.web.calendar.DateTimeFormatter; import org.projectforge.web.fibu.ISelectCallerPage; import org.projectforge.web.user.UserFormatter; import org.projectforge.web.wicket.AbstractMassEditPage; import org.projectforge.web.wicket.AbstractSecuredPage; public class TimesheetMassUpdatePage extends AbstractMassEditPage implements ISelectCallerPage { private static final long serialVersionUID = -5549904132530779884L; private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(TimesheetMassUpdatePage.class); @SpringBean(name = "dateTimeFormatter") private DateTimeFormatter dateTimeFormatter; @SpringBean(name = "userFormatter") private UserFormatter userFormatter; @SpringBean(name = "taskTree") private TaskTree taskTree; @SpringBean(name = "timesheetDao") private TimesheetDao timesheetDao; private List<TimesheetDO> timesheets; private final TimesheetMassUpdateForm form; public TimesheetMassUpdatePage(final AbstractSecuredPage callerPage, final List<TimesheetDO> timesheets) { super(new PageParameters(), callerPage); this.timesheets = timesheets; form = new TimesheetMassUpdateForm(this); Integer taskId = null; for (final TimesheetDO sheet : timesheets) { if (taskId == null) { taskId = sheet.getTaskId(); } else if (taskId.equals(sheet.getTaskId()) == false) { taskId = null; break; } } if (taskId != null) { // All time sheets have the same task, so pre-select this task. timesheetDao.setTask(form.data, taskId); } body.add(form); form.init(); final List<IColumn<TimesheetDO, String>> columns = TimesheetListPage.createColumns(this, false, true, null, taskTree, userFormatter, dateTimeFormatter); @SuppressWarnings("serial") final SortableDataProvider<TimesheetDO, String> sortableDataProvider = new SortableDataProvider<TimesheetDO, String>() { public Iterator<TimesheetDO> iterator(final long first, final long count) { final SortParam sp = getSort(); final Comparator<TimesheetDO> comp = new MyBeanComparator<TimesheetDO>(sp.getProperty().toString(), sp.isAscending()); Collections.sort(timesheets, comp); return timesheets.subList((int)first, (int)(first + count)).iterator(); } public long size() { return timesheets != null ? timesheets.size() : 0; } public IModel<TimesheetDO> model(final TimesheetDO object) { return new Model<TimesheetDO>() { @Override public TimesheetDO getObject() { return object; } }; } }; sortableDataProvider.setSort("startTime", SortOrder.DESCENDING); final DefaultDataTable<TimesheetDO, String> dataTable = new DefaultDataTable<TimesheetDO, String>("table", columns, sortableDataProvider, 1000); body.add(dataTable); } public void cancelSelection(final String property) { // Do nothing. } public void select(final String property, final Object selectedValue) { if ("taskId".equals(property) == true) { timesheetDao.setTask(form.data, (Integer) selectedValue); form.refresh(); } else { log.error("Property '" + property + "' not supported for selection."); } } public void unselect(final String property) { if ("taskId".equals(property) == true) { form.data.setTask(null); form.refresh(); } else { log.error("Property '" + property + "' not supported for selection."); } } @Override protected String getTitle() { return getString("timesheet.massupdate.title"); } /** * @see org.projectforge.web.wicket.AbstractMassEditPage#updateAll() */ @Override protected void updateAll() { if (form.updateTask == false) { form.data.setTask(null); } timesheetDao.massUpdate(timesheets, form.data); super.updateAll(); } }