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

knowledgepixels / nanodash / 18304008035

07 Oct 2025 06:24AM UTC coverage: 13.709% (-0.006%) from 13.715%
18304008035

push

github

tkuhn
feat(Spaces): Add "new..." button to subspace panels

449 of 4138 branches covered (10.85%)

Branch coverage included in aggregate %.

1162 of 7613 relevant lines covered (15.26%)

0.68 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 java.time.LocalDateTime;
4
import java.time.ZoneId;
5
import java.time.format.DateTimeFormatter;
6

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.BookmarkablePageLink;
11
import org.apache.wicket.markup.html.link.ExternalLink;
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

18
import com.knowledgepixels.nanodash.NanodashSession;
19
import com.knowledgepixels.nanodash.Space;
20
import com.knowledgepixels.nanodash.SpaceMemberRole;
21
import com.knowledgepixels.nanodash.User;
22
import com.knowledgepixels.nanodash.Utils;
23
import com.knowledgepixels.nanodash.component.ItemListElement;
24
import com.knowledgepixels.nanodash.component.ItemListPanel;
25
import com.knowledgepixels.nanodash.component.PinGroupList;
26
import com.knowledgepixels.nanodash.component.TitleBar;
27
import com.knowledgepixels.nanodash.component.ViewList;
28
import com.knowledgepixels.nanodash.connector.ConnectorConfig;
29
import com.knowledgepixels.nanodash.connector.GenOverviewPage;
30

31

32

33
/**
34
 * The ProjectPage class represents a space page in the Nanodash application.
35
 */
