{"version":3,"file":"tree-select.vue2.mjs","sources":["../../../../../../packages/components/tree-select/src/tree-select.vue"],"sourcesContent":["<script lang=\"ts\">\n  import type { WritableComputedRef } from 'vue'\n  import { computed, defineComponent, nextTick, ref, watch } from 'vue'\n  import { getComponentNamespace, getNamespace } from '../../../utils/global-config'\n  import Trigger from '../../trigger/src/trigger'\n  import SelectTrigger from '../../common/select-trigger.vue'\n  import { Scrollbar } from '../../scrollbar'\n  import type { TreeData, TreeInstance } from '../../tree'\n  import { Tree } from '../../tree'\n  import { Empty } from '../../empty'\n  import { BnIconEmpty } from '../../icon'\n  import { debounce } from '../../../utils/throttle-debounce'\n\n  // 表单\n  import { useFormItem } from '../../form/src/hooks/use-form-item'\n  import { NOOP } from '../../../shared/utils'\n  import { treeSelectProps } from './props'\n\n  export default defineComponent({\n    name: getComponentNamespace('TreeSelect'),\n    components: {\n      Trigger,\n      SelectTrigger,\n      Scrollbar,\n      Tree,\n      Empty,\n      BnIconEmpty\n    },\n    props: treeSelectProps,\n    emits: ['update:modelValue', 'show', 'hide', 'change', 'clear'],\n    setup(props, { emit }) {\n      const ns = getNamespace('tree-select')\n\n      const popupVisible = ref(false)\n\n      const mergeDisabled = computed(() => props.disabled)\n      const mergeSize = computed(() => props.size)\n      const placeholder = computed(() => props.placeholder)\n\n      const changePopupVisible = (visible: boolean) => {\n        popupVisible.value = visible\n      }\n\n      const popupRef = ref<HTMLElement>()\n      const inputValue = ref('')\n      const multipleTags = ref<\n        {\n          key: string\n          label: string\n        }[]\n      >([])\n\n      const isEmpty = computed(() => props.data.length === 0)\n\n      // tree\n      const treeRef = ref<TreeInstance>()\n      const modelType = computed(() => (props.multiple ? 'checked' : 'selected'))\n      const selected: WritableComputedRef<(number | string)[]> = computed({\n        get() {\n          return props.modelValue\n        },\n        set(val) {\n          emit('update:modelValue', val)\n        }\n      })\n      const treeDataCache = ref<TreeData[]>([])\n      const treeRenderData = ref<TreeData[]>([])\n\n      const onChangeChecked = (values: (number | string)[]) => {\n        selected.value = values\n        emit('change', values)\n      }\n\n      const onChangeSelected = (values: (number | string)[]) => {\n        selected.value = values\n        emit('change', values)\n        changePopupVisible(false)\n      }\n      const treeBindEvents = computed(() => {\n        const events: Record<string, (values: (number | string)[]) => void> = {}\n        if (props.multiple) {\n          events.changeChecked = onChangeChecked\n        } else {\n          events.changeSelected = onChangeSelected\n        }\n        return events\n      })\n      // 表单验证\n      const { formItem } = useFormItem()\n\n      watch(\n        () => selected.value,\n        async (values) => {\n          await nextTick()\n          const nodes = treeRef.value?.getNodesByValues(values)\n          if (!props.multiple) {\n            inputValue.value = nodes?.[0]?.label as string\n          } else {\n            multipleTags.value = nodes?.map((node) => {\n              return {\n                key: node.value,\n                label: node.label\n              }\n            }) as {\n              key: string\n              label: string\n            }[]\n          }\n        },\n        { immediate: true }\n      )\n\n      watch(\n        () => props.data,\n        (newData) => {\n          treeDataCache.value = newData.slice()\n          treeRenderData.value = newData.slice()\n        },\n        { immediate: true }\n      )\n\n      const onShow = () => {\n        emit('show')\n      }\n      const onHide = () => {\n        emit('hide')\n      }\n      const handleClear = () => {\n        emit('update:modelValue', [])\n        emit('clear')\n        emit('change', [])\n      }\n      const handleTagClose = (tag: { key: string; label: string }) => {\n        const tags = multipleTags.value.slice()\n        const originSelectedValues = selected.value.slice()\n        const key = tag.key\n        const index = tags.findIndex((tag) => tag.key === key)\n        if (~index) {\n          tags.splice(index, 1)\n          originSelectedValues.splice(index, 1)\n          multipleTags.value = tags\n\n          emit('update:modelValue', originSelectedValues)\n\n          emit('change', originSelectedValues)\n        }\n      }\n\n      const handleFilter = debounce(\n        (query: string) => {\n          const stack = treeDataCache.value.slice()\n          if (!query) {\n            treeRenderData.value = stack\n            return\n          }\n\n          const matcher: TreeData[] = []\n          const filterMethod = props.filterMethod\n\n          while (stack.length) {\n            const item = stack.shift() as TreeData\n            const RE = new RegExp(`${query}`, 'ig')\n            let existing = true\n\n            if (filterMethod) {\n              existing = filterMethod(treeRef.value?.getNodesByValues([item.value])[0], query)\n            } else {\n              existing = RE.test(item.label as string)\n            }\n\n            if (existing) {\n              matcher.push(item)\n            } else {\n              const children = item?.children\n              if (children) {\n                for (let i = 0; i < children.length; i++) {\n                  stack.push(children[i])\n                }\n              }\n            }\n          }\n          treeRenderData.value = matcher\n\n          nextTick(() => {\n            treeRef.value?.unfoldNodes()\n          })\n        },\n        0,\n        true\n      )\n\n      const handleShowPopup = () => {\n        changePopupVisible(true)\n      }\n\n      // 表单验证\n      watch(\n        () => selected.value,\n        () => {\n          if (props.validateEvent) {\n            formItem?.validate('change').catch(NOOP)\n          }\n        }\n      )\n      const stopEvent = (event: Event) => {\n        console.log('EVENT_', event)\n\n        // 阻止事件的默认行为\n        event.preventDefault()\n        // 阻止事件传播\n        event.stopPropagation()\n        // 阻止事件捕获和冒泡\n        event.stopImmediatePropagation()\n      }\n      return {\n        ns,\n        popupVisible,\n        mergeDisabled,\n        mergeSize,\n        placeholder,\n        popupRef,\n        isEmpty,\n\n        multipleTags,\n        inputValue,\n\n        treeRef,\n        selected,\n        modelType,\n        treeRenderData,\n        treeBindEvents,\n\n        onShow,\n        onHide,\n        handleClear,\n        handleTagClose,\n        handleFilter,\n        handleShowPopup,\n\n        stopEvent\n      }\n    }\n  })\n</script>\n\n<template>\n  <div :class=\"ns\">\n    <Trigger\n      v-model:popup-visible=\"popupVisible\"\n      position=\"bl\"\n      trigger=\"click\"\n      :unmount-on-close=\"false\"\n      animation-name=\"bn-slide-dynamic-origin\"\n      auto-fit-popup-min-width\n      :popup-offset=\"8\"\n      :disabled=\"mergeDisabled\"\n      @show=\"onShow\"\n      @hide=\"onHide\"\n    >\n      <template #default>\n        <SelectTrigger\n          :input-value=\"inputValue\"\n          :disabled=\"mergeDisabled\"\n          :size=\"mergeSize\"\n          :placeholder=\"placeholder\"\n          :clearable=\"clearable\"\n          :popup-visible=\"popupVisible\"\n          :multiple=\"multiple\"\n          :multiple-tags=\"multipleTags\"\n          :filterable=\"filterable\"\n          :popup-ref=\"popupRef\"\n          :card=\"card\"\n          :max-tag=\"maxTag\"\n          @clear=\"handleClear\"\n          @tag-close=\"handleTagClose\"\n          @filter=\"handleFilter\"\n          @show=\"handleShowPopup\"\n        />\n      </template>\n\n      <template #content>\n        <div ref=\"popupRef\" :class=\"[`${ns}__menu`, popupClass]\">\n          <Scrollbar v-if=\"!isEmpty\" style=\"max-height: 224px\">\n            <Tree\n              ref=\"treeRef\"\n              :[modelType]=\"selected\"\n              :data=\"treeRenderData\"\n              :multiple=\"multiple\"\n              :unfold-on-click-node=\"unfoldOnClickNode\"\n              :checked-on-click-node=\"checkedOnClickNode\"\n              :show-checkbox=\"modelType === 'checked'\"\n              :check-strictly=\"checkStrictly\"\n              :show-line=\"showLine\"\n              :default-unfold-all=\"defaultUnfoldAll\"\n              :default-unfold-values=\"defaultUnfoldValues\"\n              :accordion=\"accordion\"\n              v-on=\"treeBindEvents\"\n            >\n              <template v-if=\"$slots['node-icon']\" #node-icon=\"scoped\">\n                <slot name=\"node-icon\" v-bind=\"scoped\"></slot>\n              </template>\n              <template v-if=\"$slots['node-label']\" #node-label=\"scoped\">\n                <slot name=\"node-label\" v-bind=\"scoped\"></slot>\n              </template>\n              <template v-if=\"$slots['node-extra']\" #node-extra=\"scoped\">\n                <slot name=\"node-extra\" v-bind=\"scoped\"></slot>\n              </template>\n            </Tree>\n          </Scrollbar>\n          <div v-if=\"isEmpty\" :class=\"[`${ns}__empty`]\">\n            <slot name=\"empty\">\n              <Empty :description=\"noDataText\">\n                <template #image>\n                  <BnIconEmpty size=\"38\" />\n                </template>\n              </Empty>\n            </slot>\n          </div>\n\n          <div v-if=\"!isEmpty && !treeRenderData.length\" :class=\"[`${ns}__empty`, 'is-no-matcher']\">\n            <slot name=\"empty\">\n              <Empty description=\"暂无匹配项\">\n                <template #image>\n                  <BnIconEmpty size=\"38\" />\n                </template>\n              </Empty>\n            </slot>\n          </div>\n        </div>\n      </template>\n    </Trigger>\n  </div>\n</template>\n"],"names":["tag","_a"],"mappings":"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"}