niuma-ui 1.0.0 → 1.0.2

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 (159) hide show
  1. package/CHANGELOG.md +50 -1
  2. package/NOTICE +2 -2
  3. package/package.json +13 -5
  4. package/src/__tests__/RsButton.spec.ts +47 -0
  5. package/src/__tests__/RsCard.spec.ts +160 -1
  6. package/src/__tests__/RsConfirmDialog.spec.ts +127 -0
  7. package/src/__tests__/RsContextMenu.spec.ts +12 -0
  8. package/src/__tests__/RsDateTimePicker.spec.ts +11 -0
  9. package/src/__tests__/RsDescriptions.spec.ts +50 -0
  10. package/src/__tests__/RsDialog.spec.ts +117 -0
  11. package/src/__tests__/RsDrawer.spec.ts +96 -3
  12. package/src/__tests__/RsDynamicTags.spec.ts +52 -0
  13. package/src/__tests__/RsForm.spec.ts +245 -1
  14. package/src/__tests__/RsInput.spec.ts +15 -1
  15. package/src/__tests__/RsMenu.spec.ts +406 -14
  16. package/src/__tests__/RsPagination.spec.ts +67 -2
  17. package/src/__tests__/RsSelect.spec.ts +42 -1
  18. package/src/__tests__/RsSwitch.spec.ts +44 -0
  19. package/src/__tests__/RsTable.a11y.spec.ts +83 -0
  20. package/src/__tests__/RsTable.dom-baseline.spec.ts +87 -0
  21. package/src/__tests__/RsTable.perf.spec.ts +23 -4
  22. package/src/__tests__/RsTable.spec.ts +63 -8
  23. package/src/__tests__/RsTable.ssr.spec.ts +71 -0
  24. package/src/__tests__/RsTable.summary.spec.ts +45 -0
  25. package/src/__tests__/RsTabs.spec.ts +102 -4
  26. package/src/__tests__/RsTerminal.spec.ts +1 -1
  27. package/src/__tests__/RsTimePicker.spec.ts +11 -0
  28. package/src/__tests__/RsUpload.spec.ts +62 -6
  29. package/src/__tests__/createRsDialog.spec.ts +145 -0
  30. package/src/__tests__/form-rules.spec.ts +76 -0
  31. package/src/__tests__/perf-budgets.ts +32 -0
  32. package/src/__tests__/rs-table-api.spec.ts +206 -0
  33. package/src/__tests__/rs-table-compat-matrix.spec.ts +108 -0
  34. package/src/__tests__/rs-table-echarts-adapter.spec.ts +43 -0
  35. package/src/__tests__/rs-table-grid-nav.spec.ts +63 -0
  36. package/src/__tests__/rs-table-isolation.spec.ts +158 -0
  37. package/src/__tests__/split-pane-utils.spec.ts +21 -0
  38. package/src/__tests__/table-chart-utils.spec.ts +88 -0
  39. package/src/__tests__/table-summary-utils.spec.ts +62 -0
  40. package/src/__tests__/table-utils.spec.ts +124 -0
  41. package/src/__tests__/theme.spec.ts +25 -0
  42. package/src/__tests__/useRsTableColumnResize.spec.ts +25 -0
  43. package/src/__tests__/useRsTableCore.perf.spec.ts +170 -0
  44. package/src/components/RsAlert.vue +212 -0
  45. package/src/components/RsButton.vue +145 -21
  46. package/src/components/RsCard.vue +200 -16
  47. package/src/components/RsConfirmDialog.vue +215 -28
  48. package/src/components/RsContextMenu.vue +51 -13
  49. package/src/components/RsDatePicker.vue +267 -34
  50. package/src/components/RsDateTimePicker.vue +19 -2
  51. package/src/components/RsDescriptions.vue +186 -0
  52. package/src/components/RsDescriptionsItem.vue +32 -0
  53. package/src/components/RsDialog.vue +363 -51
  54. package/src/components/RsDivider.vue +89 -0
  55. package/src/components/RsDrawer.vue +558 -33
  56. package/src/components/RsDropdown.vue +33 -2
  57. package/src/components/RsDynamicTags.vue +517 -0
  58. package/src/components/RsForm.vue +97 -8
  59. package/src/components/RsInput.vue +80 -82
  60. package/src/components/RsInputNumber.vue +64 -23
  61. package/src/components/RsLabel.vue +20 -5
  62. package/src/components/RsLoadingBar.vue +151 -0
  63. package/src/components/RsMenu.vue +73 -15
  64. package/src/components/RsMenuItems.vue +147 -9
  65. package/src/components/RsPagination.vue +93 -14
  66. package/src/components/RsRadio.vue +81 -0
  67. package/src/components/RsRadioItem.vue +156 -0
  68. package/src/components/RsSelect.vue +67 -58
  69. package/src/components/RsSplitPane.vue +69 -1
  70. package/src/components/RsSwitch.vue +179 -0
  71. package/src/components/RsTable.vue +653 -2555
  72. package/src/components/RsTabs.vue +415 -83
  73. package/src/components/RsTag.vue +191 -0
  74. package/src/components/RsTerminal.vue +3 -3
  75. package/src/components/RsTimePicker.vue +44 -5
  76. package/src/components/RsTimePickerColumns.vue +136 -77
  77. package/src/components/RsToaster.vue +58 -18
  78. package/src/components/RsTree.vue +39 -21
  79. package/src/components/RsUpload.vue +145 -12
  80. package/src/components/RsVNodeHost.vue +20 -0
  81. package/src/components/button-utils.ts +39 -0
  82. package/src/components/context-menu-utils.ts +6 -0
  83. package/src/components/date-picker-utils.ts +84 -4
  84. package/src/components/descriptions-utils.ts +24 -0
  85. package/src/components/dialog-utils.ts +147 -0
  86. package/src/components/dialog-window.ts +74 -9
  87. package/src/components/drawer-utils.ts +73 -0
  88. package/src/components/form-rules.ts +257 -0
  89. package/src/components/form-utils.ts +52 -2
  90. package/src/components/menu-utils.ts +11 -0
  91. package/src/components/overlay-utils.ts +3 -0
  92. package/src/components/radio-utils.ts +12 -0
  93. package/src/components/reka.ts +5 -0
  94. package/src/components/select-utils.ts +21 -2
  95. package/src/components/split-pane-utils.ts +65 -12
  96. package/src/components/table/RsTableBody.vue +217 -0
  97. package/src/components/table/RsTableBodyRow.vue +90 -1
  98. package/src/components/table/RsTableColGroup.vue +41 -0
  99. package/src/components/table/RsTableHeader.vue +158 -0
  100. package/src/components/table/RsTableSummaryRow.vue +52 -0
  101. package/src/components/table/rs-table-api.ts +99 -0
  102. package/src/components/table/rs-table-compat-matrix.ts +71 -0
  103. package/src/components/table/rs-table-echarts-adapter.ts +81 -0
  104. package/src/components/table/rs-table-feature-host.ts +178 -0
  105. package/src/components/table/rs-table-grid-nav.ts +122 -0
  106. package/src/components/table/rs-table-header-types.ts +47 -0
  107. package/src/components/table/rs-table-module-registry.ts +72 -0
  108. package/src/components/table/rs-table-props.ts +274 -0
  109. package/src/components/table/rs-table-view-context.ts +258 -0
  110. package/src/components/table/rs-table.css +84 -6
  111. package/src/components/table/table-chart-utils.ts +165 -0
  112. package/src/components/table/table-features.ts +284 -0
  113. package/src/components/table/table-summary-utils.ts +194 -0
  114. package/src/components/table-utils.ts +452 -2
  115. package/src/components/tabs-utils.ts +142 -2
  116. package/src/components/terminal-utils.ts +1 -1
  117. package/src/components/terminal-wheel.ts +1 -1
  118. package/src/components/time-picker-utils.ts +76 -3
  119. package/src/components/upload-utils.ts +122 -0
  120. package/src/components/virtual-list-utils.ts +15 -2
  121. package/src/composables/assembleRsTableApi.ts +79 -0
  122. package/src/composables/bindRsTableViewContext.ts +269 -0
  123. package/src/composables/createRsDialog.ts +357 -0
  124. package/src/composables/createRsTableEditEmitBridge.ts +38 -0
  125. package/src/composables/useRsLoadingBar.ts +36 -0
  126. package/src/composables/useRsTable.ts +134 -0
  127. package/src/composables/useRsTableA11y.ts +52 -0
  128. package/src/composables/useRsTableChartBridge.ts +79 -0
  129. package/src/composables/useRsTableColumnLayout.ts +320 -0
  130. package/src/composables/useRsTableColumnResize.ts +244 -0
  131. package/src/composables/useRsTableColumnVirtual.ts +180 -0
  132. package/src/composables/useRsTableColumns.ts +200 -0
  133. package/src/composables/useRsTableContextMenu.ts +257 -0
  134. package/src/composables/useRsTableCore.ts +256 -0
  135. package/src/composables/useRsTableEditActions.ts +606 -0
  136. package/src/composables/useRsTableEditLayer.ts +251 -0
  137. package/src/composables/useRsTableEngine.ts +357 -0
  138. package/src/composables/useRsTableGridKeyboard.ts +123 -0
  139. package/src/composables/useRsTableHeadless.ts +137 -0
  140. package/src/composables/useRsTableInteraction.ts +433 -0
  141. package/src/composables/useRsTableScrollHost.ts +75 -0
  142. package/src/composables/useRsTableScrollLayout.ts +255 -0
  143. package/src/composables/useRsTableSelectionSource.ts +89 -0
  144. package/src/composables/useRsTableShell.ts +416 -0
  145. package/src/composables/useRsTableShellChrome.ts +170 -0
  146. package/src/composables/useRsTableSummary.ts +113 -0
  147. package/src/composables/useRsTableViewProvide.ts +263 -0
  148. package/src/composables/useRsTableVirtual.ts +154 -0
  149. package/src/composables/useRsTabsNav.ts +4 -0
  150. package/src/composables/useTableEdit.ts +1 -1
  151. package/src/icons/lucide.ts +2 -2
  152. package/src/index.ts +309 -9
  153. package/src/locale/messages.ts +30 -0
  154. package/src/styles.css +305 -52
  155. package/src/theme/brand.example.css +21 -2
  156. package/src/theme/presets.ts +4 -0
  157. package/src/theme/types.ts +67 -0
  158. package/src/components/RsTableColgroup.vue +0 -17
  159. package/src/components/RsTableHeaderRow.vue +0 -30
