@para-ui/core 5.0.0-beta.11 → 5.0.0-beta.13

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 (650) 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/es/AlignBox/component.json +89 -0
  103. package/es/AlignBox/index.css +1 -1
  104. package/es/AlignBox/index.d.ts +6 -2
  105. package/es/AlignBox/index.js +1 -1
  106. package/es/AlignBox/style/index.css +1 -1
  107. package/es/Anchor/anchorMenu/index.d.ts +2 -1
  108. package/es/Anchor/anchorMenu/index.js +36 -33
  109. package/es/Anchor/component.json +130 -0
  110. package/es/Anchor/index.js +52 -49
  111. package/es/Anchor/type.d.ts +8 -4
  112. package/es/Argv/component.json +216 -0
  113. package/es/Argv/dataGenerator/index.js +1 -1
  114. package/es/Argv/index.d.ts +5 -6
  115. package/es/Argv/index.js +1 -1
  116. package/es/AutoBox/component.json +133 -0
  117. package/es/AutoBox/index.d.ts +3 -3
  118. package/es/AutoBox/index.js +1 -1
  119. package/es/AutoBox/protal.d.ts +2 -2
  120. package/es/AutoBox/protal.js +33 -30
  121. package/es/AutoButton/component.json +109 -0
  122. package/es/AutoButton/index.js +1 -1
  123. package/es/AutoTips/autoTipsMultiline/index.d.ts +1 -1
  124. package/es/AutoTips/autoTipsMultiline/index.js +1 -1
  125. package/es/AutoTips/component.json +121 -0
  126. package/es/AutoTips/index.js +1 -1
  127. package/es/Badge/component.json +92 -0
  128. package/es/Breadcrumbs/component.json +142 -0
  129. package/es/Breadcrumbs/index.js +1 -1
  130. package/es/Button/SplitButton.d.ts +2 -2
  131. package/es/Button/component.json +168 -0
  132. package/es/Button/index.js +44 -44
  133. package/es/ButtonGroup/component.json +132 -0
  134. package/es/ButtonGroup/index.d.ts +1 -1
  135. package/es/Card/component.json +162 -0
  136. package/es/Card/index.d.ts +2 -2
  137. package/es/Card/index.js +2 -2
  138. package/es/Carousel/component.json +142 -0
  139. package/es/Carousel/index.d.ts +1 -1
  140. package/es/Cascader/Cascader.js +1 -1
  141. package/es/Cascader/OptionList/Column.js +1 -1
  142. package/es/Cascader/OptionList/index.js +1 -1
  143. package/es/Cascader/component.json +196 -0
  144. package/es/Cascader/hooks/useEntities.js +7 -7
  145. package/es/Cascader/interface.d.ts +1 -0
  146. package/es/Cascader/utils/commonUtil.d.ts +1 -1
  147. package/es/Cascader/utils/commonUtil.js +16 -16
  148. package/es/Cascader/utils/treeUtil.d.ts +14 -5
  149. package/es/Cascader/utils/treeUtil.js +1 -1
  150. package/es/Checkbox/component.json +138 -0
  151. package/es/CheckboxGroup/component.json +152 -0
  152. package/es/CheckboxGroup/index.js +1 -1
  153. package/es/CodeEditor/component.json +189 -0
  154. package/es/CodeEditor/index.d.ts +11 -10
  155. package/es/CodeEditor/index.js +19 -19
  156. package/es/Collapse/component.json +166 -0
  157. package/es/Collapse/index.d.ts +1 -1
  158. package/es/Collapse/index.js +23 -22
  159. package/es/CollapseBox/component.json +84 -0
  160. package/es/CollapseLayout/component.json +155 -0
  161. package/es/ColorPicker/component.json +142 -0
  162. package/es/ComboSelect/component.json +181 -0
  163. package/es/ComboSelect/index.js +115 -109
  164. package/es/ComboSelect/interface.d.ts +2 -2
  165. package/es/ComboSelect/utils.d.ts +3 -3
  166. package/es/ComboSelect/utils.js +1 -1
  167. package/es/Container/component.json +111 -0
  168. package/es/ContentBox/component.json +81 -0
  169. package/es/CopyText/component.json +118 -0
  170. package/es/CycleSelector/component.json +98 -0
  171. package/es/CycleSelector/index.js +14 -13
  172. package/es/DatePicker/component.json +192 -0
  173. package/es/DatePicker/generatePicker/generateRangePicker.js +11 -11
  174. package/es/DatePicker/generatePicker/generateSinglePicker.js +2 -2
  175. package/es/Descriptions/component.json +142 -0
  176. package/es/Descriptions/index.d.ts +1 -1
  177. package/es/Desktop/component.json +171 -0
  178. package/es/Desktop/index.js +1 -1
  179. package/es/DragVerify/component.json +114 -0
  180. package/es/DragVerify/index.js +19 -19
  181. package/es/Drawer/component.json +200 -0
  182. package/es/Drawer/index.js +86 -86
  183. package/es/Drawer/interface.d.ts +1 -1
  184. package/es/Drawer/util.d.ts +1 -6
  185. package/es/Drawer/util.js +9 -6
  186. package/es/Dropdown/component.json +147 -0
  187. package/es/Dropdown/index.js +1 -1
  188. package/es/DynamicMultiBox/component.json +278 -0
  189. package/es/DynamicMultiBox/formItem.d.ts +1 -1
  190. package/es/DynamicMultiBox/index.js +1 -1
  191. package/es/DynamicMultiBox/rowForm.d.ts +2 -2
  192. package/es/Empty/component.json +123 -0
  193. package/es/Empty/index.css +1 -1
  194. package/es/Empty/index.d.ts +2 -2
  195. package/es/Empty/index.js +27 -26
  196. package/es/Empty/style/index.css +1 -1
  197. package/es/FieldForm/FieldFormItem/ItemHolder.js +1 -1
  198. package/es/FieldForm/FieldFormItem/MemoInput.d.ts +2 -2
  199. package/es/FieldForm/FieldFormItem/StatusProvider.js +1 -1
  200. package/es/FieldForm/FieldFormItem/index.d.ts +6 -6
  201. package/es/FieldForm/Form.d.ts +2 -2
  202. package/es/FieldForm/Form.js +1 -1
  203. package/es/FieldForm/FormItemInput.js +1 -1
  204. package/es/FieldForm/FormItemLabel.js +1 -1
  205. package/es/FieldForm/FormList.d.ts +2 -2
  206. package/es/FieldForm/component.json +196 -0
  207. package/es/FieldForm/context.d.ts +5 -1
  208. package/es/FieldForm/context.js +2 -2
  209. package/es/FieldForm/hooks/useForm.d.ts +4 -3
  210. package/es/FieldForm/hooks/useFormInstance.d.ts +1 -1
  211. package/es/FieldForm/hooks/useFormItemStatus.d.ts +9 -5
  212. package/es/FieldForm/hooks/useFormItemStatus.js +2 -2
  213. package/es/FieldForm/hooks/useItemRef.d.ts +1 -1
  214. package/es/FieldForm/hooks/useItemRef.js +6 -6
  215. package/es/Form/component.json +161 -0
  216. package/es/Form/index.d.ts +52 -49
  217. package/es/Form/index.js +1 -1
  218. package/es/FormItem/compoments/defaultCompoments/index.d.ts +5 -5
  219. package/es/FormItem/compoments/defaultCompoments/index.js +12 -11
  220. package/es/FormItem/compoments/formCheckboxGroup/index.d.ts +2 -2
  221. package/es/FormItem/compoments/formFile/index.js +8 -8
  222. package/es/FormItem/compoments/formRadioGroup/index.d.ts +1 -1
  223. package/es/FormItem/compoments/formSelect/index.d.ts +1 -1
  224. package/es/FormItem/component.json +171 -0
  225. package/es/FormItem/index.d.ts +5 -5
  226. package/es/FormItem/index.js +23 -23
  227. package/es/FormItem/itemType.js +1 -1
  228. package/es/FunctionModal/component.json +197 -0
  229. package/es/FunctionModal/dialog.d.ts +1 -1
  230. package/es/FunctionModal/modalContext.d.ts +4 -1
  231. package/es/GlobalContext/confirmLocale.js +1 -1
  232. package/es/GlobalContext/index.js +1 -1
  233. package/es/Help/component.json +118 -0
  234. package/es/HelperText/component.json +126 -0
  235. package/es/Image/PreviewGroup.js +1 -1
  236. package/es/Image/component.json +165 -0
  237. package/es/Image/index.js +1 -1
  238. package/es/InputCode/component.json +191 -0
  239. package/es/InputCode/index.d.ts +2 -2
  240. package/es/InputLang/component.json +205 -0
  241. package/es/InputLang/index.js +2 -2
  242. package/es/InputNumber/component.json +162 -0
  243. package/es/Label/component.json +126 -0
  244. package/es/Label/index.d.ts +2 -2
  245. package/es/Loading/component.json +91 -0
  246. package/es/Menu/component.json +180 -0
  247. package/es/Menu/verticalMenuList.js +1 -1
  248. package/es/Message/component.json +246 -0
  249. package/es/Message/index.d.ts +2 -2
  250. package/es/Message/index.js +2 -2
  251. package/es/Modal/Confirm/index.d.ts +1 -1
  252. package/es/Modal/Confirm/index.js +1 -1
  253. package/es/Modal/component.json +277 -0
  254. package/es/Modal/index.d.ts +85 -5
  255. package/es/Modal/index.js +159 -122
  256. package/es/Modal/interface.d.ts +1 -0
  257. package/es/MultiBox/component.json +216 -0
  258. package/es/MultiBox/index.js +19 -14
  259. package/es/Notification/component.json +184 -0
  260. package/es/OperateBtn/component.json +134 -0
  261. package/es/OperateBtn/index.d.ts +3 -3
  262. package/es/PageHeader/component.json +112 -0
  263. package/es/PageHeader/horizontalMeun.js +1 -1
  264. package/es/PageHeader/horizontalMeunRight.js +1 -1
  265. package/es/Pagination/component.json +181 -0
  266. package/es/Pagination/index.js +15 -15
  267. package/es/ParauiProvider/index.js +1 -1
  268. package/es/PasswordRules/component.json +105 -0
  269. package/es/PasswordRules/index.d.ts +4 -4
  270. package/es/PopConfirm/component.json +227 -0
  271. package/es/PopConfirm/index.d.ts +1 -1
  272. package/es/PopConfirm/index.js +1 -1
  273. package/es/PopMenu/component.json +131 -0
  274. package/es/PopMenu/hooks.d.ts +1 -1
  275. package/es/PopMenu/index.js +8 -8
  276. package/es/Popover/component.json +165 -0
  277. package/es/Popover/index.js +1 -1
  278. package/es/Progress/component.json +161 -0
  279. package/es/Prompt/component.json +144 -0
  280. package/es/Querying/component.json +96 -0
  281. package/es/Querying/index.css +1 -1
  282. package/es/Querying/index.d.ts +2 -2
  283. package/es/Querying/index.js +20 -19
  284. package/es/Querying/style/index.css +1 -1
  285. package/es/QuickReply/QuickReplyCode/index.js +1 -1
  286. package/es/QuickReply/component.json +129 -0
  287. package/es/QuickReply/index.d.ts +1 -1
  288. package/es/Radio/component.json +136 -0
  289. package/es/RadioGroup/component.json +149 -0
  290. package/es/RangeInput/component.json +198 -0
  291. package/es/RangeInput/index.js +20 -20
  292. package/es/Result/component.json +104 -0
  293. package/es/ScrollBar/component.json +115 -0
  294. package/es/Search/component.json +177 -0
  295. package/es/Search/index.d.ts +1 -1
  296. package/es/Select/component.json +244 -0
  297. package/es/Select/index.js +114 -114
  298. package/es/SelectInput/component.json +184 -0
  299. package/es/Selector/component.json +203 -0
  300. package/es/Selector/index.js +56 -50
  301. package/es/Selector/interface.d.ts +2 -2
  302. package/es/Selector/selectorData/index.js +1 -1
  303. package/es/Selector/selectorMain/index.js +3 -3
  304. package/es/Selector/selectorNode/index.js +1 -1
  305. package/es/Selector/util.d.ts +3 -3
  306. package/es/Selector/util.js +6 -12
  307. package/es/SelectorPicker/component.json +179 -0
  308. package/es/SelectorPicker/index.d.ts +5 -5
  309. package/es/SelectorPicker/index.js +15 -15
  310. package/es/SingleBox/component.json +151 -0
  311. package/es/SingleBox/index.d.ts +2 -2
  312. package/es/Slider/component.json +181 -0
  313. package/es/SortBox/component.json +108 -0
  314. package/es/Status/component.json +104 -0
  315. package/es/Stepper/component.json +129 -0
  316. package/es/Stepper/index.d.ts +2 -2
  317. package/es/Switch/component.json +207 -0
  318. package/es/Switch/index.css +1 -1
  319. package/es/Switch/index.d.ts +3 -2
  320. package/es/Switch/index.js +60 -59
  321. package/es/Switch/style/index.css +1 -1
  322. package/es/Table/component.json +547 -0
  323. package/es/Table/index.d.ts +2 -2
  324. package/es/Table/index.js +385 -382
  325. package/es/Table/interface.d.ts +30 -0
  326. package/es/Table/tableHead.js +1 -1
  327. package/es/Table/util.d.ts +1 -1
  328. package/es/Table/util.js +3 -12
  329. package/es/Tabs/component.json +227 -0
  330. package/es/Tag/component.json +221 -0
  331. package/es/Tag/index.css +1 -1
  332. package/es/Tag/index.d.ts +1 -1
  333. package/es/Tag/index.js +20 -20
  334. package/es/Tag/style/index.css +1 -1
  335. package/es/TextEditor/component.json +186 -0
  336. package/es/TextEditor/index.d.ts +5 -5
  337. package/es/TextEditor/index.js +1 -1
  338. package/es/TextField/component.json +290 -0
  339. package/es/TextField/index.d.ts +2 -2
  340. package/es/TextField/index.js +1 -1
  341. package/es/TimePicker/component.json +176 -0
  342. package/es/Timeline/component.json +110 -0
  343. package/es/Title/component.json +156 -0
  344. package/es/ToggleButton/component.json +153 -0
  345. package/es/ToggleButton/index.js +1 -1
  346. package/es/Tooltip/component.json +176 -0
  347. package/es/Tooltip/index.js +58 -53
  348. package/es/Tooltip/interface.d.ts +14 -1
  349. package/es/Tooltip/utils.js +6 -6
  350. package/es/Transfer/component.json +157 -0
  351. package/es/Tree/OperateBar/index.js +1 -1
  352. package/es/Tree/Tree.js +3 -3
  353. package/es/Tree/component.json +512 -0
  354. package/es/Tree/interface.d.ts +1 -1
  355. package/es/Upload/component.json +450 -0
  356. package/es/Upload/util.js +1 -1
  357. package/es/Utils/snack-kit-shims.d.ts +18 -0
  358. package/es/Utils/snack-kit-shims.js +19 -0
  359. package/es/Utils/type.d.ts +0 -2
  360. package/es/_virtual/index.js +5 -3
  361. package/es/_virtual/index2.js +2 -5
  362. package/es/index.d.ts +2 -0
  363. package/es/index.js +1 -1
  364. package/es/locale/en_US.d.ts +361 -0
  365. package/es/locale/en_US.js +364 -0
  366. package/es/locale/index.d.ts +1 -723
  367. package/es/locale/index2.js +10 -0
  368. package/es/locale/zh_CN.d.ts +361 -0
  369. package/es/locale/zh_CN.js +364 -0
  370. package/es/node_modules/classnames/index.js +1 -1
  371. package/lib/AlignBox/component.json +89 -0
  372. package/lib/AlignBox/index.css +1 -1
  373. package/lib/AlignBox/index.d.ts +6 -2
  374. package/lib/AlignBox/index.js +1 -1
  375. package/lib/AlignBox/style/index.css +1 -1
  376. package/lib/Anchor/anchorMenu/index.d.ts +2 -1
  377. package/lib/Anchor/anchorMenu/index.js +1 -1
  378. package/lib/Anchor/component.json +130 -0
  379. package/lib/Anchor/index.js +1 -1
  380. package/lib/Anchor/type.d.ts +8 -4
  381. package/lib/Argv/component.json +216 -0
  382. package/lib/Argv/dataGenerator/index.js +1 -1
  383. package/lib/Argv/index.d.ts +5 -6
  384. package/lib/Argv/index.js +1 -1
  385. package/lib/AutoBox/component.json +133 -0
  386. package/lib/AutoBox/index.d.ts +3 -3
  387. package/lib/AutoBox/index.js +1 -1
  388. package/lib/AutoBox/protal.d.ts +2 -2
  389. package/lib/AutoBox/protal.js +1 -1
  390. package/lib/AutoButton/component.json +109 -0
  391. package/lib/AutoButton/index.js +1 -1
  392. package/lib/AutoTips/autoTipsMultiline/index.d.ts +1 -1
  393. package/lib/AutoTips/autoTipsMultiline/index.js +1 -1
  394. package/lib/AutoTips/component.json +121 -0
  395. package/lib/AutoTips/index.js +1 -1
  396. package/lib/Badge/component.json +92 -0
  397. package/lib/Breadcrumbs/component.json +142 -0
  398. package/lib/Breadcrumbs/index.js +1 -1
  399. package/lib/Button/SplitButton.d.ts +2 -2
  400. package/lib/Button/component.json +168 -0
  401. package/lib/Button/index.js +1 -1
  402. package/lib/ButtonGroup/component.json +132 -0
  403. package/lib/ButtonGroup/index.d.ts +1 -1
  404. package/lib/Card/component.json +162 -0
  405. package/lib/Card/index.d.ts +2 -2
  406. package/lib/Card/index.js +1 -1
  407. package/lib/Carousel/component.json +142 -0
  408. package/lib/Carousel/index.d.ts +1 -1
  409. package/lib/Cascader/Cascader.js +1 -1
  410. package/lib/Cascader/OptionList/Column.js +1 -1
  411. package/lib/Cascader/OptionList/index.js +1 -1
  412. package/lib/Cascader/component.json +196 -0
  413. package/lib/Cascader/hooks/useEntities.js +1 -1
  414. package/lib/Cascader/interface.d.ts +1 -0
  415. package/lib/Cascader/utils/commonUtil.d.ts +1 -1
  416. package/lib/Cascader/utils/commonUtil.js +1 -1
  417. package/lib/Cascader/utils/treeUtil.d.ts +14 -5
  418. package/lib/Cascader/utils/treeUtil.js +1 -1
  419. package/lib/Checkbox/component.json +138 -0
  420. package/lib/CheckboxGroup/component.json +152 -0
  421. package/lib/CheckboxGroup/index.js +1 -1
  422. package/lib/CodeEditor/component.json +189 -0
  423. package/lib/CodeEditor/index.d.ts +11 -10
  424. package/lib/CodeEditor/index.js +1 -1
  425. package/lib/Collapse/component.json +166 -0
  426. package/lib/Collapse/index.d.ts +1 -1
  427. package/lib/Collapse/index.js +1 -1
  428. package/lib/CollapseBox/component.json +84 -0
  429. package/lib/CollapseLayout/component.json +155 -0
  430. package/lib/ColorPicker/component.json +142 -0
  431. package/lib/ComboSelect/component.json +181 -0
  432. package/lib/ComboSelect/index.js +1 -1
  433. package/lib/ComboSelect/interface.d.ts +2 -2
  434. package/lib/ComboSelect/utils.d.ts +3 -3
  435. package/lib/ComboSelect/utils.js +1 -1
  436. package/lib/Container/component.json +111 -0
  437. package/lib/ContentBox/component.json +81 -0
  438. package/lib/CopyText/component.json +118 -0
  439. package/lib/CycleSelector/component.json +98 -0
  440. package/lib/CycleSelector/index.js +1 -1
  441. package/lib/DatePicker/component.json +192 -0
  442. package/lib/DatePicker/generatePicker/generateRangePicker.js +1 -1
  443. package/lib/DatePicker/generatePicker/generateSinglePicker.js +1 -1
  444. package/lib/Descriptions/component.json +142 -0
  445. package/lib/Descriptions/index.d.ts +1 -1
  446. package/lib/Desktop/component.json +171 -0
  447. package/lib/Desktop/index.js +1 -1
  448. package/lib/DragVerify/component.json +114 -0
  449. package/lib/DragVerify/index.js +1 -1
  450. package/lib/Drawer/component.json +200 -0
  451. package/lib/Drawer/index.js +1 -1
  452. package/lib/Drawer/interface.d.ts +1 -1
  453. package/lib/Drawer/util.d.ts +1 -6
  454. package/lib/Drawer/util.js +1 -1
  455. package/lib/Dropdown/component.json +147 -0
  456. package/lib/Dropdown/index.js +1 -1
  457. package/lib/DynamicMultiBox/component.json +278 -0
  458. package/lib/DynamicMultiBox/formItem.d.ts +1 -1
  459. package/lib/DynamicMultiBox/index.js +1 -1
  460. package/lib/DynamicMultiBox/rowForm.d.ts +2 -2
  461. package/lib/Empty/component.json +123 -0
  462. package/lib/Empty/index.css +1 -1
  463. package/lib/Empty/index.d.ts +2 -2
  464. package/lib/Empty/index.js +1 -1
  465. package/lib/Empty/style/index.css +1 -1
  466. package/lib/FieldForm/FieldFormItem/ItemHolder.js +1 -1
  467. package/lib/FieldForm/FieldFormItem/MemoInput.d.ts +2 -2
  468. package/lib/FieldForm/FieldFormItem/StatusProvider.js +1 -1
  469. package/lib/FieldForm/FieldFormItem/index.d.ts +6 -6
  470. package/lib/FieldForm/Form.d.ts +2 -2
  471. package/lib/FieldForm/Form.js +1 -1
  472. package/lib/FieldForm/FormItemInput.js +1 -1
  473. package/lib/FieldForm/FormItemLabel.js +1 -1
  474. package/lib/FieldForm/FormList.d.ts +2 -2
  475. package/lib/FieldForm/component.json +196 -0
  476. package/lib/FieldForm/context.d.ts +5 -1
  477. package/lib/FieldForm/context.js +1 -1
  478. package/lib/FieldForm/hooks/useForm.d.ts +4 -3
  479. package/lib/FieldForm/hooks/useFormInstance.d.ts +1 -1
  480. package/lib/FieldForm/hooks/useFormItemStatus.d.ts +9 -5
  481. package/lib/FieldForm/hooks/useFormItemStatus.js +1 -1
  482. package/lib/FieldForm/hooks/useItemRef.d.ts +1 -1
  483. package/lib/FieldForm/hooks/useItemRef.js +1 -1
  484. package/lib/Form/component.json +161 -0
  485. package/lib/Form/index.d.ts +52 -49
  486. package/lib/Form/index.js +1 -1
  487. package/lib/FormItem/compoments/defaultCompoments/index.d.ts +5 -5
  488. package/lib/FormItem/compoments/defaultCompoments/index.js +1 -1
  489. package/lib/FormItem/compoments/formCheckboxGroup/index.d.ts +2 -2
  490. package/lib/FormItem/compoments/formFile/index.js +1 -1
  491. package/lib/FormItem/compoments/formRadioGroup/index.d.ts +1 -1
  492. package/lib/FormItem/compoments/formSelect/index.d.ts +1 -1
  493. package/lib/FormItem/component.json +171 -0
  494. package/lib/FormItem/index.d.ts +5 -5
  495. package/lib/FormItem/index.js +1 -1
  496. package/lib/FormItem/itemType.js +1 -1
  497. package/lib/FunctionModal/component.json +197 -0
  498. package/lib/FunctionModal/dialog.d.ts +1 -1
  499. package/lib/FunctionModal/modalContext.d.ts +4 -1
  500. package/lib/GlobalContext/confirmLocale.js +1 -1
  501. package/lib/GlobalContext/index.js +1 -1
  502. package/lib/Help/component.json +118 -0
  503. package/lib/HelperText/component.json +126 -0
  504. package/lib/Image/PreviewGroup.js +1 -1
  505. package/lib/Image/component.json +165 -0
  506. package/lib/Image/index.js +1 -1
  507. package/lib/InputCode/component.json +191 -0
  508. package/lib/InputCode/index.d.ts +2 -2
  509. package/lib/InputLang/component.json +205 -0
  510. package/lib/InputLang/index.js +1 -1
  511. package/lib/InputNumber/component.json +162 -0
  512. package/lib/Label/component.json +126 -0
  513. package/lib/Label/index.d.ts +2 -2
  514. package/lib/Loading/component.json +91 -0
  515. package/lib/Menu/component.json +180 -0
  516. package/lib/Menu/verticalMenuList.js +1 -1
  517. package/lib/Message/component.json +246 -0
  518. package/lib/Message/index.d.ts +2 -2
  519. package/lib/Message/index.js +1 -1
  520. package/lib/Modal/Confirm/index.d.ts +1 -1
  521. package/lib/Modal/Confirm/index.js +1 -1
  522. package/lib/Modal/component.json +277 -0
  523. package/lib/Modal/index.d.ts +85 -5
  524. package/lib/Modal/index.js +1 -1
  525. package/lib/Modal/interface.d.ts +1 -0
  526. package/lib/MultiBox/component.json +216 -0
  527. package/lib/MultiBox/index.js +1 -1
  528. package/lib/Notification/component.json +184 -0
  529. package/lib/OperateBtn/component.json +134 -0
  530. package/lib/OperateBtn/index.d.ts +3 -3
  531. package/lib/PageHeader/component.json +112 -0
  532. package/lib/PageHeader/horizontalMeun.js +1 -1
  533. package/lib/PageHeader/horizontalMeunRight.js +1 -1
  534. package/lib/Pagination/component.json +181 -0
  535. package/lib/Pagination/index.js +1 -1
  536. package/lib/ParauiProvider/index.js +1 -1
  537. package/lib/PasswordRules/component.json +105 -0
  538. package/lib/PasswordRules/index.d.ts +4 -4
  539. package/lib/PopConfirm/component.json +227 -0
  540. package/lib/PopConfirm/index.d.ts +1 -1
  541. package/lib/PopConfirm/index.js +1 -1
  542. package/lib/PopMenu/component.json +131 -0
  543. package/lib/PopMenu/hooks.d.ts +1 -1
  544. package/lib/PopMenu/index.js +1 -1
  545. package/lib/Popover/component.json +165 -0
  546. package/lib/Popover/index.js +1 -1
  547. package/lib/Progress/component.json +161 -0
  548. package/lib/Prompt/component.json +144 -0
  549. package/lib/Querying/component.json +96 -0
  550. package/lib/Querying/index.css +1 -1
  551. package/lib/Querying/index.d.ts +2 -2
  552. package/lib/Querying/index.js +1 -1
  553. package/lib/Querying/style/index.css +1 -1
  554. package/lib/QuickReply/QuickReplyCode/index.js +1 -1
  555. package/lib/QuickReply/component.json +129 -0
  556. package/lib/QuickReply/index.d.ts +1 -1
  557. package/lib/Radio/component.json +136 -0
  558. package/lib/RadioGroup/component.json +149 -0
  559. package/lib/RangeInput/component.json +198 -0
  560. package/lib/RangeInput/index.js +1 -1
  561. package/lib/Result/component.json +104 -0
  562. package/lib/ScrollBar/component.json +115 -0
  563. package/lib/Search/component.json +177 -0
  564. package/lib/Search/index.d.ts +1 -1
  565. package/lib/Select/component.json +244 -0
  566. package/lib/Select/index.js +1 -1
  567. package/lib/SelectInput/component.json +184 -0
  568. package/lib/Selector/component.json +203 -0
  569. package/lib/Selector/index.js +1 -1
  570. package/lib/Selector/interface.d.ts +2 -2
  571. package/lib/Selector/selectorData/index.js +1 -1
  572. package/lib/Selector/selectorMain/index.js +1 -1
  573. package/lib/Selector/selectorNode/index.js +1 -1
  574. package/lib/Selector/util.d.ts +3 -3
  575. package/lib/Selector/util.js +1 -1
  576. package/lib/SelectorPicker/component.json +179 -0
  577. package/lib/SelectorPicker/index.d.ts +5 -5
  578. package/lib/SelectorPicker/index.js +1 -1
  579. package/lib/SingleBox/component.json +151 -0
  580. package/lib/SingleBox/index.d.ts +2 -2
  581. package/lib/Slider/component.json +181 -0
  582. package/lib/SortBox/component.json +108 -0
  583. package/lib/Status/component.json +104 -0
  584. package/lib/Stepper/component.json +129 -0
  585. package/lib/Stepper/index.d.ts +2 -2
  586. package/lib/Switch/component.json +207 -0
  587. package/lib/Switch/index.css +1 -1
  588. package/lib/Switch/index.d.ts +3 -2
  589. package/lib/Switch/index.js +1 -1
  590. package/lib/Switch/style/index.css +1 -1
  591. package/lib/Table/component.json +547 -0
  592. package/lib/Table/index.d.ts +2 -2
  593. package/lib/Table/index.js +1 -1
  594. package/lib/Table/interface.d.ts +30 -0
  595. package/lib/Table/tableHead.js +1 -1
  596. package/lib/Table/util.d.ts +1 -1
  597. package/lib/Table/util.js +1 -1
  598. package/lib/Tabs/component.json +227 -0
  599. package/lib/Tag/component.json +221 -0
  600. package/lib/Tag/index.css +1 -1
  601. package/lib/Tag/index.d.ts +1 -1
  602. package/lib/Tag/index.js +1 -1
  603. package/lib/Tag/style/index.css +1 -1
  604. package/lib/TextEditor/component.json +186 -0
  605. package/lib/TextEditor/index.d.ts +5 -5
  606. package/lib/TextEditor/index.js +1 -1
  607. package/lib/TextField/component.json +290 -0
  608. package/lib/TextField/index.d.ts +2 -2
  609. package/lib/TextField/index.js +1 -1
  610. package/lib/TimePicker/component.json +176 -0
  611. package/lib/Timeline/component.json +110 -0
  612. package/lib/Title/component.json +156 -0
  613. package/lib/ToggleButton/component.json +153 -0
  614. package/lib/ToggleButton/index.js +1 -1
  615. package/lib/Tooltip/component.json +176 -0
  616. package/lib/Tooltip/index.js +1 -1
  617. package/lib/Tooltip/interface.d.ts +14 -1
  618. package/lib/Tooltip/utils.js +1 -1
  619. package/lib/Transfer/component.json +157 -0
  620. package/lib/Tree/OperateBar/index.js +2 -2
  621. package/lib/Tree/Tree.js +1 -1
  622. package/lib/Tree/component.json +512 -0
  623. package/lib/Tree/interface.d.ts +1 -1
  624. package/lib/Upload/component.json +450 -0
  625. package/lib/Upload/util.js +1 -1
  626. package/lib/Utils/snack-kit-shims.d.ts +18 -0
  627. package/lib/Utils/snack-kit-shims.js +2 -0
  628. package/lib/Utils/type.d.ts +0 -2
  629. package/lib/_virtual/index.js +1 -1
  630. package/lib/_virtual/index2.js +1 -1
  631. package/lib/index.d.ts +2 -0
  632. package/lib/index.js +1 -1
  633. package/lib/locale/en_US.d.ts +361 -0
  634. package/lib/locale/en_US.js +2 -0
  635. package/lib/locale/index.d.ts +1 -723
  636. package/lib/locale/index2.js +2 -0
  637. package/lib/locale/zh_CN.d.ts +361 -0
  638. package/lib/locale/zh_CN.js +2 -0
  639. package/lib/node_modules/classnames/index.js +1 -1
  640. package/package.json +11 -4
  641. package/es/_virtual/index3.js +0 -5
  642. package/es/_virtual/index4.js +0 -5
  643. package/es/node_modules/@para-snack/core/dist/index.js +0 -5231
  644. package/lib/_virtual/index3.js +0 -2
  645. package/lib/_virtual/index4.js +0 -2
  646. package/lib/node_modules/@para-snack/core/dist/index.js +0 -20
  647. /package/es/{Utils/Hooks → Hooks}/useResizeObserver.d.ts +0 -0
  648. /package/es/{Utils/Hooks → Hooks}/useResizeObserver.js +0 -0
  649. /package/lib/{Utils/Hooks → Hooks}/useResizeObserver.d.ts +0 -0
  650. /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] |