@agile-team/mach-table-vue 0.13.0 → 0.15.0
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.
- package/README.md +15 -3
- package/dist/MachTable-BRFSPNPU.js +2 -0
- package/dist/MachTable-DH0offab.d.cts +34 -0
- package/dist/MachTable-DH0offab.d.ts +34 -0
- package/dist/MachTable-QMK4VFAQ.cjs +2 -0
- package/dist/{MachTable-ESOIV4CZ.cjs.map → MachTable-QMK4VFAQ.cjs.map} +1 -1
- package/dist/MachTableToolbar-CDkTtitl.d.cts +97 -0
- package/dist/MachTableToolbar-CDkTtitl.d.ts +97 -0
- package/dist/async.cjs +1 -1
- package/dist/async.d.cts +6 -5
- package/dist/async.d.ts +6 -5
- package/dist/async.js +1 -1
- package/dist/chunk-2PKCB3CZ.js +2 -0
- package/dist/chunk-2PKCB3CZ.js.map +1 -0
- package/dist/chunk-4SM5YZDC.js +2 -0
- package/dist/chunk-4SM5YZDC.js.map +1 -0
- package/dist/chunk-6WNTYC5G.js +2 -0
- package/dist/chunk-6WNTYC5G.js.map +1 -0
- package/dist/{chunk-BE4RGLUC.cjs → chunk-C7C5I2H4.cjs} +2 -2
- package/dist/{chunk-BE4RGLUC.cjs.map → chunk-C7C5I2H4.cjs.map} +1 -1
- package/dist/{chunk-7U5IML5K.js → chunk-H75IY5SP.js} +2 -2
- package/dist/chunk-H75IY5SP.js.map +1 -0
- package/dist/chunk-L6HN564Y.cjs +2 -0
- package/dist/chunk-L6HN564Y.cjs.map +1 -0
- package/dist/chunk-OMEMLONJ.cjs +2 -0
- package/dist/chunk-OMEMLONJ.cjs.map +1 -0
- package/dist/chunk-YN3M2NPO.cjs +2 -0
- package/dist/{chunk-Z6YS22CL.cjs.map → chunk-YN3M2NPO.cjs.map} +1 -1
- package/dist/globalRegistration-BhAR-B5k.d.cts +19 -0
- package/dist/globalRegistration-DTWLNxPI.d.ts +19 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mach-table.css +110 -3
- package/dist/ui.cjs +2 -0
- package/dist/ui.cjs.map +1 -0
- package/dist/ui.d.cts +10 -0
- package/dist/ui.d.ts +10 -0
- package/dist/ui.js +2 -0
- package/dist/ui.js.map +1 -0
- package/dist/{workflows-Dg6KsN85.d.cts → workflows-BXccx4zn.d.cts} +29 -4
- package/dist/{workflows-Dg6KsN85.d.ts → workflows-CvAptGOH.d.ts} +29 -4
- package/dist/workflows.cjs +1 -1
- package/dist/workflows.cjs.map +1 -1
- package/dist/workflows.d.cts +2 -1
- package/dist/workflows.d.ts +2 -1
- package/dist/workflows.js +1 -1
- package/package.json +12 -2
- package/dist/MachTable-ESOIV4CZ.cjs +0 -2
- package/dist/MachTable-USYTNQV5.js +0 -2
- package/dist/chunk-7U5IML5K.js.map +0 -1
- package/dist/chunk-E7KTBMM6.js +0 -2
- package/dist/chunk-E7KTBMM6.js.map +0 -1
- package/dist/chunk-ICHFPO5U.js +0 -2
- package/dist/chunk-ICHFPO5U.js.map +0 -1
- package/dist/chunk-MVK2O7FM.cjs +0 -2
- package/dist/chunk-MVK2O7FM.cjs.map +0 -1
- package/dist/chunk-Y6OAV3U4.cjs +0 -2
- package/dist/chunk-Y6OAV3U4.cjs.map +0 -1
- package/dist/chunk-Z6YS22CL.cjs +0 -2
- package/dist/chunk-ZUOKB5ID.js +0 -2
- package/dist/chunk-ZUOKB5ID.js.map +0 -1
- package/dist/globalRegistration-ySQgs7aA.d.cts +0 -86
- package/dist/globalRegistration-ySQgs7aA.d.ts +0 -86
- /package/dist/{MachTable-USYTNQV5.js.map → MachTable-BRFSPNPU.js.map} +0 -0
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
# @agile-team/mach-table-vue
|
|
6
6
|
|
|
7
|
-
Official Vue 3 adapter for MachTable 0.
|
|
7
|
+
Official Vue 3 adapter for MachTable 0.15. It provides a generic `<MachTable>`, native typed slots, dedicated app/route configuration, cohesive controllers, auto/manual remote query, editing composables, optional and persistent column resizing, an optional standard toolbar, optional Element Plus editors, async boundaries, atomic reactive updates and automatic lifecycle cleanup. `RobotGrid` remains a deprecated 0.x alias.
|
|
8
8
|
|
|
9
9
|
## Install
|
|
10
10
|
|
|
@@ -41,7 +41,9 @@ const columns: ColDef<Row>[] = [{ field: "name", headerName: "Name", flex: 1 }];
|
|
|
41
41
|
:ref="grid.ref"
|
|
42
42
|
:row-data="rows"
|
|
43
43
|
:column-defs="columns"
|
|
44
|
-
|
|
44
|
+
row-key="id"
|
|
45
|
+
state-key="customer-list"
|
|
46
|
+
enable-column-resize
|
|
45
47
|
striped-rows
|
|
46
48
|
/>
|
|
47
49
|
</div>
|
|
@@ -79,6 +81,13 @@ createApp(App).use(AsyncMachTablePlugin).mount("#app");
|
|
|
79
81
|
void preloadMachTable();
|
|
80
82
|
```
|
|
81
83
|
|
|
84
|
+
The standard toolbar is a separate, tree-shakeable entry. Register it globally only when needed:
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
import MachTableUiPlugin from "@agile-team/mach-table-vue/ui";
|
|
88
|
+
app.use(MachTableUiPlugin);
|
|
89
|
+
```
|
|
90
|
+
|
|
82
91
|
After either global plugin is installed, pages can use `<MachTable>` directly. Keep conventions in a dedicated `mach-table.config.ts`, then install it with one clean line:
|
|
83
92
|
|
|
84
93
|
```ts
|
|
@@ -87,6 +96,7 @@ import { defineMachTableConfig, defineMachTablePreset } from "@agile-team/mach-t
|
|
|
87
96
|
export default defineMachTableConfig({
|
|
88
97
|
defaults: {
|
|
89
98
|
size: "compact",
|
|
99
|
+
enableColumnResize: true,
|
|
90
100
|
pagination: { pageSize: 20, pageSizeOptions: [20, 50, 100] },
|
|
91
101
|
defaultColDef: { sortable: true, resizable: true, filter: true }
|
|
92
102
|
},
|
|
@@ -102,7 +112,9 @@ Layouts can reactively refine defaults and presets with `provideMachTableConfig(
|
|
|
102
112
|
|
|
103
113
|
The adapter installs the matching `@agile-team/mach-table` core automatically and re-exports its complete API and types. Only `vue >= 3.2` remains a peer dependency supplied by the host application. Existing local imports remain fully supported.
|
|
104
114
|
|
|
105
|
-
Remote B-side lists can bind `useMachTableQuery()` directly. For the smallest composable-only chunk, import query/editing helpers from `@agile-team/mach-table-vue/workflows
|
|
115
|
+
Remote B-side lists can bind `useMachTableQuery()` directly. Use `mode: "auto"` for live filters or `mode: "manual"` for a submit-to-search form. For the smallest composable-only chunk, import query/editing/controller helpers from `@agile-team/mach-table-vue/workflows`. They own controlled server pagination, AbortSignal cancellation, stale-response protection, retry state and cross-page selection without exposing `gridApi` to ordinary pages.
|
|
116
|
+
|
|
117
|
+
`useMachTableController()` composes table readiness, query, editing, selection, errors and standard commands. Pair it with `MachTableToolbar` from `/ui`, or bind `controller.commands` to your own design-system toolbar.
|
|
106
118
|
|
|
107
119
|
Million-row batch actions use `selectionScope: "query"` and compact `allMatching + excludedKeys` rules, so clients never download every matching row ID.
|
|
108
120
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DefineComponent } from 'vue';
|
|
2
|
+
import { GridOptions, MachTablePresetSelection, GridApi, MachTableOptionExplanation } from '@agile-team/mach-table';
|
|
3
|
+
|
|
4
|
+
type AdapterOnlyGridOption = "className" | "ariaLabel" | "ariaLabelledBy" | "ariaDescribedBy";
|
|
5
|
+
type MachTableVueProps<TData = any> = Omit<GridOptions<TData>, AdapterOnlyGridOption> & {
|
|
6
|
+
/** Named application preset(s). Explicit table props still win. */
|
|
7
|
+
preset?: MachTablePresetSelection;
|
|
8
|
+
/** CSS class applied to the Vue host element. */
|
|
9
|
+
className?: string;
|
|
10
|
+
/** CSS class forwarded to MachTable's inner grid root. */
|
|
11
|
+
gridClassName?: string;
|
|
12
|
+
/** Accessible name forwarded to MachTable's inner role=grid element. */
|
|
13
|
+
gridAriaLabel?: string;
|
|
14
|
+
gridAriaLabelledBy?: string;
|
|
15
|
+
gridAriaDescribedBy?: string;
|
|
16
|
+
};
|
|
17
|
+
interface MachTableVueExposed<TData = any> {
|
|
18
|
+
getApi(): GridApi<TData> | null;
|
|
19
|
+
getResolvedConfig(): GridOptions<TData>;
|
|
20
|
+
explainOption(key: keyof GridOptions<TData> | string): MachTableOptionExplanation;
|
|
21
|
+
}
|
|
22
|
+
interface MachTableVueComponent extends DefineComponent<MachTableVueProps<any>> {
|
|
23
|
+
new <TData = any>(): {
|
|
24
|
+
$props: MachTableVueProps<TData>;
|
|
25
|
+
$exposed: MachTableVueExposed<TData>;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
declare const MachTable: MachTableVueComponent;
|
|
29
|
+
/** @deprecated Use MachTable. Kept as a source-compatible alias through 0.x. */
|
|
30
|
+
declare const RobotGrid: MachTableVueComponent;
|
|
31
|
+
/** @deprecated Use MachTableVueProps. */
|
|
32
|
+
type RobotGridVueProps<TData = any> = MachTableVueProps<TData>;
|
|
33
|
+
|
|
34
|
+
export { type MachTableVueComponent as M, RobotGrid as R, MachTable as a, type MachTableVueExposed as b, type MachTableVueProps as c, type RobotGridVueProps as d };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DefineComponent } from 'vue';
|
|
2
|
+
import { GridOptions, MachTablePresetSelection, GridApi, MachTableOptionExplanation } from '@agile-team/mach-table';
|
|
3
|
+
|
|
4
|
+
type AdapterOnlyGridOption = "className" | "ariaLabel" | "ariaLabelledBy" | "ariaDescribedBy";
|
|
5
|
+
type MachTableVueProps<TData = any> = Omit<GridOptions<TData>, AdapterOnlyGridOption> & {
|
|
6
|
+
/** Named application preset(s). Explicit table props still win. */
|
|
7
|
+
preset?: MachTablePresetSelection;
|
|
8
|
+
/** CSS class applied to the Vue host element. */
|
|
9
|
+
className?: string;
|
|
10
|
+
/** CSS class forwarded to MachTable's inner grid root. */
|
|
11
|
+
gridClassName?: string;
|
|
12
|
+
/** Accessible name forwarded to MachTable's inner role=grid element. */
|
|
13
|
+
gridAriaLabel?: string;
|
|
14
|
+
gridAriaLabelledBy?: string;
|
|
15
|
+
gridAriaDescribedBy?: string;
|
|
16
|
+
};
|
|
17
|
+
interface MachTableVueExposed<TData = any> {
|
|
18
|
+
getApi(): GridApi<TData> | null;
|
|
19
|
+
getResolvedConfig(): GridOptions<TData>;
|
|
20
|
+
explainOption(key: keyof GridOptions<TData> | string): MachTableOptionExplanation;
|
|
21
|
+
}
|
|
22
|
+
interface MachTableVueComponent extends DefineComponent<MachTableVueProps<any>> {
|
|
23
|
+
new <TData = any>(): {
|
|
24
|
+
$props: MachTableVueProps<TData>;
|
|
25
|
+
$exposed: MachTableVueExposed<TData>;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
declare const MachTable: MachTableVueComponent;
|
|
29
|
+
/** @deprecated Use MachTable. Kept as a source-compatible alias through 0.x. */
|
|
30
|
+
declare const RobotGrid: MachTableVueComponent;
|
|
31
|
+
/** @deprecated Use MachTableVueProps. */
|
|
32
|
+
type RobotGridVueProps<TData = any> = MachTableVueProps<TData>;
|
|
33
|
+
|
|
34
|
+
export { type MachTableVueComponent as M, RobotGrid as R, MachTable as a, type MachTableVueExposed as b, type MachTableVueProps as c, type RobotGridVueProps as d };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkC7C5I2H4cjs = require('./chunk-C7C5I2H4.cjs');require('./chunk-OMEMLONJ.cjs');exports.MachTable = _chunkC7C5I2H4cjs.j; exports.RobotGrid = _chunkC7C5I2H4cjs.k;
|
|
2
|
+
//# sourceMappingURL=MachTable-QMK4VFAQ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["d:\\office-project\\wl\\MachTable\\packages\\vue\\dist\\MachTable-
|
|
1
|
+
{"version":3,"sources":["d:\\office-project\\wl\\MachTable\\packages\\vue\\dist\\MachTable-QMK4VFAQ.cjs"],"names":[],"mappings":"AAAA,iIAA+C,gCAA6B,iFAAsC","file":"D:\\office-project\\wl\\MachTable\\packages\\vue\\dist\\MachTable-QMK4VFAQ.cjs"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as vue from 'vue';
|
|
2
|
+
import { PropType } from 'vue';
|
|
3
|
+
import { GridApi, MachTableCommands } from '@agile-team/mach-table';
|
|
4
|
+
|
|
5
|
+
interface MachTableToolbarFeatures {
|
|
6
|
+
search?: boolean;
|
|
7
|
+
refresh?: boolean;
|
|
8
|
+
columns?: boolean;
|
|
9
|
+
density?: boolean;
|
|
10
|
+
export?: boolean;
|
|
11
|
+
undoRedo?: boolean;
|
|
12
|
+
fullscreen?: boolean;
|
|
13
|
+
}
|
|
14
|
+
declare const MachTableToolbar: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
15
|
+
api: {
|
|
16
|
+
type: PropType<GridApi<any> | null>;
|
|
17
|
+
default: null;
|
|
18
|
+
};
|
|
19
|
+
commands: {
|
|
20
|
+
type: PropType<MachTableCommands | null>;
|
|
21
|
+
default: null;
|
|
22
|
+
};
|
|
23
|
+
modelValue: {
|
|
24
|
+
type: StringConstructor;
|
|
25
|
+
default: string;
|
|
26
|
+
};
|
|
27
|
+
loading: {
|
|
28
|
+
type: BooleanConstructor;
|
|
29
|
+
default: boolean;
|
|
30
|
+
};
|
|
31
|
+
selectedCount: {
|
|
32
|
+
type: NumberConstructor;
|
|
33
|
+
default: number;
|
|
34
|
+
};
|
|
35
|
+
searchPlaceholder: {
|
|
36
|
+
type: StringConstructor;
|
|
37
|
+
default: string;
|
|
38
|
+
};
|
|
39
|
+
exportFilename: {
|
|
40
|
+
type: StringConstructor;
|
|
41
|
+
default: string;
|
|
42
|
+
};
|
|
43
|
+
features: {
|
|
44
|
+
type: PropType<MachTableToolbarFeatures>;
|
|
45
|
+
default: () => {};
|
|
46
|
+
};
|
|
47
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
48
|
+
[key: string]: any;
|
|
49
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("refresh" | "update:modelValue" | "clearSelection")[], "refresh" | "update:modelValue" | "clearSelection", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
50
|
+
api: {
|
|
51
|
+
type: PropType<GridApi<any> | null>;
|
|
52
|
+
default: null;
|
|
53
|
+
};
|
|
54
|
+
commands: {
|
|
55
|
+
type: PropType<MachTableCommands | null>;
|
|
56
|
+
default: null;
|
|
57
|
+
};
|
|
58
|
+
modelValue: {
|
|
59
|
+
type: StringConstructor;
|
|
60
|
+
default: string;
|
|
61
|
+
};
|
|
62
|
+
loading: {
|
|
63
|
+
type: BooleanConstructor;
|
|
64
|
+
default: boolean;
|
|
65
|
+
};
|
|
66
|
+
selectedCount: {
|
|
67
|
+
type: NumberConstructor;
|
|
68
|
+
default: number;
|
|
69
|
+
};
|
|
70
|
+
searchPlaceholder: {
|
|
71
|
+
type: StringConstructor;
|
|
72
|
+
default: string;
|
|
73
|
+
};
|
|
74
|
+
exportFilename: {
|
|
75
|
+
type: StringConstructor;
|
|
76
|
+
default: string;
|
|
77
|
+
};
|
|
78
|
+
features: {
|
|
79
|
+
type: PropType<MachTableToolbarFeatures>;
|
|
80
|
+
default: () => {};
|
|
81
|
+
};
|
|
82
|
+
}>> & Readonly<{
|
|
83
|
+
onRefresh?: ((...args: any[]) => any) | undefined;
|
|
84
|
+
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
85
|
+
onClearSelection?: ((...args: any[]) => any) | undefined;
|
|
86
|
+
}>, {
|
|
87
|
+
features: MachTableToolbarFeatures;
|
|
88
|
+
loading: boolean;
|
|
89
|
+
selectedCount: number;
|
|
90
|
+
api: GridApi<any> | null;
|
|
91
|
+
commands: MachTableCommands | null;
|
|
92
|
+
modelValue: string;
|
|
93
|
+
searchPlaceholder: string;
|
|
94
|
+
exportFilename: string;
|
|
95
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
96
|
+
|
|
97
|
+
export { MachTableToolbar as M, type MachTableToolbarFeatures as a };
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as vue from 'vue';
|
|
2
|
+
import { PropType } from 'vue';
|
|
3
|
+
import { GridApi, MachTableCommands } from '@agile-team/mach-table';
|
|
4
|
+
|
|
5
|
+
interface MachTableToolbarFeatures {
|
|
6
|
+
search?: boolean;
|
|
7
|
+
refresh?: boolean;
|
|
8
|
+
columns?: boolean;
|
|
9
|
+
density?: boolean;
|
|
10
|
+
export?: boolean;
|
|
11
|
+
undoRedo?: boolean;
|
|
12
|
+
fullscreen?: boolean;
|
|
13
|
+
}
|
|
14
|
+
declare const MachTableToolbar: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
15
|
+
api: {
|
|
16
|
+
type: PropType<GridApi<any> | null>;
|
|
17
|
+
default: null;
|
|
18
|
+
};
|
|
19
|
+
commands: {
|
|
20
|
+
type: PropType<MachTableCommands | null>;
|
|
21
|
+
default: null;
|
|
22
|
+
};
|
|
23
|
+
modelValue: {
|
|
24
|
+
type: StringConstructor;
|
|
25
|
+
default: string;
|
|
26
|
+
};
|
|
27
|
+
loading: {
|
|
28
|
+
type: BooleanConstructor;
|
|
29
|
+
default: boolean;
|
|
30
|
+
};
|
|
31
|
+
selectedCount: {
|
|
32
|
+
type: NumberConstructor;
|
|
33
|
+
default: number;
|
|
34
|
+
};
|
|
35
|
+
searchPlaceholder: {
|
|
36
|
+
type: StringConstructor;
|
|
37
|
+
default: string;
|
|
38
|
+
};
|
|
39
|
+
exportFilename: {
|
|
40
|
+
type: StringConstructor;
|
|
41
|
+
default: string;
|
|
42
|
+
};
|
|
43
|
+
features: {
|
|
44
|
+
type: PropType<MachTableToolbarFeatures>;
|
|
45
|
+
default: () => {};
|
|
46
|
+
};
|
|
47
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
48
|
+
[key: string]: any;
|
|
49
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("refresh" | "update:modelValue" | "clearSelection")[], "refresh" | "update:modelValue" | "clearSelection", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
50
|
+
api: {
|
|
51
|
+
type: PropType<GridApi<any> | null>;
|
|
52
|
+
default: null;
|
|
53
|
+
};
|
|
54
|
+
commands: {
|
|
55
|
+
type: PropType<MachTableCommands | null>;
|
|
56
|
+
default: null;
|
|
57
|
+
};
|
|
58
|
+
modelValue: {
|
|
59
|
+
type: StringConstructor;
|
|
60
|
+
default: string;
|
|
61
|
+
};
|
|
62
|
+
loading: {
|
|
63
|
+
type: BooleanConstructor;
|
|
64
|
+
default: boolean;
|
|
65
|
+
};
|
|
66
|
+
selectedCount: {
|
|
67
|
+
type: NumberConstructor;
|
|
68
|
+
default: number;
|
|
69
|
+
};
|
|
70
|
+
searchPlaceholder: {
|
|
71
|
+
type: StringConstructor;
|
|
72
|
+
default: string;
|
|
73
|
+
};
|
|
74
|
+
exportFilename: {
|
|
75
|
+
type: StringConstructor;
|
|
76
|
+
default: string;
|
|
77
|
+
};
|
|
78
|
+
features: {
|
|
79
|
+
type: PropType<MachTableToolbarFeatures>;
|
|
80
|
+
default: () => {};
|
|
81
|
+
};
|
|
82
|
+
}>> & Readonly<{
|
|
83
|
+
onRefresh?: ((...args: any[]) => any) | undefined;
|
|
84
|
+
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
85
|
+
onClearSelection?: ((...args: any[]) => any) | undefined;
|
|
86
|
+
}>, {
|
|
87
|
+
features: MachTableToolbarFeatures;
|
|
88
|
+
loading: boolean;
|
|
89
|
+
selectedCount: number;
|
|
90
|
+
api: GridApi<any> | null;
|
|
91
|
+
commands: MachTableCommands | null;
|
|
92
|
+
modelValue: string;
|
|
93
|
+
searchPlaceholder: string;
|
|
94
|
+
exportFilename: string;
|
|
95
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
96
|
+
|
|
97
|
+
export { MachTableToolbar as M, type MachTableToolbarFeatures as a };
|
package/dist/async.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }var _chunkYN3M2NPOcjs = require('./chunk-YN3M2NPO.cjs');require('./chunk-OMEMLONJ.cjs');var _vue = require('vue');var p=()=>Promise.resolve().then(() => _interopRequireWildcard(require("./MachTable-QMK4VFAQ.cjs"))).then(({MachTable:e})=>e);function t(e={}){return _vue.defineAsyncComponent.call(void 0, {loader:p,...e})}var c=t(),i= exports.AsyncMachTablePlugin =Object.freeze({install(e,n={}){let a=n.asyncComponentOptions?t(n.asyncComponentOptions):c;_chunkYN3M2NPOcjs.a.call(void 0, e,a,n)}}),b= exports.default =i;exports.AsyncMachTable = c; exports.AsyncMachTablePlugin = i; exports.createAsyncMachTable = t; exports.default = b; exports.preloadMachTable = p;
|
|
2
2
|
//# sourceMappingURL=async.cjs.map
|
package/dist/async.d.cts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { M as MachTableVueComponent } from './MachTable-DH0offab.cjs';
|
|
2
2
|
import { Component, App } from 'vue';
|
|
3
|
-
import { M as
|
|
3
|
+
import { M as MachTablePluginOptions } from './globalRegistration-BhAR-B5k.cjs';
|
|
4
4
|
import '@agile-team/mach-table';
|
|
5
|
+
import './MachTableToolbar-CDkTtitl.cjs';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Starts loading the Vue adapter ahead of first render. The browser and bundler
|
|
8
9
|
* cache the promise, so calling this on route hover is safe and idempotent.
|
|
9
10
|
*/
|
|
10
|
-
declare const preloadMachTable: () => Promise<
|
|
11
|
+
declare const preloadMachTable: () => Promise<MachTableVueComponent>;
|
|
11
12
|
interface AsyncMachTableOptions {
|
|
12
13
|
loadingComponent?: Component;
|
|
13
14
|
errorComponent?: Component;
|
|
@@ -17,9 +18,9 @@ interface AsyncMachTableOptions {
|
|
|
17
18
|
onError?: (error: Error, retry: () => void, fail: () => void, attempts: number) => void;
|
|
18
19
|
}
|
|
19
20
|
/** Creates a route-friendly async component with optional loading/error boundaries. */
|
|
20
|
-
declare function createAsyncMachTable(options?: AsyncMachTableOptions):
|
|
21
|
+
declare function createAsyncMachTable(options?: AsyncMachTableOptions): MachTableVueComponent;
|
|
21
22
|
/** Async global component used by AsyncMachTablePlugin. */
|
|
22
|
-
declare const AsyncMachTable:
|
|
23
|
+
declare const AsyncMachTable: MachTableVueComponent;
|
|
23
24
|
interface AsyncMachTablePluginOptions extends MachTablePluginOptions {
|
|
24
25
|
asyncComponentOptions?: AsyncMachTableOptions;
|
|
25
26
|
}
|
package/dist/async.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { M as MachTableVueComponent } from './MachTable-DH0offab.js';
|
|
2
2
|
import { Component, App } from 'vue';
|
|
3
|
-
import { M as
|
|
3
|
+
import { M as MachTablePluginOptions } from './globalRegistration-DTWLNxPI.js';
|
|
4
4
|
import '@agile-team/mach-table';
|
|
5
|
+
import './MachTableToolbar-CDkTtitl.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Starts loading the Vue adapter ahead of first render. The browser and bundler
|
|
8
9
|
* cache the promise, so calling this on route hover is safe and idempotent.
|
|
9
10
|
*/
|
|
10
|
-
declare const preloadMachTable: () => Promise<
|
|
11
|
+
declare const preloadMachTable: () => Promise<MachTableVueComponent>;
|
|
11
12
|
interface AsyncMachTableOptions {
|
|
12
13
|
loadingComponent?: Component;
|
|
13
14
|
errorComponent?: Component;
|
|
@@ -17,9 +18,9 @@ interface AsyncMachTableOptions {
|
|
|
17
18
|
onError?: (error: Error, retry: () => void, fail: () => void, attempts: number) => void;
|
|
18
19
|
}
|
|
19
20
|
/** Creates a route-friendly async component with optional loading/error boundaries. */
|
|
20
|
-
declare function createAsyncMachTable(options?: AsyncMachTableOptions):
|
|
21
|
+
declare function createAsyncMachTable(options?: AsyncMachTableOptions): MachTableVueComponent;
|
|
21
22
|
/** Async global component used by AsyncMachTablePlugin. */
|
|
22
|
-
declare const AsyncMachTable:
|
|
23
|
+
declare const AsyncMachTable: MachTableVueComponent;
|
|
23
24
|
interface AsyncMachTablePluginOptions extends MachTablePluginOptions {
|
|
24
25
|
asyncComponentOptions?: AsyncMachTableOptions;
|
|
25
26
|
}
|
package/dist/async.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as o}from"./chunk-
|
|
1
|
+
import{a as o}from"./chunk-2PKCB3CZ.js";import"./chunk-6WNTYC5G.js";import{defineAsyncComponent as r}from"vue";var p=()=>import("./MachTable-BRFSPNPU.js").then(({MachTable:e})=>e);function t(e={}){return r({loader:p,...e})}var c=t(),i=Object.freeze({install(e,n={}){let a=n.asyncComponentOptions?t(n.asyncComponentOptions):c;o(e,a,n)}}),b=i;export{c as AsyncMachTable,i as AsyncMachTablePlugin,t as createAsyncMachTable,b as default,p as preloadMachTable};
|
|
2
2
|
//# sourceMappingURL=async.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{e as c,f as b,g as m}from"./chunk-6WNTYC5G.js";function p(e,n,o={}){let r=o.componentName??"MachTable";if(!r.trim())throw new Error("[MachTable] Global componentName must not be empty.");let i=new Set([r]),l=m(o);e.provide(b,l),e.provide(c,l.value.defaults??{}),o.registerRobotGridAlias!==!1&&i.add("RobotGrid");for(let a of i){let t=e.component(a);if(t&&t!==n)throw new Error(`[MachTable] Cannot register global component "${a}" because that name is already in use.`);t||e.component(a,n)}}export{p as a};
|
|
2
|
+
//# sourceMappingURL=chunk-2PKCB3CZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/globalRegistration.ts"],"sourcesContent":["import type { App, Component } from \"vue\";\nimport type { MachTable } from \"./MachTable\";\nimport type { MachTableToolbar } from \"./MachTableToolbar\";\nimport { createMachTableConfigRef, MACH_TABLE_CONFIG_KEY, MACH_TABLE_DEFAULTS_KEY } from \"./defaults\";\nimport type { MachTableRuntimeConfig } from \"./configuration\";\n\ndeclare module \"vue\" {\n export interface GlobalComponents {\n MachTable: typeof MachTable;\n RobotGrid: typeof MachTable;\n MachTableToolbar: typeof MachTableToolbar;\n }\n}\n\nexport interface MachTablePluginOptions extends MachTableRuntimeConfig {\n /** Global component name. Defaults to `MachTable`. */\n componentName?: string;\n /** Also register the backwards-compatible `RobotGrid` name. Defaults to true. */\n registerRobotGridAlias?: boolean;\n}\n\nexport function registerGlobalMachTable(\n app: App,\n component: Component,\n options: MachTablePluginOptions = {}\n): void {\n const componentName = options.componentName ?? \"MachTable\";\n if (!componentName.trim()) {\n throw new Error(\"[MachTable] Global componentName must not be empty.\");\n }\n\n const names = new Set([componentName]);\n const config = createMachTableConfigRef(options);\n app.provide(MACH_TABLE_CONFIG_KEY, config);\n app.provide(MACH_TABLE_DEFAULTS_KEY, config.value.defaults ?? {});\n if (options.registerRobotGridAlias !== false) names.add(\"RobotGrid\");\n\n for (const name of names) {\n const existing = app.component(name);\n if (existing && existing !== component) {\n throw new Error(`[MachTable] Cannot register global component \\\"${name}\\\" because that name is already in use.`);\n }\n if (!existing) app.component(name, component);\n }\n}\n"],"mappings":"sDAqBO,SAASA,EACdC,EACAC,EACAC,EAAkC,CAAC,EAC7B,CACN,IAAMC,EAAgBD,EAAQ,eAAiB,YAC/C,GAAI,CAACC,EAAc,KAAK,EACtB,MAAM,IAAI,MAAM,qDAAqD,EAGvE,IAAMC,EAAQ,IAAI,IAAI,CAACD,CAAa,CAAC,EAC/BE,EAASC,EAAyBJ,CAAO,EAC/CF,EAAI,QAAQO,EAAuBF,CAAM,EACzCL,EAAI,QAAQQ,EAAyBH,EAAO,MAAM,UAAY,CAAC,CAAC,EAC5DH,EAAQ,yBAA2B,IAAOE,EAAM,IAAI,WAAW,EAEnE,QAAWK,KAAQL,EAAO,CACxB,IAAMM,EAAWV,EAAI,UAAUS,CAAI,EACnC,GAAIC,GAAYA,IAAaT,EAC3B,MAAM,IAAI,MAAM,iDAAkDQ,CAAI,wCAAyC,EAE5GC,GAAUV,EAAI,UAAUS,EAAMR,CAAS,CAC9C,CACF","names":["registerGlobalMachTable","app","component","options","componentName","names","config","createMachTableConfigRef","MACH_TABLE_CONFIG_KEY","MACH_TABLE_DEFAULTS_KEY","name","existing"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{onScopeDispose as he,ref as Te,shallowRef as W,watch as me}from"vue";function X(){let a=Te(null),r=W(null),d=W(!1),n=0;return me(a,i=>{let f=++n;if(i&&typeof i.getApi=="function"){r.value=i.getApi(),d.value=!1;let v=r.value;v&&v.whenReady().then(()=>{n===f&&r.value===v&&!v.isDestroyed()&&(d.value=!0)})}else r.value=null,d.value=!1},{flush:"post"}),he(()=>{n++,a.value=null,r.value=null,d.value=!1}),{ref:a,api:r,ready:d}}import{computed as be,onScopeDispose as we,ref as Y,shallowRef as Z,watch as Se}from"vue";function _(a,r={}){let d=Z([]),n=Y([]),i=Y(!1),f=Z(null),v=be(()=>n.value.length>0),g=null,p=()=>{let t=a.api.value;if(!t||t.isDestroyed()){n.value=[],d.value=[];return}n.value=t.getDirtyRowIds(),d.value=t.getChanges()};Se(a.api,t=>{g?.(),g=null,p(),!(!t||t.isDestroyed())&&(g=t.addEventListener("dirtyStateChanged",p))},{immediate:!0});let R=async(t,m)=>{let T=a.api.value;if(!T||T.isDestroyed())throw new Error("[MachTable] Cannot save before the grid is ready.");if(i.value)throw new Error("[MachTable] A save operation is already in progress.");i.value=!0,f.value=null;try{let c=await T.saveChanges(t,m);return p(),r.onSaveSuccess?.(c),c}catch(c){throw f.value=c,r.onSaveError?.(c),c}finally{i.value=!1}},k=t=>{let m=a.api.value?.rollbackChanges(t)??!1;return p(),m},y=t=>{a.api.value?.markChangesSaved(t),p()},h=(t,m,T=!1)=>{let c=a.api.value,C=c?.getNodeById(t);return!c||!C||C.rowIndex<0?!1:(c.scrollToIndex(C.rowIndex,"middle"),m&&T?c.startEditingCell({rowIndex:C.rowIndex,colId:m}):!0)},u=t=>{if(!v.value)return;let m=r.beforeUnloadMessage??"\u5B58\u5728\u672A\u4FDD\u5B58\u7684\u8868\u683C\u4FEE\u6539\u3002";return t.preventDefault(),t.returnValue=m,m};return r.guardBeforeUnload&&typeof window<"u"&&window.addEventListener("beforeunload",u),we(()=>{g?.(),g=null,r.guardBeforeUnload&&typeof window<"u"&&window.removeEventListener("beforeunload",u)}),{changes:d,dirtyRowIds:n,dirty:v,saving:i,saveError:f,save:R,rollback:k,markSaved:y,reveal:h,refresh:p}}import{computed as ee,isRef as Re,nextTick as ae,onScopeDispose as Me,ref as D,shallowRef as G,watch as V}from"vue";import{getByPath as De}from"@agile-team/mach-table";function te(a){return typeof a=="function"?a():Re(a)?a.value:a}function N(a,r){return typeof a=="number"&&Number.isFinite(a)&&a>0?Math.floor(a):r}function Ce(a){return(a instanceof DOMException||typeof a=="object"&&a!=null&&"name"in a)&&a.name==="AbortError"}function le(a){let r=G([]),d=D(!1),n=G(null),i=D(N(a.initialPage,1)),f=D(N(a.pageSize,20)),v=D(0),g=G([]),p=G({}),R=D([]),k=G([]),y=new Set,h=new Set,u=new Map,t=a.quickFilterText??D(null),m=a.selectionScope??"preserve",T=a.mode!=="manual",c=D(!1),C=D(0),F=[...new Set((a.pageSizeOptions??[10,20,50,100]).map(e=>N(e,0)).filter(Boolean))];F.includes(f.value)||F.push(f.value),F.sort((e,l)=>e-l);let M=null,w=null,O=0,S=null,Q=!1,U=!1,z=!1,b=e=>{let l=typeof a.rowKey=="function"?a.rowKey(e):De(e,a.rowKey);if(l==null||String(l).length===0)throw new Error(`[MachTable] useMachTableQuery rowKey "${String(a.rowKey)}" returned an empty value.`);return String(l)},E=()=>{z=!0,R.value=c.value?[]:[...y],z=!1;let e=c.value?[...u.keys()]:[...y];k.value=e.flatMap(l=>{let o=u.get(l);return o===void 0||h.has(l)?[]:[o]}),C.value++},B=e=>c.value?!h.has(e):y.has(e),q=()=>{if(!M||M.isDestroyed())return;let e=r.value.filter(l=>B(b(l)));U=!0;try{M.setSelection(e,!0)}finally{U=!1}},j=()=>{O++,w?.abort(),w=null,S!=null&&clearTimeout(S),S=null,d.value=!1},$=(e,l)=>e.signal.aborted||l!==O,re=e=>{if(!e||!Array.isArray(e.rows)||!Number.isFinite(e.total)||e.total<0)throw new TypeError("[MachTable] Remote request must resolve to { rows: TData[], total: non-negative number }.")},ne=async(e,l,o)=>{if($(l,o))return;re(e);let s=[...e.rows];for(let P of s)b(P);r.value=s,v.value=Math.floor(e.total);for(let P of r.value){let L=b(P);B(L)?u.set(L,P):u.delete(L)}E(),a.onSuccess?.(e),await ae(),q()},oe=(e,l,o)=>{$(l,o)||Ce(e)||(n.value=e??new Error,a.onError?.(n.value))},x=async()=>{S!=null&&clearTimeout(S),S=null,w?.abort();let e=new AbortController;w=e;let l=++O;d.value=!0,n.value=null,a.keepPreviousData===!1&&(r.value=[]);try{let o=await a.request({page:i.value,pageSize:f.value,query:te(a.query),sortModel:g.value.map(s=>({...s})),filterModel:{...p.value},quickFilterText:t.value,signal:e.signal});await ne(o,e,l)}catch(o){oe(o,e,l)}finally{l===O&&(d.value=!1,w===e&&(w=null))}},K=e=>{e&&(i.value=1),S!=null&&clearTimeout(S),w&&(O++,w.abort(),w=null,d.value=!1);let l=Math.max(0,a.debounceMs??0);if(l===0){x();return}S=setTimeout(()=>{x()},l)},ie=e=>{M=e.api,ae(q)},se=e=>{Q||e.page===i.value&&e.pageSize===f.value||(i.value=e.page,f.value=e.pageSize,T&&x())},ue=e=>{Q||(g.value=e.sortModel.map(l=>({...l})),T?K(!0):i.value=1)},ce=e=>{Q||(p.value={...e.filterModel},a.clearSelectionOnQueryChange!==!1&&A(),T?K(!0):i.value=1)},de=e=>{if(U)return;let l=new Set(r.value.map(b)),o=new Set(e.selectedRows.map(b));if(c.value){for(let s of l)o.has(s)?h.delete(s):(h.add(s),u.delete(s));for(let s of e.selectedRows)u.set(b(s),s);E();return}if(m==="page")y.clear(),u.clear();else for(let s of l)y.delete(s),u.delete(s);for(let s of e.selectedRows){let P=b(s);y.add(P),u.set(P,s)}E()},J=ee(()=>({rowData:r.value,loading:d.value,rowKey:b,manualSorting:!0,manualFiltering:!0,quickFilterText:t.value,error:n.value,overlayErrorTemplate:n.value?()=>a.errorOverlay?.({error:n.value,retry:x})??"Remote request failed. Please retry.":void 0,overlayNoRowsTemplate:a.emptyOverlay,pagination:{mode:"server",page:i.value,pageSize:f.value,pageSizeOptions:F,total:v.value,showTotal:!0,showPageSizeSelector:!0},onGridReady:ie,onPaginationChanged:se,onSortChanged:ue,onFilterChanged:ce,onSelectionChanged:de})),fe=async(e={})=>{e.resetPage&&(i.value=1),await x()},ve=async()=>{i.value=1,g.value=[],p.value={},A(),Q=!0;try{M?.setSortModel(null),M?.setFilterModel(null)}finally{Q=!1}await x()},A=()=>{c.value=!1,y.clear(),h.clear(),u.clear(),E(),U=!0;try{M?.deselectAll()}finally{U=!1}},ye=()=>{c.value=!0,y.clear(),h.clear(),u.clear();for(let e of r.value)u.set(b(e),e);E(),q()},ge=e=>{y.clear(),h.clear(),u.clear(),c.value=e.mode==="allMatching";let l=e.mode==="allMatching"?e.excludedKeys:e.selectedKeys;for(let o of l.map(String))e.mode==="allMatching"?h.add(o):y.add(o);for(let o of r.value){let s=b(o);B(s)&&u.set(s,o)}E(),q()},pe=ee(()=>(C.value,c.value?{mode:"allMatching",excludedKeys:[...h]}:{mode:"explicit",selectedKeys:[...y]}));return V(()=>te(a.query),()=>{a.clearSelectionOnQueryChange!==!1&&A(),T?K(!0):i.value=1},{deep:!0,immediate:T&&a.immediate!==!1}),V(t,()=>{a.clearSelectionOnQueryChange!==!1&&A(),T?K(!0):i.value=1}),V(R,e=>{if(z)return;c.value=!1,h.clear();let l=new Set(e.map(String));y.clear();for(let o of l)y.add(o);for(let o of[...u.keys()])l.has(o)||u.delete(o);for(let o of r.value){let s=b(o);l.has(s)&&u.set(s,o)}q(),E()},{deep:!0,flush:"sync"}),Me(()=>{j(),M=null}),{rows:r,loading:d,error:n,page:i,pageSize:f,total:v,sortModel:g,filterModel:p,selectedKeys:R,selectedRows:k,selectionState:pe,gridProps:J,bindings:J,reload:fe,retry:x,reset:ve,abort:j,clearSelection:A,selectAllMatching:ye,applySelectionState:ge}}import{computed as I,onScopeDispose as Ee,ref as xe,shallowRef as Pe,watch as H}from"vue";import{createMachTableCommands as ke}from"@agile-team/mach-table";function Ve(a={}){let r=X(),d=xe(a.initialSearch??""),n=a.query?le({...a.query,quickFilterText:a.query.quickFilterText??I(()=>d.value||null)}):null,i=_(r,a.editing),f=Pe([]),v=null,g=()=>{f.value=n?.selectedRows.value??r.api.value?.getSelectedRows()??[]};H(r.api,t=>{v?.(),v=null,t&&!t.isDestroyed()&&(v=t.addEventListener("selectionChanged",g)),g()},{immediate:!0}),n&&H(n.selectedRows,g,{deep:!1});let p=async()=>{if(n)await n.reload();else{let t=r.api.value;t?.isInfinite()?await t.reload():t?.refreshCells()}},R=ke({getApi:()=>r.api.value,reload:p}),k=I(()=>n?.bindings.value??{}),y=I(()=>{if(!n)return f.value.length;let t=n.selectionState.value;return t.mode==="allMatching"?Math.max(0,n.total.value-t.excludedKeys.length):t.selectedKeys.length}),h=I(()=>n?.loading.value===!0||i.saving.value),u=I(()=>n?.error.value??i.saveError.value??null);return H(d,t=>{n||R.search(t||null)}),Ee(()=>{v?.(),v=null}),{table:r,query:n,editing:i,bindings:k,search:d,selectedRows:f,selectedCount:y,busy:h,error:u,commands:R,reload:p}}export{X as a,_ as b,le as c,Ve as d};
|
|
2
|
+
//# sourceMappingURL=chunk-4SM5YZDC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/useMachTable.ts","../src/useMachTableEditing.ts","../src/useMachTableQuery.ts","../src/useMachTableController.ts"],"sourcesContent":["import { onScopeDispose, ref, shallowRef, watch, type Ref, type ShallowRef } from \"vue\";\nimport type { GridApi } from \"@agile-team/mach-table\";\nimport type { MachTableVueExposed } from \"./MachTable\";\n\nexport interface UseMachTableReturn<TData = any> {\n ref: Ref<MachTableVueExposed<TData> | null>;\n api: ShallowRef<GridApi<TData> | null>;\n ready: ShallowRef<boolean>;\n}\n\nexport function useMachTable<TData = any>(): UseMachTableReturn<TData> {\n const componentRef = ref<MachTableVueExposed<TData> | null>(null) as Ref<MachTableVueExposed<TData> | null>;\n const api = shallowRef<GridApi<TData> | null>(null);\n const ready = shallowRef(false);\n let generation = 0;\n\n watch(\n componentRef,\n (comp) => {\n const currentGeneration = ++generation;\n if (comp && typeof comp.getApi === \"function\") {\n api.value = comp.getApi();\n ready.value = false;\n const currentApi = api.value;\n if (currentApi) {\n void currentApi.whenReady().then(() => {\n if (generation === currentGeneration && api.value === currentApi && !currentApi.isDestroyed()) {\n ready.value = true;\n }\n });\n }\n } else {\n api.value = null;\n ready.value = false;\n }\n },\n { flush: \"post\" }\n );\n\n onScopeDispose(() => {\n generation++;\n componentRef.value = null;\n api.value = null;\n ready.value = false;\n });\n\n return { ref: componentRef, api, ready };\n}\n","import {\n computed,\n onScopeDispose,\n ref,\n shallowRef,\n watch,\n type ComputedRef,\n type Ref,\n type ShallowRef\n} from \"vue\";\nimport type {\n GridChange,\n SaveChangesHandler\n} from \"@agile-team/mach-table\";\nimport type { UseMachTableReturn } from \"./useMachTable\";\n\nexport interface UseMachTableEditingOptions<TData = any> {\n /** Warn before closing/reloading a browser tab with unsaved changes. */\n guardBeforeUnload?: boolean;\n beforeUnloadMessage?: string;\n onSaveSuccess?(saved: readonly GridChange<TData>[]): void;\n onSaveError?(error: unknown): void;\n}\n\nexport interface UseMachTableEditingReturn<TData = any> {\n changes: ShallowRef<GridChange<TData>[]>;\n dirtyRowIds: Ref<string[]>;\n dirty: ComputedRef<boolean>;\n saving: Ref<boolean>;\n saveError: ShallowRef<unknown | null>;\n save(handler: SaveChangesHandler<TData>, rowIds?: readonly string[]): Promise<GridChange<TData>[]>;\n rollback(rowIds?: readonly string[]): boolean;\n markSaved(rowIds?: readonly string[]): void;\n /** Scrolls to a loaded changed row and optionally opens the failed cell editor. */\n reveal(rowId: string, colId?: string, edit?: boolean): boolean;\n refresh(): void;\n}\n\n/** Reactive dirty/save workflow layered over useMachTable(). */\nexport function useMachTableEditing<TData = any>(\n table: UseMachTableReturn<TData>,\n options: UseMachTableEditingOptions<TData> = {}\n): UseMachTableEditingReturn<TData> {\n const changes = shallowRef<GridChange<TData>[]>([]);\n const dirtyRowIds = ref<string[]>([]);\n const saving = ref(false);\n const saveError = shallowRef<unknown | null>(null);\n const dirty = computed(() => dirtyRowIds.value.length > 0);\n let removeDirtyListener: (() => void) | null = null;\n\n const refresh = (): void => {\n const api = table.api.value;\n if (!api || api.isDestroyed()) {\n dirtyRowIds.value = [];\n changes.value = [];\n return;\n }\n dirtyRowIds.value = api.getDirtyRowIds();\n changes.value = api.getChanges();\n };\n\n watch(table.api, (api) => {\n removeDirtyListener?.();\n removeDirtyListener = null;\n refresh();\n if (!api || api.isDestroyed()) return;\n removeDirtyListener = api.addEventListener(\"dirtyStateChanged\", refresh);\n }, { immediate: true });\n\n const save = async (\n handler: SaveChangesHandler<TData>,\n rowIds?: readonly string[]\n ): Promise<GridChange<TData>[]> => {\n const api = table.api.value;\n if (!api || api.isDestroyed()) throw new Error(\"[MachTable] Cannot save before the grid is ready.\");\n if (saving.value) throw new Error(\"[MachTable] A save operation is already in progress.\");\n saving.value = true;\n saveError.value = null;\n try {\n const saved = await api.saveChanges(handler, rowIds);\n refresh();\n options.onSaveSuccess?.(saved);\n return saved;\n } catch (error) {\n saveError.value = error;\n options.onSaveError?.(error);\n throw error;\n } finally {\n saving.value = false;\n }\n };\n\n const rollback = (rowIds?: readonly string[]): boolean => {\n const changed = table.api.value?.rollbackChanges(rowIds) ?? false;\n refresh();\n return changed;\n };\n const markSaved = (rowIds?: readonly string[]): void => {\n table.api.value?.markChangesSaved(rowIds);\n refresh();\n };\n const reveal = (rowId: string, colId?: string, edit = false): boolean => {\n const api = table.api.value;\n const node = api?.getNodeById(rowId);\n if (!api || !node || node.rowIndex < 0) return false;\n api.scrollToIndex(node.rowIndex, \"middle\");\n return colId && edit ? api.startEditingCell({ rowIndex: node.rowIndex, colId }) : true;\n };\n\n const onBeforeUnload = (event: BeforeUnloadEvent): string | undefined => {\n if (!dirty.value) return undefined;\n const message = options.beforeUnloadMessage ?? \"存在未保存的表格修改。\";\n event.preventDefault();\n event.returnValue = message;\n return message;\n };\n if (options.guardBeforeUnload && typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", onBeforeUnload);\n }\n\n onScopeDispose(() => {\n removeDirtyListener?.();\n removeDirtyListener = null;\n if (options.guardBeforeUnload && typeof window !== \"undefined\") {\n window.removeEventListener(\"beforeunload\", onBeforeUnload);\n }\n });\n\n return {\n changes,\n dirtyRowIds,\n dirty,\n saving,\n saveError,\n save,\n rollback,\n markSaved,\n reveal,\n refresh\n };\n}\n","import {\n computed,\n isRef,\n nextTick,\n onScopeDispose,\n ref,\n shallowRef,\n watch,\n type ComputedRef,\n type Ref,\n type ShallowRef\n} from \"vue\";\nimport {\n getByPath,\n type FilterChangedEvent,\n type FilterModel,\n type GridApi,\n type GridOptions,\n type OverlayContent,\n type OverlayTemplate,\n type PaginationChangedEvent,\n type SelectionChangedEvent,\n type SortChangedEvent,\n type SortModel\n} from \"@agile-team/mach-table\";\n\nexport type MachTableQuerySource<TQuery> =\n | TQuery\n | Readonly<Ref<TQuery>>\n | (() => TQuery);\n\nexport interface MachTablePageRequest<TQuery> {\n page: number;\n pageSize: number;\n query: TQuery;\n sortModel: SortModel;\n filterModel: FilterModel;\n quickFilterText: string | null;\n signal: AbortSignal;\n}\n\nexport interface MachTablePageResult<TData> {\n rows: readonly TData[];\n total: number;\n}\n\nexport type MachTableRemoteSelectionState =\n | { mode: \"explicit\"; selectedKeys: string[] }\n | { mode: \"allMatching\"; excludedKeys: string[] };\n\nexport interface UseMachTableQueryOptions<TData, TQuery = Record<string, unknown>> {\n request(params: MachTablePageRequest<TQuery>): Promise<MachTablePageResult<TData>>;\n query: MachTableQuerySource<TQuery>;\n /** Stable row key used for updates and cross-page selection. */\n rowKey: string | ((row: TData) => string | number);\n initialPage?: number;\n pageSize?: number;\n pageSizeOptions?: readonly number[];\n immediate?: boolean;\n /** auto reloads when query/grid criteria change; manual waits for reload/reset. */\n mode?: \"auto\" | \"manual\";\n debounceMs?: number;\n keepPreviousData?: boolean;\n /** `query` additionally enables compact select-all-matching rules. */\n selectionScope?: \"page\" | \"preserve\" | \"query\";\n /** Defaults true: a different business/filter query cannot inherit stale selections. */\n clearSelectionOnQueryChange?: boolean;\n quickFilterText?: Ref<string | null>;\n /** Renders inside the first-class error overlay for the latest failed request. */\n errorOverlay?(context: { error: unknown; retry(): Promise<void> }): OverlayContent;\n emptyOverlay?: OverlayTemplate;\n onSuccess?(result: MachTablePageResult<TData>): void;\n onError?(error: unknown): void;\n}\n\nexport interface UseMachTableQueryReturn<TData> {\n rows: ShallowRef<TData[]>;\n loading: Ref<boolean>;\n error: ShallowRef<unknown | null>;\n page: Ref<number>;\n pageSize: Ref<number>;\n total: Ref<number>;\n sortModel: ShallowRef<SortModel>;\n filterModel: ShallowRef<FilterModel>;\n selectedKeys: Ref<string[]>;\n selectedRows: ShallowRef<TData[]>;\n selectionState: ComputedRef<MachTableRemoteSelectionState>;\n gridProps: ComputedRef<GridOptions<TData>>;\n bindings: ComputedRef<GridOptions<TData>>;\n reload(options?: { resetPage?: boolean }): Promise<void>;\n retry(): Promise<void>;\n reset(): Promise<void>;\n abort(): void;\n clearSelection(): void;\n /** Selects the complete server query without downloading every row ID. */\n selectAllMatching(): void;\n applySelectionState(state: MachTableRemoteSelectionState): void;\n}\n\nfunction readSource<T>(source: MachTableQuerySource<T>): T {\n if (typeof source === \"function\") return (source as () => T)();\n return isRef(source) ? source.value : source;\n}\n\nfunction normalizePositive(value: number | undefined, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? Math.floor(value)\n : fallback;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException\n ? error.name === \"AbortError\"\n : typeof error === \"object\" && error != null && \"name\" in error && (error as { name?: unknown }).name === \"AbortError\";\n}\n\n/**\n * B-side remote-list controller: paging, sorting, filtering, cancellation,\n * stale-response protection and cross-page selection in one typed binding.\n */\nexport function useMachTableQuery<TData, TQuery = Record<string, unknown>>(\n options: UseMachTableQueryOptions<TData, TQuery>\n): UseMachTableQueryReturn<TData> {\n const rows = shallowRef<TData[]>([]);\n const loading = ref(false);\n const error = shallowRef<unknown | null>(null);\n const page = ref(normalizePositive(options.initialPage, 1));\n const pageSize = ref(normalizePositive(options.pageSize, 20));\n const total = ref(0);\n const sortModel = shallowRef<SortModel>([]);\n const filterModel = shallowRef<FilterModel>({});\n const selectedKeys = ref<string[]>([]);\n const selectedRows = shallowRef<TData[]>([]);\n const selectedIds = new Set<string>();\n const excludedIds = new Set<string>();\n const selectedById = new Map<string, TData>();\n const quickFilterText = options.quickFilterText ?? ref<string | null>(null);\n const selectionScope = options.selectionScope ?? \"preserve\";\n const automatic = options.mode !== \"manual\";\n const allMatching = ref(false);\n const selectionRevision = ref(0);\n const pageSizes = [...new Set((options.pageSizeOptions ?? [10, 20, 50, 100]).map((value) => normalizePositive(value, 0)).filter(Boolean))];\n if (!pageSizes.includes(pageSize.value)) pageSizes.push(pageSize.value);\n pageSizes.sort((a, b) => a - b);\n\n let api: GridApi<TData> | null = null;\n let controller: AbortController | null = null;\n let generation = 0;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let suppressGridEvents = false;\n let suppressSelectionEvents = false;\n let updatingSelectedRefs = false;\n\n const rowId = (row: TData): string => {\n const value = typeof options.rowKey === \"function\"\n ? options.rowKey(row)\n : getByPath(row, options.rowKey);\n if (value == null || String(value).length === 0) {\n throw new Error(`[MachTable] useMachTableQuery rowKey \\\"${String(options.rowKey)}\\\" returned an empty value.`);\n }\n return String(value);\n };\n\n const updateSelectedRefs = (): void => {\n updatingSelectedRefs = true;\n selectedKeys.value = allMatching.value ? [] : [...selectedIds];\n updatingSelectedRefs = false;\n const ids = allMatching.value ? [...selectedById.keys()] : [...selectedIds];\n selectedRows.value = ids.flatMap((id) => {\n const row = selectedById.get(id);\n return row === undefined || excludedIds.has(id) ? [] : [row];\n });\n selectionRevision.value++;\n };\n\n const isSelectedId = (id: string): boolean => allMatching.value\n ? !excludedIds.has(id)\n : selectedIds.has(id);\n\n const syncVisibleSelection = (): void => {\n if (!api || api.isDestroyed()) return;\n const selected = rows.value.filter((row) => isSelectedId(rowId(row)));\n suppressSelectionEvents = true;\n try {\n api.setSelection(selected, true);\n } finally {\n suppressSelectionEvents = false;\n }\n };\n\n const abort = (): void => {\n generation++;\n controller?.abort();\n controller = null;\n if (debounceTimer != null) clearTimeout(debounceTimer);\n debounceTimer = null;\n loading.value = false;\n };\n\n const isStaleRequest = (activeController: AbortController, requestGeneration: number): boolean =>\n activeController.signal.aborted || requestGeneration !== generation;\n\n const validatePageResult = (result: MachTablePageResult<TData>): void => {\n if (!result || !Array.isArray(result.rows) || !Number.isFinite(result.total) || result.total < 0) {\n throw new TypeError(\"[MachTable] Remote request must resolve to { rows: TData[], total: non-negative number }.\");\n }\n };\n\n const applyPageResult = async (\n result: MachTablePageResult<TData>,\n activeController: AbortController,\n requestGeneration: number\n ): Promise<void> => {\n if (isStaleRequest(activeController, requestGeneration)) return;\n validatePageResult(result);\n const nextRows = [...result.rows];\n for (const row of nextRows) rowId(row);\n rows.value = nextRows;\n total.value = Math.floor(result.total);\n for (const row of rows.value) {\n const id = rowId(row);\n if (isSelectedId(id)) selectedById.set(id, row);\n else selectedById.delete(id);\n }\n updateSelectedRefs();\n options.onSuccess?.(result);\n await nextTick();\n syncVisibleSelection();\n };\n\n const handleRequestError = (\n requestError: unknown,\n activeController: AbortController,\n requestGeneration: number\n ): void => {\n if (isStaleRequest(activeController, requestGeneration) || isAbortError(requestError)) return;\n error.value = requestError ?? new Error();\n options.onError?.(error.value);\n };\n\n const load = async (): Promise<void> => {\n if (debounceTimer != null) clearTimeout(debounceTimer);\n debounceTimer = null;\n controller?.abort();\n const activeController = new AbortController();\n controller = activeController;\n const requestGeneration = ++generation;\n loading.value = true;\n error.value = null;\n if (options.keepPreviousData === false) rows.value = [];\n\n try {\n const result = await options.request({\n page: page.value,\n pageSize: pageSize.value,\n query: readSource(options.query),\n sortModel: sortModel.value.map((item) => ({ ...item })),\n filterModel: { ...filterModel.value },\n quickFilterText: quickFilterText.value,\n signal: activeController.signal\n });\n await applyPageResult(result, activeController, requestGeneration);\n } catch (requestError) {\n handleRequestError(requestError, activeController, requestGeneration);\n } finally {\n if (requestGeneration === generation) {\n loading.value = false;\n if (controller === activeController) controller = null;\n }\n }\n };\n\n const scheduleLoad = (resetPage: boolean): void => {\n if (resetPage) page.value = 1;\n if (debounceTimer != null) clearTimeout(debounceTimer);\n if (controller) {\n generation++;\n controller.abort();\n controller = null;\n loading.value = false;\n }\n const delay = Math.max(0, options.debounceMs ?? 0);\n if (delay === 0) {\n void load();\n return;\n }\n debounceTimer = setTimeout(() => { void load(); }, delay);\n };\n\n const onGridReady = (event: { api: GridApi<TData> }): void => {\n api = event.api;\n void nextTick(syncVisibleSelection);\n };\n const onPaginationChanged = (event: PaginationChangedEvent<TData>): void => {\n if (suppressGridEvents) return;\n if (event.page === page.value && event.pageSize === pageSize.value) return;\n page.value = event.page;\n pageSize.value = event.pageSize;\n if (automatic) void load();\n };\n const onSortChanged = (event: SortChangedEvent<TData>): void => {\n if (suppressGridEvents) return;\n sortModel.value = event.sortModel.map((item) => ({ ...item }));\n if (automatic) scheduleLoad(true);\n else page.value = 1;\n };\n const onFilterChanged = (event: FilterChangedEvent<TData>): void => {\n if (suppressGridEvents) return;\n filterModel.value = { ...event.filterModel };\n if (options.clearSelectionOnQueryChange !== false) clearSelection();\n if (automatic) scheduleLoad(true);\n else page.value = 1;\n };\n const onSelectionChanged = (event: SelectionChangedEvent<TData>): void => {\n if (suppressSelectionEvents) return;\n const visibleIds = new Set(rows.value.map(rowId));\n const nextVisibleIds = new Set(event.selectedRows.map(rowId));\n if (allMatching.value) {\n for (const id of visibleIds) {\n if (nextVisibleIds.has(id)) excludedIds.delete(id);\n else {\n excludedIds.add(id);\n selectedById.delete(id);\n }\n }\n for (const row of event.selectedRows) selectedById.set(rowId(row), row);\n updateSelectedRefs();\n return;\n }\n if (selectionScope === \"page\") {\n selectedIds.clear();\n selectedById.clear();\n } else {\n for (const id of visibleIds) {\n selectedIds.delete(id);\n selectedById.delete(id);\n }\n }\n for (const row of event.selectedRows) {\n const id = rowId(row);\n selectedIds.add(id);\n selectedById.set(id, row);\n }\n updateSelectedRefs();\n };\n\n const gridProps = computed<GridOptions<TData>>(() => ({\n rowData: rows.value,\n loading: loading.value,\n rowKey: rowId,\n manualSorting: true,\n manualFiltering: true,\n quickFilterText: quickFilterText.value,\n error: error.value,\n overlayErrorTemplate: error.value\n ? () => options.errorOverlay?.({ error: error.value, retry: load }) ?? \"Remote request failed. Please retry.\"\n : undefined,\n overlayNoRowsTemplate: options.emptyOverlay,\n pagination: {\n mode: \"server\",\n page: page.value,\n pageSize: pageSize.value,\n pageSizeOptions: pageSizes,\n total: total.value,\n showTotal: true,\n showPageSizeSelector: true\n },\n onGridReady,\n onPaginationChanged,\n onSortChanged,\n onFilterChanged,\n onSelectionChanged\n }));\n\n const reload = async (reloadOptions: { resetPage?: boolean } = {}): Promise<void> => {\n if (reloadOptions.resetPage) page.value = 1;\n await load();\n };\n const reset = async (): Promise<void> => {\n page.value = 1;\n sortModel.value = [];\n filterModel.value = {};\n clearSelection();\n suppressGridEvents = true;\n try {\n api?.setSortModel(null);\n api?.setFilterModel(null);\n } finally {\n suppressGridEvents = false;\n }\n await load();\n };\n const clearSelection = (): void => {\n allMatching.value = false;\n selectedIds.clear();\n excludedIds.clear();\n selectedById.clear();\n updateSelectedRefs();\n suppressSelectionEvents = true;\n try { api?.deselectAll(); } finally { suppressSelectionEvents = false; }\n };\n const selectAllMatching = (): void => {\n allMatching.value = true;\n selectedIds.clear();\n excludedIds.clear();\n selectedById.clear();\n for (const row of rows.value) selectedById.set(rowId(row), row);\n updateSelectedRefs();\n syncVisibleSelection();\n };\n const applySelectionState = (state: MachTableRemoteSelectionState): void => {\n selectedIds.clear();\n excludedIds.clear();\n selectedById.clear();\n allMatching.value = state.mode === \"allMatching\";\n const ids = state.mode === \"allMatching\" ? state.excludedKeys : state.selectedKeys;\n for (const id of ids.map(String)) {\n if (state.mode === \"allMatching\") excludedIds.add(id);\n else selectedIds.add(id);\n }\n for (const row of rows.value) {\n const id = rowId(row);\n if (isSelectedId(id)) selectedById.set(id, row);\n }\n updateSelectedRefs();\n syncVisibleSelection();\n };\n\n const selectionState = computed<MachTableRemoteSelectionState>(() => {\n void selectionRevision.value;\n return allMatching.value\n ? { mode: \"allMatching\", excludedKeys: [...excludedIds] }\n : { mode: \"explicit\", selectedKeys: [...selectedIds] };\n });\n\n watch(\n () => readSource(options.query),\n () => {\n if (options.clearSelectionOnQueryChange !== false) clearSelection();\n if (automatic) scheduleLoad(true);\n else page.value = 1;\n },\n { deep: true, immediate: automatic && options.immediate !== false }\n );\n watch(quickFilterText, () => {\n if (options.clearSelectionOnQueryChange !== false) clearSelection();\n if (automatic) scheduleLoad(true);\n else page.value = 1;\n });\n watch(selectedKeys, (keys) => {\n if (updatingSelectedRefs) return;\n allMatching.value = false;\n excludedIds.clear();\n const wanted = new Set(keys.map(String));\n selectedIds.clear();\n for (const id of wanted) selectedIds.add(id);\n for (const id of [...selectedById.keys()]) {\n if (!wanted.has(id)) selectedById.delete(id);\n }\n for (const row of rows.value) {\n const id = rowId(row);\n if (wanted.has(id)) selectedById.set(id, row);\n }\n syncVisibleSelection();\n updateSelectedRefs();\n }, { deep: true, flush: \"sync\" });\n\n onScopeDispose(() => {\n abort();\n api = null;\n });\n\n return {\n rows,\n loading,\n error,\n page,\n pageSize,\n total,\n sortModel,\n filterModel,\n selectedKeys,\n selectedRows,\n selectionState,\n gridProps,\n bindings: gridProps,\n reload,\n retry: load,\n reset,\n abort,\n clearSelection,\n selectAllMatching,\n applySelectionState\n };\n}\n","import { computed, onScopeDispose, ref, shallowRef, watch, type ComputedRef, type Ref, type ShallowRef } from \"vue\";\nimport { createMachTableCommands, type GridOptions, type MachTableCommands } from \"@agile-team/mach-table\";\nimport { useMachTable, type UseMachTableReturn } from \"./useMachTable\";\nimport { useMachTableEditing, type UseMachTableEditingOptions, type UseMachTableEditingReturn } from \"./useMachTableEditing\";\nimport { useMachTableQuery, type UseMachTableQueryOptions, type UseMachTableQueryReturn } from \"./useMachTableQuery\";\n\nexport interface UseMachTableControllerOptions<TData, TQuery = Record<string, unknown>> {\n /** Omit for local rowData; provide for a complete remote table workflow. */\n query?: UseMachTableQueryOptions<TData, TQuery>;\n editing?: UseMachTableEditingOptions<TData>;\n initialSearch?: string;\n}\n\nexport interface UseMachTableControllerReturn<TData> {\n table: UseMachTableReturn<TData>;\n query: UseMachTableQueryReturn<TData> | null;\n editing: UseMachTableEditingReturn<TData>;\n bindings: ComputedRef<GridOptions<TData>>;\n search: Ref<string>;\n selectedRows: ShallowRef<TData[]>;\n selectedCount: ComputedRef<number>;\n busy: ComputedRef<boolean>;\n error: ComputedRef<unknown | null>;\n commands: MachTableCommands;\n reload(): Promise<void>;\n}\n\n/** One cohesive controller for API readiness, query, selection, editing and toolbar commands. */\nexport function useMachTableController<TData, TQuery = Record<string, unknown>>(\n options: UseMachTableControllerOptions<TData, TQuery> = {}\n): UseMachTableControllerReturn<TData> {\n const table = useMachTable<TData>();\n const search = ref(options.initialSearch ?? \"\");\n const query = options.query\n ? useMachTableQuery({\n ...options.query,\n quickFilterText: options.query.quickFilterText ?? computed(() => search.value || null)\n })\n : null;\n const editing = useMachTableEditing(table, options.editing);\n const selectedRows = shallowRef<TData[]>([]);\n let removeSelectionListener: (() => void) | null = null;\n\n const syncSelection = (): void => {\n selectedRows.value = query?.selectedRows.value ?? table.api.value?.getSelectedRows() ?? [];\n };\n watch(table.api, (api) => {\n removeSelectionListener?.();\n removeSelectionListener = null;\n if (api && !api.isDestroyed()) removeSelectionListener = api.addEventListener(\"selectionChanged\", syncSelection);\n syncSelection();\n }, { immediate: true });\n if (query) watch(query.selectedRows, syncSelection, { deep: false });\n\n const reload = async (): Promise<void> => {\n if (query) await query.reload();\n else {\n const api = table.api.value;\n if (api?.isInfinite()) await api.reload();\n else api?.refreshCells();\n }\n };\n const commands = createMachTableCommands<TData>({ getApi: () => table.api.value, reload });\n const bindings = computed<GridOptions<TData>>(() => query?.bindings.value ?? {});\n const selectedCount = computed(() => {\n if (!query) return selectedRows.value.length;\n const state = query.selectionState.value;\n return state.mode === \"allMatching\"\n ? Math.max(0, query.total.value - state.excludedKeys.length)\n : state.selectedKeys.length;\n });\n const busy = computed(() => query?.loading.value === true || editing.saving.value);\n const error = computed(() => query?.error.value ?? editing.saveError.value ?? null);\n\n watch(search, (value) => {\n if (!query) commands.search(value || null);\n });\n onScopeDispose(() => {\n removeSelectionListener?.();\n removeSelectionListener = null;\n });\n\n return { table, query, editing, bindings, search, selectedRows, selectedCount, busy, error, commands, reload };\n}\n"],"mappings":"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","names":["onScopeDispose","ref","shallowRef","watch","useMachTable","componentRef","api","ready","generation","comp","currentGeneration","currentApi","computed","onScopeDispose","ref","shallowRef","watch","useMachTableEditing","table","options","changes","dirtyRowIds","saving","saveError","dirty","removeDirtyListener","refresh","api","save","handler","rowIds","saved","error","rollback","changed","markSaved","reveal","rowId","colId","edit","node","onBeforeUnload","event","message","computed","isRef","nextTick","onScopeDispose","ref","shallowRef","watch","getByPath","readSource","source","normalizePositive","value","fallback","isAbortError","error","useMachTableQuery","options","rows","loading","page","pageSize","total","sortModel","filterModel","selectedKeys","selectedRows","selectedIds","excludedIds","selectedById","quickFilterText","selectionScope","automatic","allMatching","selectionRevision","pageSizes","a","b","api","controller","generation","debounceTimer","suppressGridEvents","suppressSelectionEvents","updatingSelectedRefs","rowId","row","updateSelectedRefs","ids","id","isSelectedId","syncVisibleSelection","selected","abort","isStaleRequest","activeController","requestGeneration","validatePageResult","result","applyPageResult","nextRows","handleRequestError","requestError","load","item","scheduleLoad","resetPage","delay","onGridReady","event","onPaginationChanged","onSortChanged","onFilterChanged","clearSelection","onSelectionChanged","visibleIds","nextVisibleIds","gridProps","reload","reloadOptions","reset","selectAllMatching","applySelectionState","state","selectionState","keys","wanted","computed","onScopeDispose","ref","shallowRef","watch","createMachTableCommands","useMachTableController","options","table","useMachTable","search","ref","query","useMachTableQuery","computed","editing","useMachTableEditing","selectedRows","shallowRef","removeSelectionListener","syncSelection","watch","api","reload","commands","createMachTableCommands","bindings","selectedCount","state","busy","error","value","onScopeDispose"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{defineMachTableConfig as d,mergeMachTableConfig as l,normalizeMachTableConfig as t,resolveMachTableGridOptions as s}from"@agile-team/mach-table";import{computed as b,inject as a,isRef as c,provide as r,shallowRef as i}from"vue";var f=Symbol("mach-table-defaults"),o=Symbol("mach-table-config"),T=t();function h(e){return typeof e=="function"?e():c(e)?e.value:e}function m(e){return i(t(e))}function M(e){let p=a(o,i(T)),n=b(()=>l(p.value,h(e)));return r(o,n),r(f,n.value.defaults),n}function y(e){M(()=>({defaults:typeof e=="function"?e():c(e)?e.value:e}))}function v(){let e=a(o,null);return e?e.value.defaults:a(f,{})}function O(){return a(o,i(T))}export{d as a,l as b,t as c,s as d,f as e,o as f,m as g,M as h,y as i,v as j,O as k};
|
|
2
|
+
//# sourceMappingURL=chunk-6WNTYC5G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/configuration.ts","../src/defaults.ts"],"sourcesContent":["export {\n defineMachTableConfig,\n mergeMachTableConfig,\n normalizeMachTableConfig,\n resolveMachTableGridOptions\n} from \"@agile-team/mach-table\";\nexport type {\n MachTableConfigWarning,\n MachTableOptionExplanation,\n MachTablePresetSelection,\n MachTableRuntimeConfig,\n ResolvedMachTableConfig,\n ResolvedMachTableGridOptions\n} from \"@agile-team/mach-table\";\n","import { computed, inject, isRef, provide, shallowRef, type InjectionKey, type Ref } from \"vue\";\nimport type { GridOptions } from \"@agile-team/mach-table\";\nimport {\n mergeMachTableConfig,\n normalizeMachTableConfig,\n type MachTableRuntimeConfig,\n type ResolvedMachTableConfig\n} from \"./configuration\";\n\nexport const MACH_TABLE_DEFAULTS_KEY: InjectionKey<Partial<GridOptions<any>>> = Symbol(\"mach-table-defaults\");\nexport const MACH_TABLE_CONFIG_KEY: InjectionKey<Readonly<Ref<ResolvedMachTableConfig>>> = Symbol(\"mach-table-config\");\n\nexport type MachTableConfigSource =\n | MachTableRuntimeConfig\n | Readonly<Ref<MachTableRuntimeConfig>>\n | (() => MachTableRuntimeConfig);\n\nconst EMPTY_CONFIG = normalizeMachTableConfig();\n\nfunction readSource(source: MachTableConfigSource): MachTableRuntimeConfig {\n if (typeof source === \"function\") return source();\n return isRef(source) ? source.value : source;\n}\n\nexport function createMachTableConfigRef(config: MachTableRuntimeConfig): Readonly<Ref<ResolvedMachTableConfig>> {\n return shallowRef(normalizeMachTableConfig(config));\n}\n\n/** Provides route/layout-scoped defaults, presets and diagnostics reactively. */\nexport function provideMachTableConfig(source: MachTableConfigSource): Readonly<Ref<ResolvedMachTableConfig>> {\n const parent = inject(MACH_TABLE_CONFIG_KEY, shallowRef(EMPTY_CONFIG));\n const resolved = computed(() => mergeMachTableConfig(parent.value, readSource(source)));\n provide(MACH_TABLE_CONFIG_KEY, resolved);\n // Keep the 0.x injection key available for consumers that injected it directly.\n provide(MACH_TABLE_DEFAULTS_KEY, resolved.value.defaults);\n return resolved;\n}\n\n/** Provides route/layout-scoped defaults. Per-table props always take precedence. */\nexport function provideMachTableDefaults<TData>(\n defaults: Partial<GridOptions<TData>> | Readonly<Ref<Partial<GridOptions<TData>>>> | (() => Partial<GridOptions<TData>>)\n): void {\n provideMachTableConfig(() => ({\n defaults: typeof defaults === \"function\" ? defaults() : isRef(defaults) ? defaults.value : defaults\n }));\n}\n\nexport function useMachTableDefaults<TData>(): Partial<GridOptions<TData>> {\n const config = inject(MACH_TABLE_CONFIG_KEY, null);\n if (config) return config.value.defaults as Partial<GridOptions<TData>>;\n return inject(MACH_TABLE_DEFAULTS_KEY, {}) as Partial<GridOptions<TData>>;\n}\n\nexport function useMachTableConfig(): Readonly<Ref<ResolvedMachTableConfig>> {\n return inject(MACH_TABLE_CONFIG_KEY, shallowRef(EMPTY_CONFIG));\n}\n"],"mappings":"AAAA,OACE,yBAAAA,EACA,wBAAAC,EACA,4BAAAC,EACA,+BAAAC,MACK,yBCLP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,SAAAC,EAAO,WAAAC,EAAS,cAAAC,MAA+C,MASnF,IAAMC,EAAmE,OAAO,qBAAqB,EAC/FC,EAA8E,OAAO,mBAAmB,EAO/GC,EAAeC,EAAyB,EAE9C,SAASC,EAAWC,EAAuD,CACzE,OAAI,OAAOA,GAAW,WAAmBA,EAAO,EACzCC,EAAMD,CAAM,EAAIA,EAAO,MAAQA,CACxC,CAEO,SAASE,EAAyBC,EAAwE,CAC/G,OAAOC,EAAWN,EAAyBK,CAAM,CAAC,CACpD,CAGO,SAASE,EAAuBL,EAAuE,CAC5G,IAAMM,EAASC,EAAOX,EAAuBQ,EAAWP,CAAY,CAAC,EAC/DW,EAAWC,EAAS,IAAMC,EAAqBJ,EAAO,MAAOP,EAAWC,CAAM,CAAC,CAAC,EACtF,OAAAW,EAAQf,EAAuBY,CAAQ,EAEvCG,EAAQhB,EAAyBa,EAAS,MAAM,QAAQ,EACjDA,CACT,CAGO,SAASI,EACdC,EACM,CACNR,EAAuB,KAAO,CAC5B,SAAU,OAAOQ,GAAa,WAAaA,EAAS,EAAIZ,EAAMY,CAAQ,EAAIA,EAAS,MAAQA,CAC7F,EAAE,CACJ,CAEO,SAASC,GAA2D,CACzE,IAAMX,EAASI,EAAOX,EAAuB,IAAI,EACjD,OAAIO,EAAeA,EAAO,MAAM,SACzBI,EAAOZ,EAAyB,CAAC,CAAC,CAC3C,CAEO,SAASoB,GAA6D,CAC3E,OAAOR,EAAOX,EAAuBQ,EAAWP,CAAY,CAAC,CAC/D","names":["defineMachTableConfig","mergeMachTableConfig","normalizeMachTableConfig","resolveMachTableGridOptions","computed","inject","isRef","provide","shallowRef","MACH_TABLE_DEFAULTS_KEY","MACH_TABLE_CONFIG_KEY","EMPTY_CONFIG","normalizeMachTableConfig","readSource","source","isRef","createMachTableConfigRef","config","shallowRef","provideMachTableConfig","parent","inject","resolved","computed","mergeMachTableConfig","provide","provideMachTableDefaults","defaults","useMachTableDefaults","useMachTableConfig"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkOMEMLONJcjs = require('./chunk-OMEMLONJ.cjs');var _vue = require('vue');var _machtable = require('@agile-team/mach-table');function T(t){if(t)return t;try{return _optionalChain([_vue.getCurrentInstance.call(void 0, ), 'optionalAccess', _2 => _2.appContext])}catch (e2){return}}function V(t,e,n,o){if(o){let r=_vue.h.call(void 0, t,e);return r.appContext=o,_vue.render.call(void 0, r,n),()=>_vue.render.call(void 0, null,n)}let a=_vue.createApp.call(void 0, {render:()=>_vue.h.call(void 0, t,e)});return a.mount(n),()=>a.unmount()}function D(t,e,n,o,a=!0){let i=_vue.h.call(void 0, {name:"MachTableSlot",setup:()=>()=>_vue.renderSlot.call(void 0, {default:t},"default",e())});o&&(i.appContext=o);let l=!1,u=()=>{l||_vue.render.call(void 0, i,n)};return a?queueMicrotask(u):u(),()=>{l=!0,_vue.render.call(void 0, null,n)}}function ee(t,e){let n=T(_optionalChain([e, 'optionalAccess', _3 => _3.appContext]));return o=>{let a=document.createElement("div");a.className="mach-cell-vue",a.style.width="100%";let r=V(t,o,a,n),i=!1;return{el:a,destroy:()=>{i||(i=!0,window.setTimeout(r,0))}}}}function te(t,e){let n=T(_optionalChain([e, 'optionalAccess', _4 => _4.appContext]));return o=>{let a=document.createElement("div");a.style.height="100%";let r=V(t,o,a,n),i=!1;return{el:a,destroy:()=>{i||(i=!0,r())}}}}function G(t,e){let n=T(_optionalChain([e, 'optionalAccess', _5 => _5.appContext]));return o=>{let a=document.createElement("div");a.className="mach-cell-vue mach-cell-vue--slot",a.style.width="100%";let r=D(t,()=>o,a,n);return{el:a,destroy:r}}}function M(t,e){let n=T(_optionalChain([e, 'optionalAccess', _6 => _6.appContext]));return o=>{let a=document.createElement("div");a.className="mach-header-vue-slot";let r=D(t,()=>o,a,n);return{el:a,destroy:r}}}function N(t,e){let n=T(_optionalChain([e, 'optionalAccess', _7 => _7.appContext]));return o=>{let a=_vue.shallowReactive.call(void 0, {value:o.value}),r=document.createElement("div");r.className="mach-cell-vue mach-cell-vue--editor";let l=D(t,()=>({...o,value:a.value,setValue:u=>{a.value=u},commit:()=>o.api.stopEditing(!1),cancel:()=>o.api.stopEditing(!0)}),r,n,!1);return{el:r,getValue:()=>a.value,focus:()=>{_optionalChain([r, 'access', _8 => _8.querySelector, 'call', _9 => _9("input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex='-1'])"), 'optionalAccess', _10 => _10.focus, 'call', _11 => _11()])},destroy:l}}}function x(t,e){let n=T(_optionalChain([e, 'optionalAccess', _12 => _12.appContext]));return o=>{let a=document.createElement("div");a.className="mach-detail-vue-slot",a.style.height="100%";let r=D(t,()=>o,a,n);return{el:a,destroy:r}}}function C(t,e){let n=T(_optionalChain([e, 'optionalAccess', _13 => _13.appContext]));return()=>{let o=document.createElement("div");o.className="mach-overlay-vue-slot";let a=D(t,()=>({}),o,n);return{el:o,destroy:a}}}function S(t,e,n){return _nullishCoalesce(t[`${e}-${n}`], () => (t[`${e}-${n.replace(/[.\s]+/g,"-")}`]))}function O(t,e,n){return t.map((o,a)=>{if(Array.isArray(o.children)){let y=o;return{...y,children:O(y.children,e,n)}}let r=o,i=_nullishCoalesce(_nullishCoalesce(r.colId, () => (r.field)), () => (`col_${a}`)),l=_nullishCoalesce(_nullishCoalesce(S(e,"cell",i), () => ((i==="op"?e.actions:void 0))), () => (e.cell)),u=_nullishCoalesce(S(e,"header",i), () => (e.header)),g=_nullishCoalesce(S(e,"editor",i), () => (e.editor));return{...r,...l?{cellRenderer:G(l,{appContext:n})}:{},...u?{headerComponent:M(u,{appContext:n})}:{},...g?{cellEditor:N(g,{appContext:n})}:{}}})}function re(t,e,n){let o=t.columnDefs?O(t.columnDefs,e,n):t.columnDefs;return{...t,columnDefs:o,...e.detail&&!t.detailRowRenderer?{detailRowRenderer:x(e.detail,{appContext:n})}:{},...e.loading?{overlayLoadingTemplate:C(e.loading,{appContext:n})}:{},...e.empty?{overlayNoRowsTemplate:C(e.empty,{appContext:n})}:{}}}function w(t,e){let n,o,a=t.detail?x(t.detail,{appContext:e}):void 0,r=t.loading?C(t.loading,{appContext:e}):void 0,i=t.empty?C(t.empty,{appContext:e}):void 0;return l=>(l.columnDefs!==n&&(n=l.columnDefs,o=l.columnDefs?O(l.columnDefs,t,e):l.columnDefs),{...l,columnDefs:o,...a&&!l.detailRowRenderer?{detailRowRenderer:a}:{},...r?{overlayLoadingTemplate:r}:{},...i?{overlayNoRowsTemplate:i}:{}})}var B=_machtable.GRID_OPTION_KEYS.filter(t=>!["className","ariaLabel","ariaLabelledBy","ariaDescribedBy"].includes(t)),f={};for(let t of B){let e=_machtable.GRID_OPTION_META[t].kind,n=e==="boolean"?Boolean:e==="number"?Number:e==="array"?Array:e==="function"?Function:e==="boolean-object"?[Boolean,Object]:e==="object"?Object:e==="string"?String:void 0;f[t]={type:n,default:void 0}}f.className={type:String,default:void 0};f.gridClassName={type:String,default:void 0};f.gridAriaLabel={type:String,default:void 0};f.gridAriaLabelledBy={type:String,default:void 0};f.gridAriaDescribedBy={type:String,default:void 0};f.preset={type:[String,Array,Boolean],default:void 0};function J(t){return"on"+t.charAt(0).toUpperCase()+t.slice(1)}var Q=_vue.defineComponent.call(void 0, {name:"MachTable",inheritAttrs:!1,props:f,emits:[..._machtable.EVENT_TYPES],setup(t,{expose:e,attrs:n,emit:o,slots:a}){let r=t,i=_vue.ref.call(void 0, null),l=null,u=_chunkOMEMLONJcjs.k.call(void 0, ),g=w(a,_optionalChain([_vue.getCurrentInstance.call(void 0, ), 'optionalAccess', _14 => _14.appContext])),y=null,P=new Set,v=()=>{let d={};for(let s of B){let m=r[s];m!==void 0&&(d[s]=m)}r.gridClassName!==void 0&&(d.className=r.gridClassName),r.gridAriaLabel!==void 0&&(d.ariaLabel=r.gridAriaLabel),r.gridAriaLabelledBy!==void 0&&(d.ariaLabelledBy=r.gridAriaLabelledBy),r.gridAriaDescribedBy!==void 0&&(d.ariaDescribedBy=r.gridAriaDescribedBy);let p=_chunkOMEMLONJcjs.d.call(void 0, u.value,r.preset,d,s=>{let m=`${s.code}:${_nullishCoalesce(s.preset, () => (""))}`;P.has(m)||(P.add(m),u.value.onConfigWarning?u.value.onConfigWarning(s):console.warn(s.message))}),c=g(p.options);return y={options:c,explain:s=>s==="columnDefs"&&c.columnDefs!==p.options.columnDefs?{key:s,value:c.columnDefs,source:"Vue slots",layers:[...p.explain(s).layers,{name:"Vue slots",value:c.columnDefs}]}:p.explain(s)},y.options};return _vue.onMounted.call(void 0, ()=>{if(!i.value)return;let d=v();for(let p of _machtable.EVENT_TYPES){let c=J(p),s=d[c];d[c]=m=>{typeof s=="function"&&s(m),o(p,m)}}l=_machtable.createGrid.call(void 0, i.value,d)}),_vue.onBeforeUnmount.call(void 0, ()=>{_optionalChain([l, 'optionalAccess', _15 => _15.destroy, 'call', _16 => _16()]),l=null}),_vue.watch.call(void 0, ()=>{let d=v();return[..._machtable.GRID_OPTION_KEYS.map(p=>d[p])]},(d,p)=>{if(!l)return;let c={};d.forEach((s,m)=>{Object.is(s,p[m])||(c[_machtable.GRID_OPTION_KEYS[m]]=s)}),Object.keys(c).length>0&&l.updateOptions(c)}),e({getApi:()=>l,getResolvedConfig:()=>_nullishCoalesce(_optionalChain([y, 'optionalAccess', _17 => _17.options]), () => (v())),explainOption:d=>(_nullishCoalesce(y, () => (_chunkOMEMLONJcjs.d.call(void 0, u.value,r.preset,{})))).explain(d)}),()=>_vue.h.call(void 0, "div",{...n,ref:i,class:["mach-vue-host",r.className,n.class]})}}),X= exports.j =Q,pe= exports.k =X;exports.a = ee; exports.b = te; exports.c = G; exports.d = M; exports.e = N; exports.f = x; exports.g = C; exports.h = re; exports.i = w; exports.j = X; exports.k = pe;
|
|
2
|
+
//# sourceMappingURL=chunk-C7C5I2H4.cjs.map
|