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

knowledgepixels / nanodash / 18009026394

25 Sep 2025 01:26PM UTC coverage: 14.385% (+1.0%) from 13.408%
18009026394

push

github

tkuhn
feat(Spaces): Add new Space types

466 of 4084 branches covered (11.41%)

Branch coverage included in aggregate %.

1203 of 7518 relevant lines covered (16.0%)

0.71 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.Space;
19
import com.knowledgepixels.nanodash.SpaceMemberRole;
20
import com.knowledgepixels.nanodash.User;
21
import com.knowledgepixels.nanodash.Utils;
22
import com.knowledgepixels.nanodash.component.ItemListElement;
23
import com.knowledgepixels.nanodash.component.ItemListPanel;
24
import com.knowledgepixels.nanodash.component.PinGroupList;
25
import com.knowledgepixels.nanodash.component.TitleBar;
26
import com.knowledgepixels.nanodash.component.ViewList;
27
import com.knowledgepixels.nanodash.connector.ConnectorConfig;
28
import com.knowledgepixels.nanodash.connector.GenOverviewPage;
29

30

31

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

204
    /**
205
     * Checks if auto-refresh is enabled for this page.
206
     *
207
     * @return true if auto-refresh is enabled, false otherwise
208
     */
209
    protected boolean hasAutoRefreshEnabled() {
210
        return true;
×
211
    }
212

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