@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.
Files changed (169) hide show
  1. package/README.md +152 -0
  2. package/aquera-ngx-smart-table.d.ts +5 -0
  3. package/esm2020/aquera-ngx-smart-table.mjs +5 -0
  4. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
  5. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
  6. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
  7. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
  8. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
  9. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
  10. package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
  11. package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
  12. package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
  13. package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
  14. package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
  15. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
  16. package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
  17. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
  18. package/esm2020/lib/editors/index.mjs +9 -0
  19. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
  20. package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
  21. package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
  22. package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
  23. package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
  24. package/esm2020/lib/factories/column-config.factory.mjs +231 -0
  25. package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
  26. package/esm2020/lib/models/base-column-config.class.mjs +253 -0
  27. package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
  28. package/esm2020/lib/models/cell-types.mjs +147 -0
  29. package/esm2020/lib/models/column-action.interface.mjs +6 -0
  30. package/esm2020/lib/models/column-config.interface.mjs +43 -0
  31. package/esm2020/lib/models/column-config.utils.mjs +101 -0
  32. package/esm2020/lib/models/row-action.interface.mjs +5 -0
  33. package/esm2020/lib/models/row-validator.interface.mjs +2 -0
  34. package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
  35. package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
  36. package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
  37. package/esm2020/lib/models/table-config.interface.mjs +106 -0
  38. package/esm2020/lib/models/table-validator.interface.mjs +2 -0
  39. package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
  40. package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
  41. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
  42. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
  43. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
  44. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
  45. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
  46. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
  47. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
  48. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
  49. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
  50. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
  51. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
  52. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
  53. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
  54. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
  55. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
  56. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
  57. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
  58. package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
  59. package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
  60. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
  61. package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
  62. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
  63. package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
  64. package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
  65. package/esm2020/lib/renderer/models/table-types.mjs +29 -0
  66. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
  67. package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
  68. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
  69. package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
  70. package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
  71. package/esm2020/lib/services/autosave.service.mjs +92 -0
  72. package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
  73. package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
  74. package/esm2020/lib/services/row-validation.service.mjs +42 -0
  75. package/esm2020/lib/services/validation-logger.service.mjs +177 -0
  76. package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
  77. package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
  78. package/esm2020/lib/smart-table.module.mjs +124 -0
  79. package/esm2020/lib/strategies/default-editors.mjs +433 -0
  80. package/esm2020/lib/strategies/default-formatters.mjs +238 -0
  81. package/esm2020/lib/strategies/default-validators.mjs +327 -0
  82. package/esm2020/public-api.mjs +146 -0
  83. package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
  84. package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
  85. package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
  86. package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
  87. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
  88. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
  89. package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
  90. package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
  91. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
  92. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
  93. package/lib/builder/definition-builder.module.d.ts +15 -0
  94. package/lib/builder/models/builder-state.interface.d.ts +93 -0
  95. package/lib/builder/services/definition-builder.service.d.ts +80 -0
  96. package/lib/builder/services/definition-export.service.d.ts +59 -0
  97. package/lib/builder/services/definition-import.service.d.ts +31 -0
  98. package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
  99. package/lib/builder/utils/config-validator.util.d.ts +32 -0
  100. package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
  101. package/lib/editors/index.d.ts +8 -0
  102. package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
  103. package/lib/editors/nile-calendar-editor.d.ts +89 -0
  104. package/lib/editors/nile-date-picker-editor.d.ts +95 -0
  105. package/lib/editors/nile-input-editor.d.ts +67 -0
  106. package/lib/editors/nile-select-editor.d.ts +109 -0
  107. package/lib/factories/column-config.factory.d.ts +73 -0
  108. package/lib/models/autosave-config.interface.d.ts +23 -0
  109. package/lib/models/base-column-config.class.d.ts +115 -0
  110. package/lib/models/cell-strategies.interface.d.ts +181 -0
  111. package/lib/models/cell-types.d.ts +337 -0
  112. package/lib/models/column-action.interface.d.ts +86 -0
  113. package/lib/models/column-config.interface.d.ts +272 -0
  114. package/lib/models/column-config.utils.d.ts +37 -0
  115. package/lib/models/row-action.interface.d.ts +86 -0
  116. package/lib/models/row-validator.interface.d.ts +37 -0
  117. package/lib/models/schema-validation.interface.d.ts +42 -0
  118. package/lib/models/sheet-action.interface.d.ts +59 -0
  119. package/lib/models/sheet-config.interface.d.ts +41 -0
  120. package/lib/models/table-config.interface.d.ts +245 -0
  121. package/lib/models/table-validator.interface.d.ts +40 -0
  122. package/lib/models/workbook-action.interface.d.ts +90 -0
  123. package/lib/models/workbook-config.interface.d.ts +107 -0
  124. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
  125. package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
  126. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
  127. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
  128. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
  129. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
  130. package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
  131. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
  132. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
  133. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
  134. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
  135. package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
  136. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
  137. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
  138. package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
  139. package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
  140. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
  141. package/lib/renderer/models/cell-state.interface.d.ts +118 -0
  142. package/lib/renderer/models/cell.class.d.ts +174 -0
  143. package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
  144. package/lib/renderer/models/sheet-state.class.d.ts +67 -0
  145. package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
  146. package/lib/renderer/models/table-state.class.d.ts +313 -0
  147. package/lib/renderer/models/table-state.interface.d.ts +18 -0
  148. package/lib/renderer/models/table-types.d.ts +228 -0
  149. package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
  150. package/lib/renderer/models/workbook-state.class.d.ts +117 -0
  151. package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
  152. package/lib/renderer/models/z-index.enum.d.ts +44 -0
  153. package/lib/schemas/table-config.schema.d.ts +455 -0
  154. package/lib/services/autosave.service.d.ts +73 -0
  155. package/lib/services/custom-validation-rules.util.d.ts +12 -0
  156. package/lib/services/json-schema-validator.service.d.ts +49 -0
  157. package/lib/services/row-validation.service.d.ts +17 -0
  158. package/lib/services/validation-logger.service.d.ts +87 -0
  159. package/lib/services/virtual-scroll.service.d.ts +44 -0
  160. package/lib/shared/shared-table-components.module.d.ts +9 -0
  161. package/lib/smart-table.module.d.ts +26 -0
  162. package/lib/strategies/default-editors.d.ts +109 -0
  163. package/lib/strategies/default-formatters.d.ts +116 -0
  164. package/lib/strategies/default-validators.d.ts +113 -0
  165. package/package.json +42 -0
  166. package/public-api.d.ts +70 -0
  167. package/src/lib/builder/README.md +30 -0
  168. package/src/lib/editors/README.md +303 -0
  169. 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=