@cldemo/ui-kit 1.0.10 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/buildLibs/utils/Element/ClCheckboxOne.cjs +2 -0
- package/buildLibs/utils/Element/ClCheckboxOne.cjs.map +1 -0
- package/buildLibs/utils/Element/ClCheckboxOne.js +5 -0
- package/buildLibs/utils/Element/ClCheckboxOne.js.map +1 -0
- package/buildLibs/utils/Element/ClFormValidate.cjs +2 -0
- package/buildLibs/utils/Element/ClFormValidate.cjs.map +1 -0
- package/buildLibs/utils/Element/ClFormValidate.js +5 -0
- package/buildLibs/utils/Element/ClFormValidate.js.map +1 -0
- package/buildLibs/utils/Element/ClImage.cjs +1 -1
- package/buildLibs/utils/Element/ClImage.js +1 -1
- package/buildLibs/utils/Element/ClLoadFullCenter.cjs +2 -0
- package/buildLibs/utils/Element/ClLoadFullCenter.cjs.map +1 -0
- package/buildLibs/utils/Element/ClLoadFullCenter.css +1 -0
- package/buildLibs/utils/Element/ClLoadFullCenter.js +45 -0
- package/buildLibs/utils/Element/ClLoadFullCenter.js.map +1 -0
- package/buildLibs/utils/Element/ClLoadIng.cjs +2 -0
- package/buildLibs/utils/Element/ClLoadIng.cjs.map +1 -0
- package/buildLibs/utils/Element/ClLoadIng.js +5 -0
- package/buildLibs/utils/Element/ClLoadIng.js.map +1 -0
- package/buildLibs/utils/Element/ClLoadWarp.cjs +2 -0
- package/buildLibs/utils/Element/ClLoadWarp.cjs.map +1 -0
- package/buildLibs/utils/Element/ClLoadWarp.css +1 -0
- package/buildLibs/utils/Element/ClLoadWarp.js +53 -0
- package/buildLibs/utils/Element/ClLoadWarp.js.map +1 -0
- package/buildLibs/utils/Element/ClRadioOne.cjs +2 -0
- package/buildLibs/utils/Element/ClRadioOne.cjs.map +1 -0
- package/buildLibs/utils/Element/ClRadioOne.js +5 -0
- package/buildLibs/utils/Element/ClRadioOne.js.map +1 -0
- package/buildLibs/utils/Element/ClTransitionSlideupdown.cjs +2 -0
- package/buildLibs/utils/Element/ClTransitionSlideupdown.cjs.map +1 -0
- package/buildLibs/utils/Element/ClTransitionSlideupdown.js +5 -0
- package/buildLibs/utils/Element/ClTransitionSlideupdown.js.map +1 -0
- package/buildLibs/utils/Element/ClWaterfallImage.cjs +2 -0
- package/buildLibs/utils/Element/ClWaterfallImage.cjs.map +1 -0
- package/buildLibs/utils/Element/ClWaterfallImage.css +1 -0
- package/buildLibs/utils/Element/ClWaterfallImage.js +48 -0
- package/buildLibs/utils/Element/ClWaterfallImage.js.map +1 -0
- package/buildLibs/utils/Mobile/ClBanner.cjs +1 -1
- package/buildLibs/utils/Mobile/ClBanner.js +1 -1
- package/buildLibs/utils/Mobile/ClDropdownMenuM.cjs +1 -1
- package/buildLibs/utils/Mobile/ClDropdownMenuM.cjs.map +1 -1
- package/buildLibs/utils/Mobile/ClDropdownMenuM.js +13 -12
- package/buildLibs/utils/Mobile/ClDropdownMenuM.js.map +1 -1
- package/buildLibs/utils/Mobile/ClDropdownMenuMItem.cjs +2 -0
- package/buildLibs/utils/Mobile/ClDropdownMenuMItem.cjs.map +1 -0
- package/buildLibs/utils/Mobile/ClDropdownMenuMItem.js +160 -0
- package/buildLibs/utils/Mobile/ClDropdownMenuMItem.js.map +1 -0
- package/buildLibs/utils/Mobile/ClPicker.cjs +1 -1
- package/buildLibs/utils/Mobile/ClPicker.js +1 -1
- package/buildLibs/utils/Mobile/ClPickerDate.cjs +1 -1
- package/buildLibs/utils/Mobile/ClPickerDate.js +1 -1
- package/buildLibs/utils/Mobile/ClPickerTime.cjs +1 -1
- package/buildLibs/utils/Mobile/ClPickerTime.js +1 -1
- package/buildLibs/utils/Mobile/ClPullToRefresh.cjs +1 -1
- package/buildLibs/utils/Mobile/ClPullToRefresh.js +1 -1
- package/buildLibs/utils/Mobile/ClScrollCard.cjs +1 -1
- package/buildLibs/utils/Mobile/ClScrollCard.js +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BPgunUb2.js → Index.vue_vue_type_script_setup_true_lang-6KT1IHDu.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BPgunUb2.js.map → Index.vue_vue_type_script_setup_true_lang-6KT1IHDu.js.map} +1 -1
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yZtW91.js +71 -0
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yZtW91.js.map +1 -0
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-gtDsWrhd.js → Index.vue_vue_type_script_setup_true_lang-BDPkmgGP.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-gtDsWrhd.js.map → Index.vue_vue_type_script_setup_true_lang-BDPkmgGP.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-D_IwyxiV.js → Index.vue_vue_type_script_setup_true_lang-Bnjm8vi-.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-D_IwyxiV.js.map → Index.vue_vue_type_script_setup_true_lang-Bnjm8vi-.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Cpb9rd-y.js → Index.vue_vue_type_script_setup_true_lang-Bs8FGIQa.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Cpb9rd-y.js.map → Index.vue_vue_type_script_setup_true_lang-Bs8FGIQa.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-hm75HKxP.js → Index.vue_vue_type_script_setup_true_lang-C7FRB7fV.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-hm75HKxP.js.map → Index.vue_vue_type_script_setup_true_lang-C7FRB7fV.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Xe4BacqD.js → Index.vue_vue_type_script_setup_true_lang-CFzimlB_.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Xe4BacqD.js.map → Index.vue_vue_type_script_setup_true_lang-CFzimlB_.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Bp39ENoP.js → Index.vue_vue_type_script_setup_true_lang-CGeXNRtY.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Bp39ENoP.js.map → Index.vue_vue_type_script_setup_true_lang-CGeXNRtY.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-4NloX3Qk.js → Index.vue_vue_type_script_setup_true_lang-CSV9UWJx.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-4NloX3Qk.js.map → Index.vue_vue_type_script_setup_true_lang-CSV9UWJx.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-CRJ3-pTH.js → Index.vue_vue_type_script_setup_true_lang-ChE1tZwr.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-CRJ3-pTH.js.map → Index.vue_vue_type_script_setup_true_lang-ChE1tZwr.js.map} +1 -1
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CjgtxJ6a.js +2 -0
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CjgtxJ6a.js.map +1 -0
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-N1GhNa1r.js → Index.vue_vue_type_script_setup_true_lang-CpuYxzDD.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-N1GhNa1r.js.map → Index.vue_vue_type_script_setup_true_lang-CpuYxzDD.js.map} +1 -1
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CumTbPny.js +2 -0
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CumTbPny.js.map +1 -0
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-NdqbsOrG.js → Index.vue_vue_type_script_setup_true_lang-CvF_iIQS.js} +2 -2
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-NdqbsOrG.js.map → Index.vue_vue_type_script_setup_true_lang-CvF_iIQS.js.map} +1 -1
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CxVAWr6w.js +266 -0
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CxVAWr6w.js.map +1 -0
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-DgMvq-RQ.js → Index.vue_vue_type_script_setup_true_lang-DFKjhT_C.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-DgMvq-RQ.js.map → Index.vue_vue_type_script_setup_true_lang-DFKjhT_C.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-D22m4oiN.js → Index.vue_vue_type_script_setup_true_lang-DdWmaT86.js} +2 -2
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-D22m4oiN.js.map → Index.vue_vue_type_script_setup_true_lang-DdWmaT86.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BtoovAWs.js → Index.vue_vue_type_script_setup_true_lang-DxHfO8TH.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BtoovAWs.js.map → Index.vue_vue_type_script_setup_true_lang-DxHfO8TH.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-CW63TdvW.js → Index.vue_vue_type_script_setup_true_lang-HwprdMv4.js} +2 -2
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-CW63TdvW.js.map → Index.vue_vue_type_script_setup_true_lang-HwprdMv4.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BLp0owhs.js → Index.vue_vue_type_script_setup_true_lang-IGgTDykL.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BLp0owhs.js.map → Index.vue_vue_type_script_setup_true_lang-IGgTDykL.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BKr3_J68.js → Index.vue_vue_type_script_setup_true_lang-Lwl-M8kR.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BKr3_J68.js.map → Index.vue_vue_type_script_setup_true_lang-Lwl-M8kR.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Dxb_K2w0.js → Index.vue_vue_type_script_setup_true_lang-gsnpWNek.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Dxb_K2w0.js.map → Index.vue_vue_type_script_setup_true_lang-gsnpWNek.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-EGKo8cIw.js → Index.vue_vue_type_script_setup_true_lang-huUkL0wY.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-EGKo8cIw.js.map → Index.vue_vue_type_script_setup_true_lang-huUkL0wY.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BFSRH9yz.js → Index.vue_vue_type_script_setup_true_lang-in1ZSapu.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BFSRH9yz.js.map → Index.vue_vue_type_script_setup_true_lang-in1ZSapu.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-C8HQVerr.js → Index.vue_vue_type_script_setup_true_lang-r6RBdV4y.js} +2 -2
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-C8HQVerr.js.map → Index.vue_vue_type_script_setup_true_lang-r6RBdV4y.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-DvzXfKhj.js → Index.vue_vue_type_script_setup_true_lang-tTHdssVu.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-DvzXfKhj.js.map → Index.vue_vue_type_script_setup_true_lang-tTHdssVu.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BxxIDGfR.js → Index.vue_vue_type_script_setup_true_lang-tjRv0vNR.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BxxIDGfR.js.map → Index.vue_vue_type_script_setup_true_lang-tjRv0vNR.js.map} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Bk2WD0GS.js → Index.vue_vue_type_script_setup_true_lang-yahz6Ej5.js} +1 -1
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Bk2WD0GS.js.map → Index.vue_vue_type_script_setup_true_lang-yahz6Ej5.js.map} +1 -1
- package/buildLibs/utils/Shared/Index24.css +1 -1
- package/buildLibs/utils/Shared/Index25.css +1 -1
- package/buildLibs/utils/Shared/Index26.css +1 -1
- package/buildLibs/utils/Shared/Index27.css +1 -1
- package/buildLibs/utils/Shared/Index28.css +1 -1
- package/buildLibs/utils/Shared/Index29.css +1 -1
- package/buildLibs/utils/Shared/Index30.css +1 -1
- package/buildLibs/utils/Shared/Index31.css +1 -1
- package/buildLibs/utils/Shared/Index32.css +1 -1
- package/buildLibs/utils/Shared/Index33.css +1 -1
- package/buildLibs/utils/Shared/Index34.css +1 -1
- package/buildLibs/utils/Shared/Index35.css +1 -1
- package/buildLibs/utils/Shared/Index36.css +1 -1
- package/buildLibs/utils/Shared/Index37.css +1 -0
- package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-CR1t8XZl.js +2 -0
- package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-CR1t8XZl.js.map +1 -0
- package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-oBeFlRzi.js +148 -0
- package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-oBeFlRzi.js.map +1 -0
- package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-Bquk40ES.js +406 -0
- package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-Bquk40ES.js.map +1 -0
- package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-CAmKX5pn.js +2 -0
- package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-CAmKX5pn.js.map +1 -0
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-C9mOHVoE.js → use-CKNkvmW4.js} +78 -141
- package/buildLibs/utils/Shared/use-CKNkvmW4.js.map +1 -0
- package/buildLibs/utils/Shared/use-D0Yu2Dbn.js +2 -0
- package/buildLibs/utils/Shared/use-D0Yu2Dbn.js.map +1 -0
- package/buildLibs/utils/Web/ClCropperPreview.cjs +1 -1
- package/buildLibs/utils/Web/ClCropperPreview.js +2 -2
- package/buildLibs/utils/Web/ClDatetime.cjs +1 -1
- package/buildLibs/utils/Web/ClDatetime.js +1 -1
- package/buildLibs/utils/Web/ClDropdownMenuItem.cjs +2 -0
- package/buildLibs/utils/Web/ClDropdownMenuItem.cjs.map +1 -0
- package/buildLibs/utils/Web/ClDropdownMenuItem.css +1 -0
- package/buildLibs/utils/Web/ClDropdownMenuItem.js +72 -0
- package/buildLibs/utils/Web/ClDropdownMenuItem.js.map +1 -0
- package/buildLibs/utils/Web/ClEcharts.cjs +1 -1
- package/buildLibs/utils/Web/ClEcharts.js +1 -1
- package/buildLibs/utils/Web/ClEchartsLineAxisTag.cjs +1 -1
- package/buildLibs/utils/Web/ClEchartsLineAxisTag.js +1 -1
- package/buildLibs/utils/Web/ClFileUpload.cjs +1 -1
- package/buildLibs/utils/Web/ClFileUpload.js +1 -1
- package/buildLibs/utils/Web/ClInputTag.cjs +1 -1
- package/buildLibs/utils/Web/ClInputTag.js +1 -1
- package/buildLibs/utils/Web/ClPaginate.cjs +1 -1
- package/buildLibs/utils/Web/ClPaginate.js +1 -1
- package/buildLibs/utils/Web/ClPreviewExample.cjs +1 -1
- package/buildLibs/utils/Web/ClPreviewExample.js +1 -1
- package/buildLibs/utils/Web/ClScrollXFence.cjs +1 -1
- package/buildLibs/utils/Web/ClScrollXFence.js +1 -1
- package/buildLibs/utils/Web/ClSelect.cjs +1 -1
- package/buildLibs/utils/Web/ClSelect.js +1 -1
- package/buildLibs/utils/Web/ClSelectCascade.cjs +1 -1
- package/buildLibs/utils/Web/ClSelectCascade.js +1 -1
- package/buildLibs/utils/Web/ClSelectTag.cjs +1 -1
- package/buildLibs/utils/Web/ClSelectTag.js +1 -1
- package/buildLibs/utils/Web/ClSelectTree.cjs +1 -1
- package/buildLibs/utils/Web/ClSelectTree.js +1 -1
- package/buildLibs/utils/Web/ClTable.cjs +1 -1
- package/buildLibs/utils/Web/ClTable.cjs.map +1 -1
- package/buildLibs/utils/Web/ClTable.js +1081 -1218
- package/buildLibs/utils/Web/ClTable.js.map +1 -1
- package/buildLibs/utils/Web/ClTabs.cjs +1 -1
- package/buildLibs/utils/Web/ClTabs.js +1 -1
- package/buildLibs/utils/Web/ClTree.cjs +1 -1
- package/buildLibs/utils/Web/ClTree.js +1 -1
- package/buildLibs/utils/Web/ClXeditable.cjs +1 -1
- package/buildLibs/utils/Web/ClXeditable.cjs.map +1 -1
- package/buildLibs/utils/Web/ClXeditable.js +33 -32
- package/buildLibs/utils/Web/ClXeditable.js.map +1 -1
- package/package.json +21 -8
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yxIx8F.js +0 -663
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yxIx8F.js.map +0 -1
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-C9mOHVoE.js.map +0 -1
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CcOk4kyd.js +0 -2
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CcOk4kyd.js.map +0 -1
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-DtZgYjSl.js +0 -2
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-DtZgYjSl.js.map +0 -1
- package/buildLibs/utils/Shared/Video-BV0YLYT2.js +0 -114
- package/buildLibs/utils/Shared/Video-BV0YLYT2.js.map +0 -1
- package/buildLibs/utils/Shared/Video-c3jHJSxl.js +0 -2
- package/buildLibs/utils/Shared/Video-c3jHJSxl.js.map +0 -1
- package/buildLibs/utils/Shared/Video.css +0 -1
- package/buildLibs/utils/Web/ClDropdownMenuM.css +0 -1
- package/buildLibs/utils/Web/ClPreview.cjs +0 -2
- package/buildLibs/utils/Web/ClPreview.cjs.map +0 -1
- package/buildLibs/utils/Web/ClPreview.css +0 -1
- package/buildLibs/utils/Web/ClPreview.js +0 -353
- package/buildLibs/utils/Web/ClPreview.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Index.vue_vue_type_script_setup_true_lang-BPgunUb2.js","sources":["../../../src/libs/Web/Select/Dropdown.vue","../../../src/libs/Web/Select/Tags.vue","../../../src/libs/Web/Select/Index.vue"],"sourcesContent":["<template>\n <div\n class=\"select-inDropdown-container\"\n :id=\"elId\"\n ref=\"refElRoot\"\n >\n <div\n v-if=\"isSearch\"\n class=\"select-inDropdown-search\"\n role=\"search\"\n aria-label=\"搜索选项\"\n >\n <cl-input-search\n ref=\"refElSearch\"\n :placeholder=\"searchPlaceholder\"\n :disabled=\"disabled\"\n @onChange=\"onSearch\"\n ></cl-input-search>\n </div>\n <template v-else></template>\n <div\n class=\"select-inDropdown-checkboxAll\"\n v-if=\"isMultiple && isCheckBoxAll && optShowAllData.length > 0\"\n >\n <cl-checkbox-one\n :forId=\"`${optKeyIndex}-cb-all`\"\n :label=\"optPageLanguage.checkboxAll\"\n :value=\"optAllValue\"\n :disabled=\"disabled\"\n @onChange=\"onSelectAll\"\n ></cl-checkbox-one>\n </div>\n <template v-else></template>\n <recycle-scroller\n v-if=\"optShowAllData.length > 0\"\n class=\"select-inDropdown-body select-inDropdown-scroller\"\n role=\"listbox\"\n :style=\"{ height: Math.min(optShowAllData.length * ITEM_HEIGHT, MAX_DROPDOWN_HEIGHT) + 'px' }\"\n :items=\"optShowAllData\"\n :item-size=\"ITEM_HEIGHT\"\n key-field=\"id\"\n ref=\"refElScroller\"\n v-slot=\"{ item }\"\n @scroll-end=\"_loadMore\"\n >\n <div\n role=\"option\"\n :aria-selected=\"optIsItemChecked(item)\"\n :aria-disabled=\"item.isDisabled || false\"\n :class=\"{\n 'option-selected': optIsItemChecked(item),\n 'option-disabled': item.isDisabled,\n 'option-hoverKeydown': optHoverKeydown === item.id.toString(),\n 'select-inDropdown-item-child': item._level >= 1,\n }\"\n :style=\"{\n height: ITEM_HEIGHT + 'px',\n paddingLeft: item._level ? item._level * LEVEL_INDENT + 'px' : undefined,\n }\"\n @click=\"onSelectItem(item)\"\n >\n <div class=\"select-inDropdown-item-inner\">\n <div\n class=\"select-inDropdown-checkbox\"\n v-if=\"isMultiple\"\n >\n <cl-checkbox-one\n :name=\"`${optKeyIndex}-cb`\"\n :forId=\"`${optKeyIndex}-cb-${item.id}`\"\n :value=\"optIsItemChecked(item)\"\n :disabled=\"item.isDisabled\"\n ></cl-checkbox-one>\n </div>\n <template v-else></template>\n <div\n class=\"select-inDropdown-title\"\n v-html=\"_formatItemLabel(item)\"\n ></div>\n </div>\n </div>\n </recycle-scroller>\n <div\n v-else\n class=\"select-inDropdown-body\"\n >\n <div class=\"select-inDropdown-empty\">{{ optPageLanguage.noResultsText }}</div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n inject,\n onMounted,\n onBeforeUnmount,\n onDeactivated,\n onActivated,\n nextTick,\n watch,\n computed,\n ref,\n} from 'vue';\nimport { RecycleScroller } from 'vue-virtual-scroller';\nimport 'vue-virtual-scroller/dist/vue-virtual-scroller.css';\nimport CommonBase from '../../Common/base';\nimport CommonElement from '../../Common/Element/index';\nimport ClInputSearch from '../../Element/InputSearch/Index.vue';\nimport ClCheckboxOne from '../../Element/CheckBox/One.vue';\nimport type { SelectTopProvide } from './Index.vue';\nimport useLanguage from '../../Use/language';\n\ndefineOptions({ name: 'ClSelectInDropdown' });\n\nconst props = defineProps({\n id: String, // desc: 组件实例唯一标识,用于多实例场景下 DOM 查询限定\n disabled: {\n type: Boolean,\n default: false, // desc: 组件是否禁用,禁用时不响应点击和键盘操作\n },\n isSearch: {\n type: Boolean,\n default: false, // desc: 是否启用搜索\n },\n searchPlaceholder: String, // desc: 搜索框占位文本\n searchKey: {\n type: Array as () => string[],\n default: () => ['name'], // desc: 搜索匹配的字段名列表\n },\n searchKeyType: {\n type: String,\n default: '||', // desc: 多字段搜索匹配逻辑 | enum: ||, &&\n },\n isMultiple: {\n type: Boolean,\n default: false, // desc: 是否多选\n },\n isCheckBoxAll: {\n type: Boolean,\n default: true, // desc: 是否显示全选复选框\n },\n showDropDownTextFormat: String, // desc: 下拉项显示文本格式化\n showDropDownTextFormatSub: String, // desc: 二级下拉项显示文本格式化\n isCascade: {\n type: Boolean,\n default: false, // desc: 是否启用级联\n },\n parentSelectable: {\n type: Boolean,\n default: false, // desc: 级联时父级是否可被选中\n },\n parentKey: {\n type: String,\n default: 'parentId', // desc: 数据中标识父级的字段名\n },\n topParentValue: {\n type: String,\n default: '0', // desc: 顶级父节点的 parentKey 值\n },\n originalData: {\n type: Array as () => any[],\n default: () => [], // desc: 选项数据列表,外部传入的原始数据\n },\n keyIndex: String, // desc: 组件实例唯一标识\n isOpen: {\n type: Boolean,\n default: false, // desc: 下拉面板是否打开\n },\n selectId: {\n type: Array as () => string[],\n default: () => [], // desc: 已选中的 id 数组,用于标记当前选中项\n },\n serverCallback: Function, // desc: 服务端数据加载回调,入参 { search, offset },返回 Promise<Array>\n});\n\nconst emit = defineEmits({\n onChange: (_ids: string[]) => true, // desc: 选中项变更时触发\n onInitComplete: () => true, // desc: 下拉初始化完成时触发\n onError: (_message: string) => true, // desc: 服务端加载/搜索失败时触发,入参为中文错误提示\n});\n\n// kb: ↑↓ 移动高亮(首尾循环,全局生效——面板打开期间任意焦点位置可移动高亮),\n// Enter 选中高亮项(仅面板内/body 焦点),Esc 关闭下拉\n\nconst { optPageLanguage, getPageLanguage } = useLanguage();\ngetPageLanguage('common');\n\nconst _selfTop = inject<SelectTopProvide>('$SelectTop', {} as SelectTopProvide);\n// 防御:脱离 ClSelect 独立使用时 inject 为空对象,方法调用前需判空\nconst _hasParent = typeof _selfTop.getSelectData === 'function';\nconst refElSearch = ref<InstanceType<typeof ClInputSearch> | null>(null);\nconst refElScroller = ref<InstanceType<typeof RecycleScroller> | null>(null);\nconst refElRoot = ref<HTMLDivElement | null>(null);\n\nlet _isUpdateOriginalData = true;\nconst _pageData: any = { isScrollLoading: false, hasMoreData: true };\nlet _rawCascadeData: any[] = []; // 级联模式:原始数据累加器,避免重复 flatten\nlet _searchSeq = 0; // 搜索请求版本号,防止过期结果覆盖最新搜索结果\nlet _pageSeq = 0; // 分页加载请求版本号(与搜索独立,防滚动加载覆盖搜索结果)\n\n// 虚拟滚动常量\nconst ITEM_HEIGHT = 35;\nconst MAX_DROPDOWN_HEIGHT = 210;\nconst LEVEL_INDENT = 20;\n\nconst elId = props.id; // || `select-inDropdown-${CommonBase.getRandom(5)}`\nconst optKeyIndex = `select-inList-${props.keyIndex || ''}`;\nlet _isKeyListenerBound = false; // 键盘监听注册状态(防重复注册)\nconst optHoverKeydown = ref('');\nconst optShowAllData = ref<any[]>([]);\nconst _optUseAllId = ref<string[]>([]);\nlet _showAllDataJson: any = {};\n\n// 选项选中判定:级联父级显示子集全选联动状态(父级 id 不进 selectId,\n// 父级 CheckBox/高亮以「非禁用子集是否全部选中」为准,与 _getSelectIds 父级分支语义一致)\nconst optIsItemChecked = (info: any) => {\n const id = info.id.toString();\n if (props.isCascade && info._hasChildren && props.parentSelectable && _hasParent) {\n const childIds: string[] = _selfTop.getAllChildIds(id);\n const enableChildIds = childIds.filter((cid: string) => {\n const cInfo = _selfTop.getSelectValueInfo(cid);\n return !cInfo?.isDisabled;\n });\n if (enableChildIds.length === 0) return false;\n return enableChildIds.every((cid: string) => CommonBase.isExistValue(props.selectId, cid));\n }\n return CommonBase.isExistValue(props.selectId, id);\n};\n\nconst optAllValue = computed(() => {\n let b = false;\n const len = _optUseAllId.value.length;\n if (len > 0) {\n if (props.selectId.length >= _optUseAllId.value.length) {\n b = CommonBase.isContainArr(props.selectId, _optUseAllId.value);\n }\n }\n return b;\n});\n\nconst _formatItemLabel = (info: any) => {\n if (!info || typeof info !== 'object') return '';\n // 类型守卫:format 为 String prop,外部传非字符串时降级为空(防 convertStringFormat 崩溃)\n let format = CommonBase.isNonEmptyString(props.showDropDownTextFormat)\n ? props.showDropDownTextFormat\n : '';\n if (info._level >= 1 && CommonBase.isNonEmptyString(props.showDropDownTextFormatSub)) {\n format = props.showDropDownTextFormatSub;\n }\n\n let v = CommonBase.isEmpty(format) ? info.name : CommonBase.convertStringFormat(format, info);\n if (CommonBase.isHtml(v)) {\n if (CommonBase.isEmpty(format) && CommonBase.isHtml(info.name)) {\n v = CommonBase.encodeHTML(info.name);\n } else {\n v = CommonBase.convertStringFormatEncodeHTML(format, info);\n }\n } else if (typeof v === 'string' && v.indexOf('<') > -1) {\n // isHtml 正则盲区兜底:无空格变体(如 <img/src=x onerror=...>)漏判,含 < 即转义。\n // 注意:数据 name 含 HTML 会被转义为字面文本,有意渲染 HTML 需写在 format 模板中\n v = CommonBase.encodeHTML(v);\n }\n return v;\n};\n\nconst _checkIsTypeRadio = (id: any) => {\n const temInfo = _showAllDataJson[id] || {};\n if (CommonBase.isBoolean(temInfo._isTypeRadio)) {\n return temInfo._isTypeRadio;\n }\n // fallback:显示列表未命中(搜索过滤/分页未加载)时查父级数据映射,\n // 防止已选 radio 项被过滤后互斥失效(两个 radio 同时选中)。\n // serverCallback 未加载页的 radio 项由 Index 侧数据注入后的互斥收敛补全\n if (_hasParent) {\n const fullInfo = _selfTop.getSelectValueInfo(id);\n if (CommonBase.isBoolean(fullInfo?._isTypeRadio)) {\n return fullInfo._isTypeRadio;\n }\n }\n return false;\n};\n\nconst _setUseAllId = () => {\n const ids: string[] = [];\n _showAllDataJson = CommonBase.getJsonByList(optShowAllData.value);\n optShowAllData.value.forEach((info: any) => {\n // 入口已过滤非对象数据项,非对象分支为死代码且会破坏 string[] 类型契约\n if (!CommonBase.isObject(info)) return;\n const _tid = typeof info.id;\n if (\n info.id == null ||\n (_tid !== 'string' && (_tid !== 'number' || !CommonBase.isFinite(info.id)))\n )\n return;\n const id = info.id.toString();\n // 级联模式:useAllId 只收集叶子节点,父级通过展开处理\n if (props.isCascade && info._hasChildren) return;\n if (!_checkIsTypeRadio(id)) {\n // 去重:数据含重复 id 时只收一次(防全选判定 length 失真)\n if (CommonBase.isExistValue(ids, id)) return;\n if (info.isDisabled) {\n if (CommonBase.isExistValue(props.selectId, id)) {\n ids.push(id);\n }\n } else {\n ids.push(id);\n }\n }\n });\n _optUseAllId.value = ids;\n};\n\n// 级联:扁平数据 → 平铺树(带 _level, _parentName, _hasChildren)\nconst _buildFlatList = (list: any[]) => {\n const parentKey = props.parentKey as string;\n const topParentValue = props.topParentValue as string;\n const childrenMap: Record<string, any[]> = {};\n list.forEach((item: any) => {\n // 防御:null/非对象数据项跳过,防止属性访问崩溃\n if (!CommonBase.isObject(item)) return;\n if (\n item.id == null ||\n (typeof item.id !== 'string' &&\n (typeof item.id !== 'number' || !CommonBase.isFinite(item.id)))\n )\n return;\n const pid = item[parentKey];\n const pidStr =\n pid != null && (typeof pid === 'string' || typeof pid === 'number') ? pid.toString() : '';\n // 数字 0 的 parentKey 是合法值(顶层标记),不能按 falsy 丢弃;\n // 统一转字符串 key,保证与 traverse 的 childrenMap[id](string)检索一致;\n // topParentValue 同样 String 化(外部传数字 0 时与字符串 '0' 对齐)\n if (pidStr !== '' && pidStr !== String(topParentValue)) {\n if (!childrenMap[pidStr]) childrenMap[pidStr] = [];\n childrenMap[pidStr].push(item);\n }\n });\n const result: any[] = [];\n const traverse = (nodes: any[], level: number, parentName: string, visited: Set<string>) => {\n nodes.forEach((node: any) => {\n const id = node.id.toString();\n // 循环引用检测\n if (visited.has(id)) return;\n visited.add(id);\n const children = childrenMap[id] || [];\n result.push({\n ...node,\n _level: level,\n _parentName: parentName,\n _hasChildren: children.length > 0,\n });\n if (children.length > 0) {\n traverse(children, level + 1, node.name, visited);\n }\n });\n };\n const topNodes = list.filter((item: any) => {\n // 防御:null/非对象与无 id 的数据项不进入顶层(与 _refreshData 非级联分支过滤一致),\n // 防止属性访问与 traverse 中 item.id.toString() 崩溃\n if (!CommonBase.isObject(item)) return false;\n if (\n item.id == null ||\n (typeof item.id !== 'string' &&\n (typeof item.id !== 'number' || !CommonBase.isFinite(item.id)))\n )\n return false;\n const pid = item[parentKey];\n const pidStr =\n pid != null && (typeof pid === 'string' || typeof pid === 'number') ? pid.toString() : '';\n return CommonBase.isEmpty(pidStr) || pidStr === String(topParentValue);\n });\n traverse(topNodes, 0, '', new Set<string>());\n return result;\n};\n\n// 级联搜索补全:子级补所有祖先,父级递归补所有后代\nconst _cascadeSearchFill = (filteredList: any[], allData: any[]) => {\n if (!_hasParent) return filteredList; // 脱离父组件时降级返回原始数据\n // 过滤无 id 的项,防止服务端返回不规范数据导致 item.id.toString() 崩溃\n const safeFiltered = filteredList.filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n const safeAllData = allData.filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n const parentKey = props.parentKey as string;\n const topParentValue = props.topParentValue as string;\n const resultIds = new Set<string>();\n const filteredIds = new Set(safeFiltered.map((item: any) => item.id.toString()));\n safeFiltered.forEach((item: any) => {\n const id = item.id.toString();\n resultIds.add(id);\n // 子级:循环追溯所有祖先\n const visitedAncestors = new Set<string>();\n let currentId: any = item[parentKey];\n while (\n currentId != null &&\n (typeof currentId === 'string' || typeof currentId === 'number') &&\n currentId.toString() !== String(topParentValue)\n ) {\n const currentIdStr = currentId.toString();\n // 循环引用检测:祖先链上已出现过此节点,终止追溯\n if (visitedAncestors.has(currentIdStr)) break;\n visitedAncestors.add(currentIdStr);\n if (!filteredIds.has(currentIdStr)) {\n resultIds.add(currentIdStr);\n }\n const parentInfo = _selfTop.getSelectValueInfo(currentIdStr);\n currentId = parentInfo?.[parentKey];\n }\n // 父级:递归补所有后代(含孙子级及更深)\n const allDescendants: string[] = _selfTop.getAllChildIds(id);\n allDescendants.forEach((childId: string) => {\n resultIds.add(childId);\n });\n });\n const result = safeAllData.filter((item: any) => resultIds.has(item.id.toString()));\n // 补充 allData 中缺失但 resultIds 中存在的数据项\n // (serverCallback 分页加载的数据不在 props.originalData 中,但需出现在搜索结果里)\n const foundIds = new Set(result.map((item: any) => item.id.toString()));\n resultIds.forEach((rid: string) => {\n if (!foundIds.has(rid)) {\n const item = _selfTop.getSelectValueInfo(rid);\n if (item && Object.keys(item).length > 0) {\n result.push(item);\n }\n }\n });\n return result;\n};\n\nconst _refreshData = () => {\n if (_isUpdateOriginalData) {\n _isUpdateOriginalData = false;\n _pageData.hasMoreData = true;\n if (props.isCascade) {\n _rawCascadeData = [...((props.originalData || []) as any[])];\n optShowAllData.value = _buildFlatList(_rawCascadeData);\n } else {\n // 过滤无 id 数据项,防止模板中 item.id.toString() 崩溃\n optShowAllData.value = CommonBase.getListClone(props.originalData).filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n }\n _setUseAllId();\n _scrollToSelected();\n // 重建时重置 hover 高亮:防止上次关闭残留的 hover 项在重开后误选中\n optHoverKeydown.value = '';\n nextTick(() => {\n if (refElSearch.value) {\n refElSearch.value.setValue('');\n }\n });\n }\n};\n\nconst _scrollToSelected = () => {\n nextTick(() => {\n if (refElScroller.value && props.selectId.length > 0) {\n const idx = optShowAllData.value.findIndex(\n (info: any) =>\n info.id != null && CommonBase.isExistValue(props.selectId, info.id.toString()),\n );\n if (idx > -1) {\n refElScroller.value.scrollToItem(idx);\n }\n }\n });\n};\n\nconst _getSelectIds = (id: string) => {\n const newIds: string[] = [];\n const info = _showAllDataJson[id] || {};\n const isCascadeParent = props.isCascade && info._hasChildren;\n\n if (props.isMultiple) {\n if (_checkIsTypeRadio(id)) {\n if (!CommonBase.isExistValue(props.selectId, id)) {\n // radio 互斥:保留非 radio 项,清除已选的其他 radio 项\n (props.selectId as string[]).forEach((sId: string) => {\n if (!_checkIsTypeRadio(sId)) {\n newIds.push(sId);\n }\n });\n newIds.push(id);\n } else {\n // 已选中的 radio 再点击:取消自身,保留其他项(与普通项分支对称)\n (props.selectId as string[]).forEach((sId: string) => {\n if (sId !== id) {\n newIds.push(sId);\n }\n });\n }\n } else if (isCascadeParent && props.parentSelectable && _hasParent) {\n // 级联父级:选中/取消该父级下所有非禁用子级\n const childIds: string[] = _selfTop.getAllChildIds(id);\n const enableChildIds = childIds.filter((cid: string) => {\n const cInfo = _selfTop.getSelectValueInfo(cid);\n return !cInfo?.isDisabled;\n });\n const allSelected =\n enableChildIds.length > 0 &&\n enableChildIds.every((cid: string) => CommonBase.isExistValue(props.selectId, cid));\n // 保留不属于此父级的选中项 + 已选中的禁用子级\n // (radio 项原样保留,互斥仅在 radio 分支内部处理)\n (props.selectId as string[]).forEach((sId: string) => {\n if (!childIds.includes(sId)) {\n newIds.push(sId);\n } else if (childIds.includes(sId)) {\n const sInfo = _selfTop.getSelectValueInfo(sId);\n if (sInfo?.isDisabled) {\n newIds.push(sId);\n }\n }\n });\n // 如果之前没全选,则添加所有非禁用子级\n if (!allSelected) {\n enableChildIds.forEach((cid: string) => {\n if (!CommonBase.isExistValue(newIds, cid)) {\n newIds.push(cid);\n }\n });\n }\n } else if (isCascadeParent && !props.parentSelectable) {\n // 父级不可选,不响应\n return [...(props.selectId as string[])];\n } else {\n // 普通项(子级或非级联模式):保留其他所有项(radio 项原样保留,\n // 互斥仅在 radio 分支内部处理)\n (props.selectId as string[]).forEach((sId: string) => {\n if (sId !== id) {\n newIds.push(sId);\n }\n });\n if (!CommonBase.isExistValue(props.selectId, id)) {\n newIds.push(id);\n }\n }\n } else {\n // 单选\n if (isCascadeParent && !props.parentSelectable) {\n return [...(props.selectId as string[])];\n }\n newIds.push(id);\n }\n return newIds;\n};\n\nconst _setHover = (operateType: number) => {\n const data = optShowAllData.value;\n if (data.length === 0) return;\n let inx = -1;\n const lastHover = optHoverKeydown.value;\n if (lastHover.length > 0) {\n data.forEach((info: any, i: number) => {\n if (info.id.toString() === lastHover) {\n inx = i;\n }\n });\n inx += operateType;\n if (inx < 0) {\n inx = 0;\n } else if (inx >= data.length) {\n inx = data.length - 1;\n }\n } else {\n inx = 0;\n }\n optHoverKeydown.value = data[inx].id.toString();\n if (refElScroller.value) {\n refElScroller.value.scrollToItem(inx);\n }\n};\n\nconst _onWinKeydown = (e: KeyboardEvent) => {\n let keyCode: number | string = e.keyCode;\n if (!CommonBase.isUndefined(keyCode)) {\n keyCode = keyCode.toString();\n switch (keyCode) {\n case '13': {\n // 事件源防护:焦点在面板外且非 body 时不拦截(与 keyup 端对称),\n // 防止全局键盘接管误吞页面 Enter 操作\n const isInsidePanel =\n refElRoot.value && e.target instanceof Node && refElRoot.value.contains(e.target);\n if (e.target === document.body || isInsidePanel) {\n e.preventDefault();\n e.stopPropagation();\n }\n break;\n }\n case '38':\n e.preventDefault();\n e.stopPropagation();\n _setHover(-1);\n break;\n case '40':\n e.preventDefault();\n e.stopPropagation();\n _setHover(1);\n break;\n default:\n break;\n }\n }\n};\n\nconst _onWinKeyup = (e: KeyboardEvent) => {\n let keyCode: number | string = e.keyCode;\n if (!CommonBase.isUndefined(keyCode)) {\n keyCode = keyCode.toString();\n switch (keyCode) {\n case '27':\n if (_hasParent) _selfTop.closeDropdown?.();\n break;\n case '13': {\n const id = optHoverKeydown.value;\n if (!id || props.disabled || !props.isOpen) break; // 组件级禁用/关闭检查\n // 事件源防护:焦点在下拉面板外(页面其他控件)且非 body 时不响应,\n // 防止全局键盘接管误吞页面操作\n const isInsidePanel =\n refElRoot.value && e.target instanceof Node && refElRoot.value.contains(e.target);\n if (e.target !== document.body && !isInsidePanel) break;\n // 校验 hover 项仍在当前显示列表中,防止选中已被搜索过滤掉的项\n if (!optShowAllData.value.some((info: any) => info.id.toString() === id)) break;\n const hoverInfo = _showAllDataJson[id];\n if (hoverInfo?.isDisabled) break;\n const newIds: string[] = _getSelectIds(id);\n emit('onChange', newIds);\n break;\n }\n default:\n break;\n }\n }\n};\n\n// 从 _buildFlatList 生成的显示数据中恢复原始数据(去除 _level/_parentName/_hasChildren)\nconst _recoverRawFromFlat = (flatList: any[]) => {\n return flatList.map((item: any) => {\n const { _level, _parentName, _hasChildren, ...raw } = item;\n return raw;\n });\n};\n\nconst _loadMore = async () => {\n // 无服务端回调时本地数据无需分页,直接退出(原 else 分支空转置位)\n if (!props.serverCallback) return;\n if (_pageData.isScrollLoading || !_pageData.hasMoreData) return;\n _pageData.isScrollLoading = true;\n if (props.serverCallback) {\n const loadSeq = ++_pageSeq;\n // 引用快照:await 期间 originalData 更新会重建 optShowAllData,据此丢弃过期分页结果\n const curList = optShowAllData.value;\n try {\n const param: any = { offset: curList.length };\n if (props.isSearch && refElSearch.value) {\n const searchValue = refElSearch.value.getValue();\n if (!CommonBase.isEmpty(searchValue)) {\n param.search = searchValue;\n }\n }\n const nextList = await props.serverCallback(param);\n // 并发保护:加载期间发生了搜索/列表重建等操作,丢弃过期结果\n if (loadSeq !== _pageSeq || curList !== optShowAllData.value) return;\n // 防御:校验服务端返回值是否为数组\n if (!Array.isArray(nextList)) {\n console.error('[ClSelect] _loadMore 服务端返回数据格式异常(非数组):', typeof nextList);\n emit('onError', '服务端加载失败:返回数据格式异常');\n return;\n }\n // 服务端返回空数组表示数据已全部加载\n if (nextList.length === 0) {\n _pageData.hasMoreData = false;\n return;\n }\n // 去重:过滤已存在于当前显示列表的数据项\n const existingIds = new Set(curList.map((item: any) => item?.id?.toString()).filter(Boolean));\n const dedupedList = nextList.filter((item: any) => {\n if (item?.id == null) return false;\n // 与 _refreshData 过滤标准一致:id 类型校验(防对象 id 产出 '[object Object]')\n const idType = typeof item.id;\n if (idType !== 'string' && (idType !== 'number' || !CommonBase.isFinite(item.id))) {\n return false;\n }\n return !existingIds.has(item.id.toString());\n });\n // 服务端返回全部重复(无新增)时视为数据已到尽头,终止加载防止无限请求循环\n if (dedupedList.length === 0) {\n _pageData.hasMoreData = false;\n return;\n }\n if (props.isCascade) {\n if (param.search) {\n // 搜索模式:数据量小,直接用展开方式追加\n optShowAllData.value = _buildFlatList([...optShowAllData.value, ...dedupedList]);\n } else {\n // 非搜索模式:使用累加器避免重复 flatten\n if (_rawCascadeData.length === 0) {\n // 防御:优先从当前显示数据恢复累加器,避免 onSearch 清空 _rawCascadeData 后\n // 回退到 props.originalData 导致丢失之前 serverCallback 加载的数据\n _rawCascadeData = _recoverRawFromFlat(optShowAllData.value);\n }\n if (_rawCascadeData.length === 0) {\n // 当前显示数据也为空时才回退到 props.originalData\n _rawCascadeData = [...(props.originalData as any[])];\n }\n _rawCascadeData.push(...dedupedList);\n optShowAllData.value = _buildFlatList(_rawCascadeData);\n }\n } else {\n optShowAllData.value.push(...dedupedList);\n }\n _setUseAllId();\n if (_hasParent) {\n _selfTop.convertListToJson(dedupedList);\n _selfTop.refreshDisplayLabels?.();\n }\n } catch (_err) {\n console.error('[ClSelect] _loadMore 服务端加载失败:', _err);\n emit('onError', '服务端加载失败,请稍后重试');\n } finally {\n _pageData.isScrollLoading = false;\n }\n }\n};\n\nconst _initMain = () => {\n _refreshData();\n emit('onInitComplete');\n};\n\n// 生命周期\nonMounted(() => {\n _initMain();\n});\n\nonBeforeUnmount(() => {\n CommonElement.offListener(window, 'keydown', _onWinKeydown);\n CommonElement.offListener(window, 'keyup', _onWinKeyup);\n _isKeyListenerBound = false;\n});\n\nonDeactivated(() => {\n // keep-alive 场景:组件停用时清理全局键盘监听,防止残留拦截页面按键\n CommonElement.offListener(window, 'keydown', _onWinKeydown);\n CommonElement.offListener(window, 'keyup', _onWinKeyup);\n _isKeyListenerBound = false;\n});\n\nonActivated(() => {\n // keep-alive 恢复:面板仍打开时重新注册键盘监听(onDeactivated 已移除)\n if (props.isOpen && !_isKeyListenerBound) {\n CommonElement.onListener(window, 'keydown', _onWinKeydown);\n CommonElement.onListener(window, 'keyup', _onWinKeyup);\n _isKeyListenerBound = true;\n }\n});\n\n// watch\nwatch(\n () => props.isOpen,\n (newValue: boolean) => {\n if (newValue) {\n // 每次打开强制重置:从全量/首屏数据重建并清空搜索框,\n // 防止上次搜索状态残留到本次打开\n _isUpdateOriginalData = true;\n _refreshData();\n } else {\n // 关闭时复位分页锁:服务端请求挂起(不 settle)时重开仍可继续滚动\n _pageData.isScrollLoading = false;\n }\n },\n);\n\nwatch(\n () => props.originalData,\n newValue => {\n _isUpdateOriginalData = true;\n if (props.isCascade) {\n _rawCascadeData = [...((newValue || []) as any[])];\n optShowAllData.value = _buildFlatList(_rawCascadeData);\n } else {\n // 过滤无 id 或 id 类型异常的数据项,防止模板中 item.id.toString() 崩溃\n optShowAllData.value = CommonBase.getListClone(newValue).filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n }\n _setUseAllId();\n // 数据重建后重置搜索交互状态与分页状态:清空搜索框与 hover 高亮,\n // 防止「搜索框有词 + 列表全量」的状态不一致;分页锁复位防新数据停摆\n _pageData.hasMoreData = true;\n optHoverKeydown.value = '';\n nextTick(() => {\n if (refElSearch.value) {\n refElSearch.value.setValue('');\n }\n });\n },\n);\n\n// 事件方法\nconst onSearch = async (value: string) => {\n const currentSeq = ++_searchSeq;\n // 使进行中的分页加载请求失效(搜索是更新操作,其结果优先);\n // Math.max 保持版本号单调,避免回退式赋值与进行中 loadSeq 碰撞\n _pageSeq = Math.max(_pageSeq, currentSeq + 1);\n let list: any[] = [];\n // 级联模式:搜索时重置原始数据累加器和分页状态,避免 _loadMore 混入搜索前的全量数据\n if (props.isCascade) {\n _rawCascadeData = [];\n }\n _pageData.hasMoreData = true;\n if (props.serverCallback) {\n try {\n list = await props.serverCallback({ search: value, offset: 0 });\n // 防御:校验服务端返回值是否为数组\n if (!Array.isArray(list)) {\n console.error('[ClSelect] onSearch 服务端返回数据格式异常(非数组):', typeof list);\n emit('onError', '服务端搜索失败:返回数据格式异常');\n list = [];\n }\n // 竞态保护:当前请求已过期,放弃结果\n if (currentSeq !== _searchSeq) return;\n if (_hasParent) _selfTop.convertListToJson(list);\n } catch (_err) {\n console.error('[ClSelect] onSearch 服务端搜索失败:', _err);\n emit('onError', '服务端搜索失败,请稍后重试');\n list = [];\n }\n // 竞态保护:请求已过期\n if (currentSeq !== _searchSeq) return;\n if (props.isCascade) {\n list = _cascadeSearchFill(list, props.originalData as any[]);\n list = _buildFlatList(list);\n }\n } else {\n // 防御:过滤 null 项与无 id 项(与 _refreshData 一致),\n // 防止模板 item.id.toString() 与字段访问崩溃\n const safeOriginalData = (props.originalData as any[]).filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n if (CommonBase.isEmpty(value)) {\n list = safeOriginalData;\n } else {\n if (props.searchKeyType !== '||' && props.searchKeyType !== '&&') {\n console.warn(\n '[ClSelect] onSearch searchKeyType 未知值,已降级为 OR 匹配:',\n props.searchKeyType,\n );\n }\n const tempSearch = value.toLowerCase();\n // 防御:searchKey 非数组(外部传 null 等违规输入)时降级为默认字段\n const arrSearchKey = CommonBase.isArray(props.searchKey)\n ? (props.searchKey as string[])\n : ['name'];\n const searchKeyCount = arrSearchKey.length;\n safeOriginalData.forEach((info: any) => {\n const bb: boolean[] = [];\n for (let bi = 0; bi < searchKeyCount; bi++) {\n const fieldValue = info[arrSearchKey[bi]];\n if (fieldValue == null) continue;\n const bKeyValue = String(fieldValue).toLowerCase();\n if (bKeyValue.indexOf(tempSearch) > -1) {\n bb.push(true);\n }\n }\n if (bb.length > 0) {\n switch (props.searchKeyType) {\n case '||':\n list.push(info);\n break;\n case '&&':\n if (bb.length === searchKeyCount) {\n list.push(info);\n }\n break;\n default:\n // 未知匹配模式,降级为 OR 逻辑\n list.push(info);\n }\n }\n });\n }\n if (props.isCascade) {\n if (!CommonBase.isEmpty(value)) {\n list = _cascadeSearchFill(list, props.originalData as any[]);\n }\n list = _buildFlatList(list);\n }\n }\n\n // 防御:过滤 null/无 id 数据项(与 _refreshData 一致),\n // 防止模板 item.id.toString() 崩溃(serverCallback 分支返回值可能含异常项)\n optShowAllData.value = list.filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n _setUseAllId();\n optHoverKeydown.value = '';\n if (_hasParent) _selfTop.calculationDropdownPosition();\n};\n\nconst onSelectAll = (e: { event: MouseEvent; value: boolean }) => {\n if (props.disabled) return; // 组件级禁用检查(与 onSelectItem 一致)\n if (props.isMultiple) {\n const addIds: string[] = [];\n const delIds: string[] = [];\n _optUseAllId.value.forEach((id: string) => {\n if (e.value) {\n if (!CommonBase.isExistValue(props.selectId, id)) {\n addIds.push(id);\n }\n } else {\n if (CommonBase.isExistValue(props.selectId, id)) {\n // 与 _getSelectIds 语义一致:全不选不取消已选中的禁用项\n if (!_showAllDataJson[id]?.isDisabled) {\n delIds.push(id);\n }\n }\n }\n });\n const newIds: string[] = CommonBase.getArrClone(props.selectId);\n if (delIds.length > 0) {\n delIds.forEach((id: string) => {\n const idx = newIds.indexOf(id);\n if (idx > -1) newIds.splice(idx, 1);\n });\n }\n if (addIds.length > 0) {\n addIds.forEach((id: string) => {\n if (!CommonBase.isExistValue(newIds, id)) {\n newIds.push(id);\n }\n });\n }\n const newSelectIds: string[] = [];\n newIds.forEach((id: string) => {\n // radio 项不参与全选:已选的原样保留(未选的本就不在 newIds)\n if (!_checkIsTypeRadio(id) || CommonBase.isExistValue(props.selectId, id)) {\n newSelectIds.push(id);\n }\n });\n emit('onChange', newSelectIds);\n }\n};\n\nconst onSelectItem = (info: any) => {\n if (\n info.id == null ||\n (typeof info.id !== 'string' && (typeof info.id !== 'number' || !CommonBase.isFinite(info.id)))\n )\n return;\n if (info.isDisabled || props.disabled) return; // 项级 + 组件级禁用检查\n const id = info.id.toString();\n const newIds: string[] = _getSelectIds(id);\n emit('onChange', newIds);\n};\n\n// 外部调用\nconst initOpenShow = (isOpen: boolean) => {\n if (isOpen) {\n // 防重:重复打开不重复注册,防止一次按键触发多次导航\n if (!_isKeyListenerBound) {\n CommonElement.onListener(window, 'keydown', _onWinKeydown);\n CommonElement.onListener(window, 'keyup', _onWinKeyup);\n _isKeyListenerBound = true;\n }\n } else {\n if (_isKeyListenerBound) {\n CommonElement.offListener(window, 'keydown', _onWinKeydown);\n CommonElement.offListener(window, 'keyup', _onWinKeyup);\n _isKeyListenerBound = false;\n }\n }\n};\n\nexport interface ClSelectInDropdownExpose {\n initOpenShow: (isOpen: boolean) => void;\n}\n\ndefineExpose({\n initOpenShow,\n});\n</script>\n","<template>\n <div\n class=\"select-inTag-container\"\n :id=\"elId\"\n >\n <div class=\"select-inTag-title\">\n <span> {{ optPageLanguage.selected }} {{ optSelectCount }} {{ optPageLanguage.count }} </span>\n <span class=\"select-inTag-operate\">\n <cl-icon-font\n v-if=\"optCanRemoveAll\"\n class=\"select-inTag-deleteAll\"\n name=\"remove\"\n :title=\"optPageLanguage.deleteAll\"\n :aria-label=\"optPageLanguage.deleteAll\"\n @click=\"onRemoveAll\"\n ></cl-icon-font>\n <template v-else></template>\n </span>\n </div>\n <div class=\"select-inTag-body\">\n <cl-tags\n :showTextFormat=\"showTextFormat\"\n :list=\"optSelectData\"\n @onRemove=\"onRemove\"\n ></cl-tags>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, computed } from 'vue';\nimport CommonBase from '../../Common/base';\nimport ClIconFont from '../../Element/IconFont/Index.vue';\nimport ClTags from '../../Element/Tags/Index.vue';\nimport type { SelectTopProvide } from './Index.vue';\nimport useLanguage from '../../Use/language';\n\ndefineOptions({ name: 'ClSelectInTags' });\n\nconst props = defineProps({\n id: String, // desc: 组件实例唯一标识,用于多实例场景下 DOM 查询限定\n showTextFormat: String, // desc: 标签显示文本格式化\n selectId: {\n type: Array as () => string[],\n default: () => [], // desc: 已选中的 id 列表\n },\n});\n\nconst emit = defineEmits({\n onRemove: (_ids: string[]) => true, // desc: 移除已选标签时触发\n});\n\nconst elId = props.id; // || `select-inTag-${CommonBase.getRandom(5)}`\n\nconst { optPageLanguage, getPageLanguage } = useLanguage();\ngetPageLanguage('common');\n\nconst _selfTop = inject<SelectTopProvide>('$SelectTop', {} as SelectTopProvide);\nconst _hasParent = typeof _selfTop.getSelectData === 'function';\n\nconst optSelectData = computed(() => {\n if (!_hasParent) return [];\n // 防御:selectId 非数组(外部违规输入)时不透传给父级,避免上游 forEach 崩溃\n return CommonBase.isArray(props.selectId) ? _selfTop.getSelectData(props.selectId) : [];\n});\n\nconst optSelectCount = computed(() => {\n // 计数与标签渲染同口径(optSelectData),避免无效/未加载 id 造成数量虚高\n return _hasParent ? optSelectData.value.length : 0;\n});\n\n// 是否存在可删项(与 onRemoveAll 的保护判定同源,用于隐藏无意义的删除全部图标)\nconst optCanRemoveAll = computed(() => {\n if (!CommonBase.isArray(optSelectData.value)) return false;\n return optSelectData.value.some((info: any) => {\n if (!CommonBase.isObject(info)) return false;\n return !(CommonBase.isBoolean(info.isDisabled) ? !!info.isDisabled : false);\n });\n});\n\nconst onRemoveAll = () => {\n // 防御:父级 getSelectData 返回非数组时降级为不操作\n const list = optSelectData.value;\n if (!CommonBase.isArray(list)) return;\n const newIds: string[] = [];\n let hasRemovable = false;\n list.forEach((info: any) => {\n // 防御:数据项为 null/非对象时跳过(父级契约不保证每项非空)\n if (!CommonBase.isObject(info)) return;\n // 保护判定与 Element/Tags 的 isShowDisabled 派生逻辑对齐(isDisabled 布尔归一化):\n // Element/Tags 的 _convertListInfoDisabled 会把 isShowDisabled 重写为 isDisabled 派生值,\n // 直接读 isShowDisabled 会造成单删可删、全删保留的分裂\n const isProtected = CommonBase.isBoolean(info.isDisabled) ? !!info.isDisabled : false;\n if (isProtected) {\n // 防御:id 缺失/类型异常的数据项跳过,防止 toString 崩溃\n const isValidId =\n (typeof info.id === 'string' && !CommonBase.isEmpty(info.id)) ||\n (typeof info.id === 'number' && CommonBase.isFinite(info.id));\n if (isValidId) {\n newIds.push(info.id.toString());\n }\n } else {\n hasRemovable = true;\n }\n });\n // 无任何可删项(列表为空或全部受保护)时不 emit,与 onRemove 防多余上报语义一致\n if (!hasRemovable) return;\n emit('onRemove', newIds);\n};\n\nconst onRemove = (id: string) => {\n // 防御:selectId 非数组(外部传 null 等违规输入)时降级为不操作\n if (!CommonBase.isArray(props.selectId)) return;\n // 空串 payload(Element/Tags 的清除全部场景)无对应目标,静默忽略\n if (CommonBase.isEmpty(id)) return;\n // 字符串化归一化比较:兼容 selectId 混入 number 元素的类型不一致场景\n const idStr = String(id);\n const idx = props.selectId.findIndex((v: string) => String(v) === idStr);\n if (idx === -1) {\n // 弱竞态防御:id 不在选中列表中时不重复上报,消除多余 onChange\n return;\n }\n const newIds = CommonBase.getArrClone(props.selectId as string[]);\n newIds.splice(idx, 1);\n emit('onRemove', newIds);\n};\n</script>\n","<template>\n <cl-dropdownlayer-list\n :id=\"elId\"\n ref=\"refElDropdownLayer\"\n :classParent=\"clsParent\"\n classText=\"select-inText\"\n :classDropDown=\"clsDropdown\"\n :placeholder=\"placeholder\"\n :isDisabled=\"disabled\"\n :isClear=\"isClear\"\n :textLabel=\"optShowSelectLabel.join(',')\"\n :textArrowDirection=\"arrowDirection\"\n :transitionLeave=\"transitionLeave\"\n :onOpenBeforeCallback=\"onOpenBefore\"\n @onChangeOpen=\"onToggleOpen\"\n @onClear=\"onClearText\"\n @onChangePosition=\"onChangeDropdownPosition\"\n >\n <template v-slot:textExtend>\n <span\n v-if=\"multiple\"\n class=\"select-inText-num\"\n >\n <cl-badge\n v-if=\"optShowSelectLabel.length > 1\"\n :num=\"optShowSelectLabel.length\"\n ></cl-badge>\n <template v-else></template>\n </span>\n <template v-else></template>\n </template>\n <template v-slot:dropdown>\n <cl-select-in-dropdown\n ref=\"refElList\"\n :isSearch=\"isSearch\"\n :searchPlaceholder=\"searchPlaceholder\"\n :searchKey=\"searchKey\"\n :searchKeyType=\"searchKeyType\"\n :isMultiple=\"multiple\"\n :isCheckBoxAll=\"isCheckBoxAll\"\n :showDropDownTextFormat=\"showDropDownTextFormat\"\n :showDropDownTextFormatSub=\"showDropDownTextFormatSub\"\n :isCascade=\"isCascade\"\n :parentSelectable=\"parentSelectable\"\n :parentKey=\"parentKey\"\n :topParentValue=\"topParentValue\"\n :originalData=\"list\"\n :keyIndex=\"optKeyIndex\"\n :selectId=\"optSelectIds\"\n :disabled=\"disabled\"\n :isOpen=\"optBase.isOpen\"\n :serverCallback=\"serverCallback\"\n @onChange=\"onDropDownChange\"\n @onInitComplete=\"onInitComplete\"\n @onError=\"onDropDownError\"\n ></cl-select-in-dropdown>\n </template>\n <template v-slot:dropdownExtend>\n <div\n v-if=\"multiple && isShowTag\"\n :class=\"clsTag\"\n :style=\"{ height: optBase.tagHeight, left: optBase.tagLeft }\"\n ref=\"refElTags\"\n >\n <cl-select-in-tags\n :showTextFormat=\"optShowTextFormat\"\n :selectId=\"optSelectIds\"\n @onRemove=\"onTagRemove\"\n ></cl-select-in-tags>\n </div>\n <template v-else></template>\n </template>\n </cl-dropdownlayer-list>\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, onMounted, nextTick, watch, computed, ref, reactive } from 'vue';\nimport CommonBase from '../../Common/base';\nimport CommonElement from '../../Common/Element/index';\nimport ClBadge from '../../Element/Badge/Index.vue';\nimport ClDropdownlayerList from '../DropdownLayer/List.vue';\nimport ClSelectInDropdown from './Dropdown.vue';\nimport ClSelectInTags from './Tags.vue';\nimport type { ClDropdownlayerChangePositionInfo } from '../DropdownLayer/Base.vue';\nimport './index.css';\n\ndefineOptions({ name: 'ClSelect' });\n\nconst props = defineProps({\n id: String, // desc: 组件实例唯一标识,用于多实例场景下 DOM 查询限定\n value: [String, Number], // desc: 绑定值,v-model 双向绑定\n className: String, // desc: 自定义 CSS 类名\n disabled: {\n type: Boolean,\n default: false, // desc: 是否禁用\n },\n list: {\n type: Array as () => any[],\n default: () => [], // desc: 选项数据列表\n },\n placeholder: String, // desc: 占位文本\n classDropDown: String, // desc: 下拉面板自定义 CSS 类名\n theme: {\n type: String,\n default: 'default', // desc: 主题样式 | enum: default, noBorder\n validator: (v: string) => ['default', 'noBorder'].includes(v),\n },\n multiple: {\n type: Boolean,\n default: false, // desc: 是否多选\n },\n isClear: {\n type: Boolean,\n default: false, // desc: 是否显示清除按钮\n },\n isSearch: {\n type: Boolean,\n default: false, // desc: 是否启用搜索\n },\n isCheckBoxAll: {\n type: Boolean,\n default: true, // desc: 是否显示全选复选框\n },\n isShowTag: {\n type: Boolean,\n default: true, // desc: 是否显示已选标签区域\n },\n arrowDirection: {\n type: String,\n default: 'right', // desc: 箭头在文本左侧还是右侧 | enum: left, right\n validator: (v: string) => ['left', 'right'].includes(v),\n },\n transitionLeave: {\n type: String,\n default: 'zoomOutTop', // desc: 下拉面板关闭动画类名(传无动画类可瞬消)\n },\n searchPlaceholder: String, // desc: 搜索框占位文本\n searchKey: {\n type: Array as () => string[],\n default: () => ['name'], // desc: 搜索匹配的字段名列表\n },\n searchKeyType: {\n type: String,\n default: '||', // desc: 多字段搜索匹配逻辑 | enum: ||, &&\n validator: (v: string) => ['||', '&&'].includes(v),\n },\n showTextFormat: String, // desc: 选中项显示文本格式化,支持 ${xxx} 占位\n showDropDownTextFormat: String, // desc: 下拉项显示文本格式化\n multipleRealTimeChange: {\n type: Boolean,\n default: false, // desc: 多选时是否实时触发 onChange 事件,false 则关闭下拉时触发\n },\n isCascade: {\n type: Boolean,\n default: false, // desc: 是否启用二级级联\n },\n parentSelectable: {\n type: Boolean,\n default: false, // desc: 二级级联时父级是否可被选中\n },\n parentKey: {\n type: String,\n default: 'parentId', // desc: 数据中标识父级的字段名\n },\n topParentValue: {\n type: String,\n default: '0', // desc: 顶级父节点的 parentKey 值\n },\n showDropDownTextFormatSub: String, // desc: 二级下拉项文本格式化,${xxx} 格式\n isOutMerge: {\n type: Boolean,\n default: true, // desc: 级联多选时,所有子级选中后是否合并为父级 id(true 合并,false 保持叶子 id)\n },\n onOpenBefore: Function, // desc: 下拉面板打开前的回调函数,返回 false 可阻止打开\n serverCallback: Function, // desc: 服务端数据加载回调,入参 { search, offset },返回 Promise<Array>\n});\n\nconst emit = defineEmits({\n 'update:value': (_value: string) => true, // desc: v-model 值更新时触发\n onChange: (_value: string, _data: Record<string, any> | Record<string, any>[] | null) => true, // desc: 选中值变更时触发\n onInit: () => true, // desc: 组件初始化完成时触发\n onOpen: (_isOpen: boolean) => true, // desc: 下拉面板打开/关闭时触发\n onError: (_message: string) => true, // desc: 服务端加载/搜索失败时触发,入参为中文错误提示\n});\n\nconst refElDropdownLayer = ref<InstanceType<typeof ClDropdownlayerList> | null>(null);\nconst refElList = ref<InstanceType<typeof ClSelectInDropdown> | null>(null);\nconst refElTags = ref<InstanceType<typeof ClSelectInTags> | null>(null);\n\nconst optKeyIndex = `select-${CommonBase.getRandom(8)}`;\nconst elId = props.id; // || `select-${CommonBase.getRandom(8)}`\nconst optBase = reactive({\n isOpen: false,\n dropDownPos: 'down',\n tagHeight: '',\n tagLeft: '',\n tagDirection: 'right',\n});\n\nlet _prevSelectIds: string[] = [];\nlet _listDataToJson: any = {};\n// 级联数据映射\nconst _cascadeMaps: any = {\n childrenMap: {} as Record<string, string[]>, // 父级 id → 子级 id 列表\n parentMap: {} as Record<string, string>, // 子级 id → 父级 id\n lastChildMap: {} as Record<string, string[]>, // id → 该节点下所有叶子 id\n allChildMap: {} as Record<string, string[]>, // id → 该节点下所有后代 id(含中间层)\n};\nconst optIsFirstDataFinish = ref(false);\nconst optSelectIds = ref<string[]>([]);\nconst optShowSelectLabel = ref<string[]>([]);\nlet _isInitEmitted = false; // onInit 防重标志\n\nconst optShowTextFormat = computed(() => {\n if (CommonBase.isNonEmptyString(props.showTextFormat)) {\n return props.showTextFormat;\n }\n if (props.isCascade) {\n return '${name}(${parentName})';\n }\n return '';\n});\n\nconst clsParent = computed(() => {\n let cls: Record<string, boolean> = { 'panel-select': true, 'box-width': true };\n if (props.theme === 'noBorder') {\n cls['select-theme-noBorder'] = true;\n }\n cls = CommonBase.getJsonMerge(cls, CommonElement.getClassNameJson(props.className));\n return CommonBase.getStringByJson(cls, ' ');\n});\n\nconst clsDropdown = computed(() => {\n let cls: Record<string, boolean> = { 'select-inDropdown': true };\n if (optBase.isOpen) {\n if (props.multiple && props.isShowTag) {\n cls['select-inTag-ext'] = true;\n cls[`select-inTag-${optBase.tagDirection}`] = true;\n }\n }\n cls = CommonBase.getJsonMerge(cls, CommonElement.getClassNameJson(props.classDropDown));\n return CommonBase.getStringByJson(cls, ' ');\n});\n\nconst clsTag = computed(() => {\n const cls: Record<string, boolean> = {\n 'select-inTag': true,\n 'select-inTag-open': optBase.isOpen,\n };\n cls[`select-inTag-${optBase.dropDownPos}`] = true;\n cls[`select-inTag-${optBase.tagDirection}`] = true;\n return cls;\n});\n\nconst _emitModelValue = (value: string) => {\n emit('update:value', value);\n};\n\nconst _emitChange = (value: string, data: any) => {\n _emitModelValue(value);\n emit('onChange', value, data);\n};\n\nconst _emitInit = () => {\n if (_isInitEmitted) return;\n _isInitEmitted = true;\n nextTick(() => {\n emit('onInit');\n });\n};\n\nconst _emitOpen = (isOpen: boolean) => {\n nextTick(() => {\n emit('onOpen', isOpen);\n });\n};\n\nconst _getEffectiveValue = () => {\n const effectiveValue: string[] = [];\n optSelectIds.value.forEach((v: string) => {\n if (CommonBase.isExistJsonKey(_listDataToJson, v)) {\n effectiveValue.push(v);\n }\n });\n return effectiveValue;\n};\n\nconst _convertListToJson = (list: any[]) => {\n // 防御:非数组输入(对象等)直接忽略,防止 list.forEach 崩溃\n if (CommonBase.isEmpty(list) || !CommonBase.isArray(list)) return;\n const tempJson: Record<string, any> = {};\n const parentKey = props.parentKey as string;\n const topParentValue = props.topParentValue as string;\n list.forEach((item: any) => {\n // 防御:跳过 null/非对象数据项,防止服务端返回异常数据时整个函数中断\n if (!CommonBase.isObject(item)) {\n console.warn('[ClSelect] _convertListToJson 跳过非对象数据项:', item);\n return;\n }\n const isValidId =\n typeof item.id === 'string' || (typeof item.id === 'number' && CommonBase.isFinite(item.id));\n if (!isValidId) {\n console.warn('[ClSelect] _convertListToJson 跳过无 id 或 id 类型异常的数据项:', item);\n return;\n }\n const id = item.id.toString();\n tempJson[id] = CommonBase.getJsonClone(item);\n });\n _listDataToJson = CommonBase.getJsonMerge(_listDataToJson, tempJson);\n // serverCallback 模式:数据首次注入时置位完成标志,触发 onInit——\n // 该模式下 props.list 恒空,_runInitComplete 不执行,onInit 依赖此处置位\n if (props.serverCallback && !optIsFirstDataFinish.value && !CommonBase.isEmpty(tempJson)) {\n optIsFirstDataFinish.value = true;\n // 编辑回显:初始 props.value 从未被应用(list 恒空时 _runInitComplete 被跳过),\n // 数据首次注入时补应用;props.value 为空时不覆盖(保留外部 setValue 预设的选中态)\n if (props.value != null && props.value !== '') {\n _setValue(props.value);\n _checkValueInList();\n }\n }\n // 级联模式:全量重注入 parentName——父级数据后到达时给旧子级补注入,\n // 且父级 name 更新时同步刷新子级快照中的 parentName\n if (props.isCascade) {\n Object.keys(_listDataToJson).forEach(id => {\n const pid = _listDataToJson[id][parentKey];\n const pidStr =\n pid != null && (typeof pid === 'string' || typeof pid === 'number') ? pid.toString() : '';\n // 数字 parentKey(如 0)是合法值:统一转字符串查找父级;\n // topParentValue 同样 String 化(外部传数字 0 时与字符串 '0' 对齐)\n if (pidStr !== '' && pidStr !== String(topParentValue)) {\n const parent = _listDataToJson[pidStr];\n if (parent?.name) {\n _listDataToJson[id].parentName = parent.name;\n }\n }\n });\n }\n // 级联模式:重建数据映射\n if (props.isCascade) {\n _buildCascadeDataMaps();\n // 异步数据加载场景:serverCallback 后续加载数据时 _cascadeMaps 刚被构建,\n // 需重新展开 optSelectIds 中的父级 id 为子级 id\n if (props.isOutMerge && props.multiple && optSelectIds.value.length > 0) {\n const expanded = _getValueSplitChild(optSelectIds.value);\n if (!CommonBase.isEqualArr(optSelectIds.value, expanded)) {\n optSelectIds.value = expanded;\n // 同步打开快照:展开是内部数据归一化而非用户操作,避免关闭时误判变更\n _prevSelectIds = expanded;\n }\n }\n }\n // serverCallback 未加载页边界补互斥:数据注入后对已知 radio 项做互斥收敛。\n // 点击时属性未知的已选 radio(未加载页)在数据到达后补执行互斥——\n // optSelectIds 数组顺序即选择顺序(预设先入、新选后入),保留数组末尾的\n // radio(最近选择),清除其他已选 radio\n if (props.multiple && optSelectIds.value.length > 1) {\n const radioIds = optSelectIds.value.filter((id: string) => {\n const info = _listDataToJson[id];\n return CommonBase.isBoolean(info?._isTypeRadio) && info._isTypeRadio;\n });\n if (radioIds.length > 1) {\n const keepId = radioIds[radioIds.length - 1];\n const merged = optSelectIds.value.filter(\n (id: string) => id === keepId || !radioIds.includes(id),\n );\n if (!CommonBase.isEqualArr(optSelectIds.value, merged)) {\n optSelectIds.value = merged;\n _setChangeValue();\n }\n }\n }\n // 数据映射更新后刷新 optSelectIds 引用:Tags 标签区 computed 依赖\n // getSelectData(读非响应式映射),引用不变时不重算——数据晚于选中值\n // 到达(编辑回显)时标签区需由此驱动刷新\n if (optSelectIds.value.length > 0) {\n optSelectIds.value = [...optSelectIds.value];\n }\n};\n\n// 构建级联数据映射\nconst _buildCascadeDataMaps = () => {\n const parentKey = props.parentKey as string;\n const topParentValue = props.topParentValue as string;\n _cascadeMaps.childrenMap = {};\n _cascadeMaps.parentMap = {};\n _cascadeMaps.lastChildMap = {};\n _cascadeMaps.allChildMap = {};\n const allIds = Object.keys(_listDataToJson);\n allIds.forEach(id => {\n const info = _listDataToJson[id];\n const pid = info[parentKey];\n const pidStr =\n pid != null && (typeof pid === 'string' || typeof pid === 'number') ? pid.toString() : '';\n // 数字 parentKey(如 0)是合法值:统一字符串 key,保证 childrenMap/parentMap\n // 与 _getLastChildIds 等字符串 id 检索一致\n if (pidStr !== '' && pidStr !== String(topParentValue)) {\n _cascadeMaps.parentMap[id] = pidStr;\n if (!_cascadeMaps.childrenMap[pidStr]) {\n _cascadeMaps.childrenMap[pidStr] = [];\n }\n _cascadeMaps.childrenMap[pidStr].push(id);\n }\n });\n};\n\n// 递归获取某节点下所有叶子 id\nconst _getLastChildIds = (id: string): string[] => {\n const _recurse = (_id: string, visited: Set<string>): string[] => {\n if (_cascadeMaps.lastChildMap[_id]) {\n return _cascadeMaps.lastChildMap[_id];\n }\n // 循环引用检测:当前节点已在祖先链上,终止递归\n if (visited.has(_id)) return [];\n visited.add(_id);\n const children = _cascadeMaps.childrenMap[_id];\n if (!children || children.length === 0) {\n _cascadeMaps.lastChildMap[_id] = [_id];\n return [_id];\n }\n const ids: string[] = [];\n children.forEach((cid: string) => {\n ids.push(..._recurse(cid, new Set(visited)));\n });\n _cascadeMaps.lastChildMap[_id] = ids;\n return ids;\n };\n return _recurse(id, new Set());\n};\n\n// 递归获取某节点下所有后代 id(含中间层节点,非仅叶子)。\n// 与 _getLastChildIds 的区别:后者仅返回叶子节点,本函数返回所有层级后代。\n// 注意:叶子节点无后代,返回 [](叶子自身不在\"后代\"范围内)。\nconst _getAllChildIds = (id: string): string[] => {\n const _recurse = (_id: string, visited: Set<string>): string[] => {\n if (_cascadeMaps.allChildMap[_id]) {\n return _cascadeMaps.allChildMap[_id];\n }\n // 循环引用检测:当前节点已在祖先链上,终止递归\n if (visited.has(_id)) return [];\n visited.add(_id);\n const children = _cascadeMaps.childrenMap[_id];\n if (!children || children.length === 0) {\n _cascadeMaps.allChildMap[_id] = [];\n return [];\n }\n const ids: string[] = [];\n children.forEach((cid: string) => {\n ids.push(cid);\n ids.push(..._recurse(cid, new Set(visited)));\n });\n // 去重:防止同一子节点挂在多个父级下(非标准层级数据)时出现重复 id\n const uniqueIds = Array.from(new Set(ids));\n _cascadeMaps.allChildMap[_id] = uniqueIds;\n return uniqueIds;\n };\n return _recurse(id, new Set());\n};\n\n// isOutMerge=true:将所有子级选中时合并为父级 id\nconst _getValueMergeParent = (ids: string[]): string[] => {\n if (ids.length === 0) return [];\n const result = new Set(ids);\n // 收集需要检查的候选父级,避免每轮重建全量分组\n const pendingParents = new Set<string>();\n const visitedParents = new Set<string>(); // 环检测:已处理过的父级\n for (const id of result) {\n const pid = _cascadeMaps.parentMap[id];\n if (pid && !visitedParents.has(pid)) pendingParents.add(pid);\n }\n while (pendingParents.size > 0) {\n const pid = pendingParents.values().next().value!;\n pendingParents.delete(pid);\n // 环检测:父级已处理过则跳过,防止 parentKey 数据成环导致死循环\n if (visitedParents.has(pid)) continue;\n visitedParents.add(pid);\n const allChildren = _cascadeMaps.childrenMap[pid];\n if (!allChildren || allChildren.length === 0) continue;\n // 检查该父级的所有子级是否都在 result 中\n let allSelected = true;\n for (const cid of allChildren) {\n if (!result.has(cid)) {\n allSelected = false;\n break;\n }\n }\n if (allSelected) {\n for (const cid of allChildren) result.delete(cid);\n result.add(pid);\n // 级联效应:合并后检查上层父级是否也可合并\n const grandPid = _cascadeMaps.parentMap[pid];\n if (grandPid && !visitedParents.has(grandPid)) pendingParents.add(grandPid);\n }\n }\n return [...result];\n};\n\n// isOutMerge=false:展开父级 id 为所有叶子 id\nconst _getValueSplitChild = (ids: string[]): string[] => {\n if (ids.length === 0) return [];\n const result: string[] = [];\n ids.forEach((id: string) => {\n result.push(..._getLastChildIds(id));\n });\n return CommonBase.getArrUnique(result);\n};\n\n// 获取最终输出值\nconst _getOutValue = (ids: string[]): string[] => {\n if (!props.isCascade || !props.multiple) return ids;\n if (props.isOutMerge) {\n return _getValueMergeParent(ids);\n } else {\n return _getValueSplitChild(ids);\n }\n};\n\nconst _checkValueInList = () => {\n if (optIsFirstDataFinish.value) {\n if (!CommonBase.isEmpty(optSelectIds.value)) {\n // 数据映射为空时(如 serverCallback 模式下数据尚未加载完成),\n // 不执行校验清理,保留当前值等待数据加载后 watch 重新验证;\n // serverCallback 模式下列表数据可能分批到达(分页/搜索),\n // 「合法但尚未加载」的选中 id 不能按无效 id 清除\n if (CommonBase.isEmpty(_listDataToJson) || props.serverCallback) return;\n const effectiveValue = _getEffectiveValue();\n if (!CommonBase.isEqualArr(optSelectIds.value, effectiveValue)) {\n // 部分选中 id 在数据中不存在(可能 setValue 传入了无效 id),\n // 将被过滤,发出警告以便排查\n const removedIds = optSelectIds.value.filter((id: string) => !effectiveValue.includes(id));\n if (removedIds.length > 0) {\n console.warn('[ClSelect] 以下 id 在数据列表中不存在,已自动清除:', removedIds);\n }\n optSelectIds.value = effectiveValue;\n // 同步打开快照:清理是内部归一化,与 _setValue 行为一致,\n // 防止关闭时 _checkChangeValue 对同值误判重复 emit\n _prevSelectIds = effectiveValue;\n const outIds = _getOutValue(effectiveValue);\n _emitModelValue(outIds.join(','));\n }\n }\n }\n};\n\nconst _setValue = (value: any) => {\n // 防御:value 为对象/NaN 等非预期类型时 toString() 产生虚假 id\n if (\n value != null &&\n typeof value !== 'string' &&\n (typeof value !== 'number' || !CommonBase.isFinite(value as number))\n ) {\n console.warn('[ClSelect] setValue 收到非预期类型值:', typeof value, value);\n return;\n }\n let arrValue =\n value == null || value === ''\n ? []\n : value\n .toString()\n .split(',')\n .filter((v: string) => v !== '');\n // 去重:'1,1' 等重复 id 不进入选中态(防标签重复渲染与 badge 计数虚高)\n arrValue = CommonBase.getArrUnique(arrValue);\n // 级联 + isOutMerge:外部传入的可能是父级 id,展开为子级 id 做内部存储\n if (props.isCascade && props.isOutMerge && arrValue.length > 0 && props.multiple) {\n arrValue = _getValueSplitChild(arrValue);\n }\n let isExist = CommonBase.isEqualArr(optSelectIds.value, arrValue);\n if (isExist) {\n // 归一化比较:用去重后的数组 join 比较('1,1,2' 去重后与 '1,2' 等价),避免同值重复赋值\n isExist = arrValue.join(',') === optSelectIds.value.join(',');\n }\n if (!isExist) {\n _prevSelectIds = arrValue;\n optSelectIds.value = arrValue;\n }\n};\n\nconst _getSelectValueInfo = (v: string) => {\n return CommonBase.isExistJsonKey(_listDataToJson, v)\n ? CommonBase.getJsonClone(_listDataToJson[v])\n : {};\n};\n\nconst _getSelectData = (selectIds?: string[]) => {\n // 防御:非数组参数(外部违规输入)回退到当前选中值\n const ids = CommonBase.isArray(selectIds) ? (selectIds as string[]) : optSelectIds.value;\n const list: any[] = [];\n ids.forEach((v: string) => {\n const tempInfo = _getSelectValueInfo(v);\n if (!CommonBase.isEmpty(tempInfo)) {\n list.push(tempInfo);\n }\n });\n return list;\n};\n\n// 计算选中项显示文本。与 Dropdown.vue formatItemLabel 的转义策略保持一致:\n// 内容含 HTML 时按是否使用自定义 format 分别做编码处理,防止 v-html 注入\nconst _getLabelByData = (info: any) => {\n let labelText = CommonBase.isEmpty(optShowTextFormat.value)\n ? (info.name ?? '')\n : CommonBase.convertStringFormat(optShowTextFormat.value, info);\n if (CommonBase.isHtml(labelText)) {\n labelText = CommonBase.isEmpty(optShowTextFormat.value)\n ? CommonBase.encodeHTML(info.name)\n : CommonBase.convertStringFormatEncodeHTML(optShowTextFormat.value, info);\n } else if (typeof labelText === 'string' && labelText.indexOf('<') > -1) {\n // isHtml 正则盲区兜底:无空格变体(如 <img/src=x onerror=...>)漏判,含 < 即转义。\n // 注意:数据 name 含 HTML 会被转义为字面文本,有意渲染 HTML 需写在 format 模板中\n labelText = CommonBase.encodeHTML(labelText);\n }\n return labelText;\n};\n\nconst _setChangeValue = () => {\n const effectiveIds = _getEffectiveValue();\n _prevSelectIds = effectiveIds;\n optSelectIds.value = effectiveIds;\n const outIds = _getOutValue(effectiveIds);\n const value = outIds.join(',');\n // 根据输出 id 获取对应数据\n let infoData: any;\n if (props.multiple) {\n const list: any[] = [];\n outIds.forEach((id: string) => {\n const info = _getSelectValueInfo(id);\n if (!CommonBase.isEmpty(info)) {\n list.push(info);\n }\n });\n infoData = list;\n } else {\n infoData = _getSelectValueInfo(value);\n // 与 getValueData() 保持一致:无效 id 返回 null 而非空对象\n if (CommonBase.isEmpty(infoData)) {\n infoData = null;\n }\n }\n _emitChange(value, infoData);\n};\n\nconst _checkChangeValue = () => {\n if (!optBase.isOpen) {\n const isChange = !CommonBase.isEqualArr(optSelectIds.value, _prevSelectIds);\n if (isChange) {\n _setChangeValue();\n }\n }\n};\n\nconst _runInitComplete = () => {\n if (!optIsFirstDataFinish.value) {\n optIsFirstDataFinish.value = true;\n _convertListToJson(props.list);\n _setValue(props.value);\n _checkValueInList();\n // _emitInit 由 watch(optIsFirstDataFinish) 统一触发,避免双重调用\n }\n};\n\nconst _initMain = () => {\n if (!optIsFirstDataFinish.value && props.list && props.list.length > 0) {\n _runInitComplete();\n }\n};\n\nonMounted(() => {\n nextTick(() => {\n _initMain();\n });\n});\n\nwatch(optIsFirstDataFinish, newValue => {\n if (newValue) {\n _emitInit();\n }\n});\n\nwatch(\n () => props.list,\n (newValue, oldValue) => {\n if (optIsFirstDataFinish.value) return;\n if (newValue && newValue.length > 0) {\n // 非空列表:数据就绪,置位\n optIsFirstDataFinish.value = true;\n } else if (oldValue === undefined) {\n // 首次传入即为空数组:视为数据就绪(空数据也是初始化完成);\n // 后续 '空→空' 引用变化(oldValue 非 undefined)不再置位,防 onInit 早发\n optIsFirstDataFinish.value = true;\n }\n },\n);\n\nwatch([() => props.value, () => props.list], ([newValue, newList], [_oldValue, oldList]) => {\n const list = (newList as any[]) || [];\n if (!optIsFirstDataFinish.value && list.length > 0) {\n optIsFirstDataFinish.value = true;\n }\n // props.list 全量替换时(非增量加载),清除旧数据映射防止残留\n if (newList !== oldList) {\n _listDataToJson = {};\n _cascadeMaps.childrenMap = {};\n _cascadeMaps.parentMap = {};\n _cascadeMaps.lastChildMap = {};\n _cascadeMaps.allChildMap = {};\n }\n _convertListToJson(list);\n if (newValue !== undefined) {\n _setValue(newValue);\n }\n _checkValueInList();\n});\n\nwatch([optSelectIds, () => props.list], ([_newSelectIds, newList]) => {\n if (newList && newList.length > 0 && CommonBase.isEmpty(_listDataToJson)) {\n _convertListToJson(newList);\n }\n const tempData = _getSelectData();\n optShowSelectLabel.value = tempData.map((info: any) => _getLabelByData(info));\n});\n\n// isOutMerge 变更时重新计算输出值并 emit\nwatch(\n () => props.isOutMerge,\n () => {\n if (props.isCascade && props.multiple && optSelectIds.value.length > 0) {\n // 仅在输出值与当前 v-model 不同时才触发 onChange\n const newOutValue = _getOutValue(_getEffectiveValue()).join(',');\n if (newOutValue !== String(props.value ?? '')) {\n _setChangeValue();\n }\n }\n },\n);\n\n// parentKey / topParentValue 变更时重建级联数据映射\nwatch([() => props.parentKey, () => props.topParentValue], () => {\n if (props.isCascade && !CommonBase.isEmpty(_listDataToJson)) {\n _buildCascadeDataMaps();\n }\n});\n\nconst onToggleOpen = (value: boolean) => {\n // disabled 只阻止打开,不阻止关闭,避免下拉卡住无法收起\n if (value && props.disabled) return;\n optBase.isOpen = value;\n if (value) {\n _prevSelectIds = optSelectIds.value;\n } else {\n _checkChangeValue();\n }\n nextTick(() => {\n if (refElList.value) {\n refElList.value.initOpenShow(value);\n }\n });\n _emitOpen(value);\n};\n\nconst onClearText = () => {\n if (!props.disabled) {\n optSelectIds.value = [];\n if (props.multiple && props.multipleRealTimeChange) {\n // 实时模式下清除立即通知,与 onTagRemove 语义一致\n _setChangeValue();\n } else {\n _checkChangeValue();\n }\n }\n};\n\nconst onChangeDropdownPosition = (item: ClDropdownlayerChangePositionInfo) => {\n optBase.dropDownPos = item.use.dropDownPos;\n if (props.multiple && props.isShowTag) {\n const tagWidth = (refElTags.value?.$el as HTMLElement | undefined)?.offsetWidth || 0;\n optBase.tagHeight =\n props.theme === 'default'\n ? `${item.original.dropDownHeight + 1}px` // 1px:default 主题面板边框补偿\n : `${item.original.dropDownHeight}px`;\n const tempTagDirection =\n item.original.winWidth - (item.original.controlOffset.left + item.original.dropDownWidth) >=\n tagWidth\n ? 'right'\n : 'left';\n optBase.tagDirection = tempTagDirection;\n if (tempTagDirection === 'right') {\n optBase.tagLeft = `${item.original.dropDownWidth - 1}px`;\n } else {\n optBase.tagLeft = `${\n (item.original.dropDownWidth - item.original.textWidth + tagWidth + 1) * -1\n }px`;\n }\n }\n};\n\nconst onDropDownChange = (arrIds: string[]) => {\n optSelectIds.value = arrIds;\n if (props.multiple) {\n if (props.multipleRealTimeChange) {\n _setChangeValue();\n }\n // 注意:此处不更新 _prevSelectIds,关闭下拉时 _checkChangeValue\n // 通过比较 optSelectIds 与打开时的快照来判断是否需要触发 onChange\n } else {\n refElDropdownLayer.value?.setOpen(false);\n // 移除直接调用 onToggleOpen(false):DropdownLayer.setOpen(false) 会通过\n // @onChangeOpen 事件链触发 onToggleOpen,直接调用会导致双重执行\n }\n};\n\nconst onTagRemove = (arrIds: string[]) => {\n if (props.disabled) return; // 组件级禁用检查(与 onClearText 一致)\n optSelectIds.value = arrIds;\n // 标签删除是显式操作,立即通知(与面板内点选\"关闭时统一 emit\"语义不同,属有意差异)。\n // 注意交互副作用:立即 emit 会同步打开快照 _prevSelectIds,同一打开会话中\n // 已点选未 emit 的变更在本次关闭时不再重复通知(最终值由每次 emit 完整携带)\n _setChangeValue();\n};\n\nconst onDropDownError = (message: string) => {\n emit('onError', message);\n};\n\nconst onInitComplete = () => {\n if (refElDropdownLayer.value) {\n if (!refElDropdownLayer.value.checkIsShowOpen()) {\n refElDropdownLayer.value.initCompleteOpen();\n }\n }\n};\n\nprovide('$SelectTop', {\n getSelectData: _getSelectData,\n getSelectValueInfo: _getSelectValueInfo,\n getAllChildIds: _getAllChildIds,\n calculationDropdownPosition: () => {\n refElDropdownLayer.value?.calculationPosition();\n },\n convertListToJson: _convertListToJson,\n closeDropdown: () => {\n refElDropdownLayer.value?.setOpen(false);\n },\n refreshDisplayLabels: () => {\n const tempData = _getSelectData();\n optShowSelectLabel.value = tempData.map((info: any) => _getLabelByData(info));\n },\n});\n\nconst getValue = () => {\n const values = _getEffectiveValue();\n const outIds = _getOutValue(values);\n return outIds.join(',');\n};\n\nconst getValueData = () => {\n const values = getValue();\n if (props.multiple) {\n const arrValue = values ? values.split(',') : [];\n const list: any[] = [];\n arrValue.forEach((id: string) => {\n const info = _getSelectValueInfo(id);\n if (!CommonBase.isEmpty(info)) {\n list.push(info);\n }\n });\n return list;\n }\n // 单选:未找到选中值返回 null\n if (!values) return null;\n const info = _getSelectValueInfo(values);\n return CommonBase.isEmpty(info) ? null : info;\n};\n\nconst setValue = (value: string | number) => {\n _setValue(value);\n _checkValueInList();\n};\n\nconst runInitComplete = () => {\n _runInitComplete();\n};\n\nexport interface SelectTopProvide {\n getSelectData: (selectIds?: string[]) => any[];\n getSelectValueInfo: (v: string) => Record<string, any>;\n getAllChildIds: (id: string) => string[];\n calculationDropdownPosition: () => void;\n convertListToJson: (list: any[]) => void;\n closeDropdown: () => void;\n refreshDisplayLabels: () => void;\n}\n\nexport interface ClSelectExpose {\n getValue: () => string;\n getValueData: () => Record<string, any> | Record<string, any>[] | null;\n setValue: (value: string | number) => void;\n runInitComplete: () => void;\n}\n\ndefineExpose({\n getValue,\n getValueData,\n setValue,\n runInitComplete,\n});\n</script>\n"],"names":["ITEM_HEIGHT","MAX_DROPDOWN_HEIGHT","LEVEL_INDENT","props","__props","emit","__emit","optPageLanguage","getPageLanguage","useLanguage","_selfTop","inject","_hasParent","refElSearch","ref","refElScroller","refElRoot","_isUpdateOriginalData","_pageData","_rawCascadeData","_searchSeq","_pageSeq","elId","optKeyIndex","_isKeyListenerBound","optHoverKeydown","optShowAllData","_optUseAllId","_showAllDataJson","optIsItemChecked","info","id","enableChildIds","cid","CommonBase","optAllValue","computed","b","_formatItemLabel","format","v","_checkIsTypeRadio","temInfo","fullInfo","_setUseAllId","ids","_tid","_buildFlatList","list","parentKey","topParentValue","childrenMap","item","pid","pidStr","result","traverse","nodes","level","parentName","visited","node","children","topNodes","_cascadeSearchFill","filteredList","allData","safeFiltered","safeAllData","resultIds","filteredIds","visitedAncestors","currentId","currentIdStr","childId","foundIds","rid","_refreshData","_scrollToSelected","nextTick","idx","_getSelectIds","newIds","isCascadeParent","sId","childIds","allSelected","_setHover","operateType","data","inx","lastHover","i","_onWinKeydown","e","keyCode","isInsidePanel","_onWinKeyup","_recoverRawFromFlat","flatList","_level","_parentName","_hasChildren","raw","_loadMore","loadSeq","curList","param","searchValue","nextList","existingIds","dedupedList","idType","_err","_initMain","onMounted","onBeforeUnmount","CommonElement","onDeactivated","onActivated","watch","newValue","onSearch","value","currentSeq","safeOriginalData","tempSearch","arrSearchKey","searchKeyCount","bb","bi","fieldValue","onSelectAll","addIds","delIds","newSelectIds","onSelectItem","__expose","isOpen","_createElementBlock","_unref","_openBlock","_hoisted_2","_createVNode","ClInputSearch","_Fragment","_hoisted_3","ClCheckboxOne","_createBlock","RecycleScroller","_normalizeStyle","_withCtx","_createElementVNode","_normalizeClass","$event","_hoisted_5","_hoisted_6","_hoisted_8","_hoisted_9","_toDisplayString","optSelectData","optSelectCount","optCanRemoveAll","onRemoveAll","hasRemovable","onRemove","idStr","ClIconFont","_hoisted_4","ClTags","refElDropdownLayer","refElList","refElTags","optBase","reactive","_prevSelectIds","_listDataToJson","_cascadeMaps","optIsFirstDataFinish","optSelectIds","optShowSelectLabel","_isInitEmitted","optShowTextFormat","clsParent","cls","clsDropdown","clsTag","_emitModelValue","_emitChange","_emitInit","_emitOpen","_getEffectiveValue","effectiveValue","_convertListToJson","tempJson","_setValue","_checkValueInList","parent","_buildCascadeDataMaps","expanded","_getValueSplitChild","radioIds","keepId","merged","_setChangeValue","_getLastChildIds","_recurse","_id","_getAllChildIds","uniqueIds","_getValueMergeParent","pendingParents","visitedParents","allChildren","grandPid","_getOutValue","removedIds","outIds","arrValue","isExist","_getSelectValueInfo","_getSelectData","selectIds","tempInfo","_getLabelByData","labelText","effectiveIds","infoData","_checkChangeValue","_runInitComplete","oldValue","newList","_oldValue","oldList","_newSelectIds","tempData","onToggleOpen","onClearText","onChangeDropdownPosition","tagWidth","tempTagDirection","onDropDownChange","arrIds","onTagRemove","onDropDownError","message","onInitComplete","provide","getValue","values","ClDropdownlayerList","_hoisted_1","ClBadge","ClSelectInDropdown","ClSelectInTags"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Index.vue_vue_type_script_setup_true_lang-6KT1IHDu.js","sources":["../../../src/libs/Web/Select/Dropdown.vue","../../../src/libs/Web/Select/Tags.vue","../../../src/libs/Web/Select/Index.vue"],"sourcesContent":["<template>\n <div\n class=\"select-inDropdown-container\"\n :id=\"elId\"\n ref=\"refElRoot\"\n >\n <div\n v-if=\"isSearch\"\n class=\"select-inDropdown-search\"\n role=\"search\"\n aria-label=\"搜索选项\"\n >\n <cl-input-search\n ref=\"refElSearch\"\n :placeholder=\"searchPlaceholder\"\n :disabled=\"disabled\"\n @onChange=\"onSearch\"\n ></cl-input-search>\n </div>\n <template v-else></template>\n <div\n class=\"select-inDropdown-checkboxAll\"\n v-if=\"isMultiple && isCheckBoxAll && optShowAllData.length > 0\"\n >\n <cl-checkbox-one\n :forId=\"`${optKeyIndex}-cb-all`\"\n :label=\"optPageLanguage.checkboxAll\"\n :value=\"optAllValue\"\n :disabled=\"disabled\"\n @onChange=\"onSelectAll\"\n ></cl-checkbox-one>\n </div>\n <template v-else></template>\n <recycle-scroller\n v-if=\"optShowAllData.length > 0\"\n class=\"select-inDropdown-body select-inDropdown-scroller\"\n role=\"listbox\"\n :style=\"{ height: Math.min(optShowAllData.length * ITEM_HEIGHT, MAX_DROPDOWN_HEIGHT) + 'px' }\"\n :items=\"optShowAllData\"\n :item-size=\"ITEM_HEIGHT\"\n key-field=\"id\"\n ref=\"refElScroller\"\n v-slot=\"{ item }\"\n @scroll-end=\"_loadMore\"\n >\n <div\n role=\"option\"\n :aria-selected=\"optIsItemChecked(item)\"\n :aria-disabled=\"item.isDisabled || false\"\n :class=\"{\n 'option-selected': optIsItemChecked(item),\n 'option-disabled': item.isDisabled,\n 'option-hoverKeydown': optHoverKeydown === item.id.toString(),\n 'select-inDropdown-item-child': item._level >= 1,\n }\"\n :style=\"{\n height: ITEM_HEIGHT + 'px',\n paddingLeft: item._level ? item._level * LEVEL_INDENT + 'px' : undefined,\n }\"\n @click=\"onSelectItem(item)\"\n >\n <div class=\"select-inDropdown-item-inner\">\n <div\n class=\"select-inDropdown-checkbox\"\n v-if=\"isMultiple\"\n >\n <cl-checkbox-one\n :name=\"`${optKeyIndex}-cb`\"\n :forId=\"`${optKeyIndex}-cb-${item.id}`\"\n :value=\"optIsItemChecked(item)\"\n :disabled=\"item.isDisabled\"\n ></cl-checkbox-one>\n </div>\n <template v-else></template>\n <div\n class=\"select-inDropdown-title\"\n v-html=\"_formatItemLabel(item)\"\n ></div>\n </div>\n </div>\n </recycle-scroller>\n <div\n v-else\n class=\"select-inDropdown-body\"\n >\n <div class=\"select-inDropdown-empty\">{{ optPageLanguage.noResultsText }}</div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n inject,\n onMounted,\n onBeforeUnmount,\n onDeactivated,\n onActivated,\n nextTick,\n watch,\n computed,\n ref,\n} from 'vue';\nimport { RecycleScroller } from 'vue-virtual-scroller';\nimport 'vue-virtual-scroller/dist/vue-virtual-scroller.css';\nimport CommonBase from '../../Common/base';\nimport CommonElement from '../../Common/Element/index';\nimport ClInputSearch from '../../Element/InputSearch/Index.vue';\nimport ClCheckboxOne from '../../Element/CheckBox/One.vue';\nimport type { SelectTopProvide } from './Index.vue';\nimport useLanguage from '../../Use/language';\n\ndefineOptions({ name: 'ClSelectInDropdown' });\n\nconst props = defineProps({\n id: String, // desc: 组件实例唯一标识,用于多实例场景下 DOM 查询限定\n disabled: {\n type: Boolean,\n default: false, // desc: 组件是否禁用,禁用时不响应点击和键盘操作\n },\n isSearch: {\n type: Boolean,\n default: false, // desc: 是否启用搜索\n },\n searchPlaceholder: String, // desc: 搜索框占位文本\n searchKey: {\n type: Array as () => string[],\n default: () => ['name'], // desc: 搜索匹配的字段名列表\n },\n searchKeyType: {\n type: String,\n default: '||', // desc: 多字段搜索匹配逻辑 | enum: ||, &&\n },\n isMultiple: {\n type: Boolean,\n default: false, // desc: 是否多选\n },\n isCheckBoxAll: {\n type: Boolean,\n default: true, // desc: 是否显示全选复选框\n },\n showDropDownTextFormat: String, // desc: 下拉项显示文本格式化\n showDropDownTextFormatSub: String, // desc: 二级下拉项显示文本格式化\n isCascade: {\n type: Boolean,\n default: false, // desc: 是否启用级联\n },\n parentSelectable: {\n type: Boolean,\n default: false, // desc: 级联时父级是否可被选中\n },\n parentKey: {\n type: String,\n default: 'parentId', // desc: 数据中标识父级的字段名\n },\n topParentValue: {\n type: String,\n default: '0', // desc: 顶级父节点的 parentKey 值\n },\n originalData: {\n type: Array as () => any[],\n default: () => [], // desc: 选项数据列表,外部传入的原始数据\n },\n keyIndex: String, // desc: 组件实例唯一标识\n isOpen: {\n type: Boolean,\n default: false, // desc: 下拉面板是否打开\n },\n selectId: {\n type: Array as () => string[],\n default: () => [], // desc: 已选中的 id 数组,用于标记当前选中项\n },\n serverCallback: Function, // desc: 服务端数据加载回调,入参 { search, offset },返回 Promise<Array>\n});\n\nconst emit = defineEmits({\n onChange: (_ids: string[]) => true, // desc: 选中项变更时触发\n onInitComplete: () => true, // desc: 下拉初始化完成时触发\n onError: (_message: string) => true, // desc: 服务端加载/搜索失败时触发,入参为中文错误提示\n});\n\n// kb: ↑↓ 移动高亮(首尾循环,全局生效——面板打开期间任意焦点位置可移动高亮),\n// Enter 选中高亮项(仅面板内/body 焦点),Esc 关闭下拉\n\nconst { optPageLanguage, getPageLanguage } = useLanguage();\ngetPageLanguage('common');\n\nconst _selfTop = inject<SelectTopProvide>('$SelectTop', {} as SelectTopProvide);\n// 防御:脱离 ClSelect 独立使用时 inject 为空对象,方法调用前需判空\nconst _hasParent = typeof _selfTop.getSelectData === 'function';\nconst refElSearch = ref<InstanceType<typeof ClInputSearch> | null>(null);\nconst refElScroller = ref<InstanceType<typeof RecycleScroller> | null>(null);\nconst refElRoot = ref<HTMLDivElement | null>(null);\n\nlet _isUpdateOriginalData = true;\nconst _pageData: any = { isScrollLoading: false, hasMoreData: true };\nlet _rawCascadeData: any[] = []; // 级联模式:原始数据累加器,避免重复 flatten\nlet _searchSeq = 0; // 搜索请求版本号,防止过期结果覆盖最新搜索结果\nlet _pageSeq = 0; // 分页加载请求版本号(与搜索独立,防滚动加载覆盖搜索结果)\n\n// 虚拟滚动常量\nconst ITEM_HEIGHT = 35;\nconst MAX_DROPDOWN_HEIGHT = 210;\nconst LEVEL_INDENT = 20;\n\nconst elId = props.id; // || `select-inDropdown-${CommonBase.getRandom(5)}`\nconst optKeyIndex = `select-inList-${props.keyIndex || ''}`;\nlet _isKeyListenerBound = false; // 键盘监听注册状态(防重复注册)\nconst optHoverKeydown = ref('');\nconst optShowAllData = ref<any[]>([]);\nconst _optUseAllId = ref<string[]>([]);\nlet _showAllDataJson: any = {};\n\n// 选项选中判定:级联父级显示子集全选联动状态(父级 id 不进 selectId,\n// 父级 CheckBox/高亮以「非禁用子集是否全部选中」为准,与 _getSelectIds 父级分支语义一致)\nconst optIsItemChecked = (info: any) => {\n const id = info.id.toString();\n if (props.isCascade && info._hasChildren && props.parentSelectable && _hasParent) {\n const childIds: string[] = _selfTop.getAllChildIds(id);\n const enableChildIds = childIds.filter((cid: string) => {\n const cInfo = _selfTop.getSelectValueInfo(cid);\n return !cInfo?.isDisabled;\n });\n if (enableChildIds.length === 0) return false;\n return enableChildIds.every((cid: string) => CommonBase.isExistValue(props.selectId, cid));\n }\n return CommonBase.isExistValue(props.selectId, id);\n};\n\nconst optAllValue = computed(() => {\n let b = false;\n const len = _optUseAllId.value.length;\n if (len > 0) {\n if (props.selectId.length >= _optUseAllId.value.length) {\n b = CommonBase.isContainArr(props.selectId, _optUseAllId.value);\n }\n }\n return b;\n});\n\nconst _formatItemLabel = (info: any) => {\n if (!info || typeof info !== 'object') return '';\n // 类型守卫:format 为 String prop,外部传非字符串时降级为空(防 convertStringFormat 崩溃)\n let format = CommonBase.isNonEmptyString(props.showDropDownTextFormat)\n ? props.showDropDownTextFormat\n : '';\n if (info._level >= 1 && CommonBase.isNonEmptyString(props.showDropDownTextFormatSub)) {\n format = props.showDropDownTextFormatSub;\n }\n\n let v = CommonBase.isEmpty(format) ? info.name : CommonBase.convertStringFormat(format, info);\n if (CommonBase.isHtml(v)) {\n if (CommonBase.isEmpty(format) && CommonBase.isHtml(info.name)) {\n v = CommonBase.encodeHTML(info.name);\n } else {\n v = CommonBase.convertStringFormatEncodeHTML(format, info);\n }\n } else if (typeof v === 'string' && v.indexOf('<') > -1) {\n // isHtml 正则盲区兜底:无空格变体(如 <img/src=x onerror=...>)漏判,含 < 即转义。\n // 注意:数据 name 含 HTML 会被转义为字面文本,有意渲染 HTML 需写在 format 模板中\n v = CommonBase.encodeHTML(v);\n }\n return v;\n};\n\nconst _checkIsTypeRadio = (id: any) => {\n const temInfo = _showAllDataJson[id] || {};\n if (CommonBase.isBoolean(temInfo._isTypeRadio)) {\n return temInfo._isTypeRadio;\n }\n // fallback:显示列表未命中(搜索过滤/分页未加载)时查父级数据映射,\n // 防止已选 radio 项被过滤后互斥失效(两个 radio 同时选中)。\n // serverCallback 未加载页的 radio 项由 Index 侧数据注入后的互斥收敛补全\n if (_hasParent) {\n const fullInfo = _selfTop.getSelectValueInfo(id);\n if (CommonBase.isBoolean(fullInfo?._isTypeRadio)) {\n return fullInfo._isTypeRadio;\n }\n }\n return false;\n};\n\nconst _setUseAllId = () => {\n const ids: string[] = [];\n _showAllDataJson = CommonBase.getJsonByList(optShowAllData.value);\n optShowAllData.value.forEach((info: any) => {\n // 入口已过滤非对象数据项,非对象分支为死代码且会破坏 string[] 类型契约\n if (!CommonBase.isObject(info)) return;\n const _tid = typeof info.id;\n if (\n info.id == null ||\n (_tid !== 'string' && (_tid !== 'number' || !CommonBase.isFinite(info.id)))\n )\n return;\n const id = info.id.toString();\n // 级联模式:useAllId 只收集叶子节点,父级通过展开处理\n if (props.isCascade && info._hasChildren) return;\n if (!_checkIsTypeRadio(id)) {\n // 去重:数据含重复 id 时只收一次(防全选判定 length 失真)\n if (CommonBase.isExistValue(ids, id)) return;\n if (info.isDisabled) {\n if (CommonBase.isExistValue(props.selectId, id)) {\n ids.push(id);\n }\n } else {\n ids.push(id);\n }\n }\n });\n _optUseAllId.value = ids;\n};\n\n// 级联:扁平数据 → 平铺树(带 _level, _parentName, _hasChildren)\nconst _buildFlatList = (list: any[]) => {\n const parentKey = props.parentKey as string;\n const topParentValue = props.topParentValue as string;\n const childrenMap: Record<string, any[]> = {};\n list.forEach((item: any) => {\n // 防御:null/非对象数据项跳过,防止属性访问崩溃\n if (!CommonBase.isObject(item)) return;\n if (\n item.id == null ||\n (typeof item.id !== 'string' &&\n (typeof item.id !== 'number' || !CommonBase.isFinite(item.id)))\n )\n return;\n const pid = item[parentKey];\n const pidStr =\n pid != null && (typeof pid === 'string' || typeof pid === 'number') ? pid.toString() : '';\n // 数字 0 的 parentKey 是合法值(顶层标记),不能按 falsy 丢弃;\n // 统一转字符串 key,保证与 traverse 的 childrenMap[id](string)检索一致;\n // topParentValue 同样 String 化(外部传数字 0 时与字符串 '0' 对齐)\n if (pidStr !== '' && pidStr !== String(topParentValue)) {\n if (!childrenMap[pidStr]) childrenMap[pidStr] = [];\n childrenMap[pidStr].push(item);\n }\n });\n const result: any[] = [];\n const traverse = (nodes: any[], level: number, parentName: string, visited: Set<string>) => {\n nodes.forEach((node: any) => {\n const id = node.id.toString();\n // 循环引用检测\n if (visited.has(id)) return;\n visited.add(id);\n const children = childrenMap[id] || [];\n result.push({\n ...node,\n _level: level,\n _parentName: parentName,\n _hasChildren: children.length > 0,\n });\n if (children.length > 0) {\n traverse(children, level + 1, node.name, visited);\n }\n });\n };\n const topNodes = list.filter((item: any) => {\n // 防御:null/非对象与无 id 的数据项不进入顶层(与 _refreshData 非级联分支过滤一致),\n // 防止属性访问与 traverse 中 item.id.toString() 崩溃\n if (!CommonBase.isObject(item)) return false;\n if (\n item.id == null ||\n (typeof item.id !== 'string' &&\n (typeof item.id !== 'number' || !CommonBase.isFinite(item.id)))\n )\n return false;\n const pid = item[parentKey];\n const pidStr =\n pid != null && (typeof pid === 'string' || typeof pid === 'number') ? pid.toString() : '';\n return CommonBase.isEmpty(pidStr) || pidStr === String(topParentValue);\n });\n traverse(topNodes, 0, '', new Set<string>());\n return result;\n};\n\n// 级联搜索补全:子级补所有祖先,父级递归补所有后代\nconst _cascadeSearchFill = (filteredList: any[], allData: any[]) => {\n if (!_hasParent) return filteredList; // 脱离父组件时降级返回原始数据\n // 过滤无 id 的项,防止服务端返回不规范数据导致 item.id.toString() 崩溃\n const safeFiltered = filteredList.filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n const safeAllData = allData.filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n const parentKey = props.parentKey as string;\n const topParentValue = props.topParentValue as string;\n const resultIds = new Set<string>();\n const filteredIds = new Set(safeFiltered.map((item: any) => item.id.toString()));\n safeFiltered.forEach((item: any) => {\n const id = item.id.toString();\n resultIds.add(id);\n // 子级:循环追溯所有祖先\n const visitedAncestors = new Set<string>();\n let currentId: any = item[parentKey];\n while (\n currentId != null &&\n (typeof currentId === 'string' || typeof currentId === 'number') &&\n currentId.toString() !== String(topParentValue)\n ) {\n const currentIdStr = currentId.toString();\n // 循环引用检测:祖先链上已出现过此节点,终止追溯\n if (visitedAncestors.has(currentIdStr)) break;\n visitedAncestors.add(currentIdStr);\n if (!filteredIds.has(currentIdStr)) {\n resultIds.add(currentIdStr);\n }\n const parentInfo = _selfTop.getSelectValueInfo(currentIdStr);\n currentId = parentInfo?.[parentKey];\n }\n // 父级:递归补所有后代(含孙子级及更深)\n const allDescendants: string[] = _selfTop.getAllChildIds(id);\n allDescendants.forEach((childId: string) => {\n resultIds.add(childId);\n });\n });\n const result = safeAllData.filter((item: any) => resultIds.has(item.id.toString()));\n // 补充 allData 中缺失但 resultIds 中存在的数据项\n // (serverCallback 分页加载的数据不在 props.originalData 中,但需出现在搜索结果里)\n const foundIds = new Set(result.map((item: any) => item.id.toString()));\n resultIds.forEach((rid: string) => {\n if (!foundIds.has(rid)) {\n const item = _selfTop.getSelectValueInfo(rid);\n if (item && Object.keys(item).length > 0) {\n result.push(item);\n }\n }\n });\n return result;\n};\n\nconst _refreshData = () => {\n if (_isUpdateOriginalData) {\n _isUpdateOriginalData = false;\n _pageData.hasMoreData = true;\n if (props.isCascade) {\n _rawCascadeData = [...((props.originalData || []) as any[])];\n optShowAllData.value = _buildFlatList(_rawCascadeData);\n } else {\n // 过滤无 id 数据项,防止模板中 item.id.toString() 崩溃\n optShowAllData.value = CommonBase.getListClone(props.originalData).filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n }\n _setUseAllId();\n _scrollToSelected();\n // 重建时重置 hover 高亮:防止上次关闭残留的 hover 项在重开后误选中\n optHoverKeydown.value = '';\n nextTick(() => {\n if (refElSearch.value) {\n refElSearch.value.setValue('');\n }\n });\n }\n};\n\nconst _scrollToSelected = () => {\n nextTick(() => {\n if (refElScroller.value && props.selectId.length > 0) {\n const idx = optShowAllData.value.findIndex(\n (info: any) =>\n info.id != null && CommonBase.isExistValue(props.selectId, info.id.toString()),\n );\n if (idx > -1) {\n refElScroller.value.scrollToItem(idx);\n }\n }\n });\n};\n\nconst _getSelectIds = (id: string) => {\n const newIds: string[] = [];\n const info = _showAllDataJson[id] || {};\n const isCascadeParent = props.isCascade && info._hasChildren;\n\n if (props.isMultiple) {\n if (_checkIsTypeRadio(id)) {\n if (!CommonBase.isExistValue(props.selectId, id)) {\n // radio 互斥:保留非 radio 项,清除已选的其他 radio 项\n (props.selectId as string[]).forEach((sId: string) => {\n if (!_checkIsTypeRadio(sId)) {\n newIds.push(sId);\n }\n });\n newIds.push(id);\n } else {\n // 已选中的 radio 再点击:取消自身,保留其他项(与普通项分支对称)\n (props.selectId as string[]).forEach((sId: string) => {\n if (sId !== id) {\n newIds.push(sId);\n }\n });\n }\n } else if (isCascadeParent && props.parentSelectable && _hasParent) {\n // 级联父级:选中/取消该父级下所有非禁用子级\n const childIds: string[] = _selfTop.getAllChildIds(id);\n const enableChildIds = childIds.filter((cid: string) => {\n const cInfo = _selfTop.getSelectValueInfo(cid);\n return !cInfo?.isDisabled;\n });\n const allSelected =\n enableChildIds.length > 0 &&\n enableChildIds.every((cid: string) => CommonBase.isExistValue(props.selectId, cid));\n // 保留不属于此父级的选中项 + 已选中的禁用子级\n // (radio 项原样保留,互斥仅在 radio 分支内部处理)\n (props.selectId as string[]).forEach((sId: string) => {\n if (!childIds.includes(sId)) {\n newIds.push(sId);\n } else if (childIds.includes(sId)) {\n const sInfo = _selfTop.getSelectValueInfo(sId);\n if (sInfo?.isDisabled) {\n newIds.push(sId);\n }\n }\n });\n // 如果之前没全选,则添加所有非禁用子级\n if (!allSelected) {\n enableChildIds.forEach((cid: string) => {\n if (!CommonBase.isExistValue(newIds, cid)) {\n newIds.push(cid);\n }\n });\n }\n } else if (isCascadeParent && !props.parentSelectable) {\n // 父级不可选,不响应\n return [...(props.selectId as string[])];\n } else {\n // 普通项(子级或非级联模式):保留其他所有项(radio 项原样保留,\n // 互斥仅在 radio 分支内部处理)\n (props.selectId as string[]).forEach((sId: string) => {\n if (sId !== id) {\n newIds.push(sId);\n }\n });\n if (!CommonBase.isExistValue(props.selectId, id)) {\n newIds.push(id);\n }\n }\n } else {\n // 单选\n if (isCascadeParent && !props.parentSelectable) {\n return [...(props.selectId as string[])];\n }\n newIds.push(id);\n }\n return newIds;\n};\n\nconst _setHover = (operateType: number) => {\n const data = optShowAllData.value;\n if (data.length === 0) return;\n let inx = -1;\n const lastHover = optHoverKeydown.value;\n if (lastHover.length > 0) {\n data.forEach((info: any, i: number) => {\n if (info.id.toString() === lastHover) {\n inx = i;\n }\n });\n inx += operateType;\n if (inx < 0) {\n inx = 0;\n } else if (inx >= data.length) {\n inx = data.length - 1;\n }\n } else {\n inx = 0;\n }\n optHoverKeydown.value = data[inx].id.toString();\n if (refElScroller.value) {\n refElScroller.value.scrollToItem(inx);\n }\n};\n\nconst _onWinKeydown = (e: KeyboardEvent) => {\n let keyCode: number | string = e.keyCode;\n if (!CommonBase.isUndefined(keyCode)) {\n keyCode = keyCode.toString();\n switch (keyCode) {\n case '13': {\n // 事件源防护:焦点在面板外且非 body 时不拦截(与 keyup 端对称),\n // 防止全局键盘接管误吞页面 Enter 操作\n const isInsidePanel =\n refElRoot.value && e.target instanceof Node && refElRoot.value.contains(e.target);\n if (e.target === document.body || isInsidePanel) {\n e.preventDefault();\n e.stopPropagation();\n }\n break;\n }\n case '38':\n e.preventDefault();\n e.stopPropagation();\n _setHover(-1);\n break;\n case '40':\n e.preventDefault();\n e.stopPropagation();\n _setHover(1);\n break;\n default:\n break;\n }\n }\n};\n\nconst _onWinKeyup = (e: KeyboardEvent) => {\n let keyCode: number | string = e.keyCode;\n if (!CommonBase.isUndefined(keyCode)) {\n keyCode = keyCode.toString();\n switch (keyCode) {\n case '27':\n if (_hasParent) _selfTop.closeDropdown?.();\n break;\n case '13': {\n const id = optHoverKeydown.value;\n if (!id || props.disabled || !props.isOpen) break; // 组件级禁用/关闭检查\n // 事件源防护:焦点在下拉面板外(页面其他控件)且非 body 时不响应,\n // 防止全局键盘接管误吞页面操作\n const isInsidePanel =\n refElRoot.value && e.target instanceof Node && refElRoot.value.contains(e.target);\n if (e.target !== document.body && !isInsidePanel) break;\n // 校验 hover 项仍在当前显示列表中,防止选中已被搜索过滤掉的项\n if (!optShowAllData.value.some((info: any) => info.id.toString() === id)) break;\n const hoverInfo = _showAllDataJson[id];\n if (hoverInfo?.isDisabled) break;\n const newIds: string[] = _getSelectIds(id);\n emit('onChange', newIds);\n break;\n }\n default:\n break;\n }\n }\n};\n\n// 从 _buildFlatList 生成的显示数据中恢复原始数据(去除 _level/_parentName/_hasChildren)\nconst _recoverRawFromFlat = (flatList: any[]) => {\n return flatList.map((item: any) => {\n const { _level, _parentName, _hasChildren, ...raw } = item;\n return raw;\n });\n};\n\nconst _loadMore = async () => {\n // 无服务端回调时本地数据无需分页,直接退出(原 else 分支空转置位)\n if (!props.serverCallback) return;\n if (_pageData.isScrollLoading || !_pageData.hasMoreData) return;\n _pageData.isScrollLoading = true;\n if (props.serverCallback) {\n const loadSeq = ++_pageSeq;\n // 引用快照:await 期间 originalData 更新会重建 optShowAllData,据此丢弃过期分页结果\n const curList = optShowAllData.value;\n try {\n const param: any = { offset: curList.length };\n if (props.isSearch && refElSearch.value) {\n const searchValue = refElSearch.value.getValue();\n if (!CommonBase.isEmpty(searchValue)) {\n param.search = searchValue;\n }\n }\n const nextList = await props.serverCallback(param);\n // 并发保护:加载期间发生了搜索/列表重建等操作,丢弃过期结果\n if (loadSeq !== _pageSeq || curList !== optShowAllData.value) return;\n // 防御:校验服务端返回值是否为数组\n if (!Array.isArray(nextList)) {\n console.error('[ClSelect] _loadMore 服务端返回数据格式异常(非数组):', typeof nextList);\n emit('onError', '服务端加载失败:返回数据格式异常');\n return;\n }\n // 服务端返回空数组表示数据已全部加载\n if (nextList.length === 0) {\n _pageData.hasMoreData = false;\n return;\n }\n // 去重:过滤已存在于当前显示列表的数据项\n const existingIds = new Set(curList.map((item: any) => item?.id?.toString()).filter(Boolean));\n const dedupedList = nextList.filter((item: any) => {\n if (item?.id == null) return false;\n // 与 _refreshData 过滤标准一致:id 类型校验(防对象 id 产出 '[object Object]')\n const idType = typeof item.id;\n if (idType !== 'string' && (idType !== 'number' || !CommonBase.isFinite(item.id))) {\n return false;\n }\n return !existingIds.has(item.id.toString());\n });\n // 服务端返回全部重复(无新增)时视为数据已到尽头,终止加载防止无限请求循环\n if (dedupedList.length === 0) {\n _pageData.hasMoreData = false;\n return;\n }\n if (props.isCascade) {\n if (param.search) {\n // 搜索模式:数据量小,直接用展开方式追加\n optShowAllData.value = _buildFlatList([...optShowAllData.value, ...dedupedList]);\n } else {\n // 非搜索模式:使用累加器避免重复 flatten\n if (_rawCascadeData.length === 0) {\n // 防御:优先从当前显示数据恢复累加器,避免 onSearch 清空 _rawCascadeData 后\n // 回退到 props.originalData 导致丢失之前 serverCallback 加载的数据\n _rawCascadeData = _recoverRawFromFlat(optShowAllData.value);\n }\n if (_rawCascadeData.length === 0) {\n // 当前显示数据也为空时才回退到 props.originalData\n _rawCascadeData = [...(props.originalData as any[])];\n }\n _rawCascadeData.push(...dedupedList);\n optShowAllData.value = _buildFlatList(_rawCascadeData);\n }\n } else {\n optShowAllData.value.push(...dedupedList);\n }\n _setUseAllId();\n if (_hasParent) {\n _selfTop.convertListToJson(dedupedList);\n _selfTop.refreshDisplayLabels?.();\n }\n } catch (_err) {\n console.error('[ClSelect] _loadMore 服务端加载失败:', _err);\n emit('onError', '服务端加载失败,请稍后重试');\n } finally {\n _pageData.isScrollLoading = false;\n }\n }\n};\n\nconst _initMain = () => {\n _refreshData();\n emit('onInitComplete');\n};\n\n// 生命周期\nonMounted(() => {\n _initMain();\n});\n\nonBeforeUnmount(() => {\n CommonElement.offListener(window, 'keydown', _onWinKeydown);\n CommonElement.offListener(window, 'keyup', _onWinKeyup);\n _isKeyListenerBound = false;\n});\n\nonDeactivated(() => {\n // keep-alive 场景:组件停用时清理全局键盘监听,防止残留拦截页面按键\n CommonElement.offListener(window, 'keydown', _onWinKeydown);\n CommonElement.offListener(window, 'keyup', _onWinKeyup);\n _isKeyListenerBound = false;\n});\n\nonActivated(() => {\n // keep-alive 恢复:面板仍打开时重新注册键盘监听(onDeactivated 已移除)\n if (props.isOpen && !_isKeyListenerBound) {\n CommonElement.onListener(window, 'keydown', _onWinKeydown);\n CommonElement.onListener(window, 'keyup', _onWinKeyup);\n _isKeyListenerBound = true;\n }\n});\n\n// watch\nwatch(\n () => props.isOpen,\n (newValue: boolean) => {\n if (newValue) {\n // 每次打开强制重置:从全量/首屏数据重建并清空搜索框,\n // 防止上次搜索状态残留到本次打开\n _isUpdateOriginalData = true;\n _refreshData();\n } else {\n // 关闭时复位分页锁:服务端请求挂起(不 settle)时重开仍可继续滚动\n _pageData.isScrollLoading = false;\n }\n },\n);\n\nwatch(\n () => props.originalData,\n newValue => {\n _isUpdateOriginalData = true;\n if (props.isCascade) {\n _rawCascadeData = [...((newValue || []) as any[])];\n optShowAllData.value = _buildFlatList(_rawCascadeData);\n } else {\n // 过滤无 id 或 id 类型异常的数据项,防止模板中 item.id.toString() 崩溃\n optShowAllData.value = CommonBase.getListClone(newValue).filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n }\n _setUseAllId();\n // 数据重建后重置搜索交互状态与分页状态:清空搜索框与 hover 高亮,\n // 防止「搜索框有词 + 列表全量」的状态不一致;分页锁复位防新数据停摆\n _pageData.hasMoreData = true;\n optHoverKeydown.value = '';\n nextTick(() => {\n if (refElSearch.value) {\n refElSearch.value.setValue('');\n }\n });\n },\n);\n\n// 事件方法\nconst onSearch = async (value: string) => {\n const currentSeq = ++_searchSeq;\n // 使进行中的分页加载请求失效(搜索是更新操作,其结果优先);\n // Math.max 保持版本号单调,避免回退式赋值与进行中 loadSeq 碰撞\n _pageSeq = Math.max(_pageSeq, currentSeq + 1);\n let list: any[] = [];\n // 级联模式:搜索时重置原始数据累加器和分页状态,避免 _loadMore 混入搜索前的全量数据\n if (props.isCascade) {\n _rawCascadeData = [];\n }\n _pageData.hasMoreData = true;\n if (props.serverCallback) {\n try {\n list = await props.serverCallback({ search: value, offset: 0 });\n // 防御:校验服务端返回值是否为数组\n if (!Array.isArray(list)) {\n console.error('[ClSelect] onSearch 服务端返回数据格式异常(非数组):', typeof list);\n emit('onError', '服务端搜索失败:返回数据格式异常');\n list = [];\n }\n // 竞态保护:当前请求已过期,放弃结果\n if (currentSeq !== _searchSeq) return;\n if (_hasParent) _selfTop.convertListToJson(list);\n } catch (_err) {\n console.error('[ClSelect] onSearch 服务端搜索失败:', _err);\n emit('onError', '服务端搜索失败,请稍后重试');\n list = [];\n }\n // 竞态保护:请求已过期\n if (currentSeq !== _searchSeq) return;\n if (props.isCascade) {\n list = _cascadeSearchFill(list, props.originalData as any[]);\n list = _buildFlatList(list);\n }\n } else {\n // 防御:过滤 null 项与无 id 项(与 _refreshData 一致),\n // 防止模板 item.id.toString() 与字段访问崩溃\n const safeOriginalData = (props.originalData as any[]).filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n if (CommonBase.isEmpty(value)) {\n list = safeOriginalData;\n } else {\n if (props.searchKeyType !== '||' && props.searchKeyType !== '&&') {\n console.warn(\n '[ClSelect] onSearch searchKeyType 未知值,已降级为 OR 匹配:',\n props.searchKeyType,\n );\n }\n const tempSearch = value.toLowerCase();\n // 防御:searchKey 非数组(外部传 null 等违规输入)时降级为默认字段\n const arrSearchKey = CommonBase.isArray(props.searchKey)\n ? (props.searchKey as string[])\n : ['name'];\n const searchKeyCount = arrSearchKey.length;\n safeOriginalData.forEach((info: any) => {\n const bb: boolean[] = [];\n for (let bi = 0; bi < searchKeyCount; bi++) {\n const fieldValue = info[arrSearchKey[bi]];\n if (fieldValue == null) continue;\n const bKeyValue = String(fieldValue).toLowerCase();\n if (bKeyValue.indexOf(tempSearch) > -1) {\n bb.push(true);\n }\n }\n if (bb.length > 0) {\n switch (props.searchKeyType) {\n case '||':\n list.push(info);\n break;\n case '&&':\n if (bb.length === searchKeyCount) {\n list.push(info);\n }\n break;\n default:\n // 未知匹配模式,降级为 OR 逻辑\n list.push(info);\n }\n }\n });\n }\n if (props.isCascade) {\n if (!CommonBase.isEmpty(value)) {\n list = _cascadeSearchFill(list, props.originalData as any[]);\n }\n list = _buildFlatList(list);\n }\n }\n\n // 防御:过滤 null/无 id 数据项(与 _refreshData 一致),\n // 防止模板 item.id.toString() 崩溃(serverCallback 分支返回值可能含异常项)\n optShowAllData.value = list.filter(\n (item: any) =>\n item != null &&\n item.id != null &&\n (typeof item.id === 'string' ||\n (typeof item.id === 'number' && CommonBase.isFinite(item.id))),\n );\n _setUseAllId();\n optHoverKeydown.value = '';\n if (_hasParent) _selfTop.calculationDropdownPosition();\n};\n\nconst onSelectAll = (e: { event: MouseEvent; value: boolean }) => {\n if (props.disabled) return; // 组件级禁用检查(与 onSelectItem 一致)\n if (props.isMultiple) {\n const addIds: string[] = [];\n const delIds: string[] = [];\n _optUseAllId.value.forEach((id: string) => {\n if (e.value) {\n if (!CommonBase.isExistValue(props.selectId, id)) {\n addIds.push(id);\n }\n } else {\n if (CommonBase.isExistValue(props.selectId, id)) {\n // 与 _getSelectIds 语义一致:全不选不取消已选中的禁用项\n if (!_showAllDataJson[id]?.isDisabled) {\n delIds.push(id);\n }\n }\n }\n });\n const newIds: string[] = CommonBase.getArrClone(props.selectId);\n if (delIds.length > 0) {\n delIds.forEach((id: string) => {\n const idx = newIds.indexOf(id);\n if (idx > -1) newIds.splice(idx, 1);\n });\n }\n if (addIds.length > 0) {\n addIds.forEach((id: string) => {\n if (!CommonBase.isExistValue(newIds, id)) {\n newIds.push(id);\n }\n });\n }\n const newSelectIds: string[] = [];\n newIds.forEach((id: string) => {\n // radio 项不参与全选:已选的原样保留(未选的本就不在 newIds)\n if (!_checkIsTypeRadio(id) || CommonBase.isExistValue(props.selectId, id)) {\n newSelectIds.push(id);\n }\n });\n emit('onChange', newSelectIds);\n }\n};\n\nconst onSelectItem = (info: any) => {\n if (\n info.id == null ||\n (typeof info.id !== 'string' && (typeof info.id !== 'number' || !CommonBase.isFinite(info.id)))\n )\n return;\n if (info.isDisabled || props.disabled) return; // 项级 + 组件级禁用检查\n const id = info.id.toString();\n const newIds: string[] = _getSelectIds(id);\n emit('onChange', newIds);\n};\n\n// 外部调用\nconst initOpenShow = (isOpen: boolean) => {\n if (isOpen) {\n // 防重:重复打开不重复注册,防止一次按键触发多次导航\n if (!_isKeyListenerBound) {\n CommonElement.onListener(window, 'keydown', _onWinKeydown);\n CommonElement.onListener(window, 'keyup', _onWinKeyup);\n _isKeyListenerBound = true;\n }\n } else {\n if (_isKeyListenerBound) {\n CommonElement.offListener(window, 'keydown', _onWinKeydown);\n CommonElement.offListener(window, 'keyup', _onWinKeyup);\n _isKeyListenerBound = false;\n }\n }\n};\n\nexport interface ClSelectInDropdownExpose {\n initOpenShow: (isOpen: boolean) => void;\n}\n\ndefineExpose({\n initOpenShow,\n});\n</script>\n","<template>\n <div\n class=\"select-inTag-container\"\n :id=\"elId\"\n >\n <div class=\"select-inTag-title\">\n <span> {{ optPageLanguage.selected }} {{ optSelectCount }} {{ optPageLanguage.count }} </span>\n <span class=\"select-inTag-operate\">\n <cl-icon-font\n v-if=\"optCanRemoveAll\"\n class=\"select-inTag-deleteAll\"\n name=\"remove\"\n :title=\"optPageLanguage.deleteAll\"\n :aria-label=\"optPageLanguage.deleteAll\"\n @click=\"onRemoveAll\"\n ></cl-icon-font>\n <template v-else></template>\n </span>\n </div>\n <div class=\"select-inTag-body\">\n <cl-tags\n :showTextFormat=\"showTextFormat\"\n :list=\"optSelectData\"\n @onRemove=\"onRemove\"\n ></cl-tags>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, computed } from 'vue';\nimport CommonBase from '../../Common/base';\nimport ClIconFont from '../../Element/IconFont/Index.vue';\nimport ClTags from '../../Element/Tags/Index.vue';\nimport type { SelectTopProvide } from './Index.vue';\nimport useLanguage from '../../Use/language';\n\ndefineOptions({ name: 'ClSelectInTags' });\n\nconst props = defineProps({\n id: String, // desc: 组件实例唯一标识,用于多实例场景下 DOM 查询限定\n showTextFormat: String, // desc: 标签显示文本格式化\n selectId: {\n type: Array as () => string[],\n default: () => [], // desc: 已选中的 id 列表\n },\n});\n\nconst emit = defineEmits({\n onRemove: (_ids: string[]) => true, // desc: 移除已选标签时触发\n});\n\nconst elId = props.id; // || `select-inTag-${CommonBase.getRandom(5)}`\n\nconst { optPageLanguage, getPageLanguage } = useLanguage();\ngetPageLanguage('common');\n\nconst _selfTop = inject<SelectTopProvide>('$SelectTop', {} as SelectTopProvide);\nconst _hasParent = typeof _selfTop.getSelectData === 'function';\n\nconst optSelectData = computed(() => {\n if (!_hasParent) return [];\n // 防御:selectId 非数组(外部违规输入)时不透传给父级,避免上游 forEach 崩溃\n return CommonBase.isArray(props.selectId) ? _selfTop.getSelectData(props.selectId) : [];\n});\n\nconst optSelectCount = computed(() => {\n // 计数与标签渲染同口径(optSelectData),避免无效/未加载 id 造成数量虚高\n return _hasParent ? optSelectData.value.length : 0;\n});\n\n// 是否存在可删项(与 onRemoveAll 的保护判定同源,用于隐藏无意义的删除全部图标)\nconst optCanRemoveAll = computed(() => {\n if (!CommonBase.isArray(optSelectData.value)) return false;\n return optSelectData.value.some((info: any) => {\n if (!CommonBase.isObject(info)) return false;\n return !(CommonBase.isBoolean(info.isDisabled) ? !!info.isDisabled : false);\n });\n});\n\nconst onRemoveAll = () => {\n // 防御:父级 getSelectData 返回非数组时降级为不操作\n const list = optSelectData.value;\n if (!CommonBase.isArray(list)) return;\n const newIds: string[] = [];\n let hasRemovable = false;\n list.forEach((info: any) => {\n // 防御:数据项为 null/非对象时跳过(父级契约不保证每项非空)\n if (!CommonBase.isObject(info)) return;\n // 保护判定与 Element/Tags 的 isShowDisabled 派生逻辑对齐(isDisabled 布尔归一化):\n // Element/Tags 的 _convertListInfoDisabled 会把 isShowDisabled 重写为 isDisabled 派生值,\n // 直接读 isShowDisabled 会造成单删可删、全删保留的分裂\n const isProtected = CommonBase.isBoolean(info.isDisabled) ? !!info.isDisabled : false;\n if (isProtected) {\n // 防御:id 缺失/类型异常的数据项跳过,防止 toString 崩溃\n const isValidId =\n (typeof info.id === 'string' && !CommonBase.isEmpty(info.id)) ||\n (typeof info.id === 'number' && CommonBase.isFinite(info.id));\n if (isValidId) {\n newIds.push(info.id.toString());\n }\n } else {\n hasRemovable = true;\n }\n });\n // 无任何可删项(列表为空或全部受保护)时不 emit,与 onRemove 防多余上报语义一致\n if (!hasRemovable) return;\n emit('onRemove', newIds);\n};\n\nconst onRemove = (id: string) => {\n // 防御:selectId 非数组(外部传 null 等违规输入)时降级为不操作\n if (!CommonBase.isArray(props.selectId)) return;\n // 空串 payload(Element/Tags 的清除全部场景)无对应目标,静默忽略\n if (CommonBase.isEmpty(id)) return;\n // 字符串化归一化比较:兼容 selectId 混入 number 元素的类型不一致场景\n const idStr = String(id);\n const idx = props.selectId.findIndex((v: string) => String(v) === idStr);\n if (idx === -1) {\n // 弱竞态防御:id 不在选中列表中时不重复上报,消除多余 onChange\n return;\n }\n const newIds = CommonBase.getArrClone(props.selectId as string[]);\n newIds.splice(idx, 1);\n emit('onRemove', newIds);\n};\n</script>\n","<template>\n <cl-dropdownlayer-list\n :id=\"elId\"\n ref=\"refElDropdownLayer\"\n :classParent=\"clsParent\"\n classText=\"select-inText\"\n :classDropDown=\"clsDropdown\"\n :placeholder=\"placeholder\"\n :isDisabled=\"disabled\"\n :isClear=\"isClear\"\n :textLabel=\"optShowSelectLabel.join(',')\"\n :textArrowDirection=\"arrowDirection\"\n :transitionLeave=\"transitionLeave\"\n :onOpenBeforeCallback=\"onOpenBefore\"\n @onChangeOpen=\"onToggleOpen\"\n @onClear=\"onClearText\"\n @onChangePosition=\"onChangeDropdownPosition\"\n >\n <template v-slot:textExtend>\n <span\n v-if=\"multiple\"\n class=\"select-inText-num\"\n >\n <cl-badge\n v-if=\"optShowSelectLabel.length > 1\"\n :num=\"optShowSelectLabel.length\"\n ></cl-badge>\n <template v-else></template>\n </span>\n <template v-else></template>\n </template>\n <template v-slot:dropdown>\n <cl-select-in-dropdown\n ref=\"refElList\"\n :isSearch=\"isSearch\"\n :searchPlaceholder=\"searchPlaceholder\"\n :searchKey=\"searchKey\"\n :searchKeyType=\"searchKeyType\"\n :isMultiple=\"multiple\"\n :isCheckBoxAll=\"isCheckBoxAll\"\n :showDropDownTextFormat=\"showDropDownTextFormat\"\n :showDropDownTextFormatSub=\"showDropDownTextFormatSub\"\n :isCascade=\"isCascade\"\n :parentSelectable=\"parentSelectable\"\n :parentKey=\"parentKey\"\n :topParentValue=\"topParentValue\"\n :originalData=\"list\"\n :keyIndex=\"optKeyIndex\"\n :selectId=\"optSelectIds\"\n :disabled=\"disabled\"\n :isOpen=\"optBase.isOpen\"\n :serverCallback=\"serverCallback\"\n @onChange=\"onDropDownChange\"\n @onInitComplete=\"onInitComplete\"\n @onError=\"onDropDownError\"\n ></cl-select-in-dropdown>\n </template>\n <template v-slot:dropdownExtend>\n <div\n v-if=\"multiple && isShowTag\"\n :class=\"clsTag\"\n :style=\"{ height: optBase.tagHeight, left: optBase.tagLeft }\"\n ref=\"refElTags\"\n >\n <cl-select-in-tags\n :showTextFormat=\"optShowTextFormat\"\n :selectId=\"optSelectIds\"\n @onRemove=\"onTagRemove\"\n ></cl-select-in-tags>\n </div>\n <template v-else></template>\n </template>\n </cl-dropdownlayer-list>\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, onMounted, nextTick, watch, computed, ref, reactive } from 'vue';\nimport CommonBase from '../../Common/base';\nimport CommonElement from '../../Common/Element/index';\nimport ClBadge from '../../Element/Badge/Index.vue';\nimport ClDropdownlayerList from '../DropdownLayer/List.vue';\nimport ClSelectInDropdown from './Dropdown.vue';\nimport ClSelectInTags from './Tags.vue';\nimport type { ClDropdownlayerChangePositionInfo } from '../DropdownLayer/Base.vue';\nimport './index.css';\n\ndefineOptions({ name: 'ClSelect' });\n\nconst props = defineProps({\n id: String, // desc: 组件实例唯一标识,用于多实例场景下 DOM 查询限定\n value: [String, Number], // desc: 绑定值,v-model 双向绑定\n className: String, // desc: 自定义 CSS 类名\n disabled: {\n type: Boolean,\n default: false, // desc: 是否禁用\n },\n list: {\n type: Array as () => any[],\n default: () => [], // desc: 选项数据列表\n },\n placeholder: String, // desc: 占位文本\n classDropDown: String, // desc: 下拉面板自定义 CSS 类名\n theme: {\n type: String,\n default: 'default', // desc: 主题样式 | enum: default, noBorder\n validator: (v: string) => ['default', 'noBorder'].includes(v),\n },\n multiple: {\n type: Boolean,\n default: false, // desc: 是否多选\n },\n isClear: {\n type: Boolean,\n default: false, // desc: 是否显示清除按钮\n },\n isSearch: {\n type: Boolean,\n default: false, // desc: 是否启用搜索\n },\n isCheckBoxAll: {\n type: Boolean,\n default: true, // desc: 是否显示全选复选框\n },\n isShowTag: {\n type: Boolean,\n default: true, // desc: 是否显示已选标签区域\n },\n arrowDirection: {\n type: String,\n default: 'right', // desc: 箭头在文本左侧还是右侧 | enum: left, right\n validator: (v: string) => ['left', 'right'].includes(v),\n },\n transitionLeave: {\n type: String,\n default: 'zoomOutTop', // desc: 下拉面板关闭动画类名(传无动画类可瞬消)\n },\n searchPlaceholder: String, // desc: 搜索框占位文本\n searchKey: {\n type: Array as () => string[],\n default: () => ['name'], // desc: 搜索匹配的字段名列表\n },\n searchKeyType: {\n type: String,\n default: '||', // desc: 多字段搜索匹配逻辑 | enum: ||, &&\n validator: (v: string) => ['||', '&&'].includes(v),\n },\n showTextFormat: String, // desc: 选中项显示文本格式化,支持 ${xxx} 占位\n showDropDownTextFormat: String, // desc: 下拉项显示文本格式化\n multipleRealTimeChange: {\n type: Boolean,\n default: false, // desc: 多选时是否实时触发 onChange 事件,false 则关闭下拉时触发\n },\n isCascade: {\n type: Boolean,\n default: false, // desc: 是否启用二级级联\n },\n parentSelectable: {\n type: Boolean,\n default: false, // desc: 二级级联时父级是否可被选中\n },\n parentKey: {\n type: String,\n default: 'parentId', // desc: 数据中标识父级的字段名\n },\n topParentValue: {\n type: String,\n default: '0', // desc: 顶级父节点的 parentKey 值\n },\n showDropDownTextFormatSub: String, // desc: 二级下拉项文本格式化,${xxx} 格式\n isOutMerge: {\n type: Boolean,\n default: true, // desc: 级联多选时,所有子级选中后是否合并为父级 id(true 合并,false 保持叶子 id)\n },\n onOpenBefore: Function, // desc: 下拉面板打开前的回调函数,返回 false 可阻止打开\n serverCallback: Function, // desc: 服务端数据加载回调,入参 { search, offset },返回 Promise<Array>\n});\n\nconst emit = defineEmits({\n 'update:value': (_value: string) => true, // desc: v-model 值更新时触发\n onChange: (_value: string, _data: Record<string, any> | Record<string, any>[] | null) => true, // desc: 选中值变更时触发\n onInit: () => true, // desc: 组件初始化完成时触发\n onOpen: (_isOpen: boolean) => true, // desc: 下拉面板打开/关闭时触发\n onError: (_message: string) => true, // desc: 服务端加载/搜索失败时触发,入参为中文错误提示\n});\n\nconst refElDropdownLayer = ref<InstanceType<typeof ClDropdownlayerList> | null>(null);\nconst refElList = ref<InstanceType<typeof ClSelectInDropdown> | null>(null);\nconst refElTags = ref<InstanceType<typeof ClSelectInTags> | null>(null);\n\nconst optKeyIndex = `select-${CommonBase.getRandom(8)}`;\nconst elId = props.id; // || `select-${CommonBase.getRandom(8)}`\nconst optBase = reactive({\n isOpen: false,\n dropDownPos: 'down',\n tagHeight: '',\n tagLeft: '',\n tagDirection: 'right',\n});\n\nlet _prevSelectIds: string[] = [];\nlet _listDataToJson: any = {};\n// 级联数据映射\nconst _cascadeMaps: any = {\n childrenMap: {} as Record<string, string[]>, // 父级 id → 子级 id 列表\n parentMap: {} as Record<string, string>, // 子级 id → 父级 id\n lastChildMap: {} as Record<string, string[]>, // id → 该节点下所有叶子 id\n allChildMap: {} as Record<string, string[]>, // id → 该节点下所有后代 id(含中间层)\n};\nconst optIsFirstDataFinish = ref(false);\nconst optSelectIds = ref<string[]>([]);\nconst optShowSelectLabel = ref<string[]>([]);\nlet _isInitEmitted = false; // onInit 防重标志\n\nconst optShowTextFormat = computed(() => {\n if (CommonBase.isNonEmptyString(props.showTextFormat)) {\n return props.showTextFormat;\n }\n if (props.isCascade) {\n return '${name}(${parentName})';\n }\n return '';\n});\n\nconst clsParent = computed(() => {\n let cls: Record<string, boolean> = { 'panel-select': true, 'box-width': true };\n if (props.theme === 'noBorder') {\n cls['select-theme-noBorder'] = true;\n }\n cls = CommonBase.getJsonMerge(cls, CommonElement.getClassNameJson(props.className));\n return CommonBase.getStringByJson(cls, ' ');\n});\n\nconst clsDropdown = computed(() => {\n let cls: Record<string, boolean> = { 'select-inDropdown': true };\n if (optBase.isOpen) {\n if (props.multiple && props.isShowTag) {\n cls['select-inTag-ext'] = true;\n cls[`select-inTag-${optBase.tagDirection}`] = true;\n }\n }\n cls = CommonBase.getJsonMerge(cls, CommonElement.getClassNameJson(props.classDropDown));\n return CommonBase.getStringByJson(cls, ' ');\n});\n\nconst clsTag = computed(() => {\n const cls: Record<string, boolean> = {\n 'select-inTag': true,\n 'select-inTag-open': optBase.isOpen,\n };\n cls[`select-inTag-${optBase.dropDownPos}`] = true;\n cls[`select-inTag-${optBase.tagDirection}`] = true;\n return cls;\n});\n\nconst _emitModelValue = (value: string) => {\n emit('update:value', value);\n};\n\nconst _emitChange = (value: string, data: any) => {\n _emitModelValue(value);\n emit('onChange', value, data);\n};\n\nconst _emitInit = () => {\n if (_isInitEmitted) return;\n _isInitEmitted = true;\n nextTick(() => {\n emit('onInit');\n });\n};\n\nconst _emitOpen = (isOpen: boolean) => {\n nextTick(() => {\n emit('onOpen', isOpen);\n });\n};\n\nconst _getEffectiveValue = () => {\n const effectiveValue: string[] = [];\n optSelectIds.value.forEach((v: string) => {\n if (CommonBase.isExistJsonKey(_listDataToJson, v)) {\n effectiveValue.push(v);\n }\n });\n return effectiveValue;\n};\n\nconst _convertListToJson = (list: any[]) => {\n // 防御:非数组输入(对象等)直接忽略,防止 list.forEach 崩溃\n if (CommonBase.isEmpty(list) || !CommonBase.isArray(list)) return;\n const tempJson: Record<string, any> = {};\n const parentKey = props.parentKey as string;\n const topParentValue = props.topParentValue as string;\n list.forEach((item: any) => {\n // 防御:跳过 null/非对象数据项,防止服务端返回异常数据时整个函数中断\n if (!CommonBase.isObject(item)) {\n console.warn('[ClSelect] _convertListToJson 跳过非对象数据项:', item);\n return;\n }\n const isValidId =\n typeof item.id === 'string' || (typeof item.id === 'number' && CommonBase.isFinite(item.id));\n if (!isValidId) {\n console.warn('[ClSelect] _convertListToJson 跳过无 id 或 id 类型异常的数据项:', item);\n return;\n }\n const id = item.id.toString();\n tempJson[id] = CommonBase.getJsonClone(item);\n });\n _listDataToJson = CommonBase.getJsonMerge(_listDataToJson, tempJson);\n // serverCallback 模式:数据首次注入时置位完成标志,触发 onInit——\n // 该模式下 props.list 恒空,_runInitComplete 不执行,onInit 依赖此处置位\n if (props.serverCallback && !optIsFirstDataFinish.value && !CommonBase.isEmpty(tempJson)) {\n optIsFirstDataFinish.value = true;\n // 编辑回显:初始 props.value 从未被应用(list 恒空时 _runInitComplete 被跳过),\n // 数据首次注入时补应用;props.value 为空时不覆盖(保留外部 setValue 预设的选中态)\n if (props.value != null && props.value !== '') {\n _setValue(props.value);\n _checkValueInList();\n }\n }\n // 级联模式:全量重注入 parentName——父级数据后到达时给旧子级补注入,\n // 且父级 name 更新时同步刷新子级快照中的 parentName\n if (props.isCascade) {\n Object.keys(_listDataToJson).forEach(id => {\n const pid = _listDataToJson[id][parentKey];\n const pidStr =\n pid != null && (typeof pid === 'string' || typeof pid === 'number') ? pid.toString() : '';\n // 数字 parentKey(如 0)是合法值:统一转字符串查找父级;\n // topParentValue 同样 String 化(外部传数字 0 时与字符串 '0' 对齐)\n if (pidStr !== '' && pidStr !== String(topParentValue)) {\n const parent = _listDataToJson[pidStr];\n if (parent?.name) {\n _listDataToJson[id].parentName = parent.name;\n }\n }\n });\n }\n // 级联模式:重建数据映射\n if (props.isCascade) {\n _buildCascadeDataMaps();\n // 异步数据加载场景:serverCallback 后续加载数据时 _cascadeMaps 刚被构建,\n // 需重新展开 optSelectIds 中的父级 id 为子级 id\n if (props.isOutMerge && props.multiple && optSelectIds.value.length > 0) {\n const expanded = _getValueSplitChild(optSelectIds.value);\n if (!CommonBase.isEqualArr(optSelectIds.value, expanded)) {\n optSelectIds.value = expanded;\n // 同步打开快照:展开是内部数据归一化而非用户操作,避免关闭时误判变更\n _prevSelectIds = expanded;\n }\n }\n }\n // serverCallback 未加载页边界补互斥:数据注入后对已知 radio 项做互斥收敛。\n // 点击时属性未知的已选 radio(未加载页)在数据到达后补执行互斥——\n // optSelectIds 数组顺序即选择顺序(预设先入、新选后入),保留数组末尾的\n // radio(最近选择),清除其他已选 radio\n if (props.multiple && optSelectIds.value.length > 1) {\n const radioIds = optSelectIds.value.filter((id: string) => {\n const info = _listDataToJson[id];\n return CommonBase.isBoolean(info?._isTypeRadio) && info._isTypeRadio;\n });\n if (radioIds.length > 1) {\n const keepId = radioIds[radioIds.length - 1];\n const merged = optSelectIds.value.filter(\n (id: string) => id === keepId || !radioIds.includes(id),\n );\n if (!CommonBase.isEqualArr(optSelectIds.value, merged)) {\n optSelectIds.value = merged;\n _setChangeValue();\n }\n }\n }\n // 数据映射更新后刷新 optSelectIds 引用:Tags 标签区 computed 依赖\n // getSelectData(读非响应式映射),引用不变时不重算——数据晚于选中值\n // 到达(编辑回显)时标签区需由此驱动刷新\n if (optSelectIds.value.length > 0) {\n optSelectIds.value = [...optSelectIds.value];\n }\n};\n\n// 构建级联数据映射\nconst _buildCascadeDataMaps = () => {\n const parentKey = props.parentKey as string;\n const topParentValue = props.topParentValue as string;\n _cascadeMaps.childrenMap = {};\n _cascadeMaps.parentMap = {};\n _cascadeMaps.lastChildMap = {};\n _cascadeMaps.allChildMap = {};\n const allIds = Object.keys(_listDataToJson);\n allIds.forEach(id => {\n const info = _listDataToJson[id];\n const pid = info[parentKey];\n const pidStr =\n pid != null && (typeof pid === 'string' || typeof pid === 'number') ? pid.toString() : '';\n // 数字 parentKey(如 0)是合法值:统一字符串 key,保证 childrenMap/parentMap\n // 与 _getLastChildIds 等字符串 id 检索一致\n if (pidStr !== '' && pidStr !== String(topParentValue)) {\n _cascadeMaps.parentMap[id] = pidStr;\n if (!_cascadeMaps.childrenMap[pidStr]) {\n _cascadeMaps.childrenMap[pidStr] = [];\n }\n _cascadeMaps.childrenMap[pidStr].push(id);\n }\n });\n};\n\n// 递归获取某节点下所有叶子 id\nconst _getLastChildIds = (id: string): string[] => {\n const _recurse = (_id: string, visited: Set<string>): string[] => {\n if (_cascadeMaps.lastChildMap[_id]) {\n return _cascadeMaps.lastChildMap[_id];\n }\n // 循环引用检测:当前节点已在祖先链上,终止递归\n if (visited.has(_id)) return [];\n visited.add(_id);\n const children = _cascadeMaps.childrenMap[_id];\n if (!children || children.length === 0) {\n _cascadeMaps.lastChildMap[_id] = [_id];\n return [_id];\n }\n const ids: string[] = [];\n children.forEach((cid: string) => {\n ids.push(..._recurse(cid, new Set(visited)));\n });\n _cascadeMaps.lastChildMap[_id] = ids;\n return ids;\n };\n return _recurse(id, new Set());\n};\n\n// 递归获取某节点下所有后代 id(含中间层节点,非仅叶子)。\n// 与 _getLastChildIds 的区别:后者仅返回叶子节点,本函数返回所有层级后代。\n// 注意:叶子节点无后代,返回 [](叶子自身不在\"后代\"范围内)。\nconst _getAllChildIds = (id: string): string[] => {\n const _recurse = (_id: string, visited: Set<string>): string[] => {\n if (_cascadeMaps.allChildMap[_id]) {\n return _cascadeMaps.allChildMap[_id];\n }\n // 循环引用检测:当前节点已在祖先链上,终止递归\n if (visited.has(_id)) return [];\n visited.add(_id);\n const children = _cascadeMaps.childrenMap[_id];\n if (!children || children.length === 0) {\n _cascadeMaps.allChildMap[_id] = [];\n return [];\n }\n const ids: string[] = [];\n children.forEach((cid: string) => {\n ids.push(cid);\n ids.push(..._recurse(cid, new Set(visited)));\n });\n // 去重:防止同一子节点挂在多个父级下(非标准层级数据)时出现重复 id\n const uniqueIds = Array.from(new Set(ids));\n _cascadeMaps.allChildMap[_id] = uniqueIds;\n return uniqueIds;\n };\n return _recurse(id, new Set());\n};\n\n// isOutMerge=true:将所有子级选中时合并为父级 id\nconst _getValueMergeParent = (ids: string[]): string[] => {\n if (ids.length === 0) return [];\n const result = new Set(ids);\n // 收集需要检查的候选父级,避免每轮重建全量分组\n const pendingParents = new Set<string>();\n const visitedParents = new Set<string>(); // 环检测:已处理过的父级\n for (const id of result) {\n const pid = _cascadeMaps.parentMap[id];\n if (pid && !visitedParents.has(pid)) pendingParents.add(pid);\n }\n while (pendingParents.size > 0) {\n const pid = pendingParents.values().next().value!;\n pendingParents.delete(pid);\n // 环检测:父级已处理过则跳过,防止 parentKey 数据成环导致死循环\n if (visitedParents.has(pid)) continue;\n visitedParents.add(pid);\n const allChildren = _cascadeMaps.childrenMap[pid];\n if (!allChildren || allChildren.length === 0) continue;\n // 检查该父级的所有子级是否都在 result 中\n let allSelected = true;\n for (const cid of allChildren) {\n if (!result.has(cid)) {\n allSelected = false;\n break;\n }\n }\n if (allSelected) {\n for (const cid of allChildren) result.delete(cid);\n result.add(pid);\n // 级联效应:合并后检查上层父级是否也可合并\n const grandPid = _cascadeMaps.parentMap[pid];\n if (grandPid && !visitedParents.has(grandPid)) pendingParents.add(grandPid);\n }\n }\n return [...result];\n};\n\n// isOutMerge=false:展开父级 id 为所有叶子 id\nconst _getValueSplitChild = (ids: string[]): string[] => {\n if (ids.length === 0) return [];\n const result: string[] = [];\n ids.forEach((id: string) => {\n result.push(..._getLastChildIds(id));\n });\n return CommonBase.getArrUnique(result);\n};\n\n// 获取最终输出值\nconst _getOutValue = (ids: string[]): string[] => {\n if (!props.isCascade || !props.multiple) return ids;\n if (props.isOutMerge) {\n return _getValueMergeParent(ids);\n } else {\n return _getValueSplitChild(ids);\n }\n};\n\nconst _checkValueInList = () => {\n if (optIsFirstDataFinish.value) {\n if (!CommonBase.isEmpty(optSelectIds.value)) {\n // 数据映射为空时(如 serverCallback 模式下数据尚未加载完成),\n // 不执行校验清理,保留当前值等待数据加载后 watch 重新验证;\n // serverCallback 模式下列表数据可能分批到达(分页/搜索),\n // 「合法但尚未加载」的选中 id 不能按无效 id 清除\n if (CommonBase.isEmpty(_listDataToJson) || props.serverCallback) return;\n const effectiveValue = _getEffectiveValue();\n if (!CommonBase.isEqualArr(optSelectIds.value, effectiveValue)) {\n // 部分选中 id 在数据中不存在(可能 setValue 传入了无效 id),\n // 将被过滤,发出警告以便排查\n const removedIds = optSelectIds.value.filter((id: string) => !effectiveValue.includes(id));\n if (removedIds.length > 0) {\n console.warn('[ClSelect] 以下 id 在数据列表中不存在,已自动清除:', removedIds);\n }\n optSelectIds.value = effectiveValue;\n // 同步打开快照:清理是内部归一化,与 _setValue 行为一致,\n // 防止关闭时 _checkChangeValue 对同值误判重复 emit\n _prevSelectIds = effectiveValue;\n const outIds = _getOutValue(effectiveValue);\n _emitModelValue(outIds.join(','));\n }\n }\n }\n};\n\nconst _setValue = (value: any) => {\n // 防御:value 为对象/NaN 等非预期类型时 toString() 产生虚假 id\n if (\n value != null &&\n typeof value !== 'string' &&\n (typeof value !== 'number' || !CommonBase.isFinite(value as number))\n ) {\n console.warn('[ClSelect] setValue 收到非预期类型值:', typeof value, value);\n return;\n }\n let arrValue =\n value == null || value === ''\n ? []\n : value\n .toString()\n .split(',')\n .filter((v: string) => v !== '');\n // 去重:'1,1' 等重复 id 不进入选中态(防标签重复渲染与 badge 计数虚高)\n arrValue = CommonBase.getArrUnique(arrValue);\n // 级联 + isOutMerge:外部传入的可能是父级 id,展开为子级 id 做内部存储\n if (props.isCascade && props.isOutMerge && arrValue.length > 0 && props.multiple) {\n arrValue = _getValueSplitChild(arrValue);\n }\n let isExist = CommonBase.isEqualArr(optSelectIds.value, arrValue);\n if (isExist) {\n // 归一化比较:用去重后的数组 join 比较('1,1,2' 去重后与 '1,2' 等价),避免同值重复赋值\n isExist = arrValue.join(',') === optSelectIds.value.join(',');\n }\n if (!isExist) {\n _prevSelectIds = arrValue;\n optSelectIds.value = arrValue;\n }\n};\n\nconst _getSelectValueInfo = (v: string) => {\n return CommonBase.isExistJsonKey(_listDataToJson, v)\n ? CommonBase.getJsonClone(_listDataToJson[v])\n : {};\n};\n\nconst _getSelectData = (selectIds?: string[]) => {\n // 防御:非数组参数(外部违规输入)回退到当前选中值\n const ids = CommonBase.isArray(selectIds) ? (selectIds as string[]) : optSelectIds.value;\n const list: any[] = [];\n ids.forEach((v: string) => {\n const tempInfo = _getSelectValueInfo(v);\n if (!CommonBase.isEmpty(tempInfo)) {\n list.push(tempInfo);\n }\n });\n return list;\n};\n\n// 计算选中项显示文本。与 Dropdown.vue formatItemLabel 的转义策略保持一致:\n// 内容含 HTML 时按是否使用自定义 format 分别做编码处理,防止 v-html 注入\nconst _getLabelByData = (info: any) => {\n let labelText = CommonBase.isEmpty(optShowTextFormat.value)\n ? (info.name ?? '')\n : CommonBase.convertStringFormat(optShowTextFormat.value, info);\n if (CommonBase.isHtml(labelText)) {\n labelText = CommonBase.isEmpty(optShowTextFormat.value)\n ? CommonBase.encodeHTML(info.name)\n : CommonBase.convertStringFormatEncodeHTML(optShowTextFormat.value, info);\n } else if (typeof labelText === 'string' && labelText.indexOf('<') > -1) {\n // isHtml 正则盲区兜底:无空格变体(如 <img/src=x onerror=...>)漏判,含 < 即转义。\n // 注意:数据 name 含 HTML 会被转义为字面文本,有意渲染 HTML 需写在 format 模板中\n labelText = CommonBase.encodeHTML(labelText);\n }\n return labelText;\n};\n\nconst _setChangeValue = () => {\n const effectiveIds = _getEffectiveValue();\n _prevSelectIds = effectiveIds;\n optSelectIds.value = effectiveIds;\n const outIds = _getOutValue(effectiveIds);\n const value = outIds.join(',');\n // 根据输出 id 获取对应数据\n let infoData: any;\n if (props.multiple) {\n const list: any[] = [];\n outIds.forEach((id: string) => {\n const info = _getSelectValueInfo(id);\n if (!CommonBase.isEmpty(info)) {\n list.push(info);\n }\n });\n infoData = list;\n } else {\n infoData = _getSelectValueInfo(value);\n // 与 getValueData() 保持一致:无效 id 返回 null 而非空对象\n if (CommonBase.isEmpty(infoData)) {\n infoData = null;\n }\n }\n _emitChange(value, infoData);\n};\n\nconst _checkChangeValue = () => {\n if (!optBase.isOpen) {\n const isChange = !CommonBase.isEqualArr(optSelectIds.value, _prevSelectIds);\n if (isChange) {\n _setChangeValue();\n }\n }\n};\n\nconst _runInitComplete = () => {\n if (!optIsFirstDataFinish.value) {\n optIsFirstDataFinish.value = true;\n _convertListToJson(props.list);\n _setValue(props.value);\n _checkValueInList();\n // _emitInit 由 watch(optIsFirstDataFinish) 统一触发,避免双重调用\n }\n};\n\nconst _initMain = () => {\n if (!optIsFirstDataFinish.value && props.list && props.list.length > 0) {\n _runInitComplete();\n }\n};\n\nonMounted(() => {\n nextTick(() => {\n _initMain();\n });\n});\n\nwatch(optIsFirstDataFinish, newValue => {\n if (newValue) {\n _emitInit();\n }\n});\n\nwatch(\n () => props.list,\n (newValue, oldValue) => {\n if (optIsFirstDataFinish.value) return;\n if (newValue && newValue.length > 0) {\n // 非空列表:数据就绪,置位\n optIsFirstDataFinish.value = true;\n } else if (oldValue === undefined) {\n // 首次传入即为空数组:视为数据就绪(空数据也是初始化完成);\n // 后续 '空→空' 引用变化(oldValue 非 undefined)不再置位,防 onInit 早发\n optIsFirstDataFinish.value = true;\n }\n },\n);\n\nwatch([() => props.value, () => props.list], ([newValue, newList], [_oldValue, oldList]) => {\n const list = (newList as any[]) || [];\n if (!optIsFirstDataFinish.value && list.length > 0) {\n optIsFirstDataFinish.value = true;\n }\n // props.list 全量替换时(非增量加载),清除旧数据映射防止残留\n if (newList !== oldList) {\n _listDataToJson = {};\n _cascadeMaps.childrenMap = {};\n _cascadeMaps.parentMap = {};\n _cascadeMaps.lastChildMap = {};\n _cascadeMaps.allChildMap = {};\n }\n _convertListToJson(list);\n if (newValue !== undefined) {\n _setValue(newValue);\n }\n _checkValueInList();\n});\n\nwatch([optSelectIds, () => props.list], ([_newSelectIds, newList]) => {\n if (newList && newList.length > 0 && CommonBase.isEmpty(_listDataToJson)) {\n _convertListToJson(newList);\n }\n const tempData = _getSelectData();\n optShowSelectLabel.value = tempData.map((info: any) => _getLabelByData(info));\n});\n\n// isOutMerge 变更时重新计算输出值并 emit\nwatch(\n () => props.isOutMerge,\n () => {\n if (props.isCascade && props.multiple && optSelectIds.value.length > 0) {\n // 仅在输出值与当前 v-model 不同时才触发 onChange\n const newOutValue = _getOutValue(_getEffectiveValue()).join(',');\n if (newOutValue !== String(props.value ?? '')) {\n _setChangeValue();\n }\n }\n },\n);\n\n// parentKey / topParentValue 变更时重建级联数据映射\nwatch([() => props.parentKey, () => props.topParentValue], () => {\n if (props.isCascade && !CommonBase.isEmpty(_listDataToJson)) {\n _buildCascadeDataMaps();\n }\n});\n\nconst onToggleOpen = (value: boolean) => {\n // disabled 只阻止打开,不阻止关闭,避免下拉卡住无法收起\n if (value && props.disabled) return;\n optBase.isOpen = value;\n if (value) {\n _prevSelectIds = optSelectIds.value;\n } else {\n _checkChangeValue();\n }\n nextTick(() => {\n if (refElList.value) {\n refElList.value.initOpenShow(value);\n }\n });\n _emitOpen(value);\n};\n\nconst onClearText = () => {\n if (!props.disabled) {\n optSelectIds.value = [];\n if (props.multiple && props.multipleRealTimeChange) {\n // 实时模式下清除立即通知,与 onTagRemove 语义一致\n _setChangeValue();\n } else {\n _checkChangeValue();\n }\n }\n};\n\nconst onChangeDropdownPosition = (item: ClDropdownlayerChangePositionInfo) => {\n optBase.dropDownPos = item.use.dropDownPos;\n if (props.multiple && props.isShowTag) {\n const tagWidth = (refElTags.value?.$el as HTMLElement | undefined)?.offsetWidth || 0;\n optBase.tagHeight =\n props.theme === 'default'\n ? `${item.original.dropDownHeight + 1}px` // 1px:default 主题面板边框补偿\n : `${item.original.dropDownHeight}px`;\n const tempTagDirection =\n item.original.winWidth - (item.original.controlOffset.left + item.original.dropDownWidth) >=\n tagWidth\n ? 'right'\n : 'left';\n optBase.tagDirection = tempTagDirection;\n if (tempTagDirection === 'right') {\n optBase.tagLeft = `${item.original.dropDownWidth - 1}px`;\n } else {\n optBase.tagLeft = `${\n (item.original.dropDownWidth - item.original.textWidth + tagWidth + 1) * -1\n }px`;\n }\n }\n};\n\nconst onDropDownChange = (arrIds: string[]) => {\n optSelectIds.value = arrIds;\n if (props.multiple) {\n if (props.multipleRealTimeChange) {\n _setChangeValue();\n }\n // 注意:此处不更新 _prevSelectIds,关闭下拉时 _checkChangeValue\n // 通过比较 optSelectIds 与打开时的快照来判断是否需要触发 onChange\n } else {\n refElDropdownLayer.value?.setOpen(false);\n // 移除直接调用 onToggleOpen(false):DropdownLayer.setOpen(false) 会通过\n // @onChangeOpen 事件链触发 onToggleOpen,直接调用会导致双重执行\n }\n};\n\nconst onTagRemove = (arrIds: string[]) => {\n if (props.disabled) return; // 组件级禁用检查(与 onClearText 一致)\n optSelectIds.value = arrIds;\n // 标签删除是显式操作,立即通知(与面板内点选\"关闭时统一 emit\"语义不同,属有意差异)。\n // 注意交互副作用:立即 emit 会同步打开快照 _prevSelectIds,同一打开会话中\n // 已点选未 emit 的变更在本次关闭时不再重复通知(最终值由每次 emit 完整携带)\n _setChangeValue();\n};\n\nconst onDropDownError = (message: string) => {\n emit('onError', message);\n};\n\nconst onInitComplete = () => {\n if (refElDropdownLayer.value) {\n if (!refElDropdownLayer.value.checkIsShowOpen()) {\n refElDropdownLayer.value.initCompleteOpen();\n }\n }\n};\n\nprovide('$SelectTop', {\n getSelectData: _getSelectData,\n getSelectValueInfo: _getSelectValueInfo,\n getAllChildIds: _getAllChildIds,\n calculationDropdownPosition: () => {\n refElDropdownLayer.value?.calculationPosition();\n },\n convertListToJson: _convertListToJson,\n closeDropdown: () => {\n refElDropdownLayer.value?.setOpen(false);\n },\n refreshDisplayLabels: () => {\n const tempData = _getSelectData();\n optShowSelectLabel.value = tempData.map((info: any) => _getLabelByData(info));\n },\n});\n\nconst getValue = () => {\n const values = _getEffectiveValue();\n const outIds = _getOutValue(values);\n return outIds.join(',');\n};\n\nconst getValueData = () => {\n const values = getValue();\n if (props.multiple) {\n const arrValue = values ? values.split(',') : [];\n const list: any[] = [];\n arrValue.forEach((id: string) => {\n const info = _getSelectValueInfo(id);\n if (!CommonBase.isEmpty(info)) {\n list.push(info);\n }\n });\n return list;\n }\n // 单选:未找到选中值返回 null\n if (!values) return null;\n const info = _getSelectValueInfo(values);\n return CommonBase.isEmpty(info) ? null : info;\n};\n\nconst setValue = (value: string | number) => {\n _setValue(value);\n _checkValueInList();\n};\n\nconst runInitComplete = () => {\n _runInitComplete();\n};\n\nexport interface SelectTopProvide {\n getSelectData: (selectIds?: string[]) => any[];\n getSelectValueInfo: (v: string) => Record<string, any>;\n getAllChildIds: (id: string) => string[];\n calculationDropdownPosition: () => void;\n convertListToJson: (list: any[]) => void;\n closeDropdown: () => void;\n refreshDisplayLabels: () => void;\n}\n\nexport interface ClSelectExpose {\n getValue: () => string;\n getValueData: () => Record<string, any> | Record<string, any>[] | null;\n setValue: (value: string | number) => void;\n runInitComplete: () => void;\n}\n\ndefineExpose({\n getValue,\n getValueData,\n setValue,\n runInitComplete,\n});\n</script>\n"],"names":["ITEM_HEIGHT","MAX_DROPDOWN_HEIGHT","LEVEL_INDENT","props","__props","emit","__emit","optPageLanguage","getPageLanguage","useLanguage","_selfTop","inject","_hasParent","refElSearch","ref","refElScroller","refElRoot","_isUpdateOriginalData","_pageData","_rawCascadeData","_searchSeq","_pageSeq","elId","optKeyIndex","_isKeyListenerBound","optHoverKeydown","optShowAllData","_optUseAllId","_showAllDataJson","optIsItemChecked","info","id","enableChildIds","cid","CommonBase","optAllValue","computed","b","_formatItemLabel","format","v","_checkIsTypeRadio","temInfo","fullInfo","_setUseAllId","ids","_tid","_buildFlatList","list","parentKey","topParentValue","childrenMap","item","pid","pidStr","result","traverse","nodes","level","parentName","visited","node","children","topNodes","_cascadeSearchFill","filteredList","allData","safeFiltered","safeAllData","resultIds","filteredIds","visitedAncestors","currentId","currentIdStr","childId","foundIds","rid","_refreshData","_scrollToSelected","nextTick","idx","_getSelectIds","newIds","isCascadeParent","sId","childIds","allSelected","_setHover","operateType","data","inx","lastHover","i","_onWinKeydown","e","keyCode","isInsidePanel","_onWinKeyup","_recoverRawFromFlat","flatList","_level","_parentName","_hasChildren","raw","_loadMore","loadSeq","curList","param","searchValue","nextList","existingIds","dedupedList","idType","_err","_initMain","onMounted","onBeforeUnmount","CommonElement","onDeactivated","onActivated","watch","newValue","onSearch","value","currentSeq","safeOriginalData","tempSearch","arrSearchKey","searchKeyCount","bb","bi","fieldValue","onSelectAll","addIds","delIds","newSelectIds","onSelectItem","__expose","isOpen","_createElementBlock","_unref","_openBlock","_hoisted_2","_createVNode","ClInputSearch","_Fragment","_hoisted_3","ClCheckboxOne","_createBlock","RecycleScroller","_normalizeStyle","_withCtx","_createElementVNode","_normalizeClass","$event","_hoisted_5","_hoisted_6","_hoisted_8","_hoisted_9","_toDisplayString","optSelectData","optSelectCount","optCanRemoveAll","onRemoveAll","hasRemovable","onRemove","idStr","ClIconFont","_hoisted_4","ClTags","refElDropdownLayer","refElList","refElTags","optBase","reactive","_prevSelectIds","_listDataToJson","_cascadeMaps","optIsFirstDataFinish","optSelectIds","optShowSelectLabel","_isInitEmitted","optShowTextFormat","clsParent","cls","clsDropdown","clsTag","_emitModelValue","_emitChange","_emitInit","_emitOpen","_getEffectiveValue","effectiveValue","_convertListToJson","tempJson","_setValue","_checkValueInList","parent","_buildCascadeDataMaps","expanded","_getValueSplitChild","radioIds","keepId","merged","_setChangeValue","_getLastChildIds","_recurse","_id","_getAllChildIds","uniqueIds","_getValueMergeParent","pendingParents","visitedParents","allChildren","grandPid","_getOutValue","removedIds","outIds","arrValue","isExist","_getSelectValueInfo","_getSelectData","selectIds","tempInfo","_getLabelByData","labelText","effectiveIds","infoData","_checkChangeValue","_runInitComplete","oldValue","newList","_oldValue","oldList","_newSelectIds","tempData","onToggleOpen","onClearText","onChangeDropdownPosition","tagWidth","tempTagDirection","onDropDownChange","arrIds","onTagRemove","onDropDownError","message","onInitComplete","provide","getValue","values","ClDropdownlayerList","_hoisted_1","ClBadge","ClSelectInDropdown","ClSelectInTags"],"mappings":"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"}
|