config-dialog.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /* global colorParser messageBox makeLink */
  2. 'use strict';
  3. function configDialog(style) {
  4. const form = buildConfigForm();
  5. return messageBox({
  6. title: `${style.name} v${style.usercssData.version}`,
  7. className: 'config-dialog',
  8. contents: [
  9. $element({
  10. className: 'config-heading',
  11. appendChild: style.usercssData.supportURL && makeLink({
  12. className: 'external-support',
  13. href: style.usercssData.supportURL,
  14. textContent: t('externalFeedback')
  15. })
  16. }),
  17. $element({
  18. className: 'config-body',
  19. appendChild: form.elements
  20. })
  21. ],
  22. buttons: [
  23. t('confirmSave'),
  24. {
  25. textContent: t('confirmDefault'),
  26. onclick: form.useDefault
  27. },
  28. t('confirmCancel')
  29. ]
  30. }).then(result => {
  31. if (result.button !== 0 && !result.enter) {
  32. return;
  33. }
  34. return form.getVars();
  35. });
  36. function buildConfigForm() {
  37. const labels = [];
  38. const vars = deepCopy(style.usercssData.vars);
  39. for (const key of Object.keys(vars)) {
  40. const va = vars[key];
  41. let appendChild;
  42. switch (va.type) {
  43. case 'color':
  44. va.inputColor = $element({tag: 'input', type: 'color'});
  45. va.inputAlpha = $element({
  46. tag: 'input',
  47. type: 'range',
  48. min: 0,
  49. max: 1,
  50. title: chrome.i18n.getMessage('alphaChannel'),
  51. step: 'any'
  52. });
  53. va.inputColor.onchange = va.inputAlpha.oninput = () => {
  54. va.dirty = true;
  55. const color = colorParser.parse(va.inputColor.value);
  56. color.a = Number(va.inputAlpha.value);
  57. va.value = colorParser.format(color);
  58. va.inputColor.style.opacity = color.a;
  59. };
  60. appendChild = [
  61. $element({appendChild: [va.inputColor, va.inputAlpha]})
  62. ];
  63. break;
  64. case 'checkbox':
  65. va.input = $element({tag: 'input', type: 'checkbox'});
  66. va.input.onchange = () => {
  67. va.dirty = true;
  68. va.value = String(Number(va.input.checked));
  69. };
  70. appendChild = [
  71. $element({tag: 'span', className: 'onoffswitch', appendChild: [
  72. va.input,
  73. $element({tag: 'span'})
  74. ]})
  75. ];
  76. break;
  77. case 'select':
  78. case 'dropdown':
  79. case 'image':
  80. // TODO: a image picker input?
  81. va.input = $element({
  82. tag: 'select',
  83. appendChild: va.options.map(o => $element({
  84. tag: 'option', value: o.name, textContent: o.label
  85. }))
  86. });
  87. va.input.onchange = () => {
  88. va.dirty = true;
  89. va.value = va.input.value;
  90. };
  91. appendChild = [va.input];
  92. break;
  93. default:
  94. va.input = $element({tag: 'input', type: 'text'});
  95. va.input.oninput = () => {
  96. va.dirty = true;
  97. va.value = va.input.value;
  98. };
  99. appendChild = [va.input];
  100. break;
  101. }
  102. appendChild.unshift($element({tag: 'span', appendChild: va.label}));
  103. labels.push($element({
  104. tag: 'label',
  105. className: `config-${va.type}`,
  106. appendChild
  107. }));
  108. }
  109. drawValues();
  110. function drawValues() {
  111. for (const key of Object.keys(vars)) {
  112. const va = vars[key];
  113. const value = va.value === null || va.value === undefined ?
  114. va.default : va.value;
  115. if (va.type === 'color') {
  116. const color = colorParser.parse(value);
  117. va.inputAlpha.value = color.a;
  118. va.inputColor.style.opacity = color.a;
  119. delete color.a;
  120. va.inputColor.value = colorParser.formatHex(color);
  121. } else if (va.type === 'checkbox') {
  122. va.input.checked = Number(value);
  123. } else {
  124. va.input.value = value;
  125. }
  126. }
  127. }
  128. function useDefault() {
  129. for (const key of Object.keys(vars)) {
  130. const va = vars[key];
  131. va.dirty = va.value !== null && va.value !== undefined && va.value !== va.default;
  132. va.value = null;
  133. }
  134. drawValues();
  135. }
  136. function getVars() {
  137. return vars;
  138. }
  139. return {
  140. elements: labels,
  141. useDefault,
  142. getVars
  143. };
  144. }
  145. }