@para-ui/core 5.0.0-beta.12 → 5.0.0-beta.14

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 (565) hide show
  1. package/AGENTS.md +315 -0
  2. package/AlignBox/component.json +89 -0
  3. package/Anchor/component.json +130 -0
  4. package/Argv/component.json +216 -0
  5. package/AutoBox/component.json +133 -0
  6. package/AutoButton/component.json +109 -0
  7. package/AutoTips/component.json +121 -0
  8. package/Badge/component.json +92 -0
  9. package/Breadcrumbs/component.json +142 -0
  10. package/Button/component.json +168 -0
  11. package/ButtonGroup/component.json +132 -0
  12. package/Card/component.json +162 -0
  13. package/Carousel/component.json +142 -0
  14. package/Cascader/component.json +196 -0
  15. package/Checkbox/component.json +138 -0
  16. package/CheckboxGroup/component.json +152 -0
  17. package/CodeEditor/component.json +189 -0
  18. package/Collapse/component.json +166 -0
  19. package/CollapseBox/component.json +84 -0
  20. package/CollapseLayout/component.json +155 -0
  21. package/ColorPicker/component.json +142 -0
  22. package/ComboSelect/component.json +181 -0
  23. package/Container/component.json +111 -0
  24. package/ContentBox/component.json +81 -0
  25. package/CopyText/component.json +118 -0
  26. package/CycleSelector/component.json +98 -0
  27. package/DatePicker/component.json +192 -0
  28. package/Descriptions/component.json +142 -0
  29. package/Desktop/component.json +171 -0
  30. package/DragVerify/component.json +114 -0
  31. package/Drawer/component.json +200 -0
  32. package/Dropdown/component.json +147 -0
  33. package/DynamicMultiBox/component.json +278 -0
  34. package/Empty/component.json +123 -0
  35. package/FieldForm/component.json +196 -0
  36. package/Form/component.json +161 -0
  37. package/FormItem/component.json +171 -0
  38. package/FunctionModal/component.json +197 -0
  39. package/Help/component.json +118 -0
  40. package/HelperText/component.json +126 -0
  41. package/Image/component.json +165 -0
  42. package/InputCode/component.json +191 -0
  43. package/InputLang/component.json +205 -0
  44. package/InputNumber/component.json +162 -0
  45. package/Label/component.json +126 -0
  46. package/Loading/component.json +91 -0
  47. package/Menu/component.json +180 -0
  48. package/Message/component.json +246 -0
  49. package/Modal/component.json +277 -0
  50. package/MultiBox/component.json +216 -0
  51. package/Notification/component.json +184 -0
  52. package/OperateBtn/component.json +134 -0
  53. package/PageHeader/component.json +112 -0
  54. package/Pagination/component.json +181 -0
  55. package/PasswordRules/component.json +105 -0
  56. package/PopConfirm/component.json +227 -0
  57. package/PopMenu/component.json +131 -0
  58. package/Popover/component.json +165 -0
  59. package/Progress/component.json +161 -0
  60. package/Prompt/component.json +144 -0
  61. package/Querying/component.json +96 -0
  62. package/QuickReply/component.json +129 -0
  63. package/Radio/component.json +136 -0
  64. package/RadioGroup/component.json +149 -0
  65. package/RangeInput/component.json +198 -0
  66. package/Result/component.json +104 -0
  67. package/ScrollBar/component.json +115 -0
  68. package/Search/component.json +177 -0
  69. package/Select/component.json +244 -0
  70. package/SelectInput/component.json +184 -0
  71. package/Selector/component.json +203 -0
  72. package/SelectorPicker/component.json +179 -0
  73. package/SingleBox/component.json +151 -0
  74. package/Slider/component.json +181 -0
  75. package/SortBox/component.json +108 -0
  76. package/Status/component.json +104 -0
  77. package/Stepper/component.json +129 -0
  78. package/Switch/component.json +207 -0
  79. package/Table/component.json +547 -0
  80. package/Tabs/component.json +227 -0
  81. package/Tag/component.json +221 -0
  82. package/TextEditor/component.json +186 -0
  83. package/TextField/component.json +290 -0
  84. package/TimePicker/component.json +176 -0
  85. package/Timeline/component.json +110 -0
  86. package/Title/component.json +156 -0
  87. package/ToggleButton/component.json +153 -0
  88. package/Tooltip/component.json +176 -0
  89. package/Transfer/component.json +157 -0
  90. package/Tree/component.json +512 -0
  91. package/Upload/component.json +450 -0
  92. package/ai-workflows/01-crud-list-multi-drawer.md +278 -0
  93. package/ai-workflows/02-rbac-operation-buttons.md +290 -0
  94. package/ai-workflows/03-complex-form-async-cascade.md +350 -0
  95. package/ai-workflows/04-array-field-form.md +281 -0
  96. package/ai-workflows/05-popconfirm-async-message-queue.md +333 -0
  97. package/ai-workflows/06-modal-drawer-form-workflow.md +385 -0
  98. package/ai-workflows/07-search-filter-table-trio.md +387 -0
  99. package/ai-workflows/08-table-advanced-features.md +365 -0
  100. package/ai-workflows/09-batch-operation-export-progress.md +367 -0
  101. package/ai-workflows/10-cross-component-state-coordination.md +412 -0
  102. package/codemods/modal-onCancel-to-onDismiss.js +69 -0
  103. package/es/AlignBox/component.json +89 -0
  104. package/es/AlignBox/index.css +1 -1
  105. package/es/AlignBox/index.d.ts +6 -2
  106. package/es/AlignBox/index.js +1 -1
  107. package/es/AlignBox/style/index.css +1 -1
  108. package/es/Anchor/anchorMenu/index.d.ts +2 -1
  109. package/es/Anchor/anchorMenu/index.js +36 -33
  110. package/es/Anchor/component.json +130 -0
  111. package/es/Anchor/index.js +50 -47
  112. package/es/Anchor/type.d.ts +8 -4
  113. package/es/Argv/component.json +216 -0
  114. package/es/Argv/index.d.ts +5 -6
  115. package/es/AutoBox/component.json +133 -0
  116. package/es/AutoBox/index.d.ts +3 -3
  117. package/es/AutoBox/index.js +1 -1
  118. package/es/AutoBox/protal.d.ts +2 -2
  119. package/es/AutoBox/protal.js +32 -29
  120. package/es/AutoButton/component.json +109 -0
  121. package/es/AutoButton/index.js +1 -1
  122. package/es/AutoTips/autoTipsMultiline/index.d.ts +1 -1
  123. package/es/AutoTips/autoTipsMultiline/index.js +1 -1
  124. package/es/AutoTips/component.json +121 -0
  125. package/es/Badge/component.json +92 -0
  126. package/es/Breadcrumbs/component.json +142 -0
  127. package/es/Breadcrumbs/index.js +1 -1
  128. package/es/Button/SplitButton.d.ts +2 -2
  129. package/es/Button/component.json +168 -0
  130. package/es/Button/index.js +44 -44
  131. package/es/ButtonGroup/component.json +132 -0
  132. package/es/ButtonGroup/index.d.ts +1 -1
  133. package/es/Card/component.json +162 -0
  134. package/es/Card/index.d.ts +2 -2
  135. package/es/Card/index.js +2 -2
  136. package/es/Carousel/component.json +142 -0
  137. package/es/Carousel/index.d.ts +1 -1
  138. package/es/Cascader/Cascader.js +188 -180
  139. package/es/Cascader/component.json +196 -0
  140. package/es/Cascader/hooks/useEntities.js +7 -7
  141. package/es/Cascader/interface.d.ts +1 -0
  142. package/es/Cascader/utils/commonUtil.d.ts +1 -1
  143. package/es/Cascader/utils/commonUtil.js +16 -16
  144. package/es/Cascader/utils/treeUtil.d.ts +14 -5
  145. package/es/Cascader/utils/treeUtil.js +1 -1
  146. package/es/Checkbox/component.json +138 -0
  147. package/es/CheckboxGroup/component.json +152 -0
  148. package/es/CodeEditor/component.json +189 -0
  149. package/es/CodeEditor/index.d.ts +10 -9
  150. package/es/Collapse/component.json +166 -0
  151. package/es/Collapse/index.d.ts +1 -1
  152. package/es/Collapse/index.js +41 -33
  153. package/es/CollapseBox/component.json +84 -0
  154. package/es/CollapseLayout/component.json +155 -0
  155. package/es/ColorPicker/component.json +142 -0
  156. package/es/ComboSelect/component.json +181 -0
  157. package/es/ComboSelect/index.js +299 -287
  158. package/es/ComboSelect/interface.d.ts +6 -3
  159. package/es/ComboSelect/utils.d.ts +3 -3
  160. package/es/ComboSelect/utils.js +1 -1
  161. package/es/Container/component.json +111 -0
  162. package/es/ContentBox/component.json +81 -0
  163. package/es/CopyText/component.json +118 -0
  164. package/es/CycleSelector/component.json +98 -0
  165. package/es/CycleSelector/index.js +14 -13
  166. package/es/DatePicker/component.json +192 -0
  167. package/es/DatePicker/generatePicker/generateRangePicker.d.ts +0 -8
  168. package/es/DatePicker/generatePicker/generateRangePicker.js +73 -65
  169. package/es/DatePicker/generatePicker/generateSinglePicker.js +1 -1
  170. package/es/DatePicker/generatePicker/index.d.ts +11 -4
  171. package/es/Descriptions/component.json +142 -0
  172. package/es/Descriptions/index.d.ts +1 -1
  173. package/es/Desktop/component.json +171 -0
  174. package/es/DragVerify/component.json +114 -0
  175. package/es/DragVerify/index.js +19 -19
  176. package/es/Drawer/component.json +200 -0
  177. package/es/Drawer/index.js +86 -86
  178. package/es/Drawer/interface.d.ts +1 -1
  179. package/es/Drawer/util.d.ts +1 -6
  180. package/es/Drawer/util.js +9 -6
  181. package/es/Dropdown/component.json +147 -0
  182. package/es/DynamicMultiBox/component.json +278 -0
  183. package/es/DynamicMultiBox/formItem.d.ts +1 -1
  184. package/es/DynamicMultiBox/rowForm.d.ts +2 -2
  185. package/es/Empty/component.json +123 -0
  186. package/es/Empty/index.css +1 -1
  187. package/es/Empty/index.d.ts +2 -2
  188. package/es/Empty/index.js +27 -26
  189. package/es/Empty/style/index.css +1 -1
  190. package/es/FieldForm/FieldFormItem/MemoInput.d.ts +2 -2
  191. package/es/FieldForm/FieldFormItem/index.d.ts +6 -6
  192. package/es/FieldForm/Form.d.ts +2 -2
  193. package/es/FieldForm/FormList.d.ts +2 -2
  194. package/es/FieldForm/component.json +196 -0
  195. package/es/FieldForm/context.d.ts +5 -1
  196. package/es/FieldForm/context.js +2 -2
  197. package/es/FieldForm/hooks/useForm.d.ts +4 -3
  198. package/es/FieldForm/hooks/useFormInstance.d.ts +1 -1
  199. package/es/FieldForm/hooks/useFormItemStatus.d.ts +9 -5
  200. package/es/FieldForm/hooks/useFormItemStatus.js +2 -2
  201. package/es/FieldForm/hooks/useItemRef.d.ts +1 -1
  202. package/es/FieldForm/hooks/useItemRef.js +6 -6
  203. package/es/Form/component.json +161 -0
  204. package/es/Form/index.d.ts +52 -49
  205. package/es/FormItem/compoments/defaultCompoments/index.d.ts +5 -5
  206. package/es/FormItem/compoments/defaultCompoments/index.js +12 -11
  207. package/es/FormItem/compoments/formCheckboxGroup/index.d.ts +2 -2
  208. package/es/FormItem/compoments/formFile/index.js +8 -8
  209. package/es/FormItem/compoments/formRadioGroup/index.d.ts +1 -1
  210. package/es/FormItem/compoments/formSelect/index.d.ts +1 -1
  211. package/es/FormItem/component.json +171 -0
  212. package/es/FormItem/index.d.ts +5 -5
  213. package/es/FormItem/index.js +23 -23
  214. package/es/FormItem/itemType.js +1 -1
  215. package/es/FunctionModal/component.json +197 -0
  216. package/es/FunctionModal/dialog.d.ts +1 -1
  217. package/es/FunctionModal/modalContext.d.ts +4 -1
  218. package/es/Help/component.json +118 -0
  219. package/es/HelperText/component.json +126 -0
  220. package/es/Image/component.json +165 -0
  221. package/es/InputCode/component.json +191 -0
  222. package/es/InputCode/index.d.ts +2 -2
  223. package/es/InputLang/component.json +205 -0
  224. package/es/InputLang/index.js +1 -1
  225. package/es/InputNumber/component.json +162 -0
  226. package/es/Label/component.json +126 -0
  227. package/es/Label/index.d.ts +2 -2
  228. package/es/Loading/component.json +91 -0
  229. package/es/Menu/component.json +180 -0
  230. package/es/Message/component.json +246 -0
  231. package/es/Message/index.d.ts +2 -2
  232. package/es/Message/index.js +2 -2
  233. package/es/Modal/Confirm/index.d.ts +1 -1
  234. package/es/Modal/Confirm/index.js +81 -75
  235. package/es/Modal/component.json +277 -0
  236. package/es/Modal/index.d.ts +97 -6
  237. package/es/Modal/index.js +174 -122
  238. package/es/Modal/interface.d.ts +1 -0
  239. package/es/MultiBox/component.json +216 -0
  240. package/es/MultiBox/index.js +19 -14
  241. package/es/Notification/component.json +184 -0
  242. package/es/OperateBtn/component.json +134 -0
  243. package/es/OperateBtn/index.d.ts +3 -3
  244. package/es/PageHeader/component.json +112 -0
  245. package/es/Pagination/component.json +181 -0
  246. package/es/Pagination/index.js +15 -15
  247. package/es/PasswordRules/component.json +105 -0
  248. package/es/PasswordRules/index.d.ts +4 -4
  249. package/es/PopConfirm/component.json +227 -0
  250. package/es/PopConfirm/index.d.ts +1 -1
  251. package/es/PopConfirm/index.js +1 -1
  252. package/es/PopMenu/component.json +131 -0
  253. package/es/PopMenu/hooks.d.ts +1 -1
  254. package/es/PopMenu/index.js +8 -8
  255. package/es/Popover/component.json +165 -0
  256. package/es/Popover/index.js +1 -1
  257. package/es/Progress/component.json +161 -0
  258. package/es/Prompt/component.json +144 -0
  259. package/es/Querying/component.json +96 -0
  260. package/es/Querying/index.css +1 -1
  261. package/es/Querying/index.d.ts +2 -2
  262. package/es/Querying/index.js +20 -19
  263. package/es/Querying/style/index.css +1 -1
  264. package/es/QuickReply/component.json +129 -0
  265. package/es/QuickReply/index.d.ts +1 -1
  266. package/es/Radio/component.json +136 -0
  267. package/es/RadioGroup/component.json +149 -0
  268. package/es/RangeInput/component.json +198 -0
  269. package/es/RangeInput/index.js +1 -1
  270. package/es/Result/component.json +104 -0
  271. package/es/ScrollBar/component.json +115 -0
  272. package/es/Search/component.json +177 -0
  273. package/es/Search/index.d.ts +1 -1
  274. package/es/Select/component.json +244 -0
  275. package/es/Select/index.js +113 -113
  276. package/es/SelectInput/component.json +184 -0
  277. package/es/Selector/component.json +203 -0
  278. package/es/Selector/index.js +28 -27
  279. package/es/Selector/interface.d.ts +1 -1
  280. package/es/Selector/selectorMain/index.js +2 -2
  281. package/es/Selector/selectorNode/index.js +1 -1
  282. package/es/Selector/util.d.ts +2 -2
  283. package/es/SelectorPicker/component.json +179 -0
  284. package/es/SelectorPicker/index.d.ts +5 -5
  285. package/es/SelectorPicker/index.js +15 -15
  286. package/es/SingleBox/component.json +151 -0
  287. package/es/SingleBox/index.d.ts +2 -2
  288. package/es/Slider/component.json +181 -0
  289. package/es/SortBox/component.json +108 -0
  290. package/es/Status/component.json +104 -0
  291. package/es/Stepper/component.json +129 -0
  292. package/es/Stepper/index.d.ts +2 -2
  293. package/es/Switch/component.json +207 -0
  294. package/es/Switch/index.css +1 -1
  295. package/es/Switch/index.d.ts +3 -2
  296. package/es/Switch/index.js +60 -59
  297. package/es/Switch/style/index.css +1 -1
  298. package/es/Table/component.json +547 -0
  299. package/es/Table/index.d.ts +2 -2
  300. package/es/Table/index.js +414 -414
  301. package/es/Table/interface.d.ts +6 -0
  302. package/es/Tabs/component.json +227 -0
  303. package/es/Tag/component.json +221 -0
  304. package/es/Tag/index.css +1 -1
  305. package/es/Tag/index.d.ts +1 -1
  306. package/es/Tag/index.js +20 -20
  307. package/es/Tag/style/index.css +1 -1
  308. package/es/TextEditor/component.json +186 -0
  309. package/es/TextEditor/index.d.ts +5 -5
  310. package/es/TextField/component.json +290 -0
  311. package/es/TextField/index.d.ts +2 -2
  312. package/es/TimePicker/component.json +176 -0
  313. package/es/Timeline/component.json +110 -0
  314. package/es/Title/component.json +156 -0
  315. package/es/ToggleButton/component.json +153 -0
  316. package/es/Tooltip/component.json +176 -0
  317. package/es/Tooltip/index.js +74 -63
  318. package/es/Tooltip/interface.d.ts +14 -1
  319. package/es/Tooltip/utils.js +6 -6
  320. package/es/Transfer/component.json +157 -0
  321. package/es/Tree/component.json +512 -0
  322. package/es/Upload/component.json +450 -0
  323. package/es/Utils/type.d.ts +0 -2
  324. package/es/index.d.ts +2 -0
  325. package/es/index.js +1 -1
  326. package/es/locale/en_US.d.ts +361 -0
  327. package/es/locale/en_US.js +364 -0
  328. package/es/locale/index.d.ts +1 -723
  329. package/es/locale/index2.js +10 -0
  330. package/es/locale/zh_CN.d.ts +361 -0
  331. package/es/locale/zh_CN.js +364 -0
  332. package/lib/AlignBox/component.json +89 -0
  333. package/lib/AlignBox/index.css +1 -1
  334. package/lib/AlignBox/index.d.ts +6 -2
  335. package/lib/AlignBox/index.js +1 -1
  336. package/lib/AlignBox/style/index.css +1 -1
  337. package/lib/Anchor/anchorMenu/index.d.ts +2 -1
  338. package/lib/Anchor/anchorMenu/index.js +1 -1
  339. package/lib/Anchor/component.json +130 -0
  340. package/lib/Anchor/index.js +1 -1
  341. package/lib/Anchor/type.d.ts +8 -4
  342. package/lib/Argv/component.json +216 -0
  343. package/lib/Argv/index.d.ts +5 -6
  344. package/lib/AutoBox/component.json +133 -0
  345. package/lib/AutoBox/index.d.ts +3 -3
  346. package/lib/AutoBox/index.js +1 -1
  347. package/lib/AutoBox/protal.d.ts +2 -2
  348. package/lib/AutoBox/protal.js +1 -1
  349. package/lib/AutoButton/component.json +109 -0
  350. package/lib/AutoButton/index.js +1 -1
  351. package/lib/AutoTips/autoTipsMultiline/index.d.ts +1 -1
  352. package/lib/AutoTips/autoTipsMultiline/index.js +1 -1
  353. package/lib/AutoTips/component.json +121 -0
  354. package/lib/Badge/component.json +92 -0
  355. package/lib/Breadcrumbs/component.json +142 -0
  356. package/lib/Breadcrumbs/index.js +1 -1
  357. package/lib/Button/SplitButton.d.ts +2 -2
  358. package/lib/Button/component.json +168 -0
  359. package/lib/Button/index.js +1 -1
  360. package/lib/ButtonGroup/component.json +132 -0
  361. package/lib/ButtonGroup/index.d.ts +1 -1
  362. package/lib/Card/component.json +162 -0
  363. package/lib/Card/index.d.ts +2 -2
  364. package/lib/Card/index.js +1 -1
  365. package/lib/Carousel/component.json +142 -0
  366. package/lib/Carousel/index.d.ts +1 -1
  367. package/lib/Cascader/Cascader.js +1 -1
  368. package/lib/Cascader/component.json +196 -0
  369. package/lib/Cascader/hooks/useEntities.js +1 -1
  370. package/lib/Cascader/interface.d.ts +1 -0
  371. package/lib/Cascader/utils/commonUtil.d.ts +1 -1
  372. package/lib/Cascader/utils/commonUtil.js +1 -1
  373. package/lib/Cascader/utils/treeUtil.d.ts +14 -5
  374. package/lib/Cascader/utils/treeUtil.js +1 -1
  375. package/lib/Checkbox/component.json +138 -0
  376. package/lib/CheckboxGroup/component.json +152 -0
  377. package/lib/CodeEditor/component.json +189 -0
  378. package/lib/CodeEditor/index.d.ts +10 -9
  379. package/lib/Collapse/component.json +166 -0
  380. package/lib/Collapse/index.d.ts +1 -1
  381. package/lib/Collapse/index.js +1 -1
  382. package/lib/CollapseBox/component.json +84 -0
  383. package/lib/CollapseLayout/component.json +155 -0
  384. package/lib/ColorPicker/component.json +142 -0
  385. package/lib/ComboSelect/component.json +181 -0
  386. package/lib/ComboSelect/index.js +1 -1
  387. package/lib/ComboSelect/interface.d.ts +6 -3
  388. package/lib/ComboSelect/utils.d.ts +3 -3
  389. package/lib/ComboSelect/utils.js +1 -1
  390. package/lib/Container/component.json +111 -0
  391. package/lib/ContentBox/component.json +81 -0
  392. package/lib/CopyText/component.json +118 -0
  393. package/lib/CycleSelector/component.json +98 -0
  394. package/lib/CycleSelector/index.js +1 -1
  395. package/lib/DatePicker/component.json +192 -0
  396. package/lib/DatePicker/generatePicker/generateRangePicker.d.ts +0 -8
  397. package/lib/DatePicker/generatePicker/generateRangePicker.js +1 -1
  398. package/lib/DatePicker/generatePicker/generateSinglePicker.js +1 -1
  399. package/lib/DatePicker/generatePicker/index.d.ts +11 -4
  400. package/lib/Descriptions/component.json +142 -0
  401. package/lib/Descriptions/index.d.ts +1 -1
  402. package/lib/Desktop/component.json +171 -0
  403. package/lib/DragVerify/component.json +114 -0
  404. package/lib/DragVerify/index.js +1 -1
  405. package/lib/Drawer/component.json +200 -0
  406. package/lib/Drawer/index.js +1 -1
  407. package/lib/Drawer/interface.d.ts +1 -1
  408. package/lib/Drawer/util.d.ts +1 -6
  409. package/lib/Drawer/util.js +1 -1
  410. package/lib/Dropdown/component.json +147 -0
  411. package/lib/DynamicMultiBox/component.json +278 -0
  412. package/lib/DynamicMultiBox/formItem.d.ts +1 -1
  413. package/lib/DynamicMultiBox/rowForm.d.ts +2 -2
  414. package/lib/Empty/component.json +123 -0
  415. package/lib/Empty/index.css +1 -1
  416. package/lib/Empty/index.d.ts +2 -2
  417. package/lib/Empty/index.js +1 -1
  418. package/lib/Empty/style/index.css +1 -1
  419. package/lib/FieldForm/FieldFormItem/MemoInput.d.ts +2 -2
  420. package/lib/FieldForm/FieldFormItem/index.d.ts +6 -6
  421. package/lib/FieldForm/Form.d.ts +2 -2
  422. package/lib/FieldForm/FormList.d.ts +2 -2
  423. package/lib/FieldForm/component.json +196 -0
  424. package/lib/FieldForm/context.d.ts +5 -1
  425. package/lib/FieldForm/context.js +1 -1
  426. package/lib/FieldForm/hooks/useForm.d.ts +4 -3
  427. package/lib/FieldForm/hooks/useFormInstance.d.ts +1 -1
  428. package/lib/FieldForm/hooks/useFormItemStatus.d.ts +9 -5
  429. package/lib/FieldForm/hooks/useFormItemStatus.js +1 -1
  430. package/lib/FieldForm/hooks/useItemRef.d.ts +1 -1
  431. package/lib/FieldForm/hooks/useItemRef.js +1 -1
  432. package/lib/Form/component.json +161 -0
  433. package/lib/Form/index.d.ts +52 -49
  434. package/lib/FormItem/compoments/defaultCompoments/index.d.ts +5 -5
  435. package/lib/FormItem/compoments/defaultCompoments/index.js +1 -1
  436. package/lib/FormItem/compoments/formCheckboxGroup/index.d.ts +2 -2
  437. package/lib/FormItem/compoments/formFile/index.js +1 -1
  438. package/lib/FormItem/compoments/formRadioGroup/index.d.ts +1 -1
  439. package/lib/FormItem/compoments/formSelect/index.d.ts +1 -1
  440. package/lib/FormItem/component.json +171 -0
  441. package/lib/FormItem/index.d.ts +5 -5
  442. package/lib/FormItem/index.js +1 -1
  443. package/lib/FormItem/itemType.js +1 -1
  444. package/lib/FunctionModal/component.json +197 -0
  445. package/lib/FunctionModal/dialog.d.ts +1 -1
  446. package/lib/FunctionModal/modalContext.d.ts +4 -1
  447. package/lib/Help/component.json +118 -0
  448. package/lib/HelperText/component.json +126 -0
  449. package/lib/Image/component.json +165 -0
  450. package/lib/InputCode/component.json +191 -0
  451. package/lib/InputCode/index.d.ts +2 -2
  452. package/lib/InputLang/component.json +205 -0
  453. package/lib/InputLang/index.js +1 -1
  454. package/lib/InputNumber/component.json +162 -0
  455. package/lib/Label/component.json +126 -0
  456. package/lib/Label/index.d.ts +2 -2
  457. package/lib/Loading/component.json +91 -0
  458. package/lib/Menu/component.json +180 -0
  459. package/lib/Message/component.json +246 -0
  460. package/lib/Message/index.d.ts +2 -2
  461. package/lib/Message/index.js +1 -1
  462. package/lib/Modal/Confirm/index.d.ts +1 -1
  463. package/lib/Modal/Confirm/index.js +1 -1
  464. package/lib/Modal/component.json +277 -0
  465. package/lib/Modal/index.d.ts +97 -6
  466. package/lib/Modal/index.js +1 -1
  467. package/lib/Modal/interface.d.ts +1 -0
  468. package/lib/MultiBox/component.json +216 -0
  469. package/lib/MultiBox/index.js +1 -1
  470. package/lib/Notification/component.json +184 -0
  471. package/lib/OperateBtn/component.json +134 -0
  472. package/lib/OperateBtn/index.d.ts +3 -3
  473. package/lib/PageHeader/component.json +112 -0
  474. package/lib/Pagination/component.json +181 -0
  475. package/lib/Pagination/index.js +1 -1
  476. package/lib/PasswordRules/component.json +105 -0
  477. package/lib/PasswordRules/index.d.ts +4 -4
  478. package/lib/PopConfirm/component.json +227 -0
  479. package/lib/PopConfirm/index.d.ts +1 -1
  480. package/lib/PopConfirm/index.js +1 -1
  481. package/lib/PopMenu/component.json +131 -0
  482. package/lib/PopMenu/hooks.d.ts +1 -1
  483. package/lib/PopMenu/index.js +1 -1
  484. package/lib/Popover/component.json +165 -0
  485. package/lib/Popover/index.js +1 -1
  486. package/lib/Progress/component.json +161 -0
  487. package/lib/Prompt/component.json +144 -0
  488. package/lib/Querying/component.json +96 -0
  489. package/lib/Querying/index.css +1 -1
  490. package/lib/Querying/index.d.ts +2 -2
  491. package/lib/Querying/index.js +1 -1
  492. package/lib/Querying/style/index.css +1 -1
  493. package/lib/QuickReply/component.json +129 -0
  494. package/lib/QuickReply/index.d.ts +1 -1
  495. package/lib/Radio/component.json +136 -0
  496. package/lib/RadioGroup/component.json +149 -0
  497. package/lib/RangeInput/component.json +198 -0
  498. package/lib/RangeInput/index.js +1 -1
  499. package/lib/Result/component.json +104 -0
  500. package/lib/ScrollBar/component.json +115 -0
  501. package/lib/Search/component.json +177 -0
  502. package/lib/Search/index.d.ts +1 -1
  503. package/lib/Select/component.json +244 -0
  504. package/lib/Select/index.js +1 -1
  505. package/lib/SelectInput/component.json +184 -0
  506. package/lib/Selector/component.json +203 -0
  507. package/lib/Selector/index.js +1 -1
  508. package/lib/Selector/interface.d.ts +1 -1
  509. package/lib/Selector/selectorMain/index.js +1 -1
  510. package/lib/Selector/selectorNode/index.js +1 -1
  511. package/lib/Selector/util.d.ts +2 -2
  512. package/lib/SelectorPicker/component.json +179 -0
  513. package/lib/SelectorPicker/index.d.ts +5 -5
  514. package/lib/SelectorPicker/index.js +1 -1
  515. package/lib/SingleBox/component.json +151 -0
  516. package/lib/SingleBox/index.d.ts +2 -2
  517. package/lib/Slider/component.json +181 -0
  518. package/lib/SortBox/component.json +108 -0
  519. package/lib/Status/component.json +104 -0
  520. package/lib/Stepper/component.json +129 -0
  521. package/lib/Stepper/index.d.ts +2 -2
  522. package/lib/Switch/component.json +207 -0
  523. package/lib/Switch/index.css +1 -1
  524. package/lib/Switch/index.d.ts +3 -2
  525. package/lib/Switch/index.js +1 -1
  526. package/lib/Switch/style/index.css +1 -1
  527. package/lib/Table/component.json +547 -0
  528. package/lib/Table/index.d.ts +2 -2
  529. package/lib/Table/index.js +1 -1
  530. package/lib/Table/interface.d.ts +6 -0
  531. package/lib/Tabs/component.json +227 -0
  532. package/lib/Tag/component.json +221 -0
  533. package/lib/Tag/index.css +1 -1
  534. package/lib/Tag/index.d.ts +1 -1
  535. package/lib/Tag/index.js +1 -1
  536. package/lib/Tag/style/index.css +1 -1
  537. package/lib/TextEditor/component.json +186 -0
  538. package/lib/TextEditor/index.d.ts +5 -5
  539. package/lib/TextField/component.json +290 -0
  540. package/lib/TextField/index.d.ts +2 -2
  541. package/lib/TimePicker/component.json +176 -0
  542. package/lib/Timeline/component.json +110 -0
  543. package/lib/Title/component.json +156 -0
  544. package/lib/ToggleButton/component.json +153 -0
  545. package/lib/Tooltip/component.json +176 -0
  546. package/lib/Tooltip/index.js +1 -1
  547. package/lib/Tooltip/interface.d.ts +14 -1
  548. package/lib/Tooltip/utils.js +1 -1
  549. package/lib/Transfer/component.json +157 -0
  550. package/lib/Tree/component.json +512 -0
  551. package/lib/Upload/component.json +450 -0
  552. package/lib/Utils/type.d.ts +0 -2
  553. package/lib/index.d.ts +2 -0
  554. package/lib/index.js +1 -1
  555. package/lib/locale/en_US.d.ts +361 -0
  556. package/lib/locale/en_US.js +2 -0
  557. package/lib/locale/index.d.ts +1 -723
  558. package/lib/locale/index2.js +2 -0
  559. package/lib/locale/zh_CN.d.ts +361 -0
  560. package/lib/locale/zh_CN.js +2 -0
  561. package/package.json +10 -3
  562. /package/es/{Utils/Hooks → Hooks}/useResizeObserver.d.ts +0 -0
  563. /package/es/{Utils/Hooks → Hooks}/useResizeObserver.js +0 -0
  564. /package/lib/{Utils/Hooks → Hooks}/useResizeObserver.d.ts +0 -0
  565. /package/lib/{Utils/Hooks → Hooks}/useResizeObserver.js +0 -0
