@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,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Column Resize Directive
|
|
3
|
+
* Handles column resizing when applied to th/td elements
|
|
4
|
+
*/
|
|
5
|
+
import { Directive, HostListener, Input, Output, EventEmitter } from '@angular/core';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class StColumnResizeDirective {
|
|
8
|
+
constructor(el) {
|
|
9
|
+
this.el = el;
|
|
10
|
+
/**
|
|
11
|
+
* Emits when column is resized
|
|
12
|
+
*/
|
|
13
|
+
this.columnResized = new EventEmitter();
|
|
14
|
+
/**
|
|
15
|
+
* Resize state
|
|
16
|
+
*/
|
|
17
|
+
this.isResizing = false;
|
|
18
|
+
this.startX = 0;
|
|
19
|
+
this.startWidth = 0;
|
|
20
|
+
/**
|
|
21
|
+
* Track mouse movement during resize
|
|
22
|
+
*/
|
|
23
|
+
this.onResizeMove = (event) => {
|
|
24
|
+
if (!this.isResizing) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const deltaX = event.pageX - this.startX;
|
|
28
|
+
let newWidth = this.startWidth + deltaX;
|
|
29
|
+
// Apply constraints
|
|
30
|
+
const minWidth = this.column.minWidth ?? 50;
|
|
31
|
+
const maxWidth = this.column.maxWidth;
|
|
32
|
+
newWidth = Math.max(minWidth, newWidth);
|
|
33
|
+
if (maxWidth) {
|
|
34
|
+
newWidth = Math.min(maxWidth, newWidth);
|
|
35
|
+
}
|
|
36
|
+
// Update column width (mutate Flyweight config)
|
|
37
|
+
this.column.width = newWidth;
|
|
38
|
+
// Update element width immediately for visual feedback
|
|
39
|
+
// this.el.nativeElement.style.width = `${newWidth}px`;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* End resize on mouseup
|
|
43
|
+
*/
|
|
44
|
+
this.onResizeEnd = () => {
|
|
45
|
+
if (!this.isResizing) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.isResizing = false;
|
|
49
|
+
// Emit event with old and new width
|
|
50
|
+
const resizeEvent = {
|
|
51
|
+
columnKey: this.column.key,
|
|
52
|
+
oldWidth: this.startWidth,
|
|
53
|
+
newWidth: this.column.width,
|
|
54
|
+
column: this.column
|
|
55
|
+
};
|
|
56
|
+
this.columnResized.emit(resizeEvent);
|
|
57
|
+
// Remove global listeners
|
|
58
|
+
document.removeEventListener('mousemove', this.onResizeMove);
|
|
59
|
+
document.removeEventListener('mouseup', this.onResizeEnd);
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Start resize on mousedown
|
|
64
|
+
*/
|
|
65
|
+
onResizeStart(event) {
|
|
66
|
+
// Check if click is on the resize handle span element
|
|
67
|
+
const target = event.target;
|
|
68
|
+
const isResizeHandle = target.classList.contains('resize-handle') ||
|
|
69
|
+
target.closest('.resize-handle') !== null;
|
|
70
|
+
if (!isResizeHandle) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (this.column.resizable === false) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
event.preventDefault();
|
|
77
|
+
event.stopPropagation();
|
|
78
|
+
this.isResizing = true;
|
|
79
|
+
this.startX = event.pageX;
|
|
80
|
+
this.startWidth = this.column.width || 100;
|
|
81
|
+
// Attach global listeners
|
|
82
|
+
document.addEventListener('mousemove', this.onResizeMove);
|
|
83
|
+
document.addEventListener('mouseup', this.onResizeEnd);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Cleanup on destroy
|
|
87
|
+
*/
|
|
88
|
+
ngOnDestroy() {
|
|
89
|
+
document.removeEventListener('mousemove', this.onResizeMove);
|
|
90
|
+
document.removeEventListener('mouseup', this.onResizeEnd);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
StColumnResizeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnResizeDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
94
|
+
StColumnResizeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.4.0", type: StColumnResizeDirective, selector: "[stColumnResize]", inputs: { column: "column" }, outputs: { columnResized: "columnResized" }, host: { listeners: { "mousedown": "onResizeStart($event)" } }, ngImport: i0 });
|
|
95
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnResizeDirective, decorators: [{
|
|
96
|
+
type: Directive,
|
|
97
|
+
args: [{
|
|
98
|
+
selector: '[stColumnResize]'
|
|
99
|
+
}]
|
|
100
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { column: [{
|
|
101
|
+
type: Input
|
|
102
|
+
}], columnResized: [{
|
|
103
|
+
type: Output
|
|
104
|
+
}], onResizeStart: [{
|
|
105
|
+
type: HostListener,
|
|
106
|
+
args: ['mousedown', ['$event']]
|
|
107
|
+
}] } });
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtY29sdW1uLXJlc2l6ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2RpcmVjdGl2ZXMvc3QtY29sdW1uLXJlc2l6ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7O0FBTzVHLE1BQU0sT0FBTyx1QkFBdUI7SUFrQmxDLFlBQW9CLEVBQTJCO1FBQTNCLE9BQUUsR0FBRixFQUFFLENBQXlCO1FBWi9DOztXQUVHO1FBQ08sa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUVoRTs7V0FFRztRQUNLLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNYLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFrQ3ZCOztXQUVHO1FBQ0ssaUJBQVksR0FBRyxDQUFDLEtBQWlCLEVBQVEsRUFBRTtZQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsT0FBTzthQUNSO1lBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3pDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1lBRXhDLG9CQUFvQjtZQUNwQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFFdEMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFD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YW5kbGVzIGNvbHVtbiByZXNpemluZyB3aGVuIGFwcGxpZWQgdG8gdGgvdGQgZWxlbWVudHNcbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy9jb2x1bW4tY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemVFdmVudCB9IGZyb20gJy4uL21vZGVscy90YWJsZS10eXBlcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzdENvbHVtblJlc2l6ZV0nXG59KVxuZXhwb3J0IGNsYXNzIFN0Q29sdW1uUmVzaXplRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIENvbHVtbiBjb25maWd1cmF0aW9uXG4gICAqL1xuICBASW5wdXQoKSBjb2x1bW4hOiBDb2x1bW5Db25maWc8YW55PjtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBjb2x1bW4gaXMgcmVzaXplZFxuICAgKi9cbiAgQE91dHB1dCgpIGNvbHVtblJlc2l6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtblJlc2l6ZUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBSZXNpemUgc3RhdGVcbiAgICovXG4gIHByaXZhdGUgaXNSZXNpemluZyA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXJ0WCA9IDA7XG4gIHByaXZhdGUgc3RhcnRXaWR0aCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHt9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHJlc2l6ZSBvbiBtb3VzZWRvd25cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIG9uUmVzaXplU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiBjbGljayBpcyBvbiB0aGUgcmVzaXplIGhhbmRsZSBzcGFuIGVsZW1lbnRcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgaXNSZXNpemVIYW5kbGUgPSB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemUtaGFuZGxlJykgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuY2xvc2VzdCgnLnJlc2l6ZS1oYW5kbGUnKSAhPT0gbnVsbDtcblxuICAgIGlmICghaXNSZXNpemVIYW5kbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2x1bW4ucmVzaXphYmxlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmlzUmVzaXppbmcgPSB0cnVlO1xuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQucGFnZVg7XG4gICAgdGhpcy5zdGFydFdpZHRoID0gKHRoaXMuY29sdW1uLndpZHRoIGFzIG51bWJlcikgfHwgMTAwO1xuXG4gICAgLy8gQXR0YWNoIGdsb2JhbCBsaXN0ZW5lcnNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVFbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrIG1vdXNlIG1vdmVtZW50IGR1cmluZyByZXNpemVcbiAgICovXG4gIHByaXZhdGUgb25SZXNpemVNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLmlzUmVzaXppbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5wYWdlWCAtIHRoaXMuc3RhcnRYO1xuICAgIGxldCBuZXdXaWR0aCA9IHRoaXMuc3RhcnRXaWR0aCArIGRlbHRhWDtcblxuICAgIC8vIEFwcGx5IGNvbnN0cmFpbnRzXG4gICAgY29uc3QgbWluV2lkdGggPSB0aGlzLmNvbHVtbi5taW5XaWR0aCA/PyA1MDtcbiAgICBjb25zdCBtYXhXaWR0aCA9IHRoaXMuY29sdW1uLm1heFdpZHRoO1xuXG4gICAgbmV3V2lkdGggPSBNYXRoLm1heChtaW5XaWR0aCwgbmV3V2lkdGgpO1xuICAgIGlmIChtYXhXaWR0aCkge1xuICAgICAgbmV3V2lkdGggPSBNYXRoLm1pbihtYXhXaWR0aCwgbmV3V2lkdGgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjb2x1bW4gd2lkdGggKG11dGF0ZSBGbHl3ZWlnaHQgY29uZmlnKVxuICAgICh0aGlzLmNvbHVtbiBhcyBhbnkpLndpZHRoID0gbmV3V2lkdGg7XG4gICAgXG4gICAgLy8gVXBkYXRlIGVsZW1lbnQgd2lkdGggaW1tZWRpYXRlbHkgZm9yIHZpc3VhbCBmZWVkYmFja1xuICAgIC8vIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke25ld1dpZHRofXB4YDtcbiAgfTtcblxuICAvKipcbiAgICogRW5kIHJlc2l6ZSBvbiBtb3VzZXVwXG4gICAqL1xuICBwcml2YXRlIG9uUmVzaXplRW5kID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy5pc1Jlc2l6aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1Jlc2l6aW5nID0gZmFsc2U7XG5cbiAgICAvLyBFbWl0IGV2ZW50IHdpdGggb2xkIGFuZCBuZXcgd2lkdGhcbiAgICBjb25zdCByZXNpemVFdmVudDogQ29sdW1uUmVzaXplRXZlbnQgPSB7XG4gICAgICBjb2x1bW5LZXk6IHRoaXMuY29sdW1uLmtleSxcbiAgICAgIG9sZFdpZHRoOiB0aGlzLnN0YXJ0V2lkdGgsXG4gICAgICBuZXdXaWR0aDogKHRoaXMuY29sdW1uLndpZHRoIGFzIG51bWJlcikhLFxuICAgICAgY29sdW1uOiB0aGlzLmNvbHVtblxuICAgIH07XG4gICAgdGhpcy5jb2x1bW5SZXNpemVkLmVtaXQocmVzaXplRXZlbnQpO1xuXG4gICAgLy8gUmVtb3ZlIGdsb2JhbCBsaXN0ZW5lcnNcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVFbmQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGVhbnVwIG9uIGRlc3Ryb3lcbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25SZXNpemVNb3ZlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vblJlc2l6ZUVuZCk7XG4gIH1cbn1cblxuIl19
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Directive, HostListener, Input } from '@angular/core';
|
|
2
|
+
import { NavigationKey, NavigationDirection } from '../../models/cell-types';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Directive to handle keyboard navigation in table cells
|
|
6
|
+
*/
|
|
7
|
+
export class StKeyboardNavigationDirective {
|
|
8
|
+
onKeyDown(event) {
|
|
9
|
+
if (!this.tableState.isNavigationActive()) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const isEditing = this.tableState.isAnyCellEditing();
|
|
13
|
+
// Use NavigationKey enum for type-safe key checking
|
|
14
|
+
switch (event.key) {
|
|
15
|
+
case NavigationKey.ARROW_UP:
|
|
16
|
+
case NavigationKey.ARROW_DOWN:
|
|
17
|
+
case NavigationKey.ARROW_LEFT:
|
|
18
|
+
case NavigationKey.ARROW_RIGHT:
|
|
19
|
+
// Allow navigation when NOT editing
|
|
20
|
+
if (isEditing)
|
|
21
|
+
return;
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
const direction = this.getDirection(event.key);
|
|
24
|
+
if (direction) {
|
|
25
|
+
this.tableState.moveFocus(direction);
|
|
26
|
+
}
|
|
27
|
+
break;
|
|
28
|
+
case NavigationKey.ENTER:
|
|
29
|
+
// Navigate down when NOT editing (Excel-like behavior)
|
|
30
|
+
if (isEditing)
|
|
31
|
+
return; // Let cell component handle save
|
|
32
|
+
event.preventDefault();
|
|
33
|
+
this.tableState.moveFocus(NavigationDirection.DOWN);
|
|
34
|
+
break;
|
|
35
|
+
case NavigationKey.TAB:
|
|
36
|
+
// Navigate left/right when NOT editing (Excel-like behavior)
|
|
37
|
+
if (isEditing)
|
|
38
|
+
return; // Let cell component handle save
|
|
39
|
+
event.preventDefault();
|
|
40
|
+
this.tableState.moveFocus(event.shiftKey ? NavigationDirection.LEFT : NavigationDirection.RIGHT);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Convert navigation key to direction using enums
|
|
46
|
+
*/
|
|
47
|
+
getDirection(key) {
|
|
48
|
+
const map = {
|
|
49
|
+
[NavigationKey.ARROW_UP]: NavigationDirection.UP,
|
|
50
|
+
[NavigationKey.ARROW_DOWN]: NavigationDirection.DOWN,
|
|
51
|
+
[NavigationKey.ARROW_LEFT]: NavigationDirection.LEFT,
|
|
52
|
+
[NavigationKey.ARROW_RIGHT]: NavigationDirection.RIGHT,
|
|
53
|
+
[NavigationKey.TAB]: null,
|
|
54
|
+
[NavigationKey.ENTER]: null,
|
|
55
|
+
[NavigationKey.ESCAPE]: null
|
|
56
|
+
};
|
|
57
|
+
return map[key];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
StKeyboardNavigationDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StKeyboardNavigationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
61
|
+
StKeyboardNavigationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.4.0", type: StKeyboardNavigationDirective, selector: "[stKeyboardNavigation]", inputs: { tableState: "tableState" }, host: { listeners: { "keydown": "onKeyDown($event)" } }, ngImport: i0 });
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StKeyboardNavigationDirective, decorators: [{
|
|
63
|
+
type: Directive,
|
|
64
|
+
args: [{
|
|
65
|
+
selector: '[stKeyboardNavigation]'
|
|
66
|
+
}]
|
|
67
|
+
}], propDecorators: { tableState: [{
|
|
68
|
+
type: Input
|
|
69
|
+
}], onKeyDown: [{
|
|
70
|
+
type: HostListener,
|
|
71
|
+
args: ['keydown', ['$event']]
|
|
72
|
+
}] } });
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qta2V5Ym9hcmQtbmF2aWdhdGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2RpcmVjdGl2ZXMvc3Qta2V5Ym9hcmQtbmF2aWdhdGlvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFFN0U7O0dBRUc7QUFJSCxNQUFNLE9BQU8sNkJBQTZCO0lBSXhDLFNBQVMsQ0FBQyxLQUFvQjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1lBQ3pDLE9BQU87U0FDUjtRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVyRCxvREFBb0Q7UUFDcEQsUUFBUSxLQUFLLENBQUMsR0FBb0IsRUFBRTtZQUNsQyxLQUFLLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDNUIsS0FBSyxhQUFhLENBQUMsVUFBVSxDQUFDO1lBQzlCLEtBQUssYUFBYSxDQUFDLFVBQVUsQ0FBQztZQUM5QixLQUFLLGFBQWEsQ0FBQyxXQUFXO2dCQUM1QixvQ0FBb0M7Z0JBQ3BDLElBQUksU0FBUztvQkFBRSxPQUFPO2dCQUV0QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQW9CLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxTQUFTLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ3RDO2dCQUNELE1BQU07WUFFUixLQUFLLGFBQWEsQ0FBQyxLQUFLO2dCQUN0Qix1REFBdUQ7Z0JBQ3ZELElBQUksU0FBUztvQkFBRSxPQUFPLENBQUMsaUNBQWlDO2dCQUV4RCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwRCxNQUFNO1lBRVIsS0FBSyxhQUFhLENBQUMsR0FBRztnQkFDcEIsNkRBQTZEO2dCQUM3RCxJQUFJLFNBQVM7b0JBQUUsT0FBTyxDQUFDLGlDQUFpQztnQkFFeEQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FDdkIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQ3RFLENBQUM7Z0JBQ0YsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUFDLEdBQWtCO1FBQ3JDLE1BQU0sR0FBRyxHQUFzRDtZQUM3RCxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO1lBQ2hELENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7WUFDcEQsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtZQUNwRCxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLO1lBQ3RELENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUk7WUFDekIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSTtZQUMzQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJO1NBQzdCLENBQUM7UUFDRixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixDQUFDOzswSEE3RFUsNkJBQTZCOzhHQUE3Qiw2QkFBNkI7MkZBQTdCLDZCQUE2QjtrQkFIekMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsd0JBQXdCO2lCQUNuQzs4QkFFVSxVQUFVO3NCQUFsQixLQUFLO2dCQUdOLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRhYmxlU3RhdGUgfSBmcm9tICcuLi9tb2RlbHMvdGFibGUtc3RhdGUuY2xhc3MnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbktleSwgTmF2aWdhdGlvbkRpcmVjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9jZWxsLXR5cGVzJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgdG8gaGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb24gaW4gdGFibGUgY2VsbHNcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3N0S2V5Ym9hcmROYXZpZ2F0aW9uXSdcbn0pXG5leHBvcnQgY2xhc3MgU3RLZXlib2FyZE5hdmlnYXRpb25EaXJlY3RpdmUge1xuICBASW5wdXQoKSB0YWJsZVN0YXRlITogVGFibGVTdGF0ZTtcbiAgXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVTdGF0ZS5pc05hdmlnYXRpb25BY3RpdmUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBpc0VkaXRpbmcgPSB0aGlzLnRhYmxlU3RhdGUuaXNBbnlDZWxsRWRpdGluZygpO1xuICAgIFxuICAgIC8vIFVzZSBOYXZpZ2F0aW9uS2V5IGVudW0gZm9yIHR5cGUtc2FmZSBrZXkgY2hlY2tpbmdcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSBhcyBOYXZpZ2F0aW9uS2V5KSB7XG4gICAgICBjYXNlIE5hdmlnYXRpb25LZXkuQVJST1dfVVA6XG4gICAgICBjYXNlIE5hdmlnYXRpb25LZXkuQVJST1dfRE9XTjpcbiAgICAgIGNhc2UgTmF2aWdhdGlvbktleS5BUlJPV19MRUZUOlxuICAgICAgY2FzZSBOYXZpZ2F0aW9uS2V5LkFSUk9XX1JJR0hUOlxuICAgICAgICAvLyBBbGxvdyBuYXZpZ2F0aW9uIHdoZW4gTk9UIGVkaXRpbmdcbiAgICAgICAgaWYgKGlzRWRpdGluZykgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5nZXREaXJlY3Rpb24oZXZlbnQua2V5IGFzIE5hdmlnYXRpb25LZXkpO1xuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy50YWJsZVN0YXRlLm1vdmVGb2N1cyhkaXJlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBcbiAgICAgIGNhc2UgTmF2aWdhdGlvbktleS5FTlRFUjpcbiAgICAgICAgLy8gTmF2aWdhdGUgZG93biB3aGVuIE5PVCBlZGl0aW5nIChFeGNlbC1saWtlIGJlaGF2aW9yKVxuICAgICAgICBpZiAoaXNFZGl0aW5nKSByZXR1cm47IC8vIExldCBjZWxsIGNvbXBvbmVudCBoYW5kbGUgc2F2ZVxuICAgICAgICBcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy50YWJsZVN0YXRlLm1vdmVGb2N1cyhOYXZpZ2F0aW9uRGlyZWN0aW9uLkRPV04pO1xuICAgICAgICBicmVhaztcbiAgICAgICAgXG4gICAgICBjYXNlIE5hdmlnYXRpb25LZXkuVEFCOlxuICAgICAgICAvLyBOYXZpZ2F0ZSBsZWZ0L3JpZ2h0IHdoZW4gTk9UIGVkaXRpbmcgKEV4Y2VsLWxpa2UgYmVoYXZpb3IpXG4gICAgICAgIGlmIChpc0VkaXRpbmcpIHJldHVybjsgLy8gTGV0IGNlbGwgY29tcG9uZW50IGhhbmRsZSBzYXZlXG4gICAgICAgIFxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnRhYmxlU3RhdGUubW92ZUZvY3VzKFxuICAgICAgICAgIGV2ZW50LnNoaWZ0S2V5ID8gTmF2aWdhdGlvbkRpcmVjdGlvbi5MRUZUIDogTmF2aWdhdGlvbkRpcmVjdGlvbi5SSUdIVFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb252ZXJ0IG5hdmlnYXRpb24ga2V5IHRvIGRpcmVjdGlvbiB1c2luZyBlbnVtc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXREaXJlY3Rpb24oa2V5OiBOYXZpZ2F0aW9uS2V5KTogTmF2aWdhdGlvbkRpcmVjdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPE5hdmlnYXRpb25LZXksIE5hdmlnYXRpb25EaXJlY3Rpb24gfCBudWxsPiA9IHtcbiAgICAgIFtOYXZpZ2F0aW9uS2V5LkFSUk9XX1VQXTogTmF2aWdhdGlvbkRpcmVjdGlvbi5VUCxcbiAgICAgIFtOYXZpZ2F0aW9uS2V5LkFSUk9XX0RPV05dOiBOYXZpZ2F0aW9uRGlyZWN0aW9uLkRPV04sXG4gICAgICBbTmF2aWdhdGlvbktleS5BUlJPV19MRUZUXTogTmF2aWdhdGlvbkRpcmVjdGlvbi5MRUZULFxuICAgICAgW05hdmlnYXRpb25LZXkuQVJST1dfUklHSFRdOiBOYXZpZ2F0aW9uRGlyZWN0aW9uLlJJR0hULFxuICAgICAgW05hdmlnYXRpb25LZXkuVEFCXTogbnVsbCxcbiAgICAgIFtOYXZpZ2F0aW9uS2V5LkVOVEVSXTogbnVsbCxcbiAgICAgIFtOYXZpZ2F0aW9uS2V5LkVTQ0FQRV06IG51bGxcbiAgICB9O1xuICAgIHJldHVybiBtYXBba2V5XTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cell state interface - represents unique state per cell instance
|
|
3
|
+
* This is the "Context" in the Flyweight pattern
|
|
4
|
+
*/
|
|
5
|
+
import { CellLifecycleState } from '../../models/cell-types';
|
|
6
|
+
/**
|
|
7
|
+
* Factory function to create initial cell state with defaults
|
|
8
|
+
*/
|
|
9
|
+
export function createCellState(value, overrides) {
|
|
10
|
+
return {
|
|
11
|
+
value,
|
|
12
|
+
isEditing: false,
|
|
13
|
+
isDirty: false,
|
|
14
|
+
isFocused: false,
|
|
15
|
+
previousValue: value,
|
|
16
|
+
originalValue: value,
|
|
17
|
+
lifecycleState: CellLifecycleState.DISPLAY,
|
|
18
|
+
...overrides
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a memento snapshot of cell state
|
|
23
|
+
*/
|
|
24
|
+
export function createMemento(state) {
|
|
25
|
+
return {
|
|
26
|
+
value: state.value,
|
|
27
|
+
isDirty: state.isDirty,
|
|
28
|
+
error: state.error,
|
|
29
|
+
metadata: state.metadata ? { ...state.metadata } : undefined,
|
|
30
|
+
timestamp: new Date()
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Restore cell state from memento
|
|
35
|
+
*/
|
|
36
|
+
export function restoreFromMemento(currentState, memento) {
|
|
37
|
+
return {
|
|
38
|
+
...currentState,
|
|
39
|
+
value: memento.value,
|
|
40
|
+
isDirty: memento.isDirty,
|
|
41
|
+
error: memento.error,
|
|
42
|
+
metadata: memento.metadata ? { ...memento.metadata } : currentState.metadata
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Helper to check if cell is in valid state
|
|
47
|
+
*/
|
|
48
|
+
export function isCellValid(state) {
|
|
49
|
+
return !state.error && (!state.errors || Object.keys(state.errors).length === 0);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Helper to check if cell can be edited
|
|
53
|
+
*/
|
|
54
|
+
export function canEdit(state) {
|
|
55
|
+
return !state.isDisabled &&
|
|
56
|
+
!state.isReadonly &&
|
|
57
|
+
!state.isLoading &&
|
|
58
|
+
state.lifecycleState !== CellLifecycleState.SAVING;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Helper to check if cell is in display mode
|
|
62
|
+
*/
|
|
63
|
+
export function isDisplayMode(state) {
|
|
64
|
+
return state.lifecycleState === CellLifecycleState.DISPLAY && !state.isEditing;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1zdGF0ZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL21vZGVscy9jZWxsLXN0YXRlLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQWtHN0Q7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFJLEtBQVEsRUFBRSxTQUFpQztJQUM1RSxPQUFPO1FBQ0wsS0FBSztRQUNMLFNBQVMsRUFBRSxLQUFLO1FBQ2hCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsU0FBUyxFQUFFLEtBQUs7UUFDaEIsYUFBYSxFQUFFLEtBQUs7UUFDcEIsYUFBYSxFQUFFLEtBQUs7UUFDcEIsY0FBYyxFQUFFLGtCQUFrQixDQUFDLE9BQU87UUFDMUMsR0FBRyxTQUFTO0tBQ2IsQ0FBQztBQUNKLENBQUM7QUFjRDs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUksS0FBbUI7SUFDbEQsT0FBTztRQUNMLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztRQUNsQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87UUFDdEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1FBQ2xCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzVELFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxZQUEwQixFQUMxQixPQUE0QjtJQUU1QixPQUFPO1FBQ0wsR0FBRyxZQUFZO1FBQ2YsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRO0tBQzdFLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFJLEtBQW1CO0lBQ2hELE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNuRixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFJLEtBQW1CO0lBQzVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVTtRQUNqQixDQUFDLEtBQUssQ0FBQyxVQUFVO1FBQ2pCLENBQUMsS0FBSyxDQUFDLFNBQVM7UUFDaEIsS0FBSyxDQUFDLGNBQWMsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7QUFDNUQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBSSxLQUFtQjtJQUNsRCxPQUFPLEtBQUssQ0FBQyxjQUFjLEtBQUssa0JBQWtCLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztBQUNqRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDZWxsIHN0YXRlIGludGVyZmFjZSAtIHJlcHJlc2VudHMgdW5pcXVlIHN0YXRlIHBlciBjZWxsIGluc3RhbmNlXG4gKiBUaGlzIGlzIHRoZSBcIkNvbnRleHRcIiBpbiB0aGUgRmx5d2VpZ2h0IHBhdHRlcm5cbiAqL1xuXG5pbXBvcnQgeyBDZWxsTGlmZWN5Y2xlU3RhdGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2VsbC10eXBlcyc7XG5cbi8qKlxuICogQ2VsbCBzdGF0ZSBjb250YWluaW5nIGFsbCB1bmlxdWUgc3RhdGUgcGVyIGNlbGwgaW5zdGFuY2VcbiAqIFRoaXMgaXMgc3RvcmVkIGluZGl2aWR1YWxseSBwZXIgY2VsbCwgd2hpbGUgQ29sdW1uQ29uZmlnIGlzIHNoYXJlZCAoRmx5d2VpZ2h0KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENlbGxTdGF0ZTxUID0gYW55PiB7XG4gIC8qKlxuICAgKiBDdXJyZW50IGNlbGwgdmFsdWVcbiAgICovXG4gIHZhbHVlOiBUO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjZWxsIGlzIGN1cnJlbnRseSBpbiBlZGl0IG1vZGVcbiAgICovXG4gIGlzRWRpdGluZzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2VsbCB2YWx1ZSBoYXMgYmVlbiBtb2RpZmllZFxuICAgKi9cbiAgaXNEaXJ0eTogYm9vbGVhbjtcblxuICAvKipcbiAgICogUHJldmlvdXMgdmFsdWUgYmVmb3JlIGN1cnJlbnQgZWRpdCAoZm9yIHVuZG8vY2FuY2VsKVxuICAgKi9cbiAgcHJldmlvdXNWYWx1ZT86IFQ7XG5cbiAgLyoqXG4gICAqIE9yaWdpbmFsIHZhbHVlIHdoZW4gY2VsbCB3YXMgaW5pdGlhbGl6ZWQgKGZvciByZXNldClcbiAgICovXG4gIG9yaWdpbmFsVmFsdWU/OiBUO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIGVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlsZWRcbiAgICovXG4gIGVycm9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNdWx0aXBsZSB2YWxpZGF0aW9uIGVycm9ycyAoZmllbGQtc3BlY2lmaWMpXG4gICAqL1xuICBlcnJvcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXYXJuaW5nIG1lc3NhZ2VzIChub24tYmxvY2tpbmcpXG4gICAqL1xuICB3YXJuaW5ncz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBDdXJyZW50IGxpZmVjeWNsZSBzdGF0ZSBvZiB0aGUgY2VsbFxuICAgKi9cbiAgbGlmZWN5Y2xlU3RhdGU6IENlbGxMaWZlY3ljbGVTdGF0ZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2VsbCBpcyBjdXJyZW50bHkgbG9hZGluZyAoYXN5bmMgb3BlcmF0aW9ucylcbiAgICovXG4gIGlzTG9hZGluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNlbGwgaXMgZGlzYWJsZWRcbiAgICovXG4gIGlzRGlzYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjZWxsIGlzIHJlYWRvbmx5XG4gICAqL1xuICBpc1JlYWRvbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2VsbCBpcyBzZWxlY3RlZFxuICAgKi9cbiAgaXNTZWxlY3RlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNlbGwgaXMgZm9jdXNlZFxuICAgKi9cbiAgaXNGb2N1c2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2VsbCBpcyBob3ZlcmVkXG4gICAqL1xuICBpc0hvdmVyZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gbWV0YWRhdGEgZm9yIGNlbGwtc3BlY2lmaWMgZGF0YVxuICAgKi9cbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgb2YgbGFzdCBtb2RpZmljYXRpb25cbiAgICovXG4gIGxhc3RNb2RpZmllZD86IERhdGU7XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBvZiBsYXN0IHZhbGlkYXRpb25cbiAgICovXG4gIGxhc3RWYWxpZGF0ZWQ/OiBEYXRlO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGluaXRpYWwgY2VsbCBzdGF0ZSB3aXRoIGRlZmF1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDZWxsU3RhdGU8VD4odmFsdWU6IFQsIG92ZXJyaWRlcz86IFBhcnRpYWw8Q2VsbFN0YXRlPFQ+Pik6IENlbGxTdGF0ZTxUPiB7XG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgaXNFZGl0aW5nOiBmYWxzZSxcbiAgICBpc0RpcnR5OiBmYWxzZSxcbiAgICBpc0ZvY3VzZWQ6IGZhbHNlLFxuICAgIHByZXZpb3VzVmFsdWU6IHZhbHVlLFxuICAgIG9yaWdpbmFsVmFsdWU6IHZhbHVlLFxuICAgIGxpZmVjeWNsZVN0YXRlOiBDZWxsTGlmZWN5Y2xlU3RhdGUuRElTUExBWSxcbiAgICAuLi5vdmVycmlkZXNcbiAgfTtcbn1cblxuLyoqXG4gKiBDZWxsIHN0YXRlIG1lbWVudG8gZm9yIHNhdmUvcmVzdG9yZSBvcGVyYXRpb25zIChNZW1lbnRvIHBhdHRlcm4pXG4gKiBDb250YWlucyBtaW5pbWFsIHN0YXRlIG5lZWRlZCBmb3IgdW5kby9yZWRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2VsbFN0YXRlTWVtZW50bzxUID0gYW55PiB7XG4gIHZhbHVlOiBUO1xuICBpc0RpcnR5OiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB0aW1lc3RhbXA6IERhdGU7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbWVtZW50byBzbmFwc2hvdCBvZiBjZWxsIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZW1lbnRvPFQ+KHN0YXRlOiBDZWxsU3RhdGU8VD4pOiBDZWxsU3RhdGVNZW1lbnRvPFQ+IHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogc3RhdGUudmFsdWUsXG4gICAgaXNEaXJ0eTogc3RhdGUuaXNEaXJ0eSxcbiAgICBlcnJvcjogc3RhdGUuZXJyb3IsXG4gICAgbWV0YWRhdGE6IHN0YXRlLm1ldGFkYXRhID8geyAuLi5zdGF0ZS5tZXRhZGF0YSB9IDogdW5kZWZpbmVkLFxuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxuICB9O1xufVxuXG4vKipcbiAqIFJlc3RvcmUgY2VsbCBzdGF0ZSBmcm9tIG1lbWVudG9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3RvcmVGcm9tTWVtZW50bzxUPihcbiAgY3VycmVudFN0YXRlOiBDZWxsU3RhdGU8VD4sXG4gIG1lbWVudG86IENlbGxTdGF0ZU1lbWVudG88VD5cbik6IENlbGxTdGF0ZTxUPiB7XG4gIHJldHVybiB7XG4gICAgLi4uY3VycmVudFN0YXRlLFxuICAgIHZhbHVlOiBtZW1lbnRvLnZhbHVlLFxuICAgIGlzRGlydHk6IG1lbWVudG8uaXNEaXJ0eSxcbiAgICBlcnJvcjogbWVtZW50by5lcnJvcixcbiAgICBtZXRhZGF0YTogbWVtZW50by5tZXRhZGF0YSA/IHsgLi4ubWVtZW50by5tZXRhZGF0YSB9IDogY3VycmVudFN0YXRlLm1ldGFkYXRhXG4gIH07XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGNoZWNrIGlmIGNlbGwgaXMgaW4gdmFsaWQgc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2VsbFZhbGlkPFQ+KHN0YXRlOiBDZWxsU3RhdGU8VD4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFzdGF0ZS5lcnJvciAmJiAoIXN0YXRlLmVycm9ycyB8fCBPYmplY3Qua2V5cyhzdGF0ZS5lcnJvcnMpLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGNoZWNrIGlmIGNlbGwgY2FuIGJlIGVkaXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuRWRpdDxUPihzdGF0ZTogQ2VsbFN0YXRlPFQ+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhc3RhdGUuaXNEaXNhYmxlZCAmJiBcbiAgICAgICAgICFzdGF0ZS5pc1JlYWRvbmx5ICYmIFxuICAgICAgICAgIXN0YXRlLmlzTG9hZGluZyAmJlxuICAgICAgICAgc3RhdGUubGlmZWN5Y2xlU3RhdGUgIT09IENlbGxMaWZlY3ljbGVTdGF0ZS5TQVZJTkc7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGNoZWNrIGlmIGNlbGwgaXMgaW4gZGlzcGxheSBtb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc3BsYXlNb2RlPFQ+KHN0YXRlOiBDZWxsU3RhdGU8VD4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0YXRlLmxpZmVjeWNsZVN0YXRlID09PSBDZWxsTGlmZWN5Y2xlU3RhdGUuRElTUExBWSAmJiAhc3RhdGUuaXNFZGl0aW5nO1xufVxuXG4iXX0=
|