From 29094987815616a73bba58d7eae66078405f3adf Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 9 Jul 2013 19:11:00 -0700 Subject: [PATCH] Season monitor toggle added --- NzbDrone.Core/Tv/EpisodeRepository.cs | 15 +++++++ NzbDrone.Core/Tv/EpisodeService.cs | 7 +++- NzbDrone.Core/Tv/SeasonService.cs | Bin 6810 -> 6889 bytes UI/Series/Details/SeasonLayout.js | 43 ++++++++++++++++++-- UI/Series/Details/SeasonLayoutTemplate.html | 8 +++- UI/Series/series.less | 7 ++++ 6 files changed, 74 insertions(+), 6 deletions(-) diff --git a/NzbDrone.Core/Tv/EpisodeRepository.cs b/NzbDrone.Core/Tv/EpisodeRepository.cs index b4cb45060..61af1d8fd 100644 --- a/NzbDrone.Core/Tv/EpisodeRepository.cs +++ b/NzbDrone.Core/Tv/EpisodeRepository.cs @@ -25,6 +25,7 @@ namespace NzbDrone.Core.Tv List EpisodesWithFiles(); List EpisodesBetweenDates(DateTime startDate, DateTime endDate); void SetMonitoredFlat(Episode episode, bool monitored); + void SetMonitoredBySeason(int seriesId, int seasonNumber, bool monitored); void SetFileId(int episodeId, int fileId); } @@ -125,6 +126,20 @@ namespace NzbDrone.Core.Tv SetFields(episode, p => p.Monitored); } + public void SetMonitoredBySeason(int seriesId, int seasonNumber, bool monitored) + { + _dataMapper.AddParameter("seriesId", seriesId); + _dataMapper.AddParameter("seasonNumber", seasonNumber); + _dataMapper.AddParameter("monitored", monitored); + + var sql = "UPDATE Episodes " + + "SET Monitored = @monitored " + + "WHERE SeriesId = @seriesId " + + "AND SeasonNumber = @seasonNumber"; + + _dataMapper.ExecuteNonQuery(sql); + } + public void SetFileId(int episodeId, int fileId) { SetFields(new Episode { Id = episodeId, EpisodeFileId = fileId }, episode => episode.EpisodeFileId); diff --git a/NzbDrone.Core/Tv/EpisodeService.cs b/NzbDrone.Core/Tv/EpisodeService.cs index a1ec57fed..ef996e09a 100644 --- a/NzbDrone.Core/Tv/EpisodeService.cs +++ b/NzbDrone.Core/Tv/EpisodeService.cs @@ -111,8 +111,6 @@ namespace NzbDrone.Core.Tv return _episodeRepository.EpisodesWithFiles(); } - - public void UpdateEpisode(Episode episode) { _episodeRepository.Update(episode); @@ -131,6 +129,11 @@ namespace NzbDrone.Core.Tv logger.Info("Monitored flag for Episode:{0} was set to {1}", episodeId, monitored); } + public void SetEpisodeMonitoredBySeason(int seriesId, int seasonNumber, bool monitored) + { + _episodeRepository.SetMonitoredBySeason(seriesId, seasonNumber, monitored); + } + public bool IsFirstOrLastEpisodeOfSeason(int episodeId) { var episode = GetEpisode(episodeId); diff --git a/NzbDrone.Core/Tv/SeasonService.cs b/NzbDrone.Core/Tv/SeasonService.cs index 30af7e87d48132dc620a807d5850ebc448cd589e..a7ca88c4b1f839407ad5e2a6455b499c78682e0d 100644 GIT binary patch delta 179 zcmbPb`qFemK9ihlL1uA&N@{RwQCVhkszQ7!3V(7iQ-Lg+5;PSDnPTNpg%oTRPz5&g vG1oI%C?EkeYxIIsOQ5#+=I3RW^O delta 169 zcmaE9I?HrJKGWotOd*qHn4>3eU}f99hB=e5o|j7j3FzyG1V!KmXuBABBR9#Nt#`(~46Qi}UmJ yTnjRb^HWlb_1yA{ToaQsG*T68?G#e=eDm`%*-P?^Qd1OcC*NX`*<8n(EeZe<-!t6+ diff --git a/UI/Series/Details/SeasonLayout.js b/UI/Series/Details/SeasonLayout.js index d9cb29b3c..4bc643852 100644 --- a/UI/Series/Details/SeasonLayout.js +++ b/UI/Series/Details/SeasonLayout.js @@ -14,11 +14,13 @@ define( template: 'Series/Details/SeasonLayoutTemplate', ui: { - seasonSearch: '.x-season-search' + seasonSearch : '.x-season-search', + seasonMonitored: '.x-season-monitored' }, events: { - 'click .x-season-search': '_seasonSearch' + 'click .x-season-search' : '_seasonSearch', + 'click .x-season-monitored': '_seasonMonitored' }, regions: { @@ -72,12 +74,14 @@ define( }); }, - onShow: function () { + onRender: function () { this.episodeGrid.show(new Backgrid.Grid({ columns : this.columns, collection: this.episodeCollection, className : 'table table-hover season-grid' })); + + this._setSeasonMonitoredState(); }, _seasonSearch: function () { @@ -112,6 +116,39 @@ define( self.idle = true; } }); + }, + + _seasonMonitored: function () { + var self = this; + var name = 'monitored'; + this.model.set(name, !this.model.get(name)); + + this.ui.seasonMonitored.addClass('icon-spinner icon-spin'); + + var promise = this.model.save(); + + promise.always(function (){ + _.each(self.episodeCollection.models, function (episode) { + episode.set({ monitored: !episode.get('monitored') }); + }); + + self.render(); + }); + }, + + _setSeasonMonitoredState: function () { + var monitored = this.model.get('monitored'); + + this.ui.seasonMonitored.removeClass('icon-spinner icon-spin'); + + if (this.model.get('monitored')) { + this.ui.seasonMonitored.addClass('icon-bookmark'); + this.ui.seasonMonitored.removeClass('icon-bookmark-empty'); + } + else { + this.ui.seasonMonitored.addClass('icon-bookmark-empty'); + this.ui.seasonMonitored.removeClass('icon-bookmark'); + } } }); }); diff --git a/UI/Series/Details/SeasonLayoutTemplate.html b/UI/Series/Details/SeasonLayoutTemplate.html index c4b59fe00..efa58f097 100644 --- a/UI/Series/Details/SeasonLayoutTemplate.html +++ b/UI/Series/Details/SeasonLayoutTemplate.html @@ -1,4 +1,10 @@ 
-

{{seasonTitle}}

+

+ {{seasonTitle}} + + + + +

diff --git a/UI/Series/series.less b/UI/Series/series.less index ffd78f75c..1b2ef2d04 100644 --- a/UI/Series/series.less +++ b/UI/Series/series.less @@ -175,10 +175,17 @@ width : 12px; text-align: center; } + + .toggle-cell { + i { + .clickable; + } + } } .season-actions { font-size : 24px; + text-transform: none; i { .clickable;