From 0fa1509ca64a14985a7a97507507528b9e760970 Mon Sep 17 00:00:00 2001 From: Tim Turner Date: Tue, 10 Jan 2017 19:37:17 -0500 Subject: [PATCH] Manual Import works Automatically importing still broken --- .../EpisodeImport/Manual/ManualImportFile.cs | 1 + .../EpisodeImport/Manual/ManualImportItem.cs | 1 + src/UI/ManualImport/Cells/MovieCell.js | 43 ++++++++ src/UI/ManualImport/ManualImportLayout.js | 83 ++++++++------ .../ManualImport/Movie/SelectMovieLayout.js | 101 ++++++++++++++++++ .../Movie/SelectMovieLayoutTemplate.hbs | 30 ++++++ src/UI/ManualImport/Movie/SelectMovieRow.js | 13 +++ .../Summary/ManualImportSummaryView.js | 21 ++-- .../ManualImportSummaryViewTemplate.hbs | 12 +-- src/UI/Rename/RenamePreviewLayout.js | 2 +- src/UI/Shared/Modal/ModalController.js | 1 + 11 files changed, 257 insertions(+), 51 deletions(-) create mode 100644 src/UI/ManualImport/Cells/MovieCell.js create mode 100644 src/UI/ManualImport/Movie/SelectMovieLayout.js create mode 100644 src/UI/ManualImport/Movie/SelectMovieLayoutTemplate.hbs create mode 100644 src/UI/ManualImport/Movie/SelectMovieRow.js diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportFile.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportFile.cs index 4c9fecc7c..d9f089179 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportFile.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportFile.cs @@ -10,5 +10,6 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual public List EpisodeIds { get; set; } public QualityModel Quality { get; set; } public string DownloadId { get; set; } + public int MovieId { get; set; } } } diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportItem.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportItem.cs index bd3954816..ecca2739c 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportItem.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportItem.cs @@ -17,5 +17,6 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual public QualityModel Quality { get; set; } public string DownloadId { get; set; } public IEnumerable Rejections { get; set; } + public Movie Movie { get; set; } } } diff --git a/src/UI/ManualImport/Cells/MovieCell.js b/src/UI/ManualImport/Cells/MovieCell.js new file mode 100644 index 000000000..8849f8ea3 --- /dev/null +++ b/src/UI/ManualImport/Cells/MovieCell.js @@ -0,0 +1,43 @@ +var vent = require('../../vent'); +var NzbDroneCell = require('../../Cells/NzbDroneCell'); +var SelectMovieLayout = require('../Movie/SelectMovieLayout'); + +module.exports = NzbDroneCell.extend({ + className : 'series-title-cell editable', + + events : { + 'click' : '_onClick' + }, + + render : function() { + this.$el.empty(); + + var movie = this.model.get('movie'); + + if (movie) + { + this.$el.html(movie.title + " (" + movie.year + ")" ); + } + + this.delegateEvents(); + return this; + }, + + _onClick : function () { + var view = new SelectMovieLayout(); + + this.listenTo(view, 'manualimport:selected:movie', this._setMovie); + + vent.trigger(vent.Commands.OpenModal2Command, view); + }, + + _setMovie : function (e) { + if (this.model.has('movie') && e.model.id === this.model.get('movie').id) { + return; + } + + this.model.set({ + movie : e.model.toJSON() + }); + } +}); \ No newline at end of file diff --git a/src/UI/ManualImport/ManualImportLayout.js b/src/UI/ManualImport/ManualImportLayout.js index ba5a139fc..215415b5e 100644 --- a/src/UI/ManualImport/ManualImportLayout.js +++ b/src/UI/ManualImport/ManualImportLayout.js @@ -16,6 +16,7 @@ var QualityCell = require('./Cells/QualityCell'); var FileSizeCell = require('../Cells/FileSizeCell'); var ApprovalStatusCell = require('../Cells/ApprovalStatusCell'); var ManualImportCollection = require('./ManualImportCollection'); +var MovieCell = require('./Cells/MovieCell'); var Messenger = require('../Shared/Messenger'); module.exports = Marionette.Layout.extend({ @@ -49,23 +50,29 @@ module.exports = Marionette.Layout.extend({ sortable : true }, { - name : 'series', - label : 'Series', - cell : SeriesCell, + name : 'movie', + label : 'Movie', + cell : MovieCell, sortable : true }, - { - name : 'seasonNumber', - label : 'Season', - cell : SeasonCell, - sortable : true - }, - { - name : 'episodes', - label : 'Episode(s)', - cell : EpisodesCell, - sortable : false - }, + // { + // name : 'series', + // label : 'Series', + // cell : SeriesCell, + // sortable : true + // }, + // { + // name : 'seasonNumber', + // label : 'Season', + // cell : SeasonCell, + // sortable : true + // }, + // { + // name : 'episodes', + // label : 'Episode(s)', + // cell : EpisodesCell, + // sortable : false + // }, { name : 'quality', label : 'Quality', @@ -176,29 +183,36 @@ module.exports = Marionette.Layout.extend({ return; } - if (_.any(selected, function (model) { - return !model.has('series'); - })) { - - this._showErrorMessage('Series must be chosen for each selected file'); + if(_.any(selected, function(model) { + return !model.has('movie'); + })) { + this._showErrorMessage('Movie must be chosen for each selected file'); return; } - if (_.any(selected, function (model) { - return !model.has('seasonNumber'); - })) { + // if (_.any(selected, function (model) { + // return !model.has('series'); + // })) { - this._showErrorMessage('Season must be chosen for each selected file'); - return; - } + // this._showErrorMessage('Series must be chosen for each selected file'); + // return; + // } - if (_.any(selected, function (model) { - return !model.has('episodes') || model.get('episodes').length === 0; - })) { + // if (_.any(selected, function (model) { + // return !model.has('seasonNumber'); + // })) { - this._showErrorMessage('One or more episodes must be chosen for each selected file'); - return; - } + // this._showErrorMessage('Season must be chosen for each selected file'); + // return; + // } + + // if (_.any(selected, function (model) { + // return !model.has('episodes') || model.get('episodes').length === 0; + // })) { + + // this._showErrorMessage('One or more episodes must be chosen for each selected file'); + // return; + // } var importMode = this.ui.importMode.val(); @@ -207,8 +221,9 @@ module.exports = Marionette.Layout.extend({ files : _.map(selected, function (file) { return { path : file.get('path'), - seriesId : file.get('series').id, - episodeIds : _.map(file.get('episodes'), 'id'), + movieId : file.get('movie').id, + // seriesId : file.get('series').id, + // episodeIds : _.map(file.get('episodes'), 'id'), quality : file.get('quality'), downloadId : file.get('downloadId') }; diff --git a/src/UI/ManualImport/Movie/SelectMovieLayout.js b/src/UI/ManualImport/Movie/SelectMovieLayout.js new file mode 100644 index 000000000..55799a2c5 --- /dev/null +++ b/src/UI/ManualImport/Movie/SelectMovieLayout.js @@ -0,0 +1,101 @@ +var _ = require('underscore'); +var vent = require('vent'); +var Marionette = require('marionette'); +var Backgrid = require('backgrid'); +var MoviesCollection = require('../../Movies/MoviesCollection'); +var SelectRow = require('./SelectMovieRow'); + +module.exports = Marionette.Layout.extend({ + template : 'ManualImport/Movie/SelectMovieLayoutTemplate', + + regions : { + movie : '.x-movie' + }, + + ui : { + filter : '.x-filter' + }, + + columns : [ + { + name : 'title', + label : 'Title', + cell : 'String', + sortValue : 'sortTitle' + } + ], + + initialize : function() { + this.movieCollection = MoviesCollection.clone(); + this._setModelCollection(); + + this.listenTo(this.movieCollection, 'row:selected', this._onSelected); + this.listenTo(this, 'modal:afterShow', this._setFocus); + }, + + onRender : function() { + this.movieView = new Backgrid.Grid({ + columns : this.columns, + collection : this.movieCollection, + className : 'table table-hover season-grid', + row : SelectRow + }); + + this.movie.show(this.movieView); + this._setupFilter(); + }, + + _setupFilter : function () { + var self = this; + + //TODO: This should be a mixin (same as Add Series searching) + this.ui.filter.keyup(function(e) { + if (_.contains([ + 9, + 16, + 17, + 18, + 19, + 20, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 91, + 92, + 93 + ], e.keyCode)) { + return; + } + + self._filter(self.ui.filter.val()); + }); + }, + + _filter : function (term) { + this.movieCollection.setFilter(['title', term, 'contains']); + this._setModelCollection(); + }, + + _onSelected : function (e) { + this.trigger('manualimport:selected:movie', { model: e.model }); + + vent.trigger(vent.Commands.CloseModal2Command); + }, + + _setFocus : function () { + this.ui.filter.focus(); + }, + + _setModelCollection: function () { + var self = this; + + _.each(this.movieCollection.models, function (model) { + model.collection = self.movieCollection; + }); + } +}); diff --git a/src/UI/ManualImport/Movie/SelectMovieLayoutTemplate.hbs b/src/UI/ManualImport/Movie/SelectMovieLayoutTemplate.hbs new file mode 100644 index 000000000..25b3c39d4 --- /dev/null +++ b/src/UI/ManualImport/Movie/SelectMovieLayoutTemplate.hbs @@ -0,0 +1,30 @@ + + + diff --git a/src/UI/ManualImport/Movie/SelectMovieRow.js b/src/UI/ManualImport/Movie/SelectMovieRow.js new file mode 100644 index 000000000..38a2d5ca6 --- /dev/null +++ b/src/UI/ManualImport/Movie/SelectMovieRow.js @@ -0,0 +1,13 @@ +var Backgrid = require('backgrid'); + +module.exports = Backgrid.Row.extend({ + className : 'select-row select-series-row', + + events : { + 'click' : '_onClick' + }, + + _onClick : function() { + this.model.collection.trigger('row:selected', { model: this.model }); + } +}); \ No newline at end of file diff --git a/src/UI/ManualImport/Summary/ManualImportSummaryView.js b/src/UI/ManualImport/Summary/ManualImportSummaryView.js index a4ab847c2..141f2ca26 100644 --- a/src/UI/ManualImport/Summary/ManualImportSummaryView.js +++ b/src/UI/ManualImport/Summary/ManualImportSummaryView.js @@ -4,16 +4,25 @@ var Marionette = require('marionette'); module.exports = Marionette.ItemView.extend({ template : 'ManualImport/Summary/ManualImportSummaryViewTemplate', + // initialize : function (options) { + // var episodes = _.map(options.episodes, function (episode) { + // return episode.toJSON(); + // }); + + // this.templateHelpers = { + // file : options.file, + // series : options.series, + // season : options.season, + // episodes : episodes, + // quality : options.quality + // }; + // } + initialize : function (options) { - var episodes = _.map(options.episodes, function (episode) { - return episode.toJSON(); - }); this.templateHelpers = { file : options.file, - series : options.series, - season : options.season, - episodes : episodes, + movie : options.movie, quality : options.quality }; } diff --git a/src/UI/ManualImport/Summary/ManualImportSummaryViewTemplate.hbs b/src/UI/ManualImport/Summary/ManualImportSummaryViewTemplate.hbs index d65ff52f1..36497083e 100644 --- a/src/UI/ManualImport/Summary/ManualImportSummaryViewTemplate.hbs +++ b/src/UI/ManualImport/Summary/ManualImportSummaryViewTemplate.hbs @@ -3,16 +3,8 @@
Path:
{{file}}
-
Series:
-
{{series.title}}
- -
Season:
-
{{season.seasonNumber}}
- - {{#each episodes}} -
Episode:
-
{{episodeNumber}} - {{title}}
- {{/each}} +
Movie:
+
{{movie.title}} ({{movie.year}})
Quality:
{{quality.name}}
diff --git a/src/UI/Rename/RenamePreviewLayout.js b/src/UI/Rename/RenamePreviewLayout.js index a37ffeb37..f8b26658e 100644 --- a/src/UI/Rename/RenamePreviewLayout.js +++ b/src/UI/Rename/RenamePreviewLayout.js @@ -78,7 +78,7 @@ module.exports = Marionette.Layout.extend({ CommandController.Execute('renameMovieFiles', { name : 'renameMovieFiles', - movieId : this.model.id, + movieId : this.model.id, files : files }); diff --git a/src/UI/Shared/Modal/ModalController.js b/src/UI/Shared/Modal/ModalController.js index 9aaaeeeb1..4392967df 100644 --- a/src/UI/Shared/Modal/ModalController.js +++ b/src/UI/Shared/Modal/ModalController.js @@ -10,6 +10,7 @@ var LogDetailsView = require('../../System/Logs/Table/Details/LogDetailsView'); var RenamePreviewLayout = require('../../Rename/RenamePreviewLayout'); var ManualImportLayout = require('../../ManualImport/ManualImportLayout'); var FileBrowserLayout = require('../FileBrowser/FileBrowserLayout'); +var MoviesDetailsLayout = require('../../Movies/Details/MoviesDetailsLayout'); module.exports = Marionette.AppRouter.extend({ initialize : function() {