UNPKG

vexip-ui

Version:

A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good

1 lines 35.2 kB
{"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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"}