From 6e4764947fabf868b804e964bc3d426ac86d0856 Mon Sep 17 00:00:00 2001 From: "Grigorii K. Shartsev" Date: Sat, 27 Jan 2024 01:00:35 +0100 Subject: [PATCH] feat(NcPopover): auto return focus to trigger button on close Signed-off-by: Grigorii K. Shartsev [skip ci] --- src/components/NcPopover/NcPopover.vue | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/components/NcPopover/NcPopover.vue b/src/components/NcPopover/NcPopover.vue index 028d67439b..afa206465e 100644 --- a/src/components/NcPopover/NcPopover.vue +++ b/src/components/NcPopover/NcPopover.vue @@ -228,6 +228,7 @@ options.themes[theme] = structuredClone(options.themes.dropdown) * @typedef {import('focus-trap').FocusTargetValueOrFalse} FocusTargetValueOrFalse * @typedef {FocusTargetValueOrFalse|() => FocusTargetValueOrFalse} SetReturnFocus */ + export default { name: 'NcPopover', @@ -361,6 +362,15 @@ export default { type: [Array, Object], default: () => ['click'], }, + + /** + * When there is no setReturnFocus, NcPopover will try to return focus to the trigger button. + * Use this prop to disable this behavior. + */ + noAutoReturnFocus: { + type: Boolean, + default: false, + }, }, emits: [ @@ -496,6 +506,14 @@ export default { return this.$refs.popover?.$refs.popper?.$refs.reference }, + /** + * @return {HTMLElement|undefined} + */ + getPopoverTriggerButtonElement() { + const triggerContainer = this.getPopoverTriggerElement() + return triggerContainer && tabbable(triggerContainer)[0] + }, + /** * Add focus trap for accessibility. */ @@ -519,7 +537,7 @@ export default { // Focus will be release when popover be hide escapeDeactivates: false, allowOutsideClick: true, - setReturnFocus: this.setReturnFocus, + setReturnFocus: this.setReturnFocus || (!this.noAutoReturnFocus && this.getPopoverTriggerButtonElement()), trapStack: getTrapStack(), fallBackFocus: el, })