{"version":3,"file":"select-dropdown.vue2.mjs","sources":["../../../../../packages/components/select/src/select-dropdown.vue"],"sourcesContent":["<template>\n  <div :class=\"[ns.b('dropdown'), ns.is('multiple', selectProps.multiple)]\">\n    <FixedSizeList\n      ref=\"listRef\"\n      v-bind=\"listProps\"\n      :class=\"ns.be('dropdown', 'list')\"\n      :scrollbarAlwaysOn=\"selectProps.scrollbarAlwaysOn\"\n      :data=\"data\"\n      :height=\"selectProps.height\"\n      :width=\"width\"\n      :total=\"data.length\"\n      @keydown=\"onKeydown\"\n      v-slot=\"{ style, index, key }\"\n    >\n      <SelectItem :key=\"key\" :style=\"style\" :index=\"index\" />\n    </FixedSizeList>\n\n    <div\n      v-if=\"selectProps.multiple && selectProps.options.length\"\n      style=\"\n        border-top: 1px solid #f2f2f2;\n        fontsize: 0;\n        color: var(--el-text-color-regular);\n      \"\n      :style=\"{\n        'line-height': selectProps.itemHeight + 'px',\n        padding: '0 32px 0 20px'\n      }\"\n    >\n      <span\n        style=\"\n          vertical-align: top;\n          display: inline-block;\n          font-size: 14px;\n          margin-right: 8px;\n        \"\n      >\n        已选择: {{ selectProps.modelValue?.length ?? 0 }} 项\n      </span>\n      <el-checkbox\n        :model-value=\"allChecked\"\n        @update:model-value=\"handleSelectAll\"\n      >\n        全选\n      </el-checkbox>\n    </div>\n  </div>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { computed, inject, ref } from 'vue'\nimport { get } from 'lodash-unified'\nimport { isObject } from '@element-ultra/utils'\nimport { FixedSizeList } from '@element-ultra/components/virtual-list'\nimport { useNamespace } from '@element-ultra/hooks'\nimport { EVENT_CODE } from '@element-ultra/shared'\nimport GroupItem from './group-item.vue'\nimport OptionItem from './option-item.vue'\n\nimport { selectInjectionKey } from './token'\n\nimport type { Option, OptionItemProps } from './select.types'\nimport { ElCheckbox } from '@element-ultra/components/checkbox'\nimport type { PropType, CSSProperties } from 'vue'\nimport { useSlots } from 'vue'\n\nconst props = defineProps({\n  data: {\n    type: Array as PropType<Option[]>,\n    required: true\n  },\n  hoveringIndex: Number,\n  width: Number\n})\n\nconst slots = useSlots()\n\nconst {\n  props: selectProps,\n  states: selectStates,\n  update: updateSelect,\n  expanded,\n  onKeyboardNavigate,\n  onKeyboardSelect,\n  onHover,\n  handleSelect,\n  filteredOptions\n} = inject(selectInjectionKey)!\n\nconst ns = useNamespace('select')\n\nconst listRef = ref()\n\nconst listProps = computed(() => {\n  return {\n    itemSize: selectProps.itemHeight\n  }\n})\n\nconst checkedSet = computed(() => {\n  return new Set<any>(\n    selectProps.multiple && selectProps.modelValue\n      ? selectProps.modelValue\n      : undefined\n  )\n})\n\nconst contains = (arr: Array<any> = [], target: any) => {\n  const { valueKey } = selectProps\n\n  if (!isObject(target)) {\n    return checkedSet.value.has(target)\n  }\n\n  return (\n    arr &&\n    arr.some(item => {\n      return get(item, valueKey) === get(target, valueKey)\n    })\n  )\n}\nconst isEqual = (selected: unknown, target: unknown) => {\n  if (!isObject(target)) {\n    return selected === target\n  } else {\n    const { valueKey } = selectProps\n    return get(selected, valueKey) === get(target, valueKey)\n  }\n}\n\nconst isItemSelected = (modelValue: any[] | any, target: Option) => {\n  const { valueKey, multiple } = selectProps\n  if (multiple) {\n    return contains(modelValue, get(target, valueKey))\n  }\n  return isEqual(modelValue, get(target, valueKey))\n}\n\nconst isItemDisabled = (modelValue: any[] | any, selected: boolean) => {\n  const { disabled, multiple, multipleLimit } = selectProps\n  if (disabled) return true\n\n  if (selected) return false\n\n  if (multiple) {\n    return multipleLimit > 0 && modelValue?.length >= multipleLimit\n  }\n\n  return false\n}\n\nconst isItemHovering = (target: number) => props.hoveringIndex === target\n\nconst scrollToItem = (index: number) => {\n  const list = listRef.value as any\n  if (list) {\n    list.scrollToItem(index)\n  }\n}\n\nconst resetScrollTop = () => {\n  const list = listRef.value as any\n  if (list) {\n    list.resetScrollTop()\n  }\n}\n\nconst onForward = () => {\n  onKeyboardNavigate('forward')\n}\n\nconst onBackward = () => {\n  onKeyboardNavigate('backward')\n}\n\nconst onEscOrTab = () => {\n  expanded.value = false\n}\n\nconst onKeydown = (e: KeyboardEvent) => {\n  const { code } = e\n  const tab = EVENT_CODE.tab\n  const esc = EVENT_CODE.esc\n  const down = EVENT_CODE.down\n  const up = EVENT_CODE.up\n  const enter = EVENT_CODE.enter\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\nconst allChecked = computed(() => {\n  const options = selectProps.options.concat(selectStates.createdOptions)\n  if (!options.length) return false\n  return options.every(item => {\n    return checkedSet.value.has(item[selectProps.valueKey])\n  })\n})\n\nconst handleSelectAll = (checked: any) => {\n  if (checked) {\n    const { valueKey, labelKey } = selectProps\n    const options = filteredOptions.value\n    updateSelect(\n      options.map(option => option[valueKey]),\n      options.map(option => option[labelKey]),\n      options.slice()\n    )\n    selectStates.cachedOptions = options.slice()\n  } else {\n    updateSelect([], [], [])\n    selectStates.cachedOptions = []\n    selectStates.createdOptions = []\n  }\n}\n\nconst SelectItem = (itemProps: { style: CSSProperties; index: number }) => {\n  const { index, style } = itemProps\n  const { data } = props\n\n  const item = data[index]!\n  if (item.type === 'Group') {\n    return (\n      <GroupItem item={item} style={style} height={listProps.value.itemSize} />\n    )\n  }\n\n  const selected = isItemSelected(selectStates.modelValue, item)\n  const disabled = isItemDisabled(selectStates.modelValue, selected)\n  const hovering = isItemHovering(index)\n  const { selectable } = selectProps\n  return (\n    <OptionItem\n      {...itemProps}\n      selected={selected}\n      disabled={selectable ? !selectable(item) : disabled}\n      hovering={hovering}\n      created={!!item.created}\n      item={item}\n      onSelect={handleSelect}\n      onHover={onHover}\n    >\n      {{\n        default: (props: OptionItemProps) => {\n          return slots.default?.(props) || <span>{item.label}</span>\n        }\n      }}\n    </OptionItem>\n  )\n}\n\ndefineExpose({\n  listRef,\n\n  isItemDisabled,\n  isItemHovering,\n  isItemSelected,\n  scrollToItem,\n  resetScrollTop\n})\n</script>\n"],"names":["slots","useSlots","props","selectProps","states","selectStates","update","updateSelect","expanded","onKeyboardNavigate","onKeyboardSelect","onHover","handleSelect","filteredOptions","inject","selectInjectionKey","ns","useNamespace","listRef","ref","listProps","computed","itemSize","itemHeight","checkedSet","Set","multiple","modelValue","undefined","contains","arr","target","valueKey","isObject","value","has","some","item","get","isEqual","selected","isItemSelected","isItemDisabled","disabled","multipleLimit","length","isItemHovering","hoveringIndex","scrollToItem","index","list","resetScrollTop","onForward","onBackward","onEscOrTab","onKeydown","e","code","tab","EVENT_CODE","esc","down","up","enter","preventDefault","stopPropagation","allChecked","options","concat","createdOptions","every","handleSelectAll","checked","labelKey","map","option","slice","cachedOptions","SelectItem","itemProps","style","data","type","_createVNode2","GroupItem","hovering","selectable","OptionItem","_mergeProps2","created","default","label","expose"],"mappings":"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"}