snappymail/dev/Common/Globals.js

80 lines
2 KiB
JavaScript
Raw Normal View History

2016-06-07 05:57:52 +08:00
import ko from 'ko';
2022-03-07 20:47:03 +08:00
let keyScopeFake = 'all';
2021-08-20 21:40:07 +08:00
export const
ScopeMenu = 'Menu',
2021-08-20 21:40:07 +08:00
doc = document,
2016-06-07 05:57:52 +08:00
2021-08-20 21:40:07 +08:00
$htmlCL = doc.documentElement.classList,
2021-08-20 21:40:07 +08:00
elementById = id => doc.getElementById(id),
2016-06-07 05:57:52 +08:00
2023-02-20 22:47:46 +08:00
appEl = elementById('rl-app'),
2021-08-20 21:40:07 +08:00
Settings = rl.settings,
SettingsGet = Settings.get,
2024-03-07 08:16:58 +08:00
SettingsAdmin = name => (SettingsGet('Admin') || {})[name],
2022-04-25 15:57:32 +08:00
SettingsCapa = name => name && !!(SettingsGet('Capa') || {})[name],
2016-06-07 05:57:52 +08:00
2022-03-08 17:52:08 +08:00
dropdowns = [],
2021-08-20 21:40:07 +08:00
dropdownVisibility = ko.observable(false).extend({ rateLimit: 0 }),
2021-08-20 21:40:07 +08:00
leftPanelDisabled = ko.observable(false),
toggleLeftPanel = () => leftPanelDisabled(!leftPanelDisabled()),
2021-08-20 21:40:07 +08:00
createElement = (name, attr) => {
let el = doc.createElement(name);
attr && Object.entries(attr).forEach(([k,v]) => el.setAttribute(k,v));
return el;
},
2017-02-09 01:48:53 +08:00
fireEvent = (name, detail, cancelable) => dispatchEvent(
new CustomEvent(name, {detail:detail, cancelable: !!cancelable})
),
2023-02-21 21:26:37 +08:00
stopEvent = event => {
event.preventDefault();
event.stopPropagation();
},
2022-09-02 17:52:07 +08:00
formFieldFocused = () => doc.activeElement?.matches('input,textarea'),
addShortcut = (...args) => shortcuts.add(...args),
registerShortcut = (keys, modifiers, scopes, method) =>
addShortcut(keys, modifiers, scopes, event => formFieldFocused() ? true : method(event)),
addEventsListener = (element, events, fn, options) =>
events.forEach(event => element.addEventListener(event, fn, options)),
addEventsListeners = (element, events) =>
Object.entries(events).forEach(([event, fn]) => element.addEventListener(event, fn)),
2022-03-07 20:47:03 +08:00
// keys / shortcuts
keyScopeReal = ko.observable('all'),
2021-08-20 21:40:07 +08:00
keyScope = value => {
2022-03-07 20:47:03 +08:00
if (!value) {
return keyScopeFake;
}
2022-03-07 20:47:03 +08:00
if (ScopeMenu !== value) {
keyScopeFake = value;
if (dropdownVisibility()) {
value = ScopeMenu;
}
}
keyScopeReal(value);
shortcuts.setScope(value);
};
2021-08-20 21:40:07 +08:00
dropdownVisibility.subscribe(value => {
if (value) {
keyScope(ScopeMenu);
} else if (ScopeMenu === shortcuts.getScope()) {
2021-08-20 21:40:07 +08:00
keyScope(keyScopeFake);
}
});
leftPanelDisabled.subscribe(value => $htmlCL.toggle('rl-left-panel-disabled', value));