ItEr45S09RFNavegacionOrganizacionTraballoItEr44S15: Applied filtering to company view scheduling

This commit is contained in:
Lorenzo Tilve 2010-01-27 14:28:36 +01:00 committed by Javier Moran Rua
parent 51dbc2e1dd
commit 4deda900aa
6 changed files with 112 additions and 30 deletions

View file

@ -7,18 +7,19 @@ planner = self;
<borderlayout sclass="plannerlayout" width="auto">
<north height="30px" border="0">
<hbox align="center" id="toolbar" sclass="toolbar-box">
<!-- Commands -->
<button id="btnPrint" onClick="planner.print()"
image="/common/img/ico_print.png"
tooltiptext="${i18n:_('Print')}" />
<separator/>
<!-- Visualization modes -->
<label>${i18n:_('Zoom level')}:</label>
<listbox mold="select" rows="1"
model="${planner.zoomLevels}"
onSelect="planner.setZoomLevel(self.selectedItem.value);" >
</listbox>
<button id="showCriticalPath" onClick="planner.showCriticalPath();"
image="/common/img/ico_criticalpath.png"
tooltiptext="${i18n:_('Show/Hide Critical path')}" />
@ -28,22 +29,10 @@ planner = self;
<button id="showAllResources" onClick="planner.showAllResources();"
image="/common/img/ico_resources.png"
tooltiptext="${i18n:_('Show all resources')}" sclass="planner-command show-resources" />
<separator />
<!-- Filtering -->
<separator/>
<label>${i18n:_('Filter')}:</label>
<combobox>
<comboitem label="Orders"
description="Show full orders and company view" />
<comboitem label="Tasks"
description="Tasks inside orders or filtered" />
</combobox>
<combobox>
<comboitem label="Filter by Label" />
<comboitem label="Filter by criterion" />
<comboitem label="Filter by resources" />
<comboitem label="Critical way" />
</combobox>
<textbox/>
<vbox id="orderFilter"/>
<separator />
</hbox>

View file

