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;
},
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'),

View file

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

View file

@ -90,7 +90,7 @@ export class LoginUserView extends AbstractViewLogin {
submitCommand(self, event) {
let form = event.target.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.passwordError(!this.password());

View file

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