show config for usercss vars in installer (#1302)
* simplify messageBox code * also bind events correctly in case messageBox is called when a messageBox was already shown
This commit is contained in:
parent
91324a4a48
commit
50717465b9
|
@ -35,6 +35,9 @@
|
|||
<div class="actions">
|
||||
<h2 class="installed" i18n-text="installButtonInstalled"></h2>
|
||||
<button class="install" i18n-text="installButton"></button>
|
||||
<a class="configure-usercss" i18n-title="configureStyle" tabindex="0">
|
||||
<svg class="svg-icon config"><use xlink:href="#svg-icon-config"></use></svg>
|
||||
</a>
|
||||
<p id="live-reload-install-hint" hidden></p>
|
||||
<label class="set-update-url">
|
||||
<input type="checkbox">
|
||||
|
@ -74,6 +77,12 @@
|
|||
<symbol id="svg-icon-checked" viewBox="0 0 1000 1000">
|
||||
<path fill-rule="evenodd" d="M983.2,184.3L853,69.8c-4-3.5-9.3-5.3-14.5-5c-5.3,0.4-10.3,2.8-13.8,6.8L352.3,609.2L184.4,386.9c-3.2-4.2-8-7-13.2-7.8c-5.3-0.8-10.6,0.6-14.9,3.9L18,487.5c-8.8,6.7-10.6,19.3-3.9,28.1L325,927.2c3.6,4.8,9.3,7.7,15.3,8c0.2,0,0.5,0,0.7,0c5.8,0,11.3-2.5,15.1-6.8L985,212.6C992.3,204.3,991.5,191.6,983.2,184.3z"/>
|
||||
</symbol>
|
||||
<symbol id="svg-icon-select-arrow" viewBox="0 0 1792 1792">
|
||||
<path fill-rule="evenodd" d="M1408 704q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45z"/>
|
||||
</symbol>
|
||||
<symbol id="svg-icon-config" viewBox="0 0 16 16">
|
||||
<path d="M13.3,12.8l1.5-2.6l-2.2-1.5c0-0.2,0.1-0.5,0.1-0.7c0-0.2,0-0.5-0.1-0.7l2.2-1.5l-1.5-2.6l-2.4,1.2 c-0.4-0.3-0.8-0.5-1.2-0.7L9.5,1h-3L6.3,3.7C5.9,3.8,5.5,4.1,5.1,4.4L2.7,3.2L1.2,5.8l2.2,1.5c0,0.2-0.1,0.5-0.1,0.7 c0,0.2,0,0.5,0.1,0.7l-2.2,1.5l1.5,2.6l2.4-1.2c0.4,0.3,0.8,0.5,1.2,0.7L6.5,15h3l0.2-2.7c0.4-0.2,0.8-0.4,1.2-0.7L13.3,12.8z M8,10.3c-1.3,0-2.3-1-2.3-2.3c0-1.3,1-2.3,2.3-2.3c1.3,0,2.3,1,2.3,2.3C10.3,9.3,9.3,10.3,8,10.3z"/>
|
||||
</symbol>
|
||||
</svg>
|
||||
|
||||
<script src="js/dlg/message-box.js"></script>
|
||||
|
|
|
@ -305,6 +305,20 @@ label {
|
|||
animation: none;
|
||||
}
|
||||
|
||||
.configure-usercss .svg-icon.config {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
margin-top: -3px;
|
||||
}
|
||||
#message-box.config-dialog {
|
||||
width: 0;
|
||||
height: 0;
|
||||
background: none;
|
||||
}
|
||||
#message-box.config-dialog > div {
|
||||
box-shadow: 5px 5px 50px rgba(0, 0, 0, 0.75); /* copied from message-box.css + darkened the color */
|
||||
}
|
||||
|
||||
/************ reponsive layouts ************/
|
||||
|
||||
@media (max-width: 850px) {
|
||||
|
@ -417,6 +431,10 @@ label {
|
|||
flex-shrink: 0;
|
||||
margin-right: 1em;
|
||||
}
|
||||
#message-box.config-dialog > div {
|
||||
top: auto;
|
||||
bottom: 3rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Retina-specific stuff here */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* global $ $create $createLink $$remove */
|
||||
/* global $ $create $createLink $$remove showSpinner */// dom.js
|
||||
/* global API */// msg.js
|
||||
/* global closeCurrentTab */// toolbox.js
|
||||
/* global closeCurrentTab deepEqual */// toolbox.js
|
||||
/* global messageBox */
|
||||
/* global prefs */
|
||||
/* global preinit */
|
||||
|
@ -13,20 +13,16 @@ let installed;
|
|||
let installedDup;
|
||||
let liveReload;
|
||||
let tabId;
|
||||
let vars;
|
||||
|
||||
// "History back" in Firefox (for now) restores the old DOM including the messagebox,
|
||||
// which stays after installing since we don't want to wait for the fadeout animation before resolving.
|
||||
document.on('visibilitychange', () => {
|
||||
if (messageBox.element) messageBox.element.remove();
|
||||
$$remove('#message-box:not(.config-dialog)');
|
||||
if (installed) liveReload.onToggled();
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
if (!cm) {
|
||||
$('#header').appendChild($create('.lds-spinner',
|
||||
new Array(12).fill($create('div')).map(e => e.cloneNode())));
|
||||
}
|
||||
}, 200);
|
||||
setTimeout(() => !cm && showSpinner($('#header')), 200);
|
||||
|
||||
/*
|
||||
* Preinit starts to download as early as possible,
|
||||
|
@ -187,11 +183,29 @@ function updateMeta(style, dup = installedDup) {
|
|||
$('.external-link').appendChild(externalLink);
|
||||
}
|
||||
|
||||
Object.assign($('.configure-usercss'), {
|
||||
hidden: !data.vars,
|
||||
onclick: openConfigDialog,
|
||||
});
|
||||
if (!data.vars) {
|
||||
$$remove('#message-box.config-dialog');
|
||||
} else if (!deepEqual(data.vars, vars)) {
|
||||
vars = data.vars;
|
||||
// Use the user-customized vars from the installed style
|
||||
for (const [dk, dv] of Object.entries(dup && dupData.vars || {})) {
|
||||
const v = vars[dk];
|
||||
if (v && v.type === dv.type) {
|
||||
v.value = dv.value;
|
||||
}
|
||||
}
|
||||
openConfigDialog();
|
||||
}
|
||||
|
||||
$('#header').dataset.arrivedFast = performance.now() < 500;
|
||||
$('#header').classList.add('meta-init');
|
||||
$('#header').classList.remove('meta-init-error');
|
||||
setTimeout(() => $$remove('.lds-spinner'), 1000);
|
||||
|
||||
setTimeout(() => $$remove('.lds-spinner'), 1000);
|
||||
showError('');
|
||||
requestAnimationFrame(adjustCodeHeight);
|
||||
|
||||
|
@ -233,6 +247,11 @@ function updateMeta(style, dup = installedDup) {
|
|||
)),
|
||||
]));
|
||||
}
|
||||
|
||||
async function openConfigDialog() {
|
||||
await require(['/js/dlg/config-dialog']); /* global configDialog */
|
||||
configDialog(style);
|
||||
}
|
||||
}
|
||||
|
||||
function showError(err) {
|
||||
|
|
|
@ -2,12 +2,12 @@
|
|||
--onoffswitch-width: 60px;
|
||||
}
|
||||
|
||||
#stylus-manage .config-dialog #message-box-contents {
|
||||
padding: 2em 16px;
|
||||
.config-dialog {
|
||||
--pad: 16px;
|
||||
}
|
||||
|
||||
#stylus-popup .config-dialog #message-box-contents {
|
||||
padding: 8px 16px;
|
||||
.config-dialog #message-box-contents {
|
||||
padding: var(--pad);
|
||||
}
|
||||
|
||||
#stylus-popup .config-dialog > div {
|
||||
|
@ -33,7 +33,7 @@
|
|||
display: flex;
|
||||
padding: .75em 0;
|
||||
align-items: center;
|
||||
margin-right: -16px; /* for .config-reset-icon */
|
||||
margin-right: calc(-1 * var(--pad)); /* for .config-reset-icon */
|
||||
}
|
||||
|
||||
.config-body .select-resizer {
|
||||
|
@ -120,14 +120,14 @@
|
|||
}
|
||||
|
||||
.config-reset-icon {
|
||||
height: 16px;
|
||||
height: var(--pad);
|
||||
}
|
||||
|
||||
.config-reset-icon .svg-icon {
|
||||
cursor: pointer;
|
||||
fill: #aaa;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
width: var(--pad);
|
||||
height: var(--pad);
|
||||
padding: 0 1px;
|
||||
box-sizing: border-box;
|
||||
flex-shrink: 0;
|
||||
|
@ -139,7 +139,7 @@
|
|||
|
||||
#config-autosave-wrapper {
|
||||
position: relative;
|
||||
padding: 0 0 0 16px;
|
||||
padding: 0 0 0 var(--pad);
|
||||
display: inline-flex;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,8 +28,9 @@ async function configDialog(style) {
|
|||
let varsInitial = getInitialValues(varsHash);
|
||||
|
||||
const elements = [];
|
||||
const colorpicker = window.colorpicker();
|
||||
const isPopup = location.href.includes('popup.html');
|
||||
const isInstaller = location.pathname.startsWith('/install-usercss.html');
|
||||
const isPopup = location.pathname.startsWith('/popup.html');
|
||||
const colorpicker = ((window.CodeMirror || {}).prototype || window).colorpicker();
|
||||
const buttons = {};
|
||||
|
||||
buildConfigForm();
|
||||
|
@ -122,7 +123,7 @@ async function configDialog(style) {
|
|||
buttons.close.textContent = t(someDirty ? 'confirmCancel' : 'confirmClose');
|
||||
}
|
||||
|
||||
async function save({anyChangeIsDirty = false} = {}, bgStyle) {
|
||||
async function save({anyChangeIsDirty = false} = {}) {
|
||||
for (let delay = 1; saving && delay < 1000; delay *= 2) {
|
||||
await new Promise(resolve => setTimeout(resolve, delay));
|
||||
}
|
||||
|
@ -132,15 +133,13 @@ async function configDialog(style) {
|
|||
if (!vars.some(va => va.dirty || anyChangeIsDirty && va.value !== va.savedValue)) {
|
||||
return;
|
||||
}
|
||||
if (!bgStyle) {
|
||||
bgStyle = await API.styles.get(style.id).catch(() => ({}));
|
||||
}
|
||||
const bgStyle = !isInstaller && await API.styles.get(style.id).catch(() => ({}));
|
||||
style = style.sections ? Object.assign({}, style) : style;
|
||||
style.enabled = true;
|
||||
style.sourceCode = null;
|
||||
style.sections = null;
|
||||
const styleVars = style.usercssData.vars;
|
||||
const bgVars = (bgStyle.usercssData || {}).vars || {};
|
||||
const bgVars = isInstaller ? styleVars : (bgStyle.usercssData || {}).vars || {};
|
||||
const invalid = [];
|
||||
let numValid = 0;
|
||||
for (const va of vars) {
|
||||
|
@ -184,7 +183,7 @@ async function configDialog(style) {
|
|||
}
|
||||
saving = true;
|
||||
try {
|
||||
const newVars = await API.usercss.configVars(style.id, style.usercssData.vars);
|
||||
const newVars = isInstaller ? styleVars : await API.usercss.configVars(style.id, styleVars);
|
||||
varsInitial = getInitialValues(newVars);
|
||||
vars.forEach(va => onchange({target: va.input, justSaved: true}));
|
||||
renderValues();
|
||||
|
|
|
@ -40,10 +40,9 @@ messageBox.show = async ({
|
|||
}) => {
|
||||
await require(['/js/dlg/message-box.css']);
|
||||
if (!messageBox.listeners) initOwnListeners();
|
||||
bindGlobalListeners();
|
||||
createElement();
|
||||
bindGlobalListeners();
|
||||
document.body.appendChild(messageBox.element);
|
||||
bindElementLiseners();
|
||||
|
||||
messageBox._originalFocus = document.activeElement;
|
||||
// focus the first focusable child but skip the first external link which is usually `feedback`
|
||||
|
@ -132,15 +131,9 @@ messageBox.show = async ({
|
|||
listening = false;
|
||||
},
|
||||
mouseMove(event) {
|
||||
const x = clamp(event.clientX, 30, innerWidth - 30) - clickX;
|
||||
const y = clamp(event.clientY, 30, innerHeight - 30) - clickY;
|
||||
|
||||
offsetX = x;
|
||||
offsetY = y;
|
||||
|
||||
$('#message-box > div').style.transform =
|
||||
`translateX(${x}px)
|
||||
translateY(${y}px)`;
|
||||
offsetX = clamp(event.clientX, 30, innerWidth - 30) - clickX;
|
||||
offsetY = clamp(event.clientY, 30, innerHeight - 30) - clickY;
|
||||
messageBox.element.firstChild.style.transform = `translate(${offsetX}px,${offsetY}px)`;
|
||||
},
|
||||
};
|
||||
}
|
||||
|
@ -164,7 +157,7 @@ messageBox.show = async ({
|
|||
messageBox.element =
|
||||
$create({id, className}, [
|
||||
$create([
|
||||
$create(`#${id}-title`, title),
|
||||
$create(`#${id}-title`, {onmousedown: messageBox.listeners.mouseDown}, title),
|
||||
$create(`#${id}-close-icon`, {onclick: messageBox.listeners.closeIcon},
|
||||
$create('SVG:svg.svg-icon', {viewBox: '0 0 20 20'},
|
||||
$create('SVG:path', {d: 'M11.69,10l4.55,4.55-1.69,1.69L10,11.69,' +
|
||||
|
@ -191,16 +184,11 @@ messageBox.show = async ({
|
|||
window.on('keydown', messageBox.listeners.key, true);
|
||||
}
|
||||
|
||||
function bindElementLiseners() {
|
||||
$('#message-box-title').on('mousedown', messageBox.listeners.mouseDown, {passive: true});
|
||||
}
|
||||
|
||||
function unbindGlobalListeners() {
|
||||
window.off('keydown', messageBox.listeners.key, true);
|
||||
window.off('scroll', messageBox.listeners.scroll);
|
||||
window.off('mouseup', messageBox.listeners.mouseUp);
|
||||
window.off('mousemove', messageBox.listeners.mouseMove);
|
||||
$('#message-box-title').off('mousedown', messageBox.listeners.mouseDown);
|
||||
}
|
||||
|
||||
function removeSelf() {
|
||||
|
|
Loading…
Reference in New Issue
Block a user