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

knowledgepixels / nanodash / 27145358627

08 Jun 2026 02:39PM UTC coverage: 20.682% (-0.3%) from 20.947%
27145358627

push

github

web-flow
Merge pull request #479 from knowledgepixels/feat/about-pages-478

Resource-page tabs, presets, and role-gated view actions (#478, #302)

1052 of 6429 branches covered (16.36%)

Branch coverage included in aggregate %.

2642 of 11432 relevant lines covered (23.11%)

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

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

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

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

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

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

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

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

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

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

76
        TextField<String> filterField = new TextField<>("filter", filterModel);
×
77
        filterField.setOutputMarkupId(true);
×
78
        filterField.add(new FilterUpdatingBehavior() {
×
79
            @Override
80
            protected void onUpdate(AjaxRequestTarget target) {
81
                if (filteredDataProvider != null && nanopubsContainer != null) {
×
82
                    filteredDataProvider.setFilterText(filterModel.getObject());
×
83
                    nanopubsContainer.addOrReplace(buildNanopubResults());
×
84
                    target.add(nanopubsContainer);
×
85
                }
86
            }
×
87
        });
88
        filterField.setVisible(!fitsOnFirstPage());
×
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
        Label noRecordsLabel = new Label("no-records", "(nothing found)") {
×
103
            @Override
104
            protected void onConfigure() {
105
                super.onConfigure();
×
106
                setVisible(filteredDataProvider.size() == 0);
×
107
            }
×
108
        };
109
        nanopubsContainer.add(noRecordsLabel);
×
110
        add(nanopubsContainer);
×
111

112
        if (viewDisplay.getNanopubId() != null) {
×
113
            viewSelector.addOrReplace(new ViewDisplayMenu("np", viewDisplay, queryRef, pageResource));
×
114
        } else {
115
            viewSelector.addOrReplace(new Label("np").setVisible(false));
×
116
        }
117
    }
×
118

119
    private NanopubResults buildNanopubResults() {
120
        NanopubResults nanopubResults = NanopubResults.fromApiResponse("nanopubs", filteredDataProvider.getFilteredData(), itemsPerPage);
×
121
        nanopubResults.add(AttributeAppender.append("class", NanodashSession.get().getNanopubResultsViewMode().getValue()));
×
122
        // Hide the (empty) results container when there is nothing to show, so the
123
        // "(nothing found)" note sits directly below the header instead of being pushed
124
        // down by the flex-container's padding.
125
        nanopubResults.setVisible(!filteredDataProvider.getFilteredData().isEmpty());
×
126
        return nanopubResults;
×
127
    }
128

129
    /**
130
     * Sets the visibility of the title.
131
     *
132
     * @param hasTitle true to show the title, false to hide it
133
     */
134
    public void setTitleVisible(boolean hasTitle) {
135
        this.get("title").setVisible(hasTitle);
×
136
        if (!hasTitle) {
×
137
            viewSelector.add(AttributeAppender.append("class", " no-title"));
×
138
        }
139
    }
×
140

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