From 79bbf23886689c61cbd40447ebb9faab4c2c9b2c Mon Sep 17 00:00:00 2001 From: Ryan Herbert Date: Fri, 13 Oct 2017 11:16:01 +0200 Subject: [PATCH 1/3] refactor autocomplete module to be more generic Some of the variable names were specific to tag usage. But we want to expand this to be able to apply the same code to more uses. --- browser/js/autocomplete.js | 74 ++++++++++--------- browser/js/info.js | 2 +- browser/js/main.js | 2 +- .../applications/vidjil/controllers/tag.py | 4 +- .../applications/vidjil/views/file/add.html | 2 +- .../applications/vidjil/views/file/edit.html | 2 +- .../vidjil/views/patient/add.html | 2 +- .../vidjil/views/patient/edit.html | 2 +- .../applications/vidjil/views/run/add.html | 2 +- .../applications/vidjil/views/run/edit.html | 2 +- .../vidjil/views/sample_set/add.html | 2 +- .../vidjil/views/sample_set/all.html | 2 +- .../vidjil/views/sample_set/custom.html | 2 +- .../vidjil/views/sample_set/edit.html | 2 +- 14 files changed, 54 insertions(+), 48 deletions(-) diff --git a/browser/js/autocomplete.js b/browser/js/autocomplete.js index 2f604d400..b547feb2d 100644 --- a/browser/js/autocomplete.js +++ b/browser/js/autocomplete.js @@ -28,6 +28,7 @@ function VidjilAutoComplete(datasource) { } this.datasource = datasource; + this.dataUrls = {}; this.isLoadingData = {}; this.cachedData = {}; this.loadedGroups = []; @@ -64,24 +65,28 @@ VidjilAutoComplete.prototype = { this.cachedData = {}; }, - isLoaded : function(group_ids) { - // this.loadedGroups is sorted on assignment - if (this.loadedGroups.length !== group_ids.length) { + isLoaded : function(keys) { + // this.loadedData is sorted on assignment + if (this.loadedData.length !== group_ids.length) { return false; } - var sorted_groups = group_ids.sort(); - for (var i = 0; i < this.loadedGroups.length; i++) { - if (this.loadedGroups[i] !== sorted_groups[i]) { + var sorted_keys = keys.sort(); + for (var i = 0; i < this.loadedData.length; i++) { + if (this.loadedData[i] !== sorted_keys[i]) { return false; } } return true; }, - setupAtWho: function(input) { + setupTags: function(input) { + this.setupAtWho(input, this.atWhoTags); + }, + + setupAtWho: function(input, callback) { var $input = $(input); if ($input.data('needs-atwho')) { - $input.off('focus.setupAtWho').on('focus.setupAtWho', this.setupTags.bind(this, $input)); + $input.off('focus.setupAtWho').on('focus.setupAtWho', callback.bind(this, $input)); $input.on('change.atwho', function() { input.dispatchEvent(new Event('input'))}); // This triggers at.js again // Needed for quick actions with suffixes (ex: /label ~) @@ -94,10 +99,11 @@ VidjilAutoComplete.prototype = { } }, - setupTags : function($input) { + atWhoTags : function($input) { var self = this; var at = '#'; this.initCache(at); + this.dataUrls[at] = this.datasource.db_address + 'tag/auto_complete'; $input.atwho({ at: at, alias: 'tags', @@ -113,19 +119,19 @@ VidjilAutoComplete.prototype = { var isLoaded = this.isLoaded.bind(this); var callbacks = { filter : function(query, data, searchKey) { - var group_ids = this.$inputor.data('group-ids'); - if (VidjilAutoComplete.isLoading(data) || !isLoaded(group_ids)) { + var keys = this.$inputor.data('keys'); + if (VidjilAutoComplete.isLoading(data) || !isLoaded(keys)) { this.$inputor.atwho('load', this.at, VidjilAutoComplete.defaultLoadingData); - fetchData(this.$inputor, this.at, group_ids); + fetchData(this.$inputor, this.at, keys); return data; } return $.fn.atwho.default.callbacks.filter(query, data, searchKey); }, - beforeSave: function(tags) { - if (tags.length == 1 && tags[0] == VidjilAutoComplete.defaultLoadingData[0]) { - return tags; + beforeSave: function(data) { + if (data.length == 1 && data[0] == VidjilAutoComplete.defaultLoadingData[0]) { + return data; } - return $.map(tags, function(i) { + return $.map(data, function(i) { if (i.name === null) { return i; } @@ -150,17 +156,17 @@ VidjilAutoComplete.prototype = { return callbacks; }, - fetchData : function($input, at, group_ids) { + fetchData : function($input, at, keys) { var self = this; if (this.isLoadingData[at]) return; this.isLoadingData[at] = true; var uncached = []; - for (var i = 0; i < group_ids.length; i++) { - var group_id = group_ids[i]; - if (!this.cachedData[at][group_id]) { - uncached.push(group_id); - //this.loadData($input, at, this.cachedData[at][group_id], group_id); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!this.cachedData[at][key]) { + uncached.push(key); + //this.loadData($input, at, this.cachedData[at][key], key); } } @@ -168,39 +174,39 @@ VidjilAutoComplete.prototype = { $.ajax({ type: "GET", data: { - group_ids: JSON.stringify(uncached) + keys: JSON.stringify(uncached) }, timeout: 5000, crossDomain: true, - url: self.datasource, + url: self.dataUrls[at], success: function (data) { var my_data = JSON.parse(data); self.cacheData(at, my_data, uncached); - self.loadData($input, at, group_ids); + self.loadData($input, at, keys); }, error: function (request, status, error) { self.isLoadingData[at] = false; } }); } else { - this.loadData($input, at, group_ids); + this.loadData($input, at, keys); } }, - cacheData : function(at, data, group_ids) { - for (var i = 0; i < group_ids.length; i++) { - var group_id = group_ids[i]; - this.cachedData[at][group_id] = data[group_id] ? data[group_id] : []; + cacheData : function(at, data, keys) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + this.cachedData[at][key] = data[key] ? data[key] : []; } }, - loadData : function($input, at, group_ids) { + loadData : function($input, at, keys) { this.isLoadingData[at] = false; - this.loadedGroups = group_ids.sort(); + this.loadedData = keys.sort(); var loaded_data = []; - for (var i = 0; i < this.loadedGroups.length; i++) { - loaded_data = loaded_data.concat(this.cachedData[at][this.loadedGroups[i]]); + for (var i = 0; i < this.loadedData.length; i++) { + loaded_data = loaded_data.concat(this.cachedData[at][this.loadedData[i]]); } // remove duplicates diff --git a/browser/js/info.js b/browser/js/info.js index d52a7f57d..b96223051 100644 --- a/browser/js/info.js +++ b/browser/js/info.js @@ -321,7 +321,7 @@ Info.prototype = { $(textarea).data('group-ids', [this.m.group_id]); $(textarea).data('needs-atwho', true); $(textarea).on('focus', function() { - new VidjilAutoComplete().setupAtWho(this); + new VidjilAutoComplete().setupTags(this); }) container.appendChild(textarea); diff --git a/browser/js/main.js b/browser/js/main.js index 40ca66744..31d66e019 100644 --- a/browser/js/main.js +++ b/browser/js/main.js @@ -91,7 +91,7 @@ try { //TODO initMenu(); - new VidjilAutoComplete(db.db_address + 'tag/auto_complete'); + new VidjilAutoComplete(db); } catch(err) { this.db.log_error(err) } diff --git a/server/web2py/applications/vidjil/controllers/tag.py b/server/web2py/applications/vidjil/controllers/tag.py index 9b670bc12..739762ce6 100644 --- a/server/web2py/applications/vidjil/controllers/tag.py +++ b/server/web2py/applications/vidjil/controllers/tag.py @@ -7,11 +7,11 @@ if request.env.http_origin: response.headers['Access-Control-Max-Age'] = 86400 def auto_complete(): - if "group_ids" not in request.vars: + if "keys" not in request.vars: return error_message("missing group ids") prefix = get_tag_prefix() - group_ids = json.loads(request.vars["group_ids"]) + group_ids = json.loads(request.vars["keys"]) tags = get_tags(db, group_ids) return tags_to_json(tags) diff --git a/server/web2py/applications/vidjil/views/file/add.html b/server/web2py/applications/vidjil/views/file/add.html index d145efca6..3429d4e9f 100644 --- a/server/web2py/applications/vidjil/views/file/add.html +++ b/server/web2py/applications/vidjil/views/file/add.html @@ -93,7 +93,7 @@ {{ if 3 not in group_ids:}} {{group_ids.append(3)}} {{pass}} - + diff --git a/server/web2py/applications/vidjil/views/file/edit.html b/server/web2py/applications/vidjil/views/file/edit.html index 2e2476703..e27c961ef 100644 --- a/server/web2py/applications/vidjil/views/file/edit.html +++ b/server/web2py/applications/vidjil/views/file/edit.html @@ -101,7 +101,7 @@ info = db.sequence_file[request.vars["id"]] {{ if 3 not in group_ids:}} {{group_ids.append(3)}} {{pass}} - + diff --git a/server/web2py/applications/vidjil/views/patient/add.html b/server/web2py/applications/vidjil/views/patient/add.html index eb6fba2ac..d3eb24fba 100644 --- a/server/web2py/applications/vidjil/views/patient/add.html +++ b/server/web2py/applications/vidjil/views/patient/add.html @@ -32,7 +32,7 @@ - + diff --git a/server/web2py/applications/vidjil/views/patient/edit.html b/server/web2py/applications/vidjil/views/patient/edit.html index 42dec34c8..47e67192c 100644 --- a/server/web2py/applications/vidjil/views/patient/edit.html +++ b/server/web2py/applications/vidjil/views/patient/edit.html @@ -30,7 +30,7 @@ info = db.patient[request.vars["id"]] - + diff --git a/server/web2py/applications/vidjil/views/run/add.html b/server/web2py/applications/vidjil/views/run/add.html index a84850e73..614edeaeb 100644 --- a/server/web2py/applications/vidjil/views/run/add.html +++ b/server/web2py/applications/vidjil/views/run/add.html @@ -27,7 +27,7 @@ - + diff --git a/server/web2py/applications/vidjil/views/run/edit.html b/server/web2py/applications/vidjil/views/run/edit.html index b9781c70f..4082224c7 100644 --- a/server/web2py/applications/vidjil/views/run/edit.html +++ b/server/web2py/applications/vidjil/views/run/edit.html @@ -25,7 +25,7 @@ info = db.run[request.vars["id"]] - + diff --git a/server/web2py/applications/vidjil/views/sample_set/add.html b/server/web2py/applications/vidjil/views/sample_set/add.html index 2b6273be5..27f30286f 100644 --- a/server/web2py/applications/vidjil/views/sample_set/add.html +++ b/server/web2py/applications/vidjil/views/sample_set/add.html @@ -17,7 +17,7 @@ - + diff --git a/server/web2py/applications/vidjil/views/sample_set/all.html b/server/web2py/applications/vidjil/views/sample_set/all.html index 67689d20e..3bf3fceaf 100644 --- a/server/web2py/applications/vidjil/views/sample_set/all.html +++ b/server/web2py/applications/vidjil/views/sample_set/all.html @@ -9,7 +9,7 @@
search
diff --git a/server/web2py/applications/vidjil/views/sample_set/custom.html b/server/web2py/applications/vidjil/views/sample_set/custom.html index a9fb6dcc0..3448747f3 100644 --- a/server/web2py/applications/vidjil/views/sample_set/custom.html +++ b/server/web2py/applications/vidjil/views/sample_set/custom.html @@ -21,7 +21,7 @@ onchange="db.call('sample_set/custom', {'config_id' : '{{=request.vars["config_id"]}}', 'filter' : this.value, 'custom_list' : db.getListInput('custom_result[]')} )" - onfocus="new VidjilAutoComplete().setupAtWho(this);" + onfocus="new VidjilAutoComplete().setupTags(this);" data-needs-atwho="true" data-group-ids="{{=group_ids}}"> diff --git a/server/web2py/applications/vidjil/views/sample_set/edit.html b/server/web2py/applications/vidjil/views/sample_set/edit.html index 0bddc1855..f3bd897f2 100644 --- a/server/web2py/applications/vidjil/views/sample_set/edit.html +++ b/server/web2py/applications/vidjil/views/sample_set/edit.html @@ -15,7 +15,7 @@ info = db.generic[request.vars["id"]] - + -- GitLab From f4a807e91ef1a9c85aa730497b414365fd186f3b Mon Sep 17 00:00:00 2001 From: Ryan Herbert Date: Fri, 13 Oct 2017 11:40:51 +0200 Subject: [PATCH 2/3] rename group-ids data attribute in views for tags --- browser/js/info.js | 2 +- server/web2py/applications/vidjil/views/file/add.html | 2 +- server/web2py/applications/vidjil/views/file/edit.html | 2 +- server/web2py/applications/vidjil/views/patient/add.html | 2 +- server/web2py/applications/vidjil/views/patient/edit.html | 2 +- server/web2py/applications/vidjil/views/run/add.html | 2 +- server/web2py/applications/vidjil/views/run/edit.html | 2 +- server/web2py/applications/vidjil/views/sample_set/add.html | 2 +- server/web2py/applications/vidjil/views/sample_set/all.html | 2 +- server/web2py/applications/vidjil/views/sample_set/custom.html | 2 +- server/web2py/applications/vidjil/views/sample_set/edit.html | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/browser/js/info.js b/browser/js/info.js index b96223051..714cb432a 100644 --- a/browser/js/info.js +++ b/browser/js/info.js @@ -318,7 +318,7 @@ Info.prototype = { textarea.innerHTML = info ; textarea.setAttribute('placeholder', placeholder); - $(textarea).data('group-ids', [this.m.group_id]); + $(textarea).data('keys', [this.m.group_id]); $(textarea).data('needs-atwho', true); $(textarea).on('focus', function() { new VidjilAutoComplete().setupTags(this); diff --git a/server/web2py/applications/vidjil/views/file/add.html b/server/web2py/applications/vidjil/views/file/add.html index 3429d4e9f..f338f4fc7 100644 --- a/server/web2py/applications/vidjil/views/file/add.html +++ b/server/web2py/applications/vidjil/views/file/add.html @@ -93,7 +93,7 @@ {{ if 3 not in group_ids:}} {{group_ids.append(3)}} {{pass}} - + diff --git a/server/web2py/applications/vidjil/views/file/edit.html b/server/web2py/applications/vidjil/views/file/edit.html index e27c961ef..55c4d0b50 100644 --- a/server/web2py/applications/vidjil/views/file/edit.html +++ b/server/web2py/applications/vidjil/views/file/edit.html @@ -101,7 +101,7 @@ info = db.sequence_file[request.vars["id"]] {{ if 3 not in group_ids:}} {{group_ids.append(3)}} {{pass}} - + diff --git a/server/web2py/applications/vidjil/views/patient/add.html b/server/web2py/applications/vidjil/views/patient/add.html index d3eb24fba..9ac77364e 100644 --- a/server/web2py/applications/vidjil/views/patient/add.html +++ b/server/web2py/applications/vidjil/views/patient/add.html @@ -32,7 +32,7 @@ - + diff --git a/server/web2py/applications/vidjil/views/patient/edit.html b/server/web2py/applications/vidjil/views/patient/edit.html index 47e67192c..86cb7ca15 100644 --- a/server/web2py/applications/vidjil/views/patient/edit.html +++ b/server/web2py/applications/vidjil/views/patient/edit.html @@ -30,7 +30,7 @@ info = db.patient[request.vars["id"]] - + diff --git a/server/web2py/applications/vidjil/views/run/add.html b/server/web2py/applications/vidjil/views/run/add.html index 614edeaeb..038b629e2 100644 --- a/server/web2py/applications/vidjil/views/run/add.html +++ b/server/web2py/applications/vidjil/views/run/add.html @@ -27,7 +27,7 @@ - + diff --git a/server/web2py/applications/vidjil/views/run/edit.html b/server/web2py/applications/vidjil/views/run/edit.html index 4082224c7..5e1ce7a2a 100644 --- a/server/web2py/applications/vidjil/views/run/edit.html +++ b/server/web2py/applications/vidjil/views/run/edit.html @@ -25,7 +25,7 @@ info = db.run[request.vars["id"]] - + diff --git a/server/web2py/applications/vidjil/views/sample_set/add.html b/server/web2py/applications/vidjil/views/sample_set/add.html index 27f30286f..1016e2644 100644 --- a/server/web2py/applications/vidjil/views/sample_set/add.html +++ b/server/web2py/applications/vidjil/views/sample_set/add.html @@ -17,7 +17,7 @@ - + diff --git a/server/web2py/applications/vidjil/views/sample_set/all.html b/server/web2py/applications/vidjil/views/sample_set/all.html index 3bf3fceaf..f331d91d2 100644 --- a/server/web2py/applications/vidjil/views/sample_set/all.html +++ b/server/web2py/applications/vidjil/views/sample_set/all.html @@ -10,7 +10,7 @@ search + data-needs-atwho="true" data-keys="{{=group_ids}}"> diff --git a/server/web2py/applications/vidjil/views/sample_set/custom.html b/server/web2py/applications/vidjil/views/sample_set/custom.html index 3448747f3..f7b63de92 100644 --- a/server/web2py/applications/vidjil/views/sample_set/custom.html +++ b/server/web2py/applications/vidjil/views/sample_set/custom.html @@ -22,7 +22,7 @@ 'filter' : this.value, 'custom_list' : db.getListInput('custom_result[]')} )" onfocus="new VidjilAutoComplete().setupTags(this);" - data-needs-atwho="true" data-group-ids="{{=group_ids}}"> + data-needs-atwho="true" data-keys="{{=group_ids}}"> diff --git a/server/web2py/applications/vidjil/views/sample_set/edit.html b/server/web2py/applications/vidjil/views/sample_set/edit.html index f3bd897f2..af14754e3 100644 --- a/server/web2py/applications/vidjil/views/sample_set/edit.html +++ b/server/web2py/applications/vidjil/views/sample_set/edit.html @@ -15,7 +15,7 @@ info = db.generic[request.vars["id"]] - + -- GitLab From 4a3a937c2d7a6167fdd9eb24b812b17dedded32f Mon Sep 17 00:00:00 2001 From: Ryan Herbert Date: Fri, 13 Oct 2017 11:42:54 +0200 Subject: [PATCH 3/3] autocomplete.js missed an occurence of group_ids reference --- browser/js/autocomplete.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/js/autocomplete.js b/browser/js/autocomplete.js index b547feb2d..92cfca245 100644 --- a/browser/js/autocomplete.js +++ b/browser/js/autocomplete.js @@ -67,7 +67,7 @@ VidjilAutoComplete.prototype = { isLoaded : function(keys) { // this.loadedData is sorted on assignment - if (this.loadedData.length !== group_ids.length) { + if (this.loadedData.length !== keys.length) { return false; } var sorted_keys = keys.sort(); -- GitLab