diff --git a/Gruntfile.js b/Gruntfile.js index bcfba4f64..b913688e4 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -10,8 +10,6 @@ module.exports = function (grunt) { 'UI/JsLibraries/backbone.modelbinder.js' : 'http://raw.github.com/theironcook/Backbone.ModelBinder/master/Backbone.ModelBinder.js', 'UI/JsLibraries/backbone.mutators.js' : 'http://raw.github.com/asciidisco/Backbone.Mutators/master/backbone.mutators.js', 'UI/JsLibraries/backbone.shortcuts.js' : 'http://raw.github.com/bry4n/backbone-shortcuts/master/backbone.shortcuts.js', - 'UI/JsLibraries/backbone.relational.js' : 'http://raw.github.com/PaulUithol/Backbone-relational/0.8.5/backbone-relational.js', - 'UI/JsLibraries/backbone.associations.js' : 'http://raw.github.com/dhruvaray/backbone-associations/master/backbone-associations.js', 'UI/JsLibraries/backbone.pageable.js' : 'http://raw.github.com/wyuenho/backbone-pageable/master/lib/backbone-pageable.js', 'UI/JsLibraries/backbone.backgrid.js' : 'http://raw.github.com/wyuenho/backgrid/master/lib/backgrid.js', @@ -28,6 +26,7 @@ module.exports = function (grunt) { 'UI/JsLibraries/require.js' : 'http://raw.github.com/jrburke/requirejs/master/require.js', 'UI/JsLibraries/sugar.js' : 'http://raw.github.com/andrewplummer/Sugar/master/release/sugar-full.development.js', 'UI/JsLibraries/underscore.js' : 'http://underscorejs.org/underscore.js', + 'UI/JsLibraries/lodash.underscore.js' : 'http://raw.github.com/bestiejs/lodash/master/dist/lodash.underscore.js', 'UI/JsLibraries/lunr.js' : 'http://raw.github.com/olivernn/lunr.js/master/lunr.js', 'UI/JsLibraries/messenger.js' : 'http://raw.github.com/HubSpot/messenger/master/build/js/messenger.js', @@ -36,6 +35,7 @@ module.exports = function (grunt) { 'UI/Content/bootstrap.toggle-switch.css' : 'http://raw.github.com/ghinda/css-toggle-switch/gh-pages/toggle-switch.css', + /* 'UI/Content/FontAwesome/fontawesome.otf' : 'http://github.com/FortAwesome/Font-Awesome/blob/master/build/assets/font-awesome/font/FontAwesome.otf?raw=true', 'UI/Content/FontAwesome/fontawesome-webfont.eot' : 'http://github.com/FortAwesome/Font-Awesome/blob/master/build/assets/font-awesome/font/fontawesome-webfont.eot?raw=true', 'UI/Content/FontAwesome/fontawesome-webfont.svg' : 'http://github.com/FortAwesome/Font-Awesome/blob/master/build/assets/font-awesome/font/fontawesome-webfont.svg?raw=true', @@ -51,6 +51,7 @@ module.exports = function (grunt) { 'UI/Content/FontAwesome/mixins.less' : 'http://raw.github.com/FortAwesome/Font-Awesome/master/build/assets/font-awesome/less/mixins.less', 'UI/Content/FontAwesome/path.less' : 'http://raw.github.com/FortAwesome/Font-Awesome/master/build/assets/font-awesome/less/path.less', 'UI/Content/FontAwesome/variables.less' : 'http://raw.github.com/FortAwesome/Font-Awesome/master/build/assets/font-awesome/less/variables.less' + */ }, clean: { @@ -125,6 +126,9 @@ module.exports = function (grunt) { }, watch: { + options: { + nospawn: false, + }, bootstrap : { files: ['UI/**/Bootstrap/**', 'UI/**/FontAwesome/**'], tasks: ['less:bootstrap'] diff --git a/UI/.idea/NzbDrone.UI.iml b/UI/.idea/NzbDrone.UI.iml index 7c7853f2f..9ffbb36a1 100644 --- a/UI/.idea/NzbDrone.UI.iml +++ b/UI/.idea/NzbDrone.UI.iml @@ -5,7 +5,6 @@ <orderEntry type="inheritedJdk" /> <orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="library" name="jQuery-1.9.1" level="application" /> - <orderEntry type="library" name="libraries" level="project" /> </component> </module> diff --git a/UI/.idea/codeStyleSettings.xml b/UI/.idea/codeStyleSettings.xml index f16a0e64f..83bfe2c0c 100644 --- a/UI/.idea/codeStyleSettings.xml +++ b/UI/.idea/codeStyleSettings.xml @@ -35,10 +35,7 @@ <option name="FINALLY_ON_NEW_LINE" value="true" /> <option name="ALIGN_MULTILINE_PARAMETERS" value="false" /> <option name="SPACE_AFTER_COLON" value="false" /> - <option name="CALL_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" /> - <option name="CALL_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" /> - <option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" /> - <option name="METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" /> + <option name="METHOD_PARAMETERS_WRAP" value="5" /> <option name="ARRAY_INITIALIZER_WRAP" value="2" /> <option name="IF_BRACE_FORCE" value="3" /> <option name="DOWHILE_BRACE_FORCE" value="3" /> diff --git a/UI/.idea/dictionaries/Keivan_Beigi.xml b/UI/.idea/dictionaries/Keivan_Beigi.xml index 42d1a915f..981e29f30 100644 --- a/UI/.idea/dictionaries/Keivan_Beigi.xml +++ b/UI/.idea/dictionaries/Keivan_Beigi.xml @@ -4,6 +4,7 @@ <w>backgrid</w> <w>bnzbd</w> <w>clickable</w> + <w>couldn</w> <w>mouseenter</w> <w>mouseleave</w> </words> diff --git a/UI/.idea/jsLibraryMappings.xml b/UI/.idea/jsLibraryMappings.xml index c932efdc1..723694460 100644 --- a/UI/.idea/jsLibraryMappings.xml +++ b/UI/.idea/jsLibraryMappings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="JavaScriptLibraryMappings"> - <file url="PROJECT" libraries="{libraries}" /> + <file url="PROJECT" libraries="{jQuery-1.9.1}" /> </component> </project> diff --git a/UI/.idea/jsLinters/jshint.xml b/UI/.idea/jsLinters/jshint.xml index 77f11c0d4..2f9183e30 100644 --- a/UI/.idea/jsLinters/jshint.xml +++ b/UI/.idea/jsLinters/jshint.xml @@ -63,7 +63,7 @@ <option passfail="false" /> <option white="false" /> <option maxerr="50" /> - <option predef="NzbDrone, define, Backbone, _, window,Handlebars,require,$,Marionette, Backgrid, jQuery, signalR" /> + <option predef="window, define, require ,$" /> </component> </project> diff --git a/UI/.idea/libraries/libraries.xml b/UI/.idea/libraries/libraries.xml deleted file mode 100644 index ddc15483e..000000000 --- a/UI/.idea/libraries/libraries.xml +++ /dev/null @@ -1,51 +0,0 @@ -<component name="libraryTable"> - <library name="libraries" type="javaScript"> - <properties> - <sourceFilesUrls> - <item url="file://$PROJECT_DIR$/JsLibraries/bootstrap.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/backbone.debug.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/jquery.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/sugar.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/backbone.shortcuts.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/jquery.tablesorter.pager.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/handlebars.runtime.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/jquery.tablesorter.bootstrap.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/backbone.modelbinder.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/jquery.tablesorter.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/fullcalendar.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/backbone.collectionbinder.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/underscore.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/backbone.marionette.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/bootstrap.slider.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/backbone.marionette.viewswapper.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/backbone.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/require.js" /> - <item url="file://$PROJECT_DIR$/JsLibraries/backbone.mutators.js" /> - </sourceFilesUrls> - </properties> - <CLASSES> - <root url="file://$PROJECT_DIR$/JsLibraries/bootstrapSwitch.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/toastr-1.1.5.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/bootstrap.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/backbone.debug.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/jquery.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/sugar.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/backbone.shortcuts.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/jquery.tablesorter.pager.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/handlebars.runtime.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/jquery.tablesorter.bootstrap.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/jquery.tablesorter.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/backbone.modelbinder.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/backbone.collectionbinder.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/fullcalendar.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/underscore.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/backbone.marionette.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/bootstrap.slider.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/backbone.marionette.viewswapper.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/backbone.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/backbone.mutators.js" /> - <root url="file://$PROJECT_DIR$/JsLibraries/require.js" /> - </CLASSES> - <SOURCES /> - </library> -</component> \ No newline at end of file diff --git a/UI/AddSeries/AddSeriesView.js b/UI/AddSeries/AddSeriesView.js index c199e9fb2..4372eadd1 100644 --- a/UI/AddSeries/AddSeriesView.js +++ b/UI/AddSeries/AddSeriesView.js @@ -1,13 +1,9 @@ -'use strict'; +'use strict'; define( [ 'marionette', 'AddSeries/Collection', 'AddSeries/SearchResultCollectionView', - 'Shared/SpinnerView', - 'app', - 'AddSeries/RootFolders/Collection', - 'AddSeries/SearchResultView', 'Shared/SpinnerView' ], function (Marionette, AddSeriesCollection, SearchResultCollectionView, SpinnerView) { return Marionette.Layout.extend({ diff --git a/UI/AddSeries/Collection.js b/UI/AddSeries/Collection.js index 404807184..36e71b397 100644 --- a/UI/AddSeries/Collection.js +++ b/UI/AddSeries/Collection.js @@ -1,12 +1,11 @@ -'use strict'; +'use strict'; define( [ - 'app', 'backbone', 'Series/SeriesModel' - ], function (App, Backbone, SeriesModel) { + ], function (Backbone, SeriesModel) { return Backbone.Collection.extend({ - url : Constants.ApiRoot + '/series/lookup', + url : window.ApiRoot + '/series/lookup', model: SeriesModel, parse: function (response) { diff --git a/UI/AddSeries/RootFolders/Collection.js b/UI/AddSeries/RootFolders/Collection.js index f0a9f9e71..c03a30753 100644 --- a/UI/AddSeries/RootFolders/Collection.js +++ b/UI/AddSeries/RootFolders/Collection.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict'; define( [ 'backbone', @@ -6,12 +6,12 @@ define( 'mixins/backbone.signalr.mixin' ], function (Backbone, RootFolderModel) { - var rootFolderCollection = Backbone.Collection.extend({ - url : NzbDrone.Constants.ApiRoot + '/rootfolder', + var RootFolderCollection = Backbone.Collection.extend({ + url : window.ApiRoot + '/rootfolder', model: RootFolderModel }); - var collection = new rootFolderCollection().BindSignalR(); + var collection = new RootFolderCollection().BindSignalR(); return collection; }); diff --git a/UI/Calendar/CalendarLayout.js b/UI/Calendar/CalendarLayout.js index 50894415e..4314df051 100644 --- a/UI/Calendar/CalendarLayout.js +++ b/UI/Calendar/CalendarLayout.js @@ -1,12 +1,12 @@ 'use strict'; -define([ - 'app', - 'Calendar/UpcomingCollectionView', - 'Calendar/CalendarView', - 'Shared/Toolbar/ToolbarLayout' -], - function () { - NzbDrone.Calendar.CalendarLayout = Backbone.Marionette.Layout.extend({ +define( + [ + 'marionette', + 'Calendar/UpcomingCollection', + 'Calendar/UpcomingCollectionView', + 'Calendar/CalendarView', + ], function (Marionette, UpcomingCollection, UpcomingCollectionView, CalendarView) { + return Marionette.Layout.extend({ template: 'Calendar/CalendarLayoutTemplate', regions: { @@ -15,7 +15,7 @@ define([ }, initialize: function () { - this.upcomingCollection = new NzbDrone.Calendar.UpcomingCollection(); + this.upcomingCollection = new UpcomingCollection(); this.upcomingCollection.fetch(); }, @@ -25,13 +25,13 @@ define([ }, _showUpcoming: function () { - this.upcoming.show(new NzbDrone.Calendar.UpcomingCollectionView({ + this.upcoming.show(new UpcomingCollectionView({ collection: this.upcomingCollection })); }, _showCalendar: function () { - this.calendar.show(new NzbDrone.Calendar.CalendarView()); + this.calendar.show(new CalendarView()); } }); }); diff --git a/UI/Calendar/CalendarView.js b/UI/Calendar/CalendarView.js index 03b517965..2575e94c3 100644 --- a/UI/Calendar/CalendarView.js +++ b/UI/Calendar/CalendarView.js @@ -1,81 +1,87 @@ -'use strict'; +'use strict'; -define(['app', 'Calendar/Collection','fullcalendar'], function () { - NzbDrone.Calendar.CalendarView = Backbone.Marionette.ItemView.extend({ - initialize : function () { - this.collection = new NzbDrone.Calendar.Collection(); - }, - render: function () { - $(this.$el).empty().fullCalendar({ - defaultView : 'basicWeek', - allDayDefault : false, - ignoreTimezone: false, - weekMode : 'variable', - timeFormat : 'h(:mm)tt', - header : { - left : 'prev,next today', - center: 'title', - right : 'month,basicWeek' - }, - buttonText : { - prev: '<i class="icon-arrow-left"></i>', - next: '<i class="icon-arrow-right"></i>' - }, - events : this.getEvents, - eventRender : function (event, element) { - $(element).addClass(event.statusLevel); - $(element).children('.fc-event-inner').addClass(event.statusLevel); +define( + [ + 'marionette', + 'Calendar/Collection', + 'fullcalendar' + ], function (Marionette, CalendarCollection) { - element.popover({ - title : '{seriesTitle} - {season}x{episode} - {episodeTitle}'.assign({ - seriesTitle : event.title, - season : event.seasonNumber, - episode : event.episodeNumber.pad(2), - episodeTitle: event.episodeTitle - }), - content : event.overview, - placement: 'bottom', - trigger : 'manual' - }); - }, - eventMouseover: function () { - $(this).popover('show'); - }, - eventMouseout : function () { - $(this).popover('hide'); - } - }); + var _instance; - NzbDrone.Calendar.CalendarView.Instance = this; - }, + return Marionette.ItemView.extend({ + initialize: function () { + this.collection = new CalendarCollection(); + }, + render : function () { + $(this.$el).empty().fullCalendar({ + defaultView : 'basicWeek', + allDayDefault : false, + ignoreTimezone: false, + weekMode : 'variable', + timeFormat : 'h(:mm)tt', + header : { + left : 'prev,next today', + center: 'title', + right : 'month,basicWeek' + }, + buttonText : { + prev: '<i class="icon-arrow-left"></i>', + next: '<i class="icon-arrow-right"></i>' + }, + events : this.getEvents, + eventRender : function (event, element) { + $(element).addClass(event.statusLevel); + $(element).children('.fc-event-inner').addClass(event.statusLevel); - onShow: function () { - this.$('.fc-button-today').click(); - }, + element.popover({ + title : '{seriesTitle} - {season}x{episode} - {episodeTitle}'.assign({ + seriesTitle : event.title, + season : event.seasonNumber, + episode : event.episodeNumber.pad(2), + episodeTitle: event.episodeTitle + }), + content : event.overview, + placement: 'bottom', + trigger : 'manual' + }); + }, + eventMouseover: function () { + $(this).popover('show'); + }, + eventMouseout : function () { + $(this).popover('hide'); + } + }); - getEvents: function (start, end, callback) { - var bbView = NzbDrone.Calendar.CalendarView.Instance; + _instance = this; + }, - var startDate = Date.create(start).format(Date.ISO8601_DATETIME); - var endDate = Date.create(end).format(Date.ISO8601_DATETIME); + onShow: function () { + this.$('.fc-button-today').click(); + }, - bbView.collection.fetch({ - data : { start: startDate, end: endDate }, - success: function (calendarCollection) { - _.each(calendarCollection.models, function (element) { - var episodeTitle = element.get('title'); - var seriesTitle = element.get('series').get('title'); - var start = element.get('airDate'); + getEvents: function (start, end, callback) { + var startDate = Date.create(start).format(Date.ISO8601_DATETIME); + var endDate = Date.create(end).format(Date.ISO8601_DATETIME); - element.set('title', seriesTitle); - element.set('episodeTitle', episodeTitle); - element.set('start', start); - element.set('allDay', false); - }); + _instance.collection.fetch({ + data : { start: startDate, end: endDate }, + success: function (calendarCollection) { + _.each(calendarCollection.models, function (element) { + var episodeTitle = element.get('title'); + var seriesTitle = element.get('series').get('title'); + var start = element.get('airDate'); - callback(calendarCollection.toJSON()); - } - }); - } + element.set('title', seriesTitle); + element.set('episodeTitle', episodeTitle); + element.set('start', start); + element.set('allDay', false); + }); + + callback(calendarCollection.toJSON()); + } + }); + } + }); }); -}); diff --git a/UI/Calendar/Collection.js b/UI/Calendar/Collection.js index 0752c3b57..64121cc54 100644 --- a/UI/Calendar/Collection.js +++ b/UI/Calendar/Collection.js @@ -1,13 +1,17 @@ -'use strict'; -define(['app', 'Series/EpisodeModel'], function () { - NzbDrone.Calendar.Collection = Backbone.Collection.extend({ - url : NzbDrone.Constants.ApiRoot + '/calendar', - model : NzbDrone.Series.EpisodeModel, +'use strict'; +define( + [ + 'backbone', + 'Series/EpisodeModel' + ], function (Backbone, EpisodeModel) { + return Backbone.Collection.extend({ + url : window.ApiRoot + '/calendar', + model: EpisodeModel, - comparator: function(model) { - var date = new Date(model.get('airDate')); - var time = date.getTime(); - return time; - } + comparator: function (model) { + var date = new Date(model.get('airDate')); + var time = date.getTime(); + return time; + } + }); }); -}); diff --git a/UI/Calendar/UpcomingCollection.js b/UI/Calendar/UpcomingCollection.js index 83294c0c3..e78f7aaa7 100644 --- a/UI/Calendar/UpcomingCollection.js +++ b/UI/Calendar/UpcomingCollection.js @@ -1,13 +1,17 @@ -'use strict'; -define(['app', 'Series/EpisodeModel'], function () { - NzbDrone.Calendar.UpcomingCollection = Backbone.Collection.extend({ - url : NzbDrone.Constants.ApiRoot + '/calendar', - model : NzbDrone.Series.EpisodeModel, +'use strict'; +define( + [ + 'backbone', + 'Series/EpisodeModel' + ], function (Backbone, EpisodeModel) { + return Backbone.Collection.extend({ + url : window.ApiRoot + '/calendar', + model: EpisodeModel, - comparator: function(model) { - var date = new Date(model.get('airDate')); - var time = date.getTime(); - return time; - } + comparator: function (model) { + var date = new Date(model.get('airDate')); + var time = date.getTime(); + return time; + } + }); }); -}); diff --git a/UI/Calendar/UpcomingCollectionView.js b/UI/Calendar/UpcomingCollectionView.js index 9cccbb165..2a9508bba 100644 --- a/UI/Calendar/UpcomingCollectionView.js +++ b/UI/Calendar/UpcomingCollectionView.js @@ -1,7 +1,11 @@ -'use strict'; +'use strict'; -define(['app', 'Calendar/UpcomingItemView'], function () { - NzbDrone.Calendar.UpcomingCollectionView = Backbone.Marionette.CollectionView.extend({ - itemView: NzbDrone.Calendar.UpcomingItemView +define( + [ + 'marionette', + 'Calendar/UpcomingItemView' + ], function (Marionette, UpcomingItemView) { + return Marionette.CollectionView.extend({ + itemView: UpcomingItemView + }); }); -}); diff --git a/UI/Calendar/UpcomingItemView.js b/UI/Calendar/UpcomingItemView.js index 78995d063..eec39440e 100644 --- a/UI/Calendar/UpcomingItemView.js +++ b/UI/Calendar/UpcomingItemView.js @@ -1,12 +1,11 @@ 'use strict'; -define([ - 'app', - 'Calendar/UpcomingCollection' - -], function () { - NzbDrone.Calendar.UpcomingItemView = Backbone.Marionette.ItemView.extend({ - template : 'Calendar/UpcomingItemTemplate', - tagName : 'div' +define( + [ + 'marionette' + ], function (Marionette) { + return Marionette.ItemView.extend({ + template: 'Calendar/UpcomingItemTemplate', + tagName : 'div' + }); }); -}); \ No newline at end of file diff --git a/UI/Calendar/calendar.less b/UI/Calendar/calendar.less index 0c4e1e7ae..7f6186f3a 100644 --- a/UI/Calendar/calendar.less +++ b/UI/Calendar/calendar.less @@ -1,121 +1,121 @@ .calendar { th, td { - border-color: #eeeeee; + border-color : #eeeeee; } .primary { - border-color: #007ccd; - background-color: #007ccd; + border-color : #007ccd; + background-color : #007ccd; } .fc-event-skin { - background-color: #007ccd; - border: 1px solid #007ccd; - border-radius: 4px; - text-align: center; + background-color : #007ccd; + border : 1px solid #007ccd; + border-radius : 4px; + text-align : center; } .info { - border-color: #14b8d4; - background-color: #14b8d4; + border-color : #14b8d4; + background-color : #14b8d4; } .inverse { - border-color: #333333; - background-color: #333333; + border-color : #333333; + background-color : #333333; } .warning { - border-color: #ffa93c; - background-color: #ffa93c; + border-color : #ffa93c; + background-color : #ffa93c; } .danger { - border-color: #ea494a; - background-color: #ea494a; + border-color : #ea494a; + background-color : #ea494a; } th { - background-color: #eeeeee; + background-color : #eeeeee; } .purple { - border-color: #7932ea; - background-color: #7932ea; + border-color : #7932ea; + background-color : #7932ea; } .success { - border-color: #4cb158; - background-color: #4cb158; + border-color : #4cb158; + background-color : #4cb158; } h2 { - font-size: 17.5px; + font-size : 17.5px; } } .event { - display: inline-block; - width: 100%; - margin-bottom: 10px; - border-top: 1px solid #eeeeee; - padding-top: 10px; + display : inline-block; + width : 100%; + margin-bottom : 10px; + border-top : 1px solid #eeeeee; + padding-top : 10px; .primary { - border-color: #007ccd; + border-color : #007ccd; } .info { - border-color: #14b8d4; + border-color : #14b8d4; } h4 { - text-transform: none !important; - font-weight: 500; - color: #008dcd; - margin: 5px 0px; + text-transform : none !important; + font-weight : 500; + color : #008dcd; + margin : 5px 0px; } .inverse { - border-color: #333333; + border-color : #333333; } .warning { - border-color: #ffa93c; + border-color : #ffa93c; } p { - color: #999999; + color : #999999; } .danger { - border-color: #ea494a; + border-color : #ea494a; } .date { - text-align: center; - display: inline-block; - border-left: 4px solid #eeeeee; - padding-left: 16px; - float: left; - margin-right: 20px; + text-align : center; + display : inline-block; + border-left : 4px solid #eeeeee; + padding-left : 16px; + float : left; + margin-right : 20px; h4 { - line-height: 1em; - color: #555555; - font-weight: 300; + line-height : 1em; + color : #555555; + font-weight : 300; } h1 { - font-weight: 500; - line-height: 0.8em; + font-weight : 500; + line-height : 0.8em; } } .purple { - border-color: #7932ea; + border-color : #7932ea; } .success { - border-color: #4cb158; + border-color : #4cb158; } -} \ No newline at end of file +} diff --git a/UI/Cells/AirDateCell.js b/UI/Cells/AirDateCell.js index 47a10b55b..9072fe22a 100644 --- a/UI/Cells/AirDateCell.js +++ b/UI/Cells/AirDateCell.js @@ -1,15 +1,19 @@ 'use strict'; -define(['app', 'Shared/FormatHelpers', 'Cells/NzbDroneCell'], function () { - return NzbDrone.Cells.NzbDroneCell.extend({ - className: 'air-date-cell', +define( + [ + 'backgrid', + 'Shared/FormatHelpers' + ], function (Backgrid, FormatHelpers) { + return Backgrid.Cell.extend({ + className: 'air-date-cell', - render: function () { + render: function () { - this.$el.empty(); - var airDate = this.model.get(this.column.get('name')); - this.$el.html(NzbDrone.Shared.FormatHelpers.DateHelper(airDate)); - return this; + this.$el.empty(); + var airDate = this.model.get(this.column.get('name')); + this.$el.html(FormatHelpers.DateHelper(airDate)); + return this; - } + } + }); }); -}); diff --git a/UI/Cells/EpisodeNumberCell.js b/UI/Cells/EpisodeNumberCell.js index 093d6ca15..6c982061b 100644 --- a/UI/Cells/EpisodeNumberCell.js +++ b/UI/Cells/EpisodeNumberCell.js @@ -1,49 +1,52 @@ 'use strict'; -define(['app', 'Cells/NzbDroneCell'], function () { - return NzbDrone.Cells.NzbDroneCell.extend({ +define( + [ + 'Cells/NzbDroneCell' + ], function (NzbDroneCell) { + return NzbDroneCell.extend({ - className: 'episode-number-cell', + className: 'episode-number-cell', - render: function () { + render: function () { - this.$el.empty(); + this.$el.empty(); - var airDateField = this.column.get('airDate') || 'airDate'; - var seasonField = this.column.get('seasonNumber') || 'seasonNumber'; - var episodeField = this.column.get('episodes') || 'episodeNumber'; + var airDateField = this.column.get('airDate') || 'airDate'; + var seasonField = this.column.get('seasonNumber') || 'seasonNumber'; + var episodeField = this.column.get('episodes') || 'episodeNumber'; - if (this.cellValue) { + if (this.cellValue) { - var airDate = this.cellValue.get(airDateField); - var seasonNumber = this.cellValue.get(seasonField); - var episodes = this.cellValue.get(episodeField); + var airDate = this.cellValue.get(airDateField); + var seasonNumber = this.cellValue.get(seasonField); + var episodes = this.cellValue.get(episodeField); - var result = 'Unknown'; + var result = 'Unknown'; - if (episodes) { + if (episodes) { - var paddedEpisodes; + var paddedEpisodes; - if (episodes.constructor === Array) { - paddedEpisodes = _.map(episodes,function (episodeNumber) { - return episodeNumber.pad(2); - }).join(); + if (episodes.constructor === Array) { + paddedEpisodes = _.map(episodes,function (episodeNumber) { + return episodeNumber.pad(2); + }).join(); + } + else { + paddedEpisodes = episodes.pad(2); + } + + result = 'S{0}-E{1}'.format(seasonNumber.pad(2), paddedEpisodes); } - else { - paddedEpisodes = episodes.pad(2); + else if (airDate) { + result = new Date(airDate).toLocaleDateString(); } - result = 'S{0}-E{1}'.format(seasonNumber.pad(2), paddedEpisodes); - } - else if (airDate) { - result = new Date(airDate).toLocaleDateString(); + this.$el.html(result); } - - this.$el.html(result); + this.delegateEvents(); + return this; } - this.delegateEvents(); - return this; - } + }); }); -}); diff --git a/UI/Cells/EpisodeStatusCell.js b/UI/Cells/EpisodeStatusCell.js index 4eee59c80..4c3e5ea62 100644 --- a/UI/Cells/EpisodeStatusCell.js +++ b/UI/Cells/EpisodeStatusCell.js @@ -1,34 +1,37 @@ 'use strict'; -define(['app','cells/nzbdronecell' ], function () { - return NzbDrone.Cells.NzbDroneCell.extend({ +define( + [ + 'backgrid' + ], function (Backgrid) { + return Backgrid.Cell.extend({ - className: 'episode-status-cell', + className: 'episode-status-cell', - render: function () { - this.$el.empty(); + render: function () { + this.$el.empty(); - if (this.model) { + if (this.model) { - var icon; + var icon; - if (this.model.get('episodeFile')) { - icon = 'icon-ok'; + if (this.model.get('episodeFile')) { + icon = 'icon-ok'; - } - else { - if (this.model.get('hasAired')) { - icon = 'icon-warning-sign'; } else { - icon = 'icon-time'; + if (this.model.get('hasAired')) { + icon = 'icon-warning-sign'; + } + else { + icon = 'icon-time'; + } } + + this.$el.html('<i class="{0}"/>'.format(icon)); } - this.$el.html('<i class="{0}"/>'.format(icon)); + return this; } - - return this; - } + }); }); -}); diff --git a/UI/Cells/EpisodeTitleCell.js b/UI/Cells/EpisodeTitleCell.js index 98681b0ac..7226e145f 100644 --- a/UI/Cells/EpisodeTitleCell.js +++ b/UI/Cells/EpisodeTitleCell.js @@ -1,22 +1,27 @@ 'use strict'; -define(['app', 'Cells/NzbDroneCell'], function () { - return NzbDrone.Cells.NzbDroneCell.extend({ +define( + [ + 'app', + 'Cells/NzbDroneCell', + 'Episode/Layout' + ], function (App, NzbDroneCell, EpisodeLayout) { + return NzbDroneCell.extend({ - className: 'episode-title-cell', + className: 'episode-title-cell', - events: { - 'click': 'showDetails' - }, + events: { + 'click': 'showDetails' + }, - showDetails: function () { - var view = new NzbDrone.Episode.Layout({ model: this.cellValue }); - NzbDrone.modalRegion.show(view); - }, + showDetails: function () { + var view = new EpisodeLayout({ model: this.cellValue }); + App.modalRegion.show(view); + }, - render: function () { - this.$el.html(this.cellValue.get('title')); - return this; - } + render: function () { + this.$el.html(this.cellValue.get('title')); + return this; + } + }); }); -}); diff --git a/UI/Cells/FileSizeCell.js b/UI/Cells/FileSizeCell.js index f3994bb2f..3606379b6 100644 --- a/UI/Cells/FileSizeCell.js +++ b/UI/Cells/FileSizeCell.js @@ -1,15 +1,19 @@ 'use strict'; -define(['app', 'Shared/FormatHelpers','backgrid'], function () { - NzbDrone.Cells.FileSizeCell = Backgrid.Cell.extend({ +define( + [ + 'backgrid', + 'Shared/FormatHelpers' + ], function (Backgrid, FormatHelpers) { + return Backgrid.Cell.extend({ - className: 'file-size-cell', + className: 'file-size-cell', - render: function () { - var size = this.model.get(this.column.get('name')); - this.$el.html(NzbDrone.Shared.FormatHelpers.FileSizeHelper(size)); - this.delegateEvents(); - return this; - } + render: function () { + var size = this.model.get(this.column.get('name')); + this.$el.html(FormatHelpers.FileSizeHelper(size)); + this.delegateEvents(); + return this; + } + }); }); -}); diff --git a/UI/Cells/IndexerCell.js b/UI/Cells/IndexerCell.js index 62cce919c..82fc80f48 100644 --- a/UI/Cells/IndexerCell.js +++ b/UI/Cells/IndexerCell.js @@ -1,13 +1,16 @@ 'use strict'; -define(['app','backgrid'], function () { - NzbDrone.Cells.IndexerCell = Backgrid.Cell.extend({ +define( + [ + 'backgrid' + ], function (Backgrid) { + return Backgrid.Cell.extend({ - class : 'indexer-cell', + class : 'indexer-cell', - render: function () { - var indexer = this.model.get(this.column.get('name')); - this.$el.html(indexer); - return this; - } + render: function () { + var indexer = this.model.get(this.column.get('name')); + this.$el.html(indexer); + return this; + } + }); }); -}); diff --git a/UI/Cells/NzbDroneCell.js b/UI/Cells/NzbDroneCell.js index 8c259085e..c43e6e71a 100644 --- a/UI/Cells/NzbDroneCell.js +++ b/UI/Cells/NzbDroneCell.js @@ -1,44 +1,47 @@ 'use strict'; -define(['app','backgrid'], function () { - NzbDrone.Cells.NzbDroneCell = Backgrid.Cell.extend({ +define( + [ + 'backgrid' + ], function (Backgrid) { + return Backgrid.Cell.extend({ - _originalInit: Backgrid.Cell.prototype.initialize, + _originalInit: Backgrid.Cell.prototype.initialize, - initialize: function () { - this._originalInit.apply(this, arguments); - this.cellValue = this._getValue(); + initialize: function () { + this._originalInit.apply(this, arguments); + this.cellValue = this._getValue(); - this.listenTo(this.model, 'change', this._refresh); - }, + this.listenTo(this.model, 'change', this._refresh); + }, - _refresh: function () { - this.cellValue = this._getValue(); - this.render(); - }, + _refresh: function () { + this.cellValue = this._getValue(); + this.render(); + }, - _getValue: function () { + _getValue: function () { - var name = this.column.get('name'); + var name = this.column.get('name'); - if (name === 'this') { - return this.model; - } + if (name === 'this') { + return this.model; + } - var value = this.model.get(name); + var value = this.model.get(name); - if (!value) { - return undefined; - } + if (!value) { + return undefined; + } - //if not a model - if (!value.get && typeof value === 'object') { - value = new Backbone.Model(value); - } + //if not a model + if (!value.get && typeof value === 'object') { + value = new Backbone.Model(value); + } - return value; - } + return value; + } + }); }); -}); diff --git a/UI/Cells/QualityCell.js b/UI/Cells/QualityCell.js index 452d8fceb..d46ac4531 100644 --- a/UI/Cells/QualityCell.js +++ b/UI/Cells/QualityCell.js @@ -1,9 +1,12 @@ 'use strict'; -define(['app', 'Cells/TemplatedCell'], function (App, TemplatedCell) { - return TemplatedCell.extend({ +define( + [ + 'Cells/TemplatedCell' + ], function (TemplatedCell) { + return TemplatedCell.extend({ - className: 'quality-cell', - template : 'Cells/QualityTemplate' + className: 'quality-cell', + template : 'Cells/QualityTemplate' + }); }); -}); diff --git a/UI/Cells/RelativeDateCell.js b/UI/Cells/RelativeDateCell.js index 826516d41..314aff53c 100644 --- a/UI/Cells/RelativeDateCell.js +++ b/UI/Cells/RelativeDateCell.js @@ -1,15 +1,18 @@ 'use strict'; -define(['app','Cells/NzbDroneCell'], function () { - return NzbDrone.Cells.NzbDroneCell.extend({ +define( + [ + 'Cells/NzbDroneCell' + ], function (NzbDroneCell) { + return NzbDroneCell.extend({ - className : 'relative-date-cell', + className: 'relative-date-cell', - render: function () { + render: function () { - var date = this.model.get(this.column.get('name')); - this.$el.html(Date.create(date).relative()); + var date = this.model.get(this.column.get('name')); + this.$el.html(Date.create(date).relative()); - return this; - } + return this; + } + }); }); -}); diff --git a/UI/Cells/SeriesStatusCell.js b/UI/Cells/SeriesStatusCell.js deleted file mode 100644 index 1bbd0a062..000000000 --- a/UI/Cells/SeriesStatusCell.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; -define(['app','cells/nzbdronecell'], function () { - return NzbDrone.Cells.NzbDroneCell.extend({ - className: 'series-status-cell', - - render: function () { - this.$el.empty(); - var monitored = this.model.get('monitored'); - var status = this.model.get('status'); - - if (!monitored) { - this.$el.html('<i class="icon-pause grid-icon" title="Not Monitored"></i>'); - } - else if (status === 'continuing') { - this.$el.html('<i class="icon-play grid-icon" title="Continuing"></i>'); - } - - else { - this.$el.html('<i class="icon-stop grid-icon" title="Ended"></i>'); - } - - return this; - } - }); -}); diff --git a/UI/Cells/SeriesTitleCell.js b/UI/Cells/SeriesTitleCell.js index 7fae88d17..2421ab72a 100644 --- a/UI/Cells/SeriesTitleCell.js +++ b/UI/Cells/SeriesTitleCell.js @@ -1,9 +1,12 @@ 'use strict'; -define(['app', 'Cells/TemplatedCell'], function (App, TemplatedCell) { - return TemplatedCell.extend({ +define( + [ + 'Cells/TemplatedCell' + ], function (TemplatedCell) { + return TemplatedCell.extend({ - className: 'series-title', - template : 'Cells/SeriesTitleTemplate' + className: 'series-title', + template : 'Cells/SeriesTitleTemplate' + }); }); -}); diff --git a/UI/Cells/TemplatedCell.js b/UI/Cells/TemplatedCell.js index fbf0f2528..1c82ef9d6 100644 --- a/UI/Cells/TemplatedCell.js +++ b/UI/Cells/TemplatedCell.js @@ -1,17 +1,23 @@ 'use strict'; -define(['app','Cells/NzbDroneCell'], function () { - return NzbDrone.Cells.NzbDroneCell.extend({ - render: function () { +define( + [ + 'marionette', + 'Cells/NzbDroneCell' + ], function (Marionette, NzbDroneCell) { + return NzbDroneCell.extend({ - var templateName = this.column.get('template') || this.template; - this.templateFunction = Marionette.TemplateCache.get(templateName); - var data = this.cellValue.toJSON(); - var html = this.templateFunction(data); - this.$el.html(html); + render: function () { - return this; - } + var templateName = this.column.get('template') || this.template; + + this.templateFunction = Marionette.TemplateCache.get(templateName); + var data = this.cellValue.toJSON(); + var html = this.templateFunction(data); + this.$el.html(html); + + return this; + } + }); }); -}); diff --git a/UI/Cells/ToggleCell.js b/UI/Cells/ToggleCell.js index 612955e84..ebe82af8e 100644 --- a/UI/Cells/ToggleCell.js +++ b/UI/Cells/ToggleCell.js @@ -1,39 +1,42 @@ 'use strict'; -define(['app', 'Episode/Layout'], function () { - return Backgrid.Cell.extend({ +define( + [ + 'backgrid' + ], function (Backgrid) { + return Backgrid.Cell.extend({ - className: 'toggle-cell clickable', + className: 'toggle-cell clickable', - events: { - 'click': '_onClick' - }, + events: { + 'click': '_onClick' + }, - _onClick: function () { - var name = this.column.get('name'); - this.model.set(name, !this.model.get(name)); - this.render(); + _onClick: function () { + var name = this.column.get('name'); + this.model.set(name, !this.model.get(name)); + this.render(); - this.model.save(); - }, + this.model.save(); + }, - render: function () { - this.$el.empty(); + render: function () { + this.$el.empty(); - this.$el.html('<i />'); + this.$el.html('<i />'); - var name = this.column.get('name'); + var name = this.column.get('name'); - if (this.model.get(name)) { - this.$('i').addClass(this.column.get('trueClass')); + if (this.model.get(name)) { + this.$('i').addClass(this.column.get('trueClass')); + } + else { + this.$('i').addClass(this.column.get('falseClass')); + } + return this; } - else { - this.$('i').addClass(this.column.get('falseClass')); - } - return this; - } + }); }); -}); diff --git a/UI/Commands/CommandController.js b/UI/Commands/CommandController.js index 2b7bc3e90..c10d66ae5 100644 --- a/UI/Commands/CommandController.js +++ b/UI/Commands/CommandController.js @@ -1,17 +1,16 @@ 'use strict'; -define(['app'], function () { +define({ + Execute: function (name, properties) { + var data = { command: name }; - NzbDrone.Commands.Execute = function (name, properties) { - var data = { command: name }; + if (properties) { + $.extend(data, properties); + } - if (properties) { - $.extend(data, properties); + return $.ajax({ + type: 'POST', + url : window.ApiRoot + '/command', + data: JSON.stringify(data) + }); } - - return $.ajax({ - type: 'POST', - url : NzbDrone.Constants.ApiRoot + '/command', - data: JSON.stringify(data) - }); - }; -}); + }); diff --git a/UI/Config.js b/UI/Config.js index 6382c91b5..9d9708a60 100644 --- a/UI/Config.js +++ b/UI/Config.js @@ -2,41 +2,38 @@ define( [ 'app' - ], function () { - - NzbDrone.Config = { + ], function (App) { + return { Events: { ConfigUpdatedEvent: 'ConfigUpdatedEvent' }, Keys : { DefaultQualityProfileId: 'DefaultQualityProfileId' - } - }; - - NzbDrone.Config.GetValue = function (key, defaultValue) { + }, - var storeValue = localStorage.getItem(key); + GetValue: function (key, defaultValue) { - if (!storeValue) { - return defaultValue; - } + var storeValue = localStorage.getItem(key); - return storeValue.toString(); - }; + if (!storeValue) { + return defaultValue; + } - NzbDrone.Config.SetValue = function (key, value) { + return storeValue.toString(); + }, - console.log('Config: [{0}] => [{1}] '.format(key, value)); + SetValue: function (key, value) { - if (NzbDrone.Config.GetValue(key) === value.toString()) { - return; - } + console.log('Config: [{0}] => [{1}] '.format(key, value)); - localStorage.setItem(key, value); - NzbDrone.vent.trigger(NzbDrone.Config.Events.ConfigUpdatedEvent, {key: key, value: value}); + if (this.GetValue(key) === value.toString()) { + return; + } - }; + localStorage.setItem(key, value); + App.vent.trigger(this.Events.ConfigUpdatedEvent, {key: key, value: value}); - return NzbDrone.Config; + } + }; }); diff --git a/UI/Content/Messenger/messenger.future.css b/UI/Content/Messenger/messenger.future.css index 2c441d143..89aa3bd66 100644 --- a/UI/Content/Messenger/messenger.future.css +++ b/UI/Content/Messenger/messenger.future.css @@ -244,10 +244,6 @@ ul.messenger-theme-future { -ms-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; - -moz-user-select: none; - -webkit-user-select: none; - -o-user-select: none; - user-select: none; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5c5b5b), color-stop(100%, #353535)); background-image: -webkit-linear-gradient(#5c5b5b, #353535); background-image: -moz-linear-gradient(#5c5b5b, #353535); diff --git a/UI/Content/form.less b/UI/Content/form.less index e568abc91..e6569d70b 100644 --- a/UI/Content/form.less +++ b/UI/Content/form.less @@ -1,4 +1,4 @@ -.control-group { +.control-group { .controls { i.danger { color: #b94a48; @@ -19,6 +19,14 @@ margin-bottom: 0px; } + + + + + + + + .help-inline-checkbox { padding-left: 5px; display: inline-block; @@ -35,6 +43,8 @@ font-size: 12px; } + + textarea.nzb-restrictions { width: 260px; -} \ No newline at end of file +} diff --git a/UI/Controller.js b/UI/Controller.js index 9227a35c7..cdee651c1 100644 --- a/UI/Controller.js +++ b/UI/Controller.js @@ -1,40 +1,36 @@ -'use strict'; +'use strict'; define( [ 'app', + 'marionette', + 'History/HistoryLayout', 'Settings/SettingsLayout', 'AddSeries/AddSeriesLayout', - 'Missing/MissingLayout', - 'History/HistoryLayout', - 'Form/FormBuilder', 'Series/Index/SeriesIndexLayout', - 'Calendar/CalendarLayout', - 'Shared/NotificationView', - 'Shared/NotFoundView', - 'MainMenuView', 'Series/Details/SeriesDetailsLayout', - 'Series/EpisodeCollection', + 'Missing/MissingLayout', + 'Series/SeriesModel', + 'Calendar/CalendarLayout', 'Logs/Layout', 'Release/Layout', - 'Shared/FormatHelpers', - 'Shared/TemplateHelpers', - 'Shared/Footer/View' - ], function (App, SettingsLayout, AddSeriesLayout, MissingLayout, HistoryLayout) { - var controller = Backbone.Marionette.Controller.extend({ + 'Shared/NotFoundView' + ], function (App, Marionette, HistoryLayout, SettingsLayout, AddSeriesLayout, SeriesIndexLayout, SeriesDetailsLayout, MissingLayout, SeriesModel, CalendarLayout, NotFoundView, + LogsLayout, ReleaseLayout) { + return Marionette.Controller.extend({ series : function () { this._setTitle('NzbDrone'); - App.mainRegion.show(new NzbDrone.Series.Index.SeriesIndexLayout()); + App.mainRegion.show(new SeriesIndexLayout()); }, seriesDetails: function (query) { var self = this; this._setTitle('Loading Series'); - var series = new NzbDrone.Series.SeriesModel({ id: query }); + var series = new SeriesModel({ id: query }); series.fetch({ success: function (seriesModel) { self._setTitle(seriesModel.get('title')); - App.mainRegion.show(new NzbDrone.Series.Details.SeriesDetailsLayout({ model: seriesModel })); + App.mainRegion.show(new SeriesDetailsLayout({ model: seriesModel })); } }); }, @@ -46,7 +42,7 @@ define( calendar: function () { this._setTitle('Calendar'); - App.mainRegion.show(new NzbDrone.Calendar.CalendarLayout()); + App.mainRegion.show(new CalendarLayout()); }, @@ -69,17 +65,17 @@ define( rss: function () { this._setTitle('RSS'); - App.mainRegion.show(new NzbDrone.Release.Layout()); + App.mainRegion.show(new ReleaseLayout()); }, logs: function () { this._setTitle('logs'); - App.mainRegion.show(new NzbDrone.Logs.Layout()); + App.mainRegion.show(new LogsLayout()); }, notFound: function () { this._setTitle('Not Found'); - App.mainRegion.show(new NzbDrone.Shared.NotFoundView(this)); + App.mainRegion.show(new NotFoundView(this)); }, @@ -112,8 +108,5 @@ define( } } }); - - return new controller(); - }); diff --git a/UI/Episode/Layout.js b/UI/Episode/Layout.js index 30a244f4e..1caee5abf 100644 --- a/UI/Episode/Layout.js +++ b/UI/Episode/Layout.js @@ -1,78 +1,85 @@ 'use strict'; -define(['app', 'Shared/SpinnerView', 'Episode/Summary/View', 'Episode/Search/Layout', 'Release/Collection'], function () { +define( + [ + 'marionette', + 'Episode/Summary/View', + 'Episode/Search/Layout', + 'Release/Collection', + 'Shared/SpinnerView' + ], function (Marionette, SummaryView, SearchLayout, ReleaseCollection, SpinnerView) { - NzbDrone.Episode.Layout = Backbone.Marionette.Layout.extend({ - template: 'Episode/LayoutTemplate', + return Marionette.Layout.extend({ + template: 'Episode/LayoutTemplate', - regions: { - summary : '#episode-summary', - activity: '#episode-activity', - search : '#episode-search' - }, + regions: { + summary : '#episode-summary', + activity: '#episode-activity', + search : '#episode-search' + }, - ui: { - summary : '.x-episode-summary', - activity: '.x-episode-activity', - search : '.x-episode-search' - }, + ui: { + summary : '.x-episode-summary', + activity: '.x-episode-activity', + search : '.x-episode-search' + }, - events: { + events: { - 'click .x-episode-summary' : 'showSummary', - 'click .x-episode-activity': 'showActivity', - 'click .x-episode-search' : 'showSearch' - }, + 'click .x-episode-summary' : 'showSummary', + 'click .x-episode-activity': 'showActivity', + 'click .x-episode-search' : 'showSearch' + }, - onShow: function () { - this.showSummary(); - this._releaseSearchActivated = false; - }, + onShow: function () { + this.showSummary(); + this._releaseSearchActivated = false; + }, - showSummary: function (e) { - if (e) { - e.preventDefault(); - } + showSummary: function (e) { + if (e) { + e.preventDefault(); + } - this.ui.summary.tab('show'); - this.summary.show(new NzbDrone.Episode.Summary.View({model: this.model})); + this.ui.summary.tab('show'); + this.summary.show(new SummaryView({model: this.model})); - }, + }, - showActivity: function (e) { - if (e) { - e.preventDefault(); - } + showActivity: function (e) { + if (e) { + e.preventDefault(); + } - this.ui.activity.tab('show'); - }, + this.ui.activity.tab('show'); + }, - showSearch: function (e) { - if (e) { - e.preventDefault(); - } + showSearch: function (e) { + if (e) { + e.preventDefault(); + } - if (this._releaseSearchActivated) { - return; - } + if (this._releaseSearchActivated) { + return; + } - var self = this; + var self = this; - this.ui.search.tab('show'); - this.search.show(new NzbDrone.Shared.SpinnerView()); + this.ui.search.tab('show'); + this.search.show(new SpinnerView()); - var releases = new NzbDrone.Release.Collection(); - var promise = releases.fetchEpisodeReleases(this.model.id); + var releases = new ReleaseCollection(); + var promise = releases.fetchEpisodeReleases(this.model.id); - promise.done(function () { - if (!self.isClosed) { - self.search.show(new NzbDrone.Episode.Search.Layout({collection: releases})); - } - }); - } + promise.done(function () { + if (!self.isClosed) { + self.search.show(new SearchLayout({collection: releases})); + } + }); + } - }); + }); -}); + }); diff --git a/UI/Episode/Search/Layout.js b/UI/Episode/Search/Layout.js index 3c38dd007..e4e5d68e2 100644 --- a/UI/Episode/Search/Layout.js +++ b/UI/Episode/Search/Layout.js @@ -1,68 +1,70 @@ 'use strict'; -define([ - 'app', - 'Cells/FileSizeCell', - 'Cells/QualityCell', - 'Release/ApprovalStatusCell', - 'Release/DownloadReportCell' -], function () { +define( + [ + 'marionette', + 'backgrid', + 'Cells/FileSizeCell', + 'Cells/QualityCell', + 'Release/ApprovalStatusCell', + 'Release/DownloadReportCell' + ], function (Marionette, Backgrid, FileSizeCell, QualityCell, ApprovalStatusCell, DownloadReportCell) { - NzbDrone.Episode.Search.Layout = Backbone.Marionette.Layout.extend({ - template: 'Episode/Search/LayoutTemplate', + return Marionette.Layout.extend({ + template: 'Episode/Search/LayoutTemplate', - regions: { - grid: '#episode-release-grid' - }, - - columns: [ - { - name : 'age', - label : 'Age', - sortable: true, - cell : Backgrid.IntegerCell - }, - { - name : 'title', - label : 'Title', - sortable: true, - cell : Backgrid.StringCell - }, - { - name : 'size', - label : 'Size', - sortable: true, - cell : NzbDrone.Cells.FileSizeCell - }, - { - name : 'quality', - label : 'Quality', - sortable: true, - cell : NzbDrone.Cells.QualityCell + regions: { + grid: '#episode-release-grid' }, - { - name : 'rejections', - label: 'decision', - cell : NzbDrone.Release.ApprovalStatusCell - }, - { - name : 'download', - label: '', - cell : NzbDrone.Release.DownloadReportCell - } - ], + columns: + [ + { + name : 'age', + label : 'Age', + sortable: true, + cell : Backgrid.IntegerCell + }, + { + name : 'title', + label : 'Title', + sortable: true, + cell : Backgrid.StringCell + }, + { + name : 'size', + label : 'Size', + sortable: true, + cell : FileSizeCell + }, + { + name : 'quality', + label : 'Quality', + sortable: true, + cell : QualityCell + }, - onShow: function () { - if (!this.isClosed) { - this.grid.show(new Backgrid.Grid( { + name : 'rejections', + label: 'decision', + cell : ApprovalStatusCell + }, + { + name : 'download', + label: '', + cell : DownloadReportCell + } + ], + + onShow: function () { + if (!this.isClosed) { + this.grid.show(new Backgrid.Grid({ row : Backgrid.Row, columns : this.columns, collection: this.collection, className : 'table table-hover' })); + } } - } - }); + }); -}); + }); diff --git a/UI/Episode/Summary/View.js b/UI/Episode/Summary/View.js index a1ea1fb18..193e9bd7c 100644 --- a/UI/Episode/Summary/View.js +++ b/UI/Episode/Summary/View.js @@ -1,8 +1,11 @@ 'use strict'; -define(['app'], function () { +define( + [ + 'marionette' + ], function (Marionette) { - NzbDrone.Episode.Summary.View = Backbone.Marionette.ItemView.extend({ - template: 'Episode/Summary/ViewTemplate' - }); + return Marionette.ItemView.extend({ + template: 'Episode/Summary/ViewTemplate' + }); -}); + }); diff --git a/UI/Form/FormBuilder.js b/UI/Form/FormBuilder.js index 1db81c9f6..4bc3a12f4 100644 --- a/UI/Form/FormBuilder.js +++ b/UI/Form/FormBuilder.js @@ -1,31 +1,50 @@ 'use strict'; -define(['app', 'handlebars'], function (App,Handlebars) { - Handlebars.registerHelper('formBuilder', function () { - var ret = ''; - _.each(this.fields, function (field) { - ret += NzbDrone.Form.FieldBuilder(field); - }); +define( + [ + 'handlebars' + ], function (Handlebars) { - return new Handlebars.SafeString(ret); - }); + var formBuilder = function (field) { + if (!field.type) { + return Handlebars.helpers.partial.apply(field, + [ + 'Form/TextboxTemplate' + ]); + } + + if (field.type === 'password') { + return Handlebars.helpers.partial.apply(field, + [ + 'Form/PasswordTemplate' + ]); + } - NzbDrone.Form.FieldBuilder = function (field) { - if (!field.type) { - return Handlebars.helpers.partial.apply(field, ['Form/TextboxTemplate']); - } + if (field.type === 'checkbox') { + return Handlebars.helpers.partial.apply(field, + [ + 'Form/CheckboxTemplate' + ]); + } - if (field.type === 'password') { - return Handlebars.helpers.partial.apply(field, ['Form/PasswordTemplate']); - } + if (field.type === 'select') { + return Handlebars.helpers.partial.apply(field, + [ + 'Form/SelectTemplate' + ]); + } - if (field.type === 'checkbox') { - return Handlebars.helpers.partial.apply(field, ['Form/CheckboxTemplate']); - } + return Handlebars.helpers.partial.apply(field, + [ + 'Form/TextboxTemplate' + ]); + }; - if (field.type === 'select') { - return Handlebars.helpers.partial.apply(field, ['Form/SelectTemplate']); - } + Handlebars.registerHelper('formBuilder', function () { + var ret = ''; + _.each(this.fields, function (field) { + ret += this.FieldBuilder(field); + }); - return Handlebars.helpers.partial.apply(field, ['Form/TextboxTemplate']); - }; -}); + return new Handlebars.SafeString(ret); + }); + }); diff --git a/UI/Handlebars/backbone.marionette.templates.js b/UI/Handlebars/backbone.marionette.templates.js index 061575c18..73a72794a 100644 --- a/UI/Handlebars/backbone.marionette.templates.js +++ b/UI/Handlebars/backbone.marionette.templates.js @@ -1,30 +1,33 @@ -'use strict'; +'use strict'; -define(['templates'], function (Templates) { - return function () { - this.get = function (templateId) { +define( + [ + 'templates' + ], function (Templates) { + return function () { + this.get = function (templateId) { - var templateKey = templateId.toLowerCase(); + var templateKey = templateId.toLowerCase(); - var templateFunction = Templates[templateKey]; + var templateFunction = Templates[templateKey]; - if (!templateFunction) { - throw 'couldn\'t find pre-compiled template ' + templateKey; - } - - return function (data) { - - try { - return templateFunction(data); - } - catch (error) { - console.error('template render failed for ' + templateKey + ' ' + error); - console.error(data); - throw error; + if (!templateFunction) { + throw 'couldn\'t find pre-compiled template ' + templateKey; } + + return function (data) { + + try { + return templateFunction(data); + } + catch (error) { + console.error('template render failed for ' + templateKey + ' ' + error); + console.error(data); + throw error; + } + }; }; }; - }; -}); + }); diff --git a/UI/History/Collection.js b/UI/History/Collection.js index edbd0ec33..644e9ac3a 100644 --- a/UI/History/Collection.js +++ b/UI/History/Collection.js @@ -1,37 +1,41 @@ -'use strict'; -define(['app', 'History/Model', 'backbone.pageable'], function (App, HistoryModel, PageableCollection) { - return PageableCollection.extend({ - url : NzbDrone.Constants.ApiRoot + '/history', - model : NzbDrone.History.Model, +'use strict'; +define( + [ + 'History/Model', + 'backbone.pageable' + ], function ( HistoryModel, PageableCollection) { + return PageableCollection.extend({ + url : window.ApiRoot + '/history', + model: HistoryModel, - state: { - pageSize: 15, - sortKey: 'date', - order: 1 - }, + state: { + pageSize: 15, + sortKey : 'date', + order : 1 + }, - queryParams: { - totalPages: null, - totalRecords: null, - pageSize: 'pageSize', - sortKey: 'sortKey', - order: 'sortDir', - directions: { - '-1': 'asc', - '1': 'desc' - } - }, + queryParams: { + totalPages : null, + totalRecords: null, + pageSize : 'pageSize', + sortKey : 'sortKey', + order : 'sortDir', + directions : { + '-1': 'asc', + '1' : 'desc' + } + }, - parseState: function (resp, queryParams, state) { - return {totalRecords: resp.totalRecords}; - }, + parseState: function (resp) { + return {totalRecords: resp.totalRecords}; + }, - parseRecords: function (resp) { - if (resp) { - return resp.records; - } + parseRecords: function (resp) { + if (resp) { + return resp.records; + } - return resp; - } + return resp; + } + }); }); -}); diff --git a/UI/History/EventTypeCell.js b/UI/History/EventTypeCell.js index e5acc4112..c91af5db1 100644 --- a/UI/History/EventTypeCell.js +++ b/UI/History/EventTypeCell.js @@ -1,41 +1,44 @@ 'use strict'; -define(['app', 'Cells/NzbDroneCell' ], function () { - return NzbDrone.Cells.NzbDroneCell.extend({ - - className: 'history-event-type-cell', - - render: function () { - this.$el.empty(); - - if (this.cellValue) { - - var icon; - var toolTip; - - switch (this.cellValue) { - case 'grabbed': - icon = 'icon-cloud-download'; - toolTip = 'Episode grabbed from indexer and sent to download client'; - break; - case 'seriesFolderImported': - icon = 'icon-hdd'; - toolTip = 'Existing episode file added to library'; - break; - case 'downloadFolderImported': - icon = 'icon-download-alt'; - toolTip = 'Episode downloaded successfully and picked up from download client'; - break; - default : - icon = 'icon-question'; - toolTip = 'unknown event'; - +define( + [ + 'Cells/NzbDroneCell' + ], function (NzbDroneCell) { + return NzbDroneCell.extend({ + + className: 'history-event-type-cell', + + render: function () { + this.$el.empty(); + + if (this.cellValue) { + + var icon; + var toolTip; + + switch (this.cellValue) { + case 'grabbed': + icon = 'icon-cloud-download'; + toolTip = 'Episode grabbed from indexer and sent to download client'; + break; + case 'seriesFolderImported': + icon = 'icon-hdd'; + toolTip = 'Existing episode file added to library'; + break; + case 'downloadFolderImported': + icon = 'icon-download-alt'; + toolTip = 'Episode downloaded successfully and picked up from download client'; + break; + default : + icon = 'icon-question'; + toolTip = 'unknown event'; + + } + + this.$el.html('<i class="{0}" title="{1}"/>'.format(icon, toolTip)); } - this.$el.html('<i class="{0}" title="{1}"/>'.format(icon, toolTip)); + return this; } - - return this; - } + }); }); -}); diff --git a/UI/History/HistoryLayout.js b/UI/History/HistoryLayout.js index c7b05fe0e..137ac8b52 100644 --- a/UI/History/HistoryLayout.js +++ b/UI/History/HistoryLayout.js @@ -1,33 +1,19 @@ 'use strict'; -define([ - 'app', - 'History/Collection', - 'History/EventTypeCell', - 'Cells/RelativeDateCell', - 'Cells/TemplatedCell', - 'Cells/SeriesTitleCell', - 'Cells/EpisodeNumberCell', - 'Cells/EpisodeTitleCell', - 'Cells/QualityCell', - 'Shared/Toolbar/ToolbarLayout', - 'Shared/Grid/Pager', - 'Shared/Grid/HeaderCell', - 'Shared/LoadingView' -], - function (App, - HistoryCollection, - EventTypeCell, - RelativeDateCell, - TemplatedCell, - SeriesTitleCell, - EpisodeNumberCell, - EpisodeTitleCell, - QualityCell, - ToolbarLayout, - Pager, - HeaderCell, - LoadingView) { - return Backbone.Marionette.Layout.extend({ +define( + [ + 'marionette', + 'backgrid', + 'History/Collection', + 'History/EventTypeCell', + 'Cells/SeriesTitleCell', + 'Cells/EpisodeNumberCell', + 'Cells/EpisodeTitleCell', + 'Cells/QualityCell', + 'Cells/RelativeDateCell', + 'Shared/Grid/Pager', + 'Shared/LoadingView' + ], function (Marionette, Backgrid, HistoryCollection, EventTypeCell, SeriesTitleCell, EpisodeNumberCell, EpisodeTitleCell, QualityCell, RelativeDateCell, GridPager, LoadingView) { + return Marionette.Layout.extend({ template: 'History/HistoryLayoutTemplate', regions: { @@ -36,54 +22,53 @@ define([ pager : '#x-pager' }, - columns: [ - { - name: 'eventType', - label:'', - cell : EventTypeCell - }, - { - name : 'series', - label : 'Series', - cell : SeriesTitleCell - }, - { - name : 'episode', - label : 'Episode', - sortable: false, - cell : EpisodeNumberCell - }, - { - name : 'episode', - label : 'Episode Title', - sortable: false, - cell : EpisodeTitleCell - }, - { - name : 'quality', - label : 'Quality', - cell : QualityCell - }, - { - name : 'date', - label: 'Date', - cell : RelativeDateCell - } - ], + columns: + [ + { + name : 'eventType', + label: '', + cell : EventTypeCell + }, + { + name : 'series', + label: 'Series', + cell : SeriesTitleCell + }, + { + name : 'episode', + label : 'Episode', + sortable: false, + cell : EpisodeNumberCell + }, + { + name : 'episode', + label : 'Episode Title', + sortable: false, + cell : EpisodeTitleCell + }, + { + name : 'quality', + label: 'Quality', + cell : QualityCell + }, + { + name : 'date', + label: 'Date', + cell : RelativeDateCell + } + ], - _showTable: function () { + _showTable: function (collection) { - this.history.show(new Backgrid.Grid( - { - row : NzbDrone.History.Row, - columns : this.columns, - collection: this.historyCollection, - className : 'table table-hover' - })); + this.history.show(new Backgrid.Grid({ + columns : this.columns, + collection: collection, + className : 'table table-hover' + })); - this.pager.show(new Pager({ + this.pager.show(new GridPager({ columns : this.columns, - collection: this.historyCollection + collection: collection })); }, @@ -92,16 +77,11 @@ define([ this.history.show(new LoadingView()); - this.historyCollection = new HistoryCollection(); - this.historyCollection.fetch() - .done(function () { - self._showTable(); - }); - - //this.toolbar.show(new NzbDrone.Shared.Toolbar.ToolbarLayout({right: [ viewButtons], context: this})); + var collection = new HistoryCollection(); + collection.fetch().done(function () { + self._showTable(collection); + }); } - }) - ; - }) -; + }); + }); diff --git a/UI/History/Model.js b/UI/History/Model.js index 8ca6098df..40496f8c8 100644 --- a/UI/History/Model.js +++ b/UI/History/Model.js @@ -1,22 +1,25 @@ -'use strict'; -define(['app','Series/SeriesModel', 'Series/EpisodeModel'], function () { - NzbDrone.History.Model = Backbone.Model.extend({ - mutators: { - seasonNumber: function () { - return this.get('episode').seasonNumber; +'use strict'; +define( + [ + 'backbone', + 'Series/SeriesModel', + 'Series/EpisodeModel' + ], function (Backbone, SeriesModel, EpisodeModel) { + return Backbone.Model.extend({ + mutators: { + seasonNumber: function () { + return this.get('episode').seasonNumber; + }, + + paddedEpisodeNumber: function () { + return this.get('episode').episodeNumber.pad(2); + } }, - paddedEpisodeNumber: function () { - return this.get('episode').episodeNumber.pad(2); + parse: function (model) { + model.series = new SeriesModel(model.series); + model.episode = new EpisodeModel(model.episode); + return model; } - }, - - parse: function (model) { - model.series = new NzbDrone.Series.SeriesModel(model.series); - model.episode = new NzbDrone.Series.EpisodeModel(model.episode); - return model; - } - - + }); }); -}); diff --git a/UI/Index.html b/UI/Index.html index 44694d987..45305217a 100644 --- a/UI/Index.html +++ b/UI/Index.html @@ -1,28 +1,28 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>NzbDrone</title> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> - <link href="/content/font.css" rel='stylesheet' type='text/css'/> - <link href="/content/bootstrap.css" rel='stylesheet' type='text/css'/> - <link href="/content/bootstrap.slider.css" rel='stylesheet' type='text/css'/> + <link href="/Content/Font.css" rel='stylesheet' type='text/css'/> + <link href="/Content/Bootstrap.css" rel='stylesheet' type='text/css'/> + <link href="/Content/bootstrap.slider.css" rel='stylesheet' type='text/css'/> <link href="/Content/Messenger/messenger.css" rel='stylesheet' type='text/css'/> <link href="/Content/Messenger/messenger.future.css" rel='stylesheet' type='text/css'/> - <link href="/content/theme.css" rel='stylesheet' type='text/css'> - <link href="/Cells/cells.css" rel='stylesheet' type='text/css'> - <link href="/content/fullcalendar.css" rel='stylesheet' type='text/css'> - <link href="/content/backbone.css" rel='stylesheet' type='text/css'/> - <link href="/content/backbone.backgrid.filter.css" rel='stylesheet' type='text/css'/> - <link href="/content/bootstrap.toggle-switch.css" rel='stylesheet' type='text/css'/> - <link href="/AddSeries/addseries.css" rel='stylesheet' type='text/css'/> - <link href="/content/menu.css" rel='stylesheet' type='text/css'/> - <link href="/content/form.css" rel='stylesheet' type='text/css'/> - <link href="/series/series.css" rel='stylesheet' type='text/css'/> - <link href="/series/details.css" rel='stylesheet' type='text/css'/> - <link href="/content/base.css" rel='stylesheet' type='text/css'/> - <link href="/settings/notifications/notifications.css" rel='stylesheet' type='text/css'/> - <link href="/settings/indexers/indexers.css" rel='stylesheet' type='text/css'/> - <link href="/calendar/calendar.css" rel='stylesheet' type='text/css'/> + <link href="/Content/Theme.css" rel='stylesheet' type='text/css'> + <link href="/Cells/Cells.css" rel='stylesheet' type='text/css'> + <link href="/Content/fullcalendar.css" rel='stylesheet' type='text/css'> + <link href="/Content/Backbone.css" rel='stylesheet' type='text/css'/> + <link href="/Content/backbone.backgrid.filter.css" rel='stylesheet' type='text/css'/> + <link href="/Content/bootstrap.toggle-switch.css" rel='stylesheet' type='text/css'/> + <link href="/AddSeries/Addseries.css" rel='stylesheet' type='text/css'/> + <link href="/Content/menu.css" rel='stylesheet' type='text/css'/> + <link href="/Content/form.css" rel='stylesheet' type='text/css'/> + <link href="/Series/Series.css" rel='stylesheet' type='text/css'/> + <link href="/Series/Details.css" rel='stylesheet' type='text/css'/> + <link href="/Content/Base.css" rel='stylesheet' type='text/css'/> + <link href="/Settings/Notifications/notifications.css" rel='stylesheet' type='text/css'/> + <link href="/Settings/Indexers/indexers.css" rel='stylesheet' type='text/css'/> + <link href="/Calendar/Calendar.css" rel='stylesheet' type='text/css'/> </head> <body> <div id="in-sub-nav"> diff --git a/UI/Instrumentation/ErrorHandler.js b/UI/Instrumentation/ErrorHandler.js index ec6a18f79..d805c6613 100644 --- a/UI/Instrumentation/ErrorHandler.js +++ b/UI/Instrumentation/ErrorHandler.js @@ -1,14 +1,6 @@ -'use strict'; +'use strict'; (function () { - /* var model = new NzbDrone.Shared.NotificationModel(); - model.set('title','test notification'); - model.set('message','test message'); - model.set('level', 'error'); - this.push(model); - */ - - if (!window.console) { window.console = {}; } diff --git a/UI/Logs/Collection.js b/UI/Logs/Collection.js index 2f0b0f330..3b6070b59 100644 --- a/UI/Logs/Collection.js +++ b/UI/Logs/Collection.js @@ -1,8 +1,8 @@ -'use strict'; -define(['app', 'Logs/Model', 'backbone.pageable'], function (app, SeriesModel, PagableCollection) { - NzbDrone.Logs.Collection = PagableCollection.extend({ - url : NzbDrone.Constants.ApiRoot + '/log', - model: NzbDrone.Logs.Model, +'use strict'; +define(['backbone.pageable', 'Logs/Model', ], function (PagableCollection, LogsModel) { + return PagableCollection.extend({ + url : window.ApiRoot + '/log', + model: LogsModel, state: { pageSize: 50, diff --git a/UI/Logs/Layout.js b/UI/Logs/Layout.js index 7f5aabbe1..28126d8b4 100644 --- a/UI/Logs/Layout.js +++ b/UI/Logs/Layout.js @@ -1,12 +1,12 @@ 'use strict'; define([ - 'app', - 'Logs/Collection', - 'Shared/Toolbar/ToolbarLayout', - 'Shared/Grid/Pager' + 'marionette', + 'backgrid', + 'Shared/Grid/Pager', + 'Logs/Collection' ], - function () { - NzbDrone.Logs.Layout = Backbone.Marionette.Layout.extend({ + function (Marionette,Backgrid, GridPager, LogCollection) { + return Marionette.Layout.extend({ template: 'Logs/LayoutTemplate', regions: { @@ -51,20 +51,19 @@ define([ className : 'table table-hover' })); - this.pager.show(new NzbDrone.Shared.Grid.Pager({ + this.pager.show(new GridPager({ columns : this.columns, collection: this.collection })); }, initialize: function () { - this.collection = new NzbDrone.Logs.Collection(); + this.collection = new LogCollection(); this.collection.fetch(); }, onShow: function () { this.showTable(); - //this.toolbar.show(new NzbDrone.Shared.Toolbar.ToolbarLayout({right: [ viewButtons], context: this})); } }) diff --git a/UI/Logs/Model.js b/UI/Logs/Model.js index ce490c009..17c0fd6da 100644 --- a/UI/Logs/Model.js +++ b/UI/Logs/Model.js @@ -1,14 +1,8 @@ -'use strict'; -define(['app'], function (app) { - NzbDrone.Logs.Model = Backbone.Model.extend({ - /* mutators: { - seasonNumber: function () { - return this.get('episode').seasonNumber; - }, - - paddedEpisodeNumber: function () { - return this.get('episode').episodeNumber.pad(2); - } - }*/ +'use strict'; +define( + [ + 'backbone' + ], function (Backbone) { + return Backbone.Model.extend({ + }); }); -}); diff --git a/UI/MainMenuView.js b/UI/MainMenuView.js index 972d9b45c..2c689af37 100644 --- a/UI/MainMenuView.js +++ b/UI/MainMenuView.js @@ -1,6 +1,6 @@ -'use strict'; -define(['app'], function () { - var MainMenuView = Backbone.Marionette.ItemView.extend({ +'use strict'; +define(['marionette'], function (Marionette) { + var MainMenuView = Marionette.ItemView.extend({ events: { 'click a': 'onClick' }, diff --git a/UI/Missing/Collection.js b/UI/Missing/Collection.js index 8d6c7297c..3ffdcdcdd 100644 --- a/UI/Missing/Collection.js +++ b/UI/Missing/Collection.js @@ -1,37 +1,41 @@ -'use strict'; -define(['app', 'Series/EpisodeModel', 'backbone.pageable'], function (app, EpisodeModel, PagableCollection) { - return PagableCollection.extend({ - url : NzbDrone.Constants.ApiRoot + '/missing', - model: NzbDrone.Series.EpisodeModel, +'use strict'; +define( + [ + 'Series/EpisodeModel', + 'backbone.pageable' + ], function (EpisodeModel, PagableCollection) { + return PagableCollection.extend({ + url : window.ApiRoot + '/missing', + model: EpisodeModel, - state: { - pageSize: 15, - sortKey : 'airDate', - order : 1 - }, + state: { + pageSize: 15, + sortKey : 'airDate', + order : 1 + }, - queryParams: { - totalPages : null, - totalRecords: null, - pageSize : 'pageSize', - sortKey : 'sortKey', - order : 'sortDir', - directions : { - '-1': 'asc', - '1' : 'desc' - } - }, + queryParams: { + totalPages : null, + totalRecords: null, + pageSize : 'pageSize', + sortKey : 'sortKey', + order : 'sortDir', + directions : { + '-1': 'asc', + '1' : 'desc' + } + }, - parseState: function (resp, queryParams, state) { - return {totalRecords: resp.totalRecords}; - }, + parseState: function (resp) { + return {totalRecords: resp.totalRecords}; + }, - parseRecords: function (resp) { - if (resp) { - return resp.records; - } + parseRecords: function (resp) { + if (resp) { + return resp.records; + } - return resp; - } + return resp; + } + }); }); -}); diff --git a/UI/Missing/MissingLayout.js b/UI/Missing/MissingLayout.js index 8dda7ee45..aa31d0e36 100644 --- a/UI/Missing/MissingLayout.js +++ b/UI/Missing/MissingLayout.js @@ -1,29 +1,17 @@ 'use strict'; define( [ - 'app', - 'Missing/Row', + 'marionette', + 'backgrid', 'Missing/Collection', - 'Cells/AirDateCell', - 'Series/Index/Table/SeriesStatusCell', - 'Shared/Toolbar/ToolbarLayout', 'Cells/SeriesTitleCell', 'Cells/EpisodeNumberCell', 'Cells/EpisodeTitleCell', + 'Cells/AirDateCell', 'Shared/Grid/Pager', 'Shared/LoadingView' - ], function (App, - MissingRow, - MissingCollection, - AirDateCell, - SeriesStatusCell, - ToolbarLayout, - SeriesTitleCell, - EpisodeNumberCell, - EpisodeTitleCell, - Pager, - LoadingView) { - return Backbone.Marionette.Layout.extend({ + ], function (Marionette, Backgrid, MissingCollection, SeriesTitleCell, EpisodeNumberCell, EpisodeTitleCell, AirDateCell, GridPager, LoadingView) { + return Marionette.Layout.extend({ template: 'Missing/MissingLayoutTemplate', regions: { @@ -53,21 +41,20 @@ define( cell : EpisodeTitleCell }, { - name : 'airDate', - label : 'Air Date', - cell : AirDateCell + name : 'airDate', + label: 'Air Date', + cell : AirDateCell } ], _showTable: function () { this.missing.show(new Backgrid.Grid({ - row : MissingRow, - columns : this.columns, - collection: this.missingCollection, - className : 'table table-hover' - })); + columns : this.columns, + collection: this.missingCollection, + className : 'table table-hover' + })); - this.pager.show(new NzbDrone.Shared.Grid.Pager({ + this.pager.show(new GridPager({ columns : this.columns, collection: this.missingCollection })); @@ -80,8 +67,8 @@ define( this.missingCollection = new MissingCollection(); this.missingCollection.fetch().done(function () { - self._showTable(); - }); + self._showTable(); + }); } }); }); diff --git a/UI/Mixins/AutoComplete.js b/UI/Mixins/AutoComplete.js index 5660274e9..6da4c82b1 100644 --- a/UI/Mixins/AutoComplete.js +++ b/UI/Mixins/AutoComplete.js @@ -1,12 +1,12 @@ -'use strict'; +'use strict'; -define(['app'], function () { +define(function () { $.fn.autoComplete = function (resource) { $(this).typeahead({ source : function (filter, callback) { $.ajax({ - url : NzbDrone.Constants.ApiRoot + resource, + url : window.ApiRoot + resource, dataType: 'json', type : 'GET', data : { query: filter }, @@ -16,7 +16,7 @@ define(['app'], function () { }); }, minLength: 3, - items :20 + items : 20 }); }; diff --git a/UI/Mixins/backbone.signalr.mixin.js b/UI/Mixins/backbone.signalr.mixin.js index 50f397856..781669313 100644 --- a/UI/Mixins/backbone.signalr.mixin.js +++ b/UI/Mixins/backbone.signalr.mixin.js @@ -1,49 +1,55 @@ 'use strict'; -define(['app', 'signalR'], function () { +define( + [ + 'signalR' + ], function () { + + _.extend(Backbone.Collection.prototype, {BindSignalR: function (options) { + + if (!options || !options.url) { + console.assert(this.url, 'url must be provided or collection must have url'); + options = { + url: this.url.replace('api', 'signalr') + }; + } - _.extend(Backbone.Collection.prototype, {BindSignalR: function (options) { + var self = this; + + var _getStatus = function (status) { + switch (status) { + case 0: + return 'connecting'; + case 1: + return 'connected'; + case 2: + return 'reconnecting'; + case 4: + return 'disconnected'; + default: + throw 'invalid status ' + status; + } - if (!options || !options.url) { - console.assert(this.url, 'url must be provided or collection must have url'); - options = { - url: this.url.replace('api', 'signalr') }; - } - - var self = this; - - var _getStatus = function (status) { - switch (status) { - case 0: - return 'connecting'; - case 1: - return 'connected'; - case 2: - return 'reconnecting'; - case 4: - return 'disconnected'; - default: - throw 'invalid status ' + status; - } - - }; - var connection = $.connection(options.url); + var connection = $.connection(options.url); - connection.stateChanged(function (change) { - console.debug('{0} [{1}]'.format(options.url, _getStatus(change.newState))); - }); + connection.stateChanged(function (change) { + console.debug('{0} [{1}]'.format(options.url, _getStatus(change.newState))); + }); - connection.received(function (model) { - console.debug(model); - self.fetch(); - }); + connection.received(function (model) { + console.debug(model); + self.fetch(); + }); - connection.start({ transport: ['longPolling'] }); + connection.start({ transport: + [ + 'longPolling' + ] }); - return this; - }}); -}); + return this; + }}); + }); diff --git a/UI/Quality/QualitySizeCollection.js b/UI/Quality/QualitySizeCollection.js index 1687bfcd4..4919f5ac7 100644 --- a/UI/Quality/QualitySizeCollection.js +++ b/UI/Quality/QualitySizeCollection.js @@ -1,9 +1,10 @@ -'use strict'; -define(['app', 'Quality/QualitySizeModel'], function () { - NzbDrone.Quality.QualitySizeCollection = Backbone.Collection.extend({ - model: NzbDrone.Quality.QualitySizeModel, - url : NzbDrone.Constants.ApiRoot + '/qualitysize' +'use strict'; +define( + [ + 'Quality/QualitySizeModel' + ], function (QualitySizeModel) { + return Backbone.Collection.extend({ + model: QualitySizeModel, + url : window.ApiRoot + '/qualitysize' + }); }); - - return NzbDrone.Quality.QualitySizeCollection; -}); diff --git a/UI/Quality/QualitySizeModel.js b/UI/Quality/QualitySizeModel.js index 403946eef..f3fa4f10a 100644 --- a/UI/Quality/QualitySizeModel.js +++ b/UI/Quality/QualitySizeModel.js @@ -1,18 +1,17 @@ -'use strict'; -define(['app'], function () { - NzbDrone.Quality.QualitySizeModel = Backbone.Model.extend({ +'use strict'; +define( + [ + 'backbone' + ], function (Backbone) { + return Backbone.Model.extend({ - initialize: function () { - this.validators = {}; - }, - - mutators: { - thirtyMinuteSize: function () { - return this.get('maxSize') * 30; - }, - sixtyMinuteSize : function () { - return this.get('maxSize') * 60; + mutators: { + thirtyMinuteSize: function () { + return this.get('maxSize') * 30; + }, + sixtyMinuteSize : function () { + return this.get('maxSize') * 60; + } } - } + }); }); -}); diff --git a/UI/Quality/qualityProfileCollection.js b/UI/Quality/qualityProfileCollection.js index 55b93ccf4..db24cd24b 100644 --- a/UI/Quality/qualityProfileCollection.js +++ b/UI/Quality/qualityProfileCollection.js @@ -1,14 +1,18 @@ -'use strict'; -define(['app', 'Quality/QualityProfileModel'], function () { +'use strict'; +define( + [ + 'backbone', + 'Quality/QualityProfileModel' + ], function (Backbone, QualityProfileModel) { - var qualityProfileCollection = Backbone.Collection.extend({ - model: NzbDrone.Quality.QualityProfileModel, - url : NzbDrone.Constants.ApiRoot + '/qualityprofiles' - }); + var QualityProfileCollection = Backbone.Collection.extend({ + model: QualityProfileModel, + url : window.ApiRoot + '/qualityprofiles' + }); - var profiles = new qualityProfileCollection(); + var profiles = new QualityProfileCollection(); - profiles.fetch(); + profiles.fetch(); - return profiles; -}); + return profiles; + }); diff --git a/UI/Quality/qualityProfileModel.js b/UI/Quality/qualityProfileModel.js index 39cae21e0..629512d52 100644 --- a/UI/Quality/qualityProfileModel.js +++ b/UI/Quality/qualityProfileModel.js @@ -1,12 +1,14 @@ -'use strict'; -define(['app', 'backbone.deepmodel'], function (App, DeepModel) { - NzbDrone.Quality.QualityProfileModel = DeepModel.DeepModel.extend({ - - defaults: { - id : null, - name : '', - cutoff: null - } +'use strict'; +define( + [ + 'backbone.deepmodel' + ], function (DeepModel) { + return DeepModel.DeepModel.extend({ + defaults: { + id : null, + name : '', + cutoff: null + } + }); }); -}); diff --git a/UI/Release/ApprovalStatusCell.js b/UI/Release/ApprovalStatusCell.js index b7f77595a..cdaa82350 100644 --- a/UI/Release/ApprovalStatusCell.js +++ b/UI/Release/ApprovalStatusCell.js @@ -1,22 +1,26 @@ 'use strict'; +define( + [ + 'backgrid' + ], function (Backgrid) { -require(['app', 'backgrid'], function () { - NzbDrone.Release.ApprovalStatusCell = Backgrid.Cell.extend({ - className: 'approval-status-cell', + return Backgrid.Cell.extend({ - render: function () { - var rejections = this.model.get(this.column.get('name')); + className: 'approval-status-cell', - var result = ''; + render: function () { + var rejections = this.model.get(this.column.get('name')); - _.each(rejections, function (reason) { - result += reason + ' '; - }); + var result = ''; - this.$el.html(result); - this.delegateEvents(); - return this; - } + _.each(rejections, function (reason) { + result += reason + ' '; + }); + + this.$el.html(result); + this.delegateEvents(); + return this; + } + }); }); -}); diff --git a/UI/Release/Collection.js b/UI/Release/Collection.js index 601a02c50..e584f35d0 100644 --- a/UI/Release/Collection.js +++ b/UI/Release/Collection.js @@ -1,17 +1,21 @@ -'use strict'; -define(['app', 'Release/Model', 'backbone.pageable'], function (app, SeriesModel, PagableCollection) { - NzbDrone.Release.Collection = PagableCollection.extend({ - url : NzbDrone.Constants.ApiRoot + '/release', - model: NzbDrone.Release.Model, +'use strict'; +define( + [ + 'Release/Model', + 'backbone.pageable' + ], function (ReleaseModel, PagableCollection) { + return PagableCollection.extend({ + url : window.ApiRoot + '/release', + model: ReleaseModel, - mode: 'client', + mode: 'client', - state: { - pageSize: 2000 - }, + state: { + pageSize: 2000 + }, - fetchEpisodeReleases: function (episodeId) { - return this.fetch({ data: { episodeId: episodeId }}); - } + fetchEpisodeReleases: function (episodeId) { + return this.fetch({ data: { episodeId: episodeId }}); + } + }); }); -}); diff --git a/UI/Release/DownloadReportCell.js b/UI/Release/DownloadReportCell.js index 34579a49d..63f70343d 100644 --- a/UI/Release/DownloadReportCell.js +++ b/UI/Release/DownloadReportCell.js @@ -1,33 +1,32 @@ 'use strict'; -define(['app','backgrid'], function () { - NzbDrone.Release.DownloadReportCell = Backgrid.Cell.extend({ +define( + [ + 'backgrid' + ], function (Backgrid) { + return Backgrid.Cell.extend({ - className: 'download-report-cell', + className: 'download-report-cell', - events: { - 'click': '_onClick' - }, + events: { + 'click': '_onClick' + }, - _onClick: function () { + _onClick: function () { - var self = this; + var self = this; - this.$el.html('<i class =\'icon-spinner icon-spin\' />'); - this.model.save() - .always(function () { - self.$el.html('<i class =\'icon-download-alt\' />'); - }); - }, + this.$el.html('<i class =\'icon-spinner icon-spin\' />'); + this.model.save().always(function () { + self.$el.html('<i class =\'icon-download-alt\' />'); + }); + }, - render: function () { + render: function () { - this.$el.html('<i class =\'icon-download-alt\' />'); - return this; + this.$el.html('<i class =\'icon-download-alt\' />'); + return this; - } + } + }); }); - - - return NzbDrone.Release.DownloadReportCell; -}); diff --git a/UI/Release/Layout.js b/UI/Release/Layout.js index 38c22247c..0f0a61ef0 100644 --- a/UI/Release/Layout.js +++ b/UI/Release/Layout.js @@ -1,17 +1,17 @@ 'use strict'; -define([ - 'app', - 'Release/Collection', - 'Release/ApprovalStatusCell', - 'Shared/SpinnerView', - 'Shared/Toolbar/ToolbarLayout', - 'Cells/EpisodeNumberCell', - 'Cells/FileSizeCell', - 'Cells/IndexerCell', - 'Cells/QualityCell' -], - function () { - NzbDrone.Release.Layout = Backbone.Marionette.Layout.extend({ +define( + [ + 'marionette', + 'backgrid', + 'Release/Collection', + 'Cells/IndexerCell', + 'Cells/EpisodeNumberCell', + 'Cells/FileSizeCell', + 'Cells/QualityCell', + 'Release/ApprovalStatusCell', + 'Shared/SpinnerView' + ], function (Marionette, Backgrid, ReleaseCollection, IndexerCell, EpisodeNumberCell, FileSizeCell, QualityCell, ApprovalStatusCell, SpinnerView) { + return Marionette.Layout.extend({ template: 'Release/LayoutTemplate', regions: { @@ -19,60 +19,60 @@ define([ toolbar: '#x-toolbar' }, - columns: [ - { - name : 'indexer', - label : 'Indexer', - sortable: true, - cell : NzbDrone.Cells.IndexerCell - }, + columns: + [ + { + name : 'indexer', + label : 'Indexer', + sortable: true, + cell : IndexerCell + }, - { - name : 'title', - label : 'Title', - sortable: true, - cell : Backgrid.StringCell - }, - { - name : 'episodeNumbers', - episodes: 'episodeNumbers', - label : 'season', - cell : NzbDrone.Cells.EpisodeNumberCell - }, - { - name : 'size', - label : 'Size', - sortable: true, - cell : NzbDrone.Cells.FileSizeCell - }, - { - name : 'quality', - label : 'Quality', - sortable: true, - cell : NzbDrone.Cells.QualityCell - }, + { + name : 'title', + label : 'Title', + sortable: true, + cell : Backgrid.StringCell + }, + { + name : 'episodeNumbers', + episodes: 'episodeNumbers', + label : 'season', + cell : EpisodeNumberCell + }, + { + name : 'size', + label : 'Size', + sortable: true, + cell : FileSizeCell + }, + { + name : 'quality', + label : 'Quality', + sortable: true, + cell : QualityCell + }, - { - name : 'rejections', - label: 'decision', - cell : NzbDrone.Release.ApprovalStatusCell - } - ], + { + name : 'rejections', + label: 'decision', + cell : ApprovalStatusCell + } + ], showTable: function () { if (!this.isClosed) { - this.grid.show(new Backgrid.Grid( - { - row : Backgrid.Row, - columns : this.columns, - collection: this.collection, - className : 'table table-hover' - })); + this.grid.show(new Backgrid.Grid({ + row : Backgrid.Row, + columns : this.columns, + collection: this.collection, + className : 'table table-hover' + })); } }, initialize: function () { - this.collection = new NzbDrone.Release.Collection(); + this.collection = new ReleaseCollection(); this.fetchPromise = this.collection.fetch(); }, @@ -80,12 +80,11 @@ define([ var self = this; - this.grid.show(new NzbDrone.Shared.SpinnerView()); + this.grid.show(new SpinnerView()); this.fetchPromise.done(function () { self.showTable(); }); - //this.toolbar.show(new NzbDrone.Shared.Toolbar.ToolbarLayout({right: [ viewButtons], context: this})); } }); diff --git a/UI/Release/Model.js b/UI/Release/Model.js index 3229b4dfc..64a2505ac 100644 --- a/UI/Release/Model.js +++ b/UI/Release/Model.js @@ -1,6 +1,6 @@ -'use strict'; -define(['app'], function () { - NzbDrone.Release.Model = Backbone.Model.extend({ +'use strict'; +define(['backbone'], function (Backbone) { + return Backbone.Model.extend({ /* mutators: { seasonNumber: function () { return this.get('episode').seasonNumber; diff --git a/UI/Router.js b/UI/Router.js index bcc400314..ac4b01d21 100644 --- a/UI/Router.js +++ b/UI/Router.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict'; require( [ 'app', @@ -7,9 +7,9 @@ require( 'jQuery/RouteBinder' ], function (App, Marionette, Controller, RouterBinder) { - NzbDrone.Router = Marionette.AppRouter.extend({ + var Router = Marionette.AppRouter.extend({ - controller: Controller, + controller: new Controller(), appRoutes : { '' : 'series', 'series' : 'series', @@ -28,17 +28,16 @@ require( } }); - NzbDrone.addInitializer(function () { + App.addInitializer(function () { - NzbDrone.Router = new NzbDrone.Router(); + App.Router = new Router(); Backbone.history.start({ pushState: true }); - RouterBinder.bind(NzbDrone.Router); - // NzbDrone.footerRegion.show(new FooterView()); + RouterBinder.bind(App.Router); }); - return NzbDrone.Router; + return App.Router; }); diff --git a/UI/Series/Delete/DeleteSeriesView.js b/UI/Series/Delete/DeleteSeriesView.js index 2def43b38..4a7c4e532 100644 --- a/UI/Series/Delete/DeleteSeriesView.js +++ b/UI/Series/Delete/DeleteSeriesView.js @@ -2,10 +2,10 @@ define( [ 'app', - 'Series/SeriesModel' - ], function () { + 'marionette' + ], function (App, Marionette) { - NzbDrone.Series.Delete.DeleteSeriesView = Backbone.Marionette.ItemView.extend({ + return Marionette.ItemView.extend({ template: 'Series/Delete/DeleteSeriesTemplate', events: { @@ -24,11 +24,8 @@ define( data: { 'deleteFiles': deleteFiles }, wait: true }).done(function () { - NzbDrone.modalRegion.close(); + App.modalRegion.close(); }); } }); - - return NzbDrone.Series.Delete.DeleteSeriesView; - }); diff --git a/UI/Series/Details/SeasonCollectionView.js b/UI/Series/Details/SeasonCollectionView.js index 3684684e4..c99df15d7 100644 --- a/UI/Series/Details/SeasonCollectionView.js +++ b/UI/Series/Details/SeasonCollectionView.js @@ -1,28 +1,28 @@ 'use strict'; -define(['app', - 'Series/Details/SeasonLayout', - 'Series/SeasonCollection', - 'Series/EpisodeCollection'], - function (App, SeasonLayout, SeasonCollection, EpisodeCollection) { - NzbDrone.Series.Details.SeasonCollectionView = Backbone.Marionette.CollectionView.extend({ +define( + [ + 'marionette', + 'Series/Details/SeasonLayout' + ], function (Marionette, SeasonLayout) { + return Marionette.CollectionView.extend({ - itemView : SeasonLayout, + itemView: SeasonLayout, - initialize: function (options) { + initialize: function (options) { - if (!options.episodeCollection) { - throw 'episodeCollection is needed'; - } + if (!options.episodeCollection) { + throw 'episodeCollection is needed'; + } - this.episodeCollection = options.episodeCollection; + this.episodeCollection = options.episodeCollection; - }, + }, - itemViewOptions: function () { - return { - episodeCollection: this.episodeCollection - }; - } + itemViewOptions: function () { + return { + episodeCollection: this.episodeCollection + }; + } + }); }); -}); diff --git a/UI/Series/Details/SeasonLayout.js b/UI/Series/Details/SeasonLayout.js index 1b4fcfe64..6f3f3722d 100644 --- a/UI/Series/Details/SeasonLayout.js +++ b/UI/Series/Details/SeasonLayout.js @@ -1,13 +1,17 @@ -'use strict'; -define([ - 'app', - 'Cells/EpisodeStatusCell', - 'Cells/EpisodeTitleCell', - 'Cells/AirDateCell', - 'Cells/ToggleCell', - 'Shared/Messenger'], - function (App, EpisodeStatusCell, EpisodeTitleCell, AirDateCell, ToggleCell, Messenger) { - return Backbone.Marionette.Layout.extend({ + +'use strict'; +define( + [ + 'marionette', + 'backgrid', + 'Cells/ToggleCell', + 'Cells/EpisodeTitleCell', + 'Cells/AirDateCell', + 'Cells/EpisodeStatusCell', + 'Commands/CommandController', + 'Shared/Messenger' + ], function ( Marionette, Backgrid, ToggleCell, EpisodeTitleCell, AirDateCell, EpisodeStatusCell, CommandController, Messenger) { + return Marionette.Layout.extend({ template: 'Series/Details/SeasonLayoutTemplate', ui: { @@ -22,39 +26,38 @@ define([ episodeGrid: '#x-episode-grid' }, - columns: [ - - { - name : 'ignored', - label : '', - cell : ToggleCell, - trueClass : 'icon-bookmark-empty', - falseClass: 'icon-bookmark' - }, - { - name : 'episodeNumber', - label: '#', - cell : Backgrid.IntegerCell.extend({ - className: 'episode-number-cell' - }) - }, - - { - name : 'this', - label: 'Title', - cell : EpisodeTitleCell - }, - { - name : 'airDate', - label: 'Air Date', - cell : AirDateCell - } , - { - name : 'status', - label: 'Status', - cell : EpisodeStatusCell - } - ], + columns: + [ + { + name : 'ignored', + label : '', + cell : ToggleCell, + trueClass : 'icon-bookmark-empty', + falseClass: 'icon-bookmark' + }, + { + name : 'episodeNumber', + label: '#', + cell : Backgrid.IntegerCell.extend({ + className: 'episode-number-cell' + }) + }, + { + name : 'this', + label: 'Title', + cell : EpisodeTitleCell + }, + { + name : 'airDate', + label: 'Air Date', + cell : AirDateCell + } , + { + name : 'status', + label: 'Status', + cell : EpisodeStatusCell + } + ], initialize: function (options) { @@ -66,12 +69,11 @@ define([ }, onShow: function () { - this.episodeGrid.show(new Backgrid.Grid( - { - columns : this.columns, - collection: this.episodeCollection, - className : 'table table-hover season-grid' - })); + this.episodeGrid.show(new Backgrid.Grid({ + columns : this.columns, + collection: this.episodeCollection, + className : 'table table-hover season-grid' + })); }, _seasonSearch: function () { @@ -82,12 +84,12 @@ define([ this.ui.seasonSearch.addClass('icon-spinner icon-spin'); var properties = { - seriesId: this.model.get('seriesId'), + seriesId : this.model.get('seriesId'), seasonNumber: this.model.get('seasonNumber') }; var self = this; - var commandPromise = App.Commands.Execute(command, properties); + var commandPromise = CommandController.Execute(command, properties); commandPromise.fail(function (options) { if (options.readyState === 0 || options.status === 0) { diff --git a/UI/Series/Details/SeriesDetailsLayout.js b/UI/Series/Details/SeriesDetailsLayout.js index c16188b86..b54d79525 100644 --- a/UI/Series/Details/SeriesDetailsLayout.js +++ b/UI/Series/Details/SeriesDetailsLayout.js @@ -1,6 +1,14 @@ 'use strict'; -define(['app', 'Series/Details/SeasonCollectionView', 'Shared/LoadingView','backstrech'], function () { - NzbDrone.Series.Details.SeriesDetailsLayout = Backbone.Marionette.Layout.extend({ +define( + [ + 'marionette', + 'Series/EpisodeCollection', + 'Series/SeasonCollection', + 'Series/Details/SeasonCollectionView', + 'Shared/LoadingView', + 'backstrech' + ], function (Marionette, EpisodeCollection, SeasonCollection, SeasonCollectionView, LoadingView) { + return Marionette.Layout.extend({ itemViewContainer: '.x-series-seasons', template : 'Series/Details/SeriesDetailsTemplate', @@ -27,19 +35,17 @@ define(['app', 'Series/Details/SeasonCollectionView', 'Shared/LoadingView','back $('body').removeClass('backdrop'); } - this.seasons.show(new NzbDrone.Shared.LoadingView()); + this.seasons.show(new LoadingView()); - this.seasonCollection = new NzbDrone.Series.SeasonCollection(); - this.episodeCollection = new NzbDrone.Series.EpisodeCollection(); + this.seasonCollection = new SeasonCollection(); + this.episodeCollection = new EpisodeCollection(); - $.when(this.episodeCollection.fetch({data: { seriesId: this.model.id }}), this.seasonCollection.fetch({data: { seriesId: this.model.id }})) - .done(function () { - self.seasons.show(new NzbDrone.Series.Details.SeasonCollectionView({ - collection : self.seasonCollection, - episodeCollection: self.episodeCollection - })); - } - ); + $.when(this.episodeCollection.fetch({data: { seriesId: this.model.id }}), this.seasonCollection.fetch({data: { seriesId: this.model.id }})).done(function () { + self.seasons.show(new SeasonCollectionView({ + collection : self.seasonCollection, + episodeCollection: self.episodeCollection + })); + }); }, onClose: function () { @@ -47,5 +53,4 @@ define(['app', 'Series/Details/SeasonCollectionView', 'Shared/LoadingView','back $('body').removeClass('backdrop'); } }); - } -); + }); diff --git a/UI/Series/Edit/EditSeriesView.js b/UI/Series/Edit/EditSeriesView.js index 1d2600c7d..960b0222b 100644 --- a/UI/Series/Edit/EditSeriesView.js +++ b/UI/Series/Edit/EditSeriesView.js @@ -1,45 +1,50 @@ -'use strict'; -define(['app', 'Series/SeriesModel', 'Series/Delete/DeleteSeriesView', 'Quality/QualityProfileCollection'], function (app, seriesModel, deleteSeriesView, qualityProfiles) { - - NzbDrone.Series.Edit.EditSeriesView = Backbone.Marionette.ItemView.extend({ - template : 'Series/Edit/EditSeriesTemplate', - - ui: { - progressbar : '.progress .bar', - qualityProfile : '.x-quality-profile', - backlogSettings: '.x-backlog-setting' - }, - - events: { - 'click .x-save' : 'saveSeries', - 'click .x-remove': 'removeSeries' - }, - - - initialize : function(){ - - this.model.set('qualityProfiles',qualityProfiles); - - }, - - - saveSeries: function () { - //Todo: Get qualityProfile + backlog setting from UI - var qualityProfile = this.ui.qualityProfile.val(); - var qualityProfileText = this.ui.qualityProfile.children('option:selected').text(); - var backlogSetting = this.ui.backlogSettings.val(); - - this.model.set({ qualityProfileId: qualityProfile, backlogSetting: backlogSetting, qualityProfileName: qualityProfileText }); - - this.model.save(); - this.trigger('saved'); - NzbDrone.modalRegion.closeModal(); - }, - - removeSeries: function () { - var view = new NzbDrone.Series.Delete.DeleteSeriesView({ model: this.model }); - NzbDrone.modalRegion.show(view); - } +'use strict'; +define( + [ + 'App', + 'marionette', + 'Series/Delete/DeleteSeriesView', + 'Quality/QualityProfileCollection', + 'Mixins/AsModelBoundView' + ], function (App, Marionette, DeleteSeriesView, QualityProfiles, AsModelBoundView) { + + var view = Marionette.ItemView.extend({ + template: 'Series/Edit/EditSeriesTemplate', + + ui: { + progressbar : '.progress .bar', + qualityProfile : '.x-quality-profile', + backlogSettings: '.x-backlog-setting' + }, + + events: { + 'click .x-save' : 'saveSeries', + 'click .x-remove': 'removeSeries' + }, + + + initialize: function () { + this.model.set('qualityProfiles', QualityProfiles); + }, + + + saveSeries: function () { + //Todo: Get qualityProfile + backlog setting from UI + var qualityProfile = this.ui.qualityProfile.val(); + var qualityProfileText = this.ui.qualityProfile.children('option:selected').text(); + var backlogSetting = this.ui.backlogSettings.val(); + + this.model.set({ qualityProfileId: qualityProfile, backlogSetting: backlogSetting, qualityProfileName: qualityProfileText }); + + this.model.save(); + this.trigger('saved'); + App.modalRegion.closeModal(); + }, + + removeSeries: function () { + var view = new DeleteSeriesView({ model: this.model }); + App.modalRegion.show(view); + } + }); + return AsModelBoundView.apply(view); }); - -}); diff --git a/UI/Series/EpisodeCollection.js b/UI/Series/EpisodeCollection.js index c53e6a88c..123eccf47 100644 --- a/UI/Series/EpisodeCollection.js +++ b/UI/Series/EpisodeCollection.js @@ -1,18 +1,21 @@ -'use strict'; -define(['app', 'Series/EpisodeModel'], function () { - NzbDrone.Series.EpisodeCollection = Backbone.Collection.extend({ - url : NzbDrone.Constants.ApiRoot + '/episodes', - model: NzbDrone.Series.EpisodeModel, +'use strict'; +define( + [ + 'backbone', + 'Series/EpisodeModel' + ], function (Backbone, EpisodeModel) { + return Backbone.Collection.extend({ + url : window.ApiRoot + '/episodes', + model: EpisodeModel, - bySeason: function (season) { - var filtered = this.filter(function (episode) { - return episode.get('seasonNumber') === season; - }); - - return new NzbDrone.Series.EpisodeCollection(filtered); - } - }); + bySeason: function (season) { + var filtered = this.filter(function (episode) { + return episode.get('seasonNumber') === season; + }); + var EpisodeCollection = require('Series/EpisodeCollection'); - return NzbDrone.Series.EpisodeCollection; -}); + return new EpisodeCollection(filtered); + } + }); + }); diff --git a/UI/Series/EpisodeModel.js b/UI/Series/EpisodeModel.js index 1ee16462a..0321c1e77 100644 --- a/UI/Series/EpisodeModel.js +++ b/UI/Series/EpisodeModel.js @@ -1,92 +1,95 @@ 'use strict'; -define(['app', 'Series/SeriesModel'], function () { - NzbDrone.Series.EpisodeModel = Backbone.Model.extend({ +define( + [ + 'backbone', + 'Series/SeriesModel' + ], function (Backbone, SeriesModel) { + return Backbone.Model.extend({ + + mutators: { + paddedEpisodeNumber: function () { + return this.get('episodeNumber').pad(2); + }, + day : function () { + return Date.create(this.get('airDate')).format('{dd}'); + }, + month : function () { + return Date.create(this.get('airDate')).format('{MON}'); + }, + startTime : function () { + var start = Date.create(this.get('airDate')); - mutators: { - paddedEpisodeNumber: function () { - var test = this.get('episodeNumber'); - return this.get('episodeNumber').pad(2); - }, - day : function () { - return Date.create(this.get('airDate')).format('{dd}'); - }, - month : function () { - return Date.create(this.get('airDate')).format('{MON}'); - }, - startTime : function () { - var start = Date.create(this.get('airDate')); + if (start.format('{mm}') === '00') { + return start.format('{h}{tt}'); + } - if (start.format('{mm}') === '00') { - return start.format('{h}{tt}'); - } + return start.format('{h}.{mm}{tt}'); + }, + end : function () { - return start.format('{h}.{mm}{tt}'); - }, - end : function () { + if (this.has('series')) { + var start = Date.create(this.get('airDate')); + var runtime = this.get('series').runtime; - if (this.has('series')) { + return start.addMinutes(runtime); + } + + return undefined; + }, + statusLevel : function () { + var episodeFileId = this.get('episodeFileId'); + var currentTime = Date.create(); var start = Date.create(this.get('airDate')); - var runtime = this.get('series').runtime; + var end = Date.create(this.get('end')); - return start.addMinutes(runtime); - } - }, - statusLevel : function () { - var episodeFileId = this.get('episodeFileId'); - var currentTime = Date.create(); - var start = Date.create(this.get('airDate')); - var end = Date.create(this.get('end')); - - if (currentTime.isBetween(start, end)) { - return 'warning'; - } + if (currentTime.isBetween(start, end)) { + return 'warning'; + } - if (start.isBefore(currentTime) && episodeFileId === 0) { - return 'danger'; - } + if (start.isBefore(currentTime) && episodeFileId === 0) { + return 'danger'; + } - if (status === 'Ready') { - return 'success'; - } + if (status === 'Ready') { + return 'success'; + } - return 'primary'; + return 'primary'; + }, + hasAired : function () { + return Date.create(this.get('airDate')).isBefore(Date.create()); + } }, - hasAired : function () { - return Date.create(this.get('airDate')).isBefore(Date.create()); - } - }, - parse: function (model) { - model.series = new NzbDrone.Series.SeriesModel(model.series); + parse: function (model) { + model.series = new SeriesModel(model.series); + + return model; + }, - return model; - }, + toJSON: function () { + var json = _.clone(this.attributes); - toJSON: function () { - var json = _.clone(this.attributes); + _.each(this.mutators, _.bind(function (mutator, name) { + // check if we have some getter mutations + if (_.isObject(this.mutators[name]) === true && _.isFunction(this.mutators[name].get)) { + json[name] = _.bind(this.mutators[name].get, this)(); + } + else { + json[name] = _.bind(this.mutators[name], this)(); + } + }, this)); - _.each(this.mutators, _.bind(function (mutator, name) { - // check if we have some getter mutations - if (_.isObject(this.mutators[name]) === true && _.isFunction(this.mutators[name].get)) { - json[name] = _.bind(this.mutators[name].get, this)(); - } else { - json[name] = _.bind(this.mutators[name], this)(); + if (this.has('series')) { + json.series = this.get('series').toJSON(); } - }, this)); - - if (this.has('series')) - { - json.series = this.get('series').toJSON(); - } - return json; - }, + return json; + }, - defaults: { - seasonNumber: 0, - status : 0 - } + defaults: { + seasonNumber: 0, + status : 0 + } + }); }); - - return NzbDrone.Series.EpisodeModel; -}); diff --git a/UI/Series/Index/EmptySeriesIndexView.js b/UI/Series/Index/EmptySeriesIndexView.js index 4a8ef4af8..b222390ab 100644 --- a/UI/Series/Index/EmptySeriesIndexView.js +++ b/UI/Series/Index/EmptySeriesIndexView.js @@ -1,8 +1,9 @@ -'use strict'; -define(['app'], function () { - NzbDrone.Series.Index.EmptySeriesCollectionView = Backbone.Marionette.CompositeView.extend({ - template: 'Series/Index/EmptySeriesIndexTemplate' +'use strict'; +define( + [ + 'marionette' + ], function (Marionette) { + return Marionette.CompositeView.extend({ + template: 'Series/Index/EmptySeriesIndexTemplate' + }); }); - - return NzbDrone.Series.Index.EmptySeriesCollectionView; -}); diff --git a/UI/Series/Index/EmptyView.js b/UI/Series/Index/EmptyView.js index 53e89166a..ea23a1fbe 100644 --- a/UI/Series/Index/EmptyView.js +++ b/UI/Series/Index/EmptyView.js @@ -1,10 +1,11 @@ -'use strict'; +'use strict'; -define(['app'], function () { +define( + [ + 'marionette' + ], function (Marionette) { - NzbDrone.Series.Index.EmptyView = Backbone.Marionette.CompositeView.extend({ - template: 'Series/Index/EmptyTemplate' + return Marionette.CompositeView.extend({ + template: 'Series/Index/EmptyTemplate' + }); }); - - return NzbDrone.Series.Index.EmptyView; -}); diff --git a/UI/Series/Index/List/CollectionView.js b/UI/Series/Index/List/CollectionView.js index 2b81ddcf6..33ea36307 100644 --- a/UI/Series/Index/List/CollectionView.js +++ b/UI/Series/Index/List/CollectionView.js @@ -1,12 +1,14 @@ -'use strict'; +'use strict'; -define(['app', 'Series/Index/List/ItemView', 'Config'], function () { +define( + [ + 'marionette', + 'Series/Index/List/ItemView' + ], function (Marionette, ListItemView) { - NzbDrone.Series.Index.List.CollectionView = Backbone.Marionette.CompositeView.extend({ - itemView : NzbDrone.Series.Index.List.ItemView, - itemViewContainer : '#x-series-list', - template : 'Series/Index/List/CollectionTemplate' + return Marionette.CompositeView.extend({ + itemView : ListItemView, + itemViewContainer: '#x-series-list', + template : 'Series/Index/List/CollectionTemplate' + }); }); - - return NzbDrone.Series.Index.List.CollectionView; -}); diff --git a/UI/Series/Index/List/ItemView.js b/UI/Series/Index/List/ItemView.js index 355e249a5..edad5993d 100644 --- a/UI/Series/Index/List/ItemView.js +++ b/UI/Series/Index/List/ItemView.js @@ -1,36 +1,33 @@ -'use strict'; +'use strict'; -define([ - 'app', - 'Quality/QualityProfileCollection', - 'Series/SeriesCollection', - 'Series/Edit/EditSeriesView', - 'Series/Delete/DeleteSeriesView', - 'Shared/FormatHelpers' +define( + [ + 'app', + 'marionette', + 'Series/Edit/EditSeriesView', + 'Series/Delete/DeleteSeriesView' -], function () { - NzbDrone.Series.Index.List.ItemView = Backbone.Marionette.ItemView.extend({ - template: 'Series/Index/List/ItemTemplate', + ], function (App, Marionette, EditSeriesView, DeleteSeriesView) { + return Marionette.ItemView.extend({ + template: 'Series/Index/List/ItemTemplate', - ui: { - 'progressbar': '.progress .bar' - }, + ui: { + 'progressbar': '.progress .bar' + }, - events: { - 'click .x-edit' : 'editSeries', - 'click .x-remove': 'removeSeries' - }, + events: { + 'click .x-edit' : 'editSeries', + 'click .x-remove': 'removeSeries' + }, - editSeries: function () { - var view = new NzbDrone.Series.Edit.EditSeriesView({ model: this.model}); - NzbDrone.modalRegion.show(view); - }, + editSeries: function () { + var view = new EditSeriesView({ model: this.model}); + App.modalRegion.show(view); + }, - removeSeries: function () { - var view = new NzbDrone.Series.Delete.DeleteSeriesView({ model: this.model }); - NzbDrone.modalRegion.show(view); - } + removeSeries: function () { + var view = new DeleteSeriesView({ model: this.model }); + App.modalRegion.show(view); + } + }); }); - - return NzbDrone.Series.Index.List.ItemView; -}); diff --git a/UI/Series/Index/Posters/CollectionView.js b/UI/Series/Index/Posters/CollectionView.js index b6d188ae4..6ac6e7569 100644 --- a/UI/Series/Index/Posters/CollectionView.js +++ b/UI/Series/Index/Posters/CollectionView.js @@ -1,12 +1,14 @@ -'use strict'; +'use strict'; -define(['app', 'Series/Index/Posters/ItemView', 'Config'], function () { +define( + [ + 'marionette', + 'Series/Index/Posters/ItemView' + ], function (Marionette, PosterItemView) { - NzbDrone.Series.Index.Posters.CollectionView = Backbone.Marionette.CompositeView.extend({ - itemView : NzbDrone.Series.Index.Posters.ItemView, - itemViewContainer : '#x-series-posters', - template : 'Series/Index/Posters/CollectionTemplate' + return Marionette.CompositeView.extend({ + itemView : PosterItemView, + itemViewContainer: '#x-series-posters', + template : 'Series/Index/Posters/CollectionTemplate' + }); }); - - return NzbDrone.Series.Index.Posters.CollectionView; -}); diff --git a/UI/Series/Index/Posters/ItemView.js b/UI/Series/Index/Posters/ItemView.js index 5369afbf2..153069633 100644 --- a/UI/Series/Index/Posters/ItemView.js +++ b/UI/Series/Index/Posters/ItemView.js @@ -1,45 +1,44 @@ -'use strict'; +'use strict'; -define([ - 'app', - 'Series/SeriesCollection', - 'Series/Edit/EditSeriesView', - 'Series/Delete/DeleteSeriesView' +define( + [ + 'app', + 'marionette', + 'Series/Edit/EditSeriesView', + 'Series/Delete/DeleteSeriesView' -], function () { + ], function (App, Marionette, EditSeriesView, DeleteSeriesView) { - NzbDrone.Series.Index.Posters.ItemView = Backbone.Marionette.ItemView.extend({ - tagName : 'li', - template: 'Series/Index/Posters/ItemTemplate', + return Marionette.ItemView.extend({ + tagName : 'li', + template: 'Series/Index/Posters/ItemTemplate', - ui: { - 'progressbar': '.progress .bar', - 'controls': '.series-controls' - }, + ui: { + 'progressbar': '.progress .bar', + 'controls' : '.series-controls' + }, - events: { - 'click .x-edit' : 'editSeries', - 'click .x-remove': 'removeSeries', - 'mouseenter .x-series-poster': 'posterHoverAction', - 'mouseleave .x-series-poster': 'posterHoverAction' - }, + events: { + 'click .x-edit' : 'editSeries', + 'click .x-remove' : 'removeSeries', + 'mouseenter .x-series-poster': 'posterHoverAction', + 'mouseleave .x-series-poster': 'posterHoverAction' + }, - editSeries: function () { - var view = new NzbDrone.Series.Edit.EditSeriesView({ model: this.model}); - NzbDrone.modalRegion.show(view); - }, + editSeries: function () { + var view = new EditSeriesView({ model: this.model}); + App.modalRegion.show(view); + }, - removeSeries: function () { - var view = new NzbDrone.Series.Delete.DeleteSeriesView({ model: this.model }); - NzbDrone.modalRegion.show(view); - }, + removeSeries: function () { + var view = new DeleteSeriesView({ model: this.model }); + App.modalRegion.show(view); + }, - posterHoverAction: function () { - this.ui.controls.slideToggle(); - } + posterHoverAction: function () { + this.ui.controls.slideToggle(); + } + }); }); - - return NzbDrone.Series.Index.Posters.ItemView; -}); diff --git a/UI/Series/Index/SeriesIndexLayout.js b/UI/Series/Index/SeriesIndexLayout.js index b5e66f04a..9ea6dc157 100644 --- a/UI/Series/Index/SeriesIndexLayout.js +++ b/UI/Series/Index/SeriesIndexLayout.js @@ -1,33 +1,22 @@ 'use strict'; -define([ - 'app', - 'Series/Index/List/CollectionView', - 'Series/Index/Posters/CollectionView', - 'Series/Index/EmptyView', - 'Series/SeriesCollection', - 'Cells/AirDateCell', - 'Cells/SeriesTitleCell', - 'Cells/SeriesStatusCell', - 'Cells/TemplatedCell', - 'Shared/Toolbar/ToolbarLayout', - 'Config', - 'Shared/LoadingView' -], - function ( - App, - ListCollectionView, - PosterCollectionView, - EmptyView, - SeriesCollection, - AirDateCell, - SeriesTitleCell, - SeriesStatusCell, - TemplatedCell, - ToolbarLayout, - Config, - LoadingView) - { - NzbDrone.Series.Index.SeriesIndexLayout = Backbone.Marionette.Layout.extend({ +define( + [ + 'marionette', + 'Series/Index/Posters/CollectionView', + 'Series/Index/List/CollectionView', + 'Series/Index/EmptyView', + 'Series/SeriesCollection', + 'Cells/AirDateCell', + 'Cells/SeriesTitleCell', + 'Cells/TemplatedCell', + 'Series/Index/Table/SeriesStatusCell', + 'Series/Index/Table/Row', + 'Shared/Toolbar/ToolbarLayout', + 'Config', + 'Shared/LoadingView' + ], function (Marionette, PosterCollectionView, ListCollectionView, EmptyView, SeriesCollection, AirDateCell, SeriesTitleCell, TemplatedCell, SeriesStatusCell, SeriesIndexRow, + ToolbarLayout, Config, LoadingView) { + return Marionette.Layout.extend({ template: 'Series/Index/SeriesIndexLayoutTemplate', regions: { @@ -35,87 +24,88 @@ define([ toolbar: '#x-toolbar' }, - columns: [ - { - name : 'status', - label: '', - cell : SeriesStatusCell - }, - { - name : 'this', - label: 'Title', - cell : SeriesTitleCell - }, - { - name : 'seasonCount', - label: 'Seasons', - cell : 'integer' - }, - { - name : 'quality', - label: 'Quality', - cell : 'integer' - }, - { - name : 'network', - label: 'Network', - cell : 'string' - }, - { - name : 'nextAiring', - label: 'Next Airing', - cell : AirDateCell - }, - { - name : 'this', - label : 'Episodes', - sortable: false, - template: 'Series/EpisodeProgressTemplate', - cell : TemplatedCell - }, - { - name : 'this', - label : '', - sortable: false, - template: 'Series/Index/Table/ControlsColumnTemplate', - cell : TemplatedCell - } - ], - - leftSideButtons: { - type : 'default', - storeState: false, - items : [ + columns: + [ + { + name : 'status', + label: '', + cell : SeriesStatusCell + }, + { + name : 'this', + label: 'Title', + cell : SeriesTitleCell + }, + { + name : 'seasonCount', + label: 'Seasons', + cell : 'integer' + }, { - title: 'Add Series', - icon : 'icon-plus', - route: 'series/add' + name : 'quality', + label: 'Quality', + cell : 'integer' }, { - title : 'RSS Sync', - icon : 'icon-rss', - command : 'rsssync', - successMessage: 'RSS Sync Completed', - errorMessage : 'RSS Sync Failed!' + name : 'network', + label: 'Network', + cell : 'string' }, { - title : 'Update Library', - icon : 'icon-refresh', - command : 'refreshseries', - successMessage: 'Library was updated!', - errorMessage : 'Library update failed!' + name : 'nextAiring', + label: 'Next Airing', + cell : AirDateCell + }, + { + name : 'this', + label : 'Episodes', + sortable: false, + template: 'Series/EpisodeProgressTemplate', + cell : TemplatedCell + }, + { + name : 'this', + label : '', + sortable: false, + template: 'Series/Index/Table/ControlsColumnTemplate', + cell : TemplatedCell } - ] + ], + + leftSideButtons: { + type : 'default', + storeState: false, + items : + [ + { + title: 'Add Series', + icon : 'icon-plus', + route: 'series/add' + }, + { + title : 'RSS Sync', + icon : 'icon-rss', + command : 'rsssync', + successMessage: 'RSS Sync Completed', + errorMessage : 'RSS Sync Failed!' + }, + { + title : 'Update Library', + icon : 'icon-refresh', + command : 'refreshseries', + successMessage: 'Library was updated!', + errorMessage : 'Library update failed!' + } + ] }, _showTable: function () { - var view = new Backgrid.Grid( - { - row : NzbDrone.Series.Index.Table.Row, - columns : this.columns, - collection: this.seriesCollection, - className : 'table table-hover' - }); + var view = new Backgrid.Grid({ + row : SeriesIndexRow, + columns : this.columns, + collection: this.seriesCollection, + className : 'table table-hover' + }); this._fetchCollection(view); }, @@ -140,16 +130,15 @@ define([ if (this.seriesCollection.models.length === 0) { this.series.show(new LoadingView()); - this.seriesCollection.fetch() - .done(function () { - if (self.seriesCollection.models.length === 0) { - self._showEmpty(); - } - else { - view.collection = self.seriesCollection; - self.series.show(view); - } - }); + this.seriesCollection.fetch().done(function () { + if (self.seriesCollection.models.length === 0) { + self._showEmpty(); + } + else { + view.collection = self.seriesCollection; + self.series.show(view); + } + }); } else { @@ -170,35 +159,40 @@ define([ storeState : true, menuKey : 'seriesViewMode', defaultAction: 'listView', - items : [ - { - key : 'tableView', - title : '', - icon : 'icon-table', - callback: this._showTable - }, - { - key : 'listView', - title : '', - icon : 'icon-list', - callback: this._showList - }, - { - key : 'posterView', - title : '', - icon : 'icon-picture', - callback: this._showPosters - } - ] + items : + [ + { + key : 'tableView', + title : '', + icon : 'icon-table', + callback: this._showTable + }, + { + key : 'listView', + title : '', + icon : 'icon-list', + callback: this._showList + }, + { + key : 'posterView', + title : '', + icon : 'icon-picture', + callback: this._showPosters + } + ] }; this.toolbar.show(new ToolbarLayout({ - right : [ viewButtons], - left : [ this.leftSideButtons], + right : + [ + viewButtons + ], + left : + [ + this.leftSideButtons + ], context: this })); } }); - - return NzbDrone.Series.Index.SeriesIndexLayou; }); diff --git a/UI/Series/Index/Table/Row.js b/UI/Series/Index/Table/Row.js index d13497549..3ab05e994 100644 --- a/UI/Series/Index/Table/Row.js +++ b/UI/Series/Index/Table/Row.js @@ -1,22 +1,26 @@ 'use strict'; -define(['app','backgrid'], function () { - NzbDrone.Series.Index.Table.Row = Backgrid.Row.extend({ - events: { - 'click .x-edit' : 'editSeries', - 'click .x-remove': 'removeSeries' - }, +define( + [ + 'app', + 'backgrid', + 'Series/Edit/EditSeriesView', + 'Series/Delete/DeleteSeriesView' + ], function (App, Backgrid, EditSeriesView, DeleteSeriesView) { + return Backgrid.Row.extend({ + events: { + 'click .x-edit' : 'editSeries', + 'click .x-remove': 'removeSeries' + }, - editSeries: function () { - var view = new NzbDrone.Series.Edit.EditSeriesView({ model: this.model}); - NzbDrone.modalRegion.show(view); - }, + editSeries: function () { + var view = new EditSeriesView({ model: this.model}); + App.modalRegion.show(view); + }, - removeSeries: function () { - var view = new NzbDrone.Series.Delete.DeleteSeriesView({ model: this.model }); - NzbDrone.modalRegion.show(view); - } + removeSeries: function () { + var view = new DeleteSeriesView({ model: this.model }); + App.modalRegion.show(view); + } + }); }); - return NzbDrone.Series.Table.Row; -}); - diff --git a/UI/Series/Index/Table/SeriesStatusCell.js b/UI/Series/Index/Table/SeriesStatusCell.js new file mode 100644 index 000000000..f20ec2dc3 --- /dev/null +++ b/UI/Series/Index/Table/SeriesStatusCell.js @@ -0,0 +1,28 @@ +'use strict'; +define( + [ + 'backgrid' + ], function (Backgrid) { + return Backgrid.Cell.extend({ + className: 'series-status-cell', + + render: function () { + this.$el.empty(); + var monitored = this.model.get('monitored'); + var status = this.model.get('status'); + + if (!monitored) { + this.$el.html('<i class="icon-pause grid-icon" title="Not Monitored"></i>'); + } + else if (status === 'continuing') { + this.$el.html('<i class="icon-play grid-icon" title="Continuing"></i>'); + } + + else { + this.$el.html('<i class="icon-stop grid-icon" title="Ended"></i>'); + } + + return this; + } + }); + }); diff --git a/UI/Series/SeasonCollection.js b/UI/Series/SeasonCollection.js index 8b2db0450..a1abbc898 100644 --- a/UI/Series/SeasonCollection.js +++ b/UI/Series/SeasonCollection.js @@ -1,23 +1,24 @@ -'use strict'; -define(['app', 'Series/SeasonModel', 'backbone.pageable'], function (App, SeasonModel, PageAbleCollection) { - NzbDrone.Series.SeasonCollection = PageAbleCollection.extend({ - url : NzbDrone.Constants.ApiRoot + '/season', - model: NzbDrone.Series.SeasonModel, +'use strict'; +define( + [ + 'Series/SeasonModel', + 'backbone.pageable' + ], function (SeasonModel, PageAbleCollection) { + return PageAbleCollection.extend({ + url : window.ApiRoot + '/season', + model: SeasonModel, - mode: 'client', + mode: 'client', - state: { - sortKey : 'seasonNumber', - order : 1, - pageSize: 1000000 - }, + state: { + sortKey : 'seasonNumber', + order : 1, + pageSize: 1000000 + }, - queryParams: { - sortKey: null, - order : null - } + queryParams: { + sortKey: null, + order : null + } + }); }); - - - return NzbDrone.Series.SeasonCollection; -}); diff --git a/UI/Series/SeasonModel.js b/UI/Series/SeasonModel.js index c52da83f9..d47d268bb 100644 --- a/UI/Series/SeasonModel.js +++ b/UI/Series/SeasonModel.js @@ -1,24 +1,25 @@ -'use strict'; -define(['app'], function () { - NzbDrone.Series.SeasonModel = Backbone.Model.extend({ +'use strict'; +define( + [ + 'backbone' + ], function (Backbone) { + return Backbone.Model.extend({ - mutators: { - seasonTitle: function () { - var seasonNumber = this.get('seasonNumber'); + mutators: { + seasonTitle: function () { + var seasonNumber = this.get('seasonNumber'); - if (seasonNumber === 0) { - return 'Specials'; + if (seasonNumber === 0) { + return 'Specials'; + } + + return 'Season ' + seasonNumber; } + }, - return 'Season ' + seasonNumber; + defaults: { + seasonNumber: 0 } - }, - - defaults: { - seasonNumber: 0 - } + }); }); - return NzbDrone.Series.SeasonModel; -}); - diff --git a/UI/Series/SeriesCollection.js b/UI/Series/SeriesCollection.js index de8d15014..1b91a429f 100644 --- a/UI/Series/SeriesCollection.js +++ b/UI/Series/SeriesCollection.js @@ -1,18 +1,20 @@ -'use strict'; -define(['app', 'Series/SeriesModel'], function () { - NzbDrone.Series.SeriesCollection = Backbone.Collection.extend({ - url : NzbDrone.Constants.ApiRoot + '/series', - model: NzbDrone.Series.SeriesModel, +'use strict'; +define( + [ + 'backbone', + 'Series/SeriesModel' + ], function (Backbone, SeriesModel) { + return Backbone.Collection.extend({ + url : window.ApiRoot + '/series', + model: SeriesModel, - comparator: function(model) { - return model.get('title'); - }, + comparator: function (model) { + return model.get('title'); + }, - state: { - sortKey: 'title', - order: -1 - } + state: { + sortKey: 'title', + order : -1 + } + }); }); - - return NzbDrone.Series.SeriesCollection; -}); diff --git a/UI/Series/SeriesModel.js b/UI/Series/SeriesModel.js index 5830f966b..bca7a296a 100644 --- a/UI/Series/SeriesModel.js +++ b/UI/Series/SeriesModel.js @@ -1,87 +1,88 @@ -'use strict'; -define(['app', 'Quality/QualityProfileCollection'], function (app, qualityProfiles) { - NzbDrone.Series.SeriesModel = Backbone.Model.extend({ - - urlRoot: NzbDrone.Constants.ApiRoot + '/series', - - mutators: { - percentOfEpisodes: function () { - var episodeCount = this.get('episodeCount'); - var episodeFileCount = this.get('episodeFileCount'); - - var percent = 100; - - if (episodeCount > 0) { - percent = episodeFileCount / episodeCount * 100; - } - - return percent; - }, - poster : function () { - var poster = _.find(this.get('images'), function (image) { - return image.coverType === 'poster'; - }); - - if (poster) { - return poster.url; +'use strict'; +define( + [ + 'backbone', + 'Quality/QualityProfileCollection', + ], function (Backbone, QualityProfileCollection) { + return Backbone.Model.extend({ + + urlRoot: Constants.ApiRoot + '/series', + + mutators: { + percentOfEpisodes: function () { + var episodeCount = this.get('episodeCount'); + var episodeFileCount = this.get('episodeFileCount'); + + var percent = 100; + + if (episodeCount > 0) { + percent = episodeFileCount / episodeCount * 100; + } + + return percent; + }, + poster : function () { + var poster = _.find(this.get('images'), function (image) { + return image.coverType === 'poster'; + }); + + if (poster) { + return poster.url; + } + + return undefined; + }, + fanArt : function () { + var poster = _.find(this.get('images'), function (image) { + return image.coverType === 'fanart'; + }); + + if (poster) { + return poster.url; + } + + return undefined; + }, + traktUrl : function () { + return 'http://trakt.tv/show/' + this.get('titleSlug'); + }, + imdbUrl : function () { + return 'http://imdb.com/title/' + this.get('imdbId'); + }, + isContinuing : function () { + return this.get('status') === 'continuing'; + }, + shortDate : function () { + var date = this.get('nextAiring'); + + if (!date) { + return ''; + } + + return Date.create(date).short(); + }, + route : function () { + return '/series/details/' + this.get('titleSlug'); + //return '/series/details/' + this.get('id'); + }, + + qualityProfile: function () { + + var profile = QualityProfileCollection.get(this.get('qualityProfileId')); + + if (profile) { + return profile.toJSON(); + } + + return undefined; } - - return undefined; }, - fanArt : function () { - var poster = _.find(this.get('images'), function (image) { - return image.coverType === 'fanart'; - }); - - if (poster) { - return poster.url; - } - return undefined; - }, - traktUrl : function () { - return 'http://trakt.tv/show/' + this.get('titleSlug'); - }, - imdbUrl : function () { - return 'http://imdb.com/title/' + this.get('imdbId'); - }, - isContinuing : function () { - return this.get('status') === 'continuing'; - }, - shortDate : function () { - var date = this.get('nextAiring'); - - if (!date) { - return ''; - } - - return Date.create(date).short(); - }, - route : function () { - return '/series/details/' + this.get('titleSlug'); - //return '/series/details/' + this.get('id'); - }, - - qualityProfile: function () { - - var profile = qualityProfiles.get(this.get('qualityProfileId')); - - if (profile) { - return profile.toJSON(); - } - - return undefined; + defaults: { + episodeFileCount: 0, + episodeCount : 0, + isExisting : false, + status : 0 } - }, - - defaults: { - episodeFileCount: 0, - episodeCount : 0, - isExisting : false, - status : 0 - } + }); }); - - return NzbDrone.Series.SeriesModel; - -}); diff --git a/UI/ServerStatus.js b/UI/ServerStatus.js index 2504dcd04..a2605648d 100644 --- a/UI/ServerStatus.js +++ b/UI/ServerStatus.js @@ -1,6 +1,8 @@ +window.ApiRoot = '/api'; + var statusText = $.ajax({ type : 'GET', - url : '/api/system/status', + url : window.ApiRoot + '/system/status', async: false }).responseText; diff --git a/UI/Settings/DownloadClient/DownloadClientView.js b/UI/Settings/DownloadClient/DownloadClientView.js index 358d4b97d..fa2f4ef31 100644 --- a/UI/Settings/DownloadClient/DownloadClientView.js +++ b/UI/Settings/DownloadClient/DownloadClientView.js @@ -1,79 +1,81 @@ -'use strict'; +'use strict'; -define([ - 'app', 'marionette', 'Mixins/AsModelBoundView', 'bootstrap' +define( + [ + 'marionette', + 'Mixins/AsModelBoundView', + 'bootstrap' + ], function (Marionette, AsModelBoundView) { -], function (App, Marionette, AsModelBoundView) { + var view = Marionette.ItemView.extend({ + template : 'Settings/DownloadClient/DownloadClientTemplate', + className: 'form-horizontal', - var view = Marionette.ItemView.extend({ - template : 'Settings/DownloadClient/DownloadClientTemplate', - className: 'form-horizontal', + ui: { + bsSwitch : '.switch', + tooltip : '.help-inline i', + pathInput : '.x-path', + sabConfig : '.x-sab-config', + blackholeConfig : '.x-blackhole-config', + pneumaticConfig : '.x-pneumatic-config', + nzbGetConfig : '.x-nzbget-config', + downloadClientSelect: '.x-download-client' + }, - ui: { - bsSwitch : '.switch', - tooltip : '.help-inline i', - pathInput : '.x-path', - sabConfig : '.x-sab-config', - blackholeConfig : '.x-blackhole-config', - pneumaticConfig : '.x-pneumatic-config', - nzbGetConfig : '.x-nzbget-config', - downloadClientSelect: '.x-download-client' - }, + events: { + 'change .x-download-client': 'downloadClientChanged' + }, - events: { - 'change .x-download-client': 'downloadClientChanged' - }, + onRender: function () { + this.ui.pathInput.autoComplete('/directories'); + this.refreshUIVisibility(this.model.get('downloadClient')); + }, - onRender: function () { - this.ui.pathInput.autoComplete('/directories'); - this.refreshUIVisibility(this.model.get('downloadClient')); - }, + downloadClientChanged: function () { + var clientId = this.ui.downloadClientSelect.val(); + this.refreshUIVisibility(clientId); + }, - downloadClientChanged: function () { - var clientId = this.ui.downloadClientSelect.val(); - this.refreshUIVisibility(clientId); - }, + refreshUIVisibility: function (clientId) { - refreshUIVisibility: function (clientId) { + if (!clientId) { + clientId = 'sabnzbd'; + } - if (!clientId) { - clientId = 'sabnzbd'; - } - - switch (clientId.toString()) { - case 'sabnzbd': - this.ui.sabConfig.show(); - this.ui.blackholeConfig.hide(); - this.ui.pneumaticConfig.hide(); - this.ui.nzbGetConfig.hide(); - break; + switch (clientId.toString()) { + case 'sabnzbd': + this.ui.sabConfig.show(); + this.ui.blackholeConfig.hide(); + this.ui.pneumaticConfig.hide(); + this.ui.nzbGetConfig.hide(); + break; - case 'blackhole': - this.ui.sabConfig.hide(); - this.ui.blackholeConfig.show(); - this.ui.pneumaticConfig.hide(); - this.ui.nzbGetConfig.hide(); - break; + case 'blackhole': + this.ui.sabConfig.hide(); + this.ui.blackholeConfig.show(); + this.ui.pneumaticConfig.hide(); + this.ui.nzbGetConfig.hide(); + break; - case 'pneumatic': - this.ui.sabConfig.hide(); - this.ui.blackholeConfig.hide(); - this.ui.pneumaticConfig.show(); - this.ui.nzbGetConfig.hide(); - break; + case 'pneumatic': + this.ui.sabConfig.hide(); + this.ui.blackholeConfig.hide(); + this.ui.pneumaticConfig.show(); + this.ui.nzbGetConfig.hide(); + break; - case 'nzbget': - this.ui.sabConfig.hide(); - this.ui.blackholeConfig.hide(); - this.ui.pneumaticConfig.hide(); - this.ui.nzbGetConfig.show(); - break; + case 'nzbget': + this.ui.sabConfig.hide(); + this.ui.blackholeConfig.hide(); + this.ui.pneumaticConfig.hide(); + this.ui.nzbGetConfig.show(); + break; - default : - throw 'unknown download client id' + clientId; + default : + throw 'unknown download client id' + clientId; + } } - } - }); + }); - return AsModelBoundView.call(view); -}); + return AsModelBoundView.call(view); + }); diff --git a/UI/Settings/General/GeneralSettingsModel.js b/UI/Settings/General/GeneralSettingsModel.js index e748f5d5a..00b03f68b 100644 --- a/UI/Settings/General/GeneralSettingsModel.js +++ b/UI/Settings/General/GeneralSettingsModel.js @@ -1,19 +1,23 @@ -'use strict'; -define(['app', 'backbone', 'Mixins/AsChangeTrackingModel'], function (App, Backbone, AsChangeTrackingModel) { - var model = Backbone.Model.extend({ +'use strict'; +define( + [ + 'backbone', + 'Mixins/AsChangeTrackingModel' + ], function (Backbone, AsChangeTrackingModel) { + var model = Backbone.Model.extend({ - url: App.Constants.ApiRoot + '/settings/host', + url: window.ApiRoot + '/settings/host', - initialize: function () { - this.on('change', function () { - this.isSaved = false; - }, this); + initialize: function () { + this.on('change', function () { + this.isSaved = false; + }, this); - this.on('sync', function () { - this.isSaved = true; - }, this); - } - }); + this.on('sync', function () { + this.isSaved = true; + }, this); + } + }); - return AsChangeTrackingModel.call(model); -}); + return AsChangeTrackingModel.call(model); + }); diff --git a/UI/Settings/Indexers/Collection.js b/UI/Settings/Indexers/Collection.js index f2da2c061..21f459785 100644 --- a/UI/Settings/Indexers/Collection.js +++ b/UI/Settings/Indexers/Collection.js @@ -1,7 +1,10 @@ -'use strict'; -define(['app', 'Settings/Indexers/Model'], function (App, IndexerModel) { - return Backbone.Collection.extend({ - url : App.Constants.ApiRoot + '/indexer', - model: IndexerModel +'use strict'; +define( + [ + 'Settings/Indexers/Model' + ], function (IndexerModel) { + return Backbone.Collection.extend({ + url : window.ApiRoot + '/indexer', + model: IndexerModel + }); }); -}); diff --git a/UI/Settings/Indexers/EditView.js b/UI/Settings/Indexers/EditView.js index 9332c3e19..d7b87a78d 100644 --- a/UI/Settings/Indexers/EditView.js +++ b/UI/Settings/Indexers/EditView.js @@ -1,26 +1,26 @@ -'use strict'; +'use strict'; -define([ - 'app', - 'marionette', - 'Mixins/AsModelBoundView' -], function (App, Marionette, AsModelBoundView) { +define( + [ + 'marionette', + 'Mixins/AsModelBoundView' + ], function (Marionette, AsModelBoundView) { - var view = Marionette.ItemView.extend({ - template: 'Settings/Indexers/EditTemplate', + var view = Marionette.ItemView.extend({ + template: 'Settings/Indexers/EditTemplate', - events: { - 'click .x-save': 'save' - }, + events: { + 'click .x-save': 'save' + }, - initialize: function (options) { - this.indexerCollection = options.indexerCollection; - }, + initialize: function (options) { + this.indexerCollection = options.indexerCollection; + }, - save: function () { - this.model.saveSettings(); - } - }); + save: function () { + this.model.saveSettings(); + } + }); - return AsModelBoundView.call(view); -}); + return AsModelBoundView.call(view); + }); diff --git a/UI/Settings/Naming/NamingModel.js b/UI/Settings/Naming/NamingModel.js index a892f0522..23c77e24b 100644 --- a/UI/Settings/Naming/NamingModel.js +++ b/UI/Settings/Naming/NamingModel.js @@ -1,10 +1,12 @@ -'use strict'; -define(['app', - 'Settings/SettingsModelBase'], function (App, ModelBase) { - return ModelBase.extend({ - url : App.Constants.ApiRoot + '/config/naming', - successMessage: 'Naming settings saved', - errorMessage : 'Couldn\'t save naming settings' - }); +'use strict'; +define( + [ + 'Settings/SettingsModelBase' + ], function (ModelBase) { + return ModelBase.extend({ + url : window.ApiRoot + '/config/naming', + successMessage: 'Naming settings saved', + errorMessage : 'Couldn\'t save naming settings' + }); -}); + }); diff --git a/UI/Settings/Naming/NamingView.js b/UI/Settings/Naming/NamingView.js index a360f5869..cf3f4acff 100644 --- a/UI/Settings/Naming/NamingView.js +++ b/UI/Settings/Naming/NamingView.js @@ -1,18 +1,20 @@ -'use strict'; -define(['app', - 'marionette', - 'Settings/Naming/NamingModel', - 'Mixins/AsModelBoundView'], function (App, Marionette, NamingModel, AsModelBoundView) { +'use strict'; +define( + [ + 'marionette', + 'Settings/Naming/NamingModel', + 'Mixins/AsModelBoundView' + ], function (Marionette, NamingModel, AsModelBoundView) { - var view = Marionette.ItemView.extend({ - template: 'Settings/Naming/NamingTemplate', + var view = Marionette.ItemView.extend({ + template: 'Settings/Naming/NamingTemplate', - initialize: function () { - this.model = new NamingModel(); - this.model.fetch(); - } + initialize: function () { + this.model = new NamingModel(); + this.model.fetch(); + } - }); + }); - return AsModelBoundView.call(view); -}); + return AsModelBoundView.call(view); + }); diff --git a/UI/Settings/Notifications/Collection.js b/UI/Settings/Notifications/Collection.js index daf20a9a7..a8dd48449 100644 --- a/UI/Settings/Notifications/Collection.js +++ b/UI/Settings/Notifications/Collection.js @@ -1,7 +1,10 @@ -'use strict'; -define(['app', 'Settings/Notifications/Model'], function (App, NotificationModel) { - return Backbone.Collection.extend({ - url : App.Constants.ApiRoot + '/notification', - model: NotificationModel +'use strict'; +define( + [ + 'Settings/Notifications/Model' + ], function (NotificationModel) { + return Backbone.Collection.extend({ + url : window.ApiRoot + '/notification', + model: NotificationModel + }); }); -}); diff --git a/UI/Settings/Notifications/Model.js b/UI/Settings/Notifications/Model.js index 77f791ee0..be52ad81c 100644 --- a/UI/Settings/Notifications/Model.js +++ b/UI/Settings/Notifications/Model.js @@ -1,5 +1,8 @@ -'use strict'; -define(['app', 'backbone.deepmodel'], function (App, DeepModel) { - return DeepModel.DeepModel.extend({ +'use strict'; +define( + [ + 'backbone.deepmodel' + ], function (DeepModel) { + return DeepModel.DeepModel.extend({ + }); }); -}); diff --git a/UI/Settings/Quality/Profile/DeleteTemplate.html b/UI/Settings/Quality/Profile/DeleteTemplate.html new file mode 100644 index 000000000..d6e0f61e2 --- /dev/null +++ b/UI/Settings/Quality/Profile/DeleteTemplate.html @@ -0,0 +1,11 @@ +<div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h3>Delete: {{name}}</h3> +</div> +<div class="modal-body"> + <p>Are you sure you want to delete '{{name}}'?</p> +</div> +<div class="modal-footer"> + <button class="btn" data-dismiss="modal">cancel</button> + <button class="btn btn-danger x-confirm-delete">delete</button> +</div> diff --git a/UI/Settings/Quality/Profile/DeleteView.js b/UI/Settings/Quality/Profile/DeleteView.js new file mode 100644 index 000000000..dd9671d13 --- /dev/null +++ b/UI/Settings/Quality/Profile/DeleteView.js @@ -0,0 +1,24 @@ +'use strict'; +define( + [ + 'app', + 'marionette' + ], function (App, Marionette) { + + return Marionette.ItemView.extend({ + template: 'Quality/Profile/DeleteTemplate', + + events: { + 'click .x-confirm-delete': '_removeProfile' + }, + + _removeProfile: function () { + + this.model.destroy({ + wait: true + }).done(function () { + App.modalRegion.close(); + }); + } + }); + }); diff --git a/UI/Settings/Quality/Profile/QualityProfileView.js b/UI/Settings/Quality/Profile/QualityProfileView.js index 74a795f33..bd4d79db6 100644 --- a/UI/Settings/Quality/Profile/QualityProfileView.js +++ b/UI/Settings/Quality/Profile/QualityProfileView.js @@ -1,35 +1,40 @@ -'use strict'; - -define([ - 'app', - 'marionette', - 'Settings/Quality/Profile/EditQualityProfileView', - 'Mixins/AsModelBoundView' -], function (App, Marionette, EditProfileView, AsModelBoundView) { - - var view = Marionette.ItemView.extend({ - template: 'Settings/Quality/Profile/QualityProfileTemplate', - tagName : 'tr', - - ui: { - 'progressbar': '.progress .bar' - }, - - events: { - 'click .x-edit' : 'edit', - 'click .x-remove': 'removeQuality' - }, - - edit: function () { - var view = new EditProfileView({ model: this.model}); - App.modalRegion.show(view); - }, - - removeQuality: function () { - var view = new NzbDrone.Series.Delete.DeleteSeriesView({ model: this.model }); - NzbDrone.modalRegion.show(view); - } - }); + +'use strict'; + +define( + [ + 'app', + 'marionette', + 'Settings/Quality/Profile/EditQualityProfileView', + 'Settings/Quality/Profile/DeleteView', + 'Mixins/AsModelBoundView' + + ], function (App, Marionette, EditProfileView, DeleteProfileView, AsModelBoundView) { + + var view = Marionette.ItemView.extend({ + template: 'Settings/Quality/Profile/QualityProfileTemplate', + tagName : 'tr', + + ui: { + 'progressbar': '.progress .bar' + }, - return AsModelBoundView.call(view); -}); + events: { + 'click .x-edit' : 'edit', + 'click .x-remove': 'removeQuality' + }, + + edit: function () { + var view = new EditProfileView({ model: this.model}); + App.modalRegion.show(view); + }, + + removeQuality: function () { + var view = new DeleteProfileView({ model: this.model }); + App.modalRegion.show(view); + } + }); + + + return AsModelBoundView.call(view); + }); diff --git a/UI/Settings/Quality/QualityLayout.js b/UI/Settings/Quality/QualityLayout.js index 03942df51..f58f9d7ba 100644 --- a/UI/Settings/Quality/QualityLayout.js +++ b/UI/Settings/Quality/QualityLayout.js @@ -1,13 +1,12 @@ -'use strict'; -define([ - 'app', - 'marionette', - 'Quality/QualityProfileCollection', - 'Settings/Quality/Profile/QualityProfileCollectionView', - 'Quality/QualitySizeCollection', - 'Settings/Quality/Size/QualitySizeCollectionView' -], - function (App, Marionette, QualityProfileCollection, QualityProfileCollectionView, QualitySizeCollection, QualitySizeCollectionView) { +'use strict'; +define( + [ + 'marionette', + 'Quality/QualityProfileCollection', + 'Settings/Quality/Profile/QualityProfileCollectionView', + 'Quality/QualitySizeCollection', + 'Settings/Quality/Size/QualitySizeCollectionView' + ], function (Marionette, QualityProfileCollection, QualityProfileCollectionView, QualitySizeCollection, QualitySizeCollectionView) { return Marionette.Layout.extend({ template: 'Settings/Quality/QualityLayoutTemplate', diff --git a/UI/Settings/SettingsLayout.js b/UI/Settings/SettingsLayout.js index 994670199..ca4e544df 100644 --- a/UI/Settings/SettingsLayout.js +++ b/UI/Settings/SettingsLayout.js @@ -1,21 +1,22 @@ -'use strict'; -define([ - 'app', - 'marionette', - 'Settings/SettingsModel', - 'Settings/General/GeneralSettingsModel', - 'Settings/Naming/NamingView', - 'Settings/Naming/NamingModel', - 'Settings/Quality/QualityLayout', - 'Settings/Indexers/CollectionView', - 'Settings/Indexers/Collection', - 'Settings/DownloadClient/DownloadClientView', - 'Settings/Notifications/CollectionView', - 'Settings/Notifications/Collection', - 'Settings/General/GeneralView', - 'Settings/Misc/MiscView' -], - function (App, Marionette, SettingsModel, GeneralSettingsModel, NamingView, NamingModel, QualityLayout, IndexerCollectionView, IndexerCollection, DownloadClientView, NotificationCollectionView, NotificationCollection, GeneralView, MiscView) { +'use strict'; +define( + [ + 'app', + 'marionette', + 'Settings/SettingsModel', + 'Settings/General/GeneralSettingsModel', + 'Settings/Naming/NamingModel', + 'Settings/Naming/NamingView', + 'Settings/Quality/QualityLayout', + 'Settings/Indexers/CollectionView', + 'Settings/Indexers/Collection', + 'Settings/DownloadClient/DownloadClientView', + 'Settings/Notifications/CollectionView', + 'Settings/Notifications/Collection', + 'Settings/General/GeneralView', + 'Settings/Misc/MiscView' + ], function (App, Marionette, SettingsModel, GeneralSettingsModel,NamingModel, NamingView, QualityLayout, IndexerCollectionView, IndexerCollection, DownloadClientView, + NotificationCollectionView, NotificationCollection, GeneralView, MiscView) { return Marionette.Layout.extend({ template: 'Settings/SettingsLayoutTemplate', @@ -56,7 +57,7 @@ define([ } this.ui.namingTab.tab('show'); - App.Router.navigate('settings/naming'); + this._navigate('settings/naming'); }, showQuality: function (e) { @@ -65,7 +66,7 @@ define([ } this.ui.qualityTab.tab('show'); - App.Router.navigate('settings/quality'); + this._navigate('settings/quality'); }, showIndexers: function (e) { @@ -74,7 +75,7 @@ define([ } this.ui.indexersTab.tab('show'); - App.Router.navigate('settings/indexers'); + this._navigate('settings/indexers'); }, showDownloadClient: function (e) { @@ -83,7 +84,7 @@ define([ } this.ui.downloadClientTab.tab('show'); - App.Router.navigate('settings/downloadclient'); + this._navigate('settings/downloadclient'); }, showNotifications: function (e) { @@ -92,7 +93,7 @@ define([ } this.ui.notificationsTab.tab('show'); - App.Router.navigate('settings/notifications'); + this._navigate('settings/notifications'); }, showGeneral: function (e) { @@ -101,7 +102,7 @@ define([ } this.ui.generalTab.tab('show'); - App.Router.navigate('settings/general'); + this._navigate('settings/general'); }, showMisc: function (e) { @@ -110,7 +111,13 @@ define([ } this.ui.miscTab.tab('show'); - App.Router.navigate('settings/misc'); + this._navigate('settings/misc'); + }, + + _navigate:function(route){ + require(['Router'], function(){ + App.Router.navigate(route); + }); }, initialize: function (options) { diff --git a/UI/Settings/SettingsModel.js b/UI/Settings/SettingsModel.js index e93127d20..4e0c142ec 100644 --- a/UI/Settings/SettingsModel.js +++ b/UI/Settings/SettingsModel.js @@ -1,8 +1,8 @@ -'use strict'; +'use strict'; define(['app', 'Settings/SettingsModelBase'], function (App, SettingsModelBase) { return SettingsModelBase.extend({ - url : App.Constants.ApiRoot + '/settings', + url : window.ApiRoot + '/settings', successMessage: 'Settings saved', errorMessage : 'Failed to save settings' }); diff --git a/UI/Shared/FormatHelpers.js b/UI/Shared/FormatHelpers.js index a6d910bbf..1c14f8e87 100644 --- a/UI/Shared/FormatHelpers.js +++ b/UI/Shared/FormatHelpers.js @@ -1,37 +1,38 @@ 'use strict'; -define(['app'], function () { - NzbDrone.Shared.FormatHelpers.FileSizeHelper = function (sourceSize) { - var size = Number(sourceSize); - return size.bytes(1); - }; +define( + [ + 'sugar' + ], { + FileSizeHelper: function (sourceSize) { + var size = Number(sourceSize); + return size.bytes(1); + }, - NzbDrone.Shared.FormatHelpers.DateHelper = function (sourceDate) { - if (!sourceDate) { - return ''; - } - - var date = Date.create(sourceDate); + DateHelper: function (sourceDate) { + if (!sourceDate) { + return ''; + } - if (date.isYesterday()) { - return 'Yesterday'; - } - if (date.isToday()) { - return 'Today'; - } - if (date.isTomorrow()) { - return 'Tomorrow'; - } - if (date.isAfter(Date.create('tomorrow')) && date.isBefore(Date.create().addDays(7))) { - return date.format('{Weekday}'); - } + var date = Date.create(sourceDate); - if (date.isAfter(Date.create().addDays(6))) { - return date.relative().replace(' from now', ''); - } + if (date.isYesterday()) { + return 'Yesterday'; + } + if (date.isToday()) { + return 'Today'; + } + if (date.isTomorrow()) { + return 'Tomorrow'; + } + if (date.isAfter(Date.create('tomorrow')) && date.isBefore(Date.create().addDays(7))) { + return date.format('{Weekday}'); + } - return date.format('{MM}/{dd}/{yyyy}'); - }; + if (date.isAfter(Date.create().addDays(6))) { + return date.relative().replace(' from now', ''); + } - return NzbDrone.Shared.FormatHelpers; -}); + return date.format('{MM}/{dd}/{yyyy}'); + } + }); diff --git a/UI/Shared/Grid/HeaderCell.js b/UI/Shared/Grid/HeaderCell.js index 7c4c3d923..33dcbf857 100644 --- a/UI/Shared/Grid/HeaderCell.js +++ b/UI/Shared/Grid/HeaderCell.js @@ -1,100 +1,102 @@ 'use strict'; -define(['app','backgrid'], function () { - - - Backgrid.NzbDroneHeaderCell = Backgrid.HeaderCell.extend({ - events: { - 'click': 'onClick' - }, - - render: function () { - this.$el.empty(); - this.$el.append(this.column.get('label')); - - if (this.column.get('sortable')) { - this.$el.addClass('clickable'); - this.$el.append(' <i class="pull-right"></i>'); - - if (this.collection.state) { - var sortKey = this.collection.state.sortKey; - var sortDir = this._convertIntToDirection(this.collection.state.order); - - if (sortKey === this.column.get('name')) { - this.$el.children('i').addClass(this._convertDirectionToIcon(sortDir)); - this._direction = sortDir; +define( + [ + 'backgrid' + ], function (Backgrid) { + + Backgrid.NzbDroneHeaderCell = Backgrid.HeaderCell.extend({ + events: { + 'click': 'onClick' + }, + + render: function () { + this.$el.empty(); + this.$el.append(this.column.get('label')); + + if (this.column.get('sortable')) { + this.$el.addClass('clickable'); + this.$el.append(' <i class="pull-right"></i>'); + + if (this.collection.state) { + var sortKey = this.collection.state.sortKey; + var sortDir = this._convertIntToDirection(this.collection.state.order); + + if (sortKey === this.column.get('name')) { + this.$el.children('i').addClass(this._convertDirectionToIcon(sortDir)); + this._direction = sortDir; + } } } - } - this.delegateEvents(); - return this; - }, - - direction: function (dir) { - if (arguments.length) { - if (this._direction) { - this.$el.children('i').removeClass(this._convertDirectionToIcon(this._direction)); - } - if (dir) { - this.$el.children('i').addClass(this._convertDirectionToIcon(dir)); + this.delegateEvents(); + return this; + }, + + direction: function (dir) { + if (arguments.length) { + if (this._direction) { + this.$el.children('i').removeClass(this._convertDirectionToIcon(this._direction)); + } + if (dir) { + this.$el.children('i').addClass(this._convertDirectionToIcon(dir)); + } + this._direction = dir; } - this._direction = dir; - } - - return this._direction; - }, - onClick: function (e) { - e.preventDefault(); - - var columnName = this.column.get('name'); - - if (this.column.get('sortable')) { - if (this.direction() === 'ascending') { - this.sort(columnName, 'descending', function (left, right) { - var leftVal = left.get(columnName); - var rightVal = right.get(columnName); - if (leftVal === rightVal) { - return 0; - } - else if (leftVal > rightVal) { - return -1; - } - return 1; - }); + return this._direction; + }, + + onClick: function (e) { + e.preventDefault(); + + var columnName = this.column.get('name'); + + if (this.column.get('sortable')) { + if (this.direction() === 'ascending') { + this.sort(columnName, 'descending', function (left, right) { + var leftVal = left.get(columnName); + var rightVal = right.get(columnName); + if (leftVal === rightVal) { + return 0; + } + else if (leftVal > rightVal) { + return -1; + } + return 1; + }); + } + else { + this.sort(columnName, 'ascending', function (left, right) { + var leftVal = left.get(columnName); + var rightVal = right.get(columnName); + if (leftVal === rightVal) { + return 0; + } + else if (leftVal < rightVal) { + return -1; + } + return 1; + }); + } } - else { - this.sort(columnName, 'ascending', function (left, right) { - var leftVal = left.get(columnName); - var rightVal = right.get(columnName); - if (leftVal === rightVal) { - return 0; - } - else if (leftVal < rightVal) { - return -1; - } - return 1; - }); + }, + + _convertDirectionToIcon: function (dir) { + if (dir === 'ascending') { + return 'icon-sort-up'; } - } - }, - _convertDirectionToIcon: function (dir) { - if (dir === 'ascending') { - return 'icon-sort-up'; - } + return 'icon-sort-down'; + }, - return 'icon-sort-down'; - }, + _convertIntToDirection: function (dir) { + if (dir === '-1') { + return 'ascending'; + } - _convertIntToDirection: function (dir) { - if (dir === '-1') { - return 'ascending'; + return 'descending'; } + }); - return 'descending'; - } + return Backgrid.NzbDroneHeaderCell; }); - - return Backgrid.NzbDroneHeaderCell; -}); diff --git a/UI/Shared/Grid/Pager.js b/UI/Shared/Grid/Pager.js index b3240dff6..ade0a525a 100644 --- a/UI/Shared/Grid/Pager.js +++ b/UI/Shared/Grid/Pager.js @@ -1,146 +1,145 @@ 'use strict'; -define([ - 'app', - 'backgrid', - 'backgrid.paginator' -], function () { +define( + [ + 'backgrid.paginator' + ], function (Paginator) { - NzbDrone.Shared.Grid.Pager = Backgrid.Extension.Paginator.extend({ + return Paginator.extend({ - template: 'Shared/Grid/PagerTemplate', + template: 'Shared/Grid/PagerTemplate', - events: { - 'click .pager-btn': 'changePage' - }, + events: { + 'click .pager-btn': 'changePage' + }, - windowSize: 1, + windowSize: 1, - fastForwardHandleLabels: { - first: 'icon-fast-backward', - prev : 'icon-backward', - next : 'icon-forward', - last : 'icon-fast-forward' - }, + fastForwardHandleLabels: { + first: 'icon-fast-backward', + prev : 'icon-backward', + next : 'icon-forward', + last : 'icon-fast-forward' + }, - changePage: function (e) { - e.preventDefault(); + changePage: function (e) { + e.preventDefault(); - var target = $(e.target); + var target = $(e.target); - if (target.closest('li').hasClass('disabled')) { - return; - } - - var label = target.attr('data-action'); - var ffLabels = this.fastForwardHandleLabels; - - var collection = this.collection; - - if (ffLabels) { - switch (label) { - case 'first': - collection.getFirstPage(); - return; - case 'prev': - if (collection.hasPrevious()) { - collection.getPreviousPage(); - } - return; - case 'next': - if (collection.hasNext()) { - collection.getNextPage(); - } - return; - case 'last': - collection.getLastPage(); - return; - } - } - - var state = collection.state; - var pageIndex = $(e.target).text() * 1; - collection.getPage(state.firstPage === 0 ? pageIndex - 1 :pageIndex); - }, - - makeHandles: function () { - - var handles = []; - var collection = this.collection; - var state = collection.state; - - // convert all indices to 0-based here - var firstPage = state.firstPage; - var lastPage = +state.lastPage; - lastPage = Math.max(0, firstPage ? lastPage - 1 :lastPage); - var currentPage = Math.max(state.currentPage, state.firstPage); - currentPage = firstPage ? currentPage - 1 :currentPage; - var windowStart = Math.floor(currentPage / this.windowSize) * this.windowSize; - var windowEnd = Math.min(lastPage + 1, windowStart + this.windowSize); - - if (collection.mode !== 'infinite') { - for (var i = windowStart; i < windowEnd; i++) { - handles.push({ - label : i + 1, - title : 'No. ' + (i + 1), - className : currentPage === i ? 'active' :undefined, - pageNumber: i + 1 - }); - } - } - - var ffLabels = this.fastForwardHandleLabels; - if (ffLabels) { - - if (ffLabels.prev) { - handles.unshift({ - label : ffLabels.prev, - className: collection.hasPrevious() ? void 0 :'disabled', - action : 'prev' - }); + if (target.closest('li').hasClass('disabled')) { + return; } - if (ffLabels.first) { - handles.unshift({ - label : ffLabels.first, - className: collection.hasPrevious() ? void 0 :'disabled', - action : 'first' - }); + var label = target.attr('data-action'); + var ffLabels = this.fastForwardHandleLabels; + + var collection = this.collection; + + if (ffLabels) { + switch (label) { + case 'first': + collection.getFirstPage(); + return; + case 'prev': + if (collection.hasPrevious()) { + collection.getPreviousPage(); + } + return; + case 'next': + if (collection.hasNext()) { + collection.getNextPage(); + } + return; + case 'last': + collection.getLastPage(); + return; + } } - if (ffLabels.next) { - handles.push({ - label : ffLabels.next, - className: collection.hasNext() ? void 0 :'disabled', - action : 'next' - }); + var state = collection.state; + var pageIndex = $(e.target).text() * 1; + collection.getPage(state.firstPage === 0 ? pageIndex - 1 :pageIndex); + }, + + makeHandles: function () { + + var handles = + [ + ]; + var collection = this.collection; + var state = collection.state; + + // convert all indices to 0-based here + var firstPage = state.firstPage; + var lastPage = +state.lastPage; + lastPage = Math.max(0, firstPage ? lastPage - 1 :lastPage); + var currentPage = Math.max(state.currentPage, state.firstPage); + currentPage = firstPage ? currentPage - 1 :currentPage; + var windowStart = Math.floor(currentPage / this.windowSize) * this.windowSize; + var windowEnd = Math.min(lastPage + 1, windowStart + this.windowSize); + + if (collection.mode !== 'infinite') { + for (var i = windowStart; i < windowEnd; i++) { + handles.push({ + label : i + 1, + title : 'No. ' + (i + 1), + className : currentPage === i ? 'active' :undefined, + pageNumber: i + 1 + }); + } } - if (ffLabels.last) { - handles.push({ - label : ffLabels.last, - className: collection.hasNext() ? void 0 :'disabled', - action : 'last' - }); + var ffLabels = this.fastForwardHandleLabels; + if (ffLabels) { + + if (ffLabels.prev) { + handles.unshift({ + label : ffLabels.prev, + className: collection.hasPrevious() ? void 0 :'disabled', + action : 'prev' + }); + } + + if (ffLabels.first) { + handles.unshift({ + label : ffLabels.first, + className: collection.hasPrevious() ? void 0 :'disabled', + action : 'first' + }); + } + + if (ffLabels.next) { + handles.push({ + label : ffLabels.next, + className: collection.hasNext() ? void 0 :'disabled', + action : 'next' + }); + } + + if (ffLabels.last) { + handles.push({ + label : ffLabels.last, + className: collection.hasNext() ? void 0 :'disabled', + action : 'last' + }); + } } - } - return handles; - }, + return handles; + }, - render: function () { - this.$el.empty(); + render: function () { + this.$el.empty(); - var templateFunction = Marionette.TemplateCache.get(this.template); + var templateFunction = Marionette.TemplateCache.get(this.template); - this.$el.html(templateFunction({ - handles: this.makeHandles() - })); + this.$el.html(templateFunction({ + handles: this.makeHandles() + })); - this.delegateEvents(); + this.delegateEvents(); - return this; - } + return this; + } + }); }); - - return NzbDrone.Shared.Grid.Pager; -}); diff --git a/UI/Shared/LoadingView.js b/UI/Shared/LoadingView.js index abb66d1c4..a10261a42 100644 --- a/UI/Shared/LoadingView.js +++ b/UI/Shared/LoadingView.js @@ -1,10 +1,10 @@ -'use strict'; - -define(['app'], function () { - NzbDrone.Shared.LoadingView = Backbone.Marionette.ItemView.extend({ - template : 'Shared/LoadingTemplate', - className: 'nz-loading row' +'use strict'; +define( + [ + 'marionette' + ], function (Marionette) { + return Marionette.ItemView.extend({ + template : 'Shared/LoadingTemplate', + className: 'nz-loading row' + }); }); - - return NzbDrone.Shared.LoadingView; -}); diff --git a/UI/Shared/NotFoundView.js b/UI/Shared/NotFoundView.js index 05115205b..211f21151 100644 --- a/UI/Shared/NotFoundView.js +++ b/UI/Shared/NotFoundView.js @@ -1,8 +1,11 @@ -'use strict'; -define(['app'], function () { - NzbDrone.Shared.NotFoundView = Backbone.Marionette.ItemView.extend({ - template: 'Shared/notfoundtemplate' +'use strict'; +define( + [ + 'marionette' + ], function (Marionette) { + return Marionette.ItemView.extend({ + template: 'Shared/notfoundtemplate' + }); }); -}); diff --git a/UI/Shared/NotificationCollection.js b/UI/Shared/NotificationCollection.js deleted file mode 100644 index 744c07dae..000000000 --- a/UI/Shared/NotificationCollection.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; -define(['app', 'Shared/NotificationModel'], function () { - - var notificationCollection = Backbone.Collection.extend({ - model: NzbDrone.Shared.NotificationModel - }); - - return new notificationCollection(); -}); - - diff --git a/UI/Shared/NotificationModel.js b/UI/Shared/NotificationModel.js deleted file mode 100644 index 5a83fa793..000000000 --- a/UI/Shared/NotificationModel.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; -define(['app'], function () { - - NzbDrone.Shared.NotificationModel = Backbone.Model.extend({ - mutators: { - - preFormattedMessage: function () { - return this.get('message').replace(/\\r\\n/g, '<br>'); - }, - - isPreFormatted: function () { - return this.get('message').indexOf('\\r\\n') !== -1; - }, - - iconClass: function () { - - if (this.has('icon')) { - return 'icon'; - } - - if (this.get('level') === 'info') { - return 'icon-info-sign'; - } else if (this.get('level') === 'success') { - return 'icon-ok-sign'; - } else if (this.get('level') === 'error') { - return 'icon-warning-sign'; - } - - return ''; - } - }, - - defaults: { - 'level' : 'info', - 'title' : '', - 'message': '' - } - }); -}); diff --git a/UI/Shared/NotificationTemplate.html b/UI/Shared/NotificationTemplate.html deleted file mode 100644 index 73a61014d..000000000 --- a/UI/Shared/NotificationTemplate.html +++ /dev/null @@ -1,10 +0,0 @@ -<div class="alert alert-{{level}}"> - <button type="button" class="close x-close icon-remove-sign"></button> - <i class="{{iconClass}}"/><strong>{{title}}</strong> - {{#if isPreFormatted}} - <pre>{{{preFormattedMessage}}}</pre> - {{else}} - {{message}} - {{/if}} - -</div> \ No newline at end of file diff --git a/UI/Shared/NotificationView.js b/UI/Shared/NotificationView.js deleted file mode 100644 index e21b4f8e5..000000000 --- a/UI/Shared/NotificationView.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -define(['app', 'Shared/NotificationCollection'], function (app, notificationCollection) { - - var notificationItemView = Backbone.Marionette.ItemView.extend({ - template: 'Shared/NotificationTemplate', - - events: { - 'click .x-close': 'kill' - }, - - kill: function () { - - var self = this; - - $.Deferred(function () { - self.$el.slideUp('slow'); - }).done(function () { - self.model.destroy(); - }); - } - }); - - var collectionView = Backbone.Marionette.CollectionView.extend({ - - itemView: notificationItemView, - - initialize: function () { - this.collection = notificationCollection; - } - }); - - NzbDrone.addInitializer(function () { - console.log('initializing notification view'); - NzbDrone.notificationRegion.show(new collectionView()); - }); - -}); - - - - diff --git a/UI/Shared/SpinnerView.js b/UI/Shared/SpinnerView.js index 1807b321d..80269ff6f 100644 --- a/UI/Shared/SpinnerView.js +++ b/UI/Shared/SpinnerView.js @@ -1,15 +1,13 @@ -'use strict'; +'use strict'; define( [ - 'app' - ], function () { - NzbDrone.Shared.SpinnerView = Backbone.Marionette.ItemView.extend({ + 'marionette' + ], function (Marionette) { + return Marionette.ItemView.extend({ template : 'Shared/SpinnerTemplate', className: 'nz-spinner row' }); - - return NzbDrone.Shared.SpinnerView; }); diff --git a/UI/Shared/Styles/card.less b/UI/Shared/Styles/card.less index 59191ae6a..94883fe73 100644 --- a/UI/Shared/Styles/card.less +++ b/UI/Shared/Styles/card.less @@ -1,4 +1,4 @@ -.card { +.card() { margin :10px; background-color: #ffffff; padding: 10px; diff --git a/UI/Shared/Styles/clickable.less b/UI/Shared/Styles/clickable.less index 9cc2ce23e..9f76fcaec 100644 --- a/UI/Shared/Styles/clickable.less +++ b/UI/Shared/Styles/clickable.less @@ -1,3 +1,4 @@ -.clickable { +.clickable() { cursor: pointer; -} \ No newline at end of file +} + diff --git a/UI/Shared/TemplateHelpers.js b/UI/Shared/TemplateHelpers.js index d1adfa748..c32297e2f 100644 --- a/UI/Shared/TemplateHelpers.js +++ b/UI/Shared/TemplateHelpers.js @@ -2,10 +2,9 @@ define( [ - 'app', 'handlebars', 'Shared/FormatHelpers' - ], function (App, Handlebars) { + ], function (Handlebars, FormatHelpers) { Handlebars.registerHelper('partial', function (templateName) { //TODO: We should be able to pass in the context, either an object or a property @@ -26,7 +25,7 @@ define( }); Handlebars.registerHelper('fileSize', function (size) { - return new Handlebars.SafeString(NzbDrone.Shared.FormatHelpers.FileSizeHelper(size)); + return new Handlebars.SafeString(FormatHelpers.FileSizeHelper(size)); }); Handlebars.registerHelper('date', function (date) { @@ -36,7 +35,7 @@ define( } var shortDate = Date.create(date).short(); - var formattedDate = NzbDrone.Shared.FormatHelpers.DateHelper(date); + var formattedDate = FormatHelpers.DateHelper(date); var result = '<span title="' + shortDate + '">' + formattedDate + '</span>'; return new Handlebars.SafeString(result); diff --git a/UI/Shared/Toolbar/Button/ButtonCollectionView.js b/UI/Shared/Toolbar/Button/ButtonCollectionView.js index 14acd1629..b5d5d19d4 100644 --- a/UI/Shared/Toolbar/Button/ButtonCollectionView.js +++ b/UI/Shared/Toolbar/Button/ButtonCollectionView.js @@ -1,9 +1,13 @@ 'use strict'; -define(['app', 'Shared/Toolbar/Button/ButtonView', 'Config'], function (App, ButtonView, Config) { - return Backbone.Marionette.CollectionView.extend({ - className: 'btn-group', - itemView : ButtonView +define( + [ + 'marionette', + 'Shared/Toolbar/Button/ButtonView' + ], function (Marionette, ButtonView) { + return Marionette.CollectionView.extend({ + className: 'btn-group', + itemView : ButtonView + }); }); -}); diff --git a/UI/Shared/Toolbar/Button/ButtonView.js b/UI/Shared/Toolbar/Button/ButtonView.js index 373822b15..4f86e034d 100644 --- a/UI/Shared/Toolbar/Button/ButtonView.js +++ b/UI/Shared/Toolbar/Button/ButtonView.js @@ -1,102 +1,113 @@ 'use strict'; -define(['app', 'Config', 'Commands/CommandController', 'Shared/Messenger'], - function (App, - Config, - CommandController, - Messenger) { - - return Backbone.Marionette.ItemView.extend({ - template : 'Shared/Toolbar/ButtonTemplate', - className: 'btn', - - events: { - 'click': 'onClick' - }, - - ui: { - icon: '.x-icon' - }, - - initialize: function () { - this.storageKey = this.model.get('menuKey') + ':' + this.model.get('key'); - this.idle = true; - }, - - onRender: function () { - if (this.model.get('active')) { - this.$el.addClass('active'); - this.invokeCallback(); - } - }, - - onClick: function () { - if (this.idle) { - this.invokeCallback(); - this.invokeRoute(); - this.invokeCommand(); - } - }, - - invokeCommand: function () { - var command = this.model.get('command'); - if (command) { - this.idle = false; - this.$el.addClass('disabled'); - this.ui.icon.addClass('icon-spinner icon-spin'); - - var self = this; - var commandPromise = CommandController.Execute(command); - commandPromise.done(function () { - if (self.model.get('successMessage')) { - Messenger.show({ - message: self.model.get('successMessage') +define( + [ + 'app', + 'marionette', + 'Commands/CommandController', + 'Shared/Messenger' + ], function (App, Marionette, CommandController, Messenger) { + + return Marionette.ItemView.extend({ + template : 'Shared/Toolbar/ButtonTemplate', + className: 'btn', + + events: { + 'click': 'onClick' + }, + + ui: { + icon: '.x-icon' + }, + + + initialize: function () { + this.storageKey = this.model.get('menuKey') + ':' + this.model.get('key'); + this.idle = true; + }, + + onRender: function () { + if (this.model.get('active')) { + this.$el.addClass('active'); + this.invokeCallback(); + } + }, + + onClick: function () { + if (this.idle) { + this.invokeCallback(); + this.invokeRoute(); + this.invokeCommand(); + } + }, + + + invokeCommand: function () { + var command = this.model.get('command'); + if (command) { + this.idle = false; + this.$el.addClass('disabled'); + this.ui.icon.addClass('icon-spinner icon-spin'); + + var self = this; + var commandPromise = CommandController.Execute(command); + commandPromise.done(function () { + if (self.model.get('successMessage')) { + Messenger.show({ + message: self.model.get('successMessage') + }); + } + }); + + commandPromise.fail(function (options) { + if (options.readyState === 0 || options.status === 0) { + return; + } + if (self.model.get('errorMessage')) { + Messenger.show({ + message: self.model.get('errorMessage'), + type : 'error' + }); + } + }); + + commandPromise.always(function () { + if (!self.isClosed) { + self.$el.removeClass('disabled'); + self.ui.icon.removeClass('icon-spinner icon-spin'); + self.idle = true; + } + }); + } + }, + + invokeRoute: function () { + var route = this.model.get('route'); + if (route) { + + require( + [ + 'Router' + ], function () { + App.Router.navigate(route, {trigger: true}); }); - } - }); - - commandPromise.fail(function (options) { - if (options.readyState === 0 || options.status === 0) { - return; - } - if (self.model.get('errorMessage')) { - Messenger.show({ - message: self.model.get('errorMessage'), - type : 'error' - }); - } - }); - - commandPromise.always(function () { - if (!self.isClosed) { - self.$el.removeClass('disabled'); - self.ui.icon.removeClass('icon-spinner icon-spin'); - self.idle = true; - } - }); - } - }, + } + }, - invokeRoute: function () { - var route = this.model.get('route'); - if (route) { - NzbDrone.Router.navigate(route, {trigger: true}); - } - }, - - invokeCallback: function () { + invokeCallback: function () { - if (!this.model.ownerContext) { - throw 'ownerContext must be set.'; - } + if (!this.model.ownerContext) { + throw 'ownerContext must be set.'; + } - var callback = this.model.get('callback'); - if (callback) { - callback.call(this.model.ownerContext); + var callback = this.model.get('callback'); + if (callback) { + callback.call(this.model.ownerContext); + } } - } + + }); }); -}); diff --git a/UI/Shared/Toolbar/ButtonCollection.js b/UI/Shared/Toolbar/ButtonCollection.js index 8a9c4c86c..f01090110 100644 --- a/UI/Shared/Toolbar/ButtonCollection.js +++ b/UI/Shared/Toolbar/ButtonCollection.js @@ -1,7 +1,11 @@ 'use strict'; -define(['app', 'Shared/Toolbar/ButtonModel'], function () { - return Backbone.Collection.extend({ - model: NzbDrone.Shared.Toolbar.ButtonModel +define( + [ + 'backbone', + 'Shared/Toolbar/ButtonModel' + ], function (Backbone, ButtonModel) { + return Backbone.Collection.extend({ + model: ButtonModel + }); }); -}); diff --git a/UI/Shared/Toolbar/ButtonModel.js b/UI/Shared/Toolbar/ButtonModel.js index 2995dabeb..f6c7c8a64 100644 --- a/UI/Shared/Toolbar/ButtonModel.js +++ b/UI/Shared/Toolbar/ButtonModel.js @@ -1,17 +1,13 @@ 'use strict'; -define(['app'], function () { - - NzbDrone.Shared.Toolbar.ActionTypes = - { - RouteTrigger: 'RouteTrigger', - CallBack : 'CallBack' - }; - - return Backbone.Model.extend({ - defaults: { - 'target' : '/nzbdrone/route', - 'title' : '', - 'active' : false, - 'tooltip': undefined } +define( + [ + 'backbone' + ], function (Backbone) { + return Backbone.Model.extend({ + defaults: { + 'target' : '/nzbdrone/route', + 'title' : '', + 'active' : false, + 'tooltip': undefined } + }); }); -}); diff --git a/UI/Shared/Toolbar/Radio/RadioButtonCollectionView.js b/UI/Shared/Toolbar/Radio/RadioButtonCollectionView.js index f7a64a1fc..cded0aba1 100644 --- a/UI/Shared/Toolbar/Radio/RadioButtonCollectionView.js +++ b/UI/Shared/Toolbar/Radio/RadioButtonCollectionView.js @@ -1,13 +1,13 @@ 'use strict'; define( [ - 'app', + 'marionette', 'Shared/Toolbar/Radio/RadioButtonView', 'Config' - ], function (App, RadioButtonView, Config) { - return Backbone.Marionette.CollectionView.extend({ + ], function (Marionette, RadioButtonView, Config) { + return Marionette.CollectionView.extend({ className: 'btn-group', - itemView : NzbDrone.Shared.Toolbar.RadioButtonView, + itemView : RadioButtonView, attributes: { 'data-toggle': 'buttons-radio' diff --git a/UI/Shared/Toolbar/Radio/RadioButtonView.js b/UI/Shared/Toolbar/Radio/RadioButtonView.js index 67d367916..f6e0533c3 100644 --- a/UI/Shared/Toolbar/Radio/RadioButtonView.js +++ b/UI/Shared/Toolbar/Radio/RadioButtonView.js @@ -1,48 +1,52 @@ 'use strict'; -define(['app', 'Config'], function () { +define( + [ + 'marionette', + 'Config' + ], function (Marionette, Config) { - NzbDrone.Shared.Toolbar.RadioButtonView = Backbone.Marionette.ItemView.extend({ - template : 'Shared/Toolbar/ButtonTemplate', - className: 'btn', + return Marionette.ItemView.extend({ + template : 'Shared/Toolbar/ButtonTemplate', + className: 'btn', - events: { - 'click': 'onClick' - }, + events: { + 'click': 'onClick' + }, - initialize: function () { + initialize: function () { - this.storageKey = this.model.get('menuKey') + ':' + this.model.get('key'); - }, + this.storageKey = this.model.get('menuKey') + ':' + this.model.get('key'); + }, - onRender: function () { - if (this.model.get('active')) { - this.$el.addClass('active'); - this.invokeCallback(); - } - }, + onRender: function () { + if (this.model.get('active')) { + this.$el.addClass('active'); + this.invokeCallback(); + } + }, - onClick: function () { + onClick: function () { - NzbDrone.Config.SetValue(this.model.get('menuKey'), this.model.get('key')); - this.invokeCallback(); - }, + Config.SetValue(this.model.get('menuKey'), this.model.get('key')); + this.invokeCallback(); + }, - invokeCallback: function () { + invokeCallback: function () { - if (!this.model.ownerContext) { - throw 'ownerContext must be set.'; - } + if (!this.model.ownerContext) { + throw 'ownerContext must be set.'; + } - var callback = this.model.get('callback'); - if (callback) { - callback.call(this.model.ownerContext); + var callback = this.model.get('callback'); + if (callback) { + callback.call(this.model.ownerContext); + } } - } + }); }); -}); diff --git a/UI/Shared/Toolbar/ToolbarLayout.js b/UI/Shared/Toolbar/ToolbarLayout.js index 1c558dccf..701fdf07d 100644 --- a/UI/Shared/Toolbar/ToolbarLayout.js +++ b/UI/Shared/Toolbar/ToolbarLayout.js @@ -1,18 +1,13 @@ 'use strict'; define( [ - 'app', - 'Shared/Toolbar/Radio/RadioButtonCollectionView', - 'Shared/Toolbar/Button/ButtonCollectionView', + 'marionette', 'Shared/Toolbar/ButtonCollection', - 'Shared/Toolbar/ButtonModel' - ], - function (App, - RadioButtonCollectionView, - ButtonCollectionView, - ButtonCollection, - ButtonModel) { - NzbDrone.Shared.Toolbar.ToolbarLayout = Backbone.Marionette.Layout.extend({ + 'Shared/Toolbar/ButtonModel', + 'Shared/Toolbar/Radio/RadioButtonCollectionView', + 'Shared/Toolbar/Button/ButtonCollectionView' + ], function (Marionette, ButtonCollection, ButtonModel, RadioButtonCollectionView, ButtonCollectionView) { + return Marionette.Layout.extend({ template: 'Shared/Toolbar/ToolbarLayoutTemplate', regions: { @@ -38,6 +33,7 @@ define( }, + onShow: function () { if (this.left) { _.each(this.left, this._showToolbarLeft, this); @@ -79,17 +75,17 @@ define( case 'radio': { buttonGroupView = new RadioButtonCollectionView({ - collection: groupCollection, - menu : buttonGroup - }); + collection: groupCollection, + menu : buttonGroup + }); break; } default : { buttonGroupView = new ButtonCollectionView({ - collection: groupCollection, - menu : buttonGroup - }); + collection: groupCollection, + menu : buttonGroup + }); break; } } @@ -97,9 +93,6 @@ define( this[position + '_' + (index + 1).toString()].show(buttonGroupView); } }); - - return NzbDrone.Shared.Toolbar.ToolbarLayout; - }); diff --git a/UI/app.js b/UI/app.js index 934c17a5a..c20f10551 100644 --- a/UI/app.js +++ b/UI/app.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict'; require.config({ urlArgs: 'v=' + window.ServerStatus.version, @@ -130,19 +130,29 @@ require.config({ exports: 'Backgrid', init: function () { - Backgrid.Column.prototype.defaults = { - name : undefined, - label : undefined, - sortable : true, - editable : false, - renderable: true, - formatter : undefined, - cell : undefined, - headerCell: 'nzbDrone' - }; + require( + [ + 'Shared/Grid/HeaderCell' + ], function () { + + Backgrid.Column.prototype.defaults = { + name : undefined, + label : undefined, + sortable : true, + editable : false, + renderable: true, + formatter : undefined, + cell : undefined, + headerCell: 'NzbDrone' + }; + + }); } }, 'backgrid.paginator': { + + exports: 'Backgrid.Extension.Paginator', + deps: [ 'backgrid' @@ -165,76 +175,29 @@ define( ]); - window.NzbDrone = new Marionette.Application(); - window.NzbDrone.Config = {}; - window.NzbDrone.Form = {}; - - window.NzbDrone.Series = { - Index : { - Table : {}, - List : {}, - Posters: {} - - }, - Edit : {}, - Delete : {}, - Details: {} - }; - - window.NzbDrone.Episode = { - Search : {}, - Summary : {}, - Activity: {} - }; - - window.NzbDrone.Quality = {}; - - window.NzbDrone.Commands = {}; + var app = new Marionette.Application(); - window.NzbDrone.Shared = { - Toolbar : {}, - Messenger : {}, - FormatHelpers: {}, - Grid : {} - }; - - window.NzbDrone.Cells = {}; - - window.NzbDrone.Calendar = {}; - - window.NzbDrone.Missing = {}; - window.NzbDrone.History = {}; - window.NzbDrone.Logs = {}; - window.NzbDrone.Release = {}; - - window.NzbDrone.Events = { + app.Events = { SeriesAdded: 'seriesAdded' }; - window.NzbDrone.Commands = { + app.Commands = { SaveSettings: 'saveSettings' }; - window.NzbDrone.Constants = { - ApiRoot: '/api' - }; - window.NzbDrone.addInitializer(function () { + app.addInitializer(function () { console.log('starting application'); }); - NzbDrone.addRegions({ + app.addRegions({ mainRegion : '#main-region', notificationRegion: '#notification-region', modalRegion : ModalRegion, footerRegion : '#footer-region' }); - window.NzbDrone.start(); - - - //NzbDrone.footerRegion.show(new FooterView()); - + app.start(); window.require( [ @@ -242,7 +205,7 @@ define( 'jQuery/TooltipBinder' ]); - return NzbDrone; + return app; }); diff --git a/UI/jQuery/RouteBinder.js b/UI/jQuery/RouteBinder.js index 3905ae2ce..bff72622d 100644 --- a/UI/jQuery/RouteBinder.js +++ b/UI/jQuery/RouteBinder.js @@ -1,6 +1,6 @@ 'use strict'; define(function () { - //This module will automatically route all links through backbone router rather than + //This module will automatically route all relative links through backbone router rather than //causing links to reload pages. var routeBinder = { @@ -37,7 +37,7 @@ define(function () { } if (!href) { - throw 'couldnt find route target'; + throw 'couldn\'t find route target'; }