@ -207,6 +207,8 @@ public class OrderModel implements IOrderModel {
private void initializeOrders(List<Order> list) {
for (Order order : list) {
// Remove or not?
// orderDAO.reattachUnmodifiedEntity(order);
if (order.getCustomer() != null) {
order.getCustomer().getName();
}
@ -686,7 +688,6 @@ public class OrderModel implements IOrderModel {
public List<Order> getFilterOrders(OrderPredicate predicate) {
List<Order> filterOrderList = new ArrayList<Order>();
for (Order order : orderList) {
orderDAO.reattachUnmodifiedEntity(order);
if (predicate.accepts(order)) {
filterOrderList.add(order);
}

View file

@ -21,22 +21,31 @@
package org.navalplanner.web.planner.company;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.Validate;
import org.navalplanner.business.planner.entities.TaskElement;
import org.navalplanner.web.common.components.bandboxsearch.BandboxMultipleSearch;
import org.navalplanner.web.common.components.finders.FilterPair;
import org.navalplanner.web.orders.OrderPredicate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.zkoss.ganttz.Planner;
import org.zkoss.ganttz.extensions.ICommandOnTask;
import org.zkoss.ganttz.resourceload.ScriptsRequiredByResourceLoadPanel;
import org.zkoss.ganttz.timetracker.zoom.ZoomLevel;
import org.zkoss.ganttz.util.OnZKDesktopRegistry;
import org.zkoss.ganttz.util.script.IScriptsRegister;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.util.Composer;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Vbox;
/**
* Controller for company planning view. Representation of company orders in the
@ -44,7 +53,7 @@ import org.zkoss.zk.ui.util.Composer;
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
@Component
@org.springframework.stereotype.Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class CompanyPlanningController implements Composer{
@ -55,6 +64,13 @@ public class CompanyPlanningController implements Composer{
private Planner planner;
private Vbox orderFilter;
private Vbox filter;
private Datebox filterStartDate;
private Datebox filterFinishDate;
private BandboxMultipleSearch bdFilters;
private Checkbox checkIncludeOrderElements;
private ICommandOnTask<TaskElement> doubleClickCommand;
private Map<String, String[]> parameters;
@ -82,12 +98,29 @@ public class CompanyPlanningController implements Composer{
planner.setAreContainersExpandedByDefault(Planner
.guessContainersExpandedByDefault(parameters));
orderFilter = (Vbox) planner.getFellow("orderFilter");
// Configuration of the order filter
Component filterComponent = Executions.createComponents(
"/orders/_orderFilter.zul", orderFilter,
new HashMap<String, String>());
filterComponent.setVariable("controller", this, true);
filterStartDate = (Datebox) filterComponent
.getFellow("filterStartDate");
filterFinishDate = (Datebox) filterComponent
.getFellow("filterFinishDate");
bdFilters = (BandboxMultipleSearch) filterComponent
.getFellow("bdFilters");
checkIncludeOrderElements = (Checkbox) filterComponent
.getFellow("checkIncludeOrderElements");
filterComponent.setVisible(true);
}
public void setConfigurationForPlanner() {
// Added predicate
model
.setConfigurationToPlanner(planner, additional,
doubleClickCommand);
doubleClickCommand, createPredicate());
}
public void setAdditional(List<ICommandOnTask<TaskElement>> additional) {
@ -105,4 +138,38 @@ public class CompanyPlanningController implements Composer{
this.parameters = parameters;
}
public void onApplyFilter() {
OrderPredicate predicate = createPredicate();
if (predicate != null) {
filterByPredicate(predicate);
} else {
showAllOrders();
}
}
private OrderPredicate createPredicate() {
List<FilterPair> listFilters = (List<FilterPair>) bdFilters
.getSelectedElements();
Date startDate = filterStartDate.getValue();
Date finishDate = filterFinishDate.getValue();
Boolean includeOrderElements = checkIncludeOrderElements.isChecked();
if (listFilters.isEmpty() && startDate == null && finishDate == null) {
return null;
}
return new OrderPredicate(listFilters, startDate, finishDate,
includeOrderElements);
}
private void filterByPredicate(OrderPredicate predicate) {
// Recalculate predicate
model.setConfigurationToPlanner(planner, additional,
doubleClickCommand, createPredicate());
planner.invalidate();
}
public void showAllOrders() {
planner.invalidate();
}
}

View file

@ -60,6 +60,7 @@ import org.navalplanner.business.users.daos.IUserDAO;
import org.navalplanner.business.users.entities.User;
import org.navalplanner.business.workreports.daos.IWorkReportLineDAO;
import org.navalplanner.business.workreports.entities.WorkReportLine;
import org.navalplanner.web.orders.OrderPredicate;
import org.navalplanner.web.planner.ITaskElementAdapter;
import org.navalplanner.web.planner.chart.Chart;
import org.navalplanner.web.planner.chart.ChartFiller;
@ -103,7 +104,6 @@ import org.zkoss.zul.Tabpanels;
import org.zkoss.zul.Tabs;
import org.zkoss.zul.Vbox;
/**
* Model for company planning view.
*
@ -177,8 +177,9 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel {
@Transactional(readOnly = true)
public void setConfigurationToPlanner(Planner planner,
Collection<ICommandOnTask<TaskElement>> additional,
ICommandOnTask<TaskElement> doubleClickCommand) {
PlannerConfiguration<TaskElement> configuration = createConfiguration();
ICommandOnTask<TaskElement> doubleClickCommand,
OrderPredicate predicate) {
PlannerConfiguration<TaskElement> configuration = createConfiguration(predicate);
Tabbox chartComponent = new Tabbox();
chartComponent.setOrient("vertical");
@ -496,8 +497,18 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel {
}
private PlannerConfiguration<TaskElement> createConfiguration() {
return createConfiguration(null);
}
private PlannerConfiguration<TaskElement> createConfiguration(
OrderPredicate predicate) {
ITaskElementAdapter taskElementAdapter = getTaskElementAdapter();
List<TaskElement> toShow = sortByStartDate(retainOnlyTopLevel());
List<TaskElement> toShow;
if (predicate != null) {
toShow = sortByStartDate(retainOnlyTopLevel(predicate));
} else {
toShow = sortByStartDate(retainOnlyTopLevel(null));
}
forceLoadOfDependenciesCollections(toShow);
forceLoadOfWorkingHours(toShow);
forceLoadOfLabels(toShow);
@ -522,9 +533,10 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel {
return result;
}
private List<TaskElement> retainOnlyTopLevel() {
private List<TaskElement> retainOnlyTopLevel(OrderPredicate predicate) {
List<TaskElement> result = new ArrayList<TaskElement>();
User user;
try {
user = userDAO.findByLoginName(SecurityUtils.getSessionUserLoginName());
}
@ -533,11 +545,16 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel {
//anyway, if it happenned we return an empty list
return result;
}
List<Order> list = orderDAO.getOrdersByReadAuthorization(user);
for (Order order : list) {
TaskGroup associatedTaskElement = order.getAssociatedTaskElement();
if (associatedTaskElement != null) {
result.add(associatedTaskElement);
if (predicate == null || predicate.accepts(order)) {
result.add(associatedTaskElement);
}
}
}
return result;

View file

@ -23,6 +23,7 @@ package org.navalplanner.web.planner.company;
import java.util.Collection;
import org.navalplanner.business.planner.entities.TaskElement;
import org.navalplanner.web.orders.OrderPredicate;
import org.zkoss.ganttz.Planner;
import org.zkoss.ganttz.extensions.ICommandOnTask;
@ -40,4 +41,9 @@ public interface ICompanyPlanningModel {
Collection<ICommandOnTask<TaskElement>> additional,
ICommandOnTask<TaskElement> doubleClickCommand);
public void setConfigurationToPlanner(Planner planner,
Collection<ICommandOnTask<TaskElement>> additional,
ICommandOnTask<TaskElement> doubleClickCommand,
OrderPredicate predicate);
}

View file

@ -1,6 +1,6 @@
<hbox align="center" style="margin-left:240px;">
<!-- Filter by -->
<label>Filter order:</label>
<hbox align="center" sclass="filtering-area">
<label value="${i18n:_('Filter by')}"
tooltiptext="${i18n:_('Select required criteria set and press filter button')}"/>
<bandboxMultipleSearch id="bdFilters" widthBandbox="285px" widthListbox="300px"
finder="multipleFiltersFinder"/>
<label value="${i18n:_('from')}"/>
@ -8,7 +8,9 @@
<label value="${i18n:_('to')}"/>
<datebox id="filterFinishDate" constraint = "@{controller.checkConstraintFinishDate}"/>
<label value="${i18n:_('include order elements')}"/>
<checkbox id="checkIncludeOrderElements"/>
<checkbox id="checkIncludeOrderElements"
tooltiptext="${i18n:_('Apply filtering to order elements satisfying required critera')}" />
<button label="${i18n:_('Filter')}" style="margin-top: -4px"
tooltiptext="${i18n:_('Apply filtering to order elements satisfying required critera')}"
onClick="controller.onApplyFilter()"/>
</hbox>