137 lines
3.6 KiB
JavaScript
137 lines
3.6 KiB
JavaScript
|
var app = new Vue({
|
||
|
el: '#app',
|
||
|
data: {
|
||
|
urlParams: {},
|
||
|
authors: [],
|
||
|
books: [],
|
||
|
series: [],
|
||
|
authorsCount: 0,
|
||
|
booksCount: 0,
|
||
|
seriesCount: 0,
|
||
|
q: '',
|
||
|
which: 'all',
|
||
|
all: false,
|
||
|
perpage: 10
|
||
|
},
|
||
|
methods: {
|
||
|
urlParse: function() {
|
||
|
var match,
|
||
|
pl = /\+/g, // Regex for replacing addition symbol with a space
|
||
|
search = /([^&=]+)=?([^&]*)/g,
|
||
|
decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
|
||
|
query = window.location.search.substring(1);
|
||
|
while (match = search.exec(query))
|
||
|
this.urlParams[decode(match[1])] = decode(match[2]);
|
||
|
},
|
||
|
sendQuery: function(url, error, success) {
|
||
|
var xmh = new XMLHttpRequest();
|
||
|
var v;
|
||
|
|
||
|
xmh.onreadystatechange = function() {
|
||
|
v = xmh.responseText;
|
||
|
if (xmh.readyState === 4 && xmh.status === 200) {
|
||
|
var res;
|
||
|
try {
|
||
|
res = JSON.parse(v);
|
||
|
} catch (err) {
|
||
|
if (null !== error)
|
||
|
error(err.name, err.message);
|
||
|
}
|
||
|
if (null !== success)
|
||
|
success(res);
|
||
|
} else if (xmh.readyState === 4) {
|
||
|
if (null !== error)
|
||
|
error(xmh.status, v);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
xmh.open('GET', url, true);
|
||
|
xmh.send(null);
|
||
|
},
|
||
|
stdError: function(code, resp) {
|
||
|
console.log('ERROR ' + code + ': ' + resp);
|
||
|
},
|
||
|
searchParams: function(url) {
|
||
|
var res = url;
|
||
|
res += '?perpage=' + this.perpage;
|
||
|
for (var i=0; i<this.terms.length; i++) {
|
||
|
var t = this.terms[i];
|
||
|
if (t.trim())
|
||
|
res += '&term=' + encodeURIComponent(t.trim());
|
||
|
}
|
||
|
return res;
|
||
|
},
|
||
|
searchAuthorsSuccess: function(res) {
|
||
|
this.authorsCount = res.count;
|
||
|
this.authors = res.authors;
|
||
|
},
|
||
|
searchAuthors: function() {
|
||
|
this.sendQuery(this.searchParams('cgi-bin/bouquins/authors'), this.stdError, this.searchAuthorsSuccess);
|
||
|
},
|
||
|
searchBooksSuccess: function(res) {
|
||
|
this.booksCount = res.count;
|
||
|
this.books = res.books;
|
||
|
},
|
||
|
searchBooks: function() {
|
||
|
this.sendQuery(this.searchParams('cgi-bin/bouquins/books'), this.stdError, this.searchBooksSuccess);
|
||
|
},
|
||
|
searchSeriesSuccess: function(res) {
|
||
|
this.seriesCount = res.count;
|
||
|
this.series = res.series;
|
||
|
},
|
||
|
searchSeries: function() {
|
||
|
this.sendQuery(this.searchParams('cgi-bin/bouquins/series'), this.stdError, this.searchSeriesSuccess);
|
||
|
},
|
||
|
searchAll: function() {
|
||
|
this.clear();
|
||
|
this.searchAuthors();
|
||
|
this.searchBooks();
|
||
|
this.searchSeries();
|
||
|
},
|
||
|
clear: function() {
|
||
|
this.authors = [];
|
||
|
this.books = [];
|
||
|
this.series = [];
|
||
|
this.authorsCount = 0;
|
||
|
this.booksCount = 0;
|
||
|
this.seriesCount = 0;
|
||
|
},
|
||
|
searchFull: function() {
|
||
|
if (this.q) {
|
||
|
this.terms = this.q.split(' ');
|
||
|
switch (this.which) {
|
||
|
case 'all':
|
||
|
this.searchAll();
|
||
|
break;
|
||
|
case 'authors':
|
||
|
this.clear();
|
||
|
this.searchAuthors();
|
||
|
break;
|
||
|
case 'books':
|
||
|
this.clear();
|
||
|
this.searchBooks();
|
||
|
break;
|
||
|
case 'series':
|
||
|
this.clear();
|
||
|
this.searchSeries();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
},
|
||
|
searchUrl: function() {
|
||
|
if (this.urlParams.q) {
|
||
|
this.terms = this.urlParams.q.split(' ');
|
||
|
this.searchAll();
|
||
|
this.q = this.urlParams.q;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
created: function() {
|
||
|
this.urlParse();
|
||
|
},
|
||
|
mounted: function() {
|
||
|
this.searchUrl();
|
||
|
}
|
||
|
})
|