@yoka-ui/ui 1.0.4 → 1.0.6

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 (260) hide show
  1. package/@Docs-yoka/exports.generated.md +68 -63
  2. package/README.md +44 -15
  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 +2 -2
  8. package/dist/es/business/DrawerPageInfo/index.js.map +2 -2
  9. package/dist/es/business/Editor/index.d.ts +1 -1
  10. package/dist/es/business/Editor/index.js.map +2 -2
  11. package/dist/es/business/Empty/index.js +1 -1
  12. package/dist/es/business/Empty/index.js.map +1 -1
  13. package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.js +2 -2
  14. package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.js.map +2 -2
  15. package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.js +3 -3
  16. package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.js.map +2 -2
  17. package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.js +2 -2
  18. package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.js.map +2 -2
  19. package/dist/es/business/ModCommonFilter/index.d.ts +1 -1
  20. package/dist/es/business/ModCommonFilter/index.js.map +2 -2
  21. package/dist/es/business/YkLoginModule/SmsLoginForm.d.ts +25 -0
  22. package/dist/es/business/YkLoginModule/SmsLoginForm.js +178 -0
  23. package/dist/es/business/YkLoginModule/SmsLoginForm.js.map +7 -0
  24. package/dist/es/business/YkLoginModule/index.d.ts +48 -0
  25. package/dist/es/business/YkLoginModule/index.js +198 -0
  26. package/dist/es/business/YkLoginModule/index.js.map +7 -0
  27. package/dist/es/business/YkLoginModule/styles.module.less +169 -0
  28. package/dist/es/business/YkPorjectSelect/index.d.ts +1 -1
  29. package/dist/es/business/YkPorjectSelect/index.js +2 -2
  30. package/dist/es/business/YkPorjectSelect/index.js.map +2 -2
  31. package/dist/es/business/YkSqlEdit/code-mirror-custom.module.less +154 -0
  32. package/dist/es/business/YkSqlEdit/index.d.ts +20 -0
  33. package/dist/es/business/YkSqlEdit/index.js +180 -0
  34. package/dist/es/business/YkSqlEdit/index.js.map +7 -0
  35. package/dist/es/business/YkSqlEdit/sql-language.d.ts +11 -0
  36. package/dist/es/business/YkSqlEdit/sql-language.js +1460 -0
  37. package/dist/es/business/YkSqlEdit/sql-language.js.map +7 -0
  38. package/dist/es/components/DebounceInput/index.js.map +2 -2
  39. package/dist/es/components/MultipleSelect/index.d.ts +14 -0
  40. package/dist/es/components/MultipleSelect/index.js +1 -1
  41. package/dist/es/components/MultipleSelect/index.js.map +2 -2
  42. package/dist/es/components/RefreshButton/index.js.map +2 -2
  43. package/dist/es/components/SearchWithHistory/index.js +1 -1
  44. package/dist/es/components/SearchWithHistory/index.js.map +2 -2
  45. package/dist/es/components/TextWithToolTip/index.d.ts +1 -1
  46. package/dist/es/components/TextWithToolTip/index.js.map +2 -2
  47. package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.d.ts +1 -24
  48. package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.js +2 -2
  49. package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.js.map +2 -2
  50. package/dist/es/components/TreeTransfer/index.d.ts +1 -24
  51. package/dist/es/components/TreeTransfer/index.js +8 -8
  52. package/dist/es/components/TreeTransfer/index.js.map +2 -2
  53. package/dist/es/components/TreeTransfer/utils/index.d.ts +1 -1
  54. package/dist/es/components/TreeTransfer/utils/index.js.map +2 -2
  55. package/dist/es/components/YkDateRangePicker/index.d.ts +1 -1
  56. package/dist/es/components/YkDateRangePicker/index.js +1 -1
  57. package/dist/es/components/YkDateRangePicker/index.js.map +2 -2
  58. package/dist/es/components/YkDateRangePicker/index.module.less +2 -1
  59. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.d.ts +1 -1
  60. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js +3 -2
  61. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js.map +2 -2
  62. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.d.ts +1 -1
  63. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +60 -9
  64. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +3 -3
  65. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.d.ts +1 -1
  66. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js.map +2 -2
  67. package/dist/es/components/YkRangeDateWithVS/index.d.ts +4 -4
  68. package/dist/es/components/YkRangeDateWithVS/index.js +2 -3
  69. package/dist/es/components/YkRangeDateWithVS/index.js.map +2 -2
  70. package/dist/es/components/YkRangeDateWithVS/index.module.less +23 -4
  71. package/dist/es/components/YkRangeTimeWithRecent/index.d.ts +1 -18
  72. package/dist/es/components/YkRangeTimeWithRecent/index.js +27 -7
  73. package/dist/es/components/YkRangeTimeWithRecent/index.js.map +2 -2
  74. package/dist/es/creative/ArcCheckbox/index.d.ts +12 -0
  75. package/dist/es/creative/ArcCheckbox/index.js +49 -0
  76. package/dist/es/creative/ArcCheckbox/index.js.map +7 -0
  77. package/dist/es/creative/ArcCheckbox/index.module.less +102 -0
  78. package/dist/es/creative/ButtonRadioWithInfo/index.js.map +1 -1
  79. package/dist/es/creative/ButtonWithProgress/index.d.ts +1 -1
  80. package/dist/es/creative/ButtonWithProgress/index.js.map +2 -2
  81. package/dist/es/creative/GlassSegmentedRadio/index.d.ts +24 -0
  82. package/dist/es/creative/GlassSegmentedRadio/index.js +75 -0
  83. package/dist/es/creative/GlassSegmentedRadio/index.js.map +7 -0
  84. package/dist/es/creative/GlassSegmentedRadio/index.module.less +241 -0
  85. package/dist/es/index.d.ts +32 -26
  86. package/dist/es/index.js +90 -82
  87. package/dist/es/index.js.map +2 -2
  88. package/dist/es/index.less +5 -1
  89. package/dist/es/layout/FlexGrid/index.d.ts +1 -1
  90. package/dist/es/layout/FlexGrid/index.js.map +2 -2
  91. package/dist/es/layout/YkContainer/index.js.map +1 -1
  92. package/dist/es/layout/YkDrawer/index.d.ts +1 -1
  93. package/dist/es/layout/YkDrawer/index.js +2 -1
  94. package/dist/es/layout/YkDrawer/index.js.map +2 -2
  95. package/dist/es/ui/LabelSelect/demo.js +1 -1
  96. package/dist/es/ui/LabelSelect/demo.js.map +2 -2
  97. package/dist/es/ui/LabelSelect/index.d.ts +1 -1
  98. package/dist/es/ui/LabelSelect/index.js +1 -1
  99. package/dist/es/ui/LabelSelect/index.js.map +2 -2
  100. package/dist/es/ui/LogicOperator/index.d.ts +1 -1
  101. package/dist/es/ui/LogicOperator/index.js.map +2 -2
  102. package/dist/es/ui/YkButton/index.d.ts +1 -1
  103. package/dist/es/ui/YkButton/index.js.map +2 -2
  104. package/dist/es/ui/YkCard/index.d.ts +1 -1
  105. package/dist/es/ui/YkCard/index.js +1 -1
  106. package/dist/es/ui/YkCard/index.js.map +2 -2
  107. package/dist/es/ui/YkCheckbox/index.d.ts +1 -1
  108. package/dist/es/ui/YkCheckbox/index.js.map +2 -2
  109. package/dist/es/ui/YkDescriptions/index.d.ts +1 -1
  110. package/dist/es/ui/YkDescriptions/index.js.map +2 -2
  111. package/dist/es/ui/YkPagination/index.d.ts +1 -1
  112. package/dist/es/ui/YkPagination/index.js.map +2 -2
  113. package/dist/es/ui/YkRadio/index.d.ts +1 -1
  114. package/dist/es/ui/YkRadio/index.js.map +2 -2
  115. package/dist/es/ui/YkSegmented/index.d.ts +1 -1
  116. package/dist/es/ui/YkSegmented/index.js.map +2 -2
  117. package/dist/es/ui/YkSelect/index.d.ts +1 -1
  118. package/dist/es/ui/YkSelect/index.js.map +2 -2
  119. package/dist/es/ui/YkSpin/index.d.ts +1 -1
  120. package/dist/es/ui/YkSpin/index.js.map +2 -2
  121. package/dist/es/ui/YkStatistic/index.d.ts +1 -1
  122. package/dist/es/ui/YkStatistic/index.js.map +2 -2
  123. package/dist/es/ui/YkSwitch/index.d.ts +1 -1
  124. package/dist/es/ui/YkSwitch/index.js.map +2 -2
  125. package/dist/es/ui/YkTabs/index.d.ts +1 -1
  126. package/dist/es/ui/YkTabs/index.js.map +2 -2
  127. package/dist/es/ui/YkTooltip/index.d.ts +1 -1
  128. package/dist/es/ui/YkTooltip/index.js.map +2 -2
  129. package/dist/es/utils/styleUtils.js.map +2 -2
  130. package/dist/es/utils/ykStorybookDoc.js +1 -1
  131. package/dist/es/utils/ykStorybookDoc.js.map +1 -1
  132. package/dist/lib/business/AiChat/index.js.map +1 -1
  133. package/dist/lib/business/AiChat/intentRecognizer.js.map +1 -1
  134. package/dist/lib/business/AiChat/navigationManager.js +6 -6
  135. package/dist/lib/business/AiChat/navigationManager.js.map +2 -2
  136. package/dist/lib/business/DrawerPageInfo/index.js +1 -1
  137. package/dist/lib/business/DrawerPageInfo/index.js.map +2 -2
  138. package/dist/lib/business/Editor/index.d.ts +1 -1
  139. package/dist/lib/business/Editor/index.js.map +2 -2
  140. package/dist/lib/business/Empty/index.js +1 -1
  141. package/dist/lib/business/Empty/index.js.map +1 -1
  142. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.js +3 -3
  143. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.js.map +2 -2
  144. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.js +4 -4
  145. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.js.map +2 -2
  146. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.js +3 -3
  147. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.js.map +2 -2
  148. package/dist/lib/business/ModCommonFilter/index.d.ts +1 -1
  149. package/dist/lib/business/ModCommonFilter/index.js.map +2 -2
  150. package/dist/lib/business/YkLoginModule/SmsLoginForm.d.ts +25 -0
  151. package/dist/lib/business/YkLoginModule/SmsLoginForm.js +171 -0
  152. package/dist/lib/business/YkLoginModule/SmsLoginForm.js.map +7 -0
  153. package/dist/lib/business/YkLoginModule/index.d.ts +48 -0
  154. package/dist/lib/business/YkLoginModule/index.js +206 -0
  155. package/dist/lib/business/YkLoginModule/index.js.map +7 -0
  156. package/dist/lib/business/YkLoginModule/styles.module.less +169 -0
  157. package/dist/lib/business/YkPorjectSelect/index.d.ts +1 -1
  158. package/dist/lib/business/YkPorjectSelect/index.js +3 -3
  159. package/dist/lib/business/YkPorjectSelect/index.js.map +2 -2
  160. package/dist/lib/business/YkSqlEdit/code-mirror-custom.module.less +154 -0
  161. package/dist/lib/business/YkSqlEdit/index.d.ts +20 -0
  162. package/dist/lib/business/YkSqlEdit/index.js +202 -0
  163. package/dist/lib/business/YkSqlEdit/index.js.map +7 -0
  164. package/dist/lib/business/YkSqlEdit/sql-language.d.ts +11 -0
  165. package/dist/lib/business/YkSqlEdit/sql-language.js +1493 -0
  166. package/dist/lib/business/YkSqlEdit/sql-language.js.map +7 -0
  167. package/dist/lib/components/DebounceInput/index.js.map +2 -2
  168. package/dist/lib/components/MultipleSelect/index.d.ts +14 -0
  169. package/dist/lib/components/MultipleSelect/index.js +1 -1
  170. package/dist/lib/components/MultipleSelect/index.js.map +2 -2
  171. package/dist/lib/components/RefreshButton/index.js.map +2 -2
  172. package/dist/lib/components/SearchWithHistory/index.js +1 -1
  173. package/dist/lib/components/SearchWithHistory/index.js.map +2 -2
  174. package/dist/lib/components/TextWithToolTip/index.d.ts +1 -1
  175. package/dist/lib/components/TextWithToolTip/index.js.map +2 -2
  176. package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.d.ts +1 -24
  177. package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.js +2 -2
  178. package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.js.map +2 -2
  179. package/dist/lib/components/TreeTransfer/index.d.ts +1 -24
  180. package/dist/lib/components/TreeTransfer/index.js +3 -3
  181. package/dist/lib/components/TreeTransfer/index.js.map +2 -2
  182. package/dist/lib/components/TreeTransfer/utils/index.d.ts +1 -1
  183. package/dist/lib/components/TreeTransfer/utils/index.js.map +2 -2
  184. package/dist/lib/components/YkDateRangePicker/index.d.ts +1 -1
  185. package/dist/lib/components/YkDateRangePicker/index.js +1 -1
  186. package/dist/lib/components/YkDateRangePicker/index.js.map +2 -2
  187. package/dist/lib/components/YkDateRangePicker/index.module.less +2 -1
  188. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.d.ts +1 -1
  189. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js +3 -2
  190. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js.map +2 -2
  191. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.d.ts +1 -1
  192. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +59 -8
  193. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +3 -3
  194. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.d.ts +1 -1
  195. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js.map +2 -2
  196. package/dist/lib/components/YkRangeDateWithVS/index.d.ts +4 -4
  197. package/dist/lib/components/YkRangeDateWithVS/index.js +4 -5
  198. package/dist/lib/components/YkRangeDateWithVS/index.js.map +3 -3
  199. package/dist/lib/components/YkRangeDateWithVS/index.module.less +23 -4
  200. package/dist/lib/components/YkRangeTimeWithRecent/index.d.ts +1 -18
  201. package/dist/lib/components/YkRangeTimeWithRecent/index.js +27 -7
  202. package/dist/lib/components/YkRangeTimeWithRecent/index.js.map +2 -2
  203. package/dist/lib/creative/ArcCheckbox/index.d.ts +12 -0
  204. package/dist/lib/creative/ArcCheckbox/index.js +50 -0
  205. package/dist/lib/creative/ArcCheckbox/index.js.map +7 -0
  206. package/dist/lib/creative/ArcCheckbox/index.module.less +102 -0
  207. package/dist/lib/creative/ButtonRadioWithInfo/index.js.map +1 -1
  208. package/dist/lib/creative/ButtonWithProgress/index.d.ts +1 -1
  209. package/dist/lib/creative/ButtonWithProgress/index.js.map +2 -2
  210. package/dist/lib/creative/GlassSegmentedRadio/index.d.ts +24 -0
  211. package/dist/lib/creative/GlassSegmentedRadio/index.js +78 -0
  212. package/dist/lib/creative/GlassSegmentedRadio/index.js.map +7 -0
  213. package/dist/lib/creative/GlassSegmentedRadio/index.module.less +241 -0
  214. package/dist/lib/index.d.ts +32 -26
  215. package/dist/lib/index.js +37 -25
  216. package/dist/lib/index.js.map +2 -2
  217. package/dist/lib/index.less +5 -1
  218. package/dist/lib/layout/FlexGrid/index.d.ts +1 -1
  219. package/dist/lib/layout/FlexGrid/index.js.map +2 -2
  220. package/dist/lib/layout/YkContainer/index.js.map +1 -1
  221. package/dist/lib/layout/YkDrawer/index.d.ts +1 -1
  222. package/dist/lib/layout/YkDrawer/index.js +2 -1
  223. package/dist/lib/layout/YkDrawer/index.js.map +2 -2
  224. package/dist/lib/ui/LabelSelect/demo.js +1 -1
  225. package/dist/lib/ui/LabelSelect/demo.js.map +2 -2
  226. package/dist/lib/ui/LabelSelect/index.d.ts +1 -1
  227. package/dist/lib/ui/LabelSelect/index.js +1 -1
  228. package/dist/lib/ui/LabelSelect/index.js.map +2 -2
  229. package/dist/lib/ui/LogicOperator/index.d.ts +1 -1
  230. package/dist/lib/ui/LogicOperator/index.js.map +2 -2
  231. package/dist/lib/ui/YkButton/index.d.ts +1 -1
  232. package/dist/lib/ui/YkButton/index.js.map +2 -2
  233. package/dist/lib/ui/YkCard/index.d.ts +1 -1
  234. package/dist/lib/ui/YkCard/index.js.map +2 -2
  235. package/dist/lib/ui/YkCheckbox/index.d.ts +1 -1
  236. package/dist/lib/ui/YkCheckbox/index.js.map +2 -2
  237. package/dist/lib/ui/YkDescriptions/index.d.ts +1 -1
  238. package/dist/lib/ui/YkDescriptions/index.js.map +2 -2
  239. package/dist/lib/ui/YkPagination/index.d.ts +1 -1
  240. package/dist/lib/ui/YkPagination/index.js.map +2 -2
  241. package/dist/lib/ui/YkRadio/index.d.ts +1 -1
  242. package/dist/lib/ui/YkRadio/index.js.map +2 -2
  243. package/dist/lib/ui/YkSegmented/index.d.ts +1 -1
  244. package/dist/lib/ui/YkSegmented/index.js.map +2 -2
  245. package/dist/lib/ui/YkSelect/index.d.ts +1 -1
  246. package/dist/lib/ui/YkSelect/index.js.map +2 -2
  247. package/dist/lib/ui/YkSpin/index.d.ts +1 -1
  248. package/dist/lib/ui/YkSpin/index.js.map +2 -2
  249. package/dist/lib/ui/YkStatistic/index.d.ts +1 -1
  250. package/dist/lib/ui/YkStatistic/index.js.map +2 -2
  251. package/dist/lib/ui/YkSwitch/index.d.ts +1 -1
  252. package/dist/lib/ui/YkSwitch/index.js.map +2 -2
  253. package/dist/lib/ui/YkTabs/index.d.ts +1 -1
  254. package/dist/lib/ui/YkTabs/index.js.map +2 -2
  255. package/dist/lib/ui/YkTooltip/index.d.ts +1 -1
  256. package/dist/lib/ui/YkTooltip/index.js.map +2 -2
  257. package/dist/lib/utils/styleUtils.js.map +2 -2
  258. package/dist/lib/utils/ykStorybookDoc.js +1 -1
  259. package/dist/lib/utils/ykStorybookDoc.js.map +1 -1
  260. package/package.json +43 -45
