Skip to content

Commit a1e4225

Browse files
committed
fix: fix display logic for "Link" button on collection page
1 parent 8163186 commit a1e4225

3 files changed

Lines changed: 42 additions & 23 deletions

File tree

src/main/java/edu/harvard/iq/dataverse/DataversePage.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,18 +207,31 @@ public void setLinkMode(LinkMode linkMode) {
207207
}
208208

209209
public boolean showLinkingPopup() {
210-
String testquery = "";
211-
if (session.getUser() == null) {
210+
// Must be logged in
211+
AuthenticatedUser au = getAuthenticatedUser();
212+
if (au == null) {
212213
return false;
213214
}
214215
if (dataverse == null) {
215216
return false;
216217
}
217-
if (query != null) {
218-
testquery = query;
218+
219+
// If there is an active search query, that's all that matters (plus having permission on ANY collection)
220+
if (query != null && !query.isEmpty()) {
221+
List<Dataverse> permitted = permissionService.findPermittedCollections(dvRequestService.getDataverseRequest(), au, Permission.LinkDataverse);
222+
return permitted != null && !permitted.isEmpty();
223+
}
224+
225+
// Otherwise (no active search), check if there is at least one OTHER eligible collection
226+
// Eligible means: not the current collection and not in the parent tree
227+
// Technically, eligible also means "not already linked", but in that case, we show the Link button anyway and have the Link dialog display a message about all eligible collections already being linked
228+
List<Dataverse> dvsWithLinkPermission = permissionService.findPermittedCollections(dvRequestService.getDataverseRequest(), au, Permission.LinkDataverse);
229+
if (dvsWithLinkPermission != null && !dvsWithLinkPermission.isEmpty()) {
230+
List<Dataverse> eligibleDataverses = dataverseService.removeUnlinkableDataverses(dvsWithLinkPermission, dataverse, false);
231+
return !eligibleDataverses.isEmpty();
219232
}
220233

221-
return (dataverse.getOwner() != null || !testquery.isEmpty());
234+
return false;
222235
}
223236

224237
public void setupLinkingPopup (String popupSetting){

src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -551,28 +551,30 @@ public List<Dataverse> filterDataversesForLinking(String query, DataverseRequest
551551
return dataverseList;
552552
}
553553

554-
public List<Dataverse> removeUnlinkableDataverses(List<Dataverse> allWithPerms, DvObject dvo) {
554+
public List<Dataverse> removeUnlinkableDataverses(List<Dataverse> allWithPerms, DvObject dvo, boolean removeAlreadyLinked) {
555555
List<Dataverse> dataverseList = new ArrayList<>();
556556
Dataset linkedDataset = null;
557557
Dataverse linkedDataverse = null;
558-
List<Object> alreadyLinkeddv_ids;
559-
560-
if ((dvo instanceof Dataset)) {
561-
linkedDataset = (Dataset) dvo;
562-
alreadyLinkeddv_ids = em.createNativeQuery("SELECT linkingdataverse_id FROM datasetlinkingdataverse WHERE dataset_id = " + linkedDataset.getId()).getResultList();
563-
} else {
564-
linkedDataverse = (Dataverse) dvo;
565-
alreadyLinkeddv_ids = em.createNativeQuery("SELECT linkingdataverse_id FROM dataverselinkingdataverse WHERE dataverse_id = " + linkedDataverse.getId()).getResultList();
566-
}
567558

568559
List<Dataverse> remove = new ArrayList<>();
569560

570-
if (alreadyLinkeddv_ids != null && !alreadyLinkeddv_ids.isEmpty()) {
571-
alreadyLinkeddv_ids.stream().map((testDVId) -> this.find(testDVId)).forEachOrdered((removeIt) -> {
572-
remove.add(removeIt);
573-
});
561+
if (removeAlreadyLinked) {
562+
List<Object> alreadyLinkeddv_ids;
563+
564+
if ((dvo instanceof Dataset)) {
565+
linkedDataset = (Dataset) dvo;
566+
alreadyLinkeddv_ids = em.createNativeQuery("SELECT linkingdataverse_id FROM datasetlinkingdataverse WHERE dataset_id = " + linkedDataset.getId()).getResultList();
567+
} else {
568+
linkedDataverse = (Dataverse) dvo;
569+
alreadyLinkeddv_ids = em.createNativeQuery("SELECT linkingdataverse_id FROM dataverselinkingdataverse WHERE dataverse_id = " + linkedDataverse.getId()).getResultList();
570+
}
571+
572+
if (alreadyLinkeddv_ids != null && !alreadyLinkeddv_ids.isEmpty()) {
573+
alreadyLinkeddv_ids.stream().map((testDVId) -> this.find(testDVId)).forEachOrdered((removeIt) -> {
574+
remove.add(removeIt);
575+
});
576+
}
574577
}
575-
576578

577579
if (dvo instanceof Dataverse dataverse) {
578580
remove.add(dataverse);
@@ -596,8 +598,11 @@ public List<Dataverse> removeUnlinkableDataverses(List<Dataverse> allWithPerms,
596598

597599
return dataverseList;
598600
}
599-
600-
601+
602+
public List<Dataverse> removeUnlinkableDataverses(List<Dataverse> allWithPerms, DvObject dvo) {
603+
return removeUnlinkableDataverses(allWithPerms, dvo, true);
604+
}
605+
601606
public List<Dataverse> filterDataversesForUnLinking(String query, DataverseRequest req, Dataset dataset) {
602607
List<Object> alreadyLinkeddv_ids = em.createNativeQuery("SELECT linkingdataverse_id FROM datasetlinkingdataverse WHERE dataset_id = " + dataset.getId()).getResultList();
603608
List<Dataverse> dataverseList = new ArrayList<>();

src/main/webapp/dataverse.xhtml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,8 @@
501501
<!-- Edit/Publish Button Group -->
502502
<div class="btn-group" jsf:rendered="#{dataverseSession.user.authenticated and
503503
(permissionsWrapper.canIssueUpdateDataverseCommand(DataversePage.dataverse)
504-
or permissionsWrapper.canIssuePublishDataverseCommand(DataversePage.dataverse))}">
504+
or permissionsWrapper.canIssuePublishDataverseCommand(DataversePage.dataverse)
505+
or DataversePage.showLinkingPopup())}">
505506
<!-- Publish Button -->
506507
<ui:fragment rendered="#{permissionsWrapper.canIssuePublishDataverseCommand(DataversePage.dataverse)}">
507508
<button type="button" class="btn btn-default btn-access" onclick="PF('confirmation').show()"

0 commit comments

Comments
 (0)