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

knowledgepixels / nanodash / 28881436268

07 Jul 2026 04:17PM UTC coverage: 28.155% (-0.3%) from 28.465%
28881436268

Pull #543

github

web-flow
Merge 1de19bcd0 into f1a7efda7
Pull Request #543: feat: query-form views (gen:QueryFormView) with view-results page

1813 of 7301 branches covered (24.83%)

Branch coverage included in aggregate %.

3717 of 12340 relevant lines covered (30.12%)

4.47 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.behavior.AttributeAppender;
11
import org.apache.wicket.markup.html.WebMarkupContainer;
12
import org.apache.wicket.markup.html.basic.Label;
13
import org.apache.wicket.markup.html.form.TextField;
14
import org.apache.wicket.model.Model;
15
import org.nanopub.extra.services.ApiResponse;
16
import org.nanopub.extra.services.QueryRef;
17
import org.slf4j.Logger;
18
import org.slf4j.LoggerFactory;
19

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

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

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

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

46
        viewSelector = new WebMarkupContainer("viewSelector");
×
47
        viewSelector.setOutputMarkupId(true);
×
48

49
        // The tiled (grid) view mode is deactivated for now: this view always renders
50
        // as a list (see buildNanopubResults), so the list/grid toggle is omitted.
51
        viewSelector.add(new Label("np"));
×
52
        add(viewSelector);
×
53
        showViewDisplayMenu = false; // handled in populateComponent() inside viewSelector
×
54

55
        String titleLabel = grlcQuery.getLabel();
×
56
        if (viewDisplay.getTitle() != null) {
×
57
            titleLabel = viewDisplay.getTitle();
×
58
        }
59
        add(new Label("title", titleLabel));
×
60
        if (titleLabel == null || titleLabel.isEmpty()) {
×
61
            setTitleVisible(false);
×
62
        }
63

64
        TextField<String> filterField = new TextField<>("filter", filterModel);
×
65
        filterField.setOutputMarkupId(true);
×
66
        filterField.add(new FilterUpdatingBehavior() {
×
67
            @Override
68
            protected void onUpdate(AjaxRequestTarget target) {
69
                if (filteredDataProvider != null && nanopubsContainer != null) {
×
70
                    filteredDataProvider.setFilterText(filterModel.getObject());
×
71
                    nanopubsContainer.addOrReplace(buildNanopubResults());
×
72
                    target.add(nanopubsContainer);
×
73
                }
74
            }
×
75
        });
76
        filterField.setVisible(!fitsOnFirstPage());
×
77
        viewSelector.add(filterField);
×
78

79
        setOutputMarkupId(true);
×
80
    }
×
81

82
    @Override
83
    protected void populateComponent() {
84
        logger.info("Populating the component with nanopub results.");
×
85
        filteredDataProvider = new FilteredQueryResultDataProvider(new QueryResultDataProvider(response.getData()), response);
×
86

87
        nanopubsContainer = new WebMarkupContainer("nanopubs-container");
×
88
        nanopubsContainer.setOutputMarkupId(true);
×
89
        nanopubsContainer.add(buildNanopubResults());
×
90
        Label noRecordsLabel = new Label("no-records", "(nothing found)") {
×
91
            @Override
92
            protected void onConfigure() {
93
                super.onConfigure();
×
94
                setVisible(filteredDataProvider.size() == 0);
×
95
            }
×
96
        };
97
        nanopubsContainer.add(noRecordsLabel);
×
98
        add(nanopubsContainer);
×
99

100
        if (viewDisplay.getNanopubId() != null || !getMenuActions().isEmpty()) {
×
101
            viewSelector.addOrReplace(new ViewDisplayMenu("np", viewDisplay, queryRef, pageResource, getMenuActions()));
×
102
        } else {
103
            viewSelector.addOrReplace(new Label("np").setVisible(false));
×
104
        }
105
    }
×
106

107
    private NanopubResults buildNanopubResults() {
108
        NanopubResults nanopubResults = NanopubResults.fromApiResponse("nanopubs", filteredDataProvider.getFilteredData(), itemsPerPage);
×
109
        // Tiled (grid) mode deactivated for now — always render this view as a list,
110
        // regardless of the session's view-mode setting.
111
        nanopubResults.add(AttributeAppender.append("class", NanopubResults.ViewMode.LIST.getValue()));
×
112
        // Hide the (empty) results container when there is nothing to show, so the
113
        // "(nothing found)" note sits directly below the header instead of being pushed
114
        // down by the flex-container's padding.
115
        nanopubResults.setVisible(!filteredDataProvider.getFilteredData().isEmpty());
×
116
        return nanopubResults;
×
117
    }
118

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

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