diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/index.html b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/index.html index a7ea0d0164674e43ca9e7e6819b9a493a5324263..1383f4af1789d3c1c7269cdd0894f7e15ef0e75b 100644 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/index.html +++ b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/index.html @@ -192,6 +192,11 @@ <script type="text/javascript" src="./js/views/DrawingBoards/DrawingBoardsModel.js"></script> <script type="text/javascript" src="./js/views/DrawingBoards/DrawingBoardsView.js"></script> + <script type="text/javascript" src="./js/views/DataGrid/ExperimentDataGridUtil.js"></script> + <script type="text/javascript" src="./js/views/ExperimentTable/ExperimentTableController.js"></script> + <script type="text/javascript" src="./js/views/ExperimentTable/ExperimentTableModel.js"></script> + <script type="text/javascript" src="./js/views/ExperimentTable/ExperimentTableView.js"></script> + <script type="text/javascript"> // // Configurations Available (Available under the js/config folder) diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/Profile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/Profile.js index fcd2fcce9e7938b372ee9bd6ccf4650f6d55e91a..161cf3a6c75472e2ea84df6da2fae673d19612f7 100644 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/Profile.js +++ b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/Profile.js @@ -391,6 +391,46 @@ $.extend(DefaultProfile.prototype, { return null; } + this.getAllPropertiCodesForExperimentTypeCode = function(typeCode) { + var allPropertiCodes = new Array(); + var type = this.getExperimentTypeForExperimentTypeCode(typeCode); + for(var i = 0; i < type.propertyTypeGroups.length; i++) { + var propertyGroup = type.propertyTypeGroups[i].propertyTypes; + for(var j = 0; j < propertyGroup.length; j++) { + var propertyType = propertyGroup[j]; + allPropertiCodes.push(propertyType.code); + } + } + return allPropertiCodes; + } + + this.getPropertiesDisplayNamesForExperimentTypeCode = function(typeCode, propertiesTypeCode) { + var allPropertiDisplayNames = new Array(); + for(var i = 0; i < propertiesTypeCode.length; i++) { + var propertyTypeCode = propertiesTypeCode[i]; + var propertyTypeDisplayName = this.getPropertyDisplayNamesForExperimentTypeCode(typeCode, propertyTypeCode); + allPropertiDisplayNames.push(propertyTypeDisplayName); + } + return allPropertiDisplayNames; + } + + this.getPropertyDisplayNamesForExperimentTypeCode = function(typeCode, propertyTypeCode) { + var propertyDisplayName = ""; + var type = this.getExperimentTypeForExperimentTypeCode(typeCode); + + for(var i = 0; i < type.propertyTypeGroups.length; i++) { + var propertyGroup = type.propertyTypeGroups[i].propertyTypes; + for(var j = 0; j < propertyGroup.length; j++) { + var propertyType = propertyGroup[j]; + if(propertyType.code === propertyTypeCode) { + propertyDisplayName = propertyType.label; + } + } + } + + return propertyDisplayName; + } + this.getAllPropertiCodesForTypeCode = function(typeCode) { var allPropertiCodes = new Array(); var sampleType = this.getSampleTypeForSampleTypeCode(typeCode); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataGrid/ExperimentDataGridUtil.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataGrid/ExperimentDataGridUtil.js new file mode 100644 index 0000000000000000000000000000000000000000..e55dbc6c512b6046f7552d9c5fef350ea18f7804 --- /dev/null +++ b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataGrid/ExperimentDataGridUtil.js @@ -0,0 +1,149 @@ +var ExperimentDataGridUtil = new function() { + this.getExperimentDataGrid = function(typeCode, entities, rowClick) { + var type = profile.getExperimentTypeForExperimentTypeCode(typeCode); + var propertyCodes = profile.getAllPropertiCodesForExperimentTypeCode(typeCode); + var propertyCodesDisplayNames = profile.getPropertiesDisplayNamesForExperimentTypeCode(typeCode, propertyCodes); + + //Fill Columns model + var columns = []; + + columns.push({ + label : 'Identifier', + property : 'identifier', + isExportable: true, + sortable : true, + render : function(data) { + var href = Util.getURLFor(mainController.sideMenu.getCurrentNodeId(), "showExperimentPageFromIdentifier", data.identifier); + var link = $("<a>", { "href" : href, "class" : "browser-compatible-javascript-link" }).append(data.identifier); + return link; + }, + filter : function(data, filter) { + return data.identifier.toLowerCase().indexOf(filter) !== -1; + }, + sort : function(data1, data2, asc) { + var value1 = data1.identifier; + var value2 = data2.identifier; + var sortDirection = (asc)? 1 : -1; + return sortDirection * naturalSort(value1, value2); + } + }); + + if($.inArray("NAME", propertyCodes) !== -1) { + columns.push({ + label : 'Name', + property : 'NAME', + isExportable: true, + sortable : true + }); + } + + var propertyColumnsToSort = []; + for (var idx = 0; idx < propertyCodes.length; idx++) { + var propertiesToSkip = ["NAME"]; + var propertyCode = propertyCodes[idx]; + if($.inArray(propertyCode, propertiesToSkip) !== -1) { + continue; + } + var propertyType = profile.getPropertyType(propertyCode); + if(propertyType.dataType === "CONTROLLEDVOCABULARY") { + var getVocabularyColumn = function(propertyType) { + return function() { + return { + label : propertyCodesDisplayNames[idx], + property : propertyCodes[idx], + isExportable: true, + sortable : true, + render : function(data) { + return FormUtil.getVocabularyLabelForTermCode(propertyType, data[propertyType.code]); + }, + filter : function(data, filter) { + var value = FormUtil.getVocabularyLabelForTermCode(propertyType, data[propertyType.code]); + return value && value.toLowerCase().indexOf(filter) !== -1; + }, + sort : function(data1, data2, asc) { + var value1 = FormUtil.getVocabularyLabelForTermCode(propertyType, data1[propertyType.code]); + if(!value1) { + value1 = "" + }; + var value2 = FormUtil.getVocabularyLabelForTermCode(propertyType, data2[propertyType.code]); + if(!value2) { + value2 = "" + }; + var sortDirection = (asc)? 1 : -1; + return sortDirection * naturalSort(value1, value2); + } + }; + } + } + + var newVocabularyColumnFunc = getVocabularyColumn(propertyType); + propertyColumnsToSort.push(newVocabularyColumnFunc()); + } else { + propertyColumnsToSort.push({ + label : propertyCodesDisplayNames[idx], + property : propertyCodes[idx], + isExportable: true, + sortable : true + }); + } + } + + columns.push({ + label : '---------------', + property : null, + isExportable: false, + sortable : false + }); + propertyColumnsToSort.sort(function(propertyA, propertyB) { + return propertyA.label.localeCompare(propertyB.label); + }); + columns = columns.concat(propertyColumnsToSort); + columns.push({ + label : '---------------', + property : null, + isExportable: false, + sortable : false + }); + + columns.push({ + label : 'Registration Date', + property : 'registrationDate', + isExportable: false, + sortable : true + }); + + columns.push({ + label : 'Modification Date', + property : 'modificationDate', + isExportable: false, + sortable : true + }); + + //Fill data model + var getDataList = function(callback) { + var dataList = []; + for(var sIdx = 0; sIdx < entities.length; sIdx++) { + var entity = entities[sIdx]; + var model = { 'identifier' : entity.identifier, + 'permId' : entity.permId, + 'registrationDate' : Util.getFormatedDate(new Date(entity.registrationDetails.registrationDate)), + 'modificationDate' : Util.getFormatedDate(new Date(entity.registrationDetails.modificationDate)) + }; + + for (var pIdx = 0; pIdx < propertyCodes.length; pIdx++) { + var propertyCode = propertyCodes[pIdx]; + model[propertyCode] = entity.properties[propertyCode]; + } + + dataList.push(model); + } + callback(dataList); + }; + + //Create and return a data grid controller + var configKey = "ENTITY_TABLE_"+ typeCode; + var dataGridController = new DataGridController(null, columns, getDataList, rowClick, false, configKey); + return dataGridController; + } + +} \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableController.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableController.js new file mode 100644 index 0000000000000000000000000000000000000000..20f9d5749ab6942a1ce05f4fc17420476712d26a --- /dev/null +++ b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableController.js @@ -0,0 +1,83 @@ +/* + * Copyright 2014 ETH Zuerich, Scientific IT Services + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function ExperimentTableController(parentController, title, project, showInProjectOverview) { + this._parentController = parentController; + this._experimentTableModel = new ExperimentTableModel(title, project, showInProjectOverview); + this._experimentTableView = new ExperimentTableView(this, this._experimentTableModel); + + this.init = function($container) { + var _this = this; + Util.blockUI(); + + var callback = function(data) { + var typeCount = 0; + var lastType = null; + for(var i = 0; i < data.result.length; i++) { + var item = data.result[i]; + if(item.properties["SHOW_IN_PROJECT_OVERVIEW"]) { + _this._experimentTableModel.allExperiments.push(item); + if(!_this._experimentTableModel.types[item.experimentTypeCode]) { + lastType = item.experimentTypeCode; + _this._experimentTableModel.types[item.experimentTypeCode] = true; + typeCount++; + } + } + } + + _this._experimentTableView.repaint($container); + Util.unblockUI(); + + if(typeCount === 1) { + _this._experimentTableView.getTypeSelector().val(lastType); + _this._reloadTableWithType(lastType); + } + }; + + if(this._experimentTableModel.project) { + this._loadProjectData(callback); + } + } + + this._loadProjectData = function(callback) { + var project = this._experimentTableModel.project; + delete project["@id"]; + delete project["@type"]; + mainController.serverFacade.listExperiments([project], callback); + } + + this._reloadTableWithType = function(selectedTypeCode) { + if(selectedTypeCode !== '') { //Verify something selected + //Get experiments from type + var experiments = []; + for (var idx = 0; idx < this._experimentTableModel.allExperiments.length; idx++) { + var exptoCheckType = this._experimentTableModel.allExperiments[idx]; + if(exptoCheckType.experimentTypeCode === selectedTypeCode) { + experiments.push(exptoCheckType); + } + } + + //Click event + var rowClick = function(e) { + mainController.changeView('showExperimentPageFromIdentifier', e.data.identifier); + } + + //Create and display table + var dataGridController = ExperimentDataGridUtil.getExperimentDataGrid(selectedTypeCode, experiments, rowClick); + dataGridController.init(this._experimentTableView.getTableContainer()); + } + } +} \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableModel.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableModel.js new file mode 100644 index 0000000000000000000000000000000000000000..26ffae29249f614f318ea24d1a4d6d0f9995eba3 --- /dev/null +++ b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableModel.js @@ -0,0 +1,23 @@ +/* + * Copyright 2014 ETH Zuerich, Scientific IT Services + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function ExperimentTableModel(title, project, showInProjectOverview) { + this.title = title; + this.project = project; + this.showInProjectOverview = showInProjectOverview; + this.types = {}; + this.allExperiments = new Array(); +} \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableView.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableView.js new file mode 100644 index 0000000000000000000000000000000000000000..da8e2a046b808a908ef5ec51791fb7730a8eb2b6 --- /dev/null +++ b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ExperimentTable/ExperimentTableView.js @@ -0,0 +1,65 @@ +/* Copyright 2014 ETH Zuerich, Scientific IT Services + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function ExperimentTableView(experimentTableController, experimentTableModel) { + this._experimentTableController = experimentTableController; + this._experimentTableModel = experimentTableModel; + this._tableContainer = $("<div>"); + this.typeSelector = null; + + this.repaint = function($container) { + var _this = this; + $container.empty(); + if(this._experimentTableModel.title) { + var $title = $("<h1>").append(this._experimentTableModel.title); + $container.append($title); + } + + var $toolbox = $("<div>", { 'id' : 'toolBoxContainer', class : 'toolBox'}); + $toolbox.append("Experiment Type: "); + $toolbox.append(this._getProjectExperimentTypesDropdown()).append(" ").append(); + + $container.append($toolbox); + $container.append(this._tableContainer); + } + + this.getTableContainer = function() { + return this._tableContainer; + } + + // + // Components + // + this.getTypeSelector = function() { + return this.typeSelector; + } + + this._getProjectExperimentTypesDropdown = function() { + var _this = this; + var $typesSelector = $('<select>', { class : 'form-control' }); + $typesSelector.append($('<option>', { 'value' : '' }).text('')); + for(typeCode in this._experimentTableModel.types) { + $typesSelector.append($('<option>', { 'value' : typeCode }).text(typeCode)); + } + + $typesSelector.change(function(event) { + var typeToShow = $(this).val(); + _this._experimentTableController._reloadTableWithType(typeToShow); + }); + this.typeSelector = $typesSelector; + return $("<span>").append($typesSelector); + } + +} \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ProjectForm/ProjectFormView.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ProjectForm/ProjectFormView.js index 1078bf780d60a2fe29d3713554d86ecab42b2aaf..95f7949f462cd92fcbd76177eaae0172fcf93fcd 100644 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ProjectForm/ProjectFormView.js +++ b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/ProjectForm/ProjectFormView.js @@ -148,6 +148,16 @@ function ProjectFormView(projectFormController, projectFormModel) { var $updateBtn = $("<input>", { "type": "submit", "class" : "btn btn-primary", 'value' : btnText }); $formColumn.append($updateBtn); } + + // + // Experiment Table + // + var $experimentsContainer = $("<div>"); + $formColumn.append($experimentsContainer); + + var experimentTableController = new ExperimentTableController(this._projectFormController, "Experiments", this._projectFormModel.project); + experimentTableController.init($experimentsContainer); + $container.append($form); FormUtil.activateRichTextProperties(); }