/*
* 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 static org.libreplan.web.I18nHelper._;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.logging.LogFactory;
import org.libreplan.business.common.exceptions.ValidationException;
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.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.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;
/**
* Controller for CRUD actions over a {@link SubcontractorCommunication}
*
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
@SuppressWarnings("serial")
public class SubcontractorCommunicationCRUDController extends GenericForwardComposer {
private static final org.apache.commons.logging.Log LOG = LogFactory
.getLog(SubcontractorCommunicationCRUDController.class);
private ISubcontractorCommunicationModel subcontractorCommunicationModel;
private SubcontractorCommunicationRenderer subcontractorCommunicationRenderer = new SubcontractorCommunicationRenderer();
protected IMessagesForUser messagesForUser;
private Component messagesContainer;
private Grid listing;
private Grid listingValues;
private Label labelValue;
private Popup pp;
@Resource
private IGlobalViewEntryPoints globalView;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
comp.setAttribute("controller", this);
messagesForUser = new MessagesForUser(messagesContainer);
}
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)
throws ValidationException {
subcontractorCommunicationModel.confirmSave(subcontractorCommunication);
}
public List<SubcontractorCommunication> getSubcontractorCommunications() {
FilterCommunicationEnum currentFilter = subcontractorCommunicationModel.getCurrentFilter();
switch(currentFilter){
case ALL: return subcontractorCommunicationModel.getSubcontractorAllCommunications();
case NOT_REVIEWED: return subcontractorCommunicationModel.getSubcontractorCommunicationWithoutReviewed();
default: return subcontractorCommunicationModel.getSubcontractorAllCommunications();
}
}
public SubcontractorCommunicationRenderer getSubcontractorCommunicationRenderer() {
return subcontractorCommunicationRenderer;
}
private class SubcontractorCommunicationRenderer implements
RowRenderer {
@Override
public void render(Row row, Object data) {
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,
new EventListener() {
@Override
public void onEvent(Event arg0) throws Exception {
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,
new EventListener() {
@Override
public void onEvent(Event arg0) throws Exception {
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, new EventListener() {
@Override
public void onEvent(Event arg0) throws Exception {
goToEdit(subcontractorCommunication);
}
});
row.appendChild(buttonEdit);
}
}
/**
* Apply filter to subcontractors communications
*
* @param event
*/
public void onApplyFilter(Event event) {
refreshSubcontractorCommunicationsList();
}
}