Combined setting list
This commit is contained in:
@@ -10,24 +10,24 @@ config = [{
|
||||
'tab': 'automation',
|
||||
'name': 'automation',
|
||||
'label': 'Automation',
|
||||
'description': 'Enable automatic movie adding',
|
||||
'description': 'Minimal movie requirements',
|
||||
'options': [
|
||||
{
|
||||
'name': 'year',
|
||||
'default': 2011,
|
||||
'Label': 'Minimal year',
|
||||
'Label': 'Year',
|
||||
'type': 'int',
|
||||
},
|
||||
{
|
||||
'name': 'votes',
|
||||
'default': 1000,
|
||||
'Label': 'Minimal votes',
|
||||
'Label': 'Votes',
|
||||
'type': 'int',
|
||||
},
|
||||
{
|
||||
'name': 'rating',
|
||||
'default': 6.0,
|
||||
'Label': 'Minimal rating',
|
||||
'Label': 'Rating',
|
||||
'type': 'float',
|
||||
},
|
||||
],
|
||||
|
||||
@@ -10,15 +10,22 @@ config = [{
|
||||
'tab': 'automation',
|
||||
'name': 'imdb_automation',
|
||||
'label': 'IMDB',
|
||||
'description': 'Enable automatic movie adding of IMDB watchlists',
|
||||
'description': 'From any public IMDB watchlists',
|
||||
'options': [
|
||||
{
|
||||
'name': 'automation_enabled',
|
||||
'default': False,
|
||||
'type': 'enabler',
|
||||
},
|
||||
{
|
||||
'name': 'automation_urls_use',
|
||||
'label': 'Use',
|
||||
},
|
||||
{
|
||||
'name': 'automation_urls',
|
||||
'label': 'url',
|
||||
'type': 'combined',
|
||||
'combine': ['automation_urls_use', 'automation_urls'],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
@@ -10,13 +10,21 @@ config = [{
|
||||
'tab': 'automation',
|
||||
'name': 'kinepolis_automation',
|
||||
'label': 'Kinepolis',
|
||||
'description': 'Enable automatic movie adding from Kinepolis',
|
||||
'description': 'from <a href="http://kinepolis.be">Kinepolis</a>',
|
||||
'options': [
|
||||
{
|
||||
'name': 'automation_enabled',
|
||||
'default': False,
|
||||
'type': 'enabler',
|
||||
},
|
||||
{
|
||||
'name': 'automation_use_requirements',
|
||||
'label': 'Use requirements',
|
||||
'description': 'Use the minimal requirements set above',
|
||||
'default': True,
|
||||
'advanced': True,
|
||||
'type': 'bool',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -35,7 +35,7 @@ class Kinepolis(Automation, RSS):
|
||||
result = self.search(title)
|
||||
|
||||
if result:
|
||||
if self.isMinimal(result):
|
||||
if not self.conf('automation_use_requirements') or self.isMinimal(result):
|
||||
movies.append(result)
|
||||
|
||||
return movies
|
||||
|
||||
@@ -23,13 +23,15 @@ config = [{
|
||||
{
|
||||
'name': 'host',
|
||||
'default': 'nzb.su',
|
||||
'description': 'The hostname of your newznab provider'
|
||||
'description': 'The hostname of your newznab provider',
|
||||
},
|
||||
{
|
||||
'name': 'api_key',
|
||||
'default': '',
|
||||
'label': 'Api Key',
|
||||
'description': 'Can be found on your profile page',
|
||||
'type': 'combined',
|
||||
'combine': ['use', 'host', 'api_key'],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
@@ -1,163 +0,0 @@
|
||||
var MultipleNewznab = new Class({
|
||||
|
||||
input_types: ['use', 'host', 'api_key'],
|
||||
|
||||
initialize: function(page){
|
||||
var self = this;
|
||||
|
||||
self.items = [];
|
||||
self.values = [];
|
||||
self.inputs = {};
|
||||
|
||||
self.page = page;
|
||||
|
||||
App.addEvent('load', self.addSettings.bind(self))
|
||||
|
||||
},
|
||||
|
||||
addSettings: function(){
|
||||
var self = this;
|
||||
|
||||
self.settings = App.getPage(self.page || 'Settings')
|
||||
self.settings.addEvent('create', function(){
|
||||
|
||||
self.fieldset = self.settings.tabs.providers.content.getElement('.section_newznab');
|
||||
|
||||
self.input_types.each(function(name){
|
||||
self.inputs[name] = self.fieldset.getElement('input[name=newznab['+name+']]');
|
||||
var values = self.inputs[name].get('value').split(',');
|
||||
|
||||
values.each(function(value, nr){
|
||||
if (!self.values[nr]) self.values[nr] = {};
|
||||
self.values[nr][name] = value.trim();
|
||||
});
|
||||
|
||||
self.inputs[name].getParent().addClass('hide')
|
||||
self.inputs[name].addEvent('change', self.addEmpty.bind(self))
|
||||
});
|
||||
|
||||
|
||||
self.values.each(function(item, nr){
|
||||
self.createItem(item.use, item.host, item.api_key);
|
||||
});
|
||||
|
||||
new Element('div.head').adopt(
|
||||
new Element('abbr.host', {
|
||||
'text': 'Host',
|
||||
'title': self.inputs['host'].getNext().get('text')
|
||||
}),
|
||||
new Element('abbr.api_key', {
|
||||
'text': 'Api Key',
|
||||
'title': self.inputs['api_key'].getNext().get('text')
|
||||
})
|
||||
).inject(self.fieldset.getElement('h2'), 'after');
|
||||
|
||||
self.addEmpty();
|
||||
|
||||
})
|
||||
|
||||
},
|
||||
|
||||
add_empty_timeout: 0,
|
||||
addEmpty: function(){
|
||||
var self = this;
|
||||
|
||||
if(self.add_empty_timeout) clearTimeout(self.add_empty_timeout);
|
||||
|
||||
var has_empty = false;
|
||||
self.items.each(function(ctrl_holder){
|
||||
if(ctrl_holder.getElement('.host').get('value') == '' && ctrl_holder.getElement('.api_key').get('value') == ''){
|
||||
has_empty = true;
|
||||
}
|
||||
ctrl_holder[has_empty ? 'addClass' : 'removeClass']('is_empty');
|
||||
});
|
||||
if(has_empty) return;
|
||||
|
||||
self.add_empty_timeout = setTimeout(function(){
|
||||
self.createItem(false, null, null);
|
||||
}, 10);
|
||||
},
|
||||
|
||||
createItem: function(use, host, api){
|
||||
var self = this;
|
||||
|
||||
var checkbox = new Element('input[type=checkbox].use.inlay', {
|
||||
'checked': +use,
|
||||
'events': {
|
||||
'click': self.save.bind(self),
|
||||
'change': self.save.bind(self)
|
||||
}
|
||||
})
|
||||
|
||||
var item = new Element('div.ctrlHolder').adopt(
|
||||
checkbox,
|
||||
new Element('input[type=text].host.inlay', {
|
||||
'value': host,
|
||||
'placeholder': 'Host',
|
||||
'events': {
|
||||
'keyup': self.save.bind(self),
|
||||
'change': self.save.bind(self)
|
||||
}
|
||||
}),
|
||||
new Element('input[type=text].api_key.inlay', {
|
||||
'value': api,
|
||||
'placeholder': 'Api hash key',
|
||||
'events': {
|
||||
'keyup': self.save.bind(self),
|
||||
'change': self.save.bind(self)
|
||||
}
|
||||
}),
|
||||
new Element('a.icon.delete', {
|
||||
'events': {
|
||||
'click': self.deleteItem.bind(self)
|
||||
}
|
||||
})
|
||||
).inject(self.fieldset);
|
||||
item[!host ? 'addClass' : 'removeClass']('is_empty');
|
||||
|
||||
new Form.Check(checkbox, {
|
||||
'onChange': checkbox.fireEvent.bind(checkbox, 'change')
|
||||
});
|
||||
|
||||
self.items.include(item)
|
||||
|
||||
},
|
||||
|
||||
save: function(){
|
||||
var self = this;
|
||||
|
||||
var temp = {}
|
||||
self.items.each(function(item, nr){
|
||||
self.input_types.each(function(type){
|
||||
var input = item.getElement('input.'+type);
|
||||
if(input.getParent('.ctrlHolder').hasClass('is_empty')) return;
|
||||
|
||||
if(!temp[type]) temp[type] = [];
|
||||
temp[type][nr] = input.get('type') == 'checkbox' ? +input.get('checked') : input.get('value').trim();
|
||||
|
||||
})
|
||||
});
|
||||
|
||||
self.input_types.each(function(name){
|
||||
self.inputs[name].set('value', temp[name].join(','));
|
||||
self.inputs[name].fireEvent('change');
|
||||
});
|
||||
|
||||
|
||||
},
|
||||
|
||||
deleteItem: function(e){
|
||||
var self = this;
|
||||
(e).stop();
|
||||
|
||||
var item = e.target.getParent();
|
||||
|
||||
self.items.erase(item);
|
||||
item.destroy();
|
||||
|
||||
self.save();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
window.MNewznab = new MultipleNewznab();
|
||||
@@ -1003,3 +1003,165 @@ Option.Choice.Tag = new Class({
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
Option.Combined = new Class({
|
||||
|
||||
Extends: Option.String,
|
||||
|
||||
afterInject: function(){
|
||||
var self = this;
|
||||
|
||||
self.fieldset = self.input.getParent('fieldset');
|
||||
self.combined_list = new Element('div.combined_table').inject(self.fieldset.getElement('h2'), 'after');
|
||||
self.values = {}
|
||||
self.inputs = {}
|
||||
self.items = []
|
||||
|
||||
self.options.combine.each(function(name){
|
||||
|
||||
self.inputs[name] = self.fieldset.getElement('input[name='+self.section+'['+name+']]');
|
||||
var values = self.inputs[name].get('value').split(',');
|
||||
|
||||
values.each(function(value, nr){
|
||||
if (!self.values[nr]) self.values[nr] = {};
|
||||
self.values[nr][name] = value.trim();
|
||||
});
|
||||
|
||||
self.inputs[name].getParent('.ctrlHolder').hide();
|
||||
self.inputs[name].addEvent('change', self.addEmpty.bind(self))
|
||||
|
||||
});
|
||||
|
||||
var head = new Element('div.head').inject(self.combined_list)
|
||||
|
||||
Object.each(self.inputs, function(input, name){
|
||||
new Element('abbr', {
|
||||
'class': name,
|
||||
'text': input.getPrevious().get('text'),
|
||||
//'title': input.getNext().get('text')
|
||||
}).inject(head)
|
||||
})
|
||||
|
||||
|
||||
Object.each(self.values, function(item, nr){
|
||||
self.createItem(item);
|
||||
});
|
||||
|
||||
self.addEmpty();
|
||||
|
||||
},
|
||||
|
||||
add_empty_timeout: 0,
|
||||
addEmpty: function(){
|
||||
var self = this;
|
||||
|
||||
if(self.add_empty_timeout) clearTimeout(self.add_empty_timeout);
|
||||
|
||||
var has_empty = 0;
|
||||
self.items.each(function(ctrl_holder){
|
||||
var empty_count = 0;
|
||||
self.options.combine.each(function(name){
|
||||
var input = ctrl_holder.getElement('input.'+name)
|
||||
if(input.get('value') == '' || input.get('type') == 'checkbox')
|
||||
empty_count++
|
||||
});
|
||||
has_empty += (empty_count == self.options.combine.length) ? 1 : 0;
|
||||
ctrl_holder[(empty_count == self.options.combine.length) ? 'addClass' : 'removeClass']('is_empty');
|
||||
});
|
||||
if(has_empty > 0) return;
|
||||
|
||||
self.add_empty_timeout = setTimeout(function(){
|
||||
self.createItem(false, null);
|
||||
}, 10);
|
||||
},
|
||||
|
||||
createItem: function(values){
|
||||
var self = this;
|
||||
|
||||
var item = new Element('div.ctrlHolder').inject(self.combined_list),
|
||||
value_count = 0,
|
||||
value_empty = 0;
|
||||
|
||||
self.options.combine.each(function(name){
|
||||
var value = values[name] || ''
|
||||
|
||||
if(name.indexOf('use') != -1){
|
||||
var checkbox = new Element('input[type=checkbox].inlay.'+name, {
|
||||
'checked': +value,
|
||||
'events': {
|
||||
'click': self.saveCombined.bind(self),
|
||||
'change': self.saveCombined.bind(self)
|
||||
}
|
||||
}).inject(item);
|
||||
|
||||
new Form.Check(checkbox);
|
||||
}
|
||||
else {
|
||||
value_count++;
|
||||
new Element('input[type=text].inlay.'+name, {
|
||||
'value': value,
|
||||
'placeholder': name,
|
||||
'events': {
|
||||
'keyup': self.saveCombined.bind(self),
|
||||
'change': self.saveCombined.bind(self)
|
||||
}
|
||||
}).inject(item);
|
||||
|
||||
if(!value)
|
||||
value_empty++;
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
item[value_empty == value_count ? 'addClass' : 'removeClass']('is_empty');
|
||||
|
||||
new Element('a.icon.delete', {
|
||||
'events': {
|
||||
'click': self.deleteCombinedItem.bind(self)
|
||||
}
|
||||
}).inject(item)
|
||||
|
||||
self.items.include(item);
|
||||
|
||||
|
||||
},
|
||||
|
||||
saveCombined: function(){
|
||||
var self = this;
|
||||
|
||||
|
||||
var temp = {}
|
||||
self.items.each(function(item, nr){
|
||||
self.options.combine.each(function(name){
|
||||
var input = item.getElement('input.'+name);
|
||||
if(item.hasClass('is_empty')) return;
|
||||
|
||||
if(!temp[name]) temp[name] = [];
|
||||
temp[name][nr] = input.get('type') == 'checkbox' ? +input.get('checked') : input.get('value').trim();
|
||||
|
||||
})
|
||||
});
|
||||
|
||||
self.options.combine.each(function(name){
|
||||
self.inputs[name].set('value', (temp[name] || []).join(','));
|
||||
self.inputs[name].fireEvent('change');
|
||||
});
|
||||
|
||||
self.addEmpty()
|
||||
|
||||
},
|
||||
|
||||
deleteCombinedItem: function(e){
|
||||
var self = this;
|
||||
(e).stop();
|
||||
|
||||
var item = e.target.getParent();
|
||||
|
||||
self.items.erase(item);
|
||||
item.destroy();
|
||||
|
||||
self.saveCombined();
|
||||
}
|
||||
|
||||
});
|
||||
@@ -86,7 +86,7 @@
|
||||
.page fieldset.disabled .ctrlHolder {
|
||||
display: none;
|
||||
}
|
||||
.page fieldset .ctrlHolder:first-child {
|
||||
.page fieldset > .ctrlHolder:first-child {
|
||||
display: block;
|
||||
padding: 0;
|
||||
width: auto;
|
||||
@@ -454,40 +454,46 @@
|
||||
margin-top: -13px;
|
||||
}
|
||||
|
||||
.page .section_newznab .head {
|
||||
.page .combined_table .head {
|
||||
margin: 0 0 0 60px;
|
||||
}
|
||||
.page .disabled .head { display: none; }
|
||||
.page .section_newznab .head abbr {
|
||||
.page .combined_table .head abbr {
|
||||
display: inline-block;
|
||||
font-weight: bold;
|
||||
border-bottom: 1px dotted #fff;
|
||||
line-height: 140%;
|
||||
cursor: help;
|
||||
}
|
||||
.page .section_newznab .head abbr.host {
|
||||
.page .combined_table .head abbr.use, .page .combined_table .head abbr.automation_urls_use {
|
||||
display: none;
|
||||
}
|
||||
.page .combined_table .head abbr.host {
|
||||
margin-right: 197px;
|
||||
}
|
||||
|
||||
.page .section_newznab .ctrlHolder {
|
||||
.page .combined_table .ctrlHolder {
|
||||
padding-top: 2px;
|
||||
padding-bottom: 3px;
|
||||
}
|
||||
.page .section_newznab .ctrlHolder.hide { display: none; }
|
||||
.page .combined_table .ctrlHolder.hide { display: none; }
|
||||
|
||||
.page .section_newznab .ctrlHolder > * {
|
||||
.page .combined_table .ctrlHolder > * {
|
||||
margin: 0 10px 0 0;
|
||||
}
|
||||
|
||||
.page .section_newznab .ctrlHolder .delete {
|
||||
display: inline-block;
|
||||
.page .combined_table .ctrlHolder .delete {
|
||||
display: none;
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
vertical-align: middle;
|
||||
background-position: left center;
|
||||
}
|
||||
.page .combined_table .ctrlHolder:hover .delete {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.page .section_newznab .ctrlHolder.is_empty .delete, .page.settings .section_newznab .ctrlHolder.is_empty .use {
|
||||
.page .combined_table .ctrlHolder.is_empty .delete, .page.settings .combined_table .ctrlHolder.is_empty .check {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user