1
0
mirror of https://github.com/danbee/mpd-client synced 2025-03-04 08:39:09 +00:00
mpd-client/assets/js/controls/library.js
2013-12-13 13:28:07 +00:00

89 lines
2.0 KiB
JavaScript

var Library = can.Control.extend({
init: function(element, options) {
this.element = element;
this.browser = new can.Model({ title: 'Library', pane: 1 });
element.html(
can.view('views/library.ejs', { browser: this.browser })
);
var rootControl = new Pane('#library .root', { show: 'root' });
this.panes = new can.List([rootControl]);
},
show: function() {
$(this.element).addClass('show');
},
hide: function() {
$(this.element).removeClass('show');
},
nextPane: function() {
this.browser.attr('pane', this.browser.attr('pane') + 1);
},
previousPane: function() {
this.browser.attr('pane', this.browser.attr('pane') - 1);
},
addPane: function(data) {
var newElement = document.createElement('div');
newElement.className = data.show;
$('.browser', this.element).append(newElement);
var newPane = new Pane(newElement, data);
this.panes.push(newPane);
this.nextPane();
},
'a.close click': 'hide',
'route': function(data) {
this.hide();
},
':page route': function(data) {
if (data.page == 'library') {
this.show();
if (data.show) {
this.addPane(data);
}
}
}
});
var Pane = can.Control.extend({
init: function(element, data) {
this.element = element;
this.data = data;
this.renderPane[data.show].call(this, data);
},
renderPane: {
root: function() {
this.element.html(
can.view('views/library/root.ejs', {})
);
},
artists: function(data) {
Artist.findAll({}, this.renderCallback('artists'));
},
albums: function(data) {
Album.findAll({ artist: data.artist }, this.renderCallback('albums'));
},
songs: function(data) {
Song.findAll({ artist: data.artist, album: data.album }, this.renderCallback('songs'));
}
},
renderCallback: function(type) {
return function(items) {
$(this.element).html(
can.view('views/library/' + type + '.ejs', { items: items })
);
}.bind(this)
}
});