From c942c3320e5ee3ae66a1b7123bc8a1fcebf78c76 Mon Sep 17 00:00:00 2001
From: Yves Noirjean <yves.noirjean@id.ethz.ch>
Date: Wed, 28 Nov 2018 11:21:23 +0100
Subject: [PATCH] SSDM-7428: using new core plugin to store searches

---
 .../core-plugins/eln-lims/1/as/elnTypes.py    |   7 -
 .../1/as/initializemasterdataminimum.py       |   1 -
 .../eln-lims/html/js/server/ServerFacade.js   | 238 +++++++++++++-----
 .../AdvancedSearchController.js               | 143 +++++++----
 .../AdvancedSearch/AdvancedSearchModel.js     |   1 +
 .../AdvancedSearch/AdvancedSearchView.js      |   4 +
 .../dist/core-plugins/eln-lims/4              |   1 -
 7 files changed, 274 insertions(+), 121 deletions(-)
 delete mode 120000 openbis_standard_technologies/dist/core-plugins/eln-lims/4

diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/elnTypes.py b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/elnTypes.py
index ecf4c7a39e6..1f79772db22 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/elnTypes.py
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/elnTypes.py
@@ -860,13 +860,6 @@ FLY = [FIRST_TIME_VERSIONED, True, True, "FLY", "", [
         [FIRST_TIME_VERSIONED, "ANNOTATIONS_STATE",                "Comments",                "Annotations State",                    DataType.XML,                    None,                                "Annotations State", "ANNOTATIONS_FLY", None]
     ]];
 
-SEARCH_QUERY = [MANDATORY_ITEM_VERSION, True, True, "SEARCH_QUERY", "Used to store saved search queries", [
-        [MANDATORY_ITEM_VERSION, "NAME",               "General",   "Name",                     DataType.VARCHAR,  None,  "Name", None, None],
-        [MANDATORY_ITEM_VERSION, "CRITERIA",              "General",   "Criteria",                 DataType.XML,      None,  "Criteria", None, None],
-        [MANDATORY_ITEM_VERSION, "XMLCOMMENTS",        "Comments",  "Comments List",            DataType.XML,      None,  "Several comments can be added by different users", "COMMENTS_SAMPLE", None],
-        [MANDATORY_ITEM_VERSION, "ANNOTATIONS_STATE",  "Comments",  "Annotations State",        DataType.XML,      None,  "Annotations State", "ANNOTATIONS_CHEMICAL", None]
-    ]];
-
 ##
 ## Sample Types - Non Materials
 ##
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/initializemasterdataminimum.py b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/initializemasterdataminimum.py
index c2be900823e..fe2669761f8 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/initializemasterdataminimum.py
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/initializemasterdataminimum.py
@@ -63,7 +63,6 @@ def initBasicMasterData(tr):
     ## Sample Types - Non Materials
     ##
     elnTypes.createSampleTypeWithProperties(tr, elnTypes.GENERAL_ELN_SETTINGS);
-    elnTypes.createSampleTypeWithProperties(tr, elnTypes.SEARCH_QUERY);
     elnTypes.createSampleTypeWithProperties(tr, elnTypes.EXPERIMENTAL_STEP);
     elnTypes.createSampleTypeWithProperties(tr, elnTypes.STORAGE_RACK);
     elnTypes.createSampleTypeWithProperties(tr, elnTypes.STORAGE_POSITION);
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js
index e8dd6a389c4..c487f60c029 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js
@@ -701,28 +701,12 @@ function ServerFacade(openbisServer) {
  			callbackFunction(error, result);
  		});
 	}
