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

knowledgepixels / nanodash / 17912021155

22 Sep 2025 10:12AM UTC coverage: 13.577% (-0.004%) from 13.581%
17912021155

push

github

tkuhn
feat: inline list panels

435 of 4040 branches covered (10.77%)

Branch coverage included in aggregate %.

1115 of 7376 relevant lines covered (15.12%)

0.67 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.connector.ConnectorConfig;
27
import com.knowledgepixels.nanodash.connector.GenOverviewPage;
28

29

30

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

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

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

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

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

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

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

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

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

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

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

94
        if (space.isDataInitialized()) {
×
95
            add(new PinGroupList("pin-groups", space));
×
96
        } else {
97
            add(new AjaxLazyLoadPanel<Component>("pin-groups") {
×
98
    
99
                @Override
100
                public Component getLazyLoadComponent(String markupId) {
101
                    return new PinGroupList(markupId, space);
×
102
                }
103
    
104
                @Override
105
                protected boolean isContentReady() {
106
                    return space.isDataInitialized();
×
107
                }
108
    
109
            });
110
        }
111

112
        add(new ItemListPanel<SpaceMemberRole>(
×
113
                "roles",
114
                "Roles",
115
                () -> space.isDataInitialized(),
×
116
                () -> space.getRoles(),
×
117
                (r) -> new ItemListElement("item", ExplorePage.class, new PageParameters().add("id", r.getMainProperty()), r.getName())
×
118
            ).makeInline());
×
119

120
        add(new ItemListPanel<IRI>(
×
121
                "members",
122
                "Members",
123
                () -> space.isDataInitialized(),
×
124
                () -> space.getMembers(),
×
125
                (m) -> {
126
                        String roleLabel = "(";
×
127
                        for (SpaceMemberRole r : space.getMemberRoles(m)) {
×
128
                            roleLabel += r.getName() + ", ";
×
129
                        }
×
130
                        roleLabel = roleLabel.replaceFirst(", $", ")");
×
131
                        return new ItemListElement("item", UserPage.class, new PageParameters().add("id", m), User.getShortDisplayName(m), roleLabel);
×
132
                    }
133
            ));
134

135
        add(new ItemListPanel<Space>(
×
136
                "superspaces",
137
                "Part of",
138
                space.getSuperspaces(),
×
139
                (space) -> new ItemListElement("item", SpacePage.class, new PageParameters().add("id", space), space.getLabel(), "(" + space.getTypeLabel() + ")")
×
140
            ));
141

142
        addSubspacePanel("Group");
×
143
        addSubspacePanel("Project");
×
144
        addSubspacePanel("Program");
×
145
        addSubspacePanel("Initiative");
×
146
        addSubspacePanel("Outlet");
×
147
        addSubspacePanel("Campaign");
×
148
        addSubspacePanel("Community");
×
149
        addSubspacePanel("Event");
×
150

151
        String shortId = space.getId().replace("https://w3id.org/spaces/", "");
×
152
        ConnectorConfig cc = ConnectorConfig.get(shortId);
×
153
        if (cc != null) {
×
154
            add(new BookmarkablePageLink<Void>("content-button", GenOverviewPage.class, new PageParameters().add("journal", shortId)).setBody(Model.of("Nanopublication Submissions")));
×
155
        } else {
156
            add(new Label("content-button").setVisible(false));
×
157
        }
158
    }
×
159

160
    private void addSubspacePanel(String type) {
161
        String typePl = type + "s";
×
162
        typePl = typePl.replaceFirst("ys$", "ies");
×
163

164
        add(new ItemListPanel<Space>(
×
165
                typePl.toLowerCase(),
×
166
                typePl,
167
                space.getSubspaces("https://w3id.org/kpxl/gen/terms/" + type),
×
168
                (space) -> new ItemListElement("item", SpacePage.class, new PageParameters().add("id", space), space.getLabel())
×
169
            ));
170
    }
×
171

172
    /**
173
     * Checks if auto-refresh is enabled for this page.
174
     *
175
     * @return true if auto-refresh is enabled, false otherwise
176
     */
177
    protected boolean hasAutoRefreshEnabled() {
178
        return true;
×
179
    }
180

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