/* * This file is part of LibrePlan * * Copyright (C) 2011 WirelessGalicia, 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.subcontract; import org.libreplan.business.externalcompanies.entities.CommunicationType; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.planner.entities.SubcontractedTaskData; import org.libreplan.business.planner.entities.SubcontractorCommunication; import org.libreplan.business.planner.entities.SubcontractorCommunicationValue; import org.libreplan.business.planner.entities.TaskElement; import org.libreplan.web.common.IMessagesForUser; import org.libreplan.web.common.MessagesForUser; import org.libreplan.web.common.Util; import org.libreplan.web.planner.tabs.IGlobalViewEntryPoints; import org.zkoss.zk.ui.Component; 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.Checkbox; import org.zkoss.zul.Grid; import org.zkoss.zul.Label; import org.zkoss.zul.Popup; import org.zkoss.zul.Row; import org.zkoss.zul.RowRenderer; import org.zkoss.zul.SimpleListModel; import java.util.List; import static org.libreplan.web.I18nHelper._; /** * Controller for CRUD actions over a {@link SubcontractorCommunication} * * @author Susana Montes Pedreira <smontes@wirelessgalicia.com> */ @SuppressWarnings("serial") public class SubcontractorCommunicationCRUDController extends GenericForwardComposer { private ISubcontractorCommunicationModel subcontractorCommunicationModel; private SubcontractorCommunicationRenderer subcontractorCommunicationRenderer = new SubcontractorCommunicationRenderer(); private IGlobalViewEntryPoints globalView; protected IMessagesForUser messagesForUser; private Component messagesContainer; private Grid listing; private Grid listingValues; private Popup pp; public SubcontractorCommunicationCRUDController() {} @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); comp.setAttribute("controller", this); injectsObjects(); messagesForUser = new MessagesForUser(messagesContainer); } private void injectsObjects() { subcontractorCommunicationModel = (ISubcontractorCommunicationModel) SpringUtil.getBean("subcontractorCommunicationModel"); globalView = (IGlobalViewEntryPoints) SpringUtil.getBean("globalView"); } public void goToEdit(SubcontractorCommunication subcontractorCommunication) { if (subcontractorCommunication != null) { TaskElement task = subcontractorCommunication.getSubcontractedTaskData().getTask(); OrderElement orderElement = task.getOrderElement(); Order order = subcontractorCommunicationModel.getOrder(orderElement); if (subcontractorCommunication.getCommunicationType().equals(CommunicationType.PROGRESS_UPDATE)) { globalView.goToAdvanceTask(order,task); } else { globalView.goToOrderDetails(order); } } } public FilterCommunicationEnum[] getFilterItems(){ return FilterCommunicationEnum.values(); } public FilterCommunicationEnum getCurrentFilterItem() { return subcontractorCommunicationModel.getCurrentFilter(); } public void setCurrentFilterItem(FilterCommunicationEnum selected) { subcontractorCommunicationModel.setCurrentFilter(selected); refreshSubcontractorCommunicationsList(); } private void refreshSubcontractorCommunicationsList() { // Update the subcontractor communication list listing.setModel(new SimpleListModel<>(getSubcontractorCommunications())); listing.invalidate(); } protected void save(SubcontractorCommunication subcontractorCommunication) { subcontractorCommunicationModel.confirmSave(subcontractorCommunication); } public List<SubcontractorCommunication> getSubcontractorCommunications() { FilterCommunicationEnum currentFilter = subcontractorCommunicationModel.getCurrentFilter(); switch(currentFilter) { case NOT_REVIEWED: return subcontractorCommunicationModel.getSubcontractorCommunicationWithoutReviewed(); case ALL: default: return subcontractorCommunicationModel.getSubcontractorAllCommunications(); } } public SubcontractorCommunicationRenderer getSubcontractorCommunicationRenderer() { return subcontractorCommunicationRenderer; } private class SubcontractorCommunicationRenderer implements RowRenderer { @Override public void render(Row row, Object data, int i) { SubcontractorCommunication subcontractorCommunication = (SubcontractorCommunication) data; row.setValue(subcontractorCommunication); final boolean reviewed = subcontractorCommunication.getReviewed(); if (!reviewed) { row.setSclass("communication-not-reviewed"); } appendLabel(row, subcontractorCommunication.getCommunicationType().toString()); appendLabel(row, subcontractorCommunication.getSubcontractedTaskData().getTask().getName()); appendLabel(row, getOrderName(subcontractorCommunication.getSubcontractedTaskData())); appendLabel(row, getOrderCode(subcontractorCommunication.getSubcontractedTaskData())); appendLabel(row, subcontractorCommunication.getSubcontractedTaskData().getExternalCompany().getName()); appendLabel(row, Util.formatDateTime(subcontractorCommunication.getCommunicationDate())); appendLabelWithTooltip(row, subcontractorCommunication); appendCheckbox(row, subcontractorCommunication); appendOperations(row, subcontractorCommunication); } private String getOrderCode(SubcontractedTaskData subcontractedTaskData) { return subcontractorCommunicationModel.getOrderCode(subcontractedTaskData); } private String getOrderName(SubcontractedTaskData subcontractedTaskData) { return subcontractorCommunicationModel.getOrderName(subcontractedTaskData); } private String getLastValue(SubcontractorCommunication subcontractorCommunication) { SubcontractorCommunicationValue value = subcontractorCommunication.getLastSubcontractorCommunicationValues(); return (value != null) ? value.toString() : ""; } private void appendLabel(Row row, String label) { row.appendChild(new Label(label)); } private void appendLabelWithTooltip(final Row row, final SubcontractorCommunication subcontractorCommunication) { String lastValue = getLastValue(subcontractorCommunication); final Label compLabel = new Label(lastValue); if (subcontractorCommunication.getCommunicationType().equals(CommunicationType.PROGRESS_UPDATE)) { compLabel.setTooltip(pp); compLabel.addEventListener(Events.ON_MOUSE_OVER, arg0 -> { List<SubcontractorCommunicationValue> model = subcontractorCommunication.getSubcontractorCommunicationValues(); listingValues.setModel(new SimpleListModel<>(model)); listingValues.invalidate(); }); } row.appendChild(compLabel); } private void appendCheckbox(final Row row, final SubcontractorCommunication subcontractorCommunication) { final Checkbox checkBoxReviewed = new Checkbox(); checkBoxReviewed.setChecked(subcontractorCommunication.getReviewed()); checkBoxReviewed.addEventListener(Events.ON_CHECK, arg0 -> { subcontractorCommunication.setReviewed(checkBoxReviewed.isChecked()); save(subcontractorCommunication); updateRowClass(row, checkBoxReviewed.isChecked()); }); row.appendChild(checkBoxReviewed); } private void updateRowClass(final Row row, Boolean reviewed){ row.setSclass(""); if (!reviewed) { row.setSclass("communication-not-reviewed"); } } private void appendOperations(Row row, final SubcontractorCommunication subcontractorCommunication) { Button buttonEdit = new Button(); buttonEdit.setSclass("icono"); buttonEdit.setImage("/common/img/ico_editar1.png"); buttonEdit.setHoverImage("/common/img/ico_editar.png"); buttonEdit.setTooltiptext(_("Edit")); buttonEdit.addEventListener(Events.ON_CLICK, arg0 -> goToEdit(subcontractorCommunication)); row.appendChild(buttonEdit); } } /** * Apply filter to subcontractors communications. */ public void onApplyFilter() { refreshSubcontractorCommunicationsList(); } }