- 	
- 	this.customELNASAPI = function(parameters, callackFunction) {
- 		require([ "as/dto/service/id/CustomASServiceCode", "as/dto/service/CustomASServiceExecutionOptions" ],
-    	        function(CustomASServiceCode, CustomASServiceExecutionOptions) {
-    	            var id = new CustomASServiceCode("as-eln-lims-api");
-    	            var options = new CustomASServiceExecutionOptions();
-    	            
-    	            if(parameters) {
-    	            	for(key in parameters) {
-        	            	options.withParameter(key, parameters[key]);
-        	            }
-    	            }
-    	            
-    	            mainController.openbisV3.executeCustomASService(id, options).done(function(result) {
-    	                callackFunction(result);
-    	            }).fail(function(result) {
-    	            	alert("Call failed to server: " + JSON.stringify(result));
-    	            });
-    	 });
- 	}
- 	
- 	this.createReportFromAggregationService = function(dataStoreCode, parameters, callbackFunction, service) {
+
+	this.customELNASAPI = function(parameters, callbackFunction) {
+		this.customASService(parameters, callbackFunction, "as-eln-lims-api");
+	}
+
+	this.createReportFromAggregationService = function(dataStoreCode, parameters, callbackFunction, service) {
  		if(!service) {
  			service = "eln-lims-api";
  		}
@@ -846,21 +830,39 @@ function ServerFacade(openbisServer) {
 	//
 	// New Advanced Search
 	//
-	
+
+	this.getSearchCriteriaAndFetchOptionsForDataSetSearch = function(advancedSearchCriteria, advancedFetchOptions, callback) {
+		var criteriaClass = 'as/dto/dataset/search/DataSetSearchCriteria';
+		var fetchOptionsClass = 'as/dto/dataset/fetchoptions/DataSetFetchOptions';
+		this.getSearchCriteriaAndFetchOptionsForEntitySearch(advancedSearchCriteria, advancedFetchOptions, callback, criteriaClass, fetchOptionsClass);
+	}
+
 	this.searchForDataSetsAdvanced = function(advancedSearchCriteria, advancedFetchOptions, callback) {
 		var criteriaClass = 'as/dto/dataset/search/DataSetSearchCriteria';
 		var fetchOptionsClass = 'as/dto/dataset/fetchoptions/DataSetFetchOptions';
 		var searchMethodName = 'searchDataSets';
 		this.searchForEntityAdvanced(advancedSearchCriteria, advancedFetchOptions, callback, criteriaClass, fetchOptionsClass, searchMethodName);
 	}
-	
+
+	this.getSearchCriteriaAndFetchOptionsForExperimentSearch = function(advancedSearchCriteria, advancedFetchOptions, callback) {
+		var criteriaClass = 'as/dto/experiment/search/ExperimentSearchCriteria';
+		var fetchOptionsClass = 'as/dto/experiment/fetchoptions/ExperimentFetchOptions';
+		this.getSearchCriteriaAndFetchOptionsForEntitySearch(advancedSearchCriteria, advancedFetchOptions, callback, criteriaClass, fetchOptionsClass);
+	}
+
 	this.searchForExperimentsAdvanced = function(advancedSearchCriteria, advancedFetchOptions, callback) {
 		var criteriaClass = 'as/dto/experiment/search/ExperimentSearchCriteria';
 		var fetchOptionsClass = 'as/dto/experiment/fetchoptions/ExperimentFetchOptions';
 		var searchMethodName = 'searchExperiments';
 		this.searchForEntityAdvanced(advancedSearchCriteria, advancedFetchOptions, callback, criteriaClass, fetchOptionsClass, searchMethodName);
 	}
-	
+
+	this.getSearchCriteriaAndFetchOptionsForSamplesSearch = function(advancedSearchCriteria, advancedFetchOptions, callback) {
+		var criteriaClass = 'as/dto/sample/search/SampleSearchCriteria';
+		var fetchOptionsClass = 'as/dto/sample/fetchoptions/SampleFetchOptions';
+		this.getSearchCriteriaAndFetchOptionsForEntitySearch(advancedSearchCriteria, advancedFetchOptions, callback, criteriaClass, fetchOptionsClass);
+	}
+
 	this.searchForSamplesAdvanced = function(advancedSearchCriteria, advancedFetchOptions, callback) {
 		var criteriaClass = 'as/dto/sample/search/SampleSearchCriteria';
 		var fetchOptionsClass = 'as/dto/sample/fetchoptions/SampleFetchOptions';
@@ -881,8 +883,8 @@ function ServerFacade(openbisServer) {
 		var searchMethodName = 'searchProjects';
 		this.searchForEntityAdvanced(advancedSearchCriteria, advancedFetchOptions, callback, criteriaClass, fetchOptionsClass, searchMethodName);
 	}
-	
-	this.searchForEntityAdvanced = function(advancedSearchCriteria, advancedFetchOptions, callback, criteriaClass, fetchOptionsClass, searchMethodName) {
+
+	this.getSearchCriteriaAndFetchOptionsForEntitySearch = function(advancedSearchCriteria, advancedFetchOptions, callback, criteriaClass, fetchOptionsClass) {
 		require([criteriaClass,
 		         fetchOptionsClass,
 		         'as/dto/common/search/DateObjectEqualToValue',
@@ -1341,43 +1343,51 @@ function ServerFacade(openbisServer) {
 				//
 				// Fix For broken equals PART 1 - END
 				//
-				
-				mainController.openbisV3[searchMethodName](searchCriteria, fetchOptions)
-				.done(function(apiResults) {
-					//
-					// Fix For broken equals PART 2
-					//
-					var results = apiResults.objects;
-					var filteredResults = [];
-					if(hackFixForBrokenEquals.length > 0 && results) {
-						for(var rIdx = 0; rIdx < results.length; rIdx++) {
-							var result = results[rIdx];
-							for(var fIdx = 0; fIdx < hackFixForBrokenEquals.length; fIdx++) {
-								if(	result && 
-									result.properties && 
-									result.properties[hackFixForBrokenEquals[fIdx].propertyCode] === hackFixForBrokenEquals[fIdx].value) {
-									filteredResults.push(result);
-								}
-							}
-						}
-					} else {
-						filteredResults = results;
-					}
-					apiResults.objects = filteredResults;
-					//
-					// Fix For broken equals PART 2 - END
-					//
-					callback(apiResults);
-				})
-				.fail(function(result) {
-					Util.showError("Call failed to server: " + JSON.stringify(result));
-				});
+				callback(searchCriteria, fetchOptions, hackFixForBrokenEquals);
+
 			} catch(exception) {
 				Util.showError(exception.name + ": " + exception.message);
 			}
 		});
 	}
-	
+
+	this.searchForEntityAdvanced = function(advancedSearchCriteria, advancedFetchOptions, callback, criteriaClass, fetchOptionsClass, searchMethodName) {
+		var searchFunction = function(searchCriteria, fetchOptions, hackFixForBrokenEquals) {
+			mainController.openbisV3[searchMethodName](searchCriteria, fetchOptions)
+			.done(function(apiResults) {
+				//
+				// Fix For broken equals PART 2
+				//
+				var results = apiResults.objects;
+				var filteredResults = [];
+				if(hackFixForBrokenEquals.length > 0 && results) {
+					for(var rIdx = 0; rIdx < results.length; rIdx++) {
+						var result = results[rIdx];
+						for(var fIdx = 0; fIdx < hackFixForBrokenEquals.length; fIdx++) {
+							if(	result && 
+								result.properties && 
+								result.properties[hackFixForBrokenEquals[fIdx].propertyCode] === hackFixForBrokenEquals[fIdx].value) {
+								filteredResults.push(result);
+							}
+						}
+					}
+				} else {
+					filteredResults = results;
+				}
+				apiResults.objects = filteredResults;
+				//
+				// Fix For broken equals PART 2 - END
+				//
+				callback(apiResults);
+			})
+			.fail(function(result) {
+				Util.showError("Call failed to server: " + JSON.stringify(result));
+			});
+		}
+
+		this.getSearchCriteriaAndFetchOptionsForEntitySearch(advancedSearchCriteria, advancedFetchOptions, searchFunction, criteriaClass, fetchOptionsClass);
+	}
+
 	//
 	// Search Samples
 	//
@@ -2013,16 +2023,15 @@ function ServerFacade(openbisServer) {
 	//
 	// Global Search
 	//
-	this.searchGlobally = function(freeText, advancedFetchOptions, callbackFunction)
-	{
-		var _this = this;
+
+	this.getSearchCriteriaAndFetchOptionsForGlobalSearch = function(freeText, advancedFetchOptions, callbackFunction) {
 		require(['as/dto/global/search/GlobalSearchCriteria', 
 		         'as/dto/global/fetchoptions/GlobalSearchObjectFetchOptions'], 
 		         function(GlobalSearchCriteria, GlobalSearchObjectFetchOptions){
 			var searchCriteria = new GlobalSearchCriteria();
 			searchCriteria.withText().thatContains(freeText.toLowerCase().trim());
 			searchCriteria.withOperator("AND");
-			
+
 			var fetchOptions = new GlobalSearchObjectFetchOptions();
 			var sampleFetchOptions = fetchOptions.withSample();
 			sampleFetchOptions.withSpace();
@@ -2056,7 +2065,15 @@ function ServerFacade(openbisServer) {
 				fetchOptions.from(advancedFetchOptions.from);
 				fetchOptions.count(advancedFetchOptions.count);
 			}
-			
+
+			callbackFunction(searchCriteria, fetchOptions);
+		});
+	}
+
+	this.searchGlobally = function(freeText, advancedFetchOptions, callbackFunction)
+	{
+		this.getSearchCriteriaAndFetchOptionsForGlobalSearch(freeText, advancedFetchOptions, function(searchCriteria, fetchOptions)
+		{
 			mainController.openbisV3.searchGlobally(searchCriteria, fetchOptions).done(function(results) {
 				callbackFunction(results);
 			}).fail(function(error) {
@@ -2506,4 +2523,97 @@ function ServerFacade(openbisServer) {
 				callbackFunction(false);
 		});
 	}
+
+	this.searchCustomASServices = function(code, callbackFunction) {
+		require(['as/dto/service/search/CustomASServiceSearchCriteria', 'as/dto/service/fetchoptions/CustomASServiceFetchOptions'],
+			function(CustomASServiceSearchCriteria, CustomASServiceFetchOptions) {
+				var searchCriteria = new CustomASServiceSearchCriteria();
+				var fetchOptions = new CustomASServiceFetchOptions();
+				searchCriteria.withCode().thatEquals(code);
+				mainController.openbisV3.searchCustomASServices(searchCriteria, fetchOptions).done(function(result) {
+					callbackFunction(result);
+		        }).fail(function(result) {
+					Util.showError("Call failed to server: " + JSON.stringify(result));
+					callbackFunction(false);
+				});
+			}
+		);
+	}
+
+	// errorHandler: optional. if present, it is called instead of showing the error and the callbackFunction is not called
+	this.customASService = function(parameters, callbackFunction, serviceCode, errorHandler) {
+		require([ "as/dto/service/id/CustomASServiceCode", "as/dto/service/CustomASServiceExecutionOptions" ],
+			   function(CustomASServiceCode, CustomASServiceExecutionOptions) {
+				   var id = new CustomASServiceCode(serviceCode);
+				   var options = new CustomASServiceExecutionOptions();
+				   
+				   if(parameters) {
+					   for(key in parameters) {
+						   options.withParameter(key, parameters[key]);
+					   }
+				   }
+				   
+				   mainController.openbisV3.executeCustomASService(id, options).done(function(result) {
+					   callbackFunction(result);
+				   }).fail(function(result) {
+					    if (errorHandler) {
+							errorHandler(result);
+					    } else {
+							alert("Call failed to server: " + JSON.stringify(result));
+						}
+				   });
+		});
+	}
+
+	//
+	// search-store Functions
+	//
+
+	this.callSearchStoreService = function(parameters, callbackFunction) {
+		this.customASService(parameters, callbackFunction, 'search-store', function(errorResult) {
+			Util.showError("Call failed to server: " + JSON.stringify(errorResult));
+			callbackFunction(false);
+		});
+	}
+
+	this.saveSearch = function(space, experiment, name, criteriaV3, fetchOptionsV3, criteriaEln, callbackFunction) {
+		var parameters = {
+			method: 'SAVE',
+			name: name,
+			searchCriteria: criteriaV3,
+			fetchOptions: fetchOptionsV3,
+			customData: { 'eln-lims-criteria': criteriaEln },
+			spacePermId: space.permId.permId,
+			experimentPermId: experiment.permId.permId,
+		}
+		this.callSearchStoreService(parameters, callbackFunction);
+	}
+
+	this.updateSearch = function(permId, criteriaV3, fetchOptionsV3, criteriaEln, callbackFunction) {
+		var parameters = {
+			method: 'UPDATE',
+			permId: permId,
+			searchCriteria: criteriaV3,
+			fetchOptions: fetchOptionsV3,
+			customData: { 'eln-lims-criteria': criteriaEln },
+		}
+		this.callSearchStoreService(parameters, callbackFunction);
+	}
+
+	this.loadSearches = function(callbackFunction) {
+		var parameters = {
+			method: 'LOAD',
+		}
+		this.callSearchStoreService(parameters, callbackFunction);
+	}
+
+	this.deleteSearch = function(permId, reason, callbackFunction) {
+		parameters = {
+			method: 'DELETE',
+			permId: permId,
+			reason: reason,
+		}
+		this.callSearchStoreService(parameters, callbackFunction);
+	}
+
 }
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchController.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchController.js
index 1b08ef8f112..09d7f2f9b9a 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchController.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchController.js
@@ -21,8 +21,15 @@ function AdvancedSearchController(mainController, forceSearch) {
 
 	this.init = function(views) {
 		var _this = this;
-		this._loadSavedSearches(function() {
-			_this._advancedSearchView.repaint(views);
+		_this._searchStoreAvailable(function(searchStoreAvailable) {
+			_this._advancedSearchModel.searchStoreAvailable = searchStoreAvailable;
+			if (searchStoreAvailable) {
+				_this._loadSavedSearches(function() {
+					_this._advancedSearchView.repaint(views);
+				});
+			} else {
+				_this._advancedSearchView.repaint(views);
+			}
 		});
 	}
 
@@ -220,10 +227,44 @@ function AdvancedSearchController(mainController, forceSearch) {
 		}
 	}
 
+	this._getSearchCriteriaV3 = function(callback) {
+		var criteriaToSend = $.extend(true, {}, this._advancedSearchModel.criteria);
+		switch(criteriaToSend.entityKind) {
+			case "ALL":
+				var freeText = "";
+				for(var ruleId in criteriaToSend.rules) {
+					if(criteriaToSend.rules[ruleId].value) {
+						freeText += " " +  criteriaToSend.rules[ruleId].value;
+					}
+				}
+				mainController.serverFacade.getSearchCriteriaAndFetchOptionsForGlobalSearch(freeText, {}, callback);
+				break;
+			case "SAMPLE":
+				mainController.serverFacade.getSearchCriteriaAndFetchOptionsForSamplesSearch(criteriaToSend, {}, callback);
+				break;
+			case "EXPERIMENT":
+				mainController.serverFacade.getSearchCriteriaAndFetchOptionsForExperimentSearch(criteriaToSend, {}, callback);
+				break;
+			case "DATASET":
+				mainController.serverFacade.getSearchCriteriaAndFetchOptionsForDataSetSearch(criteriaToSend, {}, callback);
+				break;
+		}
+	}
+
 	//
 	// query loading / saving
 	//
 
+	this._searchStoreAvailable = function(callback) {
+		this._mainController.serverFacade.searchCustomASServices('search-store', function(result) {
+			if (result != null && result.objects.length > 0) {
+				callback(true);
+			} else {
+				callback(false);
+			}
+		})
+	}
+
 	this.selectSavedSearch = function(selcetedSavedSearchIndex) {
 		var savedSearch = this._advancedSearchModel.savedSearches[selcetedSavedSearchIndex];
 		this._advancedSearchModel.selcetedSavedSearchIndex = selcetedSavedSearchIndex;
@@ -236,22 +277,18 @@ function AdvancedSearchController(mainController, forceSearch) {
 	// params.experiment
 	this.saveNewSample = function(params, callback) {
 		var _this = this;
-		var criteria = _this._getSerializedCriteria();
 
 		this._ensureProjectAndExperiment(params.experiment, function(experiment) {
 			_this._doIfAdmin(experiment, function() {
-				_this._mainController.serverFacade.createSample('SEARCH_QUERY', experiment, {
-					NAME: params.name,
-					CRITERIA: criteria,
-				}, function(result) {
-					var permId = result[0].permId;
-					_this._mainController.serverFacade.getSamples([permId], function(result) {
-						if (result[permId]) {
-							var savedSearch = _this._sampleToSavedSearch(result[permId]);
-							_this._advancedSearchModel.savedSearches.push(savedSearch);
-							_this.selectSavedSearch(_this._advancedSearchModel.savedSearches.length - 1);
-						}
-					callback();
+				_this._getSearchCriteriaV3(function(criteriaV3, fetchOptionsV3) {
+					var criteriaEln = _this._advancedSearchModel.criteria;
+					var space = experiment.project.space;
+					_this._mainController.serverFacade.saveSearch(space, experiment, params.name, criteriaV3, fetchOptionsV3, criteriaEln, function(sample) {
+						Util.showSuccess('Search saved.');
+						var savedSearch = _this._sampleToSavedSearch(sample);
+						_this._advancedSearchModel.savedSearches.unshift(savedSearch);
+						_this.selectSavedSearch(0);
+						callback();
 					});
 				});
 			});
@@ -260,41 +297,39 @@ function AdvancedSearchController(mainController, forceSearch) {
 
 	this.updateSelectedSample = function(callback) {
 		var _this = this;
-		var criteria = _this._getSerializedCriteria();
 		var savedSearch = _this._advancedSearchModel.savedSearches[_this._advancedSearchModel.selcetedSavedSearchIndex];
 		_this._doIfAdmin(savedSearch.sample.experiment, function() {
-			_this._mainController.serverFacade.updateSample({
-				permId: savedSearch.sample.permId.permId,
-				properties: {
-					CRITERIA: criteria,
-				},
-			}, function(success) {
-				if (success) {
-					Util.showSuccess('Search updated.');
-					savedSearch.criteria = _this._clone(_this._advancedSearchModel.criteria);
-				}
-				callback();
+
+			_this._getSearchCriteriaV3(function(criteriaV3, fetchOptionsV3) {
+				var criteriaEln = _this._advancedSearchModel.criteria;
+				var selcetedSavedSearchIndex = _this._advancedSearchModel.selcetedSavedSearchIndex;
+				var permId = _this._advancedSearchModel.savedSearches[selcetedSavedSearchIndex].sample.permId.permId;
+				_this._mainController.serverFacade.updateSearch(permId, criteriaV3, fetchOptionsV3, criteriaEln, function(result){
+					if (result) {
+						Util.showSuccess('Search updated.');
+						savedSearch.criteria = _this._clone(_this._advancedSearchModel.criteria);
+					}
+					callback();
+				});
 			});
 		});
 	}
 
 	this.delete = function(selcetedSavedSearchIndex, callback) {
 		var _this = this;
-		var savedSearch = _this._advancedSearchModel.savedSearches[selcetedSavedSearchIndex];
-		this._mainController.serverFacade.deleteSamples(
-			[savedSearch.sample.permId.permId],
-			'Search query deletion by user',
-			function(deletionId) {
-				if (deletionId) {
-					_this._advancedSearchModel.selcetedSavedSearchIndex = -1;
-					Util.showSuccess('Search deleted.');
-					_this._loadSavedSearches(function() {
-						_this._advancedSearchView.repaintContent();
-					});
-				}
-				callback();
+		var selcetedSavedSearchIndex = _this._advancedSearchModel.selcetedSavedSearchIndex;
+		var permId = _this._advancedSearchModel.savedSearches[selcetedSavedSearchIndex].sample.permId.permId;
+		var reason = 'Search query deletion by user';
+		this._mainController.serverFacade.deleteSearch(permId, reason, function(deletionId) {
+			if (deletionId) {
+				_this._advancedSearchModel.selcetedSavedSearchIndex = -1;
+				Util.showSuccess('Search deleted.');
+				_this._loadSavedSearches(function() {
+					_this._advancedSearchView.repaintContent();
+				});
 			}
-		);
+			callback();
+		});
 	}
 
 	this.clearSelection = function() {
@@ -307,7 +342,7 @@ function AdvancedSearchController(mainController, forceSearch) {
 		this._mainController.serverFacade.searchSamplesV3('SEARCH_QUERY', function(result) {
 			_this._advancedSearchModel.savedSearches = [];
 			if(result != null && result.objects != null) {
-				var samples = _this._sortSavedSearchSamples(result.objects);
+				var samples = _this._sortSearchSamples(result.objects);
 				for (var i=0; i<samples.length; i++) {
 					_this._advancedSearchModel.savedSearches.push(_this._sampleToSavedSearch(samples[i]));
 				}
@@ -318,7 +353,7 @@ function AdvancedSearchController(mainController, forceSearch) {
 
 	// puts own samples on top
 	// samples are assumed to already be sorted by date
-	this._sortSavedSearchSamples = function(samples) {
+	this._sortSearchSamples = function(samples) {
 		var ownSamples = [];
 		var otherSamples = [];
 		for (var i=0; i<samples.length; i++) {
@@ -331,6 +366,21 @@ function AdvancedSearchController(mainController, forceSearch) {
 		return ownSamples.concat(otherSamples);
 	}
 
+	// puts own samples on top
+	// samples are assumed to already be sorted by date
+	this._sortSearches = function(searches) {
+		var ownSearches = [];
+		var otherSearches = [];
+		for (var i=0; i<searches.length; i++) {
+			if (searches[i].sample.registrator.userId == this._mainController.serverFacade.getUserId()) {
+				ownSearches.push(searches[i]);
+			} else {
+				otherSearches.push(searches[i]);
+			}
+		}
+		return ownSearches.concat(otherSearches);
+	}
+
 	this._ensureProjectAndExperiment = function(experiment, callback) {
 		var _this = this;
 		if (experiment.defaultDummyExperiment) {
@@ -383,14 +433,10 @@ function AdvancedSearchController(mainController, forceSearch) {
 		return {
 			sample: sample,
 			name: sample.properties.NAME,
-			criteria: JSON.parse(atob(sample.properties.CRITERIA.replace('<criteria>', '').replace('</criteria>', ''))),
+			criteria: JSON.parse(sample.properties.CUSTOM_DATA.replace('<xml><![CDATA[', '').replace(']]></xml>', ''))['eln-lims-criteria'],
 		};
 	}
 
-	this._getSerializedCriteria = function() {
-		return '<criteria>' + btoa(JSON.stringify(this._advancedSearchModel.criteria)) + '</criteria>';
-	}
-
 	this._doIfAdmin = function(experiment, action) {
 		var _this = this;
 		_this._mainController.getUserRole({
@@ -409,4 +455,5 @@ function AdvancedSearchController(mainController, forceSearch) {
 	this._clone = function(object) {
 		return JSON.parse(JSON.stringify(object));
 	}
+
 }
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchModel.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchModel.js
index e75a6608e04..a58e7755519 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchModel.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchModel.js
@@ -25,6 +25,7 @@ function AdvancedSearchModel(forceSearch) {
 	}
 	this.savedSearches = []; // [{ sample: v3Sample, name: "name", criteria: { see this.criteria }}, ...]
 	this.selcetedSavedSearchIndex = -1;
+	this.searchStoreAvailable = null;
 
 	if(typeof forceSearch === 'object') {
 		this.criteria = forceSearch;
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchView.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchView.js
index 15505da7ca0..53e2f7571b1 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchView.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/AdvancedSearch/AdvancedSearchView.js
@@ -161,6 +161,10 @@ function AdvancedSearchView(advancedSearchController, advancedSearchModel) {
 		var _this = this;
 		$container.empty();
 
+		if (this._advancedSearchModel.searchStoreAvailable != true) {
+			return;
+		}
+
 		var savedSearchOptions = [{
 			label: 'load a saved search',
 			value: -1,
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/4 b/openbis_standard_technologies/dist/core-plugins/eln-lims/4
deleted file mode 120000
index 56a6051ca2b..00000000000
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/4
+++ /dev/null
@@ -1 +0,0 @@
-1
\ No newline at end of file
-- 
GitLab