First Pass At AlbumStudio Page, Also Fixes Monitoring (#16)
* First Pass At AlbumPass Page, Also Fixes Monitoring First Pass At AlbumPass Page, Also Fixes Monitoring * Catchy New Name, Fix Crash when visit Wanted Page Catchy New Name, Fix Crash when visit Wanted Page * Rename API to match Rename API to match * Get Bulk Monitoring Working on Album Studio Page Get Bulk Monitoring Working on Album Studio Page * Fix Wanted Query Fix Wanted Query * Codacy Codacy * Fix Cutoff Link To AlbumStudio Fix Cutoff Link To AlbumStudio * Add Header, Move Artist Monitor, Change Artist Column Heading Add Header, Move Artist Monitor, Change Artist Column Headingpull/20/head
parent
bb196e19e1
commit
dcde579a43
@ -0,0 +1,25 @@
|
||||
var _ = require('underscore');
|
||||
var Marionette = require('marionette');
|
||||
var SingleAlbumCell = require('./SingleAlbumCell');
|
||||
var AsSortedCollectionView = require('../Mixins/AsSortedCollectionView');
|
||||
|
||||
var view = Marionette.CollectionView.extend({
|
||||
|
||||
itemView : SingleAlbumCell,
|
||||
|
||||
initialize : function(options) {
|
||||
this.albumCollection = options.collection;
|
||||
this.artist = options.artist;
|
||||
},
|
||||
|
||||
itemViewOptions : function() {
|
||||
return {
|
||||
albumCollection : this.albumCollection,
|
||||
artist : this.artist
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
AsSortedCollectionView.call(view);
|
||||
|
||||
module.exports = view;
|
@ -0,0 +1,14 @@
|
||||
<h1>Album Studio</h1>
|
||||
<div id="x-toolbar"></div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="alert alert-info">Album Studio allows you to quickly change the monitored status of albums for all your artists in one place</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div id="x-artist"></div>
|
||||
</div>
|
||||
</div>
|
@ -0,0 +1,58 @@
|
||||
var $ = require('jquery');
|
||||
var _ = require('underscore');
|
||||
var vent = require('vent');
|
||||
var Marionette = require('marionette');
|
||||
var TemplatedCell = require('../Cells/TemplatedCell');
|
||||
var AlbumCollection = require('../Artist/AlbumCollection');
|
||||
var LoadingView = require('../Shared/LoadingView');
|
||||
var ArtistCollection = require('../Artist/ArtistCollection');
|
||||
var AlbumCollectionView = require('./AlbumStudioCollectionView');
|
||||
//require('../Handlebars/Helpers/Numbers');
|
||||
|
||||
module.exports = Marionette.Layout.extend({
|
||||
template : 'AlbumStudio/AlbumsCellTemplate',
|
||||
|
||||
regions : {
|
||||
albums : '#albums'
|
||||
},
|
||||
|
||||
initialize : function() {
|
||||
this.artistCollection = ArtistCollection.clone();
|
||||
this.artistCollection.shadowCollection.bindSignalR();
|
||||
|
||||
this.listenTo(this.model, 'change:monitored', this._setMonitoredState);
|
||||
this.listenTo(this.model, 'remove', this._artistRemoved);
|
||||
this.listenTo(vent, vent.Events.CommandComplete, this._commandComplete);
|
||||
|
||||
this.listenTo(this.model, 'change', function(model, options) {
|
||||
if (options && options.changeSource === 'signalr') {
|
||||
this._refresh();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
onRender : function(){
|
||||
this._showAlbums();
|
||||
},
|
||||
|
||||
_showAlbums : function() {
|
||||
var self = this;
|
||||
|
||||
this.albums.show(new LoadingView());
|
||||
|
||||
this.albumCollection = new AlbumCollection({ artistId : this.model.id }).bindSignalR();
|
||||
|
||||
$.when(this.albumCollection.fetch()).done(function() {
|
||||
var albumCollectionView = new AlbumCollectionView({
|
||||
collection : self.albumCollection,
|
||||
artist : self.model
|
||||
});
|
||||
|
||||
if (!self.isClosed) {
|
||||
self.albums.show(albumCollectionView);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
});
|
@ -0,0 +1 @@
|
||||
<div id="albums" class="artist-albums"></div>
|
@ -0,0 +1,64 @@
|
||||
var vent = require('vent');
|
||||
var Marionette = require('marionette');
|
||||
var Backgrid = require('backgrid');
|
||||
var ToggleCell = require('../Cells/TrackMonitoredCell');
|
||||
var CommandController = require('../Commands/CommandController');
|
||||
var moment = require('moment');
|
||||
var _ = require('underscore');
|
||||
var Messenger = require('../Shared/Messenger');
|
||||
|
||||
module.exports = Marionette.Layout.extend({
|
||||
template : 'AlbumStudio/SingleAlbumCellTemplate',
|
||||
|
||||
ui : {
|
||||
albumMonitored : '.x-album-monitored'
|
||||
},
|
||||
|
||||
events : {
|
||||
'click .x-album-monitored' : '_albumMonitored'
|
||||
},
|
||||
|
||||
|
||||
initialize : function(options) {
|
||||
this.artist = options.artist;
|
||||
this.listenTo(this.model, 'sync', this._afterAlbumMonitored);
|
||||
|
||||
},
|
||||
|
||||
onRender : function() {
|
||||
this._setAlbumMonitoredState();
|
||||
},
|
||||
|
||||
_albumMonitored : function() {
|
||||
if (!this.artist.get('monitored')) {
|
||||
|
||||
Messenger.show({
|
||||
message : 'Unable to change monitored state when artist is not monitored',
|
||||
type : 'error'
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var savePromise = this.model.save('monitored', !this.model.get('monitored'), { wait : true });
|
||||
|
||||
this.ui.albumMonitored.spinForPromise(savePromise);
|
||||
},
|
||||
|
||||
_afterAlbumMonitored : function() {
|
||||
this.render();
|
||||
},
|
||||
|
||||
_setAlbumMonitoredState : function() {
|
||||
this.ui.albumMonitored.removeClass('icon-lidarr-spinner fa-spin');
|
||||
|
||||
if (this.model.get('monitored')) {
|
||||
this.ui.albumMonitored.addClass('icon-lidarr-monitored');
|
||||
this.ui.albumMonitored.removeClass('icon-lidarr-unmonitored');
|
||||
} else {
|
||||
this.ui.albumMonitored.addClass('icon-lidarr-unmonitored');
|
||||
this.ui.albumMonitored.removeClass('icon-lidarr-monitored');
|
||||
}
|
||||
}
|
||||
|
||||
});
|
@ -0,0 +1,30 @@
|
||||
{{#if_eq statistics.totalTrackCount compare=0}}
|
||||
<span class="album album-unaired">
|
||||
{{else}}
|
||||
{{#if_eq statistics.percentOfTracks compare=100}}
|
||||
<span class="album album-all">
|
||||
{{else}}
|
||||
<span class="album album-partial">
|
||||
{{/if_eq}}
|
||||
{{/if_eq}}
|
||||
<span class="label">
|
||||
<span class="x-album-monitored album-monitored" title="Toggle album monitored status" data-album-number="{{seasonNumber}}">
|
||||
|
||||
</span>
|
||||
<span class="album-number">{{Pad2 title}}</span>
|
||||
</span><span class="label">
|
||||
{{#with statistics}}
|
||||
{{#if_eq trackCount compare=0}}
|
||||
<span class="album-status" title="No aired tracks"> </span>
|
||||
{{else}}
|
||||
{{#if_eq percentOfEpisodes compare=100}}
|
||||
<span class="album-status" title="{{trackFileCount}}/{{trackCount}} tracks downloaded">{{trackFileCount}}/{{trackCount}}</span>
|
||||
{{else}}
|
||||
<span class="album-status" title="{{trackFileCount}}/{{trackCount}} tracks downloaded">{{trackFileCount}}/{{trackCount}}</span>
|
||||
{{/if_eq}}
|
||||
{{/if_eq}}
|
||||
{{else}}
|
||||
<span class="album-status" title="No aired tracks"> </span>
|
||||
{{/with}}
|
||||
</span>
|
||||
</span>
|
@ -0,0 +1,39 @@
|
||||
var ToggleCell = require('./ToggleCell');
|
||||
var Handlebars = require('handlebars');
|
||||
|
||||
module.exports = ToggleCell.extend({
|
||||
className : 'artist-monitored-cell',
|
||||
|
||||
events : {
|
||||
'click i' : '_onClick'
|
||||
},
|
||||
|
||||
render : function() {
|
||||
|
||||
this.$el.empty();
|
||||
this.$el.html('<i /><a href=""><span class="artist-monitored-name"></span></a>');
|
||||
|
||||
var name = this.column.get('name');
|
||||
|
||||
if (this.model.get(name)) {
|
||||
this.$('i').addClass(this.column.get('trueClass'));
|
||||
} else {
|
||||
this.$('i').addClass(this.column.get('falseClass'));
|
||||
}
|
||||
|
||||
var link = "/artist/" + this.model.get('nameSlug');
|
||||
var artistName = this.model.get('name');
|
||||
|
||||
this.$('a').attr('href', link );
|
||||
this.$('span').html(artistName);
|
||||
|
||||
var tooltip = this.column.get('tooltip');
|
||||
|
||||
if (tooltip) {
|
||||
this.$('i').attr('title', tooltip);
|
||||
}
|
||||
|
||||
this.delegateEvents();
|
||||
return this;
|
||||
}
|
||||
});
|
@ -1,13 +0,0 @@
|
||||
<div id="x-toolbar"></div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="alert alert-info">Season Pass allows you to quickly change the monitored status of seasons for all your series in one place</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div id="x-series"></div>
|
||||
</div>
|
||||
</div>
|
@ -1,26 +0,0 @@
|
||||
var _ = require('underscore');
|
||||
var TemplatedCell = require('../Cells/TemplatedCell');
|
||||
//require('../Handlebars/Helpers/Numbers');
|
||||
|
||||
module.exports = TemplatedCell.extend({
|
||||
className : 'seasons-cell',
|
||||
template : 'SeasonPass/SeasonsCellTemplate',
|
||||
|
||||
events : {
|
||||
'click .x-season-monitored' : '_toggleSeasonMonitored'
|
||||
},
|
||||
|
||||
_toggleSeasonMonitored : function(e) {
|
||||
var target = this.$(e.target).closest('.x-season-monitored');
|
||||
var seasonNumber = parseInt(this.$(target).data('season-number'), 10);
|
||||
var icon = this.$(target).children('.x-season-monitored-icon');
|
||||
|
||||
this.model.setSeasonMonitored(seasonNumber);
|
||||
|
||||
//TODO: unbounce the save so we don't multiple to the server at the same time
|
||||
var savePromise = this.model.save();
|
||||
|
||||
icon.spinForPromise(savePromise);
|
||||
savePromise.always(this.render.bind(this));
|
||||
}
|
||||
});
|
@ -1,37 +0,0 @@
|
||||
{{#each seasons}}
|
||||
{{debug}}
|
||||
{{#if_eq statistics.totalEpisodeCount compare=0}}
|
||||
<span class="season season-unaired">
|
||||
{{else}}
|
||||
{{#if_eq statistics.percentOfEpisodes compare=100}}
|
||||
<span class="season season-all">
|
||||
{{else}}
|
||||
<span class="season season-partial">
|
||||
{{/if_eq}}
|
||||
{{/if_eq}}
|
||||
<span class="label">
|
||||
<span class="x-season-monitored season-monitored" title="Toggle season monitored status" data-season-number="{{seasonNumber}}">
|
||||
<i class="x-season-monitored-icon {{#if monitored}}icon-lidarr-monitored{{else}}icon-lidarr-unmonitored{{/if}}"/>
|
||||
</span>
|
||||
{{#if_eq seasonNumber compare="0"}}
|
||||
<span class="season-number">Specials</span>
|
||||
{{else}}
|
||||
<span class="season-number">S{{Pad2 seasonNumber}}</span>
|
||||
{{/if_eq}}
|
||||
</span><span class="label">
|
||||
{{#with statistics}}
|
||||
{{#if_eq totalEpisodeCount compare=0}}
|
||||
<span class="season-status" title="No aired episodes"> </span>
|
||||
{{else}}
|
||||
{{#if_eq percentOfEpisodes compare=100}}
|
||||
<span class="season-status" title="{{episodeFileCount}}/{{totalEpisodeCount}} episodes downloaded">{{episodeFileCount}}/{{totalEpisodeCount}}</span>
|
||||
{{else}}
|
||||
<span class="season-status" title="{{episodeFileCount}}/{{totalEpisodeCount}} episodes downloaded">{{episodeFileCount}}/{{totalEpisodeCount}}</span>
|
||||
{{/if_eq}}
|
||||
{{/if_eq}}
|
||||
{{else}}
|
||||
<span class="season-status" title="No aired episodes"> </span>
|
||||
{{/with}}
|
||||
</span>
|
||||
</span>
|
||||
{{/each}}
|
Loading…
Reference in new issue