@a2simcode/ui 0.0.322 → 0.0.323

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 (375) 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/table-panel/src/table-panel.vue.d.ts +4 -4
  6. package/dist/simcode-ui.es.js +186 -190
  7. package/dist/simcode-ui.umd.js +2 -2
  8. package/dist/stats.html +1 -1
  9. package/dist/ui.css +1 -1
  10. package/docs/components/autocomplete.md +89 -89
  11. package/docs/components/barcode.md +101 -101
  12. package/docs/components/button-select.md +24 -24
  13. package/docs/components/button.md +117 -117
  14. package/docs/components/buttons.md +119 -119
  15. package/docs/components/card-list.md +38 -38
  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 +106 -106
  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 +87 -87
  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 +56 -56
  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/button.ts +212 -212
  49. package/docs/components/meta/buttons.ts +81 -81
  50. package/docs/components/meta/card-list.ts +210 -210
  51. package/docs/components/meta/code-mirror.ts +108 -108
  52. package/docs/components/meta/comp.ts +235 -235
  53. package/docs/components/meta/date.ts +277 -277
  54. package/docs/components/meta/echarts.ts +64 -64
  55. package/docs/components/meta/form-item.ts +62 -62
  56. package/docs/components/meta/form.ts +181 -181
  57. package/docs/components/meta/input-button.ts +175 -175
  58. package/docs/components/meta/input-cards.ts +112 -112
  59. package/docs/components/meta/input-code.ts +161 -161
  60. package/docs/components/meta/input-color.ts +243 -243
  61. package/docs/components/meta/input-rows.ts +119 -119
  62. package/docs/components/meta/layer-form.ts +74 -74
  63. package/docs/components/meta/map.ts +68 -68
  64. package/docs/components/meta/panel.ts +152 -152
  65. package/docs/components/meta/radio.ts +55 -55
  66. package/docs/components/meta/select.ts +289 -289
  67. package/docs/components/meta/slider.ts +270 -270
  68. package/docs/components/meta/table-panel.ts +343 -343
  69. package/docs/components/meta/table.ts +495 -495
  70. package/docs/components/meta/tabs.ts +146 -146
  71. package/docs/components/meta/title.ts +91 -91
  72. package/docs/components/meta/tree-select.ts +220 -220
  73. package/docs/components/meta/tree.ts +225 -225
  74. package/docs/components/meta/vpanel.ts +19 -19
  75. package/docs/components/meta/workflow-viewer.ts +55 -55
  76. package/docs/components/number.md +124 -124
  77. package/docs/components/page.md +102 -102
  78. package/docs/components/panel.md +37 -37
  79. package/docs/components/radio.md +87 -87
  80. package/docs/components/rate.md +71 -71
  81. package/docs/components/select.md +149 -149
  82. package/docs/components/slider-captcha.md +41 -41
  83. package/docs/components/slider.md +101 -101
  84. package/docs/components/switch.md +90 -90
  85. package/docs/components/table-panel.md +342 -342
  86. package/docs/components/table.md +526 -526
  87. package/docs/components/tabs.md +26 -26
  88. package/docs/components/title.md +24 -24
  89. package/docs/components/tree.md +222 -222
  90. package/docs/components/upload.md +117 -117
  91. package/docs/components/workflow-viewer.md +21 -21
  92. package/docs/components/workflow.md +21 -21
  93. package/docs/examples/autocomplete/advanced.vue +35 -35
  94. package/docs/examples/autocomplete/basic.vue +32 -32
  95. package/docs/examples/autocomplete/clearable.vue +33 -33
  96. package/docs/examples/autocomplete/custom-template.vue +49 -49
  97. package/docs/examples/autocomplete/disabled.vue +33 -33
  98. package/docs/examples/autocomplete/icon.vue +37 -37
  99. package/docs/examples/barcode/all-types.vue +380 -380
  100. package/docs/examples/barcode/basic.vue +14 -14
  101. package/docs/examples/barcode/props-appearance.vue +243 -243
  102. package/docs/examples/barcode/props-geometry.vue +143 -143
  103. package/docs/examples/barcode/props-logic.vue +216 -216
  104. package/docs/examples/barcode/props-symbology.vue +199 -199
  105. package/docs/examples/barcode/props-text.vue +268 -268
  106. package/docs/examples/button/basic.vue +7 -7
  107. package/docs/examples/button/disabled.vue +42 -42
  108. package/docs/examples/button/loading.vue +6 -6
  109. package/docs/examples/button/shape.vue +7 -7
  110. package/docs/examples/button/size.vue +14 -14
  111. package/docs/examples/button/status.vue +34 -34
  112. package/docs/examples/button/type.vue +10 -10
  113. package/docs/examples/button-select/basic.vue +19 -19
  114. package/docs/examples/buttons/basic.vue +62 -62
  115. package/docs/examples/buttons/disabled.vue +36 -36
  116. package/docs/examples/buttons/dropdown.vue +63 -63
  117. package/docs/examples/buttons/group.vue +52 -52
  118. package/docs/examples/buttons/link.vue +47 -47
  119. package/docs/examples/buttons/popup.vue +39 -39
  120. package/docs/examples/buttons/size.vue +45 -45
  121. package/docs/examples/card-list/basic.vue +70 -70
  122. package/docs/examples/card-list/selection-pagination.vue +69 -69
  123. package/docs/examples/cascader-select/basic.vue +28 -28
  124. package/docs/examples/cascader-select/clearable.vue +34 -34
  125. package/docs/examples/cascader-select/disabled.vue +43 -43
  126. package/docs/examples/cascader-select/filterable.vue +37 -37
  127. package/docs/examples/cascader-select/methods.vue +84 -84
  128. package/docs/examples/cascader-select/multiple.vue +38 -38
  129. package/docs/examples/cascader-select/slot.vue +45 -45
  130. package/docs/examples/checkbox/basic.vue +18 -18
  131. package/docs/examples/checkbox/button.vue +19 -19
  132. package/docs/examples/checkbox/color.vue +25 -25
  133. package/docs/examples/checkbox/disabled.vue +17 -17
  134. package/docs/examples/checkbox/min-max.vue +20 -20
  135. package/docs/examples/checkbox/mixed.vue +56 -56
  136. package/docs/examples/checkbox/size.vue +28 -28
  137. package/docs/examples/code-mirror/basic.vue +11 -11
  138. package/docs/examples/code-mirror/events.vue +42 -42
  139. package/docs/examples/code-mirror/height.vue +25 -25
  140. package/docs/examples/code-mirror/mode.vue +33 -33
  141. package/docs/examples/code-mirror/readonly.vue +14 -14
  142. package/docs/examples/collapse/basic.vue +82 -82
  143. package/docs/examples/comp/basic.vue +7 -7
  144. package/docs/examples/comp/collapse.vue +38 -38
  145. package/docs/examples/comp/table-merge-rows.vue +77 -77
  146. package/docs/examples/comp/table-row-fixed-merge.vue +105 -105
  147. package/docs/examples/comp/tabs.vue +38 -38
  148. package/docs/examples/count/basic.vue +101 -101
  149. package/docs/examples/count-up/basic.vue +89 -89
  150. package/docs/examples/data-panel/basic.vue +110 -110
  151. package/docs/examples/date/basic.vue +73 -73
  152. package/docs/examples/date/default-value.vue +59 -59
  153. package/docs/examples/date/format.vue +75 -75
  154. package/docs/examples/date/range.vue +66 -66
  155. package/docs/examples/date/types.vue +79 -79
  156. package/docs/examples/decorated-title/basic.vue +31 -31
  157. package/docs/examples/dialog/basic.vue +36 -36
  158. package/docs/examples/dialog/custom-buttons.vue +44 -44
  159. package/docs/examples/dialog/fullscreen.vue +23 -23
  160. package/docs/examples/dialog/no-mask.vue +17 -17
  161. package/docs/examples/dialog/size.vue +44 -44
  162. package/docs/examples/dialog/steps.vue +57 -57
  163. package/docs/examples/dialog-full/basic.vue +29 -29
  164. package/docs/examples/dialog-full/custom-buttons.vue +45 -45
  165. package/docs/examples/dialog-full/no-buttons.vue +18 -18
  166. package/docs/examples/dialog-full/no-header.vue +27 -27
  167. package/docs/examples/dialog-full/steps.vue +71 -71
  168. package/docs/examples/divider/basic.vue +52 -52
  169. package/docs/examples/drawer/basic.vue +35 -35
  170. package/docs/examples/drawer/custom-buttons.vue +34 -34
  171. package/docs/examples/drawer/direction.vue +47 -47
  172. package/docs/examples/drawer/mask.vue +36 -36
  173. package/docs/examples/drawer/no-buttons.vue +20 -20
  174. package/docs/examples/drawer/size.vue +28 -28
  175. package/docs/examples/dynamic-layer/basic.vue +33 -33
  176. package/docs/examples/dynamic-layer/custom-buttons.vue +43 -43
  177. package/docs/examples/dynamic-layer/form.vue +73 -73
  178. package/docs/examples/dynamic-layer/steps.vue +52 -52
  179. package/docs/examples/dynamic-layer/types.vue +40 -40
  180. package/docs/examples/echarts/basic.vue +31 -31
  181. package/docs/examples/echarts/dynamic.vue +43 -43
  182. package/docs/examples/echarts/line.vue +46 -46
  183. package/docs/examples/echarts/pie.vue +44 -44
  184. package/docs/examples/editor/basic.vue +15 -15
  185. package/docs/examples/form/basic.vue +688 -688
  186. package/docs/examples/form/init.vue +76 -76
  187. package/docs/examples/form/master-detail.vue +203 -203
  188. package/docs/examples/form/rule-format.vue +179 -179
  189. package/docs/examples/form/view-table.vue +378 -378
  190. package/docs/examples/guid/basic.vue +10 -10
  191. package/docs/examples/guid/size.vue +13 -13
  192. package/docs/examples/hpanel/basic.vue +79 -79
  193. package/docs/examples/icon/basic.vue +9 -9
  194. package/docs/examples/icon/rotate-flip.vue +9 -9
  195. package/docs/examples/icon/size.vue +7 -7
  196. package/docs/examples/input/basic.vue +10 -10
  197. package/docs/examples/input/clearable.vue +12 -12
  198. package/docs/examples/input/disabled.vue +6 -6
  199. package/docs/examples/input/icon.vue +23 -23
  200. package/docs/examples/input/password.vue +18 -18
  201. package/docs/examples/input/size.vue +13 -13
  202. package/docs/examples/input/textarea.vue +25 -25
  203. package/docs/examples/input/word-limit.vue +28 -28
  204. package/docs/examples/input-button/basic.vue +33 -33
  205. package/docs/examples/input-cards/basic.vue +79 -79
  206. package/docs/examples/input-code/basic.vue +29 -29
  207. package/docs/examples/input-color/basic.vue +10 -10
  208. package/docs/examples/input-color/disabled.vue +13 -13
  209. package/docs/examples/input-color/format.vue +17 -17
  210. package/docs/examples/input-color/no-alpha.vue +13 -13
  211. package/docs/examples/input-color/only-button.vue +15 -15
  212. package/docs/examples/input-color/predefine.vue +31 -31
  213. package/docs/examples/input-color/size.vue +15 -15
  214. package/docs/examples/input-layer/basic.vue +85 -85
  215. package/docs/examples/input-layer/render-vnode-page.vue +160 -160
  216. package/docs/examples/input-layer/render-vnode.vue +127 -127
  217. package/docs/examples/input-rows/basic.vue +73 -73
  218. package/docs/examples/input-rows/drag.vue +48 -48
  219. package/docs/examples/input-rows/layer-form.vue +85 -85
  220. package/docs/examples/input-rows/nested.vue +91 -91
  221. package/docs/examples/input-tag/basic.vue +27 -27
  222. package/docs/examples/input-tag/colors.vue +23 -23
  223. package/docs/examples/input-tag/readonly.vue +17 -17
  224. package/docs/examples/layer/basic.vue +43 -43
  225. package/docs/examples/layer/custom-buttons.vue +61 -61
  226. package/docs/examples/layer/drawer.vue +37 -37
  227. package/docs/examples/layer/full.vue +38 -38
  228. package/docs/examples/layer/modal.vue +34 -34
  229. package/docs/examples/layer/steps.vue +46 -46
  230. package/docs/examples/layer-form/basic.vue +76 -76
  231. package/docs/examples/layer-form/config.vue +82 -82
  232. package/docs/examples/layer-form/size.vue +72 -72
  233. package/docs/examples/layout/basic.vue +36 -36
  234. package/docs/examples/layout/custom-size.vue +50 -50
  235. package/docs/examples/layout/disable-move.vue +37 -37
  236. package/docs/examples/layout/hide-mid-when-narrow.vue +96 -96
  237. package/docs/examples/layout/min-size.vue +73 -73
  238. package/docs/examples/layout/percent-size.vue +80 -80
  239. package/docs/examples/layout/simple.vue +22 -22
  240. package/docs/examples/layout/top-side.vue +34 -34
  241. package/docs/examples/map/basic.vue +22 -22
  242. package/docs/examples/menu/basic.vue +58 -58
  243. package/docs/examples/menu/collapsed.vue +49 -49
  244. package/docs/examples/menu/horizontal.vue +44 -44
  245. package/docs/examples/menu/selection-test.vue +104 -104
  246. package/docs/examples/menu/theme.vue +46 -46
  247. package/docs/examples/menu/vertical.vue +46 -46
  248. package/docs/examples/number/advanced.vue +143 -143
  249. package/docs/examples/number/basic.vue +63 -63
  250. package/docs/examples/number/disabled.vue +49 -49
  251. package/docs/examples/number/size.vue +42 -42
  252. package/docs/examples/number/slots.vue +123 -123
  253. package/docs/examples/number/step-strictly.vue +41 -41
  254. package/docs/examples/number/step.vue +47 -47
  255. package/docs/examples/page/basic.vue +41 -41
  256. package/docs/examples/page/code-table-model.vue +428 -428
  257. package/docs/examples/page/dept-user-management.vue +211 -211
  258. package/docs/examples/page/init.vue +87 -87
  259. package/docs/examples/page/log.vue +453 -453
  260. package/docs/examples/page/user-management.vue +313 -313
  261. package/docs/examples/panel/tool-buttons.vue +18 -18
  262. package/docs/examples/radio/basic.vue +17 -17
  263. package/docs/examples/radio/button.vue +17 -17
  264. package/docs/examples/radio/color.vue +18 -18
  265. package/docs/examples/radio/disabled.vue +17 -17
  266. package/docs/examples/radio/size.vue +29 -29
  267. package/docs/examples/rate/basic.vue +24 -24
  268. package/docs/examples/rate/half.vue +24 -24
  269. package/docs/examples/rate/readonly.vue +11 -11
  270. package/docs/examples/rate/text.vue +37 -37
  271. package/docs/examples/select/basic.vue +16 -16
  272. package/docs/examples/select/clearable.vue +22 -22
  273. package/docs/examples/select/color.vue +16 -16
  274. package/docs/examples/select/disabled.vue +31 -31
  275. package/docs/examples/select/filterable.vue +24 -24
  276. package/docs/examples/select/group.vue +23 -23
  277. package/docs/examples/select/icon.vue +16 -16
  278. package/docs/examples/select/multiple.vue +18 -18
  279. package/docs/examples/select/size.vue +39 -39
  280. package/docs/examples/slider/basic.vue +42 -42
  281. package/docs/examples/slider/disabled.vue +17 -17
  282. package/docs/examples/slider/marks.vue +30 -30
  283. package/docs/examples/slider/size.vue +37 -37
  284. package/docs/examples/slider/tooltip.vue +36 -36
  285. package/docs/examples/slider/vertical.vue +26 -26
  286. package/docs/examples/slider-captcha/basic.vue +44 -44
  287. package/docs/examples/slider-captcha/custom.vue +48 -48
  288. package/docs/examples/switch/basic.vue +16 -16
  289. package/docs/examples/switch/disabled.vue +13 -13
  290. package/docs/examples/switch/loading.vue +13 -13
  291. package/docs/examples/switch/size.vue +15 -15
  292. package/docs/examples/switch/text.vue +13 -13
  293. package/docs/examples/table/action-filter.vue +126 -126
  294. package/docs/examples/table/actions.vue +116 -116
  295. package/docs/examples/table/add-row.vue +98 -98
  296. package/docs/examples/table/basic.vue +168 -168
  297. package/docs/examples/table/checkbox-layout.vue +68 -68
  298. package/docs/examples/table/column-filter.vue +96 -96
  299. package/docs/examples/table/custom-layout.vue +115 -115
  300. package/docs/examples/table/custom-merge-cell.vue +206 -206
  301. package/docs/examples/table/dynamic-type.vue +74 -74
  302. package/docs/examples/table/editable.vue +290 -290
  303. package/docs/examples/table/field-selection.vue +87 -87
  304. package/docs/examples/table/frozen-column.vue +140 -140
  305. package/docs/examples/table/height-mode.vue +99 -99
  306. package/docs/examples/table/icon.vue +85 -85
  307. package/docs/examples/table/layer-form.vue +133 -133
  308. package/docs/examples/table/link.vue +66 -66
  309. package/docs/examples/table/merge-cell.vue +78 -78
  310. package/docs/examples/table/merge-header.vue +86 -86
  311. package/docs/examples/table/multiple-disabled.vue +112 -112
  312. package/docs/examples/table/multiple.vue +188 -188
  313. package/docs/examples/table/pagination.vue +151 -151
  314. package/docs/examples/table/row-drag.vue +67 -67
  315. package/docs/examples/table/row-fixed.vue +61 -61
  316. package/docs/examples/table/show-tag.vue +68 -68
  317. package/docs/examples/table/single-selection.vue +64 -64
  318. package/docs/examples/table/sub-table-lazy.vue +97 -97
  319. package/docs/examples/table/sub-table.vue +103 -103
  320. package/docs/examples/table/tag.vue +43 -43
  321. package/docs/examples/table/tree-column.vue +119 -119
  322. package/docs/examples/table/tree-data.vue +141 -141
  323. package/docs/examples/table/tree-default-expand-all.vue +60 -60
  324. package/docs/examples/table/tree-lazy.vue +80 -80
  325. package/docs/examples/table/tree-set-selection.vue +75 -75
  326. package/docs/examples/table-panel/basic.vue +229 -229
  327. package/docs/examples/table-panel/batch-operations.vue +286 -286
  328. package/docs/examples/table-panel/button-visibility.vue +88 -88
  329. package/docs/examples/table-panel/card.vue +101 -101
  330. package/docs/examples/table-panel/column-filter.vue +116 -116
  331. package/docs/examples/table-panel/filter.vue +219 -219
  332. package/docs/examples/table-panel/get-selection.vue +111 -111
  333. package/docs/examples/table-panel/mask.vue +151 -151
  334. package/docs/examples/table-panel/model-value.vue +87 -87
  335. package/docs/examples/table-panel/multiple-selection.vue +243 -243
  336. package/docs/examples/table-panel/pagination-select-state-key.vue +176 -176
  337. package/docs/examples/table-panel/pagination.vue +133 -133
  338. package/docs/examples/table-panel/remote-selection.vue +159 -159
  339. package/docs/examples/table-panel/search-list.vue +207 -207
  340. package/docs/examples/table-panel/sub-table-lazy.vue +118 -118
  341. package/docs/examples/table-panel/tree-parent-key.vue +67 -67
  342. package/docs/examples/tabs/basic.vue +98 -98
  343. package/docs/examples/time/base.vue +67 -67
  344. package/docs/examples/title/basic.vue +87 -87
  345. package/docs/examples/tree/accordion.vue +46 -46
  346. package/docs/examples/tree/basic.vue +50 -50
  347. package/docs/examples/tree/buttons.vue +53 -53
  348. package/docs/examples/tree/check-strictly.vue +53 -53
  349. package/docs/examples/tree/checkable.vue +52 -52
  350. package/docs/examples/tree/custom-keys.vue +39 -39
  351. package/docs/examples/tree/default-expanded.vue +52 -52
  352. package/docs/examples/tree/draggable.vue +29 -29
  353. package/docs/examples/tree/expand-on-click.vue +39 -39
  354. package/docs/examples/tree/flat-data.vue +20 -20
  355. package/docs/examples/tree/icon.vue +40 -40
  356. package/docs/examples/tree/load-data.vue +37 -37
  357. package/docs/examples/tree/methods.vue +74 -74
  358. package/docs/examples/tree/theme.vue +33 -33
  359. package/docs/examples/tree-select/basic.vue +47 -47
  360. package/docs/examples/tree-select/lazy.vue +42 -42
  361. package/docs/examples/upload/accept.vue +31 -31
  362. package/docs/examples/upload/basic.vue +12 -12
  363. package/docs/examples/upload/drag.vue +11 -11
  364. package/docs/examples/upload/image.vue +17 -17
  365. package/docs/examples/upload/limit.vue +20 -20
  366. package/docs/examples/upload/multiple.vue +17 -17
  367. package/docs/examples/upload/readonly.vue +17 -17
  368. package/docs/examples/utils/cipher.vue +160 -160
  369. package/docs/examples/utils/common.vue +153 -153
  370. package/docs/examples/utils/date.vue +56 -56
  371. package/docs/examples/utils/dom.vue +52 -52
  372. package/docs/examples/utils/is.vue +70 -70
  373. package/docs/examples/workflow/basic.vue +265 -265
  374. package/docs/examples/workflow-viewer/basic.vue +248 -248
  375. package/package.json +23 -23
