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

3
import com.knowledgepixels.nanodash.*;
4
import com.knowledgepixels.nanodash.domain.AbstractResourceWithProfile;
5
import com.knowledgepixels.nanodash.domain.MaintainedResource;
6
import com.knowledgepixels.nanodash.page.PublishPage;
7
import com.knowledgepixels.nanodash.repository.MaintainedResourceRepository;
8
import com.knowledgepixels.nanodash.template.Template;
9
import org.apache.wicket.Component;
10
import org.apache.wicket.behavior.AttributeAppender;
11
import org.apache.wicket.request.mapper.parameter.PageParameters;
12
import org.eclipse.rdf4j.model.IRI;
13
import org.nanopub.extra.services.ApiResponse;
14
import org.nanopub.extra.services.QueryRef;
15

16
import java.io.Serializable;
17

18
/**
19
 * Builder class for creating QueryResultList components.
20
 */
21
public class QueryResultListBuilder implements Serializable {
22

23
    private String markupId;
24
    private ViewDisplay viewDisplay;
25
    private String contextId = null;
×
26
    private QueryRef queryRef;
27
    private AbstractResourceWithProfile resourceWithProfile = null;
×
28
    private String id = null;
×
29
    private AbstractResourceWithProfile pageResource = null;
×
30

31
    private QueryResultListBuilder(String markupId, QueryRef queryRef, ViewDisplay viewDisplay) {
×
32
        this.markupId = markupId;
×
33
        this.queryRef = queryRef;
×
34
        this.viewDisplay = viewDisplay;
×
35
    }
×
36

37
    /**
38
     * Creates a new QueryResultListBuilder instance.
39
     *
40
     * @param markupId    the markup ID for the component
41
     * @param queryRef    the query reference
42
     * @param viewDisplay the view display
43
     * @return a new QueryResultListBuilder instance
44
     */
45
    public static QueryResultListBuilder create(String markupId, QueryRef queryRef, ViewDisplay viewDisplay) {
46
        return new QueryResultListBuilder(markupId, queryRef, viewDisplay);
×
47
    }
48

49
    public QueryResultListBuilder resourceWithProfile(AbstractResourceWithProfile resourceWithProfile) {
50
        this.resourceWithProfile = resourceWithProfile;
×
51
        return this;
×
52
    }
53

54
    /**
55
     * Sets the context ID for the QueryResultList.
56
     *
57
     * @param contextId the context ID
58
     * @return the current QueryResultListBuilder instance
59
     */
60
    public QueryResultListBuilder contextId(String contextId) {
61
        this.contextId = contextId;
×
62
        return this;
×
63
    }
64

65
    public QueryResultListBuilder id(String id) {
66
        this.id = id;
×
67
        return this;
×
68
    }
69

70
    public QueryResultListBuilder pageResource(AbstractResourceWithProfile pageResource) {
71
        this.pageResource = pageResource;
×
72
        return this;
×
73
    }
74

75
    /**
76
     * Builds the QueryResultList component.
77
     *
78
     * @return the QueryResultList component
79
     */
80
    public Component build() {
81
        ApiResponse response = ApiCache.retrieveResponseAsync(queryRef);
×
82
        String colClass = " col-" + viewDisplay.getDisplayWidth();
×
83
        if (resourceWithProfile != null) {
×
84
            if (response != null) {
×
85
                QueryResultList resultList = new QueryResultList(markupId, queryRef, response, viewDisplay);
×
86
                resultList.setResourceWithProfile(resourceWithProfile);
×
87
                resultList.setPageResource(pageResource);
×
88
                resultList.setContextId(contextId);
×
89
                View view = viewDisplay.getView();
×
90
                if (view != null) {
×
91
                    for (IRI actionIri : view.getViewResultActionList()) {
×
92
                        if (!SpaceMemberRole.isViewerEntitled(view.getActionVisibleTo(actionIri), resourceWithProfile)) continue;
×
93
                        Template t = view.getTemplateForAction(actionIri);
×
94
                        if (t == null) continue;
×
95
                        String targetField = view.getTemplateTargetFieldForAction(actionIri);
×
96
                        if (targetField == null) targetField = "resource";
×
97
                        String label = view.getLabelForAction(actionIri);
×
98
                        if (label == null) label = "action...";
×
99
                        if (!label.endsWith("...")) label += "...";
×
100
                        PageParameters params = new PageParameters().set("template", t.getId())
×
101
                                .set("param_" + targetField, id)
×
102
                                .set("context", contextId)
×
103
                                .set("template-version", "latest");
×
104
                        if (id != null && contextId != null && !id.equals(contextId)) {
×
105
                            params.set("part", id);
×
106
                        }
107
                        String partField = view.getTemplatePartFieldForAction(actionIri);
×
108
                        if (partField != null) {
×
109
                            // TODO Find a better way to pass the MaintainedResource object to this method:
110
                            MaintainedResource r = MaintainedResourceRepository.get().findById(contextId);
×
111
                            if (r != null && r.getNamespace() != null) {
×
112
                                params.set("param_" + partField, r.getNamespace() + "<SET-SUFFIX>");
×
113
                            }
114
                        }
115
                        String queryMapping = view.getTemplateQueryMapping(actionIri);
×
116
                        if (queryMapping != null && queryMapping.contains(":")) {
×
117
                            params.set("values-from-query", queryRef.getAsUrlString());
×
118
                            params.set("values-from-query-mapping", queryMapping);
×
119
                        }
120
                        params.set("refresh-upon-publish", queryRef.getAsUrlString());
×
121
                        resultList.addButton(label, PublishPage.class, params);
×
122
                    }
×
123
                }
124
                resultList.add(new AttributeAppender("class", colClass));
×
125
                return resultList;
×
126
            } else {
127
                ApiResultComponent comp = new ApiResultComponent(markupId, queryRef) {
×
128
                    @Override
129
                    public Component getApiResultComponent(String markupId, ApiResponse response) {
130
                        QueryResultList resultList = new QueryResultList(markupId, queryRef, response, viewDisplay);
×
131
                        resultList.setResourceWithProfile(resourceWithProfile);
×
132
                        resultList.setPageResource(pageResource);
×
133
                        resultList.setContextId(contextId);
×
134
                        View view = viewDisplay.getView();
×
135
                        if (view != null) {
×
136
                            for (IRI actionIri : view.getViewResultActionList()) {
×
137
                                if (!SpaceMemberRole.isViewerEntitled(view.getActionVisibleTo(actionIri), resourceWithProfile)) continue;
×
138
                                Template t = view.getTemplateForAction(actionIri);
×
139
                                if (t == null) continue;
×
140
                                String targetField = view.getTemplateTargetFieldForAction(actionIri);
×
141
                                if (targetField == null) targetField = "resource";
×
142
                                String label = view.getLabelForAction(actionIri);
×
143
                                if (label == null) label = "action...";
×
144
                                PageParameters params = new PageParameters().set("template", t.getId())
×
145
                                        .set("param_" + targetField, id)
×
146
                                        .set("context", contextId)
×
147
                                        .set("template-version", "latest");
×
148
                                if (id != null && contextId != null && !id.equals(contextId)) {
×
149
                                    params.set("part", id);
×
150
                                }
151
                                String partField = view.getTemplatePartFieldForAction(actionIri);
×
152
                                if (partField != null) {
×
153
                                    // TODO Find a better way to pass the MaintainedResource object to this method:
154
                                    MaintainedResource r = MaintainedResourceRepository.get().findById(contextId);
×
155
                                    if (r != null && r.getNamespace() != null) {
×
156
                                        params.set("param_" + partField, r.getNamespace() + "<SET-SUFFIX>");
×
157
                                    }
158
                                }
159
                                String queryMapping = view.getTemplateQueryMapping(actionIri);
×
160
                                if (queryMapping != null && queryMapping.contains(":")) {
×
161
                                    params.set("values-from-query", queryRef.getAsUrlString());
×
162
                                    params.set("values-from-query-mapping", queryMapping);
×
163
                                }
164
                                params.set("refresh-upon-publish", queryRef.getAsUrlString());
×
165
                                resultList.addButton(label, PublishPage.class, params);
×
166
                            }
×
167
                        }
168
                        return resultList;
×
169
                    }
170
                };
171
                comp.add(new AttributeAppender("class", colClass));
×
172
                return comp;
×
173
            }
174
        } else {
175
            if (response != null) {
×
176
                QueryResultList resultList = new QueryResultList(markupId, queryRef, response, viewDisplay);
×
177
                resultList.setPageResource(pageResource);
×
178
                resultList.setContextId(contextId);
×
179
                resultList.add(new AttributeAppender("class", colClass));
×
180
                return resultList;
×
181
            } else {
182
                ApiResultComponent comp = new ApiResultComponent(markupId, queryRef) {
×
183
                    @Override
184
                    public Component getApiResultComponent(String markupId, ApiResponse response) {
185
                        QueryResultList resultList = new QueryResultList(markupId, queryRef, response, viewDisplay);
×
186
                        resultList.setPageResource(pageResource);
×
187
                        resultList.setContextId(contextId);
×
188
                        return resultList;
×
189
                    }
190
                };
191
                comp.add(new AttributeAppender("class", colClass));
×
192
                return comp;
×
193
            }
194
        }
195
    }
196

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