From df628e9b825bb5a8f8b3e4d6716663b0f19d66bd Mon Sep 17 00:00:00 2001
From: alaskowski <alaskowski@ethz.ch>
Date: Wed, 12 Jul 2023 15:32:56 +0200
Subject: [PATCH] SSDM-55: Adding multivalued property handling for DataSets,
 fixed multivalued properties handling in samples and experiments

---
 .../js/views/DataSetForm/DataSetFormView.js   | 62 +++++++++++++++++--
 .../js/views/SampleForm/SampleFormView.js     |  2 -
 2 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataSetForm/DataSetFormView.js b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataSetForm/DataSetFormView.js
index 671e3c4f809..309c6bd08b6 100644
--- a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataSetForm/DataSetFormView.js
+++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/DataSetForm/DataSetFormView.js
@@ -801,7 +801,7 @@ function DataSetFormView(dataSetFormController, dataSetFormModel) {
                                     $fieldset.append($controlGroup);
                                 }
                             } else if(propertyType.dataType === "SAMPLE") {
-                                var $component = new SampleField(false, '', false, value, true);
+                                var $component = new SampleField(false, '', false, value, true, propertyTypeV3.isMultiValue());
                                 $controlGroup = FormUtil.getFieldForComponentWithLabel($component, propertyType.label);
                                 $fieldset.append($controlGroup);
                             } else {
@@ -820,10 +820,10 @@ function DataSetFormView(dataSetFormController, dataSetFormModel) {
 						$controlGroup.append($controlLabel);
 						$controlGroup.append($controls);
 						
-						var $component = FormUtil.getFieldForPropertyType(propertyType, value);
+						var $component = FormUtil.getFieldForPropertyType(propertyType, value, propertyTypeV3.isMultiValue());
 						
 						//Update model
-						var changeEvent = function(propertyType) {
+						var changeEvent = function(propertyType, isMultiValue) {
 							return function(jsEvent, newValue) {
 								var propertyTypeCode = null;
 								propertyTypeCode = propertyType.code;
@@ -843,7 +843,39 @@ function DataSetFormView(dataSetFormController, dataSetFormModel) {
 									if(newValue !== undefined && newValue !== null) {
 									    _this._setDataSetProperty(propertyTypeCode, Util.getEmptyIfNull(newValue));
 									} else {
-									    _this._setDataSetProperty(propertyTypeCode, Util.getEmptyIfNull(field.val()));
+                                        var lastSelected = Util.getEmptyIfNull($('option', this).filter(':selected:last').val());
+                                        var dataLast = field.data('last');
+                                         if(propertyType.dataType === "CONTROLLEDVOCABULARY" && isMultiValue) {
+                                            var props = _this._getDataSetProperty(propertyTypeCode);
+                                            if (field.val()) {
+                                            if(props !== undefined) {
+                                                if(props != '' && field.val().includes('')) {
+                                                    _this._setDataSetProperty(propertyTypeCode, '');
+                                                    field.val([]);
+                                                } else {
+                                                    if(props == '' && field.val().includes('')) {
+                                                        var removedEmpty = field.val().filter(x => x != '');
+                                                        _this._setDataSetProperty(propertyTypeCode, removedEmpty);
+                                                        field.val(removedEmpty);
+                                                    } else {
+                                                        _this._setDataSetProperty(propertyTypeCode, Util.getEmptyIfNull(field.val()));
+                                                    }
+                                                }
+                                            } else {
+                                                if(field.val().includes('')) {
+                                                    _this._setDataSetProperty(propertyTypeCode, '');
+                                                    field.val([]);
+                                                } else {
+                                                    _this._setDataSetProperty(propertyTypeCode, field.val());
+                                                }
+                                            }
+                                             } else {
+                                                _this._setDataSetProperty(propertyTypeCode, Util.getEmptyIfNull(field.val()));
+                                             }
+                                        } else {
+                                            _this._setDataSetProperty(propertyTypeCode, Util.getEmptyIfNull(field.val()));
+                                        }
+                                        field.data('last', field.val());
 									}
 								}
 							}
@@ -854,7 +886,18 @@ function DataSetFormView(dataSetFormController, dataSetFormModel) {
 							if(propertyType.dataType === "BOOLEAN") {
 							    FormUtil.setFieldValue(propertyType, $component, value);
 							} else if(propertyType.dataType === "TIMESTAMP" || propertyType.dataType === "DATE") {
-							} else {
+							} else if(propertyTypeV3.isMultiValue()) {
+                                if(value) {
+                                    var valueArray;
+                                    if(Array.isArray(value)) {
+                                        valueArray = value;
+                                    } else {
+                                        valueArray = value.split(',');
+                                        valueArray = valueArray.map(function(item){ return item.trim(); });
+                                    }
+                                    $component.val(valueArray);
+                                }
+                            } else {
 								$component.val(value);
 							}
 						} else {
@@ -893,7 +936,7 @@ function DataSetFormView(dataSetFormController, dataSetFormModel) {
                         } else if(propertyType.dataType === "TIMESTAMP" || propertyType.dataType === "DATE") {
 							$component.on("dp.change", changeEvent(propertyType));
 						} else {
-							$component.change(changeEvent(propertyType));
+							$component.change(changeEvent(propertyType, propertyTypeV3.isMultiValue()));
 						}
 						
 						$controls.append($component);
@@ -1019,6 +1062,13 @@ function DataSetFormView(dataSetFormController, dataSetFormModel) {
 	    }
 	}
 
+	this._getDataSetProperty = function(key) {
+    	    if(!this._dataSetFormModel.dataSetV3) {
+                this._dataSetFormModel.dataSetV3 = { properties : {} };
+            }
+            this._dataSetFormModel.dataSetV3.properties[key];
+    	}
+
 	this._setDataSetProperty = function(key, val) {
 	    if(!this._dataSetFormModel.dataSetV3) {
             this._dataSetFormModel.dataSetV3 = { properties : {} };
diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SampleForm/SampleFormView.js b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SampleForm/SampleFormView.js
index e623ef6f987..7407f66fc52 100644
--- a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SampleForm/SampleFormView.js
+++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SampleForm/SampleFormView.js
@@ -741,7 +741,6 @@ function SampleFormView(sampleFormController, sampleFormModel) {
 						continue;
 					}
 				} else {
-					// var $component = FormUtil.getFieldForPropertyType(propertyType, value);
 					var $component = FormUtil.getFieldForPropertyType(propertyType, value, propertyTypeV3.isMultiValue());
 
 					//Update values if is into edit mode
@@ -787,7 +786,6 @@ function SampleFormView(sampleFormController, sampleFormModel) {
 								if(newValue !== undefined && newValue !== null) {
 									_this._sampleFormModel.sample.properties[propertyTypeCode] = Util.getEmptyIfNull(newValue);
 								} else {
-									// _this._sampleFormModel.sample.properties[propertyTypeCode] = Util.getEmptyIfNull(field.val());
 									var lastSelected = Util.getEmptyIfNull($('option', this).filter(':selected:last').val());
                                     var dataLast = field.data('last');
                                      if(propertyType.dataType === "CONTROLLEDVOCABULARY" && isMultiValue) {
-- 
GitLab