diff --git a/src/UI/Cells/EpisodeMonitoredCell.js b/src/UI/Cells/EpisodeMonitoredCell.js index 72a3e2fee..5f6c7f689 100644 --- a/src/UI/Cells/EpisodeMonitoredCell.js +++ b/src/UI/Cells/EpisodeMonitoredCell.js @@ -2,17 +2,19 @@ define( [ + 'underscore', 'Cells/ToggleCell', 'Series/SeriesCollection', 'Shared/Messenger' - ], function (ToggleCell, SeriesCollection, Messenger) { + ], function (_, ToggleCell, SeriesCollection, Messenger) { return ToggleCell.extend({ className: 'toggle-cell episode-monitored', _originalOnClick: ToggleCell.prototype._onClick, - _onClick: function () { + _onClick: function (e) { + var series = SeriesCollection.get(this.model.get('seriesId')); if (!series.get('monitored')) { @@ -25,7 +27,41 @@ define( return; } + if (e.shiftKey) { + this._selectRange(); + + return; + } + this._originalOnClick.apply(this, arguments); + this.model.episodeCollection.lastToggled = this.model; + }, + + _selectRange: function () { + var episodeCollection = this.model.episodeCollection; + var lastToggled = episodeCollection.lastToggled; + + if (!lastToggled) { + return; + } + + var currentIndex = episodeCollection.indexOf(this.model); + var lastIndex = episodeCollection.indexOf(lastToggled); + + var low = Math.min(currentIndex, lastIndex); + var high = Math.max(currentIndex, lastIndex); + var range = _.range(low + 1, high); + + _.each(range, function (index) { + var model = episodeCollection.at(index); + + model.set('monitored', lastToggled.get('monitored')); + model.save(); + }); + + this.model.set('monitored', lastToggled.get('monitored')); + this.model.save(); + this.model.episodeCollection.lastToggled = undefined; } }); }); diff --git a/src/UI/Cells/ToggleCell.js b/src/UI/Cells/ToggleCell.js index 8c6a17dcb..f2e215750 100644 --- a/src/UI/Cells/ToggleCell.js +++ b/src/UI/Cells/ToggleCell.js @@ -24,8 +24,8 @@ define( this.$('i').addClass('icon-spinner icon-spin'); this.model.save().always(function () { - self.render(); - }); + self.render(); + }); }, render: function () { diff --git a/src/UI/Cells/cells.less b/src/UI/Cells/cells.less index 8869f0779..712b66bb1 100644 --- a/src/UI/Cells/cells.less +++ b/src/UI/Cells/cells.less @@ -2,6 +2,7 @@ @import "../Content/Bootstrap/variables"; @import "../Content/Bootstrap/buttons"; @import "../Shared/Styles/clickable"; +@import "../Content/mixins"; .episode-title-cell { .btn-link; @@ -31,6 +32,7 @@ .toggle-cell{ .clickable(); + .not-selectable; } .approval-status-cell { diff --git a/src/UI/Content/mixins.less b/src/UI/Content/mixins.less new file mode 100644 index 000000000..999cc22d2 --- /dev/null +++ b/src/UI/Content/mixins.less @@ -0,0 +1,11 @@ +.selectable() { + -moz-user-select : all; + -webkit-user-select : all; + -ms-user-select : all; +} + +.not-selectable() { + -moz-user-select : none; + -webkit-user-select : none; + -ms-user-select : none; +} \ No newline at end of file diff --git a/src/UI/Series/Details/SeasonLayout.js b/src/UI/Series/Details/SeasonLayout.js index 5f9620c75..6a0ee80d4 100644 --- a/src/UI/Series/Details/SeasonLayout.js +++ b/src/UI/Series/Details/SeasonLayout.js @@ -92,11 +92,19 @@ define( initialize: function (options) { + if (!options.episodeCollection) { throw 'episodeCollection is needed'; } this.episodeCollection = options.episodeCollection.bySeason(this.model.get('seasonNumber')); + + var self = this; + + this.episodeCollection.each(function (model) { + model.episodeCollection = self.episodeCollection; + }); + this.series = options.series; this.showingEpisodes = this._shouldShowEpisodes(); @@ -249,6 +257,34 @@ define( this.templateHelpers.showingEpisodes = this.showingEpisodes; this.render(); + }, + + _episodeMonitoredToggled: function (options) { + var model = options.model; + var shiftKey = options.shiftKey; + + if (!this.episodeCollection.get(model.get('id'))) { + return; + } + + if (!shiftKey) { + return; + } + + var lastToggled = this.episodeCollection.lastToggled; + + if (!lastToggled) { + return; + } + + var currentIndex = this.episodeCollection.indexOf(model); + var lastIndex = this.episodeCollection.indexOf(lastToggled); + + var low = Math.min(currentIndex, lastIndex); + var high = Math.max(currentIndex, lastIndex); + var range = _.range(low + 1, high); + + this.episodeCollection.lastToggled = model; } }); }); diff --git a/src/UI/Series/series.less b/src/UI/Series/series.less index 96f0e1137..60cceb63f 100644 --- a/src/UI/Series/series.less +++ b/src/UI/Series/series.less @@ -178,6 +178,7 @@ } .series-season { + .episode-number-cell { width : 22px; } diff --git a/src/UI/vent.js b/src/UI/vent.js index 121edb83f..c50fc358d 100644 --- a/src/UI/vent.js +++ b/src/UI/vent.js @@ -8,11 +8,11 @@ define( var vent = new Backbone.Wreqr.EventAggregator(); vent.Events = { - SeriesAdded : 'series:added', - SeriesDeleted : 'series:deleted', - CommandComplete : 'command:complete', - ServerUpdated : 'server:updated', - EpisodeFileDeleted: 'episodefile:deleted' + SeriesAdded : 'series:added', + SeriesDeleted : 'series:deleted', + CommandComplete : 'command:complete', + ServerUpdated : 'server:updated', + EpisodeFileDeleted : 'episodefile:deleted' }; vent.Commands = {