@@ -1,176 +1,176 @@
1
- <template>
2
- <div style="margin-bottom: 10px; display: flex; gap: 8px; align-items: center">
3
- <j-button type="primary" label="获取跨页选中" @click="getAllSelected" />
4
- <j-button type="primary" label="设置跨页选中" @click="setAllSelected" />
5
- </div>
6
- <div style="position: relative; width: 100%; height: 500px">
7
- <j-table-panel
8
- ref="tablePanelRef"
9
- row-key="orderId"
10
- is-multiple
11
- select-state-key="selected"
12
- :columns="columns"
13
- :load-data="loadData"
14
- :is-page="true"
15
- :page-size="10"
16
- @select="handleSelect"
17
- />
18
- </div>
19
- </template>
20
-
21
- <script setup lang="ts">
22
- import { ref } from 'vue'
23
- import { ElMessageBox } from 'element-plus'
24
-
25
- const tablePanelRef = ref()
26
- // 外部维护选中的 ID 集合
27
- const selectedIds = ref(new Set<string>())
28
-
29
- // 选中变化时用事件携带的 keys(跨页选中的完整 ID 列表)整体同步,清空选中时 keys 为空数组
30
- const handleSelect = ({ keys }: { keys: string[] }) => {
31
- selectedIds.value = new Set(keys)
32
- }
33
-
34
- // 获取所有页选中的数据
35
- const getAllSelected = () => {
36
- const ids = Array.from(selectedIds.value)
37
- console.log('跨页选中的 ID:', ids)
38
- ElMessageBox.alert(`跨页共选中 ${ids.length} 条,ID 列表详情请看控制台`, '提示', {
39
- confirmButtonText: '知道了',
40
- type: 'info',
41
- })
42
- }
43
-
44
- // 程序化设置跨页选中
45
- const ids = ['ORD-000001', 'ORD-000030']
46
- const setAllSelected = () => {
47
- selectedIds.value = new Set(ids)
48
- // 按 ID 设置跨页选中,选中计数立即生效(无需等待对应页数据加载)
49
- tablePanelRef.value?.setSelectionById?.(ids)
50
- // 刷新表格,loadData 会根据 selectedIds 标记 selected 字段
51
- tablePanelRef.value?.refreshData?.()
52
- }
53
-
54
- const columns = ref([
55
- {
56
- id: 'orderId',
57
- type: '',
58
- config: {
59
- label: '订单号',
60
- width: 150,
61
- filter: {
62
- isSearchKeyword: true,
63
- },
64
- },
65
- },
66
- {
67
- id: 'customerId',
68
- type: '',
69
- config: {
70
- label: '客户编号',
71
- width: 120,
72
- filter: {
73
- isSearchKeyword: true,
74
- },
75
- },
76
- },
77
- {
78
- id: 'productName',
79
- type: '',
80
- config: {
81
- label: '产品名称',
82
- filter: {
83
- isSearchKeyword: true,
84
- },
85
- },
86
- },
87
- {
88
- id: 'category',
89
- type: '',
90
- config: {
91
- label: '类别',
92
- width: 120,
93
- },
94
- },
95
- {
96
- id: 'region',
97
- type: '',
98
- config: {
99
- label: '区域',
100
- width: 100,
101
- },
102
- },
103
- {
104
- id: 'sales',
105
- type: '',
106
- config: {
107
- label: '销售额',
108
- width: 100,
109
- align: 'right',
110
- },
111
- },
112
- ])
113
-
114
- // 生成模拟数据
115
- const generateMockData = (count: number): Record<string, any>[] => {
116
- const categories = ['办公用品', '科技产品', '家具']
117
- const regions = ['华东', '华南', '华北', '华中', '西南', '西北']
118
- const data: Record<string, any>[] = []
119
-
120
- for (let i = 1; i <= count; i++) {
121
- data.push({
122
- orderId: `ORD-${String(i).padStart(6, '0')}`,
123
- customerId: `CUS-${String(Math.floor(Math.random() * 10000)).padStart(5, '0')}`,
124
- productName: `产品名称 ${i}`,
125
- category: categories[Math.floor(Math.random() * categories.length)],
126
- region: regions[Math.floor(Math.random() * regions.length)],
127
- sales: (Math.random() * 10000).toFixed(2),
128
- })
129
- }
130
-
131
- return data
132
- }
133
-
134
- const allData = generateMockData(100)
135
-
136
- // 模拟后端分页接口
137
- // 使用 select-state-key 时,需要在数据加载时标记 selected 字段
138
- const loadData = async (params: Record<string, any>) => {
139
- const hasKeyword = params.keyword?.value
140
- const hasFilter = params.filter?.cond?.length > 0
141
-
142
- if (hasKeyword || hasFilter) {
143
- ElMessageBox.alert(
144
- '查询过滤功能需要后端支持。在实际使用中,请将查询参数(keyword 和 filter)传递给后端接口进行数据过滤。',
145
- '提示',
146
- {
147
- confirmButtonText: '知道了',
148
- type: 'info',
149
- }
150
- )
151
- }
152
-
153
- return new Promise((resolve) => {
154
- setTimeout(() => {
155
- const { pagination } = params
156
- const { rows, page } = pagination || { rows: 10, page: 1 }
157
- const start = (page - 1) * rows
158
- const end = start + rows
159
-
160
- // 获取当前页数据
161
- const pageData = allData.slice(start, end)
162
-
163
- // 根据 selectedIds 标记 selected 字段
164
- // select-state-key="selected" 会让表格自动根据此字段初始化选中状态
165
- pageData.forEach((item) => {
166
- item.selected = selectedIds.value.has(item.orderId)
167
- })
168
-
169
- resolve({
170
- rows: pageData,
171
- records: allData.length,
172
- })
173
- }, 300)
174
- })
175
- }
176
- </script>
1
+ <template>
2
+ <div style="margin-bottom: 10px; display: flex; gap: 8px; align-items: center">
3
+ <j-button type="primary" label="获取跨页选中" @click="getAllSelected" />
4
+ <j-button type="primary" label="设置跨页选中" @click="setAllSelected" />
5
+ </div>
6
+ <div style="position: relative; width: 100%; height: 500px">
7
+ <j-table-panel
8
+ ref="tablePanelRef"
9
+ row-key="orderId"
10
+ is-multiple
11
+ select-state-key="selected"
12
+ :columns="columns"
13
+ :load-data="loadData"
14
+ :is-page="true"
15
+ :page-size="10"
16
+ @select="handleSelect"
17
+ />
18
+ </div>
19
+ </template>
20
+
21
+ <script setup lang="ts">
22
+ import { ref } from 'vue'
23
+ import { ElMessageBox } from 'element-plus'
24
+
25
+ const tablePanelRef = ref()
26
+ // 外部维护选中的 ID 集合
27
+ const selectedIds = ref(new Set<string>())
28
+
29
+ // 选中变化时用事件携带的 keys(跨页选中的完整 ID 列表)整体同步,清空选中时 keys 为空数组
30
+ const handleSelect = ({ keys }: { keys: string[] }) => {
31
+ selectedIds.value = new Set(keys)
32
+ }
33
+
34
+ // 获取所有页选中的数据
35
+ const getAllSelected = () => {
36
+ const ids = Array.from(selectedIds.value)
37
+ console.log('跨页选中的 ID:', ids)
38
+ ElMessageBox.alert(`跨页共选中 ${ids.length} 条,ID 列表详情请看控制台`, '提示', {
39
+ confirmButtonText: '知道了',
40
+ type: 'info',
41
+ })
42
+ }
43
+
44
+ // 程序化设置跨页选中
45
+ const ids = ['ORD-000001', 'ORD-000030']
46
+ const setAllSelected = () => {
47
+ selectedIds.value = new Set(ids)
48
+ // 按 ID 设置跨页选中,选中计数立即生效(无需等待对应页数据加载)
49
+ tablePanelRef.value?.setSelectionById?.(ids)
50
+ // 刷新表格,loadData 会根据 selectedIds 标记 selected 字段
51
+ tablePanelRef.value?.refreshData?.()
52
+ }
53
+
54
+ const columns = ref([
55
+ {
56
+ id: 'orderId',
57
+ type: '',
58
+ config: {
59
+ label: '订单号',
60
+ width: 150,
61
+ filter: {
62
+ isSearchKeyword: true,
63
+ },
64
+ },
65
+ },
66
+ {
67
+ id: 'customerId',
68
+ type: '',
69
+ config: {
70
+ label: '客户编号',
71
+ width: 120,
72
+ filter: {
73
+ isSearchKeyword: true,
74
+ },
75
+ },
76
+ },
77
+ {
78
+ id: 'productName',
79
+ type: '',
80
+ config: {
81
+ label: '产品名称',
82
+ filter: {
83
+ isSearchKeyword: true,
84
+ },
85
+ },
86
+ },
87
+ {
88
+ id: 'category',
89
+ type: '',
90
+ config: {
91
+ label: '类别',
92
+ width: 120,
93
+ },
94
+ },
95
+ {
96
+ id: 'region',
97
+ type: '',
98
+ config: {
99
+ label: '区域',
100
+ width: 100,
101
+ },
102
+ },
103
+ {
104
+ id: 'sales',
105
+ type: '',
106
+ config: {
107
+ label: '销售额',
108
+ width: 100,
109
+ align: 'right',
110
+ },
111
+ },
112
+ ])
113
+
114
+ // 生成模拟数据
115
+ const generateMockData = (count: number): Record<string, any>[] => {
116
+ const categories = ['办公用品', '科技产品', '家具']
117
+ const regions = ['华东', '华南', '华北', '华中', '西南', '西北']
118
+ const data: Record<string, any>[] = []
119
+
120
+ for (let i = 1; i <= count; i++) {
121
+ data.push({
122
+ orderId: `ORD-${String(i).padStart(6, '0')}`,
123
+ customerId: `CUS-${String(Math.floor(Math.random() * 10000)).padStart(5, '0')}`,
124
+ productName: `产品名称 ${i}`,
125
+ category: categories[Math.floor(Math.random() * categories.length)],
126
+ region: regions[Math.floor(Math.random() * regions.length)],
127
+ sales: (Math.random() * 10000).toFixed(2),
128
+ })
129
+ }
130
+
131
+ return data
132
+ }
133
+
134
+ const allData = generateMockData(100)
135
+
136
+ // 模拟后端分页接口
137
+ // 使用 select-state-key 时,需要在数据加载时标记 selected 字段
138
+ const loadData = async (params: Record<string, any>) => {
139
+ const hasKeyword = params.keyword?.value
140
+ const hasFilter = params.filter?.cond?.length > 0
141
+
142
+ if (hasKeyword || hasFilter) {
143
+ ElMessageBox.alert(
144
+ '查询过滤功能需要后端支持。在实际使用中,请将查询参数(keyword 和 filter)传递给后端接口进行数据过滤。',
145
+ '提示',
146
+ {
147
+ confirmButtonText: '知道了',
148
+ type: 'info',
149
+ }
150
+ )
151
+ }
152
+
153
+ return new Promise((resolve) => {
154
+ setTimeout(() => {
155
+ const { pagination } = params
156
+ const { rows, page } = pagination || { rows: 10, page: 1 }
157
+ const start = (page - 1) * rows
158
+ const end = start + rows
159
+
160
+ // 获取当前页数据
161
+ const pageData = allData.slice(start, end)
162
+
163
+ // 根据 selectedIds 标记 selected 字段
164
+ // select-state-key="selected" 会让表格自动根据此字段初始化选中状态
165
+ pageData.forEach((item) => {
166
+ item.selected = selectedIds.value.has(item.orderId)
167
+ })
168
+
169
+ resolve({
170
+ rows: pageData,
171
+ records: allData.length,
172
+ })
173
+ }, 300)
174
+ })
175
+ }
176
+ </script>
@@ -1,133 +1,133 @@
1
- <template>
2
- <div style="position: relative; width: 100%; height: 500px">
3
- <j-table-panel
4
- ref="tablePanelRef"
5
- row-key="orderId"
6
- :columns="columns"
7
- :load-data="loadData"
8
- :is-page="true"
9
- :page-size="10"
10
- />
11
- </div>
12
- </template>
13
-
14
- <script setup lang="ts">
15
- import { ref } from 'vue'
16
- import { ElMessageBox } from 'element-plus'
17
-
18
- const tablePanelRef = ref()
19
-
20
- const columns = ref([
21
- {
22
- id: 'orderId',
23
- type: '',
24
- config: {
25
- label: '订单号',
26
- width: 150,
27
- filter: {
28
- isSearchKeyword: true,
29
- },
30
- },
31
- },
32
- {
33
- id: 'customerId',
34
- type: '',
35
- config: {
36
- label: '客户编号',
37
- width: 120,
38
- filter: {
39
- isSearchKeyword: true,
40
- },
41
- },
42
- },
43
- {
44
- id: 'productName',
45
- type: '',
46
- config: {
47
- label: '产品名称',
48
- filter: {
49
- isSearchKeyword: true,
50
- },
51
- },
52
- },
53
- {
54
- id: 'category',
55
- type: '',
56
- config: {
57
- label: '类别',
58
- width: 120,
59
- },
60
- },
61
- {
62
- id: 'region',
63
- type: '',
64
- config: {
65
- label: '区域',
66
- width: 100,
67
- },
68
- },
69
- {
70
- id: 'sales',
71
- type: '',
72
- config: {
73
- label: '销售额',
74
- width: 100,
75
- align: 'right',
76
- },
77
- },
78
- ])
79
-
80
- // 生成模拟数据
81
- const generateMockData = (count: number) => {
82
- const categories = ['办公用品', '科技产品', '家具']
83
- const regions = ['华东', '华南', '华北', '华中', '西南', '西北']
84
- const data = []
85
-
86
- for (let i = 1; i <= count; i++) {
87
- data.push({
88
- orderId: `ORD-${String(i).padStart(6, '0')}`,
89
- customerId: `CUS-${String(Math.floor(Math.random() * 10000)).padStart(5, '0')}`,
90
- productName: `产品名称 ${i}`,
91
- category: categories[Math.floor(Math.random() * categories.length)],
92
- region: regions[Math.floor(Math.random() * regions.length)],
93
- sales: (Math.random() * 10000).toFixed(2),
94
- })
95
- }
96
-
97
- return data
98
- }
99
-
100
- const allData = generateMockData(100)
101
-
102
- const loadData = async (params: Record<string, any>) => {
103
- // 检测是否有查询过滤参数
104
- const hasKeyword = params.keyword?.value
105
- const hasFilter = params.filter?.cond?.length > 0
106
-
107
- if (hasKeyword || hasFilter) {
108
- ElMessageBox.alert(
109
- '查询过滤功能需要后端支持。在实际使用中,请将查询参数(keyword 和 filter)传递给后端接口进行数据过滤。',
110
- '提示',
111
- {
112
- confirmButtonText: '知道了',
113
- type: 'info',
114
- }
115
- )
116
- }
117
-
118
- // 模拟异步分页加载
119
- return new Promise((resolve) => {
120
- setTimeout(() => {
121
- const { pagination } = params
122
- const { rows, page } = pagination || { rows: 10, page: 1 }
123
- const start = (page - 1) * rows
124
- const end = start + rows
125
-
126
- resolve({
127
- rows: allData.slice(start, end),
128
- records: allData.length,
129
- })
130
- }, 300)
131
- })
132
- }
133
- </script>
1
+ <template>
2
+ <div style="position: relative; width: 100%; height: 500px">
3
+ <j-table-panel
4
+ ref="tablePanelRef"
5
+ row-key="orderId"
6
+ :columns="columns"
7
+ :load-data="loadData"
8
+ :is-page="true"
9
+ :page-size="10"
10
+ />
11
+ </div>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import { ref } from 'vue'
16
+ import { ElMessageBox } from 'element-plus'
17
+
18
+ const tablePanelRef = ref()
19
+
20
+ const columns = ref([
21
+ {
22
+ id: 'orderId',
23
+ type: '',
24
+ config: {
25
+ label: '订单号',
26
+ width: 150,
27
+ filter: {
28
+ isSearchKeyword: true,
29
+ },
30
+ },
31
+ },
32
+ {
33
+ id: 'customerId',
34
+ type: '',
35
+ config: {
36
+ label: '客户编号',
37
+ width: 120,
38
+ filter: {
39
+ isSearchKeyword: true,
40
+ },
41
+ },
42
+ },
43
+ {
44
+ id: 'productName',
45
+ type: '',
46
+ config: {
47
+ label: '产品名称',
48
+ filter: {
49
+ isSearchKeyword: true,
50
+ },
51
+ },
52
+ },
53
+ {
54
+ id: 'category',
55
+ type: '',
56
+ config: {
57
+ label: '类别',
58
+ width: 120,
59
+ },
60
+ },
61
+ {
62
+ id: 'region',
63
+ type: '',
64
+ config: {
65
+ label: '区域',
66
+ width: 100,
67
+ },
68
+ },
69
+ {
70
+ id: 'sales',
71
+ type: '',
72
+ config: {
73
+ label: '销售额',
74
+ width: 100,
75
+ align: 'right',
76
+ },
77
+ },
78
+ ])
79
+
80
+ // 生成模拟数据
81
+ const generateMockData = (count: number) => {
82
+ const categories = ['办公用品', '科技产品', '家具']
83
+ const regions = ['华东', '华南', '华北', '华中', '西南', '西北']
84
+ const data = []
85
+
86
+ for (let i = 1; i <= count; i++) {
87
+ data.push({
88
+ orderId: `ORD-${String(i).padStart(6, '0')}`,
89
+ customerId: `CUS-${String(Math.floor(Math.random() * 10000)).padStart(5, '0')}`,
90
+ productName: `产品名称 ${i}`,
91
+ category: categories[Math.floor(Math.random() * categories.length)],
92
+ region: regions[Math.floor(Math.random() * regions.length)],
93
+ sales: (Math.random() * 10000).toFixed(2),
94
+ })
95
+ }
96
+
97
+ return data
98
+ }
99
+
100
+ const allData = generateMockData(100)
101
+
102
+ const loadData = async (params: Record<string, any>) => {
103
+ // 检测是否有查询过滤参数
104
+ const hasKeyword = params.keyword?.value
105
+ const hasFilter = params.filter?.cond?.length > 0
106
+
107
+ if (hasKeyword || hasFilter) {
108
+ ElMessageBox.alert(
109
+ '查询过滤功能需要后端支持。在实际使用中,请将查询参数(keyword 和 filter)传递给后端接口进行数据过滤。',
110
+ '提示',
111
+ {
112
+ confirmButtonText: '知道了',
113
+ type: 'info',
114
+ }
115
+ )
116
+ }
117
+
118
+ // 模拟异步分页加载
119
+ return new Promise((resolve) => {
120
+ setTimeout(() => {
121
+ const { pagination } = params
122
+ const { rows, page } = pagination || { rows: 10, page: 1 }
123
+ const start = (page - 1) * rows
124
+ const end = start + rows
125
+
126
+ resolve({
127
+ rows: allData.slice(start, end),
128
+ records: allData.length,
129
+ })
130
+ }, 300)
131
+ })
132
+ }
133
+ </script>