@@ -0,0 +1,256 @@
1
+ /**
2
+ * RsTable 内核装配(Columns + Engine + Scroll + Virtual + Analytics + Features)。
3
+ *
4
+ * 性能约定:
5
+ * - data / columns 仅按引用浅层失效,不做 deep watch
6
+ * - Feature 按 id + setup 引用签名重绑,避免无关 props 抖动拆掉图表订阅
7
+ * - 行派生(dataRows / viewRows / keyMap)单次遍历 tableEntries
8
+ *
9
+ * 不负责:列宽拖拽 DOM、列虚拟(依赖 resize 快照)、编辑/右键交互、模板。
10
+ */
11
+
12
+ import { computed, onUnmounted, watch } from 'vue'
13
+ import type {
14
+ RsTableColumn,
15
+ RsTableGroupBy,
16
+ RsTableRowData,
17
+ RsTableRowKey,
18
+ RsTableSize,
19
+ RsTableSortState,
20
+ RsTableTreeConfig,
21
+ } from '../components/table-utils'
22
+ import { resolveTableRowHeight, resolveTableSize } from '../components/table-utils'
23
+ import {
24
+ resolveBuiltinTableFeatures,
25
+ type RsTableFeature,
26
+ } from '../components/table/table-features'
27
+ import { useRsTable } from './useRsTable'
28
+ import { useRsTableColumns, type UseRsTableColumnsEmit } from './useRsTableColumns'
29
+ import { useRsTableEngine, type UseRsTableEngineEmit } from './useRsTableEngine'
30
+ import { useRsTableScrollLayout } from './useRsTableScrollLayout'
31
+ import { useRsTableSelectionSource } from './useRsTableSelectionSource'
32
+ import {
33
+ flattenVisibleCountRough,
34
+ useRsTableVirtual,
35
+ } from './useRsTableVirtual'
36
+
37
+ /** useRsTableCore 入参:全部用 getter,避免捕获过期 props */
38
+ export interface UseRsTableCoreOptions<T extends RsTableRowData> {
39
+ columns: () => RsTableColumn<T>[]
40
+ data: () => T[]
41
+ rowKey: () => RsTableRowKey<T> | undefined
42
+ compact: () => boolean | undefined
43
+ size: () => RsTableSize | undefined
44
+ columnOrder: () => string[] | undefined
45
+ defaultColumnOrder: string[]
46
+ columnFilters: () => Record<string, string> | undefined
47
+ defaultColumnFilters: Record<string, string>
48
+ initialColumnWidths: () => Record<string, number> | undefined
49
+ resizable: () => boolean
50
+ columnLayout: () => 'auto' | 'fixed'
51
+ sort: () => RsTableSortState | null | undefined
52
+ defaultSort: RsTableSortState | null
53
+ sorts: () => RsTableSortState[] | undefined
54
+ defaultSorts: RsTableSortState[]
55
+ multiSort: () => boolean
56
+ remoteSort: () => boolean
57
+ filterText: () => string | undefined
58
+ filterKeys: () => string[] | undefined
59
+ groupBy: () => RsTableGroupBy<T> | undefined
60
+ groupLabel: () => ((key: string) => string) | undefined
61
+ treeConfig: () => RsTableTreeConfig<T> | undefined
62
+ expandable: () => boolean
63
+ rowExpandable: () => ((row: T, index: number) => boolean) | undefined
64
+ selectedRowKeys: () => string[] | undefined
65
+ defaultSelectedRowKeys: string[]
66
+ expandedRowKeys: () => string[] | undefined
67
+ defaultExpandedRowKeys: string[]
68
+ rowSelectable: () => ((row: T, index: number) => boolean) | undefined
69
+ height: () => number | string | undefined
70
+ layoutActive: () => boolean | undefined
71
+ viewKey: () => string | number | undefined
72
+ virtual: () => boolean | undefined
73
+ virtualAutoThreshold: () => number
74
+ fill: () => boolean
75
+ infinite: () => boolean
76
+ virtualOnInfinite: () => boolean
77
+ overscan: () => number
78
+ expandRowHeight: () => number | undefined
79
+ rowHeight: () => number | undefined
80
+ selectable: () => boolean
81
+ editable: () => boolean
82
+ contextMenu: () => boolean
83
+ /** 汇总 feature 是否启用(由 Summary composable 或轻量判定注入) */
84
+ summaryFeatureEnabled: () => boolean
85
+ features: () => RsTableFeature<T>[] | undefined
86
+ emit: UseRsTableColumnsEmit & UseRsTableEngineEmit
87
+ }
88
+
89
+ /**
90
+ * 装配表格内核状态。
91
+ */
92
+ export function useRsTableCore<T extends RsTableRowData>(options: UseRsTableCoreOptions<T>) {
93
+ const treeModeEarly = computed(() => Boolean(options.treeConfig()))
94
+ const treeExpandColumnKeyEarly = computed(() => {
95
+ const tree = options.treeConfig()
96
+ if (!tree) return null
97
+ return tree.expandColumnKey ?? options.columns()[0]?.key ?? null
98
+ })
99
+ const treeFixExpandColumnEarly = computed(() => options.treeConfig()?.fixExpandColumn !== false)
100
+
101
+ const columnsApi = useRsTableColumns<T>({
102
+ columns: () => options.columns(),
103
+ columnOrder: () => options.columnOrder(),
104
+ defaultColumnOrder: options.defaultColumnOrder,
105
+ columnFilters: () => options.columnFilters(),
106
+ defaultColumnFilters: options.defaultColumnFilters,
107
+ initialColumnWidths: () => options.initialColumnWidths(),
108
+ resizable: () => options.resizable(),
109
+ columnLayout: () => options.columnLayout(),
110
+ treeMode: treeModeEarly,
111
+ treeFixExpandColumn: treeFixExpandColumnEarly,
112
+ treeExpandColumnKey: treeExpandColumnKeyEarly,
113
+ emit: options.emit,
114
+ })
115
+
116
+ const resolvedSize = computed(() => resolveTableSize(options.compact(), options.size()))
117
+
118
+ const engine = useRsTableEngine<T>({
119
+ data: () => options.data(),
120
+ displayColumns: () => columnsApi.displayColumns.value,
121
+ rowKey: () => options.rowKey(),
122
+ sort: () => options.sort(),
123
+ defaultSort: options.defaultSort,
124
+ sorts: () => options.sorts(),
125
+ defaultSorts: options.defaultSorts,
126
+ multiSort: () => options.multiSort(),
127
+ remoteSort: () => options.remoteSort(),
128
+ filterText: () => options.filterText(),
129
+ filterKeys: () => options.filterKeys(),
130
+ columnFilters: () => columnsApi.columnFiltersState.value,
131
+ groupBy: () => options.groupBy(),
132
+ groupLabel: () => options.groupLabel(),
133
+ treeConfig: () => options.treeConfig(),
134
+ expandable: () => options.expandable(),
135
+ rowExpandable: () => options.rowExpandable(),
136
+ selectedRowKeys: () => options.selectedRowKeys(),
137
+ defaultSelectedRowKeys: options.defaultSelectedRowKeys,
138
+ expandedRowKeys: () => options.expandedRowKeys(),
139
+ defaultExpandedRowKeys: options.defaultExpandedRowKeys,
140
+ rowSelectable: () => options.rowSelectable(),
141
+ size: resolvedSize,
142
+ emit: options.emit,
143
+ })
144
+
145
+ /** 树表阈值粗算:不构建完整 entries,避免与 virtual 循环依赖 */
146
+ const tableEntriesForThreshold = computed(() => {
147
+ const tree = options.treeConfig()
148
+ if (!tree) return options.data().length
149
+ return flattenVisibleCountRough(options.data(), engine.expandedKeySet.value, {
150
+ childrenField: engine.treeChildrenField.value,
151
+ isLeafField: engine.treeIsLeafField.value,
152
+ lazy: engine.treeLazy.value,
153
+ rowKey: options.rowKey(),
154
+ })
155
+ })
156
+
157
+ const scroll = useRsTableScrollLayout({
158
+ height: () => options.height(),
159
+ layoutActive: () => options.layoutActive(),
160
+ viewKey: () => options.viewKey(),
161
+ })
162
+
163
+ const fixedRowHeight = computed(() =>
164
+ resolveTableRowHeight(resolvedSize.value, options.rowHeight()),
165
+ )
166
+
167
+ const virtual = useRsTableVirtual<T>({
168
+ dataLength: () => options.data().length,
169
+ treeMode: engine.treeMode,
170
+ tableEntriesForThreshold,
171
+ virtual: () => options.virtual(),
172
+ virtualAutoThreshold: () => options.virtualAutoThreshold(),
173
+ fill: () => options.fill(),
174
+ infinite: () => options.infinite(),
175
+ virtualOnInfinite: () => options.virtualOnInfinite(),
176
+ overscan: () => options.overscan(),
177
+ expandRowHeight: () => options.expandRowHeight(),
178
+ scrollTop: scroll.scrollTop,
179
+ viewportHeight: scroll.viewportHeight,
180
+ fixedRowHeight,
181
+ tableEntries: () => engine.tableEntries.value,
182
+ })
183
+
184
+ const analyticsSource = useRsTableSelectionSource<T>({
185
+ viewRows: engine.viewRows,
186
+ selectedRows: engine.selectedRows,
187
+ })
188
+
189
+ const tableSurface = useRsTable<T>()
190
+
191
+ /** 列是否可筛选:只跟 columns 引用走,避免每次访问 .some */
192
+ const hasFilterableColumn = computed(() => options.columns().some((c) => c.filterable))
193
+
194
+ const builtinFeatureIds = computed(() =>
195
+ resolveBuiltinTableFeatures({
196
+ selectable: options.selectable(),
197
+ filterable: hasFilterableColumn.value,
198
+ virtual: options.virtual() === false ? false : options.virtual() ?? 'auto',
199
+ editable: options.editable(),
200
+ tree: Boolean(options.treeConfig()),
201
+ contextMenu: options.contextMenu() !== false,
202
+ summary: options.summaryFeatureEnabled(),
203
+ }),
204
+ )
205
+
206
+ /**
207
+ * Feature 重绑签名:builtin id 集合 + 实例 feature 的 id/setup 引用。
208
+ * 不监听 data/viewRows,避免滚动/选中拆掉 analytics 订阅。
209
+ */
210
+ const featureBindSignature = computed(() => {
211
+ const extras = options.features() ?? []
212
+ return [
213
+ builtinFeatureIds.value.join('\0'),
214
+ extras.length,
215
+ ...extras.map((f) => f.id),
216
+ ...extras.map((f) => f.setup),
217
+ ] as const
218
+ })
219
+
220
+ let disposeTableFeatures: (() => void) | null = null
221
+ watch(
222
+ featureBindSignature,
223
+ () => {
224
+ disposeTableFeatures?.()
225
+ disposeTableFeatures = tableSurface.bindFeatures({
226
+ builtinIds: builtinFeatureIds.value,
227
+ instanceFeatures: options.features() ?? null,
228
+ getViewRows: () => engine.viewRows.value,
229
+ getSelectedRows: () => engine.selectedRows.value,
230
+ getAnalyticsSnapshot: () => analyticsSource.getSnapshot(),
231
+ subscribeAnalytics: (listener) => analyticsSource.subscribe(listener),
232
+ })
233
+ },
234
+ { immediate: true },
235
+ )
236
+
237
+ onUnmounted(() => {
238
+ disposeTableFeatures?.()
239
+ disposeTableFeatures = null
240
+ })
241
+
242
+ return {
243
+ resolvedSize,
244
+ fixedRowHeight,
245
+ tableEntriesForThreshold,
246
+ ...columnsApi,
247
+ ...engine,
248
+ ...scroll,
249
+ ...virtual,
250
+ analyticsSource,
251
+ tableSurface,
252
+ builtinFeatureIds,
253
+ }
254
+ }
255
+
256
+ export type RsTableCoreApi<T extends RsTableRowData> = ReturnType<typeof useRsTableCore<T>>