diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b88fa1d8de..e34dc92f512 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ * [Developer]: Update to Spring Boot 2.7.3 and update various other dependencies. See [PR 1369](https://github.com/phac-nml/irida/pull/1369) * [Developer]: Fixed issue with disabled user accounts requesting a password reset. See [PR 1373](https://github.com/phac-nml/irida/pull/1373) * [Developer/UI]: Updated sample details view to use Ant Design and moved into a modal which can be launched from anywhere the sample name is listed. See [PR 1370](https://github.com/phac-nml/irida/pull/1370) +* [UI]: Updated analysis results manage results page to not allow a project collaborator to view the save results back to a sample section. See [PR 1377](https://github.com/phac-nml/irida/pull/1377) ## [22.05.5] - 2022/06/28 * [UI]: Fixed bug preventing export of project samples table due to invalid url. [PR 1331](https://github.com/phac-nml/irida/pull/1331) diff --git a/src/main/java/ca/corefacility/bioinformatics/irida/ria/web/analysis/AnalysisAjaxController.java b/src/main/java/ca/corefacility/bioinformatics/irida/ria/web/analysis/AnalysisAjaxController.java index 2ac8bc7cc80..2cd0d9b6634 100644 --- a/src/main/java/ca/corefacility/bioinformatics/irida/ria/web/analysis/AnalysisAjaxController.java +++ b/src/main/java/ca/corefacility/bioinformatics/irida/ria/web/analysis/AnalysisAjaxController.java @@ -51,6 +51,7 @@ import ca.corefacility.bioinformatics.irida.ria.web.dto.ResponseDetails; import ca.corefacility.bioinformatics.irida.ria.web.utilities.DateUtilities; import ca.corefacility.bioinformatics.irida.security.permissions.analysis.UpdateAnalysisSubmissionPermission; +import ca.corefacility.bioinformatics.irida.security.permissions.sample.UpdateSamplePermission; import ca.corefacility.bioinformatics.irida.service.*; import ca.corefacility.bioinformatics.irida.service.sample.MetadataTemplateService; import ca.corefacility.bioinformatics.irida.service.sample.SampleService; @@ -93,6 +94,8 @@ public class AnalysisAjaxController { private AnalysisTypesService analysisTypesService; private EmailController emailController; + private UpdateSamplePermission updateSamplePermission; + @Autowired public AnalysisAjaxController(AnalysisSubmissionService analysisSubmissionService, IridaWorkflowsService iridaWorkflowsService, UserService userService, SampleService sampleService, @@ -100,7 +103,7 @@ public AnalysisAjaxController(AnalysisSubmissionService analysisSubmissionServic MetadataTemplateService metadataTemplateService, SequencingObjectService sequencingObjectService, AnalysisSubmissionSampleProcessor analysisSubmissionSampleProcessor, MessageSource messageSource, ExecutionManagerConfig configFile, AnalysisAudit analysisAudit, AnalysisTypesService analysisTypesService, - EmailController emailController) { + EmailController emailController, UpdateSamplePermission updateSamplePermission) { this.analysisSubmissionService = analysisSubmissionService; this.workflowsService = iridaWorkflowsService; @@ -116,6 +119,7 @@ public AnalysisAjaxController(AnalysisSubmissionService analysisSubmissionServic this.analysisAudit = analysisAudit; this.analysisTypesService = analysisTypesService; this.emailController = emailController; + this.updateSamplePermission = updateSamplePermission; } /** @@ -212,11 +216,15 @@ public AnalysisDetails ajaxGetDataForDetailsTab(@PathVariable Long submissionId, response.setStatus(HttpServletResponse.SC_OK); + Collection samples = sampleService.getSamplesForAnalysisSubmission(submission); + + boolean canModifySample = updateSamplePermission.isAllowed(authentication, samples); + // details is a DTO (Data Transfer Object) return new AnalysisDetails(analysisDescription, workflowName, version, priority, duration, submission.getCreatedDate(), priorities, emailPipelineResultCompleted, emailPipelineResultError, canShareToSamples, updateAnalysisPermission.isAllowed(authentication, submission), - submission.getUpdateSamples()); + submission.getUpdateSamples(), canModifySample); } /** diff --git a/src/main/java/ca/corefacility/bioinformatics/irida/ria/web/analysis/dto/AnalysisDetails.java b/src/main/java/ca/corefacility/bioinformatics/irida/ria/web/analysis/dto/AnalysisDetails.java index 5f56b63197f..d627e1a2c68 100644 --- a/src/main/java/ca/corefacility/bioinformatics/irida/ria/web/analysis/dto/AnalysisDetails.java +++ b/src/main/java/ca/corefacility/bioinformatics/irida/ria/web/analysis/dto/AnalysisDetails.java @@ -22,12 +22,14 @@ public class AnalysisDetails { private boolean updatePermission; private boolean updateSamples; + private boolean allowedToModifySample; + public AnalysisDetails() { } public AnalysisDetails(String analysisDescription, String workflowName, String version, String priority, Long duration, Date createdDate, AnalysisSubmission.Priority[] priorities, boolean emailPipelineResultCompleted, boolean emailPipelineResultError, - boolean canShareToSamples, boolean updatePermission, boolean updateSamples) { + boolean canShareToSamples, boolean updatePermission, boolean updateSamples, boolean allowedToModifySample) { this.analysisDescription=analysisDescription; this.workflowName = workflowName; this.version = version; @@ -40,6 +42,7 @@ public AnalysisDetails(String analysisDescription, String workflowName, String v this.canShareToSamples = canShareToSamples; this.updatePermission = updatePermission; this.updateSamples = updateSamples; + this.allowedToModifySample = allowedToModifySample; } public String getAnalysisDescription() { @@ -137,4 +140,12 @@ public boolean isUpdateSamples() { public void setUpdateSamples(boolean updateSamples) { this.updateSamples = updateSamples; } + + public boolean isAllowedToModifySample() { + return allowedToModifySample; + } + + public void setAllowedToModifySample(boolean allowedToModifySample) { + this.allowedToModifySample = allowedToModifySample; + } } diff --git a/src/main/webapp/resources/js/contexts/AnalysisDetailsContext.js b/src/main/webapp/resources/js/contexts/AnalysisDetailsContext.js index 3a10ea468c2..dd850f678e5 100644 --- a/src/main/webapp/resources/js/contexts/AnalysisDetailsContext.js +++ b/src/main/webapp/resources/js/contexts/AnalysisDetailsContext.js @@ -67,9 +67,10 @@ const initialContext = { createdDate: null, priority: null, priorities: [], - canShareToSamples: false, - updatePermission: false, - updateSamples: false, + canShareToSamples: false, // submission has ability to save results back to samples + updatePermission: false, // user can update the submission details/parameters + updateSamples: false, // Update samples from results on completion + allowedToModifySample: false, // User can modify sample }; const AnalysisDetailsContext = React.createContext(initialContext); diff --git a/src/main/webapp/resources/js/pages/analysis/components/settings/AnalysisShare.jsx b/src/main/webapp/resources/js/pages/analysis/components/settings/AnalysisShare.jsx index 0d7d3113fa9..424f0f5d5f6 100644 --- a/src/main/webapp/resources/js/pages/analysis/components/settings/AnalysisShare.jsx +++ b/src/main/webapp/resources/js/pages/analysis/components/settings/AnalysisShare.jsx @@ -158,8 +158,12 @@ export default function AnalysisShare() { ) : null} {analysisDetailsContext.canShareToSamples && + analysisDetailsContext.allowedToModifySample && analysisContext.isCompleted ? ( -
+
{i18n("AnalysisShare.saveResults")} {renderSaveToRelatedSamples()}
diff --git a/src/test/java/ca/corefacility/bioinformatics/irida/ria/integration/analysis/AnalysisDetailsPageIT.java b/src/test/java/ca/corefacility/bioinformatics/irida/ria/integration/analysis/AnalysisDetailsPageIT.java index e62cf56cf20..8e42dd87509 100644 --- a/src/test/java/ca/corefacility/bioinformatics/irida/ria/integration/analysis/AnalysisDetailsPageIT.java +++ b/src/test/java/ca/corefacility/bioinformatics/irida/ria/integration/analysis/AnalysisDetailsPageIT.java @@ -254,6 +254,22 @@ public void testSharedProjects() { assertTrue(page.hasSharedWithProjects(), "Analysis shared with projects"); } + @Test + public void testSaveResultBackToSamplesProjectManager() { + LoginPage.loginAsManager(driver()); + AnalysisDetailsPage page = AnalysisDetailsPage.initPage(driver(), 11L, "settings/share"); + assertTrue(page.compareTabTitle("Manage Results"), "Page title should equal"); + assertTrue(page.saveToSamplesVisible(), "Save results back to sample should be visible to a project manager"); + } + + @Test + public void testSaveResultBackToSamplesProjectUser() { + LoginPage.loginAsUser(driver()); + AnalysisDetailsPage page = AnalysisDetailsPage.initPage(driver(), 11L, "settings/share"); + assertTrue(page.compareTabTitle("Manage Results"), "Page title should equal"); + assertFalse(page.saveToSamplesVisible(), "Save results back to sample should not be visible to a project user"); + } + @Test public void testSistrOutput() throws IOException { fileUtilities.copyFileToDirectory(outputFileBaseDirectory, diff --git a/src/test/java/ca/corefacility/bioinformatics/irida/ria/integration/pages/analysis/AnalysisDetailsPage.java b/src/test/java/ca/corefacility/bioinformatics/irida/ria/integration/pages/analysis/AnalysisDetailsPage.java index da9317b7f34..8d6b979cda7 100644 --- a/src/test/java/ca/corefacility/bioinformatics/irida/ria/integration/pages/analysis/AnalysisDetailsPage.java +++ b/src/test/java/ca/corefacility/bioinformatics/irida/ria/integration/pages/analysis/AnalysisDetailsPage.java @@ -108,6 +108,7 @@ public class AnalysisDetailsPage extends AbstractPage { @FindBy(className = "ant-menu-title-content") private List menuItems; + public AnalysisDetailsPage(WebDriver driver) { super(driver); } @@ -527,4 +528,12 @@ public boolean galaxyHistoryIdVisible() { } return false; } + + public boolean saveToSamplesVisible() { + try { + return driver.findElement(By.className("t-save-results-to-samples")).isDisplayed(); + } catch (Exception e) { + return false; + } + } } diff --git a/src/test/java/ca/corefacility/bioinformatics/irida/ria/unit/web/analysis/AnalysisAjaxControllerTest.java b/src/test/java/ca/corefacility/bioinformatics/irida/ria/unit/web/analysis/AnalysisAjaxControllerTest.java index 2f7dca5739b..3f32afe0a29 100644 --- a/src/test/java/ca/corefacility/bioinformatics/irida/ria/unit/web/analysis/AnalysisAjaxControllerTest.java +++ b/src/test/java/ca/corefacility/bioinformatics/irida/ria/unit/web/analysis/AnalysisAjaxControllerTest.java @@ -30,6 +30,7 @@ import ca.corefacility.bioinformatics.irida.ria.web.analysis.dto.*; import ca.corefacility.bioinformatics.irida.ria.web.analysis.auditing.AnalysisAudit; import ca.corefacility.bioinformatics.irida.security.permissions.analysis.UpdateAnalysisSubmissionPermission; +import ca.corefacility.bioinformatics.irida.security.permissions.sample.UpdateSamplePermission; import ca.corefacility.bioinformatics.irida.service.*; import ca.corefacility.bioinformatics.irida.service.sample.MetadataTemplateService; import ca.corefacility.bioinformatics.irida.service.sample.SampleService; @@ -66,6 +67,8 @@ public class AnalysisAjaxControllerTest { private AnalysisTypesService analysisTypesServiceMock; private EmailController emailControllerMock; + private UpdateSamplePermission updateSamplePermission; + /** * Analysis Output File key names from * {@link TestDataFactory#constructAnalysis()} @@ -89,11 +92,12 @@ public void init() { httpServletResponseMock = mock(HttpServletResponse.class); analysisTypesServiceMock = mock(AnalysisTypesService.class); emailControllerMock = mock(EmailController.class); + updateSamplePermission = mock(UpdateSamplePermission.class); analysisAjaxController = new AnalysisAjaxController(analysisSubmissionServiceMock, iridaWorkflowsServiceMock, userServiceMock, sampleService, projectServiceMock, updatePermission, metadataTemplateService, sequencingObjectService, analysisSubmissionSampleProcessor, messageSourceMock, configFileMock, - analysisAuditMock, analysisTypesServiceMock, emailControllerMock); + analysisAuditMock, analysisTypesServiceMock, emailControllerMock, updateSamplePermission); } diff --git a/src/test/resources/ca/corefacility/bioinformatics/irida/ria/web/analysis/AnalysisAdminView.xml b/src/test/resources/ca/corefacility/bioinformatics/irida/ria/web/analysis/AnalysisAdminView.xml index 6af42001f2e..77ac14a5f8c 100644 --- a/src/test/resources/ca/corefacility/bioinformatics/irida/ria/web/analysis/AnalysisAdminView.xml +++ b/src/test/resources/ca/corefacility/bioinformatics/irida/ria/web/analysis/AnalysisAdminView.xml @@ -54,6 +54,11 @@ credentialsNonExpired="true" locale="en" /> + + + +