Skip to content

Commit

Permalink
Merge branch 'develop' into 9507-show-linked-collections
Browse files Browse the repository at this point in the history
  • Loading branch information
sekmiller committed Oct 3, 2023
2 parents 982582b + 7b0bdc8 commit f2aa3c4
Show file tree
Hide file tree
Showing 12 changed files with 200 additions and 16 deletions.
1 change: 1 addition & 0 deletions doc/release-notes/9589-ds-configure-tool.md
@@ -0,0 +1 @@
Configure tools are now available at the dataset level. They appear under the "Edit Dataset" menu. See also #9589.
2 changes: 1 addition & 1 deletion doc/sphinx-guides/source/admin/external-tools.rst
Expand Up @@ -115,7 +115,7 @@ Dataset level explore tools allow the user to explore all the files in a dataset
Dataset Level Configure Tools
+++++++++++++++++++++++++++++

Configure tools at the dataset level are not currently supported.
Dataset level configure tools can be launched by users who have edit access to the dataset. These tools are found under the "Edit Dataset" menu.

Writing Your Own External Tool
------------------------------
Expand Down
6 changes: 3 additions & 3 deletions doc/sphinx-guides/source/api/external-tools.rst
Expand Up @@ -40,7 +40,7 @@ How External Tools Are Presented to Users
An external tool can appear in your Dataverse installation in a variety of ways:

- as an explore, preview, query or configure option for a file
- as an explore option for a dataset
- as an explore or configure option for a dataset
- as an embedded preview on the file landing page

See also the :ref:`testing-external-tools` section of the Admin Guide for some perspective on how Dataverse installations will expect to test your tool before announcing it to their users.
Expand Down Expand Up @@ -88,11 +88,11 @@ Terminology

displayName The **name** of the tool in the Dataverse installation web interface. For example, "Data Explorer".

description The **description** of the tool, which appears in a popup (for configure tools only) so the user who clicked the tool can learn about the tool before being redirected the tool in a new tab in their browser. HTML is supported.
description The **description** of the tool, which appears in a popup (for configure tools only) so the user who clicked the tool can learn about the tool before being redirected to the tool in a new tab in their browser. HTML is supported.

scope Whether the external tool appears and operates at the **file** level or the **dataset** level. Note that a file level tool much also specify the type of file it operates on (see "contentType" below).

types Whether the external tool is an **explore** tool, a **preview** tool, a **query** tool, a **configure** tool or any combination of these (multiple types are supported for a single tool). Configure tools require an API token because they make changes to data files (files within datasets). Configure tools are currently not supported at the dataset level. The older "type" keyword that allows you to pass a single type as a string is deprecated but still supported.
types Whether the external tool is an **explore** tool, a **preview** tool, a **query** tool, a **configure** tool or any combination of these (multiple types are supported for a single tool). Configure tools require an API token because they make changes to data files (files within datasets). The older "type" keyword that allows you to pass a single type as a string is deprecated but still supported.

toolUrl The **base URL** of the tool before query parameters are added.

