var app = new Vue({ el: '#app', data: { books: [], authors: [], series: [], booksCount: 0, page: 1, perpage: 20, sort_by: null, order_desc: false }, methods: { 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); }, indexSuccess: function(resp) { this.booksCount = resp.count; }, loadIndex: function() { this.sendQuery('cgi-bin/bouquins/index', this.stdError, this.indexSuccess); }, authorsSuccess: function(resp) { this.authors = resp; }, booksSuccess: function(resp) { this.books = resp; }, seriesSuccess: function(resp) { this.series = resp; }, sortBy: function(col) { if (this.sort_by == col) { if (this.order_desc) { this.order_desc = false; this.sort_by = null; } else { this.order_desc = true; } } else { this.order_desc = false; this.sort_by = col; } this.reload(); }, reload: function() { if (this.books.length > 0) this.loadBooks(); if (this.authors.length > 0) this.loadAuthors(); if (this.series.length > 0) this.loadSeries(); }, prevPage: function() { if (this.page > 1) { this.page--; this.reload(); } }, nextPage: function() { this.page++; this.reload(); }, order: function(query) { if (this.order_desc) return query + '&order=desc'; return query; }, sort: function(query) { if (this.sort_by) return query + '&sort=' + this.sort_by; return query; }, paginate: function(query) { return query + '?page=' + this.page + '&perpage=' + this.perpage; }, params: function(url) { return this.order(this.sort(this.paginate(url))); }, loadAuthors: function() { this.sendQuery(this.params('cgi-bin/bouquins/authors'), this.stdError, this.authorsSuccess); }, loadBooks: function() { this.sendQuery(this.params('cgi-bin/bouquins/books'), this.stdError, this.booksSuccess); }, loadSeries: function() { this.sendQuery(this.params('cgi-bin/bouquins/series'), this.stdError, this.seriesSuccess); }, showSeries: function() { this.books = []; this.authors = []; this.page = 1; this.perpage = 20; this.order_desc = false; this.sort_by = null; this.loadSeries(); }, showAuthors: function() { this.books = []; this.series = []; this.page = 1; this.perpage = 20; this.order_desc = false; this.sort_by = null; this.loadAuthors(); }, showBooks: function() { this.authors = []; this.series = []; this.page = 1; this.perpage = 20; this.order_desc = false; this.sort_by = null; this.loadBooks(); } }, mounted: function() { this.loadIndex(); } })