Bootstrap loading profiles via ajax

This commit is contained in:
Mark McDowall 2012-11-09 08:28:59 -08:00
parent 44c7a58595
commit 0ecbb30345
18 changed files with 92 additions and 122 deletions

View File

@ -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<QualityTypes, Int32>()
// .ForMember(dest => dest, opt => opt.ResolveUsing<QualityTypesToIntResolver>());
Mapper.CreateMap<Int32, QualityTypes>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src));
Mapper.CreateMap<QualityProfile, QualityProfileModel>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.QualityProfileId));

View File

@ -103,6 +103,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="QualityProfiles\QualityProfileModel.cs" />
<Compile Include="QualityProfiles\QualityProfileService.cs" />
<Compile Include="Resolvers\QualityTypesToIntResolver.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />

View File

@ -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<QualityTypes> Allowed { get; set; }
public Int32 Cutoff { get; set; }
public List<Int32> Allowed { get; set; }
}
}

View File

@ -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<QualityTypes, Int32>
{
protected override int ResolveCore(QualityTypes source)
{
return source.Id;
}
}
}

View File

@ -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;

View File

@ -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; }

View File

@ -388,13 +388,12 @@
<Content Include="Scripts\backbone.js" />
<Content Include="Scripts\backbone.marionette.min.js" />
<Content Include="Scripts\backbone.min.js" />
<Content Include="Scripts\backbone\app.js" />
<Content Include="Scripts\backbone\apps\qualityProfileApp.js" />
<Content Include="Scripts\backbone\bootstrapper.js" />
<Content Include="Scripts\backbone\constants.js" />
<Content Include="Scripts\backbone\controller.js" />
<Content Include="Scripts\backbone\models\profileCollection.js" />
<Content Include="Scripts\backbone\models\profileModel.js" />
<Content Include="Scripts\backbone\router.js" />
<Content Include="Scripts\backbone\models\qualityProfileCollection.js" />
<Content Include="Scripts\backbone\models\qualityProfile.js" />
<Content Include="Scripts\backbone\utils.js" />
<Content Include="Scripts\backbone\views\qualityProfiles.js" />
<Content Include="Scripts\conditional-validation.js" />

View File

@ -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();
});

View File

@ -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);
});

View File

@ -1,11 +1,6 @@
NzbDrone.Constants = {
QualityProfileApp.Constants = {
Templates: {
AppLayout: '#AppLayout',
QualityProfilesView: '#QualityProfilesView',
QualityProfileView: '#QualityProfileView'
QualityProfileCollection: '#QualityProfileCollectionTemplate',
QualityProfile: '#QualityProfileTemplate'
},
Events: {
MenuItemSelected: 'MenuItemSelected'
}
};

View File

@ -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();
}
}
});
}
});

View File

@ -1,4 +1,4 @@
window.Profile = Backbone.Model.extend({
window.QualityProfile = Backbone.Model.extend({
urlRoot: '/api/qualityprofiles',

View File

@ -0,0 +1,4 @@
window.QualityProfileCollection = Backbone.Collection.extend({
model: QualityProfile,
url: '/api/qualityprofiles'
});

View File

@ -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

View File

@ -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('<ul class="thumbnails"></ul>');
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);
}
});

View File

@ -106,8 +106,7 @@
<p>
</p>
<a id="addNewznab" href="@Url.Action("AddNewznabProvider", "Settings")">
<img src="../../Content/Images/Plus.png" alt="Add Newznab Provider" width="20px"
height="20px" />
<img src="../../Content/Images/Plus.png" alt="Add Newznab Provider" width="20px" height="20px" />
Add Newznab Provider</a>
<div id="newznabProviders">
@foreach (var provider in Model.NewznabDefinitions)

View File

@ -27,10 +27,6 @@
</a>
</div>
<div id="profiles">
@*@foreach (var item in (List<QualityProfile>)ViewData["Profiles"])
{
Html.RenderAction("GetQualityProfileView", item);
}*@
</div>
</div>
<h3>
@ -116,19 +112,25 @@
});
</script>
@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")*@
<script id="QualityProfileView" type="text/template">
<script id="QualityProfileTemplate" type="text/template">
<%= Name %>
<%= Cutoff %>
<%= Allowed %>
</script>
<script id="QualityProfileCollectionTemplate" type="text/template">
</script>
<script>
$(document).ready(function () {
QualityProfileApp.App.start();
});
</script>
}