element-plus
Version:
A Component Library for Vue 3
1 lines • 12.8 kB
Source Map (JSON)
{"version":3,"file":"select-dropdown.mjs","sources":["../../../../../../packages/components/select-v2/src/select-dropdown.vue"],"sourcesContent":["<script lang=\"ts\">\nimport {\n computed,\n defineComponent,\n h,\n inject,\n ref,\n renderSlot,\n withCtx,\n withKeys,\n withModifiers,\n} from 'vue'\nimport { get } from 'lodash-unified'\nimport { isObject, isUndefined } from '@element-plus/utils'\nimport {\n DynamicSizeList,\n FixedSizeList,\n} from '@element-plus/components/virtual-list'\nimport { useNamespace } from '@element-plus/hooks'\nimport GroupItem from './group-item.vue'\nimport OptionItem from './option-item.vue'\n\nimport { selectV2InjectionKey } from './token'\n\nimport type { ItemProps } from '@element-plus/components/virtual-list'\nimport type { Option, OptionItemProps } from './select.types'\n\nexport default defineComponent({\n name: 'ElSelectDropdown',\n\n props: {\n data: Array,\n hoveringIndex: Number,\n width: Number,\n },\n setup(props) {\n const select = inject(selectV2InjectionKey) as any\n const ns = useNamespace('select')\n const cachedHeights = ref<Array<number>>([])\n\n const listRef = ref(null)\n\n const isSized = computed(() =>\n isUndefined(select.props.estimatedOptionHeight)\n )\n const listProps = computed(() => {\n if (isSized.value) {\n return {\n itemSize: select.props.itemHeight,\n }\n }\n\n return {\n estimatedSize: select.props.estimatedOptionHeight,\n itemSize: (idx: number) => cachedHeights.value[idx],\n }\n })\n\n const contains = (arr: Array<any> = [], target: any) => {\n const {\n props: { valueKey },\n } = select\n\n if (!isObject(target)) {\n return arr.includes(target)\n }\n\n return (\n arr &&\n arr.some((item) => {\n return get(item, valueKey) === get(target, valueKey)\n })\n )\n }\n const isEqual = (selected: unknown, target: unknown) => {\n if (!isObject(target)) {\n return selected === target\n } else {\n const { valueKey } = select.props\n return get(selected, valueKey) === get(target, valueKey)\n }\n }\n\n const isItemSelected = (modelValue: any[] | any, target: Option) => {\n const { valueKey } = select.props\n if (select.props.multiple) {\n return contains(modelValue, get(target, valueKey))\n }\n return isEqual(modelValue, get(target, valueKey))\n }\n\n const isItemDisabled = (modelValue: any[] | any, selected: boolean) => {\n const { disabled, multiple, multipleLimit } = select.props\n return (\n disabled ||\n (!selected &&\n (multiple\n ? multipleLimit > 0 && modelValue.length >= multipleLimit\n : false))\n )\n }\n\n const isItemHovering = (target: number) => props.hoveringIndex === target\n\n const scrollToItem = (index: number) => {\n const list = listRef.value as any\n if (list) {\n list.scrollToItem(index)\n }\n }\n\n const resetScrollTop = () => {\n const list = listRef.value as any\n if (list) {\n list.resetScrollTop()\n }\n }\n\n // computed\n return {\n ns,\n select,\n listProps,\n listRef,\n isSized,\n\n isItemDisabled,\n isItemHovering,\n isItemSelected,\n\n scrollToItem,\n resetScrollTop,\n }\n },\n\n render(_ctx, _cache) {\n const {\n $slots,\n\n data,\n listProps,\n select,\n isSized,\n width,\n ns,\n // methods\n isItemDisabled,\n isItemHovering,\n isItemSelected,\n } = _ctx\n\n const Comp = isSized ? FixedSizeList : DynamicSizeList\n\n const {\n props: selectProps,\n onSelect,\n onHover,\n onKeyboardNavigate,\n onKeyboardSelect,\n } = select\n const { height, modelValue, multiple } = selectProps\n\n if (data.length === 0) {\n return h(\n 'div',\n {\n class: ns.b('dropdown'),\n style: {\n width: `${width}px`,\n },\n },\n $slots.empty?.()\n )\n }\n\n const ListItem = withCtx((scoped: ItemProps<any>) => {\n const { index, data } = scoped\n const item = data[index]\n // render group item which is not selectable.\n if (data[index].type === 'Group') {\n return h(GroupItem, {\n item,\n style: scoped.style,\n height: isSized ? listProps.itemSize : listProps.estimatedSize,\n })\n }\n\n const selected = isItemSelected(modelValue, item)\n const itemDisabled = isItemDisabled(modelValue, selected)\n // render option item which is selectable\n return h(\n OptionItem,\n {\n ...scoped,\n selected,\n disabled: item.disabled || itemDisabled,\n created: !!item.created,\n hovering: isItemHovering(index),\n item,\n onSelect,\n onHover,\n },\n {\n default: withCtx((props: OptionItemProps) => {\n return renderSlot($slots, 'default', props, () => [\n h('span', item.label),\n ])\n }),\n }\n )\n })\n\n const List = h(\n Comp,\n {\n ref: 'listRef', // forwarded ref so that select can access the list directly\n className: ns.be('dropdown', 'list'),\n data,\n height,\n width,\n total: data.length,\n scrollbarAlwaysOn: selectProps.scrollbarAlwaysOn,\n onKeydown: [\n _cache[1] ||\n (_cache[1] = withKeys(\n withModifiers(\n () => onKeyboardNavigate('forward'),\n ['stop', 'prevent']\n ),\n ['down']\n )),\n _cache[2] ||\n (_cache[2] = withKeys(\n withModifiers(\n () => onKeyboardNavigate('backward'),\n ['stop', 'prevent']\n ),\n ['up']\n )),\n _cache[3] ||\n (_cache[3] = withKeys(\n withModifiers(onKeyboardSelect, ['stop', 'prevent']),\n ['enter']\n )),\n\n _cache[4] ||\n (_cache[4] = withKeys(\n withModifiers(\n () => (select.expanded = false),\n ['stop', 'prevent']\n ),\n ['esc']\n )),\n _cache[5] ||\n (_cache[5] = withKeys(() => (select.expanded = false), ['tab'])),\n // _cache[6] || (_cache[6] = () => {\n // console.log(11)\n // }),\n ],\n ...listProps,\n },\n {\n default: ListItem,\n }\n )\n return h(\n 'div',\n {\n class: [ns.b('dropdown'), ns.is('multiple', multiple)],\n },\n [List]\n )\n },\n})\n</script>\n"],"names":[],"mappings":"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"}