36
public class SpacePage extends NanodashPage {
37

38
    /**
39
     * The mount path for this page.
40
     */
41
    public static final String MOUNT_PATH = "/space";
42

43
    /**
44
     * {@inheritDoc}
45
     */
46
    @Override
47
    public String getMountPath() {
48
        return MOUNT_PATH;
×
49
    }
50

51
    /**
52
     * Space object with the data shown on this page.
53
     */
54
    private Space space;
55

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

58
    /**
59
     * Constructor for the SpacePage.
60
     *
61
     * @param parameters the page parameters
62
     * @throws org.nanopub.extra.services.FailedApiCallException if the API call fails
63
     */
64
    public SpacePage(final PageParameters parameters) throws FailedApiCallException {
65
        super(parameters);
×
66

67
        space = Space.get(parameters.get("id").toString());
×
68
        Nanopub np = space.getRootNanopub();
×
69

70
        add(new TitleBar("titlebar", this, "connectors"));
×
71

72
        add(new Label("pagetitle", space.getLabel() + " (space) | nanodash"));
×
73
        add(new Label("spacename", space.getLabel()));
×
74
        add(new Label("spacetype", space.getTypeLabel()));
×
75
        add(new ExternalLink("id", space.getId(), space.getId()));
×
76
        add(new BookmarkablePageLink<Void>("np", ExplorePage.class, new PageParameters().add("id", np.getUri())));
×
77

78
        add(new ItemListPanel<String>(
×
79
                "altids",
80
                "Alternative IDs:",
81
                space.getAltIDs(),
×
82
                id -> new ItemListElement("item", ExplorePage.class, new PageParameters().add("id", id), id)
×
83
            ));
84

85
        if (space.getStartDate() != null) {
×
86
            String dateString;
87
            LocalDateTime dt = LocalDateTime.ofInstant(space.getStartDate().toInstant(), ZoneId.systemDefault());
×
88
            dateString = dateTimeFormatter.format(dt);
×
89
            if (space.getEndDate() != null) {
×
90
                dt = LocalDateTime.ofInstant(space.getEndDate().toInstant(), ZoneId.systemDefault());
×
91
                String endDate = dateTimeFormatter.format(dt);
×
92
                if (!dateString.equals(endDate)) {
×
93
                    dateString += " - " + endDate;
×
94
                }
95
            }
96
            add(new Label("date", dateString));
×
97
        } else {
×
98
            add(new Label("date").setVisible(false));
×
99
        }
100

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

103
        if (space.isDataInitialized()) {
×
104
            add(new PinGroupList("pin-groups", space));
×
105
        } else {
106
            add(new AjaxLazyLoadPanel<Component>("pin-groups") {
×
107
    
108
                @Override
109
                public Component getLazyLoadComponent(String markupId) {
110
                    return new PinGroupList(markupId, space);
×
111
                }
112
    
113
                @Override
114
                protected boolean isContentReady() {
115
                    return space.isDataInitialized();
×
116
                }
117
    
118
            });
119
        }
120

121
        if (space.isDataInitialized()) {
×
122
            add(new ViewList("views", space));
×
123
        } else {
124
            add(new AjaxLazyLoadPanel<Component>("views") {
×
125
    
126
                @Override
127
                public Component getLazyLoadComponent(String markupId) {
128
                    return new ViewList(markupId, space);
×
129
                }
130
    
131
                @Override
132
                protected boolean isContentReady() {
133
                    return space.isDataInitialized();
×
134
                }
135
    
136
            });
137
        }
138

139
        add(new ItemListPanel<SpaceMemberRole>(
×
140
                "roles",
141
                "Roles:",
142
                () -> space.isDataInitialized(),
×
143
                () -> space.getRoles(),
×
144
                r -> new ItemListElement("item", ExplorePage.class, new PageParameters().add("id", r.getId()), r.getName())
×
145
            ).makeInline());
×
146

147
        add(new ItemListPanel<IRI>(
×
148
                "users",
149
                "Users",
150
                () -> space.isDataInitialized(),
×
151
                () -> space.getUsers(),
×
152
                m -> {
153
                        String roleLabel = "(";
×
154
                        for (SpaceMemberRole r : space.getMemberRoles(m)) {
×
155
                            roleLabel += r.getName() + ", ";
×
156
                        }
×
157
                        roleLabel = roleLabel.replaceFirst(", $", ")");
×
158
                        return new ItemListElement("item", UserPage.class, new PageParameters().add("id", m), User.getShortDisplayName(m), roleLabel);
×
159
                    }
160
            ));
161

162
        add(new ItemListPanel<Space>(
×
163
                "superspaces",
164
                "Part of",
165
                space.getSuperspaces(),
×
166
                (space) -> new ItemListElement("item", SpacePage.class, new PageParameters().add("id", space), space.getLabel(), "(" + space.getTypeLabel() + ")")
×
167
            ));
168

169
        addSubspacePanel("Alliance", true);
×
170
        addSubspacePanel("Consortium", false);
×
171
        addSubspacePanel("Organization", true);
×
172
        addSubspacePanel("Taskforce", false);
×
173
        addSubspacePanel("Division", true);
×
174
        addSubspacePanel("Taskunit", false);
×
175
        addSubspacePanel("Group", true);
×
176
        addSubspacePanel("Project", false);
×
177
        addSubspacePanel("Program", true);
×
178
        addSubspacePanel("Initiative", false);
×
179
        addSubspacePanel("Outlet", true);
×
180
        addSubspacePanel("Campaign", false);
×
181
        addSubspacePanel("Community", true);
×
182
        addSubspacePanel("Event", false);
×
183

184
        String shortId = space.getId().replace("https://w3id.org/spaces/", "");
×
185
        ConnectorConfig cc = ConnectorConfig.get(shortId);
×
186
        if (cc != null) {
×
187
            add(new BookmarkablePageLink<Void>("content-button", GenOverviewPage.class, new PageParameters().add("journal", shortId)).setBody(Model.of("Nanopublication Submissions")));
×
188
        } else {
189
            add(new Label("content-button").setVisible(false));
×
190
        }
191
    }
×
192

193
    private void addSubspacePanel(String type, boolean openEnded) {
194
        String typePl = type + "s";
×
195
        typePl = typePl.replaceFirst("ys$", "ies");
×
196

197
        ItemListPanel<Space> panel = new ItemListPanel<>(
×
198
                typePl.toLowerCase(),
×
199
                typePl,
200
                space.getSubspaces("https://w3id.org/kpxl/gen/terms/" + type),
×
201
                (space) -> new ItemListElement("item", SpacePage.class, new PageParameters().add("id", space), space.getLabel())
×
202
            );
203

204
        if (isCurrentUserMember()) {
×
205
            PageParameters newLinkParams = new PageParameters()
×
206
                    .add("param_type", "https://w3id.org/kpxl/gen/terms/" + type)
×
207
                    .add("param_space", space.getId().replaceFirst("https://w3id.org/spaces/", "") + "/...")
×
208
                    .add("template-version", "latest");
×
209
            if (openEnded) {
×
210
                newLinkParams.add("template", "https://w3id.org/np/RA7dQfmndqKmooQ4PlHyQsAql9i2tg_8GLHf_dqtxsGEQ");
×
211
            } else {
212
                newLinkParams.add("template", "https://w3id.org/np/RAaE7NP9RNIx03AHZxanFMdtUuaTfe50ns5tHhpEVloQ4");
×
213
            }
214
            panel.addButton("new...", PublishPage.class, newLinkParams);
×
215
        }
216

217
        add(panel);
×
218
    }
×
219

220
    /**
221
     * Checks if auto-refresh is enabled for this page.
222
     *
223
     * @return true if auto-refresh is enabled, false otherwise
224
     */
225
    protected boolean hasAutoRefreshEnabled() {
226
        return true;
×
227
    }
228

229
    private boolean isCurrentUserMember() {
230
        IRI userIri = NanodashSession.get().getUserIri();
×
231
        if (userIri == null) return false;
×
232
        return space.isMember(userIri);
×
233
    }
234

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