You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
6.3 KiB
201 lines
6.3 KiB
var _ = require('underscore');
|
|
var reqres = require('../../reqres');
|
|
var Marionette = require('marionette');
|
|
var Backgrid = require('backgrid');
|
|
var FormatHelpers = require('../../Shared/FormatHelpers');
|
|
var SelectAllCell = require('../../Cells/SelectAllCell');
|
|
var EpisodeNumberCell = require('../../Series/Details/EpisodeNumberCell');
|
|
var SeasonEpisodeNumberCell = require('../../Cells/EpisodeNumberCell');
|
|
var EpisodeFilePathCell = require('../../Cells/EpisodeFilePathCell');
|
|
var EpisodeStatusCell = require('../../Cells/EpisodeStatusCell');
|
|
var RelativeDateCell = require('../../Cells/RelativeDateCell');
|
|
var EpisodeCollection = require('../../Series/EpisodeCollection');
|
|
var ProfileSchemaCollection = require('../../Settings/Profile/ProfileSchemaCollection');
|
|
var QualitySelectView = require('./QualitySelectView');
|
|
var EmptyView = require('./EmptyView');
|
|
|
|
module.exports = Marionette.Layout.extend({
|
|
className : 'modal-lg',
|
|
template : 'EpisodeFile/Editor/EpisodeFileEditorLayoutTemplate',
|
|
|
|
regions : {
|
|
episodeGrid : '.x-episode-list',
|
|
quality : '.x-quality'
|
|
},
|
|
|
|
ui : {
|
|
seasonMonitored : '.x-season-monitored'
|
|
},
|
|
|
|
events : {
|
|
'click .x-season-monitored' : '_seasonMonitored',
|
|
'click .x-delete-files' : '_deleteFiles'
|
|
},
|
|
|
|
initialize : function(options) {
|
|
if (!options.series) {
|
|
throw 'series is required';
|
|
}
|
|
|
|
if (!options.episodeCollection) {
|
|
throw 'episodeCollection is required';
|
|
}
|
|
|
|
var filtered = options.episodeCollection.filter(function(episode) {
|
|
return episode.get('episodeFileId') > 0;
|
|
});
|
|
|
|
this.series = options.series;
|
|
this.episodeCollection = options.episodeCollection;
|
|
this.filteredEpisodes = new EpisodeCollection(filtered);
|
|
|
|
this.templateHelpers = {};
|
|
this.templateHelpers.series = this.series.toJSON();
|
|
|
|
this._getColumns();
|
|
},
|
|
|
|
onRender : function() {
|
|
this._getQualities();
|
|
this._showEpisodes();
|
|
},
|
|
|
|
_getColumns : function () {
|
|
var episodeCell = {};
|
|
|
|
if (this.model) {
|
|
episodeCell.name = 'episodeNumber';
|
|
episodeCell.label = '#';
|
|
episodeCell.cell = EpisodeNumberCell;
|
|
}
|
|
|
|
else {
|
|
episodeCell.name = 'seasonEpisode';
|
|
episodeCell.cellValue = 'this';
|
|
episodeCell.label = 'Episode';
|
|
episodeCell.cell = SeasonEpisodeNumberCell;
|
|
episodeCell.sortValue = this._seasonEpisodeSorter;
|
|
}
|
|
|
|
this.columns = [
|
|
{
|
|
name : '',
|
|
cell : SelectAllCell,
|
|
headerCell : 'select-all',
|
|
sortable : false
|
|
},
|
|
episodeCell,
|
|
{
|
|
name : 'episodeNumber',
|
|
label : 'Relative Path',
|
|
cell : EpisodeFilePathCell,
|
|
sortable : false
|
|
},
|
|
{
|
|
name : 'airDateUtc',
|
|
label : 'Air Date',
|
|
cell : RelativeDateCell
|
|
},
|
|
{
|
|
name : 'status',
|
|
label : 'Quality',
|
|
cell : EpisodeStatusCell,
|
|
sortable : false
|
|
}
|
|
];
|
|
},
|
|
|
|
_showEpisodes : function() {
|
|
if (this.filteredEpisodes.length === 0) {
|
|
this.episodeGrid.show(new EmptyView());
|
|
return;
|
|
}
|
|
|
|
this._setInitialSort();
|
|
|
|
this.episodeGridView = new Backgrid.Grid({
|
|
columns : this.columns,
|
|
collection : this.filteredEpisodes,
|
|
className : 'table table-hover season-grid'
|
|
});
|
|
|
|
this.episodeGrid.show(this.episodeGridView);
|
|
},
|
|
|
|
_setInitialSort : function () {
|
|
if (!this.model) {
|
|
this.filteredEpisodes.setSorting('seasonEpisode', 1, { sortValue: this._seasonEpisodeSorter });
|
|
this.filteredEpisodes.fullCollection.sort();
|
|
}
|
|
},
|
|
|
|
_getQualities : function() {
|
|
var self = this;
|
|
|
|
var profileSchemaCollection = new ProfileSchemaCollection();
|
|
var promise = profileSchemaCollection.fetch();
|
|
|
|
promise.done(function() {
|
|
var profile = profileSchemaCollection.first();
|
|
|
|
self.qualitySelectView = new QualitySelectView({ qualities: _.map(profile.get('items'), 'quality') });
|
|
self.listenTo(self.qualitySelectView, 'seasonedit:quality', self._changeQuality);
|
|
|
|
self.quality.show(self.qualitySelectView);
|
|
});
|
|
},
|
|
|
|
_changeQuality : function(options) {
|
|
var newQuality = {
|
|
quality : options.selected,
|
|
revision : {
|
|
version : 1,
|
|
real : 0
|
|
}
|
|
};
|
|
|
|
var selected = this._getSelectedEpisodeFileIds();
|
|
|
|
_.each(selected, function(episodeFileId) {
|
|
if (reqres.hasHandler(reqres.Requests.GetEpisodeFileById)) {
|
|
var episodeFile = reqres.request(reqres.Requests.GetEpisodeFileById, episodeFileId);
|
|
episodeFile.set('quality', newQuality);
|
|
episodeFile.save();
|
|
}
|
|
});
|
|
},
|
|
|
|
_deleteFiles : function() {
|
|
if (!window.confirm('Are you sure you want to delete the episode files for the selected episodes?')) {
|
|
return;
|
|
}
|
|
|
|
var selected = this._getSelectedEpisodeFileIds();
|
|
|
|
_.each(selected, function(episodeFileId) {
|
|
if (reqres.hasHandler(reqres.Requests.GetEpisodeFileById)) {
|
|
var episodeFile = reqres.request(reqres.Requests.GetEpisodeFileById, episodeFileId);
|
|
|
|
episodeFile.destroy();
|
|
}
|
|
});
|
|
|
|
_.each(this.episodeGridView.getSelectedModels(), function(episode) {
|
|
this.episodeGridView.removeRow(episode);
|
|
}, this);
|
|
},
|
|
|
|
_getSelectedEpisodeFileIds: function () {
|
|
return _.uniq(_.map(this.episodeGridView.getSelectedModels(), function (episode) {
|
|
return episode.get('episodeFileId');
|
|
}));
|
|
},
|
|
|
|
_seasonEpisodeSorter : function (model, attr) {
|
|
var seasonNumber = FormatHelpers.pad(model.get('seasonNumber'), 4, 0);
|
|
var episodeNumber = FormatHelpers.pad(model.get('episodeNumber'), 4, 0);
|
|
|
|
return seasonNumber + episodeNumber;
|
|
}
|
|
});
|