/* * This file is part of LibrePlan * * Copyright (C) 2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.libreplan.web.users.dashboard; import org.joda.time.LocalDate; import org.libreplan.business.advance.entities.AdvanceMeasurement; import org.libreplan.business.common.entities.PersonalTimesheetsPeriodicityEnum; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.planner.entities.Task; import org.libreplan.web.common.Util; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zkplus.spring.SpringUtil; import org.zkoss.zul.Button; import org.zkoss.zul.Row; import org.zkoss.zul.RowRenderer; import java.text.MessageFormat; import java.util.List; import static org.libreplan.web.I18nHelper._; /** * Controller for "My tasks" area in the user dashboard window. * * @author Manuel Rego Casasnovas <mrego@igalia.com> * @author Vova Perebykivskyi <vova@libreplan-enterprise.com> */ @SuppressWarnings("serial") public class MyTasksAreaController extends GenericForwardComposer { private IMyTasksAreaModel myTasksAreaModel; private IPersonalTimesheetController personalTimesheetController; private RowRenderer tasksRenderer = new RowRenderer() { @Override public void render(Row row, Object data, int i) throws Exception { Task task = (Task) data; row.setValue(task); OrderElement orderElement = task.getOrderElement(); Util.appendLabel(row, orderElement.getOrder().getName()); Util.appendLabel(row, task.getName()); Util.appendLabel(row, orderElement.getDescription()); Util.appendLabel(row, task.getStartAsLocalDate().toString()); Util.appendLabel(row, task.getEndAsLocalDate().toString()); Util.appendLabel(row, _("{0} h", task.getSumOfAssignedEffort().toHoursAsDecimalWithScale(0).toString())); Util.appendLabel(row, _("{0} h", orderElement.getEffortAsString())); Util.appendLabel(row, getProgress(orderElement)); appendTimeTrackingButton(row, task); } private String getProgress(OrderElement orderElement) { AdvanceMeasurement lastAdvanceMeasurement = orderElement.getLastAdvanceMeasurement(); return lastAdvanceMeasurement != null ? MessageFormat.format( "[{0} %] ({1})", lastAdvanceMeasurement.getValue(), lastAdvanceMeasurement.getDate()) : ""; } private void appendTimeTrackingButton(Row row, final Task task) { EventListener trackTimeButtonListener = new EventListener() { @Override public void onEvent(Event event) throws Exception { personalTimesheetController.goToCreateOrEditForm(getPersonalTimesheetDateForTask(task)); } private LocalDate getPersonalTimesheetDateForTask(Task task) { LocalDate start = task.getStartAsLocalDate(); LocalDate end = task.getEndAsLocalDate(); LocalDate currentDate = new LocalDate(); PersonalTimesheetsPeriodicityEnum periodicity = myTasksAreaModel.getPersonalTimesheetsPeriodicity(); LocalDate min = periodicity.getStart(currentDate); LocalDate max = periodicity.getEnd(currentDate); if (dateBetween(start, min, max)) { return start; } if (dateBetween(end, min, max)) { return end; } if (dateBetween(currentDate, start, end)) { return currentDate; } if (end.compareTo(min) < 0) { return end; } if (start.compareTo(max) > 0) { return start; } return currentDate; } private boolean dateBetween(LocalDate date, LocalDate start, LocalDate end) { return (date.compareTo(start) >= 0) && (date.compareTo(end) <= 0); } }; Button button = Util.createEditButton(trackTimeButtonListener); row.addEventListener(Events.ON_CLICK, trackTimeButtonListener); button.setTooltiptext(_("Track time")); row.appendChild(button); } }; @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); comp.setAttribute("controller", this); injectObjects(); } private void injectObjects() { if ( personalTimesheetController == null ) { personalTimesheetController = (IPersonalTimesheetController) SpringUtil.getBean("personalTimesheetController"); } if ( myTasksAreaModel == null ) { myTasksAreaModel = (IMyTasksAreaModel) SpringUtil.getBean("myTasksAreaModel"); } } public List<Task> getTasks() { return myTasksAreaModel.getTasks(); } public RowRenderer getTasksRenderer() { return tasksRenderer; } }