/* * 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.LowMediumHighEnum; import org.libreplan.business.logs.entities.RiskLog; import org.libreplan.business.logs.entities.RiskScoreStatesEnum; 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.zkplus.spring.SpringUtil; import org.zkoss.zul.Textbox; import org.zkoss.zul.Hbox; import org.zkoss.zul.Row; import org.zkoss.zul.Cell; import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.Label; import org.zkoss.zul.RowRenderer; import java.nio.charset.UnsupportedCharsetException; import java.util.ArrayList; import java.util.Date; import java.util.List; import static org.libreplan.web.I18nHelper._; /** * Controller for RiskLog CRUD actions. * * @author Misha Gozhda <misha@libreplan-enterprise.com> */ @org.springframework.stereotype.Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class RiskLogCRUDController extends BaseCRUDController<RiskLog> { private IRiskLogModel riskLogModel; private BandboxSearch bdProjectRiskLog; private BandboxSearch bdUserRiskLog; private Textbox riskScore; private boolean saved; /** * Renders LOW, MEDIUM, HIGH enums. * * Should be public! * Used in _editRiskLog.zul */ public static ListitemRenderer lowMediumHighEnumRenderer = (item, data, i) -> { LowMediumHighEnum lowMediumHighEnum = (LowMediumHighEnum) data; String displayName = lowMediumHighEnum.getDisplayName(); item.setLabel(displayName); }; /** * Renders riskScoreState enums. * * Should be public! * Used in _editRiskLog.zul */ public static ListitemRenderer riskScoreStatesEnumRenderer = (item, data, i) -> { RiskScoreStatesEnum riskScoreStatesEnum = (RiskScoreStatesEnum) data; String displayName = riskScoreStatesEnum.getDisplayName(); item.setLabel(displayName); }; public RiskLogCRUDController() { riskLogModel = (IRiskLogModel) SpringUtil.getBean("riskLogModel"); } @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); riskScore = (Textbox)comp.getFellow("editWindow").getFellow("riskScore"); comp.setAttribute("riskLogController", this, true); showListWindow(); initializeOrderComponent(); initializeUserComponent(); bdProjectRiskLog.setDisabled(!LogsController.getProjectNameVisibility()); bdUserRiskLog.setDisabled(true); } /** * Initializes order component. */ private void initializeOrderComponent() { bdProjectRiskLog = (BandboxSearch) editWindow.getFellow("bdProjectRiskLog"); Util.createBindingsFor(bdProjectRiskLog); bdProjectRiskLog.setListboxEventListener(Events.ON_SELECT, event -> { final Object object = bdProjectRiskLog.getSelectedElement(); riskLogModel.setOrder((Order) object); }); bdProjectRiskLog.setListboxEventListener(Events.ON_OK, event -> { final Object object = bdProjectRiskLog.getSelectedElement(); riskLogModel.setOrder((Order) object); bdProjectRiskLog.close(); }); } /** * Initializes user component. */ private void initializeUserComponent() { bdUserRiskLog = (BandboxSearch) editWindow.getFellow("bdUserRiskLog"); Util.createBindingsFor(bdUserRiskLog); bdUserRiskLog.setListboxEventListener(Events.ON_SELECT, event -> { final Object object = bdUserRiskLog.getSelectedElement(); riskLogModel.setCreatedBy((User) object); }); bdUserRiskLog.setListboxEventListener(Events.ON_OK, event -> { final Object object = bdUserRiskLog.getSelectedElement(); riskLogModel.setCreatedBy((User) object); bdUserRiskLog.close(); }); } /** * Renders risk logs. * Should be public! * Used in _listRiskLog.zul * * @return {@link RowRenderer} */ public RowRenderer getRiskLogsRowRenderer() { return (row, data, i) -> { final RiskLog riskLog = (RiskLog) data; row.setValue(riskLog); appendObject(row, riskLog.getCode()); appendLabel(row, riskLog.getOrder().getName()); appendObject(row, riskLog.getProbability()); appendObject(row, riskLog.getImpact()); appendObject(row, riskLog.getRiskScore()); appendLabel(row, riskLog.getStatus()); appendLabel(row, riskLog.getDescription()); appendDate(row, riskLog.getDateCreated()); appendLabel(row, riskLog.getCreatedBy().getFullName() + riskLog.getCreatedBy().getLoginName()); appendLabel(row, riskLog.getCounterMeasures()); appendLabel(row, riskLog.getScoreAfterCM().getDisplayName()); appendLabel(row, riskLog.getContingency()); appendLabel(row, riskLog.getResponsible()); appendDate(row, riskLog.getActionWhen()); appendLabel(row, riskLog.getNotes()); appendOperations(row, riskLog); setScoreCellColor(row, riskLog.getRiskScore()); }; } private void setScoreCellColor(Row row, int riskScore) { Cell cell = (Cell) row.getChildren().get(4); switch ( riskScore ) { case 1: cell.setClass("riskLog-score-color-1"); break; case 2: cell.setClass("riskLog-score-color-2"); break; case 3: cell.setClass("riskLog-score-color-3"); break; case 4: cell.setClass("riskLog-score-color-4"); break; case 6: cell.setClass("riskLog-score-color-6"); break; case 9: cell.setClass("riskLog-score-color-9"); break; default: throw new UnsupportedCharsetException("Unsupported risk score"); } } /** * 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 riskLog */ private void appendOperations(final Row row, final RiskLog riskLog) { Hbox hbox = new Hbox(); hbox.appendChild(Util.createEditButton(event -> goToEditForm(riskLog))); hbox.appendChild(Util.createRemoveButton(event -> confirmDelete(riskLog))); row.appendChild(hbox); } /** * Should be public! * Used in _editRiskLog.zul * * @return {@link LowMediumHighEnum} values */ public LowMediumHighEnum[] getLowMediumHighEnums() { return LowMediumHighEnum.values(); } /** * Should be public! * Used in _editRiskLog.zul * * @return {@link RiskScoreStatesEnum} values */ public RiskScoreStatesEnum[] getRiskScoreStatesEnums() { return RiskScoreStatesEnum.values(); } /** * @return {@link List<Order>} */ public List<Order> getOrders() { return riskLogModel.getOrders(); } /** * @return {@link List<User>} */ public List<User> getUsers() { return riskLogModel.getUsers(); } /** * @return {@link Date} */ public Date getDateCreated() { if (riskLogModel.getRiskLog() == null) { return null; } return (riskLogModel.getRiskLog().getDateCreated() != null) ? riskLogModel.getRiskLog().getDateCreated() : null; } /** * Sets the date created * * @param date * date created */ public void setDateCreated(Date date) { riskLogModel.getRiskLog().setDateCreated(date); } /** * Sets the Action When * * @param date * date created */ public void setActionWhen(Date date) { riskLogModel.getRiskLog().setActionWhen(date); } /** * @return {@link Date} */ public Date getActionWhen() { if (riskLogModel.getRiskLog() == null) { return null; } return (riskLogModel.getRiskLog().getActionWhen() != null) ? riskLogModel.getRiskLog().getActionWhen() : null; } /** * Sets the Score for risk. */ public void setUpdateScore() { riskScore.setValue(String.valueOf(getRiskLog().getRiskScore())); } /** * Should be public! * Used in _editRiskLog.zul * @return {@link RiskLog} */ public RiskLog getRiskLog() { return riskLogModel.getRiskLog(); } /** * Returns a list of {@link RiskLog} objects */ public List<RiskLog> getRiskLogs() { if (LogsController.getProjectNameVisibility()) { return riskLogModel.getRiskLogs(); } else { List<RiskLog> riskLogs = new ArrayList<>(); Order order = LogsController.getOrder(); for (RiskLog issueLog : riskLogModel.getRiskLogs()) { if (issueLog.getOrder().equals(order)) { riskLogs.add(issueLog); } } return riskLogs; } } public Order getOrder() { if (!LogsController.getProjectNameVisibility()) { getRiskLog().setOrder(LogsController.getOrder()); return getRiskLog().getOrder(); } else { return riskLogModel.getRiskLog().getOrder(); } } @Override protected String getEntityType() { return _("Issue log"); } @Override protected String getPluralEntityType() { return _("Issue logs"); } @Override protected void initCreate() { riskLogModel.initCreate(); } @Override protected void initEdit(RiskLog entity) { riskLogModel.initEdit(entity); } @Override protected void save() throws ValidationException { if (getRiskLog().getOrder() == null) { throw new WrongValueException(bdProjectRiskLog, _("please select a project")); } if (getRiskLog().getCreatedBy() == null) { throw new WrongValueException(bdUserRiskLog, _("please select an author")); } riskLogModel.confirmSave(); saved = true; } @Override protected RiskLog getEntityBeingEdited() { return riskLogModel.getRiskLog(); } @Override protected void delete(RiskLog entity) throws InstanceNotFoundException { riskLogModel.remove(entity); } public Boolean isRiskLogSaved () { return saved; } public void setRiskLogToModel (RiskLog log) { this.riskLogModel.setRisklog(log); } }