• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

knowledgepixels / nanodash / 21590827488

02 Feb 2026 12:51PM UTC coverage: 13.774% (-0.2%) from 13.94%
21590827488

push

github

tkuhn
feat: Add filter fields to views to User and Query pages

545 of 5252 branches covered (10.38%)

Branch coverage included in aggregate %.

1492 of 9537 relevant lines covered (15.64%)

2.07 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
src/main/java/com/knowledgepixels/nanodash/component/ItemList.java
1
package com.knowledgepixels.nanodash.component;
2

3
import com.knowledgepixels.nanodash.component.ItemListPanel.ComponentProvider;
4
import com.knowledgepixels.nanodash.FilteredListDataProvider;
5
import org.apache.wicket.ajax.AjaxRequestTarget;
6
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
7
import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator;
8
import org.apache.wicket.extensions.markup.html.repeater.data.table.NavigatorLabel;
9
import org.apache.wicket.markup.html.WebMarkupContainer;
10
import org.apache.wicket.markup.html.form.TextField;
11
import org.apache.wicket.markup.html.panel.Panel;
12
import org.apache.wicket.markup.repeater.Item;
13
import org.apache.wicket.markup.repeater.data.DataView;
14
import org.apache.wicket.markup.repeater.data.ListDataProvider;
15
import org.apache.wicket.model.IModel;
16
import org.apache.wicket.model.Model;
17

18
import java.io.Serializable;
19
import java.util.List;
20

21
/**
22
 * A reusable Wicket panel that displays a paginated list of items.
23
 *
24
 * @param <T> the type of items in the list, must be Serializable
25
 */
26
public class ItemList<T extends Serializable> extends Panel {
27

28
    /**
29
     * Creates an ItemList panel.
30
     *
31
     * @param markupId     the markup ID for the panel
32
     * @param items        the list of items to display
33
     * @param compProvider a provider that generates a component for each item
34
     */
35
    public ItemList(String markupId, List<T> items, ComponentProvider<T> compProvider) {
36
        this(markupId, items, compProvider, null);
×
37
    }
×
38

39
    /**
40
     * Creates an ItemList panel with optional filter.
41
     *
42
     * @param markupId        the markup ID for the panel
43
     * @param items           the list of items to display
44
     * @param compProvider    a provider that generates a component for each item
45
     * @param filterTextGetter function to get searchable text from each item, or null for no filter (must be serializable for Wicket page serialization)
46
     */
47
    public ItemList(String markupId, List<T> items, ComponentProvider<T> compProvider, FilteredListDataProvider.SerializableFunction<T, String> filterTextGetter) {
48
        this(markupId, items, compProvider, filterTextGetter, null);
×
49
    }
×
50

51
    /**
52
     * Creates an ItemList panel with filter in external panel (filter field is in parent; filterModel is shared).
53
     */
54
    public ItemList(String markupId, List<T> items, ComponentProvider<T> compProvider, FilteredListDataProvider.SerializableFunction<T, String> filterTextGetter, IModel<String> filterModel) {
55
        super(markupId);
×
56
        setOutputMarkupId(true);
×
57

58
        final DataView<T> dataView;
59
        if (filterTextGetter != null) {
×
60
            IModel<String> effectiveFilterModel = filterModel != null ? filterModel : Model.of("");
×
61
            FilteredListDataProvider<T> filteredDataProvider = filterModel != null
×
62
                    ? new FilteredListDataProvider<>(items, filterTextGetter, filterModel)
×
63
                    : new FilteredListDataProvider<>(items, filterTextGetter);
×
64
            dataView = new DataView<T>("itemlist", filteredDataProvider) {
×
65
                @Override
66
                protected void populateItem(Item<T> item) {
67
                    item.add(compProvider.apply(item.getModelObject()));
×
68
                }
×
69
            };
70
            if (filterModel == null) {
×
71
                TextField<String> filterField = new TextField<>("filter", effectiveFilterModel);
×
72
                filterField.setOutputMarkupId(true);
×
73
                filterField.add(new AjaxFormComponentUpdatingBehavior("change") {
×
74
                    @Override
75
                    protected void onUpdate(AjaxRequestTarget target) {
76
                        filteredDataProvider.setFilterText(effectiveFilterModel.getObject());
×
77
                        WebMarkupContainer nav = (WebMarkupContainer) ItemList.this.get("navigation");
×
78
                        nav.setVisible(dataView.getPageCount() > 1);
×
79
                        target.add(ItemList.this);
×
80
                    }
×
81
                });
82
                add(filterField);
×
83
            } else {
×
84
                add(new TextField<>("filter", Model.of("")).setVisible(false));
×
85
            }
86
        } else {
×
87
            dataView = new DataView<T>("itemlist", new ListDataProvider<T>(items)) {
×
88
                @Override
89
                protected void populateItem(Item<T> item) {
90
                    item.add(compProvider.apply(item.getModelObject()));
×
91
                }
×
92
            };
93
            add(new TextField<>("filter", Model.of("")).setVisible(false));
×
94
        }
95

96
        dataView.setItemsPerPage(10);
×
97
        dataView.setOutputMarkupId(true);
×
98
        add(dataView);
×
99

100
        WebMarkupContainer navigation = new WebMarkupContainer("navigation");
×
101
        navigation.add(new NavigatorLabel("navigatorLabel", dataView));
×
102
        AjaxPagingNavigator pagingNavigator = new AjaxPagingNavigator("navigator", dataView);
×
103
        navigation.setVisible(dataView.getPageCount() > 1);
×
104
        navigation.add(pagingNavigator);
×
105
        add(navigation);
×
106
    }
×
107

108
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc