@veltra/desktop 1.7.12 → 1.7.15

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 (190) hide show
  1. package/dist/components/batch-edit/batch-edit-form.js +9 -3
  2. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  3. package/dist/components/batch-edit/batch-edit-list.js +2 -1
  4. package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
  5. package/dist/components/batch-edit/batch-edit.js +57 -30
  6. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  7. package/dist/components/batch-edit/helper.d.ts +1 -2
  8. package/dist/components/batch-edit/style.d.ts +1 -0
  9. package/dist/components/batch-edit/style.js +1 -0
  10. package/dist/components/batch-edit/style2.css +14 -0
  11. package/dist/components/batch-edit/use-dialog-effect.js +20 -0
  12. package/dist/components/batch-edit/use-dialog-effect.js.map +1 -0
  13. package/dist/components/batch-edit/use-edit-state.js +22 -3
  14. package/dist/components/batch-edit/use-edit-state.js.map +1 -1
  15. package/dist/components/batch-edit/use-handlers.js +5 -0
  16. package/dist/components/batch-edit/use-handlers.js.map +1 -1
  17. package/dist/components/batch-edit/use-shortcut-key.js +5 -2
  18. package/dist/components/batch-edit/use-shortcut-key.js.map +1 -1
  19. package/dist/components/condition-editor/core/evaluator.d.ts +4 -5
  20. package/dist/components/contextmenu/api.d.ts +1 -2
  21. package/dist/components/contextmenu/di.d.ts +2 -3
  22. package/dist/components/file-viewer/file-viewer.js +21 -14
  23. package/dist/components/file-viewer/file-viewer.js.map +1 -1
  24. package/dist/components/file-viewer/helper.js +2 -0
  25. package/dist/components/file-viewer/helper.js.map +1 -1
  26. package/dist/components/file-viewer/previewers/ofd-previewer.js +196 -0
  27. package/dist/components/file-viewer/previewers/ofd-previewer.js.map +1 -0
  28. package/dist/components/file-viewer/style2.css +27 -0
  29. package/dist/components/loading/directive.d.ts +1 -2
  30. package/dist/components/message/message.d.ts +1 -2
  31. package/dist/components/message-confirm/message-confirm.d.ts +1 -2
  32. package/dist/components/notification/notification.d.ts +1 -2
  33. package/dist/components/table/node/col.js +19 -0
  34. package/dist/components/table/node/col.js.map +1 -1
  35. package/dist/components/table/table-cell.js +2 -0
  36. package/dist/components/table/table-cell.js.map +1 -1
  37. package/dist/components/table/table-foot.js +2 -0
  38. package/dist/components/table/table-foot.js.map +1 -1
  39. package/dist/components/table/table-head.js +1 -0
  40. package/dist/components/table/table-head.js.map +1 -1
  41. package/dist/components/table/table-row.js +2 -0
  42. package/dist/components/table/table-row.js.map +1 -1
  43. package/dist/components/table/use-columns.d.ts +1 -2
  44. package/dist/components/table-editor/style2.css +23 -3
  45. package/dist/components/table-editor/table-editor.js +213 -63
  46. package/dist/components/table-editor/table-editor.js.map +1 -1
  47. package/dist/components/tip/style2.css +63 -0
  48. package/dist/components/tip/tip.js +6 -1
  49. package/dist/components/tip/tip.js.map +1 -1
  50. package/dist/index.d.ts +4 -4
  51. package/dist/install.d.ts +3 -3
  52. package/dist/packages/ofd-core/dist/color.js +69 -0
  53. package/dist/packages/ofd-core/dist/color.js.map +1 -0
  54. package/dist/packages/ofd-core/dist/ctm.js +55 -0
  55. package/dist/packages/ofd-core/dist/ctm.js.map +1 -0
  56. package/dist/packages/ofd-core/dist/error.js +14 -0
  57. package/dist/packages/ofd-core/dist/error.js.map +1 -0
  58. package/dist/packages/ofd-core/dist/font.js +384 -0
  59. package/dist/packages/ofd-core/dist/font.js.map +1 -0
  60. package/dist/packages/ofd-core/dist/index.js +6 -0
  61. package/dist/packages/ofd-core/dist/number.js +13 -0
  62. package/dist/packages/ofd-core/dist/number.js.map +1 -0
  63. package/dist/packages/ofd-core/dist/page-objects.js +181 -0
  64. package/dist/packages/ofd-core/dist/page-objects.js.map +1 -0
  65. package/dist/packages/ofd-core/dist/parse.js +65 -0
  66. package/dist/packages/ofd-core/dist/parse.js.map +1 -0
  67. package/dist/packages/ofd-core/dist/render.js +361 -0
  68. package/dist/packages/ofd-core/dist/render.js.map +1 -0
  69. package/dist/packages/ofd-core/dist/xml.js +199 -0
  70. package/dist/packages/ofd-core/dist/xml.js.map +1 -0
  71. package/dist/packages/ofd-core/dist/zip.js +93 -0
  72. package/dist/packages/ofd-core/dist/zip.js.map +1 -0
  73. package/dist/style.d.ts +1 -1
  74. package/dist/style.js +1 -1
  75. package/dist/types/action.d.ts +7 -8
  76. package/dist/types/animation.d.ts +4 -5
  77. package/dist/types/auto-complete.d.ts +4 -5
  78. package/dist/types/badge.d.ts +4 -5
  79. package/dist/types/batch-edit.d.ts +15 -10
  80. package/dist/types/breadcrumb.d.ts +6 -7
  81. package/dist/types/button.d.ts +5 -6
  82. package/dist/types/calendar.d.ts +7 -8
  83. package/dist/types/card.d.ts +7 -8
  84. package/dist/types/cascade.d.ts +6 -7
  85. package/dist/types/check-tag.d.ts +4 -5
  86. package/dist/types/checkbox-group.d.ts +3 -4
  87. package/dist/types/checkbox.d.ts +5 -6
  88. package/dist/types/code-editor.d.ts +5 -6
  89. package/dist/types/collapse.d.ts +6 -7
  90. package/dist/types/condition-editor.d.ts +11 -12
  91. package/dist/types/contextmenu.d.ts +5 -6
  92. package/dist/types/css-transition.d.ts +4 -5
  93. package/dist/types/date-panel.d.ts +3 -4
  94. package/dist/types/date-picker.d.ts +5 -6
  95. package/dist/types/date-range-picker.d.ts +6 -7
  96. package/dist/types/dialog.d.ts +5 -6
  97. package/dist/types/drawer.d.ts +6 -7
  98. package/dist/types/dropdown.d.ts +4 -5
  99. package/dist/types/dual-nav.d.ts +6 -7
  100. package/dist/types/empty.d.ts +4 -5
  101. package/dist/types/expression-editor.d.ts +6 -7
  102. package/dist/types/file-picker.d.ts +4 -5
  103. package/dist/types/file-viewer.d.ts +6 -7
  104. package/dist/types/float-button.d.ts +5 -6
  105. package/dist/types/form-item.d.ts +3 -4
  106. package/dist/types/form.d.ts +4 -5
  107. package/dist/types/gantt-chart.d.ts +4 -5
  108. package/dist/types/grid-input.d.ts +4 -5
  109. package/dist/types/grid.d.ts +7 -8
  110. package/dist/types/group-input.d.ts +4 -5
  111. package/dist/types/group-nav.d.ts +3 -4
  112. package/dist/types/icon.d.ts +3 -4
  113. package/dist/types/image-cropper.d.ts +9 -10
  114. package/dist/types/index.d.ts +4 -4
  115. package/dist/types/input.d.ts +4 -5
  116. package/dist/types/layout.d.ts +4 -5
  117. package/dist/types/list.d.ts +4 -5
  118. package/dist/types/loading.d.ts +5 -6
  119. package/dist/types/message-confirm.d.ts +8 -9
  120. package/dist/types/message.d.ts +8 -9
  121. package/dist/types/multi-auto-complete.d.ts +4 -5
  122. package/dist/types/multi-select.d.ts +4 -5
  123. package/dist/types/multi-tree-select.d.ts +4 -5
  124. package/dist/types/nav.d.ts +5 -6
  125. package/dist/types/node-render.d.ts +2 -3
  126. package/dist/types/notification.d.ts +8 -9
  127. package/dist/types/number-input.d.ts +3 -4
  128. package/dist/types/number-range-input.d.ts +4 -5
  129. package/dist/types/number.d.ts +3 -4
  130. package/dist/types/paginator.d.ts +4 -5
  131. package/dist/types/palette.d.ts +7 -8
  132. package/dist/types/password-input.d.ts +4 -5
  133. package/dist/types/pop-confirm.d.ts +4 -5
  134. package/dist/types/pop.d.ts +4 -5
  135. package/dist/types/progress-nodes.d.ts +4 -5
  136. package/dist/types/progress.d.ts +4 -5
  137. package/dist/types/quick-batch-edit.d.ts +4 -5
  138. package/dist/types/radio-group.d.ts +4 -5
  139. package/dist/types/radio.d.ts +4 -5
  140. package/dist/types/rich-text-editor.d.ts +6 -7
  141. package/dist/types/scroll.d.ts +5 -6
  142. package/dist/types/segment.d.ts +5 -6
  143. package/dist/types/select.d.ts +4 -5
  144. package/dist/types/slider.d.ts +4 -5
  145. package/dist/types/steps.d.ts +5 -6
  146. package/dist/types/switch.d.ts +4 -5
  147. package/dist/types/table-editor.d.ts +30 -10
  148. package/dist/types/table.d.ts +23 -13
  149. package/dist/types/tabs.d.ts +13 -14
  150. package/dist/types/tag.d.ts +3 -4
  151. package/dist/types/text-editor.d.ts +5 -6
  152. package/dist/types/text.d.ts +4 -5
  153. package/dist/types/textarea.d.ts +4 -5
  154. package/dist/types/theme.d.ts +3 -4
  155. package/dist/types/tip.d.ts +11 -8
  156. package/dist/types/tree-select.d.ts +4 -5
  157. package/dist/types/tree.d.ts +6 -6
  158. package/dist/types/watermark.d.ts +4 -5
  159. package/package.json +8 -7
  160. package/src/components/batch-edit/__test__/batch-edit.test.ts +191 -4
  161. package/src/components/batch-edit/batch-edit-form.vue +17 -3
  162. package/src/components/batch-edit/batch-edit-list.vue +2 -1
  163. package/src/components/batch-edit/batch-edit.vue +22 -4
  164. package/src/components/batch-edit/style.scss +20 -0
  165. package/src/components/batch-edit/style.ts +1 -0
  166. package/src/components/batch-edit/use-dialog-effect.ts +9 -3
  167. package/src/components/batch-edit/use-edit-state.ts +32 -4
  168. package/src/components/batch-edit/use-handlers.ts +10 -0
  169. package/src/components/batch-edit/use-shortcut-key.ts +6 -2
  170. package/src/components/file-viewer/__test__/helper.test.ts +13 -0
  171. package/src/components/file-viewer/file-viewer.vue +23 -16
  172. package/src/components/file-viewer/helper.ts +2 -0
  173. package/src/components/file-viewer/previewers/ofd-previewer.vue +216 -0
  174. package/src/components/file-viewer/style.scss +33 -0
  175. package/src/components/table/__test__/column-style.test.ts +67 -0
  176. package/src/components/table/node/col.ts +30 -1
  177. package/src/components/table/table-cell.vue +7 -2
  178. package/src/components/table/table-foot.vue +2 -0
  179. package/src/components/table/table-head.tsx +1 -0
  180. package/src/components/table/table-row.tsx +2 -0
  181. package/src/components/table-editor/__test__/table-editor.test.ts +471 -0
  182. package/src/components/table-editor/style.scss +42 -4
  183. package/src/components/table-editor/table-editor.vue +265 -38
  184. package/src/components/tip/style.scss +15 -0
  185. package/src/components/tip/tip.vue +1 -1
  186. package/src/types/batch-edit.ts +6 -0
  187. package/src/types/file-viewer.ts +1 -1
  188. package/src/types/table-editor.ts +29 -7
  189. package/src/types/table.ts +12 -0
  190. package/src/types/tip.ts +6 -1
@@ -1,6 +1,17 @@
1
1
  import { isReactive, reactive, shallowReactive } from "vue";
2
+ import { withUnit } from "@veltra/utils";
2
3
  import { TreeNode } from "@cat-kit/core";
3
4
  //#region src/components/table/node/col.ts
5
+ function normalizeColumnStyle(style) {
6
+ if (!style) return void 0;
7
+ const result = {};
8
+ if (style.color !== void 0) result.color = style.color;
9
+ if (style.fontSize !== void 0) {
10
+ const fontSize = withUnit(style.fontSize, "px");
11
+ if (fontSize !== void 0) result.fontSize = fontSize;
12
+ }
13
+ return Object.keys(result).length ? result : void 0;
14
+ }
4
15
  var ColumnNode = class extends TreeNode {
5
16
  /** 叶子节点数量 */
6
17
  leafs;
@@ -35,6 +46,14 @@ var ColumnNode = class extends TreeNode {
35
46
  set headerAlign(val) {
36
47
  this.data.headerAlign = val;
37
48
  }
49
+ /** 表体/表尾单元格样式 */
50
+ get cellStyle() {
51
+ return normalizeColumnStyle(this.data.style);
52
+ }
53
+ /** 表头单元格样式 */
54
+ get headerCellStyle() {
55
+ return normalizeColumnStyle(this.data.headerStyle ?? this.data.style);
56
+ }
38
57
  /** 宽度 */
39
58
  get width() {
40
59
  const width = this.data.width ?? this.derived.allocatedWidth;
@@ -1 +1 @@
1
- {"version":3,"file":"col.js","names":[],"sources":["../../../../src/components/table/node/col.ts"],"sourcesContent":["import { TreeNode } from '@cat-kit/core'\nimport { isReactive, reactive, shallowReactive } from 'vue'\n\nimport type { TableColumn, TableColumnAlign } from '../../../types'\n\nexport class ColumnNode extends TreeNode<TableColumn, ColumnNode> {\n declare children?: ColumnNode[] | undefined\n declare parent?: ColumnNode\n /** 叶子节点数量 */\n leafs?: number\n\n nextNode: ColumnNode | null = null\n\n /** 列key */\n get key(): string {\n return this.data.key\n }\n set key(val) {\n this.data.key = val\n }\n /** 列名 */\n get name(): string {\n return this.data.name\n }\n set name(val) {\n this.data.name = val\n }\n\n /**\n * 列对齐方式\n * @default 'left'\n */\n get align(): TableColumnAlign {\n return this.data.align ?? 'left'\n }\n set align(val) {\n this.data.align = val\n }\n\n get headerAlign(): TableColumnAlign {\n return this.data.headerAlign ?? this.align\n }\n set headerAlign(val) {\n this.data.headerAlign = val\n }\n\n /** 宽度 */\n get width(): number | undefined {\n const width = this.data.width ?? this.derived.allocatedWidth\n if (!width || (this.minWidth && width && width < this.minWidth)) {\n return this.minWidth\n }\n return width\n }\n set width(val) {\n if (this.minWidth && val && val < this.minWidth) {\n val = this.minWidth\n }\n this.data.width = val\n // 显式宽度(配置/拖拽)优先于分配宽度,旧的分配结果直接作废\n this.derived.allocatedWidth = undefined\n }\n\n /**\n * 列宽分配算法写入的宽度。\n * 与用户列配置 `data.width` 隔离:分配结果不回写列配置对象,\n * 避免列森林重建(重挂载 / v-if / columns 引用变化)时把上一次的\n * 分配残留误判为显式 width,导致列宽被永久锁定、容器变窄后出现滚动条。\n */\n get allocatedWidth(): number | undefined {\n return this.derived.allocatedWidth\n }\n set allocatedWidth(val: number | undefined) {\n this.derived.allocatedWidth = val\n }\n /** 最小宽度 */\n get minWidth(): number | undefined {\n const minWidth = this.data.minWidth\n if (!minWidth && this.isLeaf) {\n return 100\n }\n return minWidth\n }\n set minWidth(val) {\n this.data.minWidth = val\n }\n\n /** 列固定方向 */\n get fixed(): 'left' | 'right' | undefined {\n if (this.depth > 0) return\n return this.data.fixed\n }\n set fixed(val) {\n this.data.fixed = val\n }\n\n /** 是否是左侧的最后一个固定列 */\n get isLastFixed(): boolean {\n return this.data.isLastFixed ?? false\n }\n\n /** 是否是右侧的第一个固定列 */\n get isFirstFixed(): boolean {\n return this.data.isFirstFixed ?? false\n }\n\n /** 是否是可调整宽度的列 */\n get resizable(): boolean {\n return this.data.resizable ?? true\n }\n\n /**\n * 是否在列配置上显式指定了 width,或经表头拖拽锁定。\n * 此类列不参与剩余宽度的均分。\n */\n explicitWidth: boolean\n\n style: Record<string, number> = reactive({})\n\n /** 派生状态(响应式),与用户列配置 data 隔离 */\n private readonly derived = shallowReactive<{ allocatedWidth?: number }>({\n allocatedWidth: undefined\n })\n\n constructor(val: TableColumn, index: number, depth: number, parent?: ColumnNode) {\n super(isReactive(val) ? val : shallowReactive(val), index, depth, parent)\n this.explicitWidth = val.width !== undefined\n }\n}\n"],"mappings":";;;AAKA,IAAa,aAAb,cAAgC,SAAkC;;CAIhE;CAEA,WAA8B;;CAG9B,IAAI,MAAc;EAChB,OAAO,KAAK,KAAK;CACnB;CACA,IAAI,IAAI,KAAK;EACX,KAAK,KAAK,MAAM;CAClB;;CAEA,IAAI,OAAe;EACjB,OAAO,KAAK,KAAK;CACnB;CACA,IAAI,KAAK,KAAK;EACZ,KAAK,KAAK,OAAO;CACnB;;;;;CAMA,IAAI,QAA0B;EAC5B,OAAO,KAAK,KAAK,SAAS;CAC5B;CACA,IAAI,MAAM,KAAK;EACb,KAAK,KAAK,QAAQ;CACpB;CAEA,IAAI,cAAgC;EAClC,OAAO,KAAK,KAAK,eAAe,KAAK;CACvC;CACA,IAAI,YAAY,KAAK;EACnB,KAAK,KAAK,cAAc;CAC1B;;CAGA,IAAI,QAA4B;EAC9B,MAAM,QAAQ,KAAK,KAAK,SAAS,KAAK,QAAQ;EAC9C,IAAI,CAAC,SAAU,KAAK,YAAY,SAAS,QAAQ,KAAK,UACpD,OAAO,KAAK;EAEd,OAAO;CACT;CACA,IAAI,MAAM,KAAK;EACb,IAAI,KAAK,YAAY,OAAO,MAAM,KAAK,UACrC,MAAM,KAAK;EAEb,KAAK,KAAK,QAAQ;EAElB,KAAK,QAAQ,iBAAiB,KAAA;CAChC;;;;;;;CAQA,IAAI,iBAAqC;EACvC,OAAO,KAAK,QAAQ;CACtB;CACA,IAAI,eAAe,KAAyB;EAC1C,KAAK,QAAQ,iBAAiB;CAChC;;CAEA,IAAI,WAA+B;EACjC,MAAM,WAAW,KAAK,KAAK;EAC3B,IAAI,CAAC,YAAY,KAAK,QACpB,OAAO;EAET,OAAO;CACT;CACA,IAAI,SAAS,KAAK;EAChB,KAAK,KAAK,WAAW;CACvB;;CAGA,IAAI,QAAsC;EACxC,IAAI,KAAK,QAAQ,GAAG;EACpB,OAAO,KAAK,KAAK;CACnB;CACA,IAAI,MAAM,KAAK;EACb,KAAK,KAAK,QAAQ;CACpB;;CAGA,IAAI,cAAuB;EACzB,OAAO,KAAK,KAAK,eAAe;CAClC;;CAGA,IAAI,eAAwB;EAC1B,OAAO,KAAK,KAAK,gBAAgB;CACnC;;CAGA,IAAI,YAAqB;EACvB,OAAO,KAAK,KAAK,aAAa;CAChC;;;;;CAMA;CAEA,QAAgC,SAAS,CAAC,CAAC;;CAG3C,UAA2B,gBAA6C,EACtE,gBAAgB,KAAA,EAClB,CAAC;CAED,YAAY,KAAkB,OAAe,OAAe,QAAqB;EAC/E,MAAM,WAAW,GAAG,IAAI,MAAM,gBAAgB,GAAG,GAAG,OAAO,OAAO,MAAM;EACxE,KAAK,gBAAgB,IAAI,UAAU,KAAA;CACrC;AACF"}
1
+ {"version":3,"file":"col.js","names":[],"sources":["../../../../src/components/table/node/col.ts"],"sourcesContent":["import { TreeNode } from '@cat-kit/core'\nimport { withUnit } from '@veltra/utils'\nimport { isReactive, reactive, shallowReactive } from 'vue'\n\nimport type { TableColumn, TableColumnAlign, TableColumnStyle } from '../../../types'\n\nfunction normalizeColumnStyle(style?: TableColumnStyle): Record<string, string> | undefined {\n if (!style) return undefined\n\n const result: Record<string, string> = {}\n\n if (style.color !== undefined) {\n result.color = style.color\n }\n if (style.fontSize !== undefined) {\n const fontSize = withUnit(style.fontSize, 'px')\n if (fontSize !== undefined) {\n result.fontSize = fontSize\n }\n }\n\n return Object.keys(result).length ? result : undefined\n}\n\nexport class ColumnNode extends TreeNode<TableColumn, ColumnNode> {\n declare children?: ColumnNode[] | undefined\n declare parent?: ColumnNode\n /** 叶子节点数量 */\n leafs?: number\n\n nextNode: ColumnNode | null = null\n\n /** 列key */\n get key(): string {\n return this.data.key\n }\n set key(val) {\n this.data.key = val\n }\n /** 列名 */\n get name(): string {\n return this.data.name\n }\n set name(val) {\n this.data.name = val\n }\n\n /**\n * 列对齐方式\n * @default 'left'\n */\n get align(): TableColumnAlign {\n return this.data.align ?? 'left'\n }\n set align(val) {\n this.data.align = val\n }\n\n get headerAlign(): TableColumnAlign {\n return this.data.headerAlign ?? this.align\n }\n set headerAlign(val) {\n this.data.headerAlign = val\n }\n\n /** 表体/表尾单元格样式 */\n get cellStyle(): Record<string, string> | undefined {\n return normalizeColumnStyle(this.data.style)\n }\n\n /** 表头单元格样式 */\n get headerCellStyle(): Record<string, string> | undefined {\n return normalizeColumnStyle(this.data.headerStyle ?? this.data.style)\n }\n\n /** 宽度 */\n get width(): number | undefined {\n const width = this.data.width ?? this.derived.allocatedWidth\n if (!width || (this.minWidth && width && width < this.minWidth)) {\n return this.minWidth\n }\n return width\n }\n set width(val) {\n if (this.minWidth && val && val < this.minWidth) {\n val = this.minWidth\n }\n this.data.width = val\n // 显式宽度(配置/拖拽)优先于分配宽度,旧的分配结果直接作废\n this.derived.allocatedWidth = undefined\n }\n\n /**\n * 列宽分配算法写入的宽度。\n * 与用户列配置 `data.width` 隔离:分配结果不回写列配置对象,\n * 避免列森林重建(重挂载 / v-if / columns 引用变化)时把上一次的\n * 分配残留误判为显式 width,导致列宽被永久锁定、容器变窄后出现滚动条。\n */\n get allocatedWidth(): number | undefined {\n return this.derived.allocatedWidth\n }\n set allocatedWidth(val: number | undefined) {\n this.derived.allocatedWidth = val\n }\n /** 最小宽度 */\n get minWidth(): number | undefined {\n const minWidth = this.data.minWidth\n if (!minWidth && this.isLeaf) {\n return 100\n }\n return minWidth\n }\n set minWidth(val) {\n this.data.minWidth = val\n }\n\n /** 列固定方向 */\n get fixed(): 'left' | 'right' | undefined {\n if (this.depth > 0) return\n return this.data.fixed\n }\n set fixed(val) {\n this.data.fixed = val\n }\n\n /** 是否是左侧的最后一个固定列 */\n get isLastFixed(): boolean {\n return this.data.isLastFixed ?? false\n }\n\n /** 是否是右侧的第一个固定列 */\n get isFirstFixed(): boolean {\n return this.data.isFirstFixed ?? false\n }\n\n /** 是否是可调整宽度的列 */\n get resizable(): boolean {\n return this.data.resizable ?? true\n }\n\n /**\n * 是否在列配置上显式指定了 width,或经表头拖拽锁定。\n * 此类列不参与剩余宽度的均分。\n */\n explicitWidth: boolean\n\n style: Record<string, number> = reactive({})\n\n /** 派生状态(响应式),与用户列配置 data 隔离 */\n private readonly derived = shallowReactive<{ allocatedWidth?: number }>({\n allocatedWidth: undefined\n })\n\n constructor(val: TableColumn, index: number, depth: number, parent?: ColumnNode) {\n super(isReactive(val) ? val : shallowReactive(val), index, depth, parent)\n this.explicitWidth = val.width !== undefined\n }\n}\n"],"mappings":";;;;AAMA,SAAS,qBAAqB,OAA8D;CAC1F,IAAI,CAAC,OAAO,OAAO,KAAA;CAEnB,MAAM,SAAiC,CAAC;CAExC,IAAI,MAAM,UAAU,KAAA,GAClB,OAAO,QAAQ,MAAM;CAEvB,IAAI,MAAM,aAAa,KAAA,GAAW;EAChC,MAAM,WAAW,SAAS,MAAM,UAAU,IAAI;EAC9C,IAAI,aAAa,KAAA,GACf,OAAO,WAAW;CAEtB;CAEA,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,SAAS,KAAA;AAC/C;AAEA,IAAa,aAAb,cAAgC,SAAkC;;CAIhE;CAEA,WAA8B;;CAG9B,IAAI,MAAc;EAChB,OAAO,KAAK,KAAK;CACnB;CACA,IAAI,IAAI,KAAK;EACX,KAAK,KAAK,MAAM;CAClB;;CAEA,IAAI,OAAe;EACjB,OAAO,KAAK,KAAK;CACnB;CACA,IAAI,KAAK,KAAK;EACZ,KAAK,KAAK,OAAO;CACnB;;;;;CAMA,IAAI,QAA0B;EAC5B,OAAO,KAAK,KAAK,SAAS;CAC5B;CACA,IAAI,MAAM,KAAK;EACb,KAAK,KAAK,QAAQ;CACpB;CAEA,IAAI,cAAgC;EAClC,OAAO,KAAK,KAAK,eAAe,KAAK;CACvC;CACA,IAAI,YAAY,KAAK;EACnB,KAAK,KAAK,cAAc;CAC1B;;CAGA,IAAI,YAAgD;EAClD,OAAO,qBAAqB,KAAK,KAAK,KAAK;CAC7C;;CAGA,IAAI,kBAAsD;EACxD,OAAO,qBAAqB,KAAK,KAAK,eAAe,KAAK,KAAK,KAAK;CACtE;;CAGA,IAAI,QAA4B;EAC9B,MAAM,QAAQ,KAAK,KAAK,SAAS,KAAK,QAAQ;EAC9C,IAAI,CAAC,SAAU,KAAK,YAAY,SAAS,QAAQ,KAAK,UACpD,OAAO,KAAK;EAEd,OAAO;CACT;CACA,IAAI,MAAM,KAAK;EACb,IAAI,KAAK,YAAY,OAAO,MAAM,KAAK,UACrC,MAAM,KAAK;EAEb,KAAK,KAAK,QAAQ;EAElB,KAAK,QAAQ,iBAAiB,KAAA;CAChC;;;;;;;CAQA,IAAI,iBAAqC;EACvC,OAAO,KAAK,QAAQ;CACtB;CACA,IAAI,eAAe,KAAyB;EAC1C,KAAK,QAAQ,iBAAiB;CAChC;;CAEA,IAAI,WAA+B;EACjC,MAAM,WAAW,KAAK,KAAK;EAC3B,IAAI,CAAC,YAAY,KAAK,QACpB,OAAO;EAET,OAAO;CACT;CACA,IAAI,SAAS,KAAK;EAChB,KAAK,KAAK,WAAW;CACvB;;CAGA,IAAI,QAAsC;EACxC,IAAI,KAAK,QAAQ,GAAG;EACpB,OAAO,KAAK,KAAK;CACnB;CACA,IAAI,MAAM,KAAK;EACb,KAAK,KAAK,QAAQ;CACpB;;CAGA,IAAI,cAAuB;EACzB,OAAO,KAAK,KAAK,eAAe;CAClC;;CAGA,IAAI,eAAwB;EAC1B,OAAO,KAAK,KAAK,gBAAgB;CACnC;;CAGA,IAAI,YAAqB;EACvB,OAAO,KAAK,KAAK,aAAa;CAChC;;;;;CAMA;CAEA,QAAgC,SAAS,CAAC,CAAC;;CAG3C,UAA2B,gBAA6C,EACtE,gBAAgB,KAAA,EAClB,CAAC;CAED,YAAY,KAAkB,OAAe,OAAe,QAAqB;EAC/E,MAAM,WAAW,GAAG,IAAI,MAAM,gBAAgB,GAAG,GAAG,OAAO,OAAO,MAAM;EACxE,KAAK,gBAAgB,IAAI,UAAU,KAAA;CACrC;AACF"}
@@ -9,6 +9,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
9
9
  cellClass: {},
10
10
  left: {},
11
11
  right: {},
12
+ cellStyle: {},
12
13
  rowspan: {},
13
14
  colspan: {}
14
15
  },
@@ -22,6 +23,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
22
23
  * 这里变成「完全受控」的纯渲染单元。
23
24
  */
24
25
  const style = computed(() => ({
26
+ ...__props.cellStyle,
25
27
  left: withUnit(__props.left, "px"),
26
28
  right: withUnit(__props.right, "px")
27
29
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"table-cell.js","names":[],"sources":["../../../src/components/table/table-cell.vue"],"sourcesContent":["<template>\n <td\n :class=\"cellClass\"\n :style=\"style\"\n :rowspan=\"rowspan\"\n :colspan=\"colspan\"\n v-if=\"rowspan !== 0 && colspan !== 0\"\n >\n <slot />\n </td>\n</template>\n\n<script lang=\"ts\" setup>\nimport { withUnit } from '@veltra/utils'\nimport { computed } from 'vue'\n\ndefineOptions({ name: 'UTableCell' })\n\n/**\n * B2: TableCell 去 inject 化。\n *\n * 原先每个可见单元格都会执行 `inject(TableDIKey)` 并在模板中调用 `getCellClass(column)`,\n * 在 30 列场景下每次滚动每行产生 30 次 inject / 30 次类名拼接。\n * 父组件 `TableRow` 已经持有注入上下文,直接把 `cellClass` 传下来即可;\n * 这里变成「完全受控」的纯渲染单元。\n */\nconst { left, right } = defineProps<{\n cellClass: string\n left?: number\n right?: number\n rowspan?: number\n colspan?: number\n}>()\n\nconst style = computed(() => ({ left: withUnit(left, 'px'), right: withUnit(right, 'px') }))\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;EAkCA,MAAM,QAAQ,gBAAgB;GAAE,MAAM,SAAS,QAAA,MAAM,IAAI;GAAG,OAAO,SAAS,QAAA,OAAO,IAAI;EAAE,EAAE;;GA5BjF,OAAA,QAAA,YAAO,KAAU,QAAA,YAAO,KALhC,UAAA,GAAA,mBAQK,MAAA;;IAPF,OAAK,eAAE,QAAA,SAAS;IAChB,OAAK,eAAE,MAAA,KAAK;IACZ,SAAS,QAAA;IACT,SAAS,QAAA;GAGV,GAAA,CAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,IAAA,UAAA,KAAA,mBAAA,QAAA,IAAA"}
1
+ {"version":3,"file":"table-cell.js","names":[],"sources":["../../../src/components/table/table-cell.vue"],"sourcesContent":["<template>\n <td\n :class=\"cellClass\"\n :style=\"style\"\n :rowspan=\"rowspan\"\n :colspan=\"colspan\"\n v-if=\"rowspan !== 0 && colspan !== 0\"\n >\n <slot />\n </td>\n</template>\n\n<script lang=\"ts\" setup>\nimport { withUnit } from '@veltra/utils'\nimport { computed } from 'vue'\n\ndefineOptions({ name: 'UTableCell' })\n\n/**\n * B2: TableCell 去 inject 化。\n *\n * 原先每个可见单元格都会执行 `inject(TableDIKey)` 并在模板中调用 `getCellClass(column)`,\n * 在 30 列场景下每次滚动每行产生 30 次 inject / 30 次类名拼接。\n * 父组件 `TableRow` 已经持有注入上下文,直接把 `cellClass` 传下来即可;\n * 这里变成「完全受控」的纯渲染单元。\n */\nconst { left, right, cellStyle } = defineProps<{\n cellClass: string\n left?: number\n right?: number\n cellStyle?: Record<string, string>\n rowspan?: number\n colspan?: number\n}>()\n\nconst style = computed(() => ({\n ...cellStyle,\n left: withUnit(left, 'px'),\n right: withUnit(right, 'px')\n}))\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;EAmCA,MAAM,QAAQ,gBAAgB;GAC5B,GAAG,QAAA;GACH,MAAM,SAAS,QAAA,MAAM,IAAI;GACzB,OAAO,SAAS,QAAA,OAAO,IAAI;EAC7B,EAAE;;GAjCQ,OAAA,QAAA,YAAO,KAAU,QAAA,YAAO,KALhC,UAAA,GAAA,mBAQK,MAAA;;IAPF,OAAK,eAAE,QAAA,SAAS;IAChB,OAAK,eAAE,MAAA,KAAK;IACZ,SAAS,QAAA;IACT,SAAS,QAAA;GAGV,GAAA,CAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,IAAA,UAAA,KAAA,mBAAA,QAAA,IAAA"}
@@ -53,6 +53,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
53
53
  key: 0,
54
54
  class: normalizeClass(unref(getCellClass)(unref(leafColumns)[0])),
55
55
  style: normalizeStyle({
56
+ ...unref(leafColumns)[0].cellStyle,
56
57
  right: unref(withUnit)(unref(leafColumns)[0].style.right, "px"),
57
58
  left: unref(withUnit)(unref(leafColumns)[0].style.left, "px")
58
59
  })
@@ -61,6 +62,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
61
62
  class: normalizeClass(unref(getCellClass)(column)),
62
63
  key: column.key,
63
64
  style: normalizeStyle({
65
+ ...column.cellStyle,
64
66
  right: unref(withUnit)(column.style.right, "px"),
65
67
  left: unref(withUnit)(column.style.left, "px")
66
68
  })
@@ -1 +1 @@
1
- {"version":3,"file":"table-foot.js","names":[],"sources":["../../../src/components/table/table-foot.vue"],"sourcesContent":["<template>\n <tfoot v-if=\"tableSlots.foot || showSummary\" :class=\"cls.e('foot')\">\n <tr v-if=\"showSummary\">\n <td\n v-if=\"leafColumns[0]\"\n :class=\"getCellClass(leafColumns[0])\"\n :style=\"{\n right: withUnit(leafColumns[0].style.right, 'px'),\n left: withUnit(leafColumns[0].style.left, 'px')\n }\"\n >\n 合计:\n </td>\n <td\n v-for=\"column of leafColumns.slice(1)\"\n :class=\"getCellClass(column)\"\n :key=\"column.key\"\n :style=\"{\n right: withUnit(column.style.right, 'px'),\n left: withUnit(column.style.left, 'px')\n }\"\n >\n <u-node-render :content=\"getColumnSummaryNode(column)\" />\n </td>\n </tr>\n <slot />\n </tfoot>\n</template>\n\n<script lang=\"ts\" setup>\nimport { $n } from '@cat-kit/core'\nimport { withUnit, type RenderReturn } from '@veltra/utils'\nimport { computed, inject } from 'vue'\n\nimport { UNodeRender } from '../node-render'\nimport { TableDIKey } from './di'\nimport type { ColumnNode } from './node/col'\n\ndefineOptions({ name: 'UTableFoot' })\n\nconst { cls, columnConfig, rows, checkedRows, tableSlots, getCellClass } = inject(TableDIKey)!\n\nconst { leafColumns } = columnConfig\n\nconst showSummary = computed(() => {\n return leafColumns.value.some((col) => !!col.data.summary)\n})\n\nfunction computeSummary(key: string) {\n let sum = 0\n let i = 0\n\n while (i < rows.value.length) {\n sum = $n.plus(sum, rows.value[i]!.data[key] ?? 0)\n if (isNaN(sum)) return sum\n i++\n }\n\n return sum\n}\n\nconst summaryRow = computed<Record<string, any>>(() => {\n return leafColumns.value.reduce((acc, column) => {\n if (column.data.summary) {\n acc[column.key] = computeSummary(column.key)\n }\n return acc\n }, {})\n})\n\nfunction getColumnSummaryNode(column: ColumnNode): RenderReturn {\n const { summary } = column.data\n\n if (!summary) return null\n\n let total = summaryRow.value[column.key]\n\n if (typeof summary === 'function') {\n return summary({ total, rows: rows.value, checkedRows: checkedRows.value, column })\n }\n return total\n}\n\ndefineExpose({\n getSummaryRow(): Record<string, any> {\n return summaryRow.value\n }\n})\n</script>\n"],"mappings":";;;;;;;;;;;EAwCA,MAAM,EAAE,KAAK,cAAc,MAAM,aAAa,YAAY,iBAAiB,OAAO,UAAU;EAE5F,MAAM,EAAE,gBAAgB;EAExB,MAAM,cAAc,eAAe;GACjC,OAAO,YAAY,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,KAAK,OAAO;EAC3D,CAAC;EAED,SAAS,eAAe,KAAa;GACnC,IAAI,MAAM;GACV,IAAI,IAAI;GAER,OAAO,IAAI,KAAK,MAAM,QAAQ;IAC5B,MAAM,GAAG,KAAK,KAAK,KAAK,MAAM,EAAE,CAAE,KAAK,QAAQ,CAAC;IAChD,IAAI,MAAM,GAAG,GAAG,OAAO;IACvB;GACF;GAEA,OAAO;EACT;EAEA,MAAM,aAAa,eAAoC;GACrD,OAAO,YAAY,MAAM,QAAQ,KAAK,WAAW;IAC/C,IAAI,OAAO,KAAK,SACd,IAAI,OAAO,OAAO,eAAe,OAAO,GAAG;IAE7C,OAAO;GACT,GAAG,CAAC,CAAC;EACP,CAAC;EAED,SAAS,qBAAqB,QAAkC;GAC9D,MAAM,EAAE,YAAY,OAAO;GAE3B,IAAI,CAAC,SAAS,OAAO;GAErB,IAAI,QAAQ,WAAW,MAAM,OAAO;GAEpC,IAAI,OAAO,YAAY,YACrB,OAAO,QAAQ;IAAE;IAAO,MAAM,KAAK;IAAO,aAAa,YAAY;IAAO;GAAO,CAAC;GAEpF,OAAO;EACT;EAEA,SAAa,EACX,gBAAqC;GACnC,OAAO,WAAW;EACpB,EACF,CAAC;;GAtFc,OAAA,MAAA,UAAA,CAAU,CAAC,QAAQ,YAAA,SAAhC,UAAA,GAAA,mBAyBQ,SAAA;;IAzBsC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;GAC9C,GAAA,CAAA,YAAA,SAAV,UAAA,GAAA,mBAsBK,MAAA,YAAA,CApBK,MAAA,WAAA,CAAW,CAAA,MADnB,UAAA,GAAA,mBASK,MAAA;;IAPF,OAAK,eAAE,MAAA,YAAA,CAAY,CAAC,MAAA,WAAA,CAAW,CAAA,EAAA,CAAA;IAC/B,OAAK,eAAA;KAAqB,OAAA,MAAA,QAAA,CAAQ,CAAC,MAAA,WAAA,CAAW,CAAA,EAAA,CAAI,MAAM,OAAK,IAAA;KAAyB,MAAA,MAAA,QAAA,CAAQ,CAAC,MAAA,WAAA,CAAW,CAAA,EAAA,CAAI,MAAM,MAAI,IAAA;;GAI1H,GAAA,SAED,CAAA,KAAA,mBAAA,QAAA,IAAA,IACA,UAAA,IAAA,GAAA,mBAUK,UAAA,MAAA,WATc,MAAA,WAAA,CAAW,CAAC,MAAK,CAAA,IAA3B,WAAM;IADf,OAAA,UAAA,GAAA,mBAUK,MAAA;KARF,OAAK,eAAE,MAAA,YAAA,CAAY,CAAC,MAAM,CAAA;KAC1B,KAAK,OAAO;KACZ,OAAK,eAAA;MAAqB,OAAA,MAAA,QAAA,CAAQ,CAAC,OAAO,MAAM,OAAK,IAAA;MAAyB,MAAA,MAAA,QAAA,CAAQ,CAAC,OAAO,MAAM,MAAI,IAAA;;IAKzG,GAAA,CAAA,YAAyD,MAAA,UAAA,GAAA,EAAzC,SAAS,qBAAqB,MAAM,EAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,CAAA,GAAA,CAAA;GAGxD,CAAA,GAAA,GAAA,EAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA"}
1
+ {"version":3,"file":"table-foot.js","names":[],"sources":["../../../src/components/table/table-foot.vue"],"sourcesContent":["<template>\n <tfoot v-if=\"tableSlots.foot || showSummary\" :class=\"cls.e('foot')\">\n <tr v-if=\"showSummary\">\n <td\n v-if=\"leafColumns[0]\"\n :class=\"getCellClass(leafColumns[0])\"\n :style=\"{\n ...leafColumns[0].cellStyle,\n right: withUnit(leafColumns[0].style.right, 'px'),\n left: withUnit(leafColumns[0].style.left, 'px')\n }\"\n >\n 合计:\n </td>\n <td\n v-for=\"column of leafColumns.slice(1)\"\n :class=\"getCellClass(column)\"\n :key=\"column.key\"\n :style=\"{\n ...column.cellStyle,\n right: withUnit(column.style.right, 'px'),\n left: withUnit(column.style.left, 'px')\n }\"\n >\n <u-node-render :content=\"getColumnSummaryNode(column)\" />\n </td>\n </tr>\n <slot />\n </tfoot>\n</template>\n\n<script lang=\"ts\" setup>\nimport { $n } from '@cat-kit/core'\nimport { withUnit, type RenderReturn } from '@veltra/utils'\nimport { computed, inject } from 'vue'\n\nimport { UNodeRender } from '../node-render'\nimport { TableDIKey } from './di'\nimport type { ColumnNode } from './node/col'\n\ndefineOptions({ name: 'UTableFoot' })\n\nconst { cls, columnConfig, rows, checkedRows, tableSlots, getCellClass } = inject(TableDIKey)!\n\nconst { leafColumns } = columnConfig\n\nconst showSummary = computed(() => {\n return leafColumns.value.some((col) => !!col.data.summary)\n})\n\nfunction computeSummary(key: string) {\n let sum = 0\n let i = 0\n\n while (i < rows.value.length) {\n sum = $n.plus(sum, rows.value[i]!.data[key] ?? 0)\n if (isNaN(sum)) return sum\n i++\n }\n\n return sum\n}\n\nconst summaryRow = computed<Record<string, any>>(() => {\n return leafColumns.value.reduce((acc, column) => {\n if (column.data.summary) {\n acc[column.key] = computeSummary(column.key)\n }\n return acc\n }, {})\n})\n\nfunction getColumnSummaryNode(column: ColumnNode): RenderReturn {\n const { summary } = column.data\n\n if (!summary) return null\n\n let total = summaryRow.value[column.key]\n\n if (typeof summary === 'function') {\n return summary({ total, rows: rows.value, checkedRows: checkedRows.value, column })\n }\n return total\n}\n\ndefineExpose({\n getSummaryRow(): Record<string, any> {\n return summaryRow.value\n }\n})\n</script>\n"],"mappings":";;;;;;;;;;;EA0CA,MAAM,EAAE,KAAK,cAAc,MAAM,aAAa,YAAY,iBAAiB,OAAO,UAAU;EAE5F,MAAM,EAAE,gBAAgB;EAExB,MAAM,cAAc,eAAe;GACjC,OAAO,YAAY,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,KAAK,OAAO;EAC3D,CAAC;EAED,SAAS,eAAe,KAAa;GACnC,IAAI,MAAM;GACV,IAAI,IAAI;GAER,OAAO,IAAI,KAAK,MAAM,QAAQ;IAC5B,MAAM,GAAG,KAAK,KAAK,KAAK,MAAM,EAAE,CAAE,KAAK,QAAQ,CAAC;IAChD,IAAI,MAAM,GAAG,GAAG,OAAO;IACvB;GACF;GAEA,OAAO;EACT;EAEA,MAAM,aAAa,eAAoC;GACrD,OAAO,YAAY,MAAM,QAAQ,KAAK,WAAW;IAC/C,IAAI,OAAO,KAAK,SACd,IAAI,OAAO,OAAO,eAAe,OAAO,GAAG;IAE7C,OAAO;GACT,GAAG,CAAC,CAAC;EACP,CAAC;EAED,SAAS,qBAAqB,QAAkC;GAC9D,MAAM,EAAE,YAAY,OAAO;GAE3B,IAAI,CAAC,SAAS,OAAO;GAErB,IAAI,QAAQ,WAAW,MAAM,OAAO;GAEpC,IAAI,OAAO,YAAY,YACrB,OAAO,QAAQ;IAAE;IAAO,MAAM,KAAK;IAAO,aAAa,YAAY;IAAO;GAAO,CAAC;GAEpF,OAAO;EACT;EAEA,SAAa,EACX,gBAAqC;GACnC,OAAO,WAAW;EACpB,EACF,CAAC;;GAxFc,OAAA,MAAA,UAAA,CAAU,CAAC,QAAQ,YAAA,SAAhC,UAAA,GAAA,mBA2BQ,SAAA;;IA3BsC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;GAC9C,GAAA,CAAA,YAAA,SAAV,UAAA,GAAA,mBAwBK,MAAA,YAAA,CAtBK,MAAA,WAAA,CAAW,CAAA,MADnB,UAAA,GAAA,mBAUK,MAAA;;IARF,OAAK,eAAE,MAAA,YAAA,CAAY,CAAC,MAAA,WAAA,CAAW,CAAA,EAAA,CAAA;IAC/B,OAAK,eAAA;KAAiB,GAAA,MAAA,WAAA,CAAW,CAAA,EAAA,CAAI;KAA4B,OAAA,MAAA,QAAA,CAAQ,CAAC,MAAA,WAAA,CAAW,CAAA,EAAA,CAAI,MAAM,OAAK,IAAA;KAAyB,MAAA,MAAA,QAAA,CAAQ,CAAC,MAAA,WAAA,CAAW,CAAA,EAAA,CAAI,MAAM,MAAI,IAAA;;GAKjK,GAAA,SAED,CAAA,KAAA,mBAAA,QAAA,IAAA,IACA,UAAA,IAAA,GAAA,mBAWK,UAAA,MAAA,WAVc,MAAA,WAAA,CAAW,CAAC,MAAK,CAAA,IAA3B,WAAM;IADf,OAAA,UAAA,GAAA,mBAWK,MAAA;KATF,OAAK,eAAE,MAAA,YAAA,CAAY,CAAC,MAAM,CAAA;KAC1B,KAAK,OAAO;KACZ,OAAK,eAAA;MAAiB,GAAA,OAAO;MAA4B,OAAA,MAAA,QAAA,CAAQ,CAAC,OAAO,MAAM,OAAK,IAAA;MAAyB,MAAA,MAAA,QAAA,CAAQ,CAAC,OAAO,MAAM,MAAI,IAAA;;IAMxI,GAAA,CAAA,YAAyD,MAAA,UAAA,GAAA,EAAzC,SAAS,qBAAqB,MAAM,EAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,CAAA,GAAA,CAAA;GAGxD,CAAA,GAAA,GAAA,EAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA"}
@@ -18,6 +18,7 @@ const TableHead = defineComponent({
18
18
  "colspan": column.leafs,
19
19
  "rowspan": column.children?.length ? void 0 : headers.value.length - headerIndex,
20
20
  "style": {
21
+ ...column.headerCellStyle,
21
22
  left: withUnit(column.style.left, "px"),
22
23
  right: withUnit(column.style.right, "px")
23
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"table-head.js","names":[],"sources":["../../../src/components/table/table-head.tsx"],"sourcesContent":["import { bem, withUnit } from '@veltra/utils'\nimport { defineComponent, inject, type DefineComponent } from 'vue'\n\nimport { TableDIKey, TableResizeKey } from './di'\n\nconst TableHead: DefineComponent = defineComponent({\n name: 'TableHead',\n setup() {\n const { cls, columnConfig, getHeaderSlotsNode, getHeaderCellClass } = inject(TableDIKey)!\n const { headers } = columnConfig\n const handleCls = cls.e('resize-handle')\n\n const { handleResizeMousedown, headerRef } = inject(TableResizeKey)!\n\n return () => (\n <thead\n class={[cls.e('head'), bem.is('multistage', headers.value.length > 1)]}\n ref={headerRef}\n >\n {headers.value.map((header, headerIndex) => (\n <tr>\n {header.map((column) => (\n <th\n class={getHeaderCellClass(column)}\n key={column.key}\n colspan={column.leafs}\n rowspan={column.children?.length ? undefined : headers.value.length - headerIndex}\n style={{\n left: withUnit(column.style.left, 'px'),\n right: withUnit(column.style.right, 'px')\n }}\n >\n {getHeaderSlotsNode({ column })}\n\n {column.isLeaf && column.resizable ? (\n <span\n class={handleCls}\n onMousedown={(e) => handleResizeMousedown(e, column)}\n ></span>\n ) : null}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n )\n }\n})\n\nexport default TableHead\n"],"mappings":";;;;AAKA,MAAM,YAA6B,gBAAgB;CACjD,MAAM;CACN,QAAQ;EACN,MAAM,EAAE,KAAK,cAAc,oBAAoB,uBAAuB,OAAO,UAAU;EACvF,MAAM,EAAE,YAAY;EACpB,MAAM,YAAY,IAAI,EAAE,eAAe;EAEvC,MAAM,EAAE,uBAAuB,cAAc,OAAO,cAAc;EAElE,aAAO,YAAA,SAAA;GAAA,SAEI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,QAAQ,MAAM,SAAS,CAAC,CAAC;GAAC,OACjE;EAAS,GAAA,CAEb,QAAQ,MAAM,KAAK,QAAQ,gBAAW,YAAA,MAAA,MAAA,CAElC,OAAO,KAAK,WAAM,YAAA,MAAA;GAAA,SAER,mBAAmB,MAAM;GAAC,OAC5B,OAAO;GAAG,WACN,OAAO;GAAK,WACZ,OAAO,UAAU,SAAS,KAAA,IAAY,QAAQ,MAAM,SAAS;GAAW,SAC1E;IACL,MAAM,SAAS,OAAO,MAAM,MAAM,IAAI;IACtC,OAAO,SAAS,OAAO,MAAM,OAAO,IAAI;GAC1C;EAAC,GAAA,CAEA,mBAAmB,EAAE,OAAO,CAAC,GAE7B,OAAO,UAAU,OAAO,YAAS,YAAA,QAAA;GAAA,SAEvB;GAAS,gBACF,MAAM,sBAAsB,GAAG,MAAM;EAAC,GAAA,IAAA,IAEpD,IAAI,CAAA,CAEX,CAAC,CAAA,CAEL,CAAC,CAAA;CAGR;AACF,CAAC"}
1
+ {"version":3,"file":"table-head.js","names":[],"sources":["../../../src/components/table/table-head.tsx"],"sourcesContent":["import { bem, withUnit } from '@veltra/utils'\nimport { defineComponent, inject, type DefineComponent } from 'vue'\n\nimport { TableDIKey, TableResizeKey } from './di'\n\nconst TableHead: DefineComponent = defineComponent({\n name: 'TableHead',\n setup() {\n const { cls, columnConfig, getHeaderSlotsNode, getHeaderCellClass } = inject(TableDIKey)!\n const { headers } = columnConfig\n const handleCls = cls.e('resize-handle')\n\n const { handleResizeMousedown, headerRef } = inject(TableResizeKey)!\n\n return () => (\n <thead\n class={[cls.e('head'), bem.is('multistage', headers.value.length > 1)]}\n ref={headerRef}\n >\n {headers.value.map((header, headerIndex) => (\n <tr>\n {header.map((column) => (\n <th\n class={getHeaderCellClass(column)}\n key={column.key}\n colspan={column.leafs}\n rowspan={column.children?.length ? undefined : headers.value.length - headerIndex}\n style={{\n ...column.headerCellStyle,\n left: withUnit(column.style.left, 'px'),\n right: withUnit(column.style.right, 'px')\n }}\n >\n {getHeaderSlotsNode({ column })}\n\n {column.isLeaf && column.resizable ? (\n <span\n class={handleCls}\n onMousedown={(e) => handleResizeMousedown(e, column)}\n ></span>\n ) : null}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n )\n }\n})\n\nexport default TableHead\n"],"mappings":";;;;AAKA,MAAM,YAA6B,gBAAgB;CACjD,MAAM;CACN,QAAQ;EACN,MAAM,EAAE,KAAK,cAAc,oBAAoB,uBAAuB,OAAO,UAAU;EACvF,MAAM,EAAE,YAAY;EACpB,MAAM,YAAY,IAAI,EAAE,eAAe;EAEvC,MAAM,EAAE,uBAAuB,cAAc,OAAO,cAAc;EAElE,aAAO,YAAA,SAAA;GAAA,SAEI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,QAAQ,MAAM,SAAS,CAAC,CAAC;GAAC,OACjE;EAAS,GAAA,CAEb,QAAQ,MAAM,KAAK,QAAQ,gBAAW,YAAA,MAAA,MAAA,CAElC,OAAO,KAAK,WAAM,YAAA,MAAA;GAAA,SAER,mBAAmB,MAAM;GAAC,OAC5B,OAAO;GAAG,WACN,OAAO;GAAK,WACZ,OAAO,UAAU,SAAS,KAAA,IAAY,QAAQ,MAAM,SAAS;GAAW,SAC1E;IACL,GAAG,OAAO;IACV,MAAM,SAAS,OAAO,MAAM,MAAM,IAAI;IACtC,OAAO,SAAS,OAAO,MAAM,OAAO,IAAI;GAC1C;EAAC,GAAA,CAEA,mBAAmB,EAAE,OAAO,CAAC,GAE7B,OAAO,UAAU,OAAO,YAAS,YAAA,QAAA;GAAA,SAEvB;GAAS,gBACF,MAAM,sBAAsB,GAAG,MAAM;EAAC,GAAA,IAAA,IAEpD,IAAI,CAAA,CAEX,CAAC,CAAA,CAEL,CAAC,CAAA;CAGR;AACF,CAAC"}
@@ -76,6 +76,7 @@ const UTableRow = defineComponent({
76
76
  "cellClass": getCellClass(_expandColumn),
77
77
  "left": _expandColumn.style.left,
78
78
  "right": _expandColumn.style.right,
79
+ "cellStyle": _expandColumn.cellStyle,
79
80
  "key": row.uid + _expandColumn.key
80
81
  }, tableProps.mergeCell?.(expandCtx)), { default: () => [!row.isLeaf || tableProps.expandable && !row.isExpandRow ? createVNode(_sfc_main$1, {
81
82
  "text": true,
@@ -110,6 +111,7 @@ const UTableRow = defineComponent({
110
111
  "cellClass": getCellClass(column),
111
112
  "left": column.style.left,
112
113
  "right": column.style.right,
114
+ "cellStyle": column.cellStyle,
113
115
  "key": row.uid + column.key,
114
116
  "onClick": (e) => handleCellClick(row, column, e)
115
117
  }, cellSpan), _isSlot(cellNode) ? cellNode : { default: () => [cellNode] });
@@ -1 +1 @@
1
- {"version":3,"file":"table-row.js","names":[],"sources":["../../../src/components/table/table-row.tsx"],"sourcesContent":["import { ArrowRight } from '@veltra/icons/normal'\nimport { defineComponent, type DefineComponent } from 'vue'\nimport { inject, onUnmounted } from 'vue'\nimport type { JSX } from 'vue/jsx-runtime'\n\nimport type { TableRow as ITableRow } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\nimport { TableDIKey } from './di'\nimport UTabelCell from './table-cell.vue'\n\n/**\n * A3:行修饰类组合静态查找表。\n *\n * 位模式:bit2 = isCurrent, bit1 = checked, bit0 = expanded。\n * 与 `bem.is('...')` 对于 `'current' | 'checked' | 'expanded'` 的输出完全等价,\n * 直接从 index 读字符串,消除每行渲染期间的字符串拼接和 3 次 bem.is 调用。\n *\n * 放在模块顶层使所有 TableRow 实例共享一份引用(不会随 setup 重建)。\n */\nconst ROW_MOD_CLASS: readonly string[] = [\n '',\n 'is-expanded',\n 'is-checked',\n 'is-checked is-expanded',\n 'is-current',\n 'is-current is-expanded',\n 'is-current is-checked',\n 'is-current is-checked is-expanded'\n] as const\n\nfunction rowModCls(row: ITableRow): string {\n const i = (row.isCurrent ? 4 : 0) | (row.checked ? 2 : 0) | (row.expanded ? 1 : 0)\n return ROW_MOD_CLASS[i]!\n}\n\nexport const UTableRow: DefineComponent<{ row: ITableRow; index: number }> = defineComponent({\n name: 'TableRow',\n\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n\n setup(props) {\n const {\n cls,\n columnConfig,\n getColumnSlotsNode,\n toggleTreeRowExpand,\n getCellCtx,\n handleRowClick,\n handleCellClick,\n tableProps,\n measureElement,\n getCellClass\n } = inject(TableDIKey)!\n\n // A1:把 cls.e('row') / cls.e('expand-toggle') 等静态字符串提升到 setup 一次性计算,\n // 避免每次 render 重新走 `cls.e` 拼接。\n const rowBaseCls = cls.e('row')\n const expandToggleCls = cls.e('expand-toggle')\n const expandSpaceCls = cls.e('expand-space')\n\n // A2:measureRef 按 index 缓存闭包。\n // 行虚拟化下,同一 TableRow 实例的 props.index 大多稳定,但在虚拟化重排或展开行切换时\n // 仍会发生变化;把 (index) → refFn 缓存起来,既保证引用稳定(利于 Vue 的 ref diff),\n // 又避免在未来可能的\"同实例跨 index 复用\"情形下重复分配闭包。\n const measureRefCache = new Map<number, (el: unknown) => void>()\n const getMeasureRef = (index: number): ((el: unknown) => void) => {\n let ref = measureRefCache.get(index)\n if (ref === undefined) {\n ref = (el: unknown) => {\n measureElement(index, el as Element | null)\n }\n measureRefCache.set(index, ref)\n }\n return ref\n }\n onUnmounted(() => {\n measureRefCache.clear()\n })\n\n const { columns, expandColumn } = columnConfig\n\n return () => {\n const { row } = props\n const _expandColumn = expandColumn.value\n\n let expandCell: JSX.Element | null = null\n if (_expandColumn) {\n const expandCtx = getCellCtx(row, _expandColumn)\n const cellSpan = tableProps.mergeCell?.(expandCtx)\n\n if (!cellSpan || (cellSpan.colspan && cellSpan.rowspan)) {\n const marginLeft = tableProps.tree ? row.depth * 14 : 0\n expandCell = (\n <UTabelCell\n cellClass={getCellClass(_expandColumn)}\n left={_expandColumn.style.left}\n right={_expandColumn.style.right}\n key={row.uid + _expandColumn.key}\n {...tableProps.mergeCell?.(expandCtx)}\n >\n {!row.isLeaf || (tableProps.expandable && !row.isExpandRow) ? (\n <UButton\n text\n class={expandToggleCls}\n type='primary'\n size='small'\n circle\n onClick={(e) => {\n e.stopPropagation()\n toggleTreeRowExpand(row)\n }}\n style={`margin-left: ${marginLeft}px`}\n >\n <UIcon>\n <ArrowRight />\n </UIcon>\n </UButton>\n ) : (\n <i class={expandSpaceCls} style={`margin-left: ${marginLeft}px`}></i>\n )}\n\n {getColumnSlotsNode(expandCtx)}\n </UTabelCell>\n )\n }\n }\n\n // A3:行 class 由 base + 3-bit 组合查找产出,避免 Vue 的 class 数组归一化开销。\n const mod = rowModCls(row)\n const rowCls = mod ? rowBaseCls + ' ' + mod : rowBaseCls\n\n return (\n <tr\n class={rowCls}\n onClick={(e) => handleRowClick(row, e)}\n ref={getMeasureRef(props.index)}\n key={row.uid}\n >\n {expandCell}\n\n {columns.value.map((column) => {\n const cellCtx = getCellCtx(row, column)\n const cellSpan = tableProps.mergeCell?.(cellCtx)\n if (cellSpan && (!cellSpan.colspan || !cellSpan.rowspan)) {\n return null\n }\n\n const cellNode = getColumnSlotsNode(cellCtx)\n\n return (\n <UTabelCell\n cellClass={getCellClass(column)}\n left={column.style.left}\n right={column.style.right}\n key={row.uid + column.key}\n // @ts-ignore\n onClick={(e) => handleCellClick(row, column, e)}\n {...cellSpan}\n >\n {cellNode}\n </UTabelCell>\n )\n })}\n </tr>\n )\n }\n }\n})\n\nexport const UExpandTableRow = defineComponent({\n name: 'ExpandTableRow',\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n setup(props) {\n const { getExpandRowSlotsNode, cls, measureElement, columnConfig } = inject(TableDIKey)!\n const { leafColumns } = columnConfig\n\n const rowBaseCls = cls.e('row')\n const cellCls = cls.e('cell')\n\n const measureRef = (el: unknown) => {\n measureElement(props.index, el as Element | null)\n }\n\n return () => {\n const { row } = props\n const node = getExpandRowSlotsNode({\n row,\n index: row.index,\n columns: leafColumns.value,\n rowData: row.data\n })\n return (\n <tr class={rowBaseCls} ref={measureRef}>\n <td colspan={leafColumns.value.length} class={cellCls}>\n {node}\n </td>\n </tr>\n )\n }\n }\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"table-row.js","names":[],"sources":["../../../src/components/table/table-row.tsx"],"sourcesContent":["import { ArrowRight } from '@veltra/icons/normal'\nimport { defineComponent, type DefineComponent } from 'vue'\nimport { inject, onUnmounted } from 'vue'\nimport type { JSX } from 'vue/jsx-runtime'\n\nimport type { TableRow as ITableRow } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\nimport { TableDIKey } from './di'\nimport UTabelCell from './table-cell.vue'\n\n/**\n * A3:行修饰类组合静态查找表。\n *\n * 位模式:bit2 = isCurrent, bit1 = checked, bit0 = expanded。\n * 与 `bem.is('...')` 对于 `'current' | 'checked' | 'expanded'` 的输出完全等价,\n * 直接从 index 读字符串,消除每行渲染期间的字符串拼接和 3 次 bem.is 调用。\n *\n * 放在模块顶层使所有 TableRow 实例共享一份引用(不会随 setup 重建)。\n */\nconst ROW_MOD_CLASS: readonly string[] = [\n '',\n 'is-expanded',\n 'is-checked',\n 'is-checked is-expanded',\n 'is-current',\n 'is-current is-expanded',\n 'is-current is-checked',\n 'is-current is-checked is-expanded'\n] as const\n\nfunction rowModCls(row: ITableRow): string {\n const i = (row.isCurrent ? 4 : 0) | (row.checked ? 2 : 0) | (row.expanded ? 1 : 0)\n return ROW_MOD_CLASS[i]!\n}\n\nexport const UTableRow: DefineComponent<{ row: ITableRow; index: number }> = defineComponent({\n name: 'TableRow',\n\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n\n setup(props) {\n const {\n cls,\n columnConfig,\n getColumnSlotsNode,\n toggleTreeRowExpand,\n getCellCtx,\n handleRowClick,\n handleCellClick,\n tableProps,\n measureElement,\n getCellClass\n } = inject(TableDIKey)!\n\n // A1:把 cls.e('row') / cls.e('expand-toggle') 等静态字符串提升到 setup 一次性计算,\n // 避免每次 render 重新走 `cls.e` 拼接。\n const rowBaseCls = cls.e('row')\n const expandToggleCls = cls.e('expand-toggle')\n const expandSpaceCls = cls.e('expand-space')\n\n // A2:measureRef 按 index 缓存闭包。\n // 行虚拟化下,同一 TableRow 实例的 props.index 大多稳定,但在虚拟化重排或展开行切换时\n // 仍会发生变化;把 (index) → refFn 缓存起来,既保证引用稳定(利于 Vue 的 ref diff),\n // 又避免在未来可能的\"同实例跨 index 复用\"情形下重复分配闭包。\n const measureRefCache = new Map<number, (el: unknown) => void>()\n const getMeasureRef = (index: number): ((el: unknown) => void) => {\n let ref = measureRefCache.get(index)\n if (ref === undefined) {\n ref = (el: unknown) => {\n measureElement(index, el as Element | null)\n }\n measureRefCache.set(index, ref)\n }\n return ref\n }\n onUnmounted(() => {\n measureRefCache.clear()\n })\n\n const { columns, expandColumn } = columnConfig\n\n return () => {\n const { row } = props\n const _expandColumn = expandColumn.value\n\n let expandCell: JSX.Element | null = null\n if (_expandColumn) {\n const expandCtx = getCellCtx(row, _expandColumn)\n const cellSpan = tableProps.mergeCell?.(expandCtx)\n\n if (!cellSpan || (cellSpan.colspan && cellSpan.rowspan)) {\n const marginLeft = tableProps.tree ? row.depth * 14 : 0\n expandCell = (\n <UTabelCell\n cellClass={getCellClass(_expandColumn)}\n left={_expandColumn.style.left}\n right={_expandColumn.style.right}\n cellStyle={_expandColumn.cellStyle}\n key={row.uid + _expandColumn.key}\n {...tableProps.mergeCell?.(expandCtx)}\n >\n {!row.isLeaf || (tableProps.expandable && !row.isExpandRow) ? (\n <UButton\n text\n class={expandToggleCls}\n type='primary'\n size='small'\n circle\n onClick={(e) => {\n e.stopPropagation()\n toggleTreeRowExpand(row)\n }}\n style={`margin-left: ${marginLeft}px`}\n >\n <UIcon>\n <ArrowRight />\n </UIcon>\n </UButton>\n ) : (\n <i class={expandSpaceCls} style={`margin-left: ${marginLeft}px`}></i>\n )}\n\n {getColumnSlotsNode(expandCtx)}\n </UTabelCell>\n )\n }\n }\n\n // A3:行 class 由 base + 3-bit 组合查找产出,避免 Vue 的 class 数组归一化开销。\n const mod = rowModCls(row)\n const rowCls = mod ? rowBaseCls + ' ' + mod : rowBaseCls\n\n return (\n <tr\n class={rowCls}\n onClick={(e) => handleRowClick(row, e)}\n ref={getMeasureRef(props.index)}\n key={row.uid}\n >\n {expandCell}\n\n {columns.value.map((column) => {\n const cellCtx = getCellCtx(row, column)\n const cellSpan = tableProps.mergeCell?.(cellCtx)\n if (cellSpan && (!cellSpan.colspan || !cellSpan.rowspan)) {\n return null\n }\n\n const cellNode = getColumnSlotsNode(cellCtx)\n\n return (\n <UTabelCell\n cellClass={getCellClass(column)}\n left={column.style.left}\n right={column.style.right}\n cellStyle={column.cellStyle}\n key={row.uid + column.key}\n // @ts-ignore\n onClick={(e) => handleCellClick(row, column, e)}\n {...cellSpan}\n >\n {cellNode}\n </UTabelCell>\n )\n })}\n </tr>\n )\n }\n }\n})\n\nexport const UExpandTableRow = defineComponent({\n name: 'ExpandTableRow',\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n setup(props) {\n const { getExpandRowSlotsNode, cls, measureElement, columnConfig } = inject(TableDIKey)!\n const { leafColumns } = columnConfig\n\n const rowBaseCls = cls.e('row')\n const cellCls = cls.e('cell')\n\n const measureRef = (el: unknown) => {\n measureElement(props.index, el as Element | null)\n }\n\n return () => {\n const { row } = props\n const node = getExpandRowSlotsNode({\n row,\n index: row.index,\n columns: leafColumns.value,\n rowData: row.data\n })\n return (\n <tr class={rowBaseCls} ref={measureRef}>\n <td colspan={leafColumns.value.length} class={cellCls}>\n {node}\n </td>\n </tr>\n )\n }\n }\n})\n"],"mappings":";;;;;;;;;;;;;;;;AAWA,SAAA,QAAA,GAAA;CAAA,OAAA,OAAA,MAAA,cAAA,OAAA,UAAA,SAAA,KAAA,CAAA,MAAA,qBAAA,CAAA,QAAA,CAAA;AAAA;AASA,MAAM,gBAAmC;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AAAmC;AAGrC,SAAS,UAAU,KAAwB;CACzC,MAAM,KAAK,IAAI,YAAY,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,IAAI,WAAW,IAAI;CAChF,OAAO,cAAc;AACvB;AAEA,MAAa,YAAgE,gBAAgB;CAC3F,MAAM;CAEN,OAAO;EACL,KAAK;GAAE,MAAM;GAA2B,UAAU;EAAK;EACvD,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAK;CACxC;CAEA,MAAM,OAAO;EACX,MAAM,EACJ,KACA,cACA,oBACA,qBACA,YACA,gBACA,iBACA,YACA,gBACA,iBACE,OAAO,UAAU;EAIrB,MAAM,aAAa,IAAI,EAAE,KAAK;EAC9B,MAAM,kBAAkB,IAAI,EAAE,eAAe;EAC7C,MAAM,iBAAiB,IAAI,EAAE,cAAc;EAM3C,MAAM,kCAAkB,IAAI,IAAmC;EAC/D,MAAM,iBAAiB,UAA2C;GAChE,IAAI,MAAM,gBAAgB,IAAI,KAAK;GACnC,IAAI,QAAQ,KAAA,GAAW;IACrB,OAAO,OAAgB;KACrB,eAAe,OAAO,EAAoB;IAC5C;IACA,gBAAgB,IAAI,OAAO,GAAG;GAChC;GACA,OAAO;EACT;EACA,kBAAkB;GAChB,gBAAgB,MAAM;EACxB,CAAC;EAED,MAAM,EAAE,SAAS,iBAAiB;EAElC,aAAa;GACX,MAAM,EAAE,QAAQ;GAChB,MAAM,gBAAgB,aAAa;GAEnC,IAAI,aAAiC;GACrC,IAAI,eAAe;IACjB,MAAM,YAAY,WAAW,KAAK,aAAa;IAC/C,MAAM,WAAW,WAAW,YAAY,SAAS;IAEjD,IAAI,CAAC,YAAa,SAAS,WAAW,SAAS,SAAU;KACvD,MAAM,aAAa,WAAW,OAAO,IAAI,QAAQ,KAAK;KACtD,aAAU,YAAA,aAAA,WAAA;MAAA,aAEK,aAAa,aAAa;MAAC,QAChC,cAAc,MAAM;MAAI,SACvB,cAAc,MAAM;MAAK,aACrB,cAAc;MAAS,OAC7B,IAAI,MAAM,cAAc;KAAG,GAC5B,WAAW,YAAY,SAAS,CAAC,GAAA,EAAA,eAAA,CAEpC,CAAC,IAAI,UAAW,WAAW,cAAc,CAAC,IAAI,cAAY,YAAA,aAAA;MAAA,QAAA;MAAA,SAGhD;MAAe,QAAA;MAAA,QAAA;MAAA,UAAA;MAAA,YAIZ,MAAM;OACd,EAAE,gBAAgB;OAClB,oBAAoB,GAAG;MACzB;MAAC,SACM,gBAAgB,WAAU;KAAI,GAAA,EAAA,eAAA,CAAA,YAAA,WAAA,MAAA,EAAA,eAAA,CAAA,YAAA,YAAA,MAAA,IAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,IAAA,YAAA,KAAA;MAAA,SAO7B;MAAc,SAAS,gBAAgB,WAAU;KAAI,GAAA,IAAA,GAGhE,mBAAmB,SAAS,CAAC,EAAA,CAAA;IAGpC;GACF;GAGA,MAAM,MAAM,UAAU,GAAG;GACzB,MAAM,SAAS,MAAM,aAAa,MAAM,MAAM;GAE9C,OAAA,YAAA,MAAA;IAAA,SAEW;IAAM,YACH,MAAM,eAAe,KAAK,CAAC;IAAC,OACjC,cAAc,MAAM,KAAK;IAAC,OAC1B,IAAI;GAAG,GAAA,CAEX,YAEA,QAAQ,MAAM,KAAK,WAAW;IAC7B,MAAM,UAAU,WAAW,KAAK,MAAM;IACtC,MAAM,WAAW,WAAW,YAAY,OAAO;IAC/C,IAAI,aAAa,CAAC,SAAS,WAAW,CAAC,SAAS,UAC9C,OAAO;IAGT,MAAM,WAAW,mBAAmB,OAAO;IAE3C,OAAA,YAAA,aAAA,WAAA;KAAA,aAEe,aAAa,MAAM;KAAC,QACzB,OAAO,MAAM;KAAI,SAChB,OAAO,MAAM;KAAK,aACd,OAAO;KAAS,OACtB,IAAI,MAAM,OAAO;KAAG,YAEf,MAAM,gBAAgB,KAAK,QAAQ,CAAC;IAAC,GAC3C,QAAQ,GAAA,QAEX,QAAQ,IAAR,WAAQ,EAAA,eAAA,CAAR,QAAQ,EAAA,CAAA;GAGf,CAAC,CAAC,CAAA;EAGR;CACF;AACF,CAAC;AAED,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CACN,OAAO;EACL,KAAK;GAAE,MAAM;GAA2B,UAAU;EAAK;EACvD,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAK;CACxC;CACA,MAAM,OAAO;EACX,MAAM,EAAE,uBAAuB,KAAK,gBAAgB,iBAAiB,OAAO,UAAU;EACtF,MAAM,EAAE,gBAAgB;EAExB,MAAM,aAAa,IAAI,EAAE,KAAK;EAC9B,MAAM,UAAU,IAAI,EAAE,MAAM;EAE5B,MAAM,cAAc,OAAgB;GAClC,eAAe,MAAM,OAAO,EAAoB;EAClD;EAEA,aAAa;GACX,MAAM,EAAE,QAAQ;GAChB,MAAM,OAAO,sBAAsB;IACjC;IACA,OAAO,IAAI;IACX,SAAS,YAAY;IACrB,SAAS,IAAI;GACf,CAAC;GACD,OAAA,YAAA,MAAA;IAAA,SACa;IAAU,OAAO;GAAU,GAAA,CAAA,YAAA,MAAA;IAAA,WACvB,YAAY,MAAM;IAAM,SAAS;GAAO,GAAA,CAClD,IAAI,CAAA,CAAA,CAAA;EAIb;CACF;AACF,CAAC"}
@@ -8,7 +8,6 @@ import { BEM } from "@veltra/utils";
8
8
  * 定义表格列
9
9
  * @param columns 表格列
10
10
  */
11
- declare function defineTableColumns(columns: TableColumn[], commonProps?: Partial<Pick<TableColumn, 'align' | 'minWidth'>>): TableColumn[];
11
+ export declare function defineTableColumns(columns: TableColumn[], commonProps?: Partial<Pick<TableColumn, 'align' | 'minWidth'>>): TableColumn[];
12
12
  //#endregion
13
- export { defineTableColumns };
14
13
  //# sourceMappingURL=use-columns.d.ts.map
@@ -17,10 +17,30 @@
17
17
  /** 暗色:`UITheme.render()` 按主题系列写入 html[data-theme] */
18
18
  .u-table-editor .u-table__body .u-table__cell {
19
19
  padding: 2px;
20
+ height: calc(var(--u-form-component-height-default) + 4px + 1px);
20
21
  }
22
+ .u-table-editor .u-table__body .u-table__cell > [class^=u-],
21
23
  .u-table-editor .u-table__body .u-table__cell [class^=u-input] {
22
- box-shadow: none;
24
+ vertical-align: top;
23
25
  }
24
- .u-table-editor .u-table__body .u-table__cell > [class^=u-] {
25
- box-shadow: none;
26
+ .u-table-editor .u-table-editor__operations {
27
+ display: flex;
28
+ justify-content: center;
29
+ gap: 4px;
30
+ }
31
+ .u-table-editor .u-table-editor__operations .u-button {
32
+ padding: 0 0.4em;
33
+ }
34
+ .u-table-editor__required-mark {
35
+ padding-right: 2px;
36
+ color: var(--u-color-danger);
37
+ }
38
+ .u-table-editor__header-text.is-error {
39
+ color: var(--u-color-danger);
40
+ }
41
+ .u-table-editor__header-icon {
42
+ color: var(--u-color-danger);
43
+ margin-left: 2px;
44
+ vertical-align: -2px;
45
+ cursor: help;
26
46
  }
@@ -1,9 +1,12 @@
1
- import _sfc_main$1 from "../button/button.js";
2
- import _sfc_main$2 from "../table/table.js";
3
- import { computed, createBlock, createCommentVNode, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, unref, withCtx } from "vue";
4
- import { useComponentProps } from "@veltra/compositions";
1
+ import _sfc_main$1 from "../icon/icon.js";
2
+ import _sfc_main$2 from "../tip/tip.js";
3
+ import { validateField } from "../form-item/validate.js";
4
+ import _sfc_main$3 from "../button/button.js";
5
+ import _sfc_main$4 from "../table/table.js";
6
+ import { computed, createBlock, createCommentVNode, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, guardReactiveProps, h, mergeProps, normalizeClass, normalizeProps, openBlock, renderList, renderSlot, shallowRef, toRaw, triggerRef, unref, useSlots, watch, withCtx } from "vue";
5
7
  import { bem } from "@veltra/utils";
6
- import { Copy, Minus, Plus } from "@veltra/icons/normal";
8
+ import { Copy, Minus, Plus, Warning } from "@veltra/icons/normal";
9
+ import { o } from "@cat-kit/core";
7
10
  //#region src/components/table-editor/table-editor.vue
8
11
  const _hoisted_1 = { style: {
9
12
  "text-align": "center",
@@ -13,9 +16,10 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
13
16
  name: "UTableEditor",
14
17
  __name: "table-editor",
15
18
  props: {
16
- modelValue: { default: () => [] },
19
+ modelValue: {},
20
+ columns: {},
21
+ readonly: { type: Boolean },
17
22
  size: {},
18
- columns: { default: () => [] },
19
23
  checked: {},
20
24
  selected: {},
21
25
  checkable: { type: Boolean },
@@ -35,82 +39,224 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
35
39
  textEllipsis: { type: Boolean }
36
40
  },
37
41
  emits: ["update:modelValue"],
38
- setup(__props, { emit: __emit }) {
42
+ setup(__props, { expose: __expose, emit: __emit }) {
43
+ const props = __props;
39
44
  const emit = __emit;
40
- const cls = bem("table-editor");
41
- const ButtonCommonProps = useComponentProps({
42
- size: "small",
43
- circle: true,
44
- text: true,
45
- type: "primary"
45
+ const columns = computed(() => props.columns ?? []);
46
+ const modelValue = computed(() => props.modelValue ?? []);
47
+ /** 转发给 u-table 的表格属性;columns / modelValue / readonly 为编辑器自用,stripe / showIndex 被覆盖 */
48
+ const tableProps = computed(() => {
49
+ const rest = { ...props };
50
+ delete rest.columns;
51
+ delete rest.modelValue;
52
+ delete rest.readonly;
53
+ return rest;
46
54
  });
55
+ const cls = bem("table-editor");
56
+ const slots = useSlots();
47
57
  const actionColumn = {
48
58
  key: "__operation",
49
59
  name: "操作",
50
- width: 120,
60
+ width: 104,
51
61
  align: "center",
52
62
  fixed: "right",
53
63
  resizable: false
54
64
  };
65
+ /**
66
+ * 内部列定义:单元格渲染挂在列的 render 上(用户列自带的 render 优先),
67
+ * 配置了 rules 的列包装 nameRender 追加校验标识,非只读时末尾追加操作列。
68
+ * 列 key 带上只读态后缀:u-table 行内单元格在 props 值相等时可能跳过子组件补丁,
69
+ * 只读切换改用挂载键直接重挂单元格,确保控件在编辑/只读形态间可靠切换。
70
+ */
55
71
  const internalColumns = computed(() => {
56
- return [...__props.columns, actionColumn];
72
+ const list = columns.value.map((column) => ({
73
+ ...column,
74
+ key: `${column.key}${props.readonly ? ":ro" : ""}`,
75
+ nameRender: column.rules ? headerCell(column) : column.nameRender,
76
+ render: column.render ?? ((ctx) => editCell(column, ctx))
77
+ }));
78
+ return props.readonly ? list : [...list, actionColumn];
79
+ });
80
+ /** 透传给 u-table 的插槽名:column:* 经 editCell 注入 model、empty 由组件接管,其余透传 */
81
+ const passSlotNames = Object.keys(slots).filter((name) => !name.startsWith("column:") && name !== "empty");
82
+ /**
83
+ * 带校验的列表头包装:required 时列名前渲染红星;该列存在未通过项时文字标红并追加
84
+ * 感叹号图标,悬停经 UTip 气泡展示各行错误明细;`#header:key` 插槽 / nameRender 内容替代列名。
85
+ * 渲染函数内读取 columnErrors 建立响应依赖,错误出现/消失即时更新表头。
86
+ */
87
+ function headerCell(column) {
88
+ return (ctx) => {
89
+ const messages = columnErrors.value.get(column.key);
90
+ const nodes = [h("span", { class: [cls.e("header-text"), bem.is("error", !!messages?.length)] }, slots[`header:${column.key}`]?.(ctx) ?? column.nameRender?.(ctx) ?? column.name)];
91
+ if (column.rules?.required) nodes.unshift(h("span", {
92
+ class: cls.e("required-mark"),
93
+ "aria-hidden": "true"
94
+ }, "*"));
95
+ if (messages?.length) nodes.push(h(_sfc_main$2, { key: "header-error-tip" }, {
96
+ default: () => h(_sfc_main$1, {
97
+ size: 14,
98
+ class: cls.e("header-icon")
99
+ }, { default: () => h(Warning) }),
100
+ content: () => messages.map((message) => h("div", { key: message }, message))
101
+ }));
102
+ return nodes;
103
+ };
104
+ }
105
+ /** 行数据(以原始对象为键)→ 列 key → 错误信息 */
106
+ const cellErrors = shallowRef(/* @__PURE__ */ new Map());
107
+ /** 行节点 data 可能是响应式代理,统一取原始对象作为键 */
108
+ const errorRowKey = (rowData) => toRaw(rowData);
109
+ function setCellError(rowData, key, message) {
110
+ const row = errorRowKey(rowData);
111
+ const rowErrors = cellErrors.value.get(row);
112
+ if (!message) {
113
+ if (!rowErrors?.delete(key)) return;
114
+ } else {
115
+ if (rowErrors?.get(key) === message) return;
116
+ if (rowErrors) rowErrors.set(key, message);
117
+ else cellErrors.value.set(row, /* @__PURE__ */ new Map([[key, message]]));
118
+ }
119
+ triggerRef(cellErrors);
120
+ }
121
+ /** 丢弃同一单元格过期的异步校验结果 */
122
+ const validateSeqs = /* @__PURE__ */ new WeakMap();
123
+ /** 单元格级校验:以行数据为 formData、列 key 为 field,结果同步到错误状态 */
124
+ async function validateCell(rowData, key, rules) {
125
+ if (!rules) return;
126
+ const row = errorRowKey(rowData);
127
+ let seqs = validateSeqs.get(row);
128
+ if (!seqs) {
129
+ seqs = /* @__PURE__ */ new Map();
130
+ validateSeqs.set(row, seqs);
131
+ }
132
+ const seq = (seqs.get(key) ?? 0) + 1;
133
+ seqs.set(key, seq);
134
+ const message = await validateField(rowData, key, rules);
135
+ if (seqs.get(key) !== seq) return;
136
+ if (!modelValue.value.some((item) => errorRowKey(item) === row)) return;
137
+ setCellError(row, key, message);
138
+ }
139
+ /**
140
+ * 整表校验:自上而下逐行校验,某行存在未通过项即停止校验其后的行(懒校验)。
141
+ * 全部通过 resolve true,否则 resolve false。
142
+ */
143
+ async function validate() {
144
+ const ruleColumns = columns.value.filter((column) => column.rules);
145
+ for (const row of modelValue.value) {
146
+ await Promise.all(ruleColumns.map((column) => validateCell(row, column.key, column.rules)));
147
+ if (cellErrors.value.get(errorRowKey(row))?.size) return false;
148
+ }
149
+ return true;
150
+ }
151
+ watch(modelValue, (rows) => {
152
+ if (!cellErrors.value.size) return;
153
+ const aliveRows = new Set(rows.map(errorRowKey));
154
+ const next = /* @__PURE__ */ new Map();
155
+ let changed = false;
156
+ for (const [row, errors] of cellErrors.value) if (aliveRows.has(row)) next.set(row, errors);
157
+ else changed = true;
158
+ if (changed) cellErrors.value = next;
159
+ });
160
+ /** 列 key → 该列全部未通过信息(带行序号),驱动表头错误标识 */
161
+ const columnErrors = computed(() => {
162
+ const map = /* @__PURE__ */ new Map();
163
+ if (!cellErrors.value.size) return map;
164
+ for (const [row, errors] of cellErrors.value) {
165
+ const index = modelValue.value.findIndex((item) => errorRowKey(item) === row);
166
+ const label = index >= 0 ? `第 ${index + 1} 行:` : "";
167
+ for (const [key, message] of errors) {
168
+ const list = map.get(key) ?? [];
169
+ list.push(`${label}${message}`);
170
+ map.set(key, list);
171
+ }
172
+ }
173
+ return map;
57
174
  });
175
+ /** 声明了 `#column:key` 插槽的列调用编辑插槽(注入 model),未声明的渲染字段原始值 */
176
+ function editCell(column, ctx) {
177
+ const editSlot = slots[`column:${column.key}`];
178
+ const val = o(ctx.rowData).get(column.key);
179
+ if (!editSlot) return val;
180
+ const scope = {
181
+ ...ctx,
182
+ val
183
+ };
184
+ return editSlot({
185
+ ...scope,
186
+ model: createCellModel(column, scope)
187
+ });
188
+ }
189
+ /**
190
+ * 单元格编辑 model:值先原地写回行数据(行节点与 DOM 得以复用,输入不丢焦点),
191
+ * 再以浅拷贝数组经 update:modelValue 通知宿主,维持 v-model 契约。
192
+ * 只读下注入 readonly: true 且不提供写回通道,值不可修改;
193
+ * 列配置了 rules 时,控件的 change 事件(如失焦提交)触发单元格级校验,输入过程不校验。
194
+ */
195
+ function createCellModel(column, ctx) {
196
+ const { rowData, val } = ctx;
197
+ const key = column.key;
198
+ const rules = column.rules;
199
+ return {
200
+ modelValue: val,
201
+ ...props.readonly ? { readonly: true } : { "onUpdate:modelValue": (value) => {
202
+ rowData[key] = value;
203
+ emit("update:modelValue", [...modelValue.value]);
204
+ } },
205
+ ...rules ? { onChange: () => void validateCell(rowData, key, rules) } : {}
206
+ };
207
+ }
58
208
  function handleCreate(index) {
59
- if (index !== void 0) emit("update:modelValue", [
60
- ...__props.modelValue.slice(0, index + 1),
209
+ const at = index !== void 0 ? index + 1 : modelValue.value.length;
210
+ emit("update:modelValue", [
211
+ ...modelValue.value.slice(0, at),
61
212
  {},
62
- ...__props.modelValue.slice(index + 1)
213
+ ...modelValue.value.slice(at)
63
214
  ]);
64
- else emit("update:modelValue", [...__props.modelValue, {}]);
65
215
  }
66
216
  function handleCopy(row) {
67
217
  emit("update:modelValue", [
68
- ...__props.modelValue.slice(0, row.index + 1),
218
+ ...modelValue.value.slice(0, row.index + 1),
69
219
  JSON.parse(JSON.stringify(row.data)),
70
- ...__props.modelValue.slice(row.index + 1)
220
+ ...modelValue.value.slice(row.index + 1)
71
221
  ]);
72
222
  }
73
223
  function handleDelete(index) {
74
- emit("update:modelValue", __props.modelValue.filter((_, i) => i !== index));
224
+ emit("update:modelValue", modelValue.value.filter((_, i) => i !== index));
75
225
  }
226
+ __expose({ validate });
76
227
  return (_ctx, _cache) => {
77
- return openBlock(), createBlock(unref(_sfc_main$2), {
228
+ return openBlock(), createBlock(unref(_sfc_main$4), mergeProps(tableProps.value, {
78
229
  columns: internalColumns.value,
79
- data: __props.modelValue || [],
80
- class: normalizeClass(unref(cls).b),
230
+ data: modelValue.value,
231
+ class: unref(cls).b,
81
232
  stripe: false,
82
- "show-index": "",
83
- slots: _ctx.$slots
84
- }, {
85
- "column:__operation": withCtx(({ row }) => [createVNode(unref(ButtonCommonProps), {
86
- tag: "div",
87
- style: {
88
- "display": "flex",
89
- "justify-content": "center",
90
- "gap": "8px"
91
- }
92
- }, {
93
- default: withCtx(() => [
94
- createVNode(unref(_sfc_main$1), {
95
- type: "danger",
96
- onClick: ($event) => handleDelete(row.index),
97
- icon: unref(Minus),
98
- title: "移除"
99
- }, null, 8, ["onClick", "icon"]),
100
- createVNode(unref(_sfc_main$1), {
101
- icon: unref(Plus),
102
- onClick: ($event) => handleCreate(row.index),
103
- title: "新增到下一行"
104
- }, null, 8, ["icon", "onClick"]),
105
- createVNode(unref(_sfc_main$1), {
106
- icon: unref(Copy),
107
- onClick: ($event) => handleCopy(row),
108
- title: "复制到下一行"
109
- }, null, 8, ["icon", "onClick"])
110
- ]),
111
- _: 2
112
- }, 1024)]),
113
- empty: withCtx(() => [createElementVNode("div", _hoisted_1, [!__props.modelValue.length ? (openBlock(), createBlock(unref(_sfc_main$1), {
233
+ "show-index": ""
234
+ }), createSlots({
235
+ "column:__operation": withCtx(({ row }) => [createElementVNode("div", { class: normalizeClass(unref(cls).e("operations")) }, [
236
+ createVNode(unref(_sfc_main$3), {
237
+ text: "",
238
+ size: "small",
239
+ type: "danger",
240
+ icon: unref(Minus),
241
+ title: "移除",
242
+ onClick: ($event) => handleDelete(row.index)
243
+ }, null, 8, ["icon", "onClick"]),
244
+ createVNode(unref(_sfc_main$3), {
245
+ text: "",
246
+ size: "small",
247
+ icon: unref(Plus),
248
+ title: "新增到下一行",
249
+ onClick: ($event) => handleCreate(row.index)
250
+ }, null, 8, ["icon", "onClick"]),
251
+ createVNode(unref(_sfc_main$3), {
252
+ text: "",
253
+ size: "small",
254
+ icon: unref(Copy),
255
+ title: "复制到下一行",
256
+ onClick: ($event) => handleCopy(row)
257
+ }, null, 8, ["icon", "onClick"])
258
+ ], 2)]),
259
+ empty: withCtx(() => [createElementVNode("div", _hoisted_1, [!props.readonly ? (openBlock(), createBlock(unref(_sfc_main$3), {
114
260
  key: 0,
115
261
  text: "",
116
262
  size: "small",
@@ -118,15 +264,19 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
118
264
  icon: unref(Plus),
119
265
  onClick: _cache[0] || (_cache[0] = ($event) => handleCreate())
120
266
  }, {
121
- default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode("添加", -1)])]),
267
+ default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode(" 添加 ", -1)])]),
122
268
  _: 1
123
269
  }, 8, ["icon"])) : createCommentVNode("v-if", true)])]),
124
- _: 1
125
- }, 8, [
270
+ _: 2
271
+ }, [renderList(unref(passSlotNames), (name) => {
272
+ return {
273
+ name,
274
+ fn: withCtx((scope) => [renderSlot(_ctx.$slots, name, normalizeProps(guardReactiveProps(scope)))])
275
+ };
276
+ })]), 1040, [
126
277
  "columns",
127
278
  "data",
128
- "class",
129
- "slots"
279
+ "class"
130
280
  ]);
131
281
  };
132
282
  }