From 882f160bfd4af8f333dc748f08c20ace34478f42 Mon Sep 17 00:00:00 2001 From: felmer <franz-josef.elmer@id.ethz.ch> Date: Thu, 29 Jun 2023 07:45:06 +0200 Subject: [PATCH] SSDM-13643: Overview with experients and samples to shown on overview. Table with all experiments with bulk deletion and moving --- .../views/DataGrid/ExperimentDataGridUtil.js | 5 +- .../ExperimentTableController.js | 7 +- .../ExperimentTable/ExperimentTableView.js | 29 --- .../js/views/ProjectForm/ProjectFormView.js | 181 +++++++++++++++--- 4 files changed, 157 insertions(+), 65 deletions(-) diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataGrid/ExperimentDataGridUtil.js b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataGrid/ExperimentDataGridUtil.js index 1fd3d1fb628..4fdf4c34570 100644 --- a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataGrid/ExperimentDataGridUtil.js +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataGrid/ExperimentDataGridUtil.js @@ -1,5 +1,5 @@ var ExperimentDataGridUtil = new function() { - this.getExperimentDataGrid = function(entities, rowClick, heightPercentage) { + this.getExperimentDataGrid = function(entities, rowClick, multiselectable, heightPercentage) { //Fill Columns model var columns = []; @@ -129,6 +129,7 @@ var ExperimentDataGridUtil = new function() { perm_id: entity.permId, type_perm_id: entity.experimentTypeCode }, + '$object' : entity, 'code' : entity.code, 'identifier' : entity.identifier, 'permId' : entity.permId, @@ -174,7 +175,7 @@ var ExperimentDataGridUtil = new function() { //Create and return a data grid controller var configKey = "EXPERIMENT_TABLE"; - var dataGridController = new DataGridController(null, columns, [], dynamicColumnsFunc, getDataList, rowClick, false, configKey, null, { + var dataGridController = new DataGridController(null, columns, [], dynamicColumnsFunc, getDataList, rowClick, false, configKey, multiselectable, { fileFormat: DataGridExportOptions.FILE_FORMAT.XLS, filePrefix: 'collections', fileContent: DataGridExportOptions.FILE_CONTENT.ENTITIES diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableController.js b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableController.js index 7fd40d15119..a195ec06e61 100644 --- a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableController.js +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableController.js @@ -14,7 +14,7 @@ * limitations under the License. */ -function ExperimentTableController(parentController, title, project, showInProjectOverview) { +function ExperimentTableController(parentController, title, project, showInProjectOverview, extraOptions) { this._parentController = parentController; this._experimentTableModel = new ExperimentTableModel(title, project, showInProjectOverview); this._experimentTableView = new ExperimentTableView(this, this._experimentTableModel); @@ -66,8 +66,9 @@ function ExperimentTableController(parentController, title, project, showInProje var rowClick = null; //Create and display table - this._dataGridController = ExperimentDataGridUtil.getExperimentDataGrid(experiments, rowClick, 50); - this._dataGridController.init(this._experimentTableView.getTableContainer()); + var multiselectable = extraOptions != null; + this._dataGridController = ExperimentDataGridUtil.getExperimentDataGrid(experiments, rowClick, multiselectable, 50); + this._dataGridController.init(this._experimentTableView.getTableContainer(), extraOptions); } this.refresh = function() diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableView.js b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableView.js index 48099ce6710..9c4688e8691 100644 --- a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableView.js +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableView.js @@ -30,10 +30,6 @@ function ExperimentTableView(experimentTableController, experimentTableModel) { $container.append($title); } - var toolbarModel = []; - toolbarModel.push({ component : this._showExperimentFromOverviewDropdown(), tooltip: null }); - - $container.append(FormUtil.getToolbar(toolbarModel)); $container.append(this._tableContainer); } @@ -47,29 +43,4 @@ function ExperimentTableView(experimentTableController, experimentTableModel) { this.getTypeSelector = function() { return this.typeSelector; } - - this._showExperimentFromOverviewDropdown = function() { - var _this = this; - var expDropModel = []; - var kindName = ELNDictionary.getExperimentsDualName(); - expDropModel = [{value : "OVERVIEW", label : "Show only overview " + kindName, selected : this._experimentTableModel.showInProjectOverview }, - {value : "ALL", label : "Show all " + kindName, selected : !this._experimentTableModel.showInProjectOverview }]; - - - var $experimentDropdown = FormUtil.getDropdown(expDropModel, "Select what " + kindName + " to show"); - $experimentDropdown.attr("id", "what-experiments-drop-down"); - - $experimentDropdown.change(function() { - switch($(this).val()){ - case "OVERVIEW": - _this._experimentTableModel.showInProjectOverview = true; - break; - case "ALL": - _this._experimentTableModel.showInProjectOverview = false; - break; - } - _this._experimentTableController.init(_this._$container); - }); - return $("<span>").append($experimentDropdown); - } } \ No newline at end of file diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ProjectForm/ProjectFormView.js b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ProjectForm/ProjectFormView.js index 75e43e24487..16f3a918017 100644 --- a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ProjectForm/ProjectFormView.js +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ProjectForm/ProjectFormView.js @@ -177,8 +177,8 @@ function ProjectFormView(projectFormController, projectFormModel) { } if (this._projectFormModel.mode !== FormMode.CREATE && !isInventoryProject) { + $formColumn.append(this._createOverviewSection(projectIdentifier, hideShowOptionsModel)); $formColumn.append(this._createExperimentsSection(projectIdentifier, hideShowOptionsModel)); - $formColumn.append(this._createSamplesSection(hideShowOptionsModel)); } FormUtil.addOptionsToToolbar(toolbarModel, dropdownOptionsModel, hideShowOptionsModel, "PROJECT-VIEW"); @@ -284,7 +284,43 @@ function ProjectFormView(projectFormController, projectFormModel) { $description.hide(); return $description; } - + + this._createOverviewSection = function(projectIdentifier, hideShowOptionsModel) { + var $overview = $("<div>", { id : "project-overview" }); + $overview.append($("<legend>").append("Overview")); + var $overviewContainer = $("<div>"); + $overview.append($overviewContainer); + + $experimentsOverview = $("<div>"); + $overviewContainer.append($("<h4>").append(ELNDictionary.ExperimentsELN)); + $overviewContainer.append($experimentsOverview); + + $samplesOverview = $("<div>"); + $header = $("<h4>").append(ELNDictionary.Samples); + $overviewContainer.append($header); + $overviewContainer.append($samplesOverview); + + var experimentTableController = new ExperimentTableController(this._projectFormController, null, jQuery.extend(true, {}, this._projectFormModel.project), true); + experimentTableController.init($experimentsOverview); + var sampleTableController = new SampleTableController(this._projectFormController, null, null, this._projectFormModel.project.permId, true, null, 40); + var views = { + header : $header, + content : $samplesOverview + } + sampleTableController.init(views); + + $overview.hide(); + hideShowOptionsModel.push({ + label : "Overview", + section : "#project-overview", + beforeShowingAction : function() { + experimentTableController.refresh(); + sampleTableController.refresh(); + } + }); + return $overview; + } + this._createExperimentsSection = function(projectIdentifier, hideShowOptionsModel) { var entityKindName = ELNDictionary.getExperimentsDualName(); var $experiments = $("<div>", { id : "project-experiments" }); @@ -292,7 +328,24 @@ function ProjectFormView(projectFormController, projectFormModel) { $experiments.append($("<legend>").append(entityKindName)); $experiments.append($experimentsContainer); - var experimentTableController = new ExperimentTableController(this._projectFormController, null, jQuery.extend(true, {}, this._projectFormModel.project), true); + var _this = this; + var extraOptions = []; + extraOptions.push({ name : "Delete", action : function(selected) { + if(selected != undefined && selected.length == 0){ + Util.showUserError("Please select at least one " + ELNDictionary.experimentELN + " to delete!"); + } else { + _this._deleteExperiments(selected.map(e => e.permId)); + } + }}); + extraOptions.push({ name : "Move", action : function(selected) { + if(selected != undefined && selected.length == 0){ + Util.showUserError("Please select at least one " + ELNDictionary.experimentELN + " to move!"); + } else { + _this._moveExperiments(selected.map(s => s.permId)); + } + }}); + var experimentTableController = new ExperimentTableController(this._projectFormController, null, jQuery.extend(true, {}, this._projectFormModel.project), + false, extraOptions); experimentTableController.init($experimentsContainer); $experiments.hide(); hideShowOptionsModel.push({ @@ -304,34 +357,100 @@ function ProjectFormView(projectFormController, projectFormModel) { }); return $experiments; } - - this._createSamplesSection = function(hideShowOptionsModel) { - var entityKindName = "" + ELNDictionary.Samples + ""; - - var $samples = $("<div>", { id : "project-samples" }); - var $experimentsContainer = $("<div>"); - $samples.append($("<legend>").append(entityKindName)); - var $samplesContainerHeader = $("<div>"); - $samples.append($samplesContainerHeader); - var $samplesContainer = $("<div>"); - $samples.append($samplesContainer); - - var views = { - header : $samplesContainerHeader, - content : $samplesContainer - } - var sampleTableController = new SampleTableController(this._projectFormController, null, null, this._projectFormModel.project.permId, true, null, 40); - sampleTableController.init(views); - $samples.hide(); - hideShowOptionsModel.push({ - label : entityKindName, - section : "#project-samples", - beforeShowingAction : function() { - sampleTableController.refresh(); - } - }); - return $samples; - } + + this._deleteExperiments = function(permIds) { + var _this = this; + var $component = $("<div>"); + var warningText = "Also all " + ELNDictionary.samples + " and data sets of the selected " + + permIds.length + " " + ELNDictionary.getExperimentsDualName() + " will be deleted."; + var $warning = FormUtil.getFieldForLabelWithText(null, warningText); + $warning.css('color', FormUtil.warningColor); + $component.append($warning); + var modalView = new DeleteEntityController(function(reason) { + require(["as/dto/experiment/id/ExperimentPermId","as/dto/experiment/delete/ExperimentDeletionOptions"], + function(ExperimentPermId, ExperimentDeletionOptions) { + var experimentIds = permIds.map(permId => new ExperimentPermId(permId)); + var deletionOptions = new ExperimentDeletionOptions(); + deletionOptions.setReason(reason); + mainController.openbisV3.deleteExperiments(experimentIds, deletionOptions).done(function() { + Util.showSuccess("All " + permIds.length + " " + ELNDictionary.getExperimentsDualName() + + " are moved to trashcan", function() { + permIds.forEach(function(permId) { + mainController.sideMenu.deleteNodeByEntityPermId("EXPERIMENT", permId, false); + }); + mainController.refreshView(); + }); + }).fail(function(error) { + Util.showFailedServerCallError(error); + Util.unblockUI(); + }); + }) + }, true, null, $component); + modalView.init(); + } + + this._moveExperiments = function(permIds) { + var _this = this; + var $window = $('<form>', { 'action' : 'javascript:void(0);' }); + var project = null; + $window.submit(function() { + Util.unblockUI(); + require(["as/dto/experiment/id/ExperimentPermId", "as/dto/experiment/update/ExperimentUpdate"], + function(ExperimentPermId, ExperimentUpdate) { + var projectIdentifier = project.getIdentifier(); + var updates = []; + permIds.forEach(function(permId) { + var update = new ExperimentUpdate(); + update.setExperimentId(new ExperimentPermId(permId)); + update.setProjectId(projectIdentifier); + updates.push(update); + }); + mainController.openbisV3.updateExperiments(updates).done(function() { + Util.showSuccess("Moved successfully", function() { + var projectPermId = project.getPermId().getPermId(); + mainController.sideMenu.refreshNodeParentByPermId("PROJECT", projectPermId, true); + permIds.forEach(function(permId) { + mainController.sideMenu.deleteNodeByEntityPermId("EXPERIMENT", permId, false); + }); + mainController.refreshView(); + }); + }).fail(function(error) { + Util.showFailedServerCallError(error); + Util.unblockUI(); + }); + }); + }); + + $window.append($('<legend>').append("Moving " + permIds.length + " selected " + + ELNDictionary.getExperimentsDualName() + " to:")); + var $searchBox = $('<div>'); + $window.append($searchBox); + var searchDropdown = new AdvancedEntitySearchDropdown(false, true, "search project to move to", + false, false, false, true, false); + var $btnAccept = $('<input>', { 'type': 'submit', 'class' : 'btn btn-primary', 'value' : 'Accept' }); + var $btnCancel = $('<a>', { 'class' : 'btn btn-default' }).append('Cancel'); + $btnCancel.click(function() { + Util.unblockUI(); + }); + + $window.append('<br>').append($btnAccept).append(' ').append($btnCancel); + searchDropdown.onChange(function(selected) { + project = selected[0]; + }); + + searchDropdown.init($searchBox); + + var css = { + 'text-align' : 'left', + 'top' : '15%', + 'width' : '70%', + 'left' : '15%', + 'right' : '20%', + 'overflow' : 'hidden' + }; + Util.blockUI($window, css); + + } this._projectDeletionAction = function() { var _this = this; -- GitLab