@a2simcode/ui 0.0.318 → 0.0.320

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 (379) 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/menu/index.d.ts +3 -3
  6. package/dist/components/menu/src/imenu/index.vue.d.ts +1 -1
  7. package/dist/components/menu/src/menu-item/index.vue.d.ts +3 -3
  8. package/dist/components/menu/src/menu.vue.d.ts +1 -1
  9. package/dist/components/menu/src/sub-menu/index.vue.d.ts +17 -1
  10. package/dist/simcode-ui.es.js +20 -8
  11. package/dist/simcode-ui.umd.js +2 -2
  12. package/dist/stats.html +1 -1
  13. package/dist/ui.css +1 -1
  14. package/docs/components/autocomplete.md +89 -89
  15. package/docs/components/barcode.md +101 -101
  16. package/docs/components/button-select.md +24 -24
  17. package/docs/components/button.md +117 -117
  18. package/docs/components/buttons.md +119 -119
  19. package/docs/components/card-list.md +38 -38
  20. package/docs/components/cascader-select.md +114 -114
  21. package/docs/components/checkbox.md +114 -114
  22. package/docs/components/code-mirror.md +85 -85
  23. package/docs/components/collapse.md +26 -26
  24. package/docs/components/comp.md +106 -106
  25. package/docs/components/count-up.md +24 -24
  26. package/docs/components/count.md +24 -24
  27. package/docs/components/data-panel.md +24 -24
  28. package/docs/components/date.md +76 -76
  29. package/docs/components/dialog-full.md +112 -112
  30. package/docs/components/dialog.md +127 -127
  31. package/docs/components/divider.md +24 -24
  32. package/docs/components/drawer.md +127 -127
  33. package/docs/components/dynamic-layer.md +118 -118
  34. package/docs/components/echarts.md +72 -72
  35. package/docs/components/editor.md +24 -24
  36. package/docs/components/form.md +87 -87
  37. package/docs/components/guid.md +39 -39
  38. package/docs/components/hpanel.md +24 -24
  39. package/docs/components/icon.md +56 -56
  40. package/docs/components/input-button.md +24 -24
  41. package/docs/components/input-code.md +24 -24
  42. package/docs/components/input-color.md +114 -114
  43. package/docs/components/input-layer.md +56 -56
  44. package/docs/components/input-rows.md +370 -370
  45. package/docs/components/input-tag.md +50 -50
  46. package/docs/components/input.md +129 -129
  47. package/docs/components/layer-form.md +61 -61
  48. package/docs/components/layer.md +127 -127
  49. package/docs/components/layout.md +132 -132
  50. package/docs/components/map.md +24 -24
  51. package/docs/components/menu.md +121 -121
  52. package/docs/components/meta/button.ts +212 -212
  53. package/docs/components/meta/buttons.ts +81 -81
  54. package/docs/components/meta/card-list.ts +210 -210
  55. package/docs/components/meta/code-mirror.ts +108 -108
  56. package/docs/components/meta/comp.ts +235 -235
  57. package/docs/components/meta/date.ts +277 -277
  58. package/docs/components/meta/echarts.ts +64 -64
  59. package/docs/components/meta/form-item.ts +62 -62
  60. package/docs/components/meta/form.ts +181 -181
  61. package/docs/components/meta/input-button.ts +175 -175
  62. package/docs/components/meta/input-cards.ts +112 -112
  63. package/docs/components/meta/input-code.ts +161 -161
  64. package/docs/components/meta/input-color.ts +243 -243
  65. package/docs/components/meta/input-rows.ts +119 -119
  66. package/docs/components/meta/layer-form.ts +74 -74
  67. package/docs/components/meta/map.ts +68 -68
  68. package/docs/components/meta/panel.ts +152 -152
  69. package/docs/components/meta/radio.ts +55 -55
  70. package/docs/components/meta/select.ts +289 -289
  71. package/docs/components/meta/slider.ts +270 -270
  72. package/docs/components/meta/table-panel.ts +343 -343
  73. package/docs/components/meta/table.ts +495 -495
  74. package/docs/components/meta/tabs.ts +146 -146
  75. package/docs/components/meta/title.ts +91 -91
  76. package/docs/components/meta/tree-select.ts +220 -220
  77. package/docs/components/meta/tree.ts +225 -225
  78. package/docs/components/meta/vpanel.ts +19 -19
  79. package/docs/components/meta/workflow-viewer.ts +55 -55
  80. package/docs/components/number.md +124 -124
  81. package/docs/components/page.md +102 -102
  82. package/docs/components/panel.md +37 -37
  83. package/docs/components/radio.md +87 -87
  84. package/docs/components/rate.md +71 -71
  85. package/docs/components/select.md +149 -149
  86. package/docs/components/slider-captcha.md +41 -41
  87. package/docs/components/slider.md +101 -101
  88. package/docs/components/switch.md +90 -90
  89. package/docs/components/table-panel.md +342 -342
  90. package/docs/components/table.md +526 -526
  91. package/docs/components/tabs.md +26 -26
  92. package/docs/components/title.md +24 -24
  93. package/docs/components/tree.md +222 -222
  94. package/docs/components/upload.md +117 -117
  95. package/docs/components/workflow-viewer.md +21 -21
  96. package/docs/components/workflow.md +21 -21
  97. package/docs/examples/autocomplete/advanced.vue +35 -35
  98. package/docs/examples/autocomplete/basic.vue +32 -32
  99. package/docs/examples/autocomplete/clearable.vue +33 -33
  100. package/docs/examples/autocomplete/custom-template.vue +49 -49
  101. package/docs/examples/autocomplete/disabled.vue +33 -33
  102. package/docs/examples/autocomplete/icon.vue +37 -37
  103. package/docs/examples/barcode/all-types.vue +380 -380
  104. package/docs/examples/barcode/basic.vue +14 -14
  105. package/docs/examples/barcode/props-appearance.vue +243 -243
  106. package/docs/examples/barcode/props-geometry.vue +143 -143
  107. package/docs/examples/barcode/props-logic.vue +216 -216
  108. package/docs/examples/barcode/props-symbology.vue +199 -199
  109. package/docs/examples/barcode/props-text.vue +268 -268
  110. package/docs/examples/button/basic.vue +7 -7
  111. package/docs/examples/button/disabled.vue +42 -42
  112. package/docs/examples/button/loading.vue +6 -6
  113. package/docs/examples/button/shape.vue +7 -7
  114. package/docs/examples/button/size.vue +14 -14
  115. package/docs/examples/button/status.vue +34 -34
  116. package/docs/examples/button/type.vue +10 -10
  117. package/docs/examples/button-select/basic.vue +19 -19
  118. package/docs/examples/buttons/basic.vue +62 -62
  119. package/docs/examples/buttons/disabled.vue +36 -36
  120. package/docs/examples/buttons/dropdown.vue +63 -63
  121. package/docs/examples/buttons/group.vue +52 -52
  122. package/docs/examples/buttons/link.vue +47 -47
  123. package/docs/examples/buttons/popup.vue +39 -39
  124. package/docs/examples/buttons/size.vue +45 -45
  125. package/docs/examples/card-list/basic.vue +70 -70
  126. package/docs/examples/card-list/selection-pagination.vue +69 -69
  127. package/docs/examples/cascader-select/basic.vue +28 -28
  128. package/docs/examples/cascader-select/clearable.vue +34 -34
  129. package/docs/examples/cascader-select/disabled.vue +43 -43
  130. package/docs/examples/cascader-select/filterable.vue +37 -37
  131. package/docs/examples/cascader-select/methods.vue +84 -84
  132. package/docs/examples/cascader-select/multiple.vue +38 -38
  133. package/docs/examples/cascader-select/slot.vue +45 -45
  134. package/docs/examples/checkbox/basic.vue +18 -18
  135. package/docs/examples/checkbox/button.vue +19 -19
  136. package/docs/examples/checkbox/color.vue +25 -25
  137. package/docs/examples/checkbox/disabled.vue +17 -17
  138. package/docs/examples/checkbox/min-max.vue +20 -20
  139. package/docs/examples/checkbox/mixed.vue +56 -56
  140. package/docs/examples/checkbox/size.vue +28 -28
  141. package/docs/examples/code-mirror/basic.vue +11 -11
  142. package/docs/examples/code-mirror/events.vue +42 -42
  143. package/docs/examples/code-mirror/height.vue +25 -25
  144. package/docs/examples/code-mirror/mode.vue +33 -33
  145. package/docs/examples/code-mirror/readonly.vue +14 -14
  146. package/docs/examples/collapse/basic.vue +82 -82
  147. package/docs/examples/comp/basic.vue +7 -7
  148. package/docs/examples/comp/collapse.vue +38 -38
  149. package/docs/examples/comp/table-merge-rows.vue +77 -77
  150. package/docs/examples/comp/table-row-fixed-merge.vue +105 -105
  151. package/docs/examples/comp/tabs.vue +38 -38
  152. package/docs/examples/count/basic.vue +101 -101
  153. package/docs/examples/count-up/basic.vue +89 -89
  154. package/docs/examples/data-panel/basic.vue +110 -110
  155. package/docs/examples/date/basic.vue +73 -73
  156. package/docs/examples/date/default-value.vue +59 -59
  157. package/docs/examples/date/format.vue +75 -75
  158. package/docs/examples/date/range.vue +66 -66
  159. package/docs/examples/date/types.vue +79 -79
  160. package/docs/examples/decorated-title/basic.vue +31 -31
  161. package/docs/examples/dialog/basic.vue +36 -36
  162. package/docs/examples/dialog/custom-buttons.vue +44 -44
  163. package/docs/examples/dialog/fullscreen.vue +23 -23
  164. package/docs/examples/dialog/no-mask.vue +17 -17
  165. package/docs/examples/dialog/size.vue +44 -44
  166. package/docs/examples/dialog/steps.vue +57 -57
  167. package/docs/examples/dialog-full/basic.vue +29 -29
  168. package/docs/examples/dialog-full/custom-buttons.vue +45 -45
  169. package/docs/examples/dialog-full/no-buttons.vue +18 -18
  170. package/docs/examples/dialog-full/no-header.vue +27 -27
  171. package/docs/examples/dialog-full/steps.vue +71 -71
  172. package/docs/examples/divider/basic.vue +52 -52
  173. package/docs/examples/drawer/basic.vue +35 -35
  174. package/docs/examples/drawer/custom-buttons.vue +34 -34
  175. package/docs/examples/drawer/direction.vue +47 -47
  176. package/docs/examples/drawer/mask.vue +36 -36
  177. package/docs/examples/drawer/no-buttons.vue +20 -20
  178. package/docs/examples/drawer/size.vue +28 -28
  179. package/docs/examples/dynamic-layer/basic.vue +33 -33
  180. package/docs/examples/dynamic-layer/custom-buttons.vue +43 -43
  181. package/docs/examples/dynamic-layer/form.vue +73 -73
  182. package/docs/examples/dynamic-layer/steps.vue +52 -52
  183. package/docs/examples/dynamic-layer/types.vue +40 -40
  184. package/docs/examples/echarts/basic.vue +31 -31
  185. package/docs/examples/echarts/dynamic.vue +43 -43
  186. package/docs/examples/echarts/line.vue +46 -46
  187. package/docs/examples/echarts/pie.vue +44 -44
  188. package/docs/examples/editor/basic.vue +15 -15
  189. package/docs/examples/form/basic.vue +688 -688
  190. package/docs/examples/form/init.vue +76 -76
  191. package/docs/examples/form/master-detail.vue +203 -203
  192. package/docs/examples/form/rule-format.vue +179 -179
  193. package/docs/examples/form/view-table.vue +378 -378
  194. package/docs/examples/guid/basic.vue +10 -10
  195. package/docs/examples/guid/size.vue +13 -13
  196. package/docs/examples/hpanel/basic.vue +79 -79
  197. package/docs/examples/icon/basic.vue +9 -9
  198. package/docs/examples/icon/rotate-flip.vue +9 -9
  199. package/docs/examples/icon/size.vue +7 -7
  200. package/docs/examples/input/basic.vue +10 -10
  201. package/docs/examples/input/clearable.vue +12 -12
  202. package/docs/examples/input/disabled.vue +6 -6
  203. package/docs/examples/input/icon.vue +23 -23
  204. package/docs/examples/input/password.vue +18 -18
  205. package/docs/examples/input/size.vue +13 -13
  206. package/docs/examples/input/textarea.vue +25 -25
  207. package/docs/examples/input/word-limit.vue +28 -28
  208. package/docs/examples/input-button/basic.vue +33 -33
  209. package/docs/examples/input-cards/basic.vue +79 -79
  210. package/docs/examples/input-code/basic.vue +29 -29
  211. package/docs/examples/input-color/basic.vue +10 -10
  212. package/docs/examples/input-color/disabled.vue +13 -13
  213. package/docs/examples/input-color/format.vue +17 -17
  214. package/docs/examples/input-color/no-alpha.vue +13 -13
  215. package/docs/examples/input-color/only-button.vue +15 -15
  216. package/docs/examples/input-color/predefine.vue +31 -31
  217. package/docs/examples/input-color/size.vue +15 -15
  218. package/docs/examples/input-layer/basic.vue +85 -85
  219. package/docs/examples/input-layer/render-vnode-page.vue +160 -160
  220. package/docs/examples/input-layer/render-vnode.vue +127 -127
  221. package/docs/examples/input-rows/basic.vue +73 -73
  222. package/docs/examples/input-rows/drag.vue +48 -48
  223. package/docs/examples/input-rows/layer-form.vue +85 -85
  224. package/docs/examples/input-rows/nested.vue +91 -91
  225. package/docs/examples/input-tag/basic.vue +27 -27
  226. package/docs/examples/input-tag/colors.vue +23 -23
  227. package/docs/examples/input-tag/readonly.vue +17 -17
  228. package/docs/examples/layer/basic.vue +43 -43
  229. package/docs/examples/layer/custom-buttons.vue +61 -61
  230. package/docs/examples/layer/drawer.vue +37 -37
  231. package/docs/examples/layer/full.vue +38 -38
  232. package/docs/examples/layer/modal.vue +34 -34
  233. package/docs/examples/layer/steps.vue +46 -46
  234. package/docs/examples/layer-form/basic.vue +76 -76
  235. package/docs/examples/layer-form/config.vue +82 -82
  236. package/docs/examples/layer-form/size.vue +72 -72
  237. package/docs/examples/layout/basic.vue +36 -36
  238. package/docs/examples/layout/custom-size.vue +50 -50
  239. package/docs/examples/layout/disable-move.vue +37 -37
  240. package/docs/examples/layout/hide-mid-when-narrow.vue +96 -96
  241. package/docs/examples/layout/min-size.vue +73 -73
  242. package/docs/examples/layout/percent-size.vue +80 -80
  243. package/docs/examples/layout/simple.vue +22 -22
  244. package/docs/examples/layout/top-side.vue +34 -34
  245. package/docs/examples/map/basic.vue +22 -22
  246. package/docs/examples/menu/basic.vue +58 -58
  247. package/docs/examples/menu/collapsed.vue +49 -49
  248. package/docs/examples/menu/horizontal.vue +44 -44
  249. package/docs/examples/menu/selection-test.vue +104 -104
  250. package/docs/examples/menu/theme.vue +46 -46
  251. package/docs/examples/menu/vertical.vue +46 -46
  252. package/docs/examples/number/advanced.vue +143 -143
  253. package/docs/examples/number/basic.vue +63 -63
  254. package/docs/examples/number/disabled.vue +49 -49
  255. package/docs/examples/number/size.vue +42 -42
  256. package/docs/examples/number/slots.vue +123 -123
  257. package/docs/examples/number/step-strictly.vue +41 -41
  258. package/docs/examples/number/step.vue +47 -47
  259. package/docs/examples/page/basic.vue +41 -41
  260. package/docs/examples/page/code-table-model.vue +428 -428
  261. package/docs/examples/page/dept-user-management.vue +211 -211
  262. package/docs/examples/page/init.vue +87 -87
  263. package/docs/examples/page/log.vue +453 -453
  264. package/docs/examples/page/user-management.vue +313 -313
  265. package/docs/examples/panel/tool-buttons.vue +18 -18
  266. package/docs/examples/radio/basic.vue +17 -17
  267. package/docs/examples/radio/button.vue +17 -17
  268. package/docs/examples/radio/color.vue +18 -18
  269. package/docs/examples/radio/disabled.vue +17 -17
  270. package/docs/examples/radio/size.vue +29 -29
  271. package/docs/examples/rate/basic.vue +24 -24
  272. package/docs/examples/rate/half.vue +24 -24
  273. package/docs/examples/rate/readonly.vue +11 -11
  274. package/docs/examples/rate/text.vue +37 -37
  275. package/docs/examples/select/basic.vue +16 -16
  276. package/docs/examples/select/clearable.vue +22 -22
  277. package/docs/examples/select/color.vue +16 -16
  278. package/docs/examples/select/disabled.vue +31 -31
  279. package/docs/examples/select/filterable.vue +24 -24
  280. package/docs/examples/select/group.vue +23 -23
  281. package/docs/examples/select/icon.vue +16 -16
  282. package/docs/examples/select/multiple.vue +18 -18
  283. package/docs/examples/select/size.vue +39 -39
  284. package/docs/examples/slider/basic.vue +42 -42
  285. package/docs/examples/slider/disabled.vue +17 -17
  286. package/docs/examples/slider/marks.vue +30 -30
  287. package/docs/examples/slider/size.vue +37 -37
  288. package/docs/examples/slider/tooltip.vue +36 -36
  289. package/docs/examples/slider/vertical.vue +26 -26
  290. package/docs/examples/slider-captcha/basic.vue +44 -44
  291. package/docs/examples/slider-captcha/custom.vue +48 -48
  292. package/docs/examples/switch/basic.vue +16 -16
  293. package/docs/examples/switch/disabled.vue +13 -13
  294. package/docs/examples/switch/loading.vue +13 -13
  295. package/docs/examples/switch/size.vue +15 -15
  296. package/docs/examples/switch/text.vue +13 -13
  297. package/docs/examples/table/action-filter.vue +126 -126
  298. package/docs/examples/table/actions.vue +116 -116
  299. package/docs/examples/table/add-row.vue +98 -98
  300. package/docs/examples/table/basic.vue +168 -168
  301. package/docs/examples/table/checkbox-layout.vue +68 -68
  302. package/docs/examples/table/column-filter.vue +96 -96
  303. package/docs/examples/table/custom-layout.vue +115 -115
  304. package/docs/examples/table/custom-merge-cell.vue +206 -206
  305. package/docs/examples/table/dynamic-type.vue +74 -74
  306. package/docs/examples/table/editable.vue +290 -290
  307. package/docs/examples/table/field-selection.vue +87 -87
  308. package/docs/examples/table/frozen-column.vue +140 -140
  309. package/docs/examples/table/height-mode.vue +99 -99
  310. package/docs/examples/table/icon.vue +85 -85
  311. package/docs/examples/table/layer-form.vue +133 -133
  312. package/docs/examples/table/link.vue +66 -66
  313. package/docs/examples/table/merge-cell.vue +78 -78
  314. package/docs/examples/table/merge-header.vue +86 -86
  315. package/docs/examples/table/multiple-disabled.vue +112 -112
  316. package/docs/examples/table/multiple.vue +188 -188
  317. package/docs/examples/table/pagination.vue +151 -151
  318. package/docs/examples/table/row-drag.vue +67 -67
  319. package/docs/examples/table/row-fixed.vue +61 -61
  320. package/docs/examples/table/show-tag.vue +68 -68
  321. package/docs/examples/table/single-selection.vue +64 -64
  322. package/docs/examples/table/sub-table-lazy.vue +97 -97
  323. package/docs/examples/table/sub-table.vue +103 -103
  324. package/docs/examples/table/tag.vue +43 -43
  325. package/docs/examples/table/tree-column.vue +119 -119
  326. package/docs/examples/table/tree-data.vue +141 -141
  327. package/docs/examples/table/tree-default-expand-all.vue +60 -60
  328. package/docs/examples/table/tree-lazy.vue +80 -80
  329. package/docs/examples/table/tree-set-selection.vue +75 -75
  330. package/docs/examples/table-panel/basic.vue +229 -229
  331. package/docs/examples/table-panel/batch-operations.vue +286 -286
  332. package/docs/examples/table-panel/button-visibility.vue +88 -88
  333. package/docs/examples/table-panel/card.vue +101 -101
  334. package/docs/examples/table-panel/column-filter.vue +116 -116
  335. package/docs/examples/table-panel/filter.vue +219 -219
  336. package/docs/examples/table-panel/get-selection.vue +111 -111
  337. package/docs/examples/table-panel/mask.vue +151 -151
  338. package/docs/examples/table-panel/model-value.vue +87 -87
  339. package/docs/examples/table-panel/multiple-selection.vue +243 -243
  340. package/docs/examples/table-panel/pagination-select-state-key.vue +176 -176
  341. package/docs/examples/table-panel/pagination.vue +133 -133
  342. package/docs/examples/table-panel/remote-selection.vue +159 -159
  343. package/docs/examples/table-panel/search-list.vue +207 -207
  344. package/docs/examples/table-panel/sub-table-lazy.vue +118 -118
  345. package/docs/examples/table-panel/tree-parent-key.vue +67 -67
  346. package/docs/examples/tabs/basic.vue +98 -98
  347. package/docs/examples/time/base.vue +67 -67
  348. package/docs/examples/title/basic.vue +87 -87
  349. package/docs/examples/tree/accordion.vue +46 -46
  350. package/docs/examples/tree/basic.vue +50 -50
  351. package/docs/examples/tree/buttons.vue +53 -53
  352. package/docs/examples/tree/check-strictly.vue +53 -53
  353. package/docs/examples/tree/checkable.vue +52 -52
  354. package/docs/examples/tree/custom-keys.vue +39 -39
  355. package/docs/examples/tree/default-expanded.vue +52 -52
  356. package/docs/examples/tree/draggable.vue +29 -29
  357. package/docs/examples/tree/expand-on-click.vue +39 -39
  358. package/docs/examples/tree/flat-data.vue +20 -20
  359. package/docs/examples/tree/icon.vue +40 -40
  360. package/docs/examples/tree/load-data.vue +37 -37
  361. package/docs/examples/tree/methods.vue +74 -74
  362. package/docs/examples/tree/theme.vue +33 -33
  363. package/docs/examples/tree-select/basic.vue +47 -47
  364. package/docs/examples/tree-select/lazy.vue +42 -42
  365. package/docs/examples/upload/accept.vue +31 -31
  366. package/docs/examples/upload/basic.vue +12 -12
  367. package/docs/examples/upload/drag.vue +11 -11
  368. package/docs/examples/upload/image.vue +17 -17
  369. package/docs/examples/upload/limit.vue +20 -20
  370. package/docs/examples/upload/multiple.vue +17 -17
  371. package/docs/examples/upload/readonly.vue +17 -17
  372. package/docs/examples/utils/cipher.vue +160 -160
  373. package/docs/examples/utils/common.vue +153 -153
  374. package/docs/examples/utils/date.vue +56 -56
  375. package/docs/examples/utils/dom.vue +52 -52
  376. package/docs/examples/utils/is.vue +70 -70
  377. package/docs/examples/workflow/basic.vue +265 -265
  378. package/docs/examples/workflow-viewer/basic.vue +248 -248
  379. package/package.json +23 -23
