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 30af7e87d..a7ca88c4b 100644 Binary files a/NzbDrone.Core/Tv/SeasonService.cs and b/NzbDrone.Core/Tv/SeasonService.cs differ 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;