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

knowledgepixels / nanodash / 19101564803

05 Nov 2025 12:12PM UTC coverage: 14.453% (+0.1%) from 14.319%
19101564803

push

github

ashleycaselli
chore: add source nanopublication character to ItemListElement

515 of 4518 branches covered (11.4%)

Branch coverage included in aggregate %.

1353 of 8407 relevant lines covered (16.09%)

0.72 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
src/main/java/com/knowledgepixels/nanodash/page/SpacePage.java
1
package com.knowledgepixels.nanodash.page;
2

3
import com.knowledgepixels.nanodash.*;
4
import com.knowledgepixels.nanodash.component.*;
5
import com.knowledgepixels.nanodash.connector.ConnectorConfig;
6
import com.knowledgepixels.nanodash.connector.GenOverviewPage;
7
import org.apache.wicket.Component;
8
import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
9
import org.apache.wicket.markup.html.basic.Label;
10
import org.apache.wicket.markup.html.link.AbstractLink;
11
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
12
import org.apache.wicket.model.Model;
13
import org.apache.wicket.request.mapper.parameter.PageParameters;
14
import org.eclipse.rdf4j.model.IRI;
15
import org.nanopub.Nanopub;
16
import org.nanopub.extra.services.FailedApiCallException;
17
import org.nanopub.extra.services.QueryRef;
18

19
import java.time.LocalDateTime;
20
import java.time.ZoneId;
21
import java.time.format.DateTimeFormatter;
22
import java.util.ArrayList;
23
import java.util.List;
24

25
/**
26
 * The ProjectPage class represents a space page in the Nanodash application.
27
 */
