Allow cancelable on some custom javascript events.

This commit is contained in:
the-djmaze 2022-04-29 13:07:49 +02:00
parent 9f2c06bcd3
commit 80eed213d9
5 changed files with 57 additions and 46 deletions

View file

@ -27,7 +27,9 @@ export const
return el; return el;
}, },
fireEvent = (name, detail) => dispatchEvent(new CustomEvent(name, {detail:detail})), fireEvent = (name, detail, cancelable) => dispatchEvent(
new CustomEvent(name, {detail:detail, cancelable: !!cancelable})
),
formFieldFocused = () => doc.activeElement && doc.activeElement.matches('input,textarea'), formFieldFocused = () => doc.activeElement && doc.activeElement.matches('input,textarea'),

View file

@ -173,59 +173,62 @@ const
screenName = defaultScreenName; screenName = defaultScreenName;
} }
// Close all popups if (fireEvent('sm-show-screen', screenName, 1)) {
for (let vm of visiblePopups) {
false === vm.onClose() || vm.close();
}
if (screenName) { // Close all popups
vmScreen = screen(screenName); for (let vm of visiblePopups) {
if (!vmScreen) { false === vm.onClose() || vm.close();
vmScreen = screen(defaultScreenName);
if (vmScreen) {
subPart = screenName + '/' + subPart;
screenName = defaultScreenName;
}
} }
if (vmScreen && vmScreen.__started) { if (screenName) {
isSameScreen = currentScreen && vmScreen === currentScreen; vmScreen = screen(screenName);
if (!vmScreen) {
if (!vmScreen.__builded) { vmScreen = screen(defaultScreenName);
vmScreen.__builded = true; if (vmScreen) {
subPart = screenName + '/' + subPart;
vmScreen.viewModels.forEach(ViewModelClass => screenName = defaultScreenName;
buildViewModel(ViewModelClass, vmScreen) }
);
vmScreen.onBuild && vmScreen.onBuild();
} }
setTimeout(() => { if (vmScreen && vmScreen.__started) {
// hide screen isSameScreen = currentScreen && vmScreen === currentScreen;
if (currentScreen && !isSameScreen) {
hideScreen(currentScreen); if (!vmScreen.__builded) {
vmScreen.__builded = true;
vmScreen.viewModels.forEach(ViewModelClass =>
buildViewModel(ViewModelClass, vmScreen)
);
vmScreen.onBuild && vmScreen.onBuild();
} }
// --
currentScreen = vmScreen; setTimeout(() => {
// hide screen
if (currentScreen && !isSameScreen) {
hideScreen(currentScreen);
}
// --
// show screen currentScreen = vmScreen;
if (!isSameScreen) {
vmScreen.onShow && vmScreen.onShow();
forEachViewModel(vmScreen, (vm, dom) => { // show screen
vm.beforeShow && vm.beforeShow(); if (!isSameScreen) {
i18nToNodes(dom); vmScreen.onShow && vmScreen.onShow();
dom.hidden = false;
vm.onShow && vm.onShow();
autofocus(dom);
});
}
// --
vmScreen.__cross && vmScreen.__cross.parse(subPart); forEachViewModel(vmScreen, (vm, dom) => {
}, 1); vm.beforeShow && vm.beforeShow();
i18nToNodes(dom);
dom.hidden = false;
vm.onShow && vm.onShow();
autofocus(dom);
});
}
// --
vmScreen.__cross && vmScreen.__cross.parse(subPart);
}, 1);
}
} }
} }
}; };

View file

@ -35,7 +35,7 @@ export class AdminLoginView extends AbstractViewLogin {
submitCommand(self, event) { submitCommand(self, event) {
let form = event.target.form, let form = event.target.form,
data = new FormData(form), data = new FormData(form),
valid = form.reportValidity() && fireEvent('sm-admin-login', data); valid = form.reportValidity() && fireEvent('sm-admin-login', data, 1);
this.loginError(!this.login()); this.loginError(!this.login());
this.passwordError(!this.password()); this.passwordError(!this.password());

View file

@ -90,7 +90,7 @@ export class LoginUserView extends AbstractViewLogin {
submitCommand(self, event) { submitCommand(self, event) {
let form = event.target.form, let form = event.target.form,
data = new FormData(form), data = new FormData(form),
valid = form.reportValidity() && fireEvent('sm-user-login', data); valid = form.reportValidity() && fireEvent('sm-user-login', data, 1);
this.emailError(!this.email()); this.emailError(!this.email());
this.passwordError(!this.password()); this.passwordError(!this.password());

View file

@ -383,9 +383,15 @@ $Plugin->addHook('hook.name', 'functionName');
### sm-admin-login ### sm-admin-login
event.detail = FormData event.detail = FormData
cancelable using preventDefault()
### sm-admin-login-response ### sm-admin-login-response
event.detail = { error: int, data: {JSON response} } event.detail = { error: int, data: {JSON response} }
### sm-user-login ### sm-user-login
event.detail = FormData event.detail = FormData
cancelable using preventDefault()
### sm-user-login-response ### sm-user-login-response
event.detail = { error: int, data: {JSON response} } event.detail = { error: int, data: {JSON response} }
### sm-show-screen
event.detail = 'screenname'
cancelable using preventDefault()