You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
inav-configurator/js/settings.js

112 lines
4.2 KiB
JavaScript

'use strict';
var Settings = (function () {
let self = {};
self.configureInputs = function() {
var inputs = [];
$('[data-setting!=""][data-setting]').each(function() {
inputs.push($(this));
});
return Promise.mapSeries(inputs, function (input, ii) {
var settingName = input.data('setting');
return mspHelper.getSetting(settingName).then(function (s) {
// Check if the input declares a parent
// to be hidden in case of the setting not being available.
// Otherwise, default to hiding its parent
var parent = input.parents('.setting-container:first');
if (parent.length == 0) {
parent = input.parent();
}
if (!s) {
// Setting doesn't exist.
input.val(null);
parent.hide();
return;
}
parent.show();
if (input.prop('tagName') == 'SELECT' || s.setting.table) {
if (input.attr('type') == 'checkbox') {
input.prop('checked', s.value > 0);
} else {
input.empty();
for (var ii = s.setting.min; ii <= s.setting.max; ii++) {
var name = (s.setting.table ? s.setting.table.values[ii] : null);
if (name) {
var localizedName = chrome.i18n.getMessage(name);
if (localizedName) {
name = localizedName;
}
} else {
// Fallback to the number itself
name = ii;
}
var option = $('<option/>').attr('value', ii).text(name);
if (ii == s.value) {
option.prop('selected', true);
}
option.appendTo(input);
}
}
} else if (s.setting.type == 'string') {
input.val(s.value);
} else {
var multiplier = parseFloat(input.data('setting-multiplier') || 1);
input.attr('type', 'number');
input.attr('step', 1 / multiplier);
input.attr('min', s.setting.min / multiplier);
input.attr('max', s.setting.max / multiplier);
input.val((s.value / multiplier).toFixed(Math.log10(multiplier)));
}
input.data('setting-info', s.setting);
if (input.data('live')) {
input.change(function() {
self.saveInput(input);
});
}
});
});
};
self.saveInput = function(input) {
var settingName = input.data('setting');
var setting = input.data('setting-info');
var value;
if (setting.table) {
if (input.attr('type') == 'checkbox') {
value = input.prop('checked') ? 1 : 0;
} else {
value = parseInt(input.val());
}
} else if(setting.type == 'string') {
value = input.val();
} else {
var multiplier = parseFloat(input.data('setting-multiplier') || 1);
value = parseFloat(input.val()) * multiplier;
}
return mspHelper.setSetting(settingName, value);
};
self.saveInputs = function() {
var inputs = [];
$('[data-setting!=""][data-setting]').each(function() {
inputs.push($(this));
});
return Promise.mapSeries(inputs, function (input, ii) {
return self.saveInput(input);
});
};
self.processHtml = function(callback) {
return function() {
self.configureInputs().then(callback);
};
};
self.getInputValue = function(settingName) {
return $('[data-setting="' + settingName + '"]').val();
};
return self;
})();