diff --git a/frontend/src/component/confirm/dialog.vue b/frontend/src/component/confirm/dialog.vue index 451c591c9..ac47806fc 100644 --- a/frontend/src/component/confirm/dialog.vue +++ b/frontend/src/component/confirm/dialog.vue @@ -2,24 +2,28 @@ - +
{{ text ? text : $gettext(`Are you sure?`) }}
- + {{ $gettext(`Cancel`) }} - + {{ action ? action : $gettext(`Yes`) }} @@ -55,18 +59,31 @@ export default { data() { return {}; }, - watch: { - visible(show) { - if (show) { - this.$nextTick(() => this.$view.enter(this, this.$refs?.content, ".action-confirm")); - } else { - this.$view.leave(this); - } - }, - }, methods: { afterEnter() { - this.$nextTick(() => this.$view.enter(this, this.$refs?.content, ".action-confirm")); + this.$view.enter(this); + }, + afterLeave() { + this.$view.leave(this); + }, + onFocusOut(ev) { + if (!this.$view.isActive(this)) { + return; + } + + const el = this.$refs.content?.$el; + + if (!ev || !ev.target || !(ev.target instanceof HTMLElement) || !(el instanceof HTMLElement)) { + return; + } + + const next = ev.relatedTarget; + const leavingDialog = !next || !(next instanceof Node) || !el.contains(next); + + if (leavingDialog) { + el.focus(); + ev.preventDefault(); + } }, close() { this.$emit("close"); diff --git a/frontend/src/component/photo/edit/people.vue b/frontend/src/component/photo/edit/people.vue index 25fc67ebb..33ec74a72 100644 --- a/frontend/src/component/photo/edit/people.vue +++ b/frontend/src/component/photo/edit/people.vue @@ -79,10 +79,9 @@ item-title="Name" item-value="Name" :disabled="busy" + :menu-props="menuProps" return-object hide-no-data - :menu-props="menuProps" - :menu="openMenuId === m.UID" hide-details single-line open-on-clear @@ -90,15 +89,9 @@ prepend-inner-icon="mdi-account-plus" density="comfortable" class="input-name pa-0 ma-0 text-selectable" - @blur=" - () => { - onSetName(m, 'blur'); - onUpdateMenu(m, false); - } - " - @update:menu="(val) => onUpdateMenu(m, val)" @update:model-value="(person) => onSetPerson(m, person)" - @keyup.enter="onSetName(m, 'enter')" + @blur="(ev) => onSetName(m, ev)" + @keyup.enter="(ev) => onSetName(m, ev)" > @@ -147,9 +140,15 @@ export default { text: this.$gettext("Add person?"), }, menuProps: { - closeOnClick: false, - closeOnContentClick: true, openOnClick: true, + openOnFocus: true, + closeOnBack: true, + closeOnContentClick: true, + persistent: false, + scrim: true, + openDelay: 0, + closeDelay: 0, + opacity: 0, density: "compact", maxHeight: 300, scrollStrategy: "reposition", @@ -161,7 +160,6 @@ export default { return v.length <= this.$config.get("clip") || this.$gettext("Name too long"); }, - openMenuId: "", }; }, watch: { @@ -331,7 +329,7 @@ export default { return true; }, - onSetName(model, trigger) { + onSetName(model, ev) { if (this.busy || !model) { return; } @@ -366,7 +364,8 @@ export default { model.Name = name; model.SubjUID = ""; - if (trigger === "enter") { + + if (ev && ev.key === "Enter" && !ev.isComposing && !ev.repeat) { this.setName(model); } else { this.confirm.visible = true; @@ -385,19 +384,6 @@ export default { this.confirm.model.SubjUID = ""; } this.confirm.visible = false; - this.openMenuId = ""; - }, - getModelKey(model) { - return model?.UID || model?.ID || ""; - }, - onUpdateMenu(model, open) { - const key = this.getModelKey(model); - if (!key) return; - if (open) { - this.openMenuId = key; - } else if (this.openMenuId === key) { - this.openMenuId = ""; - } }, setName(model) { if (this.busy || !model) { diff --git a/frontend/src/page/people/new.vue b/frontend/src/page/people/new.vue index aad7c4f60..6ecbe7449 100644 --- a/frontend/src/page/people/new.vue +++ b/frontend/src/page/people/new.vue @@ -85,8 +85,8 @@ single-line density="comfortable" class="input-name pa-0 ma-0" - @blur="onSetName(m, 'blur')" - @keyup.enter="onSetName(m, 'enter')" + @blur="(ev) => onSetName(m, ev)" + @keyup.enter="(ev) => onSetName(m, ev)" > @@ -201,9 +194,15 @@ export default { text: this.$gettext("Add person?"), }, menuProps: { - closeOnClick: false, - closeOnContentClick: true, openOnClick: true, + openOnFocus: true, + closeOnBack: true, + closeOnContentClick: true, + persistent: false, + scrim: true, + openDelay: 0, + closeDelay: 0, + opacity: 0, density: "compact", maxHeight: 300, scrollStrategy: "reposition", @@ -215,7 +214,6 @@ export default { return v.length <= this.$config.get("clip") || this.$gettext("Text too long"); }, - openMenuId: "", }; }, computed: { @@ -653,7 +651,7 @@ export default { return true; }, - onSetName(model, trigger) { + onSetName(model, ev) { if (this.busy || !model) { return; } @@ -690,7 +688,7 @@ export default { model.SubjUID = ""; if (model.Name) { - if (trigger === "enter") { + if (ev && ev.key === "Enter" && !ev.isComposing && !ev.repeat) { this.setName(model, model.Name); } else { this.confirm.visible = true; @@ -715,19 +713,6 @@ export default { this.confirm.model.SubjUID = ""; } this.confirm.visible = false; - this.openMenuId = ""; - }, - getModelKey(model) { - return model?.ID || model?.UID || ""; - }, - onUpdateMenu(model, open) { - const key = this.getModelKey(model); - if (!key) return; - if (open) { - this.openMenuId = key; - } else if (this.openMenuId === key) { - this.openMenuId = ""; - } }, setName(model, newName) { if (this.busy || !model || !newName || newName.trim() === "") {