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

knowledgepixels / nanodash / 24382503285

14 Apr 2026 05:24AM UTC coverage: 15.886% (-0.2%) from 16.094%
24382503285

push

github

web-flow
Merge pull request #438 from knowledgepixels/feature/item-list-view-435

feat: implement ItemListView and fix async view rendering

789 of 6130 branches covered (12.87%)

Branch coverage included in aggregate %.

1978 of 11288 relevant lines covered (17.52%)

2.4 hits per line

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

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

3
import org.apache.wicket.extensions.markup.html.repeater.data.sort.ISortState;
4
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
5
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
6
import org.apache.wicket.model.IModel;
7
import org.nanopub.extra.services.ApiResponse;
8
import org.nanopub.extra.services.ApiResponseEntry;
9

10
import java.util.ArrayList;
11
import java.util.Arrays;
12
import java.util.Iterator;
13
import java.util.List;
14

15
/**
16
 * Filtered data provider that wraps QueryResultDataProvider and filters results based on a filter string.
17
 */
18
public class FilteredQueryResultDataProvider implements ISortableDataProvider<ApiResponseEntry, String> {
19

20
    private final QueryResultDataProvider baseProvider;
21
    private final ApiResponse response;
22
    private String filterText = "";
×
23
    private List<ApiResponseEntry> filteredData = null;
×
24

25
    public FilteredQueryResultDataProvider(QueryResultDataProvider baseProvider, ApiResponse response) {
×
26
        this.baseProvider = baseProvider;
×
27
        this.response = response;
×
28
    }
×
29

30
    public void setFilterText(String filterText) {
31
        if (filterText == null) {
×
32
            filterText = "";
×
33
        }
34
        if (!this.filterText.equals(filterText)) {
×
35
            this.filterText = filterText;
×
36
            this.filteredData = null; // Invalidate cache
×
37
        }
38
    }
×
39

40
    public List<ApiResponseEntry> getFilteredData() {
41
        if (filteredData != null) {
×
42
            return filteredData;
×
43
        }
44

45
        List<ApiResponseEntry> allData = response.getData();
×
46
        if (filterText == null || filterText.trim().isEmpty()) {
×
47
            filteredData = allData;
×
48
        } else {
49
            String lowerFilter = filterText.toLowerCase();
×
50
            filteredData = new ArrayList<>();
×
51
            for (ApiResponseEntry entry : allData) {
×
52
                boolean matches = false;
×
53
                for (String key : response.getHeader()) {
×
54
                    String value = entry.get(key);
×
55
                    if (value != null && value.toLowerCase().contains(lowerFilter)) {
×
56
                        matches = true;
×
57
                        break;
×
58
                    }
59
                }
60
                if (matches) {
×
61
                    filteredData.add(entry);
×
62
                }
63
            }
×
64
        }
65
        return filteredData;
×
66
    }
67

68
    @Override
69
    public Iterator<? extends ApiResponseEntry> iterator(long first, long count) {
70
        List<ApiResponseEntry> data = new ArrayList<>(getFilteredData());
×
71
        SortParam<String> sortParam = baseProvider.getSortParam();
×
72
        if (sortParam != null) {
×
73
            String prop = sortParam.getProperty();
×
74
            String labelProp = prop + "_label";
×
75
            String sortProp = Arrays.asList(response.getHeader()).contains(labelProp) ? labelProp : prop;
×
76
            data.sort((o1, o2) -> {
×
77
                String v1 = o1.get(sortProp);
×
78
                String v2 = o2.get(sortProp);
×
79
                int result;
80
                if (v1 == null && v2 == null) result = 0;
×
81
                else if (v1 == null) result = 1;
×
82
                else if (v2 == null) result = -1;
×
83
                else result = v1.compareToIgnoreCase(v2);
×
84
                if (!sortParam.isAscending()) result = -result;
×
85
                return result;
×
86
            });
87
        }
88
        return Utils.subList(data, first, first + count).iterator();
×
89
    }
90

91
    @Override
92
    public IModel<ApiResponseEntry> model(ApiResponseEntry object) {
93
        return baseProvider.model(object);
×
94
    }
95

96
    @Override
97
    public long size() {
98
        return getFilteredData().size();
×
99
    }
100

101
    @Override
102
    public ISortState<String> getSortState() {
103
        return baseProvider.getSortState();
×
104
    }
105

106
    @Override
107
    public void detach() {
108
        baseProvider.detach();
×
109
    }
×
110

111
}
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