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

knowledgepixels / nanodash / 17700776486

13 Sep 2025 07:00PM UTC coverage: 13.736% (-0.04%) from 13.777%
17700776486

push

github

tkuhn
feat(Spaces): Improve Spaces pages

433 of 3986 branches covered (10.86%)

Branch coverage included in aggregate %.

1112 of 7262 relevant lines covered (15.31%)

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.util.ArrayList;
4
import java.util.HashSet;
5
import java.util.List;
6
import java.util.Set;
7

8
import org.apache.commons.lang3.tuple.Pair;
9
import org.apache.wicket.Component;
10
import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
11
import org.apache.wicket.markup.html.basic.Label;
12
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
13
import org.apache.wicket.markup.html.link.ExternalLink;
14
import org.apache.wicket.request.mapper.parameter.PageParameters;
15
import org.eclipse.rdf4j.model.IRI;
16
import org.nanopub.Nanopub;
17
import org.nanopub.extra.services.FailedApiCallException;
18

19
import com.knowledgepixels.nanodash.Space;
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

27

28

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

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

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

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

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

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

64
        add(new TitleBar("titlebar", this, "connectors"));
×
65

66
        add(new Label("pagetitle", space.getLabel() + " (space) | nanodash"));
×
67
        add(new Label("spacename", space.getLabel()));
×
68
        add(new Label("spacetype", space.getTypeLabel()));
×
69
        add(new ExternalLink("id", space.getId(), space.getId()));
×
70
        add(new BookmarkablePageLink<Void>("np", ExplorePage.class, new PageParameters().add("id", np.getUri())));
×
71
        add(new Label("description", "<span>" + Utils.sanitizeHtml(space.getDescription()) + "</span>").setEscapeModelStrings(false));
×
72

73
        if (space.isDataInitialized()) {
×
74
            add(new PinGroupList("pin-groups", space));
×
75
        } else {
76
            add(new AjaxLazyLoadPanel<Component>("pin-groups") {
×
77
    
78
                @Override
79
                public Component getLazyLoadComponent(String markupId) {
80
                    return new PinGroupList(markupId, space);
×
81
                }
82
    
83
                @Override
84
                protected boolean isContentReady() {
85
                    return space.isDataInitialized();
×
86
                }
87
    
88
            });
89
        }
90

91
        add(new ItemListPanel<Pair<IRI, String>>(
×
92
                "members",
93
                "Members",
94
                () -> space.isDataInitialized(),
×
95
                () -> {
96
                        List<Pair<IRI, String>> members = new ArrayList<>();
×
97
                        Set<IRI> ownerSet = new HashSet<>(space.getOwners());
×
98
                        for (IRI owner : space.getOwners()) members.add(Pair.of(owner, "(owner)"));
×
99
                        for (IRI member : space.getMembers()) {
×
100
                            if (ownerSet.contains(member)) continue;
×
101
                            members.add(Pair.of(member, ""));
×
102
                        }
×
103
                        return members;
×
104
                    },
105
                (p) -> new ItemListElement("item", UserPage.class, new PageParameters().add("id", p.getLeft()), User.getShortDisplayName(p.getLeft()), p.getRight())
×
106
            ));
107

108
        add(new ItemListPanel<Space>(
×
109
                "superspaces",
110
                "Part of",
111
                space.getSuperspaces(),
×
112
                (space) -> new ItemListElement("item", SpacePage.class, new PageParameters().add("id", space), space.getLabel(), "(" + space.getTypeLabel() + ")")
×
113
            ));
114

115
        addSubspacePanel("Group");
×
116
        addSubspacePanel("Project");
×
117
        addSubspacePanel("Program");
×
118
        addSubspacePanel("Initiative");
×
119
        addSubspacePanel("Community");
×
120
        addSubspacePanel("Event");
×
121

122
    }
×
123

124
    private void addSubspacePanel(String type) {
125
        String typePl = type + "s";
×
126
        typePl = typePl.replaceFirst("ys$", "ies");
×
127

128
        add(new ItemListPanel<Space>(
×
129
                typePl.toLowerCase(),
×
130
                typePl,
131
                space.getSubspaces("https://w3id.org/kpxl/gen/terms/" + type),
×
132
                (space) -> new ItemListElement("item", SpacePage.class, new PageParameters().add("id", space), space.getLabel())
×
133
            ));
134
    }
×
135

136
    /**
137
     * Checks if auto-refresh is enabled for this page.
138
     *
139
     * @return true if auto-refresh is enabled, false otherwise
140
     */
141
    protected boolean hasAutoRefreshEnabled() {
142
        return true;
×
143
    }
144

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