UNPKG

@extclp/vexip-ui

Version:

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

1 lines 22.6 kB
{"version":3,"file":"wheel.vue2.mjs","sources":["../../../components/wheel/wheel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Icon } from '@/components/icon/'\nimport { Renderer } from '@/components/renderer'\nimport { Scroll } from '@/components/scroll'\nimport { useFieldStore } from '@/components/form'\n\nimport { computed, nextTick, provide, ref, watch } from 'vue'\n\nimport WheelItem from './wheel-item.vue'\nimport { createStateProp, emitEvent, useIcons, useNameHelper, useProps } from '@vexip-ui/config'\nimport { useDisplay, useModifier, useRtl } from '@vexip-ui/hooks'\nimport { USE_TOUCH, boundRange, debounce, debounceMinor, toFalse } from '@vexip-ui/utils'\nimport { wheelProps } from './props'\nimport { WHEEL_STATE } from './symbol'\n\nimport type { ItemState, WheelOption, WheelSlots } from './symbol'\n\ndefineOptions({ name: 'Wheel' })\n\nconst { idFor, labelId, state, disabled, loading, validateField, getFieldValue, setFieldValue } =\n useFieldStore<string | number>(() => wrapper.value?.focus())\n\nconst _props = defineProps(wheelProps)\nconst props = useProps('wheel', _props, {\n state: createStateProp(state),\n horizontal: false,\n value: {\n default: () => getFieldValue(),\n static: true\n },\n candidate: {\n default: 2,\n validator: value => [0, 1, 2, 3].includes(value)\n },\n arrow: false,\n pointer: USE_TOUCH,\n options: {\n default: () => [],\n static: true\n },\n insertEmpty: false,\n disabled: () => disabled.value,\n loading: () => loading.value,\n loadingLock: false,\n disabledItem: {\n default: toFalse,\n isFunc: true\n },\n noTransition: false,\n selectable: false,\n slots: () => ({})\n})\n\nconst emit = defineEmits(['update:value'])\n\ndefineSlots<WheelSlots>()\n\nconst nh = useNameHelper('wheel')\nconst icons = useIcons()\n\nconst items = ref(new Set<ItemState>())\nconst currentActive = ref(0)\nconst wrapperWidth = ref(0)\nconst wrapperHeight = ref(0)\nconst targetWidth = ref(0)\nconst targetHeight = ref(0)\nconst horizontalPadding = ref(0)\nconst verticalPadding = ref(0)\nconst isInit = ref(false)\n\nconst { isRtl } = useRtl()\n\nconst wrapper = useDisplay(displayInit)\nconst scroll = ref<InstanceType<typeof Scroll>>()\n\nuseModifier({\n target: wrapper,\n passive: false,\n onKeyDown: (event, modifier) => {\n if (modifier.up || modifier.down) {\n event.preventDefault()\n modifier.up ? handlePrev() : handleNext()\n }\n }\n})\n\nconst normalizedOptions = computed<WheelOption[]>(() => {\n const options = props.options.map(option => {\n if (typeof option === 'object') {\n const { value, label, disabled = false } = option\n\n return {\n value,\n label: label || String(value),\n disabled,\n meta: option\n }\n }\n\n return { value: option, label: String(option), disabled: false, meta: option }\n })\n\n if (props.insertEmpty) {\n options.unshift({\n value: '',\n label: typeof props.insertEmpty === 'string' ? props.insertEmpty : '-',\n disabled: false,\n meta: ''\n })\n }\n\n return options\n})\nconst itemList = computed(() => {\n return Array.from(items.value)\n})\nconst readonly = computed(() => props.loading && props.loadingLock)\nconst className = computed(() => {\n return [\n nh.b(),\n nh.bs('vars'),\n nh.bm(props.horizontal ? 'horizontal' : 'vertical'),\n {\n [nh.bm('inherit')]: props.inherit,\n [nh.bm(props.state)]: props.state !== 'default',\n [nh.bm('disabled')]: props.disabled,\n [nh.bm('readonly')]: readonly.value,\n [nh.bm('loading')]: props.loading\n }\n ]\n})\nconst listStyle = computed(() => {\n if (props.horizontal) {\n return {\n paddingRight: `${horizontalPadding.value}px`,\n paddingLeft: `${horizontalPadding.value}px`\n }\n }\n\n return {\n paddingTop: `${verticalPadding.value}px`,\n paddingBottom: `${verticalPadding.value}px`\n }\n})\nconst maskStyle = computed(() => {\n if (props.horizontal) {\n return {\n width: horizontalPadding.value ? `${horizontalPadding.value}px` : undefined\n }\n }\n\n return {\n height: verticalPadding.value ? `${verticalPadding.value}px` : undefined\n }\n})\nconst borderStyle = computed(() => {\n const style: Record<string, string> = {\n inset: props.horizontal\n ? `0 ${horizontalPadding.value - 1}px`\n : `${verticalPadding.value - 1}px 0`\n }\n\n if (props.horizontal) {\n style.borderTop = '0'\n style.borderBottom = '0'\n } else {\n style.borderRight = '0'\n style.borderLeft = '0'\n }\n\n return style\n})\nconst prevDisabled = computed(() => {\n return (\n props.disabled ||\n !itemList.value.slice(0, currentActive.value).some(item => !isItemDisabled(item))\n )\n})\nconst nextDisabled = computed(() => {\n return (\n props.disabled ||\n currentActive.value >= itemList.value.length - 1 ||\n !itemList.value\n .slice(currentActive.value + 1, itemList.value.length)\n .some(item => !isItemDisabled(item))\n )\n})\nconst prevIcon = computed(() =>\n props.horizontal\n ? isRtl.value\n ? icons.value.angleRight\n : icons.value.angleLeft\n : icons.value.angleUp\n)\nconst nextIcon = computed(() =>\n props.horizontal\n ? isRtl.value\n ? icons.value.angleLeft\n : icons.value.angleRight\n : icons.value.angleDown\n)\n\nprovide(WHEEL_STATE, { increaseItem, decreaseItem })\n\nconst updateActive = debounceMinor(() => {\n const active = Math.max(\n itemList.value.findIndex(item => item.value === props.value),\n 0\n )\n\n setActive(findEnabledActive(active))\n})\n\nconst computeSize = debounceMinor(() => {\n nextTick(() => {\n const horizontal = props.horizontal\n\n itemList.value.forEach(item => {\n if (item && item.el) {\n targetWidth.value = Math.max(targetWidth.value, item.el.offsetWidth)\n targetHeight.value = Math.max(targetHeight.value, item.el.offsetHeight)\n }\n })\n\n const candidate = props.candidate\n const showCount = 2 * candidate + 1\n\n wrapperWidth.value = showCount * targetWidth.value\n wrapperHeight.value = showCount * targetHeight.value\n\n horizontalPadding.value = candidate * targetWidth.value\n verticalPadding.value = candidate * targetHeight.value\n\n items.value.forEach(item => {\n if (horizontal) {\n item.width = targetWidth.value\n } else {\n item.height = targetHeight.value\n }\n })\n\n setTimeout(() => {\n scroll.value?.refresh()\n }, 0)\n })\n})\n\nconst refreshScroll = debounce(() => {\n if (scroll.value) {\n let targetXScroll = 0\n let targetYScroll = 0\n\n if (props.horizontal) {\n targetXScroll = currentActive.value * targetWidth.value\n } else {\n targetYScroll = currentActive.value * targetHeight.value\n }\n\n nextTick(() => {\n scroll.value?.scrollTo(targetXScroll, targetYScroll)\n })\n }\n}, 20)\n\nwatch(\n () => props.value,\n () => {\n updateActive()\n refreshScroll()\n },\n { immediate: true }\n)\nwatch(() => props.horizontal, computeSize)\nwatch(() => props.candidate, computeSize)\n\ndefineExpose({\n idFor,\n currentActive,\n isInit,\n targetWidth,\n targetHeight,\n wrapperWidth,\n wrapperHeight,\n itemList,\n wrapper,\n scroll,\n refreshScroll,\n focus: (options?: FocusOptions) => wrapper.value?.focus(options),\n blur: () => wrapper.value?.blur()\n})\n\nfunction isItemDisabled(item: ItemState) {\n return item.disabled || props.disabledItem(item.value, item.meta)\n}\n\nfunction setActive(active: number) {\n if (currentActive.value === active) return\n\n currentActive.value = active\n\n const item = itemList.value[active]\n const value = item?.value\n\n refreshScroll()\n emit('update:value', value)\n setFieldValue(value)\n emitEvent(props.onChange, value, item?.meta)\n validateField()\n}\n\nfunction queryEnabledActive(active: number, step: number) {\n step = step / Math.abs(step)\n\n while (itemList.value[active].disabled) {\n active += step\n\n if (active < 0 || active >= itemList.value.length) break\n }\n\n return active\n}\n\nfunction findEnabledActive(active: number, sign = 1) {\n if (itemList.value[active] && isItemDisabled(itemList.value[active])) {\n active = queryEnabledActive(active, 1 * sign)\n\n if (sign > 0 ? active >= itemList.value.length : active < 0) {\n active = queryEnabledActive(boundRange(active, 0, itemList.value.length - 1), -1 * sign)\n\n // 全禁用\n if (sign > 0 ? active < 0 : active >= itemList.value.length) active = 0\n }\n }\n\n return active\n}\n\nfunction increaseItem(item: ItemState) {\n items.value.add(item)\n computeSize()\n updateActive()\n}\n\nfunction decreaseItem(item: ItemState) {\n items.value.delete(item)\n computeSize()\n updateActive()\n}\n\nfunction displayInit() {\n computeSize()\n scroll.value?.refresh()\n\n nextTick(() => {\n isInit.value = true\n\n updateActive()\n refreshScroll()\n })\n}\n\nfunction beforeScroll({ signX, signY }: { signX: number, signY: number }) {\n if (props.disabled || readonly.value) return false\n\n const sign = props.horizontal ? signX : signY\n\n return !((sign < 0 && prevDisabled.value) || (sign > 0 && nextDisabled.value))\n}\n\nfunction handleScrollEnd({ clientX, clientY }: { clientX: number, clientY: number }) {\n const aboutActive = props.horizontal ? clientX / targetWidth.value : clientY / targetHeight.value\n const active = Math.round(aboutActive)\n\n if (active !== currentActive.value) {\n setActive(findEnabledActive(active, active > aboutActive ? 1 : -1))\n } else {\n refreshScroll()\n }\n}\n\nfunction handleWheel({\n sign,\n clientX,\n clientY\n}: {\n clientX: number,\n clientY: number,\n sign: 1 | -1\n}) {\n const active = props.horizontal\n ? Math.round(clientX / targetWidth.value)\n : Math.round(clientY / targetHeight.value)\n\n setActive(findEnabledActive(active, sign))\n}\n\nfunction handlePrev() {\n if (!prevDisabled.value) {\n setActive(findEnabledActive(currentActive.value - 1, -1))\n\n const item = itemList.value[currentActive.value]\n\n emitEvent(props.onPrev, item?.value, item?.meta)\n }\n}\n\nfunction handleNext() {\n if (!nextDisabled.value) {\n setActive(findEnabledActive(currentActive.value + 1, 1))\n\n const item = itemList.value[currentActive.value]\n\n emitEvent(props.onNext, item?.value, item?.meta)\n }\n}\n\nfunction handleItemClick(option: WheelOption, index: number) {\n if (props.selectable && !isItemDisabled(itemList.value[index])) {\n setActive(index)\n }\n\n emitEvent(props.onItemClick, option.value, option.meta)\n}\n</script>\n\n<template>\n <div\n :id=\"idFor\"\n ref=\"wrapper\"\n :class=\"className\"\n tabindex=\"0\"\n role=\"group\"\n :aria-labelledby=\"labelId\"\n >\n <div\n v-if=\"props.arrow\"\n ref=\"prevArrow\"\n :class=\"[\n nh.be('arrow'),\n nh.bem('arrow', 'prev'),\n prevDisabled ? nh.bem('arrow', 'disabled') : ''\n ]\"\n aria-hidden\n @click=\"handlePrev\"\n >\n <Icon v-bind=\"prevIcon\"></Icon>\n </div>\n <div :class=\"nh.be('scroll')\" role=\"none\">\n <Scroll\n ref=\"scroll\"\n inherit\n :scroll-x=\"props.horizontal ? targetWidth * currentActive : 0\"\n :scroll-y=\"props.horizontal ? 0 : targetHeight * currentActive\"\n :width=\"props.horizontal ? wrapperWidth : '100%'\"\n :height=\"props.horizontal ? '100%' : wrapperHeight\"\n :pointer=\"props.pointer\"\n :mode=\"props.horizontal ? 'horizontal' : 'vertical'\"\n :delta-x=\"targetWidth\"\n :delta-y=\"targetHeight\"\n :on-before-scroll=\"beforeScroll\"\n :no-transition=\"props.noTransition\"\n @wheel=\"handleWheel\"\n @scroll-end=\"handleScrollEnd\"\n >\n <ul ref=\"list\" :class=\"nh.be('list')\" :style=\"listStyle\">\n <template v-if=\"isInit\">\n <WheelItem\n v-for=\"(option, index) in normalizedOptions\"\n :key=\"index\"\n :value=\"option.value\"\n :disabled=\"option.disabled || props.disabledItem(option.value, option)\"\n :active=\"currentActive === index\"\n :meta=\"option.meta\"\n @click=\"handleItemClick(option, index)\"\n >\n <slot :option=\"option\" :index=\"index\">\n <Renderer :renderer=\"props.slots.default\" :data=\"{ option, index }\">\n {{ option.label }}\n </Renderer>\n </slot>\n </WheelItem>\n </template>\n </ul>\n </Scroll>\n <template v-if=\"props.candidate\">\n <div :class=\"[nh.be('mask'), nh.bem('mask', 'top')]\" :style=\"maskStyle\"></div>\n <div :class=\"[nh.be('mask'), nh.bem('mask', 'bottom')]\" :style=\"maskStyle\"></div>\n </template>\n <div\n :class=\"{\n [nh.be('border')]: true,\n [nh.bem('border', 'active')]: props.loading,\n [nh.bem('border', 'vertical')]: props.horizontal\n }\"\n :style=\"borderStyle\"\n ></div>\n </div>\n <div\n v-if=\"props.arrow\"\n ref=\"nextArrow\"\n :class=\"[\n nh.be('arrow'),\n nh.bem('arrow', 'next'),\n nextDisabled ? nh.bem('arrow', 'disabled') : ''\n ]\"\n aria-hidden\n @click=\"handleNext\"\n >\n <Icon v-bind=\"nextIcon\"></Icon>\n </div>\n </div>\n</template>\n"],"names":["idFor","labelId","state","disabled","loading","validateField","getFieldValue","setFieldValue","useFieldStore","_a","wrapper","props","useProps","__props","createStateProp","value","USE_TOUCH","toFalse","emit","__emit","nh","useNameHelper","icons","useIcons","items","ref","currentActive","wrapperWidth","wrapperHeight","targetWidth","targetHeight","horizontalPadding","verticalPadding","isInit","isRtl","useRtl","useDisplay","displayInit","scroll","useModifier","event","modifier","handlePrev","handleNext","normalizedOptions","computed","options","option","label","itemList","readonly","className","listStyle","maskStyle","borderStyle","style","prevDisabled","item","isItemDisabled","nextDisabled","prevIcon","nextIcon","provide","WHEEL_STATE","increaseItem","decreaseItem","updateActive","debounceMinor","active","setActive","findEnabledActive","computeSize","nextTick","horizontal","candidate","showCount","refreshScroll","debounce","targetXScroll","targetYScroll","watch","__expose","emitEvent","queryEnabledActive","step","sign","boundRange","beforeScroll","signX","signY","handleScrollEnd","clientX","clientY","aboutActive","handleWheel","handleItemClick","index"],"mappings":"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"}