diff --git a/NzbDrone.Api/Qualities/QualityProfileModule.cs b/NzbDrone.Api/Qualities/QualityProfileModule.cs index b21a8fb85..fd8c6dbd0 100644 --- a/NzbDrone.Api/Qualities/QualityProfileModule.cs +++ b/NzbDrone.Api/Qualities/QualityProfileModule.cs @@ -1,20 +1,11 @@ using System.Collections.Generic; -using NzbDrone.Core.Datastore; using NzbDrone.Core.Qualities; using NzbDrone.Api.Mapping; using System.Linq; +using FluentValidation; namespace NzbDrone.Api.Qualities { - - public static class LazyLoadedExtensions - { - public static IEnumerable GetForeignKeys(this IEnumerable models) - { - return models.Select(c => c.Id).Distinct(); - } - } - public class QualityProfileModule : NzbDroneRestModule { private readonly QualityProfileService _qualityProfileService; @@ -24,6 +15,10 @@ namespace NzbDrone.Api.Qualities { _qualityProfileService = qualityProfileService; + SharedValidator.RuleFor(c => c.Name).NotEmpty(); + SharedValidator.RuleFor(c => c.Cutoff).NotNull(); + SharedValidator.RuleFor(c => c.Allowed).NotEmpty(); + GetResourceAll = GetAll; GetResourceById = GetById; diff --git a/UI/Settings/Quality/Profile/EditQualityProfileTemplate.html b/UI/Settings/Quality/Profile/EditQualityProfileTemplate.html index c66bf2abb..021a494d7 100644 --- a/UI/Settings/Quality/Profile/EditQualityProfileTemplate.html +++ b/UI/Settings/Quality/Profile/EditQualityProfileTemplate.html @@ -20,9 +20,9 @@
- {{#each allowed}} - + {{/each}} @@ -41,12 +41,16 @@
-

Allowed

- +
+
+

Allowed

+ +
+
diff --git a/UI/Settings/Quality/Profile/EditQualityProfileView.js b/UI/Settings/Quality/Profile/EditQualityProfileView.js index 9cfa23926..52c275144 100644 --- a/UI/Settings/Quality/Profile/EditQualityProfileView.js +++ b/UI/Settings/Quality/Profile/EditQualityProfileView.js @@ -1,74 +1,81 @@ 'use strict'; -define(['app', 'marionette', 'Mixins/AsModelBoundView'], function (App, Marionette, AsModelBoundView) { - - var view = Marionette.ItemView.extend({ - template: 'Settings/Quality/Profile/EditQualityProfileTemplate', - - ui: { - cutoff: '.x-cutoff' - }, - - events: { - 'click .x-save' : '_saveQualityProfile', - 'dblclick .x-available-list': '_moveQuality', - 'dblclick .x-allowed-list' : '_moveQuality' - }, - - initialize: function (options) { - this.profileCollection = options.profileCollection; - }, - - _moveQuality: function (event) { - - var quality; - var qualityId = event.target.value; - var availableCollection = new Backbone.Collection(this.model.get('available')); - availableCollection.comparator = function (model) { - return model.get('weight'); - }; - - var allowedCollection = new Backbone.Collection(this.model.get('allowed')); - allowedCollection.comparator = function (model) { - return model.get('weight'); - }; - - if (availableCollection.get(qualityId)) { - quality = availableCollection.get(qualityId); - availableCollection.remove(quality); - allowedCollection.add(quality); +define( + [ + 'app', + 'marionette', + 'Mixins/AsModelBoundView', + 'Mixins/AsValidatedView' + ], function (App, Marionette, AsModelBoundView, AsValidatedView) { + + var view = Marionette.ItemView.extend({ + template: 'Settings/Quality/Profile/EditQualityProfileTemplate', + + ui: { + cutoff: '.x-cutoff' + }, + + events: { + 'click .x-save' : '_saveQualityProfile', + 'dblclick .x-available-list': '_moveQuality', + 'dblclick .x-allowed-list' : '_moveQuality' + }, + + initialize: function (options) { + this.profileCollection = options.profileCollection; + }, + + _moveQuality: function (event) { + + var quality; + var qualityId = event.target.value; + var availableCollection = new Backbone.Collection(this.model.get('available')); + availableCollection.comparator = function (model) { + return model.get('weight'); + }; + + var allowedCollection = new Backbone.Collection(this.model.get('allowed')); + allowedCollection.comparator = function (model) { + return model.get('weight'); + }; + + if (availableCollection.get(qualityId)) { + quality = availableCollection.get(qualityId); + availableCollection.remove(quality); + allowedCollection.add(quality); + } + else if (allowedCollection.get(qualityId)) { + quality = allowedCollection.get(qualityId); + + allowedCollection.remove(quality); + availableCollection.add(quality); + } + else { + throw 'couldnt find quality id ' + qualityId; + } + + this.model.set('available', availableCollection.toJSON()); + this.model.set('allowed', allowedCollection.toJSON()); + + this.render(); + }, + + _saveQualityProfile: function () { + var self = this; + var cutoff = _.findWhere(this.model.get('allowed'), { id: parseInt(this.ui.cutoff.val())}); + this.model.set('cutoff', cutoff); + + var promise = this.model.save(); + + if (promise) { + promise.done(function () { + self.profileCollection.add(self.model, { merge: true }); + App.vent.trigger(App.Commands.CloseModalCommand); + }); + } } - else if (allowedCollection.get(qualityId)) { - quality = allowedCollection.get(qualityId); + }); - allowedCollection.remove(quality); - availableCollection.add(quality); - } - else { - throw 'couldnt find quality id ' + qualityId; - } - - this.model.set('available', availableCollection.toJSON()); - this.model.set('allowed', allowedCollection.toJSON()); - - this.render(); - }, - - _saveQualityProfile: function () { - var self = this; - var cutoff = _.findWhere(this.model.get('allowed'), { id: parseInt(this.ui.cutoff.val())}); - this.model.set('cutoff', cutoff); + AsValidatedView.call(view); + return AsModelBoundView.call(view); - var promise = this.model.save(); - - if (promise) { - promise.done(function () { - self.profileCollection.add(self.model, { merge: true }); - App.vent.trigger(App.Commands.CloseModalCommand); - }); - } - } }); - - return AsModelBoundView.call(view); - -});