@a2simcode/ui 0.0.84 → 0.0.86

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 (327) hide show
  1. package/.cursor/skills/ui-component-helper/README.md +86 -86
  2. package/.cursor/skills/ui-component-helper/SKILL.md +115 -115
  3. package/LICENSE +53 -53
  4. package/README.md +156 -156
  5. package/dist/components/input-layer/index.d.ts +1 -0
  6. package/dist/components/input-layer/src/input-layer.vue.d.ts +1 -0
  7. package/dist/components/table-panel/index.d.ts +1 -0
  8. package/dist/components/table-panel/src/table-panel.vue.d.ts +1 -0
  9. package/dist/simcode-ui.es.js +3967 -3905
  10. package/dist/simcode-ui.umd.js +2 -2
  11. package/dist/stats.html +1 -1
  12. package/dist/ui.css +1 -1
  13. package/docs/components/autocomplete.md +89 -89
  14. package/docs/components/barcode.md +101 -101
  15. package/docs/components/button-select.md +24 -24
  16. package/docs/components/button.md +117 -117
  17. package/docs/components/buttons.md +119 -119
  18. package/docs/components/cascader-select.md +114 -114
  19. package/docs/components/checkbox.md +114 -114
  20. package/docs/components/code-mirror.md +85 -85
  21. package/docs/components/collapse.md +26 -26
  22. package/docs/components/comp.md +71 -71
  23. package/docs/components/count-up.md +24 -24
  24. package/docs/components/count.md +24 -24
  25. package/docs/components/data-panel.md +24 -24
  26. package/docs/components/date.md +76 -76
  27. package/docs/components/dialog-full.md +112 -112
  28. package/docs/components/dialog.md +127 -127
  29. package/docs/components/divider.md +24 -24
  30. package/docs/components/drawer.md +127 -127
  31. package/docs/components/dynamic-layer.md +118 -118
  32. package/docs/components/echarts.md +72 -72
  33. package/docs/components/editor.md +24 -24
  34. package/docs/components/form.md +27 -27
  35. package/docs/components/guid.md +39 -39
  36. package/docs/components/hpanel.md +24 -24
  37. package/docs/components/icon.md +56 -56
  38. package/docs/components/input-button.md +24 -24
  39. package/docs/components/input-code.md +24 -24
  40. package/docs/components/input-color.md +114 -114
  41. package/docs/components/input-layer.md +26 -26
  42. package/docs/components/input-rows.md +370 -370
  43. package/docs/components/input-tag.md +50 -50
  44. package/docs/components/input.md +129 -129
  45. package/docs/components/layer-form.md +61 -61
  46. package/docs/components/layer.md +127 -127
  47. package/docs/components/layout.md +132 -132
  48. package/docs/components/map.md +24 -24
  49. package/docs/components/menu.md +121 -121
  50. package/docs/components/meta/button.ts +212 -212
  51. package/docs/components/meta/buttons.ts +76 -76
  52. package/docs/components/meta/comp.ts +242 -242
  53. package/docs/components/meta/date.ts +256 -256
  54. package/docs/components/meta/echarts.ts +64 -64
  55. package/docs/components/meta/form.ts +165 -165
  56. package/docs/components/meta/input-cards.ts +112 -112
  57. package/docs/components/meta/input-color.ts +243 -243
  58. package/docs/components/meta/input-rows.ts +113 -113
  59. package/docs/components/meta/input.ts +23 -1
  60. package/docs/components/meta/layer-form.ts +56 -56
  61. package/docs/components/meta/map.ts +68 -68
  62. package/docs/components/meta/page.ts +46 -46
  63. package/docs/components/meta/panel.ts +152 -152
  64. package/docs/components/meta/slider.ts +270 -270
  65. package/docs/components/meta/table.ts +363 -363
  66. package/docs/components/meta/tabs.ts +146 -146
  67. package/docs/components/meta/tree-select.ts +199 -199
  68. package/docs/components/meta/workflow-viewer.ts +55 -55
  69. package/docs/components/meta/workflow.ts +113 -113
  70. package/docs/components/number.md +124 -124
  71. package/docs/components/page.md +87 -87
  72. package/docs/components/panel.md +37 -37
  73. package/docs/components/radio.md +87 -87
  74. package/docs/components/rate.md +71 -71
  75. package/docs/components/select.md +133 -133
  76. package/docs/components/slider-captcha.md +41 -41
  77. package/docs/components/slider.md +101 -101
  78. package/docs/components/switch.md +90 -90
  79. package/docs/components/table-panel.md +218 -218
  80. package/docs/components/table.md +319 -319
  81. package/docs/components/tabs.md +26 -26
  82. package/docs/components/title.md +24 -24
  83. package/docs/components/tree.md +207 -207
  84. package/docs/components/upload.md +117 -117
  85. package/docs/components/workflow-viewer.md +21 -21
  86. package/docs/components/workflow.md +21 -21
  87. package/docs/examples/autocomplete/advanced.vue +35 -35
  88. package/docs/examples/autocomplete/basic.vue +32 -32
  89. package/docs/examples/autocomplete/clearable.vue +33 -33
  90. package/docs/examples/autocomplete/custom-template.vue +49 -49
  91. package/docs/examples/autocomplete/disabled.vue +33 -33
  92. package/docs/examples/autocomplete/icon.vue +37 -37
  93. package/docs/examples/barcode/all-types.vue +380 -380
  94. package/docs/examples/barcode/basic.vue +14 -14
  95. package/docs/examples/barcode/props-appearance.vue +243 -243
  96. package/docs/examples/barcode/props-geometry.vue +143 -143
  97. package/docs/examples/barcode/props-logic.vue +216 -216
  98. package/docs/examples/barcode/props-symbology.vue +199 -199
  99. package/docs/examples/barcode/props-text.vue +268 -268
  100. package/docs/examples/button/basic.vue +7 -7
  101. package/docs/examples/button/danger-ghost.vue +17 -17
  102. package/docs/examples/button/disabled.vue +10 -10
  103. package/docs/examples/button/loading.vue +6 -6
  104. package/docs/examples/button/shape.vue +7 -7
  105. package/docs/examples/button/size.vue +14 -14
  106. package/docs/examples/button/type.vue +9 -9
  107. package/docs/examples/button-select/basic.vue +19 -19
  108. package/docs/examples/buttons/basic.vue +45 -45
  109. package/docs/examples/buttons/disabled.vue +36 -36
  110. package/docs/examples/buttons/dropdown.vue +63 -63
  111. package/docs/examples/buttons/group.vue +52 -52
  112. package/docs/examples/buttons/link.vue +47 -47
  113. package/docs/examples/buttons/popup.vue +39 -39
  114. package/docs/examples/buttons/size.vue +45 -45
  115. package/docs/examples/cascader-select/basic.vue +28 -28
  116. package/docs/examples/cascader-select/clearable.vue +34 -34
  117. package/docs/examples/cascader-select/disabled.vue +43 -43
  118. package/docs/examples/cascader-select/filterable.vue +37 -37
  119. package/docs/examples/cascader-select/methods.vue +84 -84
  120. package/docs/examples/cascader-select/multiple.vue +38 -38
  121. package/docs/examples/cascader-select/slot.vue +45 -45
  122. package/docs/examples/checkbox/basic.vue +18 -18
  123. package/docs/examples/checkbox/button.vue +19 -19
  124. package/docs/examples/checkbox/color.vue +25 -25
  125. package/docs/examples/checkbox/disabled.vue +17 -17
  126. package/docs/examples/checkbox/min-max.vue +20 -20
  127. package/docs/examples/checkbox/mixed.vue +56 -56
  128. package/docs/examples/checkbox/size.vue +28 -28
  129. package/docs/examples/code-mirror/basic.vue +11 -11
  130. package/docs/examples/code-mirror/events.vue +42 -42
  131. package/docs/examples/code-mirror/height.vue +25 -25
  132. package/docs/examples/code-mirror/mode.vue +33 -33
  133. package/docs/examples/code-mirror/readonly.vue +14 -14
  134. package/docs/examples/collapse/basic.vue +82 -82
  135. package/docs/examples/comp/basic.vue +7 -7
  136. package/docs/examples/comp/collapse.vue +38 -38
  137. package/docs/examples/comp/tabs.vue +38 -38
  138. package/docs/examples/count/basic.vue +54 -54
  139. package/docs/examples/count-up/basic.vue +89 -89
  140. package/docs/examples/data-panel/basic.vue +110 -110
  141. package/docs/examples/date/basic.vue +73 -73
  142. package/docs/examples/date/default-value.vue +59 -59
  143. package/docs/examples/date/format.vue +75 -75
  144. package/docs/examples/date/range.vue +66 -66
  145. package/docs/examples/date/types.vue +79 -79
  146. package/docs/examples/dialog/basic.vue +36 -36
  147. package/docs/examples/dialog/custom-buttons.vue +44 -44
  148. package/docs/examples/dialog/fullscreen.vue +23 -23
  149. package/docs/examples/dialog/no-mask.vue +17 -17
  150. package/docs/examples/dialog/size.vue +44 -44
  151. package/docs/examples/dialog/steps.vue +57 -57
  152. package/docs/examples/dialog-full/basic.vue +29 -29
  153. package/docs/examples/dialog-full/custom-buttons.vue +45 -45
  154. package/docs/examples/dialog-full/no-buttons.vue +18 -18
  155. package/docs/examples/dialog-full/no-header.vue +27 -27
  156. package/docs/examples/dialog-full/steps.vue +71 -71
  157. package/docs/examples/divider/basic.vue +52 -52
  158. package/docs/examples/drawer/basic.vue +35 -35
  159. package/docs/examples/drawer/custom-buttons.vue +34 -34
  160. package/docs/examples/drawer/direction.vue +47 -47
  161. package/docs/examples/drawer/mask.vue +36 -36
  162. package/docs/examples/drawer/no-buttons.vue +20 -20
  163. package/docs/examples/drawer/size.vue +28 -28
  164. package/docs/examples/dynamic-layer/basic.vue +33 -33
  165. package/docs/examples/dynamic-layer/custom-buttons.vue +43 -43
  166. package/docs/examples/dynamic-layer/form.vue +73 -73
  167. package/docs/examples/dynamic-layer/steps.vue +52 -52
  168. package/docs/examples/dynamic-layer/types.vue +40 -40
  169. package/docs/examples/echarts/basic.vue +31 -31
  170. package/docs/examples/echarts/dynamic.vue +43 -43
  171. package/docs/examples/echarts/line.vue +46 -46
  172. package/docs/examples/echarts/pie.vue +44 -44
  173. package/docs/examples/editor/basic.vue +15 -15
  174. package/docs/examples/form/basic.vue +456 -456
  175. package/docs/examples/guid/basic.vue +10 -10
  176. package/docs/examples/guid/size.vue +13 -13
  177. package/docs/examples/hpanel/basic.vue +79 -79
  178. package/docs/examples/icon/basic.vue +9 -9
  179. package/docs/examples/icon/rotate-flip.vue +9 -9
  180. package/docs/examples/icon/size.vue +7 -7
  181. package/docs/examples/input/basic.vue +10 -10
  182. package/docs/examples/input/clearable.vue +12 -12
  183. package/docs/examples/input/disabled.vue +6 -6
  184. package/docs/examples/input/icon.vue +23 -23
  185. package/docs/examples/input/password.vue +18 -18
  186. package/docs/examples/input/size.vue +13 -13
  187. package/docs/examples/input/textarea.vue +25 -25
  188. package/docs/examples/input/word-limit.vue +28 -28
  189. package/docs/examples/input-button/basic.vue +33 -33
  190. package/docs/examples/input-code/basic.vue +29 -29
  191. package/docs/examples/input-color/basic.vue +10 -10
  192. package/docs/examples/input-color/disabled.vue +13 -13
  193. package/docs/examples/input-color/format.vue +17 -17
  194. package/docs/examples/input-color/no-alpha.vue +13 -13
  195. package/docs/examples/input-color/only-button.vue +15 -15
  196. package/docs/examples/input-color/predefine.vue +31 -31
  197. package/docs/examples/input-color/size.vue +15 -15
  198. package/docs/examples/input-layer/basic.vue +69 -69
  199. package/docs/examples/input-rows/basic.vue +73 -73
  200. package/docs/examples/input-rows/drag.vue +48 -48
  201. package/docs/examples/input-rows/layer-form.vue +85 -85
  202. package/docs/examples/input-rows/nested.vue +91 -91
  203. package/docs/examples/input-tag/basic.vue +27 -27
  204. package/docs/examples/input-tag/colors.vue +23 -23
  205. package/docs/examples/input-tag/readonly.vue +17 -17
  206. package/docs/examples/layer/basic.vue +43 -43
  207. package/docs/examples/layer/custom-buttons.vue +61 -61
  208. package/docs/examples/layer/drawer.vue +37 -37
  209. package/docs/examples/layer/full.vue +38 -38
  210. package/docs/examples/layer/modal.vue +34 -34
  211. package/docs/examples/layer/steps.vue +46 -46
  212. package/docs/examples/layer-form/basic.vue +76 -76
  213. package/docs/examples/layer-form/config.vue +82 -82
  214. package/docs/examples/layer-form/size.vue +72 -72
  215. package/docs/examples/layout/basic.vue +36 -36
  216. package/docs/examples/layout/custom-size.vue +50 -50
  217. package/docs/examples/layout/disable-move.vue +37 -37
  218. package/docs/examples/layout/hide-mid-when-narrow.vue +96 -96
  219. package/docs/examples/layout/min-size.vue +73 -73
  220. package/docs/examples/layout/percent-size.vue +80 -80
  221. package/docs/examples/layout/simple.vue +22 -22
  222. package/docs/examples/layout/top-side.vue +34 -34
  223. package/docs/examples/map/basic.vue +22 -22
  224. package/docs/examples/menu/basic.vue +58 -58
  225. package/docs/examples/menu/collapsed.vue +49 -49
  226. package/docs/examples/menu/horizontal.vue +44 -44
  227. package/docs/examples/menu/selection-test.vue +104 -104
  228. package/docs/examples/menu/theme.vue +46 -46
  229. package/docs/examples/menu/vertical.vue +46 -46
  230. package/docs/examples/number/advanced.vue +143 -143
  231. package/docs/examples/number/basic.vue +63 -63
  232. package/docs/examples/number/disabled.vue +49 -49
  233. package/docs/examples/number/size.vue +42 -42
  234. package/docs/examples/number/slots.vue +123 -123
  235. package/docs/examples/number/step-strictly.vue +41 -41
  236. package/docs/examples/number/step.vue +47 -47
  237. package/docs/examples/page/basic.vue +41 -41
  238. package/docs/examples/page/dept-user-management.vue +211 -211
  239. package/docs/examples/page/init.vue +87 -87
  240. package/docs/examples/page/log.vue +453 -453
  241. package/docs/examples/page/user-management.vue +313 -313
  242. package/docs/examples/panel/tool-buttons.vue +18 -18
  243. package/docs/examples/radio/basic.vue +17 -17
  244. package/docs/examples/radio/button.vue +17 -17
  245. package/docs/examples/radio/color.vue +18 -18
  246. package/docs/examples/radio/disabled.vue +17 -17
  247. package/docs/examples/radio/size.vue +29 -29
  248. package/docs/examples/rate/basic.vue +24 -24
  249. package/docs/examples/rate/half.vue +24 -24
  250. package/docs/examples/rate/readonly.vue +11 -11
  251. package/docs/examples/rate/text.vue +32 -32
  252. package/docs/examples/select/basic.vue +16 -16
  253. package/docs/examples/select/clearable.vue +22 -22
  254. package/docs/examples/select/disabled.vue +31 -31
  255. package/docs/examples/select/filterable.vue +24 -24
  256. package/docs/examples/select/group.vue +23 -23
  257. package/docs/examples/select/icon.vue +16 -16
  258. package/docs/examples/select/multiple.vue +18 -18
  259. package/docs/examples/select/size.vue +39 -39
  260. package/docs/examples/slider/basic.vue +42 -42
  261. package/docs/examples/slider/disabled.vue +17 -17
  262. package/docs/examples/slider/marks.vue +30 -30
  263. package/docs/examples/slider/size.vue +37 -37
  264. package/docs/examples/slider/tooltip.vue +36 -36
  265. package/docs/examples/slider/vertical.vue +26 -26
  266. package/docs/examples/slider-captcha/basic.vue +44 -44
  267. package/docs/examples/slider-captcha/custom.vue +48 -48
  268. package/docs/examples/switch/basic.vue +16 -16
  269. package/docs/examples/switch/disabled.vue +13 -13
  270. package/docs/examples/switch/loading.vue +13 -13
  271. package/docs/examples/switch/size.vue +15 -15
  272. package/docs/examples/switch/text.vue +13 -13
  273. package/docs/examples/table/actions.vue +116 -116
  274. package/docs/examples/table/add-row.vue +103 -103
  275. package/docs/examples/table/basic.vue +168 -168
  276. package/docs/examples/table/custom-layout.vue +115 -115
  277. package/docs/examples/table/editable.vue +262 -262
  278. package/docs/examples/table/field-selection.vue +87 -87
  279. package/docs/examples/table/frozen-column.vue +140 -140
  280. package/docs/examples/table/height-mode.vue +99 -99
  281. package/docs/examples/table/icon.vue +85 -85
  282. package/docs/examples/table/link.vue +66 -66
  283. package/docs/examples/table/multiple.vue +178 -178
  284. package/docs/examples/table/pagination.vue +151 -151
  285. package/docs/examples/table/single-selection.vue +64 -64
  286. package/docs/examples/table/sub-table-lazy.vue +97 -97
  287. package/docs/examples/table/sub-table.vue +103 -103
  288. package/docs/examples/table/tag.vue +43 -43
  289. package/docs/examples/table/tree-column.vue +119 -119
  290. package/docs/examples/table/tree-data.vue +141 -141
  291. package/docs/examples/table/tree-lazy.vue +80 -80
  292. package/docs/examples/table-panel/basic.vue +228 -228
  293. package/docs/examples/table-panel/batch-operations.vue +285 -285
  294. package/docs/examples/table-panel/filter.vue +219 -219
  295. package/docs/examples/table-panel/multiple-selection.vue +243 -243
  296. package/docs/examples/table-panel/pagination.vue +133 -133
  297. package/docs/examples/table-panel/sub-table-lazy.vue +118 -118
  298. package/docs/examples/tabs/basic.vue +98 -98
  299. package/docs/examples/title/basic.vue +80 -80
  300. package/docs/examples/tree/accordion.vue +46 -46
  301. package/docs/examples/tree/basic.vue +50 -50
  302. package/docs/examples/tree/buttons.vue +53 -53
  303. package/docs/examples/tree/checkable.vue +52 -52
  304. package/docs/examples/tree/custom-keys.vue +39 -39
  305. package/docs/examples/tree/default-expanded.vue +52 -52
  306. package/docs/examples/tree/draggable.vue +29 -29
  307. package/docs/examples/tree/expand-on-click.vue +39 -39
  308. package/docs/examples/tree/flat-data.vue +20 -20
  309. package/docs/examples/tree/icon.vue +40 -40
  310. package/docs/examples/tree/load-data.vue +37 -37
  311. package/docs/examples/tree/methods.vue +74 -74
  312. package/docs/examples/tree/theme.vue +33 -33
  313. package/docs/examples/upload/accept.vue +31 -31
  314. package/docs/examples/upload/basic.vue +12 -12
  315. package/docs/examples/upload/drag.vue +11 -11
  316. package/docs/examples/upload/image.vue +17 -17
  317. package/docs/examples/upload/limit.vue +20 -20
  318. package/docs/examples/upload/multiple.vue +17 -17
  319. package/docs/examples/upload/readonly.vue +17 -17
  320. package/docs/examples/utils/cipher.vue +160 -160
  321. package/docs/examples/utils/common.vue +153 -153
  322. package/docs/examples/utils/date.vue +56 -56
  323. package/docs/examples/utils/dom.vue +52 -52
  324. package/docs/examples/utils/is.vue +70 -70
  325. package/docs/examples/workflow/basic.vue +265 -265
  326. package/docs/examples/workflow-viewer/basic.vue +248 -248
  327. package/package.json +23 -23
