NIHVIVO-2343 Refactoring the URL and Query up another level.
This commit is contained in:
parent
13a1074602
commit
3f266924b4
2 changed files with 110 additions and 73 deletions
|
@ -73,3 +73,79 @@ function proxyInfoElement(template, uri, label, classLabel, imageUrl, existing)
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* proxyAutoComplete
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* Attach the autocomplete funcionality that we like in proxy panels.
|
||||||
|
*
|
||||||
|
* You provide:
|
||||||
|
* parms -- a map containing the URL of the AJAX controller, the query, and
|
||||||
|
* the model selector.
|
||||||
|
* getProxyInfos -- a function that will return an array of proxyInfoElements
|
||||||
|
* that are already present in the list and so should be filtered out of
|
||||||
|
* the autocomplete response.
|
||||||
|
* addProxyInfo -- a function that we can call when an item is selected.
|
||||||
|
* It will take the uri, label, classLabel, and imageUrl, build a
|
||||||
|
* proxyInfoElement, and add it to the panel.
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* Before executing the AJAX request, the query from the parms map will be modified,
|
||||||
|
* replacing "%term%" with the current search term.
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* The functionality includes:
|
||||||
|
* -- fetching data for the autocomplete list.
|
||||||
|
* -- cacheing the fetched data
|
||||||
|
* -- filtering as described above.
|
||||||
|
* -- calling addProxyInfo() and clearing the field when a value is selected.
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
function proxyAutocomplete(parms, getProxyInfos, addProxyInfo) {
|
||||||
|
var cache = [];
|
||||||
|
|
||||||
|
var filterResults = function(parsed) {
|
||||||
|
var filtered = [];
|
||||||
|
var existingUris = $.map(getProxyInfos(), function(p) {
|
||||||
|
return p.uri;
|
||||||
|
});
|
||||||
|
$.each(parsed, function(i, p) {
|
||||||
|
if (-1 == $.inArray(p.uri, existingUris)) {
|
||||||
|
filtered.push(p);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return filtered;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.minLength = 3,
|
||||||
|
|
||||||
|
this.source = function(request, response) {
|
||||||
|
if (request.term in cache) {
|
||||||
|
var filtered = filterResults(cache[request.term]);
|
||||||
|
response(filtered);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url: parms.url,
|
||||||
|
dataType: 'json',
|
||||||
|
data: {
|
||||||
|
model: parms.model,
|
||||||
|
query: parms.query.replace("%term%", request.term)
|
||||||
|
},
|
||||||
|
complete: function(xhr, status) {
|
||||||
|
var results = $.parseJSON(xhr.responseText);
|
||||||
|
var parsed = sparqlUtils.parseSparqlResults(results);
|
||||||
|
cache[request.term] = parsed;
|
||||||
|
var filtered = filterResults(parsed);
|
||||||
|
response(filtered);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
this.select = function(event, ui) {
|
||||||
|
addProxyInfo(ui.item.uri, ui.item.label, ui.item.classLabel, ui.item.imageUrl);
|
||||||
|
event.preventDefault();
|
||||||
|
event.target.value = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,21 @@
|
||||||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
function proxyProxiesPanel(p) {
|
function proxyProxiesPanel(p) {
|
||||||
|
var query = "PREFIX fn: <http://www.w3.org/2005/xpath-functions#> \n"
|
||||||
|
+ "PREFIX auth: <http://vitro.mannlib.cornell.edu/ns/vitro/authorization#> \n"
|
||||||
|
+ "\n"
|
||||||
|
+ "SELECT DISTINCT ?uri ?label ?externalAuthId \n"
|
||||||
|
+ "WHERE { \n"
|
||||||
|
+ " ?uri a auth:UserAccount ; \n"
|
||||||
|
+ " auth:firstName ?firstName ; \n"
|
||||||
|
+ " auth:lastName ?lastName . \n"
|
||||||
|
+ " LET ( ?label := fn:concat(?lastName, ', ', ?firstName) )"
|
||||||
|
+ " OPTIONAL { ?uri auth:externalAuthId ?externalAuthId } \n"
|
||||||
|
+ " FILTER (REGEX(?label, '^%term%', 'i')) \n"
|
||||||
|
+ "} \n"
|
||||||
|
+ "ORDER BY ASC(?lastName) ASC(?firstName) \n"
|
||||||
|
+ "LIMIT 25 \n";
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
this.disableFormInUnsupportedBrowsers = function() {
|
this.disableFormInUnsupportedBrowsers = function() {
|
||||||
|
@ -45,10 +60,6 @@ function proxyProxiesPanel(p) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setupAutoCompleteFields = function() {
|
|
||||||
this.addAutoCompleteField.autocomplete(new proxyAutocomplete(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.disableFormInUnsupportedBrowsers()) {
|
if (this.disableFormInUnsupportedBrowsers()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -60,76 +71,26 @@ function proxyProxiesPanel(p) {
|
||||||
this.parseProxyTemplate();
|
this.parseProxyTemplate();
|
||||||
this.parseProxyData();
|
this.parseProxyData();
|
||||||
this.displayProxyData();
|
this.displayProxyData();
|
||||||
this.setupAutoCompleteFields();
|
|
||||||
}
|
this.getProxyInfos = function() {
|
||||||
|
return self.proxyData;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.addProxyInfo = function(uri, label, junk1, junk2) {
|
||||||
|
self.proxyData.unshift(new proxyInfoElement(self.templateHtml, uri, label, "", "", false));
|
||||||
|
self.displayProxyData();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setupAutoCompleteFields = function() {
|
||||||
|
var parms = {
|
||||||
|
query: query,
|
||||||
|
model: "userAccounts",
|
||||||
|
url: '../ajax/sparqlQuery'
|
||||||
|
};
|
||||||
|
this.addAutoCompleteField.autocomplete(new proxyAutocomplete(parms, this.getProxyInfos, this.addProxyInfo));
|
||||||
|
}
|
||||||
|
|
||||||
function proxyAutocomplete(parent) {
|
this.setupAutoCompleteFields();
|
||||||
var cache = [];
|
|
||||||
|
|
||||||
var query = "PREFIX fn: <http://www.w3.org/2005/xpath-functions#> \n"
|
|
||||||
+ "PREFIX auth: <http://vitro.mannlib.cornell.edu/ns/vitro/authorization#> \n"
|
|
||||||
+ "\n"
|
|
||||||
+ "SELECT DISTINCT ?uri ?label ?externalAuthId \n"
|
|
||||||
+ "WHERE { \n"
|
|
||||||
+ " ?uri a auth:UserAccount ; \n"
|
|
||||||
+ " auth:firstName ?firstName ; \n"
|
|
||||||
+ " auth:lastName ?lastName . \n"
|
|
||||||
+ " LET ( ?label := fn:concat(?lastName, ', ', ?firstName) )"
|
|
||||||
+ " OPTIONAL { ?uri auth:externalAuthId ?externalAuthId } \n"
|
|
||||||
+ " FILTER (REGEX(?label, '^%term%', 'i')) \n"
|
|
||||||
+ "} \n"
|
|
||||||
+ "ORDER BY ASC(?lastName) ASC(?firstName) \n"
|
|
||||||
+ "LIMIT 25 \n";
|
|
||||||
|
|
||||||
var filterResults = function(parsed, data) {
|
|
||||||
var filtered = [];
|
|
||||||
for (var p = 0; p < parsed.length; p++) {
|
|
||||||
var dupe = false;
|
|
||||||
for (var d = 0; d < data.length; d++) {
|
|
||||||
if (data[d].uri == parsed[p].uri) {
|
|
||||||
dupe = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!dupe) {
|
|
||||||
filtered.push(parsed[p]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return filtered;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.minLength = 3,
|
|
||||||
|
|
||||||
this.source = function(request, response) {
|
|
||||||
if (request.term in cache) {
|
|
||||||
var filtered = filterResults(cache[request.term], parent.proxyData);
|
|
||||||
response(filtered);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$.ajax({
|
|
||||||
url: '../ajax/sparqlQuery',
|
|
||||||
dataType: 'json',
|
|
||||||
data: {
|
|
||||||
query: query.replace("%term%", request.term),
|
|
||||||
model: "userAccounts"
|
|
||||||
},
|
|
||||||
complete: function(xhr, status) {
|
|
||||||
var results = $.parseJSON(xhr.responseText);
|
|
||||||
var parsed = sparqlUtils.parseSparqlResults(results);
|
|
||||||
cache[request.term] = parsed;
|
|
||||||
var filtered = filterResults(parsed, parent.proxyData);
|
|
||||||
response(filtered);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
this.select = function(event, ui) {
|
|
||||||
parent.proxyData.unshift(new proxyInfoElement(parent.templateHtml, ui.item.uri, ui.item.label, "", "", false));
|
|
||||||
parent.displayProxyData();
|
|
||||||
event.preventDefault();
|
|
||||||
event.target.value = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
|
Loading…
Add table
Reference in a new issue