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