@aquera/ngx-smart-table 0.0.2-alpha
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 +152 -0
- package/aquera-ngx-smart-table.d.ts +5 -0
- package/esm2020/aquera-ngx-smart-table.mjs +5 -0
- package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
- package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
- package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
- package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
- package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
- package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
- package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
- package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
- package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
- package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
- package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
- package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
- package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
- package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
- package/esm2020/lib/editors/index.mjs +9 -0
- package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
- package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
- package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
- package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
- package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
- package/esm2020/lib/factories/column-config.factory.mjs +231 -0
- package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
- package/esm2020/lib/models/base-column-config.class.mjs +253 -0
- package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
- package/esm2020/lib/models/cell-types.mjs +147 -0
- package/esm2020/lib/models/column-action.interface.mjs +6 -0
- package/esm2020/lib/models/column-config.interface.mjs +43 -0
- package/esm2020/lib/models/column-config.utils.mjs +101 -0
- package/esm2020/lib/models/row-action.interface.mjs +5 -0
- package/esm2020/lib/models/row-validator.interface.mjs +2 -0
- package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
- package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
- package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
- package/esm2020/lib/models/table-config.interface.mjs +106 -0
- package/esm2020/lib/models/table-validator.interface.mjs +2 -0
- package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
- package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
- package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
- package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
- package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
- package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
- package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
- package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
- package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
- package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
- package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
- package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
- package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
- package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
- package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
- package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
- package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
- package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
- package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
- package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
- package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
- package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
- package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
- package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
- package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/table-types.mjs +29 -0
- package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
- package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
- package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
- package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
- package/esm2020/lib/services/autosave.service.mjs +92 -0
- package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
- package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
- package/esm2020/lib/services/row-validation.service.mjs +42 -0
- package/esm2020/lib/services/validation-logger.service.mjs +177 -0
- package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
- package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
- package/esm2020/lib/smart-table.module.mjs +124 -0
- package/esm2020/lib/strategies/default-editors.mjs +433 -0
- package/esm2020/lib/strategies/default-formatters.mjs +238 -0
- package/esm2020/lib/strategies/default-validators.mjs +327 -0
- package/esm2020/public-api.mjs +146 -0
- package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
- package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
- package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
- package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
- package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
- package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
- package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
- package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
- package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
- package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
- package/lib/builder/definition-builder.module.d.ts +15 -0
- package/lib/builder/models/builder-state.interface.d.ts +93 -0
- package/lib/builder/services/definition-builder.service.d.ts +80 -0
- package/lib/builder/services/definition-export.service.d.ts +59 -0
- package/lib/builder/services/definition-import.service.d.ts +31 -0
- package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
- package/lib/builder/utils/config-validator.util.d.ts +32 -0
- package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
- package/lib/editors/index.d.ts +8 -0
- package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
- package/lib/editors/nile-calendar-editor.d.ts +89 -0
- package/lib/editors/nile-date-picker-editor.d.ts +95 -0
- package/lib/editors/nile-input-editor.d.ts +67 -0
- package/lib/editors/nile-select-editor.d.ts +109 -0
- package/lib/factories/column-config.factory.d.ts +73 -0
- package/lib/models/autosave-config.interface.d.ts +23 -0
- package/lib/models/base-column-config.class.d.ts +115 -0
- package/lib/models/cell-strategies.interface.d.ts +181 -0
- package/lib/models/cell-types.d.ts +337 -0
- package/lib/models/column-action.interface.d.ts +86 -0
- package/lib/models/column-config.interface.d.ts +272 -0
- package/lib/models/column-config.utils.d.ts +37 -0
- package/lib/models/row-action.interface.d.ts +86 -0
- package/lib/models/row-validator.interface.d.ts +37 -0
- package/lib/models/schema-validation.interface.d.ts +42 -0
- package/lib/models/sheet-action.interface.d.ts +59 -0
- package/lib/models/sheet-config.interface.d.ts +41 -0
- package/lib/models/table-config.interface.d.ts +245 -0
- package/lib/models/table-validator.interface.d.ts +40 -0
- package/lib/models/workbook-action.interface.d.ts +90 -0
- package/lib/models/workbook-config.interface.d.ts +107 -0
- package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
- package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
- package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
- package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
- package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
- package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
- package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
- package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
- package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
- package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
- package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
- package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
- package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
- package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
- package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
- package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
- package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
- package/lib/renderer/models/cell-state.interface.d.ts +118 -0
- package/lib/renderer/models/cell.class.d.ts +174 -0
- package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
- package/lib/renderer/models/sheet-state.class.d.ts +67 -0
- package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
- package/lib/renderer/models/table-state.class.d.ts +313 -0
- package/lib/renderer/models/table-state.interface.d.ts +18 -0
- package/lib/renderer/models/table-types.d.ts +228 -0
- package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
- package/lib/renderer/models/workbook-state.class.d.ts +117 -0
- package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
- package/lib/renderer/models/z-index.enum.d.ts +44 -0
- package/lib/schemas/table-config.schema.d.ts +455 -0
- package/lib/services/autosave.service.d.ts +73 -0
- package/lib/services/custom-validation-rules.util.d.ts +12 -0
- package/lib/services/json-schema-validator.service.d.ts +49 -0
- package/lib/services/row-validation.service.d.ts +17 -0
- package/lib/services/validation-logger.service.d.ts +87 -0
- package/lib/services/virtual-scroll.service.d.ts +44 -0
- package/lib/shared/shared-table-components.module.d.ts +9 -0
- package/lib/smart-table.module.d.ts +26 -0
- package/lib/strategies/default-editors.d.ts +109 -0
- package/lib/strategies/default-formatters.d.ts +116 -0
- package/lib/strategies/default-validators.d.ts +113 -0
- package/package.json +42 -0
- package/public-api.d.ts +70 -0
- package/src/lib/builder/README.md +30 -0
- package/src/lib/editors/README.md +303 -0
- package/src/lib/renderer/components/st-column-filter/README.md +286 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cell class - represents individual cell instances
|
|
3
|
+
* Combines ColumnConfig (Flyweight) with CellState (unique per instance)
|
|
4
|
+
*/
|
|
5
|
+
import { createCellState, createMemento, restoreFromMemento, canEdit, isCellValid } from './cell-state.interface';
|
|
6
|
+
import { CellLifecycleState, EditMode } from '../../models/cell-types';
|
|
7
|
+
/**
|
|
8
|
+
* Cell class implementing the Flyweight pattern
|
|
9
|
+
* - References shared ColumnConfig (Flyweight)
|
|
10
|
+
* - Owns unique CellState (Flyweight Context)
|
|
11
|
+
*/
|
|
12
|
+
export class Cell {
|
|
13
|
+
constructor(columnConfig, initialValue, rowData, rowIndex) {
|
|
14
|
+
/**
|
|
15
|
+
* History of state mementos for undo/redo
|
|
16
|
+
*/
|
|
17
|
+
this.history = [];
|
|
18
|
+
/**
|
|
19
|
+
* Current position in history
|
|
20
|
+
*/
|
|
21
|
+
this.historyIndex = -1;
|
|
22
|
+
/**
|
|
23
|
+
* Maximum history size
|
|
24
|
+
*/
|
|
25
|
+
this.maxHistorySize = 10;
|
|
26
|
+
this.columnConfig = columnConfig;
|
|
27
|
+
this.state = createCellState(initialValue);
|
|
28
|
+
this.rowData = rowData;
|
|
29
|
+
this.rowIndex = rowIndex;
|
|
30
|
+
// Save initial state to history
|
|
31
|
+
this.saveToHistory();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get current cell value
|
|
35
|
+
*/
|
|
36
|
+
getValue() {
|
|
37
|
+
return this.state.value;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Set cell value
|
|
41
|
+
* @param value New value
|
|
42
|
+
* @param skipValidation Skip validation (useful for programmatic sets)
|
|
43
|
+
*/
|
|
44
|
+
setValue(value, skipValidation = false) {
|
|
45
|
+
const previousValue = this.state.value;
|
|
46
|
+
// Call before change hook
|
|
47
|
+
if (this.columnConfig.hooks?.onChange) {
|
|
48
|
+
this.columnConfig.hooks.onChange(this.createEvent(value, previousValue));
|
|
49
|
+
}
|
|
50
|
+
this.state.value = value;
|
|
51
|
+
this.state.isDirty = true;
|
|
52
|
+
this.state.lastModified = new Date();
|
|
53
|
+
// Validate if not skipped
|
|
54
|
+
if (!skipValidation) {
|
|
55
|
+
const validationResult = this.validate();
|
|
56
|
+
if (!validationResult.valid) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
this.saveToHistory();
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Render cell value as formatted string (delegates to formatter strategy)
|
|
65
|
+
*/
|
|
66
|
+
render() {
|
|
67
|
+
if (!this.columnConfig.formatter) {
|
|
68
|
+
return String(this.state.value ?? '');
|
|
69
|
+
}
|
|
70
|
+
if (this.columnConfig.formatter.formatWithContext) {
|
|
71
|
+
return this.columnConfig.formatter.formatWithContext(this.state.value, this.rowData, this.columnConfig.key);
|
|
72
|
+
}
|
|
73
|
+
// Ensure format method exists before calling it
|
|
74
|
+
if (this.columnConfig.formatter.format) {
|
|
75
|
+
return this.columnConfig.formatter.format(this.state.value);
|
|
76
|
+
}
|
|
77
|
+
// Fallback if formatter exists but has no methods
|
|
78
|
+
return String(this.state.value ?? '');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate cell value (delegates to validator strategy)
|
|
82
|
+
*/
|
|
83
|
+
validate() {
|
|
84
|
+
// Clear previous errors
|
|
85
|
+
this.state.error = undefined;
|
|
86
|
+
this.state.errors = undefined;
|
|
87
|
+
this.state.lastValidated = new Date();
|
|
88
|
+
if (!this.columnConfig.validator) {
|
|
89
|
+
return { valid: true };
|
|
90
|
+
}
|
|
91
|
+
const result = this.columnConfig.validator.validateWithContext
|
|
92
|
+
? this.columnConfig.validator.validateWithContext(this.state.value, this.rowData, this.columnConfig.key)
|
|
93
|
+
: this.columnConfig.validator.validate(this.state.value);
|
|
94
|
+
if (!result.valid) {
|
|
95
|
+
this.state.error = result.error;
|
|
96
|
+
this.state.errors = result.errors;
|
|
97
|
+
this.state.lifecycleState = CellLifecycleState.ERROR;
|
|
98
|
+
// Call validation error hook
|
|
99
|
+
if (this.columnConfig.hooks?.onValidationError) {
|
|
100
|
+
this.columnConfig.hooks.onValidationError(this.createEvent(this.state.value));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Start edit mode
|
|
107
|
+
*/
|
|
108
|
+
startEdit() {
|
|
109
|
+
// Check if cell can be edited
|
|
110
|
+
if (!this.canEdit()) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
// Call before edit hook
|
|
114
|
+
if (this.columnConfig.hooks?.beforeEdit) {
|
|
115
|
+
this.columnConfig.hooks.beforeEdit(this.createEvent(this.state.value));
|
|
116
|
+
}
|
|
117
|
+
// Save current value as previous
|
|
118
|
+
this.state.previousValue = this.state.value;
|
|
119
|
+
this.state.isEditing = true;
|
|
120
|
+
this.state.lifecycleState = CellLifecycleState.EDITING;
|
|
121
|
+
// Call on edit hook
|
|
122
|
+
if (this.columnConfig.hooks?.onEdit) {
|
|
123
|
+
this.columnConfig.hooks.onEdit(this.createEvent(this.state.value));
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Save edited value
|
|
129
|
+
* @param newValue The new value from editor
|
|
130
|
+
*/
|
|
131
|
+
saveEdit(newValue) {
|
|
132
|
+
if (!this.state.isEditing) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
// Call before save hook
|
|
136
|
+
if (this.columnConfig.hooks?.beforeSave) {
|
|
137
|
+
this.columnConfig.hooks.beforeSave(this.createEvent(newValue, this.state.previousValue));
|
|
138
|
+
}
|
|
139
|
+
// Parse value if parser is provided
|
|
140
|
+
let parsedValue = newValue;
|
|
141
|
+
if (this.columnConfig.parser) {
|
|
142
|
+
try {
|
|
143
|
+
parsedValue = this.columnConfig.parser.parse(newValue);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
this.state.error = `Failed to parse value: ${error}`;
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Validate
|
|
151
|
+
const previousValue = this.state.value;
|
|
152
|
+
this.state.value = parsedValue;
|
|
153
|
+
const validationResult = this.validate();
|
|
154
|
+
if (!validationResult.valid) {
|
|
155
|
+
this.state.value = previousValue; // Revert on validation failure
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
// Mark as dirty if value changed
|
|
159
|
+
this.state.isDirty = this.state.value !== this.state.originalValue;
|
|
160
|
+
this.state.isEditing = false;
|
|
161
|
+
this.state.lifecycleState = CellLifecycleState.DISPLAY;
|
|
162
|
+
this.state.lastModified = new Date();
|
|
163
|
+
// Save to history
|
|
164
|
+
this.saveToHistory();
|
|
165
|
+
// Call after save hook
|
|
166
|
+
if (this.columnConfig.hooks?.onSave) {
|
|
167
|
+
this.columnConfig.hooks.onSave(this.createEvent(parsedValue, previousValue));
|
|
168
|
+
}
|
|
169
|
+
// Call after edit hook
|
|
170
|
+
if (this.columnConfig.hooks?.afterEdit) {
|
|
171
|
+
this.columnConfig.hooks.afterEdit(this.createEvent(parsedValue));
|
|
172
|
+
}
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Cancel edit and revert to previous value
|
|
177
|
+
*/
|
|
178
|
+
cancelEdit() {
|
|
179
|
+
if (!this.state.isEditing) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// Revert to previous value
|
|
183
|
+
if (this.state.previousValue !== undefined) {
|
|
184
|
+
this.state.value = this.state.previousValue;
|
|
185
|
+
}
|
|
186
|
+
this.state.isEditing = false;
|
|
187
|
+
this.state.lifecycleState = CellLifecycleState.DISPLAY;
|
|
188
|
+
this.state.error = undefined;
|
|
189
|
+
this.state.errors = undefined;
|
|
190
|
+
// Call cancel hook
|
|
191
|
+
if (this.columnConfig.hooks?.onCancel) {
|
|
192
|
+
this.columnConfig.hooks.onCancel(this.createEvent(this.state.value));
|
|
193
|
+
}
|
|
194
|
+
// Call after edit hook
|
|
195
|
+
if (this.columnConfig.hooks?.afterEdit) {
|
|
196
|
+
this.columnConfig.hooks.afterEdit(this.createEvent(this.state.value));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Reset cell to original value
|
|
201
|
+
*/
|
|
202
|
+
reset() {
|
|
203
|
+
if (this.state.originalValue !== undefined) {
|
|
204
|
+
this.state.value = this.state.originalValue;
|
|
205
|
+
this.state.isDirty = false;
|
|
206
|
+
this.state.error = undefined;
|
|
207
|
+
this.state.errors = undefined;
|
|
208
|
+
this.state.isEditing = false;
|
|
209
|
+
this.state.lifecycleState = CellLifecycleState.DISPLAY;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Check if cell can be edited
|
|
214
|
+
*/
|
|
215
|
+
canEdit() {
|
|
216
|
+
return (this.columnConfig.editable === true &&
|
|
217
|
+
this.columnConfig.editMode !== EditMode.NONE &&
|
|
218
|
+
canEdit(this.state));
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Check if cell is valid
|
|
222
|
+
*/
|
|
223
|
+
isValid() {
|
|
224
|
+
return isCellValid(this.state);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Check if cell is dirty (modified)
|
|
228
|
+
*/
|
|
229
|
+
isDirty() {
|
|
230
|
+
return this.state.isDirty;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Check if cell is in edit mode
|
|
234
|
+
*/
|
|
235
|
+
isEditing() {
|
|
236
|
+
return this.state.isEditing;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Set focus state on this cell
|
|
240
|
+
*/
|
|
241
|
+
focus() {
|
|
242
|
+
this.state.isFocused = true;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Remove focus from this cell
|
|
246
|
+
*/
|
|
247
|
+
blur() {
|
|
248
|
+
this.state.isFocused = false;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Check if this cell is focused
|
|
252
|
+
*/
|
|
253
|
+
isFocused() {
|
|
254
|
+
return this.state.isFocused ?? false;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get current cell state (Memento pattern)
|
|
258
|
+
*/
|
|
259
|
+
getState() {
|
|
260
|
+
return { ...this.state };
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Restore cell state from snapshot (Memento pattern)
|
|
264
|
+
*/
|
|
265
|
+
restoreState(state) {
|
|
266
|
+
this.state = { ...state };
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get column configuration (readonly access)
|
|
270
|
+
*/
|
|
271
|
+
getColumnConfig() {
|
|
272
|
+
return this.columnConfig;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get row data context
|
|
276
|
+
*/
|
|
277
|
+
getRowData() {
|
|
278
|
+
return this.rowData;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get row index
|
|
282
|
+
*/
|
|
283
|
+
getRowIndex() {
|
|
284
|
+
return this.rowIndex;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Set loading state
|
|
288
|
+
*/
|
|
289
|
+
setLoading(isLoading) {
|
|
290
|
+
this.state.isLoading = isLoading;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Set disabled state
|
|
294
|
+
*/
|
|
295
|
+
setDisabled(isDisabled) {
|
|
296
|
+
this.state.isDisabled = isDisabled;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Set readonly state
|
|
300
|
+
*/
|
|
301
|
+
setReadonly(isReadonly) {
|
|
302
|
+
this.state.isReadonly = isReadonly;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Save current state to history
|
|
306
|
+
*/
|
|
307
|
+
saveToHistory() {
|
|
308
|
+
// Remove any states after current position (for redo invalidation)
|
|
309
|
+
this.history = this.history.slice(0, this.historyIndex + 1);
|
|
310
|
+
// Add current state
|
|
311
|
+
this.history.push(createMemento(this.state));
|
|
312
|
+
this.historyIndex = this.history.length - 1;
|
|
313
|
+
// Limit history size
|
|
314
|
+
if (this.history.length > this.maxHistorySize) {
|
|
315
|
+
this.history.shift();
|
|
316
|
+
this.historyIndex--;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Undo last change
|
|
321
|
+
*/
|
|
322
|
+
undo() {
|
|
323
|
+
if (this.historyIndex > 0) {
|
|
324
|
+
this.historyIndex--;
|
|
325
|
+
const memento = this.history[this.historyIndex];
|
|
326
|
+
this.state = restoreFromMemento(this.state, memento);
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Redo last undone change
|
|
333
|
+
*/
|
|
334
|
+
redo() {
|
|
335
|
+
if (this.historyIndex < this.history.length - 1) {
|
|
336
|
+
this.historyIndex++;
|
|
337
|
+
const memento = this.history[this.historyIndex];
|
|
338
|
+
this.state = restoreFromMemento(this.state, memento);
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Check if undo is available
|
|
345
|
+
*/
|
|
346
|
+
canUndo() {
|
|
347
|
+
return this.historyIndex > 0;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Check if redo is available
|
|
351
|
+
*/
|
|
352
|
+
canRedo() {
|
|
353
|
+
return this.historyIndex < this.history.length - 1;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Create cell event for hooks
|
|
357
|
+
*/
|
|
358
|
+
createEvent(value, previousValue) {
|
|
359
|
+
return {
|
|
360
|
+
value,
|
|
361
|
+
previousValue: previousValue ?? this.state.previousValue,
|
|
362
|
+
rowData: this.rowData,
|
|
363
|
+
columnKey: this.columnConfig.key,
|
|
364
|
+
rowIndex: this.rowIndex
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Get cell metadata
|
|
369
|
+
*/
|
|
370
|
+
getMetadata(key) {
|
|
371
|
+
return this.state.metadata?.[key];
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Set cell metadata
|
|
375
|
+
*/
|
|
376
|
+
setMetadata(key, value) {
|
|
377
|
+
if (!this.state.metadata) {
|
|
378
|
+
this.state.metadata = {};
|
|
379
|
+
}
|
|
380
|
+
this.state.metadata[key] = value;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Clear all metadata
|
|
384
|
+
*/
|
|
385
|
+
clearMetadata() {
|
|
386
|
+
this.state.metadata = undefined;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvbW9kZWxzL2NlbGwuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxFQUFhLGVBQWUsRUFBb0IsYUFBYSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvSSxPQUFPLEVBQW9CLGtCQUFrQixFQUFhLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXBHOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sSUFBSTtJQW9DZixZQUNFLFlBQTZCLEVBQzdCLFlBQWUsRUFDZixPQUFhLEVBQ2IsUUFBaUI7UUFuQm5COztXQUVHO1FBQ0ssWUFBTyxHQUEwQixFQUFFLENBQUM7UUFFNUM7O1dBRUc7UUFDSyxpQkFBWSxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBRWxDOztXQUVHO1FBQ2MsbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFRM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFFekIsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxLQUFRLEVBQUUsaUJBQTBCLEtBQUs7UUFDaEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxL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LENBQUMsWUFBWSxDQUFDLEdBQUc7WUFDaEMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsR0FBVztRQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLEdBQVcsRUFBRSxLQUFVO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYTtRQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENlbGwgY2xhc3MgLSByZXByZXNlbnRzIGluZGl2aWR1YWwgY2VsbCBpbnN0YW5jZXNcbiAqIENvbWJpbmVzIENvbHVtbkNvbmZpZyAoRmx5d2VpZ2h0KSB3aXRoIENlbGxTdGF0ZSAodW5pcXVlIHBlciBpbnN0YW5jZSlcbiAqL1xuXG5pbXBvcnQgeyBDb2x1bW5Db25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29sdW1uLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ2VsbFN0YXRlLCBjcmVhdGVDZWxsU3RhdGUsIENlbGxTdGF0ZU1lbWVudG8sIGNyZWF0ZU1lbWVudG8sIHJlc3RvcmVGcm9tTWVtZW50bywgY2FuRWRpdCwgaXNDZWxsVmFsaWQgfSBmcm9tICcuL2NlbGwtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZXN1bHQsIENlbGxMaWZlY3ljbGVTdGF0ZSwgQ2VsbEV2ZW50LCBFZGl0TW9kZSB9IGZyb20gJy4uLy4uL21vZGVscy9jZWxsLXR5cGVzJztcblxuLyoqXG4gKiBDZWxsIGNsYXNzIGltcGxlbWVudGluZyB0aGUgRmx5d2VpZ2h0IHBhdHRlcm5cbiAqIC0gUmVmZXJlbmNlcyBzaGFyZWQgQ29sdW1uQ29uZmlnIChGbHl3ZWlnaHQpXG4gKiAtIE93bnMgdW5pcXVlIENlbGxTdGF0ZSAoRmx5d2VpZ2h0IENvbnRleHQpXG4gKi9cbmV4cG9ydCBjbGFzcyBDZWxsPFQgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFNoYXJlZCBjb2x1bW4gY29uZmlndXJhdGlvbiAoRmx5d2VpZ2h0IC0gcmVmZXJlbmNlIG9ubHksIG5vdCBvd25lZClcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29sdW1uQ29uZmlnOiBDb2x1bW5Db25maWc8VD47XG5cbiAgLyoqXG4gICAqIFVuaXF1ZSBjZWxsIHN0YXRlIChvd25lZCBieSB0aGlzIGluc3RhbmNlKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0ZTogQ2VsbFN0YXRlPFQ+O1xuXG4gIC8qKlxuICAgKiBSb3cgZGF0YSBjb250ZXh0IChyZWZlcmVuY2UgdG8gcGFyZW50IHJvdyBkYXRhKVxuICAgKi9cbiAgcHJpdmF0ZSByb3dEYXRhPzogYW55O1xuXG4gIC8qKlxuICAgKiBSb3cgaW5kZXggaW4gdGFibGVcbiAgICovXG4gIHByaXZhdGUgcm93SW5kZXg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhpc3Rvcnkgb2Ygc3RhdGUgbWVtZW50b3MgZm9yIHVuZG8vcmVkb1xuICAgKi9cbiAgcHJpdmF0ZSBoaXN0b3J5OiBDZWxsU3RhdGVNZW1lbnRvPFQ+W10gPSBbXTtcblxuICAvKipcbiAgICogQ3VycmVudCBwb3NpdGlvbiBpbiBoaXN0b3J5XG4gICAqL1xuICBwcml2YXRlIGhpc3RvcnlJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gaGlzdG9yeSBzaXplXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG1heEhpc3RvcnlTaXplOiBudW1iZXIgPSAxMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb2x1bW5Db25maWc6IENvbHVtbkNvbmZpZzxUPixcbiAgICBpbml0aWFsVmFsdWU6IFQsXG4gICAgcm93RGF0YT86IGFueSxcbiAgICByb3dJbmRleD86IG51bWJlclxuICApIHtcbiAgICB0aGlzLmNvbHVtbkNvbmZpZyA9IGNvbHVtbkNvbmZpZztcbiAgICB0aGlzLnN0YXRlID0gY3JlYXRlQ2VsbFN0YXRlKGluaXRpYWxWYWx1ZSk7XG4gICAgdGhpcy5yb3dEYXRhID0gcm93RGF0YTtcbiAgICB0aGlzLnJvd0luZGV4ID0gcm93SW5kZXg7XG4gICAgXG4gICAgLy8gU2F2ZSBpbml0aWFsIHN0YXRlIHRvIGhpc3RvcnlcbiAgICB0aGlzLnNhdmVUb0hpc3RvcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBjZWxsIHZhbHVlXG4gICAqL1xuICBnZXRWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY2VsbCB2YWx1ZVxuICAgKiBAcGFyYW0gdmFsdWUgTmV3IHZhbHVlXG4gICAqIEBwYXJhbSBza2lwVmFsaWRhdGlvbiBTa2lwIHZhbGlkYXRpb24gKHVzZWZ1bCBmb3IgcHJvZ3JhbW1hdGljIHNldHMpXG4gICAqL1xuICBzZXRWYWx1ZSh2YWx1ZTogVCwgc2tpcFZhbGlkYXRpb246IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLnN0YXRlLnZhbHVlO1xuXG4gICAgLy8gQ2FsbCBiZWZvcmUgY2hhbmdlIGhvb2tcbiAgICBpZiAodGhpcy5jb2x1bW5Db25maWcuaG9va3M/Lm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLmNvbHVtbkNvbmZpZy5ob29rcy5vbkNoYW5nZSh0aGlzLmNyZWF0ZUV2ZW50KHZhbHVlLCBwcmV2aW91c1ZhbHVlKSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuc3RhdGUuaXNEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5zdGF0ZS5sYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZSgpO1xuXG4gICAgLy8gVmFsaWRhdGUgaWYgbm90IHNraXBwZWRcbiAgICBpZiAoIXNraXBWYWxpZGF0aW9uKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LnZhbGlkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNhdmVUb0hpc3RvcnkoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgY2VsbCB2YWx1ZSBhcyBmb3JtYXR0ZWQgc3RyaW5nIChkZWxlZ2F0ZXMgdG8gZm9ybWF0dGVyIHN0cmF0ZWd5KVxuICAgKi9cbiAgcmVuZGVyKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbHVtbkNvbmZpZy5mb3JtYXR0ZXIpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodGhpcy5zdGF0ZS52YWx1ZSA/PyAnJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29sdW1uQ29uZmlnLmZvcm1hdHRlci5mb3JtYXRXaXRoQ29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sdW1uQ29uZmlnLmZvcm1hdHRlci5mb3JtYXRXaXRoQ29udGV4dChcbiAgICAgICAgdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgICAgdGhpcy5yb3dEYXRhLFxuICAgICAgICB0aGlzLmNvbHVtbkNvbmZpZy5rZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGZvcm1hdCBtZXRob2QgZXhpc3RzIGJlZm9yZSBjYWxsaW5nIGl0XG4gICAgaWYgKHRoaXMuY29sdW1uQ29uZmlnLmZvcm1hdHRlci5mb3JtYXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbkNvbmZpZy5mb3JtYXR0ZXIuZm9ybWF0KHRoaXMuc3RhdGUudmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGlmIGZvcm1hdHRlciBleGlzdHMgYnV0IGhhcyBubyBtZXRob2RzXG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLnN0YXRlLnZhbHVlID8/ICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBjZWxsIHZhbHVlIChkZWxlZ2F0ZXMgdG8gdmFsaWRhdG9yIHN0cmF0ZWd5KVxuICAgKi9cbiAgdmFsaWRhdGUoKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgLy8gQ2xlYXIgcHJldmlvdXMgZXJyb3JzXG4gICAgdGhpcy5zdGF0ZS5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN0YXRlLmVycm9ycyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN0YXRlLmxhc3RWYWxpZGF0ZWQgPSBuZXcgRGF0ZSgpO1xuXG4gICAgaWYgKCF0aGlzLmNvbHVtbkNvbmZpZy52YWxpZGF0b3IpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb2x1bW5Db25maWcudmFsaWRhdG9yLnZhbGlkYXRlV2l0aENvbnRleHRcbiAgICAgID8gdGhpcy5jb2x1bW5Db25maWcudmFsaWRhdG9yLnZhbGlkYXRlV2l0aENvbnRleHQoXG4gICAgICAgICAgdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgICAgICB0aGlzLnJvd0RhdGEsXG4gICAgICAgICAgdGhpcy5jb2x1bW5Db25maWcua2V5XG4gICAgICAgIClcbiAgICAgIDogdGhpcy5jb2x1bW5Db25maWcudmFsaWRhdG9yLnZhbGlkYXRlKHRoaXMuc3RhdGUudmFsdWUpO1xuXG4gICAgaWYgKCFyZXN1bHQudmFsaWQpIHtcbiAgICAgIHRoaXMuc3RhdGUuZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICB0aGlzLnN0YXRlLmVycm9ycyA9IHJlc3VsdC5lcnJvcnM7XG4gICAgICB0aGlzLnN0YXRlLmxpZmVjeWNsZVN0YXRlID0gQ2VsbExpZmVjeWNsZVN0YXRlLkVSUk9SO1xuXG4gICAgICAvLyBDYWxsIHZhbGlkYXRpb24gZXJyb3IgaG9va1xuICAgICAgaWYgKHRoaXMuY29sdW1uQ29uZmlnLmhvb2tzPy5vblZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICB0aGlzLmNvbHVtbkNvbmZpZy5ob29rcy5vblZhbGlkYXRpb25FcnJvcih0aGlzLmNyZWF0ZUV2ZW50KHRoaXMuc3RhdGUudmFsdWUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGVkaXQgbW9kZVxuICAgKi9cbiAgc3RhcnRFZGl0KCk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIGNlbGwgY2FuIGJlIGVkaXRlZFxuICAgIGlmICghdGhpcy5jYW5FZGl0KCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIGJlZm9yZSBlZGl0IGhvb2tcbiAgICBpZiAodGhpcy5jb2x1bW5Db25maWcuaG9va3M/LmJlZm9yZUVkaXQpIHtcbiAgICAgIHRoaXMuY29sdW1uQ29uZmlnLmhvb2tzLmJlZm9yZUVkaXQodGhpcy5jcmVhdGVFdmVudCh0aGlzLnN0YXRlLnZhbHVlKSk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBjdXJyZW50IHZhbHVlIGFzIHByZXZpb3VzXG4gICAgdGhpcy5zdGF0ZS5wcmV2aW91c1ZhbHVlID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICB0aGlzLnN0YXRlLmlzRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5zdGF0ZS5saWZlY3ljbGVTdGF0ZSA9IENlbGxMaWZlY3ljbGVTdGF0ZS5FRElUSU5HO1xuXG4gICAgLy8gQ2FsbCBvbiBlZGl0IGhvb2tcbiAgICBpZiAodGhpcy5jb2x1bW5Db25maWcuaG9va3M/Lm9uRWRpdCkge1xuICAgICAgdGhpcy5jb2x1bW5Db25maWcuaG9va3Mub25FZGl0KHRoaXMuY3JlYXRlRXZlbnQodGhpcy5zdGF0ZS52YWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgZWRpdGVkIHZhbHVlXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIGZyb20gZWRpdG9yXG4gICAqL1xuICBzYXZlRWRpdChuZXdWYWx1ZTogVCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zdGF0ZS5pc0VkaXRpbmcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIGJlZm9yZSBzYXZlIGhvb2tcbiAgICBpZiAodGhpcy5jb2x1bW5Db25maWcuaG9va3M/LmJlZm9yZVNhdmUpIHtcbiAgICAgIHRoaXMuY29sdW1uQ29uZmlnLmhvb2tzLmJlZm9yZVNhdmUodGhpcy5jcmVhdGVFdmVudChuZXdWYWx1ZSwgdGhpcy5zdGF0ZS5wcmV2aW91c1ZhbHVlKSk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgdmFsdWUgaWYgcGFyc2VyIGlzIHByb3ZpZGVkXG4gICAgbGV0IHBhcnNlZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgaWYgKHRoaXMuY29sdW1uQ29uZmlnLnBhcnNlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB0aGlzLmNvbHVtbkNvbmZpZy5wYXJzZXIucGFyc2UobmV3VmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5lcnJvciA9IGBGYWlsZWQgdG8gcGFyc2UgdmFsdWU6ICR7ZXJyb3J9YDtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlXG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgdGhpcy5zdGF0ZS52YWx1ZSA9IHBhcnNlZFZhbHVlO1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRlKCk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQudmFsaWQpIHtcbiAgICAgIHRoaXMuc3RhdGUudmFsdWUgPSBwcmV2aW91c1ZhbHVlOyAvLyBSZXZlcnQgb24gdmFsaWRhdGlvbiBmYWlsdXJlXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTWFyayBhcyBkaXJ0eSBpZiB2YWx1ZSBjaGFuZ2VkXG4gICAgdGhpcy5zdGF0ZS5pc0RpcnR5ID0gdGhpcy5zdGF0ZS52YWx1ZSAhPT0gdGhpcy5zdGF0ZS5vcmlnaW5hbFZhbHVlO1xuICAgIHRoaXMuc3RhdGUuaXNFZGl0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0ZS5saWZlY3ljbGVTdGF0ZSA9IENlbGxMaWZlY3ljbGVTdGF0ZS5ESVNQTEFZO1xuICAgIHRoaXMuc3RhdGUubGFzdE1vZGlmaWVkID0gbmV3IERhdGUoKTtcblxuICAgIC8vIFNhdmUgdG8gaGlzdG9yeVxuICAgIHRoaXMuc2F2ZVRvSGlzdG9yeSgpO1xuXG4gICAgLy8gQ2FsbCBhZnRlciBzYXZlIGhvb2tcbiAgICBpZiAodGhpcy5jb2x1bW5Db25maWcuaG9va3M/Lm9uU2F2ZSkge1xuICAgICAgdGhpcy5jb2x1bW5Db25maWcuaG9va3Mub25TYXZlKHRoaXMuY3JlYXRlRXZlbnQocGFyc2VkVmFsdWUsIHByZXZpb3VzVmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIGFmdGVyIGVkaXQgaG9va1xuICAgIGlmICh0aGlzLmNvbHVtbkNvbmZpZy5ob29rcz8uYWZ0ZXJFZGl0KSB7XG4gICAgICB0aGlzLmNvbHVtbkNvbmZpZy5ob29rcy5hZnRlckVkaXQodGhpcy5jcmVhdGVFdmVudChwYXJzZWRWYWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBlZGl0IGFuZCByZXZlcnQgdG8gcHJldmlvdXMgdmFsdWVcbiAgICovXG4gIGNhbmNlbEVkaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzRWRpdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJldmVydCB0byBwcmV2aW91cyB2YWx1ZVxuICAgIGlmICh0aGlzLnN0YXRlLnByZXZpb3VzVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGF0ZS52YWx1ZSA9IHRoaXMuc3RhdGUucHJldmlvdXNWYWx1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUubGlmZWN5Y2xlU3RhdGUgPSBDZWxsTGlmZWN5Y2xlU3RhdGUuRElTUExBWTtcbiAgICB0aGlzLnN0YXRlLmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RhdGUuZXJyb3JzID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gQ2FsbCBjYW5jZWwgaG9va1xuICAgIGlmICh0aGlzLmNvbHVtbkNvbmZpZy5ob29rcz8ub25DYW5jZWwpIHtcbiAgICAgIHRoaXMuY29sdW1uQ29uZmlnLmhvb2tzLm9uQ2FuY2VsKHRoaXMuY3JlYXRlRXZlbnQodGhpcy5zdGF0ZS52YWx1ZSkpO1xuICAgIH1cblxuICAgIC8vIENhbGwgYWZ0ZXIgZWRpdCBob29rXG4gICAgaWYgKHRoaXMuY29sdW1uQ29uZmlnLmhvb2tzPy5hZnRlckVkaXQpIHtcbiAgICAgIHRoaXMuY29sdW1uQ29uZmlnLmhvb2tzLmFmdGVyRWRpdCh0aGlzLmNyZWF0ZUV2ZW50KHRoaXMuc3RhdGUudmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgY2VsbCB0byBvcmlnaW5hbCB2YWx1ZVxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUub3JpZ2luYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YXRlLnZhbHVlID0gdGhpcy5zdGF0ZS5vcmlnaW5hbFZhbHVlO1xuICAgICAgdGhpcy5zdGF0ZS5pc0RpcnR5ID0gZmFsc2U7XG4gICAgICB0aGlzLnN0YXRlLmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdGF0ZS5lcnJvcnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnN0YXRlLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGF0ZS5saWZlY3ljbGVTdGF0ZSA9IENlbGxMaWZlY3ljbGVTdGF0ZS5ESVNQTEFZO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjZWxsIGNhbiBiZSBlZGl0ZWRcbiAgICovXG4gIGNhbkVkaXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29sdW1uQ29uZmlnLmVkaXRhYmxlID09PSB0cnVlICYmXG4gICAgICB0aGlzLmNvbHVtbkNvbmZpZy5lZGl0TW9kZSAhPT0gRWRpdE1vZGUuTk9ORSAmJlxuICAgICAgY2FuRWRpdCh0aGlzLnN0YXRlKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY2VsbCBpcyB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNDZWxsVmFsaWQodGhpcy5zdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY2VsbCBpcyBkaXJ0eSAobW9kaWZpZWQpXG4gICAqL1xuICBpc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmlzRGlydHk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY2VsbCBpcyBpbiBlZGl0IG1vZGVcbiAgICovXG4gIGlzRWRpdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5pc0VkaXRpbmc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGZvY3VzIHN0YXRlIG9uIHRoaXMgY2VsbFxuICAgKi9cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5pc0ZvY3VzZWQgPSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIGZvY3VzIGZyb20gdGhpcyBjZWxsXG4gICAqL1xuICBibHVyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUuaXNGb2N1c2VkID0gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIGNlbGwgaXMgZm9jdXNlZFxuICAgKi9cbiAgaXNGb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmlzRm9jdXNlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBjZWxsIHN0YXRlIChNZW1lbnRvIHBhdHRlcm4pXG4gICAqL1xuICBnZXRTdGF0ZSgpOiBDZWxsU3RhdGU8VD4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuc3RhdGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGNlbGwgc3RhdGUgZnJvbSBzbmFwc2hvdCAoTWVtZW50byBwYXR0ZXJuKVxuICAgKi9cbiAgcmVzdG9yZVN0YXRlKHN0YXRlOiBDZWxsU3RhdGU8VD4pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0geyAuLi5zdGF0ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb2x1bW4gY29uZmlndXJhdGlvbiAocmVhZG9ubHkgYWNjZXNzKVxuICAgKi9cbiAgZ2V0Q29sdW1uQ29uZmlnKCk6IFJlYWRvbmx5PENvbHVtbkNvbmZpZzxUPj4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbkNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcm93IGRhdGEgY29udGV4dFxuICAgKi9cbiAgZ2V0Um93RGF0YSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnJvd0RhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJvdyBpbmRleFxuICAgKi9cbiAgZ2V0Um93SW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb3dJbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbG9hZGluZyBzdGF0ZVxuICAgKi9cbiAgc2V0TG9hZGluZyhpc0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLmlzTG9hZGluZyA9IGlzTG9hZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZGlzYWJsZWQgc3RhdGVcbiAgICovXG4gIHNldERpc2FibGVkKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLmlzRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCByZWFkb25seSBzdGF0ZVxuICAgKi9cbiAgc2V0UmVhZG9ubHkoaXNSZWFkb25seTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUuaXNSZWFkb25seSA9IGlzUmVhZG9ubHk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjdXJyZW50IHN0YXRlIHRvIGhpc3RvcnlcbiAgICovXG4gIHByaXZhdGUgc2F2ZVRvSGlzdG9yeSgpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgYW55IHN0YXRlcyBhZnRlciBjdXJyZW50IHBvc2l0aW9uIChmb3IgcmVkbyBpbnZhbGlkYXRpb24pXG4gICAgdGhpcy5oaXN0b3J5ID0gdGhpcy5oaXN0b3J5LnNsaWNlKDAsIHRoaXMuaGlzdG9yeUluZGV4ICsgMSk7XG5cbiAgICAvLyBBZGQgY3VycmVudCBzdGF0ZVxuICAgIHRoaXMuaGlzdG9yeS5wdXNoKGNyZWF0ZU1lbWVudG8odGhpcy5zdGF0ZSkpO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4ID0gdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDE7XG5cbiAgICAvLyBMaW1pdCBoaXN0b3J5IHNpemVcbiAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCA+IHRoaXMubWF4SGlzdG9yeVNpemUpIHtcbiAgICAgIHRoaXMuaGlzdG9yeS5zaGlmdCgpO1xuICAgICAgdGhpcy5oaXN0b3J5SW5kZXgtLTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5kbyBsYXN0IGNoYW5nZVxuICAgKi9cbiAgdW5kbygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oaXN0b3J5SW5kZXggPiAwKSB7XG4gICAgICB0aGlzLmhpc3RvcnlJbmRleC0tO1xuICAgICAgY29uc3QgbWVtZW50byA9IHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnlJbmRleF07XG4gICAgICB0aGlzLnN0YXRlID0gcmVzdG9yZUZyb21NZW1lbnRvKHRoaXMuc3RhdGUsIG1lbWVudG8pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRvIGxhc3QgdW5kb25lIGNoYW5nZVxuICAgKi9cbiAgcmVkbygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oaXN0b3J5SW5kZXggPCB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5oaXN0b3J5SW5kZXgrKztcbiAgICAgIGNvbnN0IG1lbWVudG8gPSB0aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5SW5kZXhdO1xuICAgICAgdGhpcy5zdGF0ZSA9IHJlc3RvcmVGcm9tTWVtZW50byh0aGlzLnN0YXRlLCBtZW1lbnRvKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdW5kbyBpcyBhdmFpbGFibGVcbiAgICovXG4gIGNhblVuZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeUluZGV4ID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiByZWRvIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgY2FuUmVkbygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oaXN0b3J5SW5kZXggPCB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgY2VsbCBldmVudCBmb3IgaG9va3NcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRXZlbnQodmFsdWU6IFQsIHByZXZpb3VzVmFsdWU/OiBUKTogQ2VsbEV2ZW50PFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWUsXG4gICAgICBwcmV2aW91c1ZhbHVlOiBwcmV2aW91c1ZhbHVlID8/IHRoaXMuc3RhdGUucHJldmlvdXNWYWx1ZSxcbiAgICAgIHJvd0RhdGE6IHRoaXMucm93RGF0YSxcbiAgICAgIGNvbHVtbktleTogdGhpcy5jb2x1bW5Db25maWcua2V5LFxuICAgICAgcm93SW5kZXg6IHRoaXMucm93SW5kZXhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjZWxsIG1ldGFkYXRhXG4gICAqL1xuICBnZXRNZXRhZGF0YShrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUubWV0YWRhdGE/LltrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjZWxsIG1ldGFkYXRhXG4gICAqL1xuICBzZXRNZXRhZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGF0ZS5tZXRhZGF0YSkge1xuICAgICAgdGhpcy5zdGF0ZS5tZXRhZGF0YSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLnN0YXRlLm1ldGFkYXRhW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgbWV0YWRhdGFcbiAgICovXG4gIGNsZWFyTWV0YWRhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5tZXRhZGF0YSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Row validation state interface
|
|
3
|
+
* Represents an INVALID row with accumulated cell errors
|
|
4
|
+
* Note: Valid rows are not stored - absence of a row state means the row is valid
|
|
5
|
+
*/
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm93LXZhbGlkYXRpb24tc3RhdGUuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9tb2RlbHMvcm93LXZhbGlkYXRpb24tc3RhdGUuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJvdyB2YWxpZGF0aW9uIHN0YXRlIGludGVyZmFjZVxuICogUmVwcmVzZW50cyBhbiBJTlZBTElEIHJvdyB3aXRoIGFjY3VtdWxhdGVkIGNlbGwgZXJyb3JzXG4gKiBOb3RlOiBWYWxpZCByb3dzIGFyZSBub3Qgc3RvcmVkIC0gYWJzZW5jZSBvZiBhIHJvdyBzdGF0ZSBtZWFucyB0aGUgcm93IGlzIHZhbGlkXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBSb3dWYWxpZGF0aW9uU3RhdGUge1xuICAvKipcbiAgICogSW5kZXggb2YgdGhlIHJvdyBpbiB0aGUgdGFibGVcbiAgICovXG4gIHJvd0luZGV4OiBudW1iZXI7XG4gIFxuICAvKipcbiAgICogQWx3YXlzIGZhbHNlIGZvciBzdG9yZWQgc3RhdGVzIChvbmx5IGludmFsaWQgcm93cyBhcmUgc3RvcmVkKVxuICAgKi9cbiAgaXNWYWxpZDogZmFsc2U7XG4gIFxuICAvKipcbiAgICogTnVtYmVyIG9mIGludmFsaWQgY2VsbHMgaW4gdGhlIHJvd1xuICAgKi9cbiAgaW52YWxpZENlbGxDb3VudDogbnVtYmVyO1xuICBcbiAgLyoqXG4gICAqIE1hcCBvZiBjb2x1bW4ga2V5cyB0byB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzXG4gICAqL1xuICBjZWxsRXJyb3JzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBcbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCB2YWxpZGF0aW9uXG4gICAqL1xuICBsYXN0VmFsaWRhdGVkOiBEYXRlO1xufVxuIl19
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SheetState - Reactive state management for sheet operations
|
|
3
|
+
* Wraps TableState and adds sheet-level state tracking
|
|
4
|
+
*/
|
|
5
|
+
import { BehaviorSubject } from 'rxjs';
|
|
6
|
+
import { TableState } from './table-state.class';
|
|
7
|
+
/**
|
|
8
|
+
* SheetState class - Manages sheet-level state and delegates table operations
|
|
9
|
+
*/
|
|
10
|
+
export class SheetState {
|
|
11
|
+
/**
|
|
12
|
+
* Constructor
|
|
13
|
+
* @param config Sheet state configuration
|
|
14
|
+
* @param columns Reference to columns array for table state
|
|
15
|
+
* @param tableStateConfig Optional table state configuration
|
|
16
|
+
*/
|
|
17
|
+
constructor(config, columns, tableStateConfig) {
|
|
18
|
+
this.id = config.id;
|
|
19
|
+
this.name$ = new BehaviorSubject(config.name);
|
|
20
|
+
// Initialize table state
|
|
21
|
+
this.tableState = new TableState(columns, tableStateConfig);
|
|
22
|
+
// Initialize metadata
|
|
23
|
+
const now = new Date();
|
|
24
|
+
this._metadata$ = new BehaviorSubject({
|
|
25
|
+
createdAt: now,
|
|
26
|
+
lastModified: now,
|
|
27
|
+
lastAccessed: now
|
|
28
|
+
});
|
|
29
|
+
this.metadata$ = this._metadata$.asObservable();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Update sheet name
|
|
33
|
+
* @param name New sheet name
|
|
34
|
+
*/
|
|
35
|
+
updateName(name) {
|
|
36
|
+
this.name$.next(name);
|
|
37
|
+
this.updateLastModified();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get current sheet name
|
|
41
|
+
*/
|
|
42
|
+
getName() {
|
|
43
|
+
return this.name$.value;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get complete state snapshot
|
|
47
|
+
*/
|
|
48
|
+
getSnapshot() {
|
|
49
|
+
return {
|
|
50
|
+
id: this.id,
|
|
51
|
+
name: this.name$.value,
|
|
52
|
+
tableStateSnapshot: this.tableState.getState(),
|
|
53
|
+
metadata: this._metadata$.value
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Reset sheet state
|
|
58
|
+
*/
|
|
59
|
+
reset() {
|
|
60
|
+
this.tableState.reset();
|
|
61
|
+
this.updateLastModified();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Update last accessed timestamp
|
|
65
|
+
*/
|
|
66
|
+
updateLastAccessed() {
|
|
67
|
+
const currentMetadata = this._metadata$.value;
|
|
68
|
+
this._metadata$.next({
|
|
69
|
+
...currentMetadata,
|
|
70
|
+
lastAccessed: new Date()
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Update last modified timestamp
|
|
75
|
+
*/
|
|
76
|
+
updateLastModified() {
|
|
77
|
+
const currentMetadata = this._metadata$.value;
|
|
78
|
+
this._metadata$.next({
|
|
79
|
+
...currentMetadata,
|
|
80
|
+
lastModified: new Date()
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get current metadata
|
|
85
|
+
*/
|
|
86
|
+
getMetadata() {
|
|
87
|
+
return this._metadata$.value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlZXQtc3RhdGUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL21vZGVscy9zaGVldC1zdGF0ZS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUtqRDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBc0JyQjs7Ozs7T0FLRztJQUNILFlBQ0UsTUFBd0IsRUFDeEIsT0FBNEIsRUFDNUIsZ0JBQW1DO1FBRW5DLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksZUFBZSxDQUFTLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0RCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUU1RCxzQkFBc0I7UUFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksZUFBZSxDQUFnQjtZQUNuRCxTQUFTLEVBQUUsR0FBRztZQUNkLFlBQVksRUFBRSxHQUFHO1lBQ2pCLFlBQVksRUFBRSxHQUFHO1NBQ2xCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVSxDQUFDLElBQVk7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULE9BQU87WUFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO1lBQ3RCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1lBQzlDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUs7U0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM5QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNuQixHQUFHLGVBQWU7WUFDbEIsWUFBWSxFQUFFLElBQUksSUFBSSxFQUFFO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQjtRQUN4QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM5QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNuQixHQUFHLGVBQWU7WUFDbEIsWUFBWSxFQUFFLElBQUksSUFBSSxFQUFFO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQy9CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hlZXRTdGF0ZSAtIFJlYWN0aXZlIHN0YXRlIG1hbmFnZW1lbnQgZm9yIHNoZWV0IG9wZXJhdGlvbnNcbiAqIFdyYXBzIFRhYmxlU3RhdGUgYW5kIGFkZHMgc2hlZXQtbGV2ZWwgc3RhdGUgdHJhY2tpbmdcbiAqL1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYmxlU3RhdGUgfSBmcm9tICcuL3RhYmxlLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IFNoZWV0U3RhdGVDb25maWcsIFNoZWV0TWV0YWRhdGEsIFNoZWV0U3RhdGVTbmFwc2hvdCB9IGZyb20gJy4vc2hlZXQtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy9jb2x1bW4tY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlQ29uZmlnIH0gZnJvbSAnLi90YWJsZS1zdGF0ZS5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIFNoZWV0U3RhdGUgY2xhc3MgLSBNYW5hZ2VzIHNoZWV0LWxldmVsIHN0YXRlIGFuZCBkZWxlZ2F0ZXMgdGFibGUgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgU2hlZXRTdGF0ZSB7XG4gIC8qKlxuICAgKiBTaGVldCBpZGVudGl0eVxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBzaGVldCBuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lJDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRhYmxlIHN0YXRlIGluc3RhbmNlIChkZWxlZ2F0ZXMgdGFibGUgb3BlcmF0aW9ucylcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlU3RhdGU6IFRhYmxlU3RhdGU7XG5cbiAgLyoqXG4gICAqIFNoZWV0IG1ldGFkYXRhXG4gICAqL1xuICBwcml2YXRlIF9tZXRhZGF0YSQ6IEJlaGF2aW9yU3ViamVjdDxTaGVldE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgbWV0YWRhdGEkOiBPYnNlcnZhYmxlPFNoZWV0TWV0YWRhdGE+O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gY29uZmlnIFNoZWV0IHN0YXRlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIGNvbHVtbnMgUmVmZXJlbmNlIHRvIGNvbHVtbnMgYXJyYXkgZm9yIHRhYmxlIHN0YXRlXG4gICAqIEBwYXJhbSB0YWJsZVN0YXRlQ29uZmlnIE9wdGlvbmFsIHRhYmxlIHN0YXRlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZzogU2hlZXRTdGF0ZUNvbmZpZyxcbiAgICBjb2x1bW5zOiBDb2x1bW5Db25maWc8YW55PltdLFxuICAgIHRhYmxlU3RhdGVDb25maWc/OiBUYWJsZVN0YXRlQ29uZmlnXG4gICkge1xuICAgIHRoaXMuaWQgPSBjb25maWcuaWQ7XG4gICAgdGhpcy5uYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihjb25maWcubmFtZSk7XG5cbiAgICAvLyBJbml0aWFsaXplIHRhYmxlIHN0YXRlXG4gICAgdGhpcy50YWJsZVN0YXRlID0gbmV3IFRhYmxlU3RhdGUoY29sdW1ucywgdGFibGVTdGF0ZUNvbmZpZyk7XG5cbiAgICAvLyBJbml0aWFsaXplIG1ldGFkYXRhXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLl9tZXRhZGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNoZWV0TWV0YWRhdGE+KHtcbiAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgbGFzdE1vZGlmaWVkOiBub3csXG4gICAgICBsYXN0QWNjZXNzZWQ6IG5vd1xuICAgIH0pO1xuICAgIHRoaXMubWV0YWRhdGEkID0gdGhpcy5fbWV0YWRhdGEkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzaGVldCBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIE5ldyBzaGVldCBuYW1lXG4gICAqL1xuICB1cGRhdGVOYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubmFtZSQubmV4dChuYW1lKTtcbiAgICB0aGlzLnVwZGF0ZUxhc3RNb2RpZmllZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHNoZWV0IG5hbWVcbiAgICovXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lJC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29tcGxldGUgc3RhdGUgc25hcHNob3RcbiAgICovXG4gIGdldFNuYXBzaG90KCk6IFNoZWV0U3RhdGVTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgbmFtZTogdGhpcy5uYW1lJC52YWx1ZSxcbiAgICAgIHRhYmxlU3RhdGVTbmFwc2hvdDogdGhpcy50YWJsZVN0YXRlLmdldFN0YXRlKCksXG4gICAgICBtZXRhZGF0YTogdGhpcy5fbWV0YWRhdGEkLnZhbHVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBzaGVldCBzdGF0ZVxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy50YWJsZVN0YXRlLnJlc2V0KCk7XG4gICAgdGhpcy51cGRhdGVMYXN0TW9kaWZpZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbGFzdCBhY2Nlc3NlZCB0aW1lc3RhbXBcbiAgICovXG4gIHVwZGF0ZUxhc3RBY2Nlc3NlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50TWV0YWRhdGEgPSB0aGlzLl9tZXRhZGF0YSQudmFsdWU7XG4gICAgdGhpcy5fbWV0YWRhdGEkLm5leHQoe1xuICAgICAgLi4uY3VycmVudE1ldGFkYXRhLFxuICAgICAgbGFzdEFjY2Vzc2VkOiBuZXcgRGF0ZSgpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGxhc3QgbW9kaWZpZWQgdGltZXN0YW1wXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxhc3RNb2RpZmllZCgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50TWV0YWRhdGEgPSB0aGlzLl9tZXRhZGF0YSQudmFsdWU7XG4gICAgdGhpcy5fbWV0YWRhdGEkLm5leHQoe1xuICAgICAgLi4uY3VycmVudE1ldGFkYXRhLFxuICAgICAgbGFzdE1vZGlmaWVkOiBuZXcgRGF0ZSgpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgbWV0YWRhdGFcbiAgICovXG4gIGdldE1ldGFkYXRhKCk6IFNoZWV0TWV0YWRhdGEge1xuICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YSQudmFsdWU7XG4gIH1cbn1cblxuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sheet state interfaces for state management
|
|
3
|
+
*/
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlZXQtc3RhdGUuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9tb2RlbHMvc2hlZXQtc3RhdGUuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaGVldCBzdGF0ZSBpbnRlcmZhY2VzIGZvciBzdGF0ZSBtYW5hZ2VtZW50XG4gKi9cblxuaW1wb3J0IHsgVGFibGVTdGF0ZVNuYXBzaG90IH0gZnJvbSAnLi90YWJsZS10eXBlcyc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgU2hlZXRTdGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoZWV0U3RhdGVDb25maWcge1xuICAvKipcbiAgICogU2hlZXQgSURcbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgc2hlZXQgbmFtZVxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNoZWV0IG1ldGFkYXRhIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hlZXRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBzaGVldCB3YXMgY3JlYXRlZFxuICAgKi9cbiAgY3JlYXRlZEF0OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBzaGVldCB3YXMgbGFzdCBtb2RpZmllZFxuICAgKi9cbiAgbGFzdE1vZGlmaWVkOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBzaGVldCB3YXMgbGFzdCBhY2Nlc3NlZFxuICAgKi9cbiAgbGFzdEFjY2Vzc2VkOiBEYXRlO1xufVxuXG4vKipcbiAqIENvbXBsZXRlIHNuYXBzaG90IG9mIHNoZWV0IHN0YXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hlZXRTdGF0ZVNuYXBzaG90IHtcbiAgLyoqXG4gICAqIFNoZWV0IElEXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTaGVldCBuYW1lXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRhYmxlIHN0YXRlIHNuYXBzaG90XG4gICAqL1xuICB0YWJsZVN0YXRlU25hcHNob3Q6IFRhYmxlU3RhdGVTbmFwc2hvdDtcblxuICAvKipcbiAgICogU2hlZXQgbWV0YWRhdGFcbiAgICovXG4gIG1ldGFkYXRhOiBTaGVldE1ldGFkYXRhO1xufVxuXG4iXX0=
|