Changeset 4666


Ignore:
Timestamp:
03/10/14 15:52:30 (10 years ago)
Author:
Twan Goosen
Message:

added filtering of values in all values panel

Location:
vlo/branches/vlo-3.0/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • vlo/branches/vlo-3.0/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/AllFacetValuesPanel.html

    r4665 r4666  
    2727            <form wicket:id="options">
    2828                <p>Sort by <select wicket:id="sort"><option>name</option><option>count</option></select></p>
    29                 <div>Search: <input type="text" /></div>
     29                <div>Search: <input wicket:id="filter" type="text" /></div>
    3030            </form>
    3131            <div wicket:id="facetValuesContainer" class="sortedFacet">
  • vlo/branches/vlo-3.0/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/AllFacetValuesPanel.java

    r4665 r4666  
    2525import org.apache.wicket.ajax.AjaxRequestTarget;
    2626import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
     27import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
    2728import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
    2829import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
     
    3132import org.apache.wicket.markup.html.form.DropDownChoice;
    3233import org.apache.wicket.markup.html.form.Form;
     34import org.apache.wicket.markup.html.form.TextField;
    3335import org.apache.wicket.markup.html.link.Link;
    3436import org.apache.wicket.markup.html.panel.GenericPanel;
     
    3739import org.apache.wicket.model.CompoundPropertyModel;
    3840import org.apache.wicket.model.IModel;
     41import org.apache.wicket.model.Model;
    3942import org.apache.wicket.model.PropertyModel;
    4043
     
    4952    private final FacetFieldValuesProvider valuesProvider;
    5053    private final WebMarkupContainer valuesContainer;
     54    private IModel<String> filterModel = new Model<String>();
    5155
    5256    public AllFacetValuesPanel(String id, IModel<FacetField> model) {
    5357        super(id, model);
    54         valuesProvider = new FacetFieldValuesProvider(model);
     58        // create a provider that shows all values and is sorted by name by default
     59        valuesProvider = new FacetFieldValuesProvider(model, Integer.MAX_VALUE, FieldValueOrderSelector.NAME_SORT) {
    5560
     61            @Override
     62            protected IModel<String> getFilterModel() {
     63                // filters the values
     64                return filterModel;
     65            }
     66
     67        };
     68
     69        // create a container for the values to allow for AJAX updates
    5670        valuesContainer = new WebMarkupContainer("facetValuesContainer");
    5771        valuesContainer.setOutputMarkupId(true);
    5872        add(valuesContainer);
    5973
     74        // create the view of the actual values
    6075        final DataView<FacetField.Count> valuesView = createValuesView("facetValue");
    6176        valuesContainer.add(valuesView);
    6277
     78        // create the form for selection sort option and entering filter string
    6379        final Form optionsForm = createOptionsForm("options");
    6480        optionsForm.setOutputMarkupId(true);
     
    101117        final DropDownChoice<SortParam<FieldValuesOrder>> sortSelect
    102118                = new FieldValueOrderSelector("sort", new PropertyModel<SortParam<FieldValuesOrder>>(valuesProvider, "sort"));
    103         sortSelect.add(new AjaxFormComponentUpdatingBehavior("onchange") {
     119        sortSelect.add(new OnChangeAjaxBehavior() {
    104120
    105121            @Override
     
    110126        });
    111127        options.add(sortSelect);
     128
     129        final TextField filterField = new TextField("filter", filterModel);
     130        filterField.add(new AjaxFormComponentUpdatingBehavior("keyup") {
     131
     132            @Override
     133            protected void onUpdate(AjaxRequestTarget target) {
     134                target.add(valuesContainer);
     135            }
     136        });
     137        options.add(filterField);
    112138        return options;
    113139    }
  • vlo/branches/vlo-3.0/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/provider/FacetFieldValuesProvider.java

    r4664 r4666  
    1717package eu.clarin.cmdi.vlo.wicket.provider;
    1818
     19import com.google.common.base.Predicate;
     20import com.google.common.collect.ImmutableList;
     21import com.google.common.collect.Iterables;
    1922import com.google.common.collect.Ordering;
    2023import eu.clarin.cmdi.vlo.pojo.FieldValuesOrder;
     
    6770    }
    6871
     72    /**
     73     * override to achieve filtering
     74     *
     75     * @return model of string items should begin with
     76     */
     77    protected IModel<String> getFilterModel() {
     78        return null;
     79    }
     80
    6981    @Override
    7082    public Iterator<? extends FacetField.Count> iterator(long first, long count) {
    71         // TODO: From old VLO:
    72         // IGNORABLE_VALUES (like "unknown") are move to the back of the list and should only be shown when you click "more...", unless the list is too small then whe can just show them.
     83        // get all the values
    7384        final List<FacetField.Count> values = model.getObject().getValues();
    74         return getOrdering().sortedCopy(values).listIterator((int) first);
     85        // filter results
     86        final Iterable<Count> filtered = filter(values);
     87        // sort what remains
     88        final ImmutableList sorted = getOrdering().immutableSortedCopy(filtered);
     89        // return iterator starting at specified offset
     90        return sorted.listIterator((int) first);
    7591    }
    7692
    7793    @Override
    7894    public long size() {
    79         // Actual value count might be higher than what we want to show
    80         return Math.min(maxNumberOfItems, model.getObject().getValueCount());
     95        if (hasFilter()) {
     96            final List<FacetField.Count> values = model.getObject().getValues();
     97            return Iterables.size(filter(values));
     98        } else {
     99            // Use value count from Solr, faster.
     100            //
     101            // Actual value count might be higher than what we want to show
     102            // so get minimum.
     103            return Math.min(maxNumberOfItems, model.getObject().getValueCount());
     104        }
    81105    }
    82106
     
    89113    public void detach() {
    90114        model.detach();
     115    }
     116
     117    private Iterable<FacetField.Count> filter(List<FacetField.Count> list) {
     118        if (hasFilter()) {
     119            final String filterValue = getFilterModel().getObject().toLowerCase();
     120            return Iterables.filter(list, new Predicate<FacetField.Count>() {
     121                @Override
     122                public boolean apply(Count input) {
     123                    return input.getName().toLowerCase().startsWith(filterValue);
     124                }
     125            });
     126        } else {
     127            return list;
     128        }
     129    }
     130
     131    private boolean hasFilter() {
     132        return !(getFilterModel() == null || getFilterModel().getObject() == null || getFilterModel().getObject().isEmpty());
    91133    }
    92134
     
    112154        @Override
    113155        public int compare(Count arg0, Count arg1) {
     156            // TODO: From old VLO:
     157            // IGNORABLE_VALUES (like "unknown") are move to the back of the list and should only be shown when you click "more...", unless the list is too small then whe can just show them.
    114158            return Long.compare(arg0.getCount(), arg1.getCount());
    115159        }
     
    120164        @Override
    121165        public int compare(Count arg0, Count arg1) {
     166            // TODO: From old VLO:
     167            // IGNORABLE_VALUES (like "unknown") are move to the back of the list and should only be shown when you click "more...", unless the list is too small then whe can just show them.
    122168            return arg0.getName().compareTo(arg1.getName());
    123169        }
Note: See TracChangeset for help on using the changeset viewer.