mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-03 04:27:53 +00:00
* fix: Resolve and go next keyboard shortcuts doesn't work * refactor: use buildHotKeys instead of hasPressedCommandPlusAltAndEKey * feat: install tinykeys * refactor: use tinykeys * test: update buildKeyEvents * fix: remove stray import * feat: handle action list globally * feat: allow configuring `allowOnFocusedInput` * chore: Navigate chat list item * chore: Navigate dashboard * feat: Navigate editor top panel * feat: Toggle file upload * chore: More keyboard shortcuts * chore: Update mention selection mixin * chore: Phone input * chore: Clean up * chore: Clean up * chore: Dropdown and editor * chore: Enter key to send and clean up * chore: Rename mixin * chore: Review fixes * chore: Removed unused shortcut from modal * fix: Specs --------- Co-authored-by: iamsivin <iamsivin@gmail.com> Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
74 lines
2.0 KiB
Vue
74 lines
2.0 KiB
Vue
<template>
|
|
<ul
|
|
ref="dropdownMenu"
|
|
class="dropdown menu vertical"
|
|
:class="[placement && `dropdown--${placement}`]"
|
|
>
|
|
<slot />
|
|
</ul>
|
|
</template>
|
|
<script>
|
|
import keyboardEventListenerMixins from 'shared/mixins/keyboardEventListenerMixins';
|
|
export default {
|
|
name: 'WootDropdownMenu',
|
|
componentName: 'WootDropdownMenu',
|
|
|
|
mixins: [keyboardEventListenerMixins],
|
|
|
|
props: {
|
|
placement: {
|
|
type: String,
|
|
default: 'top',
|
|
},
|
|
},
|
|
methods: {
|
|
dropdownMenuButtons() {
|
|
return this.$refs.dropdownMenu.querySelectorAll(
|
|
'ul.dropdown li.dropdown-menu__item .button'
|
|
);
|
|
},
|
|
getActiveButtonIndex(menuButtons) {
|
|
const focusedButton = this.$refs.dropdownMenu.querySelector(
|
|
'ul.dropdown li.dropdown-menu__item .button:focus'
|
|
);
|
|
return Array.from(menuButtons).indexOf(focusedButton);
|
|
},
|
|
getKeyboardEvents() {
|
|
const menuButtons = this.dropdownMenuButtons();
|
|
return {
|
|
ArrowUp: {
|
|
action: e => {
|
|
e.preventDefault();
|
|
this.focusPreviousButton(menuButtons);
|
|
},
|
|
allowOnFocusedInput: true,
|
|
},
|
|
ArrowDown: {
|
|
action: e => {
|
|
e.preventDefault();
|
|
this.focusNextButton(menuButtons);
|
|
},
|
|
allowOnFocusedInput: true,
|
|
},
|
|
};
|
|
},
|
|
focusPreviousButton(menuButtons) {
|
|
const activeIndex = this.getActiveButtonIndex(menuButtons);
|
|
const newIndex =
|
|
activeIndex >= 1 ? activeIndex - 1 : menuButtons.length - 1;
|
|
this.focusButton(menuButtons, newIndex);
|
|
},
|
|
focusNextButton(menuButtons) {
|
|
const activeIndex = this.getActiveButtonIndex(menuButtons);
|
|
const newIndex =
|
|
activeIndex === menuButtons.length - 1 ? 0 : activeIndex + 1;
|
|
this.focusButton(menuButtons, newIndex);
|
|
},
|
|
focusButton(menuButtons, newIndex) {
|
|
if (menuButtons.length === 0) return;
|
|
menuButtons[newIndex].focus();
|
|
},
|
|
},
|
|
};
|
|
</script>
|