@@ -32,12 +32,12 @@ __export(Content_exports, {
32
32
  default: () => Content_default
33
33
  });
34
34
  module.exports = __toCommonJS(Content_exports);
35
- var import_DebounceInput = __toESM(require("../../../../components/DebounceInput"));
36
- var import_TextWithToolTip = __toESM(require("../../../../components/TextWithToolTip"));
37
35
  var import_antd = require("antd");
38
36
  var import_react = __toESM(require("react"));
39
- var import_react_custom_scrollbars = require("react-custom-scrollbars");
37
+ var import_react_custom_scrollbars_2 = require("react-custom-scrollbars-2");
40
38
  var import_react_virtualized = require("react-virtualized");
39
+ var import_DebounceInput = __toESM(require("../../../../components/DebounceInput"));
40
+ var import_TextWithToolTip = __toESM(require("../../../../components/TextWithToolTip"));
41
41
  var import_empty = __toESM(require("../../assets/images/empty.png"));
42
42
  var import_index_module = __toESM(require("./index.module.less"));
43
43
  var Content = ({
@@ -157,7 +157,7 @@ var Content = ({
157
157
  },
158
158
  "全选"
159
159
  )), /* @__PURE__ */ import_react.default.createElement(
160
- import_react_custom_scrollbars.Scrollbars,
160
+ import_react_custom_scrollbars_2.Scrollbars,
161
161
  {
162
162
  style: { height: 285, width: contentWidth },
163
163
  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/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
  }
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ export type SmsLoginFormApi = {
3
+ sendSms: (payload: Record<string, unknown>) => Promise<{
4
+ code: number;
5
+ msg: string;
6
+ }>;
7
+ };
8
+ declare global {
9
+ interface Window {
10
+ sliderVerify: (element: 'pop' | HTMLElement, success: (res: {
11
+ token: string;
12
+ captchaVerification: string;
13
+ }) => void, options: {
14
+ appKey: string;
15
+ locale?: string;
16
+ }) => void;
17
+ }
18
+ }
19
+ export type SmsLoginFormProps = {
20
+ inputClassName: string;
21
+ api: SmsLoginFormApi;
22
+ appKey: string;
23
+ };
24
+ declare const SmsLogin: React.FC<SmsLoginFormProps>;
25
+ export default SmsLogin;
@@ -0,0 +1,171 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/business/YkLoginModule/SmsLoginForm.tsx
30
+ var SmsLoginForm_exports = {};
31
+ __export(SmsLoginForm_exports, {
32
+ default: () => SmsLoginForm_default
33
+ });
34
+ module.exports = __toCommonJS(SmsLoginForm_exports);
35
+ var import_icons = require("@ant-design/icons");
36
+ var import_pro_form = require("@ant-design/pro-form");
37
+ var import_antd = require("antd");
38
+ var import_react = __toESM(require("react"));
39
+ var import_styles_module = __toESM(require("./styles.module.less"));
40
+ var SmsLogin = ({ inputClassName, api, appKey }) => {
41
+ (0, import_react.useEffect)(() => {
42
+ const link = document.createElement("link");
43
+ link.href = "https://captchaoss.sanguosha.com/library/captcha/0.0.5/lib/index.css";
44
+ link.rel = "stylesheet";
45
+ document.head.appendChild(link);
46
+ const script = document.createElement("script");
47
+ script.src = "https://captchaoss.sanguosha.com/library/captcha/0.0.5/lib/index.js";
48
+ document.body.appendChild(script);
49
+ return () => {
50
+ document.head.removeChild(link);
51
+ document.body.removeChild(script);
52
+ };
53
+ }, []);
54
+ const [phone, setPhone] = (0, import_react.useState)("");
55
+ const [countdown, setCountdown] = (0, import_react.useState)(0);
56
+ const [sendStatus, setSendStatus] = (0, import_react.useState)(false);
57
+ const disableBtn = countdown > 0 || phone.length !== 11;
58
+ const sendVerificationCode = async () => {
59
+ try {
60
+ const phoneNumber = phone;
61
+ if (!phoneNumber) {
62
+ import_antd.message.error("请输入手机号");
63
+ return;
64
+ }
65
+ if (!/^1\d{10}$/.test(phoneNumber)) {
66
+ import_antd.message.error("请输入正确的手机号格式");
67
+ return;
68
+ }
69
+ if (!appKey) {
70
+ import_antd.message.error("验证码配置缺失,请联系管理员(appKey)");
71
+ return;
72
+ }
73
+ window.sliderVerify(
74
+ "pop",
75
+ (captchaRes) => {
76
+ void api.sendSms({ phone: phoneNumber, ...captchaRes }).then((sendRes) => {
77
+ if (sendRes.code !== 200) {
78
+ import_antd.message.error(sendRes.msg);
79
+ return;
80
+ }
81
+ setSendStatus(true);
82
+ import_antd.message.success("验证码发送成功");
83
+ setCountdown(60);
84
+ const timer = setInterval(() => {
85
+ setCountdown((prevCountdown) => {
86
+ if (prevCountdown <= 1) {
87
+ clearInterval(timer);
88
+ return 0;
89
+ }
90
+ return prevCountdown - 1;
91
+ });
92
+ }, 1e3);
93
+ }).catch(() => {
94
+ import_antd.message.error("验证码发送失败,请稍后再试");
95
+ return;
96
+ });
97
+ },
98
+ {
99
+ appKey
100
+ }
101
+ );
102
+ } catch {
103
+ import_antd.message.error("发送验证码失败,请稍后再试");
104
+ }
105
+ };
106
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(
107
+ import_pro_form.ProFormText,
108
+ {
109
+ className: inputClassName,
110
+ name: "phone",
111
+ fieldProps: {
112
+ size: "large",
113
+ prefix: /* @__PURE__ */ import_react.default.createElement(import_icons.MobileOutlined, null),
114
+ onChange: (e) => {
115
+ setPhone(e.target.value);
116
+ }
117
+ },
118
+ placeholder: "请输入手机号",
119
+ validateTrigger: "onBlur",
120
+ rules: [
121
+ {
122
+ required: true,
123
+ validator(rule, value, _callback) {
124
+ if (!value) {
125
+ return Promise.reject("手机号是必填项!");
126
+ }
127
+ if (!/^1\d{10}$/.test(value)) {
128
+ return Promise.reject("请输入正确的手机号格式");
129
+ }
130
+ return Promise.resolve();
131
+ }
132
+ }
133
+ ]
134
+ }
135
+ ), /* @__PURE__ */ import_react.default.createElement(
136
+ import_pro_form.ProFormText,
137
+ {
138
+ className: inputClassName,
139
+ name: "code",
140
+ disabled: !sendStatus,
141
+ fieldProps: {
142
+ size: "large",
143
+ prefix: /* @__PURE__ */ import_react.default.createElement(import_icons.LockOutlined, null),
144
+ suffix: /* @__PURE__ */ import_react.default.createElement(
145
+ import_antd.Button,
146
+ {
147
+ className: import_styles_module.default.captchaBtn,
148
+ style: { fontSize: 16 },
149
+ onClick: (e) => {
150
+ e.preventDefault();
151
+ e.stopPropagation();
152
+ countdown === 0 && void sendVerificationCode();
153
+ },
154
+ type: "link",
155
+ disabled: disableBtn
156
+ },
157
+ countdown > 0 ? `${countdown}秒后重新获取` : "获取验证码"
158
+ )
159
+ },
160
+ placeholder: "请输入验证码",
161
+ rules: [
162
+ {
163
+ required: true,
164
+ message: "验证码是必填项!"
165
+ }
166
+ ]
167
+ }
168
+ ));
169
+ };
170
+ var SmsLoginForm_default = SmsLogin;
171
+ //# sourceMappingURL=SmsLoginForm.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/business/YkLoginModule/SmsLoginForm.tsx"],
4
+ "sourcesContent": ["import { LockOutlined, MobileOutlined } from '@ant-design/icons';\nimport { ProFormText } from '@ant-design/pro-form';\nimport { Button, message } from 'antd';\nimport React, { useEffect, useState } from 'react';\nimport styles from './styles.module.less';\n\nexport type SmsLoginFormApi = {\n sendSms: (payload: Record<string, unknown>) => Promise<{ code: number; msg: string }>;\n};\n\ndeclare global {\n interface Window {\n sliderVerify: (\n element: 'pop' | HTMLElement,\n success: (res: { token: string; captchaVerification: string }) => void,\n options: { appKey: string; locale?: string },\n ) => void;\n }\n}\n\nexport type SmsLoginFormProps = {\n inputClassName: string;\n api: SmsLoginFormApi;\n appKey: string;\n};\n\nconst SmsLogin: React.FC<SmsLoginFormProps> = ({ inputClassName, api, appKey }) => {\n useEffect(() => {\n const link = document.createElement('link');\n link.href = 'https://captchaoss.sanguosha.com/library/captcha/0.0.5/lib/index.css';\n link.rel = 'stylesheet';\n document.head.appendChild(link);\n\n const script = document.createElement('script');\n script.src = 'https://captchaoss.sanguosha.com/library/captcha/0.0.5/lib/index.js';\n document.body.appendChild(script);\n return () => {\n document.head.removeChild(link);\n document.body.removeChild(script);\n };\n }, []);\n\n const [phone, setPhone] = useState<string>('');\n const [countdown, setCountdown] = useState<number>(0);\n const [sendStatus, setSendStatus] = useState<boolean>(false);\n const disableBtn = countdown > 0 || phone.length !== 11;\n\n const sendVerificationCode = async () => {\n try {\n const phoneNumber = phone;\n if (!phoneNumber) {\n message.error('请输入手机号');\n return;\n }\n\n if (!/^1\\d{10}$/.test(phoneNumber)) {\n message.error('请输入正确的手机号格式');\n return;\n }\n if (!appKey) {\n message.error('验证码配置缺失,请联系管理员(appKey)');\n return;\n }\n window.sliderVerify(\n 'pop',\n (captchaRes: Record<string, unknown>) => {\n void api\n .sendSms({ phone: phoneNumber, ...captchaRes })\n .then((sendRes) => {\n if (sendRes.code !== 200) {\n message.error(sendRes.msg);\n return;\n }\n setSendStatus(true);\n message.success('验证码发送成功');\n setCountdown(60);\n const timer = setInterval(() => {\n setCountdown((prevCountdown) => {\n if (prevCountdown <= 1) {\n clearInterval(timer);\n return 0;\n }\n return prevCountdown - 1;\n });\n }, 1000);\n })\n .catch(() => {\n message.error('验证码发送失败,请稍后再试');\n return;\n });\n },\n {\n appKey,\n },\n );\n } catch {\n message.error('发送验证码失败,请稍后再试');\n }\n };\n\n return (\n <>\n <ProFormText\n className={inputClassName}\n name='phone'\n fieldProps={{\n size: 'large',\n prefix: <MobileOutlined />,\n onChange: (e) => {\n setPhone(e.target.value);\n },\n }}\n placeholder='请输入手机号'\n validateTrigger='onBlur'\n rules={[\n {\n required: true,\n validator(rule, value, _callback) {\n if (!value) {\n return Promise.reject('手机号是必填项!');\n }\n if (!/^1\\d{10}$/.test(value)) {\n return Promise.reject('请输入正确的手机号格式');\n }\n return Promise.resolve();\n },\n },\n ]}\n />\n <ProFormText\n className={inputClassName}\n name='code'\n disabled={!sendStatus}\n fieldProps={{\n size: 'large',\n prefix: <LockOutlined />,\n suffix: (\n <Button\n className={styles.captchaBtn}\n style={{ fontSize: 16 }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n countdown === 0 && void sendVerificationCode();\n }}\n type='link'\n disabled={disableBtn}\n >\n {countdown > 0 ? `${countdown}秒后重新获取` : '获取验证码'}\n </Button>\n ),\n }}\n placeholder='请输入验证码'\n rules={[\n {\n required: true,\n message: '验证码是必填项!',\n },\n ]}\n />\n </>\n );\n};\n\nexport default SmsLogin;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "styles"]
7
+ }
@@ -0,0 +1,48 @@
1
+ import React from 'react';
2
+ import { type SmsLoginFormApi } from './SmsLoginForm';
3
+ export type LoginType = 'qrcode' | 'sms';
4
+ export type LoginTabItem = {
5
+ key: LoginType;
6
+ label: React.ReactNode;
7
+ };
8
+ export type QrcodeApi = {
9
+ getQrcode: () => Promise<{
10
+ qrcode: string;
11
+ url: string;
12
+ }>;
13
+ scanLogin: (qrcode: string) => Promise<{
14
+ code: number;
15
+ data?: {
16
+ status?: number;
17
+ msg?: string;
18
+ };
19
+ }>;
20
+ };
21
+ export type LoginModuleProps = {
22
+ title: React.ReactNode;
23
+ tabs: LoginTabItem[];
24
+ defaultLoginType: LoginType;
25
+ containerStyle?: React.CSSProperties;
26
+ actions?: React.ReactNode | ((loginType: LoginType) => React.ReactNode);
27
+ className?: string;
28
+ formClassName?: string;
29
+ tabsClassName?: string;
30
+ inputClassName?: string;
31
+ qrcodeClassName?: string;
32
+ qrcodeBoxClassName?: string;
33
+ onFinish: (values: Record<string, unknown>) => Promise<void>;
34
+ qrcode?: {
35
+ api: QrcodeApi;
36
+ icon: string;
37
+ iconSize?: number;
38
+ size?: number;
39
+ wrapStyle?: React.CSSProperties;
40
+ onSuccess: () => void | Promise<void>;
41
+ };
42
+ sms?: {
43
+ api: SmsLoginFormApi;
44
+ appKey: string;
45
+ };
46
+ };
47
+ declare const LoginModule: React.FC<LoginModuleProps>;
48
+ export default LoginModule;