autosize textareas in style settings (#1360)

This commit is contained in:
tophf 2021-12-07 14:43:21 +03:00 committed by GitHub
parent 9d1243073b
commit 9ab5369393
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 13 deletions

View File

@ -471,11 +471,11 @@
</div> </div>
<label class="form-group style-include"> <label class="form-group style-include">
<span class="form-label" i18n-text="styleIncludeLabel"></span> <span class="form-label" i18n-text="styleIncludeLabel"></span>
<textarea></textarea> <textarea spellcheck="false" placeholder="*://site1.com/*&#10;*://site2.com/*"></textarea>
</label> </label>
<label class="form-group style-exclude"> <label class="form-group style-exclude">
<span class="form-label" i18n-text="styleExcludeLabel"></span> <span class="form-label" i18n-text="styleExcludeLabel"></span>
<textarea></textarea> <textarea spellcheck="false" placeholder="*://site1.com/*&#10;*://site2.com/*"></textarea>
</label> </label>
<!-- <label class="style-always-important"> <!-- <label class="style-always-important">
<input type="checkbox"> <input type="checkbox">

View File

@ -39,7 +39,8 @@
[disabled] .radio-label { [disabled] .radio-label {
opacity: 0.4; opacity: 0.4;
} }
.style-include textarea, .style-settings textarea {
.style-exclude textarea { resize: vertical;
height: 12em; min-height: 2.5em;
max-height: 50vh;
} }

View File

@ -1,4 +1,5 @@
/* global API */ /* global $ $$ */// dom.js
/* global API */// msg.js
/* exported StyleSettings */ /* exported StyleSettings */
'use strict'; 'use strict';
@ -10,10 +11,10 @@ function StyleSettings(editor) {
e => API.styles.config(style.id, 'updateUrl', e.target.value)), e => API.styles.config(style.id, 'updateUrl', e.target.value)),
createRadio('.style-prefer-scheme input', () => style.preferScheme || 'none', createRadio('.style-prefer-scheme input', () => style.preferScheme || 'none',
e => API.styles.config(style.id, 'preferScheme', e.target.value)), e => API.styles.config(style.id, 'preferScheme', e.target.value)),
createInput('.style-include textarea', () => (style.inclusions || []).join('\n'), ...[
e => API.styles.config(style.id, 'inclusions', textToList(e.target.value))), ['.style-include', 'inclusions'],
createInput('.style-exclude textarea', () => (style.exclusions || []).join('\n'), ['.style-exclude', 'exclusions'],
e => API.styles.config(style.id, 'exclusions', textToList(e.target.value))), ].map(createArea),
]; ];
update(style); update(style);
@ -29,12 +30,30 @@ function StyleSettings(editor) {
if (!newStyle.id) return; if (!newStyle.id) return;
if (reason === 'editSave' || reason === 'config') return; if (reason === 'editSave' || reason === 'config') return;
style = newStyle; style = newStyle;
document.querySelector('.style-settings').disabled = false; $('.style-settings').disabled = false;
inputs.forEach(i => i.update()); inputs.forEach(i => i.update());
} }
function createArea([parentSel, type]) {
const sel = parentSel + ' textarea';
const el = $(sel);
el.on('input', () => {
const val = el.value;
el.rows = val.match(/^/gm).length + !val.endsWith('\n');
});
return createInput(sel,
() => {
const list = style[type] || [];
const text = list.join('\n');
el.rows = (list.length || 1) + 1;
return text;
},
() => API.styles.config(style.id, type, textToList(el.value))
);
}
function createRadio(selector, getter, setter) { function createRadio(selector, getter, setter) {
const els = document.querySelectorAll(selector); const els = $$(selector);
for (const el of els) { for (const el of els) {
el.addEventListener('change', e => { el.addEventListener('change', e => {
if (el.checked) { if (el.checked) {
@ -54,7 +73,7 @@ function StyleSettings(editor) {
} }
function createInput(selector, getter, setter) { function createInput(selector, getter, setter) {
const el = document.querySelector(selector); const el = $(selector);
el.addEventListener('change', setter); el.addEventListener('change', setter);
return { return {
update() { update() {