mirror of
https://github.com/SickGear/SickGear.git
synced 2024-12-21 10:13:39 +00:00
573 lines
16 KiB
JavaScript
573 lines
16 KiB
JavaScript
|
/** @namespace $.SickGear.Root */
|
||
|
/** @namespace $.SickGear.anonURL */
|
||
|
$(document).ready(function(){
|
||
|
|
||
|
$.sgd = !1;
|
||
|
|
||
|
$.fn.showHideProviders = function(){
|
||
|
$('.providerDiv').each(function(){
|
||
|
var providerName = $(this).attr('id');
|
||
|
var selectedProvider = $('#editAProvider').find(':selected').val();
|
||
|
|
||
|
if (selectedProvider + 'Div' == providerName){
|
||
|
$(this).show();
|
||
|
} else {
|
||
|
$(this).hide();
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Gets categories for the provided newznab provider.
|
||
|
* no return data. Function updateNewznabCaps() is run at callback
|
||
|
* @param {String} isNative
|
||
|
* @param {Array} selectedProvider
|
||
|
* @return
|
||
|
*/
|
||
|
$.fn.getCategories = function(isNative, selectedProvider){
|
||
|
|
||
|
var name = selectedProvider[0];
|
||
|
var url = selectedProvider[1];
|
||
|
var key = selectedProvider[2];
|
||
|
|
||
|
if (!name || !url || !key)
|
||
|
return;
|
||
|
|
||
|
var params = {url: url, name: name, key: key};
|
||
|
|
||
|
$.getJSON($.SickGear.Root + '/config/providers/get-newznab-categories', params,
|
||
|
function(data){
|
||
|
updateNewznabCaps(data, selectedProvider);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
$.fn.addProvider = function(id, name, url, key, cat, isNative, showProvider){
|
||
|
|
||
|
url = $.trim(url);
|
||
|
if (!url)
|
||
|
return;
|
||
|
|
||
|
if (!/^https?:\/\//i.test(url))
|
||
|
url = 'http://' + url;
|
||
|
|
||
|
url += /[^/]$/.test(url) && '/' || '';
|
||
|
|
||
|
newznabProviders[id] = [isNative, [name, url, key, cat]];
|
||
|
|
||
|
if (!isNative){
|
||
|
$('#editANewznabProvider').addOption(id, name);
|
||
|
$(this).populateNewznabSection();
|
||
|
}
|
||
|
|
||
|
if (0 == $('#provider_order_list > #' + id).length && !1 != showProvider){
|
||
|
var toAdd = '<li class="ui-state-default" id="' + id + '"> '
|
||
|
+ '<input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> '
|
||
|
+ '<a href="' + $.SickGear.anonURL + url + '" class="imgLink" target="_new">'
|
||
|
+ '<img src="' + $.SickGear.Root + '/images/providers/newznab.png" alt="' + name + '" width="16" height="16"></a> '
|
||
|
+ name + '</li>', prov$ = $('#provider_order_list');
|
||
|
|
||
|
prov$.append(toAdd);
|
||
|
prov$.sortable('refresh');
|
||
|
}
|
||
|
|
||
|
$(this).makeNewznabProviderString();
|
||
|
};
|
||
|
|
||
|
$.fn.addTorrentRssProvider = function(id, name, url, cookies){
|
||
|
|
||
|
torrentRssProviders[id] = [name, url, cookies];
|
||
|
|
||
|
$('#editATorrentRssProvider').addOption(id, name);
|
||
|
$(this).populateTorrentRssSection();
|
||
|
|
||
|
if (0 == $('#provider_order_list > #' + id).length){
|
||
|
var toAdd = '<li class="ui-state-default" id="' + id + '"> '
|
||
|
+ '<input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> '
|
||
|
+ '<a href="' + $.SickGear.anonURL + url + '" class="imgLink" target="_new">'
|
||
|
+ '<img src="' + $.SickGear.Root + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> '
|
||
|
+ name + '</li>', prov$ = $('#provider_order_list');
|
||
|
|
||
|
prov$.append(toAdd);
|
||
|
prov$.sortable('refresh');
|
||
|
}
|
||
|
|
||
|
$(this).makeTorrentRssProviderString();
|
||
|
};
|
||
|
|
||
|
$.fn.updateProvider = function(id, url, key, cat){
|
||
|
|
||
|
newznabProviders[id][1][1] = url;
|
||
|
newznabProviders[id][1][2] = key;
|
||
|
newznabProviders[id][1][3] = cat;
|
||
|
|
||
|
$(this).populateNewznabSection();
|
||
|
|
||
|
$(this).makeNewznabProviderString();
|
||
|
};
|
||
|
|
||
|
$.fn.deleteProvider = function(id){
|
||
|
|
||
|
$('#editANewznabProvider').removeOption(id);
|
||
|
delete newznabProviders[id];
|
||
|
$(this).populateNewznabSection();
|
||
|
$('li').remove('#' + id);
|
||
|
$(this).makeNewznabProviderString();
|
||
|
};
|
||
|
|
||
|
$.fn.updateTorrentRssProvider = function(id, url, cookies){
|
||
|
torrentRssProviders[id][1] = url;
|
||
|
torrentRssProviders[id][2] = cookies;
|
||
|
$(this).populateTorrentRssSection();
|
||
|
$(this).makeTorrentRssProviderString();
|
||
|
};
|
||
|
|
||
|
$.fn.deleteTorrentRssProvider = function(id){
|
||
|
$('#editATorrentRssProvider').removeOption(id);
|
||
|
delete torrentRssProviders[id];
|
||
|
$(this).populateTorrentRssSection();
|
||
|
$('li').remove('#' + id);
|
||
|
$(this).makeTorrentRssProviderString();
|
||
|
};
|
||
|
|
||
|
$.fn.populateNewznabSection = function(){
|
||
|
|
||
|
var data, isNative, rrcat, selectedProvider = $('#editANewznabProvider').find(':selected').val(),
|
||
|
nnName$ = $('#newznab_name'), nnCat$ = $('#newznab_cat'), nn$ = $('#newznab_cat, #newznab_cap');
|
||
|
|
||
|
if ('addNewznab' == selectedProvider){
|
||
|
data = ['','',''];
|
||
|
isNative = 0;
|
||
|
$('#newznab_add_div').show();
|
||
|
$('#newznab_update_div').hide();
|
||
|
nn$.find('option').each(function(){
|
||
|
$(this).remove();
|
||
|
});
|
||
|
nn$.attr('disabled', 'disabled');
|
||
|
} else {
|
||
|
data = newznabProviders[selectedProvider][1];
|
||
|
isNative = newznabProviders[selectedProvider][0];
|
||
|
$('#newznab_add_div').hide();
|
||
|
$('#newznab_update_div').show();
|
||
|
nn$.removeAttr('disabled');
|
||
|
}
|
||
|
|
||
|
nnName$.val(data[0]);
|
||
|
$('#newznab_url').val(data[1]);
|
||
|
$('#newznab_key').val(data[2]);
|
||
|
|
||
|
//Check if not already array
|
||
|
rrcat = ('string' === typeof data[3]) ? data[3].split(',') : data[3];
|
||
|
|
||
|
// Update the category select box (on the right)
|
||
|
var newCatOptions = [];
|
||
|
if (rrcat){
|
||
|
rrcat.forEach(function(cat){
|
||
|
newCatOptions.push({text : cat, value : cat});
|
||
|
});
|
||
|
nnCat$.replaceOptions(newCatOptions);
|
||
|
}
|
||
|
|
||
|
if ('addNewznab' == selectedProvider) {
|
||
|
|
||
|
$('#newznab_url, #newznab_name').removeAttr('disabled');
|
||
|
|
||
|
} else {
|
||
|
|
||
|
nnName$.attr('disabled', 'disabled');
|
||
|
|
||
|
if (isNative){
|
||
|
$('#newznab_url, #newznab_delete').attr('disabled', 'disabled');
|
||
|
} else {
|
||
|
$('#newznab_url, #newznab_delete').removeAttr('disabled');
|
||
|
|
||
|
//Get Categories Capabilities
|
||
|
if (data[0] && data[1] && data[2] && !ifExists($.fn.newznabProvidersCapabilities, data[0])){
|
||
|
$(this).getCategories(isNative, data);
|
||
|
} else {
|
||
|
updateNewznabCaps(null, data);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var ifExists = function(loopThroughArray, searchFor){
|
||
|
var found = !1;
|
||
|
|
||
|
loopThroughArray.forEach(function(rootObject){
|
||
|
if (rootObject.name == searchFor){
|
||
|
found = !0;
|
||
|
}
|
||
|
});
|
||
|
return found;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Updates the Global array $.fn.newznabProvidersCapabilities with a combination of newznab prov name
|
||
|
* and category capabilities. Return
|
||
|
* @param {Array} newzNabCaps, is the returned object with newzNabprod Name and Capabilities.
|
||
|
* @param {Array} selectedProvider
|
||
|
* @return no return data. The multiselect input $("#newznab_cap") is updated, as a result.
|
||
|
*/
|
||
|
/** @namespace newzNabCaps.tv_categories */
|
||
|
var updateNewznabCaps = function(newzNabCaps, selectedProvider){
|
||
|
|
||
|
if (newzNabCaps && !ifExists($.fn.newznabProvidersCapabilities, selectedProvider[0])){
|
||
|
|
||
|
$.fn.newznabProvidersCapabilities.push({
|
||
|
'name' : selectedProvider[0],
|
||
|
'enabled' : newzNabCaps.state,
|
||
|
'categories' : newzNabCaps.tv_categories
|
||
|
.sort(function(a, b){return a.name > b.name})})
|
||
|
}
|
||
|
|
||
|
$.sgd && console.log(selectedProvider);
|
||
|
//Loop through the array and if currently selected newznab provider name matches one in the array, use it to
|
||
|
//update the capabilities select box (on the left).
|
||
|
if (selectedProvider[0]){
|
||
|
var elShow, newCapOptions = [], catName = '', hasCats = !1, enabled = !1;
|
||
|
if ($.fn.newznabProvidersCapabilities.length){
|
||
|
$.fn.newznabProvidersCapabilities.forEach(function(newzNabCap){
|
||
|
if (newzNabCap.name && newzNabCap.name == selectedProvider[0]) {
|
||
|
$.sgd && console.log('newzNabCap...');
|
||
|
$.sgd && console.log(newzNabCap);
|
||
|
enabled = newzNabCap.enabled;
|
||
|
|
||
|
if (newzNabCap.categories instanceof Array) {
|
||
|
newzNabCap.categories.forEach(function(category_set){
|
||
|
if (category_set.id && category_set.name){
|
||
|
catName = category_set.name.replace(/Docu([^\w]|$)(.*?)/i, 'Documentary$1');
|
||
|
newCapOptions.push({
|
||
|
value: category_set.id,
|
||
|
text: catName + ' (' + category_set.id + ')'
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
$('#newznab_cap').replaceOptions(newCapOptions);
|
||
|
hasCats = !!newCapOptions.length
|
||
|
}
|
||
|
return !1;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
$('#nn-cats, #nn-nocats, #nn-enable-for-cats, #nn-loadcats').removeClass('show').addClass('hide');
|
||
|
if (!enabled) {
|
||
|
elShow = '#nn-enable-for-cats'
|
||
|
} else if (hasCats){
|
||
|
elShow = '#nn-cats';
|
||
|
} else {
|
||
|
elShow = '#nn-nocats';
|
||
|
}
|
||
|
$.sgd && console.log('for ' + selectedProvider[0] + ' unhide("' + elShow + '")');
|
||
|
$(elShow).removeClass('hide').addClass('show');
|
||
|
|
||
|
} else {
|
||
|
|
||
|
$.sgd && console.log('no caps - yet');
|
||
|
$('#nn-cats, #nn-nocats').removeClass('show').addClass('hide');
|
||
|
$('#nn-loadcats').removeClass('hide').addClass('show');
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$.fn.makeNewznabProviderString = function(){
|
||
|
|
||
|
var provStrings = [];
|
||
|
|
||
|
for (var id in newznabProviders){
|
||
|
provStrings.push(newznabProviders[id][1].join('|'));
|
||
|
}
|
||
|
|
||
|
$('#newznab_string').val(provStrings.join('!!!'))
|
||
|
};
|
||
|
|
||
|
$.fn.populateTorrentRssSection = function(){
|
||
|
|
||
|
var data, selectedProvider = $('#editATorrentRssProvider').find(':selected').val(),
|
||
|
torRSSadd$ = $('#torrentrss_add_div'), torRSSupd$ = $('#torrentrss_update_div'),
|
||
|
torRSSname$ = $('#torrentrss_name');
|
||
|
|
||
|
if ('addTorrentRss' == selectedProvider) {
|
||
|
data = ['', '', ''];
|
||
|
torRSSadd$.show();
|
||
|
torRSSupd$.hide();
|
||
|
} else {
|
||
|
data = torrentRssProviders[selectedProvider];
|
||
|
torRSSadd$.hide();
|
||
|
torRSSupd$.show();
|
||
|
}
|
||
|
|
||
|
torRSSname$.val(data[0]);
|
||
|
$('#torrentrss_url').val(data[1]);
|
||
|
$('#torrentrss_cookies').val(data[2]);
|
||
|
|
||
|
if ('addTorrentRss' == selectedProvider) {
|
||
|
$('#torrentrss_name, #torrentrss_url, #torrentrss_cookies').removeAttr('disabled');
|
||
|
} else {
|
||
|
torRSSname$.attr('disabled', 'disabled');
|
||
|
$('#torrentrss_url, #torrentrss_cookies, #torrentrss_delete').removeAttr('disabled');
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$.fn.makeTorrentRssProviderString = function(){
|
||
|
|
||
|
var provStrings = [];
|
||
|
for (var id in torrentRssProviders){
|
||
|
provStrings.push(torrentRssProviders[id].join('|'));
|
||
|
}
|
||
|
$('#torrentrss_string').val(provStrings.join('!!!'))
|
||
|
};
|
||
|
|
||
|
|
||
|
$.fn.refreshProviderList = function(){
|
||
|
var idArr = $('#provider_order_list').sortable('toArray');
|
||
|
var finalArr = [];
|
||
|
$.each(idArr, function(key, val){
|
||
|
var checked = + $('#enable_' + val).prop('checked') ? '1' : '0';
|
||
|
finalArr.push(val + ':' + checked);
|
||
|
});
|
||
|
|
||
|
$('#provider_order').val(finalArr.join(' '));
|
||
|
};
|
||
|
|
||
|
var newznabProviders = [];
|
||
|
var torrentRssProviders = [];
|
||
|
|
||
|
$(this).on('change', '.newznab_key', function(){
|
||
|
|
||
|
var provider_id = $(this).attr('id');
|
||
|
provider_id = provider_id.substring(0, provider_id.length-'_hash'.length);
|
||
|
|
||
|
var url = $('#' + provider_id + '_url').val();
|
||
|
var cat = $('#' + provider_id + '_cat').val();
|
||
|
var key = $(this).val();
|
||
|
|
||
|
$(this).updateProvider(provider_id, url, key, cat);
|
||
|
|
||
|
});
|
||
|
|
||
|
$('#newznab_key, #newznab_url').change(function(){
|
||
|
|
||
|
var selectedProvider = $('#editANewznabProvider').find(':selected').val();
|
||
|
|
||
|
if ('addNewznab' == selectedProvider)
|
||
|
return;
|
||
|
|
||
|
var url = $('#newznab_url').val(),
|
||
|
key = $('#newznab_key').val(),
|
||
|
cat = $('#newznab_cat').find('option').map(function(i, opt){
|
||
|
return $(opt).text();
|
||
|
}).toArray().join(',');
|
||
|
|
||
|
$(this).updateProvider(selectedProvider, url, key, cat);
|
||
|
|
||
|
});
|
||
|
|
||
|
$('#torrentrss_url, #torrentrss_cookies').change(function(){
|
||
|
|
||
|
var selectedProvider = $('#editATorrentRssProvider').find(':selected').val();
|
||
|
|
||
|
if ('addTorrentRss' == selectedProvider)
|
||
|
return;
|
||
|
|
||
|
var url = $('#torrentrss_url').val(),
|
||
|
cookies = $('#torrentrss_cookies').val();
|
||
|
|
||
|
$(this).updateTorrentRssProvider(selectedProvider, url, cookies);
|
||
|
});
|
||
|
|
||
|
|
||
|
$('#editAProvider').change(function(){
|
||
|
$(this).showHideProviders();
|
||
|
});
|
||
|
|
||
|
$('#editANewznabProvider').change(function(){
|
||
|
$(this).populateNewznabSection();
|
||
|
});
|
||
|
|
||
|
$('#editATorrentRssProvider').change(function(){
|
||
|
$(this).populateTorrentRssSection();
|
||
|
});
|
||
|
|
||
|
$(this).on('click', '.provider_enabler', function(){
|
||
|
$(this).refreshProviderList();
|
||
|
});
|
||
|
|
||
|
$(this).on('click', '#newznab_cat_update', function(){
|
||
|
|
||
|
var nnCat$ = $('#newznab_cat');
|
||
|
//Maybe check if there is anything selected?
|
||
|
nnCat$.find('option').each(function(){
|
||
|
$(this).remove();
|
||
|
});
|
||
|
|
||
|
var newOptions = [];
|
||
|
|
||
|
// When the update botton is clicked, loop through the capabilities list
|
||
|
// and copy the selected category id's to the category list on the right.
|
||
|
$('#newznab_cap').find(':selected').each(function(){
|
||
|
var selected_cat = $(this).val();
|
||
|
newOptions.push({text: selected_cat, value: selected_cat})
|
||
|
});
|
||
|
|
||
|
nnCat$.replaceOptions(newOptions);
|
||
|
|
||
|
var selectedProvider = $('#editANewznabProvider').find(':selected').val();
|
||
|
if ('addNewznab' == selectedProvider)
|
||
|
return;
|
||
|
|
||
|
var url = $('#newznab_url').val();
|
||
|
var key = $('#newznab_key').val();
|
||
|
|
||
|
var cat = nnCat$.find('option').map(function(i, opt){
|
||
|
return $(opt).text();
|
||
|
}).toArray().join(',');
|
||
|
|
||
|
nnCat$.find('option:not([value])').remove();
|
||
|
|
||
|
$(this).updateProvider(selectedProvider, url, key, cat);
|
||
|
});
|
||
|
|
||
|
|
||
|
$('#newznab_add').click(function(){
|
||
|
|
||
|
var name = $.trim($('#newznab_name').val());
|
||
|
var url = $.trim($('#newznab_url').val());
|
||
|
var key = $.trim($('#newznab_key').val());
|
||
|
|
||
|
var cat = $.trim($('#newznab_cat').find('option').map(function(i, opt){
|
||
|
return $(opt).text();}).toArray().join(','));
|
||
|
|
||
|
if (!name || !url || !key)
|
||
|
return;
|
||
|
|
||
|
// send to the form with ajax, get a return value
|
||
|
$.getJSON($.SickGear.Root + '/config/providers/can-add-newznab-provider', {name: name, url: url},
|
||
|
function(data){
|
||
|
if (data.error != undefined){
|
||
|
alert(data.error);
|
||
|
return;
|
||
|
}
|
||
|
$(this).addProvider(data.success, name, url, key, cat, 0);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
$('.newznab_delete').click(function(){
|
||
|
|
||
|
var selectedProvider = $('#editANewznabProvider').find(':selected').val();
|
||
|
$(this).deleteProvider(selectedProvider);
|
||
|
});
|
||
|
|
||
|
$('#torrentrss_add').click(function(){
|
||
|
|
||
|
var name = $('#torrentrss_name').val();
|
||
|
var url = $('#torrentrss_url').val();
|
||
|
var cookies = $('#torrentrss_cookies').val();
|
||
|
var params = { name: name, url: url, cookies: cookies};
|
||
|
|
||
|
// send to the form with ajax, get a return value
|
||
|
$.getJSON($.SickGear.Root + '/config/providers/can-add-torrent-rss-provider', params,
|
||
|
function(data){
|
||
|
if (data.error != undefined){
|
||
|
alert(data.error);
|
||
|
return;
|
||
|
}
|
||
|
$(this).addTorrentRssProvider(data.success, name, url, cookies);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
$('.torrentrss_delete').on('click', function(){
|
||
|
var selectedProvider = $('#editATorrentRssProvider').find(':selected').val();
|
||
|
$(this).deleteTorrentRssProvider(selectedProvider);
|
||
|
});
|
||
|
|
||
|
|
||
|
$(this).on('change', '[class="providerDiv_tip"] input', function(){
|
||
|
$('div .providerDiv ' + '[name=' + $(this).attr('name') + ']').replaceWith($(this).clone());
|
||
|
$('div .providerDiv ' + '[newznab_name=' + $(this).attr('id') + ']').replaceWith($(this).clone());
|
||
|
});
|
||
|
|
||
|
$(this).on('change', '[class="providerDiv_tip"] select', function(){
|
||
|
|
||
|
$(this).find('option').each(function(){
|
||
|
if ($(this).is(':selected')){
|
||
|
$(this).prop('defaultSelected', !0)
|
||
|
} else {
|
||
|
$(this).prop('defaultSelected', !1);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
$('div .providerDiv ' + '[name=' + $(this).attr('name') + ']').empty().replaceWith($(this).clone())});
|
||
|
|
||
|
$(this).on('change', '.enabler', function(){
|
||
|
if ($(this).is(':checked')){
|
||
|
$('.content_' + $(this).attr('id')).each(function(){
|
||
|
$(this).show()
|
||
|
})
|
||
|
} else {
|
||
|
$('.content_' + $(this).attr('id')).each(function(){
|
||
|
$(this).hide()
|
||
|
})
|
||
|
}
|
||
|
});
|
||
|
|
||
|
$('.enabler').each(function(){
|
||
|
if (!$(this).is(':checked')){
|
||
|
$('.content_' + $(this).attr('id')).hide();
|
||
|
} else {
|
||
|
$('.content_' + $(this).attr('id')).show();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
$.fn.makeTorrentOptionString = function(provider_id){
|
||
|
|
||
|
var seed_ratio = $('.providerDiv_tip #' + provider_id + '_seed_ratio').prop('value');
|
||
|
var seed_time = $('.providerDiv_tip #' + provider_id + '_seed_time').prop('value');
|
||
|
var process_met = $('.providerDiv_tip #' + provider_id + '_process_method').prop('value');
|
||
|
var option_string = $('.providerDiv_tip #' + provider_id + '_option_string');
|
||
|
|
||
|
option_string.val([seed_ratio, seed_time, process_met].join('|'))
|
||
|
};
|
||
|
|
||
|
$(this).on('change', '.seed_option', function(){
|
||
|
|
||
|
var provider_id = $(this).attr('id').split('_')[0];
|
||
|
|
||
|
$(this).makeTorrentOptionString(provider_id);
|
||
|
});
|
||
|
|
||
|
|
||
|
$.fn.replaceOptions = function(options){
|
||
|
|
||
|
var self, $option;
|
||
|
|
||
|
this.empty();
|
||
|
self = this;
|
||
|
|
||
|
$.each(options, function(index, option){
|
||
|
$option = $('<option></option>')
|
||
|
.val(option.value)
|
||
|
.text(option.text);
|
||
|
self.append($option);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// initialization stuff
|
||
|
//
|
||
|
$.fn.newznabProvidersCapabilities = [];
|
||
|
|
||
|
$(this).showHideProviders();
|
||
|
|
||
|
var providers$ = $('#provider_order_list');
|
||
|
|
||
|
providers$.sortable({
|
||
|
placeholder: 'ui-state-highlight',
|
||
|
update: function(event, ui){
|
||
|
$(this).refreshProviderList();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
providers$.disableSelection();
|
||
|
|
||
|
});
|