UI looking better for quality profile editing
This commit is contained in:
parent
3e97106aa7
commit
75decad601
|
@ -1,7 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using Marr.Data.Converters;
|
using Marr.Data.Converters;
|
||||||
using Marr.Data.Mapping;
|
using Marr.Data.Mapping;
|
||||||
using NzbDrone.Common.Serializer;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Serialization;
|
using Newtonsoft.Json.Serialization;
|
||||||
using Newtonsoft.Json.Converters;
|
using Newtonsoft.Json.Converters;
|
||||||
|
@ -25,9 +24,12 @@ namespace NzbDrone.Core.Datastore.Converters
|
||||||
|
|
||||||
SerializerSetting.Converters.Add(new StringEnumConverter { CamelCaseText = true });
|
SerializerSetting.Converters.Add(new StringEnumConverter { CamelCaseText = true });
|
||||||
SerializerSetting.Converters.Add(new VersionConverter());
|
SerializerSetting.Converters.Add(new VersionConverter());
|
||||||
|
|
||||||
foreach (var converter in converters)
|
foreach (var converter in converters)
|
||||||
|
{
|
||||||
SerializerSetting.Converters.Add(converter);
|
SerializerSetting.Converters.Add(converter);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public virtual object FromDB(ConverterContext context)
|
public virtual object FromDB(ConverterContext context)
|
||||||
{
|
{
|
||||||
|
|
|
@ -48,7 +48,6 @@ namespace NzbDrone.Core.Datastore.Converters
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region JsonConverter
|
|
||||||
public override bool CanConvert(Type objectType)
|
public override bool CanConvert(Type objectType)
|
||||||
{
|
{
|
||||||
return objectType == typeof(Quality);
|
return objectType == typeof(Quality);
|
||||||
|
@ -64,6 +63,5 @@ namespace NzbDrone.Core.Datastore.Converters
|
||||||
{
|
{
|
||||||
writer.WriteValue(ToDB(value));
|
writer.WriteValue(ToDB(value));
|
||||||
}
|
}
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,7 +2,6 @@
|
||||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System;
|
|
||||||
using NzbDrone.Common.Serializer;
|
using NzbDrone.Common.Serializer;
|
||||||
using NzbDrone.Core.Qualities;
|
using NzbDrone.Core.Qualities;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
|
@ -2,10 +2,7 @@
|
||||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System;
|
|
||||||
using NzbDrone.Common.Serializer;
|
|
||||||
using NzbDrone.Core.Qualities;
|
using NzbDrone.Core.Qualities;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Datastore.Migration
|
namespace NzbDrone.Core.Datastore.Migration
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,7 +45,6 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
||||||
|
|
||||||
var newIndexes = originalIndexes.Union(indexes);
|
var newIndexes = originalIndexes.Union(indexes);
|
||||||
|
|
||||||
|
|
||||||
CreateTable(tableName, columns, newIndexes);
|
CreateTable(tableName, columns, newIndexes);
|
||||||
|
|
||||||
transaction.Commit();
|
transaction.Commit();
|
||||||
|
@ -57,7 +56,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
||||||
using (var transaction = _sqLiteMigrationHelper.BeginTransaction())
|
using (var transaction = _sqLiteMigrationHelper.BeginTransaction())
|
||||||
{
|
{
|
||||||
var originalColumns = _sqLiteMigrationHelper.GetColumns(tableName);
|
var originalColumns = _sqLiteMigrationHelper.GetColumns(tableName);
|
||||||
var originalIndexes = _sqLiteMigrationHelper.GetIndexes(tableName);
|
var indexes = _sqLiteMigrationHelper.GetIndexes(tableName);
|
||||||
|
|
||||||
var newColumns = originalColumns.Select(c =>
|
var newColumns = originalColumns.Select(c =>
|
||||||
{
|
{
|
||||||
|
@ -82,9 +81,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
||||||
return c.Value;
|
return c.Value;
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
var newIndexes = originalIndexes;
|
CreateTable(tableName, newColumns, indexes);
|
||||||
|
|
||||||
CreateTable(tableName, newColumns, newIndexes);
|
|
||||||
|
|
||||||
transaction.Commit();
|
transaction.Commit();
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,7 +150,6 @@ namespace NzbDrone.Core.Organizer
|
||||||
tokenValues.Add("{Episode Title}", GetEpisodeTitle(episodeTitles));
|
tokenValues.Add("{Episode Title}", GetEpisodeTitle(episodeTitles));
|
||||||
tokenValues.Add("{Quality Title}", GetQualityTitle(episodeFile.Quality));
|
tokenValues.Add("{Quality Title}", GetQualityTitle(episodeFile.Quality));
|
||||||
|
|
||||||
|
|
||||||
return CleanFilename(ReplaceTokens(pattern, tokenValues).Trim());
|
return CleanFilename(ReplaceTokens(pattern, tokenValues).Trim());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,9 @@ define(
|
||||||
},
|
},
|
||||||
Keys : {
|
Keys : {
|
||||||
DefaultQualityProfileId: 'DefaultQualityProfileId',
|
DefaultQualityProfileId: 'DefaultQualityProfileId',
|
||||||
DefaultRootFolderId: 'DefaultRootFolderId',
|
DefaultRootFolderId : 'DefaultRootFolderId',
|
||||||
UseSeasonFolder: 'UseSeasonFolder'
|
UseSeasonFolder : 'UseSeasonFolder',
|
||||||
|
AdvancedSettings : 'advancedSettings'
|
||||||
},
|
},
|
||||||
|
|
||||||
getValueBoolean: function (key, defaultValue) {
|
getValueBoolean: function (key, defaultValue) {
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
<i class="select-handle pull-left icon-chevron-right x-select" />
|
<i class="select-handle pull-left x-select" />
|
||||||
<span class="quality-label">{{quality.name}}</span>
|
<span class="quality-label">{{quality.name}}</span>
|
||||||
<i class="drag-handle pull-right icon-resize-vertical advanced-setting x-drag-handle" />
|
<i class="drag-handle pull-right icon-reorder advanced-setting x-drag-handle" />
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
define(
|
define(
|
||||||
[
|
[
|
||||||
|
'underscore',
|
||||||
'vent',
|
'vent',
|
||||||
'marionette',
|
'marionette',
|
||||||
'backbone',
|
'backbone',
|
||||||
|
@ -8,8 +9,8 @@ define(
|
||||||
'Settings/Quality/Profile/EditQualityProfileItemView',
|
'Settings/Quality/Profile/EditQualityProfileItemView',
|
||||||
'Mixins/AsModelBoundView',
|
'Mixins/AsModelBoundView',
|
||||||
'Mixins/AsValidatedView',
|
'Mixins/AsValidatedView',
|
||||||
'underscore'
|
'Config'
|
||||||
], function (vent, Marionette, Backbone, BackboneSortableCollectionView, EditQualityProfileItemView, AsModelBoundView, AsValidatedView, _) {
|
], function (_, vent, Marionette, Backbone, QualitySortableCollectionView, EditQualityProfileItemView, AsModelBoundView, AsValidatedView, Config) {
|
||||||
|
|
||||||
var view = Marionette.ItemView.extend({
|
var view = Marionette.ItemView.extend({
|
||||||
template: 'Settings/Quality/Profile/EditQualityProfileViewTemplate',
|
template: 'Settings/Quality/Profile/EditQualityProfileViewTemplate',
|
||||||
|
@ -26,35 +27,23 @@ define(
|
||||||
initialize: function (options) {
|
initialize: function (options) {
|
||||||
this.profileCollection = options.profileCollection;
|
this.profileCollection = options.profileCollection;
|
||||||
|
|
||||||
this.allowedCollection = new Backbone.Collection(_.toArray(this.model.get('items')).reverse());
|
this.itemsCollection = new Backbone.Collection(_.toArray(this.model.get('items')).reverse());
|
||||||
},
|
},
|
||||||
|
|
||||||
onRender: function() {
|
onRender: function() {
|
||||||
var MyCollectionView = BackboneSortableCollectionView.extend({
|
|
||||||
events : {
|
var listViewAllowed = new QualitySortableCollectionView({
|
||||||
// Backbone.CollectionView used mousedown for the click event, which interferes with the sortable.
|
|
||||||
"click li, td" : "_listItem_onMousedown",
|
|
||||||
"dblclick li, td" : "_listItem_onDoubleClick",
|
|
||||||
"click" : "_listBackground_onClick",
|
|
||||||
"click ul.collection-list, table.collection-list" : "_listBackground_onClick",
|
|
||||||
"keydown" : "_onKeydown"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
var listViewAllowed = new MyCollectionView({
|
|
||||||
el : this.ui.allowed,
|
el : this.ui.allowed,
|
||||||
modelView : EditQualityProfileItemView,
|
modelView : EditQualityProfileItemView,
|
||||||
selectable : true,
|
selectable : true,
|
||||||
selectMultiple : true,
|
selectMultiple : true,
|
||||||
clickToSelect : true,
|
clickToSelect : true,
|
||||||
clickToToggle : true,
|
clickToToggle : true,
|
||||||
sortable : true,
|
sortable : Config.getValueBoolean(Config.Keys.AdvancedSettings, false),
|
||||||
sortableOptions : {
|
collection : this.itemsCollection
|
||||||
handle: '.x-drag-handle'
|
|
||||||
},
|
|
||||||
collection : this.allowedCollection
|
|
||||||
});
|
});
|
||||||
|
|
||||||
listViewAllowed.setSelectedModels(this.allowedCollection.filter(function(item) { return item.get('allowed') === true; }));
|
listViewAllowed.setSelectedModels(this.itemsCollection.filter(function(item) { return item.get('allowed') === true; }));
|
||||||
|
|
||||||
listViewAllowed.render();
|
listViewAllowed.render();
|
||||||
|
|
||||||
|
@ -73,7 +62,7 @@ define(
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateModel: function() {
|
_updateModel: function() {
|
||||||
this.model.set('items', this.allowedCollection.toJSON().reverse());
|
this.model.set('items', this.itemsCollection.toJSON().reverse());
|
||||||
|
|
||||||
this.render();
|
this.render();
|
||||||
},
|
},
|
||||||
|
|
|
@ -29,17 +29,14 @@
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="control-group">
|
||||||
<div>
|
<label class="control-label">Qualities</label>
|
||||||
<div class="offset1 span2">
|
<div class="controls qualities-controls">
|
||||||
<h3>
|
<ul class="qualities x-allowed-list" validation-name="allowed"></ul>
|
||||||
Allowed
|
|
||||||
<span class="help-inline">
|
<span class="help-inline">
|
||||||
<i class="icon-question-sign" title="Qualities higher in the list are more preferred"/>
|
<i class="icon-question-sign" title="Qualities higher in the list are more preferred. Only checked qualities will be wanted."/>
|
||||||
</span>
|
</span>
|
||||||
</h3>
|
</div>
|
||||||
<ul class="allowed-list x-allowed-list" validation-name="allowed">
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,7 +6,7 @@ define(
|
||||||
return BackboneSortableCollectionView.extend({
|
return BackboneSortableCollectionView.extend({
|
||||||
|
|
||||||
events : {
|
events : {
|
||||||
'mousedown li, td' : '_listItem_onMousedown',
|
'click li, td' : '_listItem_onMousedown',
|
||||||
'dblclick li, td' : '_listItem_onDoubleClick',
|
'dblclick li, td' : '_listItem_onDoubleClick',
|
||||||
'click' : '_listBackground_onClick',
|
'click' : '_listBackground_onClick',
|
||||||
'click ul.collection-list, table.collection-list' : '_listBackground_onClick',
|
'click ul.collection-list, table.collection-list' : '_listBackground_onClick',
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
@import "../../Shared/Styles/card";
|
@import "../../Shared/Styles/card";
|
||||||
@import "../../Content/Bootstrap/mixins";
|
@import "../../Content/Bootstrap/mixins";
|
||||||
|
@import "../../Content/FontAwesome/font-awesome";
|
||||||
|
|
||||||
.quality-profiles {
|
.quality-profiles {
|
||||||
li {
|
li {
|
||||||
|
@ -36,7 +37,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.allowed-list {
|
ul.qualities {
|
||||||
.user-select(none);
|
.user-select(none);
|
||||||
|
|
||||||
min-height: 100px;
|
min-height: 100px;
|
||||||
|
@ -44,18 +45,45 @@ ul.allowed-list {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
outline: none;
|
outline: none;
|
||||||
|
width: 220px;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
li {
|
li {
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
padding: 2px;
|
padding: 2px 4px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
border: 1px solid #AAA;
|
border: 1px solid #aaaaaa;
|
||||||
border-radius: 4px; /* may need vendor varients */
|
border-radius: 4px; /* may need vendor varients */
|
||||||
background: #FAFAFA;
|
background: #fafafa;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
|
&.selected {
|
||||||
|
.select-handle {
|
||||||
|
opacity: 1.0;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
.quality-label {
|
.quality-label {
|
||||||
color: #CCC;
|
color: #444444;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-handle:before {
|
||||||
|
.icon(@check);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: #888888;
|
||||||
|
background: #eeeeee;
|
||||||
|
|
||||||
|
.drag-handle {
|
||||||
|
opacity: 1.0;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.quality-label {
|
||||||
|
color: #c6c6c6;
|
||||||
}
|
}
|
||||||
.drag-handle, .select-handle {
|
.drag-handle, .select-handle {
|
||||||
opacity: 0.2;
|
opacity: 0.2;
|
||||||
|
@ -63,30 +91,19 @@ ul.allowed-list {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.drag-handle:hover {
|
.select-handle:before {
|
||||||
opacity: 1.0;
|
.icon(@check-empty);
|
||||||
cursor: pointer;
|
display: inline-block;
|
||||||
|
width: 16px;
|
||||||
|
margin-top: 1px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
li.selected {
|
.qualities-controls {
|
||||||
.select-handle {
|
.help-inline {
|
||||||
opacity: 1.0;
|
vertical-align: top;
|
||||||
cursor: pointer;
|
margin-top: 5px;
|
||||||
}
|
|
||||||
|
|
||||||
.quality-label {
|
|
||||||
color: #444;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
li:hover {
|
|
||||||
border-color: #888;
|
|
||||||
background: #EEE;
|
|
||||||
|
|
||||||
.select-handle {
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,4 +164,3 @@ ul.allowed-list {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -194,7 +194,7 @@ define(
|
||||||
},
|
},
|
||||||
|
|
||||||
_setAdvancedSettingsState: function () {
|
_setAdvancedSettingsState: function () {
|
||||||
var checked = Config.getValueBoolean('advancedSettings');
|
var checked = Config.getValueBoolean(Config.Keys.AdvancedSettings);
|
||||||
this.ui.advancedSettings.prop('checked', checked);
|
this.ui.advancedSettings.prop('checked', checked);
|
||||||
|
|
||||||
if (checked) {
|
if (checked) {
|
||||||
|
@ -204,7 +204,7 @@ define(
|
||||||
|
|
||||||
_toggleAdvancedSettings: function () {
|
_toggleAdvancedSettings: function () {
|
||||||
var checked = this.ui.advancedSettings.prop('checked');
|
var checked = this.ui.advancedSettings.prop('checked');
|
||||||
Config.setValue('advancedSettings', checked);
|
Config.setValue(Config.Keys.AdvancedSettings, checked);
|
||||||
|
|
||||||
if (checked) {
|
if (checked) {
|
||||||
$('body').addClass('show-advanced-settings');
|
$('body').addClass('show-advanced-settings');
|
||||||
|
|
Loading…
Reference in New Issue