@yoka-ui/ui 1.0.3 → 1.0.5

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.
Files changed (216) hide show
  1. package/@Docs-yoka/exports.generated.md +71 -63
  2. package/README.md +6 -4
  3. package/dist/es/business/AiChat/index.js.map +1 -1
  4. package/dist/es/business/AiChat/intentRecognizer.js.map +1 -1
  5. package/dist/es/business/AiChat/navigationManager.js +6 -6
  6. package/dist/es/business/AiChat/navigationManager.js.map +2 -2
  7. package/dist/es/business/DrawerPageInfo/index.js.map +1 -1
  8. package/dist/es/business/Editor/index.d.ts +1 -1
  9. package/dist/es/business/Editor/index.js.map +2 -2
  10. package/dist/es/business/Empty/index.js +1 -1
  11. package/dist/es/business/Empty/index.js.map +1 -1
  12. package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.js +2 -2
  13. package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.js.map +2 -2
  14. package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.js +3 -3
  15. package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.js.map +2 -2
  16. package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.js +2 -2
  17. package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.js.map +2 -2
  18. package/dist/es/business/ModCommonFilter/index.d.ts +1 -1
  19. package/dist/es/business/ModCommonFilter/index.js.map +2 -2
  20. package/dist/es/business/YkPorjectSelect/index.d.ts +1 -1
  21. package/dist/es/business/YkPorjectSelect/index.js +2 -2
  22. package/dist/es/business/YkPorjectSelect/index.js.map +2 -2
  23. package/dist/es/components/DebounceInput/index.js.map +2 -2
  24. package/dist/es/components/MultipleSelect/index.d.ts +14 -0
  25. package/dist/es/components/MultipleSelect/index.js +1 -1
  26. package/dist/es/components/MultipleSelect/index.js.map +2 -2
  27. package/dist/es/components/RefreshButton/index.js.map +2 -2
  28. package/dist/es/components/SearchWithHistory/index.js +1 -1
  29. package/dist/es/components/SearchWithHistory/index.js.map +2 -2
  30. package/dist/es/components/TextWithToolTip/index.d.ts +1 -1
  31. package/dist/es/components/TextWithToolTip/index.js.map +2 -2
  32. package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.d.ts +1 -24
  33. package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.js +2 -2
  34. package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.js.map +2 -2
  35. package/dist/es/components/TreeTransfer/index.d.ts +1 -24
  36. package/dist/es/components/TreeTransfer/index.js +8 -8
  37. package/dist/es/components/TreeTransfer/index.js.map +2 -2
  38. package/dist/es/components/TreeTransfer/utils/index.d.ts +1 -1
  39. package/dist/es/components/TreeTransfer/utils/index.js.map +2 -2
  40. package/dist/es/components/YkDateRangePicker/index.d.ts +1 -1
  41. package/dist/es/components/YkDateRangePicker/index.js +1 -1
  42. package/dist/es/components/YkDateRangePicker/index.js.map +2 -2
  43. package/dist/es/components/YkDateRangePicker/index.module.less +2 -1
  44. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.d.ts +1 -1
  45. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js +3 -2
  46. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js.map +2 -2
  47. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.d.ts +1 -1
  48. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +2 -2
  49. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.d.ts +1 -1
  50. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js.map +2 -2
  51. package/dist/es/components/YkRangeDateWithVS/index.d.ts +2 -2
  52. package/dist/es/components/YkRangeDateWithVS/index.js.map +2 -2
  53. package/dist/es/components/YkRangeTimeWithRecent/index.d.ts +1 -1
  54. package/dist/es/components/YkRangeTimeWithRecent/index.js.map +2 -2
  55. package/dist/es/creative/ArcCheckbox/index.d.ts +12 -0
  56. package/dist/es/creative/ArcCheckbox/index.js +49 -0
  57. package/dist/es/creative/ArcCheckbox/index.js.map +7 -0
  58. package/dist/es/creative/ArcCheckbox/index.module.less +102 -0
  59. package/dist/es/creative/ButtonRadioWithInfo/index.js.map +1 -1
  60. package/dist/es/creative/ButtonWithProgress/index.d.ts +1 -1
  61. package/dist/es/creative/ButtonWithProgress/index.js.map +2 -2
  62. package/dist/es/creative/GlassSegmentedRadio/index.d.ts +24 -0
  63. package/dist/es/creative/GlassSegmentedRadio/index.js +75 -0
  64. package/dist/es/creative/GlassSegmentedRadio/index.js.map +7 -0
  65. package/dist/es/creative/GlassSegmentedRadio/index.module.less +241 -0
  66. package/dist/es/index.d.ts +30 -26
  67. package/dist/es/index.js +86 -82
  68. package/dist/es/index.js.map +2 -2
  69. package/dist/es/index.less +2 -0
  70. package/dist/es/layout/FlexGrid/index.d.ts +1 -1
  71. package/dist/es/layout/FlexGrid/index.js.map +2 -2
  72. package/dist/es/layout/YkContainer/index.js.map +1 -1
  73. package/dist/es/layout/YkDrawer/index.d.ts +1 -1
  74. package/dist/es/layout/YkDrawer/index.js.map +2 -2
  75. package/dist/es/ui/LabelSelect/demo.js +1 -1
  76. package/dist/es/ui/LabelSelect/demo.js.map +2 -2
  77. package/dist/es/ui/LabelSelect/index.d.ts +1 -1
  78. package/dist/es/ui/LabelSelect/index.js +1 -1
  79. package/dist/es/ui/LabelSelect/index.js.map +2 -2
  80. package/dist/es/ui/LogicOperator/index.d.ts +1 -1
  81. package/dist/es/ui/LogicOperator/index.js.map +2 -2
  82. package/dist/es/ui/YkButton/index.d.ts +1 -1
  83. package/dist/es/ui/YkButton/index.js.map +2 -2
  84. package/dist/es/ui/YkCard/index.d.ts +1 -1
  85. package/dist/es/ui/YkCard/index.js +1 -1
  86. package/dist/es/ui/YkCard/index.js.map +2 -2
  87. package/dist/es/ui/YkCheckbox/index.d.ts +1 -1
  88. package/dist/es/ui/YkCheckbox/index.js.map +2 -2
  89. package/dist/es/ui/YkDescriptions/index.d.ts +1 -1
  90. package/dist/es/ui/YkDescriptions/index.js.map +2 -2
  91. package/dist/es/ui/YkPagination/index.d.ts +1 -1
  92. package/dist/es/ui/YkPagination/index.js.map +2 -2
  93. package/dist/es/ui/YkRadio/index.d.ts +1 -1
  94. package/dist/es/ui/YkRadio/index.js.map +2 -2
  95. package/dist/es/ui/YkSegmented/index.d.ts +1 -1
  96. package/dist/es/ui/YkSegmented/index.js.map +2 -2
  97. package/dist/es/ui/YkSelect/index.d.ts +1 -1
  98. package/dist/es/ui/YkSelect/index.js.map +2 -2
  99. package/dist/es/ui/YkSpin/index.d.ts +1 -1
  100. package/dist/es/ui/YkSpin/index.js.map +2 -2
  101. package/dist/es/ui/YkStatistic/index.d.ts +1 -1
  102. package/dist/es/ui/YkStatistic/index.js.map +2 -2
  103. package/dist/es/ui/YkSwitch/index.d.ts +1 -1
  104. package/dist/es/ui/YkSwitch/index.js.map +2 -2
  105. package/dist/es/ui/YkTabs/index.d.ts +1 -1
  106. package/dist/es/ui/YkTabs/index.js.map +2 -2
  107. package/dist/es/ui/YkTooltip/index.d.ts +1 -1
  108. package/dist/es/ui/YkTooltip/index.js.map +2 -2
  109. package/dist/es/utils/styleUtils.js.map +2 -2
  110. package/dist/lib/business/AiChat/index.js.map +1 -1
  111. package/dist/lib/business/AiChat/intentRecognizer.js.map +1 -1
  112. package/dist/lib/business/AiChat/navigationManager.js +6 -6
  113. package/dist/lib/business/AiChat/navigationManager.js.map +2 -2
  114. package/dist/lib/business/DrawerPageInfo/index.js.map +1 -1
  115. package/dist/lib/business/Editor/index.d.ts +1 -1
  116. package/dist/lib/business/Editor/index.js.map +2 -2
  117. package/dist/lib/business/Empty/index.js +1 -1
  118. package/dist/lib/business/Empty/index.js.map +1 -1
  119. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.js +3 -3
  120. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.js.map +2 -2
  121. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.js +4 -4
  122. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.js.map +2 -2
  123. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.js +3 -3
  124. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.js.map +2 -2
  125. package/dist/lib/business/ModCommonFilter/index.d.ts +1 -1
  126. package/dist/lib/business/ModCommonFilter/index.js.map +2 -2
  127. package/dist/lib/business/YkPorjectSelect/index.d.ts +1 -1
  128. package/dist/lib/business/YkPorjectSelect/index.js +3 -3
  129. package/dist/lib/business/YkPorjectSelect/index.js.map +2 -2
  130. package/dist/lib/components/DebounceInput/index.js.map +2 -2
  131. package/dist/lib/components/MultipleSelect/index.d.ts +14 -0
  132. package/dist/lib/components/MultipleSelect/index.js +1 -1
  133. package/dist/lib/components/MultipleSelect/index.js.map +2 -2
  134. package/dist/lib/components/RefreshButton/index.js.map +2 -2
  135. package/dist/lib/components/SearchWithHistory/index.js +1 -1
  136. package/dist/lib/components/SearchWithHistory/index.js.map +2 -2
  137. package/dist/lib/components/TextWithToolTip/index.d.ts +1 -1
  138. package/dist/lib/components/TextWithToolTip/index.js.map +2 -2
  139. package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.d.ts +1 -24
  140. package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.js +2 -2
  141. package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.js.map +2 -2
  142. package/dist/lib/components/TreeTransfer/index.d.ts +1 -24
  143. package/dist/lib/components/TreeTransfer/index.js +3 -3
  144. package/dist/lib/components/TreeTransfer/index.js.map +2 -2
  145. package/dist/lib/components/TreeTransfer/utils/index.d.ts +1 -1
  146. package/dist/lib/components/TreeTransfer/utils/index.js.map +2 -2
  147. package/dist/lib/components/YkDateRangePicker/index.d.ts +1 -1
  148. package/dist/lib/components/YkDateRangePicker/index.js +1 -1
  149. package/dist/lib/components/YkDateRangePicker/index.js.map +2 -2
  150. package/dist/lib/components/YkDateRangePicker/index.module.less +2 -1
  151. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.d.ts +1 -1
  152. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js +3 -2
  153. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js.map +2 -2
  154. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.d.ts +1 -1
  155. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +2 -2
  156. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.d.ts +1 -1
  157. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js.map +2 -2
  158. package/dist/lib/components/YkRangeDateWithVS/index.d.ts +2 -2
  159. package/dist/lib/components/YkRangeDateWithVS/index.js.map +2 -2
  160. package/dist/lib/components/YkRangeTimeWithRecent/index.d.ts +1 -1
  161. package/dist/lib/components/YkRangeTimeWithRecent/index.js.map +2 -2
  162. package/dist/lib/creative/ArcCheckbox/index.d.ts +12 -0
  163. package/dist/lib/creative/ArcCheckbox/index.js +50 -0
  164. package/dist/lib/creative/ArcCheckbox/index.js.map +7 -0
  165. package/dist/lib/creative/ArcCheckbox/index.module.less +102 -0
  166. package/dist/lib/creative/ButtonRadioWithInfo/index.js.map +1 -1
  167. package/dist/lib/creative/ButtonWithProgress/index.d.ts +1 -1
  168. package/dist/lib/creative/ButtonWithProgress/index.js.map +2 -2
  169. package/dist/lib/creative/GlassSegmentedRadio/index.d.ts +24 -0
  170. package/dist/lib/creative/GlassSegmentedRadio/index.js +78 -0
  171. package/dist/lib/creative/GlassSegmentedRadio/index.js.map +7 -0
  172. package/dist/lib/creative/GlassSegmentedRadio/index.module.less +241 -0
  173. package/dist/lib/index.d.ts +30 -26
  174. package/dist/lib/index.js +31 -25
  175. package/dist/lib/index.js.map +2 -2
  176. package/dist/lib/index.less +2 -0
  177. package/dist/lib/layout/FlexGrid/index.d.ts +1 -1
  178. package/dist/lib/layout/FlexGrid/index.js.map +2 -2
  179. package/dist/lib/layout/YkContainer/index.js.map +1 -1
  180. package/dist/lib/layout/YkDrawer/index.d.ts +1 -1
  181. package/dist/lib/layout/YkDrawer/index.js.map +2 -2
  182. package/dist/lib/ui/LabelSelect/demo.js +1 -1
  183. package/dist/lib/ui/LabelSelect/demo.js.map +2 -2
  184. package/dist/lib/ui/LabelSelect/index.d.ts +1 -1
  185. package/dist/lib/ui/LabelSelect/index.js +1 -1
  186. package/dist/lib/ui/LabelSelect/index.js.map +2 -2
  187. package/dist/lib/ui/LogicOperator/index.d.ts +1 -1
  188. package/dist/lib/ui/LogicOperator/index.js.map +2 -2
  189. package/dist/lib/ui/YkButton/index.d.ts +1 -1
  190. package/dist/lib/ui/YkButton/index.js.map +2 -2
  191. package/dist/lib/ui/YkCard/index.d.ts +1 -1
  192. package/dist/lib/ui/YkCard/index.js.map +2 -2
  193. package/dist/lib/ui/YkCheckbox/index.d.ts +1 -1
  194. package/dist/lib/ui/YkCheckbox/index.js.map +2 -2
  195. package/dist/lib/ui/YkDescriptions/index.d.ts +1 -1
  196. package/dist/lib/ui/YkDescriptions/index.js.map +2 -2
  197. package/dist/lib/ui/YkPagination/index.d.ts +1 -1
  198. package/dist/lib/ui/YkPagination/index.js.map +2 -2
  199. package/dist/lib/ui/YkRadio/index.d.ts +1 -1
  200. package/dist/lib/ui/YkRadio/index.js.map +2 -2
  201. package/dist/lib/ui/YkSegmented/index.d.ts +1 -1
  202. package/dist/lib/ui/YkSegmented/index.js.map +2 -2
  203. package/dist/lib/ui/YkSelect/index.d.ts +1 -1
  204. package/dist/lib/ui/YkSelect/index.js.map +2 -2
  205. package/dist/lib/ui/YkSpin/index.d.ts +1 -1
  206. package/dist/lib/ui/YkSpin/index.js.map +2 -2
  207. package/dist/lib/ui/YkStatistic/index.d.ts +1 -1
  208. package/dist/lib/ui/YkStatistic/index.js.map +2 -2
  209. package/dist/lib/ui/YkSwitch/index.d.ts +1 -1
  210. package/dist/lib/ui/YkSwitch/index.js.map +2 -2
  211. package/dist/lib/ui/YkTabs/index.d.ts +1 -1
  212. package/dist/lib/ui/YkTabs/index.js.map +2 -2
  213. package/dist/lib/ui/YkTooltip/index.d.ts +1 -1
  214. package/dist/lib/ui/YkTooltip/index.js.map +2 -2
  215. package/dist/lib/utils/styleUtils.js.map +2 -2
  216. package/package.json +137 -144
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/business/ModCommonFilter/components/PopoverContent/Content.tsx"],
4
- "sourcesContent": ["import DebouncedInput from '@/components/DebounceInput';\nimport TextWithTooltip from '@/components/TextWithToolTip';\nimport { Checkbox, Divider, Tabs } from 'antd';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars';\nimport { Grid } from 'react-virtualized';\nimport emptyImg from '../../assets/images/empty.png';\nimport type { ListItem, TerminalItem } from '../../typing';\nimport styles from './index.module.less';\n\n/**\n * 可选列表内容区的 Props\n */\ninterface PropsType {\n /** 终端 Tab 数据(如 全部/PC/APP),无则不展示终端 Tab */\n terminal?: TerminalItem[];\n /** 当前分类下的可选列表 */\n list: ListItem[];\n /** 当前已选中的 code 列表 */\n selected: string[];\n /** 更新已选中列表 */\n setSelected: (selected: string[]) => void;\n /** 搜索框占位文案 */\n placeholder: string;\n /** 当前选中的分类 code,用于过滤 list */\n categorySelected: string;\n /** 网格列数 */\n columnCount?: number;\n /** 内容区宽度 */\n contentWidth?: number;\n /** 每行高度 */\n rowHeight?: number;\n /** 每格自定义渲染 */\n cellRender?: (item: ListItem) => React.ReactNode;\n /** 是否在名称后展示 code */\n showCode?: boolean;\n /** 通知父组件「用户是否有过勾选操作」 */\n setHasOperation: (hasOperation: boolean) => void;\n}\n\n/**\n * 筛选弹层中间区域:终端 Tab(可选)+ 搜索 + 全选 + 虚拟列表勾选。\n * 内部维护 modalChecked 与外部 selected 同步,并用 isInternalUpdate 区分内外更新避免循环。\n */\nconst Content: React.FC<PropsType> = ({\n terminal,\n list,\n selected,\n setSelected,\n placeholder,\n categorySelected,\n columnCount = 1,\n contentWidth = 510,\n rowHeight = 32,\n cellRender,\n showCode = false,\n setHasOperation,\n}) => {\n const [searchKey, setSearchKey] = useState<string>('');\n /** 当前选中的终端 Tab(code),空字符串表示「全部」 */\n const [terminalSelected, setTerminalSelected] = useState<string>('');\n /** 弹层内勾选状态(与 selected 同步,用于避免直接改 selected 导致父组件重渲染影响虚拟列表) */\n const [modalChecked, setModalChecked] = useState<string[]>(selected);\n\n /** 已选 code -> true 的 Map,用于 O(1) 判断是否选中 */\n const modalCheckMap = useMemo(() => {\n return new Map(modalChecked.map((item) => [item, true]));\n }, [modalChecked]);\n\n const scrollbarsRef = useRef(null);\n const gridRef = useRef(null);\n /** 标记本次 selected 变更是否由本组件内部更新引起,避免 useEffect 把外部重置误同步进 modalChecked */\n const isInternalUpdate = useRef(false);\n\n /** 外部 selected 变化时同步到 modalChecked;若为内部更新触发的 effect 则跳过避免覆盖 */\n useEffect(() => {\n if (isInternalUpdate.current) {\n isInternalUpdate.current = false;\n return;\n }\n setModalChecked(selected);\n }, [selected]);\n\n /** 根据搜索关键词、终端、分类过滤后的列表,供虚拟列表与全选使用 */\n const filterList = useMemo(() => {\n const key = searchKey.trim().toUpperCase();\n return list\n .filter((v) => v.name.toUpperCase().includes(key) || (showCode && v.code.toUpperCase().includes(key)))\n .filter((f) => terminalSelected === '' || f.terminal === terminalSelected)\n .filter((f) => categorySelected === '' || f.category === categorySelected);\n }, [list, searchKey, terminalSelected, categorySelected]);\n\n /** 全选勾选状态与半选状态(基于当前 filterList 与 modalChecked) */\n const { allChecked, isIndeterminate } = useMemo(() => {\n if (filterList.length === 0) {\n return { allChecked: false, isIndeterminate: false };\n }\n const checkedCount = filterList.filter((item) => modalCheckMap.get(item.code)).length;\n const allChecked = checkedCount === filterList.length;\n const isIndeterminate = checkedCount > 0 && checkedCount < filterList.length;\n return { allChecked, isIndeterminate };\n }, [filterList, modalChecked]);\n\n /** 终端选项列表,头部插入「全部」(code: '') */\n const useTerminal = useMemo(() => {\n const newTerminal: TerminalItem[] = terminal ? [...terminal] : [];\n newTerminal.unshift({\n code: '',\n name: '全部',\n });\n return newTerminal;\n }, [terminal]);\n\n /** 更新弹层内勾选状态并同步到父组件 selected,并标记有过操作 */\n function updateModalChecked(checked: string[]) {\n isInternalUpdate.current = true;\n setModalChecked(checked);\n setSelected(checked);\n setHasOperation(true);\n }\n\n /** 全选/取消全选:仅针对当前 filterList 中的项 */\n const handleAllChecked = (checked: boolean) => {\n const filterCodes = filterList.map((item) => item.code);\n if (checked) {\n // 全选:将过滤列表中的所有项添加到已选列表(去重)\n const newChecked = Array.from(new Set([...modalChecked, ...filterCodes]));\n updateModalChecked(newChecked);\n } else {\n // 取消全选:从已选列表中移除过滤列表中的所有项\n const newChecked = modalChecked.filter((code) => !filterCodes.includes(code));\n updateModalChecked(newChecked);\n }\n };\n\n /** 将 Scrollbars 的滚动事件转发给 Grid,保证虚拟列表滚动一致 */\n const handleScrollbarScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollLeft } = event.target as HTMLElement;\n if (gridRef.current) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (gridRef.current as any).handleScrollEvent({ scrollTop, scrollLeft });\n }\n };\n\n /** 根据 code 判断该项是否已选中 */\n function isItemChecked(value: string) {\n return modalCheckMap.get(value);\n }\n\n /** 切换单项勾选状态 */\n function checkItem(value: string) {\n if (isItemChecked(value)) {\n updateModalChecked(modalChecked.filter((item) => item !== value));\n } else {\n updateModalChecked([...modalChecked, value]);\n }\n }\n\n return (\n <div className={styles.content}>\n <div className={styles.contentHeader}>\n {terminal && terminal.length > 0 && (\n <>\n <Tabs\n activeKey={terminalSelected}\n items={useTerminal.map((v) => ({\n key: v.code,\n label: v.name,\n }))}\n onChange={(value) => {\n setTerminalSelected(value);\n }}\n />\n <Divider type='vertical' style={{ margin: '0 0 0 20px' }} />\n </>\n )}\n <DebouncedInput\n allowClear={false}\n placeholder={placeholder}\n currentValue={searchKey}\n onChange={(value) => {\n setSearchKey(value);\n }}\n inputClass={styles.search}\n ></DebouncedInput>\n </div>\n <div className={styles.contentList}>\n <div className={styles.checkAll}>\n <Checkbox\n checked={allChecked}\n indeterminate={isIndeterminate}\n onChange={() => {\n handleAllChecked(!allChecked);\n }}\n >\n 全选\n </Checkbox>\n </div>\n <Scrollbars\n style={{ height: 285, width: contentWidth }}\n renderThumbVertical={({ style, ...props }) => (\n <div {...props} style={{ ...style, background: '#EFEFEF', borderRadius: 3 }} />\n )}\n ref={scrollbarsRef}\n onScroll={handleScrollbarScroll}\n >\n <div className={styles.contentListInner}>\n <Grid\n style={{ overflowX: 'visible', overflowY: 'visible' }}\n overscanRowCount={5}\n ref={gridRef}\n columnCount={columnCount}\n rowCount={Math.ceil(filterList.length / columnCount)}\n height={285}\n width={contentWidth - 40}\n columnWidth={(contentWidth - 40) / columnCount}\n rowHeight={rowHeight}\n cellRenderer={({\n columnIndex,\n key,\n rowIndex,\n style,\n }: {\n columnIndex: number;\n key: string;\n rowIndex: number;\n style: React.CSSProperties;\n }) => {\n const item = filterList[rowIndex * columnCount + columnIndex];\n if (!item) return;\n return (\n <div key={key} style={style}>\n <Checkbox\n checked={isItemChecked(item.code)}\n onChange={() => {\n checkItem(item.code);\n }}\n >\n {cellRender ? (\n cellRender(item)\n ) : (\n <TextWithTooltip\n text={item?.name + (showCode ? '(' + item?.code + ')' : '')}\n width={(contentWidth - 40 * columnCount) / columnCount}\n ></TextWithTooltip>\n )}\n </Checkbox>\n </div>\n );\n }}\n noContentRenderer={() => (\n <div className={styles.empty}>\n <img src={emptyImg} alt='' />\n <p>当前搜索条件无数据</p>\n </div>\n )}\n />\n </div>\n </Scrollbars>\n </div>\n </div>\n );\n};\n\nexport default Content;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Checkbox, Divider, Tabs } from 'antd';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport { Grid } from 'react-virtualized';\nimport DebouncedInput from '@/components/DebounceInput';\nimport TextWithTooltip from '@/components/TextWithToolTip';\nimport emptyImg from '../../assets/images/empty.png';\nimport type { ListItem, TerminalItem } from '../../typing';\nimport styles from './index.module.less';\n\n/**\n * 可选列表内容区的 Props\n */\ninterface PropsType {\n /** 终端 Tab 数据(如 全部/PC/APP),无则不展示终端 Tab */\n terminal?: TerminalItem[];\n /** 当前分类下的可选列表 */\n list: ListItem[];\n /** 当前已选中的 code 列表 */\n selected: string[];\n /** 更新已选中列表 */\n setSelected: (selected: string[]) => void;\n /** 搜索框占位文案 */\n placeholder: string;\n /** 当前选中的分类 code,用于过滤 list */\n categorySelected: string;\n /** 网格列数 */\n columnCount?: number;\n /** 内容区宽度 */\n contentWidth?: number;\n /** 每行高度 */\n rowHeight?: number;\n /** 每格自定义渲染 */\n cellRender?: (item: ListItem) => React.ReactNode;\n /** 是否在名称后展示 code */\n showCode?: boolean;\n /** 通知父组件「用户是否有过勾选操作」 */\n setHasOperation: (hasOperation: boolean) => void;\n}\n\n/**\n * 筛选弹层中间区域:终端 Tab(可选)+ 搜索 + 全选 + 虚拟列表勾选。\n * 内部维护 modalChecked 与外部 selected 同步,并用 isInternalUpdate 区分内外更新避免循环。\n */\nconst Content: React.FC<PropsType> = ({\n terminal,\n list,\n selected,\n setSelected,\n placeholder,\n categorySelected,\n columnCount = 1,\n contentWidth = 510,\n rowHeight = 32,\n cellRender,\n showCode = false,\n setHasOperation,\n}) => {\n const [searchKey, setSearchKey] = useState<string>('');\n /** 当前选中的终端 Tab(code),空字符串表示「全部」 */\n const [terminalSelected, setTerminalSelected] = useState<string>('');\n /** 弹层内勾选状态(与 selected 同步,用于避免直接改 selected 导致父组件重渲染影响虚拟列表) */\n const [modalChecked, setModalChecked] = useState<string[]>(selected);\n\n /** 已选 code -> true 的 Map,用于 O(1) 判断是否选中 */\n const modalCheckMap = useMemo(() => {\n return new Map(modalChecked.map((item) => [item, true]));\n }, [modalChecked]);\n\n const scrollbarsRef = useRef(null);\n const gridRef = useRef(null);\n /** 标记本次 selected 变更是否由本组件内部更新引起,避免 useEffect 把外部重置误同步进 modalChecked */\n const isInternalUpdate = useRef(false);\n\n /** 外部 selected 变化时同步到 modalChecked;若为内部更新触发的 effect 则跳过避免覆盖 */\n useEffect(() => {\n if (isInternalUpdate.current) {\n isInternalUpdate.current = false;\n return;\n }\n setModalChecked(selected);\n }, [selected]);\n\n /** 根据搜索关键词、终端、分类过滤后的列表,供虚拟列表与全选使用 */\n const filterList = useMemo(() => {\n const key = searchKey.trim().toUpperCase();\n return list\n .filter((v) => v.name.toUpperCase().includes(key) || (showCode && v.code.toUpperCase().includes(key)))\n .filter((f) => terminalSelected === '' || f.terminal === terminalSelected)\n .filter((f) => categorySelected === '' || f.category === categorySelected);\n }, [list, searchKey, terminalSelected, categorySelected]);\n\n /** 全选勾选状态与半选状态(基于当前 filterList 与 modalChecked) */\n const { allChecked, isIndeterminate } = useMemo(() => {\n if (filterList.length === 0) {\n return { allChecked: false, isIndeterminate: false };\n }\n const checkedCount = filterList.filter((item) => modalCheckMap.get(item.code)).length;\n const allChecked = checkedCount === filterList.length;\n const isIndeterminate = checkedCount > 0 && checkedCount < filterList.length;\n return { allChecked, isIndeterminate };\n }, [filterList, modalChecked]);\n\n /** 终端选项列表,头部插入「全部」(code: '') */\n const useTerminal = useMemo(() => {\n const newTerminal: TerminalItem[] = terminal ? [...terminal] : [];\n newTerminal.unshift({\n code: '',\n name: '全部',\n });\n return newTerminal;\n }, [terminal]);\n\n /** 更新弹层内勾选状态并同步到父组件 selected,并标记有过操作 */\n function updateModalChecked(checked: string[]) {\n isInternalUpdate.current = true;\n setModalChecked(checked);\n setSelected(checked);\n setHasOperation(true);\n }\n\n /** 全选/取消全选:仅针对当前 filterList 中的项 */\n const handleAllChecked = (checked: boolean) => {\n const filterCodes = filterList.map((item) => item.code);\n if (checked) {\n // 全选:将过滤列表中的所有项添加到已选列表(去重)\n const newChecked = Array.from(new Set([...modalChecked, ...filterCodes]));\n updateModalChecked(newChecked);\n } else {\n // 取消全选:从已选列表中移除过滤列表中的所有项\n const newChecked = modalChecked.filter((code) => !filterCodes.includes(code));\n updateModalChecked(newChecked);\n }\n };\n\n /** 将 Scrollbars 的滚动事件转发给 Grid,保证虚拟列表滚动一致 */\n const handleScrollbarScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollLeft } = event.target as HTMLElement;\n if (gridRef.current) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (gridRef.current as any).handleScrollEvent({ scrollTop, scrollLeft });\n }\n };\n\n /** 根据 code 判断该项是否已选中 */\n function isItemChecked(value: string) {\n return modalCheckMap.get(value);\n }\n\n /** 切换单项勾选状态 */\n function checkItem(value: string) {\n if (isItemChecked(value)) {\n updateModalChecked(modalChecked.filter((item) => item !== value));\n } else {\n updateModalChecked([...modalChecked, value]);\n }\n }\n\n return (\n <div className={styles.content}>\n <div className={styles.contentHeader}>\n {terminal && terminal.length > 0 && (\n <>\n <Tabs\n activeKey={terminalSelected}\n items={useTerminal.map((v) => ({\n key: v.code,\n label: v.name,\n }))}\n onChange={(value) => {\n setTerminalSelected(value);\n }}\n />\n <Divider type='vertical' style={{ margin: '0 0 0 20px' }} />\n </>\n )}\n <DebouncedInput\n allowClear={false}\n placeholder={placeholder}\n currentValue={searchKey}\n onChange={(value) => {\n setSearchKey(value);\n }}\n inputClass={styles.search}\n ></DebouncedInput>\n </div>\n <div className={styles.contentList}>\n <div className={styles.checkAll}>\n <Checkbox\n checked={allChecked}\n indeterminate={isIndeterminate}\n onChange={() => {\n handleAllChecked(!allChecked);\n }}\n >\n 全选\n </Checkbox>\n </div>\n <Scrollbars\n style={{ height: 285, width: contentWidth }}\n renderThumbVertical={({ style, ...props }) => (\n <div {...props} style={{ ...style, background: '#EFEFEF', borderRadius: 3 }} />\n )}\n ref={scrollbarsRef}\n onScroll={handleScrollbarScroll}\n >\n <div className={styles.contentListInner}>\n <Grid\n style={{ overflowX: 'visible', overflowY: 'visible' }}\n overscanRowCount={5}\n ref={gridRef}\n columnCount={columnCount}\n rowCount={Math.ceil(filterList.length / columnCount)}\n height={285}\n width={contentWidth - 40}\n columnWidth={(contentWidth - 40) / columnCount}\n rowHeight={rowHeight}\n cellRenderer={({\n columnIndex,\n key,\n rowIndex,\n style,\n }: {\n columnIndex: number;\n key: string;\n rowIndex: number;\n style: React.CSSProperties;\n }) => {\n const item = filterList[rowIndex * columnCount + columnIndex];\n if (!item) return;\n return (\n <div key={key} style={style}>\n <Checkbox\n checked={isItemChecked(item.code)}\n onChange={() => {\n checkItem(item.code);\n }}\n >\n {cellRender ? (\n cellRender(item)\n ) : (\n <TextWithTooltip\n text={item?.name + (showCode ? '(' + item?.code + ')' : '')}\n width={(contentWidth - 40 * columnCount) / columnCount}\n ></TextWithTooltip>\n )}\n </Checkbox>\n </div>\n );\n }}\n noContentRenderer={() => (\n <div className={styles.empty}>\n <img src={emptyImg} alt='' />\n <p>当前搜索条件无数据</p>\n </div>\n )}\n />\n </div>\n </Scrollbars>\n </div>\n </div>\n );\n};\n\nexport default Content;\n"],
5
+ "mappings": "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",
6
6
  "names": ["allChecked", "isIndeterminate", "React", "styles", "DebouncedInput", "TextWithTooltip", "emptyImg"]
