| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /* global colorParser messageBox makeLink */
- 'use strict';
- function configDialog(style) {
- const form = buildConfigForm();
- return messageBox({
- title: `${style.name} v${style.usercssData.version}`,
- className: 'config-dialog',
- contents: [
- $element({
- className: 'config-heading',
- appendChild: style.usercssData.supportURL && makeLink({
- className: 'external-support',
- href: style.usercssData.supportURL,
- textContent: t('externalFeedback')
- })
- }),
- $element({
- className: 'config-body',
- appendChild: form.elements
- })
- ],
- buttons: [
- t('confirmSave'),
- {
- textContent: t('confirmDefault'),
- onclick: form.useDefault
- },
- t('confirmCancel')
- ]
- }).then(result => {
- if (result.button !== 0 && !result.enter) {
- return;
- }
- return form.getVars();
- });
- function buildConfigForm() {
- const labels = [];
- const vars = deepCopy(style.usercssData.vars);
- for (const key of Object.keys(vars)) {
- const va = vars[key];
- let appendChild;
- switch (va.type) {
- case 'color':
- va.inputColor = $element({tag: 'input', type: 'color'});
- va.inputAlpha = $element({
- tag: 'input',
- type: 'range',
- min: 0,
- max: 1,
- title: chrome.i18n.getMessage('alphaChannel'),
- step: 'any'
- });
- va.inputColor.onchange = va.inputAlpha.oninput = () => {
- va.dirty = true;
- const color = colorParser.parse(va.inputColor.value);
- color.a = Number(va.inputAlpha.value);
- va.value = colorParser.format(color);
- va.inputColor.style.opacity = color.a;
- };
- appendChild = [
- $element({appendChild: [va.inputColor, va.inputAlpha]})
- ];
- break;
- case 'checkbox':
- va.input = $element({tag: 'input', type: 'checkbox'});
- va.input.onchange = () => {
- va.dirty = true;
- va.value = String(Number(va.input.checked));
- };
- appendChild = [
- $element({tag: 'span', className: 'onoffswitch', appendChild: [
- va.input,
- $element({tag: 'span'})
- ]})
- ];
- break;
- case 'select':
- case 'dropdown':
- case 'image':
- // TODO: a image picker input?
- va.input = $element({
- tag: 'select',
- appendChild: va.options.map(o => $element({
- tag: 'option', value: o.name, textContent: o.label
- }))
- });
- va.input.onchange = () => {
- va.dirty = true;
- va.value = va.input.value;
- };
- appendChild = [va.input];
- break;
- default:
- va.input = $element({tag: 'input', type: 'text'});
- va.input.oninput = () => {
- va.dirty = true;
- va.value = va.input.value;
- };
- appendChild = [va.input];
- break;
- }
- appendChild.unshift($element({tag: 'span', appendChild: va.label}));
- labels.push($element({
- tag: 'label',
- className: `config-${va.type}`,
- appendChild
- }));
- }
- drawValues();
- function drawValues() {
- for (const key of Object.keys(vars)) {
- const va = vars[key];
- const value = va.value === null || va.value === undefined ?
- va.default : va.value;
- if (va.type === 'color') {
- const color = colorParser.parse(value);
- va.inputAlpha.value = color.a;
- va.inputColor.style.opacity = color.a;
- delete color.a;
- va.inputColor.value = colorParser.formatHex(color);
- } else if (va.type === 'checkbox') {
- va.input.checked = Number(value);
- } else {
- va.input.value = value;
- }
- }
- }
- function useDefault() {
- for (const key of Object.keys(vars)) {
- const va = vars[key];
- va.dirty = va.value !== null && va.value !== undefined && va.value !== va.default;
- va.value = null;
- }
- drawValues();
- }
- function getVars() {
- return vars;
- }
- return {
- elements: labels,
- useDefault,
- getVars
- };
- }
- }
|