{"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 '@bigin/utils'\nimport { DynamicSizeList, FixedSizeList } from '@bigin/components/virtual-list'\nimport { useNamespace } from '@bigin/hooks'\nimport { EVENT_CODE } from '@bigin/constants'\nimport GroupItem from './group-item.vue'\nimport OptionItem from './option-item.vue'\n\nimport { selectV2InjectionKey } from './token'\n\nimport type { ItemProps } from '@bigin/components/virtual-list'\nimport type { Option, OptionItemProps } from './select.types'\n\nexport default defineComponent({\n  name: 'BSelectDropdown',\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","setup","slots","expose","select","inject","selectV2InjectionKey","ns","useNamespace","cachedHeights","ref","listRef","size","computed","length","watch","value","popper","updatePopper","isSized","isUndefined","estimatedOptionHeight","listProps","itemSize","itemHeight","estimatedSize","idx","contains","arr","target","valueKey","isObject","includes","some","item","get","isEqual","selected","isItemSelected","modelValue","multiple","isItemDisabled","disabled","multipleLimit","isItemHovering","scrollToItem","index","list","resetScrollTop","Item","itemProps","style","sized","unref","onSelect","onHover","_createVNode","isSelected","isDisabled","isHovering","_mergeProps","created","default","label","onKeyboardNavigate","onKeyboardSelect","onForward","onBackward","onEscOrTab","expanded","onKeydown","e","code","tab","esc","down","up","enter","EVENT_CODE","preventDefault","stopPropagation","height","scrollbarAlwaysOn","b","empty","List","FixedSizeList","DynamicSizeList","is","be"],"mappings":"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"}