diff --git a/src/UI/Episode/Activity/EpisodeActivityActionsCell.js b/src/UI/Episode/Activity/EpisodeActivityActionsCell.js index 759a2748c..d94bb490d 100644 --- a/src/UI/Episode/Activity/EpisodeActivityActionsCell.js +++ b/src/UI/Episode/Activity/EpisodeActivityActionsCell.js @@ -4,18 +4,28 @@ var Marionette = require('marionette'); var NzbDroneCell = require('../../Cells/NzbDroneCell'); module.exports = NzbDroneCell.extend({ - className : 'episode-actions-cell', - events : {"click .x-failed" : '_markAsFailed'}, - render : function(){ + className : 'episode-actions-cell', + + events : { + 'click .x-failed' : '_markAsFailed' + }, + + render : function() { this.$el.empty(); - if(this.model.get('eventType') === 'grabbed') { + + if (this.model.get('eventType') === 'grabbed') { this.$el.html(''); } + return this; }, - _markAsFailed : function(){ + + _markAsFailed : function() { var url = window.NzbDrone.ApiRoot + '/history/failed'; - var data = {id : this.model.get('id')}; + var data = { + id : this.model.get('id') + }; + $.ajax({ url : url, type : 'POST', diff --git a/src/UI/Episode/Activity/EpisodeActivityDetailsCell.js b/src/UI/Episode/Activity/EpisodeActivityDetailsCell.js index 7588c5092..b90b05ed1 100644 --- a/src/UI/Episode/Activity/EpisodeActivityDetailsCell.js +++ b/src/UI/Episode/Activity/EpisodeActivityDetailsCell.js @@ -7,10 +7,13 @@ require('bootstrap'); module.exports = NzbDroneCell.extend({ className : 'episode-activity-details-cell', - render : function(){ + + render : function() { this.$el.empty(); this.$el.html(''); - var html = new HistoryDetailsView({model : this.model}).render().$el; + + var html = new HistoryDetailsView({ model : this.model }).render().$el; + this.$el.popover({ content : html, html : true, @@ -19,6 +22,7 @@ module.exports = NzbDroneCell.extend({ placement : 'left', container : this.$el }); + return this; } }); \ No newline at end of file diff --git a/src/UI/Episode/Activity/EpisodeActivityLayout.js b/src/UI/Episode/Activity/EpisodeActivityLayout.js index e8d7332f6..98e4f3947 100644 --- a/src/UI/Episode/Activity/EpisodeActivityLayout.js +++ b/src/UI/Episode/Activity/EpisodeActivityLayout.js @@ -10,39 +10,52 @@ var NoActivityView = require('./NoActivityView'); var LoadingView = require('../../Shared/LoadingView'); module.exports = Marionette.Layout.extend({ - template : 'Episode/Activity/EpisodeActivityLayoutTemplate', - regions : {activityTable : '.activity-table'}, - columns : [{ - name : 'eventType', - label : '', - cell : EventTypeCell, - cellValue : 'this' - }, { - name : 'sourceTitle', - label : 'Source Title', - cell : 'string' - }, { - name : 'quality', - label : 'Quality', - cell : QualityCell - }, { - name : 'date', - label : 'Date', - cell : RelativeDateCell - }, { - name : 'this', - label : '', - cell : EpisodeActivityDetailsCell, - sortable : false - }, { - name : 'this', - label : '', - cell : EpisodeActivityActionsCell, - sortable : false - }], - initialize : function(options){ + template : 'Episode/Activity/EpisodeActivityLayoutTemplate', + + regions : { + activityTable : '.activity-table' + }, + + columns : [ + { + name : 'eventType', + label : '', + cell : EventTypeCell, + cellValue : 'this' + }, + { + name : 'sourceTitle', + label : 'Source Title', + cell : 'string' + }, + { + name : 'quality', + label : 'Quality', + cell : QualityCell + }, + { + name : 'date', + label : 'Date', + cell : RelativeDateCell + }, + { + name : 'this', + label : '', + cell : EpisodeActivityDetailsCell, + sortable : false + }, + { + name : 'this', + label : '', + cell : EpisodeActivityActionsCell, + sortable : false + } + ], + + initialize : function(options) { this.model = options.model; this.series = options.series; + this.collection = new HistoryCollection({ episodeId : this.model.id, tableName : 'episodeActivity' @@ -50,17 +63,20 @@ module.exports = Marionette.Layout.extend({ this.collection.fetch(); this.listenTo(this.collection, 'sync', this._showTable); }, - onRender : function(){ + + onRender : function() { this.activityTable.show(new LoadingView()); }, - _showTable : function(){ - if(this.collection.any()) { + + _showTable : function() { + if (this.collection.any()) { this.activityTable.show(new Backgrid.Grid({ collection : this.collection, columns : this.columns, className : 'table table-hover table-condensed' })); } + else { this.activityTable.show(new NoActivityView()); } diff --git a/src/UI/Episode/Activity/NoActivityView.js b/src/UI/Episode/Activity/NoActivityView.js index ec6326d21..7fc750a33 100644 --- a/src/UI/Episode/Activity/NoActivityView.js +++ b/src/UI/Episode/Activity/NoActivityView.js @@ -1,3 +1,5 @@ var Marionette = require('marionette'); -module.exports = Marionette.ItemView.extend({template : 'Episode/Activity/NoActivityViewTemplate'}); \ No newline at end of file +module.exports = Marionette.ItemView.extend({ + template : 'Episode/Activity/NoActivityViewTemplate' +}); \ No newline at end of file diff --git a/src/UI/Episode/EpisodeDetailsLayout.js b/src/UI/Episode/EpisodeDetailsLayout.js index eb6d2c351..8bc860704 100644 --- a/src/UI/Episode/EpisodeDetailsLayout.js +++ b/src/UI/Episode/EpisodeDetailsLayout.js @@ -6,97 +6,123 @@ var SeriesCollection = require('../Series/SeriesCollection'); var Messenger = require('../Shared/Messenger'); module.exports = Marionette.Layout.extend({ - className : 'modal-lg', - template : 'Episode/EpisodeDetailsLayoutTemplate', - regions : { + className : 'modal-lg', + template : 'Episode/EpisodeDetailsLayoutTemplate', + + regions : { summary : '#episode-summary', activity : '#episode-activity', search : '#episode-search' }, - ui : { + + ui : { summary : '.x-episode-summary', activity : '.x-episode-activity', search : '.x-episode-search', monitored : '.x-episode-monitored' }, - events : { - "click .x-episode-summary" : '_showSummary', - "click .x-episode-activity" : '_showActivity', - "click .x-episode-search" : '_showSearch', - "click .x-episode-monitored" : '_toggleMonitored' + + events : { + + 'click .x-episode-summary' : '_showSummary', + 'click .x-episode-activity' : '_showActivity', + 'click .x-episode-search' : '_showSearch', + 'click .x-episode-monitored' : '_toggleMonitored' }, - templateHelpers : {}, - initialize : function(options){ + + templateHelpers : {}, + + initialize : function(options) { this.templateHelpers.hideSeriesLink = options.hideSeriesLink; + this.series = SeriesCollection.get(this.model.get('seriesId')); this.templateHelpers.series = this.series.toJSON(); this.openingTab = options.openingTab || 'summary'; + this.listenTo(this.model, 'sync', this._setMonitoredState); }, - onShow : function(){ - this.searchLayout = new SearchLayout({model : this.model}); - if(this.openingTab === 'search') { + + onShow : function() { + this.searchLayout = new SearchLayout({ model : this.model }); + + if (this.openingTab === 'search') { this.searchLayout.startManualSearch = true; this._showSearch(); } + else { this._showSummary(); } + this._setMonitoredState(); - if(this.series.get('monitored')) { + + if (this.series.get('monitored')) { this.$el.removeClass('series-not-monitored'); } + else { this.$el.addClass('series-not-monitored'); } }, - _showSummary : function(e){ - if(e) { + + _showSummary : function(e) { + if (e) { e.preventDefault(); } + this.ui.summary.tab('show'); this.summary.show(new SummaryLayout({ model : this.model, series : this.series })); }, - _showActivity : function(e){ - if(e) { + + _showActivity : function(e) { + if (e) { e.preventDefault(); } + this.ui.activity.tab('show'); this.activity.show(new EpisodeActivityLayout({ model : this.model, series : this.series })); }, - _showSearch : function(e){ - if(e) { + + _showSearch : function(e) { + if (e) { e.preventDefault(); } + this.ui.search.tab('show'); this.search.show(this.searchLayout); }, - _toggleMonitored : function(){ - if(!this.series.get('monitored')) { + + _toggleMonitored : function() { + if (!this.series.get('monitored')) { + Messenger.show({ message : 'Unable to change monitored state when series is not monitored', type : 'error' }); + return; } + var name = 'monitored'; - this.model.set(name, !this.model.get(name), {silent : true}); + this.model.set(name, !this.model.get(name), { silent : true }); + this.ui.monitored.addClass('icon-spinner icon-spin'); this.model.save(); }, - _setMonitoredState : function(){ + + _setMonitoredState : function() { this.ui.monitored.removeClass('icon-spin icon-spinner'); - if(this.model.get('monitored')) { + + if (this.model.get('monitored')) { this.ui.monitored.addClass('icon-bookmark'); this.ui.monitored.removeClass('icon-bookmark-empty'); - } - else { + } else { this.ui.monitored.addClass('icon-bookmark-empty'); this.ui.monitored.removeClass('icon-bookmark'); } diff --git a/src/UI/Episode/Search/ButtonsView.js b/src/UI/Episode/Search/ButtonsView.js index fc4cb0437..6972f1201 100644 --- a/src/UI/Episode/Search/ButtonsView.js +++ b/src/UI/Episode/Search/ButtonsView.js @@ -1,3 +1,5 @@ var Marionette = require('marionette'); -module.exports = Marionette.ItemView.extend({template : 'Episode/Search/ButtonsViewTemplate'}); \ No newline at end of file +module.exports = Marionette.ItemView.extend({ + template : 'Episode/Search/ButtonsViewTemplate' +}); \ No newline at end of file diff --git a/src/UI/Episode/Search/EpisodeSearchLayout.js b/src/UI/Episode/Search/EpisodeSearchLayout.js index 97c82e5a2..7dd727ac2 100644 --- a/src/UI/Episode/Search/EpisodeSearchLayout.js +++ b/src/UI/Episode/Search/EpisodeSearchLayout.js @@ -9,55 +9,75 @@ var LoadingView = require('../../Shared/LoadingView'); var NoResultsView = require('./NoResultsView'); module.exports = Marionette.Layout.extend({ - template : 'Episode/Search/EpisodeSearchLayoutTemplate', - regions : {main : '#episode-search-region'}, - events : { - "click .x-search-auto" : '_searchAuto', - "click .x-search-manual" : '_searchManual', - "click .x-search-back" : '_showButtons' - }, - initialize : function(){ + template : 'Episode/Search/EpisodeSearchLayoutTemplate', + + regions : { + main : '#episode-search-region' + }, + + events : { + 'click .x-search-auto' : '_searchAuto', + 'click .x-search-manual' : '_searchManual', + 'click .x-search-back' : '_showButtons' + }, + + initialize : function() { this.mainView = new ButtonsView(); this.releaseCollection = new ReleaseCollection(); + this.listenTo(this.releaseCollection, 'sync', this._showSearchResults); }, - onShow : function(){ - if(this.startManualSearch) { + + onShow : function() { + if (this.startManualSearch) { this._searchManual(); } + else { this._showMainView(); } }, - _searchAuto : function(e){ - if(e) { + + _searchAuto : function(e) { + if (e) { e.preventDefault(); } - CommandController.Execute('episodeSearch', {episodeIds : [this.model.get('id')]}); + + CommandController.Execute('episodeSearch', { + episodeIds : [this.model.get('id')] + }); + vent.trigger(vent.Commands.CloseModalCommand); }, - _searchManual : function(e){ - if(e) { + + _searchManual : function(e) { + if (e) { e.preventDefault(); } + this.mainView = new LoadingView(); this._showMainView(); this.releaseCollection.fetchEpisodeReleases(this.model.id); }, - _showMainView : function(){ + + _showMainView : function() { this.main.show(this.mainView); }, - _showButtons : function(){ + + _showButtons : function() { this.mainView = new ButtonsView(); this._showMainView(); }, - _showSearchResults : function(){ - if(this.releaseCollection.length === 0) { + + _showSearchResults : function() { + if (this.releaseCollection.length === 0) { this.mainView = new NoResultsView(); } + else { - this.mainView = new ManualSearchLayout({collection : this.releaseCollection}); + this.mainView = new ManualSearchLayout({ collection : this.releaseCollection }); } + this._showMainView(); } }); \ No newline at end of file diff --git a/src/UI/Episode/Search/ManualLayout.js b/src/UI/Episode/Search/ManualLayout.js index 027585456..ff842d3c2 100644 --- a/src/UI/Episode/Search/ManualLayout.js +++ b/src/UI/Episode/Search/ManualLayout.js @@ -11,48 +11,63 @@ var PeersCell = require('../../Release/PeersCell'); module.exports = Marionette.Layout.extend({ template : 'Episode/Search/ManualLayoutTemplate', - regions : {grid : '#episode-release-grid'}, - columns : [{ - name : 'protocol', - label : 'Source', - cell : ProtocolCell - }, { - name : 'age', - label : 'Age', - cell : AgeCell - }, { - name : 'title', - label : 'Title', - cell : ReleaseTitleCell - }, { - name : 'indexer', - label : 'Indexer', - cell : Backgrid.StringCell - }, { - name : 'size', - label : 'Size', - cell : FileSizeCell - }, { - name : 'seeders', - label : 'Peers', - cell : PeersCell - }, { - name : 'quality', - label : 'Quality', - cell : QualityCell - }, { - name : 'rejections', - label : '', - cell : ApprovalStatusCell, - sortable : false - }, { - name : 'download', - label : '', - cell : DownloadReportCell, - sortable : true - }], - onShow : function(){ - if(!this.isClosed) { + + regions : { + grid : '#episode-release-grid' + }, + + columns : [ + { + name : 'protocol', + label : 'Source', + cell : ProtocolCell + }, + { + name : 'age', + label : 'Age', + cell : AgeCell + }, + { + name : 'title', + label : 'Title', + cell : ReleaseTitleCell + }, + { + name : 'indexer', + label : 'Indexer', + cell : Backgrid.StringCell + }, + { + name : 'size', + label : 'Size', + cell : FileSizeCell + }, + { + name : 'seeders', + label : 'Peers', + cell : PeersCell + }, + { + name : 'quality', + label : 'Quality', + cell : QualityCell + }, + { + name : 'rejections', + label : '', + cell : ApprovalStatusCell, + sortable : false + }, + { + name : 'download', + label : '', + cell : DownloadReportCell, + sortable : true + } + ], + + onShow : function() { + if (!this.isClosed) { this.grid.show(new Backgrid.Grid({ row : Backgrid.Row, columns : this.columns, diff --git a/src/UI/Episode/Search/NoResultsView.js b/src/UI/Episode/Search/NoResultsView.js index ea53ab92c..a1a68c4fa 100644 --- a/src/UI/Episode/Search/NoResultsView.js +++ b/src/UI/Episode/Search/NoResultsView.js @@ -1,3 +1,5 @@ var Marionette = require('marionette'); -module.exports = Marionette.ItemView.extend({template : 'Episode/Search/NoResultsViewTemplate'}); \ No newline at end of file +module.exports = Marionette.ItemView.extend({ + template : 'Episode/Search/NoResultsViewTemplate' +}); \ No newline at end of file diff --git a/src/UI/Episode/Summary/EpisodeSummaryLayout.js b/src/UI/Episode/Summary/EpisodeSummaryLayout.js index 1e83bd78c..29eaad626 100644 --- a/src/UI/Episode/Summary/EpisodeSummaryLayout.js +++ b/src/UI/Episode/Summary/EpisodeSummaryLayout.js @@ -10,66 +10,84 @@ var NoFileView = require('./NoFileView'); var LoadingView = require('../../Shared/LoadingView'); module.exports = Marionette.Layout.extend({ - template : 'Episode/Summary/EpisodeSummaryLayoutTemplate', - regions : { + template : 'Episode/Summary/EpisodeSummaryLayoutTemplate', + + regions : { overview : '.episode-overview', activity : '.episode-file-info' }, - columns : [{ - name : 'path', - label : 'Path', - cell : 'string', - sortable : false - }, { - name : 'size', - label : 'Size', - cell : FileSizeCell, - sortable : false - }, { - name : 'quality', - label : 'Quality', - cell : QualityCell, - sortable : false, - editable : true - }, { - name : 'this', - label : '', - cell : DeleteEpisodeFileCell, - sortable : false - }], - templateHelpers : {}, - initialize : function(options){ - if(!this.model.series) { + + columns : [ + { + name : 'path', + label : 'Path', + cell : 'string', + sortable : false + }, + { + name : 'size', + label : 'Size', + cell : FileSizeCell, + sortable : false + }, + { + name : 'quality', + label : 'Quality', + cell : QualityCell, + sortable : false, + editable : true + }, + { + name : 'this', + label : '', + cell : DeleteEpisodeFileCell, + sortable : false + } + ], + + templateHelpers : {}, + + initialize : function(options) { + if (!this.model.series) { this.templateHelpers.series = options.series.toJSON(); } }, - onShow : function(){ - if(this.model.get('hasFile')) { + + onShow : function() { + if (this.model.get('hasFile')) { var episodeFileId = this.model.get('episodeFileId'); - if(reqres.hasHandler(reqres.Requests.GetEpisodeFileById)) { + + if (reqres.hasHandler(reqres.Requests.GetEpisodeFileById)) { var episodeFile = reqres.request(reqres.Requests.GetEpisodeFileById, episodeFileId); - this.episodeFileCollection = new EpisodeFileCollection(episodeFile, {seriesId : this.model.get('seriesId')}); + this.episodeFileCollection = new EpisodeFileCollection(episodeFile, { seriesId : this.model.get('seriesId') }); this.listenTo(episodeFile, 'destroy', this._episodeFileDeleted); + this._showTable(); } + else { this.activity.show(new LoadingView()); + var self = this; - var newEpisodeFile = new EpisodeFileModel({id : episodeFileId}); - this.episodeFileCollection = new EpisodeFileCollection(newEpisodeFile, {seriesId : this.model.get('seriesId')}); + var newEpisodeFile = new EpisodeFileModel({ id : episodeFileId }); + this.episodeFileCollection = new EpisodeFileCollection(newEpisodeFile, { seriesId : this.model.get('seriesId') }); var promise = newEpisodeFile.fetch(); this.listenTo(newEpisodeFile, 'destroy', this._episodeFileDeleted); - promise.done(function(){ + + promise.done(function() { self._showTable(); }); } + this.listenTo(this.episodeFileCollection, 'add remove', this._collectionChanged); } + else { this._showNoFileView(); } }, - _showTable : function(){ + + _showTable : function() { this.activity.show(new Backgrid.Grid({ collection : this.episodeFileCollection, columns : this.columns, @@ -77,18 +95,22 @@ module.exports = Marionette.Layout.extend({ emptyText : 'Nothing to see here!' })); }, - _showNoFileView : function(){ + + _showNoFileView : function() { this.activity.show(new NoFileView()); }, - _collectionChanged : function(){ - if(!this.episodeFileCollection.any()) { + + _collectionChanged : function() { + if (!this.episodeFileCollection.any()) { this._showNoFileView(); } + else { this._showTable(); } }, - _episodeFileDeleted : function(){ + + _episodeFileDeleted : function() { this.model.set({ episodeFileId : 0, hasFile : false diff --git a/src/UI/Episode/Summary/NoFileView.js b/src/UI/Episode/Summary/NoFileView.js index d1361d77e..07aabc810 100644 --- a/src/UI/Episode/Summary/NoFileView.js +++ b/src/UI/Episode/Summary/NoFileView.js @@ -1,3 +1,5 @@ var Marionette = require('marionette'); -module.exports = Marionette.ItemView.extend({template : 'Episode/Summary/NoFileViewTemplate'}); \ No newline at end of file +module.exports = Marionette.ItemView.extend({ + template : 'Episode/Summary/NoFileViewTemplate' +}); \ No newline at end of file