From 0ecbb3034584bd1a54c5d69c8094f913d0d2d8b7 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 9 Nov 2012 08:28:59 -0800 Subject: [PATCH] Bootstrap loading profiles via ajax --- NzbDrone.Api/Bootstrapper.cs | 7 +++ NzbDrone.Api/NzbDrone.Api.csproj | 1 + .../QualityProfiles/QualityProfileModel.cs | 4 +- .../Resolvers/QualityTypesToIntResolver.cs | 17 ++++++ .../Providers/SceneMappingProvider.cs | 2 + .../jQueryUI/jquery-ui-1.8.16.custom.css | 2 +- .../FakesAssemblies/Ninject.Web.Mvc.Fakes.dll | Bin 89088 -> 89088 bytes NzbDrone.Web/NzbDrone.Web.csproj | 7 ++- NzbDrone.Web/Scripts/backbone/app.js | 27 ---------- .../backbone/apps/qualityProfileApp.js | 19 +++++++ NzbDrone.Web/Scripts/backbone/constants.js | 11 ++-- .../backbone/models/profileCollection.js | 18 ------- .../{profileModel.js => qualityProfile.js} | 2 +- .../models/qualityProfileCollection.js | 4 ++ NzbDrone.Web/Scripts/backbone/router.js | 16 ------ .../Scripts/backbone/views/qualityProfiles.js | 50 +++++++----------- NzbDrone.Web/Views/Settings/Indexers.cshtml | 3 +- NzbDrone.Web/Views/Settings/Quality.cshtml | 24 +++++---- 18 files changed, 92 insertions(+), 122 deletions(-) create mode 100644 NzbDrone.Api/Resolvers/QualityTypesToIntResolver.cs delete mode 100644 NzbDrone.Web/Scripts/backbone/app.js create mode 100644 NzbDrone.Web/Scripts/backbone/apps/qualityProfileApp.js delete mode 100644 NzbDrone.Web/Scripts/backbone/models/profileCollection.js rename NzbDrone.Web/Scripts/backbone/models/{profileModel.js => qualityProfile.js} (96%) create mode 100644 NzbDrone.Web/Scripts/backbone/models/qualityProfileCollection.js delete mode 100644 NzbDrone.Web/Scripts/backbone/router.js diff --git a/NzbDrone.Api/Bootstrapper.cs b/NzbDrone.Api/Bootstrapper.cs index 06d6eb9de..f8db1f13a 100644 --- a/NzbDrone.Api/Bootstrapper.cs +++ b/NzbDrone.Api/Bootstrapper.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using AutoMapper; using NzbDrone.Api.QualityProfiles; +using NzbDrone.Api.Resolvers; using NzbDrone.Core.Repository.Quality; namespace NzbDrone.Api @@ -12,6 +13,12 @@ namespace NzbDrone.Api { public static void Initialize() { + //Mapper.CreateMap() + // .ForMember(dest => dest, opt => opt.ResolveUsing()); + + Mapper.CreateMap() + .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src)); + Mapper.CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.QualityProfileId)); diff --git a/NzbDrone.Api/NzbDrone.Api.csproj b/NzbDrone.Api/NzbDrone.Api.csproj index 3e1579fb4..0f159eca9 100644 --- a/NzbDrone.Api/NzbDrone.Api.csproj +++ b/NzbDrone.Api/NzbDrone.Api.csproj @@ -103,6 +103,7 @@ + diff --git a/NzbDrone.Api/QualityProfiles/QualityProfileModel.cs b/NzbDrone.Api/QualityProfiles/QualityProfileModel.cs index 7f2f75f81..5a9048f3e 100644 --- a/NzbDrone.Api/QualityProfiles/QualityProfileModel.cs +++ b/NzbDrone.Api/QualityProfiles/QualityProfileModel.cs @@ -10,7 +10,7 @@ namespace NzbDrone.Api.QualityProfiles { public Int32 Id { get; set; } public String Name { get; set; } - public QualityTypes Cutoff { get; set; } - public List Allowed { get; set; } + public Int32 Cutoff { get; set; } + public List Allowed { get; set; } } } diff --git a/NzbDrone.Api/Resolvers/QualityTypesToIntResolver.cs b/NzbDrone.Api/Resolvers/QualityTypesToIntResolver.cs new file mode 100644 index 000000000..66c339f0b --- /dev/null +++ b/NzbDrone.Api/Resolvers/QualityTypesToIntResolver.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using AutoMapper; +using NzbDrone.Core.Repository.Quality; + +namespace NzbDrone.Api.Resolvers +{ + public class QualityTypesToIntResolver : ValueResolver + { + protected override int ResolveCore(QualityTypes source) + { + return source.Id; + } + } +} diff --git a/NzbDrone.Core/Providers/SceneMappingProvider.cs b/NzbDrone.Core/Providers/SceneMappingProvider.cs index ad70a6d65..f5961c59b 100644 --- a/NzbDrone.Core/Providers/SceneMappingProvider.cs +++ b/NzbDrone.Core/Providers/SceneMappingProvider.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using NLog; using Newtonsoft.Json; +using Ninject; using NzbDrone.Common; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; @@ -17,6 +18,7 @@ namespace NzbDrone.Core.Providers private readonly HttpProvider _httpProvider; private readonly ConfigProvider _configProvider; + [Inject] public SceneMappingProvider(IDatabase database, HttpProvider httpProvider, ConfigProvider configProvider) { _database = database; diff --git a/NzbDrone.Web/Content/jQueryUI/jquery-ui-1.8.16.custom.css b/NzbDrone.Web/Content/jQueryUI/jquery-ui-1.8.16.custom.css index a50b1b905..1a6469163 100644 --- a/NzbDrone.Web/Content/jQueryUI/jquery-ui-1.8.16.custom.css +++ b/NzbDrone.Web/Content/jQueryUI/jquery-ui-1.8.16.custom.css @@ -330,7 +330,7 @@ .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } .ui-accordion .ui-accordion-li-fix { display: inline; } .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } -.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; } .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } diff --git a/NzbDrone.Web/FakesAssemblies/Ninject.Web.Mvc.Fakes.dll b/NzbDrone.Web/FakesAssemblies/Ninject.Web.Mvc.Fakes.dll index 25c59f9c0344944b7304a25255476dbb6878ffdc..4ab4a50946ffbf340ad9d8c38fbbd7ea76d3643c 100644 GIT binary patch delta 235 zcmV7ZzH|jN_W{atUS|6zg?jfS3-^HR z7&}*);LF07ls8R6d==1y&M$x5%4||xpnP5(eN+#v@MFslQW8oG{dL5v1%bp%tF|@H z>j9jD&;qy60s%M^5Fwe4jX-F~K&M>23ii_kn70@f0Z2V8ezuuV000000ssI29033T lcyR#$cvArYQd2}zW-&q?b?SIQh`e)xtbpxgfOsWz40=&On2Jm~B_xxF zI|t9_#)jrVO>>$eq3x7!VjV`~S#tj9#_3iU%=PCfe^w@fe~6B%cX_Qn#68n+V@kaZ zZvhB{&;qy60s%M^5ZHW?b1;0^Pp*vzcI+VIZnqc~0Z2V8$pn;8000000ssI29033T lcyR#$cvArYQd2}z;$O$iM?fn - + - - - + + diff --git a/NzbDrone.Web/Scripts/backbone/app.js b/NzbDrone.Web/Scripts/backbone/app.js deleted file mode 100644 index 57d591ad9..000000000 --- a/NzbDrone.Web/Scripts/backbone/app.js +++ /dev/null @@ -1,27 +0,0 @@ -NzbDrone = {}; - -NzbDrone.Views = {}; -NzbDrone.Models = {}; -NzbDrone.Collections = {}; - -NzbDrone.App = new Backbone.Marionette.Application(); - -// Setup default application views -NzbDrone.App.addInitializer(function () { - - NzbDrone.App.addRegions({ - main: '#main-region' - }); - - var layout = new NzbDrone.Views.AppLayout(); - - NzbDrone.App.Layout = layout; - NzbDrone.App.main.show(layout); - - layout.header.show(new NzbDrone.Views.HeaderView()); -}); - -NzbDrone.App.addInitializer(function () { - new NzbDrone.AppRouter(); - Backbone.history.start(); -}); \ No newline at end of file diff --git a/NzbDrone.Web/Scripts/backbone/apps/qualityProfileApp.js b/NzbDrone.Web/Scripts/backbone/apps/qualityProfileApp.js new file mode 100644 index 000000000..f3644b697 --- /dev/null +++ b/NzbDrone.Web/Scripts/backbone/apps/qualityProfileApp.js @@ -0,0 +1,19 @@ +QualityProfileApp = {}; + +QualityProfileApp.Views = {}; +QualityProfileApp.Models = {}; +QualityProfileApp.Collections = {}; + +QualityProfileApp.App = new Backbone.Marionette.Application(); + +// Setup default application views +QualityProfileApp.App.addInitializer(function () { + + QualityProfileApp.App.addRegions({ + mainRegion: '#profiles' + }); + + var qualityProfiles = new QualityProfileCollectionView(); + + QualityProfileApp.App.mainRegion.show(qualityProfiles); +}); \ No newline at end of file diff --git a/NzbDrone.Web/Scripts/backbone/constants.js b/NzbDrone.Web/Scripts/backbone/constants.js index 2cd83ab8f..1f38c99c6 100644 --- a/NzbDrone.Web/Scripts/backbone/constants.js +++ b/NzbDrone.Web/Scripts/backbone/constants.js @@ -1,11 +1,6 @@ -NzbDrone.Constants = { +QualityProfileApp.Constants = { Templates: { - AppLayout: '#AppLayout', - QualityProfilesView: '#QualityProfilesView', - QualityProfileView: '#QualityProfileView' + QualityProfileCollection: '#QualityProfileCollectionTemplate', + QualityProfile: '#QualityProfileTemplate' }, - - Events: { - MenuItemSelected: 'MenuItemSelected' - } }; \ No newline at end of file diff --git a/NzbDrone.Web/Scripts/backbone/models/profileCollection.js b/NzbDrone.Web/Scripts/backbone/models/profileCollection.js deleted file mode 100644 index 1431ef75a..000000000 --- a/NzbDrone.Web/Scripts/backbone/models/profileCollection.js +++ /dev/null @@ -1,18 +0,0 @@ -window.ProfileCollection = Backbone.Collection.extend({ - - model: Profile, - - url: '/api/qualityprofiles', - - search: function (searchTerm, options) { - - var self = this; - this.fetch({ - success: function () { - if (options.success) { - options.success(); - } - } - }); - } -}); \ No newline at end of file diff --git a/NzbDrone.Web/Scripts/backbone/models/profileModel.js b/NzbDrone.Web/Scripts/backbone/models/qualityProfile.js similarity index 96% rename from NzbDrone.Web/Scripts/backbone/models/profileModel.js rename to NzbDrone.Web/Scripts/backbone/models/qualityProfile.js index c44604724..742410d24 100644 --- a/NzbDrone.Web/Scripts/backbone/models/profileModel.js +++ b/NzbDrone.Web/Scripts/backbone/models/qualityProfile.js @@ -1,4 +1,4 @@ -window.Profile = Backbone.Model.extend({ +window.QualityProfile = Backbone.Model.extend({ urlRoot: '/api/qualityprofiles', diff --git a/NzbDrone.Web/Scripts/backbone/models/qualityProfileCollection.js b/NzbDrone.Web/Scripts/backbone/models/qualityProfileCollection.js new file mode 100644 index 000000000..38f341811 --- /dev/null +++ b/NzbDrone.Web/Scripts/backbone/models/qualityProfileCollection.js @@ -0,0 +1,4 @@ +window.QualityProfileCollection = Backbone.Collection.extend({ + model: QualityProfile, + url: '/api/qualityprofiles' +}); \ No newline at end of file diff --git a/NzbDrone.Web/Scripts/backbone/router.js b/NzbDrone.Web/Scripts/backbone/router.js deleted file mode 100644 index 67210b8e5..000000000 --- a/NzbDrone.Web/Scripts/backbone/router.js +++ /dev/null @@ -1,16 +0,0 @@ -(function (nzbDrone, backbone) { - nzbDrone.AppRouter = backbone.Marionette.AppRouter.extend({ - - controller: new nzbDrone.AppController(), - - appRoutes: { - '': 'home', - 'wines': 'list', - 'wines/page/:page': 'list', - 'wines/add': 'addWine', - 'wines/:id': 'wineDetails', - 'about': 'about', - 'search/:searchTerm': 'handleSearch' - } - }); -})(window.NzbDrone, window.Backbone);s \ No newline at end of file diff --git a/NzbDrone.Web/Scripts/backbone/views/qualityProfiles.js b/NzbDrone.Web/Scripts/backbone/views/qualityProfiles.js index 4b58b1cc0..a71e81e28 100644 --- a/NzbDrone.Web/Scripts/backbone/views/qualityProfiles.js +++ b/NzbDrone.Web/Scripts/backbone/views/qualityProfiles.js @@ -1,37 +1,23 @@ -window.QualityProfilesView = Backbone.View.extend({ - - initialize: function () { - this.render(); - }, - - render: function () { - var profiles = this.model.models; - var len = profiles.length; - var startPos = (this.options.page - 1) * 8; - var endPos = Math.min(startPos + 8, len); - - $(this.el).html('
    '); - - for (var i = startPos; i < endPos; i++) { - $('.thumbnails', this.el).append(new QualityProfileView({ model: profiles[i] }).render().el); - } - - return this; - } +QualityProfileView = Backbone.Marionette.ItemView.extend({ + tagName: "div", + className: "quality-profile", + template: "#QualityProfileTemplate" }); -window.QualityProfileView = Backbone.View.extend({ - - tagName: "li", - +QualityProfileCollectionView = Backbone.Marionette.CompositeView.extend({ + tagName: "div", + id: "quality-profile-collection", + itemView: QualityProfileView, + template: QualityProfileApp.Constants.Templates.QualityProfileCollection, + + //appendHtml: function (collectionView, itemView) { + // collectionView.$('#collection').append(itemView.el); + //}, + initialize: function () { - this.model.bind("change", this.render, this); - this.model.bind("destroy", this.close, this); - }, - - render: function () { - $(this.el).html(this.template(this.model.toJSON())); - return this; + _.bindAll(this, 'render'); + this.collection = new QualityProfileCollection(); + this.collection.fetch(); + this.collection.bind('reset', this.render); } - }); \ No newline at end of file diff --git a/NzbDrone.Web/Views/Settings/Indexers.cshtml b/NzbDrone.Web/Views/Settings/Indexers.cshtml index f4390fc12..a15218602 100644 --- a/NzbDrone.Web/Views/Settings/Indexers.cshtml +++ b/NzbDrone.Web/Views/Settings/Indexers.cshtml @@ -106,8 +106,7 @@

    - Add Newznab Provider + Add Newznab Provider Add Newznab Provider
    @foreach (var provider in Model.NewznabDefinitions) diff --git a/NzbDrone.Web/Views/Settings/Quality.cshtml b/NzbDrone.Web/Views/Settings/Quality.cshtml index ea08c6abb..485c710eb 100644 --- a/NzbDrone.Web/Views/Settings/Quality.cshtml +++ b/NzbDrone.Web/Views/Settings/Quality.cshtml @@ -27,10 +27,6 @@
    - @*@foreach (var item in (List)ViewData["Profiles"]) - { - Html.RenderAction("GetQualityProfileView", item); - }*@

    @@ -116,19 +112,25 @@ }); - @Html.IncludeScript("backbone/app.js") - @Html.IncludeScript("backbone/controller.js") - @Html.IncludeScript("backbone/router.js") + @Html.IncludeScript("backbone/apps/qualityProfileApp.js") @Html.IncludeScript("backbone/constants.js") - @Html.IncludeScript("backbone/utils.js") - @Html.IncludeScript("backbone/models/profileCollection.js") - @Html.IncludeScript("backbone/models/profileModel.js") + @Html.IncludeScript("backbone/models/qualityProfile.js") + @Html.IncludeScript("backbone/models/qualityProfileCollection.js") @Html.IncludeScript("backbone/views/qualityProfiles.js") @*@Html.IncludeScript("backbone/bootstrapper.js")*@ - + + + + } \ No newline at end of file