zhangyong
2023-08-22 1353e87cb21a4032d585d7404bae9042f2ebcf08
1
{"version":3,"file":"select-dropdown.mjs","sources":["../../../../../../packages/components/select-v2/src/select-dropdown.tsx"],"sourcesContent":["import { computed, defineComponent, inject, ref, unref, watch } 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 { EVENT_CODE } from '@element-plus/constants'\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: {\n      type: Array,\n      required: true,\n    },\n    hoveringIndex: Number,\n    width: Number,\n  },\n  setup(props, { slots, expose }) {\n    const select = inject(selectV2InjectionKey)!\n    const ns = useNamespace('select')\n    const cachedHeights = ref<Array<number>>([])\n\n    const listRef = ref()\n\n    const size = computed(() => props.data.length)\n    watch(\n      () => size.value,\n      () => {\n        select.popper.value.updatePopper?.()\n      }\n    )\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    expose({\n      listRef,\n      isSized,\n\n      isItemDisabled,\n      isItemHovering,\n      isItemSelected,\n      scrollToItem,\n      resetScrollTop,\n    })\n\n    const Item = (itemProps: ItemProps<any>) => {\n      const { index, data, style } = itemProps\n      const sized = unref(isSized)\n      const { itemSize, estimatedSize } = unref(listProps)\n      const { modelValue } = select.props\n      const { onSelect, onHover } = select\n      const item = data[index]\n      if (item.type === 'Group') {\n        return (\n          <GroupItem\n            item={item}\n            style={style}\n            height={(sized ? itemSize : estimatedSize) as number}\n          />\n        )\n      }\n\n      const isSelected = isItemSelected(modelValue, item)\n      const isDisabled = isItemDisabled(modelValue, isSelected)\n      const isHovering = isItemHovering(index)\n      return (\n        <OptionItem\n          {...itemProps}\n          selected={isSelected}\n          disabled={item.disabled || isDisabled}\n          created={!!item.created}\n          hovering={isHovering}\n          item={item}\n          onSelect={onSelect}\n          onHover={onHover}\n        >\n          {{\n            default: (props: OptionItemProps) =>\n              slots.default?.(props) || <span>{item.label}</span>,\n          }}\n        </OptionItem>\n      )\n    }\n\n    // computed\n    const { onKeyboardNavigate, onKeyboardSelect } = select\n\n    const onForward = () => {\n      onKeyboardNavigate('forward')\n    }\n\n    const onBackward = () => {\n      onKeyboardNavigate('backward')\n    }\n\n    const onEscOrTab = () => {\n      select.expanded = false\n    }\n\n    const onKeydown = (e: KeyboardEvent) => {\n      const { code } = e\n      const { tab, esc, down, up, enter } = EVENT_CODE\n      if (code !== tab) {\n        e.preventDefault()\n        e.stopPropagation()\n      }\n\n      switch (code) {\n        case tab:\n        case esc: {\n          onEscOrTab()\n          break\n        }\n        case down: {\n          onForward()\n          break\n        }\n        case up: {\n          onBackward()\n          break\n        }\n        case enter: {\n          onKeyboardSelect()\n          break\n        }\n      }\n    }\n\n    return () => {\n      const { data, width } = props\n      const { height, multiple, scrollbarAlwaysOn } = select.props\n\n      if (data.length === 0) {\n        return (\n          <div\n            class={ns.b('dropdown')}\n            style={{\n              width: `${width}px`,\n            }}\n          >\n            {slots.empty?.()}\n          </div>\n        )\n      }\n\n      const List = unref(isSized) ? FixedSizeList : DynamicSizeList\n\n      return (\n        <div class={[ns.b('dropdown'), ns.is('multiple', multiple)]}>\n          <List\n            ref={listRef}\n            {...unref(listProps)}\n            className={ns.be('dropdown', 'list')}\n            scrollbarAlwaysOn={scrollbarAlwaysOn}\n            data={data}\n            height={height}\n            width={width}\n            total={data.length}\n            // @ts-ignore - dts problem\n            onKeydown={onKeydown}\n          >\n            {{\n              default: (props: ItemProps<any>) => <Item {...props} />,\n            }}\n          </List>\n        </div>\n      )\n    }\n  },\n})\n"],"names":["defineComponent","name","props","data","type","Array","required","hoveringIndex","Number","width","slots","expose","select","ns","cachedHeights","ref","listRef","size","computed","watch","popper","value","isSized","isUndefined","estimatedOptionHeight","listProps","itemSize","itemHeight","estimatedSize","contains","valueKey","isObject","target","arr","includes","item","isEqual","selected","modelValue","get","isItemDisabled","multiple","multipleLimit","isItemHovering","scrollToItem","resetScrollTop","list","isItemSelected","Item","itemProps","style","unref","_mergeProps","onSelect","onHover","sized","disabled","isHovering","onKeyboardSelect","onForward","onBackward","onEscOrTab","onKeydown","code","up","enter","EVENT_CODE","e","tab","_createVNode"],"mappings":"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"}