/*
* This file is part of LibrePlan
*
* Copyright (C) 2013 St. Antoniusziekenhuis
*
* 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.logs;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.logs.entities.IssueLog;
import org.libreplan.business.logs.entities.IssueTypeEnum;
import org.libreplan.business.logs.entities.LowMediumHighEnum;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.users.entities.User;
import org.libreplan.web.common.BaseCRUDController;
import org.libreplan.web.common.Util;
import org.libreplan.web.common.components.bandboxsearch.BandboxSearch;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Row;
import org.zkoss.zul.RowRenderer;
import org.zkoss.zul.Cell;
import org.zkoss.zul.Label;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zkplus.spring.SpringUtil;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static org.libreplan.web.I18nHelper._;
/**
* Controller for IssueLog CRUD actions.
*
* @author Misha Gozhda <misha@libreplan-enterprise.com>
*/
@SuppressWarnings("serial")
@org.springframework.stereotype.Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class IssueLogCRUDController extends BaseCRUDController<IssueLog> {
private IIssueLogModel issueLogModel;
private BandboxSearch bdProjectIssueLog;
private BandboxSearch bdUserIssueLog;
private Listbox status;
private boolean saved;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
issueLogModel = (IIssueLogModel) SpringUtil.getBean("issueLogModel");
status = (Listbox)comp.getFellow("editWindow").getFellow("listIssueLogStatus");
comp.setAttribute("issueLogController", this, true);
showListWindow();
initializeOrderComponent();
initializeUserComponent();
bdProjectIssueLog.setDisabled(!LogsController.getProjectNameVisibility());
bdUserIssueLog.setDisabled(true);
}
/**
* Initializes order component.
*/
private void initializeOrderComponent() {
bdProjectIssueLog = (BandboxSearch) editWindow.getFellow("bdProjectIssueLog");
Util.createBindingsFor(bdProjectIssueLog);
bdProjectIssueLog.setListboxEventListener(Events.ON_SELECT,
event -> {
final Object object = bdProjectIssueLog.getSelectedElement();
issueLogModel.setOrder((Order) object);
});
bdProjectIssueLog.setListboxEventListener(Events.ON_OK,
event -> {
final Object object = bdProjectIssueLog.getSelectedElement();
issueLogModel.setOrder((Order) object);
bdProjectIssueLog.close();
});
}
/**
* Initializes user component.
*/
private void initializeUserComponent() {
bdUserIssueLog = (BandboxSearch) editWindow.getFellow("bdUserIssueLog");
Util.createBindingsFor(bdUserIssueLog);
bdUserIssueLog.setListboxEventListener(Events.ON_SELECT, event -> {
final Object object = bdUserIssueLog.getSelectedElement();
issueLogModel.setCreatedBy((User) object);
});
bdUserIssueLog.setListboxEventListener(Events.ON_OK, event -> {
final Object object = bdUserIssueLog.getSelectedElement();
issueLogModel.setCreatedBy((User) object);
bdUserIssueLog.close();
});
}
/**
* Enumerations rendering.
*/
public static ListitemRenderer issueTypeRenderer = (item, data, i) -> {
IssueTypeEnum issueTypeEnum = (IssueTypeEnum) data;
String displayName = issueTypeEnum.getDisplayName();
item.setLabel(displayName);
};
public static ListitemRenderer lowMediumHighEnumRenderer = (item, data, i) -> {
LowMediumHighEnum lowMediumHighEnum = (LowMediumHighEnum) data;
String displayName = lowMediumHighEnum.getDisplayName();
item.setLabel(displayName);
};
/**
* Renders issue logs.
*
* @return {@link RowRenderer}
*/
public RowRenderer getIssueLogsRowRenderer() {
return (row, data, i) -> {
final IssueLog issueLog = (IssueLog) data;
row.setValue(issueLog);
appendObject(row, issueLog.getCode());
appendLabel(row, issueLog.getOrder().getName());
appendObject(row, issueLog.getType());
appendObject(row, issueLog.getStatus());
appendLabel(row, issueLog.getDescription());
appendLabel(row, issueLog.getPriority().getDisplayName());
appendLabel(row, issueLog.getSeverity().getDisplayName());
appendDate(row, issueLog.getDateRaised());
appendLabel(row, issueLog.getCreatedBy().getLoginName());
appendLabel(row, issueLog.getAssignedTo());
appendDate(row, issueLog.getDeadline());
appendDate(row, issueLog.getDateResolved());
appendLabel(row, issueLog.getNotes());
appendOperations(row, issueLog);
setPriorityCellColor(row, issueLog.getPriority());
};
}
private void setPriorityCellColor(Row row, LowMediumHighEnum priority) {
Cell cell = (Cell) row.getChildren().get(5);
if (priority == LowMediumHighEnum.LOW) {
cell.setClass("issueLog-priority-color-green");
}
if (priority == LowMediumHighEnum.MEDIUM) {
cell.setClass("issueLog-priority-color-yellow");
}
if (priority == LowMediumHighEnum.HIGH) {
cell.setClass("issueLog-priority-color-red");
}
}
/**
* Appends the specified <code>object</code> to the specified <code>row</code>.
*
* @param row
* @param object
*/
private void appendObject(final Row row, Object object) {
String text = "";
if (object != null) {
text = object.toString();
}
appendLabel(row, text);
}
/**
* Creates {@link Label} bases on the specified <code>value</code> and appends to the specified <code>row</code>.
*
* @param row
* @param value
*/
private void appendLabel(final Row row, String value) {
Label label = new Label(value);
Cell cell = new Cell();
cell.appendChild(label);
row.appendChild(cell);
}
/**
* Appends the specified <code>date</code> to the specified <code>row</code>.
*
* @param row
* @param date
*/
private void appendDate(final Row row, Date date) {
String labelDate = "";
if (date != null) {
labelDate = Util.formatDate(date);
}
appendLabel(row, labelDate);
}
/**
* Appends operation(edit and remove) to the specified <code>row</code>.
*
* @param row
* @param issueLog
*/
private void appendOperations(final Row row, final IssueLog issueLog) {
Hbox hbox = new Hbox();
hbox.appendChild(Util.createEditButton(event -> goToEditForm(issueLog)));
hbox.appendChild(Util.createRemoveButton(event -> confirmDelete(issueLog)));
row.appendChild(hbox);
}
/**
* Returns {@link LowMediumHighEnum} values.
*/
public LowMediumHighEnum[] getLowMediumHighEnum() {
return LowMediumHighEnum.values();
}
/**
* Returns {@link IssueTypeEnum} values.
*/
public IssueTypeEnum[] getIssueTypeEnum() {
return IssueTypeEnum.values();
}
/**
* Returns {@link ArrayList} values.
*/
public ArrayList<String> getIssueStatusEnum() {
ArrayList<String> result = new ArrayList<>();
if (getIssueLog().getType() == IssueTypeEnum.REQUEST_FOR_CHANGE){
result.add(_("Must have"));
result.add(_("Should have"));
result.add(_("Could have"));
result.add(_("Won't have"));
return result;
}
if (getIssueLog().getType() == IssueTypeEnum.PROBLEM_OR_CONCERN) {
result.add(_("Minor"));
result.add(_("Significant"));
result.add(_("Major"));
result.add(_("Critical"));
return result;
}
result.add(_("Low"));
result.add(_("Medium"));
result.add(_("High"));
return result;
}
public void updateStatusList(boolean ifNew) {
ListModelList model = new ListModelList<>(getIssueStatusEnum());
status.setModel(model);
if (ifNew)
status.setSelectedItem(status.getItemAtIndex(0));
else {
for(int i = 0; i < status.getItems().size(); i++) {
if (status.getModel().getElementAt(i).toString().equals(getIssueLog().getStatus())) {
status.setSelectedItem(status.getItemAtIndex(i));
break;
}
}
}
}
/**
* Returns a list of {@link Order} objects.
*/
public List<Order> getOrders() {
return issueLogModel.getOrders();
}
/**
* Returns a list of {@link User} objects.
*/
public List<User> getUsers() {
return issueLogModel.getUsers();
}
/**
* Returns {@link Date}.
*/
public Date getDateRaised() {
if (issueLogModel.getIssueLog() == null) {
return null;
}
return (issueLogModel.getIssueLog().getDateRaised() != null)
? issueLogModel.getIssueLog().getDateRaised()
: null;
}
/**
* Sets the date raised.
*
* @param date
* date raised
*/
public void setDateRaised(Date date) {
issueLogModel.getIssueLog().setDateRaised(date);
}
/**
* Returns {@link Date}.
*/
public Date getDateResolved() {
if (issueLogModel.getIssueLog() == null) {
return null;
}
return (issueLogModel.getIssueLog().getDateResolved() != null)
? issueLogModel.getIssueLog().getDateResolved()
: null;
}
/**
* Sets the date resolved.
*
* @param date
* the date resolved
*/
public void setDateResolved(Date date) {
issueLogModel.getIssueLog().setDateResolved(date);
}
/**
* Returns {@link Date}.
*/
public Date getDeadline() {
if (issueLogModel.getIssueLog() == null) {
return null;
}
return (issueLogModel.getIssueLog().getDeadline() != null)
? issueLogModel.getIssueLog().getDeadline() // this is a getIntegrationEntityDAO method
: null;
}
public void setDeadline(Date date) {
issueLogModel.getIssueLog().setDeadline(date);
}
/**
* Returns the {@link IssueLog} object.
*/
public IssueLog getIssueLog() {
return issueLogModel.getIssueLog();
}
/**
* Returns a list of {@link IssueLog} objects.
*/
public List<IssueLog> getIssueLogs() {
if (LogsController.getProjectNameVisibility())
return issueLogModel.getIssueLogs();
else {
List<IssueLog> issueLogs = new ArrayList<>();
Order order = LogsController.getOrder();
for (IssueLog issueLog : issueLogModel.getIssueLogs()) {
if (issueLog.getOrder().equals(order))
issueLogs.add(issueLog);
}
return issueLogs;
}
}
public Order getOrder() {
if (!LogsController.getProjectNameVisibility()){
this.getIssueLog().setOrder(LogsController.getOrder());
return getIssueLog().getOrder();
}
else
return getIssueLog().getOrder();
}
@Override
protected String getEntityType() {
return _("issuelog-number");
}
@Override
protected String getPluralEntityType() {
return _("Issue logs");
}
@Override
protected void initCreate() {
issueLogModel.initCreate();
updateStatusList(true);
}
@Override
protected void initEdit(IssueLog entity) {
issueLogModel.initEdit(entity);
updateStatusList(false);
}
@Override
protected void save() throws ValidationException {
if (getIssueLog().getOrder() == null) {
throw new WrongValueException(bdProjectIssueLog, _("please select a project"));
}
if (getIssueLog().getCreatedBy() == null) {
throw new WrongValueException(bdUserIssueLog, _("please select an author"));
}
getIssueLog().setStatus(status.getSelectedItem().getLabel());
issueLogModel.confirmSave();
saved = true;
}
@Override
protected IssueLog getEntityBeingEdited() {
return issueLogModel.getIssueLog();
}
@Override
protected void delete(IssueLog entity) throws InstanceNotFoundException {
issueLogModel.remove(entity);
}
public void setIssueLogToModel (IssueLog log) {
this.issueLogModel.setIssueLog(log);
}
public Boolean isIssueLogSaved () {
return saved;
}
public void setDefaultStatus() {
status.setSelectedIndex(0);
}
}