@@ -1,370 +1,370 @@
1
- # InputRows 行输入
2
-
3
- `j-input-rows` 用于维护“多行对象数组”类型的数据:每一行通过 `columns` 渲染若干输入控件,支持新增行、删除行,以及(可选)拖拽排序。
4
-
5
- ## 基础用法
6
-
7
- 通过 `columns` 属性定义列配置,`v-model` 绑定数据。
8
-
9
- <Demo :source-code="basicCode">
10
- <template #source>
11
- <basic />
12
- </template>
13
- <template #description>
14
- 使用 `j-input-rows` 创建一个可编辑的数据表格。每行包含多个字段,支持添加、删除行操作。
15
- </template>
16
- </Demo>
17
-
18
- ## 拖拽排序
19
-
20
- 通过 `editConfig.drag` 属性启用拖拽排序功能。
21
-
22
- <Demo :source-code="dragCode">
23
- <template #source>
24
- <drag />
25
- </template>
26
- <template #description>
27
- 设置 `editConfig.drag` 为 `true` 启用拖拽排序功能,可以通过拖拽图标调整行的顺序。
28
- </template>
29
- </Demo>
30
-
31
- ## 嵌套表单
32
-
33
- 支持在行内嵌套 `j-input-rows` 组件,实现多层级的数据录入。
34
-
35
- <Demo :source-code="nestedCode">
36
- <template #source>
37
- <nested />
38
- </template>
39
- <template #description>
40
- 示例展示在列配置中使用嵌套能力来录入多层级数据结构。
41
- </template>
42
- </Demo>
43
-
44
- ## API(表格)
45
-
46
- <ApiTable :data="inputRowsApi" componentName="input-rows" />
47
-
48
- ## 1. 组件概述
49
-
50
- ### 主要功能和用途
51
-
52
- - 行级数据维护:`modelValue` 为对象数组,每个对象代表一行。
53
- - 行内字段渲染:通过 `columns` 逐列渲染行内输入控件(内部使用 `j-comp` 动态渲染)。
54
- - 编辑能力:添加、删除、拖拽排序(由 `editConfig` 控制)。
55
- - 辅助展示:支持显示行序号(1,2,3...)或字母序号(A-Z 循环)。
56
-
57
- ### 适用的业务场景和使用限制
58
-
59
- 适用场景:
60
-
61
- - 表单里需要录入可变数量条目:如“联系人列表”“参数列表”“阈值配置”“规则列表”等。
62
- - 需要一个轻量的列表型编辑器,但又不想引入完整表格组件。
63
-
64
- 限制/注意事项:
65
-
66
- - 组件会对数组进行就地修改(`push/splice`),并可能对每行对象补充唯一标识字段 `i`(UUID)。请避免把业务字段命名为 `i`。
67
- - 当 `modelValue` 为空数组时,组件会在初始化时触发一次 `update:modelValue([])`;后续新增/删除/排序主要依赖就地修改与 `change` 事件。
68
- - `change` 事件中的 `formData` 来自表单注入;不在 `j-form` 环境使用时,`formData` 可能为 `undefined`。
69
-
70
- ## 2. 属性说明(Props)
71
-
72
- > 下文“类型/默认值”以组件源码为准。
73
-
74
- ### 2.1 组件属性
75
-
76
- #### modelValue
77
-
78
- - 名称:`modelValue`
79
- - 类型:`Record<string, any>[]`
80
- - 默认值:`[]`
81
- - 是否必填:否(通常与 `v-model` 搭配)
82
- - 详细描述:行数据数组。每项是一个对象,字段写入到行对象上的 key 通常来自 `columns[*].id`,也可通过 `columns[*].config.valueRowKey` 指定。
83
- - 使用示例:
84
-
85
- ```vue
86
- <template>
87
- <j-input-rows v-model="rows" :columns="columns" />
88
- </template>
89
-
90
- <script setup lang="ts">
91
- import { ref } from 'vue'
92
-
93
- const rows = ref<Record<string, any>[]>([
94
- { i: '1', name: '张三', age: 18 },
95
- { i: '2', name: '李四', age: 20 },
96
- ])
97
- </script>
98
- ```
99
-
100
- #### columns
101
-
102
- - 名称:`columns`
103
- - 类型:`SchemaConfig[]`
104
- - 默认值:`[]`
105
- - 是否必填:是
106
- - 详细描述:列配置数组。每个列配置会被透传给 `j-comp` 渲染为具体输入控件。
107
- - 使用示例:
108
-
109
- ```ts
110
- const columns = [
111
- {
112
- id: 'name',
113
- type: 'j-input',
114
- config: { label: '姓名', placeholder: '请输入姓名', defaultValue: '' },
115
- },
116
- {
117
- id: 'age',
118
- type: 'j-number',
119
- config: { label: '年龄', placeholder: '请输入年龄', defaultValue: 0, min: 0, max: 150 },
120
- },
121
- ]
122
- ```
123
-
124
- #### editConfig
125
-
126
- - 名称:`editConfig`
127
- - 类型:`EditConfigType`
128
- - 默认值:`{}`
129
- - 是否必填:否
130
- - 详细描述:编辑配置,控制添加/删除/只读/拖拽等行为。
131
- - 使用示例:
132
-
133
- ```ts
134
- const editConfig = {
135
- isAddBtn: true,
136
- isRemoveBtn: true,
137
- addBtnText: '添加一行',
138
- buttonsAlign: 'left',
139
- readonly: false,
140
- drag: true,
141
- isNullValue: true,
142
- }
143
- ```
144
-
145
- #### isCompact
146
-
147
- - 名称:`isCompact`
148
- - 类型:`Boolean`
149
- - 默认值:`false`
150
- - 是否必填:否
151
- - 详细描述:是否紧凑模式(行高与 padding 更小)。
152
- - 使用示例:`<j-input-rows v-model="rows" :columns="columns" is-compact />`
153
-
154
- #### showNum
155
-
156
- - 名称:`showNum`
157
- - 类型:`Boolean`
158
- - 默认值:`false`
159
- - 是否必填:否
160
- - 详细描述:是否显示行序号(1,2,3...)。
161
- - 使用示例:`<j-input-rows v-model="rows" :columns="columns" show-num />`
162
-
163
- #### showChar
164
-
165
- - 名称:`showChar`
166
- - 类型:`Boolean`
167
- - 默认值:`false`
168
- - 是否必填:否
169
- - 详细描述:是否显示字母序号(A-Z 循环)。
170
- - 使用示例:`<j-input-rows v-model="rows" :columns="columns" show-char />`
171
-
172
- #### isWrap
173
-
174
- - 名称:`isWrap`
175
- - 类型:`Boolean`
176
- - 默认值:`false`
177
- - 是否必填:否
178
- - 详细描述:是否允许行内字段换行(`flex-wrap: wrap`)。
179
- - 使用示例:`<j-input-rows v-model="rows" :columns="columns" is-wrap />`
180
-
181
- #### id
182
-
183
- - 名称:`id`
184
- - 类型:`String`
185
- - 默认值:`''`
186
- - 是否必填:否
187
- - 详细描述:字段/组件 id。该值会原样透传到 `change` 事件的回调参数 `payload.id` 中,用于区分来源。
188
- - 使用示例:`<j-input-rows id="user-list" v-model="rows" :columns="columns" />`
189
-
190
- ### 2.2 EditConfigType 说明
191
-
192
- #### isAddBtn
193
-
194
- - 名称:`isAddBtn`
195
- - 类型:`Boolean`
196
- - 默认值:`true`(逻辑为 `!== false` 即显示)
197
- - 是否必填:否
198
- - 详细描述:是否显示添加按钮。
199
- - 使用示例:`editConfig: { isAddBtn: false }`
200
-
201
- #### addBtnText
202
-
203
- - 名称:`addBtnText`
204
- - 类型:`String`
205
- - 默认值:`'添加'`
206
- - 是否必填:否
207
- - 详细描述:添加按钮文本。
208
- - 使用示例:`editConfig: { addBtnText: '新增条目' }`
209
-
210
- #### buttonsAlign
211
-
212
- - 名称:`buttonsAlign`
213
- - 类型:`'left' | 'center' | 'right'`
214
- - 默认值:`'left'`
215
- - 是否必填:否
216
- - 详细描述:底部操作区(添加按钮区域)对齐方式。
217
- - 使用示例:`editConfig: { buttonsAlign: 'right' }`
218
-
219
- #### isRemoveBtn
220
-
221
- - 名称:`isRemoveBtn`
222
- - 类型:`Boolean`
223
- - 默认值:`true`(逻辑为 `!== false` 即显示)
224
- - 是否必填:否
225
- - 详细描述:是否显示删除按钮。
226
- - 使用示例:`editConfig: { isRemoveBtn: false }`
227
-
228
- #### readonly
229
-
230
- - 名称:`readonly`
231
- - 类型:`Boolean`
232
- - 默认值:`false`
233
- - 是否必填:否
234
- - 详细描述:是否只读。为 `true` 时隐藏添加/删除操作区;行内输入控件是否只读取决于列配置本身。
235
- - 使用示例:`editConfig: { readonly: true }`
236
-
237
- #### drag
238
-
239
- - 名称:`drag`
240
- - 类型:`Boolean`
241
- - 默认值:`false`
242
- - 是否必填:否
243
- - 详细描述:是否支持拖拽排序。开启后每行会显示拖拽手柄图标。
244
- - 使用示例:`editConfig: { drag: true }`
245
-
246
- #### isNullValue
247
-
248
- - 名称:`isNullValue`
249
- - 类型:`Boolean`
250
- - 默认值:`true`(逻辑为 `!== false` 即允许“可删到空”)
251
- - 是否必填:否
252
- - 详细描述:是否允许删除到空。当 `isNullValue === false` 时,仅当 `list.length > 1` 才显示删除按钮(禁止删除最后一行)。
253
- - 使用示例:`editConfig: { isNullValue: false }`
254
-
255
- ## 3. 事件说明(Events)
256
-
257
- ### update:modelValue
258
-
259
- - 事件名称:`update:modelValue`
260
- - 触发条件:初始化时 `modelValue` 为空数组会触发一次;其他场景通常依赖数组就地修改,不保证每次新增/删除/排序都触发该事件。
261
- - 回调参数:`value: Record<string, any>[]`
262
-
263
- ### change
264
-
265
- - 事件名称:`change`
266
- - 触发条件:新增行、删除行、拖拽排序后触发。
267
- - 回调参数说明:
268
-
269
- ```ts
270
- type InputRowsChangePayload = {
271
- id: string
272
- value: any
273
- data: any
274
- formData: Record<string, any> | undefined
275
- tableData: Record<string, any>[]
276
- type: 'add' | 'delete' | 'update' | 'sort'
277
- }
278
- ```
279
-
280
- ### rowChange
281
-
282
- - 事件名称:`rowChange`
283
- - 触发条件:行内字段变化时触发(由内部注入的 `rowChange` 回调触发)。
284
- - 回调参数说明:`data: Record<string, any>`(透传自内部 `j-comp` 的变更数据)
285
-
286
- ## 4. 方法说明(Methods)
287
-
288
- - 当前版本未通过 `defineExpose` 暴露任何公共方法。
289
-
290
- ## 5. 插槽说明(Slots)
291
-
292
- - 当前版本不支持插槽。
293
-
294
- ## 6. 使用示例(进阶)
295
-
296
- ### 6.1 新增行默认值(defaultValue)与字段落点(valueRowKey)
297
-
298
- ```ts
299
- const columns = [
300
- { id: 'name', type: 'j-input', config: { label: '名称', defaultValue: '未命名' } },
301
- {
302
- id: 'amount',
303
- type: 'j-number',
304
- config: { label: '金额', defaultValue: 0, valueRowKey: 'price' },
305
- },
306
- ]
307
- ```
308
-
309
- 点击“添加”后,新行会写入到行对象的 `price` 字段(而不是 `amount`),形如:`{ i: 'uuid', name: '未命名', price: 0 }`。
310
-
311
- ### 6.2 不允许删到空(isNullValue: false)
312
-
313
- ```vue
314
- <template>
315
- <j-input-rows
316
- v-model="rows"
317
- :columns="columns"
318
- :edit-config="{ isNullValue: false, isRemoveBtn: true }"
319
- />
320
- </template>
321
- ```
322
-
323
- 当 `rows.length === 1` 时不显示删除按钮。
324
-
325
- ## 7. 样式定制
326
-
327
- ### 7.1 可自定义的 CSS 变量
328
-
329
- 组件样式使用到以下 CSS 变量(来自主题系统):
330
-
331
- - `--j-color-hover`
332
- - `--j-color-text-secondary`
333
- - `--j-color-text`
334
- - `--j-color-primary`
335
- - `--j-color-danger`
336
-
337
- ### 7.2 样式覆盖指南
338
-
339
- 组件关键类名:
340
-
341
- - 根容器:`.j-input-rows`
342
- - 单行容器:`.j-space` / `.j-space-compact`,并可叠加 `.j-space-wrap`
343
- - 序号/字母:`.j-input-rows-num` / `.j-input-rows-char`
344
- - 拖拽图标:`.j-input-rows-drag`
345
- - 删除图标:`.j-input-rows-delete`
346
- - 操作区:`.j-input-rows-actions`
347
-
348
- 覆盖示例:
349
-
350
- ```css
351
- .j-input-rows .j-space:hover,
352
- .j-input-rows .j-space-compact:hover {
353
- background-color: rgba(0, 0, 0, 0.04);
354
- }
355
-
356
- .j-input-rows-actions {
357
- margin-top: 12px;
358
- }
359
- ```
360
-
361
- <script setup>
362
- import Basic from '../examples/input-rows/basic.vue'
363
- import Drag from '../examples/input-rows/drag.vue'
364
- import Nested from '../examples/input-rows/nested.vue'
365
- import inputRowsApi from './meta/input-rows'
366
-
367
- import basicCode from '../examples/input-rows/basic.vue?raw'
368
- import dragCode from '../examples/input-rows/drag.vue?raw'
369
- import nestedCode from '../examples/input-rows/nested.vue?raw'
370
- </script>
1
+ # InputRows 行输入
2
+
3
+ `j-input-rows` 用于维护“多行对象数组”类型的数据:每一行通过 `columns` 渲染若干输入控件,支持新增行、删除行,以及(可选)拖拽排序。
4
+
5
+ ## 基础用法
6
+
7
+ 通过 `columns` 属性定义列配置,`v-model` 绑定数据。
8
+
9
+ <Demo :source-code="basicCode">
10
+ <template #source>
11
+ <basic />
12
+ </template>
13
+ <template #description>
14
+ 使用 `j-input-rows` 创建一个可编辑的数据表格。每行包含多个字段,支持添加、删除行操作。
15
+ </template>
16
+ </Demo>
17
+
18
+ ## 拖拽排序
19
+
20
+ 通过 `editConfig.drag` 属性启用拖拽排序功能。
21
+
22
+ <Demo :source-code="dragCode">
23
+ <template #source>
24
+ <drag />
25
+ </template>
26
+ <template #description>
27
+ 设置 `editConfig.drag` 为 `true` 启用拖拽排序功能,可以通过拖拽图标调整行的顺序。
28
+ </template>
29
+ </Demo>
30
+
31
+ ## 嵌套表单
32
+
33
+ 支持在行内嵌套 `j-input-rows` 组件,实现多层级的数据录入。
34
+
35
+ <Demo :source-code="nestedCode">
36
+ <template #source>
37
+ <nested />
38
+ </template>
39
+ <template #description>
40
+ 示例展示在列配置中使用嵌套能力来录入多层级数据结构。
41
+ </template>
42
+ </Demo>
43
+
44
+ ## API(表格)
45
+
46
+ <ApiTable :data="inputRowsApi" componentName="input-rows" />
47
+
48
+ ## 1. 组件概述
49
+
50
+ ### 主要功能和用途
51
+
52
+ - 行级数据维护:`modelValue` 为对象数组,每个对象代表一行。
53
+ - 行内字段渲染:通过 `columns` 逐列渲染行内输入控件(内部使用 `j-comp` 动态渲染)。
54
+ - 编辑能力:添加、删除、拖拽排序(由 `editConfig` 控制)。
55
+ - 辅助展示:支持显示行序号(1,2,3...)或字母序号(A-Z 循环)。
56
+
57
+ ### 适用的业务场景和使用限制
58
+
59
+ 适用场景:
60
+
61
+ - 表单里需要录入可变数量条目:如“联系人列表”“参数列表”“阈值配置”“规则列表”等。
62
+ - 需要一个轻量的列表型编辑器,但又不想引入完整表格组件。
63
+
64
+ 限制/注意事项:
65
+
66
+ - 组件会对数组进行就地修改(`push/splice`),并可能对每行对象补充唯一标识字段 `i`(UUID)。请避免把业务字段命名为 `i`。
67
+ - 当 `modelValue` 为空数组时,组件会在初始化时触发一次 `update:modelValue([])`;后续新增/删除/排序主要依赖就地修改与 `change` 事件。
68
+ - `change` 事件中的 `formData` 来自表单注入;不在 `j-form` 环境使用时,`formData` 可能为 `undefined`。
69
+
70
+ ## 2. 属性说明(Props)
71
+
72
+ > 下文“类型/默认值”以组件源码为准。
73
+
74
+ ### 2.1 组件属性
75
+
76
+ #### modelValue
77
+
78
+ - 名称:`modelValue`
79
+ - 类型:`Record<string, any>[]`
80
+ - 默认值:`[]`
81
+ - 是否必填:否(通常与 `v-model` 搭配)
82
+ - 详细描述:行数据数组。每项是一个对象,字段写入到行对象上的 key 通常来自 `columns[*].id`,也可通过 `columns[*].config.valueRowKey` 指定。
83
+ - 使用示例:
84
+
85
+ ```vue
86
+ <template>
87
+ <j-input-rows v-model="rows" :columns="columns" />
88
+ </template>
89
+
90
+ <script setup lang="ts">
91
+ import { ref } from 'vue'
92
+
93
+ const rows = ref<Record<string, any>[]>([
94
+ { i: '1', name: '张三', age: 18 },
95
+ { i: '2', name: '李四', age: 20 },
96
+ ])
97
+ </script>
98
+ ```
99
+
100
+ #### columns
101
+
102
+ - 名称:`columns`
103
+ - 类型:`SchemaConfig[]`
104
+ - 默认值:`[]`
105
+ - 是否必填:是
106
+ - 详细描述:列配置数组。每个列配置会被透传给 `j-comp` 渲染为具体输入控件。
107
+ - 使用示例:
108
+
109
+ ```ts
110
+ const columns = [
111
+ {
112
+ id: 'name',
113
+ type: 'j-input',
114
+ config: { label: '姓名', placeholder: '请输入姓名', defaultValue: '' },
115
+ },
116
+ {
117
+ id: 'age',
118
+ type: 'j-number',
119
+ config: { label: '年龄', placeholder: '请输入年龄', defaultValue: 0, min: 0, max: 150 },
120
+ },
121
+ ]
122
+ ```
123
+
124
+ #### editConfig
125
+
126
+ - 名称:`editConfig`
127
+ - 类型:`EditConfigType`
128
+ - 默认值:`{}`
129
+ - 是否必填:否
130
+ - 详细描述:编辑配置,控制添加/删除/只读/拖拽等行为。
131
+ - 使用示例:
132
+
133
+ ```ts
134
+ const editConfig = {
135
+ isAddBtn: true,
136
+ isRemoveBtn: true,
137
+ addBtnText: '添加一行',
138
+ buttonsAlign: 'left',
139
+ readonly: false,
140
+ drag: true,
141
+ isNullValue: true,
142
+ }
143
+ ```
144
+
145
+ #### isCompact
146
+
147
+ - 名称:`isCompact`
148
+ - 类型:`Boolean`
149
+ - 默认值:`false`
150
+ - 是否必填:否
151
+ - 详细描述:是否紧凑模式(行高与 padding 更小)。
152
+ - 使用示例:`<j-input-rows v-model="rows" :columns="columns" is-compact />`
153
+
154
+ #### showNum
155
+
156
+ - 名称:`showNum`
157
+ - 类型:`Boolean`
158
+ - 默认值:`false`
159
+ - 是否必填:否
160
+ - 详细描述:是否显示行序号(1,2,3...)。
161
+ - 使用示例:`<j-input-rows v-model="rows" :columns="columns" show-num />`
162
+
163
+ #### showChar
164
+
165
+ - 名称:`showChar`
166
+ - 类型:`Boolean`
167
+ - 默认值:`false`
168
+ - 是否必填:否
169
+ - 详细描述:是否显示字母序号(A-Z 循环)。
170
+ - 使用示例:`<j-input-rows v-model="rows" :columns="columns" show-char />`
171
+
172
+ #### isWrap
173
+
174
+ - 名称:`isWrap`
175
+ - 类型:`Boolean`
176
+ - 默认值:`false`
177
+ - 是否必填:否
178
+ - 详细描述:是否允许行内字段换行(`flex-wrap: wrap`)。
179
+ - 使用示例:`<j-input-rows v-model="rows" :columns="columns" is-wrap />`
180
+
181
+ #### id
182
+
183
+ - 名称:`id`
184
+ - 类型:`String`
185
+ - 默认值:`''`
186
+ - 是否必填:否
187
+ - 详细描述:字段/组件 id。该值会原样透传到 `change` 事件的回调参数 `payload.id` 中,用于区分来源。
188
+ - 使用示例:`<j-input-rows id="user-list" v-model="rows" :columns="columns" />`
189
+
190
+ ### 2.2 EditConfigType 说明
191
+
192
+ #### isAddBtn
193
+
194
+ - 名称:`isAddBtn`
195
+ - 类型:`Boolean`
196
+ - 默认值:`true`(逻辑为 `!== false` 即显示)
197
+ - 是否必填:否
198
+ - 详细描述:是否显示添加按钮。
199
+ - 使用示例:`editConfig: { isAddBtn: false }`
200
+
201
+ #### addBtnText
202
+
203
+ - 名称:`addBtnText`
204
+ - 类型:`String`
205
+ - 默认值:`'添加'`
206
+ - 是否必填:否
207
+ - 详细描述:添加按钮文本。
208
+ - 使用示例:`editConfig: { addBtnText: '新增条目' }`
209
+
210
+ #### buttonsAlign
211
+
212
+ - 名称:`buttonsAlign`
213
+ - 类型:`'left' | 'center' | 'right'`
214
+ - 默认值:`'left'`
215
+ - 是否必填:否
216
+ - 详细描述:底部操作区(添加按钮区域)对齐方式。
217
+ - 使用示例:`editConfig: { buttonsAlign: 'right' }`
218
+
219
+ #### isRemoveBtn
220
+
221
+ - 名称:`isRemoveBtn`
222
+ - 类型:`Boolean`
223
+ - 默认值:`true`(逻辑为 `!== false` 即显示)
224
+ - 是否必填:否
225
+ - 详细描述:是否显示删除按钮。
226
+ - 使用示例:`editConfig: { isRemoveBtn: false }`
227
+
228
+ #### readonly
229
+
230
+ - 名称:`readonly`
231
+ - 类型:`Boolean`
232
+ - 默认值:`false`
233
+ - 是否必填:否
234
+ - 详细描述:是否只读。为 `true` 时隐藏添加/删除操作区;行内输入控件是否只读取决于列配置本身。
235
+ - 使用示例:`editConfig: { readonly: true }`
236
+
237
+ #### drag
238
+
239
+ - 名称:`drag`
240
+ - 类型:`Boolean`
241
+ - 默认值:`false`
242
+ - 是否必填:否
243
+ - 详细描述:是否支持拖拽排序。开启后每行会显示拖拽手柄图标。
244
+ - 使用示例:`editConfig: { drag: true }`
245
+
246
+ #### isNullValue
247
+
248
+ - 名称:`isNullValue`
249
+ - 类型:`Boolean`
250
+ - 默认值:`true`(逻辑为 `!== false` 即允许“可删到空”)
251
+ - 是否必填:否
252
+ - 详细描述:是否允许删除到空。当 `isNullValue === false` 时,仅当 `list.length > 1` 才显示删除按钮(禁止删除最后一行)。
253
+ - 使用示例:`editConfig: { isNullValue: false }`
254
+
255
+ ## 3. 事件说明(Events)
256
+
257
+ ### update:modelValue
258
+
259
+ - 事件名称:`update:modelValue`
260
+ - 触发条件:初始化时 `modelValue` 为空数组会触发一次;其他场景通常依赖数组就地修改,不保证每次新增/删除/排序都触发该事件。
261
+ - 回调参数:`value: Record<string, any>[]`
262
+
263
+ ### change
264
+
265
+ - 事件名称:`change`
266
+ - 触发条件:新增行、删除行、拖拽排序后触发。
267
+ - 回调参数说明:
268
+
269
+ ```ts
270
+ type InputRowsChangePayload = {
271
+ id: string
272
+ value: any
273
+ data: any
274
+ formData: Record<string, any> | undefined
275
+ tableData: Record<string, any>[]
276
+ type: 'add' | 'delete' | 'update' | 'sort'
277
+ }
278
+ ```
279
+
280
+ ### rowChange
281
+
282
+ - 事件名称:`rowChange`
283
+ - 触发条件:行内字段变化时触发(由内部注入的 `rowChange` 回调触发)。
284
+ - 回调参数说明:`data: Record<string, any>`(透传自内部 `j-comp` 的变更数据)
285
+
286
+ ## 4. 方法说明(Methods)
287
+
288
+ - 当前版本未通过 `defineExpose` 暴露任何公共方法。
289
+
290
+ ## 5. 插槽说明(Slots)
291
+
292
+ - 当前版本不支持插槽。
293
+
294
+ ## 6. 使用示例(进阶)
295
+
296
+ ### 6.1 新增行默认值(defaultValue)与字段落点(valueRowKey)
297
+
298
+ ```ts
299
+ const columns = [
300
+ { id: 'name', type: 'j-input', config: { label: '名称', defaultValue: '未命名' } },
301
+ {
302
+ id: 'amount',
303
+ type: 'j-number',
304
+ config: { label: '金额', defaultValue: 0, valueRowKey: 'price' },
305
+ },
306
+ ]
307
+ ```
308
+
309
+ 点击“添加”后,新行会写入到行对象的 `price` 字段(而不是 `amount`),形如:`{ i: 'uuid', name: '未命名', price: 0 }`。
310
+
311
+ ### 6.2 不允许删到空(isNullValue: false)
312
+
313
+ ```vue
314
+ <template>
315
+ <j-input-rows
316
+ v-model="rows"
317
+ :columns="columns"
318
+ :edit-config="{ isNullValue: false, isRemoveBtn: true }"
319
+ />
320
+ </template>
321
+ ```
322
+
323
+ 当 `rows.length === 1` 时不显示删除按钮。
324
+
325
+ ## 7. 样式定制
326
+
327
+ ### 7.1 可自定义的 CSS 变量
328
+
329
+ 组件样式使用到以下 CSS 变量(来自主题系统):
330
+
331
+ - `--j-color-hover`
332
+ - `--j-color-text-secondary`
333
+ - `--j-color-text`
334
+ - `--j-color-primary`
335
+ - `--j-color-danger`
336
+
337
+ ### 7.2 样式覆盖指南
338
+
339
+ 组件关键类名:
340
+
341
+ - 根容器:`.j-input-rows`
342
+ - 单行容器:`.j-space` / `.j-space-compact`,并可叠加 `.j-space-wrap`
343
+ - 序号/字母:`.j-input-rows-num` / `.j-input-rows-char`
344
+ - 拖拽图标:`.j-input-rows-drag`
345
+ - 删除图标:`.j-input-rows-delete`
346
+ - 操作区:`.j-input-rows-actions`
347
+
348
+ 覆盖示例:
349
+
350
+ ```css
351
+ .j-input-rows .j-space:hover,
352
+ .j-input-rows .j-space-compact:hover {
353
+ background-color: rgba(0, 0, 0, 0.04);
354
+ }
355
+
356
+ .j-input-rows-actions {
357
+ margin-top: 12px;
358
+ }
359
+ ```
360
+
361
+ <script setup>
362
+ import Basic from '../examples/input-rows/basic.vue'
363
+ import Drag from '../examples/input-rows/drag.vue'
364
+ import Nested from '../examples/input-rows/nested.vue'
365
+ import inputRowsApi from './meta/input-rows'
366
+
367
+ import basicCode from '../examples/input-rows/basic.vue?raw'
368
+ import dragCode from '../examples/input-rows/drag.vue?raw'
369
+ import nestedCode from '../examples/input-rows/nested.vue?raw'
370
+ </script>