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

knowledgepixels / nanodash / 27622310436

16 Jun 2026 01:49PM UTC coverage: 26.963% (+6.3%) from 20.697%
27622310436

Pull #483

github

web-flow
Merge dbba567c9 into 663f14f46
Pull Request #483: Space/resource About pages, ref-aware spaces, and magic query params

1542 of 6717 branches covered (22.96%)

Branch coverage included in aggregate %.

3407 of 11638 relevant lines covered (29.27%)

4.31 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

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

76
        setOutputMarkupId(true);
×
77
    }
×
78

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

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

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

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

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

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