28
public class SpacePage extends NanodashPage {
29

30
    /**
31
     * The mount path for this page.
32
     */
33
    public static final String MOUNT_PATH = "/space";
34

35
    /**
36
     * {@inheritDoc}
37
     */
38
    @Override
39
    public String getMountPath() {
40
        return MOUNT_PATH;
×
41
    }
42

43
    /**
44
     * Space object with the data shown on this page.
45
     */
46
    private Space space;
47

48
    private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
×
49

50
    /**
51
     * Constructor for the SpacePage.
52
     *
53
     * @param parameters the page parameters
54
     * @throws org.nanopub.extra.services.FailedApiCallException if the API call fails
55
     */
56
    public SpacePage(final PageParameters parameters) throws FailedApiCallException {
57
        super(parameters);
×
58

59
        space = Space.get(parameters.get("id").toString());
×
60
        Nanopub np = space.getRootNanopub();
×
61

62
        add(new TitleBar("titlebar", this, "connectors"));
×
63

64
        add(new Label("pagetitle", space.getLabel() + " (space) | nanodash"));
×
65
        add(new Label("spacename", space.getLabel()));
×
66
        add(new Label("spacetype", space.getTypeLabel()));
×
67
        add(new BookmarkablePageLink<Void>("id", ExplorePage.class, parameters.set("label", space.getLabel())).setBody(Model.of(space.getId())));
×
68
        add(new BookmarkablePageLink<Void>("np", ExplorePage.class, new PageParameters().add("id", np.getUri())));
×
69

70
        add(new ItemListPanel<String>(
×
71
                "altids",
72
                "Alternative IDs:",
73
                space.getAltIDs(),
×
74
                id -> new ItemListElement("item", ExplorePage.class, new PageParameters().add("id", id), id)
×
75
        ));
76

77
        if (space.getStartDate() != null) {
×
78
            String dateString;
79
            LocalDateTime dt = LocalDateTime.ofInstant(space.getStartDate().toInstant(), ZoneId.systemDefault());
×
80
            dateString = dateTimeFormatter.format(dt);
×
81
            if (space.getEndDate() != null) {
×
82
                dt = LocalDateTime.ofInstant(space.getEndDate().toInstant(), ZoneId.systemDefault());
×
83
                String endDate = dateTimeFormatter.format(dt);
×
84
                if (!dateString.equals(endDate)) {
×
85
                    dateString += " - " + endDate;
×
86
                }
87
            }
88
            add(new Label("date", dateString));
×
89
        } else {
×
90
            add(new Label("date").setVisible(false));
×
91
        }
92

93
        add(new Label("description", "<span>" + Utils.sanitizeHtml(space.getDescription()) + "</span>").setEscapeModelStrings(false));
×
94

95
        final List<AbstractLink> pinButtons = new ArrayList<>();
×
96

97
        AbstractLink addPinnedTemplateButton = new BookmarkablePageLink<NanodashPage>("button", PublishPage.class, new PageParameters()
×
98
                .add("template", "https://w3id.org/np/RA2YwreWrGW9HkzWls8jgwaIINKUB5ZTli1aFKQt13dUk")
×
99
                .add("param_space", space.getId())
×
100
                .add("context", space.getId())
×
101
        );
102
        addPinnedTemplateButton.setBody(Model.of("+ template"));
×
103
        pinButtons.add(addPinnedTemplateButton);
×
104

105
        AbstractLink addPinnedQueryButton = new BookmarkablePageLink<NanodashPage>("button", PublishPage.class, new PageParameters()
×
106
                .add("template", "https://w3id.org/np/RAuLESdeRUlk1GcTwvzVXShiBMI0ntJs2DL2Bm5DzW_ZQ")
×
107
                .add("param_space", space.getId())
×
108
        );
109
        addPinnedQueryButton.setBody(Model.of("+ query"));
×
110
        pinButtons.add(addPinnedQueryButton);
×
111

112
        if (space.isDataInitialized()) {
×
113
            add(new PinGroupList("pin-groups", space));
×
114
            add(new ButtonList("pin-buttons", space, null, null, pinButtons));
×
115
        } else {
116
            add(new AjaxLazyLoadPanel<Component>("pin-groups") {
×
117

118
                @Override
119
                public Component getLazyLoadComponent(String markupId) {
120
                    return new PinGroupList(markupId, space);
×
121
                }
122

123
                @Override
124
                protected boolean isContentReady() {
125
                    return space.isDataInitialized();
×
126
                }
127

128
            });
129
            add(new AjaxLazyLoadPanel<Component>("pin-buttons") {
×
130

131
                @Override
132
                public Component getLazyLoadComponent(String markupId) {
133
                    return new ButtonList(markupId, space, null, null, pinButtons);
×
134
                }
135

136
                @Override
137
                protected boolean isContentReady() {
138
                    return space.isDataInitialized();
×
139
                }
140

141
                public Component getLoadingComponent(String id) {
142
                    return new Label(id).setVisible(false);
×
143
                }
144

145
            });
146
        }
147

148
        final List<AbstractLink> viewButtons = new ArrayList<>();
×
149
        AbstractLink addViewButton = new BookmarkablePageLink<NanodashPage>("button", PublishPage.class, new PageParameters()
×
150
                .add("template", "https://w3id.org/np/RAxERE0cQ9jLQZ5VjeA-1v3XnE9ugxLpFG8vpkAd5FqHE")
×
151
                .add("param_resource", space.getId())
×
152
                .add("context", space.getId())
×
153
        );
154
        addViewButton.setBody(Model.of("+ view"));
×
155
        viewButtons.add(addViewButton);
×
156

157
        if (space.isDataInitialized()) {
×
158
            add(new ViewList("views", space));
×
159
            add(new ButtonList("view-buttons", space, null, null, viewButtons));
×
160
        } else {
161
            add(new AjaxLazyLoadPanel<Component>("views") {
×
162

163
                @Override
164
                public Component getLazyLoadComponent(String markupId) {
165
                    return new ViewList(markupId, space);
×
166
                }
167

168
                @Override
169
                protected boolean isContentReady() {
170
                    return space.isDataInitialized();
×
171
                }
172

173
            });
174
            add(new AjaxLazyLoadPanel<Component>("view-buttons") {
×
175

176
                @Override
177
                public Component getLazyLoadComponent(String markupId) {
178
                    return new ButtonList(markupId, space, null, null, viewButtons);
×
179
                }
180

181
                @Override
182
                protected boolean isContentReady() {
183
                    return space.isDataInitialized();
×
184
                }
185

186
                public Component getLoadingComponent(String id) {
187
                    return new Label(id).setVisible(false);
×
188
                }
189

190
                ;
191

192
            });
193
        }
194

195
        add(new ItemListPanel<>(
×
196
                        "roles",
197
                        "Roles:",
198
                        () -> space.isDataInitialized(),
×
199
                        () -> space.getRoles(),
×
200
                        r -> new ItemListElement("item", ExplorePage.class, new PageParameters().add("id", r.getId()), r.getName())
×
201
                )
202
                        .makeInline()
×
203
                        .setSpace(space)
×
204
                        .addAdminButton("+", PublishPage.class, new PageParameters()
×
205
                                .add("template", "https://w3id.org/np/RARBzGkEqiQzeiHk0EXFcv9Ol1d-17iOh9MoFJzgfVQDc")
×
206
                                .add("param_space", space.getId())
×
207
                                .add("template-version", "latest")
×
208
                        )
209
        );
210

211
        add(new ItemListPanel<IRI>(
×
212
                "users",
213
                "Users",
214
                () -> space.isDataInitialized(),
×
215
                () -> space.getUsers(),
×
216
                m -> {
217
                    String roleLabel = "(";
×
218
                    for (SpaceMemberRole r : space.getMemberRoles(m)) {
×
219
                        roleLabel += r.getName() + ", ";
×
220
                    }
×
221
                    roleLabel = roleLabel.replaceFirst(", $", ")");
×
222
                    return new ItemListElement("item", UserPage.class, new PageParameters().add("id", m), User.getShortDisplayName(m), roleLabel, null);
×
223
                }
224
        ));
225

226

227
        if (space.isDataInitialized()) {
×
228
            add(new SpaceUserList("user-lists", space));
×
229
        } else {
230
            add(new AjaxLazyLoadPanel<Component>("user-lists") {
×
231

232
                @Override
233
                public Component getLazyLoadComponent(String markupId) {
234
                    return new SpaceUserList(markupId, space);
×
235
                }
236

237
                @Override
238
                protected boolean isContentReady() {
239
                    return space.isDataInitialized();
×
240
                }
241

242
            });
243
        }
244

245
        add(new ItemListPanel<Space>(
×
246
                "superspaces",
247
                "Part of",
248
                space.getSuperspaces(),
×
249
                (space) -> new ItemListElement("item", SpacePage.class, new PageParameters().add("id", space), space.getLabel(), "(" + space.getTypeLabel() + ")", null)
×
250
        ));
251

252
        addSubspacePanel("Alliance", true);
×
253
        addSubspacePanel("Consortium", false);
×
254
        addSubspacePanel("Organization", true);
×
255
        addSubspacePanel("Taskforce", false);
×
256
        addSubspacePanel("Division", true);
×
257
        addSubspacePanel("Taskunit", false);
×
258
        addSubspacePanel("Group", true);
×
259
        addSubspacePanel("Project", false);
×
260
        addSubspacePanel("Program", true);
×
261
        addSubspacePanel("Initiative", false);
×
262
        addSubspacePanel("Outlet", true);
×
263
        addSubspacePanel("Campaign", false);
×
264
        addSubspacePanel("Community", true);
×
265
        addSubspacePanel("Event", false);
×
266

267
        add(new ItemListPanel<MaintainedResource>(
×
268
                "resources",
269
                "Resources",
270
                new QueryRef("get-maintained-resources"),
271
                (apiResponse) -> {
272
                    MaintainedResource.ensureLoaded();
×
273
                    return MaintainedResource.getResourcesBySpace(space);
×
274
                },
275
                (resource) -> {
276
                    return new ItemListElement("item", MaintainedResourcePage.class, new PageParameters().add("id", resource.getId()), resource.getLabel());
×
277
                }
278
        )
279
                .setSpace(space)
×
280
                .setReadyFunction(space::isDataInitialized)
×
281
                .addMemberButton("+", PublishPage.class, new PageParameters()
×
282
                        .set("template", "https://w3id.org/np/RA25VaVFxSOgKEuZ70gFINn-N3QV4Pf62-IMK_SWkg-c8")
×
283
                        .set("param_space", space.getId())
×
284
                        .set("context", space.getId())
×
285
                        .set("template-version", "latest")
×
286
                ));
287

288
        String shortId = space.getId().replace("https://w3id.org/spaces/", "");
×
289
        ConnectorConfig cc = ConnectorConfig.get(shortId);
×
290
        if (cc != null) {
×
291
            add(new BookmarkablePageLink<Void>("content-button", GenOverviewPage.class, new PageParameters().add("journal", shortId)).setBody(Model.of("Nanopublication Submissions")));
×
292
        } else {
293
            add(new Label("content-button").setVisible(false));
×
294
        }
295
    }
×
296

297
    private void addSubspacePanel(String type, boolean openEnded) {
298
        String typePl = type + "s";
×
299
        typePl = typePl.replaceFirst("ys$", "ies");
×
300

301
        add(new ItemListPanel<>(
×
302
                        typePl.toLowerCase(),
×
303
                        typePl,
304
                        space.getSubspaces("https://w3id.org/kpxl/gen/terms/" + type),
×
305
                        (space) -> new ItemListElement("item", SpacePage.class, new PageParameters().add("id", space), space.getLabel())
×
306
                )
307
                        .setSpace(space)
×
308
                        .setReadyFunction(space::isDataInitialized)
×
309
                        .addMemberButton("+", PublishPage.class, new PageParameters()
×
310
                                .set("template", openEnded ? "https://w3id.org/np/RA7dQfmndqKmooQ4PlHyQsAql9i2tg_8GLHf_dqtxsGEQ" : "https://w3id.org/np/RAaE7NP9RNIx03AHZxanFMdtUuaTfe50ns5tHhpEVloQ4")
×
311
                                .set("param_type", "https://w3id.org/kpxl/gen/terms/" + type)
×
312
                                .set("param_space", space.getId().replaceFirst("https://w3id.org/spaces/", "") + "/<...>")
×
313
                                .set("template-version", "latest"))
×
314
        );
315
    }
×
316

317
    /**
318
     * Checks if auto-refresh is enabled for this page.
319
     *
320
     * @return true if auto-refresh is enabled, false otherwise
321
     */
322
    protected boolean hasAutoRefreshEnabled() {
323
        return true;
×
324
    }
325

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