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

knowledgepixels / nanodash / 17731893163

15 Sep 2025 11:44AM UTC coverage: 13.74% (-0.04%) from 13.782%
17731893163

push

github

tkuhn
feat(Spaces): Forward from project page to space page if applicable

435 of 3992 branches covered (10.9%)

Branch coverage included in aggregate %.

1113 of 7274 relevant lines covered (15.3%)

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/ProjectPage.java
1
package com.knowledgepixels.nanodash.page;
2

3
import java.util.ArrayList;
4
import java.util.Collections;
5
import java.util.List;
6

7
import org.apache.commons.lang3.tuple.Pair;
8
import org.apache.http.client.RedirectException;
9
import org.apache.wicket.RestartResponseException;
10
import org.apache.wicket.markup.html.basic.Label;
11
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
12
import org.apache.wicket.markup.html.link.ExternalLink;
13
import org.apache.wicket.markup.repeater.Item;
14
import org.apache.wicket.markup.repeater.data.DataView;
15
import org.apache.wicket.markup.repeater.data.ListDataProvider;
16
import org.apache.wicket.request.mapper.parameter.PageParameters;
17
import org.eclipse.rdf4j.model.IRI;
18
import org.nanopub.Nanopub;
19
import org.nanopub.extra.services.FailedApiCallException;
20

21
import com.knowledgepixels.nanodash.Project;
22
import com.knowledgepixels.nanodash.QueryApiAccess;
23
import com.knowledgepixels.nanodash.Space;
24
import com.knowledgepixels.nanodash.User;
25
import com.knowledgepixels.nanodash.Utils;
26
import com.knowledgepixels.nanodash.component.ItemListElement;
27
import com.knowledgepixels.nanodash.component.ItemListPanel;
28
import com.knowledgepixels.nanodash.component.QueryResultTable;
29
import com.knowledgepixels.nanodash.component.TemplateItem;
30
import com.knowledgepixels.nanodash.component.TitleBar;
31
import com.knowledgepixels.nanodash.template.Template;
32

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

38
    private static final long serialVersionUID = 1L;
39

40
    /**
41
     * The mount path for this page.
42
     */
43
    public static final String MOUNT_PATH = "/project";
44

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

53
    /**
54
     * Project object with the data shown on this page.
55
     */
56
    private Project project;
57

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

67
        String projectId = parameters.get("id").toString();
×
68
        if (Space.get(projectId) != null) {
×
69
            throw new RestartResponseException(SpacePage.class, parameters);
×
70
        }
71
        project = Project.get(projectId);
×
72
        Nanopub np = project.getRootNanopub();
×
73

74
        add(new TitleBar("titlebar", this, null));
×
75

76
        add(new Label("pagetitle", project.getLabel() + " (project) | nanodash"));
×
77
        add(new Label("projectname", project.getLabel()));
×
78
        add(new ExternalLink("id", project.getId(), project.getId()));
×
79
        add(new BookmarkablePageLink<Void>("np", ExplorePage.class, new PageParameters().add("id", np.getUri())));
×
80
        add(new Label("description", "<span class=\"internal\">" + Utils.sanitizeHtml(project.getDescription()) + "</span>").setEscapeModelStrings(false));
×
81

82
        final PageParameters params = new PageParameters();
×
83
        if (project.getDefaultProvenance() != null) {
×
84
            params.add("prtemplate", project.getDefaultProvenance().stringValue());
×
85
        }
86
        List<Pair<String, List<Template>>> templateLists = new ArrayList<>();
×
87
        List<String> templateTagList = new ArrayList<>(project.getTemplateTags());
×
88
        Collections.sort(templateTagList);
×
89
        List<Template> templates = new ArrayList<>(project.getTemplates());
×
90
        for (String tag : templateTagList) {
×
91
            for (Template t : project.getTemplatesPerTag().get(tag)) {
×
92
                if (templates.contains(t)) templates.remove(t);
×
93
            }
×
94
            templateLists.add(Pair.of(tag, project.getTemplatesPerTag().get(tag)));
×
95
        }
×
96
        if (!templates.isEmpty()) {
×
97
            String l = templateLists.isEmpty() ? "Templates" : "Other Templates";
×
98
            templateLists.add(Pair.of(l, templates));
×
99
        }
100
        add(new DataView<Pair<String, List<Template>>>("template-lists", new ListDataProvider<>(templateLists)) {
×
101

102
            private static final long serialVersionUID = 1L;
103

104
            @Override
105
            protected void populateItem(Item<Pair<String, List<Template>>> item) {
106
                item.add(new ItemListPanel<Template>(
×
107
                        "templates",
108
                        item.getModelObject().getLeft(),
×
109
                        item.getModelObject().getRight(),
×
110
                        (template) -> new TemplateItem("item", template, params)
×
111
                    ));
112
            }
×
113

114
        });
115
        add(new ItemListPanel<Template>(
×
116
                "templates",
117
                "Templates",
118
                templates,
119
                (template) -> new TemplateItem("item", template, params)
×
120
            ));
121

122
        add(new ItemListPanel<IRI>(
×
123
                "owners",
124
                "Owners",
125
                () -> project.isDataInitialized(),
×
126
                () -> project.getOwners(),
×
127
                (userIri) -> {
128
                    return new ItemListElement("item", UserPage.class, new PageParameters().add("id", userIri), User.getShortDisplayName(userIri));
×
129
                }
130
            ));
131

132
        add(new ItemListPanel<IRI>(
×
133
                "members",
134
                "Members",
135
                () -> project.isDataInitialized(),
×
136
                () -> project.getMembers(),
×
137
                (userIri) -> {
138
                    return new ItemListElement("item", UserPage.class, new PageParameters().add("id", userIri), User.getShortDisplayName(userIri));
×
139
                }
140
            ));
141

142
        add(new DataView<IRI>("queries", new ListDataProvider<IRI>(project.getQueryIds())) {
×
143

144
            private static final long serialVersionUID = 1L;
145

146
            @Override
147
            protected void populateItem(Item<IRI> item) {
148
                String queryId = QueryApiAccess.getQueryId(item.getModelObject());
×
149
                item.add(QueryResultTable.createComponent("query", queryId, false));
×
150
            }
×
151

152
        });
153
    }
×
154

155
    /**
156
     * Checks if auto-refresh is enabled for this page.
157
     *
158
     * @return true if auto-refresh is enabled, false otherwise
159
     */
160
    protected boolean hasAutoRefreshEnabled() {
161
        return true;
×
162
    }
163

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