{"version":3,"file":"transfer-panel.cjs","sources":["../../../components/transfer/transfer-panel.tsx"],"sourcesContent":["import { Checkbox } from '@/components/checkbox'\nimport { CollapseTransition } from '@/components/collapse-transition'\nimport { Icon } from '@/components/icon'\nimport { Input } from '@/components/input'\nimport { NumberInput } from '@/components/number-input'\nimport { ResizeObserver } from '@/components/resize-observer'\nimport { VirtualList } from '@/components/virtual-list'\n\nimport {\n  computed,\n  defineComponent,\n  reactive,\n  ref,\n  renderSlot,\n  toRef,\n  watch,\n  watchEffect,\n} from 'vue'\n\nimport { stateProp, useIcons, useNameHelper } from '@vexip-ui/config'\nimport { useModifier, useRtl } from '@vexip-ui/hooks'\nimport { boundRange, decide } from '@vexip-ui/utils'\n\nimport type { PropType } from 'vue'\nimport type { VirtualListExposed } from '@/components/virtual-list'\nimport type { LocaleConfig } from '@vexip-ui/config'\nimport type { TransferOptionState } from './symbol'\n\nexport default defineComponent({\n  name: 'TransferPanel',\n  props: {\n    type: {\n      type: String as PropType<'source' | 'target'>,\n      default: null,\n    },\n    state: {\n      type: stateProp,\n      default: 'default',\n    },\n    selected: {\n      type: Set as PropType<Set<string | number>>,\n      default: () => new Set(),\n    },\n    paged: {\n      type: Boolean,\n      default: false,\n    },\n    filter: {\n      type: Function as PropType<(value: string, options: TransferOptionState) => boolean>,\n      default: null,\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    title: {\n      type: String,\n      default: '',\n    },\n    options: {\n      type: Array as PropType<TransferOptionState[]>,\n      default: () => [],\n    },\n    emptyText: {\n      type: String,\n      default: '暂无数据',\n    },\n    optionHeight: {\n      type: Number,\n      default: 32,\n    },\n    deepState: {\n      type: Boolean,\n      default: false,\n    },\n    loading: {\n      type: Boolean,\n      default: false,\n    },\n    loadingIcon: {\n      type: [Object, Function],\n      default: null,\n    },\n    loadingLock: {\n      type: Boolean,\n      default: false,\n    },\n    loadingEffect: {\n      type: String,\n      default: null,\n    },\n    locale: {\n      type: Object as PropType<LocaleConfig['transfer']>,\n      default: () => ({}),\n    },\n  },\n  emits: ['update:selected', 'select', 'enter', 'switch'],\n  setup(props, { slots, emit }) {\n    const nh = useNameHelper('transfer')\n    const icons = useIcons()\n\n    const { isRtl } = useRtl()\n\n    const currentSelected = ref(new Set(props.selected))\n    const pageSize = ref(10)\n    const currentPage = ref(1)\n    const currentMark = ref<string | number | null>(null)\n    const currentHitting = ref(-1)\n    const currentFilter = ref('')\n    const searching = ref(false)\n\n    const header = ref<HTMLElement>()\n    const body = ref<HTMLElement>()\n    const footer = ref<HTMLElement>()\n    const search = ref<HTMLElement>()\n    const input = ref<InstanceType<typeof Input>>()\n    const list = ref<VirtualListExposed>()\n\n    let bodyRealHeight = 0\n    let lastSelected: string | number | null = null\n    let keyUsed = false\n\n    const { target: wrapper, modifier } = useModifier({\n      passive: false,\n      onKeyDown: (event, modifier) => {\n        decide(\n          [\n            [\n              () => modifier.up || modifier.down,\n              () => {\n                if (!keyUsed && currentHitting.value < 0) {\n                  keyUsed = true\n\n                  if (lastSelected) {\n                    currentHitting.value = props.options.findIndex(\n                      option => option.value === lastSelected,\n                    )\n                  } else if (list.value) {\n                    currentHitting.value = Math.round(list.value.scrollOffset / props.optionHeight)\n                  }\n\n                  currentHitting.value = currentHitting.value === -1 ? 0 : currentHitting.value\n                } else {\n                  currentHitting.value = boundRange(\n                    findEnabledIndex(\n                      currentHitting.value + (modifier.up ? -1 : 1),\n                      modifier.up ? -1 : 1,\n                    ),\n                    0,\n                    currentOptions.value.length - 1,\n                  )\n                }\n\n                if (!props.paged) {\n                  ensureOptionInView(currentHitting.value, modifier.up ? 'top' : 'bottom')\n                }\n              },\n            ],\n            [\n              () => props.paged && (modifier.left || modifier.right) && event.ctrlKey,\n              () => {\n                handlePageChange(currentPage.value + (modifier.left ? -1 : 1))\n                currentHitting.value = 0\n              },\n            ],\n            [\n              () =>\n                (props.type === 'source' && modifier.right) ||\n                (props.type === 'target' && modifier.left),\n              () => {\n                keyUsed = false\n                currentHitting.value = -1\n                lastSelected = null\n                emit('switch')\n              },\n            ],\n            [\n              () => modifier.space,\n              () => {\n                const option = currentOptions.value[currentHitting.value]\n\n                if (option) {\n                  currentSelected.value[currentSelected.value.has(option.value) ? 'delete' : 'add'](\n                    option.value,\n                  )\n                  emitSelectedChange()\n                }\n              },\n            ],\n            [() => modifier.enter, () => emit('enter')],\n            [\n              () => typeof props.filter === 'function' && !!input.value && modifier['ctrl+f'],\n              () => {\n                event.stopPropagation()\n                input.value!.focus()\n              },\n            ],\n          ],\n          {\n            beforeMatchAny: () => event.preventDefault(),\n            afterMatchAny: modifier.resetAll,\n          },\n        )\n      },\n    })\n\n    const className = computed(() => {\n      return {\n        [nh.be('panel')]: true,\n        [nh.bem('panel', props.state)]: props.state !== 'default',\n        [nh.bem('panel', 'disabled')]: props.disabled,\n      }\n    })\n    const visibleOptions = computed(() => {\n      const filter = props.filter\n      const filterValue = currentFilter.value\n\n      if (filter && filterValue) {\n        return props.options.filter(option => filter(filterValue, option))\n      }\n\n      return props.options\n    })\n    const optionSize = computed(() => visibleOptions.value.length)\n    const pagedOptions = computed(() => {\n      return visibleOptions.value.slice(\n        (currentPage.value - 1) * pageSize.value,\n        currentPage.value * pageSize.value,\n      )\n    })\n    const currentOptions = computed(() => (props.paged ? pagedOptions.value : visibleOptions.value))\n    const totalPages = computed(() => Math.ceil(optionSize.value / (pageSize.value || 1)))\n\n    watch(\n      () => props.selected,\n      value => {\n        currentSelected.value = value\n      },\n    )\n    watch(optionSize, () => {\n      keyUsed = false\n      currentHitting.value = -1\n      lastSelected = null\n    })\n\n    const partial = ref(false)\n    const allSelected = ref(false)\n\n    watchEffect(() => {\n      const options = visibleOptions.value\n      const selected = currentSelected.value\n\n      let hasSelected = false\n      let hasUnselected = false\n\n      for (let i = 0, len = optionSize.value; i < len; ++i) {\n        const option = options[i]\n\n        if (!option.disabled) {\n          if (selected.has(option.value)) {\n            hasSelected = true\n          } else {\n            hasUnselected = true\n          }\n        }\n\n        if (hasSelected && hasUnselected) {\n          break\n        }\n      }\n\n      allSelected.value = hasSelected && !hasUnselected\n      partial.value = !allSelected.value && selected.size > 0\n    })\n\n    function computePageSize() {\n      requestAnimationFrame(() => {\n        const bodyEl = body.value || list.value?.wrapper\n\n        if (bodyEl) {\n          const style = getComputedStyle(bodyEl)\n          const paddingTop = parseInt(style.paddingTop)\n          const paddingBottom = parseInt(style.paddingBottom)\n          const innerHeight = bodyEl.offsetHeight - paddingTop - paddingBottom\n\n          bodyRealHeight = innerHeight\n          pageSize.value = Math.floor(innerHeight / (props.optionHeight || 1))\n        }\n      })\n    }\n\n    function toggleSelect(option: TransferOptionState) {\n      if (props.disabled || option.disabled) return\n\n      if (currentMark.value && modifier.shift) {\n        handleRangeSelect(currentMark.value, option.value)\n        return\n      }\n\n      if (currentSelected.value.has(option.value)) {\n        currentSelected.value.delete(option.value)\n      } else {\n        currentSelected.value.add(option.value)\n      }\n\n      keyUsed = false\n      currentHitting.value = -1\n      lastSelected = option.value\n      currentMark.value = option.value\n      emitSelectedChange()\n    }\n\n    function handleRangeSelect(start: string | number, end: string | number) {\n      const options = visibleOptions.value\n\n      let startIndex = -1\n      let endIndex = -1\n\n      for (let i = 0, len = options.length; i < len; ++i) {\n        const option = options[i]\n\n        if (option.value === start) {\n          startIndex = i\n        } else if (option.value === end) {\n          endIndex = i\n        }\n\n        if (startIndex > 0 && endIndex > 0) break\n      }\n\n      const method = currentSelected.value.has(options[startIndex]?.value) ? 'add' : 'delete'\n\n      if (startIndex > endIndex) {\n        ;[startIndex, endIndex] = [endIndex, startIndex]\n      }\n\n      for (let i = startIndex; i <= endIndex; ++i) {\n        const option = options[i]\n\n        if (!option.disabled) {\n          currentSelected.value[method](option.value)\n        }\n      }\n\n      emitSelectedChange()\n    }\n\n    function toggleSelectAll(event?: Event) {\n      event?.preventDefault()\n\n      if (props.disabled) return\n\n      if (allSelected.value) {\n        for (const option of visibleOptions.value) {\n          !option.disabled && currentSelected.value.delete(option.value)\n        }\n      } else {\n        for (const option of visibleOptions.value) {\n          !option.disabled && currentSelected.value.add(option.value)\n        }\n      }\n\n      currentMark.value = null\n      emitSelectedChange()\n    }\n\n    function handleReverse() {\n      if (props.disabled) return\n\n      if (partial.value) {\n        const prevSelected = new Set(currentSelected.value)\n\n        for (const option of visibleOptions.value) {\n          if (!option.disabled) {\n            if (prevSelected.has(option.value)) {\n              currentSelected.value.delete(option.value)\n            } else {\n              currentSelected.value.add(option.value)\n            }\n          }\n        }\n\n        currentMark.value = null\n        emitSelectedChange()\n      } else {\n        toggleSelectAll()\n      }\n    }\n\n    function handleBlur() {\n      currentMark.value = null\n      modifier.resetAll()\n    }\n\n    function emitSelectedChange() {\n      emit('update:selected', currentSelected.value)\n      emit('select')\n    }\n\n    function handlePageChange(page: number) {\n      currentPage.value = boundRange(page, 1, totalPages.value)\n    }\n\n    function queryEnabledIndex(index: number, step: number) {\n      const options = currentOptions.value\n      step = step / Math.abs(step)\n\n      while (options[index]?.disabled) {\n        index += step\n\n        if (index < 0 || index >= options.length) break\n      }\n\n      return index\n    }\n\n    function findEnabledIndex(index: number, sign: 1 | -1 = 1) {\n      const options = currentOptions.value\n\n      if (options[index]?.disabled) {\n        index = queryEnabledIndex(index, sign)\n\n        if (sign > 0 ? index >= options.length : index < 0) {\n          index = queryEnabledIndex(index, -sign)\n\n          // 全禁用\n          if (sign > 0 ? index < 0 : index >= options.length) index = -1\n        }\n      }\n\n      return index\n    }\n\n    function ensureOptionInView(index: number, direction: 'top' | 'bottom') {\n      const option = props.options[index]\n\n      if (props.paged || !option || !list.value) return\n\n      if (direction === 'bottom') {\n        const target = (index + 1) * props.optionHeight\n\n        if (list.value.scrollOffset + bodyRealHeight < target) {\n          list.value.scrollTo((index - pageSize.value + 1) * props.optionHeight)\n        }\n      } else {\n        const target = index * props.optionHeight\n\n        if (list.value.scrollOffset > target) {\n          list.value.scrollTo(target)\n        }\n      }\n    }\n\n    const slotParams = reactive({\n      type: toRef(props, 'type'),\n      currentPage,\n      pageSize,\n      totalPages,\n      allSelected,\n      partial,\n      selected: computed(() => Array.from(currentSelected.value)),\n      options: computed(() => visibleOptions.value),\n      toggleSelectAll,\n      handleReverse,\n    })\n\n    function renderOption({ option, index }: { option: TransferOptionState, index: number }) {\n      const disabled = props.disabled || option.disabled\n      const handleCheck = (event: MouseEvent) => {\n        event.preventDefault()\n        event.stopPropagation()\n        toggleSelect(option)\n      }\n\n      return (\n        <li\n          class={{\n            [nh.be('option')]: true,\n            [nh.bem('option', 'disabled')]: disabled,\n            [nh.bem('option', 'hitting')]: currentHitting.value === index,\n          }}\n          role={'option'}\n          aria-disabled={disabled ? 'true' : undefined}\n          onClick={() => toggleSelect(option)}\n        >\n          {renderSlot(slots, 'option', { type: props.type, option, index }, () => [\n            <Checkbox\n              key={1}\n              class={nh.be('checkbox')}\n              state={props.deepState ? props.state : undefined}\n              checked={currentSelected.value.has(option.value)}\n              disabled={disabled}\n              tab-index={-1}\n              onClick={handleCheck}\n            ></Checkbox>,\n            <span key={2} class={nh.be('label')}>\n              {renderSlot(slots, 'label', { type: props.type, option, index }, () => [\n                option.label,\n              ])}\n            </span>,\n          ])}\n        </li>\n      )\n    }\n\n    function renderHeader() {\n      return (\n        <div ref={header} class={nh.be('header')}>\n          {renderSlot(slots, 'header', slotParams, () => [\n            <>\n              <Checkbox\n                inherit\n                control\n                class={nh.be('checkbox')}\n                state={props.deepState ? props.state : undefined}\n                checked={allSelected.value}\n                partial={partial.value}\n                disabled={props.disabled}\n                tab-index={-1}\n                onClick={toggleSelectAll}\n              ></Checkbox>\n              <div\n                class={[nh.be('reverse'), props.disabled && nh.bem('reverse', 'disabled')]}\n                title={props.locale.reverse}\n                onClick={handleReverse}\n              >\n                <Icon\n                  {...icons.value.retweet}\n                  scale={+(icons.value.retweet.scale || 1) * 1.2}\n                ></Icon>\n              </div>\n              <div class={nh.be('counter')}>\n                {`${currentSelected.value.size}/${visibleOptions.value.length}`}\n              </div>\n              {(props.title || slots.title) && (\n                <span class={nh.be('title')}>\n                  {renderSlot(slots, 'title', slotParams, () => [props.title])}\n                </span>\n              )}\n              <CollapseTransition appear horizontal fade-effect>\n                {props.loading && (\n                  <div class={nh.be('loading')}>\n                    <Icon\n                      {...icons.value.loading}\n                      effect={props.loadingEffect || icons.value.loading.effect}\n                      icon={props.loadingIcon || icons.value.loading.icon}\n                      label={'loading'}\n                    ></Icon>\n                  </div>\n                )}\n              </CollapseTransition>\n            </>,\n          ])}\n        </div>\n      )\n    }\n\n    function renderFilter() {\n      if (typeof props.filter !== 'function') return null\n\n      const stop = (e: Event) => e.stopPropagation()\n      // const setFilter = (value: string) => (currentFilter.value = value)\n\n      return (\n        <div ref={search} class={nh.be('filter')}>\n          <Input\n            ref={input}\n            v-model:value={currentFilter.value}\n            inherit\n            clearable\n            sync\n            disabled={props.disabled}\n            placeholder={searching.value ? undefined : props.locale.search}\n            onKeydown={stop}\n            onFocus={() => (searching.value = true)}\n            onBlur={() => (searching.value = false)}\n          >\n            {{\n              suffix: () => <Icon {...icons.value.search}></Icon>,\n            }}\n          </Input>\n        </div>\n      )\n    }\n\n    function renderBody() {\n      if (props.paged || slots.body) {\n        return (\n          <ResizeObserver throttle onResize={computePageSize}>\n            <ul ref={body} class={nh.be('body')} role={'listbox'}>\n              {renderSlot(slots, 'body', slotParams, () => [\n                pagedOptions.value.length ? (\n                  pagedOptions.value.map((option, index) => renderOption({ option, index }))\n                ) : (\n                  <div class={nh.be('empty')}>{props.emptyText || props.locale.empty}</div>\n                ),\n              ])}\n            </ul>\n          </ResizeObserver>\n        )\n      }\n\n      return (\n        <VirtualList\n          ref={list}\n          inherit\n          class={nh.be('body')}\n          items={visibleOptions.value}\n          item-size={props.optionHeight}\n          item-fixed\n          use-y-bar\n          id-key={'value'}\n          items-attrs={{ role: 'listbox', ariaLabel: props.type }}\n          onResize={computePageSize}\n        >\n          {{\n            default: ({ item, index }: { item: TransferOptionState, index: number }) =>\n              renderOption({ option: item, index }),\n            empty: () => <div class={nh.be('empty')}>{props.emptyText || props.locale.empty}</div>,\n          }}\n        </VirtualList>\n      )\n    }\n\n    function renderFooter() {\n      if (!props.paged && !slots.footer) return null\n\n      return (\n        <div ref={footer} class={nh.be('footer')}>\n          {renderSlot(slots, 'footer', slotParams, () => [\n            <div class={nh.be('pagination')}>\n              <Icon\n                {...(isRtl.value ? icons.value.angleRight : icons.value.angleLeft)}\n                class={[\n                  nh.be('page-plus'),\n                  currentPage.value <= 1 && nh.bem('page-plus', 'disabled'),\n                ]}\n                onClick={() => handlePageChange(currentPage.value - 1)}\n              ></Icon>\n              <NumberInput\n                inherit\n                value={currentPage.value}\n                class={nh.be('page-input')}\n                size={'small'}\n                min={1}\n                max={totalPages.value}\n                onChange={handlePageChange}\n              ></NumberInput>\n              <span style={'margin: 0 4px'}>{'/'}</span>\n              <span>{totalPages.value}</span>\n              <Icon\n                {...(isRtl.value ? icons.value.angleLeft : icons.value.angleRight)}\n                class={[\n                  nh.be('page-minus'),\n                  currentPage.value >= totalPages.value && nh.bem('page-minus', 'disabled'),\n                ]}\n                onClick={() => handlePageChange(currentPage.value + 1)}\n              ></Icon>\n            </div>,\n          ])}\n        </div>\n      )\n    }\n\n    return () => (\n      <div ref={wrapper} class={className.value} tabindex={0} onBlur={handleBlur}>\n        {renderHeader()}\n        {renderFilter()}\n        {renderBody()}\n        {renderFooter()}\n      </div>\n    )\n  },\n})\n"],"names":["defineComponent","name","props","type","String","default","state","stateProp","selected","Set","paged","Boolean","filter","Function","disabled","title","options","Array","emptyText","optionHeight","Number","deepState","loading","loadingIcon","Object","loadingLock","loadingEffect","locale","emits","setup","slots","emit","nh","useNameHelper","icons","useIcons","isRtl","useRtl","currentSelected","ref","pageSize","currentPage","currentMark","currentHitting","currentFilter","searching","header","body","footer","search","input","list","bodyRealHeight","lastSelected","keyUsed","target","wrapper","modifier","useModifier","passive","onKeyDown","event","decide","up","down","value","findIndex","option","Math","round","scrollOffset","boundRange","findEnabledIndex","currentOptions","length","ensureOptionInView","left","right","ctrlKey","handlePageChange","space","has","emitSelectedChange","enter","stopPropagation","focus","beforeMatchAny","preventDefault","afterMatchAny","resetAll","className","computed","be","bem","visibleOptions","filterValue","optionSize","pagedOptions","slice","totalPages","ceil","watch","partial","allSelected","watchEffect","hasSelected","hasUnselected","i","len","size","computePageSize","requestAnimationFrame","bodyEl","style","getComputedStyle","paddingTop","parseInt","paddingBottom","innerHeight","offsetHeight","floor","toggleSelect","shift","handleRangeSelect","delete","add","start","end","startIndex","endIndex","method","toggleSelectAll","handleReverse","prevSelected","handleBlur","page","queryEnabledIndex","index","step","abs","sign","direction","scrollTo","slotParams","reactive","toRef","from","renderOption","handleCheck","_createVNode","undefined","onClick","renderSlot","Checkbox","label","renderHeader","_Fragment","reverse","Icon","_mergeProps","retweet","scale","CollapseTransition","effect","icon","renderFilter","stop","e","Input","$event","onFocus","onBlur","suffix","renderBody","ResizeObserver","map","empty","VirtualList","role","ariaLabel","item","renderFooter","angleRight","angleLeft","NumberInput"],"mappings":"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"}