@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,87 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Pagination component that wraps nile-pagination web component
|
|
5
|
+
* Handles conversion between internal 0-indexed pages and nile-pagination's 1-indexed pages
|
|
6
|
+
*/
|
|
7
|
+
export class StPaginationComponent {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.position = 'bottom';
|
|
10
|
+
this.paginationState = {
|
|
11
|
+
currentPage: 0,
|
|
12
|
+
pageSize: 25,
|
|
13
|
+
totalItems: 0,
|
|
14
|
+
totalPages: 0
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
ngOnInit() {
|
|
18
|
+
if (!this.tableState) {
|
|
19
|
+
throw new Error('tableState is required for st-pagination component');
|
|
20
|
+
}
|
|
21
|
+
if (!this.tableConfig) {
|
|
22
|
+
throw new Error('tableConfig is required for st-pagination component');
|
|
23
|
+
}
|
|
24
|
+
// Initialize with current state
|
|
25
|
+
this.paginationState = this.tableState.getPagination();
|
|
26
|
+
// Subscribe to pagination changes
|
|
27
|
+
this.paginationSubscription = this.tableState.paginationChange$
|
|
28
|
+
.subscribe(state => {
|
|
29
|
+
this.paginationState = state;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
ngOnDestroy() {
|
|
33
|
+
this.paginationSubscription?.unsubscribe();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get current page display (1-indexed for nile-pagination)
|
|
37
|
+
*/
|
|
38
|
+
getCurrentPageDisplay() {
|
|
39
|
+
return this.paginationState.currentPage + 1;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get variant from config
|
|
43
|
+
*/
|
|
44
|
+
getVariant() {
|
|
45
|
+
return this.tableConfig.pagination?.variant || 'fluid';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get page size options array for nile-pagination
|
|
49
|
+
*/
|
|
50
|
+
getPageSizeOptions() {
|
|
51
|
+
return this.tableConfig.pagination?.pageSizeOptions || [10, 25, 50, 100];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Handle page change from nile-pagination
|
|
55
|
+
* @param event Custom event from nile-pagination with 1-indexed page number
|
|
56
|
+
*/
|
|
57
|
+
onPageChange(event) {
|
|
58
|
+
const newPage = event.detail;
|
|
59
|
+
if (typeof newPage === 'number') {
|
|
60
|
+
// Convert from 1-indexed to 0-indexed
|
|
61
|
+
this.tableState.setPage(newPage - 1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Handle page size change from nile-pagination
|
|
66
|
+
* @param event Custom event from nile-pagination with new page size
|
|
67
|
+
*/
|
|
68
|
+
onPageSizeChange(event) {
|
|
69
|
+
const newPageSize = event.detail;
|
|
70
|
+
if (typeof newPageSize === 'number') {
|
|
71
|
+
this.tableState.setPageSize(newPageSize);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
StPaginationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
76
|
+
StPaginationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StPaginationComponent, selector: "st-pagination", inputs: { tableState: "tableState", tableConfig: "tableConfig", position: "position" }, ngImport: i0, template: "<nile-pagination\n [totalItems]=\"paginationState.totalItems\"\n [currentPage]=\"getCurrentPageDisplay()\"\n [pageSize]=\"paginationState.pageSize\"\n [variant]=\"getVariant()\"\n [pageSizeOptions]=\"getPageSizeOptions()\"\n (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\">\n</nile-pagination>\n", styles: [":host{display:block;width:100%}nile-pagination{display:block;width:100%}\n"] });
|
|
77
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StPaginationComponent, decorators: [{
|
|
78
|
+
type: Component,
|
|
79
|
+
args: [{ selector: 'st-pagination', template: "<nile-pagination\n [totalItems]=\"paginationState.totalItems\"\n [currentPage]=\"getCurrentPageDisplay()\"\n [pageSize]=\"paginationState.pageSize\"\n [variant]=\"getVariant()\"\n [pageSizeOptions]=\"getPageSizeOptions()\"\n (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\">\n</nile-pagination>\n", styles: [":host{display:block;width:100%}nile-pagination{display:block;width:100%}\n"] }]
|
|
80
|
+
}], propDecorators: { tableState: [{
|
|
81
|
+
type: Input
|
|
82
|
+
}], tableConfig: [{
|
|
83
|
+
type: Input
|
|
84
|
+
}], position: [{
|
|
85
|
+
type: Input
|
|
86
|
+
}] } });
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtcGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2NvbXBvbmVudHMvc3QtcGFnaW5hdGlvbi9zdC1wYWdpbmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1wYWdpbmF0aW9uL3N0LXBhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDOztBQU1wRTs7O0dBR0c7QUFNSCxNQUFNLE9BQU8scUJBQXFCO0lBTGxDO1FBUVcsYUFBUSxHQUFxQixRQUFRLENBQUM7UUFFL0Msb0JBQWUsR0FBb0I7WUFDakMsV0FBVyxFQUFFLENBQUM7WUFDZCxRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxDQUFDO1lBQ2IsVUFBVSxFQUFFLENBQUM7U0FDZCxDQUFDO0tBc0VIO0lBbEVDLFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7U0FDeEU7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXZELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUI7YUFDNUQsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsZUFBZSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxLQUFVO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7WUFDL0Isc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN0QztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBQyxLQUFVO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDakMsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDMUM7SUFDSCxDQUFDOztrSEEvRVUscUJBQXFCO3NHQUFyQixxQkFBcUIsNklDZmxDLHNWQVNBOzJGRE1hLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxlQUFlOzhCQUtoQixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IFRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RhYmxlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUGFnaW5hdGlvblN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXR5cGVzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFBhZ2luYXRpb24gY29tcG9uZW50IHRoYXQgd3JhcHMgbmlsZS1wYWdpbmF0aW9uIHdlYiBjb21wb25lbnRcbiAqIEhhbmRsZXMgY29udmVyc2lvbiBiZXR3ZWVuIGludGVybmFsIDAtaW5kZXhlZCBwYWdlcyBhbmQgbmlsZS1wYWdpbmF0aW9uJ3MgMS1pbmRleGVkIHBhZ2VzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LXBhZ2luYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3QtcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0LXBhZ2luYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdFBhZ2luYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHRhYmxlU3RhdGUhOiBUYWJsZVN0YXRlO1xuICBASW5wdXQoKSB0YWJsZUNvbmZpZyE6IFRhYmxlQ29uZmlnO1xuICBASW5wdXQoKSBwb3NpdGlvbjogJ3RvcCcgfCAnYm90dG9tJyA9ICdib3R0b20nO1xuICBcbiAgcGFnaW5hdGlvblN0YXRlOiBQYWdpbmF0aW9uU3RhdGUgPSB7XG4gICAgY3VycmVudFBhZ2U6IDAsXG4gICAgcGFnZVNpemU6IDI1LFxuICAgIHRvdGFsSXRlbXM6IDAsXG4gICAgdG90YWxQYWdlczogMFxuICB9O1xuICBcbiAgcHJpdmF0ZSBwYWdpbmF0aW9uU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRhYmxlU3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGFibGVTdGF0ZSBpcyByZXF1aXJlZCBmb3Igc3QtcGFnaW5hdGlvbiBjb21wb25lbnQnKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLnRhYmxlQ29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhYmxlQ29uZmlnIGlzIHJlcXVpcmVkIGZvciBzdC1wYWdpbmF0aW9uIGNvbXBvbmVudCcpO1xuICAgIH1cbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHdpdGggY3VycmVudCBzdGF0ZVxuICAgIHRoaXMucGFnaW5hdGlvblN0YXRlID0gdGhpcy50YWJsZVN0YXRlLmdldFBhZ2luYXRpb24oKTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gcGFnaW5hdGlvbiBjaGFuZ2VzXG4gICAgdGhpcy5wYWdpbmF0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy50YWJsZVN0YXRlLnBhZ2luYXRpb25DaGFuZ2UkXG4gICAgICAuc3Vic2NyaWJlKHN0YXRlID0+IHtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU3RhdGUgPSBzdGF0ZTtcbiAgICAgIH0pO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBwYWdlIGRpc3BsYXkgKDEtaW5kZXhlZCBmb3IgbmlsZS1wYWdpbmF0aW9uKVxuICAgKi9cbiAgZ2V0Q3VycmVudFBhZ2VEaXNwbGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvblN0YXRlLmN1cnJlbnRQYWdlICsgMTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB2YXJpYW50IGZyb20gY29uZmlnXG4gICAqL1xuICBnZXRWYXJpYW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVDb25maWcucGFnaW5hdGlvbj8udmFyaWFudCB8fCAnZmx1aWQnO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHBhZ2Ugc2l6ZSBvcHRpb25zIGFycmF5IGZvciBuaWxlLXBhZ2luYXRpb25cbiAgICovXG4gIGdldFBhZ2VTaXplT3B0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zIHx8IFsxMCwgMjUsIDUwLCAxMDBdO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHBhZ2UgY2hhbmdlIGZyb20gbmlsZS1wYWdpbmF0aW9uXG4gICAqIEBwYXJhbSBldmVudCBDdXN0b20gZXZlbnQgZnJvbSBuaWxlLXBhZ2luYXRpb24gd2l0aCAxLWluZGV4ZWQgcGFnZSBudW1iZXJcbiAgICovXG4gIG9uUGFnZUNoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgbmV3UGFnZSA9IGV2ZW50LmRldGFpbDtcbiAgICBpZiAodHlwZW9mIG5ld1BhZ2UgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBDb252ZXJ0IGZyb20gMS1pbmRleGVkIHRvIDAtaW5kZXhlZFxuICAgICAgdGhpcy50YWJsZVN0YXRlLnNldFBhZ2UobmV3UGFnZSAtIDEpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBwYWdlIHNpemUgY2hhbmdlIGZyb20gbmlsZS1wYWdpbmF0aW9uXG4gICAqIEBwYXJhbSBldmVudCBDdXN0b20gZXZlbnQgZnJvbSBuaWxlLXBhZ2luYXRpb24gd2l0aCBuZXcgcGFnZSBzaXplXG4gICAqL1xuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdQYWdlU2l6ZSA9IGV2ZW50LmRldGFpbDtcbiAgICBpZiAodHlwZW9mIG5ld1BhZ2VTaXplID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy50YWJsZVN0YXRlLnNldFBhZ2VTaXplKG5ld1BhZ2VTaXplKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxuaWxlLXBhZ2luYXRpb25cbiAgW3RvdGFsSXRlbXNdPVwicGFnaW5hdGlvblN0YXRlLnRvdGFsSXRlbXNcIlxuICBbY3VycmVudFBhZ2VdPVwiZ2V0Q3VycmVudFBhZ2VEaXNwbGF5KClcIlxuICBbcGFnZVNpemVdPVwicGFnaW5hdGlvblN0YXRlLnBhZ2VTaXplXCJcbiAgW3ZhcmlhbnRdPVwiZ2V0VmFyaWFudCgpXCJcbiAgW3BhZ2VTaXplT3B0aW9uc109XCJnZXRQYWdlU2l6ZU9wdGlvbnMoKVwiXG4gIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPlxuPC9uaWxlLXBhZ2luYXRpb24+XG4iXX0=
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, HostListener, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { TableZIndex } from '../../models/z-index.enum';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class StRowActionsDropdownComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
/**
|
|
8
|
+
* Whether the dropdown is open
|
|
9
|
+
*/
|
|
10
|
+
this.isOpen = false;
|
|
11
|
+
/**
|
|
12
|
+
* Position of the dropdown (x, y coordinates)
|
|
13
|
+
*/
|
|
14
|
+
this.position = { x: 0, y: 0 };
|
|
15
|
+
/**
|
|
16
|
+
* Context containing row data, index, and actions
|
|
17
|
+
*/
|
|
18
|
+
this.context = null;
|
|
19
|
+
/**
|
|
20
|
+
* Emitted when an action is clicked
|
|
21
|
+
*/
|
|
22
|
+
this.actionClicked = new EventEmitter();
|
|
23
|
+
/**
|
|
24
|
+
* Emitted when the dropdown should close
|
|
25
|
+
*/
|
|
26
|
+
this.closed = new EventEmitter();
|
|
27
|
+
/**
|
|
28
|
+
* Visible actions (filtered by hidden property)
|
|
29
|
+
*/
|
|
30
|
+
this.visibleActions = [];
|
|
31
|
+
/**
|
|
32
|
+
* Dropdown positioning style
|
|
33
|
+
*/
|
|
34
|
+
this.dropdownStyle = {};
|
|
35
|
+
}
|
|
36
|
+
ngOnChanges(changes) {
|
|
37
|
+
if (changes['context'] || changes['isOpen']) {
|
|
38
|
+
this.updateVisibleActions();
|
|
39
|
+
}
|
|
40
|
+
if (changes['position'] || changes['isOpen']) {
|
|
41
|
+
this.updateDropdownPosition();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Update visible actions based on hidden property
|
|
46
|
+
*/
|
|
47
|
+
updateVisibleActions() {
|
|
48
|
+
if (!this.context) {
|
|
49
|
+
this.visibleActions = [];
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.visibleActions = this.context.actions.filter(action => {
|
|
53
|
+
if (typeof action.hidden === 'function') {
|
|
54
|
+
return !action.hidden(this.context.rowData, this.context.rowIndex);
|
|
55
|
+
}
|
|
56
|
+
return !action.hidden;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Update dropdown position based on available viewport space
|
|
61
|
+
*/
|
|
62
|
+
updateDropdownPosition() {
|
|
63
|
+
if (!this.isOpen) {
|
|
64
|
+
this.dropdownStyle = {};
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const DROPDOWN_WIDTH = 200; // Approximate width
|
|
68
|
+
const DROPDOWN_HEIGHT = this.visibleActions.length * 40 + 16; // Approximate height
|
|
69
|
+
const viewportWidth = window.innerWidth;
|
|
70
|
+
const viewportHeight = window.innerHeight;
|
|
71
|
+
let left = this.position.x;
|
|
72
|
+
let top = this.position.y;
|
|
73
|
+
// Check if dropdown would overflow right edge
|
|
74
|
+
if (left + DROPDOWN_WIDTH > viewportWidth) {
|
|
75
|
+
left = viewportWidth - DROPDOWN_WIDTH - 10;
|
|
76
|
+
}
|
|
77
|
+
// Check if dropdown would overflow bottom edge
|
|
78
|
+
if (top + DROPDOWN_HEIGHT > viewportHeight) {
|
|
79
|
+
// Position above the trigger
|
|
80
|
+
top = this.position.y - DROPDOWN_HEIGHT;
|
|
81
|
+
}
|
|
82
|
+
// Ensure dropdown doesn't go off-screen on the left
|
|
83
|
+
if (left < 10) {
|
|
84
|
+
left = 10;
|
|
85
|
+
}
|
|
86
|
+
// Ensure dropdown doesn't go off-screen on the top
|
|
87
|
+
if (top < 10) {
|
|
88
|
+
top = 10;
|
|
89
|
+
}
|
|
90
|
+
this.dropdownStyle = {
|
|
91
|
+
position: 'fixed',
|
|
92
|
+
left: `${left}px`,
|
|
93
|
+
top: `${top}px`,
|
|
94
|
+
zIndex: TableZIndex.ROW_ACTIONS_DROPDOWN
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Handle action click
|
|
99
|
+
*/
|
|
100
|
+
onActionClick(action) {
|
|
101
|
+
if (!this.context)
|
|
102
|
+
return;
|
|
103
|
+
// Check if action is disabled
|
|
104
|
+
if (this.isActionDisabled(action)) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const event = {
|
|
108
|
+
action,
|
|
109
|
+
rowData: this.context.rowData,
|
|
110
|
+
rowIndex: this.context.rowIndex
|
|
111
|
+
};
|
|
112
|
+
this.actionClicked.emit(event);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Check if an action is disabled
|
|
116
|
+
*/
|
|
117
|
+
isActionDisabled(action) {
|
|
118
|
+
if (!this.context)
|
|
119
|
+
return true;
|
|
120
|
+
if (typeof action.disabled === 'function') {
|
|
121
|
+
return action.disabled(this.context.rowData, this.context.rowIndex);
|
|
122
|
+
}
|
|
123
|
+
return !!action.disabled;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Handle overlay click (close dropdown)
|
|
127
|
+
*/
|
|
128
|
+
onOverlayClick() {
|
|
129
|
+
this.closed.emit();
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Handle ESC key press
|
|
133
|
+
*/
|
|
134
|
+
onEscapeKey(event) {
|
|
135
|
+
if (this.isOpen) {
|
|
136
|
+
event.preventDefault();
|
|
137
|
+
event.stopPropagation();
|
|
138
|
+
this.closed.emit();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Prevent dropdown click from closing
|
|
143
|
+
*/
|
|
144
|
+
onDropdownClick(event) {
|
|
145
|
+
event.stopPropagation();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
StRowActionsDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StRowActionsDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
149
|
+
StRowActionsDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StRowActionsDropdownComponent, selector: "st-row-actions-dropdown", inputs: { isOpen: "isOpen", position: "position", context: "context" }, outputs: { actionClicked: "actionClicked", closed: "closed" }, host: { listeners: { "document:keydown.escape": "onEscapeKey($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"dropdown-container\" *ngIf=\"isOpen && context\">\n <!-- Backdrop -->\n <div class=\"dropdown-overlay\" (click)=\"closed.emit()\"></div>\n \n <!-- Dropdown menu -->\n <div class=\"dropdown-menu\" [ngStyle]=\"dropdownStyle\">\n <nile-menu *ngIf=\"isOpen\" class=\"dropdown-menu\" [style.left.px]=\"dropdownStyle.left\" [style.top.px]=\"dropdownStyle.top\">\n <ng-container *ngFor=\"let action of visibleActions\">\n <nile-menu-item [class.disabled]=\"isActionDisabled(action)\" (click)=\"onActionClick(action)\" class=\"action-label\">\n <nile-icon *ngIf=\"action.icon\" size=\"14\" slot=\"prefix\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </ng-container>\n \n <nile-menu-item *ngIf=\"visibleActions.length === 0\">No actions available</nile-menu-item>\n </nile-menu>\n </div>\n\n </div>\n", styles: [".dropdown-container{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998}.dropdown-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0000004d;pointer-events:auto;z-index:9998}.dropdown-menu{position:fixed;background-color:#fff;box-shadow:0 5px 15px #0000004d,0 0 0 1px #0000001a;overflow:hidden;pointer-events:auto;z-index:9999}.action-icon{display:flex;align-items:center;justify-content:center;font-size:16px;width:20px;flex-shrink:0}.action-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-empty{padding:16px;text-align:center;color:#a0aec0;font-size:14px;font-style:italic}nile-menu{height:fit-content}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
150
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StRowActionsDropdownComponent, decorators: [{
|
|
151
|
+
type: Component,
|
|
152
|
+
args: [{ selector: 'st-row-actions-dropdown', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dropdown-container\" *ngIf=\"isOpen && context\">\n <!-- Backdrop -->\n <div class=\"dropdown-overlay\" (click)=\"closed.emit()\"></div>\n \n <!-- Dropdown menu -->\n <div class=\"dropdown-menu\" [ngStyle]=\"dropdownStyle\">\n <nile-menu *ngIf=\"isOpen\" class=\"dropdown-menu\" [style.left.px]=\"dropdownStyle.left\" [style.top.px]=\"dropdownStyle.top\">\n <ng-container *ngFor=\"let action of visibleActions\">\n <nile-menu-item [class.disabled]=\"isActionDisabled(action)\" (click)=\"onActionClick(action)\" class=\"action-label\">\n <nile-icon *ngIf=\"action.icon\" size=\"14\" slot=\"prefix\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </ng-container>\n \n <nile-menu-item *ngIf=\"visibleActions.length === 0\">No actions available</nile-menu-item>\n </nile-menu>\n </div>\n\n </div>\n", styles: [".dropdown-container{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998}.dropdown-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0000004d;pointer-events:auto;z-index:9998}.dropdown-menu{position:fixed;background-color:#fff;box-shadow:0 5px 15px #0000004d,0 0 0 1px #0000001a;overflow:hidden;pointer-events:auto;z-index:9999}.action-icon{display:flex;align-items:center;justify-content:center;font-size:16px;width:20px;flex-shrink:0}.action-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-empty{padding:16px;text-align:center;color:#a0aec0;font-size:14px;font-style:italic}nile-menu{height:fit-content}\n"] }]
|
|
153
|
+
}], propDecorators: { isOpen: [{
|
|
154
|
+
type: Input
|
|
155
|
+
}], position: [{
|
|
156
|
+
type: Input
|
|
157
|
+
}], context: [{
|
|
158
|
+
type: Input
|
|
159
|
+
}], actionClicked: [{
|
|
160
|
+
type: Output
|
|
161
|
+
}], closed: [{
|
|
162
|
+
type: Output
|
|
163
|
+
}], onEscapeKey: [{
|
|
164
|
+
type: HostListener,
|
|
165
|
+
args: ['document:keydown.escape', ['$event']]
|
|
166
|
+
}] } });
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtcm93LWFjdGlvbnMtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LXJvdy1hY3Rpb25zLWRyb3Bkb3duL3N0LXJvdy1hY3Rpb25zLWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1yb3ctYWN0aW9ucy1kcm9wZG93bi9zdC1yb3ctYWN0aW9ucy1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7QUFReEQsTUFBTSxPQUFPLDZCQUE2QjtJQU4xQztRQU9FOztXQUVHO1FBQ00sV0FBTSxHQUFZLEtBQUssQ0FBQztRQUVqQzs7V0FFRztRQUNNLGFBQVEsR0FBNkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUU3RDs7V0FFRztRQUNNLFlBQU8sR0FBNEIsSUFBSSxDQUFDO1FBRWpEOztXQUVHO1FBQ08sa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUU3RDs7V0FFRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTVDOztXQUVHO1FBQ0gsbUJBQWMsR0FBZ0IsRUFBRSxDQUFDO1FBRWpDOztXQUVHO1FBQ0gsa0JBQWEsR0FBUSxFQUFFLENBQUM7S0FxSXpCO0lBbklDLFdBQVcsQ0FBQyxPQUFzQjtR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QUtJLGFBQWE7c0JBQXRCLE1BQU07Z0JBS0csTUFBTTtzQkFBZixNQUFNO2dCQWlJUCxXQUFXO3NCQURWLFlBQVk7dUJBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3dBY3Rpb24sIFJvd0FjdGlvbkNvbnRleHQsIFJvd0FjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3Jvdy1hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFRhYmxlWkluZGV4IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3otaW5kZXguZW51bSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LXJvdy1hY3Rpb25zLWRyb3Bkb3duJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0LXJvdy1hY3Rpb25zLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3Qtcm93LWFjdGlvbnMtZHJvcGRvd24uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU3RSb3dBY3Rpb25zRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZHJvcGRvd24gaXMgb3BlblxuICAgKi9cbiAgQElucHV0KCkgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogUG9zaXRpb24gb2YgdGhlIGRyb3Bkb3duICh4LCB5IGNvb3JkaW5hdGVzKVxuICAgKi9cbiAgQElucHV0KCkgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9IHsgeDogMCwgeTogMCB9O1xuICBcbiAgLyoqXG4gICAqIENvbnRleHQgY29udGFpbmluZyByb3cgZGF0YSwgaW5kZXgsIGFuZCBhY3Rpb25zXG4gICAqL1xuICBASW5wdXQoKSBjb250ZXh0OiBSb3dBY3Rpb25Db250ZXh0IHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGFjdGlvbiBpcyBjbGlja2VkXG4gICAqL1xuICBAT3V0cHV0KCkgYWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Um93QWN0aW9uRXZlbnQ+KCk7XG4gIFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBkcm9wZG93biBzaG91bGQgY2xvc2VcbiAgICovXG4gIEBPdXRwdXQoKSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIFxuICAvKipcbiAgICogVmlzaWJsZSBhY3Rpb25zIChmaWx0ZXJlZCBieSBoaWRkZW4gcHJvcGVydHkpXG4gICAqL1xuICB2aXNpYmxlQWN0aW9uczogUm93QWN0aW9uW10gPSBbXTtcbiAgXG4gIC8qKlxuICAgKiBEcm9wZG93biBwb3NpdGlvbmluZyBzdHlsZVxuICAgKi9cbiAgZHJvcGRvd25TdHlsZTogYW55ID0ge307XG4gIFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbnRleHQnXSB8fCBjaGFuZ2VzWydpc09wZW4nXSkge1xuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlQWN0aW9ucygpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoY2hhbmdlc1sncG9zaXRpb24nXSB8fCBjaGFuZ2VzWydpc09wZW4nXSkge1xuICAgICAgdGhpcy51cGRhdGVEcm9wZG93blBvc2l0aW9uKCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIHZpc2libGUgYWN0aW9ucyBiYXNlZCBvbiBoaWRkZW4gcHJvcGVydHlcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUFjdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcbiAgICAgIHRoaXMudmlzaWJsZUFjdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgdGhpcy52aXNpYmxlQWN0aW9ucyA9IHRoaXMuY29udGV4dC5hY3Rpb25zLmZpbHRlcihhY3Rpb24gPT4ge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uaGlkZGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAhYWN0aW9uLmhpZGRlbih0aGlzLmNvbnRleHQhLnJvd0RhdGEsIHRoaXMuY29udGV4dCEucm93SW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICFhY3Rpb24uaGlkZGVuO1xuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIGRyb3Bkb3duIHBvc2l0aW9uIGJhc2VkIG9uIGF2YWlsYWJsZSB2aWV3cG9ydCBzcGFjZVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVEcm9wZG93blBvc2l0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuZHJvcGRvd25TdHlsZSA9IHt9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBEUk9QRE9XTl9XSURUSCA9IDIwMDsgLy8gQXBwcm94aW1hdGUgd2lkdGhcbiAgICBjb25zdCBEUk9QRE9XTl9IRUlHSFQgPSB0aGlzLnZpc2libGVBY3Rpb25zLmxlbmd0aCAqIDQwICsgMTY7IC8vIEFwcHJveGltYXRlIGhlaWdodFxuICAgIFxuICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBcbiAgICBsZXQgbGVmdCA9IHRoaXMucG9zaXRpb24ueDtcbiAgICBsZXQgdG9wID0gdGhpcy5wb3NpdGlvbi55O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIGRyb3Bkb3duIHdvdWxkIG92ZXJmbG93IHJpZ2h0IGVkZ2VcbiAgICBpZiAobGVmdCArIERST1BET1dOX1dJRFRIID4gdmlld3BvcnRXaWR0aCkge1xuICAgICAgbGVmdCA9IHZpZXdwb3J0V2lkdGggLSBEUk9QRE9XTl9XSURUSCAtIDEwO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBkcm9wZG93biB3b3VsZCBvdmVyZmxvdyBib3R0b20gZWRnZVxuICAgIGlmICh0b3AgKyBEUk9QRE9XTl9IRUlHSFQgPiB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgLy8gUG9zaXRpb24gYWJvdmUgdGhlIHRyaWdnZXJcbiAgICAgIHRvcCA9IHRoaXMucG9zaXRpb24ueSAtIERST1BET1dOX0hFSUdIVDtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGRyb3Bkb3duIGRvZXNuJ3QgZ28gb2ZmLXNjcmVlbiBvbiB0aGUgbGVmdFxuICAgIGlmIChsZWZ0IDwgMTApIHtcbiAgICAgIGxlZnQgPSAxMDtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGRyb3Bkb3duIGRvZXNuJ3QgZ28gb2ZmLXNjcmVlbiBvbiB0aGUgdG9wXG4gICAgaWYgKHRvcCA8IDEwKSB7XG4gICAgICB0b3AgPSAxMDtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5kcm9wZG93blN0eWxlID0ge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICBsZWZ0OiBgJHtsZWZ0fXB4YCxcbiAgICAgIHRvcDogYCR7dG9wfXB4YCxcbiAgICAgIHpJbmRleDogVGFibGVaSW5kZXguUk9XX0FDVElPTlNfRFJPUERPV05cbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGFjdGlvbiBjbGlja1xuICAgKi9cbiAgb25BY3Rpb25DbGljayhhY3Rpb246IFJvd0FjdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250ZXh0KSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgYWN0aW9uIGlzIGRpc2FibGVkXG4gICAgaWYgKHRoaXMuaXNBY3Rpb25EaXNhYmxlZChhY3Rpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGV2ZW50OiBSb3dBY3Rpb25FdmVudCA9IHtcbiAgICAgIGFjdGlvbixcbiAgICAgIHJvd0RhdGE6IHRoaXMuY29udGV4dC5yb3dEYXRhLFxuICAgICAgcm93SW5kZXg6IHRoaXMuY29udGV4dC5yb3dJbmRleFxuICAgIH07XG4gICAgXG4gICAgdGhpcy5hY3Rpb25DbGlja2VkLmVtaXQoZXZlbnQpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYWN0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBpc0FjdGlvbkRpc2FibGVkKGFjdGlvbjogUm93QWN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHJldHVybiB0cnVlO1xuICAgIFxuICAgIGlmICh0eXBlb2YgYWN0aW9uLmRpc2FibGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYWN0aW9uLmRpc2FibGVkKHRoaXMuY29udGV4dC5yb3dEYXRhLCB0aGlzLmNvbnRleHQucm93SW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gISFhY3Rpb24uZGlzYWJsZWQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgb3ZlcmxheSBjbGljayAoY2xvc2UgZHJvcGRvd24pXG4gICAqL1xuICBvbk92ZXJsYXlDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgRVNDIGtleSBwcmVzc1xuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnLCBbJyRldmVudCddKVxuICBvbkVzY2FwZUtleShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQcmV2ZW50IGRyb3Bkb3duIGNsaWNrIGZyb20gY2xvc2luZ1xuICAgKi9cbiAgb25Ecm9wZG93bkNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyXCIgKm5nSWY9XCJpc09wZW4gJiYgY29udGV4dFwiPlxuICA8IS0tIEJhY2tkcm9wIC0tPlxuICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tb3ZlcmxheVwiIChjbGljayk9XCJjbG9zZWQuZW1pdCgpXCI+PC9kaXY+XG4gIFxuICA8IS0tIERyb3Bkb3duIG1lbnUgLS0+XG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgW25nU3R5bGVdPVwiZHJvcGRvd25TdHlsZVwiPlxuICAgIDxuaWxlLW1lbnUgKm5nSWY9XCJpc09wZW5cIiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBbc3R5bGUubGVmdC5weF09XCJkcm9wZG93blN0eWxlLmxlZnRcIiBbc3R5bGUudG9wLnB4XT1cImRyb3Bkb3duU3R5bGUudG9wXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgdmlzaWJsZUFjdGlvbnNcIj5cbiAgICAgICAgPG5pbGUtbWVudS1pdGVtIFtjbGFzcy5kaXNhYmxlZF09XCJpc0FjdGlvbkRpc2FibGVkKGFjdGlvbilcIiAoY2xpY2spPVwib25BY3Rpb25DbGljayhhY3Rpb24pXCIgY2xhc3M9XCJhY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICA8bmlsZS1pY29uICAqbmdJZj1cImFjdGlvbi5pY29uXCIgc2l6ZT1cIjE0XCIgc2xvdD1cInByZWZpeFwiIFtuYW1lXT1cImFjdGlvbi5pY29uXCI+PC9uaWxlLWljb24+XG4gICAgICAgICAge3sgYWN0aW9uLmxhYmVsIH19XG4gICAgICAgIDwvbmlsZS1tZW51LWl0ZW0+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICAgIDxuaWxlLW1lbnUtaXRlbSAqbmdJZj1cInZpc2libGVBY3Rpb25zLmxlbmd0aCA9PT0gMFwiPk5vIGFjdGlvbnMgYXZhaWxhYmxlPC9uaWxlLW1lbnUtaXRlbT5cbiAgICA8L25pbGUtbWVudT5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { SheetState } from '../../models/sheet-state.class';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../st-sheet-actions/st-sheet-actions.component";
|
|
5
|
+
import * as i2 from "../st-table/st-table.component";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
export class StSheetComponent {
|
|
8
|
+
constructor() {
|
|
9
|
+
/**
|
|
10
|
+
* Table data (sync)
|
|
11
|
+
*/
|
|
12
|
+
this.data = [];
|
|
13
|
+
/**
|
|
14
|
+
* Emitted when sheet action is clicked
|
|
15
|
+
*/
|
|
16
|
+
this.sheetActionClicked = new EventEmitter();
|
|
17
|
+
/**
|
|
18
|
+
* Emitted when sheet state changes
|
|
19
|
+
*/
|
|
20
|
+
this.stateChange = new EventEmitter();
|
|
21
|
+
/**
|
|
22
|
+
* Emitted when a cell value changes
|
|
23
|
+
*/
|
|
24
|
+
this.cellChange = new EventEmitter();
|
|
25
|
+
/**
|
|
26
|
+
* Emitted when table state changes (pagination, sorting, filtering)
|
|
27
|
+
*/
|
|
28
|
+
this.tableStateChange = new EventEmitter();
|
|
29
|
+
/**
|
|
30
|
+
* Emitted when data changes (via Observable)
|
|
31
|
+
*/
|
|
32
|
+
this.dataChange = new EventEmitter();
|
|
33
|
+
/**
|
|
34
|
+
* Visible actions (filtered by hidden property)
|
|
35
|
+
*/
|
|
36
|
+
this.visibleActions = [];
|
|
37
|
+
this.activeTab = '1';
|
|
38
|
+
}
|
|
39
|
+
ngOnInit() {
|
|
40
|
+
this.initializeState();
|
|
41
|
+
this.updateVisibleActions();
|
|
42
|
+
}
|
|
43
|
+
ngOnChanges(changes) {
|
|
44
|
+
if (changes['config']) {
|
|
45
|
+
if (!this.state && this.config) {
|
|
46
|
+
this.initializeState();
|
|
47
|
+
}
|
|
48
|
+
this.updateVisibleActions();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Initialize sheet state
|
|
53
|
+
*/
|
|
54
|
+
initializeState() {
|
|
55
|
+
if (!this.state && this.config) {
|
|
56
|
+
this.internalState = new SheetState({
|
|
57
|
+
id: this.config.id,
|
|
58
|
+
name: this.config.name
|
|
59
|
+
}, this.config.tableConfig.columns, {
|
|
60
|
+
initialPage: this.config.tableConfig.initialState?.page,
|
|
61
|
+
pageSize: this.config.tableConfig.pagination?.pageSize
|
|
62
|
+
});
|
|
63
|
+
// Update last accessed
|
|
64
|
+
this.internalState.updateLastAccessed();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get active state (external or internal)
|
|
69
|
+
*/
|
|
70
|
+
get activeState() {
|
|
71
|
+
return this.state || this.internalState;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Handle sheet action click
|
|
75
|
+
*/
|
|
76
|
+
onActionClick(event) {
|
|
77
|
+
this.sheetActionClicked.emit(event);
|
|
78
|
+
// Emit state change after action
|
|
79
|
+
if (this.activeState) {
|
|
80
|
+
this.stateChange.emit(this.activeState.getSnapshot());
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Handle cell value change from table
|
|
85
|
+
*/
|
|
86
|
+
onCellChange(event) {
|
|
87
|
+
this.cellChange.emit(event);
|
|
88
|
+
// Update last modified timestamp
|
|
89
|
+
if (this.activeState) {
|
|
90
|
+
this.stateChange.emit(this.activeState.getSnapshot());
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Handle table state change (pagination, sorting, filtering)
|
|
95
|
+
*/
|
|
96
|
+
onTableStateChange(event) {
|
|
97
|
+
this.tableStateChange.emit(event);
|
|
98
|
+
// Emit sheet state change
|
|
99
|
+
if (this.activeState) {
|
|
100
|
+
this.stateChange.emit(this.activeState.getSnapshot());
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Handle data change from table (via Observable)
|
|
105
|
+
*/
|
|
106
|
+
onDataChange(event) {
|
|
107
|
+
this.dataChange.emit(event);
|
|
108
|
+
// Emit sheet state change
|
|
109
|
+
if (this.activeState) {
|
|
110
|
+
this.stateChange.emit(this.activeState.getSnapshot());
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Update visible actions based on hidden property
|
|
115
|
+
*/
|
|
116
|
+
updateVisibleActions() {
|
|
117
|
+
if (!this.config?.actions) {
|
|
118
|
+
this.visibleActions = [];
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.visibleActions = this.config.actions.filter(action => {
|
|
122
|
+
if (typeof action.hidden === 'function') {
|
|
123
|
+
return !action.hidden();
|
|
124
|
+
}
|
|
125
|
+
return !action.hidden;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check if header should be shown
|
|
130
|
+
*/
|
|
131
|
+
get showHeader() {
|
|
132
|
+
return this.config?.display?.showHeader !== false;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get header variant class
|
|
136
|
+
*/
|
|
137
|
+
get headerVariant() {
|
|
138
|
+
return this.config?.display?.headerVariant || 'default';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
StSheetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StSheetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
142
|
+
StSheetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StSheetComponent, selector: "st-sheet", inputs: { config: "config", data: "data", data$: "data$", state: "state" }, outputs: { sheetActionClicked: "sheetActionClicked", stateChange: "stateChange", cellChange: "cellChange", tableStateChange: "tableStateChange", dataChange: "dataChange" }, usesOnChanges: true, ngImport: i0, template: " \n<nile-tab-group>\n <nile-tab slot=\"nav\" panel=\"general\" [class.active]=\"activeTab === '1'\" (click)=\"activeTab = '1'\">\n <div class=\"sheet-header\">\n {{activeState?.name$ | async | titlecase}}\n <st-sheet-actions \n *ngIf=\"visibleActions.length > 0\"\n [actions]=\"visibleActions\" \n [sheetId]=\"config.id\"\n (actionClicked)=\"onActionClick($event)\">\n </st-sheet-actions>\n </div>\n </nile-tab>\n <nile-tab-panel name=\"general\">\n <st-table \n *ngIf=\"config && activeState\"\n [tableConfig]=\"config.tableConfig\"\n [data]=\"data\"\n [data$]=\"data$\"\n [tableState]=\"activeState.tableState\"\n (cellChange)=\"onCellChange($event)\"\n (stateChange)=\"onTableStateChange($event)\"\n (dataChange)=\"onDataChange($event)\">\n </st-table>\n </nile-tab-panel>\n</nile-tab-group>\n\n\n", styles: [":host{display:block;width:100%;height:100%}.sheet-container{display:flex;flex-direction:column;width:100%;height:100%}.sheet-header{display:flex;align-items:center;font-family:Colfax;color:#000}.sheet-table-wrapper{flex:1;overflow:auto;position:relative}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}nile-tab-group nile-tab-panel::part(base){padding:0;max-height:30rem}\n"], components: [{ type: i1.StSheetActionsComponent, selector: "st-sheet-actions", inputs: ["actions", "sheetId"], outputs: ["actionClicked"] }, { 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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "titlecase": i3.TitleCasePipe, "async": i3.AsyncPipe } });
|
|
143
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StSheetComponent, decorators: [{
|
|
144
|
+
type: Component,
|
|
145
|
+
args: [{ selector: 'st-sheet', template: " \n<nile-tab-group>\n <nile-tab slot=\"nav\" panel=\"general\" [class.active]=\"activeTab === '1'\" (click)=\"activeTab = '1'\">\n <div class=\"sheet-header\">\n {{activeState?.name$ | async | titlecase}}\n <st-sheet-actions \n *ngIf=\"visibleActions.length > 0\"\n [actions]=\"visibleActions\" \n [sheetId]=\"config.id\"\n (actionClicked)=\"onActionClick($event)\">\n </st-sheet-actions>\n </div>\n </nile-tab>\n <nile-tab-panel name=\"general\">\n <st-table \n *ngIf=\"config && activeState\"\n [tableConfig]=\"config.tableConfig\"\n [data]=\"data\"\n [data$]=\"data$\"\n [tableState]=\"activeState.tableState\"\n (cellChange)=\"onCellChange($event)\"\n (stateChange)=\"onTableStateChange($event)\"\n (dataChange)=\"onDataChange($event)\">\n </st-table>\n </nile-tab-panel>\n</nile-tab-group>\n\n\n", styles: [":host{display:block;width:100%;height:100%}.sheet-container{display:flex;flex-direction:column;width:100%;height:100%}.sheet-header{display:flex;align-items:center;font-family:Colfax;color:#000}.sheet-table-wrapper{flex:1;overflow:auto;position:relative}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}nile-tab-group nile-tab-panel::part(base){padding:0;max-height:30rem}\n"] }]
|
|
146
|
+
}], ctorParameters: function () { return []; }, propDecorators: { config: [{
|
|
147
|
+
type: Input
|
|
148
|
+
}], data: [{
|
|
149
|
+
type: Input
|
|
150
|
+
}], data$: [{
|
|
151
|
+
type: Input
|
|
152
|
+
}], state: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}], sheetActionClicked: [{
|
|
155
|
+
type: Output
|
|
156
|
+
}], stateChange: [{
|
|
157
|
+
type: Output
|
|
158
|
+
}], cellChange: [{
|
|
159
|
+
type: Output
|
|
160
|
+
}], tableStateChange: [{
|
|
161
|
+
type: Output
|
|
162
|
+
}], dataChange: [{
|
|
163
|
+
type: Output
|
|
164
|
+
}] } });
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtc2hlZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LXNoZWV0L3N0LXNoZWV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1zaGVldC9zdC1zaGVldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUliLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7QUFVNUQsTUFBTSxPQUFPLGdCQUFnQjtJQTBEM0I7UUFwREE7O1dBRUc7UUFDTSxTQUFJLEdBQVUsRUFBRSxDQUFDO1FBYTFCOztXQUVHO1FBQ08sdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFFcEU7O1dBRUc7UUFDTyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBRS9EOztXQUVHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBRTNEOztXQUVHO1FBQ08scUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFFdkU7O1dBRUc7UUFDTyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFPM0Q7O1dBRUc7UUFDSCxtQkFBYyxHQUFrQixFQUFFLENBQUM7UUFDbkMsY0FBUyxHQUFXLEdBQUcsQ0FBQztJQUVULENBQUM7SUFFaEIsUUFBUTtRQUNOLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsV0FB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TUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hELElBQUksT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRTtnQkFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUN6QjtZQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEtBQUssS0FBSyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxJQUFJLFNBQVMsQ0FBQztJQUMxRCxDQUFDOzs2R0FwTFUsZ0JBQWdCO2lHQUFoQixnQkFBZ0IsOFRDdEI3QixvNEJBNEJBOzJGRE5hLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxVQUFVOzBFQVFYLE1BQU07c0JBQWQsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQU1HLEtBQUs7c0JBQWIsS0FBSztnQkFLSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBS0csV0FBVztzQkFBcEIsTUFBTTtnQkFLRyxVQUFVO3NCQUFuQixNQUFNO2dCQUtHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFLRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTaGVldENvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9zaGVldC1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNoZWV0QWN0aW9uLCBTaGVldEFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3NoZWV0LWFjdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2hlZXRTdGF0ZSB9IGZyb20gJy4uLy4uL21vZGVscy9zaGVldC1zdGF0ZS5jbGFzcyc7XG5pbXBvcnQgeyBTaGVldFN0YXRlU25hcHNob3QgfSBmcm9tICcuLi8uLi9tb2RlbHMvc2hlZXQtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IENlbGxDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jZWxsLXR5cGVzJztcbmltcG9ydCB7IFRhYmxlU3RhdGVDaGFuZ2VFdmVudCwgRGF0YUNoYW5nZUV2ZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3Qtc2hlZXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3Qtc2hlZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdC1zaGVldC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTdFNoZWV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKipcbiAgICogU2hlZXQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQElucHV0KCkgY29uZmlnITogU2hlZXRDb25maWc7XG5cbiAgLyoqXG4gICAqIFRhYmxlIGRhdGEgKHN5bmMpXG4gICAqL1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICBcbiAgLyoqXG4gICAqIFRhYmxlIGRhdGEgKGFzeW5jKSAtIE9ic2VydmFibGUgb3IgQmVoYXZpb3JTdWJqZWN0XG4gICAqL1xuICBASW5wdXQoKSBkYXRhJD86IE9ic2VydmFibGU8YW55W10+IHwgQmVoYXZpb3JTdWJqZWN0PGFueVtdPjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgZXh0ZXJuYWwgc3RhdGUgbWFuYWdlbWVudFxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGNvbXBvbmVudCB3aWxsIGNyZWF0ZSBpdHMgb3duIHN0YXRlXG4gICAqL1xuICBASW5wdXQoKSBzdGF0ZT86IFNoZWV0U3RhdGU7XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBzaGVldCBhY3Rpb24gaXMgY2xpY2tlZFxuICAgKi9cbiAgQE91dHB1dCgpIHNoZWV0QWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2hlZXRBY3Rpb25FdmVudD4oKTtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHNoZWV0IHN0YXRlIGNoYW5nZXNcbiAgICovXG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2hlZXRTdGF0ZVNuYXBzaG90PigpO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBjZWxsIHZhbHVlIGNoYW5nZXNcbiAgICovXG4gIEBPdXRwdXQoKSBjZWxsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0YWJsZSBzdGF0ZSBjaGFuZ2VzIChwYWdpbmF0aW9uLCBzb3J0aW5nLCBmaWx0ZXJpbmcpXG4gICAqL1xuICBAT3V0cHV0KCkgdGFibGVTdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVTdGF0ZUNoYW5nZUV2ZW50PigpO1xuICBcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBkYXRhIGNoYW5nZXMgKHZpYSBPYnNlcnZhYmxlKVxuICAgKi9cbiAgQE91dHB1dCgpIGRhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFDaGFuZ2VFdmVudD4oKTtcblxuICAvKipcbiAgICogSW50ZXJuYWwgc3RhdGUgaW5zdGFuY2VcbiAgICovXG4gIGludGVybmFsU3RhdGU/OiBTaGVldFN0YXRlO1xuXG4gIC8qKlxuICAgKiBWaXNpYmxlIGFjdGlvbnMgKGZpbHRlcmVkIGJ5IGhpZGRlbiBwcm9wZXJ0eSlcbiAgICovXG4gIHZpc2libGVBY3Rpb25zOiBTaGVldEFjdGlvbltdID0gW107XG4gIGFjdGl2ZVRhYjogc3RyaW5nID0gJzEnO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVTdGF0ZSgpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUFjdGlvbnMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10pIHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZSAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVTdGF0ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlQWN0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHNoZWV0IHN0YXRlXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUgJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxTdGF0ZSA9IG5ldyBTaGVldFN0YXRlKFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgICAgIG5hbWU6IHRoaXMuY29uZmlnLm5hbWVcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5jb25maWcudGFibGVDb25maWcuY29sdW1ucyxcbiAgICAgICAge1xuICAgICAgICAgIGluaXRpYWxQYWdlOiB0aGlzLmNvbmZpZy50YWJsZUNvbmZpZy5pbml0aWFsU3RhdGU/LnBhZ2UsXG4gICAgICAgICAgcGFnZVNpemU6IHRoaXMuY29uZmlnLnRhYmxlQ29uZmlnLnBhZ2luYXRpb24/LnBhZ2VTaXplXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIFVwZGF0ZSBsYXN0IGFjY2Vzc2VkXG4gICAgICB0aGlzLmludGVybmFsU3RhdGUudXBkYXRlTGFzdEFjY2Vzc2VkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhY3RpdmUgc3RhdGUgKGV4dGVybmFsIG9yIGludGVybmFsKVxuICAgKi9cbiAgZ2V0IGFjdGl2ZVN0YXRlKCk6IFNoZWV0U3RhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0YXRlIHx8IHRoaXMuaW50ZXJuYWxTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2hlZXQgYWN0aW9uIGNsaWNrXG4gICAqL1xuICBvbkFjdGlvbkNsaWNrKGV2ZW50OiBTaGVldEFjdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zaGVldEFjdGlvbkNsaWNrZWQuZW1pdChldmVudCk7XG4gICAgXG4gICAgLy8gRW1pdCBzdGF0ZSBjaGFuZ2UgYWZ0ZXIgYWN0aW9uXG4gICAgaWYgKHRoaXMuYWN0aXZlU3RhdGUpIHtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVN0YXRlLmdldFNuYXBzaG90KCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2VsbCB2YWx1ZSBjaGFuZ2UgZnJvbSB0YWJsZVxuICAgKi9cbiAgb25DZWxsQ2hhbmdlKGV2ZW50OiBDZWxsQ2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgXG4gICAgLy8gVXBkYXRlIGxhc3QgbW9kaWZpZWQgdGltZXN0YW1wXG4gICAgaWYgKHRoaXMuYWN0aXZlU3RhdGUpIHtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVN0YXRlLmdldFNuYXBzaG90KCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGFibGUgc3RhdGUgY2hhbmdlIChwYWdpbmF0aW9uLCBzb3J0aW5nLCBmaWx0ZXJpbmcpXG4gICAqL1xuICBvblRhYmxlU3RhdGVDaGFuZ2UoZXZlbnQ6IFRhYmxlU3RhdGVDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMudGFibGVTdGF0ZUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICBcbiAgICAvLyBFbWl0IHNoZWV0IHN0YXRlIGNoYW5nZVxuICAgIGlmICh0aGlzLmFjdGl2ZVN0YXRlKSB7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVTdGF0ZS5nZXRTbmFwc2hvdCgpKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgZGF0YSBjaGFuZ2UgZnJvbSB0YWJsZSAodmlhIE9ic2VydmFibGUpXG4gICAqL1xuICBvbkRhdGFDaGFuZ2UoZXZlbnQ6IERhdGFDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICBcbiAgICAvLyBFbWl0IHNoZWV0IHN0YXRlIGNoYW5nZVxuICAgIGlmICh0aGlzLmFjdGl2ZVN0YXRlKSB7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVTdGF0ZS5nZXRTbmFwc2hvdCgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHZpc2libGUgYWN0aW9ucyBiYXNlZCBvbiBoaWRkZW4gcHJvcGVydHlcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUFjdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uYWN0aW9ucykge1xuICAgICAgdGhpcy52aXNpYmxlQWN0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmlzaWJsZUFjdGlvbnMgPSB0aGlzLmNvbmZpZy5hY3Rpb25zLmZpbHRlcihhY3Rpb24gPT4ge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uaGlkZGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAhYWN0aW9uLmhpZGRlbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICFhY3Rpb24uaGlkZGVuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGhlYWRlciBzaG91bGQgYmUgc2hvd25cbiAgICovXG4gIGdldCBzaG93SGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8uZGlzcGxheT8uc2hvd0hlYWRlciAhPT0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGhlYWRlciB2YXJpYW50IGNsYXNzXG4gICAqL1xuICBnZXQgaGVhZGVyVmFyaWFudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8uZGlzcGxheT8uaGVhZGVyVmFyaWFudCB8fCAnZGVmYXVsdCc7XG4gIH1cbn1cblxuIiwiICBcbjxuaWxlLXRhYi1ncm91cD5cbiAgPG5pbGUtdGFiIHNsb3Q9XCJuYXZcIiBwYW5lbD1cImdlbmVyYWxcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PT0gJzEnXCIgKGNsaWNrKT1cImFjdGl2ZVRhYiA9ICcxJ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJzaGVldC1oZWFkZXJcIj5cbiAgICAgIHt7YWN0aXZlU3RhdGU/Lm5hbWUkIHwgYXN5bmMgfCB0aXRsZWNhc2V9fVxuICAgICAgPHN0LXNoZWV0LWFjdGlvbnMgXG4gICAgICAgICpuZ0lmPVwidmlzaWJsZUFjdGlvbnMubGVuZ3RoID4gMFwiXG4gICAgICAgIFthY3Rpb25zXT1cInZpc2libGVBY3Rpb25zXCIgXG4gICAgICAgIFtzaGVldElkXT1cImNvbmZpZy5pZFwiXG4gICAgICAgIChhY3Rpb25DbGlja2VkKT1cIm9uQWN0aW9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgPC9zdC1zaGVldC1hY3Rpb25zPlxuICAgIDwvZGl2PlxuICA8L25pbGUtdGFiPlxuICA8bmlsZS10YWItcGFuZWwgbmFtZT1cImdlbmVyYWxcIj5cbiAgICA8c3QtdGFibGUgXG4gICAgICAqbmdJZj1cImNvbmZpZyAmJiBhY3RpdmVTdGF0ZVwiXG4gICAgICBbdGFibGVDb25maWddPVwiY29uZmlnLnRhYmxlQ29uZmlnXCJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgICAgW2RhdGEkXT1cImRhdGEkXCJcbiAgICAgIFt0YWJsZVN0YXRlXT1cImFjdGl2ZVN0YXRlLnRhYmxlU3RhdGVcIlxuICAgICAgKGNlbGxDaGFuZ2UpPVwib25DZWxsQ2hhbmdlKCRldmVudClcIlxuICAgICAgKHN0YXRlQ2hhbmdlKT1cIm9uVGFibGVTdGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChkYXRhQ2hhbmdlKT1cIm9uRGF0YUNoYW5nZSgkZXZlbnQpXCI+XG4gIDwvc3QtdGFibGU+XG4gIDwvbmlsZS10YWItcGFuZWw+XG48L25pbGUtdGFiLWdyb3VwPlxuXG5cbiJdfQ==
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
export class StSheetActionsComponent {
|
|
5
|
+
constructor() {
|
|
6
|
+
/**
|
|
7
|
+
* Array of sheet actions
|
|
8
|
+
*/
|
|
9
|
+
this.actions = [];
|
|
10
|
+
/**
|
|
11
|
+
* Emitted when an action is clicked
|
|
12
|
+
*/
|
|
13
|
+
this.actionClicked = new EventEmitter();
|
|
14
|
+
/**
|
|
15
|
+
* Whether the dropdown is open
|
|
16
|
+
*/
|
|
17
|
+
this.isOpen = false;
|
|
18
|
+
/**
|
|
19
|
+
* Visible actions (filtered by hidden property)
|
|
20
|
+
*/
|
|
21
|
+
this.visibleActions = [];
|
|
22
|
+
/**
|
|
23
|
+
* Dropdown positioning style
|
|
24
|
+
*/
|
|
25
|
+
this.dropdownStyle = {};
|
|
26
|
+
}
|
|
27
|
+
ngOnInit() {
|
|
28
|
+
this.updateVisibleActions();
|
|
29
|
+
}
|
|
30
|
+
ngOnChanges() {
|
|
31
|
+
this.updateVisibleActions();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Toggle dropdown menu
|
|
35
|
+
*/
|
|
36
|
+
toggleMenu(event) {
|
|
37
|
+
event.stopPropagation();
|
|
38
|
+
this.isOpen = !this.isOpen;
|
|
39
|
+
if (this.isOpen) {
|
|
40
|
+
this.updateDropdownPosition(event);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Close dropdown menu
|
|
45
|
+
*/
|
|
46
|
+
closeMenu() {
|
|
47
|
+
this.isOpen = false;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Handle action click
|
|
51
|
+
*/
|
|
52
|
+
onActionClick(action, event) {
|
|
53
|
+
event.stopPropagation();
|
|
54
|
+
if (this.isActionDisabled(action)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Emit event
|
|
58
|
+
this.actionClicked.emit({
|
|
59
|
+
action,
|
|
60
|
+
sheetId: this.sheetId
|
|
61
|
+
});
|
|
62
|
+
// Execute action callback if provided
|
|
63
|
+
if (action.action) {
|
|
64
|
+
action.action(this.sheetId);
|
|
65
|
+
}
|
|
66
|
+
this.closeMenu();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if action is disabled
|
|
70
|
+
*/
|
|
71
|
+
isActionDisabled(action) {
|
|
72
|
+
if (typeof action.disabled === 'function') {
|
|
73
|
+
return action.disabled();
|
|
74
|
+
}
|
|
75
|
+
return action.disabled || false;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Update visible actions based on hidden property
|
|
79
|
+
*/
|
|
80
|
+
updateVisibleActions() {
|
|
81
|
+
this.visibleActions = this.actions.filter(action => {
|
|
82
|
+
if (typeof action.hidden === 'function') {
|
|
83
|
+
return !action.hidden();
|
|
84
|
+
}
|
|
85
|
+
return !action.hidden;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Update dropdown position based on trigger button
|
|
90
|
+
*/
|
|
91
|
+
updateDropdownPosition(event) {
|
|
92
|
+
const target = event.currentTarget;
|
|
93
|
+
const rect = target.getBoundingClientRect();
|
|
94
|
+
this.dropdownStyle = {
|
|
95
|
+
top: `${rect.bottom + 4}px`,
|
|
96
|
+
right: `${window.innerWidth - rect.right}px`
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
StSheetActionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StSheetActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
101
|
+
StSheetActionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StSheetActionsComponent, selector: "st-sheet-actions", inputs: { actions: "actions", sheetId: "sheetId" }, outputs: { actionClicked: "actionClicked" }, usesOnChanges: true, ngImport: i0, template: "<button \n class=\"sheet-actions-button\"\n (click)=\"toggleMenu($event)\"\n type=\"button\"\n title=\"Sheet Actions\"\n aria-label=\"Sheet actions menu\"\n [class.active]=\"isOpen\"\n *ngIf=\"visibleActions.length > 0\">\n <nile-icon name=\"arrowdown\" size=\"14\"></nile-icon>\n</button>\n\n<!-- Dropdown container -->\n<div class=\"dropdown-container\" *ngIf=\"isOpen\">\n <!-- Backdrop -->\n <div class=\"dropdown-backdrop\" (click)=\"closeMenu()\"></div>\n \n <!-- Dropdown menu -->\n <div class=\"dropdown-menu\" [ngStyle]=\"dropdownStyle\">\n <nile-menu>\n <nile-menu-item \n *ngFor=\"let action of visibleActions\"\n [class.disabled]=\"isActionDisabled(action)\"\n (click)=\"onActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" size=\"14\" slot=\"prefix\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n \n <nile-menu-item *ngIf=\"visibleActions.length === 0\">\n No actions available\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n", styles: [":host{display:inline-block}.sheet-actions-button{display:flex;align-items:center;justify-content:center;width:2rem;padding:0;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s ease;color:var(--nile-color-neutral-600)}.sheet-actions-button nile-icon{font-size:16px}.dropdown-container{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000;pointer-events:none}.dropdown-container>*{pointer-events:auto}.dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.dropdown-menu{position:absolute;min-width:200px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
102
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StSheetActionsComponent, decorators: [{
|
|
103
|
+
type: Component,
|
|
104
|
+
args: [{ selector: 'st-sheet-actions', template: "<button \n class=\"sheet-actions-button\"\n (click)=\"toggleMenu($event)\"\n type=\"button\"\n title=\"Sheet Actions\"\n aria-label=\"Sheet actions menu\"\n [class.active]=\"isOpen\"\n *ngIf=\"visibleActions.length > 0\">\n <nile-icon name=\"arrowdown\" size=\"14\"></nile-icon>\n</button>\n\n<!-- Dropdown container -->\n<div class=\"dropdown-container\" *ngIf=\"isOpen\">\n <!-- Backdrop -->\n <div class=\"dropdown-backdrop\" (click)=\"closeMenu()\"></div>\n \n <!-- Dropdown menu -->\n <div class=\"dropdown-menu\" [ngStyle]=\"dropdownStyle\">\n <nile-menu>\n <nile-menu-item \n *ngFor=\"let action of visibleActions\"\n [class.disabled]=\"isActionDisabled(action)\"\n (click)=\"onActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" size=\"14\" slot=\"prefix\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n \n <nile-menu-item *ngIf=\"visibleActions.length === 0\">\n No actions available\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n", styles: [":host{display:inline-block}.sheet-actions-button{display:flex;align-items:center;justify-content:center;width:2rem;padding:0;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s ease;color:var(--nile-color-neutral-600)}.sheet-actions-button nile-icon{font-size:16px}.dropdown-container{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000;pointer-events:none}.dropdown-container>*{pointer-events:auto}.dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.dropdown-menu{position:absolute;min-width:200px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}\n"] }]
|
|
105
|
+
}], ctorParameters: function () { return []; }, propDecorators: { actions: [{
|
|
106
|
+
type: Input
|
|
107
|
+
}], sheetId: [{
|
|
108
|
+
type: Input
|
|
109
|
+
}], actionClicked: [{
|
|
110
|
+
type: Output
|
|
111
|
+
}] } });
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtc2hlZXQtYWN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2NvbXBvbmVudHMvc3Qtc2hlZXQtYWN0aW9ucy9zdC1zaGVldC1hY3Rpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1zaGVldC1hY3Rpb25zL3N0LXNoZWV0LWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBcUIsTUFBTSxlQUFlLENBQUM7OztBQVExRixNQUFNLE9BQU8sdUJBQXVCO0lBK0JsQztRQTlCQTs7V0FFRztRQUNNLFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBT3JDOztXQUVHO1FBQ08sa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQUUvRDs7V0FFRztRQUNILFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZjs7V0FFRztRQUNILG1CQUFjLEdBQWtCLEVBQUUsQ0FBQztRQUVuQzs7V0FFRztRQUNILGtCQUFhLEdBQVEsRUFBRSxDQUFDO0lBRVQsQ0FBQztJQUVoQixRQUFRO1FBQ04sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsS0FBaUI7UUFDMUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQztJQUVILENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhLENBQUMsTUFBbUIsRUFBRSxLQUFZO1FBQzdDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNqQyxPQUFPO1NBQ1I7UUFFRCxhQUFhO1FBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDdEIsTUFBTTtZQUNOLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDLENBQUM7UUFFSCxzQ0FBc0M7UUFDdEMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdCO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLE1BQW1CO1FBQ2xDLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRTtZQUN6QyxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUMxQjtRQUNELE9BQU8sTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO2dCQUN2QyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ3pCO1lBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxzQkFBc0IsQ0FBQyxLQUFpQjtRQUM5QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBNEIsQ0FBQztRQUNsRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU1QyxJQUFJLENBQUMsYUFBYSxHQUFHO1lBQ25CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJO1lBQzNCLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSTtTQUM3QyxDQUFDO0lBQ0osQ0FBQzs7b0hBdEhVLHVCQUF1Qjt3R0FBdkIsdUJBQXVCLDhLQ1JwQywyakNBa0NBOzJGRDFCYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0Usa0JBQWtCOzBFQVFuQixPQUFPO3NCQUFmLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLO2dCQUtJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNoZWV0QWN0aW9uLCBTaGVldEFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3NoZWV0LWFjdGlvbi5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHsgIFxuICBzZWxlY3RvcjogJ3N0LXNoZWV0LWFjdGlvbnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3Qtc2hlZXQtYWN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0LXNoZWV0LWFjdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU3RTaGVldEFjdGlvbnNDb21wb25lbnQge1xuICAvKipcbiAgICogQXJyYXkgb2Ygc2hlZXQgYWN0aW9uc1xuICAgKi9cbiAgQElucHV0KCkgYWN0aW9uczogU2hlZXRBY3Rpb25bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTaGVldCBJRCBmb3IgY29udGV4dFxuICAgKi9cbiAgQElucHV0KCkgc2hlZXRJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGFjdGlvbiBpcyBjbGlja2VkXG4gICAqL1xuICBAT3V0cHV0KCkgYWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2hlZXRBY3Rpb25FdmVudD4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZHJvcGRvd24gaXMgb3BlblxuICAgKi9cbiAgaXNPcGVuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFZpc2libGUgYWN0aW9ucyAoZmlsdGVyZWQgYnkgaGlkZGVuIHByb3BlcnR5KVxuICAgKi9cbiAgdmlzaWJsZUFjdGlvbnM6IFNoZWV0QWN0aW9uW10gPSBbXTtcblxuICAvKipcbiAgICogRHJvcGRvd24gcG9zaXRpb25pbmcgc3R5bGVcbiAgICovXG4gIGRyb3Bkb3duU3R5bGU6IGFueSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVBY3Rpb25zKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVBY3Rpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIGRyb3Bkb3duIG1lbnVcbiAgICovXG4gIHRvZ2dsZU1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcblxuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy51cGRhdGVEcm9wZG93blBvc2l0aW9uKGV2ZW50KTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBkcm9wZG93biBtZW51XG4gICAqL1xuICBjbG9zZU1lbnUoKTogdm9pZCB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYWN0aW9uIGNsaWNrXG4gICAqL1xuICBvbkFjdGlvbkNsaWNrKGFjdGlvbjogU2hlZXRBY3Rpb24sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuaXNBY3Rpb25EaXNhYmxlZChhY3Rpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRW1pdCBldmVudFxuICAgIHRoaXMuYWN0aW9uQ2xpY2tlZC5lbWl0KHtcbiAgICAgIGFjdGlvbixcbiAgICAgIHNoZWV0SWQ6IHRoaXMuc2hlZXRJZFxuICAgIH0pO1xuXG4gICAgLy8gRXhlY3V0ZSBhY3Rpb24gY2FsbGJhY2sgaWYgcHJvdmlkZWRcbiAgICBpZiAoYWN0aW9uLmFjdGlvbikge1xuICAgICAgYWN0aW9uLmFjdGlvbih0aGlzLnNoZWV0SWQpO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VNZW51KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBpc0FjdGlvbkRpc2FibGVkKGFjdGlvbjogU2hlZXRBY3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGFjdGlvbi5kaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGFjdGlvbi5kaXNhYmxlZCgpO1xuICAgIH1cbiAgICByZXR1cm4gYWN0aW9uLmRpc2FibGVkIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB2aXNpYmxlIGFjdGlvbnMgYmFzZWQgb24gaGlkZGVuIHByb3BlcnR5XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVZpc2libGVBY3Rpb25zKCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZUFjdGlvbnMgPSB0aGlzLmFjdGlvbnMuZmlsdGVyKGFjdGlvbiA9PiB7XG4gICAgICBpZiAodHlwZW9mIGFjdGlvbi5oaWRkZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICFhY3Rpb24uaGlkZGVuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gIWFjdGlvbi5oaWRkZW47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRyb3Bkb3duIHBvc2l0aW9uIGJhc2VkIG9uIHRyaWdnZXIgYnV0dG9uXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZURyb3Bkb3duUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB0aGlzLmRyb3Bkb3duU3R5bGUgPSB7XG4gICAgICB0b3A6IGAke3JlY3QuYm90dG9tICsgNH1weGAsXG4gICAgICByaWdodDogYCR7d2luZG93LmlubmVyV2lkdGggLSByZWN0LnJpZ2h0fXB4YFxuICAgIH07XG4gIH1cbn1cblxuIiwiPGJ1dHRvbiBcbiAgY2xhc3M9XCJzaGVldC1hY3Rpb25zLWJ1dHRvblwiXG4gIChjbGljayk9XCJ0b2dnbGVNZW51KCRldmVudClcIlxuICB0eXBlPVwiYnV0dG9uXCJcbiAgdGl0bGU9XCJTaGVldCBBY3Rpb25zXCJcbiAgYXJpYS1sYWJlbD1cIlNoZWV0IGFjdGlvbnMgbWVudVwiXG4gIFtjbGFzcy5hY3RpdmVdPVwiaXNPcGVuXCJcbiAgKm5nSWY9XCJ2aXNpYmxlQWN0aW9ucy5sZW5ndGggPiAwXCI+XG4gIDxuaWxlLWljb24gbmFtZT1cImFycm93ZG93blwiIHNpemU9XCIxNFwiPjwvbmlsZS1pY29uPlxuPC9idXR0b24+XG5cbjwhLS0gRHJvcGRvd24gY29udGFpbmVyIC0tPlxuPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lclwiICpuZ0lmPVwiaXNPcGVuXCI+XG4gIDwhLS0gQmFja2Ryb3AgLS0+XG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1iYWNrZHJvcFwiIChjbGljayk9XCJjbG9zZU1lbnUoKVwiPjwvZGl2PlxuICBcbiAgPCEtLSBEcm9wZG93biBtZW51IC0tPlxuICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIFtuZ1N0eWxlXT1cImRyb3Bkb3duU3R5bGVcIj5cbiAgICA8bmlsZS1tZW51PlxuICAgICAgPG5pbGUtbWVudS1pdGVtIFxuICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHZpc2libGVBY3Rpb25zXCJcbiAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzQWN0aW9uRGlzYWJsZWQoYWN0aW9uKVwiXG4gICAgICAgIChjbGljayk9XCJvbkFjdGlvbkNsaWNrKGFjdGlvbiwgJGV2ZW50KVwiPlxuICAgICAgICA8bmlsZS1pY29uICpuZ0lmPVwiYWN0aW9uLmljb25cIiBzaXplPVwiMTRcIiBzbG90PVwicHJlZml4XCIgW25hbWVdPVwiYWN0aW9uLmljb25cIj48L25pbGUtaWNvbj5cbiAgICAgICAge3sgYWN0aW9uLmxhYmVsIH19XG4gICAgICA8L25pbGUtbWVudS1pdGVtPlxuICAgICAgXG4gICAgICA8bmlsZS1tZW51LWl0ZW0gKm5nSWY9XCJ2aXNpYmxlQWN0aW9ucy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgTm8gYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgIDwvbmlsZS1tZW51LWl0ZW0+XG4gICAgPC9uaWxlLW1lbnU+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
|