802eb628c8
Event and selectors appear to have been accidentally combined. The result is that typing in any input triggers a call to the `/get_matching_tags` route. We can probably limit the selector farther to only fire when `#tags` is typed into.
180 lines
4.6 KiB
JavaScript
180 lines
4.6 KiB
JavaScript
/**
|
|
* Created by SpeedProg on 05.04.2015.
|
|
*/
|
|
/* global Bloodhound */
|
|
|
|
|
|
/*
|
|
Takes a prefix, query typeahead callback, Bloodhound typeahead adapter
|
|
and returns the completions it gets from the bloodhound engine prefixed.
|
|
*/
|
|
function prefixedSource(prefix, query, cb, bhAdapter) {
|
|
bhAdapter(query, function(retArray){
|
|
var matches = [];
|
|
for (var i = 0; i < retArray.length; i++) {
|
|
var obj = {name : prefix + retArray[i].name};
|
|
matches.push(obj);
|
|
}
|
|
cb(matches);
|
|
});
|
|
}
|
|
function getPath(){
|
|
var jsFileLocation = $("script[src*=edit_books]").attr("src"); // the js file path
|
|
jsFileLocation = jsFileLocation.replace("/static/js/edit_books.js", ""); // the js folder path
|
|
return jsFileLocation;
|
|
}
|
|
|
|
var authors = new Bloodhound({
|
|
name: "authors",
|
|
datumTokenizer(datum) {
|
|
return [datum.name];
|
|
},
|
|
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
|
remote: {
|
|
url: getPath()+"/get_authors_json?q=%QUERY"
|
|
}
|
|
});
|
|
|
|
var series = new Bloodhound({
|
|
name: "series",
|
|
datumTokenizer(datum) {
|
|
return [datum.name];
|
|
},
|
|
queryTokenizer(query) {
|
|
return [query];
|
|
},
|
|
remote: {
|
|
url: getPath()+"/get_series_json?q=",
|
|
replace(url, query) {
|
|
return url+encodeURIComponent(query);
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
var tags = new Bloodhound({
|
|
name: "tags",
|
|
datumTokenizer(datum) {
|
|
return [datum.name];
|
|
},
|
|
queryTokenizer(query) {
|
|
var tokens = query.split(",");
|
|
tokens = [tokens[tokens.length-1].trim()];
|
|
return tokens;
|
|
},
|
|
remote: {
|
|
url: getPath()+"/get_tags_json?q=%QUERY"
|
|
}
|
|
});
|
|
|
|
var languages = new Bloodhound({
|
|
name: "languages",
|
|
datumTokenizer(datum) {
|
|
return [datum.name];
|
|
},
|
|
queryTokenizer(query) {
|
|
return [query];
|
|
},
|
|
remote: {
|
|
url: getPath()+"/get_languages_json?q=",
|
|
replace(url, query) {
|
|
return url+encodeURIComponent(query);
|
|
}
|
|
}
|
|
});
|
|
|
|
function sourceSplit(query, cb, split, source) {
|
|
var bhAdapter = source.ttAdapter();
|
|
|
|
var tokens = query.split(split);
|
|
var currentSource = tokens[tokens.length-1].trim();
|
|
|
|
tokens.splice(tokens.length-1, 1); // remove last element
|
|
var prefix = "";
|
|
var newSplit;
|
|
if (split === "&"){
|
|
newSplit = " " + split + " ";
|
|
}else{
|
|
newSplit = split + " ";
|
|
}
|
|
for (var i = 0; i < tokens.length; i++) {
|
|
prefix += tokens[i].trim() + newSplit;
|
|
}
|
|
prefixedSource(prefix, currentSource, cb, bhAdapter);
|
|
}
|
|
|
|
var promiseAuthors = authors.initialize();
|
|
promiseAuthors.done(function(){
|
|
$("#bookAuthor").typeahead(
|
|
{
|
|
highlight: true, minLength: 1,
|
|
hint: true
|
|
}, {
|
|
name: "authors",
|
|
displayKey: "name",
|
|
source(query, cb){
|
|
return sourceSplit(query, cb, "&", authors); //sourceSplit //("&")
|
|
}
|
|
});
|
|
});
|
|
|
|
var promiseSeries = series.initialize();
|
|
promiseSeries.done(function(){
|
|
$("#series").typeahead(
|
|
{
|
|
highlight: true, minLength: 0,
|
|
hint: true
|
|
}, {
|
|
name: "series",
|
|
displayKey: "name",
|
|
source: series.ttAdapter()
|
|
}
|
|
);
|
|
});
|
|
|
|
var promiseTags = tags.initialize();
|
|
promiseTags.done(function(){
|
|
$("#tags").typeahead(
|
|
{
|
|
highlight: true, minLength: 0,
|
|
hint: true
|
|
}, {
|
|
name: "tags",
|
|
displayKey: "name",
|
|
source(query, cb){
|
|
return sourceSplit(query, cb, ",", tags);
|
|
}
|
|
});
|
|
});
|
|
|
|
var promiseLanguages = languages.initialize();
|
|
promiseLanguages.done(function(){
|
|
$("#languages").typeahead(
|
|
{
|
|
highlight: true, minLength: 0,
|
|
hint: true
|
|
}, {
|
|
name: "languages",
|
|
displayKey: "name",
|
|
source(query, cb){
|
|
return sourceSplit(query, cb, ",", languages); //(",")
|
|
}
|
|
});
|
|
});
|
|
|
|
$("form").on("change", "input.typeahead:selected", function(){
|
|
var form = $("form").serialize();
|
|
$.getJSON( getPath()+"/get_matching_tags", form, function( data ) {
|
|
$(".tags_click").each(function() {
|
|
if ($.inArray(parseInt($(this).children("input").first().val(), 10), data.tags) === -1 ) {
|
|
if (!($(this).hasClass("active"))) {
|
|
$(this).addClass("disabled");
|
|
}
|
|
}
|
|
else {
|
|
$(this).removeClass("disabled");
|
|
}
|
|
});
|
|
});
|
|
});
|