@@ -1,313 +1,313 @@
1
- <template>
2
- <div class="j-block" style="height: 600px">
3
- <j-page ref="pageRef" :noPadding="true" :schema="schema" />
4
- </div>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import type { ButtonClickScope, TableColumnCompConfig } from '@a2simcode/ui'
9
-
10
- import { ref, defineComponent, h } from 'vue'
11
- import { ElMessage, ElMessageBox } from 'element-plus'
12
-
13
- interface UserRecord {
14
- j_Id: number
15
- j_Account: string
16
- j_Name: string
17
- j_EnabledMark: 0 | 1
18
- j_CreateUserName: string
19
- j_CreateDate: string
20
- j_ModifyDate: string
21
- }
22
-
23
- const randomFrom = <T,>(arr: T[]) => arr[Math.floor(Math.random() * arr.length)]
24
-
25
- const createUsers = (count: number): UserRecord[] => {
26
- const names = ['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九', '郑十']
27
- const creators = ['系统', '管理员', '运维', '审计']
28
- const now = Date.now()
29
-
30
- return Array.from({ length: count }).map((_, i) => {
31
- const id = i + 1
32
- const createTime = new Date(now - Math.floor(Math.random() * 20 * 24 * 60 * 60 * 1000))
33
- const modifyTime = new Date(
34
- createTime.getTime() + Math.floor(Math.random() * 5 * 24 * 60 * 60 * 1000)
35
- )
36
- return {
37
- j_Id: id,
38
- j_Account: `user_${String(id).padStart(3, '0')}`,
39
- j_Name: randomFrom(names),
40
- j_EnabledMark: Math.random() > 0.2 ? 1 : 0,
41
- j_CreateUserName: randomFrom(creators),
42
- j_CreateDate: createTime.toISOString(),
43
- j_ModifyDate: modifyTime.toISOString(),
44
- }
45
- })
46
- }
47
-
48
- const users = ref<UserRecord[]>(createUsers(57))
49
-
50
- const api = {
51
- getPage: async (params: Record<string, any>) => {
52
- const keyword = String(params?.keyword?.value || '').trim()
53
- const { pagination } = params || {}
54
- const { rows = 10, page = 1 } = pagination || {}
55
-
56
- let list = [...users.value]
57
- if (keyword) {
58
- list = list.filter((u) => u.j_Name.includes(keyword) || u.j_Account.includes(keyword))
59
- }
60
-
61
- const start = (page - 1) * rows
62
- const end = start + rows
63
-
64
- return {
65
- rows: list.slice(start, end),
66
- records: list.length,
67
- }
68
- },
69
- updateState: async (id: number, enabled: 0 | 1) => {
70
- const target = users.value.find((u) => u.j_Id === id)
71
- if (!target) return false
72
- target.j_EnabledMark = enabled
73
- target.j_ModifyDate = new Date().toISOString()
74
- return true
75
- },
76
- upsert: async (data: Pick<UserRecord, 'j_Account' | 'j_Name'> & { j_Id?: number }) => {
77
- const now = new Date().toISOString()
78
- if (!data.j_Id) {
79
- const nextId = Math.max(0, ...users.value.map((u) => u.j_Id)) + 1
80
- users.value.unshift({
81
- j_Id: nextId,
82
- j_Account: data.j_Account,
83
- j_Name: data.j_Name,
84
- j_EnabledMark: 1,
85
- j_CreateUserName: '管理员',
86
- j_CreateDate: now,
87
- j_ModifyDate: now,
88
- })
89
- return true
90
- }
91
-
92
- const target = users.value.find((u) => u.j_Id === data.j_Id)
93
- if (!target) return false
94
- target.j_Account = data.j_Account
95
- target.j_Name = data.j_Name
96
- target.j_ModifyDate = now
97
- return true
98
- },
99
- resetPassword: async () => true,
100
- remove: async (id: number) => {
101
- const idx = users.value.findIndex((u) => u.j_Id === id)
102
- if (idx < 0) return false
103
- users.value.splice(idx, 1)
104
- return true
105
- },
106
- }
107
-
108
- const UserFormLayer = defineComponent({
109
- name: 'UserFormLayer',
110
- setup(_, { expose }) {
111
- const isEdit = ref(false)
112
- const currentId = ref<number | undefined>(undefined)
113
- const formData = ref({
114
- j_Account: '',
115
- j_Name: '',
116
- })
117
-
118
- const open = async (param: any) => {
119
- isEdit.value = !!param?.isEdit
120
- const record = param?.record as UserRecord | undefined
121
- currentId.value = record?.j_Id
122
- formData.value = {
123
- j_Account: record?.j_Account || '',
124
- j_Name: record?.j_Name || '',
125
- }
126
- return true
127
- }
128
-
129
- const ok = async () => {
130
- const account = formData.value.j_Account.trim()
131
- const name = formData.value.j_Name.trim()
132
- if (!account) {
133
- ElMessage.warning('请输入账号')
134
- return false
135
- }
136
- if (!name) {
137
- ElMessage.warning('请输入姓名')
138
- return false
139
- }
140
-
141
- const res = await api.upsert({
142
- j_Id: currentId.value,
143
- j_Account: account,
144
- j_Name: name,
145
- })
146
- if (!res) {
147
- ElMessage.warning('保存失败')
148
- }
149
- return res
150
- }
151
-
152
- expose({ open, ok })
153
-
154
- return () =>
155
- h('div', { style: 'padding: 16px' }, [
156
- h('div', { style: 'margin-bottom: 12px' }, [
157
- h('div', { style: 'margin-bottom: 6px; color: var(--j-color-text-2)' }, '账号'),
158
- h('input', {
159
- value: formData.value.j_Account,
160
- onInput: (e: any) => (formData.value.j_Account = e?.target?.value || ''),
161
- placeholder: '请输入账号',
162
- style:
163
- 'width: 100%; padding: 6px 10px; border: 1px solid var(--j-color-border); border-radius: 4px; outline: none;',
164
- }),
165
- ]),
166
- h('div', { style: 'margin-bottom: 12px' }, [
167
- h('div', { style: 'margin-bottom: 6px; color: var(--j-color-text-2)' }, '姓名'),
168
- h('input', {
169
- value: formData.value.j_Name,
170
- onInput: (e: any) => (formData.value.j_Name = e?.target?.value || ''),
171
- placeholder: '请输入姓名',
172
- style:
173
- 'width: 100%; padding: 6px 10px; border: 1px solid var(--j-color-border); border-radius: 4px; outline: none;',
174
- }),
175
- ]),
176
- h(
177
- 'div',
178
- { style: 'color: var(--j-color-text-3); font-size: 12px' },
179
- isEdit.value ? '编辑模式:修改后点击确定保存' : '新增模式:填写后点击确定创建'
180
- ),
181
- ])
182
- },
183
- })
184
-
185
- const pageRef = ref()
186
-
187
- const refreshTable = () => {
188
- pageRef.value?.call('mainTable', 'refreshData')
189
- }
190
-
191
- const columnsConfig: Record<string, TableColumnCompConfig> = {
192
- j_Name: { width: 120, filter: { isSearchKeyword: true } },
193
- j_Account: { width: 140, filter: { isSearchKeyword: true } },
194
- j_EnabledMark: {
195
- type: 'j-switch',
196
- activeValue: 1,
197
- inactiveValue: 0,
198
- width: 72,
199
- align: 'center',
200
- change: async ({ row }: { row: UserRecord }) => {
201
- const res = await api.updateState(row.j_Id, row.j_EnabledMark)
202
- if (res) {
203
- ElMessage.success('更新成功')
204
- refreshTable()
205
- } else {
206
- ElMessage.warning('更新失败')
207
- }
208
- },
209
- },
210
- j_CreateUserName: { filter: { isSearchKeyword: true } },
211
- j_CreateDate: { type: 'dateTime', width: 168 },
212
- j_ModifyDate: { type: 'dateTime', width: 168 },
213
- }
214
-
215
- const columns = [
216
- { id: 'j_Name', label: '姓名' },
217
- { id: 'j_Account', label: '账号' },
218
- { id: 'j_EnabledMark', label: '有效' },
219
- { id: 'j_CreateUserName', label: '创建用户' },
220
- { id: 'j_CreateDate', label: '创建时间' },
221
- { id: 'j_ModifyDate', label: '最后更新时间' },
222
- ].map((item) => {
223
- const cfg = columnsConfig[item.id] || {}
224
- return {
225
- id: item.id,
226
- type: cfg.type || '',
227
- config: { ...cfg, label: item.label },
228
- }
229
- })
230
-
231
- const buttons = [
232
- {
233
- id: 'add',
234
- label: '新增',
235
- config: { icon: 'mdi:add', type: 'primary' },
236
- click: ({ openLayer }: ButtonClickScope) => {
237
- openLayer({
238
- title: '新增用户',
239
- name: UserFormLayer,
240
- width: 520,
241
- height: 240,
242
- param: { isEdit: false },
243
- afterOk: refreshTable,
244
- })
245
- },
246
- },
247
- ]
248
-
249
- const actions = [
250
- {
251
- id: 'edit',
252
- label: '编辑',
253
- click: ({ openLayer, data }: ButtonClickScope) => {
254
- openLayer({
255
- title: '编辑用户',
256
- name: UserFormLayer,
257
- width: 520,
258
- height: 240,
259
- param: { isEdit: true, record: data },
260
- afterOk: refreshTable,
261
- })
262
- },
263
- },
264
- {
265
- id: 'resetPassword',
266
- label: '重置密码',
267
- click: async ({ data }: ButtonClickScope) => {
268
- await ElMessageBox.confirm(`您确定重置【${data?.j_Name}】密码吗?`, '提示', {
269
- type: 'warning',
270
- confirmButtonText: '确定',
271
- cancelButtonText: '取消',
272
- })
273
- const res = await api.resetPassword()
274
- if (res) {
275
- ElMessage.success('重置成功')
276
- }
277
- },
278
- },
279
- {
280
- id: 'delete',
281
- label: '删除',
282
- config: { danger: true },
283
- click: async ({ data }: ButtonClickScope) => {
284
- await ElMessageBox.confirm(`您确定删除【${data?.j_Name}】吗?`, '提示', {
285
- type: 'warning',
286
- confirmButtonText: '确定',
287
- cancelButtonText: '取消',
288
- })
289
- const res = await api.remove(data.j_Id)
290
- if (res) {
291
- ElMessage.success('删除成功')
292
- refreshTable()
293
- }
294
- },
295
- },
296
- ]
297
-
298
- const schema = ref([
299
- {
300
- id: 'mainTable',
301
- type: 'j-table-panel',
302
- config: {
303
- columns,
304
- buttons,
305
- actions,
306
- rowKey: 'j_Id',
307
- isPage: true,
308
- sort: 'j_CreateDate DESC',
309
- loadData: async (params: Record<string, any>) => api.getPage(params),
310
- },
311
- },
312
- ])
313
- </script>
1
+ <template>
2
+ <div class="j-block" style="height: 600px">
3
+ <j-page ref="pageRef" :noPadding="true" :schema="schema" />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import type { ButtonClickScope, TableColumnCompConfig } from '@a2simcode/ui'
9
+
10
+ import { ref, defineComponent, h } from 'vue'
11
+ import { ElMessage, ElMessageBox } from 'element-plus'
12
+
13
+ interface UserRecord {
14
+ j_Id: number
15
+ j_Account: string
16
+ j_Name: string
17
+ j_EnabledMark: 0 | 1
18
+ j_CreateUserName: string
19
+ j_CreateDate: string
20
+ j_ModifyDate: string
21
+ }
22
+
23
+ const randomFrom = <T,>(arr: T[]) => arr[Math.floor(Math.random() * arr.length)]
24
+
25
+ const createUsers = (count: number): UserRecord[] => {
26
+ const names = ['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九', '郑十']
27
+ const creators = ['系统', '管理员', '运维', '审计']
28
+ const now = Date.now()
29
+
30
+ return Array.from({ length: count }).map((_, i) => {
31
+ const id = i + 1
32
+ const createTime = new Date(now - Math.floor(Math.random() * 20 * 24 * 60 * 60 * 1000))
33
+ const modifyTime = new Date(
34
+ createTime.getTime() + Math.floor(Math.random() * 5 * 24 * 60 * 60 * 1000)
35
+ )
36
+ return {
37
+ j_Id: id,
38
+ j_Account: `user_${String(id).padStart(3, '0')}`,
39
+ j_Name: randomFrom(names),
40
+ j_EnabledMark: Math.random() > 0.2 ? 1 : 0,
41
+ j_CreateUserName: randomFrom(creators),
42
+ j_CreateDate: createTime.toISOString(),
43
+ j_ModifyDate: modifyTime.toISOString(),
44
+ }
45
+ })
46
+ }
47
+
48
+ const users = ref<UserRecord[]>(createUsers(57))
49
+
50
+ const api = {
51
+ getPage: async (params: Record<string, any>) => {
52
+ const keyword = String(params?.keyword?.value || '').trim()
53
+ const { pagination } = params || {}
54
+ const { rows = 10, page = 1 } = pagination || {}
55
+
56
+ let list = [...users.value]
57
+ if (keyword) {
58
+ list = list.filter((u) => u.j_Name.includes(keyword) || u.j_Account.includes(keyword))
59
+ }
60
+
61
+ const start = (page - 1) * rows
62
+ const end = start + rows
63
+
64
+ return {
65
+ rows: list.slice(start, end),
66
+ records: list.length,
67
+ }
68
+ },
69
+ updateState: async (id: number, enabled: 0 | 1) => {
70
+ const target = users.value.find((u) => u.j_Id === id)
71
+ if (!target) return false
72
+ target.j_EnabledMark = enabled
73
+ target.j_ModifyDate = new Date().toISOString()
74
+ return true
75
+ },
76
+ upsert: async (data: Pick<UserRecord, 'j_Account' | 'j_Name'> & { j_Id?: number }) => {
77
+ const now = new Date().toISOString()
78
+ if (!data.j_Id) {
79
+ const nextId = Math.max(0, ...users.value.map((u) => u.j_Id)) + 1
80
+ users.value.unshift({
81
+ j_Id: nextId,
82
+ j_Account: data.j_Account,
83
+ j_Name: data.j_Name,
84
+ j_EnabledMark: 1,
85
+ j_CreateUserName: '管理员',
86
+ j_CreateDate: now,
87
+ j_ModifyDate: now,
88
+ })
89
+ return true
90
+ }
91
+
92
+ const target = users.value.find((u) => u.j_Id === data.j_Id)
93
+ if (!target) return false
94
+ target.j_Account = data.j_Account
95
+ target.j_Name = data.j_Name
96
+ target.j_ModifyDate = now
97
+ return true
98
+ },
99
+ resetPassword: async () => true,
100
+ remove: async (id: number) => {
101
+ const idx = users.value.findIndex((u) => u.j_Id === id)
102
+ if (idx < 0) return false
103
+ users.value.splice(idx, 1)
104
+ return true
105
+ },
106
+ }
107
+
108
+ const UserFormLayer = defineComponent({
109
+ name: 'UserFormLayer',
110
+ setup(_, { expose }) {
111
+ const isEdit = ref(false)
112
+ const currentId = ref<number | undefined>(undefined)
113
+ const formData = ref({
114
+ j_Account: '',
115
+ j_Name: '',
116
+ })
117
+
118
+ const open = async (param: any) => {
119
+ isEdit.value = !!param?.isEdit
120
+ const record = param?.record as UserRecord | undefined
121
+ currentId.value = record?.j_Id
122
+ formData.value = {
123
+ j_Account: record?.j_Account || '',
124
+ j_Name: record?.j_Name || '',
125
+ }
126
+ return true
127
+ }
128
+
129
+ const ok = async () => {
130
+ const account = formData.value.j_Account.trim()
131
+ const name = formData.value.j_Name.trim()
132
+ if (!account) {
133
+ ElMessage.warning('请输入账号')
134
+ return false
135
+ }
136
+ if (!name) {
137
+ ElMessage.warning('请输入姓名')
138
+ return false
139
+ }
140
+
141
+ const res = await api.upsert({
142
+ j_Id: currentId.value,
143
+ j_Account: account,
144
+ j_Name: name,
145
+ })
146
+ if (!res) {
147
+ ElMessage.warning('保存失败')
148
+ }
149
+ return res
150
+ }
151
+
152
+ expose({ open, ok })
153
+
154
+ return () =>
155
+ h('div', { style: 'padding: 16px' }, [
156
+ h('div', { style: 'margin-bottom: 12px' }, [
157
+ h('div', { style: 'margin-bottom: 6px; color: var(--j-color-text-2)' }, '账号'),
158
+ h('input', {
159
+ value: formData.value.j_Account,
160
+ onInput: (e: any) => (formData.value.j_Account = e?.target?.value || ''),
161
+ placeholder: '请输入账号',
162
+ style:
163
+ 'width: 100%; padding: 6px 10px; border: 1px solid var(--j-color-border); border-radius: 4px; outline: none;',
164
+ }),
165
+ ]),
166
+ h('div', { style: 'margin-bottom: 12px' }, [
167
+ h('div', { style: 'margin-bottom: 6px; color: var(--j-color-text-2)' }, '姓名'),
168
+ h('input', {
169
+ value: formData.value.j_Name,
170
+ onInput: (e: any) => (formData.value.j_Name = e?.target?.value || ''),
171
+ placeholder: '请输入姓名',
172
+ style:
173
+ 'width: 100%; padding: 6px 10px; border: 1px solid var(--j-color-border); border-radius: 4px; outline: none;',
174
+ }),
175
+ ]),
176
+ h(
177
+ 'div',
178
+ { style: 'color: var(--j-color-text-3); font-size: 12px' },
179
+ isEdit.value ? '编辑模式:修改后点击确定保存' : '新增模式:填写后点击确定创建'
180
+ ),
181
+ ])
182
+ },
183
+ })
184
+
185
+ const pageRef = ref()
186
+
187
+ const refreshTable = () => {
188
+ pageRef.value?.call('mainTable', 'refreshData')
189
+ }
190
+
191
+ const columnsConfig: Record<string, TableColumnCompConfig> = {
192
+ j_Name: { width: 120, filter: { isSearchKeyword: true } },
193
+ j_Account: { width: 140, filter: { isSearchKeyword: true } },
194
+ j_EnabledMark: {
195
+ type: 'j-switch',
196
+ activeValue: 1,
197
+ inactiveValue: 0,
198
+ width: 72,
199
+ align: 'center',
200
+ change: async ({ row }: { row: UserRecord }) => {
201
+ const res = await api.updateState(row.j_Id, row.j_EnabledMark)
202
+ if (res) {
203
+ ElMessage.success('更新成功')
204
+ refreshTable()
205
+ } else {
206
+ ElMessage.warning('更新失败')
207
+ }
208
+ },
209
+ },
210
+ j_CreateUserName: { filter: { isSearchKeyword: true } },
211
+ j_CreateDate: { type: 'dateTime', width: 168 },
212
+ j_ModifyDate: { type: 'dateTime', width: 168 },
213
+ }
214
+
215
+ const columns = [
216
+ { id: 'j_Name', label: '姓名' },
217
+ { id: 'j_Account', label: '账号' },
218
+ { id: 'j_EnabledMark', label: '有效' },
219
+ { id: 'j_CreateUserName', label: '创建用户' },
220
+ { id: 'j_CreateDate', label: '创建时间' },
221
+ { id: 'j_ModifyDate', label: '最后更新时间' },
222
+ ].map((item) => {
223
+ const cfg = columnsConfig[item.id] || {}
224
+ return {
225
+ id: item.id,
226
+ type: cfg.type || '',
227
+ config: { ...cfg, label: item.label },
228
+ }
229
+ })
230
+
231
+ const buttons = [
232
+ {
233
+ id: 'add',
234
+ label: '新增',
235
+ config: { icon: 'mdi:add', type: 'primary' },
236
+ click: ({ openLayer }: ButtonClickScope) => {
237
+ openLayer({
238
+ title: '新增用户',
239
+ name: UserFormLayer,
240
+ width: 520,
241
+ height: 240,
242
+ param: { isEdit: false },
243
+ afterOk: refreshTable,
244
+ })
245
+ },
246
+ },
247
+ ]
248
+
249
+ const actions = [
250
+ {
251
+ id: 'edit',
252
+ label: '编辑',
253
+ click: ({ openLayer, data }: ButtonClickScope) => {
254
+ openLayer({
255
+ title: '编辑用户',
256
+ name: UserFormLayer,
257
+ width: 520,
258
+ height: 240,
259
+ param: { isEdit: true, record: data },
260
+ afterOk: refreshTable,
261
+ })
262
+ },
263
+ },
264
+ {
265
+ id: 'resetPassword',
266
+ label: '重置密码',
267
+ click: async ({ data }: ButtonClickScope) => {
268
+ await ElMessageBox.confirm(`您确定重置【${data?.j_Name}】密码吗?`, '提示', {
269
+ type: 'warning',
270
+ confirmButtonText: '确定',
271
+ cancelButtonText: '取消',
272
+ })
273
+ const res = await api.resetPassword()
274
+ if (res) {
275
+ ElMessage.success('重置成功')
276
+ }
277
+ },
278
+ },
279
+ {
280
+ id: 'delete',
281
+ label: '删除',
282
+ config: { danger: true },
283
+ click: async ({ data }: ButtonClickScope) => {
284
+ await ElMessageBox.confirm(`您确定删除【${data?.j_Name}】吗?`, '提示', {
285
+ type: 'warning',
286
+ confirmButtonText: '确定',
287
+ cancelButtonText: '取消',
288
+ })
289
+ const res = await api.remove(data.j_Id)
290
+ if (res) {
291
+ ElMessage.success('删除成功')
292
+ refreshTable()
293
+ }
294
+ },
295
+ },
296
+ ]
297
+
298
+ const schema = ref([
299
+ {
300
+ id: 'mainTable',
301
+ type: 'j-table-panel',
302
+ config: {
303
+ columns,
304
+ buttons,
305
+ actions,
306
+ rowKey: 'j_Id',
307
+ isPage: true,
308
+ sort: 'j_CreateDate DESC',
309
+ loadData: async (params: Record<string, any>) => api.getPage(params),
310
+ },
311
+ },
312
+ ])
313
+ </script>
@@ -1,18 +1,18 @@
1
- <template>
2
- <j-panel title="Panel with Tool Buttons"
3
- :toolBtns="[
4
- { id: 'edit',label: '编辑', config: { icon: 'mdi:settings-outline' }, click: handleEdit },
5
- ]"
6
- >
7
- <div>This panel has some tool buttons in the header.</div>
8
- </j-panel>
9
- </template>
10
-
11
- <script setup lang="ts">
12
- import JPanel from '../../../packages/components/panel'
13
- import { ElMessage } from 'element-plus'
14
-
15
- const handleEdit = () => {
16
- ElMessage.success('Edit button clicked!')
17
- }
18
- </script>
1
+ <template>
2
+ <j-panel title="Panel with Tool Buttons"
3
+ :toolBtns="[
4
+ { id: 'edit',label: '编辑', config: { icon: 'mdi:settings-outline' }, click: handleEdit },
5
+ ]"
6
+ >
7
+ <div>This panel has some tool buttons in the header.</div>
8
+ </j-panel>
9
+ </template>
10
+
11
+ <script setup lang="ts">
12
+ import JPanel from '../../../packages/components/panel'
13
+ import { ElMessage } from 'element-plus'
14
+
15
+ const handleEdit = () => {
16
+ ElMessage.success('Edit button clicked!')
17
+ }
18
+ </script>