diff --git a/src/components/DropdownMenu.vue b/src/components/DropdownMenu.vue
index c2dd662..ceaae6d 100644
--- a/src/components/DropdownMenu.vue
+++ b/src/components/DropdownMenu.vue
@@ -1,10 +1,10 @@
boolean>,
default: (option: VueSelectOption): boolean => true,
},
@@ -327,7 +334,7 @@ export default defineComponent({
* @return {String}
*/
getOptionLabel: {
- type: Function,
+ type: Function as PropType<(option: VueSelectOption) => string>,
default(option: VueSelectOption) {
if (typeof option === 'object') {
if (!option.hasOwnProperty(this.label)) {
@@ -354,13 +361,9 @@ export default defineComponent({
* slow with lots of objects.
*
* The result of this function *must* be unique.
- *
- * @type {Function}
- * @param {Object || String} option
- * @return {String}
*/
getOptionKey: {
- type: Function,
+ type: Function as PropType<(option: VueSelectOption) => unknown>,
default(option: VueSelectOption): unknown {
if (typeof option !== 'object') {
return option
@@ -587,7 +590,6 @@ export default defineComponent({
* for the search input. Can be used to implement
* custom behaviour for key presses.
*/
-
mapKeydown: {
type: Function,
/**
@@ -663,29 +665,31 @@ export default defineComponent({
provide() {
return {
- [VueSelectInjectionKey]: computed(() => {
- return {
+ [DropdownMenuKey]: computed(() => {
+ const context: DropdownMenuContext = {
+ uid: this.uid,
+ dropdownOpen: this.dropdownOpen,
+ onMousedown: this.onMousedown,
+ onMouseup: this.onMouseUp,
+ setDropdownMenuEl: (el: HTMLElement | null) => {
+ this.dropdownMenuEl = el
+ },
+ }
+ return context
+ }),
+ [DropdownMenuItemKey]: computed(() => {
+ const context: DropdownMenuItemContext = {
uid: this.uid,
getOptionKey: this.getOptionKey,
isOptionDeselectable: this.isOptionDeselectable,
isOptionSelected: this.isOptionSelected,
typeAheadPointer: this.typeAheadPointer,
setTypeAheadPointer: this.setTypeAheadPointer,
- dropdownOpen: this.dropdownOpen,
- onMousedown: this.onMousedown,
- onMouseup: this.onMouseUp,
+ filteredOptionKeys: this.filteredOptionKeys,
selectable: this.selectable,
select: this.select,
- setDropdownMenuEl: (ref: HTMLElement) => {
- this.dropdownMenuEl = ref
- },
- registerSelectableEl: (ref: HTMLElement) => {
- this.selectableEls.push(ref)
- },
- unRegisterSelectableEl: (ref: HTMLElement) => {
- this.selectableEls = this.selectableEls.filter((el) => el !== ref)
- },
}
+ return context
}),
}
},
@@ -700,7 +704,6 @@ export default defineComponent({
_value: [], // Internal value managed by Vue Select if no `value` prop is passed
deselectButtons: [],
dropdownMenuEl: null,
- selectableEls: [],
} as {
search: string
open: boolean
@@ -709,7 +712,6 @@ export default defineComponent({
_value: any[]
deselectButtons: any[]
dropdownMenuEl: HTMLElement | null
- selectableEls: HTMLElement[]
}
},
@@ -752,7 +754,7 @@ export default defineComponent({
*
* @return {Array}
*/
- optionList() {
+ optionList(): VueSelectOption[] {
return this.options.concat(this.pushTags ? this.pushedTags : [])
},
@@ -899,7 +901,7 @@ export default defineComponent({
*
* @return {array}
*/
- filteredOptions() {
+ filteredOptions(): VueSelectOption[] {
const optionList = [].concat(this.optionList)
if (!this.filterable && !this.taggable) {
@@ -918,6 +920,10 @@ export default defineComponent({
return options
},
+ filteredOptionKeys(): VueSelectOptionKey[] {
+ return this.filteredOptions.map((option) => this.getOptionKey(option))
+ },
+
/**
* Check if there aren't any options selected.
* @return {Boolean}
diff --git a/src/symbols.ts b/src/symbols.ts
index 0308e03..ab74cfb 100644
--- a/src/symbols.ts
+++ b/src/symbols.ts
@@ -1,5 +1,5 @@
import type { InjectionKey } from 'vue'
-export const VueSelectInjectionKey = Symbol(
- 'VueSelectInjectionKey'
-) as InjectionKey
+export const DropdownMenuKey = Symbol('DropdownMenuKey')
+
+export const DropdownMenuItemKey = Symbol('DropdownMenuItemKey')
diff --git a/src/types.ts b/src/types.ts
index 03bcda5..9def4f2 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -1,20 +1,27 @@
import type { ComputedRef } from 'vue'
-export interface VueSelectContext {
+export interface DropdownMenuContext {
uid: string | number | undefined
dropdownOpen: boolean
+ onMousedown: (e: MouseEvent) => void
+ onMouseup: (e: MouseEvent) => void
+ setDropdownMenuEl: (el: HTMLElement | null) => void
+}
+export type InjectedDropdownMenuContext = ComputedRef
+
+export interface DropdownMenuItemContext {
+ uid: DropdownMenuContext['uid']
typeAheadPointer: number
setTypeAheadPointer: (index: number) => void
isOptionDeselectable: (option: VueSelectOption) => boolean
isOptionSelected: (option: VueSelectOption) => boolean
- onMousedown: (e: MouseEvent) => void
- onMouseup: (e: MouseEvent) => void
+ getOptionKey: (option: VueSelectOption) => unknown
+ filteredOptionKeys: VueSelectOptionKey[]
select: (option: VueSelectOption) => void
- setDropdownMenuEl: (el: HTMLElement | null) => void
- registerSelectableEl: (el: HTMLElement | null) => void
- unRegisterSelectableEl: (el: HTMLElement | null) => void
+ selectable: (option: VueSelectOption) => boolean
}
-
-export type InjectedVueSelectContext = ComputedRef
+export type InjectedDropdownMenuItemContext =
+ ComputedRef
export type VueSelectOption = unknown
+export type VueSelectOptionKey = unknown