@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,232 @@
1
+ import { Component, EventEmitter, Output, Input, ViewChild, HostListener } from '@angular/core';
2
+ import { SortDirection } from '../../models/table-types';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../st-column-filter/st-column-filter.component";
5
+ import * as i2 from "@angular/common";
6
+ export class StColumnMenuDropdownComponent {
7
+ constructor() {
8
+ /**
9
+ * Whether the dropdown is open
10
+ */
11
+ this.isOpen = false;
12
+ /**
13
+ * Position of the dropdown (x, y coordinates)
14
+ */
15
+ this.position = { x: 0, y: 0 };
16
+ /**
17
+ * Context containing column data, index, and actions
18
+ */
19
+ this.context = null;
20
+ /**
21
+ * Emitted when an action is clicked
22
+ */
23
+ this.actionClicked = new EventEmitter();
24
+ /**
25
+ * Emitted when the dropdown should close
26
+ */
27
+ this.closed = new EventEmitter();
28
+ /**
29
+ * Visible actions (filtered by hidden property)
30
+ */
31
+ this.visibleActions = [];
32
+ /**
33
+ * Dropdown positioning style
34
+ */
35
+ this.dropdownStyle = {};
36
+ this.isFilterOpen = false;
37
+ }
38
+ ngOnChanges(changes) {
39
+ if (changes['context'] || changes['isOpen']) {
40
+ this.updateVisibleActions();
41
+ }
42
+ if (changes['position'] || changes['isOpen']) {
43
+ this.updateDropdownPosition();
44
+ }
45
+ }
46
+ /**
47
+ * Update visible actions based on hidden property
48
+ */
49
+ updateVisibleActions() {
50
+ if (!this.context) {
51
+ this.visibleActions = [];
52
+ return;
53
+ }
54
+ this.visibleActions = this.context.actions.filter(action => {
55
+ if (typeof action.hidden === 'function') {
56
+ return !action.hidden(this.context.column, this.context.columnIndex);
57
+ }
58
+ return !action.hidden;
59
+ });
60
+ }
61
+ /**
62
+ * Check if an action is currently active (for checkmarks)
63
+ */
64
+ isActionActive(action) {
65
+ if (!this.context)
66
+ return false;
67
+ const column = this.context.column;
68
+ // Sort actions
69
+ if (action.id === 'sort-asc') {
70
+ return column.sortDirection === SortDirection.ASC;
71
+ }
72
+ if (action.id === 'sort-desc') {
73
+ return column.sortDirection === SortDirection.DESC;
74
+ }
75
+ // Filter action
76
+ if (action.id === 'filter') {
77
+ return column.filterConfig?.enabled === true;
78
+ }
79
+ // Pin actions
80
+ if (action.id === 'pin-left') {
81
+ return column.sticky === 'left';
82
+ }
83
+ if (action.id === 'pin-right') {
84
+ return column.sticky === 'right';
85
+ }
86
+ return false;
87
+ }
88
+ /**
89
+ * Determine if divider should be shown after an action
90
+ * Groups built-in actions: [sort group] | [filter] | [pin group] | [move group] | [custom]
91
+ */
92
+ shouldShowDividerAfter(action, index, isLast) {
93
+ if (isLast || !this.visibleActions[index + 1])
94
+ return false;
95
+ const currentId = action.id;
96
+ const nextId = this.visibleActions[index + 1].id;
97
+ // Divider after sort group
98
+ if (['sort-asc', 'sort-desc', 'clear-sort'].includes(currentId) &&
99
+ !['sort-asc', 'sort-desc', 'clear-sort'].includes(nextId)) {
100
+ return true;
101
+ }
102
+ // Divider after filter
103
+ if (currentId === 'filter') {
104
+ return true;
105
+ }
106
+ // Divider after pin group
107
+ if (['pin-left', 'pin-right', 'unpin'].includes(currentId) &&
108
+ !['pin-left', 'pin-right', 'unpin'].includes(nextId)) {
109
+ return true;
110
+ }
111
+ // Divider after move group (before custom actions)
112
+ if (['move-left', 'move-right'].includes(currentId) &&
113
+ !['move-left', 'move-right'].includes(nextId)) {
114
+ return true;
115
+ }
116
+ return false;
117
+ }
118
+ /**
119
+ * Update dropdown position based on available viewport space
120
+ */
121
+ updateDropdownPosition() {
122
+ if (!this.isOpen) {
123
+ this.dropdownStyle = {};
124
+ return;
125
+ }
126
+ const viewportWidth = window.innerWidth;
127
+ const viewportHeight = window.innerHeight;
128
+ const dropdownWidth = 280; // Approximate dropdown width
129
+ const dropdownHeight = 300; // Approximate max dropdown height
130
+ let { x, y } = this.position;
131
+ // Adjust horizontal position if dropdown would overflow
132
+ if (x + dropdownWidth > viewportWidth) {
133
+ x = Math.max(10, viewportWidth - dropdownWidth - 10);
134
+ }
135
+ // Adjust vertical position if dropdown would overflow
136
+ if (y + dropdownHeight > viewportHeight) {
137
+ y = Math.max(10, viewportHeight - dropdownHeight - 10);
138
+ }
139
+ this.dropdownStyle = {
140
+ position: 'fixed',
141
+ left: `${x}px`,
142
+ top: `${y}px`,
143
+ 'z-index': 9999
144
+ };
145
+ }
146
+ /**
147
+ * Check if an action is disabled
148
+ */
149
+ isActionDisabled(action) {
150
+ if (!this.context)
151
+ return true;
152
+ if (typeof action.disabled === 'function') {
153
+ return action.disabled(this.context.column, this.context.columnIndex);
154
+ }
155
+ return action.disabled || false;
156
+ }
157
+ /**
158
+ * Handle action click
159
+ */
160
+ onActionClick(action) {
161
+ if (!this.context || this.isActionDisabled(action)) {
162
+ return;
163
+ }
164
+ // Special handling for filter action - open filter popup
165
+ if (action.id === 'filter') {
166
+ this.isFilterOpen = true;
167
+ return; // Don't emit or close menu
168
+ }
169
+ const event = {
170
+ action,
171
+ column: this.context.column,
172
+ columnIndex: this.context.columnIndex
173
+ };
174
+ this.actionClicked.emit(event);
175
+ }
176
+ /**
177
+ * Close dropdown when clicking backdrop
178
+ */
179
+ onBackdropClick(event) {
180
+ const target = event.target;
181
+ if (target.classList.contains('dropdown-backdrop')) {
182
+ // this.closed.emit();
183
+ }
184
+ }
185
+ onFilterClosed() {
186
+ this.isFilterOpen = false;
187
+ // Close the entire column menu when filter is closed
188
+ this.closed.emit();
189
+ }
190
+ onFilterApplied(event) {
191
+ console.log('Filter applied:', event);
192
+ this.isFilterOpen = false;
193
+ // Close the entire column menu when filter is applied
194
+ this.closed.emit();
195
+ }
196
+ onFilterCleared() {
197
+ console.log('Filter cleared');
198
+ this.isFilterOpen = false;
199
+ // Close the entire column menu when filter is cleared
200
+ this.closed.emit();
201
+ }
202
+ /**
203
+ * Determine if menu should align to the left (for first few columns)
204
+ */
205
+ shouldAlignLeft() {
206
+ // Align left for first 2 columns to prevent clipping
207
+ return (this.context?.columnIndex || 0) <= 1;
208
+ }
209
+ }
210
+ StColumnMenuDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnMenuDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
211
+ StColumnMenuDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StColumnMenuDropdownComponent, selector: "st-column-menu-dropdown", inputs: { isOpen: "isOpen", position: "position", context: "context" }, outputs: { actionClicked: "actionClicked", closed: "closed" }, host: { listeners: { "click": "onBackdropClick($event)" } }, viewQueries: [{ propertyName: "filterPopup", first: true, predicate: ["filterPopup"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Dropdown container with backdrop -->\n<div class=\"dropdown-container\" *ngIf=\"isOpen && context\">\n <!-- Backdrop -->\n <div class=\"dropdown-backdrop\" (click)=\"closed.emit()\"></div>\n \n <!-- Dropdown menu -->\n <div class=\"column-menu-dropdown\" [ngStyle]=\"dropdownStyle\">\n <!-- Main menu with actions -->\n <nile-menu *ngIf=\"!isFilterOpen\">\n <!-- Dynamically render all visible actions -->\n <ng-container *ngFor=\"let action of visibleActions; let i = index; let last = last\">\n <nile-menu-item \n (click)=\"onActionClick(action)\"\n [class.disabled]=\"isActionDisabled(action)\"\n [class.active]=\"isActionActive(action)\">\n <span class=\"checkmark\" *ngIf=\"isActionActive(action)\">\u2713</span>\n <nile-icon slot=\"prefix\" *ngIf=\"action.icon && !isActionActive(action)\" [name]=\"action.icon\"></nile-icon>\n <span class=\"action-label\">{{ action.label }}</span>\n </nile-menu-item>\n \n <!-- Add divider after action groups -->\n <nile-divider *ngIf=\"shouldShowDividerAfter(action, i, last)\"></nile-divider>\n </ng-container>\n \n <!-- Fallback if no actions -->\n <nile-menu-item *ngIf=\"visibleActions.length === 0\">\n No actions available\n </nile-menu-item>\n </nile-menu>\n \n <!-- Filter popup (conditionally rendered) -->\n <st-column-filter\n #filterPopup\n *ngIf=\"isFilterOpen && context\"\n [column]=\"context.column\"\n [tableState]=\"context.tableState\"\n [columnIndex]=\"context.columnIndex\"\n [isFirstColumn]=\"context.isFirstColumn\"\n [isLastColumn]=\"context.isLastColumn\"\n [isOpen]=\"isFilterOpen\"\n (filterApplied)=\"onFilterApplied($event)\"\n (filterCleared)=\"onFilterCleared()\"\n (closed)=\"onFilterClosed()\">\n </st-column-filter>\n </div>\n</div>\n", styles: [".dropdown-container{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998}.dropdown-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#0000004d;pointer-events:auto;z-index:9998}.column-menu-dropdown{min-width:200px;max-width:300px;background-color:#fff;border-radius:8px;box-shadow:0 10px 25px #00000026;overflow:hidden;pointer-events:auto;z-index:9999}nile-menu nile-divider::part(divider){margin:0}nile-menu nile-menu-item::part(base){height:2.5rem;min-height:auto}nile-menu nile-menu-item .checkmark{margin-right:8px;color:#4299e1;font-weight:700}\n"], components: [{ type: i1.StColumnFilterComponent, selector: "st-column-filter", inputs: ["column", "tableState", "columnIndex", "isFirstColumn", "isLastColumn", "isOpen", "filterContext"], outputs: ["closed", "filterApplied", "filterCleared"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnMenuDropdownComponent, decorators: [{
213
+ type: Component,
214
+ args: [{ selector: 'st-column-menu-dropdown', template: "<!-- Dropdown container with backdrop -->\n<div class=\"dropdown-container\" *ngIf=\"isOpen && context\">\n <!-- Backdrop -->\n <div class=\"dropdown-backdrop\" (click)=\"closed.emit()\"></div>\n \n <!-- Dropdown menu -->\n <div class=\"column-menu-dropdown\" [ngStyle]=\"dropdownStyle\">\n <!-- Main menu with actions -->\n <nile-menu *ngIf=\"!isFilterOpen\">\n <!-- Dynamically render all visible actions -->\n <ng-container *ngFor=\"let action of visibleActions; let i = index; let last = last\">\n <nile-menu-item \n (click)=\"onActionClick(action)\"\n [class.disabled]=\"isActionDisabled(action)\"\n [class.active]=\"isActionActive(action)\">\n <span class=\"checkmark\" *ngIf=\"isActionActive(action)\">\u2713</span>\n <nile-icon slot=\"prefix\" *ngIf=\"action.icon && !isActionActive(action)\" [name]=\"action.icon\"></nile-icon>\n <span class=\"action-label\">{{ action.label }}</span>\n </nile-menu-item>\n \n <!-- Add divider after action groups -->\n <nile-divider *ngIf=\"shouldShowDividerAfter(action, i, last)\"></nile-divider>\n </ng-container>\n \n <!-- Fallback if no actions -->\n <nile-menu-item *ngIf=\"visibleActions.length === 0\">\n No actions available\n </nile-menu-item>\n </nile-menu>\n \n <!-- Filter popup (conditionally rendered) -->\n <st-column-filter\n #filterPopup\n *ngIf=\"isFilterOpen && context\"\n [column]=\"context.column\"\n [tableState]=\"context.tableState\"\n [columnIndex]=\"context.columnIndex\"\n [isFirstColumn]=\"context.isFirstColumn\"\n [isLastColumn]=\"context.isLastColumn\"\n [isOpen]=\"isFilterOpen\"\n (filterApplied)=\"onFilterApplied($event)\"\n (filterCleared)=\"onFilterCleared()\"\n (closed)=\"onFilterClosed()\">\n </st-column-filter>\n </div>\n</div>\n", styles: [".dropdown-container{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998}.dropdown-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#0000004d;pointer-events:auto;z-index:9998}.column-menu-dropdown{min-width:200px;max-width:300px;background-color:#fff;border-radius:8px;box-shadow:0 10px 25px #00000026;overflow:hidden;pointer-events:auto;z-index:9999}nile-menu nile-divider::part(divider){margin:0}nile-menu nile-menu-item::part(base){height:2.5rem;min-height:auto}nile-menu nile-menu-item .checkmark{margin-right:8px;color:#4299e1;font-weight:700}\n"] }]
215
+ }], propDecorators: { isOpen: [{
216
+ type: Input
217
+ }], position: [{
218
+ type: Input
219
+ }], context: [{
220
+ type: Input
221
+ }], actionClicked: [{
222
+ type: Output
223
+ }], closed: [{
224
+ type: Output
225
+ }], filterPopup: [{
226
+ type: ViewChild,
227
+ args: ['filterPopup']
228
+ }], onBackdropClick: [{
229
+ type: HostListener,
230
+ args: ['click', ['$event']]
231
+ }] } });
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtY29sdW1uLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LWNvbHVtbi1tZW51L3N0LWNvbHVtbi1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1jb2x1bW4tbWVudS9zdC1jb2x1bW4tbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBNEIsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQVN6RCxNQUFNLE9BQU8sNkJBQTZCO0lBTDFDO1FBTUU7O1dBRUc7UUFDTSxXQUFNLEdBQVksS0FBSyxDQUFDO1FBRWpDOztXQUVHO1FBQ00sYUFBUSxHQUE2QixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBRTdEOztXQUVHO1FBQ00sWUFBTyxHQUErQixJQUFJLENBQUM7UUFFcEQ7O1dBRUc7UUFDTyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBRWhFOztXQUVHO1FBQ08sV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFJNUM7O1dBRUc7UUFDSCxtQkFBYyxHQUFtQixFQUFFLENBQUM7UUFFcEM7O1dBRUc7UUFDSCxrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUV4QixpQkFBWSxHQUFHLEtBQUssQ0FBQztLQTRNdEI7SUExTUMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFD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S0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU07Z0JBRW1CLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYTtnQkFzTHhCLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgVmlld0NoaWxkLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29sdW1uQWN0aW9uLCBDb2x1bW5BY3Rpb25Db250ZXh0LCBDb2x1bW5BY3Rpb25FdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb2x1bW4tYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXR5cGVzJztcbmltcG9ydCB7IENlbGxEYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jZWxsLXR5cGVzJztcbmltcG9ydCB7IFN0Q29sdW1uRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vc3QtY29sdW1uLWZpbHRlci9zdC1jb2x1bW4tZmlsdGVyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LWNvbHVtbi1tZW51LWRyb3Bkb3duJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0LWNvbHVtbi1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3QtY29sdW1uLW1lbnUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU3RDb2x1bW5NZW51RHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZHJvcGRvd24gaXMgb3BlblxuICAgKi9cbiAgQElucHV0KCkgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogUG9zaXRpb24gb2YgdGhlIGRyb3Bkb3duICh4LCB5IGNvb3JkaW5hdGVzKVxuICAgKi9cbiAgQElucHV0KCkgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9IHsgeDogMCwgeTogMCB9O1xuICBcbiAgLyoqXG4gICAqIENvbnRleHQgY29udGFpbmluZyBjb2x1bW4gZGF0YSwgaW5kZXgsIGFuZCBhY3Rpb25zXG4gICAqL1xuICBASW5wdXQoKSBjb250ZXh0OiBDb2x1bW5BY3Rpb25Db250ZXh0IHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGFjdGlvbiBpcyBjbGlja2VkXG4gICAqL1xuICBAT3V0cHV0KCkgYWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uQWN0aW9uRXZlbnQ+KCk7XG4gIFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBkcm9wZG93biBzaG91bGQgY2xvc2VcbiAgICovXG4gIEBPdXRwdXQoKSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIFxuICBAVmlld0NoaWxkKCdmaWx0ZXJQb3B1cCcpIGZpbHRlclBvcHVwPzogU3RDb2x1bW5GaWx0ZXJDb21wb25lbnQ7XG4gIFxuICAvKipcbiAgICogVmlzaWJsZSBhY3Rpb25zIChmaWx0ZXJlZCBieSBoaWRkZW4gcHJvcGVydHkpXG4gICAqL1xuICB2aXNpYmxlQWN0aW9uczogQ29sdW1uQWN0aW9uW10gPSBbXTtcbiAgXG4gIC8qKlxuICAgKiBEcm9wZG93biBwb3NpdGlvbmluZyBzdHlsZVxuICAgKi9cbiAgZHJvcGRvd25TdHlsZTogYW55ID0ge307XG4gIFxuICBpc0ZpbHRlck9wZW4gPSBmYWxzZTtcbiAgXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29udGV4dCddIHx8IGNoYW5nZXNbJ2lzT3BlbiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVBY3Rpb25zKCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChjaGFuZ2VzWydwb3NpdGlvbiddIHx8IGNoYW5nZXNbJ2lzT3BlbiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgdmlzaWJsZSBhY3Rpb25zIGJhc2VkIG9uIGhpZGRlbiBwcm9wZXJ0eVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlQWN0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dCkge1xuICAgICAgdGhpcy52aXNpYmxlQWN0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnZpc2libGVBY3Rpb25zID0gdGhpcy5jb250ZXh0LmFjdGlvbnMuZmlsdGVyKGFjdGlvbiA9PiB7XG4gICAgICBpZiAodHlwZW9mIGFjdGlvbi5oaWRkZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICFhY3Rpb24uaGlkZGVuKHRoaXMuY29udGV4dCEuY29sdW1uLCB0aGlzLmNvbnRleHQhLmNvbHVtbkluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhYWN0aW9uLmhpZGRlbjtcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFjdGlvbiBpcyBjdXJyZW50bHkgYWN0aXZlIChmb3IgY2hlY2ttYXJrcylcbiAgICovXG4gIGlzQWN0aW9uQWN0aXZlKGFjdGlvbjogQ29sdW1uQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbnRleHQuY29sdW1uO1xuICAgIFxuICAgIC8vIFNvcnQgYWN0aW9uc1xuICAgIGlmIChhY3Rpb24uaWQgPT09ICdzb3J0LWFzYycpIHtcbiAgICAgIHJldHVybiBjb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gU29ydERpcmVjdGlvbi5BU0M7XG4gICAgfVxuICAgIGlmIChhY3Rpb24uaWQgPT09ICdzb3J0LWRlc2MnKSB7XG4gICAgICByZXR1cm4gY29sdW1uLnNvcnREaXJlY3Rpb24gPT09IFNvcnREaXJlY3Rpb24uREVTQztcbiAgICB9XG4gICAgXG4gICAgLy8gRmlsdGVyIGFjdGlvblxuICAgIGlmIChhY3Rpb24uaWQgPT09ICdmaWx0ZXInKSB7XG4gICAgICByZXR1cm4gY29sdW1uLmZpbHRlckNvbmZpZz8uZW5hYmxlZCA9PT0gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gUGluIGFjdGlvbnNcbiAgICBpZiAoYWN0aW9uLmlkID09PSAncGluLWxlZnQnKSB7XG4gICAgICByZXR1cm4gY29sdW1uLnN0aWNreSA9PT0gJ2xlZnQnO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uLmlkID09PSAncGluLXJpZ2h0Jykge1xuICAgICAgcmV0dXJuIGNvbHVtbi5zdGlja3kgPT09ICdyaWdodCc7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgZGl2aWRlciBzaG91bGQgYmUgc2hvd24gYWZ0ZXIgYW4gYWN0aW9uXG4gICAqIEdyb3VwcyBidWlsdC1pbiBhY3Rpb25zOiBbc29ydCBncm91cF0gfCBbZmlsdGVyXSB8IFtwaW4gZ3JvdXBdIHwgW21vdmUgZ3JvdXBdIHwgW2N1c3RvbV1cbiAgICovXG4gIHNob3VsZFNob3dEaXZpZGVyQWZ0ZXIoYWN0aW9uOiBDb2x1bW5BY3Rpb24sIGluZGV4OiBudW1iZXIsIGlzTGFzdDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmIChpc0xhc3QgfHwgIXRoaXMudmlzaWJsZUFjdGlvbnNbaW5kZXggKyAxXSkgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIGNvbnN0IGN1cnJlbnRJZCA9IGFjdGlvbi5pZDtcbiAgICBjb25zdCBuZXh0SWQgPSB0aGlzLnZpc2libGVBY3Rpb25zW2luZGV4ICsgMV0uaWQ7XG4gICAgXG4gICAgLy8gRGl2aWRlciBhZnRlciBzb3J0IGdyb3VwXG4gICAgaWYgKFsnc29ydC1hc2MnLCAnc29ydC1kZXNjJywgJ2NsZWFyLXNvcnQnXS5pbmNsdWRlcyhjdXJyZW50SWQpICYmIFxuICAgICAgICAhWydzb3J0LWFzYycsICdzb3J0LWRlc2MnLCAnY2xlYXItc29ydCddLmluY2x1ZGVzKG5leHRJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBEaXZpZGVyIGFmdGVyIGZpbHRlclxuICAgIGlmIChjdXJyZW50SWQgPT09ICdmaWx0ZXInKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRGl2aWRlciBhZnRlciBwaW4gZ3JvdXBcbiAgICBpZiAoWydwaW4tbGVmdCcsICdwaW4tcmlnaHQnLCAndW5waW4nXS5pbmNsdWRlcyhjdXJyZW50SWQpICYmIFxuICAgICAgICAhWydwaW4tbGVmdCcsICdwaW4tcmlnaHQnLCAndW5waW4nXS5pbmNsdWRlcyhuZXh0SWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRGl2aWRlciBhZnRlciBtb3ZlIGdyb3VwIChiZWZvcmUgY3VzdG9tIGFjdGlvbnMpXG4gICAgaWYgKFsnbW92ZS1sZWZ0JywgJ21vdmUtcmlnaHQnXS5pbmNsdWRlcyhjdXJyZW50SWQpICYmIFxuICAgICAgICAhWydtb3ZlLWxlZnQnLCAnbW92ZS1yaWdodCddLmluY2x1ZGVzKG5leHRJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgZHJvcGRvd24gcG9zaXRpb24gYmFzZWQgb24gYXZhaWxhYmxlIHZpZXdwb3J0IHNwYWNlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5kcm9wZG93blN0eWxlID0ge307XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCBkcm9wZG93bldpZHRoID0gMjgwOyAvLyBBcHByb3hpbWF0ZSBkcm9wZG93biB3aWR0aFxuICAgIGNvbnN0IGRyb3Bkb3duSGVpZ2h0ID0gMzAwOyAvLyBBcHByb3hpbWF0ZSBtYXggZHJvcGRvd24gaGVpZ2h0XG4gICAgXG4gICAgbGV0IHsgeCwgeSB9ID0gdGhpcy5wb3NpdGlvbjtcbiAgICBcbiAgICAvLyBBZGp1c3QgaG9yaXpvbnRhbCBwb3NpdGlvbiBpZiBkcm9wZG93biB3b3VsZCBvdmVyZmxvd1xuICAgIGlmICh4ICsgZHJvcGRvd25XaWR0aCA+IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgIHggPSBNYXRoLm1heCgxMCwgdmlld3BvcnRXaWR0aCAtIGRyb3Bkb3duV2lkdGggLSAxMCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkanVzdCB2ZXJ0aWNhbCBwb3NpdGlvbiBpZiBkcm9wZG93biB3b3VsZCBvdmVyZmxvd1xuICAgIGlmICh5ICsgZHJvcGRvd25IZWlnaHQgPiB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgeSA9IE1hdGgubWF4KDEwLCB2aWV3cG9ydEhlaWdodCAtIGRyb3Bkb3duSGVpZ2h0IC0gMTApO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmRyb3Bkb3duU3R5bGUgPSB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIGxlZnQ6IGAke3h9cHhgLFxuICAgICAgdG9wOiBgJHt5fXB4YCxcbiAgICAgICd6LWluZGV4JzogOTk5OVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhY3Rpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGlzQWN0aW9uRGlzYWJsZWQoYWN0aW9uOiBDb2x1bW5BY3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dCkgcmV0dXJuIHRydWU7XG4gICAgXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24uZGlzYWJsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBhY3Rpb24uZGlzYWJsZWQodGhpcy5jb250ZXh0LmNvbHVtbiwgdGhpcy5jb250ZXh0LmNvbHVtbkluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjdGlvbi5kaXNhYmxlZCB8fCBmYWxzZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBhY3Rpb24gY2xpY2tcbiAgICovXG4gIG9uQWN0aW9uQ2xpY2soYWN0aW9uOiBDb2x1bW5BY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dCB8fCB0aGlzLmlzQWN0aW9uRGlzYWJsZWQoYWN0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBmaWx0ZXIgYWN0aW9uIC0gb3BlbiBmaWx0ZXIgcG9wdXBcbiAgICBpZiAoYWN0aW9uLmlkID09PSAnZmlsdGVyJykge1xuICAgICAgdGhpcy5pc0ZpbHRlck9wZW4gPSB0cnVlO1xuICAgICAgcmV0dXJuOyAvLyBEb24ndCBlbWl0IG9yIGNsb3NlIG1lbnVcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZXZlbnQ6IENvbHVtbkFjdGlvbkV2ZW50ID0ge1xuICAgICAgYWN0aW9uLFxuICAgICAgY29sdW1uOiB0aGlzLmNvbnRleHQuY29sdW1uLFxuICAgICAgY29sdW1uSW5kZXg6IHRoaXMuY29udGV4dC5jb2x1bW5JbmRleFxuICAgIH07XG4gICAgXG4gICAgdGhpcy5hY3Rpb25DbGlja2VkLmVtaXQoZXZlbnQpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xvc2UgZHJvcGRvd24gd2hlbiBjbGlja2luZyBiYWNrZHJvcFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBvbkJhY2tkcm9wQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLWJhY2tkcm9wJykpIHtcbiAgICAgIC8vIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBvbkZpbHRlckNsb3NlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRmlsdGVyT3BlbiA9IGZhbHNlO1xuICAgIC8vIENsb3NlIHRoZSBlbnRpcmUgY29sdW1uIG1lbnUgd2hlbiBmaWx0ZXIgaXMgY2xvc2VkXG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICB9XG5cbiAgb25GaWx0ZXJBcHBsaWVkKGV2ZW50OiB7IG9wZXJhdG9yOiBhbnk7IHZhbHVlOiBhbnkgfSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdGaWx0ZXIgYXBwbGllZDonLCBldmVudCk7XG4gICAgdGhpcy5pc0ZpbHRlck9wZW4gPSBmYWxzZTtcbiAgICAvLyBDbG9zZSB0aGUgZW50aXJlIGNvbHVtbiBtZW51IHdoZW4gZmlsdGVyIGlzIGFwcGxpZWRcbiAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gIH1cblxuICBvbkZpbHRlckNsZWFyZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ0ZpbHRlciBjbGVhcmVkJyk7XG4gICAgdGhpcy5pc0ZpbHRlck9wZW4gPSBmYWxzZTtcbiAgICAvLyBDbG9zZSB0aGUgZW50aXJlIGNvbHVtbiBtZW51IHdoZW4gZmlsdGVyIGlzIGNsZWFyZWRcbiAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIG1lbnUgc2hvdWxkIGFsaWduIHRvIHRoZSBsZWZ0IChmb3IgZmlyc3QgZmV3IGNvbHVtbnMpXG4gICAqL1xuICBzaG91bGRBbGlnbkxlZnQoKTogYm9vbGVhbiB7XG4gICAgLy8gQWxpZ24gbGVmdCBmb3IgZmlyc3QgMiBjb2x1bW5zIHRvIHByZXZlbnQgY2xpcHBpbmdcbiAgICByZXR1cm4gKHRoaXMuY29udGV4dD8uY29sdW1uSW5kZXggfHwgMCkgPD0gMTtcbiAgfVxufSIsIjwhLS0gRHJvcGRvd24gY29udGFpbmVyIHdpdGggYmFja2Ryb3AgLS0+XG48ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyXCIgKm5nSWY9XCJpc09wZW4gJiYgY29udGV4dFwiPlxuICA8IS0tIEJhY2tkcm9wIC0tPlxuICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tYmFja2Ryb3BcIiAoY2xpY2spPVwiY2xvc2VkLmVtaXQoKVwiPjwvZGl2PlxuICBcbiAgPCEtLSBEcm9wZG93biBtZW51IC0tPlxuICA8ZGl2IGNsYXNzPVwiY29sdW1uLW1lbnUtZHJvcGRvd25cIiBbbmdTdHlsZV09XCJkcm9wZG93blN0eWxlXCI+XG4gICAgPCEtLSBNYWluIG1lbnUgd2l0aCBhY3Rpb25zIC0tPlxuICAgIDxuaWxlLW1lbnUgKm5nSWY9XCIhaXNGaWx0ZXJPcGVuXCI+XG4gICAgICA8IS0tIER5bmFtaWNhbGx5IHJlbmRlciBhbGwgdmlzaWJsZSBhY3Rpb25zIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHZpc2libGVBY3Rpb25zOyBsZXQgaSA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICAgICAgPG5pbGUtbWVudS1pdGVtIFxuICAgICAgICAgIChjbGljayk9XCJvbkFjdGlvbkNsaWNrKGFjdGlvbilcIlxuICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0FjdGlvbkRpc2FibGVkKGFjdGlvbilcIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNBY3Rpb25BY3RpdmUoYWN0aW9uKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hlY2ttYXJrXCIgKm5nSWY9XCJpc0FjdGlvbkFjdGl2ZShhY3Rpb24pXCI+4pyTPC9zcGFuPlxuICAgICAgICAgIDxuaWxlLWljb24gc2xvdD1cInByZWZpeFwiICpuZ0lmPVwiYWN0aW9uLmljb24gJiYgIWlzQWN0aW9uQWN0aXZlKGFjdGlvbilcIiBbbmFtZV09XCJhY3Rpb24uaWNvblwiPjwvbmlsZS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWN0aW9uLWxhYmVsXCI+e3sgYWN0aW9uLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L25pbGUtbWVudS1pdGVtPlxuICAgICAgICBcbiAgICAgICAgPCEtLSBBZGQgZGl2aWRlciBhZnRlciBhY3Rpb24gZ3JvdXBzIC0tPlxuICAgICAgICA8bmlsZS1kaXZpZGVyICpuZ0lmPVwic2hvdWxkU2hvd0RpdmlkZXJBZnRlcihhY3Rpb24sIGksIGxhc3QpXCI+PC9uaWxlLWRpdmlkZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIFxuICAgICAgPCEtLSBGYWxsYmFjayBpZiBubyBhY3Rpb25zIC0tPlxuICAgICAgPG5pbGUtbWVudS1pdGVtICpuZ0lmPVwidmlzaWJsZUFjdGlvbnMubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIE5vIGFjdGlvbnMgYXZhaWxhYmxlXG4gICAgICA8L25pbGUtbWVudS1pdGVtPlxuICAgIDwvbmlsZS1tZW51PlxuICAgIFxuICAgIDwhLS0gRmlsdGVyIHBvcHVwIChjb25kaXRpb25hbGx5IHJlbmRlcmVkKSAtLT5cbiAgICA8c3QtY29sdW1uLWZpbHRlclxuICAgICAgI2ZpbHRlclBvcHVwXG4gICAgICAqbmdJZj1cImlzRmlsdGVyT3BlbiAmJiBjb250ZXh0XCJcbiAgICAgIFtjb2x1bW5dPVwiY29udGV4dC5jb2x1bW5cIlxuICAgICAgW3RhYmxlU3RhdGVdPVwiY29udGV4dC50YWJsZVN0YXRlXCJcbiAgICAgIFtjb2x1bW5JbmRleF09XCJjb250ZXh0LmNvbHVtbkluZGV4XCJcbiAgICAgIFtpc0ZpcnN0Q29sdW1uXT1cImNvbnRleHQuaXNGaXJzdENvbHVtblwiXG4gICAgICBbaXNMYXN0Q29sdW1uXT1cImNvbnRleHQuaXNMYXN0Q29sdW1uXCJcbiAgICAgIFtpc09wZW5dPVwiaXNGaWx0ZXJPcGVuXCJcbiAgICAgIChmaWx0ZXJBcHBsaWVkKT1cIm9uRmlsdGVyQXBwbGllZCgkZXZlbnQpXCJcbiAgICAgIChmaWx0ZXJDbGVhcmVkKT1cIm9uRmlsdGVyQ2xlYXJlZCgpXCJcbiAgICAgIChjbG9zZWQpPVwib25GaWx0ZXJDbG9zZWQoKVwiPlxuICAgIDwvc3QtY29sdW1uLWZpbHRlcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,97 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../directives/click-outside.directive";
4
+ import * as i2 from "@angular/common";
5
+ export class StColumnVisibilityComponent {
6
+ constructor() {
7
+ this.isOpen = false;
8
+ this.columnsVisibility = [];
9
+ }
10
+ ngOnInit() {
11
+ if (!this.tableState) {
12
+ console.warn('tableState is required for st-column-visibility component');
13
+ return;
14
+ }
15
+ // Initialize with current state
16
+ this.updateColumnsVisibility();
17
+ // Subscribe to state changes to update visibility list
18
+ this.subscribeToStateChanges();
19
+ }
20
+ ngOnChanges(changes) {
21
+ // Handle tableState changes (when columns are added/removed)
22
+ if (changes['tableState'] && !changes['tableState'].firstChange) {
23
+ // Unsubscribe from old state
24
+ this.stateSubscription?.unsubscribe();
25
+ // Update columns visibility with new state
26
+ if (this.tableState) {
27
+ this.updateColumnsVisibility();
28
+ // Re-subscribe to new state changes
29
+ this.subscribeToStateChanges();
30
+ }
31
+ }
32
+ }
33
+ /**
34
+ * Update columns visibility list from current table state
35
+ */
36
+ updateColumnsVisibility() {
37
+ if (this.tableState) {
38
+ this.columnsVisibility = this.tableState.getAllColumnsVisibility();
39
+ }
40
+ }
41
+ /**
42
+ * Subscribe to table state changes
43
+ */
44
+ subscribeToStateChanges() {
45
+ if (!this.tableState)
46
+ return;
47
+ this.stateSubscription = this.tableState.stateChange$
48
+ .subscribe(event => {
49
+ if (event.type === 'column-visibility' || event.type === 'column-config') {
50
+ this.updateColumnsVisibility();
51
+ }
52
+ });
53
+ }
54
+ ngOnDestroy() {
55
+ this.stateSubscription?.unsubscribe();
56
+ }
57
+ toggleMenu(event) {
58
+ event.stopPropagation();
59
+ this.isOpen = !this.isOpen;
60
+ }
61
+ closeMenu() {
62
+ this.isOpen = false;
63
+ }
64
+ getColumnsVisibility() {
65
+ return this.columnsVisibility;
66
+ }
67
+ isColumnHideable(column) {
68
+ return column.hideable !== false; // Default to true if not set
69
+ }
70
+ onToggleColumn(columnKey, event) {
71
+ event.stopPropagation();
72
+ // Check if column is hideable before toggling (defensive check)
73
+ const column = this.columnsVisibility.find(col => col.key === columnKey);
74
+ if (column && !this.isColumnHideable(column)) {
75
+ return;
76
+ }
77
+ if (this.tableState) {
78
+ this.tableState.toggleColumnVisibility(columnKey);
79
+ }
80
+ }
81
+ isColumnVisible(columnKey) {
82
+ if (!this.tableState) {
83
+ return true;
84
+ }
85
+ const column = this.tableState.getColumns().find(col => col.key === columnKey);
86
+ return column ? (column.visible !== false) : true;
87
+ }
88
+ }
89
+ StColumnVisibilityComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnVisibilityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
90
+ StColumnVisibilityComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StColumnVisibilityComponent, selector: "st-column-visibility", inputs: { tableState: "tableState" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"st-column-visibility\" (clickOutside)=\"closeMenu()\">\n <button class=\"visibility-trigger\" \n (click)=\"toggleMenu($event)\" \n title=\"Show/Hide Columns\"\n type=\"button\"\n [class.active]=\"isOpen\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 2H14V14H2V2Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 2V14M8 2V14M11 2V14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n \n <div class=\"visibility-dropdown\" *ngIf=\"isOpen\">\n <div class=\"dropdown-header\">Show/Hide Columns</div>\n <div class=\"dropdown-content\">\n <label *ngFor=\"let column of getColumnsVisibility()\" \n class=\"column-item\"\n [class.checked]=\"column.visible\"\n [class.disabled]=\"column.hideable === false\">\n <input type=\"checkbox\" \n [checked]=\"column.visible\"\n [disabled]=\"column.hideable === false\"\n [title]=\"column.hideable === false ? 'This column cannot be hidden' : ''\"\n (change)=\"onToggleColumn(column.key, $event)\">\n <span class=\"column-label\">{{ column.header }}</span>\n </label>\n </div>\n </div>\n</div>\n\n", styles: [".st-column-visibility{position:absolute;top:8px;right:8px;z-index:1000;display:inline-block}.st-column-visibility .visibility-trigger{background:white;border:1px solid #e2e8f0;border-radius:4px;cursor:pointer;padding:6px 8px;color:#718096;line-height:1;transition:all .2s;box-shadow:0 1px 2px #0000000d}.st-column-visibility .visibility-trigger:hover{background-color:#f7fafc;border-color:#cbd5e0;color:#2d3748}.st-column-visibility .visibility-trigger.active{background-color:#ebf8ff;border-color:#2b6cb0;color:#2b6cb0}.st-column-visibility .visibility-trigger svg{display:block;width:16px;height:16px}.st-column-visibility .visibility-dropdown{position:absolute;top:100%;right:0;background:white;border:1px solid #e2e8f0;border-radius:6px;box-shadow:0 4px 6px #0000001a,0 2px 4px #0000000f;z-index:1001;min-width:200px;margin-top:4px;overflow:hidden}.st-column-visibility .visibility-dropdown .dropdown-header{padding:10px 14px;font-weight:600;font-size:13px;color:#2d3748;border-bottom:1px solid #e2e8f0;background-color:#f7fafc}.st-column-visibility .visibility-dropdown .dropdown-content{max-height:10rem;overflow-y:auto;overflow-x:hidden}.st-column-visibility .visibility-dropdown .dropdown-content .column-item{display:flex;align-items:center;padding:10px 14px;cursor:pointer;transition:background-color .2s;-webkit-user-select:none;user-select:none}.st-column-visibility .visibility-dropdown .dropdown-content .column-item:hover{background-color:#f7fafc}.st-column-visibility .visibility-dropdown .dropdown-content .column-item.checked{background-color:#ebf8ff}.st-column-visibility .visibility-dropdown .dropdown-content .column-item.disabled{opacity:.6;cursor:not-allowed}.st-column-visibility .visibility-dropdown .dropdown-content .column-item.disabled:hover{background-color:transparent;cursor:not-allowed}.st-column-visibility .visibility-dropdown .dropdown-content .column-item input[type=checkbox]{margin-right:10px;cursor:pointer;width:16px;height:16px;flex-shrink:0}.st-column-visibility .visibility-dropdown .dropdown-content .column-item input[type=checkbox]:disabled{cursor:not-allowed;opacity:.5}.st-column-visibility .visibility-dropdown .dropdown-content .column-item .column-label{font-size:14px;color:#2d3748;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], directives: [{ type: i1.ClickOutsideDirective, selector: "[clickOutside]", outputs: ["clickOutside"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnVisibilityComponent, decorators: [{
92
+ type: Component,
93
+ args: [{ selector: 'st-column-visibility', template: "<div class=\"st-column-visibility\" (clickOutside)=\"closeMenu()\">\n <button class=\"visibility-trigger\" \n (click)=\"toggleMenu($event)\" \n title=\"Show/Hide Columns\"\n type=\"button\"\n [class.active]=\"isOpen\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 2H14V14H2V2Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 2V14M8 2V14M11 2V14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n \n <div class=\"visibility-dropdown\" *ngIf=\"isOpen\">\n <div class=\"dropdown-header\">Show/Hide Columns</div>\n <div class=\"dropdown-content\">\n <label *ngFor=\"let column of getColumnsVisibility()\" \n class=\"column-item\"\n [class.checked]=\"column.visible\"\n [class.disabled]=\"column.hideable === false\">\n <input type=\"checkbox\" \n [checked]=\"column.visible\"\n [disabled]=\"column.hideable === false\"\n [title]=\"column.hideable === false ? 'This column cannot be hidden' : ''\"\n (change)=\"onToggleColumn(column.key, $event)\">\n <span class=\"column-label\">{{ column.header }}</span>\n </label>\n </div>\n </div>\n</div>\n\n", styles: [".st-column-visibility{position:absolute;top:8px;right:8px;z-index:1000;display:inline-block}.st-column-visibility .visibility-trigger{background:white;border:1px solid #e2e8f0;border-radius:4px;cursor:pointer;padding:6px 8px;color:#718096;line-height:1;transition:all .2s;box-shadow:0 1px 2px #0000000d}.st-column-visibility .visibility-trigger:hover{background-color:#f7fafc;border-color:#cbd5e0;color:#2d3748}.st-column-visibility .visibility-trigger.active{background-color:#ebf8ff;border-color:#2b6cb0;color:#2b6cb0}.st-column-visibility .visibility-trigger svg{display:block;width:16px;height:16px}.st-column-visibility .visibility-dropdown{position:absolute;top:100%;right:0;background:white;border:1px solid #e2e8f0;border-radius:6px;box-shadow:0 4px 6px #0000001a,0 2px 4px #0000000f;z-index:1001;min-width:200px;margin-top:4px;overflow:hidden}.st-column-visibility .visibility-dropdown .dropdown-header{padding:10px 14px;font-weight:600;font-size:13px;color:#2d3748;border-bottom:1px solid #e2e8f0;background-color:#f7fafc}.st-column-visibility .visibility-dropdown .dropdown-content{max-height:10rem;overflow-y:auto;overflow-x:hidden}.st-column-visibility .visibility-dropdown .dropdown-content .column-item{display:flex;align-items:center;padding:10px 14px;cursor:pointer;transition:background-color .2s;-webkit-user-select:none;user-select:none}.st-column-visibility .visibility-dropdown .dropdown-content .column-item:hover{background-color:#f7fafc}.st-column-visibility .visibility-dropdown .dropdown-content .column-item.checked{background-color:#ebf8ff}.st-column-visibility .visibility-dropdown .dropdown-content .column-item.disabled{opacity:.6;cursor:not-allowed}.st-column-visibility .visibility-dropdown .dropdown-content .column-item.disabled:hover{background-color:transparent;cursor:not-allowed}.st-column-visibility .visibility-dropdown .dropdown-content .column-item input[type=checkbox]{margin-right:10px;cursor:pointer;width:16px;height:16px;flex-shrink:0}.st-column-visibility .visibility-dropdown .dropdown-content .column-item input[type=checkbox]:disabled{cursor:not-allowed;opacity:.5}.st-column-visibility .visibility-dropdown .dropdown-content .column-item .column-label{font-size:14px;color:#2d3748;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"] }]
94
+ }], ctorParameters: function () { return []; }, propDecorators: { tableState: [{
95
+ type: Input
96
+ }] } });
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtY29sdW1uLXZpc2liaWxpdHkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LWNvbHVtbi12aXNpYmlsaXR5L3N0LWNvbHVtbi12aXNpYmlsaXR5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1jb2x1bW4tdmlzaWJpbGl0eS9zdC1jb2x1bW4tdmlzaWJpbGl0eS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7Ozs7QUFTOUYsTUFBTSxPQUFPLDJCQUEyQjtJQVF0QztRQUxBLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixzQkFBaUIsR0FBMkUsRUFBRSxDQUFDO0lBSWhGLENBQUM7SUFFaEIsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUMxRSxPQUFPO1NBQ1I7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsNkRBQTZEO1FBQzdELElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLFdBQVcsRUFBRTtZQUMvRCw2QkFBNkI7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxDQUFDO1lBRXRDLDJDQUEyQztZQUMzQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUUvQixvQ0FBb0M7Z0JBQ3BDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQ2hDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyx1QkFBdUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUM7U0FDcEU7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUU3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZO2FBQ2xELFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssbUJBQW1CLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxlQUFlLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQ2hDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVk7UUFDckIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzdCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBNEU7UUFDM0YsT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxDQUFDLDZCQUE2QjtJQUNqRSxDQUFDO0lBRUQsY0FBYyxDQUFDLFNBQWlCLEVBQUUsS0FBWTtRQUM1QyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsZ0VBQWdFO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzVDLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxTQUFpQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNwRCxDQUFDOzt3SEF2R1UsMkJBQTJCOzRHQUEzQiwyQkFBMkIsdUhDVHhDLHk0Q0E4QkE7MkZEckJhLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSxzQkFBc0I7MEVBS3ZCLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdC1jb2x1bW4tdmlzaWJpbGl0eScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdC1jb2x1bW4tdmlzaWJpbGl0eS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0LWNvbHVtbi12aXNpYmlsaXR5LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3RDb2x1bW5WaXNpYmlsaXR5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHRhYmxlU3RhdGUhOiBUYWJsZVN0YXRlO1xuICBcbiAgaXNPcGVuID0gZmFsc2U7XG4gIGNvbHVtbnNWaXNpYmlsaXR5OiB7IGtleTogc3RyaW5nOyBoZWFkZXI6IHN0cmluZzsgdmlzaWJsZTogYm9vbGVhbjsgaGlkZWFibGU6IGJvb2xlYW4gfVtdID0gW107XG4gIFxuICBwcml2YXRlIHN0YXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBcbiAgY29uc3RydWN0b3IoKSB7fVxuICBcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRhYmxlU3RhdGUpIHtcbiAgICAgIGNvbnNvbGUud2FybigndGFibGVTdGF0ZSBpcyByZXF1aXJlZCBmb3Igc3QtY29sdW1uLXZpc2liaWxpdHkgY29tcG9uZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIEluaXRpYWxpemUgd2l0aCBjdXJyZW50IHN0YXRlXG4gICAgdGhpcy51cGRhdGVDb2x1bW5zVmlzaWJpbGl0eSgpO1xuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byBzdGF0ZSBjaGFuZ2VzIHRvIHVwZGF0ZSB2aXNpYmlsaXR5IGxpc3RcbiAgICB0aGlzLnN1YnNjcmliZVRvU3RhdGVDaGFuZ2VzKCk7XG4gIH1cbiAgXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBIYW5kbGUgdGFibGVTdGF0ZSBjaGFuZ2VzICh3aGVuIGNvbHVtbnMgYXJlIGFkZGVkL3JlbW92ZWQpXG4gICAgaWYgKGNoYW5nZXNbJ3RhYmxlU3RhdGUnXSAmJiAhY2hhbmdlc1sndGFibGVTdGF0ZSddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIG9sZCBzdGF0ZVxuICAgICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGNvbHVtbnMgdmlzaWJpbGl0eSB3aXRoIG5ldyBzdGF0ZVxuICAgICAgaWYgKHRoaXMudGFibGVTdGF0ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnNWaXNpYmlsaXR5KCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1zdWJzY3JpYmUgdG8gbmV3IHN0YXRlIGNoYW5nZXNcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1N0YXRlQ2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFVwZGF0ZSBjb2x1bW5zIHZpc2liaWxpdHkgbGlzdCBmcm9tIGN1cnJlbnQgdGFibGUgc3RhdGVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uc1Zpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGFibGVTdGF0ZSkge1xuICAgICAgdGhpcy5jb2x1bW5zVmlzaWJpbGl0eSA9IHRoaXMudGFibGVTdGF0ZS5nZXRBbGxDb2x1bW5zVmlzaWJpbGl0eSgpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0YWJsZSBzdGF0ZSBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmliZVRvU3RhdGVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJsZVN0YXRlKSByZXR1cm47XG4gICAgXG4gICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMudGFibGVTdGF0ZS5zdGF0ZUNoYW5nZSRcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NvbHVtbi12aXNpYmlsaXR5JyB8fCBldmVudC50eXBlID09PSAnY29sdW1uLWNvbmZpZycpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnNWaXNpYmlsaXR5KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG4gIFxuICB0b2dnbGVNZW51KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuICB9XG4gIFxuICBjbG9zZU1lbnUoKTogdm9pZCB7IFxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7IFxuICB9XG5cbiAgZ2V0Q29sdW1uc1Zpc2liaWxpdHkoKTogeyBrZXk6IHN0cmluZzsgaGVhZGVyOiBzdHJpbmc7IHZpc2libGU6IGJvb2xlYW47IGhpZGVhYmxlOiBib29sZWFuIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uc1Zpc2liaWxpdHk7XG4gIH1cblxuICBpc0NvbHVtbkhpZGVhYmxlKGNvbHVtbjogeyBrZXk6IHN0cmluZzsgaGVhZGVyOiBzdHJpbmc7IHZpc2libGU6IGJvb2xlYW47IGhpZGVhYmxlOiBib29sZWFuIH0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sdW1uLmhpZGVhYmxlICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0byB0cnVlIGlmIG5vdCBzZXRcbiAgfVxuXG4gIG9uVG9nZ2xlQ29sdW1uKGNvbHVtbktleTogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiBjb2x1bW4gaXMgaGlkZWFibGUgYmVmb3JlIHRvZ2dsaW5nIChkZWZlbnNpdmUgY2hlY2spXG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zVmlzaWJpbGl0eS5maW5kKGNvbCA9PiBjb2wua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGlmIChjb2x1bW4gJiYgIXRoaXMuaXNDb2x1bW5IaWRlYWJsZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLnRhYmxlU3RhdGUpIHtcbiAgICAgIHRoaXMudGFibGVTdGF0ZS50b2dnbGVDb2x1bW5WaXNpYmlsaXR5KGNvbHVtbktleSk7XG4gICAgfVxuICB9XG5cbiAgaXNDb2x1bW5WaXNpYmxlKGNvbHVtbktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnRhYmxlU3RhdGUuZ2V0Q29sdW1ucygpLmZpbmQoY29sID0+IGNvbC5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgcmV0dXJuIGNvbHVtbiA/IChjb2x1bW4udmlzaWJsZSAhPT0gZmFsc2UpIDogdHJ1ZTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwic3QtY29sdW1uLXZpc2liaWxpdHlcIiAoY2xpY2tPdXRzaWRlKT1cImNsb3NlTWVudSgpXCI+XG4gIDxidXR0b24gY2xhc3M9XCJ2aXNpYmlsaXR5LXRyaWdnZXJcIiBcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgkZXZlbnQpXCIgXG4gICAgICAgICAgdGl0bGU9XCJTaG93L0hpZGUgQ29sdW1uc1wiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc09wZW5cIj5cbiAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMiAySDE0VjE0SDJWMlpcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8cGF0aCBkPVwiTTUgMlYxNE04IDJWMTRNMTEgMlYxNFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgPC9zdmc+XG4gIDwvYnV0dG9uPlxuICBcbiAgPGRpdiBjbGFzcz1cInZpc2liaWxpdHktZHJvcGRvd25cIiAqbmdJZj1cImlzT3BlblwiPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIj5TaG93L0hpZGUgQ29sdW1uczwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICA8bGFiZWwgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBnZXRDb2x1bW5zVmlzaWJpbGl0eSgpXCIgXG4gICAgICAgICAgICAgY2xhc3M9XCJjb2x1bW4taXRlbVwiXG4gICAgICAgICAgICAgW2NsYXNzLmNoZWNrZWRdPVwiY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJjb2x1bW4uaGlkZWFibGUgPT09IGZhbHNlXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBcbiAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImNvbHVtbi52aXNpYmxlXCJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uaGlkZWFibGUgPT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgIFt0aXRsZV09XCJjb2x1bW4uaGlkZWFibGUgPT09IGZhbHNlID8gJ1RoaXMgY29sdW1uIGNhbm5vdCBiZSBoaWRkZW4nIDogJydcIlxuICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRvZ2dsZUNvbHVtbihjb2x1bW4ua2V5LCAkZXZlbnQpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uLWxhYmVsXCI+e3sgY29sdW1uLmhlYWRlciB9fTwvc3Bhbj5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
@@ -0,0 +1,157 @@
1
+ /**
2
+ * st-header Component
3
+ * Encapsulates column-specific logic including sorting and filtering
4
+ */
5
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
6
+ import { SortDirection } from '../../models/table-types';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common";
9
+ export class StHeaderComponent {
10
+ constructor() {
11
+ /**
12
+ * Column index in the visible columns array
13
+ */
14
+ this.columnIndex = 0;
15
+ /**
16
+ * Whether this is the first column
17
+ */
18
+ this.isFirstColumn = false;
19
+ /**
20
+ * Whether this is the last column
21
+ */
22
+ this.isLastColumn = false;
23
+ /**
24
+ * Whether sorting is enabled globally
25
+ */
26
+ this.enableSorting = true;
27
+ /**
28
+ * Whether filtering is enabled globally
29
+ */
30
+ this.enableFiltering = true;
31
+ /**
32
+ * Emits column sort event when sort is toggled
33
+ */
34
+ this.sortToggle = new EventEmitter();
35
+ /**
36
+ * Emits filter changes (future feature)
37
+ */
38
+ this.filterChange = new EventEmitter();
39
+ /**
40
+ * Emits when column is moved left or right
41
+ */
42
+ this.columnMoved = new EventEmitter();
43
+ /**
44
+ * Emits when column menu button is clicked
45
+ */
46
+ this.menuClick = new EventEmitter();
47
+ }
48
+ /**
49
+ * Cleanup on destroy
50
+ */
51
+ ngOnDestroy() {
52
+ // No cleanup needed - resize is now handled by directive
53
+ }
54
+ /**
55
+ * Handle column menu button click
56
+ */
57
+ onMenuClick(event) {
58
+ event.preventDefault();
59
+ event.stopPropagation();
60
+ this.menuClick.emit(event);
61
+ }
62
+ /**
63
+ * Check if column menu should be shown
64
+ */
65
+ isMenuEnabled() {
66
+ return this.column.enableMenu !== false;
67
+ }
68
+ /**
69
+ * Check if column is sortable
70
+ */
71
+ isSortable() {
72
+ return this.column.sortable !== false && this.enableSorting;
73
+ }
74
+ /**
75
+ * Get current sort direction
76
+ */
77
+ getSortDirection() {
78
+ return this.column.sortDirection || SortDirection.NONE;
79
+ }
80
+ /**
81
+ * Check if column is currently sorted
82
+ */
83
+ isSorted() {
84
+ return this.column.sortEnabled || false;
85
+ }
86
+ /**
87
+ * Get ARIA sort attribute for accessibility
88
+ */
89
+ getAriaSort() {
90
+ if (!this.isSortable()) {
91
+ return null;
92
+ }
93
+ const dir = this.getSortDirection();
94
+ if (dir === SortDirection.ASC) {
95
+ return 'ascending';
96
+ }
97
+ if (dir === SortDirection.DESC) {
98
+ return 'descending';
99
+ }
100
+ return 'none';
101
+ }
102
+ /**
103
+ * Handle move left action
104
+ */
105
+ onMoveLeft() {
106
+ const moveEvent = {
107
+ columnKey: this.column.key,
108
+ direction: 'left',
109
+ oldIndex: this.columnIndex,
110
+ newIndex: this.columnIndex - 1,
111
+ column: this.column
112
+ };
113
+ this.columnMoved.emit(moveEvent);
114
+ }
115
+ /**
116
+ * Handle move right action
117
+ */
118
+ onMoveRight() {
119
+ const moveEvent = {
120
+ columnKey: this.column.key,
121
+ direction: 'right',
122
+ oldIndex: this.columnIndex,
123
+ newIndex: this.columnIndex + 1,
124
+ column: this.column
125
+ };
126
+ this.columnMoved.emit(moveEvent);
127
+ }
128
+ }
129
+ StHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
130
+ StHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StHeaderComponent, selector: "st-header", inputs: { column: "column", columnIndex: "columnIndex", isFirstColumn: "isFirstColumn", isLastColumn: "isLastColumn", tableState: "tableState", enableSorting: "enableSorting", enableFiltering: "enableFiltering" }, outputs: { sortToggle: "sortToggle", filterChange: "filterChange", columnMoved: "columnMoved", menuClick: "menuClick" }, ngImport: i0, template: "<div class=\"st-header\" [class.sortable]=\"isSortable()\" [class.sorted]=\"isSorted()\" [attr.aria-sort]=\"getAriaSort()\">\n <div class=\"header-content\">\n <span class=\"header-text\">{{ column.header || column.key }}</span>\n <button *ngIf=\"isMenuEnabled()\" \n class=\"column-menu-trigger\" \n (click)=\"onMenuClick($event)\"\n type=\"button\" \n aria-label=\"Column actions\">\n <nile-icon name=\"options\"></nile-icon>\n </button>\n </div>\n</div>", styles: [".st-header{position:relative;text-align:left;background-color:#fff;padding-left:2px}.st-header.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .2s}.st-header.resizing{-webkit-user-select:none;user-select:none;cursor:col-resize}.st-header.align-center{text-align:center}.st-header.align-center .header-content{justify-content:center}.st-header.align-right{text-align:right}.st-header.align-right .header-content{justify-content:flex-end}.st-header .header-content{display:flex;align-items:center;gap:8px}.st-header .header-text{flex:1;font-size:12px;font-weight:500;letter-spacing:.2px;line-height:14px}.st-header .column-menu-trigger{background:none;border:none;padding:4px;cursor:pointer;border-radius:4px;display:flex;align-items:center;justify-content:center}.st-header .column-menu-trigger nile-icon{font-size:16px;pointer-events:none}.st-header .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:10}.st-header .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-header .resize-handle:hover:after,.st-header .resize-handle:active:after{opacity:1}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StHeaderComponent, decorators: [{
132
+ type: Component,
133
+ args: [{ selector: 'st-header', template: "<div class=\"st-header\" [class.sortable]=\"isSortable()\" [class.sorted]=\"isSorted()\" [attr.aria-sort]=\"getAriaSort()\">\n <div class=\"header-content\">\n <span class=\"header-text\">{{ column.header || column.key }}</span>\n <button *ngIf=\"isMenuEnabled()\" \n class=\"column-menu-trigger\" \n (click)=\"onMenuClick($event)\"\n type=\"button\" \n aria-label=\"Column actions\">\n <nile-icon name=\"options\"></nile-icon>\n </button>\n </div>\n</div>", styles: [".st-header{position:relative;text-align:left;background-color:#fff;padding-left:2px}.st-header.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .2s}.st-header.resizing{-webkit-user-select:none;user-select:none;cursor:col-resize}.st-header.align-center{text-align:center}.st-header.align-center .header-content{justify-content:center}.st-header.align-right{text-align:right}.st-header.align-right .header-content{justify-content:flex-end}.st-header .header-content{display:flex;align-items:center;gap:8px}.st-header .header-text{flex:1;font-size:12px;font-weight:500;letter-spacing:.2px;line-height:14px}.st-header .column-menu-trigger{background:none;border:none;padding:4px;cursor:pointer;border-radius:4px;display:flex;align-items:center;justify-content:center}.st-header .column-menu-trigger nile-icon{font-size:16px;pointer-events:none}.st-header .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:10}.st-header .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-header .resize-handle:hover:after,.st-header .resize-handle:active:after{opacity:1}\n"] }]
134
+ }], propDecorators: { column: [{
135
+ type: Input
136
+ }], columnIndex: [{
137
+ type: Input
138
+ }], isFirstColumn: [{
139
+ type: Input
140
+ }], isLastColumn: [{
141
+ type: Input
142
+ }], tableState: [{
143
+ type: Input
144
+ }], enableSorting: [{
145
+ type: Input
146
+ }], enableFiltering: [{
147
+ type: Input
148
+ }], sortToggle: [{
149
+ type: Output
150
+ }], filterChange: [{
151
+ type: Output
152
+ }], columnMoved: [{
153
+ type: Output
154
+ }], menuClick: [{
155
+ type: Output
156
+ }] } });
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1oZWFkZXIvc3QtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1oZWFkZXIvc3QtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFHbEYsT0FBTyxFQUFFLGFBQWEsRUFBdUQsTUFBTSwwQkFBMEIsQ0FBQzs7O0FBTzlHLE1BQU0sT0FBTyxpQkFBaUI7SUFMOUI7UUFXRTs7V0FFRztRQUNNLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBRWpDOztXQUVHO1FBQ00sa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFFeEM7O1dBRUc7UUFDTSxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQU92Qzs7V0FFRztRQUNNLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBRXZDOztXQUVHO1FBQ00sb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFFekM7O1dBRUc7UUFDTyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFFM0Q7O1dBRUc7UUFDTyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBRS9EOztXQUVHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUU1RDs7V0FFRztRQUNPLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO0tBMkZ0RDtJQXpGQzs7T0FFRztJQUNILFdBQVc7UUFDVCx5REFBeUQ7SUFDM0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLEtBQWlCO1FBQzNCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3BDLElBQUksR0FBRyxLQUFLLGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDN0IsT0FBTyxXQUFXLENBQUM7U0FDcEI7UUFDRCxJQUFJLEdBQUcsS0FBSyxhQUFhLENBQUMsSUFBSSxFQUFFO1lBQzlCLE9BQU8sWUFBWSxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVTtRQUNSLE1BQU0sU0FBUyxHQUFvQjtZQUNqQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQzFCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVztZQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDO1lBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtTQUNwQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULE1BQU0sU0FBUyxHQUFvQjtZQUNqQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQzFCLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVztZQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDO1lBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtTQUNwQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkMsQ0FBQzs7OEdBaEpVLGlCQUFpQjtrR0FBakIsaUJBQWlCLGdZQ2Y5QixzZ0JBV007MkZESU8saUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLFdBQVc7OEJBUVosTUFBTTtzQkFBZCxLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSztnQkFLRyxlQUFlO3NCQUF2QixLQUFLO2dCQUtJLFVBQVU7c0JBQW5CLE1BQU07Z0JBS0csWUFBWTtzQkFBckIsTUFBTTtnQkFLRyxXQUFXO3NCQUFwQixNQUFNO2dCQUtHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHN0LWhlYWRlciBDb21wb25lbnRcbiAqIEVuY2Fwc3VsYXRlcyBjb2x1bW4tc3BlY2lmaWMgbG9naWMgaW5jbHVkaW5nIHNvcnRpbmcgYW5kIGZpbHRlcmluZ1xuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb2x1bW4tY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IFNvcnREaXJlY3Rpb24sIENvbHVtblNvcnRFdmVudCwgQ29sdW1uRmlsdGVyRXZlbnQsIENvbHVtbk1vdmVFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS10eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdC1oZWFkZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdEhlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBDb2x1bW4gY29uZmlndXJhdGlvbiAtIGNvbnRhaW5zIGFsbCBjb2x1bW4gbWV0YWRhdGEgYW5kIHN0YXRlXG4gICAqL1xuICBASW5wdXQoKSBjb2x1bW4hOiBDb2x1bW5Db25maWc8YW55PjtcblxuICAvKipcbiAgICogQ29sdW1uIGluZGV4IGluIHRoZSB2aXNpYmxlIGNvbHVtbnMgYXJyYXlcbiAgICovXG4gIEBJbnB1dCgpIGNvbHVtbkluZGV4OiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNvbHVtblxuICAgKi9cbiAgQElucHV0KCkgaXNGaXJzdENvbHVtbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgY29sdW1uXG4gICAqL1xuICBASW5wdXQoKSBpc0xhc3RDb2x1bW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgVGFibGVTdGF0ZSByZWZlcmVuY2UgZm9yIGludGVncmF0ZWQgc29ydGluZy9maWx0ZXJpbmdcbiAgICovXG4gIEBJbnB1dCgpIHRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNvcnRpbmcgaXMgZW5hYmxlZCBnbG9iYWxseVxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlU29ydGluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZmlsdGVyaW5nIGlzIGVuYWJsZWQgZ2xvYmFsbHlcbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZUZpbHRlcmluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGNvbHVtbiBzb3J0IGV2ZW50IHdoZW4gc29ydCBpcyB0b2dnbGVkXG4gICAqL1xuICBAT3V0cHV0KCkgc29ydFRvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uU29ydEV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBmaWx0ZXIgY2hhbmdlcyAoZnV0dXJlIGZlYXR1cmUpXG4gICAqL1xuICBAT3V0cHV0KCkgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW5GaWx0ZXJFdmVudD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBjb2x1bW4gaXMgbW92ZWQgbGVmdCBvciByaWdodFxuICAgKi9cbiAgQE91dHB1dCgpIGNvbHVtbk1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW5Nb3ZlRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gY29sdW1uIG1lbnUgYnV0dG9uIGlzIGNsaWNrZWRcbiAgICovXG4gIEBPdXRwdXQoKSBtZW51Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIENsZWFudXAgb24gZGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gTm8gY2xlYW51cCBuZWVkZWQgLSByZXNpemUgaXMgbm93IGhhbmRsZWQgYnkgZGlyZWN0aXZlXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNvbHVtbiBtZW51IGJ1dHRvbiBjbGlja1xuICAgKi9cbiAgb25NZW51Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMubWVudUNsaWNrLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbHVtbiBtZW51IHNob3VsZCBiZSBzaG93blxuICAgKi9cbiAgaXNNZW51RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW4uZW5hYmxlTWVudSAhPT0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY29sdW1uIGlzIHNvcnRhYmxlXG4gICAqL1xuICBpc1NvcnRhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbi5zb3J0YWJsZSAhPT0gZmFsc2UgJiYgdGhpcy5lbmFibGVTb3J0aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHNvcnQgZGlyZWN0aW9uXG4gICAqL1xuICBnZXRTb3J0RGlyZWN0aW9uKCk6IFNvcnREaXJlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbi5zb3J0RGlyZWN0aW9uIHx8IFNvcnREaXJlY3Rpb24uTk9ORTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjb2x1bW4gaXMgY3VycmVudGx5IHNvcnRlZFxuICAgKi9cbiAgaXNTb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uLnNvcnRFbmFibGVkIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBUklBIHNvcnQgYXR0cmlidXRlIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAqL1xuICBnZXRBcmlhU29ydCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaXNTb3J0YWJsZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkaXIgPSB0aGlzLmdldFNvcnREaXJlY3Rpb24oKTtcbiAgICBpZiAoZGlyID09PSBTb3J0RGlyZWN0aW9uLkFTQykge1xuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgIH1cbiAgICBpZiAoZGlyID09PSBTb3J0RGlyZWN0aW9uLkRFU0MpIHtcbiAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgfVxuICAgIHJldHVybiAnbm9uZSc7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG1vdmUgbGVmdCBhY3Rpb25cbiAgICovXG4gIG9uTW92ZUxlZnQoKTogdm9pZCB7XG4gICAgY29uc3QgbW92ZUV2ZW50OiBDb2x1bW5Nb3ZlRXZlbnQgPSB7XG4gICAgICBjb2x1bW5LZXk6IHRoaXMuY29sdW1uLmtleSxcbiAgICAgIGRpcmVjdGlvbjogJ2xlZnQnLFxuICAgICAgb2xkSW5kZXg6IHRoaXMuY29sdW1uSW5kZXgsXG4gICAgICBuZXdJbmRleDogdGhpcy5jb2x1bW5JbmRleCAtIDEsXG4gICAgICBjb2x1bW46IHRoaXMuY29sdW1uXG4gICAgfTtcbiAgICB0aGlzLmNvbHVtbk1vdmVkLmVtaXQobW92ZUV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbW92ZSByaWdodCBhY3Rpb25cbiAgICovXG4gIG9uTW92ZVJpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IG1vdmVFdmVudDogQ29sdW1uTW92ZUV2ZW50ID0ge1xuICAgICAgY29sdW1uS2V5OiB0aGlzLmNvbHVtbi5rZXksXG4gICAgICBkaXJlY3Rpb246ICdyaWdodCcsXG4gICAgICBvbGRJbmRleDogdGhpcy5jb2x1bW5JbmRleCxcbiAgICAgIG5ld0luZGV4OiB0aGlzLmNvbHVtbkluZGV4ICsgMSxcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW5cbiAgICB9O1xuICAgIHRoaXMuY29sdW1uTW92ZWQuZW1pdChtb3ZlRXZlbnQpO1xuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJzdC1oZWFkZXJcIiBbY2xhc3Muc29ydGFibGVdPVwiaXNTb3J0YWJsZSgpXCIgW2NsYXNzLnNvcnRlZF09XCJpc1NvcnRlZCgpXCIgW2F0dHIuYXJpYS1zb3J0XT1cImdldEFyaWFTb3J0KClcIj5cbiAgPGRpdiBjbGFzcz1cImhlYWRlci1jb250ZW50XCI+XG4gICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGV4dFwiPnt7IGNvbHVtbi5oZWFkZXIgfHwgY29sdW1uLmtleSB9fTwvc3Bhbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiaXNNZW51RW5hYmxlZCgpXCIgXG4gICAgICAgICAgICBjbGFzcz1cImNvbHVtbi1tZW51LXRyaWdnZXJcIiBcbiAgICAgICAgICAgIChjbGljayk9XCJvbk1lbnVDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb2x1bW4gYWN0aW9uc1wiPlxuICAgICAgPG5pbGUtaWNvbiBuYW1lPVwib3B0aW9uc1wiPjwvbmlsZS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==