hongluan-ui
Version:
Hongluan Component Library for Vue 3
1 lines • 20.7 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../../../../packages/components/selector/src/index.vue"],"sourcesContent":["<template>\n <hl-tooltip\n ref=\"popper\"\n :visible=\"popperVisible\"\n :teleported=\"compatTeleported\"\n :offset=\"popperOffset\"\n :placement=\"placement\"\n :popper-class=\"`${namespace}-popper ${popperClass}`\"\n :fallback-placements=\"fallbackPlacements\"\n :stop-popper-mouse-event=\"false\"\n :show-arrow=\"false\"\n transition=\"dropdown\"\n :gpu-acceleration=\"false\"\n :persistent=\"persistent\"\n @hide=\"afterLeave\"\n >\n <div\n v-clickoutside:[popperPaneRef]=\"() => togglePopperVisible(false)\"\n :class=\"[\n namespace,\n realSize && `cascader-${realSize}`,\n {\n 'is-disabled': isDisabled,\n 'block': block,\n },\n $attrs.class,\n ]\"\n :style=\"$attrs.style\"\n @click=\"() => togglePopperVisible(readonly ? undefined : true)\"\n @keydown=\"handleKeyDown\"\n @mouseenter=\"inputHover = true\"\n @mouseleave=\"inputHover = false\"\n @click.stop\n >\n <hl-input\n ref=\"input\"\n v-model=\"inputValue\"\n :placeholder=\"currentPlaceholder\"\n :readonly=\"readonly\"\n :disabled=\"isDisabled\"\n :validate-event=\"false\"\n :fill=\"realFill\"\n :thin=\"thin\"\n :round=\"round\"\n :size=\"realSize\"\n :class=\"{\n 'is-focus': popperVisible,\n 'is-tags': presentTags.length,\n }\"\n :input-style=\"inputStyle\"\n @compositionstart=\"handleComposition\"\n @compositionupdate=\"handleComposition\"\n @compositionend=\"handleComposition\"\n @focus=\"e => $emit('focus', e)\"\n @blur=\"e => $emit('blur', e)\"\n @input=\"handleInput\"\n >\n <template v-if=\"multiple\" #tags>\n <div v-if=\"presentTags.length\" ref=\"tagWrapper\" class=\"input-tags\">\n <hl-tag\n v-for=\"tag in presentTags\"\n :key=\"tag.key\"\n :type=\"tagType\"\n :effect=\"tagEffect\"\n :active=\"tag.hitState\"\n :closable=\"tag.closable\"\n :size=\"realSize\"\n disable-transitions\n @close=\"deleteTag(tag)\"\n >\n <template v-if=\"tag.isCollapseTag === false\">\n <slot name=\"tag\" :tag=\"tag\">\n {{ tag.text }}\n </slot>\n </template>\n <template v-else>\n <hl-tooltip\n :disabled=\"popperVisible || !collapseTagsTooltip\"\n :fallback-placements=\"['bottom', 'top', 'right', 'left']\"\n placement=\"bottom\"\n :show-arrow=\"false\"\n :popper-class=\"`collapse-tags-popper`\"\n >\n <template #default>\n <slot name=\"tag\" :tag=\"tag\">\n {{ tag.text }}\n </slot>\n </template>\n <template #content>\n <div class=\"collapse-tags\">\n <template\n v-for=\"tag2 in allPresentTags.slice(\n maxCollapseTags\n )\"\n :key=\"tag2.key\"\n >\n <hl-tag\n class=\"in-tooltip collapse-tag\"\n :type=\"tagType\"\n :effect=\"tagEffect\"\n :size=\"realSize\"\n :hit=\"tag2.hitState\"\n :closable=\"tag2.closable\"\n disable-transitions\n @close=\"deleteTag(tag2)\"\n >\n <slot name=\"collapse-tag\" :tag=\"tag2\">\n {{ tag2.text }}\n </slot>\n </hl-tag>\n </template>\n </div>\n </template>\n </hl-tooltip>\n </template>\n </hl-tag>\n\n <input\n v-if=\"filterable && !isDisabled\"\n v-model=\"searchInputValue\"\n type=\"text\"\n class=\"selector-input\"\n @input=\"e => handleInput(searchInputValue, e)\"\n @click.stop=\"togglePopperVisible(true)\"\n @keydown.delete=\"handleDelete\"\n @compositionstart=\"handleComposition\"\n @compositionupdate=\"handleComposition\"\n @compositionend=\"handleComposition\"\n >\n </div>\n </template>\n <template v-if=\"$slots.prefix\" #prefix>\n <slot name=\"prefix\"></slot>\n </template>\n <template #suffix>\n <hl-icon :class=\"['select-caret', popperVisible ? 'is-open' : '', !clearBtnVisible ? 'visible' : '']\" @click.stop=\"togglePopperVisible()\">\n <system-select-arrow />\n </hl-icon>\n <hl-icon key=\"clear\" :class=\"['select-close', clearBtnVisible ? 'visible' : '']\" @click.stop=\"handleClear\">\n <system-close />\n </hl-icon>\n </template>\n </hl-input>\n </div>\n\n <template #content>\n <div class=\"selector-dropdown\">\n <slot></slot>\n </div>\n </template>\n </hl-tooltip>\n</template>\n\n<script lang='ts'>\nimport { computed, defineComponent, nextTick, onMounted, ref, watch } from 'vue'\nimport { useResizeObserver } from '@vueuse/core'\nimport HlInput from '@hongluan-ui/components/input'\nimport HlTooltip, { useTooltipContentProps } from '@hongluan-ui/components/tooltip'\nimport HlIcon from '@hongluan-ui/components/icon'\nimport { SystemSelectArrow, SystemClose } from '@hongluan-ui/components/system-icon'\nimport HlTag, { tagProps } from '@hongluan-ui/components/tag'\nimport { ClickOutside as Clickoutside } from '@hongluan-ui/directives'\nimport { useDeprecateAppendToBody } from '@hongluan-ui/components/popper'\nimport { useComposition, useLocale, useConsistentProp, useNamespace } from '@hongluan-ui/hooks'\nimport { EVENT_CODE } from '@hongluan-ui/constants'\nimport { isClient, isValidComponentSize } from '@hongluan-ui/utils'\n\nimport type { PropType, Ref } from 'vue'\nimport type { ComponentSize } from '@hongluan-ui/constants'\n\nexport interface Tag {\n key: string | number\n text: unknown\n hitState?: boolean\n closable?: boolean\n isCollapseTag: boolean\n}\n\nexport default defineComponent({\n name: 'Selector',\n\n components: {\n HlInput,\n HlTooltip,\n HlTag,\n HlIcon,\n SystemSelectArrow,\n SystemClose,\n },\n\n directives: {\n Clickoutside,\n },\n\n props: {\n size: {\n type: String as PropType<ComponentSize>,\n validator: isValidComponentSize,\n },\n placeholder: {\n type: String,\n },\n disabled: Boolean,\n clearable: Boolean,\n filterable: Boolean,\n collapseTags: Boolean,\n /**\n * @description The max tags number to be shown. To use this, collapse-tags must be true\n */\n maxCollapseTags: {\n type: Number,\n default: 1,\n },\n collapseTagsTooltip: {\n type: Boolean,\n default: false,\n },\n placement: {\n type: String,\n default: 'bottom-start',\n },\n fallbackPlacements: {\n type: Array as PropType<Array<string>>,\n default: () => [],\n },\n popperClass: {\n type: String,\n default: '',\n },\n block: {\n type: Boolean,\n default: false,\n },\n inputStyle: {\n type: Object,\n default: () => ({}),\n },\n multiple: {\n type: Boolean,\n default: false,\n },\n popperAppendToBody: {\n type: Boolean,\n default: undefined,\n },\n teleported: useTooltipContentProps.teleported,\n fill: Boolean,\n round: Boolean,\n thin: Boolean,\n popperOffset: {\n type: Number,\n default: 4,\n },\n /**\n * @description when dropdown is inactive and `persistent` is `false`, dropdown will be destroyed\n */\n persistent: {\n type: Boolean,\n default: true,\n },\n // eslint-disable-next-line vue/require-prop-types\n tagType: { ...tagProps.type, default: '' },\n tagEffect: { type: String, default: '' },\n },\n\n emits: [\n 'focus',\n 'blur',\n 'input',\n 'resize',\n 'after-leave',\n 'keyboard-down',\n 'visible-change',\n 'popper-visible',\n 'remove-tag',\n 'clear',\n ],\n\n setup(props, { emit }) {\n const { namespace } = useNamespace('selector')\n const { t } = useLocale()\n const { compatTeleported } = useDeprecateAppendToBody(\n 'Selector',\n 'popperAppendToBody',\n )\n const { isComposing, handleComposition } = useComposition({\n afterComposition(event) {\n const text = (event.target as HTMLInputElement)?.value\n handleInput(text)\n },\n })\n\n let pressDeleteCount = 0\n\n const popper = ref(null)\n const input = ref(null)\n const tagWrapper = ref(null)\n const panel = ref(null)\n const popperVisible = ref(false)\n const inputHover = ref(false)\n const inputValue = ref('')\n const searchInputValue = ref('')\n const presentTags: Ref<Tag[]> = ref([])\n const allPresentTags: Ref<Tag[]> = ref([])\n const presentText = ref<unknown>('')\n const checkedNodes = ref<unknown[]>([])\n\n const { size: realSize, disabled: isDisabled, fill: realFill } = useConsistentProp()\n const readonly = computed(() => !props.filterable)\n const inputPlaceholder = computed(() => props.placeholder || t('hl.cascader.placeholder'))\n const clearBtnVisible = computed(() => {\n if (\n !props.clearable ||\n isDisabled.value ||\n !inputHover.value\n ) return false\n\n return props.multiple ? !!checkedNodes.value.length : !!presentText.value\n })\n const currentPlaceholder = computed(() =>\n searchInputValue.value || presentTags.value.length > 0\n ? ''\n : inputPlaceholder.value,\n )\n\n const popperPaneRef = computed(() => {\n return popper.value?.popperRef?.contentRef\n })\n\n const setValue = (val: unknown | unknown[]) => {\n if (Array.isArray(val)) {\n checkedNodes.value = [...val]\n } else {\n presentText.value = val\n }\n }\n\n const afterLeave = () => {\n emit('after-leave')\n }\n\n const togglePopperVisible = (visible?: boolean) => {\n if (isDisabled.value) return\n\n visible = visible ?? !popperVisible.value\n\n if (visible !== popperVisible.value) {\n popperVisible.value = visible\n input.value?.input?.setAttribute('aria-expanded', `${visible}`)\n\n if (visible) {\n updatePopperPosition()\n nextTick(() => {\n emit('popper-visible')\n })\n } else if (props.filterable) {\n if (props.multiple) {\n searchInputValue.value = ''\n } else {\n const { value } = presentText\n inputValue.value = value as string\n }\n emit('input', '')\n }\n\n emit('visible-change', visible)\n }\n }\n\n const updatePopperPosition = () => {\n nextTick(popper.value?.updatePopper)\n }\n\n const genTag = (node: unknown): Tag => {\n return {\n key: String(Math.random()),\n text: node,\n hitState: false,\n closable: !isDisabled.value,\n isCollapseTag: false,\n }\n }\n\n const deleteTag = (tag: Tag) => {\n checkedNodes.value = checkedNodes.value.filter(cn => cn !== tag.text)\n !checkedNodes.value.length && resetInput()\n emit('remove-tag', tag)\n }\n\n const calculatePresentTags = () => {\n if (!props.multiple) return\n\n const nodes = checkedNodes.value\n const tags: Tag[] = []\n\n const allTags: Tag[] = []\n nodes.forEach(node => allTags.push(genTag(node)))\n allPresentTags.value = allTags\n\n if (nodes.length) {\n nodes\n .slice(0, props.maxCollapseTags)\n .forEach(node => tags.push(genTag(node)))\n const rest = nodes.slice(props.maxCollapseTags)\n const restCount = rest.length\n\n if (restCount) {\n if (props.collapseTags) {\n tags.push({\n key: '-1',\n text: `+ ${restCount}`,\n closable: false,\n isCollapseTag: true,\n })\n } else {\n rest.forEach(node => tags.push(genTag(node)))\n }\n }\n }\n\n presentTags.value = tags\n }\n\n const updateTags = (cb: (tag: Tag) => void) => {\n presentTags.value.forEach(cb)\n allPresentTags.value.forEach(cb)\n }\n\n const focusFirstNode = () => {\n emit('keyboard-down')\n }\n\n const updateStyle = () => {\n const inputInner = input.value?.input\n const tagWrapperEl = tagWrapper.value\n\n if (!isClient || !inputInner) return\n\n emit('resize', input.value.$el)\n\n if (tagWrapperEl) {\n updatePopperPosition()\n }\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isComposing.value) return\n\n switch (e.code) {\n case EVENT_CODE.enter:\n togglePopperVisible()\n break\n case EVENT_CODE.down:\n togglePopperVisible(true)\n nextTick(focusFirstNode)\n e.preventDefault()\n break\n case EVENT_CODE.esc:\n if (popperVisible.value === true) {\n e.preventDefault()\n e.stopPropagation()\n togglePopperVisible(false)\n }\n break\n case EVENT_CODE.tab:\n togglePopperVisible(false)\n break\n }\n }\n\n const handleClear = () => {\n togglePopperVisible(false)\n emit('clear')\n // Maybe need sync from commit: Element+ 6ac49834e\n resetInput()\n }\n\n const resetInput = () => {\n checkedNodes.value = []\n presentText.value = ''\n inputValue.value = ''\n searchInputValue.value = ''\n }\n\n const handleDelete = () => {\n const tags = presentTags.value\n const lastTag = tags[tags.length - 1]\n pressDeleteCount = searchInputValue.value ? 0 : pressDeleteCount + 1\n\n if (!lastTag || !pressDeleteCount || (props.collapseTags && tags.length > 1)) return\n\n if (lastTag.hitState) {\n deleteTag(lastTag)\n } else {\n lastTag.hitState = true\n }\n }\n\n const handleInput = (val: string, e?: KeyboardEvent) => {\n !popperVisible.value && togglePopperVisible(true)\n\n if (e?.isComposing) return\n\n emit('input', val)\n }\n\n watch([checkedNodes, isDisabled, () => props.collapseTags], calculatePresentTags)\n\n watch(presentTags, () => {\n nextTick(() => updateStyle())\n })\n\n watch(presentText,\n val => inputValue.value = val as string,\n { immediate: true },\n )\n\n onMounted(() => {\n const inputEl = input.value?.$el\n useResizeObserver(inputEl, updateStyle)\n })\n\n return {\n namespace,\n compatTeleported,\n popper,\n popperPaneRef,\n input,\n tagWrapper,\n panel,\n popperVisible,\n inputHover,\n presentText,\n checkedNodes,\n inputValue,\n inputPlaceholder,\n searchInputValue,\n currentPlaceholder,\n presentTags,\n allPresentTags,\n isDisabled,\n realSize,\n realFill,\n readonly,\n clearBtnVisible,\n setValue,\n afterLeave,\n t,\n togglePopperVisible,\n updatePopperPosition,\n deleteTag,\n updateTags,\n focusFirstNode,\n handleKeyDown,\n handleComposition,\n handleClear,\n handleDelete,\n handleInput,\n }\n },\n})\n</script>\n"],"names":["Clickoutside","_createBlock","_createTextVNode","_openBlock","_withDirectives"],"mappings":"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"}