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

knowledgepixels / nanodash / 17437818570

03 Sep 2025 03:09PM UTC coverage: 12.108% (-0.03%) from 12.137%
17437818570

push

github

tkuhn
Improve async loading of projects; provide new MethodResultComponent

337 of 3874 branches covered (8.7%)

Branch coverage included in aggregate %.

972 of 6937 relevant lines covered (14.01%)

0.62 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.wicket.Component;
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.markup.repeater.Item;
13
import org.apache.wicket.markup.repeater.data.DataView;
14
import org.apache.wicket.markup.repeater.data.ListDataProvider;
15
import org.apache.wicket.request.mapper.parameter.PageParameters;
16
import org.eclipse.rdf4j.model.IRI;
17
import org.nanopub.Nanopub;
18
import org.nanopub.extra.services.FailedApiCallException;
19

20
import com.knowledgepixels.nanodash.Project;
21
import com.knowledgepixels.nanodash.QueryApiAccess;
22
import com.knowledgepixels.nanodash.Utils;
23
import com.knowledgepixels.nanodash.component.MethodResultComponent;
24
import com.knowledgepixels.nanodash.component.QueryResultTable;
25
import com.knowledgepixels.nanodash.component.TemplateResults;
26
import com.knowledgepixels.nanodash.component.TitleBar;
27
import com.knowledgepixels.nanodash.component.UserList;
28
import com.knowledgepixels.nanodash.template.Template;
29

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

35
    private static final long serialVersionUID = 1L;
36

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

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

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

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

64
        project = Project.get(parameters.get("id").toString());
×
65
        Nanopub np = project.getRootNanopub();
×
66

67
        add(new TitleBar("titlebar", this, null));
×
68

69
        add(new Label("pagetitle", project.getLabel() + " (project) | nanodash"));
×
70
        add(new Label("projectname", project.getLabel()));
×
71
        add(new ExternalLink("id", project.getId(), project.getId()));
×
72
        add(new BookmarkablePageLink<Void>("np", ExplorePage.class, new PageParameters().add("id", np.getUri())));
×
73
        add(new Label("description", "<span class=\"internal\">" + Utils.sanitizeHtml(project.getDescription()) + "</span>").setEscapeModelStrings(false));
×
74

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

95
            private static final long serialVersionUID = 1L;
96

97
            @Override
98
            protected void populateItem(Item<Pair<String, List<Template>>> item) {
99
                item.add(new Label("label", item.getModelObject().getLeft()));
×
100
                item.add(TemplateResults.fromList("templates", item.getModelObject().getRight(), params));
×
101
            }
×
102

103
        });
104
        add(TemplateResults.fromList("templates", templates, params));
×
105

106
        if (project.isDataInitialized()) {
×
107
            add(new UserList("owners", project.getOwners()));
×
108
        } else {
109
            add(new MethodResultComponent<Project,List<IRI>>("owners", project, Project::isDataInitialized, Project::getOwners) {
×
110
                @Override
111
                public Component getResultComponent(String markupId, List<IRI> result) {
112
                    return new UserList(markupId, result);
×
113
                }
114
            });
115
        }
116

117
        if (project.isDataInitialized()) {
×
118
            add(new UserList("members", project.getMembers()));
×
119
        } else {
120
            add(new MethodResultComponent<Project,List<IRI>>("members", project, Project::isDataInitialized, Project::getMembers) {
×
121
                @Override
122
                public Component getResultComponent(String markupId, List<IRI> result) {
123
                    return new UserList(markupId, result);
×
124
                }
125
            });
126
        }
127

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

130
            private static final long serialVersionUID = 1L;
131

132
            @Override
133
            protected void populateItem(Item<IRI> item) {
134
                String queryId = QueryApiAccess.getQueryId(item.getModelObject());
×
135
                item.add(QueryResultTable.createComponent("query", queryId, false));
×
136
            }
×
137

138
        });
139
    }
×
140

141
    /**
142
     * Checks if auto-refresh is enabled for this page.
143
     *
144
     * @return true if auto-refresh is enabled, false otherwise
145
     */
146
    protected boolean hasAutoRefreshEnabled() {
147
        return true;
×
148
    }
149

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