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

knowledgepixels / nanodash / 23046278881

13 Mar 2026 10:15AM UTC coverage: 15.676% (-0.06%) from 15.734%
23046278881

push

github

web-flow
Merge pull request #388 from knowledgepixels/387-improve-user-page-buttons

Improve user page buttons (#387)

710 of 5489 branches covered (12.93%)

Branch coverage included in aggregate %.

1751 of 10210 relevant lines covered (17.15%)

2.35 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
src/main/java/com/knowledgepixels/nanodash/component/ExternalLinkWithActionsPanel.java
1
package com.knowledgepixels.nanodash.component;
2

3
import com.knowledgepixels.nanodash.component.menu.BaseDisplayMenu;
4
import com.knowledgepixels.nanodash.component.menu.ExploreDisplayMenu;
5
import com.knowledgepixels.nanodash.page.ExplorePage;
6
import org.apache.wicket.ajax.AjaxRequestTarget;
7
import org.apache.wicket.ajax.markup.html.AjaxLink;
8
import org.apache.wicket.markup.html.basic.Label;
9
import org.apache.wicket.markup.html.image.Image;
10
import org.apache.wicket.markup.html.link.ExternalLink;
11
import org.apache.wicket.markup.html.panel.Panel;
12
import org.apache.wicket.model.IModel;
13
import org.apache.wicket.request.mapper.parameter.PageParameters;
14
import org.apache.wicket.request.resource.ContextRelativeResourceReference;
15
import org.eclipse.rdf4j.model.IRI;
16

17
/**
18
 * External link with Actions Panel that allows to copy the link and explore it through the Nanodash ExplorePage.
19
 */
20
public class ExternalLinkWithActionsPanel extends Panel {
21

22
    private final IModel<String> urlModel;
23
    private IModel<String> labelModel;
24
    private IRI sourceNanopub;
25
    private BaseDisplayMenu customMenu;
26

27
    public ExternalLinkWithActionsPanel(String id, IModel<String> urlModel) {
28
        super(id);
×
29
        this.urlModel = urlModel;
×
30
    }
×
31

32
    public ExternalLinkWithActionsPanel(String id, IModel<String> urlModel, IModel<String> labelModel) {
33
        this(id, urlModel);
×
34
        this.labelModel = labelModel;
×
35
    }
×
36

37
    public ExternalLinkWithActionsPanel(String id, IModel<String> urlModel, IModel<String> labelModel, IRI sourceNanopub) {
38
        this(id, urlModel, labelModel);
×
39
        this.sourceNanopub = sourceNanopub;
×
40
    }
×
41

42
    public ExternalLinkWithActionsPanel(String id, IModel<String> urlModel, IModel<String> labelModel, BaseDisplayMenu customMenu) {
43
        this(id, urlModel, labelModel);
×
44
        this.customMenu = customMenu;
×
45
    }
×
46

47
    @Override
48
    protected void onInitialize() {
49
        super.onInitialize();
×
50

51
        ExternalLink externalLink = new ExternalLink("externalLink", urlModel, urlModel);
×
52
        add(externalLink);
×
53

54
        AjaxLink<Void> copyLinkButton = new AjaxLink<>("copyLinkButton") {
×
55
            @Override
56
            public void onClick(AjaxRequestTarget target) {
57
                String url = urlModel.getObject();
×
58
                String escapedUrl = url.replace("'", "\\'");
×
59
                target.appendJavaScript(
×
60
                        "navigator.clipboard.writeText('" + escapedUrl + "')" +
61
                        ".then(function() { alert('Link copied to clipboard!'); })" +
62
                        ".catch(function(err) { console.error('Copy failed:', err); });"
63
                );
64
            }
×
65
        };
66
        copyLinkButton.add(new Image("copyIcon", new ContextRelativeResourceReference("images/copy-icon.svg", false)));
×
67
        add(copyLinkButton);
×
68

69
        if (customMenu != null) {
×
70
            add(new Label("exploreButton", "").setVisible(false));
×
71
            add(customMenu);
×
72
        } else if (sourceNanopub != null) {
×
73
            add(new Label("exploreButton", "").setVisible(false));
×
74
            add(new ExploreDisplayMenu("np", urlModel.getObject(), labelModel.getObject(), sourceNanopub));
×
75
        } else {
76
            add(new Label("np", "").setVisible(false));
×
77
            if (labelModel != null) {
×
78
                AjaxLink<Void> exploreButton = new AjaxLink<>("exploreButton") {
×
79
                    @Override
80
                    public void onClick(AjaxRequestTarget target) {
81
                        setResponsePage(ExplorePage.class, new PageParameters().set("id", urlModel.getObject()).set("label", labelModel.getObject()));
×
82
                    }
×
83
                };
84
                add(exploreButton);
×
85
            } else {
×
86
                add(new Label("exploreButton", "").setVisible(false));
×
87
            }
88
        }
89
    }
×
90

91
    @Override
92
    protected void onDetach() {
93
        super.onDetach();
×
94
        urlModel.detach();
×
95
        if (labelModel != null) {
×
96
            labelModel.detach();
×
97
        }
98
    }
×
99

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