package org.libreplan.web.dashboard;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.orders.entities.OrderStatusEnum;
import org.libreplan.web.orders.IOrderModel;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zkplus.spring.SpringUtil;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Label;
import org.zkoss.zul.Rows;
import org.zkoss.zul.Row;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
/**
* Controller to manage Dashboard tab on index page.
*
* @author Vova Perebykivskyi <vova@libreplan-enterprise.com>
*/
@org.springframework.stereotype.Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class DashboardControllerGlobal extends GenericForwardComposer {
// TODO 1 list instead of 8
// TODO insert Label only in needed Cell
// ( is it possible at all? Seems that we need to make own Grid )
// Because we cannot createCell at selected row-index, column-index
private IOrderModel orderModel;
private Grid pipelineGrid;
private Checkbox storedColumnVisible;
private List<Order> preSalesOrders = new ArrayList<>();
private List<Order> offeredOrders = new ArrayList<>();
private List<Order> outsourcedOrders = new ArrayList<>();
private List<Order> acceptedOrders = new ArrayList<>();
private List<Order> startedOrders = new ArrayList<>();
private List<Order> onHoldOrders = new ArrayList<>();
private List<Order> finishedOrders = new ArrayList<>();
private List<Order> cancelledOrders = new ArrayList<>();
private List<Order> storedOrders = new ArrayList<>();
@Override
public void doAfterCompose(Component component) throws Exception {
super.doAfterCompose(component);
component.setAttribute("dashboardControllerGlobal", this, true);
if ( orderModel == null ) {
orderModel = (IOrderModel) SpringUtil.getBean("orderModel");
}
fillOrderLists();
setupPipelineGrid();
showStoredColumn();
}
public List<Order> getOrders() {
return orderModel.getOrders();
}
private void fillOrderLists() {
for (Order orderItem : getOrders()) {
switch ( orderItem.getState() ) {
case PRE_SALES:
preSalesOrders.add(orderItem);
break;
case OFFERED:
offeredOrders.add(orderItem);
break;
case OUTSOURCED:
outsourcedOrders.add(orderItem);
break;
case ACCEPTED:
acceptedOrders.add(orderItem);
break;
case STARTED:
startedOrders.add(orderItem);
break;
case ON_HOLD:
onHoldOrders.add(orderItem);
break;
case FINISHED:
finishedOrders.add(orderItem);
break;
case CANCELLED:
cancelledOrders.add(orderItem);
break;
case STORED:
storedOrders.add(orderItem);
break;
default:
break;
}
}
}
private void setupPipelineGrid() throws ParseException {
int[] sizes = {
preSalesOrders.size(),
offeredOrders.size(),
outsourcedOrders.size(),
acceptedOrders.size(),
startedOrders.size(),
onHoldOrders.size(),
finishedOrders.size(),
cancelledOrders.size(),
storedOrders.size()
};
int rowsCount = findMaxList(sizes);
Rows rows = new Rows();
for (int i = 0; i < rowsCount; i++) {
Row row = new Row();
for (int columns = 0; columns < 9; columns++) {
row.appendChild(new Label());
}
rows.appendChild(row);
}
pipelineGrid.appendChild(rows);
// Fill data into first column and so on with other columns divided by Enter in code
processList(preSalesOrders, OrderStatusEnum.PRE_SALES);
processList(offeredOrders, OrderStatusEnum.OFFERED);
processList(outsourcedOrders, OrderStatusEnum.OUTSOURCED);
processList(acceptedOrders, OrderStatusEnum.ACCEPTED);
processList(startedOrders, OrderStatusEnum.STARTED);
processList(onHoldOrders, OrderStatusEnum.ON_HOLD);
processList(finishedOrders, OrderStatusEnum.FINISHED);
processList(cancelledOrders, OrderStatusEnum.CANCELLED);
processList(storedOrders, OrderStatusEnum.STORED);
}
private void processList(List<Order> currentList, OrderStatusEnum orderStatus) {
if ( !currentList.isEmpty() ) {
for (int i = 0; i < currentList.size(); i++) {
try {
String outputInit = getOrderInitDate(currentList.get(i));
String outputDeadline = getOrderDeadline(currentList.get(i));
( (Label) pipelineGrid.getCell(i, orderStatus.getIndex()) ).setValue(currentList.get(i).getName());
String tooltipText = "Start date: " + outputInit +
"\n" + "End date: " + outputDeadline +
"\n" + "Progress: " + currentList.get(i).getAdvancePercentage() + " %";
( (Label) pipelineGrid.getCell(i, orderStatus.getIndex()) ).setTooltiptext(tooltipText);
( (Label) pipelineGrid.getCell(i, orderStatus.getIndex()) ).setClass("label-highlight");
( (Label) pipelineGrid.getCell(i, orderStatus.getIndex()) ).setStyle("word-wrap: break-word");
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
/**
* Remove time, timezone from full-date string.
*/
private String getOrderInitDate(Order order) throws ParseException {
return new SimpleDateFormat("EEE MMM dd yyyy").format(order.getInitDate());
}
private String getOrderDeadline(Order order) throws ParseException {
return (order.getDeadline() != null)
? new SimpleDateFormat("EEE MMM dd yyyy").format(order.getDeadline())
: "-- empty --";
}
/**
* Should be public!
* Used in _pipeline.zul
*/
public void showStoredColumn() throws ParseException {
if ( storedColumnVisible.isChecked() ) {
setStoredColumnVisible(true);
}
else if ( !storedColumnVisible.isChecked() ) {
setStoredColumnVisible(false);
}
}
private void setStoredColumnVisible(boolean value) {
for (int i = 0; i < storedOrders.size(); i++) {
( pipelineGrid.getCell(i, 8) ).setVisible(value);
}
}
private int findMaxList(int[] sizes) {
int max = sizes[0];
for (int i = 1; i < sizes.length; i++) {
if ( sizes[i] > max ) {
max = sizes[i];
}
}
return max;
}
}