Expand Down
26 changes: 26 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/DatasetPage.java
Expand Up @@ -405,6 +405,9 @@ public String getTermsGuestbookPopupAction(){
Map<Long, List<ExternalTool>> fileQueryToolsByFileId = new HashMap<>();
List<ExternalTool> fileQueryTools = new ArrayList<>();
private List<ExternalTool> datasetExploreTools;
private List<ExternalTool> datasetConfigureTools;
// The selected dataset-level configure tool
private ExternalTool datasetConfigureTool;

public Boolean isHasRsyncScript() {
return hasRsyncScript;
Expand Down Expand Up @@ -2167,6 +2170,7 @@ private String init(boolean initFull) {
previewTools = externalToolService.findFileToolsByType(ExternalTool.Type.PREVIEW);
fileQueryTools = externalToolService.findFileToolsByType(ExternalTool.Type.QUERY);
datasetExploreTools = externalToolService.findDatasetToolsByType(ExternalTool.Type.EXPLORE);
datasetConfigureTools = externalToolService.findDatasetToolsByType(ExternalTool.Type.CONFIGURE);
rowsPerPage = 10;
if (dataset.getId() != null && canUpdateDataset()) {
hasRestrictedFiles = workingVersion.isHasRestrictedFile();
Expand Down Expand Up @@ -5685,6 +5689,18 @@ public List<ExternalTool> getDatasetExploreTools() {
return datasetExploreTools;
}

public List<ExternalTool> getDatasetConfigureTools() {
return datasetConfigureTools;
}

public ExternalTool getDatasetConfigureTool() {
return datasetConfigureTool;
}

public void setDatasetConfigureTool(ExternalTool datasetConfigureTool) {
this.datasetConfigureTool = datasetConfigureTool;
}

Boolean thisLatestReleasedVersion = null;

public boolean isThisLatestReleasedVersion() {
Expand Down Expand Up @@ -5902,6 +5918,16 @@ public void explore(ExternalTool externalTool) {
PrimeFaces.current().executeScript(externalToolHandler.getExploreScript());
}

public void configure(ExternalTool externalTool) {
ApiToken apiToken = null;
User user = session.getUser();
if (user instanceof AuthenticatedUser) {
apiToken = authService.findApiTokenByUser((AuthenticatedUser) user);
}
ExternalToolHandler externalToolHandler = new ExternalToolHandler(externalTool, dataset, apiToken, session.getLocaleCode());
PrimeFaces.current().executeScript(externalToolHandler.getConfigureScript());
}

private FileMetadata fileMetadataForAction;

public FileMetadata getFileMetadataForAction() {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/edu/harvard/iq/dataverse/TemplatePage.java
Expand Up @@ -148,6 +148,7 @@ public String init() {
editMode = TemplatePage.EditMode.CREATE;
template = new Template(this.dataverse, settingsWrapper.getSystemMetadataBlocks());
TermsOfUseAndAccess terms = new TermsOfUseAndAccess();
terms.setFileAccessRequest(true);
terms.setTemplate(template);
terms.setLicense(licenseServiceBean.getDefault());
template.setTermsOfUseAndAccess(terms);
Expand Down
Expand Up @@ -253,4 +253,11 @@ public String getExploreScript() {
logger.fine("Exploring with " + toolUrl);
return getScriptForUrl(toolUrl);
}

// TODO: Consider merging with getExploreScript
public String getConfigureScript() {
String toolUrl = this.getToolUrlWithQueryParams();
logger.fine("Configuring with " + toolUrl);
return getScriptForUrl(toolUrl);
}
}
1 change: 1 addition & 0 deletions src/main/java/propertyFiles/Bundle.properties
Expand Up @@ -1385,6 +1385,7 @@ dataset.pageTitle=Add New Dataset
dataset.accessBtn=Access Dataset
dataset.accessBtn.header.download=Download Options
dataset.accessBtn.header.explore=Explore Options
dataset.accessBtn.header.configure=Configure Options
dataset.accessBtn.header.compute=Compute Options
dataset.accessBtn.download.size=ZIP ({0})
dataset.accessBtn.too.big=The dataset is too large to download. Please select the files you need from the files table.
Expand Down
25 changes: 14 additions & 11 deletions src/main/webapp/dataset-license-terms.xhtml
Expand Up @@ -7,6 +7,13 @@
xmlns:o="http://omnifaces.org/ui"
xmlns:jsf="http://xmlns.jcp.org/jsf">
<!-- TERMS -->
<ui:param name="toaNotEmpty" value="#{!empty termsOfUseAndAccess.termsOfAccess
or !empty termsOfUseAndAccess.dataAccessPlace
or !empty termsOfUseAndAccess.originalArchive or !empty termsOfUseAndAccess.availabilityStatus
or !empty termsOfUseAndAccess.contactForAccess or !empty termsOfUseAndAccess.sizeOfCollection
or !empty termsOfUseAndAccess.studyCompletion
or termsOfUseAndAccess.fileAccessRequest}"/>

<div class="text-right margin-bottom"
jsf:rendered="#{dataverseSession.user.authenticated and empty editMode and !widgetWrapper.widgetView
and permissionsWrapper.canIssueUpdateDatasetCommand(DatasetPage.dataset)}">
Expand Down Expand Up @@ -238,17 +245,13 @@
</p:fragment>
</div>
</div>
<div class="panel panel-default" jsf:rendered="#{!empty editMode or DatasetPage.restrictedFileCount > 0
or !empty termsOfUseAndAccess.termsOfAccess
or !empty termsOfUseAndAccess.dataAccessPlace
or !empty termsOfUseAndAccess.originalArchive or !empty termsOfUseAndAccess.availabilityStatus
or !empty termsOfUseAndAccess.contactForAccess or !empty termsOfUseAndAccess.sizeOfCollection
or !empty termsOfUseAndAccess.studyCompletion}">
<div class="panel panel-default" jsf:rendered="#{managePage==true or !empty editMode or (datasetPage == true and DatasetPage.restrictedFileCount > 0)
or toaNotEmpty}">
<div data-toggle="collapse" data-target="#panelCollapseTOA" class="panel-heading text-info">
<h:outputText value="#{publicStore ? bundle['file.dataFilesTab.terms.list.termsOfAccess.termsOfsAccess'] : bundle['file.dataFilesTab.terms.list.termsOfAccess.header']}"/>
&#160;<span class="glyphicon glyphicon-chevron-up"/>
</div>
<div id="panelCollapseTOA" class="#{!datasetPage or DatasetPage.hasValidTermsOfAccess ? 'collapse in' : 'collapse'}">
<div id="panelCollapseTOA" class="panel-collapse #{!empty editMode or (datasetPage == false and toaNotEmpty ) or (datasetPage == true and DatasetPage.hasValidTermsOfAccess) ? 'collapse in' : 'collapse'}">
<div class="panel-body">
<ui:fragment rendered="#{empty editMode}">
<div class="form-group" jsf:rendered="#{!publicStore and datasetPage== true and DatasetPage.hasRestrictedFiles}">
Expand All @@ -267,7 +270,7 @@
</div>
</ui:fragment>
</div>
<div class="form-group" jsf:rendered="#{!empty termsOfUseAndAccess.termsOfAccess and DatasetPage.restrictedFileCount > 0}">
<div class="form-group" jsf:rendered="#{!empty termsOfUseAndAccess.termsOfAccess and (DatasetPage.restrictedFileCount > 0 or managePage==true)}">
<label for="datasetForm:tabView:metadata_TermsAccessText" class="col-sm-3 control-label">
#{bundle['file.dataFilesTab.terms.list.termsOfAccess.termsOfsAccess']}
<span class="glyphicon glyphicon-question-sign tooltip-icon"
Expand All @@ -277,18 +280,18 @@
<p><h:outputText id="metadata_TermsAccessText" value="#{MarkupChecker:sanitizeBasicHTML(termsOfUseAndAccess.termsOfAccess)}" escape="false"/></p>
</div>
</div>
<div class="form-group" jsf:rendered="#{!publicStore and ( datasetPage == true and DatasetPage.hasRestrictedFiles)}">
<div class="form-group" jsf:rendered="#{!publicStore and ((datasetPage == true and DatasetPage.hasRestrictedFiles) or managePage==true)}">
<label for="datasetForm:tabView:metadata_RequestAccessSelected" class="col-sm-3 control-label">
#{bundle['file.dataFilesTab.terms.list.termsOfAccess.requestAccess']}
<span class="glyphicon glyphicon-question-sign tooltip-icon"
data-toggle="tooltip" data-placement="auto right" data-original-title="#{bundle['file.dataFilesTab.terms.list.termsOfAccess.requestAccess.title']}"></span>
</label>
<div id="metadata_RequestAccessSelected" class="col-sm-9">
<p jsf:rendered="#{!DatasetPage.workingVersion.draft}">
<p jsf:rendered="#{datasetPage == true and !DatasetPage.workingVersion.draft}">
<h:outputText value="#{bundle['file.dataFilesTab.terms.list.termsOfAccess.requestAccess.request']}" rendered="#{DatasetPage.dataset.fileAccessRequest}"/>
<h:outputText value="#{bundle['file.dataFilesTab.terms.list.termsOfAccess.requestAccess.notRequest']}" rendered="#{!DatasetPage.dataset.fileAccessRequest}"/>
</p>
<p jsf:rendered="#{DatasetPage.workingVersion.draft}">
<p jsf:rendered="#{(datasetPage == true and DatasetPage.workingVersion.draft) or managePage==true}">
<h:outputText value="#{bundle['file.dataFilesTab.terms.list.termsOfAccess.requestAccess.request']}" rendered="#{termsOfUseAndAccess.fileAccessRequest}"/>
<h:outputText value="#{bundle['file.dataFilesTab.terms.list.termsOfAccess.requestAccess.notRequest']}" rendered="#{!termsOfUseAndAccess.fileAccessRequest}"/>
</p>
Expand Down
24 changes: 24 additions & 0 deletions src/main/webapp/dataset.xhtml
Expand Up @@ -455,6 +455,17 @@
<h:outputText value="#{bundle['dataset.editBtn.itemLabel.thumbnailsAndWidgets']}"/>
</h:outputLink>
</li>
<ui:fragment rendered="#{DatasetPage.datasetConfigureTools.size() >= 1}">
<li class="dropdown-header">#{bundle['dataset.accessBtn.header.configure']} <span class="glyphicon glyphicon-cog"/></li>
<!-- Configure tool links -->
<ui:repeat var="tool" value="#{DatasetPage.datasetConfigureTools}">
<li>
<p:commandLink styleClass="btn-explore" actionListener="#{DatasetPage.setDatasetConfigureTool(tool)}" process="@this" update="datasetForm:configureToolDialog" oncomplete="PF('configureToolDialog').show();">
<h:outputText value="#{tool.getDisplayNameLang()}"/>
</p:commandLink>
</li>
</ui:repeat>
</ui:fragment>
<ui:fragment rendered="#{!DatasetPage.dataset.released and DatasetPage.dataset.latestVersion.versionState=='DRAFT' and permissionsWrapper.canIssueDeleteDatasetCommand(DatasetPage.dataset)}">
<li role="separator" class="divider"></li>
<li>
Expand Down Expand Up @@ -992,6 +1003,19 @@
</button>
</div>
</p:dialog>
<p:dialog id="configureToolDialog" styleClass="smallPopUp" header="#{DatasetPage.datasetConfigureTool.displayNameLang}" widgetVar="configureToolDialog" modal="true">
<p class="help-block">
<h:outputFormat value="#{DatasetPage.datasetConfigureTool.description}" escape="false"/>
</p>
<div class="button-block">
<p:commandLink styleClass="btn btn-default" action="#{DatasetPage.configure(DatasetPage.datasetConfigureTool)}" oncomplete="PF('configureToolDialog').hide();">
<h:outputFormat value="#{bundle['continue']}"/>
</p:commandLink>
<button class="btn btn-link" onclick="PF('configureToolDialog').hide();" type="button">
#{bundle.cancel}
</button>
</div>
</p:dialog>
<p:dialog id="citationsDialog" styleClass="smallPopUp" header="#{bundle['metrics.citations.dialog.header']}" widgetVar="citationsDialog" modal="true">
<p class="help-block">
<h:outputFormat value="#{bundle['metrics.citations.dialog.help']}" escape="false">
Expand Down
2 changes: 1 addition & 1 deletion src/main/webapp/manage-templates.xhtml
Expand Up @@ -139,7 +139,7 @@
</p:dataTable>
</div>
<p:dialog id="deleteTemplateConfirm" header="#{bundle['dataset.manageTemplates.tab.action.btn.delete.dialog.header']}"
widgetVar="deleteConfirmation" modal="true" focus="contDeleteTemplateBtn">
styleClass="largePopUp" widgetVar="deleteConfirmation" modal="true" focus="contDeleteTemplateBtn">
<p class="help-block">
<span class="text-warning"><span class="glyphicon glyphicon-warning-sign"/> &#160;<h:outputText value="#{bundle['dataset.manageTemplates.tab.action.btn.delete.dialog.tip']}" /></span>
</p>
Expand Down

0 comments on commit f2aa3c4

Please sign in to comment.