@aquera/ngx-smart-table 0.0.2-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +152 -0
- package/aquera-ngx-smart-table.d.ts +5 -0
- package/esm2020/aquera-ngx-smart-table.mjs +5 -0
- package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
- package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
- package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
- package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
- package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
- package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
- package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
- package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
- package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
- package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
- package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
- package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
- package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
- package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
- package/esm2020/lib/editors/index.mjs +9 -0
- package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
- package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
- package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
- package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
- package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
- package/esm2020/lib/factories/column-config.factory.mjs +231 -0
- package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
- package/esm2020/lib/models/base-column-config.class.mjs +253 -0
- package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
- package/esm2020/lib/models/cell-types.mjs +147 -0
- package/esm2020/lib/models/column-action.interface.mjs +6 -0
- package/esm2020/lib/models/column-config.interface.mjs +43 -0
- package/esm2020/lib/models/column-config.utils.mjs +101 -0
- package/esm2020/lib/models/row-action.interface.mjs +5 -0
- package/esm2020/lib/models/row-validator.interface.mjs +2 -0
- package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
- package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
- package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
- package/esm2020/lib/models/table-config.interface.mjs +106 -0
- package/esm2020/lib/models/table-validator.interface.mjs +2 -0
- package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
- package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
- package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
- package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
- package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
- package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
- package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
- package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
- package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
- package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
- package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
- package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
- package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
- package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
- package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
- package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
- package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
- package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
- package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
- package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
- package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
- package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
- package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
- package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
- package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/table-types.mjs +29 -0
- package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
- package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
- package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
- package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
- package/esm2020/lib/services/autosave.service.mjs +92 -0
- package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
- package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
- package/esm2020/lib/services/row-validation.service.mjs +42 -0
- package/esm2020/lib/services/validation-logger.service.mjs +177 -0
- package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
- package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
- package/esm2020/lib/smart-table.module.mjs +124 -0
- package/esm2020/lib/strategies/default-editors.mjs +433 -0
- package/esm2020/lib/strategies/default-formatters.mjs +238 -0
- package/esm2020/lib/strategies/default-validators.mjs +327 -0
- package/esm2020/public-api.mjs +146 -0
- package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
- package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
- package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
- package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
- package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
- package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
- package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
- package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
- package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
- package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
- package/lib/builder/definition-builder.module.d.ts +15 -0
- package/lib/builder/models/builder-state.interface.d.ts +93 -0
- package/lib/builder/services/definition-builder.service.d.ts +80 -0
- package/lib/builder/services/definition-export.service.d.ts +59 -0
- package/lib/builder/services/definition-import.service.d.ts +31 -0
- package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
- package/lib/builder/utils/config-validator.util.d.ts +32 -0
- package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
- package/lib/editors/index.d.ts +8 -0
- package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
- package/lib/editors/nile-calendar-editor.d.ts +89 -0
- package/lib/editors/nile-date-picker-editor.d.ts +95 -0
- package/lib/editors/nile-input-editor.d.ts +67 -0
- package/lib/editors/nile-select-editor.d.ts +109 -0
- package/lib/factories/column-config.factory.d.ts +73 -0
- package/lib/models/autosave-config.interface.d.ts +23 -0
- package/lib/models/base-column-config.class.d.ts +115 -0
- package/lib/models/cell-strategies.interface.d.ts +181 -0
- package/lib/models/cell-types.d.ts +337 -0
- package/lib/models/column-action.interface.d.ts +86 -0
- package/lib/models/column-config.interface.d.ts +272 -0
- package/lib/models/column-config.utils.d.ts +37 -0
- package/lib/models/row-action.interface.d.ts +86 -0
- package/lib/models/row-validator.interface.d.ts +37 -0
- package/lib/models/schema-validation.interface.d.ts +42 -0
- package/lib/models/sheet-action.interface.d.ts +59 -0
- package/lib/models/sheet-config.interface.d.ts +41 -0
- package/lib/models/table-config.interface.d.ts +245 -0
- package/lib/models/table-validator.interface.d.ts +40 -0
- package/lib/models/workbook-action.interface.d.ts +90 -0
- package/lib/models/workbook-config.interface.d.ts +107 -0
- package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
- package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
- package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
- package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
- package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
- package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
- package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
- package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
- package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
- package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
- package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
- package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
- package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
- package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
- package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
- package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
- package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
- package/lib/renderer/models/cell-state.interface.d.ts +118 -0
- package/lib/renderer/models/cell.class.d.ts +174 -0
- package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
- package/lib/renderer/models/sheet-state.class.d.ts +67 -0
- package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
- package/lib/renderer/models/table-state.class.d.ts +313 -0
- package/lib/renderer/models/table-state.interface.d.ts +18 -0
- package/lib/renderer/models/table-types.d.ts +228 -0
- package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
- package/lib/renderer/models/workbook-state.class.d.ts +117 -0
- package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
- package/lib/renderer/models/z-index.enum.d.ts +44 -0
- package/lib/schemas/table-config.schema.d.ts +455 -0
- package/lib/services/autosave.service.d.ts +73 -0
- package/lib/services/custom-validation-rules.util.d.ts +12 -0
- package/lib/services/json-schema-validator.service.d.ts +49 -0
- package/lib/services/row-validation.service.d.ts +17 -0
- package/lib/services/validation-logger.service.d.ts +87 -0
- package/lib/services/virtual-scroll.service.d.ts +44 -0
- package/lib/shared/shared-table-components.module.d.ts +9 -0
- package/lib/smart-table.module.d.ts +26 -0
- package/lib/strategies/default-editors.d.ts +109 -0
- package/lib/strategies/default-formatters.d.ts +116 -0
- package/lib/strategies/default-validators.d.ts +113 -0
- package/package.json +42 -0
- package/public-api.d.ts +70 -0
- package/src/lib/builder/README.md +30 -0
- package/src/lib/editors/README.md +303 -0
- package/src/lib/renderer/components/st-column-filter/README.md +286 -0
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Subject, merge } from 'rxjs';
|
|
3
|
+
import { debounceTime, distinctUntilChanged, takeUntil, tap } from 'rxjs/operators';
|
|
4
|
+
import { WorkbookState } from '../../models/workbook-state.class';
|
|
5
|
+
import { TableState } from '../../models/table-state.class';
|
|
6
|
+
import { DEFAULT_AUTOSAVE_CONFIG } from '../../../models/autosave-config.interface';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../../../services/autosave.service";
|
|
9
|
+
import * as i2 from "../st-table/st-table.component";
|
|
10
|
+
import * as i3 from "@angular/common";
|
|
11
|
+
export class StWorkbookComponent {
|
|
12
|
+
constructor(autosaveService) {
|
|
13
|
+
this.autosaveService = autosaveService;
|
|
14
|
+
/**
|
|
15
|
+
* Map of sheet ID to data array
|
|
16
|
+
*/
|
|
17
|
+
this.sheetsData = new BehaviorSubject(new Map());
|
|
18
|
+
/**
|
|
19
|
+
* Emitted when active sheet changes
|
|
20
|
+
*/
|
|
21
|
+
this.sheetChanged = new EventEmitter();
|
|
22
|
+
/**
|
|
23
|
+
* Emitted when add sheet button is clicked
|
|
24
|
+
*/
|
|
25
|
+
this.addSheet = new EventEmitter();
|
|
26
|
+
/**
|
|
27
|
+
* Emitted when a sheet tab action is clicked
|
|
28
|
+
*/
|
|
29
|
+
this.sheetTabAction = new EventEmitter();
|
|
30
|
+
/**
|
|
31
|
+
* Emitted when a workbook action is clicked
|
|
32
|
+
*/
|
|
33
|
+
this.workbookAction = new EventEmitter();
|
|
34
|
+
/**
|
|
35
|
+
* Emitted when cell value changes
|
|
36
|
+
*/
|
|
37
|
+
this.cellChange = new EventEmitter();
|
|
38
|
+
/**
|
|
39
|
+
* Emitted when cell is saved
|
|
40
|
+
*/
|
|
41
|
+
this.cellSave = new EventEmitter();
|
|
42
|
+
/**
|
|
43
|
+
* Emitted when table state changes
|
|
44
|
+
*/
|
|
45
|
+
this.tableStateChange = new EventEmitter();
|
|
46
|
+
/**
|
|
47
|
+
* Emitted when fullscreen is toggled
|
|
48
|
+
*/
|
|
49
|
+
this.fullscreenToggle = new EventEmitter();
|
|
50
|
+
/**
|
|
51
|
+
* Array of sheets
|
|
52
|
+
*/
|
|
53
|
+
this.sheets = [];
|
|
54
|
+
/**
|
|
55
|
+
* Active sheet index
|
|
56
|
+
*/
|
|
57
|
+
this.activeSheetIndex = 0;
|
|
58
|
+
/**
|
|
59
|
+
* Current table config (for active sheet)
|
|
60
|
+
*/
|
|
61
|
+
this.currentTableConfig = null;
|
|
62
|
+
/**
|
|
63
|
+
* Current table data (for active sheet)
|
|
64
|
+
*/
|
|
65
|
+
this.currentTableData = [];
|
|
66
|
+
/**
|
|
67
|
+
* Current table state (for active sheet)
|
|
68
|
+
*/
|
|
69
|
+
this.currentTableState = null;
|
|
70
|
+
/**
|
|
71
|
+
* Unique key for table component (changes on sheet switch to force reinitialization)
|
|
72
|
+
*/
|
|
73
|
+
this.tableComponentKey = '';
|
|
74
|
+
/**
|
|
75
|
+
* Fullscreen state observable
|
|
76
|
+
*/
|
|
77
|
+
this.isFullscreen$ = new BehaviorSubject(false);
|
|
78
|
+
/**
|
|
79
|
+
* Tab actions dropdown state
|
|
80
|
+
*/
|
|
81
|
+
this.tabActionsOpen = false;
|
|
82
|
+
this.selectedSheet = null;
|
|
83
|
+
this.selectedSheetIndex = -1;
|
|
84
|
+
this.tabActionsPosition = {};
|
|
85
|
+
/**
|
|
86
|
+
* Workbook actions dropdown state
|
|
87
|
+
*/
|
|
88
|
+
this.workbookActionsOpen = false;
|
|
89
|
+
this.workbookActionsPosition = {};
|
|
90
|
+
/**
|
|
91
|
+
* Visible workbook actions (filtered by hidden)
|
|
92
|
+
*/
|
|
93
|
+
this.visibleWorkbookActions = [];
|
|
94
|
+
/**
|
|
95
|
+
* Destroy subject for cleanup
|
|
96
|
+
*/
|
|
97
|
+
this.destroy$ = new Subject();
|
|
98
|
+
/**
|
|
99
|
+
* Autosave enabled flag
|
|
100
|
+
*/
|
|
101
|
+
this.autosaveEnabled = false;
|
|
102
|
+
/**
|
|
103
|
+
* Autosave strategy
|
|
104
|
+
*/
|
|
105
|
+
this.autosaveStrategy = 'lazy';
|
|
106
|
+
/**
|
|
107
|
+
* Last save timestamp
|
|
108
|
+
*/
|
|
109
|
+
this.lastSaveTime = null;
|
|
110
|
+
/**
|
|
111
|
+
* Saving indicator
|
|
112
|
+
*/
|
|
113
|
+
this.isSaving = false;
|
|
114
|
+
/**
|
|
115
|
+
* Beforeunload handler reference
|
|
116
|
+
*/
|
|
117
|
+
this.beforeUnloadHandler = null;
|
|
118
|
+
}
|
|
119
|
+
ngOnInit() {
|
|
120
|
+
this.initializeComponent();
|
|
121
|
+
// Initialize autosave if enabled
|
|
122
|
+
const autosaveConfig = this.config.autosave || DEFAULT_AUTOSAVE_CONFIG;
|
|
123
|
+
this.autosaveEnabled = autosaveConfig.enabled;
|
|
124
|
+
this.autosaveStrategy = autosaveConfig.strategy;
|
|
125
|
+
if (this.autosaveEnabled) {
|
|
126
|
+
this.setupAutoRestore();
|
|
127
|
+
this.initializeAutosave();
|
|
128
|
+
this.setupBeforeUnloadWarning();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
ngOnChanges(changes) {
|
|
132
|
+
if (changes['config']) {
|
|
133
|
+
this.initializeComponent();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Initialize component state
|
|
138
|
+
*/
|
|
139
|
+
initializeComponent() {
|
|
140
|
+
if (!this.config)
|
|
141
|
+
return;
|
|
142
|
+
this.sheets = [...this.config.sheets];
|
|
143
|
+
this.activeSheetIndex = this.config.initialActiveSheetIndex || 0;
|
|
144
|
+
if (!this.state) {
|
|
145
|
+
this.internalState = new WorkbookState({
|
|
146
|
+
id: this.config.id,
|
|
147
|
+
name: this.config.name,
|
|
148
|
+
initialActiveSheetIndex: this.activeSheetIndex
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
this.updateVisibleWorkbookActions();
|
|
152
|
+
this.updateActiveSheet();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get active state (external or internal)
|
|
156
|
+
*/
|
|
157
|
+
get activeState() {
|
|
158
|
+
return this.state || this.internalState;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Handle tab change event from nile-tab-group
|
|
162
|
+
*/
|
|
163
|
+
onTabChange(event) {
|
|
164
|
+
const newIndex = event.detail?.index ?? event;
|
|
165
|
+
// Ignore if clicked on toolbar tab
|
|
166
|
+
if (newIndex >= this.sheets.length) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
this.activeSheetIndex = newIndex;
|
|
170
|
+
this.activeState.setActiveSheetIndex(newIndex);
|
|
171
|
+
this.updateActiveSheet();
|
|
172
|
+
this.sheetChanged.emit(this.activeSheetIndex);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Update active sheet data (triggers table re-initialization with new config/state)
|
|
176
|
+
*/
|
|
177
|
+
updateActiveSheet() {
|
|
178
|
+
const sheet = this.sheets[this.activeSheetIndex];
|
|
179
|
+
if (!sheet)
|
|
180
|
+
return;
|
|
181
|
+
// Create a fresh TableState for this sheet (lazy initialization)
|
|
182
|
+
// This ensures the table reinitializes with new config and state
|
|
183
|
+
const tableState = new TableState(sheet.tableConfig.columns, {
|
|
184
|
+
initialPage: sheet.tableConfig.initialState?.page || 1,
|
|
185
|
+
pageSize: sheet.tableConfig.pagination?.pageSize || 25
|
|
186
|
+
});
|
|
187
|
+
// Update current table properties (triggers Angular change detection)
|
|
188
|
+
// The st-table component will detect these changes and reinitialize
|
|
189
|
+
this.currentTableConfig = { ...sheet.tableConfig };
|
|
190
|
+
this.currentTableData = this.sheetsData.getValue()?.get(sheet.id) || [];
|
|
191
|
+
this.currentTableState = tableState;
|
|
192
|
+
// Update component key to force DOM re-creation (true lazy loading)
|
|
193
|
+
// This ensures complete reinitialization of st-table component
|
|
194
|
+
this.tableComponentKey = `${sheet.id}-${Date.now()}`;
|
|
195
|
+
// Store the table state in workbook state for persistence
|
|
196
|
+
this.activeState.setSheetTableState(sheet.id, tableState);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Add new sheet
|
|
200
|
+
*/
|
|
201
|
+
onAddSheet() {
|
|
202
|
+
this.addSheet.emit();
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Check if can add more sheets
|
|
206
|
+
*/
|
|
207
|
+
get canAddSheet() {
|
|
208
|
+
if (this.config.display?.allowAddSheet === false) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
if (this.config.display?.maxSheets) {
|
|
212
|
+
return this.sheets.length < this.config.display.maxSheets;
|
|
213
|
+
}
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get minimum sheets required
|
|
218
|
+
*/
|
|
219
|
+
get minSheets() {
|
|
220
|
+
return this.config.display?.minSheets || 1;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Open tab actions dropdown
|
|
224
|
+
*/
|
|
225
|
+
openTabActions(event, sheet, index) {
|
|
226
|
+
event.stopPropagation();
|
|
227
|
+
this.selectedSheet = sheet;
|
|
228
|
+
this.selectedSheetIndex = index;
|
|
229
|
+
this.tabActionsOpen = true;
|
|
230
|
+
// Position dropdown
|
|
231
|
+
const target = event.currentTarget;
|
|
232
|
+
const rect = target.getBoundingClientRect();
|
|
233
|
+
this.tabActionsPosition = {
|
|
234
|
+
top: `${rect.bottom + 4}px`,
|
|
235
|
+
left: `${rect.left}px`
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Close tab actions dropdown
|
|
240
|
+
*/
|
|
241
|
+
closeTabActions() {
|
|
242
|
+
this.tabActionsOpen = false;
|
|
243
|
+
this.selectedSheet = null;
|
|
244
|
+
this.selectedSheetIndex = -1;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Check if sheet has tab actions
|
|
248
|
+
*/
|
|
249
|
+
hasTabActions(sheet) {
|
|
250
|
+
return !!(sheet.tabActions && sheet.tabActions.length > 0);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Handle tab action click
|
|
254
|
+
*/
|
|
255
|
+
onTabActionClick(action, event) {
|
|
256
|
+
event.stopPropagation();
|
|
257
|
+
if (!this.selectedSheet)
|
|
258
|
+
return;
|
|
259
|
+
this.sheetTabAction.emit({
|
|
260
|
+
action,
|
|
261
|
+
sheetId: this.selectedSheet.id
|
|
262
|
+
});
|
|
263
|
+
this.closeTabActions();
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Toggle workbook actions dropdown
|
|
267
|
+
*/
|
|
268
|
+
toggleWorkbookActions(event) {
|
|
269
|
+
event.stopPropagation();
|
|
270
|
+
this.workbookActionsOpen = !this.workbookActionsOpen;
|
|
271
|
+
if (this.workbookActionsOpen) {
|
|
272
|
+
const target = event.currentTarget;
|
|
273
|
+
const rect = target.getBoundingClientRect();
|
|
274
|
+
this.workbookActionsPosition = {
|
|
275
|
+
top: `${rect.bottom + 4}px`,
|
|
276
|
+
right: `${window.innerWidth - rect.right}px`
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Close workbook actions dropdown
|
|
282
|
+
*/
|
|
283
|
+
closeWorkbookActions() {
|
|
284
|
+
this.workbookActionsOpen = false;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Update visible workbook actions
|
|
288
|
+
*/
|
|
289
|
+
updateVisibleWorkbookActions() {
|
|
290
|
+
if (!this.config.workbookActions) {
|
|
291
|
+
this.visibleWorkbookActions = [];
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
this.visibleWorkbookActions = this.config.workbookActions.filter(action => {
|
|
295
|
+
if (typeof action.hidden === 'function') {
|
|
296
|
+
return !action.hidden();
|
|
297
|
+
}
|
|
298
|
+
return !action.hidden;
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Check if workbook action is disabled
|
|
303
|
+
*/
|
|
304
|
+
isActionDisabled(action) {
|
|
305
|
+
if (typeof action.disabled === 'function') {
|
|
306
|
+
return action.disabled();
|
|
307
|
+
}
|
|
308
|
+
return action.disabled || false;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Handle workbook action click
|
|
312
|
+
*/
|
|
313
|
+
onWorkbookActionClick(action, event) {
|
|
314
|
+
event.stopPropagation();
|
|
315
|
+
if (this.isActionDisabled(action)) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
this.workbookAction.emit({
|
|
319
|
+
action,
|
|
320
|
+
workbookId: this.config.id
|
|
321
|
+
});
|
|
322
|
+
this.closeWorkbookActions();
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Toggle fullscreen mode
|
|
326
|
+
*/
|
|
327
|
+
toggleFullscreen() {
|
|
328
|
+
const current = this.isFullscreen$.value;
|
|
329
|
+
const newValue = !current;
|
|
330
|
+
this.isFullscreen$.next(newValue);
|
|
331
|
+
this.fullscreenToggle.emit(newValue);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Handle cell change from table - update internal data and pass through to parent
|
|
335
|
+
*/
|
|
336
|
+
onCellChange(event) {
|
|
337
|
+
this.selectedSheet = this.sheets[this.activeSheetIndex];
|
|
338
|
+
// Update the internal sheetsData with the new cell value
|
|
339
|
+
if (this.selectedSheet && event.rowData && event.columnKey !== undefined) {
|
|
340
|
+
const currentData = this.sheetsData.getValue();
|
|
341
|
+
const sheetData = currentData.get(this.selectedSheet.id);
|
|
342
|
+
if (sheetData && event.rowIndex !== undefined) {
|
|
343
|
+
// Update the specific row's column value
|
|
344
|
+
const updatedRow = { ...sheetData[event.rowIndex] };
|
|
345
|
+
updatedRow[event.columnKey] = event.newValue;
|
|
346
|
+
// Create a new array with the updated row
|
|
347
|
+
const updatedSheetData = [...sheetData];
|
|
348
|
+
updatedSheetData[event.rowIndex] = updatedRow;
|
|
349
|
+
// Create a new Map with the updated sheet data
|
|
350
|
+
const updatedData = new Map(currentData);
|
|
351
|
+
updatedData.set(this.selectedSheet.id, updatedSheetData);
|
|
352
|
+
// Update the BehaviorSubject with new reference
|
|
353
|
+
this.sheetsData.next(updatedData);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Emit to parent
|
|
357
|
+
this.cellChange.emit(event);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Handle cell save from table - update internal data and pass through to parent
|
|
361
|
+
*/
|
|
362
|
+
onCellSave(event) {
|
|
363
|
+
// Update the internal sheetsData with the new cell value
|
|
364
|
+
if (this.selectedSheet && event.rowData && event.columnKey !== undefined) {
|
|
365
|
+
const currentData = this.sheetsData.getValue();
|
|
366
|
+
const sheetData = currentData.get(this.selectedSheet.id);
|
|
367
|
+
if (sheetData && event.rowIndex !== undefined) {
|
|
368
|
+
// Update the specific row's column value
|
|
369
|
+
const updatedRow = { ...sheetData[event.rowIndex] };
|
|
370
|
+
updatedRow[event.columnKey] = event.newValue;
|
|
371
|
+
// Create a new array with the updated row
|
|
372
|
+
const updatedSheetData = [...sheetData];
|
|
373
|
+
updatedSheetData[event.rowIndex] = updatedRow;
|
|
374
|
+
// Create a new Map with the updated sheet data
|
|
375
|
+
const updatedData = new Map(currentData);
|
|
376
|
+
updatedData.set(this.selectedSheet.id, updatedSheetData);
|
|
377
|
+
// Update the BehaviorSubject with new reference
|
|
378
|
+
this.sheetsData.next(updatedData);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// Emit to parent
|
|
382
|
+
this.cellSave.emit(event);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Handle table state change - pass through to parent
|
|
386
|
+
*/
|
|
387
|
+
onTableStateChange(event) {
|
|
388
|
+
this.tableStateChange.emit(event);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Component cleanup
|
|
392
|
+
*/
|
|
393
|
+
ngOnDestroy() {
|
|
394
|
+
this.destroy$.next();
|
|
395
|
+
this.destroy$.complete();
|
|
396
|
+
// Clear autosave data on destroy
|
|
397
|
+
if (this.autosaveEnabled) {
|
|
398
|
+
this.autosaveService.clear(this.config.id);
|
|
399
|
+
}
|
|
400
|
+
// Remove beforeunload handler
|
|
401
|
+
if (this.beforeUnloadHandler) {
|
|
402
|
+
window.removeEventListener('beforeunload', this.beforeUnloadHandler);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Initialize autosave subscription
|
|
407
|
+
*/
|
|
408
|
+
initializeAutosave() {
|
|
409
|
+
const changeEvents$ = merge(this.cellChange, this.cellSave, this.tableStateChange, this.sheetTabAction);
|
|
410
|
+
const autosave$ = this.autosaveStrategy === 'lazy'
|
|
411
|
+
? changeEvents$.pipe(tap(() => this.autosaveService.setDirty(this.config.id, true)), debounceTime(2000), distinctUntilChanged())
|
|
412
|
+
: changeEvents$.pipe(tap(() => this.autosaveService.setDirty(this.config.id, true)), debounceTime(100));
|
|
413
|
+
autosave$.pipe(takeUntil(this.destroy$)).subscribe(() => this.performAutosave());
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Perform autosave operation
|
|
417
|
+
*/
|
|
418
|
+
performAutosave() {
|
|
419
|
+
this.isSaving = true;
|
|
420
|
+
const autosaveData = {
|
|
421
|
+
workbookConfig: this.config,
|
|
422
|
+
workbookState: this.activeState.getSnapshot(),
|
|
423
|
+
sheetsData: new Map(this.sheetsData.getValue()),
|
|
424
|
+
timestamp: new Date()
|
|
425
|
+
};
|
|
426
|
+
this.autosaveService.save(this.config.id, autosaveData);
|
|
427
|
+
this.lastSaveTime = new Date();
|
|
428
|
+
this.isSaving = false;
|
|
429
|
+
this.autosaveService.setDirty(this.config.id, false);
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Setup auto-restore from autosave
|
|
433
|
+
*/
|
|
434
|
+
setupAutoRestore() {
|
|
435
|
+
const autosaved = this.autosaveService.get(this.config.id);
|
|
436
|
+
if (autosaved) {
|
|
437
|
+
// Restore config
|
|
438
|
+
this.config = autosaved.workbookConfig;
|
|
439
|
+
// Restore sheets data
|
|
440
|
+
this.sheetsData.next(autosaved.sheetsData);
|
|
441
|
+
// Note: Workbook state restoration is handled internally
|
|
442
|
+
// If external state management is used, parent component should handle it
|
|
443
|
+
this.lastSaveTime = autosaved.timestamp;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Setup beforeunload warning for unsaved changes
|
|
448
|
+
*/
|
|
449
|
+
setupBeforeUnloadWarning() {
|
|
450
|
+
this.beforeUnloadHandler = (event) => {
|
|
451
|
+
if (this.autosaveService.isDirty(this.config.id)) {
|
|
452
|
+
event.preventDefault();
|
|
453
|
+
event.returnValue = 'You have unsaved changes. Are you sure you want to leave?';
|
|
454
|
+
return event.returnValue;
|
|
455
|
+
}
|
|
456
|
+
return undefined;
|
|
457
|
+
};
|
|
458
|
+
window.addEventListener('beforeunload', this.beforeUnloadHandler);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
StWorkbookComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StWorkbookComponent, deps: [{ token: i1.AutosaveService }], target: i0.ɵɵFactoryTarget.Component });
|
|
462
|
+
StWorkbookComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StWorkbookComponent, selector: "st-workbook", inputs: { config: "config", sheetsData: "sheetsData", state: "state" }, outputs: { sheetChanged: "sheetChanged", addSheet: "addSheet", sheetTabAction: "sheetTabAction", workbookAction: "workbookAction", cellChange: "cellChange", cellSave: "cellSave", tableStateChange: "tableStateChange", fullscreenToggle: "fullscreenToggle" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"workbook-container\" [class.fullscreen]=\"isFullscreen$ | async\">\n <nile-tab-group [activeIndex]=\"activeSheetIndex\">\n \n <!-- Sheet Tabs (one per sheet) -->\n <nile-tab *ngFor=\"let sheet of sheets; let i = index\"\n slot=\"nav\" \n panel=\"shared-panel\"\n [class.active]=\"i === activeSheetIndex\"\n (click)=\"onTabChange(i)\">\n <div class=\"sheet-tab-content\">\n <span class=\"sheet-name\">{{ sheet.name }}</span>\n \n <!-- Tab actions dropdown button -->\n <button class=\"tab-actions-button\"\n (click)=\"openTabActions($event, sheet, i)\"\n *ngIf=\"hasTabActions(sheet)\">\n <nile-icon name=\"arrowdown\" size=\"14\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Toolbar Tab (for workbook controls) -->\n <nile-tab slot=\"nav\" \n panel=\"shared-panel\"\n class=\"workbook-toolbar-tab\"\n [disabled]=\"true\">\n <div class=\"workbook-toolbar-content\">\n <!-- Autosave Indicator -->\n <div class=\"autosave-indicator\" *ngIf=\"autosaveEnabled\">\n <nile-icon \n *ngIf=\"!isSaving && lastSaveTime\" \n name=\"save\" \n size=\"14\"\n [title]=\"'Saved at ' + (lastSaveTime | date:'HH:mm:ss')\">\n </nile-icon>\n <nile-icon \n *ngIf=\"isSaving\" \n name=\"loader\" \n size=\"14\"\n title=\"Saving...\">\n </nile-icon>\n </div>\n\n <!-- Workbook Actions Dropdown -->\n <button class=\"workbook-actions-button\"\n *ngIf=\"config.workbookActions && config.workbookActions.length > 0\"\n (click)=\"toggleWorkbookActions($event)\"\n title=\"Workbook Actions\">\n <nile-icon name=\"settings\"></nile-icon>\n </button>\n \n <!-- Add Sheet Button -->\n <button class=\"add-sheet-button\"\n *ngIf=\"canAddSheet\"\n (click)=\"onAddSheet()\"\n title=\"Add Sheet\">\n <nile-icon name=\"plus\"></nile-icon>\n </button>\n \n <!-- Fullscreen Button -->\n <button class=\"fullscreen-button\"\n *ngIf=\"config.display?.allowFullscreen !== false\"\n (click)=\"toggleFullscreen()\"\n [title]=\"(isFullscreen$ | async) ? 'Exit Fullscreen' : 'Fullscreen'\">\n <nile-icon [name]=\"(isFullscreen$ | async) ? 'collapse' : 'expand-06'\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Single Shared Tab Panel -->\n <nile-tab-panel name=\"shared-panel\">\n <!-- Lazy loading strategy: table is destroyed and recreated with new config/state when sheet changes -->\n <!-- The componentKey ensures complete reinitialization of st-table for each sheet -->\n <st-table *ngIf=\"currentTableConfig && currentTableState && tableComponentKey\"\n [attr.data-sheet-key]=\"tableComponentKey\"\n [tableConfig]=\"currentTableConfig\"\n [data]=\"currentTableData\"\n [tableState]=\"currentTableState\"\n (cellChange)=\"onCellChange($event)\"\n (cellSave)=\"onCellSave($event)\"\n (stateChange)=\"onTableStateChange($event)\">\n </st-table>\n </nile-tab-panel>\n \n </nile-tab-group>\n</div>\n\n<!-- Tab Actions Dropdown -->\n<div class=\"tab-actions-dropdown\" \n *ngIf=\"tabActionsOpen\"\n [ngStyle]=\"tabActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeTabActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of selectedSheet?.tabActions\" \n (click)=\"onTabActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Workbook Actions Dropdown -->\n<div class=\"workbook-actions-dropdown\"\n *ngIf=\"workbookActionsOpen\"\n [ngStyle]=\"workbookActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeWorkbookActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of visibleWorkbookActions\"\n [class.disabled]=\"isActionDisabled(action)\"\n (click)=\"onWorkbookActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Fullscreen Backdrop -->\n<div class=\"fullscreen-backdrop\" \n *ngIf=\"isFullscreen$ | async\"\n (click)=\"toggleFullscreen()\">\n</div>\n\n", styles: [":host{display:block;width:100%;height:100%}.workbook-container{display:flex;flex-direction:column;height:100%;background:white;border:1px solid var(--nile-color-neutral-200);border-radius:4px;overflow:hidden}.workbook-container.fullscreen{position:fixed;inset:0;z-index:2000;border:none;border-radius:0}.workbook-container nile-tab-group{height:100%;display:flex;flex-direction:column}.sheet-tab-content{display:flex;align-items:center;gap:8px;padding:0 4px}.sheet-tab-content .sheet-name{font-size:14px;font-weight:500;color:#000}.sheet-tab-content .tab-actions-button{width:20px;height:20px;padding:0;background:transparent;border:none;cursor:pointer}.workbook-toolbar-tab{margin-left:auto!important;pointer-events:auto!important;border-left:1px solid var(--nile-color-neutral-200)}.workbook-toolbar-tab .workbook-toolbar-content{display:flex;gap:4px;align-items:center;padding:0 8px}.workbook-toolbar-tab .workbook-toolbar-content .autosave-indicator{display:flex;align-items:center;margin-right:8px;color:var(--nile-color-success-500)}.workbook-toolbar-tab button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;color:var(--nile-color-neutral-600)}.workbook-toolbar-tab button:hover{background-color:var(--nile-color-neutral-100);color:var(--nile-color-neutral-900)}.workbook-toolbar-tab button:active{background-color:var(--nile-color-neutral-200)}.workbook-toolbar-tab button nile-icon{font-size:16px}.tab-actions-dropdown{position:fixed;z-index:1001}.tab-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.tab-actions-dropdown .dropdown-menu{position:relative;min-width:180px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.tab-actions-dropdown .dropdown-menu nile-menu{display:block}.workbook-actions-dropdown{position:fixed;z-index:1001}.workbook-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.workbook-actions-dropdown .dropdown-menu{position:relative;min-width:200px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.workbook-actions-dropdown .dropdown-menu nile-menu{display:block}.fullscreen-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:1999;cursor:pointer}nile-tab-group::part(nav){background-color:#fafafa}nile-tab-group::part(active-tab-indicator-path){background:none}nile-tab-group::part(active-tab-indicator){border-bottom:none}nile-tab-group::part(tabs){gap:0}nile-tab-group nile-tab{border:1px solid #e0e0e0;border-top-left-radius:6px;border-top-right-radius:6px}nile-tab-group nile-tab::part(base){padding-left:.5rem;padding-top:.5rem;padding-bottom:.5rem;border-bottom-left-radius:0;border-bottom-right-radius:0}nile-tab-group nile-tab.active{background-color:#fff;color:#000}nile-tab-group nile-tab-panel::part(base){padding:0;max-height:30rem}\n"], components: [{ type: i2.StTableComponent, selector: "st-table", inputs: ["tableConfig", "data", "data$", "tableState", "enableSorting", "enableFiltering", "validateConfig"], outputs: ["stateChange", "dataChange", "cellEdit", "cellSave", "cellCancel", "cellChange", "columnResized", "columnMoved", "configValidationErrors", "columnAdded", "rowAction", "validationStateChange"] }], directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], pipes: { "async": i3.AsyncPipe, "date": i3.DatePipe } });
|
|
463
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StWorkbookComponent, decorators: [{
|
|
464
|
+
type: Component,
|
|
465
|
+
args: [{ selector: 'st-workbook', template: "<div class=\"workbook-container\" [class.fullscreen]=\"isFullscreen$ | async\">\n <nile-tab-group [activeIndex]=\"activeSheetIndex\">\n \n <!-- Sheet Tabs (one per sheet) -->\n <nile-tab *ngFor=\"let sheet of sheets; let i = index\"\n slot=\"nav\" \n panel=\"shared-panel\"\n [class.active]=\"i === activeSheetIndex\"\n (click)=\"onTabChange(i)\">\n <div class=\"sheet-tab-content\">\n <span class=\"sheet-name\">{{ sheet.name }}</span>\n \n <!-- Tab actions dropdown button -->\n <button class=\"tab-actions-button\"\n (click)=\"openTabActions($event, sheet, i)\"\n *ngIf=\"hasTabActions(sheet)\">\n <nile-icon name=\"arrowdown\" size=\"14\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Toolbar Tab (for workbook controls) -->\n <nile-tab slot=\"nav\" \n panel=\"shared-panel\"\n class=\"workbook-toolbar-tab\"\n [disabled]=\"true\">\n <div class=\"workbook-toolbar-content\">\n <!-- Autosave Indicator -->\n <div class=\"autosave-indicator\" *ngIf=\"autosaveEnabled\">\n <nile-icon \n *ngIf=\"!isSaving && lastSaveTime\" \n name=\"save\" \n size=\"14\"\n [title]=\"'Saved at ' + (lastSaveTime | date:'HH:mm:ss')\">\n </nile-icon>\n <nile-icon \n *ngIf=\"isSaving\" \n name=\"loader\" \n size=\"14\"\n title=\"Saving...\">\n </nile-icon>\n </div>\n\n <!-- Workbook Actions Dropdown -->\n <button class=\"workbook-actions-button\"\n *ngIf=\"config.workbookActions && config.workbookActions.length > 0\"\n (click)=\"toggleWorkbookActions($event)\"\n title=\"Workbook Actions\">\n <nile-icon name=\"settings\"></nile-icon>\n </button>\n \n <!-- Add Sheet Button -->\n <button class=\"add-sheet-button\"\n *ngIf=\"canAddSheet\"\n (click)=\"onAddSheet()\"\n title=\"Add Sheet\">\n <nile-icon name=\"plus\"></nile-icon>\n </button>\n \n <!-- Fullscreen Button -->\n <button class=\"fullscreen-button\"\n *ngIf=\"config.display?.allowFullscreen !== false\"\n (click)=\"toggleFullscreen()\"\n [title]=\"(isFullscreen$ | async) ? 'Exit Fullscreen' : 'Fullscreen'\">\n <nile-icon [name]=\"(isFullscreen$ | async) ? 'collapse' : 'expand-06'\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Single Shared Tab Panel -->\n <nile-tab-panel name=\"shared-panel\">\n <!-- Lazy loading strategy: table is destroyed and recreated with new config/state when sheet changes -->\n <!-- The componentKey ensures complete reinitialization of st-table for each sheet -->\n <st-table *ngIf=\"currentTableConfig && currentTableState && tableComponentKey\"\n [attr.data-sheet-key]=\"tableComponentKey\"\n [tableConfig]=\"currentTableConfig\"\n [data]=\"currentTableData\"\n [tableState]=\"currentTableState\"\n (cellChange)=\"onCellChange($event)\"\n (cellSave)=\"onCellSave($event)\"\n (stateChange)=\"onTableStateChange($event)\">\n </st-table>\n </nile-tab-panel>\n \n </nile-tab-group>\n</div>\n\n<!-- Tab Actions Dropdown -->\n<div class=\"tab-actions-dropdown\" \n *ngIf=\"tabActionsOpen\"\n [ngStyle]=\"tabActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeTabActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of selectedSheet?.tabActions\" \n (click)=\"onTabActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Workbook Actions Dropdown -->\n<div class=\"workbook-actions-dropdown\"\n *ngIf=\"workbookActionsOpen\"\n [ngStyle]=\"workbookActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeWorkbookActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of visibleWorkbookActions\"\n [class.disabled]=\"isActionDisabled(action)\"\n (click)=\"onWorkbookActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Fullscreen Backdrop -->\n<div class=\"fullscreen-backdrop\" \n *ngIf=\"isFullscreen$ | async\"\n (click)=\"toggleFullscreen()\">\n</div>\n\n", styles: [":host{display:block;width:100%;height:100%}.workbook-container{display:flex;flex-direction:column;height:100%;background:white;border:1px solid var(--nile-color-neutral-200);border-radius:4px;overflow:hidden}.workbook-container.fullscreen{position:fixed;inset:0;z-index:2000;border:none;border-radius:0}.workbook-container nile-tab-group{height:100%;display:flex;flex-direction:column}.sheet-tab-content{display:flex;align-items:center;gap:8px;padding:0 4px}.sheet-tab-content .sheet-name{font-size:14px;font-weight:500;color:#000}.sheet-tab-content .tab-actions-button{width:20px;height:20px;padding:0;background:transparent;border:none;cursor:pointer}.workbook-toolbar-tab{margin-left:auto!important;pointer-events:auto!important;border-left:1px solid var(--nile-color-neutral-200)}.workbook-toolbar-tab .workbook-toolbar-content{display:flex;gap:4px;align-items:center;padding:0 8px}.workbook-toolbar-tab .workbook-toolbar-content .autosave-indicator{display:flex;align-items:center;margin-right:8px;color:var(--nile-color-success-500)}.workbook-toolbar-tab button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;color:var(--nile-color-neutral-600)}.workbook-toolbar-tab button:hover{background-color:var(--nile-color-neutral-100);color:var(--nile-color-neutral-900)}.workbook-toolbar-tab button:active{background-color:var(--nile-color-neutral-200)}.workbook-toolbar-tab button nile-icon{font-size:16px}.tab-actions-dropdown{position:fixed;z-index:1001}.tab-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.tab-actions-dropdown .dropdown-menu{position:relative;min-width:180px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.tab-actions-dropdown .dropdown-menu nile-menu{display:block}.workbook-actions-dropdown{position:fixed;z-index:1001}.workbook-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.workbook-actions-dropdown .dropdown-menu{position:relative;min-width:200px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.workbook-actions-dropdown .dropdown-menu nile-menu{display:block}.fullscreen-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:1999;cursor:pointer}nile-tab-group::part(nav){background-color:#fafafa}nile-tab-group::part(active-tab-indicator-path){background:none}nile-tab-group::part(active-tab-indicator){border-bottom:none}nile-tab-group::part(tabs){gap:0}nile-tab-group nile-tab{border:1px solid #e0e0e0;border-top-left-radius:6px;border-top-right-radius:6px}nile-tab-group nile-tab::part(base){padding-left:.5rem;padding-top:.5rem;padding-bottom:.5rem;border-bottom-left-radius:0;border-bottom-right-radius:0}nile-tab-group nile-tab.active{background-color:#fff;color:#000}nile-tab-group nile-tab-panel::part(base){padding:0;max-height:30rem}\n"] }]
|
|
466
|
+
}], ctorParameters: function () { return [{ type: i1.AutosaveService }]; }, propDecorators: { config: [{
|
|
467
|
+
type: Input
|
|
468
|
+
}], sheetsData: [{
|
|
469
|
+
type: Input
|
|
470
|
+
}], state: [{
|
|
471
|
+
type: Input
|
|
472
|
+
}], sheetChanged: [{
|
|
473
|
+
type: Output
|
|
474
|
+
}], addSheet: [{
|
|
475
|
+
type: Output
|
|
476
|
+
}], sheetTabAction: [{
|
|
477
|
+
type: Output
|
|
478
|
+
}], workbookAction: [{
|
|
479
|
+
type: Output
|
|
480
|
+
}], cellChange: [{
|
|
481
|
+
type: Output
|
|
482
|
+
}], cellSave: [{
|
|
483
|
+
type: Output
|
|
484
|
+
}], tableStateChange: [{
|
|
485
|
+
type: Output
|
|
486
|
+
}], fullscreenToggle: [{
|
|
487
|
+
type: Output
|
|
488
|
+
}] } });
|
|
489
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtd29ya2Jvb2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LXdvcmtib29rL3N0LXdvcmtib29rLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC13b3JrYm9vay9zdC13b3JrYm9vay5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxHQUtiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSTVELE9BQU8sRUFBb0IsdUJBQXVCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7QUFRdEcsTUFBTSxPQUFPLG1CQUFtQjtJQWlKOUIsWUFBb0IsZUFBZ0M7UUFBaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBM0lwRDs7V0FFRztRQUNNLGVBQVUsR0FBd0MsSUFBSSxlQUFlLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBTzFGOztXQUVHO1FBQ08saUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXBEOztXQUVHO1FBQ08sYUFBUSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFOUM7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XG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFdvcmtib29rQ29uZmlnLCBXb3JrYm9va1NoZWV0Q29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3dvcmtib29rLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgV29ya2Jvb2tBY3Rpb24sIFdvcmtib29rQWN0aW9uRXZlbnQsIFNoZWV0VGFiQWN0aW9uRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvd29ya2Jvb2stYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBXb3JrYm9va1N0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3dvcmtib29rLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IFdvcmtib29rU3RhdGVTbmFwc2hvdCB9IGZyb20gJy4uLy4uL21vZGVscy93b3JrYm9vay1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGFibGVTdGF0ZSB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS1zdGF0ZS5jbGFzcyc7XG5pbXBvcnQgeyBUYWJsZUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90YWJsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IENlbGxDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jZWxsLXR5cGVzJztcbmltcG9ydCB7IFRhYmxlU3RhdGVDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS10eXBlcyc7XG5pbXBvcnQgeyBBdXRvc2F2ZVN0cmF0ZWd5LCBERUZBVUxUX0FVVE9TQVZFX0NPTkZJRyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9hdXRvc2F2ZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEF1dG9zYXZlU2VydmljZSwgQXV0b3NhdmVEYXRhIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0b3NhdmUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LXdvcmtib29rJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0LXdvcmtib29rLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3Qtd29ya2Jvb2suY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU3RXb3JrYm9va0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogV29ya2Jvb2sgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQElucHV0KCkgY29uZmlnITogV29ya2Jvb2tDb25maWc7XG5cbiAgLyoqXG4gICAqIE1hcCBvZiBzaGVldCBJRCB0byBkYXRhIGFycmF5XG4gICAqL1xuICBASW5wdXQoKSBzaGVldHNEYXRhOiBCZWhhdmlvclN1YmplY3Q8TWFwPHN0cmluZywgYW55W10+PiA9IG5ldyBCZWhhdmlvclN1YmplY3QobmV3IE1hcCgpKTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgZXh0ZXJuYWwgc3RhdGUgbWFuYWdlbWVudFxuICAgKi9cbiAgQElucHV0KCkgc3RhdGU/OiBXb3JrYm9va1N0YXRlO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYWN0aXZlIHNoZWV0IGNoYW5nZXNcbiAgICovXG4gIEBPdXRwdXQoKSBzaGVldENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFkZCBzaGVldCBidXR0b24gaXMgY2xpY2tlZFxuICAgKi9cbiAgQE91dHB1dCgpIGFkZFNoZWV0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBzaGVldCB0YWIgYWN0aW9uIGlzIGNsaWNrZWRcbiAgICovXG4gIEBPdXRwdXQoKSBzaGVldFRhYkFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8U2hlZXRUYWJBY3Rpb25FdmVudD4oKTtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgd29ya2Jvb2sgYWN0aW9uIGlzIGNsaWNrZWRcbiAgICovXG4gIEBPdXRwdXQoKSB3b3JrYm9va0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8V29ya2Jvb2tBY3Rpb25FdmVudD4oKTtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGNlbGwgdmFsdWUgY2hhbmdlc1xuICAgKi9cbiAgQE91dHB1dCgpIGNlbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxDaGFuZ2VFdmVudD4oKTtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGNlbGwgaXMgc2F2ZWRcbiAgICovXG4gIEBPdXRwdXQoKSBjZWxsU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGFibGUgc3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgQE91dHB1dCgpIHRhYmxlU3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlU3RhdGVDaGFuZ2VFdmVudD4oKTtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGZ1bGxzY3JlZW4gaXMgdG9nZ2xlZFxuICAgKi9cbiAgQE91dHB1dCgpIGZ1bGxzY3JlZW5Ub2dnbGUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIHNoZWV0c1xuICAgKi9cbiAgc2hlZXRzOiBXb3JrYm9va1NoZWV0Q29uZmlnW10gPSBbXTtcblxuICAvKipcbiAgICogQWN0aXZlIHNoZWV0IGluZGV4XG4gICAqL1xuICBhY3RpdmVTaGVldEluZGV4ID0gMDtcblxuICAvKipcbiAgICogQ3VycmVudCB0YWJsZSBjb25maWcgKGZvciBhY3RpdmUgc2hlZXQpXG4gICAqL1xuICBjdXJyZW50VGFibGVDb25maWc6IFRhYmxlQ29uZmlnIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdGFibGUgZGF0YSAoZm9yIGFjdGl2ZSBzaGVldClcbiAgICovXG4gIGN1cnJlbnRUYWJsZURhdGE6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdGFibGUgc3RhdGUgKGZvciBhY3RpdmUgc2hlZXQpXG4gICAqL1xuICBjdXJyZW50VGFibGVTdGF0ZTogVGFibGVTdGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBVbmlxdWUga2V5IGZvciB0YWJsZSBjb21wb25lbnQgKGNoYW5nZXMgb24gc2hlZXQgc3dpdGNoIHRvIGZvcmNlIHJlaW5pdGlhbGl6YXRpb24pXG4gICAqL1xuICB0YWJsZUNvbXBvbmVudEtleTogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIEludGVybmFsIHN0YXRlIGluc3RhbmNlXG4gICAqL1xuICBpbnRlcm5hbFN0YXRlPzogV29ya2Jvb2tTdGF0ZTtcblxuICAvKipcbiAgICogRnVsbHNjcmVlbiBzdGF0ZSBvYnNlcnZhYmxlXG4gICAqL1xuICBpc0Z1bGxzY3JlZW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLyoqXG4gICAqIFRhYiBhY3Rpb25zIGRyb3Bkb3duIHN0YXRlXG4gICAqL1xuICB0YWJBY3Rpb25zT3BlbiA9IGZhbHNlO1xuICBzZWxlY3RlZFNoZWV0OiBXb3JrYm9va1NoZWV0Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdGVkU2hlZXRJbmRleDogbnVtYmVyID0gLTE7XG4gIHRhYkFjdGlvbnNQb3NpdGlvbjogYW55ID0ge307XG5cbiAgLyoqXG4gICAqIFdvcmtib29rIGFjdGlvbnMgZHJvcGRvd24gc3RhdGVcbiAgICovXG4gIHdvcmtib29rQWN0aW9uc09wZW4gPSBmYWxzZTtcbiAgd29ya2Jvb2tBY3Rpb25zUG9zaXRpb246IGFueSA9IHt9O1xuXG4gIC8qKlxuICAgKiBWaXNpYmxlIHdvcmtib29rIGFjdGlvbnMgKGZpbHRlcmVkIGJ5IGhpZGRlbilcbiAgICovXG4gIHZpc2libGVXb3JrYm9va0FjdGlvbnM6IFdvcmtib29rQWN0aW9uW10gPSBbXTtcblxuICAvKipcbiAgICogRGVzdHJveSBzdWJqZWN0IGZvciBjbGVhbnVwXG4gICAqL1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKipcbiAgICogQXV0b3NhdmUgZW5hYmxlZCBmbGFnXG4gICAqL1xuICBhdXRvc2F2ZUVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQXV0b3NhdmUgc3RyYXRlZ3lcbiAgICovXG4gIHByaXZhdGUgYXV0b3NhdmVTdHJhdGVneTogQXV0b3NhdmVTdHJhdGVneSA9ICdsYXp5JztcblxuICAvKipcbiAgICogTGFzdCBzYXZlIHRpbWVzdGFtcFxuICAgKi9cbiAgbGFzdFNhdmVUaW1lOiBEYXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFNhdmluZyBpbmRpY2F0b3JcbiAgICovXG4gIGlzU2F2aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEJlZm9yZXVubG9hZCBoYW5kbGVyIHJlZmVyZW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBiZWZvcmVVbmxvYWRIYW5kbGVyOiAoKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dG9zYXZlU2VydmljZTogQXV0b3NhdmVTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhdXRvc2F2ZSBpZiBlbmFibGVkXG4gICAgY29uc3QgYXV0b3NhdmVDb25maWcgPSB0aGlzLmNvbmZpZy5hdXRvc2F2ZSB8fCBERUZBVUxUX0FVVE9TQVZFX0NPTkZJRztcbiAgICB0aGlzLmF1dG9zYXZlRW5hYmxlZCA9IGF1dG9zYXZlQ29uZmlnLmVuYWJsZWQ7XG4gICAgdGhpcy5hdXRvc2F2ZVN0cmF0ZWd5ID0gYXV0b3NhdmVDb25maWcuc3RyYXRlZ3k7XG5cbiAgICBpZiAodGhpcy5hdXRvc2F2ZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0dXBBdXRvUmVzdG9yZSgpO1xuICAgICAgdGhpcy5pbml0aWFsaXplQXV0b3NhdmUoKTtcbiAgICAgIHRoaXMuc2V0dXBCZWZvcmVVbmxvYWRXYXJuaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWcnXSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplQ29tcG9uZW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgY29tcG9uZW50IHN0YXRlXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVDb21wb25lbnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykgcmV0dXJuO1xuXG4gICAgdGhpcy5zaGVldHMgPSBbLi4udGhpcy5jb25maWcuc2hlZXRzXTtcbiAgICB0aGlzLmFjdGl2ZVNoZWV0SW5kZXggPSB0aGlzLmNvbmZpZy5pbml0aWFsQWN0aXZlU2hlZXRJbmRleCB8fCAwO1xuICAgIFxuICAgIGlmICghdGhpcy5zdGF0ZSkge1xuICAgICAgdGhpcy5pbnRlcm5hbFN0YXRlID0gbmV3IFdvcmtib29rU3RhdGUoe1xuICAgICAgICBpZDogdGhpcy5jb25maWcuaWQsXG4gICAgICAgIG5hbWU6IHRoaXMuY29uZmlnLm5hbWUsXG4gICAgICAgIGluaXRpYWxBY3RpdmVTaGVldEluZGV4OiB0aGlzLmFjdGl2ZVNoZWV0SW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVmlzaWJsZVdvcmtib29rQWN0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlQWN0aXZlU2hlZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIHN0YXRlIChleHRlcm5hbCBvciBpbnRlcm5hbClcbiAgICovXG4gIGdldCBhY3RpdmVTdGF0ZSgpOiBXb3JrYm9va1N0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSB8fCB0aGlzLmludGVybmFsU3RhdGUhO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0YWIgY2hhbmdlIGV2ZW50IGZyb20gbmlsZS10YWItZ3JvdXBcbiAgICovXG4gIG9uVGFiQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdJbmRleCA9IGV2ZW50LmRldGFpbD8uaW5kZXggPz8gZXZlbnQ7XG4gICAgXG4gICAgLy8gSWdub3JlIGlmIGNsaWNrZWQgb24gdG9vbGJhciB0YWJcbiAgICBpZiAobmV3SW5kZXggPj0gdGhpcy5zaGVldHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmVTaGVldEluZGV4ID0gbmV3SW5kZXg7XG4gICAgdGhpcy5hY3RpdmVTdGF0ZS5zZXRBY3RpdmVTaGVldEluZGV4KG5ld0luZGV4KTtcbiAgICB0aGlzLnVwZGF0ZUFjdGl2ZVNoZWV0KCk7XG4gICAgdGhpcy5zaGVldENoYW5nZWQuZW1pdCh0aGlzLmFjdGl2ZVNoZWV0SW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhY3RpdmUgc2hlZXQgZGF0YSAodHJpZ2dlcnMgdGFibGUgcmUtaW5pdGlhbGl6YXRpb24gd2l0aCBuZXcgY29uZmlnL3N0YXRlKVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVBY3RpdmVTaGVldCgpOiB2b2lkIHtcbiAgICBjb25zdCBzaGVldCA9IHRoaXMuc2hlZXRzW3RoaXMuYWN0aXZlU2hlZXRJbmRleF07XG4gICAgaWYgKCFzaGVldCkgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggVGFibGVTdGF0ZSBmb3IgdGhpcyBzaGVldCAobGF6eSBpbml0aWFsaXphdGlvbilcbiAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIHRhYmxlIHJlaW5pdGlhbGl6ZXMgd2l0aCBuZXcgY29uZmlnIGFuZCBzdGF0ZVxuICAgIGNvbnN0IHRhYmxlU3RhdGUgPSBuZXcgVGFibGVTdGF0ZShcbiAgICAgIHNoZWV0LnRhYmxlQ29uZmlnLmNvbHVtbnMsXG4gICAgICB7XG4gICAgICAgIGluaXRpYWxQYWdlOiBzaGVldC50YWJsZUNvbmZpZy5pbml0aWFsU3RhdGU/LnBhZ2UgfHwgMSxcbiAgICAgICAgcGFnZVNpemU6IHNoZWV0LnRhYmxlQ29uZmlnLnBhZ2luYXRpb24/LnBhZ2VTaXplIHx8IDI1XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSBjdXJyZW50IHRhYmxlIHByb3BlcnRpZXMgKHRyaWdnZXJzIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbilcbiAgICAvLyBUaGUgc3QtdGFibGUgY29tcG9uZW50IHdpbGwgZGV0ZWN0IHRoZXNlIGNoYW5nZXMgYW5kIHJlaW5pdGlhbGl6ZVxuICAgIHRoaXMuY3VycmVudFRhYmxlQ29uZmlnID0geyAuLi5zaGVldC50YWJsZUNvbmZpZyB9O1xuICAgIHRoaXMuY3VycmVudFRhYmxlRGF0YSA9IHRoaXMuc2hlZXRzRGF0YS5nZXRWYWx1ZSgpPy5nZXQoc2hlZXQuaWQpIHx8IFtdO1xuICAgIHRoaXMuY3VycmVudFRhYmxlU3RhdGUgPSB0YWJsZVN0YXRlO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBjb21wb25lbnQga2V5IHRvIGZvcmNlIERPTSByZS1jcmVhdGlvbiAodHJ1ZSBsYXp5IGxvYWRpbmcpXG4gICAgLy8gVGhpcyBlbnN1cmVzIGNvbXBsZXRlIHJlaW5pdGlhbGl6YXRpb24gb2Ygc3QtdGFibGUgY29tcG9uZW50XG4gICAgdGhpcy50YWJsZUNvbXBvbmVudEtleSA9IGAke3NoZWV0LmlkfS0ke0RhdGUubm93KCl9YDtcblxuICAgIC8vIFN0b3JlIHRoZSB0YWJsZSBzdGF0ZSBpbiB3b3JrYm9vayBzdGF0ZSBmb3IgcGVyc2lzdGVuY2VcbiAgICB0aGlzLmFjdGl2ZVN0YXRlLnNldFNoZWV0VGFibGVTdGF0ZShzaGVldC5pZCwgdGFibGVTdGF0ZSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbmV3IHNoZWV0XG4gICAqL1xuICBvbkFkZFNoZWV0KCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU2hlZXQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNhbiBhZGQgbW9yZSBzaGVldHNcbiAgICovXG4gIGdldCBjYW5BZGRTaGVldCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGlzcGxheT8uYWxsb3dBZGRTaGVldCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnLmRpc3BsYXk/Lm1heFNoZWV0cykge1xuICAgICAgcmV0dXJuIHRoaXMuc2hlZXRzLmxlbmd0aCA8IHRoaXMuY29uZmlnLmRpc3BsYXkubWF4U2hlZXRzO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWluaW11bSBzaGVldHMgcmVxdWlyZWRcbiAgICovXG4gIGdldCBtaW5TaGVldHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGlzcGxheT8ubWluU2hlZXRzIHx8IDE7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0YWIgYWN0aW9ucyBkcm9wZG93blxuICAgKi9cbiAgb3BlblRhYkFjdGlvbnMoZXZlbnQ6IE1vdXNlRXZlbnQsIHNoZWV0OiBXb3JrYm9va1NoZWV0Q29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgXG4gICAgdGhpcy5zZWxlY3RlZFNoZWV0ID0gc2hlZXQ7XG4gICAgdGhpcy5zZWxlY3RlZFNoZWV0SW5kZXggPSBpbmRleDtcbiAgICB0aGlzLnRhYkFjdGlvbnNPcGVuID0gdHJ1ZTtcblxuICAgIC8vIFBvc2l0aW9uIGRyb3Bkb3duXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMudGFiQWN0aW9uc1Bvc2l0aW9uID0ge1xuICAgICAgdG9wOiBgJHtyZWN0LmJvdHRvbSArIDR9cHhgLFxuICAgICAgbGVmdDogYCR7cmVjdC5sZWZ0fXB4YFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGFiIGFjdGlvbnMgZHJvcGRvd25cbiAgICovXG4gIGNsb3NlVGFiQWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnRhYkFjdGlvbnNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZFNoZWV0ID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkU2hlZXRJbmRleCA9IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHNoZWV0IGhhcyB0YWIgYWN0aW9uc1xuICAgKi9cbiAgaGFzVGFiQWN0aW9ucyhzaGVldDogV29ya2Jvb2tTaGVldENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShzaGVldC50YWJBY3Rpb25zICYmIHNoZWV0LnRhYkFjdGlvbnMubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRhYiBhY3Rpb24gY2xpY2tcbiAgICovXG4gIG9uVGFiQWN0aW9uQ2xpY2soYWN0aW9uOiBhbnksIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkU2hlZXQpIHJldHVybjtcblxuICAgIHRoaXMuc2hlZXRUYWJBY3Rpb24uZW1pdCh7XG4gICAgICBhY3Rpb24sXG4gICAgICBzaGVldElkOiB0aGlzLnNlbGVjdGVkU2hlZXQuaWRcbiAgICB9KTtcblxuICAgIHRoaXMuY2xvc2VUYWJBY3Rpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHdvcmtib29rIGFjdGlvbnMgZHJvcGRvd25cbiAgICovXG4gIHRvZ2dsZVdvcmtib29rQWN0aW9ucyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIFxuICAgIHRoaXMud29ya2Jvb2tBY3Rpb25zT3BlbiA9ICF0aGlzLndvcmtib29rQWN0aW9uc09wZW47XG5cbiAgICBpZiAodGhpcy53b3JrYm9va0FjdGlvbnNPcGVuKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMud29ya2Jvb2tBY3Rpb25zUG9zaXRpb24gPSB7XG4gICAgICAgIHRvcDogYCR7cmVjdC5ib3R0b20gKyA0fXB4YCxcbiAgICAgICAgcmlnaHQ6IGAke3dpbmRvdy5pbm5lcldpZHRoIC0gcmVjdC5yaWdodH1weGBcbiAgICAgIH07XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2Ugd29ya2Jvb2sgYWN0aW9ucyBkcm9wZG93blxuICAgKi9cbiAgY2xvc2VXb3JrYm9va0FjdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy53b3JrYm9va0FjdGlvbnNPcGVuID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHZpc2libGUgd29ya2Jvb2sgYWN0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlV29ya2Jvb2tBY3Rpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcud29ya2Jvb2tBY3Rpb25zKSB7XG4gICAgICB0aGlzLnZpc2libGVXb3JrYm9va0FjdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnZpc2libGVXb3JrYm9va0FjdGlvbnMgPSB0aGlzLmNvbmZpZy53b3JrYm9va0FjdGlvbnMuZmlsdGVyKGFjdGlvbiA9PiB7XG4gICAgICBpZiAodHlwZW9mIGFjdGlvbi5oaWRkZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICFhY3Rpb24uaGlkZGVuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gIWFjdGlvbi5oaWRkZW47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgd29ya2Jvb2sgYWN0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBpc0FjdGlvbkRpc2FibGVkKGFjdGlvbjogV29ya2Jvb2tBY3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGFjdGlvbi5kaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGFjdGlvbi5kaXNhYmxlZCgpO1xuICAgIH1cbiAgICByZXR1cm4gYWN0aW9uLmRpc2FibGVkIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB3b3JrYm9vayBhY3Rpb24gY2xpY2tcbiAgICovXG4gIG9uV29ya2Jvb2tBY3Rpb25DbGljayhhY3Rpb246IFdvcmtib29rQWN0aW9uLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmICh0aGlzLmlzQWN0aW9uRGlzYWJsZWQoYWN0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMud29ya2Jvb2tBY3Rpb24uZW1pdCh7XG4gICAgICBhY3Rpb24sXG4gICAgICB3b3JrYm9va0lkOiB0aGlzLmNvbmZpZy5pZFxuICAgIH0pO1xuXG4gICAgdGhpcy5jbG9zZVdvcmtib29rQWN0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBmdWxsc2NyZWVuIG1vZGVcbiAgICovXG4gIHRvZ2dsZUZ1bGxzY3JlZW4oKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuaXNGdWxsc2NyZWVuJC52YWx1ZTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9ICFjdXJyZW50O1xuICAgIFxuICAgIHRoaXMuaXNGdWxsc2NyZWVuJC5uZXh0KG5ld1ZhbHVlKTtcbiAgICB0aGlzLmZ1bGxzY3JlZW5Ub2dnbGUuZW1pdChuZXdWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNlbGwgY2hhbmdlIGZyb20gdGFibGUgLSB1cGRhdGUgaW50ZXJuYWwgZGF0YSBhbmQgcGFzcyB0aHJvdWdoIHRvIHBhcmVudFxuICAgKi9cbiAgb25DZWxsQ2hhbmdlKGV2ZW50OiBDZWxsQ2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkU2hlZXQgPSB0aGlzLnNoZWV0c1t0aGlzLmFjdGl2ZVNoZWV0SW5kZXhdO1xuICAgIFxuICAgIC8vIFVwZGF0ZSB0aGUgaW50ZXJuYWwgc2hlZXRzRGF0YSB3aXRoIHRoZSBuZXcgY2VsbCB2YWx1ZVxuICAgIGlmICh0aGlzLnNlbGVjdGVkU2hlZXQgJiYgZXZlbnQucm93RGF0YSAmJiBldmVudC5jb2x1bW5LZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudERhdGEgPSB0aGlzLnNoZWV0c0RhdGEuZ2V0VmFsdWUoKTtcbiAgICAgIGNvbnN0IHNoZWV0RGF0YSA9IGN1cnJlbnREYXRhLmdldCh0aGlzLnNlbGVjdGVkU2hlZXQuaWQpO1xuICAgICAgXG4gICAgICBpZiAoc2hlZXREYXRhICYmIGV2ZW50LnJvd0luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzcGVjaWZpYyByb3cncyBjb2x1bW4gdmFsdWVcbiAgICAgICAgY29uc3QgdXBkYXRlZFJvdyA9IHsgLi4uc2hlZXREYXRhW2V2ZW50LnJvd0luZGV4XSB9O1xuICAgICAgICB1cGRhdGVkUm93W2V2ZW50LmNvbHVtbktleV0gPSBldmVudC5uZXdWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBhcnJheSB3aXRoIHRoZSB1cGRhdGVkIHJvd1xuICAgICAgICBjb25zdCB1cGRhdGVkU2hlZXREYXRhID0gWy4uLnNoZWV0RGF0YV07XG4gICAgICAgIHVwZGF0ZWRTaGVldERhdGFbZXZlbnQucm93SW5kZXhdID0gdXBkYXRlZFJvdztcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNYXAgd2l0aCB0aGUgdXBkYXRlZCBzaGVldCBkYXRhXG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gbmV3IE1hcChjdXJyZW50RGF0YSk7XG4gICAgICAgIHVwZGF0ZWREYXRhLnNldCh0aGlzLnNlbGVjdGVkU2hlZXQuaWQsIHVwZGF0ZWRTaGVldERhdGEpO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBCZWhhdmlvclN1YmplY3Qgd2l0aCBuZXcgcmVmZXJlbmNlXG4gICAgICAgIHRoaXMuc2hlZXRzRGF0YS5uZXh0KHVwZGF0ZWREYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRW1pdCB0byBwYXJlbnRcbiAgICB0aGlzLmNlbGxDaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNlbGwgc2F2ZSBmcm9tIHRhYmxlIC0gdXBkYXRlIGludGVybmFsIGRhdGEgYW5kIHBhc3MgdGhyb3VnaCB0byBwYXJlbnRcbiAgICovXG4gIG9uQ2VsbFNhdmUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgaW50ZXJuYWwgc2hlZXRzRGF0YSB3aXRoIHRoZSBuZXcgY2VsbCB2YWx1ZVxuICAgIGlmICh0aGlzLnNlbGVjdGVkU2hlZXQgJiYgZXZlbnQucm93RGF0YSAmJiBldmVudC5jb2x1bW5LZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudERhdGEgPSB0aGlzLnNoZWV0c0RhdGEuZ2V0VmFsdWUoKTtcbiAgICAgIGNvbnN0IHNoZWV0RGF0YSA9IGN1cnJlbnREYXRhLmdldCh0aGlzLnNlbGVjdGVkU2hlZXQuaWQpO1xuICAgICAgXG4gICAgICBpZiAoc2hlZXREYXRhICYmIGV2ZW50LnJvd0luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzcGVjaWZpYyByb3cncyBjb2x1bW4gdmFsdWVcbiAgICAgICAgY29uc3QgdXBkYXRlZFJvdyA9IHsgLi4uc2hlZXREYXRhW2V2ZW50LnJvd0luZGV4XSB9O1xuICAgICAgICB1cGRhdGVkUm93W2V2ZW50LmNvbHVtbktleV0gPSBldmVudC5uZXdWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBhcnJheSB3aXRoIHRoZSB1cGRhdGVkIHJvd1xuICAgICAgICBjb25zdCB1cGRhdGVkU2hlZXREYXRhID0gWy4uLnNoZWV0RGF0YV07XG4gICAgICAgIHVwZGF0ZWRTaGVldERhdGFbZXZlbnQucm93SW5kZXhdID0gdXBkYXRlZFJvdztcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNYXAgd2l0aCB0aGUgdXBkYXRlZCBzaGVldCBkYXRhXG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gbmV3IE1hcChjdXJyZW50RGF0YSk7XG4gICAgICAgIHVwZGF0ZWREYXRhLnNldCh0aGlzLnNlbGVjdGVkU2hlZXQuaWQsIHVwZGF0ZWRTaGVldERhdGEpO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBCZWhhdmlvclN1YmplY3Qgd2l0aCBuZXcgcmVmZXJlbmNlXG4gICAgICAgIHRoaXMuc2hlZXRzRGF0YS5uZXh0KHVwZGF0ZWREYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRW1pdCB0byBwYXJlbnRcbiAgICB0aGlzLmNlbGxTYXZlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0YWJsZSBzdGF0ZSBjaGFuZ2UgLSBwYXNzIHRocm91Z2ggdG8gcGFyZW50XG4gICAqL1xuICBvblRhYmxlU3RhdGVDaGFuZ2UoZXZlbnQ6IFRhYmxlU3RhdGVDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMudGFibGVTdGF0ZUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgY2xlYW51cFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuXG4gICAgLy8gQ2xlYXIgYXV0b3NhdmUgZGF0YSBvbiBkZXN0cm95XG4gICAgaWYgKHRoaXMuYXV0b3NhdmVFbmFibGVkKSB7XG4gICAgICB0aGlzLmF1dG9zYXZlU2VydmljZS5jbGVhcih0aGlzLmNvbmZpZy5pZCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGJlZm9yZXVubG9hZCBoYW5kbGVyXG4gICAgaWYgKHRoaXMuYmVmb3JlVW5sb2FkSGFuZGxlcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuYmVmb3JlVW5sb2FkSGFuZGxlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYXV0b3NhdmUgc3Vic2NyaXB0aW9uXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVBdXRvc2F2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFuZ2VFdmVudHMkID0gbWVyZ2UoXG4gICAgICB0aGlzLmNlbGxDaGFuZ2UsXG4gICAgICB0aGlzLmNlbGxTYXZlLFxuICAgICAgdGhpcy50YWJsZVN0YXRlQ2hhbmdlLFxuICAgICAgdGhpcy5zaGVldFRhYkFjdGlvblxuICAgICk7XG5cbiAgICBjb25zdCBhdXRvc2F2ZSQgPSB0aGlzLmF1dG9zYXZlU3RyYXRlZ3kgPT09ICdsYXp5J1xuICAgICAgPyBjaGFuZ2VFdmVudHMkLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMuYXV0b3NhdmVTZXJ2aWNlLnNldERpcnR5KHRoaXMuY29uZmlnLmlkLCB0cnVlKSksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDIwMDApLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgOiBjaGFuZ2VFdmVudHMkLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMuYXV0b3NhdmVTZXJ2aWNlLnNldERpcnR5KHRoaXMuY29uZmlnLmlkLCB0cnVlKSksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMClcbiAgICAgICAgKTtcblxuICAgIGF1dG9zYXZlJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5wZXJmb3JtQXV0b3NhdmUoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhdXRvc2F2ZSBvcGVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgcGVyZm9ybUF1dG9zYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xuXG4gICAgY29uc3QgYXV0b3NhdmVEYXRhOiBBdXRvc2F2ZURhdGEgPSB7XG4gICAgICB3b3JrYm9va0NvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICB3b3JrYm9va1N0YXRlOiB0aGlzLmFjdGl2ZVN0YXRlLmdldFNuYXBzaG90KCksXG4gICAgICBzaGVldHNEYXRhOiBuZXcgTWFwKHRoaXMuc2hlZXRzRGF0YS5nZXRWYWx1ZSgpKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxuICAgIH07XG5cbiAgICB0aGlzLmF1dG9zYXZlU2VydmljZS5zYXZlKHRoaXMuY29uZmlnLmlkLCBhdXRvc2F2ZURhdGEpO1xuICAgIHRoaXMubGFzdFNhdmVUaW1lID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XG4gICAgdGhpcy5hdXRvc2F2ZVNlcnZpY2Uuc2V0RGlydHkodGhpcy5jb25maWcuaWQsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCBhdXRvLXJlc3RvcmUgZnJvbSBhdXRvc2F2ZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEF1dG9SZXN0b3JlKCk6IHZvaWQge1xuICAgIGNvbnN0IGF1dG9zYXZlZCA9IHRoaXMuYXV0b3NhdmVTZXJ2aWNlLmdldCh0aGlzLmNvbmZpZy5pZCk7XG5cbiAgICBpZiAoYXV0b3NhdmVkKSB7XG4gICAgICAvLyBSZXN0b3JlIGNvbmZpZ1xuICAgICAgdGhpcy5jb25maWcgPSBhdXRvc2F2ZWQud29ya2Jvb2tDb25maWc7XG5cbiAgICAgIC8vIFJlc3RvcmUgc2hlZXRzIGRhdGFcbiAgICAgIHRoaXMuc2hlZXRzRGF0YS5uZXh0KGF1dG9zYXZlZC5zaGVldHNEYXRhKTtcblxuICAgICAgLy8gTm90ZTogV29ya2Jvb2sgc3RhdGUgcmVzdG9yYXRpb24gaXMgaGFuZGxlZCBpbnRlcm5hbGx5XG4gICAgICAvLyBJZiBleHRlcm5hbCBzdGF0ZSBtYW5hZ2VtZW50IGlzIHVzZWQsIHBhcmVudCBjb21wb25lbnQgc2hvdWxkIGhhbmRsZSBpdFxuXG4gICAgICB0aGlzLmxhc3RTYXZlVGltZSA9IGF1dG9zYXZlZC50aW1lc3RhbXA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIGJlZm9yZXVubG9hZCB3YXJuaW5nIGZvciB1bnNhdmVkIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBCZWZvcmVVbmxvYWRXYXJuaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlVW5sb2FkSGFuZGxlciA9IChldmVudDogQmVmb3JlVW5sb2FkRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmF1dG9zYXZlU2VydmljZS5pc0RpcnR5KHRoaXMuY29uZmlnLmlkKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9ICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsZWF2ZT8nO1xuICAgICAgICByZXR1cm4gZXZlbnQucmV0dXJuVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgdGhpcy5iZWZvcmVVbmxvYWRIYW5kbGVyKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwid29ya2Jvb2stY29udGFpbmVyXCIgW2NsYXNzLmZ1bGxzY3JlZW5dPVwiaXNGdWxsc2NyZWVuJCB8IGFzeW5jXCI+XG4gIDxuaWxlLXRhYi1ncm91cCBbYWN0aXZlSW5kZXhdPVwiYWN0aXZlU2hlZXRJbmRleFwiPlxuICAgIFxuICAgIDwhLS0gU2hlZXQgVGFicyAob25lIHBlciBzaGVldCkgLS0+XG4gICAgPG5pbGUtdGFiICpuZ0Zvcj1cImxldCBzaGVldCBvZiBzaGVldHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICBzbG90PVwibmF2XCIgXG4gICAgICAgICAgICAgIHBhbmVsPVwic2hhcmVkLXBhbmVsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBhY3RpdmVTaGVldEluZGV4XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGkpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2hlZXQtdGFiLWNvbnRlbnRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzaGVldC1uYW1lXCI+e3sgc2hlZXQubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgXG4gICAgICAgIDwhLS0gVGFiIGFjdGlvbnMgZHJvcGRvd24gYnV0dG9uIC0tPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGFiLWFjdGlvbnMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblRhYkFjdGlvbnMoJGV2ZW50LCBzaGVldCwgaSlcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaGFzVGFiQWN0aW9ucyhzaGVldClcIj5cbiAgICAgICAgICA8bmlsZS1pY29uIG5hbWU9XCJhcnJvd2Rvd25cIiBzaXplPVwiMTRcIj48L25pbGUtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25pbGUtdGFiPlxuICAgIFxuICAgIDwhLS0gVG9vbGJhciBUYWIgKGZvciB3b3JrYm9vayBjb250cm9scykgLS0+XG4gICAgPG5pbGUtdGFiIHNsb3Q9XCJuYXZcIiBcbiAgICAgICAgICAgICAgcGFuZWw9XCJzaGFyZWQtcGFuZWxcIlxuICAgICAgICAgICAgICBjbGFzcz1cIndvcmtib29rLXRvb2xiYXItdGFiXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3b3JrYm9vay10b29sYmFyLWNvbnRlbnRcIj5cbiAgICAgICAgPCEtLSBBdXRvc2F2ZSBJbmRpY2F0b3IgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdXRvc2F2ZS1pbmRpY2F0b3JcIiAqbmdJZj1cImF1dG9zYXZlRW5hYmxlZFwiPlxuICAgICAgICAgIDxuaWxlLWljb24gXG4gICAgICAgICAgICAqbmdJZj1cIiFpc1NhdmluZyAmJiBsYXN0U2F2ZVRpbWVcIiBcbiAgICAgICAgICAgIG5hbWU9XCJzYXZlXCIgXG4gICAgICAgICAgICBzaXplPVwiMTRcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidTYXZlZCBhdCAnICsgKGxhc3RTYXZlVGltZSB8IGRhdGU6J0hIOm1tOnNzJylcIj5cbiAgICAgICAgICA8L25pbGUtaWNvbj5cbiAgICAgICAgICA8bmlsZS1pY29uIFxuICAgICAgICAgICAgKm5nSWY9XCJpc1NhdmluZ1wiIFxuICAgICAgICAgICAgbmFtZT1cImxvYWRlclwiIFxuICAgICAgICAgICAgc2l6ZT1cIjE0XCJcbiAgICAgICAgICAgIHRpdGxlPVwiU2F2aW5nLi4uXCI+XG4gICAgICAgICAgPC9uaWxlLWljb24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gV29ya2Jvb2sgQWN0aW9ucyBEcm9wZG93biAtLT5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIndvcmtib29rLWFjdGlvbnMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbmZpZy53b3JrYm9va0FjdGlvbnMgJiYgY29uZmlnLndvcmtib29rQWN0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlV29ya2Jvb2tBY3Rpb25zKCRldmVudClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiV29ya2Jvb2sgQWN0aW9uc1wiPlxuICAgICAgICAgIDxuaWxlLWljb24gbmFtZT1cInNldHRpbmdzXCI+PC9uaWxlLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICBcbiAgICAgICAgPCEtLSBBZGQgU2hlZXQgQnV0dG9uIC0tPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWRkLXNoZWV0LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjYW5BZGRTaGVldFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkU2hlZXQoKVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJBZGQgU2hlZXRcIj5cbiAgICAgICAgICA8bmlsZS1pY29uIG5hbWU9XCJwbHVzXCI+PC9uaWxlLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICBcbiAgICAgICAgPCEtLSBGdWxsc2NyZWVuIEJ1dHRvbiAtLT5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZ1bGxzY3JlZW4tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbmZpZy5kaXNwbGF5Py5hbGxvd0Z1bGxzY3JlZW4gIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbHNjcmVlbigpXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGlzRnVsbHNjcmVlbiQgfCBhc3luYykgPyAnRXhpdCBGdWxsc2NyZWVuJyA6ICdGdWxsc2NyZWVuJ1wiPlxuICAgICAgICAgIDxuaWxlLWljb24gW25hbWVdPVwiKGlzRnVsbHNjcmVlbiQgfCBhc3luYykgPyAnY29sbGFwc2UnIDogJ2V4cGFuZC0wNidcIj48L25pbGUtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25pbGUtdGFiPlxuICAgIFxuICAgIDwhLS0gU2luZ2xlIFNoYXJlZCBUYWIgUGFuZWwgLS0+XG4gICAgPG5pbGUtdGFiLXBhbmVsIG5hbWU9XCJzaGFyZWQtcGFuZWxcIj5cbiAgICAgIDwhLS0gTGF6eSBsb2FkaW5nIHN0cmF0ZWd5OiB0YWJsZSBpcyBkZXN0cm95ZWQgYW5kIHJlY3JlYXRlZCB3aXRoIG5ldyBjb25maWcvc3RhdGUgd2hlbiBzaGVldCBjaGFuZ2VzIC0tPlxuICAgICAgPCEtLSBUaGUgY29tcG9uZW50S2V5IGVuc3VyZXMgY29tcGxldGUgcmVpbml0aWFsaXphdGlvbiBvZiBzdC10YWJsZSBmb3IgZWFjaCBzaGVldCAtLT5cbiAgICAgIDxzdC10YWJsZSAqbmdJZj1cImN1cnJlbnRUYWJsZUNvbmZpZyAmJiBjdXJyZW50VGFibGVTdGF0ZSAmJiB0YWJsZUNvbXBvbmVudEtleVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1zaGVldC1rZXldPVwidGFibGVDb21wb25lbnRLZXlcIlxuICAgICAgICAgICAgICAgIFt0YWJsZUNvbmZpZ109XCJjdXJyZW50VGFibGVDb25maWdcIlxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImN1cnJlbnRUYWJsZURhdGFcIlxuICAgICAgICAgICAgICAgIFt0YWJsZVN0YXRlXT1cImN1cnJlbnRUYWJsZVN0YXRlXCJcbiAgICAgICAgICAgICAgICAoY2VsbENoYW5nZSk9XCJvbkNlbGxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNlbGxTYXZlKT1cIm9uQ2VsbFNhdmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHN0YXRlQ2hhbmdlKT1cIm9uVGFibGVTdGF0ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8L3N0LXRhYmxlPlxuICAgIDwvbmlsZS10YWItcGFuZWw+XG4gICAgXG4gIDwvbmlsZS10YWItZ3JvdXA+XG48L2Rpdj5cblxuPCEtLSBUYWIgQWN0aW9ucyBEcm9wZG93biAtLT5cbjxkaXYgY2xhc3M9XCJ0YWItYWN0aW9ucy1kcm9wZG93blwiIFxuICAgICAqbmdJZj1cInRhYkFjdGlvbnNPcGVuXCJcbiAgICAgW25nU3R5bGVdPVwidGFiQWN0aW9uc1Bvc2l0aW9uXCI+XG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1iYWNrZHJvcFwiIChjbGljayk9XCJjbG9zZVRhYkFjdGlvbnMoKVwiPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgIDxuaWxlLW1lbnU+XG4gICAgICA8bmlsZS1tZW51LWl0ZW0gKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBzZWxlY3RlZFNoZWV0Py50YWJBY3Rpb25zXCIgXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVGFiQWN0aW9uQ2xpY2soYWN0aW9uLCAkZXZlbnQpXCI+XG4gICAgICAgIDxuaWxlLWljb24gKm5nSWY9XCJhY3Rpb24uaWNvblwiIHNsb3Q9XCJwcmVmaXhcIiBzaXplPVwiMTRcIiBbbmFtZV09XCJhY3Rpb24uaWNvblwiPjwvbmlsZS1pY29uPlxuICAgICAgICB7eyBhY3Rpb24ubGFiZWwgfX1cbiAgICAgIDwvbmlsZS1tZW51LWl0ZW0+XG4gICAgPC9uaWxlLW1lbnU+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gV29ya2Jvb2sgQWN0aW9ucyBEcm9wZG93biAtLT5cbjxkaXYgY2xhc3M9XCJ3b3JrYm9vay1hY3Rpb25zLWRyb3Bkb3duXCJcbiAgICAgKm5nSWY9XCJ3b3JrYm9va0FjdGlvbnNPcGVuXCJcbiAgICAgW25nU3R5bGVdPVwid29ya2Jvb2tBY3Rpb25zUG9zaXRpb25cIj5cbiAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlV29ya2Jvb2tBY3Rpb25zKClcIj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICA8bmlsZS1tZW51PlxuICAgICAgPG5pbGUtbWVudS1pdGVtICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgdmlzaWJsZVdvcmtib29rQWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzQWN0aW9uRGlzYWJsZWQoYWN0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uV29ya2Jvb2tBY3Rpb25DbGljayhhY3Rpb24sICRldmVudClcIj5cbiAgICAgICAgPG5pbGUtaWNvbiAqbmdJZj1cImFjdGlvbi5pY29uXCIgc2xvdD1cInByZWZpeFwiIHNpemU9XCIxNFwiIFtuYW1lXT1cImFjdGlvbi5pY29uXCI+PC9uaWxlLWljb24+XG4gICAgICAgIHt7IGFjdGlvbi5sYWJlbCB9fVxuICAgICAgPC9uaWxlLW1lbnUtaXRlbT5cbiAgICA8L25pbGUtbWVudT5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBGdWxsc2NyZWVuIEJhY2tkcm9wIC0tPlxuPGRpdiBjbGFzcz1cImZ1bGxzY3JlZW4tYmFja2Ryb3BcIiBcbiAgICAgKm5nSWY9XCJpc0Z1bGxzY3JlZW4kIHwgYXN5bmNcIlxuICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbHNjcmVlbigpXCI+XG48L2Rpdj5cblxuIl19
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Directive, EventEmitter, HostListener, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class ClickOutsideDirective {
|
|
4
|
+
constructor(el) {
|
|
5
|
+
this.el = el;
|
|
6
|
+
this.clickOutside = new EventEmitter();
|
|
7
|
+
}
|
|
8
|
+
onClick(target) {
|
|
9
|
+
const clickedInside = this.el.nativeElement.contains(target);
|
|
10
|
+
if (!clickedInside) {
|
|
11
|
+
this.clickOutside.emit();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
ClickOutsideDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ClickOutsideDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
16
|
+
ClickOutsideDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.4.0", type: ClickOutsideDirective, selector: "[clickOutside]", outputs: { clickOutside: "clickOutside" }, host: { listeners: { "document:click": "onClick($event.target)" } }, ngImport: i0 });
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ClickOutsideDirective, decorators: [{
|
|
18
|
+
type: Directive,
|
|
19
|
+
args: [{
|
|
20
|
+
selector: '[clickOutside]'
|
|
21
|
+
}]
|
|
22
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { clickOutside: [{
|
|
23
|
+
type: Output
|
|
24
|
+
}], onClick: [{
|
|
25
|
+
type: HostListener,
|
|
26
|
+
args: ['document:click', ['$event.target']]
|
|
27
|
+
}] } });
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpY2stb3V0c2lkZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2RpcmVjdGl2ZXMvY2xpY2stb3V0c2lkZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLMUYsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUZ4QixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFYixDQUFDO0lBR3RDLE9BQU8sQ0FBQyxNQUFtQjtRQUN6QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzs7a0hBWFUscUJBQXFCO3NHQUFyQixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2lCQUMzQjtpR0FFVyxZQUFZO3NCQUFyQixNQUFNO2dCQUtQLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY2xpY2tPdXRzaWRlXSdcbn0pXG5leHBvcnQgY2xhc3MgQ2xpY2tPdXRzaWRlRGlyZWN0aXZlIHtcbiAgQE91dHB1dCgpIGNsaWNrT3V0c2lkZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG4gIFxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICBvbkNsaWNrKHRhcmdldDogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCk7XG4gICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XG4gICAgICB0aGlzLmNsaWNrT3V0c2lkZS5lbWl0KCk7XG4gICAgfVxuICB9XG59XG5cbiJdfQ==
|