@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,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>