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

knowledgepixels / nanodash / 24334200781

13 Apr 2026 08:45AM UTC coverage: 16.094% (-0.05%) from 16.148%
24334200781

Pull #437

github

web-flow
Merge 91539235a into d46e750d5
Pull Request #437: feat: add filter field to all view types and convert publish page panels to proper views

789 of 6058 branches covered (13.02%)

Branch coverage included in aggregate %.

1977 of 11128 relevant lines covered (17.77%)

2.43 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/QueryResultNanopubSet.java
1
package com.knowledgepixels.nanodash.component;
2

3
import com.knowledgepixels.nanodash.FilteredQueryResultDataProvider;
4
import com.knowledgepixels.nanodash.NanodashSession;
5
import com.knowledgepixels.nanodash.QueryResult;
6
import com.knowledgepixels.nanodash.QueryResultDataProvider;
7
import com.knowledgepixels.nanodash.ViewDisplay;
8
import com.knowledgepixels.nanodash.component.menu.ViewDisplayMenu;
9
import org.apache.wicket.ajax.AjaxRequestTarget;
10
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
11
import org.apache.wicket.ajax.markup.html.AjaxLink;
12
import org.apache.wicket.behavior.AttributeAppender;
13
import org.apache.wicket.markup.html.WebMarkupContainer;
14
import org.apache.wicket.markup.html.basic.Label;
15
import org.apache.wicket.markup.html.form.TextField;
16
import org.apache.wicket.model.Model;
17
import org.nanopub.extra.services.ApiResponse;
18
import org.nanopub.extra.services.QueryRef;
19
import org.slf4j.Logger;
20
import org.slf4j.LoggerFactory;
21

22
/**
23
 * Component for displaying query results in a list format.
24
 */
25
public class QueryResultNanopubSet extends QueryResult {
26

27
    private static final Logger logger = LoggerFactory.getLogger(QueryResultNanopubSet.class);
×
28
    private final WebMarkupContainer viewSelector;
29
    private final long itemsPerPage;
30
    private FilteredQueryResultDataProvider filteredDataProvider;
31
    private Model<String> filterModel = Model.of("");
×
32
    private WebMarkupContainer nanopubsContainer;
33

34
    /**
35
     * Constructor for QueryResultList.
36
     *
37
     * @param markupId    the markup ID
38
     * @param queryRef    the query reference
39
     * @param response    the API response
40
     * @param viewDisplay the view display
41
     */
42
    QueryResultNanopubSet(String markupId, QueryRef queryRef, ApiResponse response, ViewDisplay viewDisplay, long itemsPerPage) {
43
        super(markupId, queryRef, response, viewDisplay);
×
44
        this.itemsPerPage = itemsPerPage;
×
45

46
        logger.info("Rendering {} with '{}' mode.", this.getClass().getName(), NanodashSession.get().getNanopubResultsViewMode().getValue());
×
47

48
        viewSelector = new WebMarkupContainer("viewSelector");
×
49
        viewSelector.setOutputMarkupId(true);
×
50

51
        viewSelector.add(new AjaxLink<>("listEnabler") {
×
52
            @Override
53
            public void onClick(AjaxRequestTarget target) {
54
                NanodashSession.get().setNanopubResultsViewMode(NanopubResults.ViewMode.LIST);
×
55
                logger.info("ListEnabler -- Switched to '{}' mode", NanodashSession.get().getNanopubResultsViewMode().getValue());
×
56
            }
×
57
        });
58

59
        viewSelector.add(new AjaxLink<>("gridEnabler") {
×
60
            @Override
61
            public void onClick(AjaxRequestTarget target) {
62
                NanodashSession.get().setNanopubResultsViewMode(NanopubResults.ViewMode.GRID);
×
63
                logger.info("GridEnabler -- Switched to '{}' mode", NanodashSession.get().getNanopubResultsViewMode().getValue());
×
64
            }
×
65
        });
66

67
        viewSelector.add(new Label("np"));
×
68
        add(viewSelector);
×
69
        showViewDisplayMenu = false; // handled in populateComponent() inside viewSelector
×
70

71
        String titleLabel = grlcQuery.getLabel();
×
72
        if (viewDisplay.getTitle() != null) {
×
73
            titleLabel = viewDisplay.getTitle();
×
74
        }
75
        add(new Label("title", titleLabel));
×
76

77
        TextField<String> filterField = new TextField<>("filter", filterModel);
×
78
        filterField.setOutputMarkupId(true);
×
79
        filterField.add(new AjaxFormComponentUpdatingBehavior("change") {
×
80
            @Override
81
            protected void onUpdate(AjaxRequestTarget target) {
82
                if (filteredDataProvider != null && nanopubsContainer != null) {
×
83
                    filteredDataProvider.setFilterText(filterModel.getObject());
×
84
                    nanopubsContainer.addOrReplace(buildNanopubResults());
×
85
                    target.add(nanopubsContainer);
×
86
                }
87
            }
×
88
        });
89
        viewSelector.add(filterField);
×
90

91
        setOutputMarkupId(true);
×
92
    }
×
93

94
    @Override
95
    protected void populateComponent() {
96
        logger.info("Populating the component with nanopub results.");
×
97
        filteredDataProvider = new FilteredQueryResultDataProvider(new QueryResultDataProvider(response.getData()), response);
×
98

99
        nanopubsContainer = new WebMarkupContainer("nanopubs-container");
×
100
        nanopubsContainer.setOutputMarkupId(true);
×
101
        nanopubsContainer.add(buildNanopubResults());
×
102
        add(nanopubsContainer);
×
103

104
        if (viewDisplay.getNanopubId() != null) {
×
105
            viewSelector.addOrReplace(new ViewDisplayMenu("np", viewDisplay, queryRef, pageResource));
×
106
        } else {
107
            viewSelector.addOrReplace(new Label("np").setVisible(false));
×
108
        }
109
    }
×
110

111
    private NanopubResults buildNanopubResults() {
112
        NanopubResults nanopubResults = NanopubResults.fromApiResponse("nanopubs", filteredDataProvider.getFilteredData(), itemsPerPage);
×
113
        nanopubResults.add(AttributeAppender.append("class", NanodashSession.get().getNanopubResultsViewMode().getValue()));
×
114
        return nanopubResults;
×
115
    }
116

117
    /**
118
     * Sets the visibility of the title.
119
     *
120
     * @param hasTitle true to show the title, false to hide it
121
     */
122
    public void setTitleVisible(boolean hasTitle) {
123
        this.get("title").setVisible(hasTitle);
×
124
        if (!hasTitle) {
×
125
            viewSelector.add(AttributeAppender.append("class", " no-title"));
×
126
        }
127
    }
×
128

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