7
7
  }
@@ -32,11 +32,11 @@ __export(Selected_exports, {
32
32
  default: () => Selected_default
33
33
  });
34
34
  module.exports = __toCommonJS(Selected_exports);
35
- var import_TextWithToolTip = __toESM(require("../../../../components/TextWithToolTip"));
36
35
  var import_classnames = __toESM(require("classnames"));
37
36
  var import_react = __toESM(require("react"));
38
- var import_react_custom_scrollbars = require("react-custom-scrollbars");
37
+ var import_react_custom_scrollbars_2 = require("react-custom-scrollbars-2");
39
38
  var import_react_virtualized = require("react-virtualized");
39
+ var import_TextWithToolTip = __toESM(require("../../../../components/TextWithToolTip"));
40
40
  var import_index_module = __toESM(require("./index.module.less"));
41
41
  var Selected = ({
42
42
  list,
@@ -55,7 +55,7 @@ var Selected = ({
55
55
  }
56
56
  };
57
57
  return /* @__PURE__ */ import_react.default.createElement("div", { className: import_index_module.default.selected }, /* @__PURE__ */ import_react.default.createElement("div", { className: import_index_module.default.selectedHeader }, /* @__PURE__ */ import_react.default.createElement("span", null, "已选", selected.length, "个"), /* @__PURE__ */ import_react.default.createElement("span", { className: import_index_module.default.clear, onClick: () => setSelected([]) }, "清空")), /* @__PURE__ */ import_react.default.createElement(
58
- import_react_custom_scrollbars.Scrollbars,
58
+ import_react_custom_scrollbars_2.Scrollbars,
59
59
  {
60
60
  style: { height: 325 },
61
61
  renderThumbVertical: ({ style, ...props }) => /* @__PURE__ */ import_react.default.createElement("div", { ...props, style: { ...style, background: "#EFEFEF", borderRadius: 3 } }),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/business/ModCommonFilter/components/PopoverContent/Selected.tsx"],
4
- "sourcesContent": ["import TextWithTooltip from '@/components/TextWithToolTip';\nimport classNames from 'classnames';\nimport React, { useRef } from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars';\nimport { AutoSizer, List } from 'react-virtualized';\nimport type { ListItem } from '../../typing';\nimport styles from './index.module.less';\n\n/**\n * 已选列表组件的 Props\n */\ninterface PropsType {\n /** 完整列表数据,用于根据 selected 中的 code 取 name 等信息 */\n list: ListItem[];\n /** 已选中的 code 数组(顺序即展示顺序) */\n selected: string[];\n /** 更新已选列表 */\n setSelected: (selected: string[]) => void;\n /** 内容宽度(当前未在 Selected 内使用,可做预留) */\n contentWidth?: number;\n /** 每行高度 */\n rowHeight?: number;\n /** 是否在名称后展示 code */\n showCode?: boolean;\n /** 已选列表中每行的自定义渲染 */\n checkedCellRender?: (item: ListItem) => React.ReactNode;\n}\n\n/**\n * 筛选弹层右侧已选列表:展示已选数量、清空、虚拟列表逐项展示并可删除。\n */\nconst Selected: React.FC<PropsType> = ({\n list,\n selected,\n setSelected,\n rowHeight = 32,\n showCode,\n checkedCellRender,\n}) => {\n const listScrollbarsRef = useRef<typeof Scrollbars>(null);\n const listRef = useRef(null);\n\n /** 将 Scrollbars 滚动同步到 List,保证虚拟列表与滚动条一致 */\n const handleListScrollbarScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollLeft } = event.target as HTMLElement;\n if (listRef.current) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (listRef.current as any).Grid.handleScrollEvent({ scrollTop, scrollLeft });\n }\n };\n\n return (\n <div className={styles.selected}>\n <div className={styles.selectedHeader}>\n <span>已选{selected.length}个</span>\n <span className={styles.clear} onClick={() => setSelected([])}>\n 清空\n </span>\n </div>\n\n <Scrollbars\n style={{ height: 325 }}\n renderThumbVertical={({ style, ...props }) => (\n <div {...props} style={{ ...style, background: '#EFEFEF', borderRadius: 3 }} />\n )}\n ref={listScrollbarsRef}\n onScroll={handleListScrollbarScroll}\n >\n <div className={styles.selectedContent}>\n <AutoSizer disableHeight>\n {({ width }: { width: number }) => (\n <List\n ref={listRef}\n style={{ overflowX: 'visible', overflowY: 'visible' }}\n rowCount={selected.length}\n height={325}\n width={width}\n rowHeight={rowHeight}\n rowRenderer={({ index, key, style }: { index: number; key: string; style: React.CSSProperties }) => {\n const option = list.find((option) => option.code === selected[index]);\n return (\n <div className={styles.selectedItem} key={key} style={style}>\n {option && checkedCellRender ? (\n checkedCellRender(option)\n ) : (\n <TextWithTooltip\n text={option?.name + (showCode ? '(' + option?.code + ')' : '')}\n width='100%'\n ></TextWithTooltip>\n )}\n\n <i\n className={classNames('iconfont icon-lajitong', styles.close)}\n onClick={() => {\n setSelected(selected.filter((item) => item !== selected[index]));\n }}\n ></i>\n </div>\n );\n }}\n ></List>\n )}\n </AutoSizer>\n </div>\n </Scrollbars>\n </div>\n );\n};\n\nexport default Selected;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAA4B;AAC5B,wBAAuB;AACvB,mBAA8B;AAC9B,qCAA2B;AAC3B,+BAAgC;AAEhC,0BAAmB;AAyBnB,IAAM,WAAgC,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,MAAM;AACJ,QAAM,wBAAoB,qBAA0B,IAAI;AACxD,QAAM,cAAU,qBAAO,IAAI;AAG3B,QAAM,4BAA4B,CAAC,UAAyC;AAC1E,UAAM,EAAE,WAAW,WAAW,IAAI,MAAM;AACxC,QAAI,QAAQ,SAAS;AAEnB,MAAC,QAAQ,QAAgB,KAAK,kBAAkB,EAAE,WAAW,WAAW,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,SACE,6BAAAA,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,YACrB,6BAAAD,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,kBACrB,6BAAAD,QAAA,cAAC,cAAK,MAAG,SAAS,QAAO,GAAC,GAC1B,6BAAAA,QAAA,cAAC,UAAK,WAAW,oBAAAC,QAAO,OAAO,SAAS,MAAM,YAAY,CAAC,CAAC,KAAG,IAE/D,CACF,GAEA,6BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,QAAQ,IAAI;AAAA,MACrB,qBAAqB,CAAC,EAAE,OAAO,GAAG,MAAM,MACtC,6BAAAA,QAAA,cAAC,SAAK,GAAG,OAAO,OAAO,EAAE,GAAG,OAAO,YAAY,WAAW,cAAc,EAAE,GAAG;AAAA,MAE/E,KAAK;AAAA,MACL,UAAU;AAAA;AAAA,IAEV,6BAAAA,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,mBACrB,6BAAAD,QAAA,cAAC,sCAAU,eAAa,QACrB,CAAC,EAAE,MAAM,MACR,6BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO,EAAE,WAAW,WAAW,WAAW,UAAU;AAAA,QACpD,UAAU,SAAS;AAAA,QACnB,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,aAAa,CAAC,EAAE,OAAO,KAAK,MAAM,MAAkE;AAClG,gBAAM,SAAS,KAAK,KAAK,CAACE,YAAWA,QAAO,SAAS,SAAS,KAAK,CAAC;AACpE,iBACE,6BAAAF,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,cAAc,KAAU,SAC5C,UAAU,oBACT,kBAAkB,MAAM,IAExB,6BAAAD,QAAA;AAAA,YAAC,uBAAAG;AAAA,YAAA;AAAA,cACC,OAAM,iCAAQ,SAAQ,WAAW,OAAM,iCAAQ,QAAO,MAAM;AAAA,cAC5D,OAAM;AAAA;AAAA,UACP,GAGH,6BAAAH,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,kBAAAI,SAAW,0BAA0B,oBAAAH,QAAO,KAAK;AAAA,cAC5D,SAAS,MAAM;AACb,4BAAY,SAAS,OAAO,CAAC,SAAS,SAAS,SAAS,KAAK,CAAC,CAAC;AAAA,cACjE;AAAA;AAAA,UACD,CACH;AAAA,QAEJ;AAAA;AAAA,IACD,CAEL,CACF;AAAA,EACF,CACF;AAEJ;AAEA,IAAO,mBAAQ;",
4
+ "sourcesContent": ["import classNames from 'classnames';\nimport React, { useRef } from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport { AutoSizer, List } from 'react-virtualized';\nimport TextWithTooltip from '@/components/TextWithToolTip';\nimport type { ListItem } from '../../typing';\nimport styles from './index.module.less';\n\n/**\n * 已选列表组件的 Props\n */\ninterface PropsType {\n /** 完整列表数据,用于根据 selected 中的 code 取 name 等信息 */\n list: ListItem[];\n /** 已选中的 code 数组(顺序即展示顺序) */\n selected: string[];\n /** 更新已选列表 */\n setSelected: (selected: string[]) => void;\n /** 内容宽度(当前未在 Selected 内使用,可做预留) */\n contentWidth?: number;\n /** 每行高度 */\n rowHeight?: number;\n /** 是否在名称后展示 code */\n showCode?: boolean;\n /** 已选列表中每行的自定义渲染 */\n checkedCellRender?: (item: ListItem) => React.ReactNode;\n}\n\n/**\n * 筛选弹层右侧已选列表:展示已选数量、清空、虚拟列表逐项展示并可删除。\n */\nconst Selected: React.FC<PropsType> = ({\n list,\n selected,\n setSelected,\n rowHeight = 32,\n showCode,\n checkedCellRender,\n}) => {\n const listScrollbarsRef = useRef<React.ComponentRef<typeof Scrollbars>>(null);\n const listRef = useRef(null);\n\n /** 将 Scrollbars 滚动同步到 List,保证虚拟列表与滚动条一致 */\n const handleListScrollbarScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollLeft } = event.target as HTMLElement;\n if (listRef.current) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (listRef.current as any).Grid.handleScrollEvent({ scrollTop, scrollLeft });\n }\n };\n\n return (\n <div className={styles.selected}>\n <div className={styles.selectedHeader}>\n <span>已选{selected.length}个</span>\n <span className={styles.clear} onClick={() => setSelected([])}>\n 清空\n </span>\n </div>\n\n <Scrollbars\n style={{ height: 325 }}\n renderThumbVertical={({ style, ...props }) => (\n <div {...props} style={{ ...style, background: '#EFEFEF', borderRadius: 3 }} />\n )}\n ref={listScrollbarsRef}\n onScroll={handleListScrollbarScroll}\n >\n <div className={styles.selectedContent}>\n <AutoSizer disableHeight>\n {({ width }: { width: number }) => (\n <List\n ref={listRef}\n style={{ overflowX: 'visible', overflowY: 'visible' }}\n rowCount={selected.length}\n height={325}\n width={width}\n rowHeight={rowHeight}\n rowRenderer={({ index, key, style }: { index: number; key: string; style: React.CSSProperties }) => {\n const option = list.find((option) => option.code === selected[index]);\n return (\n <div className={styles.selectedItem} key={key} style={style}>\n {option && checkedCellRender ? (\n checkedCellRender(option)\n ) : (\n <TextWithTooltip\n text={option?.name + (showCode ? '(' + option?.code + ')' : '')}\n width='100%'\n ></TextWithTooltip>\n )}\n\n <i\n className={classNames('iconfont icon-lajitong', styles.close)}\n onClick={() => {\n setSelected(selected.filter((item) => item !== selected[index]));\n }}\n ></i>\n </div>\n );\n }}\n ></List>\n )}\n </AutoSizer>\n </div>\n </Scrollbars>\n </div>\n );\n};\n\nexport default Selected;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAuB;AACvB,mBAA8B;AAC9B,uCAA2B;AAC3B,+BAAgC;AAChC,6BAA4B;AAE5B,0BAAmB;AAyBnB,IAAM,WAAgC,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,MAAM;AACJ,QAAM,wBAAoB,qBAA8C,IAAI;AAC5E,QAAM,cAAU,qBAAO,IAAI;AAG3B,QAAM,4BAA4B,CAAC,UAAyC;AAC1E,UAAM,EAAE,WAAW,WAAW,IAAI,MAAM;AACxC,QAAI,QAAQ,SAAS;AAEnB,MAAC,QAAQ,QAAgB,KAAK,kBAAkB,EAAE,WAAW,WAAW,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,SACE,6BAAAA,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,YACrB,6BAAAD,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,kBACrB,6BAAAD,QAAA,cAAC,cAAK,MAAG,SAAS,QAAO,GAAC,GAC1B,6BAAAA,QAAA,cAAC,UAAK,WAAW,oBAAAC,QAAO,OAAO,SAAS,MAAM,YAAY,CAAC,CAAC,KAAG,IAE/D,CACF,GAEA,6BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,QAAQ,IAAI;AAAA,MACrB,qBAAqB,CAAC,EAAE,OAAO,GAAG,MAAM,MACtC,6BAAAA,QAAA,cAAC,SAAK,GAAG,OAAO,OAAO,EAAE,GAAG,OAAO,YAAY,WAAW,cAAc,EAAE,GAAG;AAAA,MAE/E,KAAK;AAAA,MACL,UAAU;AAAA;AAAA,IAEV,6BAAAA,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,mBACrB,6BAAAD,QAAA,cAAC,sCAAU,eAAa,QACrB,CAAC,EAAE,MAAM,MACR,6BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO,EAAE,WAAW,WAAW,WAAW,UAAU;AAAA,QACpD,UAAU,SAAS;AAAA,QACnB,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,aAAa,CAAC,EAAE,OAAO,KAAK,MAAM,MAAkE;AAClG,gBAAM,SAAS,KAAK,KAAK,CAACE,YAAWA,QAAO,SAAS,SAAS,KAAK,CAAC;AACpE,iBACE,6BAAAF,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,cAAc,KAAU,SAC5C,UAAU,oBACT,kBAAkB,MAAM,IAExB,6BAAAD,QAAA;AAAA,YAAC,uBAAAG;AAAA,YAAA;AAAA,cACC,OAAM,iCAAQ,SAAQ,WAAW,OAAM,iCAAQ,QAAO,MAAM;AAAA,cAC5D,OAAM;AAAA;AAAA,UACP,GAGH,6BAAAH,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,kBAAAI,SAAW,0BAA0B,oBAAAH,QAAO,KAAK;AAAA,cAC5D,SAAS,MAAM;AACb,4BAAY,SAAS,OAAO,CAAC,SAAS,SAAS,SAAS,KAAK,CAAC,CAAC;AAAA,cACjE;AAAA;AAAA,UACD,CACH;AAAA,QAEJ;AAAA;AAAA,IACD,CAEL,CACF;AAAA,EACF,CACF;AAEJ;AAEA,IAAO,mBAAQ;",
6
6
  "names": ["React", "styles", "option", "TextWithTooltip", "classNames"]
7
7
  }
@@ -1,4 +1,4 @@
1
- import { PopoverProps } from 'antd';
1
+ import { type PopoverProps } from 'antd';
2
2
  import React from 'react';
3
3
  import type { CategoryItem, ListItem, TerminalItem } from './typing';
4
4
  /**
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/business/ModCommonFilter/index.tsx"],
4
- "sourcesContent": ["import { Popover, PopoverProps } from 'antd';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport FilterButton from './components/FilterButton';\nimport PopoverContent from './components/PopoverContent';\nimport styles from './index.module.less';\nimport type { CategoryItem, ListItem, TerminalItem } from './typing';\n\n/**\n * 通用筛选器组件的 Props\n */\nexport interface ModCommonFilterProps {\n /** 当前选中的值(code 数组),受控 */\n value: string[];\n /** 选中项变化回调 */\n onChange: (value: string[]) => void;\n /** 可选列表数据 */\n list: ListItem[];\n /** 筛选维度名称,如「品类」「品牌」 */\n title: string;\n /** 按钮/标题前缀文案,如「筛选」 */\n prefixTitle?: string;\n /** 按钮左侧图标 */\n iconPrefix?: React.ReactNode;\n /** 分类列表,有则弹层左侧展示分类 Tab */\n category?: CategoryItem[];\n /** 终端列表,有则弹层内展示终端 Tab(如全部/PC/APP) */\n terminal?: TerminalItem[];\n /** 搜索框占位文案 */\n placeholder?: string;\n /** Popover 层级 */\n zIndex?: number;\n /** Popover 弹出方向 */\n placement?: PopoverProps['placement'];\n /** 透传给 antd Popover 的额外属性 */\n popoverProps?: PopoverProps;\n /** 可选列表列数(多列网格) */\n columnCount?: number;\n /** 内容区宽度 */\n contentWidth?: number;\n /** 列表行高 */\n rowHeight?: number;\n /** 是否在名称后展示 code */\n showCode?: boolean;\n /** 可选列表中每项的自定义渲染 */\n cellRender?: (item: ListItem) => React.ReactNode;\n /** 已选列表中每项的自定义渲染 */\n checkedCellRender?: (item: ListItem) => React.ReactNode;\n /** 弹层底部备注文案或节点 */\n remark?: string | React.ReactNode;\n /** 自定义触发区域,不传则使用默认 FilterButton */\n filterChildren?: React.ReactNode;\n}\n\n/**\n * 通用筛选器:点击按钮打开 Popover,内为分类 + 可选列表 + 已选列表,确认后回调 onChange。\n */\nconst ModCommonFilter: React.FC<ModCommonFilterProps> = ({\n value,\n onChange,\n list,\n title,\n prefixTitle,\n iconPrefix,\n category,\n terminal,\n placeholder = '搜索',\n zIndex = 100,\n placement = 'bottomRight',\n columnCount = 1,\n contentWidth,\n rowHeight,\n showCode = false,\n popoverProps = {},\n cellRender,\n checkedCellRender,\n remark,\n filterChildren,\n}) => {\n const [popOpen, setPopOpen] = useState(false);\n /** 弹层内当前选中的 code 列表,打开时与 value 同步 */\n const [selected, setSelected] = useState<string[]>([]);\n /** 当前选中的分类 code,空字符串表示「全部」 */\n const [categorySelected, setCategorySelected] = useState<string>('');\n\n /** 弹层打开时用外部 value 同步 selected,保证每次打开初始为当前已选 */\n useEffect(() => {\n if (popOpen) {\n setSelected(value || []);\n }\n }, [popOpen, value]);\n\n /** 分类选项列表,头部插入「全部{title}」 */\n const useCateGory = useMemo(() => {\n const newCategory: CategoryItem[] = category ? [...category] : [];\n newCategory.unshift({\n code: '',\n name: '全部' + title,\n });\n return newCategory;\n }, [category]);\n\n /** 确认:把当前选中回传并关闭弹层 */\n const handleVerify = () => {\n onChange(selected);\n setPopOpen(false);\n };\n\n /** 取消:恢复为打开前的 value 并关闭弹层 */\n const handleClear = () => {\n setSelected(value || []);\n setPopOpen(false);\n };\n\n return (\n <Popover\n className={styles.modCommonFilter}\n open={popOpen}\n onOpenChange={(open) => setPopOpen(open)}\n title={false}\n fresh={true}\n arrow={false}\n zIndex={zIndex}\n placement={placement}\n trigger='click'\n classNames={{\n body: styles.popoverBody,\n }}\n getPopupContainer={(triggerNode) => triggerNode.parentNode as HTMLElement}\n content={\n <PopoverContent\n popOpen={popOpen}\n selected={selected}\n setSelected={setSelected}\n category={useCateGory}\n terminal={terminal}\n list={list}\n placeholder={placeholder}\n title={title}\n categorySelected={categorySelected}\n setCategorySelected={setCategorySelected}\n columnCount={columnCount}\n showCode={showCode}\n contentWidth={contentWidth}\n rowHeight={rowHeight}\n cellRender={cellRender}\n checkedCellRender={checkedCellRender}\n handleVerify={handleVerify}\n handleClear={handleClear}\n remark={remark}\n />\n }\n {...popoverProps}\n >\n {filterChildren || (\n <FilterButton\n iconPrefix={iconPrefix}\n title={title}\n prefixTitle={prefixTitle}\n value={value}\n popOpen={popOpen}\n handlePopOpen={() => setPopOpen(!popOpen)}\n handleClear={() => onChange([])}\n />\n )}\n </Popover>\n );\n};\n\nexport default ModCommonFilter;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAsC;AACtC,mBAAoD;AACpD,0BAAyB;AACzB,4BAA2B;AAC3B,0BAAmB;AAoDnB,IAAM,kBAAkD,CAAC;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,eAAe,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAE5C,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAmB,CAAC,CAAC;AAErD,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,uBAAiB,EAAE;AAGnE,8BAAU,MAAM;AACd,QAAI,SAAS;AACX,kBAAY,SAAS,CAAC,CAAC;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,SAAS,KAAK,CAAC;AAGnB,QAAM,kBAAc,sBAAQ,MAAM;AAChC,UAAM,cAA8B,WAAW,CAAC,GAAG,QAAQ,IAAI,CAAC;AAChE,gBAAY,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,MAAM,OAAO;AAAA,IACf,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,CAAC;AAGb,QAAM,eAAe,MAAM;AACzB,aAAS,QAAQ;AACjB,eAAW,KAAK;AAAA,EAClB;AAGA,QAAM,cAAc,MAAM;AACxB,gBAAY,SAAS,CAAC,CAAC;AACvB,eAAW,KAAK;AAAA,EAClB;AAEA,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,oBAAAC,QAAO;AAAA,MAClB,MAAM;AAAA,MACN,cAAc,CAAC,SAAS,WAAW,IAAI;AAAA,MACvC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,SAAQ;AAAA,MACR,YAAY;AAAA,QACV,MAAM,oBAAAA,QAAO;AAAA,MACf;AAAA,MACA,mBAAmB,CAAC,gBAAgB,YAAY;AAAA,MAChD,SACE,6BAAAD,QAAA;AAAA,QAAC,sBAAAE;AAAA,QAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAED,GAAG;AAAA;AAAA,IAEH,kBACC,6BAAAF,QAAA;AAAA,MAAC,oBAAAG;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,MAAM,WAAW,CAAC,OAAO;AAAA,QACxC,aAAa,MAAM,SAAS,CAAC,CAAC;AAAA;AAAA,IAChC;AAAA,EAEJ;AAEJ;AAEA,IAAO,0BAAQ;",
4
+ "sourcesContent": ["import { Popover, type PopoverProps } from 'antd';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport FilterButton from './components/FilterButton';\nimport PopoverContent from './components/PopoverContent';\nimport styles from './index.module.less';\nimport type { CategoryItem, ListItem, TerminalItem } from './typing';\n\n/**\n * 通用筛选器组件的 Props\n */\nexport interface ModCommonFilterProps {\n /** 当前选中的值(code 数组),受控 */\n value: string[];\n /** 选中项变化回调 */\n onChange: (value: string[]) => void;\n /** 可选列表数据 */\n list: ListItem[];\n /** 筛选维度名称,如「品类」「品牌」 */\n title: string;\n /** 按钮/标题前缀文案,如「筛选」 */\n prefixTitle?: string;\n /** 按钮左侧图标 */\n iconPrefix?: React.ReactNode;\n /** 分类列表,有则弹层左侧展示分类 Tab */\n category?: CategoryItem[];\n /** 终端列表,有则弹层内展示终端 Tab(如全部/PC/APP) */\n terminal?: TerminalItem[];\n /** 搜索框占位文案 */\n placeholder?: string;\n /** Popover 层级 */\n zIndex?: number;\n /** Popover 弹出方向 */\n placement?: PopoverProps['placement'];\n /** 透传给 antd Popover 的额外属性 */\n popoverProps?: PopoverProps;\n /** 可选列表列数(多列网格) */\n columnCount?: number;\n /** 内容区宽度 */\n contentWidth?: number;\n /** 列表行高 */\n rowHeight?: number;\n /** 是否在名称后展示 code */\n showCode?: boolean;\n /** 可选列表中每项的自定义渲染 */\n cellRender?: (item: ListItem) => React.ReactNode;\n /** 已选列表中每项的自定义渲染 */\n checkedCellRender?: (item: ListItem) => React.ReactNode;\n /** 弹层底部备注文案或节点 */\n remark?: string | React.ReactNode;\n /** 自定义触发区域,不传则使用默认 FilterButton */\n filterChildren?: React.ReactNode;\n}\n\n/**\n * 通用筛选器:点击按钮打开 Popover,内为分类 + 可选列表 + 已选列表,确认后回调 onChange。\n */\nconst ModCommonFilter: React.FC<ModCommonFilterProps> = ({\n value,\n onChange,\n list,\n title,\n prefixTitle,\n iconPrefix,\n category,\n terminal,\n placeholder = '搜索',\n zIndex = 100,\n placement = 'bottomRight',\n columnCount = 1,\n contentWidth,\n rowHeight,\n showCode = false,\n popoverProps = {},\n cellRender,\n checkedCellRender,\n remark,\n filterChildren,\n}) => {\n const [popOpen, setPopOpen] = useState(false);\n /** 弹层内当前选中的 code 列表,打开时与 value 同步 */\n const [selected, setSelected] = useState<string[]>([]);\n /** 当前选中的分类 code,空字符串表示「全部」 */\n const [categorySelected, setCategorySelected] = useState<string>('');\n\n /** 弹层打开时用外部 value 同步 selected,保证每次打开初始为当前已选 */\n useEffect(() => {\n if (popOpen) {\n setSelected(value || []);\n }\n }, [popOpen, value]);\n\n /** 分类选项列表,头部插入「全部{title}」 */\n const useCateGory = useMemo(() => {\n const newCategory: CategoryItem[] = category ? [...category] : [];\n newCategory.unshift({\n code: '',\n name: '全部' + title,\n });\n return newCategory;\n }, [category]);\n\n /** 确认:把当前选中回传并关闭弹层 */\n const handleVerify = () => {\n onChange(selected);\n setPopOpen(false);\n };\n\n /** 取消:恢复为打开前的 value 并关闭弹层 */\n const handleClear = () => {\n setSelected(value || []);\n setPopOpen(false);\n };\n\n return (\n <Popover\n className={styles.modCommonFilter}\n open={popOpen}\n onOpenChange={(open) => setPopOpen(open)}\n title={false}\n fresh={true}\n arrow={false}\n zIndex={zIndex}\n placement={placement}\n trigger='click'\n classNames={{\n body: styles.popoverBody,\n }}\n getPopupContainer={(triggerNode) => triggerNode.parentNode as HTMLElement}\n content={\n <PopoverContent\n popOpen={popOpen}\n selected={selected}\n setSelected={setSelected}\n category={useCateGory}\n terminal={terminal}\n list={list}\n placeholder={placeholder}\n title={title}\n categorySelected={categorySelected}\n setCategorySelected={setCategorySelected}\n columnCount={columnCount}\n showCode={showCode}\n contentWidth={contentWidth}\n rowHeight={rowHeight}\n cellRender={cellRender}\n checkedCellRender={checkedCellRender}\n handleVerify={handleVerify}\n handleClear={handleClear}\n remark={remark}\n />\n }\n {...popoverProps}\n >\n {filterChildren || (\n <FilterButton\n iconPrefix={iconPrefix}\n title={title}\n prefixTitle={prefixTitle}\n value={value}\n popOpen={popOpen}\n handlePopOpen={() => setPopOpen(!popOpen)}\n handleClear={() => onChange([])}\n />\n )}\n </Popover>\n );\n};\n\nexport default ModCommonFilter;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA2C;AAC3C,mBAAoD;AACpD,0BAAyB;AACzB,4BAA2B;AAC3B,0BAAmB;AAoDnB,IAAM,kBAAkD,CAAC;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,eAAe,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAE5C,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAmB,CAAC,CAAC;AAErD,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,uBAAiB,EAAE;AAGnE,8BAAU,MAAM;AACd,QAAI,SAAS;AACX,kBAAY,SAAS,CAAC,CAAC;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,SAAS,KAAK,CAAC;AAGnB,QAAM,kBAAc,sBAAQ,MAAM;AAChC,UAAM,cAA8B,WAAW,CAAC,GAAG,QAAQ,IAAI,CAAC;AAChE,gBAAY,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,MAAM,OAAO;AAAA,IACf,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,CAAC;AAGb,QAAM,eAAe,MAAM;AACzB,aAAS,QAAQ;AACjB,eAAW,KAAK;AAAA,EAClB;AAGA,QAAM,cAAc,MAAM;AACxB,gBAAY,SAAS,CAAC,CAAC;AACvB,eAAW,KAAK;AAAA,EAClB;AAEA,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,oBAAAC,QAAO;AAAA,MAClB,MAAM;AAAA,MACN,cAAc,CAAC,SAAS,WAAW,IAAI;AAAA,MACvC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,SAAQ;AAAA,MACR,YAAY;AAAA,QACV,MAAM,oBAAAA,QAAO;AAAA,MACf;AAAA,MACA,mBAAmB,CAAC,gBAAgB,YAAY;AAAA,MAChD,SACE,6BAAAD,QAAA;AAAA,QAAC,sBAAAE;AAAA,QAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAED,GAAG;AAAA;AAAA,IAEH,kBACC,6BAAAF,QAAA;AAAA,MAAC,oBAAAG;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,MAAM,WAAW,CAAC,OAAO;AAAA,QACxC,aAAa,MAAM,SAAS,CAAC,CAAC;AAAA;AAAA,IAChC;AAAA,EAEJ;AAEJ;AAEA,IAAO,0BAAQ;",
6
6
  "names": ["React", "styles", "PopoverContent", "FilterButton"]
7
7
  }
@@ -1,4 +1,4 @@
1
- import React, { FC } from 'react';
1
+ import React, { type FC } from 'react';
2
2
  /** 项目选项项 */
3
3
  type OptionItem = {
4
4
  /** 项目名称 */
@@ -32,12 +32,12 @@ __export(YkPorjectSelect_exports, {
32
32
  default: () => YkPorjectSelect_default
33
33
  });
34
34
  module.exports = __toCommonJS(YkPorjectSelect_exports);
35
- var import_TextWithToolTip = __toESM(require("../../components/TextWithToolTip"));
36
35
  var import_icons = require("@ant-design/icons");
37
36
  var import_antd = require("antd");
38
37
  var import_classnames = __toESM(require("classnames"));
39
38
  var import_react = __toESM(require("react"));
40
- var import_react_custom_scrollbars = require("react-custom-scrollbars");
39
+ var import_react_custom_scrollbars_2 = require("react-custom-scrollbars-2");
40
+ var import_TextWithToolTip = __toESM(require("../../components/TextWithToolTip"));
41
41
  var import_icon_product = __toESM(require("./icon-product.png"));
42
42
  var import_index_module = __toESM(require("./index.module.less"));
43
43
  var YkPorjectSelect = ({ value, options, onChange, followedCallback, slot, customShow }) => {
@@ -198,7 +198,7 @@ var YkPorjectSelect = ({ value, options, onChange, followedCallback, slot, custo
198
198
  items: tabs
199
199
  }
200
200
  ), localOptions.length === 0 ? /* @__PURE__ */ import_react.default.createElement(import_antd.Empty, { image: import_antd.Empty.PRESENTED_IMAGE_SIMPLE }) : /* @__PURE__ */ import_react.default.createElement("div", { className: import_index_module.default.ykPorjectSelectListSection }, /* @__PURE__ */ import_react.default.createElement("div", { className: import_index_module.default.contentHeader }, "全部项目"), /* @__PURE__ */ import_react.default.createElement(
201
- import_react_custom_scrollbars.Scrollbars,
201
+ import_react_custom_scrollbars_2.Scrollbars,
202
202
  {
203
203
  className: import_index_module.default.ykPorjectSelectScrollBarsBox,
204
204
  autoHeight: true,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/business/YkPorjectSelect/index.tsx"],
4
- "sourcesContent": ["import TextWithTooltip from '@/components/TextWithToolTip';\nimport { SearchOutlined } from '@ant-design/icons';\nimport type { InputRef } from 'antd';\nimport { ConfigProvider, Empty, Flex, Input, Popover, Rate, Tabs, Tooltip } from 'antd';\nimport classNames from 'classnames';\nimport React, { FC, useEffect, useMemo, useRef, useState } from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars';\nimport iconProductDefault from './icon-product.png';\nimport styles from './index.module.less';\n\n/** 项目选项项 */\ntype OptionItem = {\n /** 项目名称 */\n label: string;\n /** 项目 ID */\n value: string | number;\n /** 项目图标 URL */\n icon: string;\n /** 是否已关注 */\n followed?: boolean;\n /** 关注排序索引 */\n follow_index?: number;\n /** 是否最近访问 */\n recent_visit?: boolean;\n /** 是否已关服 */\n closed?: boolean;\n};\n\n/** 项目选择器 Props */\ntype PageTypes = {\n /** 当前选中的项目 ID */\n value: string | number;\n /** 项目选项列表 */\n options: OptionItem[];\n /** 选中项目变化时的回调 */\n onChange: (value: string | number) => void;\n /** 关注/取消关注时的回调 */\n followedCallback?: (item: OptionItem, bool: boolean) => void;\n /** 弹层内自定义插槽,渲染在搜索框下方、关注项目上方 */\n slot?: React.ReactNode;\n /** 自定义触发元素,替代默认的「图标+名称+下拉箭头」展示 */\n customShow?: React.ReactNode;\n};\n\n/**\n * 项目选择器\n *\n * 支持搜索、关注/取消关注(最多6个)、在营/关服切换。\n * 弹层展开时自动聚焦搜索框,使用 preventScroll 避免页面滚动。\n *\n * @example\n * ```tsx\n * <YkPorjectSelect\n * value={projectId}\n * options={options}\n * onChange={setProjectId}\n * followedCallback={(item, followed) => api.follow(item.value, followed)}\n * />\n * ```\n */\nconst YkPorjectSelect: FC<PageTypes> = ({ value, options, onChange, followedCallback, slot, customShow }) => {\n const [open, setOpen] = useState(false);\n const [status, setStatus] = useState<string>('1');\n const [searchKey, setSearchKey] = useState('');\n const [pageHeight, setPageHeight] = useState<number>(1000);\n const [localOptions, setLocalOptions] = useState<OptionItem[]>(options);\n const searchInputRef = useRef<InputRef>(null);\n\n useEffect(() => {\n setLocalOptions(options);\n }, [options]);\n\n /** 弹层展开时聚焦搜索框,使用 preventScroll 避免浏览器滚动到顶部;延迟等待 Popover 内容挂载 */\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n if (open) {\n timer = setTimeout(() => {\n searchInputRef.current?.input?.focus({ preventScroll: true });\n }, 0);\n }\n return () => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n };\n }, [open]);\n\n /** 在营/关服数量统计 */\n const stateCount = useMemo(() => {\n return localOptions.reduce(\n (acc, item) => {\n const statusClosed = item.closed ? 2 : 1;\n if (!acc[statusClosed]) {\n acc[statusClosed] = 0;\n }\n acc[statusClosed] += 1;\n return acc;\n },\n {} as { [key: string]: number },\n );\n }, [localOptions]);\n\n /** 在营/关服 Tab 配置 */\n const tabs = [\n { key: '1', label: `在营(${stateCount['1'] || 0})` },\n { key: '2', label: `关服(${stateCount['2'] || 0})` },\n ];\n\n /** 当前选中的项目(用于展示图标与名称) */\n const activeItem = useMemo(() => {\n return localOptions.find((item) => item.value === value);\n }, [localOptions, value]);\n\n /** 已关注的项目列表(顶部展示、用于计算关注数限制) */\n const followedOptions = useMemo(() => {\n return localOptions.filter((item) => item.followed);\n }, [localOptions]);\n\n // 切换在营/关服\n const handleTabChange = (tabKey: string) => {\n setStatus(tabKey);\n };\n\n // 点击关注或取消关注\n const handleStarChange = async (item: OptionItem, val: number) => {\n void followedCallback?.(item, val === 1);\n setLocalOptions((prev) =>\n prev.map((p) => {\n if (p.value === item.value) {\n return { ...p, followed: val === 1 };\n }\n return p;\n }),\n );\n };\n\n const handleResize = () => {\n const height = window.innerHeight;\n setPageHeight(height);\n };\n\n useEffect(() => {\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n /** 渲染单个项目行(名称、ID、关注星标) */\n const renderItem = (item: OptionItem) => {\n const isDisabled = !item.followed && followedOptions.length >= 6;\n return (\n <Flex justify='space-between' align='center'>\n <span className={styles.contentItemSpan} onClick={() => onChange(item.value)}>\n <img className={styles.contentItemSpanIcon} src={item?.icon ? item.icon : iconProductDefault} />\n <div className={styles.contentItemSpanDev}>\n <div className={styles.contentItemSpanProName}>\n <TextWithTooltip\n text={item.label}\n width='100%'\n maxWidth={175}\n arrow={true}\n color='#fff'\n styles={{ body: { color: '#333' } }}\n ></TextWithTooltip>\n {item.recent_visit ? <span className={styles.recentVisit}>最近访问</span> : null}\n </div>\n <div className={styles.contentItemSpanProId}>ID: {item.value}</div>\n </div>\n </span>\n <Tooltip\n title={isDisabled ? '最多关注6个项目' : item.followed ? '取消关注' : '关注'}\n color='#fff'\n placement='right'\n styles={{ body: { color: '#333' } }}\n >\n <label\n className={classNames(styles.contentItemStar, isDisabled && styles.contentItemStarDisabled)}\n onClick={() => {\n if (isDisabled) {\n return;\n }\n void handleStarChange(item, item.followed ? 0 : 1);\n }}\n >\n <ConfigProvider\n theme={{\n components: {\n Rate: {\n starBg: '#dcdbdb',\n },\n },\n }}\n >\n <Rate\n style={{\n fontSize: 14,\n color: isDisabled ? 'rgba(0, 0, 0, 0.06)' : '#FFB401',\n opacity: item.followed || followedOptions.length === 0 ? 1 : 0,\n }}\n value={item.followed ? 1 : 0}\n count={1}\n />\n </ConfigProvider>\n </label>\n </Tooltip>\n </Flex>\n );\n };\n\n /** 弹层内容:搜索、slot、关注区、Tab、项目列表 */\n const content = (\n <div className={styles.ykPorjectSelectContent}>\n <div className={styles.ykPorjectSelectHeader}>\n <Input\n ref={searchInputRef}\n className={styles.ykPorjectSelectSearchInput}\n prefix={<SearchOutlined style={{ color: '#999', marginRight: '10px' }} />}\n value={searchKey}\n onChange={(e) => setSearchKey(e.target.value)}\n allowClear\n placeholder='请输入项目ID/名称'\n />\n </div>\n {slot && <div className={styles.ykPorjectSelectSoltContainer}>{slot}</div>}\n <div className={styles.ykPorjectSelectFollowed}>\n <div className={styles.contentHeader}>关注项目</div>\n <div className={styles.ykPorjectSelectFollowedList}>\n {followedOptions.map((item) => (\n <Tooltip\n key={item.value}\n title={\n <>\n <div style={{ fontSize: 14, color: '#555555' }}>{item.label}</div>\n <div style={{ fontSize: 12, color: '#999' }}>ID: {item.value}</div>\n </>\n }\n color='#fff'\n placement='bottomLeft'\n styles={{ body: { color: '#333' } }}\n >\n <div key={item.value} className={styles.ykPorjectSelectFollowedItem}>\n <img className={styles.ykPorjectSelectFollowedItemIcon} src={item.icon} alt={item.label} />\n <div className={styles.closeIcon} onClick={() => void handleStarChange(item, 0)} />\n </div>\n </Tooltip>\n ))}\n </div>\n </div>\n <Tabs\n className={styles.ykPorjectSelectProductPanelTabs}\n centered\n onChange={handleTabChange}\n activeKey={status}\n items={tabs}\n ></Tabs>\n {localOptions.length === 0 ? (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />\n ) : (\n <div className={styles.ykPorjectSelectListSection}>\n <div className={styles.contentHeader}>全部项目</div>\n <Scrollbars\n className={styles.ykPorjectSelectScrollBarsBox}\n autoHeight\n autoHide\n autoHeightMax={Math.min(450, pageHeight - 310)}\n renderThumbVertical={({ style, ...props }) => (\n <div {...props} style={{ ...style, background: '#EEEEEE', borderRadius: 3, width: 6 }} />\n )}\n >\n {localOptions\n .sort((a, b) => (b.recent_visit ? 1 : 0) - (a.recent_visit ? 1 : 0))\n .map((item) => (\n <div\n key={item.value}\n className={classNames(styles.contentItem, item.value === value ? styles.contentItemActive : '')}\n >\n {renderItem(item)}\n </div>\n ))}\n </Scrollbars>\n </div>\n )}\n </div>\n );\n\n return (\n <Popover\n className={styles.ykPorjectSelect}\n styles={{ body: { borderRadius: 4, padding: 0 } }}\n content={content}\n placement='bottom'\n trigger='click'\n open={open}\n onOpenChange={setOpen}\n getPopupContainer={(triggerNode: HTMLElement) => triggerNode.parentNode as HTMLElement}\n autoAdjustOverflow={false}\n >\n {customShow ? (\n customShow\n ) : (\n <div className={styles.ykPorjectSelectShow}>\n <img className={styles.ykPorjectSelectShowIcon} src={activeItem?.icon} alt={activeItem?.label} />\n <span className={styles.ykPorjectSelectShowText}>{activeItem?.label}</span>\n <i className='iconfont icon-xiala' />\n </div>\n )}\n </Popover>\n );\n};\n\nexport default YkPorjectSelect;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { SearchOutlined } from '@ant-design/icons';\nimport type { InputRef } from 'antd';\nimport { ConfigProvider, Empty, Flex, Input, Popover, Rate, Tabs, Tooltip } from 'antd';\nimport classNames from 'classnames';\nimport React, { type FC, useEffect, useMemo, useRef, useState } from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport TextWithTooltip from '@/components/TextWithToolTip';\nimport iconProductDefault from './icon-product.png';\nimport styles from './index.module.less';\n\n/** 项目选项项 */\ntype OptionItem = {\n /** 项目名称 */\n label: string;\n /** 项目 ID */\n value: string | number;\n /** 项目图标 URL */\n icon: string;\n /** 是否已关注 */\n followed?: boolean;\n /** 关注排序索引 */\n follow_index?: number;\n /** 是否最近访问 */\n recent_visit?: boolean;\n /** 是否已关服 */\n closed?: boolean;\n};\n\n/** 项目选择器 Props */\ntype PageTypes = {\n /** 当前选中的项目 ID */\n value: string | number;\n /** 项目选项列表 */\n options: OptionItem[];\n /** 选中项目变化时的回调 */\n onChange: (value: string | number) => void;\n /** 关注/取消关注时的回调 */\n followedCallback?: (item: OptionItem, bool: boolean) => void;\n /** 弹层内自定义插槽,渲染在搜索框下方、关注项目上方 */\n slot?: React.ReactNode;\n /** 自定义触发元素,替代默认的「图标+名称+下拉箭头」展示 */\n customShow?: React.ReactNode;\n};\n\n/**\n * 项目选择器\n *\n * 支持搜索、关注/取消关注(最多6个)、在营/关服切换。\n * 弹层展开时自动聚焦搜索框,使用 preventScroll 避免页面滚动。\n *\n * @example\n * ```tsx\n * <YkPorjectSelect\n * value={projectId}\n * options={options}\n * onChange={setProjectId}\n * followedCallback={(item, followed) => api.follow(item.value, followed)}\n * />\n * ```\n */\nconst YkPorjectSelect: FC<PageTypes> = ({ value, options, onChange, followedCallback, slot, customShow }) => {\n const [open, setOpen] = useState(false);\n const [status, setStatus] = useState<string>('1');\n const [searchKey, setSearchKey] = useState('');\n const [pageHeight, setPageHeight] = useState<number>(1000);\n const [localOptions, setLocalOptions] = useState<OptionItem[]>(options);\n const searchInputRef = useRef<InputRef>(null);\n\n useEffect(() => {\n setLocalOptions(options);\n }, [options]);\n\n /** 弹层展开时聚焦搜索框,使用 preventScroll 避免浏览器滚动到顶部;延迟等待 Popover 内容挂载 */\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n if (open) {\n timer = setTimeout(() => {\n searchInputRef.current?.input?.focus({ preventScroll: true });\n }, 0);\n }\n return () => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n };\n }, [open]);\n\n /** 在营/关服数量统计 */\n const stateCount = useMemo(() => {\n return localOptions.reduce(\n (acc, item) => {\n const statusClosed = item.closed ? 2 : 1;\n if (!acc[statusClosed]) {\n acc[statusClosed] = 0;\n }\n acc[statusClosed] += 1;\n return acc;\n },\n {} as { [key: string]: number },\n );\n }, [localOptions]);\n\n /** 在营/关服 Tab 配置 */\n const tabs = [\n { key: '1', label: `在营(${stateCount['1'] || 0})` },\n { key: '2', label: `关服(${stateCount['2'] || 0})` },\n ];\n\n /** 当前选中的项目(用于展示图标与名称) */\n const activeItem = useMemo(() => {\n return localOptions.find((item) => item.value === value);\n }, [localOptions, value]);\n\n /** 已关注的项目列表(顶部展示、用于计算关注数限制) */\n const followedOptions = useMemo(() => {\n return localOptions.filter((item) => item.followed);\n }, [localOptions]);\n\n // 切换在营/关服\n const handleTabChange = (tabKey: string) => {\n setStatus(tabKey);\n };\n\n // 点击关注或取消关注\n const handleStarChange = async (item: OptionItem, val: number) => {\n void followedCallback?.(item, val === 1);\n setLocalOptions((prev) =>\n prev.map((p) => {\n if (p.value === item.value) {\n return { ...p, followed: val === 1 };\n }\n return p;\n }),\n );\n };\n\n const handleResize = () => {\n const height = window.innerHeight;\n setPageHeight(height);\n };\n\n useEffect(() => {\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n /** 渲染单个项目行(名称、ID、关注星标) */\n const renderItem = (item: OptionItem) => {\n const isDisabled = !item.followed && followedOptions.length >= 6;\n return (\n <Flex justify='space-between' align='center'>\n <span className={styles.contentItemSpan} onClick={() => onChange(item.value)}>\n <img className={styles.contentItemSpanIcon} src={item?.icon ? item.icon : iconProductDefault} />\n <div className={styles.contentItemSpanDev}>\n <div className={styles.contentItemSpanProName}>\n <TextWithTooltip\n text={item.label}\n width='100%'\n maxWidth={175}\n arrow={true}\n color='#fff'\n styles={{ body: { color: '#333' } }}\n ></TextWithTooltip>\n {item.recent_visit ? <span className={styles.recentVisit}>最近访问</span> : null}\n </div>\n <div className={styles.contentItemSpanProId}>ID: {item.value}</div>\n </div>\n </span>\n <Tooltip\n title={isDisabled ? '最多关注6个项目' : item.followed ? '取消关注' : '关注'}\n color='#fff'\n placement='right'\n styles={{ body: { color: '#333' } }}\n >\n <label\n className={classNames(styles.contentItemStar, isDisabled && styles.contentItemStarDisabled)}\n onClick={() => {\n if (isDisabled) {\n return;\n }\n void handleStarChange(item, item.followed ? 0 : 1);\n }}\n >\n <ConfigProvider\n theme={{\n components: {\n Rate: {\n starBg: '#dcdbdb',\n },\n },\n }}\n >\n <Rate\n style={{\n fontSize: 14,\n color: isDisabled ? 'rgba(0, 0, 0, 0.06)' : '#FFB401',\n opacity: item.followed || followedOptions.length === 0 ? 1 : 0,\n }}\n value={item.followed ? 1 : 0}\n count={1}\n />\n </ConfigProvider>\n </label>\n </Tooltip>\n </Flex>\n );\n };\n\n /** 弹层内容:搜索、slot、关注区、Tab、项目列表 */\n const content = (\n <div className={styles.ykPorjectSelectContent}>\n <div className={styles.ykPorjectSelectHeader}>\n <Input\n ref={searchInputRef}\n className={styles.ykPorjectSelectSearchInput}\n prefix={<SearchOutlined style={{ color: '#999', marginRight: '10px' }} />}\n value={searchKey}\n onChange={(e) => setSearchKey(e.target.value)}\n allowClear\n placeholder='请输入项目ID/名称'\n />\n </div>\n {slot && <div className={styles.ykPorjectSelectSoltContainer}>{slot}</div>}\n <div className={styles.ykPorjectSelectFollowed}>\n <div className={styles.contentHeader}>关注项目</div>\n <div className={styles.ykPorjectSelectFollowedList}>\n {followedOptions.map((item) => (\n <Tooltip\n key={item.value}\n title={\n <>\n <div style={{ fontSize: 14, color: '#555555' }}>{item.label}</div>\n <div style={{ fontSize: 12, color: '#999' }}>ID: {item.value}</div>\n </>\n }\n color='#fff'\n placement='bottomLeft'\n styles={{ body: { color: '#333' } }}\n >\n <div key={item.value} className={styles.ykPorjectSelectFollowedItem}>\n <img className={styles.ykPorjectSelectFollowedItemIcon} src={item.icon} alt={item.label} />\n <div className={styles.closeIcon} onClick={() => void handleStarChange(item, 0)} />\n </div>\n </Tooltip>\n ))}\n </div>\n </div>\n <Tabs\n className={styles.ykPorjectSelectProductPanelTabs}\n centered\n onChange={handleTabChange}\n activeKey={status}\n items={tabs}\n ></Tabs>\n {localOptions.length === 0 ? (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />\n ) : (\n <div className={styles.ykPorjectSelectListSection}>\n <div className={styles.contentHeader}>全部项目</div>\n <Scrollbars\n className={styles.ykPorjectSelectScrollBarsBox}\n autoHeight\n autoHide\n autoHeightMax={Math.min(450, pageHeight - 310)}\n renderThumbVertical={({ style, ...props }) => (\n <div {...props} style={{ ...style, background: '#EEEEEE', borderRadius: 3, width: 6 }} />\n )}\n >\n {localOptions\n .sort((a, b) => (b.recent_visit ? 1 : 0) - (a.recent_visit ? 1 : 0))\n .map((item) => (\n <div\n key={item.value}\n className={classNames(styles.contentItem, item.value === value ? styles.contentItemActive : '')}\n >\n {renderItem(item)}\n </div>\n ))}\n </Scrollbars>\n </div>\n )}\n </div>\n );\n\n return (\n <Popover\n className={styles.ykPorjectSelect}\n styles={{ body: { borderRadius: 4, padding: 0 } }}\n content={content}\n placement='bottom'\n trigger='click'\n open={open}\n onOpenChange={setOpen}\n getPopupContainer={(triggerNode: HTMLElement) => triggerNode.parentNode as HTMLElement}\n autoAdjustOverflow={false}\n >\n {customShow ? (\n customShow\n ) : (\n <div className={styles.ykPorjectSelectShow}>\n <img className={styles.ykPorjectSelectShowIcon} src={activeItem?.icon} alt={activeItem?.label} />\n <span className={styles.ykPorjectSelectShowText}>{activeItem?.label}</span>\n <i className='iconfont icon-xiala' />\n </div>\n )}\n </Popover>\n );\n};\n\nexport default YkPorjectSelect;\n"],
5
+ "mappings": "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",
6
6
  "names": ["React", "styles", "iconProductDefault", "TextWithTooltip", "classNames"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/DebounceInput/index.tsx"],
4
- "sourcesContent": ["/**\n * 组件名称:DebouncedInput\n * 组件描述:一个用于搜索的输入框组件,支持防抖\n * 组件使用场景:在需要搜索的场景中使用,如筛选、排序等\n * 组件参数说明:\n * - noDebounced: 是否不使用防抖\n * - currentValue: 当前值\n * - placeholder: 输入框提示文字\n * - onChange: 值改变时的回调\n * - delay: 防抖时间\n * - inputClass: 输入框样式类名\n * - allowClear: 是否允许清空\n * - style: 组件样式\n */\nimport { useDebounceFn } from 'ahooks';\nimport { Input } from 'antd';\nimport classNames from 'classnames';\nimport React, { useEffect, useRef, useState } from 'react';\nimport styles from './index.module.less';\ntype PropsType = {\n noDebounced?: boolean;\n currentValue: string | undefined;\n placeholder?: string;\n onChange: (value: string) => void;\n delay?: number;\n inputClass?: any;\n allowClear?: boolean;\n style?: React.CSSProperties;\n noPrefixIcon?: boolean;\n disabled?: boolean;\n icon?: React.ReactNode;\n};\nconst DebouncedInput: React.FC<PropsType> = ({\n noDebounced = false,\n currentValue = '',\n placeholder = '搜索',\n onChange = (value: string) => {},\n delay = 150,\n inputClass,\n allowClear = true,\n style = {},\n noPrefixIcon = false,\n disabled = false,\n icon,\n}) => {\n const [value, setValue] = useState(currentValue);\n const lock = useRef(false);\n const changeFlag = useRef(false);\n useEffect(() => {\n if (changeFlag.current) {\n changeFlag.current = false;\n return;\n }\n setValue(currentValue);\n }, [currentValue]);\n\n const { run } = useDebounceFn(\n () => {\n onChange(value);\n },\n { wait: delay },\n );\n function handleChange(e: any) {\n const type = e.type;\n if (type === 'compositionstart') {\n lock.current = true;\n return;\n }\n const value = e.target.value;\n setValue(value);\n if (e.type === 'compositionend') {\n lock.current = false;\n }\n if (!lock.current) {\n changeFlag.current = true;\n if (noDebounced) {\n onChange(value);\n } else {\n run();\n }\n }\n }\n return (\n <Input\n allowClear={allowClear}\n style={style}\n className={classNames(styles.search, inputClass)}\n placeholder={placeholder}\n prefix={\n !noPrefixIcon &&\n (icon || <i className='iconfont icon-sousuo' style={{ fontSize: 14, lineHeight: '28px', color: '#999' }} />)\n }\n value={value}\n onChange={handleChange}\n onCompositionStart={handleChange}\n onCompositionEnd={handleChange}\n disabled={disabled}\n />\n );\n};\n\nexport default DebouncedInput;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,oBAA8B;AAC9B,kBAAsB;AACtB,wBAAuB;AACvB,mBAAmD;AACnD,0BAAmB;AAcnB,IAAM,iBAAsC,CAAC;AAAA,EAC3C,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW,CAAC,UAAkB;AAAA,EAAC;AAAA,EAC/B,QAAQ;AAAA,EACR;AAAA,EACA,aAAa;AAAA,EACb,QAAQ,CAAC;AAAA,EACT,eAAe;AAAA,EACf,WAAW;AAAA,EACX;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,YAAY;AAC/C,QAAM,WAAO,qBAAO,KAAK;AACzB,QAAM,iBAAa,qBAAO,KAAK;AAC/B,8BAAU,MAAM;AACd,QAAI,WAAW,SAAS;AACtB,iBAAW,UAAU;AACrB;AAAA,IACF;AACA,aAAS,YAAY;AAAA,EACvB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,EAAE,IAAI,QAAI;AAAA,IACd,MAAM;AACJ,eAAS,KAAK;AAAA,IAChB;AAAA,IACA,EAAE,MAAM,MAAM;AAAA,EAChB;AACA,WAAS,aAAa,GAAQ;AAC5B,UAAM,OAAO,EAAE;AACf,QAAI,SAAS,oBAAoB;AAC/B,WAAK,UAAU;AACf;AAAA,IACF;AACA,UAAMA,SAAQ,EAAE,OAAO;AACvB,aAASA,MAAK;AACd,QAAI,EAAE,SAAS,kBAAkB;AAC/B,WAAK,UAAU;AAAA,IACjB;AACA,QAAI,CAAC,KAAK,SAAS;AACjB,iBAAW,UAAU;AACrB,UAAI,aAAa;AACf,iBAASA,MAAK;AAAA,MAChB,OAAO;AACL,YAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACA,SACE,6BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,eAAW,kBAAAC,SAAW,oBAAAC,QAAO,QAAQ,UAAU;AAAA,MAC/C;AAAA,MACA,QACE,CAAC,iBACA,QAAQ,6BAAAF,QAAA,cAAC,OAAE,WAAU,wBAAuB,OAAO,EAAE,UAAU,IAAI,YAAY,QAAQ,OAAO,OAAO,GAAG;AAAA,MAE3G;AAAA,MACA,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,MAClB;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,wBAAQ;",
4
+ "sourcesContent": ["/**\n * 组件名称:DebouncedInput\n * 组件描述:一个用于搜索的输入框组件,支持防抖\n * 组件使用场景:在需要搜索的场景中使用,如筛选、排序等\n * 组件参数说明:\n * - noDebounced: 是否不使用防抖\n * - currentValue: 当前值\n * - placeholder: 输入框提示文字\n * - onChange: 值改变时的回调\n * - delay: 防抖时间\n * - inputClass: 输入框样式类名\n * - allowClear: 是否允许清空\n * - style: 组件样式\n */\nimport { useDebounceFn } from 'ahooks';\nimport { Input } from 'antd';\nimport classNames from 'classnames';\nimport React, { useEffect, useRef, useState } from 'react';\nimport styles from './index.module.less';\n\ntype PropsType = {\n noDebounced?: boolean;\n currentValue: string | undefined;\n placeholder?: string;\n onChange: (value: string) => void;\n delay?: number;\n inputClass?: any;\n allowClear?: boolean;\n style?: React.CSSProperties;\n noPrefixIcon?: boolean;\n disabled?: boolean;\n icon?: React.ReactNode;\n};\nconst DebouncedInput: React.FC<PropsType> = ({\n noDebounced = false,\n currentValue = '',\n placeholder = '搜索',\n onChange = (value: string) => {},\n delay = 150,\n inputClass,\n allowClear = true,\n style = {},\n noPrefixIcon = false,\n disabled = false,\n icon,\n}) => {\n const [value, setValue] = useState(currentValue);\n const lock = useRef(false);\n const changeFlag = useRef(false);\n useEffect(() => {\n if (changeFlag.current) {\n changeFlag.current = false;\n return;\n }\n setValue(currentValue);\n }, [currentValue]);\n\n const { run } = useDebounceFn(\n () => {\n onChange(value);\n },\n { wait: delay },\n );\n function handleChange(e: any) {\n const type = e.type;\n if (type === 'compositionstart') {\n lock.current = true;\n return;\n }\n const value = e.target.value;\n setValue(value);\n if (e.type === 'compositionend') {\n lock.current = false;\n }\n if (!lock.current) {\n changeFlag.current = true;\n if (noDebounced) {\n onChange(value);\n } else {\n run();\n }\n }\n }\n return (\n <Input\n allowClear={allowClear}\n style={style}\n className={classNames(styles.search, inputClass)}\n placeholder={placeholder}\n prefix={\n !noPrefixIcon &&\n (icon || <i className='iconfont icon-sousuo' style={{ fontSize: 14, lineHeight: '28px', color: '#999' }} />)\n }\n value={value}\n onChange={handleChange}\n onCompositionStart={handleChange}\n onCompositionEnd={handleChange}\n disabled={disabled}\n />\n );\n};\n\nexport default DebouncedInput;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,oBAA8B;AAC9B,kBAAsB;AACtB,wBAAuB;AACvB,mBAAmD;AACnD,0BAAmB;AAenB,IAAM,iBAAsC,CAAC;AAAA,EAC3C,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW,CAAC,UAAkB;AAAA,EAAC;AAAA,EAC/B,QAAQ;AAAA,EACR;AAAA,EACA,aAAa;AAAA,EACb,QAAQ,CAAC;AAAA,EACT,eAAe;AAAA,EACf,WAAW;AAAA,EACX;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,YAAY;AAC/C,QAAM,WAAO,qBAAO,KAAK;AACzB,QAAM,iBAAa,qBAAO,KAAK;AAC/B,8BAAU,MAAM;AACd,QAAI,WAAW,SAAS;AACtB,iBAAW,UAAU;AACrB;AAAA,IACF;AACA,aAAS,YAAY;AAAA,EACvB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,EAAE,IAAI,QAAI;AAAA,IACd,MAAM;AACJ,eAAS,KAAK;AAAA,IAChB;AAAA,IACA,EAAE,MAAM,MAAM;AAAA,EAChB;AACA,WAAS,aAAa,GAAQ;AAC5B,UAAM,OAAO,EAAE;AACf,QAAI,SAAS,oBAAoB;AAC/B,WAAK,UAAU;AACf;AAAA,IACF;AACA,UAAMA,SAAQ,EAAE,OAAO;AACvB,aAASA,MAAK;AACd,QAAI,EAAE,SAAS,kBAAkB;AAC/B,WAAK,UAAU;AAAA,IACjB;AACA,QAAI,CAAC,KAAK,SAAS;AACjB,iBAAW,UAAU;AACrB,UAAI,aAAa;AACf,iBAASA,MAAK;AAAA,MAChB,OAAO;AACL,YAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACA,SACE,6BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,eAAW,kBAAAC,SAAW,oBAAAC,QAAO,QAAQ,UAAU;AAAA,MAC/C;AAAA,MACA,QACE,CAAC,iBACA,QAAQ,6BAAAF,QAAA,cAAC,OAAE,WAAU,wBAAuB,OAAO,EAAE,UAAU,IAAI,YAAY,QAAQ,OAAO,OAAO,GAAG;AAAA,MAE3G;AAAA,MACA,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,MAClB;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,wBAAQ;",
6
6
  "names": ["value", "React", "classNames", "styles"]
7
7
  }
@@ -1,3 +1,17 @@
1
+ /**
2
+ * 组件名称:MultipleSelect
3
+ * 组件描述:一个用于多选的组件,支持搜索和选择
4
+ * 组件使用场景:在需要选择多个值的场景中使用,如筛选、排序等
5
+ * 组件参数说明:
6
+ * - name: 组件名称
7
+ * - value: 选中的值
8
+ * - onChange: 值改变时的回调
9
+ * - options: 选项列表
10
+ * - style: 组件样式
11
+ * - popoverStyle: 弹窗样式
12
+ * - icon: 组件图标
13
+ * - autoConfirm: 是否自动确认,默认为true。如果为false,则显示确定和取消按钮,点击确定后触发onChange
14
+ */
1
15
  import type { FC } from 'react';
2
16
  import React from 'react';
3
17
  type PageTypes = {
@@ -32,11 +32,11 @@ __export(MultipleSelect_exports, {
32
32
  default: () => MultipleSelect_default
33
33
  });
34
34
  module.exports = __toCommonJS(MultipleSelect_exports);
35
- var import_TextWithToolTip = __toESM(require("../TextWithToolTip"));
36
35
  var import_antd = require("antd");
37
36
  var import_classnames = __toESM(require("classnames"));
38
37
  var import_react = __toESM(require("react"));
39
38
  var import_react_virtualized = require("react-virtualized");
39
+ var import_TextWithToolTip = __toESM(require("../TextWithToolTip"));
40
40
  var import_DebounceInput = __toESM(require("../DebounceInput"));
41
41
  var import_index_module = __toESM(require("./index.module.less"));
42
42
  var MultipleSelect = ({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/MultipleSelect/index.tsx"],
4
- "sourcesContent": ["/**\n * 组件名称:MultipleSelect\n * 组件描述:一个用于多选的组件,支持搜索和选择\n * 组件使用场景:在需要选择多个值的场景中使用,如筛选、排序等\n * 组件参数说明:\n * - name: 组件名称\n * - value: 选中的值\n * - onChange: 值改变时的回调\n * - options: 选项列表\n * - style: 组件样式\n * - popoverStyle: 弹窗样式\n * - icon: 组件图标\n * - autoConfirm: 是否自动确认,默认为true。如果为false,则显示确定和取消按钮,点击确定后触发onChange\n */\nimport TextWithTooltip from '@/components/TextWithToolTip';\nimport { Button, Checkbox, ConfigProvider, Flex, message, Popover, Tooltip } from 'antd';\nimport classNames from 'classnames';\nimport type { FC } from 'react';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { AutoSizer, List } from 'react-virtualized';\nimport DebounceInput from '../DebounceInput';\nimport styles from './index.module.less';\n\ntype PageTypes = {\n name?: string;\n value: (string | number)[];\n onChange: (value: (string | number)[]) => void;\n options: { label: string; value: string | number; isSelectAll?: boolean }[];\n style?: React.CSSProperties;\n popoverStyle?: React.CSSProperties;\n icon?: React.ReactNode;\n noXiala?: boolean;\n minCount?: number;\n disabledItems?: (string | number)[] | undefined; // 禁用选项\n disabledMessages?: string; // 禁用提示\n noAllSelect?: boolean; // 是否不显示全选选项\n autoConfirm?: boolean; // 是否自动确认,默认为true,如果为false则显示确定和取消按钮\n};\n\nconst MultipleSelect: FC<PageTypes> = ({\n name,\n value = [],\n onChange,\n options = [],\n style,\n popoverStyle,\n icon,\n noXiala = false,\n minCount = 0,\n disabledItems,\n disabledMessages,\n noAllSelect = false,\n autoConfirm = true,\n}) => {\n const [searchKey, setSearchKey] = useState('');\n const [open, setOpen] = useState(false);\n const [tempValue, setTempValue] = useState<(string | number)[]>([]); // 临时存储选中的值\n const listRef = useRef(null);\n\n useEffect(() => {\n setTimeout(() => {\n setSearchKey('');\n }, 200);\n }, [open]);\n\n // 当弹窗打开时,初始化临时值\n useEffect(() => {\n if (open) {\n setTempValue(value);\n }\n }, [open, value]);\n\n const handlePopOpen = (visible: boolean) => {\n setOpen(visible);\n };\n\n const itemClick = (v: string | number, checked: boolean) => {\n const currentValue = autoConfirm ? value : tempValue;\n\n if (checked && currentValue.filter((f) => f !== v).length < minCount) {\n message.warning(`至少选择${minCount}个`);\n return;\n }\n\n const newValue = checked ? currentValue?.filter((f) => f !== v) : [...currentValue, v];\n\n if (autoConfirm) {\n // 自动确认模式,直接触发onChange\n onChange(newValue);\n } else {\n // 非自动确认模式,更新临时值\n setTempValue(newValue);\n }\n };\n\n const filterOptions = useMemo(() => {\n const key = searchKey.trim().toUpperCase();\n const filtered = options.filter((m) => {\n if (key) {\n return m.label.toUpperCase().includes(key);\n }\n return true;\n });\n // 添加全选选项到列表开头\n return noAllSelect ? filtered : [{ label: '全选', value: '__selectAll__', isSelectAll: true }, ...filtered];\n }, [searchKey, options]);\n\n const rowRenderer = ({ index, key, style }: { index: number; key: string; style: React.CSSProperties }) => {\n const m = filterOptions[index];\n const currentValue = autoConfirm ? value : tempValue;\n\n // 处理全选选项\n if (m.isSelectAll) {\n return (\n <div key={key} style={style} className={styles.checkAll}>\n <ConfigProvider\n theme={{\n token: {\n controlInteractiveSize: 14,\n },\n }}\n >\n <Checkbox\n checked={currentValue.length === options.length}\n indeterminate={currentValue.length > 0 && currentValue.length < options.length}\n onChange={(e) => {\n const newValue = e.target.checked ? options.map((m) => m.value) : [];\n if (autoConfirm) {\n onChange(newValue);\n } else {\n setTempValue(newValue);\n }\n }}\n >\n 全选\n </Checkbox>\n </ConfigProvider>\n </div>\n );\n }\n\n // 处理普通选项\n return (\n <Tooltip\n title={disabledItems?.includes(m.value) ? disabledMessages || '该选项不能改变状态' : ''}\n color='#fff'\n styles={{ body: { color: '#333', fontSize: 12 } }}\n key={key}\n style={style}\n >\n <div\n style={style}\n className={classNames(styles.optionItem, currentValue?.includes(m.value) ? styles.active : null)}\n // 可以保留整行点击\n onClick={() => {\n if (disabledItems?.includes(m.value)) {\n return;\n }\n itemClick(m.value, currentValue?.includes(m.value));\n }}\n >\n <ConfigProvider\n theme={{\n token: {\n controlInteractiveSize: 14,\n },\n }}\n >\n <Checkbox\n disabled={disabledItems?.includes(m.value)}\n checked={currentValue?.includes(m.value)}\n onChange={() => {\n itemClick(m.value, currentValue?.includes(m.value));\n }}\n // 阻止点击Checkbox时冒泡到整行\n onClick={(e) => e.stopPropagation()}\n style={{ marginRight: 8 }}\n />\n </ConfigProvider>\n <TextWithTooltip\n text={m.label}\n style={{ color: disabledItems?.includes(m.value) ? '#999' : '#333' }}\n width='100%'\n maxWidth='100%'\n className={styles.label}\n highlight={searchKey}\n />\n </div>\n </Tooltip>\n );\n };\n\n const PopoverContent = (\n <div className={styles.popoverContent} style={popoverStyle}>\n <DebounceInput\n allowClear={true}\n inputClass={styles.searchInput}\n placeholder='搜索'\n currentValue={searchKey}\n onChange={(value) => {\n setSearchKey(value);\n }}\n ></DebounceInput>\n <div className={styles.popoverContentList}>\n {filterOptions.length === 0 ? (\n <div className={styles.emptyItem}>当前搜索条件无数据</div>\n ) : (\n <AutoSizer\n style={{\n background: '#fff',\n width: '100%',\n // maxHeight: 400,\n minHeight: 35,\n height: 'auto',\n }}\n >\n {({ width }: { width: number }) => {\n let height = 35;\n if (filterOptions.length <= 10) {\n height = 35 * filterOptions.length || 35;\n } else {\n height = 35 * 10;\n }\n return (\n <List\n ref={listRef}\n overscanRowCount={5}\n width={width}\n height={height}\n rowCount={filterOptions.length}\n rowHeight={35}\n rowRenderer={rowRenderer}\n />\n );\n }}\n </AutoSizer>\n )}\n </div>\n {!autoConfirm && (\n <div className={styles.popoverFooter}>\n <Button\n size='small'\n type='primary'\n onClick={() => {\n onChange(tempValue);\n setOpen(false);\n }}\n >\n 确定\n </Button>\n <Button\n size='small'\n // className={styles.cancelButton}\n onClick={() => {\n setTempValue(value);\n setOpen(false);\n }}\n >\n 取消\n </Button>\n </div>\n )}\n </div>\n );\n\n return (\n <Popover\n open={open}\n onOpenChange={handlePopOpen}\n fresh={true}\n title={false}\n arrow={false}\n content={PopoverContent}\n trigger='click'\n placement='bottomLeft'\n styles={{ body: { borderRadius: 2, padding: 0 } }}\n >\n <Button\n className={styles.button}\n style={style}\n icon={\n noXiala ? null : <i className='iconfont icon-xiala1' style={open ? { transform: 'rotate(180deg)' } : {}} />\n }\n iconPosition='end'\n onClick={() => {\n setOpen(!open);\n }}\n >\n <Flex justify='space-between' style={{ flex: 1, overflow: 'hidden' }}>\n {icon && icon}\n {name && <span className={styles.nameText}>{name}:</span>}\n <span className={styles.valueText} style={{ flex: 1 }}>\n {value?.length === 1 && options?.length === 1\n ? options?.find((m) => m.value === value?.[0])?.label\n : (value?.length || 0) + '/' + options?.length}\n </span>\n </Flex>\n </Button>\n </Popover>\n );\n};\n\nexport default MultipleSelect;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * 组件名称:MultipleSelect\n * 组件描述:一个用于多选的组件,支持搜索和选择\n * 组件使用场景:在需要选择多个值的场景中使用,如筛选、排序等\n * 组件参数说明:\n * - name: 组件名称\n * - value: 选中的值\n * - onChange: 值改变时的回调\n * - options: 选项列表\n * - style: 组件样式\n * - popoverStyle: 弹窗样式\n * - icon: 组件图标\n * - autoConfirm: 是否自动确认,默认为true。如果为false,则显示确定和取消按钮,点击确定后触发onChange\n */\n\nimport { Button, Checkbox, ConfigProvider, Flex, message, Popover, Tooltip } from 'antd';\nimport classNames from 'classnames';\nimport type { FC } from 'react';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { AutoSizer, List } from 'react-virtualized';\nimport TextWithTooltip from '@/components/TextWithToolTip';\nimport DebounceInput from '../DebounceInput';\nimport styles from './index.module.less';\n\ntype PageTypes = {\n name?: string;\n value: (string | number)[];\n onChange: (value: (string | number)[]) => void;\n options: { label: string; value: string | number; isSelectAll?: boolean }[];\n style?: React.CSSProperties;\n popoverStyle?: React.CSSProperties;\n icon?: React.ReactNode;\n noXiala?: boolean;\n minCount?: number;\n disabledItems?: (string | number)[] | undefined; // 禁用选项\n disabledMessages?: string; // 禁用提示\n noAllSelect?: boolean; // 是否不显示全选选项\n autoConfirm?: boolean; // 是否自动确认,默认为true,如果为false则显示确定和取消按钮\n};\n\nconst MultipleSelect: FC<PageTypes> = ({\n name,\n value = [],\n onChange,\n options = [],\n style,\n popoverStyle,\n icon,\n noXiala = false,\n minCount = 0,\n disabledItems,\n disabledMessages,\n noAllSelect = false,\n autoConfirm = true,\n}) => {\n const [searchKey, setSearchKey] = useState('');\n const [open, setOpen] = useState(false);\n const [tempValue, setTempValue] = useState<(string | number)[]>([]); // 临时存储选中的值\n const listRef = useRef(null);\n\n useEffect(() => {\n setTimeout(() => {\n setSearchKey('');\n }, 200);\n }, [open]);\n\n // 当弹窗打开时,初始化临时值\n useEffect(() => {\n if (open) {\n setTempValue(value);\n }\n }, [open, value]);\n\n const handlePopOpen = (visible: boolean) => {\n setOpen(visible);\n };\n\n const itemClick = (v: string | number, checked: boolean) => {\n const currentValue = autoConfirm ? value : tempValue;\n\n if (checked && currentValue.filter((f) => f !== v).length < minCount) {\n message.warning(`至少选择${minCount}个`);\n return;\n }\n\n const newValue = checked ? currentValue?.filter((f) => f !== v) : [...currentValue, v];\n\n if (autoConfirm) {\n // 自动确认模式,直接触发onChange\n onChange(newValue);\n } else {\n // 非自动确认模式,更新临时值\n setTempValue(newValue);\n }\n };\n\n const filterOptions = useMemo(() => {\n const key = searchKey.trim().toUpperCase();\n const filtered = options.filter((m) => {\n if (key) {\n return m.label.toUpperCase().includes(key);\n }\n return true;\n });\n // 添加全选选项到列表开头\n return noAllSelect ? filtered : [{ label: '全选', value: '__selectAll__', isSelectAll: true }, ...filtered];\n }, [searchKey, options]);\n\n const rowRenderer = ({ index, key, style }: { index: number; key: string; style: React.CSSProperties }) => {\n const m = filterOptions[index];\n const currentValue = autoConfirm ? value : tempValue;\n\n // 处理全选选项\n if (m.isSelectAll) {\n return (\n <div key={key} style={style} className={styles.checkAll}>\n <ConfigProvider\n theme={{\n token: {\n controlInteractiveSize: 14,\n },\n }}\n >\n <Checkbox\n checked={currentValue.length === options.length}\n indeterminate={currentValue.length > 0 && currentValue.length < options.length}\n onChange={(e) => {\n const newValue = e.target.checked ? options.map((m) => m.value) : [];\n if (autoConfirm) {\n onChange(newValue);\n } else {\n setTempValue(newValue);\n }\n }}\n >\n 全选\n </Checkbox>\n </ConfigProvider>\n </div>\n );\n }\n\n // 处理普通选项\n return (\n <Tooltip\n title={disabledItems?.includes(m.value) ? disabledMessages || '该选项不能改变状态' : ''}\n color='#fff'\n styles={{ body: { color: '#333', fontSize: 12 } }}\n key={key}\n style={style}\n >\n <div\n style={style}\n className={classNames(styles.optionItem, currentValue?.includes(m.value) ? styles.active : null)}\n // 可以保留整行点击\n onClick={() => {\n if (disabledItems?.includes(m.value)) {\n return;\n }\n itemClick(m.value, currentValue?.includes(m.value));\n }}\n >\n <ConfigProvider\n theme={{\n token: {\n controlInteractiveSize: 14,\n },\n }}\n >\n <Checkbox\n disabled={disabledItems?.includes(m.value)}\n checked={currentValue?.includes(m.value)}\n onChange={() => {\n itemClick(m.value, currentValue?.includes(m.value));\n }}\n // 阻止点击Checkbox时冒泡到整行\n onClick={(e) => e.stopPropagation()}\n style={{ marginRight: 8 }}\n />\n </ConfigProvider>\n <TextWithTooltip\n text={m.label}\n style={{ color: disabledItems?.includes(m.value) ? '#999' : '#333' }}\n width='100%'\n maxWidth='100%'\n className={styles.label}\n highlight={searchKey}\n />\n </div>\n </Tooltip>\n );\n };\n\n const PopoverContent = (\n <div className={styles.popoverContent} style={popoverStyle}>\n <DebounceInput\n allowClear={true}\n inputClass={styles.searchInput}\n placeholder='搜索'\n currentValue={searchKey}\n onChange={(value) => {\n setSearchKey(value);\n }}\n ></DebounceInput>\n <div className={styles.popoverContentList}>\n {filterOptions.length === 0 ? (\n <div className={styles.emptyItem}>当前搜索条件无数据</div>\n ) : (\n <AutoSizer\n style={{\n background: '#fff',\n width: '100%',\n // maxHeight: 400,\n minHeight: 35,\n height: 'auto',\n }}\n >\n {({ width }: { width: number }) => {\n let height = 35;\n if (filterOptions.length <= 10) {\n height = 35 * filterOptions.length || 35;\n } else {\n height = 35 * 10;\n }\n return (\n <List\n ref={listRef}\n overscanRowCount={5}\n width={width}\n height={height}\n rowCount={filterOptions.length}\n rowHeight={35}\n rowRenderer={rowRenderer}\n />\n );\n }}\n </AutoSizer>\n )}\n </div>\n {!autoConfirm && (\n <div className={styles.popoverFooter}>\n <Button\n size='small'\n type='primary'\n onClick={() => {\n onChange(tempValue);\n setOpen(false);\n }}\n >\n 确定\n </Button>\n <Button\n size='small'\n // className={styles.cancelButton}\n onClick={() => {\n setTempValue(value);\n setOpen(false);\n }}\n >\n 取消\n </Button>\n </div>\n )}\n </div>\n );\n\n return (\n <Popover\n open={open}\n onOpenChange={handlePopOpen}\n fresh={true}\n title={false}\n arrow={false}\n content={PopoverContent}\n trigger='click'\n placement='bottomLeft'\n styles={{ body: { borderRadius: 2, padding: 0 } }}\n >\n <Button\n className={styles.button}\n style={style}\n icon={\n noXiala ? null : <i className='iconfont icon-xiala1' style={open ? { transform: 'rotate(180deg)' } : {}} />\n }\n iconPosition='end'\n onClick={() => {\n setOpen(!open);\n }}\n >\n <Flex justify='space-between' style={{ flex: 1, overflow: 'hidden' }}>\n {icon && icon}\n {name && <span className={styles.nameText}>{name}:</span>}\n <span className={styles.valueText} style={{ flex: 1 }}>\n {value?.length === 1 && options?.length === 1\n ? options?.find((m) => m.value === value?.[0])?.label\n : (value?.length || 0) + '/' + options?.length}\n </span>\n </Flex>\n </Button>\n </Popover>\n );\n};\n\nexport default MultipleSelect;\n"],
5
+ "mappings": "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",
6
6
  "names": ["style", "React", "styles", "m", "classNames", "TextWithTooltip", "DebounceInput", "value"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/RefreshButton/index.tsx"],
4
- "sourcesContent": ["import { Button } from 'antd';\nimport React from 'react';\ntype Props = {\n handleRefresh: () => void;\n text?: string;\n style?: React.CSSProperties;\n};\n\nconst RefreshButton: React.FC<Props> = ({ handleRefresh, text = '刷新', style }) => {\n return (\n <Button\n style={style}\n onClick={() => {\n handleRefresh();\n }}\n icon={<i className='iconfont icon-refresh' style={{ color: '#3B86F9', fontSize: 14 }} />}\n >\n {text}\n </Button>\n );\n};\n\nexport default RefreshButton;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAuB;AACvB,mBAAkB;AAOlB,IAAM,gBAAiC,CAAC,EAAE,eAAe,OAAO,MAAM,MAAM,MAAM;AAChF,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,SAAS,MAAM;AACb,sBAAc;AAAA,MAChB;AAAA,MACA,MAAM,6BAAAA,QAAA,cAAC,OAAE,WAAU,yBAAwB,OAAO,EAAE,OAAO,WAAW,UAAU,GAAG,GAAG;AAAA;AAAA,IAErF;AAAA,EACH;AAEJ;AAEA,IAAO,wBAAQ;",
4
+ "sourcesContent": ["import { Button } from 'antd';\nimport React from 'react';\n\ntype Props = {\n handleRefresh: () => void;\n text?: string;\n style?: React.CSSProperties;\n};\n\nconst RefreshButton: React.FC<Props> = ({ handleRefresh, text = '刷新', style }) => {\n return (\n <Button\n style={style}\n onClick={() => {\n handleRefresh();\n }}\n icon={<i className='iconfont icon-refresh' style={{ color: '#3B86F9', fontSize: 14 }} />}\n >\n {text}\n </Button>\n );\n};\n\nexport default RefreshButton;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAuB;AACvB,mBAAkB;AAQlB,IAAM,gBAAiC,CAAC,EAAE,eAAe,OAAO,MAAM,MAAM,MAAM;AAChF,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,SAAS,MAAM;AACb,sBAAc;AAAA,MAChB;AAAA,MACA,MAAM,6BAAAA,QAAA,cAAC,OAAE,WAAU,yBAAwB,OAAO,EAAE,OAAO,WAAW,UAAU,GAAG,GAAG;AAAA;AAAA,IAErF;AAAA,EACH;AAEJ;AAEA,IAAO,wBAAQ;",
6
6
  "names": ["React"]
7
7
  }
@@ -32,11 +32,11 @@ __export(SearchWithHistory_exports, {
32
32
  default: () => SearchWithHistory_default
33
33
  });
34
34
  module.exports = __toCommonJS(SearchWithHistory_exports);
35
- var import_TextWithToolTip = __toESM(require("../TextWithToolTip"));
36
35
  var import_icons = require("@ant-design/icons");
37
36
  var import_ahooks = require("ahooks");
38
37
  var import_antd = require("antd");
39
38
  var import_react = __toESM(require("react"));
39
+ var import_TextWithToolTip = __toESM(require("../TextWithToolTip"));
40
40
  var import_index_module = __toESM(require("./index.module.less"));
41
41
  var INPUT_THEME = {
42
42
  token: { colorText: "rgba(191, 199, 209, 1)" },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/SearchWithHistory/index.tsx"],
4
- "sourcesContent": ["import TextWithTooltip from '@/components/TextWithToolTip';\nimport { ClockCircleOutlined, SearchOutlined } from '@ant-design/icons';\nimport { useLocalStorageState } from 'ahooks';\nimport { ConfigProvider, Input, Popover } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport styles from './index.module.less';\n\ntype SearchWithHistoryProps = {\n /** localStorage 存储 key */\n localstorageKey: string;\n /** 可搜索的选项列表(含菜单路由、看板等) */\n list: { label: string; value: string; tag?: string }[];\n placeholder?: string;\n /** 选中项回调,value 为路由 path 或看板 id 等 */\n onClick: (value: string) => void;\n};\n\nconst INPUT_THEME = {\n token: { colorText: 'rgba(191, 199, 209, 1)' },\n components: {\n Input: {\n colorBgContainer: 'rgba(45, 56, 86, 1)',\n colorBorder: '#2D3856',\n borderRadius: 18,\n boxShadow: 'inset 0px -0.5px 0px 0px rgba(20, 31, 62, 0.5)',\n hoverBorderColor: 'rgba(0, 85, 255, 1)',\n paddingBlock: 6,\n },\n },\n};\n\n/**\n * 带历史记录的搜索弹层\n * - 无输入时展示最近搜索(localStorage 持久化)\n * - 有输入时展示匹配的菜单/看板列表\n */\nconst SearchWithHistory: React.FC<SearchWithHistoryProps> = ({\n localstorageKey = 'yk_search_history',\n list,\n placeholder = '搜索',\n onClick,\n}) => {\n const [open, setOpen] = useState(false);\n const [searchValue, setSearchValue] = useState('');\n const [historyList, setHistoryList] = useLocalStorageState<{ label: string; value: string; tag?: string }[]>(\n localstorageKey,\n { defaultValue: [] },\n );\n\n /** 选中项:执行回调并更新历史(同 value 则置顶) */\n const menuItemClick = useCallback(\n (item: { label: string; value: string; tag?: string }) => {\n onClick(item.value);\n setOpen(false);\n setHistoryList((prev = []) => [item, ...prev.filter((h) => h.value !== item.value)]);\n },\n [onClick, setHistoryList],\n );\n\n /** 清空历史 */\n const clearHistory = useCallback(() => {\n setOpen(false);\n setTimeout(() => setHistoryList([]), 100);\n }, [setHistoryList]);\n\n /** 匹配的选项列表(按 label 包含搜索词过滤) */\n const menuList = useMemo(() => list.filter((item) => item.label.includes(searchValue)), [list, searchValue]);\n\n /** 最近搜索列表 DOM */\n const historyContent = useMemo(\n () => (\n <div>\n <div className={styles.historyHeader}>\n <ClockCircleOutlined style={{ marginRight: 10, transform: 'translateY(-1px)' }} />\n <span>最近搜索</span>\n <i className='iconfont icon-lajitong' onClick={clearHistory} />\n </div>\n <div className={styles.historyList}>\n {historyList.map((item) => (\n <div className={styles.item} key={item.value} onClick={() => menuItemClick(item)}>\n <TextWithTooltip width={160} text={item.label} />\n {item.tag && <div className={styles.tag}>{item.tag}</div>}\n </div>\n ))}\n </div>\n </div>\n ),\n [historyList, clearHistory, menuItemClick],\n );\n\n /** 搜索结果列表 DOM */\n const listContent = useMemo(\n () => (\n <div>\n {menuList.map((item) => (\n <div key={item.value} className={styles.item} onClick={() => menuItemClick(item)}>\n <TextWithTooltip width={160} text={item.label} highlight={searchValue} />\n {item.tag && <div className={styles.tag}>{item.tag}</div>}\n </div>\n ))}\n </div>\n ),\n [menuList, searchValue, menuItemClick],\n );\n\n /**\n * 弹层内容:根据输入与历史决定\n * 1. 无历史 → null(不展示弹层)\n * 2. 有历史且无输入 → 最近搜索\n * 3. 有输入且无匹配 → 暂无搜索结果\n * 4. 有输入且匹配 → 菜单列表\n */\n const content = useMemo(() => {\n if (!searchValue) {\n if (historyList.length === 0) return null;\n return <div>{historyContent}</div>;\n }\n if (menuList.length === 0) return <div style={{ color: '#999' }}>暂无搜索结果</div>;\n return listContent;\n }, [searchValue, historyList, historyContent, menuList, listContent]);\n\n /** 内容为空时关闭弹层(如清空输入且无历史) */\n useEffect(() => {\n if (!content) setOpen(false);\n }, [content]);\n\n /** 有输入或有历史时显示弹层 */\n const shouldOpen = (value: string) => {\n if (value) return true;\n return historyList.length > 0;\n };\n\n return (\n <Popover\n open={open}\n onOpenChange={(nextOpen) => {\n if (nextOpen && !content) return; // 无内容时不打开,避免空白弹层\n setOpen(nextOpen);\n }}\n className={styles.popover}\n styles={{ body: { borderRadius: 4, width: 250, paddingRight: 0 } }}\n fresh\n title={false}\n trigger='click'\n placement='bottomLeft'\n arrow={false}\n content={content}\n getPopupContainer={(triggerNode: HTMLElement) => triggerNode.parentNode as HTMLElement}\n autoAdjustOverflow={false}\n >\n <ConfigProvider theme={INPUT_THEME}>\n <Input\n className={styles.inputContainer}\n classNames={{ input: styles.input }}\n placeholder={placeholder}\n prefix={<SearchOutlined />}\n value={searchValue}\n onFocus={() => historyList.length > 0 && setOpen(true)}\n onChange={(e) => {\n const val = e.target.value;\n setSearchValue(val);\n setOpen(shouldOpen(val));\n }}\n />\n </ConfigProvider>\n </Popover>\n );\n};\n\nexport default SearchWithHistory;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ClockCircleOutlined, SearchOutlined } from '@ant-design/icons';\nimport { useLocalStorageState } from 'ahooks';\nimport { ConfigProvider, Input, Popover } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport TextWithTooltip from '@/components/TextWithToolTip';\nimport styles from './index.module.less';\n\ntype SearchWithHistoryProps = {\n /** localStorage 存储 key */\n localstorageKey: string;\n /** 可搜索的选项列表(含菜单路由、看板等) */\n list: { label: string; value: string; tag?: string }[];\n placeholder?: string;\n /** 选中项回调,value 为路由 path 或看板 id 等 */\n onClick: (value: string) => void;\n};\n\nconst INPUT_THEME = {\n token: { colorText: 'rgba(191, 199, 209, 1)' },\n components: {\n Input: {\n colorBgContainer: 'rgba(45, 56, 86, 1)',\n colorBorder: '#2D3856',\n borderRadius: 18,\n boxShadow: 'inset 0px -0.5px 0px 0px rgba(20, 31, 62, 0.5)',\n hoverBorderColor: 'rgba(0, 85, 255, 1)',\n paddingBlock: 6,\n },\n },\n};\n\n/**\n * 带历史记录的搜索弹层\n * - 无输入时展示最近搜索(localStorage 持久化)\n * - 有输入时展示匹配的菜单/看板列表\n */\nconst SearchWithHistory: React.FC<SearchWithHistoryProps> = ({\n localstorageKey = 'yk_search_history',\n list,\n placeholder = '搜索',\n onClick,\n}) => {\n const [open, setOpen] = useState(false);\n const [searchValue, setSearchValue] = useState('');\n const [historyList, setHistoryList] = useLocalStorageState<{ label: string; value: string; tag?: string }[]>(\n localstorageKey,\n { defaultValue: [] },\n );\n\n /** 选中项:执行回调并更新历史(同 value 则置顶) */\n const menuItemClick = useCallback(\n (item: { label: string; value: string; tag?: string }) => {\n onClick(item.value);\n setOpen(false);\n setHistoryList((prev = []) => [item, ...prev.filter((h) => h.value !== item.value)]);\n },\n [onClick, setHistoryList],\n );\n\n /** 清空历史 */\n const clearHistory = useCallback(() => {\n setOpen(false);\n setTimeout(() => setHistoryList([]), 100);\n }, [setHistoryList]);\n\n /** 匹配的选项列表(按 label 包含搜索词过滤) */\n const menuList = useMemo(() => list.filter((item) => item.label.includes(searchValue)), [list, searchValue]);\n\n /** 最近搜索列表 DOM */\n const historyContent = useMemo(\n () => (\n <div>\n <div className={styles.historyHeader}>\n <ClockCircleOutlined style={{ marginRight: 10, transform: 'translateY(-1px)' }} />\n <span>最近搜索</span>\n <i className='iconfont icon-lajitong' onClick={clearHistory} />\n </div>\n <div className={styles.historyList}>\n {historyList.map((item) => (\n <div className={styles.item} key={item.value} onClick={() => menuItemClick(item)}>\n <TextWithTooltip width={160} text={item.label} />\n {item.tag && <div className={styles.tag}>{item.tag}</div>}\n </div>\n ))}\n </div>\n </div>\n ),\n [historyList, clearHistory, menuItemClick],\n );\n\n /** 搜索结果列表 DOM */\n const listContent = useMemo(\n () => (\n <div>\n {menuList.map((item) => (\n <div key={item.value} className={styles.item} onClick={() => menuItemClick(item)}>\n <TextWithTooltip width={160} text={item.label} highlight={searchValue} />\n {item.tag && <div className={styles.tag}>{item.tag}</div>}\n </div>\n ))}\n </div>\n ),\n [menuList, searchValue, menuItemClick],\n );\n\n /**\n * 弹层内容:根据输入与历史决定\n * 1. 无历史 → null(不展示弹层)\n * 2. 有历史且无输入 → 最近搜索\n * 3. 有输入且无匹配 → 暂无搜索结果\n * 4. 有输入且匹配 → 菜单列表\n */\n const content = useMemo(() => {\n if (!searchValue) {\n if (historyList.length === 0) return null;\n return <div>{historyContent}</div>;\n }\n if (menuList.length === 0) return <div style={{ color: '#999' }}>暂无搜索结果</div>;\n return listContent;\n }, [searchValue, historyList, historyContent, menuList, listContent]);\n\n /** 内容为空时关闭弹层(如清空输入且无历史) */\n useEffect(() => {\n if (!content) setOpen(false);\n }, [content]);\n\n /** 有输入或有历史时显示弹层 */\n const shouldOpen = (value: string) => {\n if (value) return true;\n return historyList.length > 0;\n };\n\n return (\n <Popover\n open={open}\n onOpenChange={(nextOpen) => {\n if (nextOpen && !content) return; // 无内容时不打开,避免空白弹层\n setOpen(nextOpen);\n }}\n className={styles.popover}\n styles={{ body: { borderRadius: 4, width: 250, paddingRight: 0 } }}\n fresh\n title={false}\n trigger='click'\n placement='bottomLeft'\n arrow={false}\n content={content}\n getPopupContainer={(triggerNode: HTMLElement) => triggerNode.parentNode as HTMLElement}\n autoAdjustOverflow={false}\n >\n <ConfigProvider theme={INPUT_THEME}>\n <Input\n className={styles.inputContainer}\n classNames={{ input: styles.input }}\n placeholder={placeholder}\n prefix={<SearchOutlined />}\n value={searchValue}\n onFocus={() => historyList.length > 0 && setOpen(true)}\n onChange={(e) => {\n const val = e.target.value;\n setSearchValue(val);\n setOpen(shouldOpen(val));\n }}\n />\n </ConfigProvider>\n </Popover>\n );\n};\n\nexport default SearchWithHistory;\n"],
5
+ "mappings": "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",
6
6
  "names": ["React", "styles", "TextWithTooltip"]
7
7
  }
@@ -1,4 +1,4 @@
1
- import { TooltipProps } from 'antd';
1
+ import { type TooltipProps } from 'antd';
2
2
  import React from 'react';
3
3
  type PropsType = {
4
4
  text: number | string | React.ReactNode;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/TextWithToolTip/index.tsx"],
4
- "sourcesContent": ["import { Tooltip, TooltipProps } from 'antd';\nimport React, { useRef, useState } from 'react';\n\ntype PropsType = {\n text: number | string | React.ReactNode;\n placement?: 'top' | 'left' | 'right' | 'bottom';\n zIndex?: number;\n color?: string;\n styles?: TooltipProps['styles'];\n width: number | string;\n maxWidth?: number | string;\n className?: string;\n style?: React.CSSProperties;\n highlight?: string; // 高亮的关键字\n arrow?: boolean;\n};\n\nconst TextWithTooltip: React.FC<PropsType> = ({\n text,\n placement = 'top',\n zIndex,\n width,\n maxWidth,\n className,\n style = {},\n color,\n styles,\n highlight = '',\n arrow = false,\n}) => {\n const [showTooltip, setShowTooltip] = useState(false);\n const textRef = useRef(null);\n\n const handleMouseEnter = () => {\n if (textRef.current) {\n const range = document.createRange();\n range.selectNodeContents(textRef.current);\n const rangeWidth = range.getBoundingClientRect().width;\n const actualWidth = (textRef.current as HTMLElement).getBoundingClientRect().width;\n setShowTooltip(rangeWidth > actualWidth);\n }\n };\n\n // 将text按照高亮关键字拆分成数组\n function splitString(str: string, delimiter: string) {\n const result = [];\n let match;\n const escapedDelimiter = delimiter.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n const regex = new RegExp(`(${escapedDelimiter})`, 'gi');\n let remaining = str; // 新建变量存储剩余字符串\n\n while ((match = regex.exec(remaining)) !== null) {\n const index = match.index;\n if (index !== 0) {\n result.push(remaining.slice(0, index));\n }\n result.push(match[1]);\n remaining = remaining.slice(index + match[1].length);\n regex.lastIndex = 0;\n }\n if (remaining.length > 0) {\n result.push(remaining);\n }\n return result;\n }\n\n // text是ReactNode时,不处理高亮\n const highlightedText = (text: number | string | React.ReactNode): React.ReactNode => {\n if (highlight && (typeof text === 'string' || typeof text === 'number')) {\n return splitString(text.toString(), highlight).map((part, index) => {\n if (part.toUpperCase() === highlight.toUpperCase()) {\n return (\n <span key={index} style={{ color: '#ffb401' }}>\n {part}\n </span>\n );\n } else {\n return <span key={index}>{part}</span>;\n }\n });\n } else {\n return text;\n }\n };\n\n // 处理宽度值,确保字符串数字能正确转换为带单位的 CSS 值\n const formatWidth = (value: number | string): number | string => {\n if (typeof value === 'string' && /^\\d+$/.test(value)) {\n // 如果是纯数字字符串,添加 px 单位\n return `${value}px`;\n }\n return value;\n };\n\n return (\n <Tooltip\n open={showTooltip}\n title={text}\n placement={placement}\n arrow={arrow}\n destroyOnHidden={true}\n color={color ? color : '#fff'}\n styles={styles ? styles : { body: { color: '#333', fontSize: 12 } }}\n {...(zIndex ? { zIndex } : {})}\n >\n <span\n ref={textRef}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={() => setShowTooltip(false)}\n className={className}\n style={{\n display: 'inline-block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n verticalAlign: 'bottom',\n ...style,\n ...(maxWidth ? { maxWidth: formatWidth(maxWidth) } : { width: formatWidth(width) }),\n }}\n >\n {highlightedText(text)}\n </span>\n </Tooltip>\n );\n};\n\nexport default TextWithTooltip;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAsC;AACtC,mBAAwC;AAgBxC,IAAM,kBAAuC,CAAC;AAAA,EAC5C;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,CAAC;AAAA,EACT;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV,MAAM;AACJ,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,KAAK;AACpD,QAAM,cAAU,qBAAO,IAAI;AAE3B,QAAM,mBAAmB,MAAM;AAC7B,QAAI,QAAQ,SAAS;AACnB,YAAM,QAAQ,SAAS,YAAY;AACnC,YAAM,mBAAmB,QAAQ,OAAO;AACxC,YAAM,aAAa,MAAM,sBAAsB,EAAE;AACjD,YAAM,cAAe,QAAQ,QAAwB,sBAAsB,EAAE;AAC7E,qBAAe,aAAa,WAAW;AAAA,IACzC;AAAA,EACF;AAGA,WAAS,YAAY,KAAa,WAAmB;AACnD,UAAM,SAAS,CAAC;AAChB,QAAI;AACJ,UAAM,mBAAmB,UAAU,QAAQ,yBAAyB,MAAM;AAC1E,UAAM,QAAQ,IAAI,OAAO,IAAI,qBAAqB,IAAI;AACtD,QAAI,YAAY;AAEhB,YAAQ,QAAQ,MAAM,KAAK,SAAS,OAAO,MAAM;AAC/C,YAAM,QAAQ,MAAM;AACpB,UAAI,UAAU,GAAG;AACf,eAAO,KAAK,UAAU,MAAM,GAAG,KAAK,CAAC;AAAA,MACvC;AACA,aAAO,KAAK,MAAM,CAAC,CAAC;AACpB,kBAAY,UAAU,MAAM,QAAQ,MAAM,CAAC,EAAE,MAAM;AACnD,YAAM,YAAY;AAAA,IACpB;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,aAAO,KAAK,SAAS;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAGA,QAAM,kBAAkB,CAACA,UAA6D;AACpF,QAAI,cAAc,OAAOA,UAAS,YAAY,OAAOA,UAAS,WAAW;AACvE,aAAO,YAAYA,MAAK,SAAS,GAAG,SAAS,EAAE,IAAI,CAAC,MAAM,UAAU;AAClE,YAAI,KAAK,YAAY,MAAM,UAAU,YAAY,GAAG;AAClD,iBACE,6BAAAC,QAAA,cAAC,UAAK,KAAK,OAAO,OAAO,EAAE,OAAO,UAAU,KACzC,IACH;AAAA,QAEJ,OAAO;AACL,iBAAO,6BAAAA,QAAA,cAAC,UAAK,KAAK,SAAQ,IAAK;AAAA,QACjC;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,aAAOD;AAAA,IACT;AAAA,EACF;AAGA,QAAM,cAAc,CAAC,UAA4C;AAC/D,QAAI,OAAO,UAAU,YAAY,QAAQ,KAAK,KAAK,GAAG;AAEpD,aAAO,GAAG;AAAA,IACZ;AACA,WAAO;AAAA,EACT;AAEA,SACE,6BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB,OAAO,QAAQ,QAAQ;AAAA,MACvB,QAAQ,SAAS,SAAS,EAAE,MAAM,EAAE,OAAO,QAAQ,UAAU,GAAG,EAAE;AAAA,MACjE,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA;AAAA,IAE5B,6BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,cAAc;AAAA,QACd,cAAc,MAAM,eAAe,KAAK;AAAA,QACxC;AAAA,QACA,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,GAAG;AAAA,UACH,GAAI,WAAW,EAAE,UAAU,YAAY,QAAQ,EAAE,IAAI,EAAE,OAAO,YAAY,KAAK,EAAE;AAAA,QACnF;AAAA;AAAA,MAEC,gBAAgB,IAAI;AAAA,IACvB;AAAA,EACF;AAEJ;AAEA,IAAO,0BAAQ;",
4
+ "sourcesContent": ["import { Tooltip, type TooltipProps } from 'antd';\nimport React, { useRef, useState } from 'react';\n\ntype PropsType = {\n text: number | string | React.ReactNode;\n placement?: 'top' | 'left' | 'right' | 'bottom';\n zIndex?: number;\n color?: string;\n styles?: TooltipProps['styles'];\n width: number | string;\n maxWidth?: number | string;\n className?: string;\n style?: React.CSSProperties;\n highlight?: string; // 高亮的关键字\n arrow?: boolean;\n};\n\nconst TextWithTooltip: React.FC<PropsType> = ({\n text,\n placement = 'top',\n zIndex,\n width,\n maxWidth,\n className,\n style = {},\n color,\n styles,\n highlight = '',\n arrow = false,\n}) => {\n const [showTooltip, setShowTooltip] = useState(false);\n const textRef = useRef(null);\n\n const handleMouseEnter = () => {\n if (textRef.current) {\n const range = document.createRange();\n range.selectNodeContents(textRef.current);\n const rangeWidth = range.getBoundingClientRect().width;\n const actualWidth = (textRef.current as HTMLElement).getBoundingClientRect().width;\n setShowTooltip(rangeWidth > actualWidth);\n }\n };\n\n // 将text按照高亮关键字拆分成数组\n function splitString(str: string, delimiter: string) {\n const result = [];\n let match;\n const escapedDelimiter = delimiter.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n const regex = new RegExp(`(${escapedDelimiter})`, 'gi');\n let remaining = str; // 新建变量存储剩余字符串\n\n while ((match = regex.exec(remaining)) !== null) {\n const index = match.index;\n if (index !== 0) {\n result.push(remaining.slice(0, index));\n }\n result.push(match[1]);\n remaining = remaining.slice(index + match[1].length);\n regex.lastIndex = 0;\n }\n if (remaining.length > 0) {\n result.push(remaining);\n }\n return result;\n }\n\n // text是ReactNode时,不处理高亮\n const highlightedText = (text: number | string | React.ReactNode): React.ReactNode => {\n if (highlight && (typeof text === 'string' || typeof text === 'number')) {\n return splitString(text.toString(), highlight).map((part, index) => {\n if (part.toUpperCase() === highlight.toUpperCase()) {\n return (\n <span key={index} style={{ color: '#ffb401' }}>\n {part}\n </span>\n );\n } else {\n return <span key={index}>{part}</span>;\n }\n });\n } else {\n return text;\n }\n };\n\n // 处理宽度值,确保字符串数字能正确转换为带单位的 CSS 值\n const formatWidth = (value: number | string): number | string => {\n if (typeof value === 'string' && /^\\d+$/.test(value)) {\n // 如果是纯数字字符串,添加 px 单位\n return `${value}px`;\n }\n return value;\n };\n\n return (\n <Tooltip\n open={showTooltip}\n title={text}\n placement={placement}\n arrow={arrow}\n destroyOnHidden={true}\n color={color ? color : '#fff'}\n styles={styles ? styles : { body: { color: '#333', fontSize: 12 } }}\n {...(zIndex ? { zIndex } : {})}\n >\n <span\n ref={textRef}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={() => setShowTooltip(false)}\n className={className}\n style={{\n display: 'inline-block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n verticalAlign: 'bottom',\n ...style,\n ...(maxWidth ? { maxWidth: formatWidth(maxWidth) } : { width: formatWidth(width) }),\n }}\n >\n {highlightedText(text)}\n </span>\n </Tooltip>\n );\n};\n\nexport default TextWithTooltip;\n"],
5
+ "mappings": "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",
6
6
  "names": ["text", "React"]
7
7
  }