@a2simcode/ui 0.0.129 → 0.0.131

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 (335) 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/title/index.d.ts +3 -0
  6. package/dist/components/title/src/title.vue.d.ts +5 -0
  7. package/dist/simcode-ui.es.js +8586 -7740
  8. package/dist/simcode-ui.umd.js +2 -2
  9. package/dist/stats.html +1 -1
  10. package/dist/ui.css +1 -1
  11. package/docs/components/autocomplete.md +89 -89
  12. package/docs/components/barcode.md +101 -101
  13. package/docs/components/button-select.md +24 -24
  14. package/docs/components/button.md +117 -117
  15. package/docs/components/buttons.md +119 -119
  16. package/docs/components/cascader-select.md +114 -114
  17. package/docs/components/checkbox.md +114 -114
  18. package/docs/components/code-mirror.md +85 -85
  19. package/docs/components/collapse.md +26 -26
  20. package/docs/components/comp.md +71 -71
  21. package/docs/components/count-up.md +24 -24
  22. package/docs/components/count.md +24 -24
  23. package/docs/components/data-panel.md +24 -24
  24. package/docs/components/date.md +76 -76
  25. package/docs/components/dialog-full.md +112 -112
  26. package/docs/components/dialog.md +127 -127
  27. package/docs/components/divider.md +24 -24
  28. package/docs/components/drawer.md +127 -127
  29. package/docs/components/dynamic-layer.md +118 -118
  30. package/docs/components/echarts.md +72 -72
  31. package/docs/components/editor.md +24 -24
  32. package/docs/components/form.md +42 -42
  33. package/docs/components/guid.md +39 -39
  34. package/docs/components/hpanel.md +24 -24
  35. package/docs/components/icon.md +56 -56
  36. package/docs/components/input-button.md +24 -24
  37. package/docs/components/input-code.md +24 -24
  38. package/docs/components/input-color.md +114 -114
  39. package/docs/components/input-layer.md +26 -26
  40. package/docs/components/input-rows.md +370 -370
  41. package/docs/components/input-tag.md +50 -50
  42. package/docs/components/input.md +129 -129
  43. package/docs/components/layer-form.md +61 -61
  44. package/docs/components/layer.md +127 -127
  45. package/docs/components/layout.md +132 -132
  46. package/docs/components/map.md +24 -24
  47. package/docs/components/menu.md +121 -121
  48. package/docs/components/meta/buttons.ts +76 -76
  49. package/docs/components/meta/comp.ts +236 -236
  50. package/docs/components/meta/date.ts +267 -267
  51. package/docs/components/meta/echarts.ts +64 -64
  52. package/docs/components/meta/form-item.ts +50 -50
  53. package/docs/components/meta/form.ts +165 -165
  54. package/docs/components/meta/input-cards.ts +112 -112
  55. package/docs/components/meta/input-color.ts +243 -243
  56. package/docs/components/meta/input-rows.ts +113 -113
  57. package/docs/components/meta/layer-form.ts +56 -56
  58. package/docs/components/meta/map.ts +68 -68
  59. package/docs/components/meta/panel.ts +152 -152
  60. package/docs/components/meta/slider.ts +270 -270
  61. package/docs/components/meta/table-panel.ts +232 -232
  62. package/docs/components/meta/table.ts +391 -391
  63. package/docs/components/meta/tabs.ts +146 -146
  64. package/docs/components/meta/tree-select.ts +199 -199
  65. package/docs/components/meta/workflow-viewer.ts +55 -55
  66. package/docs/components/number.md +124 -124
  67. package/docs/components/page.md +87 -87
  68. package/docs/components/panel.md +37 -37
  69. package/docs/components/radio.md +87 -87
  70. package/docs/components/rate.md +71 -71
  71. package/docs/components/select.md +133 -133
  72. package/docs/components/slider-captcha.md +41 -41
  73. package/docs/components/slider.md +101 -101
  74. package/docs/components/switch.md +90 -90
  75. package/docs/components/table-panel.md +236 -236
  76. package/docs/components/table.md +391 -391
  77. package/docs/components/tabs.md +26 -26
  78. package/docs/components/title.md +24 -24
  79. package/docs/components/tree.md +207 -207
  80. package/docs/components/upload.md +117 -117
  81. package/docs/components/workflow-viewer.md +21 -21
  82. package/docs/components/workflow.md +21 -21
  83. package/docs/examples/autocomplete/advanced.vue +35 -35
  84. package/docs/examples/autocomplete/basic.vue +32 -32
  85. package/docs/examples/autocomplete/clearable.vue +33 -33
  86. package/docs/examples/autocomplete/custom-template.vue +49 -49
  87. package/docs/examples/autocomplete/disabled.vue +33 -33
  88. package/docs/examples/autocomplete/icon.vue +37 -37
  89. package/docs/examples/barcode/all-types.vue +380 -380
  90. package/docs/examples/barcode/basic.vue +14 -14
  91. package/docs/examples/barcode/props-appearance.vue +243 -243
  92. package/docs/examples/barcode/props-geometry.vue +143 -143
  93. package/docs/examples/barcode/props-logic.vue +216 -216
  94. package/docs/examples/barcode/props-symbology.vue +199 -199
  95. package/docs/examples/barcode/props-text.vue +268 -268
  96. package/docs/examples/button/basic.vue +7 -7
  97. package/docs/examples/button/danger-ghost.vue +17 -17
  98. package/docs/examples/button/disabled.vue +10 -10
  99. package/docs/examples/button/loading.vue +6 -6
  100. package/docs/examples/button/shape.vue +7 -7
  101. package/docs/examples/button/size.vue +14 -14
  102. package/docs/examples/button/type.vue +9 -9
  103. package/docs/examples/button-select/basic.vue +19 -19
  104. package/docs/examples/buttons/basic.vue +45 -45
  105. package/docs/examples/buttons/disabled.vue +36 -36
  106. package/docs/examples/buttons/dropdown.vue +63 -63
  107. package/docs/examples/buttons/group.vue +52 -52
  108. package/docs/examples/buttons/link.vue +47 -47
  109. package/docs/examples/buttons/popup.vue +39 -39
  110. package/docs/examples/buttons/size.vue +45 -45
  111. package/docs/examples/cascader-select/basic.vue +28 -28
  112. package/docs/examples/cascader-select/clearable.vue +34 -34
  113. package/docs/examples/cascader-select/disabled.vue +43 -43
  114. package/docs/examples/cascader-select/filterable.vue +37 -37
  115. package/docs/examples/cascader-select/methods.vue +84 -84
  116. package/docs/examples/cascader-select/multiple.vue +38 -38
  117. package/docs/examples/cascader-select/slot.vue +45 -45
  118. package/docs/examples/checkbox/basic.vue +18 -18
  119. package/docs/examples/checkbox/button.vue +19 -19
  120. package/docs/examples/checkbox/color.vue +25 -25
  121. package/docs/examples/checkbox/disabled.vue +17 -17
  122. package/docs/examples/checkbox/min-max.vue +20 -20
  123. package/docs/examples/checkbox/mixed.vue +56 -56
  124. package/docs/examples/checkbox/size.vue +28 -28
  125. package/docs/examples/code-mirror/basic.vue +11 -11
  126. package/docs/examples/code-mirror/events.vue +42 -42
  127. package/docs/examples/code-mirror/height.vue +25 -25
  128. package/docs/examples/code-mirror/mode.vue +33 -33
  129. package/docs/examples/code-mirror/readonly.vue +14 -14
  130. package/docs/examples/collapse/basic.vue +82 -82
  131. package/docs/examples/comp/basic.vue +7 -7
  132. package/docs/examples/comp/collapse.vue +38 -38
  133. package/docs/examples/comp/tabs.vue +38 -38
  134. package/docs/examples/count/basic.vue +101 -101
  135. package/docs/examples/count-up/basic.vue +89 -89
  136. package/docs/examples/data-panel/basic.vue +110 -110
  137. package/docs/examples/date/basic.vue +73 -73
  138. package/docs/examples/date/default-value.vue +59 -59
  139. package/docs/examples/date/format.vue +75 -75
  140. package/docs/examples/date/range.vue +66 -66
  141. package/docs/examples/date/types.vue +79 -79
  142. package/docs/examples/decorated-title/basic.vue +31 -31
  143. package/docs/examples/dialog/basic.vue +36 -36
  144. package/docs/examples/dialog/custom-buttons.vue +44 -44
  145. package/docs/examples/dialog/fullscreen.vue +23 -23
  146. package/docs/examples/dialog/no-mask.vue +17 -17
  147. package/docs/examples/dialog/size.vue +44 -44
  148. package/docs/examples/dialog/steps.vue +57 -57
  149. package/docs/examples/dialog-full/basic.vue +29 -29
  150. package/docs/examples/dialog-full/custom-buttons.vue +45 -45
  151. package/docs/examples/dialog-full/no-buttons.vue +18 -18
  152. package/docs/examples/dialog-full/no-header.vue +27 -27
  153. package/docs/examples/dialog-full/steps.vue +71 -71
  154. package/docs/examples/divider/basic.vue +52 -52
  155. package/docs/examples/drawer/basic.vue +35 -35
  156. package/docs/examples/drawer/custom-buttons.vue +34 -34
  157. package/docs/examples/drawer/direction.vue +47 -47
  158. package/docs/examples/drawer/mask.vue +36 -36
  159. package/docs/examples/drawer/no-buttons.vue +20 -20
  160. package/docs/examples/drawer/size.vue +28 -28
  161. package/docs/examples/dynamic-layer/basic.vue +33 -33
  162. package/docs/examples/dynamic-layer/custom-buttons.vue +43 -43
  163. package/docs/examples/dynamic-layer/form.vue +73 -73
  164. package/docs/examples/dynamic-layer/steps.vue +52 -52
  165. package/docs/examples/dynamic-layer/types.vue +40 -40
  166. package/docs/examples/echarts/basic.vue +31 -31
  167. package/docs/examples/echarts/dynamic.vue +43 -43
  168. package/docs/examples/echarts/line.vue +46 -46
  169. package/docs/examples/echarts/pie.vue +44 -44
  170. package/docs/examples/editor/basic.vue +15 -15
  171. package/docs/examples/form/basic.vue +539 -539
  172. package/docs/examples/form/init.vue +76 -76
  173. package/docs/examples/guid/basic.vue +10 -10
  174. package/docs/examples/guid/size.vue +13 -13
  175. package/docs/examples/hpanel/basic.vue +79 -79
  176. package/docs/examples/icon/basic.vue +9 -9
  177. package/docs/examples/icon/rotate-flip.vue +9 -9
  178. package/docs/examples/icon/size.vue +7 -7
  179. package/docs/examples/input/basic.vue +10 -10
  180. package/docs/examples/input/clearable.vue +12 -12
  181. package/docs/examples/input/disabled.vue +6 -6
  182. package/docs/examples/input/icon.vue +23 -23
  183. package/docs/examples/input/password.vue +18 -18
  184. package/docs/examples/input/size.vue +13 -13
  185. package/docs/examples/input/textarea.vue +25 -25
  186. package/docs/examples/input/word-limit.vue +28 -28
  187. package/docs/examples/input-button/basic.vue +33 -33
  188. package/docs/examples/input-code/basic.vue +29 -29
  189. package/docs/examples/input-color/basic.vue +10 -10
  190. package/docs/examples/input-color/disabled.vue +13 -13
  191. package/docs/examples/input-color/format.vue +17 -17
  192. package/docs/examples/input-color/no-alpha.vue +13 -13
  193. package/docs/examples/input-color/only-button.vue +15 -15
  194. package/docs/examples/input-color/predefine.vue +31 -31
  195. package/docs/examples/input-color/size.vue +15 -15
  196. package/docs/examples/input-layer/basic.vue +69 -69
  197. package/docs/examples/input-rows/basic.vue +73 -73
  198. package/docs/examples/input-rows/drag.vue +48 -48
  199. package/docs/examples/input-rows/layer-form.vue +85 -85
  200. package/docs/examples/input-rows/nested.vue +91 -91
  201. package/docs/examples/input-tag/basic.vue +27 -27
  202. package/docs/examples/input-tag/colors.vue +23 -23
  203. package/docs/examples/input-tag/readonly.vue +17 -17
  204. package/docs/examples/layer/basic.vue +43 -43
  205. package/docs/examples/layer/custom-buttons.vue +61 -61
  206. package/docs/examples/layer/drawer.vue +37 -37
  207. package/docs/examples/layer/full.vue +38 -38
  208. package/docs/examples/layer/modal.vue +34 -34
  209. package/docs/examples/layer/steps.vue +46 -46
  210. package/docs/examples/layer-form/basic.vue +76 -76
  211. package/docs/examples/layer-form/config.vue +82 -82
  212. package/docs/examples/layer-form/size.vue +72 -72
  213. package/docs/examples/layout/basic.vue +36 -36
  214. package/docs/examples/layout/custom-size.vue +50 -50
  215. package/docs/examples/layout/disable-move.vue +37 -37
  216. package/docs/examples/layout/hide-mid-when-narrow.vue +96 -96
  217. package/docs/examples/layout/min-size.vue +73 -73
  218. package/docs/examples/layout/percent-size.vue +80 -80
  219. package/docs/examples/layout/simple.vue +22 -22
  220. package/docs/examples/layout/top-side.vue +34 -34
  221. package/docs/examples/map/basic.vue +22 -22
  222. package/docs/examples/menu/basic.vue +58 -58
  223. package/docs/examples/menu/collapsed.vue +49 -49
  224. package/docs/examples/menu/horizontal.vue +44 -44
  225. package/docs/examples/menu/selection-test.vue +104 -104
  226. package/docs/examples/menu/theme.vue +46 -46
  227. package/docs/examples/menu/vertical.vue +46 -46
  228. package/docs/examples/number/advanced.vue +143 -143
  229. package/docs/examples/number/basic.vue +63 -63
  230. package/docs/examples/number/disabled.vue +49 -49
  231. package/docs/examples/number/size.vue +42 -42
  232. package/docs/examples/number/slots.vue +123 -123
  233. package/docs/examples/number/step-strictly.vue +41 -41
  234. package/docs/examples/number/step.vue +47 -47
  235. package/docs/examples/page/basic.vue +41 -41
  236. package/docs/examples/page/dept-user-management.vue +211 -211
  237. package/docs/examples/page/init.vue +87 -87
  238. package/docs/examples/page/log.vue +453 -453
  239. package/docs/examples/page/user-management.vue +313 -313
  240. package/docs/examples/panel/tool-buttons.vue +18 -18
  241. package/docs/examples/radio/basic.vue +17 -17
  242. package/docs/examples/radio/button.vue +17 -17
  243. package/docs/examples/radio/color.vue +18 -18
  244. package/docs/examples/radio/disabled.vue +17 -17
  245. package/docs/examples/radio/size.vue +29 -29
  246. package/docs/examples/rate/basic.vue +24 -24
  247. package/docs/examples/rate/half.vue +24 -24
  248. package/docs/examples/rate/readonly.vue +11 -11
  249. package/docs/examples/rate/text.vue +32 -32
  250. package/docs/examples/select/basic.vue +16 -16
  251. package/docs/examples/select/clearable.vue +22 -22
  252. package/docs/examples/select/disabled.vue +31 -31
  253. package/docs/examples/select/filterable.vue +24 -24
  254. package/docs/examples/select/group.vue +23 -23
  255. package/docs/examples/select/icon.vue +16 -16
  256. package/docs/examples/select/multiple.vue +18 -18
  257. package/docs/examples/select/size.vue +39 -39
  258. package/docs/examples/slider/basic.vue +42 -42
  259. package/docs/examples/slider/disabled.vue +17 -17
  260. package/docs/examples/slider/marks.vue +30 -30
  261. package/docs/examples/slider/size.vue +37 -37
  262. package/docs/examples/slider/tooltip.vue +36 -36
  263. package/docs/examples/slider/vertical.vue +26 -26
  264. package/docs/examples/slider-captcha/basic.vue +44 -44
  265. package/docs/examples/slider-captcha/custom.vue +48 -48
  266. package/docs/examples/switch/basic.vue +16 -16
  267. package/docs/examples/switch/disabled.vue +13 -13
  268. package/docs/examples/switch/loading.vue +13 -13
  269. package/docs/examples/switch/size.vue +15 -15
  270. package/docs/examples/switch/text.vue +13 -13
  271. package/docs/examples/table/action-filter.vue +126 -126
  272. package/docs/examples/table/actions.vue +116 -116
  273. package/docs/examples/table/add-row.vue +103 -103
  274. package/docs/examples/table/basic.vue +168 -168
  275. package/docs/examples/table/checkbox-layout.vue +68 -68
  276. package/docs/examples/table/custom-layout.vue +115 -115
  277. package/docs/examples/table/dynamic-type.vue +73 -73
  278. package/docs/examples/table/editable.vue +262 -262
  279. package/docs/examples/table/field-selection.vue +87 -87
  280. package/docs/examples/table/frozen-column.vue +140 -140
  281. package/docs/examples/table/height-mode.vue +99 -99
  282. package/docs/examples/table/icon.vue +85 -85
  283. package/docs/examples/table/link.vue +66 -66
  284. package/docs/examples/table/multiple.vue +188 -188
  285. package/docs/examples/table/pagination.vue +151 -151
  286. package/docs/examples/table/single-selection.vue +64 -64
  287. package/docs/examples/table/sub-table-lazy.vue +97 -97
  288. package/docs/examples/table/sub-table.vue +103 -103
  289. package/docs/examples/table/tag.vue +43 -43
  290. package/docs/examples/table/tree-column.vue +119 -119
  291. package/docs/examples/table/tree-data.vue +141 -141
  292. package/docs/examples/table/tree-default-expand-all.vue +60 -60
  293. package/docs/examples/table/tree-lazy.vue +80 -80
  294. package/docs/examples/table/tree-set-selection.vue +75 -75
  295. package/docs/examples/table-panel/basic.vue +228 -228
  296. package/docs/examples/table-panel/batch-operations.vue +285 -285
  297. package/docs/examples/table-panel/button-visibility.vue +88 -88
  298. package/docs/examples/table-panel/filter.vue +219 -219
  299. package/docs/examples/table-panel/get-selection.vue +111 -111
  300. package/docs/examples/table-panel/multiple-selection.vue +243 -243
  301. package/docs/examples/table-panel/pagination.vue +133 -133
  302. package/docs/examples/table-panel/sub-table-lazy.vue +118 -118
  303. package/docs/examples/table-panel/tree-parent-key.vue +67 -67
  304. package/docs/examples/tabs/basic.vue +98 -98
  305. package/docs/examples/time/base.vue +67 -67
  306. package/docs/examples/title/basic.vue +87 -80
  307. package/docs/examples/tree/accordion.vue +46 -46
  308. package/docs/examples/tree/basic.vue +50 -50
  309. package/docs/examples/tree/buttons.vue +53 -53
  310. package/docs/examples/tree/checkable.vue +52 -52
  311. package/docs/examples/tree/custom-keys.vue +39 -39
  312. package/docs/examples/tree/default-expanded.vue +52 -52
  313. package/docs/examples/tree/draggable.vue +29 -29
  314. package/docs/examples/tree/expand-on-click.vue +39 -39
  315. package/docs/examples/tree/flat-data.vue +20 -20
  316. package/docs/examples/tree/icon.vue +40 -40
  317. package/docs/examples/tree/load-data.vue +37 -37
  318. package/docs/examples/tree/methods.vue +74 -74
  319. package/docs/examples/tree/theme.vue +33 -33
  320. package/docs/examples/tree-select/basic.vue +47 -47
  321. package/docs/examples/upload/accept.vue +31 -31
  322. package/docs/examples/upload/basic.vue +12 -12
  323. package/docs/examples/upload/drag.vue +11 -11
  324. package/docs/examples/upload/image.vue +17 -17
  325. package/docs/examples/upload/limit.vue +20 -20
  326. package/docs/examples/upload/multiple.vue +17 -17
  327. package/docs/examples/upload/readonly.vue +17 -17
  328. package/docs/examples/utils/cipher.vue +160 -160
  329. package/docs/examples/utils/common.vue +153 -153
  330. package/docs/examples/utils/date.vue +56 -56
  331. package/docs/examples/utils/dom.vue +52 -52
  332. package/docs/examples/utils/is.vue +70 -70
  333. package/docs/examples/workflow/basic.vue +265 -265
  334. package/docs/examples/workflow-viewer/basic.vue +248 -248
  335. package/package.json +23 -26
@@ -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>