@ngxsmk/cdk 1.3.2 → 3.0.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 +1 -1
- package/cva-base/cva-base.d.ts +34 -0
- package/cva-base/cva-base.d.ts.map +1 -0
- package/cva-base/index.d.ts +2 -0
- package/cva-base/index.d.ts.map +1 -0
- package/cva-base/ngxsmk-cdk-cva-base.d.ts.map +1 -0
- package/esm2022/cva-base/cva-base.mjs +45 -0
- package/esm2022/cva-base/index.mjs +2 -0
- package/esm2022/cva-base/ngxsmk-cdk-cva-base.mjs +5 -0
- package/esm2022/input-group/index.mjs +3 -0
- package/esm2022/input-group/input-group-engine.mjs +219 -0
- package/esm2022/input-group/models/index.mjs +2 -0
- package/esm2022/input-group/models/input-group.model.mjs +2 -0
- package/esm2022/input-group/ngxsmk-cdk-input-group.mjs +5 -0
- package/esm2022/listbox-keyboard/index.mjs +2 -0
- package/esm2022/listbox-keyboard/listbox-keyboard.mjs +145 -0
- package/esm2022/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.mjs +5 -0
- package/esm2022/public-api.mjs +10 -1
- package/esm2022/roving-focus/index.mjs +2 -0
- package/esm2022/roving-focus/ngxsmk-cdk-roving-focus.mjs +5 -0
- package/esm2022/roving-focus/roving-focus.mjs +176 -0
- package/esm2022/scheduler/index.mjs +5 -0
- package/esm2022/scheduler/models/date-range.mjs +2 -0
- package/esm2022/scheduler/models/event.model.mjs +2 -0
- package/esm2022/scheduler/models/index.mjs +6 -0
- package/esm2022/scheduler/models/resource.model.mjs +5 -0
- package/esm2022/scheduler/models/selection.model.mjs +7 -0
- package/esm2022/scheduler/models/view.model.mjs +7 -0
- package/esm2022/scheduler/ngxsmk-cdk-scheduler.mjs +5 -0
- package/esm2022/scheduler/plugin/drag-plugin.mjs +82 -0
- package/esm2022/scheduler/plugin/index.mjs +8 -0
- package/esm2022/scheduler/plugin/keyboard-plugin.mjs +150 -0
- package/esm2022/scheduler/plugin/plugin-host.mjs +48 -0
- package/esm2022/scheduler/plugin/plugin.types.mjs +2 -0
- package/esm2022/scheduler/plugin/resize-plugin.mjs +74 -0
- package/esm2022/scheduler/plugin/selection-plugin.mjs +84 -0
- package/esm2022/scheduler/plugin/tooltip-plugin.mjs +103 -0
- package/esm2022/scheduler/scheduler-engine.mjs +316 -0
- package/esm2022/scheduler/utils/date-utils.mjs +131 -0
- package/esm2022/scheduler/utils/index.mjs +3 -0
- package/esm2022/scheduler/utils/snap.mjs +24 -0
- package/esm2022/scroll-lock/scroll-lock.mjs +22 -5
- package/esm2022/skip-link/index.mjs +2 -0
- package/esm2022/skip-link/ngxsmk-cdk-skip-link.mjs +5 -0
- package/esm2022/skip-link/skip-link.mjs +33 -0
- package/esm2022/spreadsheet/index.mjs +5 -0
- package/esm2022/spreadsheet/models/cell.model.mjs +2 -0
- package/esm2022/spreadsheet/models/column.model.mjs +2 -0
- package/esm2022/spreadsheet/models/filter.model.mjs +2 -0
- package/esm2022/spreadsheet/models/formula.model.mjs +2 -0
- package/esm2022/spreadsheet/models/index.mjs +8 -0
- package/esm2022/spreadsheet/models/row.model.mjs +2 -0
- package/esm2022/spreadsheet/models/selection.model.mjs +2 -0
- package/esm2022/spreadsheet/models/sort.model.mjs +2 -0
- package/esm2022/spreadsheet/ngxsmk-cdk-spreadsheet.mjs +5 -0
- package/esm2022/spreadsheet/plugin/clipboard-plugin.mjs +171 -0
- package/esm2022/spreadsheet/plugin/filter-plugin.mjs +87 -0
- package/esm2022/spreadsheet/plugin/formula-plugin.mjs +456 -0
- package/esm2022/spreadsheet/plugin/index.mjs +10 -0
- package/esm2022/spreadsheet/plugin/plugin-host.mjs +188 -0
- package/esm2022/spreadsheet/plugin/plugin.types.mjs +2 -0
- package/esm2022/spreadsheet/plugin/selection-plugin.mjs +114 -0
- package/esm2022/spreadsheet/plugin/sort-plugin.mjs +63 -0
- package/esm2022/spreadsheet/plugin/undo-plugin.mjs +138 -0
- package/esm2022/spreadsheet/plugin/validation-plugin.mjs +71 -0
- package/esm2022/spreadsheet/spreadsheet-engine.mjs +547 -0
- package/esm2022/spreadsheet/utils/cell-utils.mjs +129 -0
- package/esm2022/spreadsheet/utils/index.mjs +2 -0
- package/fesm2022/ngxsmk-cdk-cva-base.mjs +52 -0
- package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-input-group.mjs +226 -0
- package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs +152 -0
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-roving-focus.mjs +183 -0
- package/fesm2022/ngxsmk-cdk-roving-focus.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-scheduler.mjs +1035 -0
- package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-scroll-lock.mjs +21 -4
- package/fesm2022/ngxsmk-cdk-scroll-lock.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-skip-link.mjs +40 -0
- package/fesm2022/ngxsmk-cdk-skip-link.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs +1969 -0
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk.mjs +5 -0
- package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
- package/input-group/index.d.ts +3 -0
- package/input-group/index.d.ts.map +1 -0
- package/input-group/input-group-engine.d.ts +88 -0
- package/input-group/input-group-engine.d.ts.map +1 -0
- package/input-group/models/index.d.ts +2 -0
- package/input-group/models/index.d.ts.map +1 -0
- package/input-group/models/input-group.model.d.ts +114 -0
- package/input-group/models/input-group.model.d.ts.map +1 -0
- package/input-group/ngxsmk-cdk-input-group.d.ts.map +1 -0
- package/listbox-keyboard/index.d.ts +2 -0
- package/listbox-keyboard/index.d.ts.map +1 -0
- package/listbox-keyboard/listbox-keyboard.d.ts +60 -0
- package/listbox-keyboard/listbox-keyboard.d.ts.map +1 -0
- package/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.d.ts.map +1 -0
- package/package.json +59 -17
- package/public-api.d.ts +8 -0
- package/public-api.d.ts.map +1 -1
- package/roving-focus/index.d.ts +2 -0
- package/roving-focus/index.d.ts.map +1 -0
- package/roving-focus/ngxsmk-cdk-roving-focus.d.ts.map +1 -0
- package/roving-focus/roving-focus.d.ts +61 -0
- package/roving-focus/roving-focus.d.ts.map +1 -0
- package/scheduler/index.d.ts +5 -0
- package/scheduler/index.d.ts.map +1 -0
- package/scheduler/models/date-range.d.ts +6 -0
- package/scheduler/models/date-range.d.ts.map +1 -0
- package/scheduler/models/event.model.d.ts +50 -0
- package/scheduler/models/event.model.d.ts.map +1 -0
- package/scheduler/models/index.d.ts +6 -0
- package/scheduler/models/index.d.ts.map +1 -0
- package/scheduler/models/resource.model.d.ts +16 -0
- package/scheduler/models/resource.model.d.ts.map +1 -0
- package/scheduler/models/selection.model.d.ts +12 -0
- package/scheduler/models/selection.model.d.ts.map +1 -0
- package/scheduler/models/view.model.d.ts +21 -0
- package/scheduler/models/view.model.d.ts.map +1 -0
- package/scheduler/ngxsmk-cdk-scheduler.d.ts.map +1 -0
- package/scheduler/plugin/drag-plugin.d.ts +28 -0
- package/scheduler/plugin/drag-plugin.d.ts.map +1 -0
- package/scheduler/plugin/index.d.ts +8 -0
- package/scheduler/plugin/index.d.ts.map +1 -0
- package/scheduler/plugin/keyboard-plugin.d.ts +24 -0
- package/scheduler/plugin/keyboard-plugin.d.ts.map +1 -0
- package/scheduler/plugin/plugin-host.d.ts +16 -0
- package/scheduler/plugin/plugin-host.d.ts.map +1 -0
- package/scheduler/plugin/plugin.types.d.ts +9 -0
- package/scheduler/plugin/plugin.types.d.ts.map +1 -0
- package/scheduler/plugin/resize-plugin.d.ts +26 -0
- package/scheduler/plugin/resize-plugin.d.ts.map +1 -0
- package/scheduler/plugin/selection-plugin.d.ts +40 -0
- package/scheduler/plugin/selection-plugin.d.ts.map +1 -0
- package/scheduler/plugin/tooltip-plugin.d.ts +41 -0
- package/scheduler/plugin/tooltip-plugin.d.ts.map +1 -0
- package/scheduler/scheduler-engine.d.ts +95 -0
- package/scheduler/scheduler-engine.d.ts.map +1 -0
- package/scheduler/utils/date-utils.d.ts +26 -0
- package/scheduler/utils/date-utils.d.ts.map +1 -0
- package/scheduler/utils/index.d.ts +3 -0
- package/scheduler/utils/index.d.ts.map +1 -0
- package/scheduler/utils/snap.d.ts +7 -0
- package/scheduler/utils/snap.d.ts.map +1 -0
- package/scroll-lock/scroll-lock.d.ts +2 -0
- package/scroll-lock/scroll-lock.d.ts.map +1 -1
- package/skip-link/index.d.ts +2 -0
- package/skip-link/index.d.ts.map +1 -0
- package/skip-link/ngxsmk-cdk-skip-link.d.ts.map +1 -0
- package/skip-link/skip-link.d.ts +18 -0
- package/skip-link/skip-link.d.ts.map +1 -0
- package/spreadsheet/index.d.ts +5 -0
- package/spreadsheet/index.d.ts.map +1 -0
- package/spreadsheet/models/cell.model.d.ts +44 -0
- package/spreadsheet/models/cell.model.d.ts.map +1 -0
- package/spreadsheet/models/column.model.d.ts +77 -0
- package/spreadsheet/models/column.model.d.ts.map +1 -0
- package/spreadsheet/models/filter.model.d.ts +15 -0
- package/spreadsheet/models/filter.model.d.ts.map +1 -0
- package/spreadsheet/models/formula.model.d.ts +65 -0
- package/spreadsheet/models/formula.model.d.ts.map +1 -0
- package/spreadsheet/models/index.d.ts +8 -0
- package/spreadsheet/models/index.d.ts.map +1 -0
- package/spreadsheet/models/row.model.d.ts +33 -0
- package/spreadsheet/models/row.model.d.ts.map +1 -0
- package/spreadsheet/models/selection.model.d.ts +18 -0
- package/spreadsheet/models/selection.model.d.ts.map +1 -0
- package/spreadsheet/models/sort.model.d.ts +14 -0
- package/spreadsheet/models/sort.model.d.ts.map +1 -0
- package/spreadsheet/ngxsmk-cdk-spreadsheet.d.ts.map +1 -0
- package/spreadsheet/plugin/clipboard-plugin.d.ts +24 -0
- package/spreadsheet/plugin/clipboard-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/filter-plugin.d.ts +21 -0
- package/spreadsheet/plugin/filter-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/formula-plugin.d.ts +39 -0
- package/spreadsheet/plugin/formula-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/index.d.ts +10 -0
- package/spreadsheet/plugin/index.d.ts.map +1 -0
- package/spreadsheet/plugin/plugin-host.d.ts +66 -0
- package/spreadsheet/plugin/plugin-host.d.ts.map +1 -0
- package/spreadsheet/plugin/plugin.types.d.ts +58 -0
- package/spreadsheet/plugin/plugin.types.d.ts.map +1 -0
- package/spreadsheet/plugin/selection-plugin.d.ts +28 -0
- package/spreadsheet/plugin/selection-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/sort-plugin.d.ts +18 -0
- package/spreadsheet/plugin/sort-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/undo-plugin.d.ts +40 -0
- package/spreadsheet/plugin/undo-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/validation-plugin.d.ts +29 -0
- package/spreadsheet/plugin/validation-plugin.d.ts.map +1 -0
- package/spreadsheet/spreadsheet-engine.d.ts +194 -0
- package/spreadsheet/spreadsheet-engine.d.ts.map +1 -0
- package/spreadsheet/utils/cell-utils.d.ts +26 -0
- package/spreadsheet/utils/cell-utils.d.ts.map +1 -0
- package/spreadsheet/utils/index.d.ts +2 -0
- package/spreadsheet/utils/index.d.ts.map +1 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PluginHost manages the lifecycle of all registered plugins.
|
|
3
|
+
* Plugins are executed in priority order (lower = first).
|
|
4
|
+
*/
|
|
5
|
+
export class PluginHost {
|
|
6
|
+
constructor() {
|
|
7
|
+
this._plugins = [];
|
|
8
|
+
this._engine = null;
|
|
9
|
+
}
|
|
10
|
+
/** Register one or more plugins. */
|
|
11
|
+
register(...plugins) {
|
|
12
|
+
this._plugins.push(...plugins);
|
|
13
|
+
this._plugins.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
|
|
14
|
+
}
|
|
15
|
+
/** Unregister plugins by name. */
|
|
16
|
+
unregister(...names) {
|
|
17
|
+
const nameSet = new Set(names);
|
|
18
|
+
const toRemove = this._plugins.filter((p) => nameSet.has(p.name));
|
|
19
|
+
toRemove.forEach((p) => p.onDestroy?.());
|
|
20
|
+
this._plugins = this._plugins.filter((p) => !nameSet.has(p.name));
|
|
21
|
+
}
|
|
22
|
+
/** Initialize all plugins with the engine. Called once during engine construction. */
|
|
23
|
+
init(engine) {
|
|
24
|
+
this._engine = engine;
|
|
25
|
+
for (const plugin of this._plugins) {
|
|
26
|
+
plugin.onInit?.(engine);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Destroy all plugins. */
|
|
30
|
+
destroy() {
|
|
31
|
+
for (const plugin of this._plugins) {
|
|
32
|
+
plugin.onDestroy?.();
|
|
33
|
+
}
|
|
34
|
+
this._plugins = [];
|
|
35
|
+
this._engine = null;
|
|
36
|
+
}
|
|
37
|
+
/** Run onBeforeRender on all plugins. Returns false if any plugin cancels. */
|
|
38
|
+
beforeRender() {
|
|
39
|
+
for (const plugin of this._plugins) {
|
|
40
|
+
if (plugin.onBeforeRender?.() === false)
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
/** Run onAfterRender on all plugins. */
|
|
46
|
+
afterRender() {
|
|
47
|
+
for (const plugin of this._plugins) {
|
|
48
|
+
plugin.onAfterRender?.();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Run onBeforeEdit on all plugins. Returns false if any cancels. */
|
|
52
|
+
beforeEdit(rowIndex, colId) {
|
|
53
|
+
for (const plugin of this._plugins) {
|
|
54
|
+
if (plugin.onBeforeEdit?.(rowIndex, colId) === false)
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
/** Run onAfterEdit on all plugins. */
|
|
60
|
+
afterEdit(rowIndex, colId, oldValue, newValue) {
|
|
61
|
+
for (const plugin of this._plugins) {
|
|
62
|
+
plugin.onAfterEdit?.(rowIndex, colId, oldValue, newValue);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Run onBeforeSort on all plugins. Returns false if any cancels. */
|
|
66
|
+
beforeSort(colId, direction) {
|
|
67
|
+
for (const plugin of this._plugins) {
|
|
68
|
+
if (plugin.onBeforeSort?.(colId, direction) === false)
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
/** Run onAfterSort on all plugins. */
|
|
74
|
+
afterSort() {
|
|
75
|
+
for (const plugin of this._plugins) {
|
|
76
|
+
plugin.onAfterSort?.();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Run onBeforeFilter on all plugins. Returns false if any cancels. */
|
|
80
|
+
beforeFilter() {
|
|
81
|
+
for (const plugin of this._plugins) {
|
|
82
|
+
if (plugin.onBeforeFilter?.() === false)
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
/** Run onAfterFilter on all plugins. */
|
|
88
|
+
afterFilter() {
|
|
89
|
+
for (const plugin of this._plugins) {
|
|
90
|
+
plugin.onAfterFilter?.();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Run onBeforeInsertRows on all plugins. Returns false if any cancels. */
|
|
94
|
+
beforeInsertRows(count, atIndex) {
|
|
95
|
+
for (const plugin of this._plugins) {
|
|
96
|
+
if (plugin.onBeforeInsertRows?.(count, atIndex) === false)
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
/** Run onAfterInsertRows on all plugins. */
|
|
102
|
+
afterInsertRows(indices) {
|
|
103
|
+
for (const plugin of this._plugins) {
|
|
104
|
+
plugin.onAfterInsertRows?.(indices);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Run onBeforeDeleteRows on all plugins. Returns false if any cancels. */
|
|
108
|
+
beforeDeleteRows(indices) {
|
|
109
|
+
for (const plugin of this._plugins) {
|
|
110
|
+
if (plugin.onBeforeDeleteRows?.(indices) === false)
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
/** Run onAfterDeleteRows on all plugins. */
|
|
116
|
+
afterDeleteRows(indices) {
|
|
117
|
+
for (const plugin of this._plugins) {
|
|
118
|
+
plugin.onAfterDeleteRows?.(indices);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Run onBeforeInsertColumns on all plugins. Returns false if any cancels. */
|
|
122
|
+
beforeInsertColumns(count, atIndex) {
|
|
123
|
+
for (const plugin of this._plugins) {
|
|
124
|
+
if (plugin.onBeforeInsertColumns?.(count, atIndex) === false)
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
/** Run onAfterInsertColumns on all plugins. */
|
|
130
|
+
afterInsertColumns(indices) {
|
|
131
|
+
for (const plugin of this._plugins) {
|
|
132
|
+
plugin.onAfterInsertColumns?.(indices);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Run onBeforeDeleteColumns on all plugins. Returns false if any cancels. */
|
|
136
|
+
beforeDeleteColumns(indices) {
|
|
137
|
+
for (const plugin of this._plugins) {
|
|
138
|
+
if (plugin.onBeforeDeleteColumns?.(indices) === false)
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
/** Run onAfterDeleteColumns on all plugins. */
|
|
144
|
+
afterDeleteColumns(indices) {
|
|
145
|
+
for (const plugin of this._plugins) {
|
|
146
|
+
plugin.onAfterDeleteColumns?.(indices);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Run onBeforePaste on all plugins. Returns false if any cancels. */
|
|
150
|
+
beforePaste(data, startCell) {
|
|
151
|
+
for (const plugin of this._plugins) {
|
|
152
|
+
if (plugin.onBeforePaste?.(data, startCell) === false)
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
/** Run onAfterPaste on all plugins. */
|
|
158
|
+
afterPaste() {
|
|
159
|
+
for (const plugin of this._plugins) {
|
|
160
|
+
plugin.onAfterPaste?.();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** Run onBeforeCopy on all plugins. Returns false if any cancels. */
|
|
164
|
+
beforeCopy() {
|
|
165
|
+
for (const plugin of this._plugins) {
|
|
166
|
+
if (plugin.onBeforeCopy?.() === false)
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
/** Run onAfterCopy on all plugins. */
|
|
172
|
+
afterCopy() {
|
|
173
|
+
for (const plugin of this._plugins) {
|
|
174
|
+
plugin.onAfterCopy?.();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** Fire a custom event to all plugins. */
|
|
178
|
+
fireEvent(eventType, payload) {
|
|
179
|
+
for (const plugin of this._plugins) {
|
|
180
|
+
plugin.onEvent?.(eventType, payload);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/** Get all registered plugins. */
|
|
184
|
+
get plugins() {
|
|
185
|
+
return this._plugins;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc3ByZWFkc2hlZXQvcGx1Z2luL3BsdWdpbi1ob3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBOzs7R0FHRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBQXZCO1FBQ1UsYUFBUSxHQUF3QixFQUFFLENBQUM7UUFDbkMsWUFBTyxHQUE2QixJQUFJLENBQUM7SUFrTW5ELENBQUM7SUFoTUMsb0NBQW9DO0lBQ3BDLFFBQVEsQ0FBQyxHQUFHLE9BQTRCO1FBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxVQUFVLENBQUMsR0FBRyxLQUFlO1FBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENB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QVU7UUFDUixLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxVQUFVO1FBQ1IsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkMsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsS0FBSyxLQUFLO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3RELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsU0FBUztRQUNQLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLFNBQVMsQ0FBQyxTQUFpQixFQUFFLE9BQWdCO1FBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3ByZWFkc2hlZXRQbHVnaW4gfSBmcm9tICcuL3BsdWdpbi50eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFNwcmVhZHNoZWV0RW5naW5lIH0gZnJvbSAnLi4vc3ByZWFkc2hlZXQtZW5naW5lJztcblxuLyoqXG4gKiBQbHVnaW5Ib3N0IG1hbmFnZXMgdGhlIGxpZmVjeWNsZSBvZiBhbGwgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICogUGx1Z2lucyBhcmUgZXhlY3V0ZWQgaW4gcHJpb3JpdHkgb3JkZXIgKGxvd2VyID0gZmlyc3QpLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luSG9zdCB7XG4gIHByaXZhdGUgX3BsdWdpbnM6IFNwcmVhZHNoZWV0UGx1Z2luW10gPSBbXTtcbiAgcHJpdmF0ZSBfZW5naW5lOiBTcHJlYWRzaGVldEVuZ2luZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBSZWdpc3RlciBvbmUgb3IgbW9yZSBwbHVnaW5zLiAqL1xuICByZWdpc3RlciguLi5wbHVnaW5zOiBTcHJlYWRzaGVldFBsdWdpbltdKTogdm9pZCB7XG4gICAgdGhpcy5fcGx1Z2lucy5wdXNoKC4uLnBsdWdpbnMpO1xuICAgIHRoaXMuX3BsdWdpbnMuc29ydCgoYSwgYikgPT4gKGEucHJpb3JpdHkgPz8gMCkgLSAoYi5wcmlvcml0eSA/PyAwKSk7XG4gIH1cblxuICAvKiogVW5yZWdpc3RlciBwbHVnaW5zIGJ5IG5hbWUuICovXG4gIHVucmVnaXN0ZXIoLi4ubmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZVNldCA9IG5ldyBTZXQobmFtZXMpO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5fcGx1Z2lucy5maWx0ZXIoKHApID0+IG5hbWVTZXQuaGFzKHAubmFtZSkpO1xuICAgIHRvUmVtb3ZlLmZvckVhY2goKHApID0+IHAub25EZXN0cm95Py4oKSk7XG4gICAgdGhpcy5fcGx1Z2lucyA9IHRoaXMuX3BsdWdpbnMuZmlsdGVyKChwKSA9PiAhbmFtZVNldC5oYXMocC5uYW1lKSk7XG4gIH1cblxuICAvKiogSW5pdGlhbGl6ZSBhbGwgcGx1Z2lucyB3aXRoIHRoZSBlbmdpbmUuIENhbGxlZCBvbmNlIGR1cmluZyBlbmdpbmUgY29uc3RydWN0aW9uLiAqL1xuICBpbml0KGVuZ2luZTogU3ByZWFkc2hlZXRFbmdpbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmdpbmUgPSBlbmdpbmU7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uSW5pdD8uKGVuZ2luZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIERlc3Ryb3kgYWxsIHBsdWdpbnMuICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uRGVzdHJveT8uKCk7XG4gICAgfVxuICAgIHRoaXMuX3BsdWdpbnMgPSBbXTtcbiAgICB0aGlzLl9lbmdpbmUgPSBudWxsO1xuICB9XG5cbiAgLyoqIFJ1biBvbkJlZm9yZVJlbmRlciBvbiBhbGwgcGx1Z2lucy4gUmV0dXJucyBmYWxzZSBpZiBhbnkgcGx1Z2luIGNhbmNlbHMuICovXG4gIGJlZm9yZVJlbmRlcigpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlUmVuZGVyPy4oKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogUnVuIG9uQWZ0ZXJSZW5kZXIgb24gYWxsIHBsdWdpbnMuICovXG4gIGFmdGVyUmVuZGVyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5vbkFmdGVyUmVuZGVyPy4oKTtcbiAgICB9XG4gIH1cblxuICAvKiogUnVuIG9uQmVmb3JlRWRpdCBvbiBhbGwgcGx1Z2lucy4gUmV0dXJucyBmYWxzZSBpZiBhbnkgY2FuY2Vscy4gKi9cbiAgYmVmb3JlRWRpdChyb3dJbmRleDogbnVtYmVyLCBjb2xJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgaWYgKHBsdWdpbi5vbkJlZm9yZUVkaXQ/Lihyb3dJbmRleCwgY29sSWQpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSdW4gb25BZnRlckVkaXQgb24gYWxsIHBsdWdpbnMuICovXG4gIGFmdGVyRWRpdChyb3dJbmRleDogbnVtYmVyLCBjb2xJZDogc3RyaW5nLCBvbGRWYWx1ZTogdW5rbm93biwgbmV3VmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBwbHVnaW4ub25BZnRlckVkaXQ/Lihyb3dJbmRleCwgY29sSWQsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJ1biBvbkJlZm9yZVNvcnQgb24gYWxsIHBsdWdpbnMuIFJldHVybnMgZmFsc2UgaWYgYW55IGNhbmNlbHMuICovXG4gIGJlZm9yZVNvcnQoY29sSWQ6IHN0cmluZywgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlU29ydD8uKGNvbElkLCBkaXJlY3Rpb24pID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSdW4gb25BZnRlclNvcnQgb24gYWxsIHBsdWdpbnMuICovXG4gIGFmdGVyU29ydCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBwbHVnaW4ub25BZnRlclNvcnQ/LigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSdW4gb25CZWZvcmVGaWx0ZXIgb24gYWxsIHBsdWdpbnMuIFJldHVybnMgZmFsc2UgaWYgYW55IGNhbmNlbHMuICovXG4gIGJlZm9yZUZpbHRlcigpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlRmlsdGVyPy4oKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogUnVuIG9uQWZ0ZXJGaWx0ZXIgb24gYWxsIHBsdWdpbnMuICovXG4gIGFmdGVyRmlsdGVyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5vbkFmdGVyRmlsdGVyPy4oKTtcbiAgICB9XG4gIH1cblxuICAvKiogUnVuIG9uQmVmb3JlSW5zZXJ0Um93cyBvbiBhbGwgcGx1Z2lucy4gUmV0dXJucyBmYWxzZSBpZiBhbnkgY2FuY2Vscy4gKi9cbiAgYmVmb3JlSW5zZXJ0Um93cyhjb3VudDogbnVtYmVyLCBhdEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlSW5zZXJ0Um93cz8uKGNvdW50LCBhdEluZGV4KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogUnVuIG9uQWZ0ZXJJbnNlcnRSb3dzIG9uIGFsbCBwbHVnaW5zLiAqL1xuICBhZnRlckluc2VydFJvd3MoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBwbHVnaW4ub25BZnRlckluc2VydFJvd3M/LihpbmRpY2VzKTtcbiAgICB9XG4gIH1cblxuICAvKiogUnVuIG9uQmVmb3JlRGVsZXRlUm93cyBvbiBhbGwgcGx1Z2lucy4gUmV0dXJucyBmYWxzZSBpZiBhbnkgY2FuY2Vscy4gKi9cbiAgYmVmb3JlRGVsZXRlUm93cyhpbmRpY2VzOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIGlmIChwbHVnaW4ub25CZWZvcmVEZWxldGVSb3dzPy4oaW5kaWNlcykgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFJ1biBvbkFmdGVyRGVsZXRlUm93cyBvbiBhbGwgcGx1Z2lucy4gKi9cbiAgYWZ0ZXJEZWxldGVSb3dzKGluZGljZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uQWZ0ZXJEZWxldGVSb3dzPy4oaW5kaWNlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJ1biBvbkJlZm9yZUluc2VydENvbHVtbnMgb24gYWxsIHBsdWdpbnMuIFJldHVybnMgZmFsc2UgaWYgYW55IGNhbmNlbHMuICovXG4gIGJlZm9yZUluc2VydENvbHVtbnMoY291bnQ6IG51bWJlciwgYXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgaWYgKHBsdWdpbi5vbkJlZm9yZUluc2VydENvbHVtbnM/Lihjb3VudCwgYXRJbmRleCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFJ1biBvbkFmdGVySW5zZXJ0Q29sdW1ucyBvbiBhbGwgcGx1Z2lucy4gKi9cbiAgYWZ0ZXJJbnNlcnRDb2x1bW5zKGluZGljZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uQWZ0ZXJJbnNlcnRDb2x1bW5zPy4oaW5kaWNlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJ1biBvbkJlZm9yZURlbGV0ZUNvbHVtbnMgb24gYWxsIHBsdWdpbnMuIFJldHVybnMgZmFsc2UgaWYgYW55IGNhbmNlbHMuICovXG4gIGJlZm9yZURlbGV0ZUNvbHVtbnMoaW5kaWNlczogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlRGVsZXRlQ29sdW1ucz8uKGluZGljZXMpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSdW4gb25BZnRlckRlbGV0ZUNvbHVtbnMgb24gYWxsIHBsdWdpbnMuICovXG4gIGFmdGVyRGVsZXRlQ29sdW1ucyhpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5vbkFmdGVyRGVsZXRlQ29sdW1ucz8uKGluZGljZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSdW4gb25CZWZvcmVQYXN0ZSBvbiBhbGwgcGx1Z2lucy4gUmV0dXJucyBmYWxzZSBpZiBhbnkgY2FuY2Vscy4gKi9cbiAgYmVmb3JlUGFzdGUoZGF0YTogc3RyaW5nLCBzdGFydENlbGw6IHsgcm93OiBudW1iZXI7IGNvbDogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlUGFzdGU/LihkYXRhLCBzdGFydENlbGwpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSdW4gb25BZnRlclBhc3RlIG9uIGFsbCBwbHVnaW5zLiAqL1xuICBhZnRlclBhc3RlKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5vbkFmdGVyUGFzdGU/LigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSdW4gb25CZWZvcmVDb3B5IG9uIGFsbCBwbHVnaW5zLiBSZXR1cm5zIGZhbHNlIGlmIGFueSBjYW5jZWxzLiAqL1xuICBiZWZvcmVDb3B5KCk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIGlmIChwbHVnaW4ub25CZWZvcmVDb3B5Py4oKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogUnVuIG9uQWZ0ZXJDb3B5IG9uIGFsbCBwbHVnaW5zLiAqL1xuICBhZnRlckNvcHkoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uQWZ0ZXJDb3B5Py4oKTtcbiAgICB9XG4gIH1cblxuICAvKiogRmlyZSBhIGN1c3RvbSBldmVudCB0byBhbGwgcGx1Z2lucy4gKi9cbiAgZmlyZUV2ZW50KGV2ZW50VHlwZTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uRXZlbnQ/LihldmVudFR5cGUsIHBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXQgYWxsIHJlZ2lzdGVyZWQgcGx1Z2lucy4gKi9cbiAgZ2V0IHBsdWdpbnMoKTogcmVhZG9ubHkgU3ByZWFkc2hlZXRQbHVnaW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsdWdpbnM7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2RrL3NwcmVhZHNoZWV0L3BsdWdpbi9wbHVnaW4udHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3ByZWFkc2hlZXRFbmdpbmUgfSBmcm9tICcuLi9zcHJlYWRzaGVldC1lbmdpbmUnO1xuXG4vKiogUGx1Z2luIGxpZmVjeWNsZSBpbnRlcmZhY2UuIEV2ZXJ5IHNwcmVhZHNoZWV0IHBsdWdpbiBtdXN0IGltcGxlbWVudCB0aGlzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcHJlYWRzaGVldFBsdWdpbiB7XG4gIC8qKiBVbmlxdWUgcGx1Z2luIG5hbWUgZm9yIGlkZW50aWZpY2F0aW9uLiAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBFeGVjdXRpb24gcHJpb3JpdHkg4oCTIGxvd2VyIHJ1bnMgZmlyc3QuIERlZmF1bHQgMC4gKi9cbiAgcmVhZG9ubHkgcHJpb3JpdHk/OiBudW1iZXI7XG4gIC8qKiBDYWxsZWQgd2hlbiB0aGUgZW5naW5lIGluaXRpYWxpemVzLiAqL1xuICBvbkluaXQ/KGVuZ2luZTogU3ByZWFkc2hlZXRFbmdpbmUpOiB2b2lkO1xuICAvKiogQ2FsbGVkIHdoZW4gdGhlIGVuZ2luZSBpcyBkZXN0cm95ZWQuICovXG4gIG9uRGVzdHJveT8oKTogdm9pZDtcbiAgLyoqIENhbGxlZCBiZWZvcmUgZWFjaCByZW5kZXIgY3ljbGUuIFJldHVybiBmYWxzZSB0byBjYW5jZWwuICovXG4gIG9uQmVmb3JlUmVuZGVyPygpOiBib29sZWFuO1xuICAvKiogQ2FsbGVkIGFmdGVyIGVhY2ggcmVuZGVyIGN5Y2xlLiAqL1xuICBvbkFmdGVyUmVuZGVyPygpOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSBhIGNlbGwgZWRpdCBiZWdpbnMuIFJldHVybiBmYWxzZSB0byBjYW5jZWwuICovXG4gIG9uQmVmb3JlRWRpdD8ocm93SW5kZXg6IG51bWJlciwgY29sSWQ6IHN0cmluZyk6IGJvb2xlYW47XG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBjZWxsIGVkaXQgY29tcGxldGVzLiAqL1xuICBvbkFmdGVyRWRpdD8ocm93SW5kZXg6IG51bWJlciwgY29sSWQ6IHN0cmluZywgb2xkVmFsdWU6IHVua25vd24sIG5ld1ZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgLyoqIENhbGxlZCBiZWZvcmUgYSBzb3J0IG9wZXJhdGlvbi4gUmV0dXJuIGZhbHNlIHRvIGNhbmNlbC4gKi9cbiAgb25CZWZvcmVTb3J0Pyhjb2xJZDogc3RyaW5nLCBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgbnVsbCk6IGJvb2xlYW47XG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBzb3J0IG9wZXJhdGlvbi4gKi9cbiAgb25BZnRlclNvcnQ/KCk6IHZvaWQ7XG4gIC8qKiBDYWxsZWQgYmVmb3JlIGEgZmlsdGVyIG9wZXJhdGlvbi4gUmV0dXJuIGZhbHNlIHRvIGNhbmNlbC4gKi9cbiAgb25CZWZvcmVGaWx0ZXI/KCk6IGJvb2xlYW47XG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBmaWx0ZXIgb3BlcmF0aW9uLiAqL1xuICBvbkFmdGVyRmlsdGVyPygpOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSByb3dzIGFyZSBpbnNlcnRlZC4gUmV0dXJuIGZhbHNlIHRvIGNhbmNlbC4gKi9cbiAgb25CZWZvcmVJbnNlcnRSb3dzPyhjb3VudDogbnVtYmVyLCBhdEluZGV4OiBudW1iZXIpOiBib29sZWFuO1xuICAvKiogQ2FsbGVkIGFmdGVyIHJvd3MgYXJlIGluc2VydGVkLiAqL1xuICBvbkFmdGVySW5zZXJ0Um93cz8oaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSByb3dzIGFyZSBkZWxldGVkLiBSZXR1cm4gZmFsc2UgdG8gY2FuY2VsLiAqL1xuICBvbkJlZm9yZURlbGV0ZVJvd3M/KGluZGljZXM6IG51bWJlcltdKTogYm9vbGVhbjtcbiAgLyoqIENhbGxlZCBhZnRlciByb3dzIGFyZSBkZWxldGVkLiAqL1xuICBvbkFmdGVyRGVsZXRlUm93cz8oaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSBjb2x1bW5zIGFyZSBpbnNlcnRlZC4gUmV0dXJuIGZhbHNlIHRvIGNhbmNlbC4gKi9cbiAgb25CZWZvcmVJbnNlcnRDb2x1bW5zPyhjb3VudDogbnVtYmVyLCBhdEluZGV4OiBudW1iZXIpOiBib29sZWFuO1xuICAvKiogQ2FsbGVkIGFmdGVyIGNvbHVtbnMgYXJlIGluc2VydGVkLiAqL1xuICBvbkFmdGVySW5zZXJ0Q29sdW1ucz8oaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSBjb2x1bW5zIGFyZSBkZWxldGVkLiBSZXR1cm4gZmFsc2UgdG8gY2FuY2VsLiAqL1xuICBvbkJlZm9yZURlbGV0ZUNvbHVtbnM/KGluZGljZXM6IG51bWJlcltdKTogYm9vbGVhbjtcbiAgLyoqIENhbGxlZCBhZnRlciBjb2x1bW5zIGFyZSBkZWxldGVkLiAqL1xuICBvbkFmdGVyRGVsZXRlQ29sdW1ucz8oaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSBjbGlwYm9hcmQgcGFzdGUuIFJldHVybiBmYWxzZSB0byBjYW5jZWwuICovXG4gIG9uQmVmb3JlUGFzdGU/KGRhdGE6IHN0cmluZywgc3RhcnRDZWxsOiB7IHJvdzogbnVtYmVyOyBjb2w6IG51bWJlciB9KTogYm9vbGVhbjtcbiAgLyoqIENhbGxlZCBhZnRlciBjbGlwYm9hcmQgcGFzdGUuICovXG4gIG9uQWZ0ZXJQYXN0ZT8oKTogdm9pZDtcbiAgLyoqIENhbGxlZCBiZWZvcmUgY2xpcGJvYXJkIGNvcHkuIFJldHVybiBmYWxzZSB0byBjYW5jZWwuICovXG4gIG9uQmVmb3JlQ29weT8oKTogYm9vbGVhbjtcbiAgLyoqIENhbGxlZCBhZnRlciBjbGlwYm9hcmQgY29weS4gKi9cbiAgb25BZnRlckNvcHk/KCk6IHZvaWQ7XG4gIC8qKiBDdXN0b20gZXZlbnQgaGFuZGxlciBmb3IgYXJiaXRyYXJ5IHNwcmVhZHNoZWV0IGV2ZW50cy4gKi9cbiAgb25FdmVudD8oZXZlbnRUeXBlOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pOiB2b2lkO1xufVxuIl19
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelectionPlugin manages cell/row/column/range selection state.
|
|
3
|
+
* Handles keyboard navigation and selection extension.
|
|
4
|
+
*/
|
|
5
|
+
export class SelectionPlugin {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.name = 'selection';
|
|
8
|
+
this.priority = 5;
|
|
9
|
+
this._engine = null;
|
|
10
|
+
}
|
|
11
|
+
onInit(engine) {
|
|
12
|
+
this._engine = engine;
|
|
13
|
+
}
|
|
14
|
+
/** Select a single cell. */
|
|
15
|
+
selectCell(row, col) {
|
|
16
|
+
if (!this._engine)
|
|
17
|
+
return;
|
|
18
|
+
this._engine.selection.set({
|
|
19
|
+
...this._engine.selection(),
|
|
20
|
+
activeCell: { row, col },
|
|
21
|
+
range: { start: { row, col }, end: { row, col } },
|
|
22
|
+
mode: 'cell',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** Select a rectangular range. */
|
|
26
|
+
selectRange(start, end) {
|
|
27
|
+
if (!this._engine)
|
|
28
|
+
return;
|
|
29
|
+
this._engine.selection.set({
|
|
30
|
+
...this._engine.selection(),
|
|
31
|
+
range: { start, end },
|
|
32
|
+
mode: 'range',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Select an entire row. */
|
|
36
|
+
selectRow(rowIndex) {
|
|
37
|
+
if (!this._engine)
|
|
38
|
+
return;
|
|
39
|
+
const rows = new Set(this._engine.selection().selectedRows);
|
|
40
|
+
if (rows.has(rowIndex)) {
|
|
41
|
+
rows.delete(rowIndex);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
rows.add(rowIndex);
|
|
45
|
+
}
|
|
46
|
+
this._engine.selection.set({
|
|
47
|
+
...this._engine.selection(),
|
|
48
|
+
selectedRows: rows,
|
|
49
|
+
mode: 'row',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** Select an entire column. */
|
|
53
|
+
selectColumn(colIndex) {
|
|
54
|
+
if (!this._engine)
|
|
55
|
+
return;
|
|
56
|
+
const cols = new Set(this._engine.selection().selectedCols);
|
|
57
|
+
if (cols.has(colIndex)) {
|
|
58
|
+
cols.delete(colIndex);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
cols.add(colIndex);
|
|
62
|
+
}
|
|
63
|
+
this._engine.selection.set({
|
|
64
|
+
...this._engine.selection(),
|
|
65
|
+
selectedCols: cols,
|
|
66
|
+
mode: 'column',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/** Extend the range selection to include the given cell. */
|
|
70
|
+
extendSelection(row, col) {
|
|
71
|
+
if (!this._engine)
|
|
72
|
+
return;
|
|
73
|
+
const sel = this._engine.selection();
|
|
74
|
+
if (!sel.range) {
|
|
75
|
+
this.selectRange(sel.activeCell ?? { row, col }, { row, col });
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
this.selectRange(sel.range.start, { row, col });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Clear all selection. */
|
|
82
|
+
clearSelection() {
|
|
83
|
+
if (!this._engine)
|
|
84
|
+
return;
|
|
85
|
+
this._engine.selection.set({
|
|
86
|
+
activeCell: null,
|
|
87
|
+
range: null,
|
|
88
|
+
selectedRows: new Set(),
|
|
89
|
+
selectedCols: new Set(),
|
|
90
|
+
mode: 'cell',
|
|
91
|
+
dragging: false,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** Check if a cell is within the current selection. */
|
|
95
|
+
isSelected(row, col) {
|
|
96
|
+
const sel = this._engine?.selection();
|
|
97
|
+
if (!sel)
|
|
98
|
+
return false;
|
|
99
|
+
if (sel.range) {
|
|
100
|
+
const minRow = Math.min(sel.range.start.row, sel.range.end.row);
|
|
101
|
+
const maxRow = Math.max(sel.range.start.row, sel.range.end.row);
|
|
102
|
+
const minCol = Math.min(sel.range.start.col, sel.range.end.col);
|
|
103
|
+
const maxCol = Math.max(sel.range.start.col, sel.range.end.col);
|
|
104
|
+
if (row >= minRow && row <= maxRow && col >= minCol && col <= maxCol)
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
if (sel.selectedRows.has(row))
|
|
108
|
+
return true;
|
|
109
|
+
if (sel.selectedCols.has(col))
|
|
110
|
+
return true;
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLXBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay9zcHJlYWRzaGVldC9wbHVnaW4vc2VsZWN0aW9uLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUE1QjtRQUNXLFNBQUksR0FBRyxXQUFXLENBQUM7UUFDbkIsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUVkLFlBQU8sR0FBNkIsSUFBSSxDQUFDO0lBcUduRCxDQUFDO0lBbkdDLE1BQU0sQ0FBQyxNQUF5QjtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLFVBQVUsQ0FBQyxHQUFXLEVBQUUsR0FBVztRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUN6QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQzNCLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNqRCxJQUFJLEVBQUUsTUFBTTtTQUNiLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsV0FBVyxDQUFDLEtBQWtCLEVBQUUsR0FBZ0I7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDekIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUMzQixL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RyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFdkIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRSxJQUFJLEdBQUcsSUFBSSxNQUFNLElBQUksR0FBRyxJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3BGLENBQUM7UUFFRCxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNDLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFM0MsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNwcmVhZHNoZWV0UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4udHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTcHJlYWRzaGVldEVuZ2luZSB9IGZyb20gJy4uL3NwcmVhZHNoZWV0LWVuZ2luZSc7XG5pbXBvcnQgdHlwZSB7IENlbGxBZGRyZXNzIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuLyoqXG4gKiBTZWxlY3Rpb25QbHVnaW4gbWFuYWdlcyBjZWxsL3Jvdy9jb2x1bW4vcmFuZ2Ugc2VsZWN0aW9uIHN0YXRlLlxuICogSGFuZGxlcyBrZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBzZWxlY3Rpb24gZXh0ZW5zaW9uLlxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uUGx1Z2luIGltcGxlbWVudHMgU3ByZWFkc2hlZXRQbHVnaW4ge1xuICByZWFkb25seSBuYW1lID0gJ3NlbGVjdGlvbic7XG4gIHJlYWRvbmx5IHByaW9yaXR5ID0gNTtcblxuICBwcml2YXRlIF9lbmdpbmU6IFNwcmVhZHNoZWV0RW5naW5lIHwgbnVsbCA9IG51bGw7XG5cbiAgb25Jbml0KGVuZ2luZTogU3ByZWFkc2hlZXRFbmdpbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmdpbmUgPSBlbmdpbmU7XG4gIH1cblxuICAvKiogU2VsZWN0IGEgc2luZ2xlIGNlbGwuICovXG4gIHNlbGVjdENlbGwocm93OiBudW1iZXIsIGNvbDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmdpbmUpIHJldHVybjtcbiAgICB0aGlzLl9lbmdpbmUuc2VsZWN0aW9uLnNldCh7XG4gICAgICAuLi50aGlzLl9lbmdpbmUuc2VsZWN0aW9uKCksXG4gICAgICBhY3RpdmVDZWxsOiB7IHJvdywgY29sIH0sXG4gICAgICByYW5nZTogeyBzdGFydDogeyByb3csIGNvbCB9LCBlbmQ6IHsgcm93LCBjb2wgfSB9LFxuICAgICAgbW9kZTogJ2NlbGwnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNlbGVjdCBhIHJlY3Rhbmd1bGFyIHJhbmdlLiAqL1xuICBzZWxlY3RSYW5nZShzdGFydDogQ2VsbEFkZHJlc3MsIGVuZDogQ2VsbEFkZHJlc3MpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2VuZ2luZSkgcmV0dXJuO1xuICAgIHRoaXMuX2VuZ2luZS5zZWxlY3Rpb24uc2V0KHtcbiAgICAgIC4uLnRoaXMuX2VuZ2luZS5zZWxlY3Rpb24oKSxcbiAgICAgIHJhbmdlOiB7IHN0YXJ0LCBlbmQgfSxcbiAgICAgIG1vZGU6ICdyYW5nZScsXG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VsZWN0IGFuIGVudGlyZSByb3cuICovXG4gIHNlbGVjdFJvdyhyb3dJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmdpbmUpIHJldHVybjtcbiAgICBjb25zdCByb3dzID0gbmV3IFNldCh0aGlzLl9lbmdpbmUuc2VsZWN0aW9uKCkuc2VsZWN0ZWRSb3dzKTtcbiAgICBpZiAocm93cy5oYXMocm93SW5kZXgpKSB7XG4gICAgICByb3dzLmRlbGV0ZShyb3dJbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvd3MuYWRkKHJvd0luZGV4KTtcbiAgICB9XG4gICAgdGhpcy5fZW5naW5lLnNlbGVjdGlvbi5zZXQoe1xuICAgICAgLi4udGhpcy5fZW5naW5lLnNlbGVjdGlvbigpLFxuICAgICAgc2VsZWN0ZWRSb3dzOiByb3dzLFxuICAgICAgbW9kZTogJ3JvdycsXG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VsZWN0IGFuIGVudGlyZSBjb2x1bW4uICovXG4gIHNlbGVjdENvbHVtbihjb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmdpbmUpIHJldHVybjtcbiAgICBjb25zdCBjb2xzID0gbmV3IFNldCh0aGlzLl9lbmdpbmUuc2VsZWN0aW9uKCkuc2VsZWN0ZWRDb2xzKTtcbiAgICBpZiAoY29scy5oYXMoY29sSW5kZXgpKSB7XG4gICAgICBjb2xzLmRlbGV0ZShjb2xJbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHMuYWRkKGNvbEluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5fZW5naW5lLnNlbGVjdGlvbi5zZXQoe1xuICAgICAgLi4udGhpcy5fZW5naW5lLnNlbGVjdGlvbigpLFxuICAgICAgc2VsZWN0ZWRDb2xzOiBjb2xzLFxuICAgICAgbW9kZTogJ2NvbHVtbicsXG4gICAgfSk7XG4gIH1cblxuICAvKiogRXh0ZW5kIHRoZSByYW5nZSBzZWxlY3Rpb24gdG8gaW5jbHVkZSB0aGUgZ2l2ZW4gY2VsbC4gKi9cbiAgZXh0ZW5kU2VsZWN0aW9uKHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5naW5lKSByZXR1cm47XG4gICAgY29uc3Qgc2VsID0gdGhpcy5fZW5naW5lLnNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsLnJhbmdlKSB7XG4gICAgICB0aGlzLnNlbGVjdFJhbmdlKHNlbC5hY3RpdmVDZWxsID8/IHsgcm93LCBjb2wgfSwgeyByb3csIGNvbCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RSYW5nZShzZWwucmFuZ2Uuc3RhcnQsIHsgcm93LCBjb2wgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzZWxlY3Rpb24uICovXG4gIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5naW5lKSByZXR1cm47XG4gICAgdGhpcy5fZW5naW5lLnNlbGVjdGlvbi5zZXQoe1xuICAgICAgYWN0aXZlQ2VsbDogbnVsbCxcbiAgICAgIHJhbmdlOiBudWxsLFxuICAgICAgc2VsZWN0ZWRSb3dzOiBuZXcgU2V0KCksXG4gICAgICBzZWxlY3RlZENvbHM6IG5ldyBTZXQoKSxcbiAgICAgIG1vZGU6ICdjZWxsJyxcbiAgICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDaGVjayBpZiBhIGNlbGwgaXMgd2l0aGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gKi9cbiAgaXNTZWxlY3RlZChyb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLl9lbmdpbmU/LnNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoc2VsLnJhbmdlKSB7XG4gICAgICBjb25zdCBtaW5Sb3cgPSBNYXRoLm1pbihzZWwucmFuZ2Uuc3RhcnQucm93LCBzZWwucmFuZ2UuZW5kLnJvdyk7XG4gICAgICBjb25zdCBtYXhSb3cgPSBNYXRoLm1heChzZWwucmFuZ2Uuc3RhcnQucm93LCBzZWwucmFuZ2UuZW5kLnJvdyk7XG4gICAgICBjb25zdCBtaW5Db2wgPSBNYXRoLm1pbihzZWwucmFuZ2Uuc3RhcnQuY29sLCBzZWwucmFuZ2UuZW5kLmNvbCk7XG4gICAgICBjb25zdCBtYXhDb2wgPSBNYXRoLm1heChzZWwucmFuZ2Uuc3RhcnQuY29sLCBzZWwucmFuZ2UuZW5kLmNvbCk7XG4gICAgICBpZiAocm93ID49IG1pblJvdyAmJiByb3cgPD0gbWF4Um93ICYmIGNvbCA+PSBtaW5Db2wgJiYgY29sIDw9IG1heENvbCkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHNlbC5zZWxlY3RlZFJvd3MuaGFzKHJvdykpIHJldHVybiB0cnVlO1xuICAgIGlmIChzZWwuc2VsZWN0ZWRDb2xzLmhhcyhjb2wpKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SortPlugin manages multi-column sorting.
|
|
3
|
+
* Sorts the engine's rows by the active sort criteria.
|
|
4
|
+
*/
|
|
5
|
+
export class SortPlugin {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.name = 'sort';
|
|
8
|
+
this.priority = 10;
|
|
9
|
+
this._engine = null;
|
|
10
|
+
}
|
|
11
|
+
onInit(engine) {
|
|
12
|
+
this._engine = engine;
|
|
13
|
+
}
|
|
14
|
+
/** Apply all active sort criteria to the engine's row list. */
|
|
15
|
+
applySort(criteria) {
|
|
16
|
+
if (!this._engine || criteria.length === 0)
|
|
17
|
+
return;
|
|
18
|
+
const defs = this._engine.columnDefs();
|
|
19
|
+
const sorted = [...this._engine.rowData()];
|
|
20
|
+
sorted.sort((a, b) => {
|
|
21
|
+
for (const crit of criteria) {
|
|
22
|
+
const col = defs.find((d) => d.id === crit.colId);
|
|
23
|
+
const aVal = a.cells[crit.colId]?.value;
|
|
24
|
+
const bVal = b.cells[crit.colId]?.value;
|
|
25
|
+
let cmp;
|
|
26
|
+
if (col?.comparator) {
|
|
27
|
+
cmp = col.comparator(aVal, bVal, crit.direction);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
cmp = defaultCompare(aVal, bVal);
|
|
31
|
+
}
|
|
32
|
+
if (cmp !== 0) {
|
|
33
|
+
return crit.direction === 'desc' ? -cmp : cmp;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return 0;
|
|
37
|
+
});
|
|
38
|
+
this._engine.rowData.set(sorted);
|
|
39
|
+
}
|
|
40
|
+
onBeforeSort(_colId, _direction) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
onAfterSort() {
|
|
44
|
+
const criteria = this._engine?.sortState().criteria;
|
|
45
|
+
if (criteria && criteria.length > 0) {
|
|
46
|
+
this.applySort(criteria);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function defaultCompare(a, b) {
|
|
51
|
+
if (a == null && b == null)
|
|
52
|
+
return 0;
|
|
53
|
+
if (a == null)
|
|
54
|
+
return -1;
|
|
55
|
+
if (b == null)
|
|
56
|
+
return 1;
|
|
57
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
58
|
+
return a - b;
|
|
59
|
+
if (a instanceof Date && b instanceof Date)
|
|
60
|
+
return a.getTime() - b.getTime();
|
|
61
|
+
return String(a).localeCompare(String(b));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc3ByZWFkc2hlZXQvcGx1Z2luL3NvcnQtcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBOzs7R0FHRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBQXZCO1FBQ1csU0FBSSxHQUFHLE1BQU0sQ0FBQztRQUNkLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFFZixZQUFPLEdBQTZCLElBQUksQ0FBQztJQThDbkQsQ0FBQztJQTVDQyxNQUFNLENBQUMsTUFBeUI7UUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDeEIsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxTQUFTLENBQUMsUUFBa0M7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUVuRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDO2dCQUN4QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUM7Z0JBRXhDLElBQUksR0FBVyxDQUFDO2dCQUNoQixJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQztvQkFDcEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ25ELENBQUM7cUJBQU0sQ0FBQztvQkFDTixHQUFHLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztnQkFFRCxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNoRCxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFjLEVBQUUsVUFBaUM7UUFDNUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3BELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsU0FBUyxjQUFjLENBQUMsQ0FBVSxFQUFFLENBQVU7SUFDNUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLElBQUksSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFDLElBQUksSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJO1FBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdFLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTcHJlYWRzaGVldFBsdWdpbiB9IGZyb20gJy4vcGx1Z2luLnR5cGVzJztcbmltcG9ydCB0eXBlIHsgU3ByZWFkc2hlZXRFbmdpbmUgfSBmcm9tICcuLi9zcHJlYWRzaGVldC1lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBTb3J0Q3JpdGVyaW9uIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuLyoqXG4gKiBTb3J0UGx1Z2luIG1hbmFnZXMgbXVsdGktY29sdW1uIHNvcnRpbmcuXG4gKiBTb3J0cyB0aGUgZW5naW5lJ3Mgcm93cyBieSB0aGUgYWN0aXZlIHNvcnQgY3JpdGVyaWEuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb3J0UGx1Z2luIGltcGxlbWVudHMgU3ByZWFkc2hlZXRQbHVnaW4ge1xuICByZWFkb25seSBuYW1lID0gJ3NvcnQnO1xuICByZWFkb25seSBwcmlvcml0eSA9IDEwO1xuXG4gIHByaXZhdGUgX2VuZ2luZTogU3ByZWFkc2hlZXRFbmdpbmUgfCBudWxsID0gbnVsbDtcblxuICBvbkluaXQoZW5naW5lOiBTcHJlYWRzaGVldEVuZ2luZSk6IHZvaWQge1xuICAgIHRoaXMuX2VuZ2luZSA9IGVuZ2luZTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhbGwgYWN0aXZlIHNvcnQgY3JpdGVyaWEgdG8gdGhlIGVuZ2luZSdzIHJvdyBsaXN0LiAqL1xuICBhcHBseVNvcnQoY3JpdGVyaWE6IHJlYWRvbmx5IFNvcnRDcml0ZXJpb25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5naW5lIHx8IGNyaXRlcmlhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGVmcyA9IHRoaXMuX2VuZ2luZS5jb2x1bW5EZWZzKCk7XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLnRoaXMuX2VuZ2luZS5yb3dEYXRhKCldO1xuXG4gICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY3JpdCBvZiBjcml0ZXJpYSkge1xuICAgICAgICBjb25zdCBjb2wgPSBkZWZzLmZpbmQoKGQpID0+IGQuaWQgPT09IGNyaXQuY29sSWQpO1xuICAgICAgICBjb25zdCBhVmFsID0gYS5jZWxsc1tjcml0LmNvbElkXT8udmFsdWU7XG4gICAgICAgIGNvbnN0IGJWYWwgPSBiLmNlbGxzW2NyaXQuY29sSWRdPy52YWx1ZTtcblxuICAgICAgICBsZXQgY21wOiBudW1iZXI7XG4gICAgICAgIGlmIChjb2w/LmNvbXBhcmF0b3IpIHtcbiAgICAgICAgICBjbXAgPSBjb2wuY29tcGFyYXRvcihhVmFsLCBiVmFsLCBjcml0LmRpcmVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY21wID0gZGVmYXVsdENvbXBhcmUoYVZhbCwgYlZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY21wICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNyaXQuZGlyZWN0aW9uID09PSAnZGVzYycgPyAtY21wIDogY21wO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHRoaXMuX2VuZ2luZS5yb3dEYXRhLnNldChzb3J0ZWQpO1xuICB9XG5cbiAgb25CZWZvcmVTb3J0KF9jb2xJZDogc3RyaW5nLCBfZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uQWZ0ZXJTb3J0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNyaXRlcmlhID0gdGhpcy5fZW5naW5lPy5zb3J0U3RhdGUoKS5jcml0ZXJpYTtcbiAgICBpZiAoY3JpdGVyaWEgJiYgY3JpdGVyaWEubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hcHBseVNvcnQoY3JpdGVyaWEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyZShhOiB1bmtub3duLCBiOiB1bmtub3duKTogbnVtYmVyIHtcbiAgaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpIHJldHVybiAwO1xuICBpZiAoYSA9PSBudWxsKSByZXR1cm4gLTE7XG4gIGlmIChiID09IG51bGwpIHJldHVybiAxO1xuICBpZiAodHlwZW9mIGEgPT09ICdudW1iZXInICYmIHR5cGVvZiBiID09PSAnbnVtYmVyJykgcmV0dXJuIGEgLSBiO1xuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBhLmdldFRpbWUoKSAtIGIuZ2V0VGltZSgpO1xuICByZXR1cm4gU3RyaW5nKGEpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIpKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UndoPlugin provides undo/redo by maintaining a history stack.
|
|
3
|
+
* Captures snapshots before mutations.
|
|
4
|
+
*/
|
|
5
|
+
export class UndoPlugin {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.name = 'undo';
|
|
8
|
+
this.priority = 100;
|
|
9
|
+
this._engine = null;
|
|
10
|
+
this._undoStack = [];
|
|
11
|
+
this._redoStack = [];
|
|
12
|
+
this._maxHistory = 100;
|
|
13
|
+
}
|
|
14
|
+
onInit(engine) {
|
|
15
|
+
this._engine = engine;
|
|
16
|
+
}
|
|
17
|
+
onDestroy() {
|
|
18
|
+
this._undoStack = [];
|
|
19
|
+
this._redoStack = [];
|
|
20
|
+
}
|
|
21
|
+
/** Record an edit mutation for undo. */
|
|
22
|
+
recordEdit(rowIndex, colId, oldValue, newValue) {
|
|
23
|
+
this._push({
|
|
24
|
+
type: 'edit',
|
|
25
|
+
timestamp: Date.now(),
|
|
26
|
+
edits: [{ rowIndex, colId, oldValue, newValue }],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/** Record a bulk edit (multiple cells). */
|
|
30
|
+
recordBulkEdit(edits) {
|
|
31
|
+
if (edits.length === 0)
|
|
32
|
+
return;
|
|
33
|
+
this._push({ type: 'edit', timestamp: Date.now(), edits });
|
|
34
|
+
}
|
|
35
|
+
/** Undo the last mutation. */
|
|
36
|
+
undo() {
|
|
37
|
+
if (!this._engine || this._undoStack.length === 0)
|
|
38
|
+
return false;
|
|
39
|
+
const entry = this._undoStack.pop();
|
|
40
|
+
this._applyUndo(entry);
|
|
41
|
+
this._redoStack.push(entry);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
/** Redo the last undone mutation. */
|
|
45
|
+
redo() {
|
|
46
|
+
if (!this._engine || this._redoStack.length === 0)
|
|
47
|
+
return false;
|
|
48
|
+
const entry = this._redoStack.pop();
|
|
49
|
+
this._applyRedo(entry);
|
|
50
|
+
this._undoStack.push(entry);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/** Whether undo is available. */
|
|
54
|
+
get canUndo() {
|
|
55
|
+
return this._undoStack.length > 0;
|
|
56
|
+
}
|
|
57
|
+
/** Whether redo is available. */
|
|
58
|
+
get canRedo() {
|
|
59
|
+
return this._redoStack.length > 0;
|
|
60
|
+
}
|
|
61
|
+
/** Clear all history. */
|
|
62
|
+
clearHistory() {
|
|
63
|
+
this._undoStack = [];
|
|
64
|
+
this._redoStack = [];
|
|
65
|
+
}
|
|
66
|
+
_push(entry) {
|
|
67
|
+
this._undoStack.push(entry);
|
|
68
|
+
if (this._undoStack.length > this._maxHistory) {
|
|
69
|
+
this._undoStack.shift();
|
|
70
|
+
}
|
|
71
|
+
this._redoStack = [];
|
|
72
|
+
}
|
|
73
|
+
_applyUndo(entry) {
|
|
74
|
+
if (!this._engine)
|
|
75
|
+
return;
|
|
76
|
+
if (entry.type === 'edit' && entry.edits) {
|
|
77
|
+
const rows = [...this._engine.rowData()];
|
|
78
|
+
for (const edit of entry.edits) {
|
|
79
|
+
if (rows[edit.rowIndex]) {
|
|
80
|
+
rows[edit.rowIndex] = {
|
|
81
|
+
...rows[edit.rowIndex],
|
|
82
|
+
cells: {
|
|
83
|
+
...rows[edit.rowIndex].cells,
|
|
84
|
+
[edit.colId]: {
|
|
85
|
+
value: edit.oldValue,
|
|
86
|
+
meta: rows[edit.rowIndex].cells[edit.colId]?.meta,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
this._engine.rowData.set(rows);
|
|
93
|
+
}
|
|
94
|
+
else if (entry.type === 'delete_rows' && entry.rows) {
|
|
95
|
+
const rows = [...this._engine.rowData()];
|
|
96
|
+
rows.splice(entry.rowIndex ?? 0, 0, ...entry.rows);
|
|
97
|
+
this._engine.rowData.set(rows);
|
|
98
|
+
}
|
|
99
|
+
else if (entry.type === 'insert_rows' && entry.rowIndex != null) {
|
|
100
|
+
const rows = [...this._engine.rowData()];
|
|
101
|
+
rows.splice(entry.rowIndex, entry.rows?.length ?? 0);
|
|
102
|
+
this._engine.rowData.set(rows);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
_applyRedo(entry) {
|
|
106
|
+
if (!this._engine)
|
|
107
|
+
return;
|
|
108
|
+
if (entry.type === 'edit' && entry.edits) {
|
|
109
|
+
const rows = [...this._engine.rowData()];
|
|
110
|
+
for (const edit of entry.edits) {
|
|
111
|
+
if (rows[edit.rowIndex]) {
|
|
112
|
+
rows[edit.rowIndex] = {
|
|
113
|
+
...rows[edit.rowIndex],
|
|
114
|
+
cells: {
|
|
115
|
+
...rows[edit.rowIndex].cells,
|
|
116
|
+
[edit.colId]: {
|
|
117
|
+
value: edit.newValue,
|
|
118
|
+
meta: rows[edit.rowIndex].cells[edit.colId]?.meta,
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
this._engine.rowData.set(rows);
|
|
125
|
+
}
|
|
126
|
+
else if (entry.type === 'insert_rows' && entry.rows) {
|
|
127
|
+
const rows = [...this._engine.rowData()];
|
|
128
|
+
rows.splice(entry.rowIndex ?? 0, 0, ...entry.rows);
|
|
129
|
+
this._engine.rowData.set(rows);
|
|
130
|
+
}
|
|
131
|
+
else if (entry.type === 'delete_rows' && entry.rowIndex != null) {
|
|
132
|
+
const rows = [...this._engine.rowData()];
|
|
133
|
+
rows.splice(entry.rowIndex, entry.rows?.length ?? 0);
|
|
134
|
+
this._engine.rowData.set(rows);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5kby1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc3ByZWFkc2hlZXQvcGx1Z2luL3VuZG8tcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdCQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUF2QjtRQUNXLFNBQUksR0FBRyxNQUFNLENBQUM7UUFDZCxhQUFRLEdBQUcsR0FBRyxDQUFDO1FBRWhCLFlBQU8sR0FBNkIsSUFBSSxDQUFDO1FBQ3pDLGVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQzdCLGVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQzdCLGdCQUFXLEdBQUcsR0FBRyxDQUFDO0lBbUk1QixDQUFDO0lBaklDLE1BQU0sQ0FBQyxNQUF5QjtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsVUFBVSxDQUFDLFFBQWdCLEVBQUUsS0FBYSxFQUFFLFFBQW1CLEVBQUUsUUFBbUI7UUFDbEYsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNULElBQUksRUFBRSxNQUFNO1lBQ1osU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLGNBQWMsQ0FDWixLQUFzRjtRQUV0RixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUs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LENBQUMsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xFLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTcHJlYWRzaGVldFBsdWdpbiB9IGZyb20gJy4vcGx1Z2luLnR5cGVzJztcbmltcG9ydCB0eXBlIHsgU3ByZWFkc2hlZXRFbmdpbmUgfSBmcm9tICcuLi9zcHJlYWRzaGVldC1lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBDZWxsVmFsdWUsIFJvd0RlZiB9IGZyb20gJy4uL21vZGVscyc7XG5cbmludGVyZmFjZSBVbmRvRW50cnkge1xuICByZWFkb25seSB0eXBlOiAnZWRpdCcgfCAnaW5zZXJ0X3Jvd3MnIHwgJ2RlbGV0ZV9yb3dzJyB8ICdpbnNlcnRfY29scycgfCAnZGVsZXRlX2NvbHMnO1xuICByZWFkb25seSB0aW1lc3RhbXA6IG51bWJlcjtcbiAgLyoqIEZvciBlZGl0OiByb3cgaW5kZXggKyBjb2wgaWQgKyBvbGQgdmFsdWUuICovXG4gIHJlYWRvbmx5IGVkaXRzPzogeyByb3dJbmRleDogbnVtYmVyOyBjb2xJZDogc3RyaW5nOyBvbGRWYWx1ZTogQ2VsbFZhbHVlOyBuZXdWYWx1ZTogQ2VsbFZhbHVlIH1bXTtcbiAgLyoqIEZvciByb3cvY29sIGluc2VydC9kZWxldGU6IHRoZSBhY3R1YWwgZGF0YSB0aGF0IHdhcyByZW1vdmVkIG9yIGFkZGVkLiAqL1xuICByZWFkb25seSByb3dzPzogUm93RGVmW107XG4gIHJlYWRvbmx5IHJvd0luZGV4PzogbnVtYmVyO1xuICByZWFkb25seSBjb2xJZHM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgY29sV2lkdGhzPzogbnVtYmVyW107XG59XG5cbi8qKlxuICogVW5kb1BsdWdpbiBwcm92aWRlcyB1bmRvL3JlZG8gYnkgbWFpbnRhaW5pbmcgYSBoaXN0b3J5IHN0YWNrLlxuICogQ2FwdHVyZXMgc25hcHNob3RzIGJlZm9yZSBtdXRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmRvUGx1Z2luIGltcGxlbWVudHMgU3ByZWFkc2hlZXRQbHVnaW4ge1xuICByZWFkb25seSBuYW1lID0gJ3VuZG8nO1xuICByZWFkb25seSBwcmlvcml0eSA9IDEwMDtcblxuICBwcml2YXRlIF9lbmdpbmU6IFNwcmVhZHNoZWV0RW5naW5lIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3VuZG9TdGFjazogVW5kb0VudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBfcmVkb1N0YWNrOiBVbmRvRW50cnlbXSA9IFtdO1xuICBwcml2YXRlIF9tYXhIaXN0b3J5ID0gMTAwO1xuXG4gIG9uSW5pdChlbmdpbmU6IFNwcmVhZHNoZWV0RW5naW5lKTogdm9pZCB7XG4gICAgdGhpcy5fZW5naW5lID0gZW5naW5lO1xuICB9XG5cbiAgb25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3VuZG9TdGFjayA9IFtdO1xuICAgIHRoaXMuX3JlZG9TdGFjayA9IFtdO1xuICB9XG5cbiAgLyoqIFJlY29yZCBhbiBlZGl0IG11dGF0aW9uIGZvciB1bmRvLiAqL1xuICByZWNvcmRFZGl0KHJvd0luZGV4OiBudW1iZXIsIGNvbElkOiBzdHJpbmcsIG9sZFZhbHVlOiBDZWxsVmFsdWUsIG5ld1ZhbHVlOiBDZWxsVmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLl9wdXNoKHtcbiAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGVkaXRzOiBbeyByb3dJbmRleCwgY29sSWQsIG9sZFZhbHVlLCBuZXdWYWx1ZSB9XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWNvcmQgYSBidWxrIGVkaXQgKG11bHRpcGxlIGNlbGxzKS4gKi9cbiAgcmVjb3JkQnVsa0VkaXQoXG4gICAgZWRpdHM6IHsgcm93SW5kZXg6IG51bWJlcjsgY29sSWQ6IHN0cmluZzsgb2xkVmFsdWU6IENlbGxWYWx1ZTsgbmV3VmFsdWU6IENlbGxWYWx1ZSB9W10sXG4gICk6IHZvaWQge1xuICAgIGlmIChlZGl0cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLl9wdXNoKHsgdHlwZTogJ2VkaXQnLCB0aW1lc3RhbXA6IERhdGUubm93KCksIGVkaXRzIH0pO1xuICB9XG5cbiAgLyoqIFVuZG8gdGhlIGxhc3QgbXV0YXRpb24uICovXG4gIHVuZG8oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9lbmdpbmUgfHwgdGhpcy5fdW5kb1N0YWNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fdW5kb1N0YWNrLnBvcCgpITtcbiAgICB0aGlzLl9hcHBseVVuZG8oZW50cnkpO1xuICAgIHRoaXMuX3JlZG9TdGFjay5wdXNoKGVudHJ5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZWRvIHRoZSBsYXN0IHVuZG9uZSBtdXRhdGlvbi4gKi9cbiAgcmVkbygpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2VuZ2luZSB8fCB0aGlzLl9yZWRvU3RhY2subGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLl9yZWRvU3RhY2sucG9wKCkhO1xuICAgIHRoaXMuX2FwcGx5UmVkbyhlbnRyeSk7XG4gICAgdGhpcy5fdW5kb1N0YWNrLnB1c2goZW50cnkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdW5kbyBpcyBhdmFpbGFibGUuICovXG4gIGdldCBjYW5VbmRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91bmRvU3RhY2subGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHJlZG8gaXMgYXZhaWxhYmxlLiAqL1xuICBnZXQgY2FuUmVkbygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVkb1N0YWNrLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQ2xlYXIgYWxsIGhpc3RvcnkuICovXG4gIGNsZWFySGlzdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLl91bmRvU3RhY2sgPSBbXTtcbiAgICB0aGlzLl9yZWRvU3RhY2sgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgX3B1c2goZW50cnk6IFVuZG9FbnRyeSk6IHZvaWQge1xuICAgIHRoaXMuX3VuZG9TdGFjay5wdXNoKGVudHJ5KTtcbiAgICBpZiAodGhpcy5fdW5kb1N0YWNrLmxlbmd0aCA+IHRoaXMuX21heEhpc3RvcnkpIHtcbiAgICAgIHRoaXMuX3VuZG9TdGFjay5zaGlmdCgpO1xuICAgIH1cbiAgICB0aGlzLl9yZWRvU3RhY2sgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5VW5kbyhlbnRyeTogVW5kb0VudHJ5KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmdpbmUpIHJldHVybjtcblxuICAgIGlmIChlbnRyeS50eXBlID09PSAnZWRpdCcgJiYgZW50cnkuZWRpdHMpIHtcbiAgICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy5fZW5naW5lLnJvd0RhdGEoKV07XG4gICAgICBmb3IgKGNvbnN0IGVkaXQgb2YgZW50cnkuZWRpdHMpIHtcbiAgICAgICAgaWYgKHJvd3NbZWRpdC5yb3dJbmRleF0pIHtcbiAgICAgICAgICByb3dzW2VkaXQucm93SW5kZXhdID0ge1xuICAgICAgICAgICAgLi4ucm93c1tlZGl0LnJvd0luZGV4XSxcbiAgICAgICAgICAgIGNlbGxzOiB7XG4gICAgICAgICAgICAgIC4uLnJvd3NbZWRpdC5yb3dJbmRleF0uY2VsbHMsXG4gICAgICAgICAgICAgIFtlZGl0LmNvbElkXToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBlZGl0Lm9sZFZhbHVlLFxuICAgICAgICAgICAgICAgIG1ldGE6IHJvd3NbZWRpdC5yb3dJbmRleF0uY2VsbHNbZWRpdC5jb2xJZF0/Lm1ldGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2VuZ2luZS5yb3dEYXRhLnNldChyb3dzKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5LnR5cGUgPT09ICdkZWxldGVfcm93cycgJiYgZW50cnkucm93cykge1xuICAgICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLl9lbmdpbmUucm93RGF0YSgpXTtcbiAgICAgIHJvd3Muc3BsaWNlKGVudHJ5LnJvd0luZGV4ID8/IDAsIDAsIC4uLmVudHJ5LnJvd3MpO1xuICAgICAgdGhpcy5fZW5naW5lLnJvd0RhdGEuc2V0KHJvd3MpO1xuICAgIH0gZWxzZSBpZiAoZW50cnkudHlwZSA9PT0gJ2luc2VydF9yb3dzJyAmJiBlbnRyeS5yb3dJbmRleCAhPSBudWxsKSB7XG4gICAgICBjb25zdCByb3dzID0gWy4uLnRoaXMuX2VuZ2luZS5yb3dEYXRhKCldO1xuICAgICAgcm93cy5zcGxpY2UoZW50cnkucm93SW5kZXgsIGVudHJ5LnJvd3M/Lmxlbmd0aCA/PyAwKTtcbiAgICAgIHRoaXMuX2VuZ2luZS5yb3dEYXRhLnNldChyb3dzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVJlZG8oZW50cnk6IFVuZG9FbnRyeSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5naW5lKSByZXR1cm47XG5cbiAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2VkaXQnICYmIGVudHJ5LmVkaXRzKSB7XG4gICAgICBjb25zdCByb3dzID0gWy4uLnRoaXMuX2VuZ2luZS5yb3dEYXRhKCldO1xuICAgICAgZm9yIChjb25zdCBlZGl0IG9mIGVudHJ5LmVkaXRzKSB7XG4gICAgICAgIGlmIChyb3dzW2VkaXQucm93SW5kZXhdKSB7XG4gICAgICAgICAgcm93c1tlZGl0LnJvd0luZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLnJvd3NbZWRpdC5yb3dJbmRleF0sXG4gICAgICAgICAgICBjZWxsczoge1xuICAgICAgICAgICAgICAuLi5yb3dzW2VkaXQucm93SW5kZXhdLmNlbGxzLFxuICAgICAgICAgICAgICBbZWRpdC5jb2xJZF06IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZWRpdC5uZXdWYWx1ZSxcbiAgICAgICAgICAgICAgICBtZXRhOiByb3dzW2VkaXQucm93SW5kZXhdLmNlbGxzW2VkaXQuY29sSWRdPy5tZXRhLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9lbmdpbmUucm93RGF0YS5zZXQocm93cyk7XG4gICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnaW5zZXJ0X3Jvd3MnICYmIGVudHJ5LnJvd3MpIHtcbiAgICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy5fZW5naW5lLnJvd0RhdGEoKV07XG4gICAgICByb3dzLnNwbGljZShlbnRyeS5yb3dJbmRleCA/PyAwLCAwLCAuLi5lbnRyeS5yb3dzKTtcbiAgICAgIHRoaXMuX2VuZ2luZS5yb3dEYXRhLnNldChyb3dzKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5LnR5cGUgPT09ICdkZWxldGVfcm93cycgJiYgZW50cnkucm93SW5kZXggIT0gbnVsbCkge1xuICAgICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLl9lbmdpbmUucm93RGF0YSgpXTtcbiAgICAgIHJvd3Muc3BsaWNlKGVudHJ5LnJvd0luZGV4LCBlbnRyeS5yb3dzPy5sZW5ndGggPz8gMCk7XG4gICAgICB0aGlzLl9lbmdpbmUucm93RGF0YS5zZXQocm93cyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|