ItEr45S09RFNavegacionOrganizacionTraballoItEr44S15 : fixes the dates filter, the customer filter and shows the first ten filters when the

This commit is contained in:
Susana Montes Pedreira 2010-01-28 16:41:05 +01:00 committed by Javier Moran Rua
parent fb48b3b86e
commit 61745fad1d
10 changed files with 288 additions and 78 deletions

View file

@ -29,6 +29,7 @@ import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.navalplanner.web.common.components.finders.FilterPair;
import org.navalplanner.web.common.components.finders.IMultipleFiltersFinder;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
@ -76,8 +77,7 @@ public class BandboxMultipleSearch extends HtmlMacroComponent {
bandbox = (Bandbox) getFellowIfAny("bandbox");
if (multipleFiltersFinder != null) {
listbox.setModel(new SimpleListModel(multipleFiltersFinder
.getMatching("")));
listbox.setModel(getSubModel());
listbox.setItemRenderer(multipleFiltersFinder.getItemRenderer());
addHeaders();
@ -91,15 +91,9 @@ public class BandboxMultipleSearch extends HtmlMacroComponent {
final String inputText = ((InputEvent) event).getValue();
if ((inputText == null) || (inputText.isEmpty())) {
clear();
searchMultipleFilters();
} else {
String newFilterText = getNewFilterText(inputText);
if ((newFilterText != null)
&& (newFilterText.length() > 2)) {
listbox.setModel(getSubModel(newFilterText));
listbox.invalidate();
} else {
clearListbox();
}
searchMultipleFilters(inputText);
}
}
});
@ -112,9 +106,11 @@ public class BandboxMultipleSearch extends HtmlMacroComponent {
@Override
public void onEvent(Event event) throws Exception {
final Object object = getSelectedItem().getValue();
addSelectedElement(object);
if (multipleFiltersFinder.isValidNewFilter(object)) {
addSelectedElement(object);
clearListbox();
}
bandbox.close();
clearListbox();
}
});
}
@ -122,21 +118,20 @@ public class BandboxMultipleSearch extends HtmlMacroComponent {
updateWidth();
}
private String getNewFilterText(String inputText){
String newFilterText = new String("");
String[] filtersText = inputText.split(",");
newFilterText = getLastText(filtersText);
newFilterText = newFilterText.replace(" ", "");
newFilterText = newFilterText.trim();
return newFilterText;
private void searchMultipleFilters() {
listbox.setModel(getSubModel());
listbox.invalidate();
}
private String getLastText(String[] texts) {
Integer last = texts.length - 1;
if (texts.length > 0) {
return texts[last];
private void searchMultipleFilters(String inputText) {
String newFilterText = multipleFiltersFinder
.getNewFilterText(inputText);
selectedFiltersText = inputText.replace(newFilterText, "");
if ((newFilterText != null) && (!newFilterText.isEmpty())) {
listbox.setModel(getSubModel(newFilterText));
listbox.invalidate();
} else {
return "";
searchMultipleFilters();
}
}
@ -151,10 +146,25 @@ public class BandboxMultipleSearch extends HtmlMacroComponent {
selectedFiltersText = selectedFiltersText
.concat(multipleFiltersFinder.objectToString(obj));
bandbox.setValue(selectedFiltersText);
selectedFilters.add(obj);
addFilter(obj);
selectedFilters = multipleFiltersFinder.updateDeletedFilters(
selectedFilters, selectedFiltersText);
}
}
private void addFilter(Object obj) {
FilterPair newFilter = (FilterPair) obj;
for (FilterPair filter : (List<FilterPair>) selectedFilters) {
if ((filter.getType().equals(newFilter.getType()))
&& (filter.getPattern().equals(newFilter.getPattern()))) {
throw new WrongValueException(bandbox,
_("filter already exists"));
}
}
selectedFilters.add(obj);
}
public List getSelectedElements() {
if (this.multipleFiltersFinder != null) {
if (!multipleFiltersFinder.isValidFormatText(selectedFilters,
@ -167,7 +177,16 @@ public class BandboxMultipleSearch extends HtmlMacroComponent {
}
/**
* Find {@link Label} which name or type start with prefix
* Find the first ten filters
*/
@SuppressWarnings("unchecked")
private ListModel getSubModel() {
List result = multipleFiltersFinder.getFirstTenFilters();
return new SimpleListModel(result);
}
/**
* Find filter which contains the expression
* @param inputText
*/
@SuppressWarnings("unchecked")
@ -227,7 +246,6 @@ public class BandboxMultipleSearch extends HtmlMacroComponent {
* @param bandbox
*/
public void clear() {
clearListbox();
clearSelectedElement();
}

View file

@ -35,10 +35,18 @@ public interface IMultipleFiltersFinder {
List<FilterPair> getMatching(String filter);
List<FilterPair> getFirstTenFilters();
String objectToString(Object obj);
String getNewFilterText(String inputText);
boolean isValidNewFilter(Object obj);
boolean isValidFormatText(List filterValues, String value);
List<FilterPair> updateDeletedFilters(List filterValues, String value);
String[] getHeaders();
ListitemRenderer getItemRenderer();

View file

@ -24,6 +24,7 @@ import static org.navalplanner.web.I18nHelper._;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -91,6 +92,8 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
private static OrderStatusEnum[] ordersStatusEnums;
private static boolean updating = false;
private static final List<String> ordersCodes = new ArrayList<String>();
private List<FilterPair> listMatching = new ArrayList<FilterPair>();
@ -163,6 +166,85 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
}
}
public List<FilterPair> getFirstTenFilters() {
listMatching.clear();
fillWithFirstTenFiltersLabels();
fillWithFirstTenFiltersLabels();
fillWithFirstTenFiltersCustomer();
fillWithFirstTenFiltersState();
fillWihtFirstTenFiltersCodes();
fillWihtFirstTenFiltersCustomerReferences();
listMatching.add(new FilterPair(OrderFilterEnum.None,
OrderFilterEnum.None.toString(), null));
return listMatching;
}
private List<FilterPair> fillWithFirstTenFiltersLabels() {
Iterator<LabelType> iteratorLabelType = mapLabels.keySet().iterator();
while (iteratorLabelType.hasNext() && listMatching.size() < 10) {
LabelType type = iteratorLabelType.next();
for (int i = 0; listMatching.size() < 10
&& i < mapLabels.get(type).size(); i++) {
Label label = mapLabels.get(type).get(i);
String pattern = type.getName() + " :: " + label.getName();
listMatching.add(new FilterPair(OrderFilterEnum.Label, pattern,
label));
}
}
return listMatching;
}
private List<FilterPair> fillWithFirstTenFiltersCriterions() {
Iterator<CriterionType> iteratorCriterionType = mapCriterions.keySet()
.iterator();
while (iteratorCriterionType.hasNext() && listMatching.size() < 10) {
CriterionType type = iteratorCriterionType.next();
for (int i = 0; listMatching.size() < 10
&& i < mapCriterions.get(type).size(); i++) {
Criterion criterion = mapCriterions.get(type).get(i);
String pattern = type.getName() + " :: " + criterion.getName();
listMatching.add(new FilterPair(OrderFilterEnum.Criterion,
pattern, criterion));
}
}
return listMatching;
}
private List<FilterPair> fillWithFirstTenFiltersCustomer() {
for (int i = 0; listMatching.size() < 10
&& i < externalCompanies.size(); i++) {
ExternalCompany externalCompany = externalCompanies.get(i);
addExternalCompany(externalCompany);
}
return listMatching;
}
private List<FilterPair> fillWithFirstTenFiltersState() {
for (int i = 0; listMatching.size() < 10
&& i < OrderStatusEnum.values().length; i++) {
OrderStatusEnum state = OrderStatusEnum.values()[i];
addState(state);
}
return listMatching;
}
private List<FilterPair> fillWihtFirstTenFiltersCodes() {
for (int i = 0; listMatching.size() < 10 && i < ordersCodes.size(); i++) {
String code = ordersCodes.get(i);
addCode(code);
}
return listMatching;
}
private List<FilterPair> fillWihtFirstTenFiltersCustomerReferences() {
for (int i = 0; listMatching.size() < 10
&& i < customerReferences.size(); i++) {
String reference = customerReferences.get(i);
addCustomerReference(reference);
}
return listMatching;
}
public List<FilterPair> getMatching(String filter) {
listMatching.clear();
if ((filter != null) && (!filter.isEmpty())) {
@ -178,13 +260,16 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
searchInOrderStatus(filter);
}
}
addNoneFilter();
return listMatching;
}
private void searchInCriterionTypes(String filter) {
boolean limited = (filter.length() < 3);
for (CriterionType type : mapCriterions.keySet()) {
if (type.getName().toLowerCase().contains(filter)) {
setFilterPairCriterionType(type);
setFilterPairCriterionType(type, limited);
} else {
searchInCriterions(type, filter);
}
@ -194,26 +279,28 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
private void searchInCriterions(CriterionType type, String filter) {
for (Criterion criterion : mapCriterions.get(type)) {
if (criterion.getName().toLowerCase().contains(filter)) {
String pattern = type.getName() + " :: " + criterion.getName();
listMatching.add(new FilterPair(OrderFilterEnum.Criterion,
pattern,
criterion));
addCriterion(type, criterion);
if ((filter.length() < 3) && (listMatching.size() > 9)) {
return;
}
}
}
}
private void setFilterPairCriterionType(CriterionType type) {
private void setFilterPairCriterionType(CriterionType type, boolean limited) {
for (Criterion criterion : mapCriterions.get(type)) {
String pattern = type.getName() + " :: " + criterion.getName();
listMatching.add(new FilterPair(OrderFilterEnum.Criterion, pattern,
criterion));
addCriterion(type, criterion);
if ((limited) && (listMatching.size() > 9)) {
return;
}
}
}
private void searchInLabelTypes(String filter) {
boolean limited = (filter.length() < 3);
for (LabelType type : mapLabels.keySet()) {
if (type.getName().toLowerCase().contains(filter)) {
setFilterPairLabelType(type);
setFilterPairLabelType(type, limited);
} else {
searchInLabels(type, filter);
}
@ -223,18 +310,20 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
private void searchInLabels(LabelType type, String filter) {
for (Label label : mapLabels.get(type)) {
if (label.getName().toLowerCase().contains(filter)) {
String pattern = type.getName() + " :: " + label.getName();
listMatching.add(new FilterPair(OrderFilterEnum.Label, pattern,
label));
addLabel(type, label);
if ((filter.length() < 3) && (listMatching.size() > 9)) {
return;
}
}
}
}
private void setFilterPairLabelType(LabelType type) {
private void setFilterPairLabelType(LabelType type, boolean limited) {
for (Label label : mapLabels.get(type)) {
String pattern = type.getName() + " :: " + label.getName();
listMatching.add(new FilterPair(OrderFilterEnum.Label, pattern,
label));
addLabel(type, label);
if ((limited) && (listMatching.size() > 9)) {
return;
}
}
}
@ -242,11 +331,10 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
for(ExternalCompany externalCompany : externalCompanies){
if ((externalCompany.getName().toLowerCase().contains(filter))
|| (externalCompany.getNif().toLowerCase().contains(filter))) {
String pattern = externalCompany.getName() + " :: "
+ externalCompany.getNif();
listMatching.add(new FilterPair(
OrderFilterEnum.ExternalCompany, pattern,
externalCompany));
addExternalCompany(externalCompany);
if ((filter.length() < 3) && (listMatching.size() > 9)) {
return;
}
}
}
}
@ -254,8 +342,10 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
private void searchInOrderStatus(String filter) {
for (OrderStatusEnum state : ordersStatusEnums) {
if (state.name().toLowerCase().contains(filter)) {
listMatching.add(new FilterPair(OrderFilterEnum.State, state
.name(), state));
addState(state);
if ((filter.length() < 3) && (listMatching.size() > 9)) {
return;
}
}
}
}
@ -266,8 +356,7 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
codeFilter = codeFilter.replace(" ", "");
for (String code : ordersCodes) {
if (code.toLowerCase().equals(codeFilter)) {
listMatching.add(new FilterPair(OrderFilterEnum.Code, code,
code));
addCode(code);
return;
}
}
@ -280,15 +369,50 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
referenceFilter = referenceFilter.replace(" ", "");
for (String reference : customerReferences) {
if (reference.toLowerCase().equals(referenceFilter)) {
listMatching.add(new FilterPair(
OrderFilterEnum.CustomerReference,
reference, reference));
addCustomerReference(reference);
return;
}
}
}
}
private void addCriterion(CriterionType type, Criterion criterion) {
String pattern = type.getName() + " :: " + criterion.getName();
listMatching.add(new FilterPair(OrderFilterEnum.Criterion, pattern,
criterion));
}
private void addLabel(LabelType type, Label label) {
String pattern = type.getName() + " :: " + label.getName();
listMatching.add(new FilterPair(OrderFilterEnum.Label, pattern, label));
}
private void addExternalCompany(ExternalCompany externalCompany) {
String pattern = externalCompany.getName() + " :: "
+ externalCompany.getNif();
listMatching.add(new FilterPair(OrderFilterEnum.ExternalCompany,
pattern, externalCompany));
}
private void addState(OrderStatusEnum state) {
listMatching.add(new FilterPair(OrderFilterEnum.State, state.name(),
state));
}
private void addCode(String code) {
listMatching.add(new FilterPair(OrderFilterEnum.Code, code, code));
}
private void addCustomerReference(String reference) {
listMatching.add(new FilterPair(OrderFilterEnum.CustomerReference,
reference, reference));
}
private void addNoneFilter() {
listMatching.add(new FilterPair(OrderFilterEnum.None,
OrderFilterEnum.None.toString(), null));
}
public String objectToString(Object obj) {
FilterPair filterPair = (FilterPair) obj;
String text = filterPair.getType() + "(" + filterPair.getPattern()
@ -296,11 +420,40 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
return text;
}
@Override
public String getNewFilterText(String inputText) {
String newFilterText = new String("");
String[] filtersText = inputText.split(",");
newFilterText = getLastText(filtersText);
newFilterText = newFilterText.replace(" ", "");
newFilterText = newFilterText.trim();
return newFilterText;
}
private String getLastText(String[] texts) {
Integer last = texts.length - 1;
if (texts.length > 0) {
return texts[last];
} else {
return "";
}
}
public boolean isValidNewFilter(Object obj) {
FilterPair filter = (FilterPair) obj;
if (filter.getType().equals(OrderFilterEnum.None)) {
return false;
}
return true;
}
public boolean isValidFormatText(List filterValues, String value) {
if (filterValues.isEmpty()) {
return true;
}
filterValues = updateDeletedFilters(filterValues, value);
String[] values = value.split(",");
if (values.length != filterValues.size() + 1) {
return false;
@ -308,11 +461,9 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
int i = 0;
for (FilterPair filterPair : (List<FilterPair>) filterValues) {
String filterValue = values[i].replace(" ", "");
String filterPairText = filterPair.getType() + "("
+ filterPair.getPattern() + ")";
filterPairText = filterPairText.replace(" ", "");
if (!filterValue.equals(filterPairText)) {
if (!isFilterAdded(values, filterPairText)) {
return false;
}
i++;
@ -320,6 +471,37 @@ public class MultipleFiltersFinder implements IMultipleFiltersFinder {
return true;
}
@Override
public List<FilterPair> updateDeletedFilters(List filterValues, String value) {
String[] values = value.split(",");
List<FilterPair> listFilters = (List<FilterPair>) filterValues;
List<FilterPair> list = new ArrayList<FilterPair>();
list.addAll(listFilters);
if (values.length < filterValues.size() + 1) {
for (FilterPair filterPair : list) {
String filter = filterPair.getType() + "("
+ filterPair.getPattern() + ")";
if (!isFilterAdded(values, filter)) {
listFilters.remove(filterPair);
}
}
}
return listFilters;
}
private boolean isFilterAdded(String[] values, String filter) {
for (int i = 0; i < values.length; i++) {
String value = values[i].replace(" ", "");
filter = filter.replace(" ", "");
if (filter.equals(value)) {
return true;
}
}
return false;
}
public String[] getHeaders() {
return headers;
}

View file

@ -25,7 +25,8 @@ package org.navalplanner.web.common.components.finders;
public enum OrderFilterEnum {
Criterion("Criterion"), Label("Label"), ExternalCompany("Customer"), State(
None("..."), Criterion("Criterion"), Label("Label"), ExternalCompany(
"Customer"), State(
"State"), Code("Code"), CustomerReference("Customer Reference");
private String description;

View file

@ -176,7 +176,7 @@ public class OrderCRUDController extends GenericForwardComposer {
private Grid listing;
private Vbox orderFilter;
private Hbox orderFilter;
private Vbox filter;

View file

@ -57,6 +57,7 @@ import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Messagebox;
@ -75,7 +76,7 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
private Vbox filter;
private Vbox orderFilter;
private Hbox orderFilter;
private BandboxSearch bdFilter;

View file

@ -156,8 +156,8 @@ public class OrderPredicate implements IPredicate {
private boolean acceptExternalCompany(FilterPair filter,Order order) {
ExternalCompany filterCustomer = (ExternalCompany) filter.getValue();
if ((order.getCustomer() == null)
|| (order.getCustomer().getId().equals(filterCustomer.getId()))) {
if ((order.getCustomer() != null)
&& (order.getCustomer().getId().equals(filterCustomer.getId()))) {
return true;
}
return false;
@ -165,8 +165,8 @@ public class OrderPredicate implements IPredicate {
private boolean acceptState(FilterPair filter,Order order) {
OrderStatusEnum filterState = (OrderStatusEnum) filter.getValue();
if ((order.getState() == null)
|| (order.getState().equals(filterState))) {
if ((order.getState() != null)
&& (order.getState().equals(filterState))) {
return true;
}
return false;
@ -185,9 +185,8 @@ public class OrderPredicate implements IPredicate {
private boolean acceptFiltersDates(Order order) {
// Check if exist work report items into interval between the start date
// and finish date.
if ((isInTheRangeFilterDates(order.getInitDate()) || isInTheRangeFilterDates(order.getDeadline()))
|| ((isInTheRangeWorkReportDates(startDate, order)) || (isInTheRangeWorkReportDates(
finishDate, order)))) {
if (isInTheRangeFilterDates(order.getInitDate())
&& isInTheRangeFilterDates(order.getDeadline())) {
return true;
}
return false;

View file

@ -1,7 +1,8 @@
<hbox>
<hbox align="right" style="margin-left:700px;">
<!-- Filter by label -->
<label value="${i18n:_('Filter by label:')}" />
<bandboxSearch id="bdFilter" finder="LabelBandboxFinder"
<bandboxSearch id="bdFilter" widthBandbox="185px" widthListbox="200px"
finder="LabelBandboxFinder"
model="@{treeController.labels}"/>
<button label="${i18n:_('Filter')}" style="margin-top: -4px"
onClick="treeController.onApplyFilter(event)"/>

View file

@ -1,7 +1,7 @@
<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"
<bandboxMultipleSearch id="bdFilters" widthBandbox="385px" widthListbox="400px"
finder="multipleFiltersFinder"/>
<label value="${i18n:_('from')}"/>
<datebox id="filterStartDate" constraint = "@{controller.checkConstraintStartDate}"/>

View file

@ -30,16 +30,16 @@
<templateFinderPopup id="templateFinderPopup" acceptButtonLabel="${i18n:_('Create Order')}" caption="${i18n:_('Choosing Template')}" />
<button id="ordersTabCreateOrderButton" label="New order" tooltiptext="${i18n:_('Create new order')}" class="planner-command" disabled="true"/>
<button label="Save" tooltiptext="${i18n:_('Save order')}" class="planner-command" disabled="true"/>
<vbox id="orderFilter" visible="false"/>
<hbox id="orderFilter" visible="false"/>
<vbox id="filter" />
</hbox>
</hbox>
</north>
<center border="0" class="orderslayout-area">
<div>
<vbox id="messagesContainer" />
<list top_id="listWindow" />
<div>
<vbox id="messagesContainer" />
<list top_id="listWindow" />
</div>
</center>
</borderlayout>
</borderlayout>
</zk>