@@ -0,0 +1,278 @@
1
+ # Workflow 1: CRUD 列表 + 多 Drawer + 权限操作列
2
+
3
+ > **基于**:console/src/package/Service/src/content.tsx(Para 团队真实业务代码 677 行的提炼)
4
+ > **覆盖 baseline 失败任务**:Task 3(多选)/ Task 29(批量操作)/ Task 26(RBAC 操作列)
5
+ > **集成 typescriptPitfalls**:ComboSelect TableProps 嵌套 / OperateBtn 图标名 / PageHeader MenuChildrenProps 命名冲突
6
+
7
+ ---
8
+
9
+ ## 何时使用
10
+
11
+ 管理后台主列表页 —— 单个页面同时支持以下操作中的 3 项及以上:
12
+
13
+ ```
14
+ 列表展示 + 新建/编辑实体 + 删除/批量删除 + 导出/导入 + 权限管理 + 关联资源查看
15
+ ```
16
+
17
+ **典型业务**:用户管理 / 资产管理 / 订单管理 / 角色权限 / 服务配置 / 设备列表
18
+
19
+ **不要用此模板的场景**:
20
+ - 只读列表(无操作列)→ 用基础 Table
21
+ - 单 Modal 简单 CRUD(< 3 项操作)→ 简化为单 Drawer
22
+ - 嵌套表格(行展开)→ 用 Workflow 8(表格高级)
23
+
24
+ ---
25
+
26
+ ## 关键模式(与脑补的区别)
27
+
28
+ | 错误模式(AI 常犯) | 正确模式 |
29
+ |------------------|--------|
30
+ | ❌ 用一个 `open` state 控制所有 Drawer | ✅ **每个 Drawer 独立 state**(`openForm` / `openUser` / `openExport`) |
31
+ | ❌ 操作按钮硬编码在 Table render | ✅ **`OperateBtnListProps[]` 数组定义 + Table.operate.operateBtnRender 渲染** |
32
+ | ❌ `useEffect(..., [data])` 监听数据变化刷新 | ✅ **`refresh` 数字 state + setRefresh(Math.random())** 主动驱动刷新 |
33
+ | ❌ 删除后手动 `setData(prev.filter(...))` | ✅ **删除成功 → Message.success → refreshData()**(让 Table 重新拉数据) |
34
+ | ❌ TableProps.columns(antd 风格) | ✅ **TableProps.headData**(Para UI 真实 API,M2 ComboSelect 修复同款陷阱) |
35
+
36
+ ---
37
+
38
+ ## 完整代码(自包含,可直接复制)
39
+
40
+ ```tsx
41
+ import React, { FunctionComponent, useState, useMemo } from 'react';
42
+ import { Table, Button, PopConfirm } from '@para-ui/core';
43
+ import { Message } from '@para-ui/core/Message'; // 注意:命令式 API 必须从子路径导入(M2 实证)
44
+ import type { HeadDataProps } from '@para-ui/core';
45
+ import type { OperateBtnListProps } from '@para-ui/core/OperateBtn';
46
+
47
+ interface AssetRow {
48
+ id: string;
49
+ name: string;
50
+ type: 'physical' | 'virtual';
51
+ status: 'active' | 'disabled';
52
+ owner: string;
53
+ }
54
+
55
+ const AssetListPage: FunctionComponent = () => {
56
+ // 每个 Drawer 独立 state(不要合并!)
57
+ const [openForm, setOpenForm] = useState<boolean>(false);
58
+ const [openPermission, setOpenPermission] = useState<boolean>(false);
59
+ const [openExport, setOpenExport] = useState<boolean>(false);
60
+
61
+ // 当前选中的编辑行(与 openForm 配套)
62
+ const [editRow, setEditRow] = useState<AssetRow | undefined>();
63
+
64
+ // refresh 数字驱动 Table 重新拉数据(不要用 useEffect 监听 data)
65
+ const [refresh, setRefresh] = useState<number>(0);
66
+ const refreshData = (): void => setRefresh(Math.random());
67
+
68
+ // Table 多选 state(独立于 Drawer state)
69
+ const [checkValue, setCheckValue] = useState<string[]>([]);
70
+
71
+ // 操作按钮列表生成函数(带行数据 + 权限判断)
72
+ const buildOperateBtnList = (row: AssetRow): OperateBtnListProps[] => {
73
+ const list: OperateBtnListProps[] = [
74
+ {
75
+ key: 'edit',
76
+ label: '编辑',
77
+ onClick: () => { setEditRow(row); setOpenForm(true); }
78
+ },
79
+ {
80
+ key: 'permission',
81
+ label: '权限',
82
+ onClick: () => { setEditRow(row); setOpenPermission(true); }
83
+ },
84
+ {
85
+ key: 'delete',
86
+ label: '删除',
87
+ disabled: row.status === 'active', // 在用资产不允许删
88
+ toolTipTitle: row.status === 'active' ? '在用资产不可删除' : undefined,
89
+ onClick: async () => {
90
+ // 删除成功后通过 Message + refreshData 反馈,不要手动改 state
91
+ await mockApi.deleteAsset(row.id);
92
+ Message.success('已删除');
93
+ refreshData();
94
+ }
95
+ }
96
+ ];
97
+ return list.filter(item => !item.hidden);
98
+ };
99
+
100
+ // 批量删除(多选场景)
101
+ const handleBatchDelete = async (): Promise<void> => {
102
+ await mockApi.batchDelete(checkValue);
103
+ Message.success(`已删除 ${checkValue.length} 项`);
104
+ setCheckValue([]);
105
+ refreshData();
106
+ };
107
+
108
+ // Table 列定义(必须用 headData,不是 antd 风格的 columns)
109
+ const headData = useMemo<HeadDataProps<AssetRow>[]>(() => [
110
+ { name: 'name', label: '资产名', width: 160 },
111
+ { name: 'type', label: '类型', width: 100 },
112
+ { name: 'status', label: '状态', width: 100,
113
+ render: (row) => row.status === 'active' ? '使用中' : '已禁用'
114
+ },
115
+ { name: 'owner', label: '负责人', width: 120 }
116
+ ], []);
117
+
118
+ return (
119
+ <div>
120
+ {/* 顶部操作区:批量操作 + 新建 */}
121
+ <div style={{ marginBottom: 16, display: 'flex', gap: 8 }}>
122
+ <Button onClick={() => { setEditRow(undefined); setOpenForm(true); }}>
123
+ 新建
124
+ </Button>
125
+ {checkValue.length > 0 && (
126
+ <>
127
+ <span style={{ alignSelf: 'center' }}>已选 {checkValue.length} 项</span>
128
+ <PopConfirm
129
+ title="确认批量删除"
130
+ onOk={handleBatchDelete}
131
+ >
132
+ <Button>批量删除</Button>
133
+ </PopConfirm>
134
+ </>
135
+ )}
136
+ </div>
137
+
138
+ {/* 表格本体 */}
139
+ <Table<AssetRow>
140
+ rowKey="id"
141
+ data={mockData}
142
+ headData={headData}
143
+ // ↓ 操作列通过 operate 配置渲染,不要硬编码到 headData
144
+ // operate={{ label: '操作', width: 180, operateBtnRender: (row) => ({
145
+ // list: buildOperateBtnList(row), showNum: 3
146
+ // })}}
147
+ // multi-select
148
+ // check
149
+ // setCheck={setCheckValue}
150
+ pagination={false}
151
+ autoSize={false}
152
+ />
153
+
154
+ {/* 多个 Drawer 共存,每个独立 state */}
155
+ {openForm && (
156
+ <FormDrawer
157
+ open={openForm}
158
+ rowData={editRow}
159
+ onFinish={(saved) => {
160
+ setOpenForm(false);
161
+ setEditRow(undefined);
162
+ if (saved) refreshData();
163
+ }}
164
+ />
165
+ )}
166
+ {openPermission && (
167
+ <PermissionDrawer
168
+ open={openPermission}
169
+ rowData={editRow}
170
+ onClose={() => setOpenPermission(false)}
171
+ />
172
+ )}
173
+ {openExport && (
174
+ <ExportDrawer
175
+ open={openExport}
176
+ onClose={() => setOpenExport(false)}
177
+ />
178
+ )}
179
+ </div>
180
+ );
181
+ };
182
+
183
+ export default AssetListPage;
184
+
185
+ // === 以下是占位,实际项目里来自业务代码 ===
186
+ const mockData: AssetRow[] = [];
187
+ const mockApi = {
188
+ deleteAsset: async (id: string): Promise<void> => { void id; },
189
+ batchDelete: async (ids: string[]): Promise<void> => { void ids; }
190
+ };
191
+ const FormDrawer: FunctionComponent<{ open: boolean; rowData?: AssetRow; onFinish: (saved?: boolean) => void }> = () => null;
192
+ const PermissionDrawer: FunctionComponent<{ open: boolean; rowData?: AssetRow; onClose: () => void }> = () => null;
193
+ const ExportDrawer: FunctionComponent<{ open: boolean; onClose: () => void }> = () => null;
194
+ ```
195
+
196
+ ---
197
+
198
+ ## 5 个真实陷阱(来自 M2/M3 修复实证)
199
+
200
+ ### ❌ 陷阱 1:Table 列定义用 antd 风格 `columns`
201
+ ```tsx
202
+ // 错(M2 ComboSelect 修复发现的高频错误)
203
+ <Table columns={[{ title: '名称', dataIndex: 'name' }]} />
204
+ // 对
205
+ <Table headData={[{ name: 'name', label: '名称', width: 120 }]} />
206
+ ```
207
+
208
+ ### ❌ 陷阱 2:多 Drawer 共享 state 互相干扰
209
+ ```tsx
210
+ // 错
211
+ const [activeDrawer, setActiveDrawer] = useState<'form' | 'permission' | null>(null);
212
+ {activeDrawer === 'form' && <FormDrawer ... />}
213
+ // 问题:用户在 Permission Drawer 里点了链接想跳 Form Drawer,
214
+ // 但单一 state 没法同时显示两个
215
+
216
+ // 对
217
+ const [openForm, setOpenForm] = useState(false);
218
+ const [openPermission, setOpenPermission] = useState(false);
219
+ // 各 Drawer 独立,可同时存在或链式调用
220
+ ```
221
+
222
+ ### ❌ 陷阱 3:刷新表格用 useEffect 监听数据
223
+ ```tsx
224
+ // 错(容易死循环或漏刷新)
225
+ useEffect(() => { fetchData().then(setData); }, [data]);
226
+ // 对
227
+ const [refresh, setRefresh] = useState(0);
228
+ const refreshData = () => setRefresh(Math.random());
229
+ // Table 内部用 refresh 数字驱动重新拉数据
230
+ ```
231
+
232
+ ### ❌ 陷阱 4:操作按钮硬编码进 render
233
+ ```tsx
234
+ // 错
235
+ { name: 'op', label: '操作', render: (row) => <>
236
+ <Button onClick={...}>编辑</Button>
237
+ <Button onClick={...}>删除</Button>
238
+ ...10 个按钮...
239
+ </> }
240
+
241
+ // 对:用 OperateBtnListProps 数组 + Table.operate
242
+ const list: OperateBtnListProps[] = [
243
+ { key: 'edit', label: '编辑', onClick: edit(row) },
244
+ { key: 'delete', label: '删除', disabled: row.inUse, onClick: del(row) }
245
+ ];
246
+ // Table operate.operateBtnRender 渲染,自动处理 showNum + 折叠
247
+ ```
248
+
249
+ ### ❌ 陷阱 5:删除后手动 setData
250
+ ```tsx
251
+ // 错
252
+ const handleDelete = async (id) => {
253
+ await api.delete(id);
254
+ setData(prev => prev.filter(r => r.id !== id)); // 丢失分页 / 排序状态
255
+ };
256
+ // 对
257
+ const handleDelete = async (id) => {
258
+ await api.delete(id);
259
+ Message.success('已删除');
260
+ refreshData(); // 让 Table 重拉,保留 page/sort/filter
261
+ };
262
+ ```
263
+
264
+ ---
265
+
266
+ ## 真实参考
267
+
268
+ **Para 团队真实业务代码**:`/Users/seth/Desktop/para/2025-Pam/new/para-node-4.0-web/console/src/package/Service/src/content.tsx`
269
+
270
+ | 关键模式 | 行号 |
271
+ |---------|------|
272
+ | 多 Drawer 独立 state(6 个) | 52-63 |
273
+ | `useAsync(updateDisabled, 'id')` 带 loadingMap 的异步 hook | 66 |
274
+ | `OperateBtnListProps[]` + 权限注入 | 494-566 |
275
+ | Table.operate.operateBtnRender + check 多选 | 592-613 |
276
+ | 6 个 Drawer 并列渲染 | 616-657 |
277
+
278
+ console 项目内 19 个业务模块(Service/User/Group/Cluster/Faas/...)都用此模式。
@@ -0,0 +1,290 @@
1
+ # Workflow 2: 权限驱动 RBAC 操作列
2
+
3
+ > **基于**:console 真实业务代码(Role 模块 / User 模块)提炼
4
+ > **覆盖 baseline 失败任务**:Task 26(RBAC 操作列权限控制)
5
+ > **集成 typescriptPitfalls**:OperateBtn 图标名 / PageHeader MenuChildrenProps 命名冲突 / Table headData 风格 / Tag 状态渲染
6
+
7
+ ---
8
+
9
+ ## 何时使用
10
+
11
+ 管理后台中,同一行数据对不同角色显示不同操作按钮:
12
+
13
+ ```
14
+ 超级管理员 → 编辑 + 删除 + 停用
15
+ 普通管理员 → 编辑(不能删)
16
+ 只读角色 → 仅查看(PreviewOpen)
17
+ ```
18
+
19
+ **典型业务**:角色管理 / 用户管理 / 资产权限 / 订单审批
20
+
21
+ **不要用此模板的场景**:
22
+ - 所有人权限一致(无需按角色过滤操作列)→ 用 Workflow 1
23
+ - 权限控制在路由层(页面级控制)→ 用路由守卫,不用操作列过滤
24
+
25
+ ---
26
+
27
+ ## 关键模式(与脑补的区别)
28
+
29
+ | 错误模式(AI 常犯) | 正确模式 |
30
+ |------------------|--------|
31
+ | ❌ `import View from '@para-ui/icons/View'`(不存在) | ✅ `import PreviewOpen from '@para-ui/icons/PreviewOpen'`(M2 OperateBtn 修复) |
32
+ | ❌ `import { MenuChildrenProps } from '@para-ui/core'` 用于 PageHeader | ✅ 不标注类型,让 TS 推断(M3 PageHeader 修复) |
33
+ | ❌ `headData={[{ title: '名称', dataIndex: 'name' }]}` antd 风格 | ✅ `headData={[{ label: '名称', name: 'name' }]}` Para UI 风格 |
34
+ | ❌ 权限判断写在 render 里(每次渲染都计算) | ✅ `buildOperateBtnList(row, currentUserRole)` 函数集中管理 + `hidden` 过滤 |
35
+ | ❌ `list.length === showNum + 1` 时期望折叠 | ✅ 仅 `list.length > showNum + 1` 才出现更多按钮(差值严格 > 1) |
36
+
37
+ ---
38
+
39
+ ## 完整代码(自包含,可直接复制)
40
+
41
+ ```tsx
42
+ import React, { FunctionComponent, useState, useMemo } from 'react';
43
+ import { Table, Tag } from '@para-ui/core';
44
+ import { Message } from '@para-ui/core/Message';
45
+ import type { HeadDataProps } from '@para-ui/core';
46
+ import type { OperateBtnListProps } from '@para-ui/core/OperateBtn';
47
+ import OperateBtn from '@para-ui/core/OperateBtn';
48
+ import PreviewOpen from '@para-ui/icons/PreviewOpen';
49
+ import Edit from '@para-ui/icons/Edit';
50
+ import Delete from '@para-ui/icons/Delete';
51
+
52
+ // === 业务数据类型 ===
53
+ type RoleLevel = 'superAdmin' | 'admin' | 'readonly';
54
+
55
+ interface UserRow {
56
+ id: string;
57
+ name: string;
58
+ email: string;
59
+ status: 'active' | 'disabled';
60
+ roleLevel: RoleLevel;
61
+ }
62
+
63
+ // 当前登录用户的角色(实际从 context/store 获取)
64
+ const CURRENT_USER_ROLE: RoleLevel = 'admin';
65
+
66
+ // === 权限驱动的操作列生成函数 ===
67
+ // 关键:集中管理权限 → 操作按钮的映射,不写在 render 里
68
+ const buildOperateBtnList = (
69
+ row: UserRow,
70
+ currentRole: RoleLevel,
71
+ callbacks: {
72
+ onEdit: (row: UserRow) => void;
73
+ onDelete: (row: UserRow) => void;
74
+ onView: (row: UserRow) => void;
75
+ }
76
+ ): OperateBtnListProps[] => {
77
+ const list: OperateBtnListProps[] = [
78
+ {
79
+ key: 'view',
80
+ label: '查看',
81
+ icon: <PreviewOpen />,
82
+ // 所有角色都可查看
83
+ hidden: false,
84
+ onClick: (_item, _e) => callbacks.onView(row)
85
+ },
86
+ {
87
+ key: 'edit',
88
+ label: '编辑',
89
+ icon: <Edit />,
90
+ // 只读角色不能编辑
91
+ hidden: currentRole === 'readonly',
92
+ disabled: row.status === 'disabled',
93
+ toolTipTitle: row.status === 'disabled' ? '已停用用户不可编辑' : '编辑',
94
+ onClick: (_item, _e) => callbacks.onEdit(row)
95
+ },
96
+ {
97
+ key: 'delete',
98
+ label: '删除',
99
+ icon: <Delete />,
100
+ danger: true,
101
+ // 只有 superAdmin 才能删除
102
+ hidden: currentRole !== 'superAdmin',
103
+ popConfirmProps: {
104
+ title: `确认删除用户「${row.name}」?`,
105
+ onOk: () => callbacks.onDelete(row)
106
+ }
107
+ }
108
+ ];
109
+ // 过滤 hidden 项(hidden 属性让 OperateBtn 知道不渲染该项)
110
+ return list.filter(item => !item.hidden);
111
+ };
112
+
113
+ // === 主页面组件 ===
114
+ const RoleManagementPage: FunctionComponent = () => {
115
+ const [openDetail, setOpenDetail] = useState<boolean>(false);
116
+ const [currentRow, setCurrentRow] = useState<UserRow | undefined>();
117
+ const [refresh, setRefresh] = useState<number>(0);
118
+ const refreshData = (): void => setRefresh(Math.random());
119
+
120
+ const handleEdit = (row: UserRow): void => {
121
+ setCurrentRow(row);
122
+ // 实际跳转到编辑 Drawer
123
+ };
124
+
125
+ const handleDelete = async (row: UserRow): Promise<void> => {
126
+ await mockApi.deleteUser(row.id);
127
+ Message.success(`已删除用户「${row.name}」`);
128
+ refreshData();
129
+ };
130
+
131
+ const handleView = (row: UserRow): void => {
132
+ setCurrentRow(row);
133
+ setOpenDetail(true);
134
+ };
135
+
136
+ // Table 列定义(必须用 headData,不是 antd 风格的 columns)
137
+ const headData = useMemo<HeadDataProps<UserRow>[]>(() => [
138
+ { name: 'name', label: '用户名', width: 140 },
139
+ { name: 'email', label: '邮箱', width: 200 },
140
+ {
141
+ name: 'status',
142
+ label: '状态',
143
+ width: 100,
144
+ // render 第一参数是整行数据(不是单元格值)
145
+ render: (row) => (
146
+ <Tag color={row.status === 'active' ? 'green' : 'red'}>
147
+ {row.status === 'active' ? '正常' : '停用'}
148
+ </Tag>
149
+ )
150
+ },
151
+ {
152
+ name: 'roleLevel',
153
+ label: '角色',
154
+ width: 120,
155
+ render: (row) => ({
156
+ superAdmin: '超级管理员',
157
+ admin: '管理员',
158
+ readonly: '只读'
159
+ }[row.roleLevel])
160
+ },
161
+ {
162
+ name: 'id',
163
+ label: '操作',
164
+ width: 160,
165
+ render: (row) => (
166
+ <OperateBtn
167
+ list={buildOperateBtnList(row, CURRENT_USER_ROLE, {
168
+ onEdit: handleEdit,
169
+ onDelete: handleDelete,
170
+ onView: handleView
171
+ })}
172
+ showNum={3}
173
+ size="small"
174
+ />
175
+ )
176
+ }
177
+ ], []);
178
+
179
+ void openDetail;
180
+ void currentRow;
181
+ void refresh;
182
+
183
+ return (
184
+ <div>
185
+ <Table<UserRow>
186
+ rowKey="id"
187
+ data={mockData}
188
+ headData={headData}
189
+ pagination={false}
190
+ autoSize={false}
191
+ />
192
+ </div>
193
+ );
194
+ };
195
+
196
+ export default RoleManagementPage;
197
+
198
+ // === 占位 Mock ===
199
+ const mockData: UserRow[] = [];
200
+ const mockApi = {
201
+ deleteUser: async (id: string): Promise<void> => { void id; }
202
+ };
203
+ ```
204
+
205
+ ---
206
+
207
+ ## 5 个真实陷阱(来自 M2/M3 修复实证)
208
+
209
+ ### ❌ 陷阱 1:`@para-ui/icons` 中 View 不存在
210
+ ```tsx
211
+ // 错(M2 OperateBtn 修复发现:View 不在图标库中)
212
+ import View from '@para-ui/icons/View'; // TS2307: 找不到模块
213
+ import Share from '@para-ui/icons/Share'; // TS2307: 找不到模块
214
+
215
+ // 对
216
+ import PreviewOpen from '@para-ui/icons/PreviewOpen'; // 查看/预览
217
+ import More from '@para-ui/icons/More'; // 更多操作
218
+ // 可用图标:Edit / Delete / Copy / More / PreviewOpen / PreviewClose
219
+ ```
220
+ **实证来源**:M2 OperateBtn component.json `typescriptPitfalls[3]`,Task 26 失败根因。
221
+
222
+ ### ❌ 陷阱 2:从 `@para-ui/core` 导入 MenuChildrenProps 标注 PageHeader 回调
223
+ ```tsx
224
+ // 错(M3 PageHeader 修复:PageHeader/interface.ts 和 Menu/interface.ts 各有同名 MenuChildrenProps,互不兼容)
225
+ import { PageHeader, MenuChildrenProps } from '@para-ui/core';
226
+ onClickMenu={(item: MenuChildrenProps | false) => ...} // TS2322 类型冲突
227
+
228
+ // 对:不手动标注类型,让 TS 推断
229
+ import { PageHeader } from '@para-ui/core';
230
+ onClickMenu={(item) => { if (item && item.path) navigate(item.path); }}
231
+ // 或用 Parameters<typeof PageHeader>[0]['onClickMenu'] 精确类型
232
+ ```
233
+ **实证来源**:M3 PageHeader component.json `typescriptPitfalls[3]`。
234
+
235
+ ### ❌ 陷阱 3:Table 列定义用 antd `columns` 风格
236
+ ```tsx
237
+ // 错
238
+ <Table columns={[{ title: '用户名', dataIndex: 'name', sorter: true }]} />
239
+
240
+ // 对:Para UI 字段名完全不同
241
+ <Table<UserRow>
242
+ headData={[
243
+ { label: '用户名', name: 'name', sort: true } // label/name/sort,不是 title/dataIndex/sorter
244
+ ]}
245
+ rowKey="id" // 必须显式传,默认 'key' 在业务数据中几乎不存在
246
+ />
247
+ ```
248
+ **实证来源**:M2 Table component.json `typescriptPitfalls[0]` + `typescriptPitfalls[3]`。
249
+
250
+ ### ❌ 陷阱 4:Table render 第一参数当单元格值用
251
+ ```tsx
252
+ // 错(与 antd Table render 参数顺序相反)
253
+ headData={[{
254
+ name: 'status',
255
+ label: '状态',
256
+ render: (value) => <Tag color={value === 'active' ? 'green' : 'red'}>{value}</Tag>
257
+ // ↑ value 实际是整行 UserRow 对象,不是 'active'/'disabled' 字符串
258
+ }]}
259
+
260
+ // 对:第一参数是整行数据 row
261
+ render: (row) => <Tag color={row.status === 'active' ? 'green' : 'red'}>{row.status}</Tag>
262
+ ```
263
+ **实证来源**:M2 Table component.json `typescriptPitfalls[1]`。
264
+
265
+ ### ❌ 陷阱 5:OperateBtn showNum 折叠阈值误判
266
+ ```tsx
267
+ // 错(期望 list.length === showNum + 1 时折叠)
268
+ // list 有 4 项,showNum=3 → 期望"前 3 个外显 + 1 个更多"
269
+ // 实际:list.length(4) === showNum(3) + 1 → 最后一个也外显,不进更多
270
+
271
+ // 对:仅 list.length > showNum + 1(差值严格大于 1)才出现更多按钮
272
+ // list 有 4 项,showNum=3 → 全部外显(4 === 3 + 1,等于不折叠)
273
+ // list 有 5 项,showNum=3 → 前 3 外显 + 更多(5 > 3 + 1)
274
+ // 设计实践:权限过滤后 list 可能只剩 1-2 项,无需担心折叠问题
275
+ const filteredList = allBtns.filter(item => !item.hidden);
276
+ <OperateBtn list={filteredList} showNum={3} />
277
+ ```
278
+ **实证来源**:OperateBtn component.json `idealProps.showNum`。
279
+
280
+ ---
281
+
282
+ ## 真实参考
283
+
284
+ | 关键模式 | 参考位置 |
285
+ |---------|--------|
286
+ | `OperateBtnListProps[]` + `hidden` 过滤 | OperateBtn/component.json idealProps.list |
287
+ | `PreviewOpen` 图标(替代不存在的 View) | OperateBtn/component.json typescriptPitfalls[3] |
288
+ | `MenuChildrenProps` 命名冲突 | PageHeader/component.json typescriptPitfalls[3] |
289
+ | `headData` 而非 `columns` | Table/component.json typescriptPitfalls[0] |
290
+ | `render` 第一参数是 row | Table/component.json typescriptPitfalls[1] |