@one-grid-core/angular 0.1.0-beta.5 → 0.2.0
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 +49 -4
- package/esm2022/lib/components/one-grid/one-grid.component.mjs +67 -16
- package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +282 -30
- package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +10 -7
- package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +60 -4
- package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +14 -5
- package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +50 -13
- package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +39 -15
- package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +54 -8
- package/esm2022/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.mjs +110 -0
- package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +9 -2
- package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +33 -51
- package/esm2022/lib/core/instants/one-grid-api.class.mjs +429 -166
- package/esm2022/lib/core/instants/one-row-node.class.mjs +103 -37
- package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
- package/esm2022/lib/core/models/one-event-types.model.mjs +1 -1
- package/esm2022/lib/core/models/one-grid-types.model.mjs +1 -1
- package/esm2022/lib/core/models/one-row-drag.model.mjs +2 -0
- package/esm2022/lib/core/models/one-row.model.mjs +1 -1
- package/esm2022/lib/core/models/one-tree-data.model.mjs +1 -1
- package/esm2022/lib/core/models/one-validation.model.mjs +1 -1
- package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +8 -3
- package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +3 -1
- package/esm2022/lib/core/services/og-column.service.mjs +120 -13
- package/esm2022/lib/core/services/one-grid-cell.service.mjs +123 -20
- package/esm2022/lib/core/services/one-grid-row-drag.service.mjs +351 -0
- package/esm2022/lib/core/services/one-grid-selection.service.mjs +19 -6
- package/esm2022/lib/helpers/one-column-def.helper.mjs +27 -2
- package/esm2022/lib/helpers/one-filter.helper.mjs +71 -12
- package/esm2022/lib/helpers/one-validation.helper.mjs +7 -2
- package/esm2022/lib/index.mjs +8 -1
- package/esm2022/lib/one-grid.module.mjs +7 -16
- package/fesm2022/one-grid-core-angular.mjs +2046 -503
- package/fesm2022/one-grid-core-angular.mjs.map +1 -1
- package/lib/components/one-grid/one-grid.component.d.ts +16 -1
- package/lib/components/one-grid-body/one-grid-body.component.d.ts +132 -5
- package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +6 -1
- package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +19 -2
- package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +5 -2
- package/lib/components/one-grid-header/one-grid-header.component.d.ts +15 -7
- package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +24 -5
- package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +44 -0
- package/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.d.ts +39 -0
- package/lib/core/directives/one-cell-text-expand.directive.d.ts +21 -9
- package/lib/core/instants/one-grid-api.class.d.ts +212 -26
- package/lib/core/instants/one-row-node.class.d.ts +67 -14
- package/lib/core/models/one-column-def-types.model.d.ts +89 -15
- package/lib/core/models/one-event-types.model.d.ts +24 -1
- package/lib/core/models/one-grid-types.model.d.ts +36 -1
- package/lib/core/models/one-row-drag.model.d.ts +44 -0
- package/lib/core/models/one-row.model.d.ts +0 -5
- package/lib/core/models/one-tree-data.model.d.ts +13 -0
- package/lib/core/models/one-validation.model.d.ts +12 -2
- package/lib/core/pipes/column-sort-state.pipe.d.ts +1 -1
- package/lib/core/services/og-column.service.d.ts +44 -3
- package/lib/core/services/one-grid-cell.service.d.ts +52 -4
- package/lib/core/services/one-grid-row-drag.service.d.ts +113 -0
- package/lib/core/services/one-grid-selection.service.d.ts +9 -0
- package/lib/helpers/one-column-def.helper.d.ts +19 -1
- package/lib/helpers/one-filter.helper.d.ts +29 -4
- package/lib/index.d.ts +7 -0
- package/lib/one-grid.module.d.ts +17 -19
- package/package.json +1 -2
- package/scss/_one-grid.scss +389 -17
- package/esm2022/lib/core/pipes/cell-disable-resolver.pipe.mjs +0 -26
- package/lib/core/pipes/cell-disable-resolver.pipe.d.ts +0 -9
|
@@ -5,18 +5,21 @@ export class OneGridCellGroupRendererComponent {
|
|
|
5
5
|
this.masterDetail = false;
|
|
6
6
|
this.expansionChanged = new EventEmitter();
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Presentational only: report the click and let the body, which holds the
|
|
10
|
+
* API, perform the toggle. The click is stopped from bubbling so it is not
|
|
11
|
+
* also read as a cell click by the cell underneath.
|
|
12
|
+
*/
|
|
13
|
+
invokeChangedClick(event) {
|
|
14
|
+
event.stopPropagation();
|
|
12
15
|
this.expansionChanged.emit({ rowIndex: this.node.rowIndex, data: this.node.data, node: this.node });
|
|
13
16
|
}
|
|
14
17
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellGroupRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
15
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridCellGroupRendererComponent, selector: "one-grid-cell-group-renderer", inputs: { node: "node", masterDetail: "masterDetail", detailCellRendererParams: "detailCellRendererParams", detailRendererComponent: "detailRendererComponent" }, outputs: { expansionChanged: "expansionChanged" }, ngImport: i0, template: "@if (node.expandable) {\n <span class=\"cell-group-renderer\" [style.padding-left.px]=\"6\"
|
|
18
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridCellGroupRendererComponent, selector: "one-grid-cell-group-renderer", inputs: { node: "node", masterDetail: "masterDetail", detailCellRendererParams: "detailCellRendererParams", detailRendererComponent: "detailRendererComponent" }, outputs: { expansionChanged: "expansionChanged" }, ngImport: i0, template: "@if (node.expandable) {\n <span class=\"cell-group-renderer\" [style.padding-left.px]=\"6\">\n @if (node.children?.length > 0 || masterDetail) {\n <!-- A real button, not a div with a click handler: this is a\n disclosure control, so it needs to be focusable, operable with\n Enter and Space, and to expose its state via aria-expanded.\n mousedown is stopped so pressing the expander does not also\n begin a cell range selection on the cell underneath. -->\n <button\n type=\"button\"\n class=\"expansion-button\"\n [attr.aria-expanded]=\"node.expanded\"\n [attr.aria-label]=\"node.expanded ? 'Collapse row' : 'Expand row'\"\n (mousedown)=\"$event.stopPropagation()\"\n (dblclick)=\"$event.stopPropagation()\"\n (click)=\"invokeChangedClick($event)\">\n <i [class.node-expanded]=\"node.expanded\" class=\"bi bi-chevron-right expansion-icon\"></i>\n </button>\n }\n </span>\n}\n", styles: [""] }); }
|
|
16
19
|
}
|
|
17
20
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellGroupRendererComponent, decorators: [{
|
|
18
21
|
type: Component,
|
|
19
|
-
args: [{ standalone: false, selector: 'one-grid-cell-group-renderer', template: "@if (node.expandable) {\n <span class=\"cell-group-renderer\" [style.padding-left.px]=\"6\"
|
|
22
|
+
args: [{ standalone: false, selector: 'one-grid-cell-group-renderer', template: "@if (node.expandable) {\n <span class=\"cell-group-renderer\" [style.padding-left.px]=\"6\">\n @if (node.children?.length > 0 || masterDetail) {\n <!-- A real button, not a div with a click handler: this is a\n disclosure control, so it needs to be focusable, operable with\n Enter and Space, and to expose its state via aria-expanded.\n mousedown is stopped so pressing the expander does not also\n begin a cell range selection on the cell underneath. -->\n <button\n type=\"button\"\n class=\"expansion-button\"\n [attr.aria-expanded]=\"node.expanded\"\n [attr.aria-label]=\"node.expanded ? 'Collapse row' : 'Expand row'\"\n (mousedown)=\"$event.stopPropagation()\"\n (dblclick)=\"$event.stopPropagation()\"\n (click)=\"invokeChangedClick($event)\">\n <i [class.node-expanded]=\"node.expanded\" class=\"bi bi-chevron-right expansion-icon\"></i>\n </button>\n }\n </span>\n}\n" }]
|
|
20
23
|
}], propDecorators: { node: [{
|
|
21
24
|
type: Input
|
|
22
25
|
}], masterDetail: [{
|
|
@@ -28,4 +31,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
28
31
|
}], expansionChanged: [{
|
|
29
32
|
type: Output
|
|
30
33
|
}] } });
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlci9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyL29uZS1ncmlkLWNlbGwtZ3JvdXAtcmVuZGVyZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBUSxNQUFNLGVBQWUsQ0FBQzs7QUFZN0UsTUFBTSxPQUFPLGlDQUFpQztJQU45QztRQVNXLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRzdCLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0tBYTNFO0lBWEM7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLEtBQWlCO1FBRWxDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEcsQ0FBQzsrR0FsQlUsaUNBQWlDO21HQUFqQyxpQ0FBaUMseVJDWjlDLDRsQ0FxQkE7OzRGRFRhLGlDQUFpQztrQkFON0MsU0FBUztpQ0FDSSxLQUFLLFlBQ1AsOEJBQThCOzhCQU0vQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNJLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgRXhwYW5zaW9uQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsJztcbmltcG9ydCB7IE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS10cmVlLWRhdGEubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWNlbGwtZ3JvdXAtcmVuZGVyZXIuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRDZWxsR3JvdXBSZW5kZXJlckNvbXBvbmVudDxUPiB7XG5cbiAgQElucHV0KCkgbm9kZTogT25lUm93Tm9kZTxUPjtcbiAgQElucHV0KCkgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICBASW5wdXQoKSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudDogVHlwZTxPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQ+O1xuICBAT3V0cHV0KCkgZXhwYW5zaW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXhwYW5zaW9uQ2hhbmdlZEV2ZW50PFQ+PigpO1xuXG4gIC8qKlxuICAgKiBQcmVzZW50YXRpb25hbCBvbmx5OiByZXBvcnQgdGhlIGNsaWNrIGFuZCBsZXQgdGhlIGJvZHksIHdoaWNoIGhvbGRzIHRoZVxuICAgKiBBUEksIHBlcmZvcm0gdGhlIHRvZ2dsZS4gVGhlIGNsaWNrIGlzIHN0b3BwZWQgZnJvbSBidWJibGluZyBzbyBpdCBpcyBub3RcbiAgICogYWxzbyByZWFkIGFzIGEgY2VsbCBjbGljayBieSB0aGUgY2VsbCB1bmRlcm5lYXRoLlxuICAgKi9cbiAgaW52b2tlQ2hhbmdlZENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuZXhwYW5zaW9uQ2hhbmdlZC5lbWl0KHsgcm93SW5kZXg6IHRoaXMubm9kZS5yb3dJbmRleCwgZGF0YTogdGhpcy5ub2RlLmRhdGEsIG5vZGU6IHRoaXMubm9kZSB9KTtcbiAgfVxufVxuIiwiQGlmIChub2RlLmV4cGFuZGFibGUpIHtcbiAgICA8c3BhbiBjbGFzcz1cImNlbGwtZ3JvdXAtcmVuZGVyZXJcIiBbc3R5bGUucGFkZGluZy1sZWZ0LnB4XT1cIjZcIj5cbiAgICAgICAgQGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGggPiAwIHx8IG1hc3RlckRldGFpbCkge1xuICAgICAgICAgICAgPCEtLSBBIHJlYWwgYnV0dG9uLCBub3QgYSBkaXYgd2l0aCBhIGNsaWNrIGhhbmRsZXI6IHRoaXMgaXMgYVxuICAgICAgICAgICAgICAgICBkaXNjbG9zdXJlIGNvbnRyb2wsIHNvIGl0IG5lZWRzIHRvIGJlIGZvY3VzYWJsZSwgb3BlcmFibGUgd2l0aFxuICAgICAgICAgICAgICAgICBFbnRlciBhbmQgU3BhY2UsIGFuZCB0byBleHBvc2UgaXRzIHN0YXRlIHZpYSBhcmlhLWV4cGFuZGVkLlxuICAgICAgICAgICAgICAgICBtb3VzZWRvd24gaXMgc3RvcHBlZCBzbyBwcmVzc2luZyB0aGUgZXhwYW5kZXIgZG9lcyBub3QgYWxzb1xuICAgICAgICAgICAgICAgICBiZWdpbiBhIGNlbGwgcmFuZ2Ugc2VsZWN0aW9uIG9uIHRoZSBjZWxsIHVuZGVybmVhdGguIC0tPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZXhwYW5zaW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJub2RlLmV4cGFuZGVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm5vZGUuZXhwYW5kZWQgPyAnQ29sbGFwc2Ugcm93JyA6ICdFeHBhbmQgcm93J1wiXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChkYmxjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VDaGFuZ2VkQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDxpIFtjbGFzcy5ub2RlLWV4cGFuZGVkXT1cIm5vZGUuZXhwYW5kZWRcIiBjbGFzcz1cImJpIGJpLWNoZXZyb24tcmlnaHQgZXhwYW5zaW9uLWljb25cIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgIDwvc3Bhbj5cbn1cbiJdfQ==
|
package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
|
|
1
|
+
import { Component, EventEmitter, HostListener, Input, Output, ViewChildren } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
export class OneGridCellOptionMenuComponent {
|
|
4
|
+
get menuLabel() {
|
|
5
|
+
return `Options for ${this.column?.headerName ?? this.column?.field ?? 'this cell'}`;
|
|
6
|
+
}
|
|
4
7
|
constructor(elementRef) {
|
|
5
8
|
this.elementRef = elementRef;
|
|
6
9
|
this.column = null;
|
|
@@ -8,6 +11,56 @@ export class OneGridCellOptionMenuComponent {
|
|
|
8
11
|
this.options = [];
|
|
9
12
|
this.cellOptionMenuSelect = new EventEmitter();
|
|
10
13
|
this.cellOptionMenuClose = new EventEmitter();
|
|
14
|
+
/**
|
|
15
|
+
* Roving tabindex: one item is tabbable and the arrows move which. Standard
|
|
16
|
+
* for a menu — a list of separately tabbable buttons makes a keyboard user
|
|
17
|
+
* tab through every option to get past the menu.
|
|
18
|
+
*/
|
|
19
|
+
this.activeIndex = 0;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Move focus into the menu once it exists.
|
|
23
|
+
*
|
|
24
|
+
* Opening a menu and leaving focus on the trigger strands a keyboard user:
|
|
25
|
+
* the menu is on screen and nothing they press reaches it.
|
|
26
|
+
*/
|
|
27
|
+
ngAfterViewInit() {
|
|
28
|
+
this.focusItem(0);
|
|
29
|
+
}
|
|
30
|
+
onItemKeydown(event, index, option) {
|
|
31
|
+
switch (event.key) {
|
|
32
|
+
case 'ArrowDown':
|
|
33
|
+
event.preventDefault();
|
|
34
|
+
this.focusItem((index + 1) % this.options.length);
|
|
35
|
+
return;
|
|
36
|
+
case 'ArrowUp':
|
|
37
|
+
event.preventDefault();
|
|
38
|
+
this.focusItem((index - 1 + this.options.length) % this.options.length);
|
|
39
|
+
return;
|
|
40
|
+
case 'Home':
|
|
41
|
+
event.preventDefault();
|
|
42
|
+
this.focusItem(0);
|
|
43
|
+
return;
|
|
44
|
+
case 'End':
|
|
45
|
+
event.preventDefault();
|
|
46
|
+
this.focusItem(this.options.length - 1);
|
|
47
|
+
return;
|
|
48
|
+
case 'Enter':
|
|
49
|
+
case ' ':
|
|
50
|
+
// A <button> already activates on both, but only once the default runs.
|
|
51
|
+
// Handling it here keeps the menu's behaviour independent of that.
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
this.onOptionSelected(option);
|
|
54
|
+
return;
|
|
55
|
+
default:
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
focusItem(index) {
|
|
60
|
+
if (!this.options?.length)
|
|
61
|
+
return;
|
|
62
|
+
this.activeIndex = index;
|
|
63
|
+
this.items?.get(index)?.nativeElement?.focus();
|
|
11
64
|
}
|
|
12
65
|
// Click outside
|
|
13
66
|
onDocumentClick(event) {
|
|
@@ -39,11 +92,11 @@ export class OneGridCellOptionMenuComponent {
|
|
|
39
92
|
this.cellOptionMenuClose.emit();
|
|
40
93
|
}
|
|
41
94
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellOptionMenuComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
42
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridCellOptionMenuComponent, selector: "one-grid-cell-option-menu", inputs: { column: "column", node: "node", options: "options" }, outputs: { cellOptionMenuSelect: "cellOptionMenuSelect", cellOptionMenuClose: "cellOptionMenuClose" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()", "document:scroll": "onScroll()" } }, ngImport: i0, template: "<div class=\"cell-option-menu\" #menuEl>\n @for (opt of options; track opt.value) {\n <
|
|
95
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridCellOptionMenuComponent, selector: "one-grid-cell-option-menu", inputs: { column: "column", node: "node", options: "options" }, outputs: { cellOptionMenuSelect: "cellOptionMenuSelect", cellOptionMenuClose: "cellOptionMenuClose" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()", "document:scroll": "onScroll()" } }, viewQueries: [{ propertyName: "items", predicate: ["item"], descendants: true }], ngImport: i0, template: "<!-- A menu, so it is announced as one and operable from the keyboard: the items\n were `<div (click)>` with no role, which meant the menu could be opened by\n mouse and then not used at all without one. -->\n<div class=\"cell-option-menu\" role=\"menu\" #menuEl [attr.aria-label]=\"menuLabel\">\n @for (opt of options; let index = $index; track opt.value) {\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"cell-option-menu-item\"\n #item\n [tabindex]=\"index === activeIndex ? 0 : -1\"\n (click)=\"onOptionSelected(opt)\"\n (keydown)=\"onItemKeydown($event, index, opt)\">\n <span>{{ opt.text }}</span>\n </button>\n }\n</div>\n", styles: [""] }); }
|
|
43
96
|
}
|
|
44
97
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellOptionMenuComponent, decorators: [{
|
|
45
98
|
type: Component,
|
|
46
|
-
args: [{ selector: 'one-grid-cell-option-menu', standalone: false, template: "<div class=\"cell-option-menu\" #menuEl>\n @for (opt of options; track opt.value) {\n <
|
|
99
|
+
args: [{ selector: 'one-grid-cell-option-menu', standalone: false, template: "<!-- A menu, so it is announced as one and operable from the keyboard: the items\n were `<div (click)>` with no role, which meant the menu could be opened by\n mouse and then not used at all without one. -->\n<div class=\"cell-option-menu\" role=\"menu\" #menuEl [attr.aria-label]=\"menuLabel\">\n @for (opt of options; let index = $index; track opt.value) {\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"cell-option-menu-item\"\n #item\n [tabindex]=\"index === activeIndex ? 0 : -1\"\n (click)=\"onOptionSelected(opt)\"\n (keydown)=\"onItemKeydown($event, index, opt)\">\n <span>{{ opt.text }}</span>\n </button>\n }\n</div>\n" }]
|
|
47
100
|
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { column: [{
|
|
48
101
|
type: Input
|
|
49
102
|
}], node: [{
|
|
@@ -54,6 +107,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
54
107
|
type: Output
|
|
55
108
|
}], cellOptionMenuClose: [{
|
|
56
109
|
type: Output
|
|
110
|
+
}], items: [{
|
|
111
|
+
type: ViewChildren,
|
|
112
|
+
args: ['item']
|
|
57
113
|
}], onDocumentClick: [{
|
|
58
114
|
type: HostListener,
|
|
59
115
|
args: ['document:click', ['$event']]
|
|
@@ -64,4 +120,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
64
120
|
type: HostListener,
|
|
65
121
|
args: ['document:scroll']
|
|
66
122
|
}] } });
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51L29uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7O0FBVzVHLE1BQU0sT0FBTyw4QkFBOEI7SUFRekMsWUFBb0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQU5qQyxXQUFNLEdBQWlCLElBQUksQ0FBQztRQUM1QixTQUFJLEdBQWUsSUFBSSxDQUFDO1FBQ3hCLFlBQU8sR0FBd0IsRUFBRSxDQUFDO1FBQ2pDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUErQixDQUFDO1FBQ3ZFLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFWixDQUFDO0lBRTlDLGdCQUFnQjtJQUVoQixlQUFlLENBQUMsS0FBaUI7UUFFL0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFFM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBRXBELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYTtJQUViLFFBQVE7UUFFTixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsNkNBQTZDO0lBRTdDLFFBQVE7UUFFTixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGdCQUFnQixDQUFDLE1BQVc7UUFFMUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQztZQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsc0JBQXNCO0lBQ2QsS0FBSztRQUVYLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsQyxDQUFDOytHQXBEVSw4QkFBOEI7bUdBQTlCLDhCQUE4Qix3WENYM0MsaVlBT007OzRGRElPLDhCQUE4QjtrQkFOMUMsU0FBUzsrQkFDRSwyQkFBMkIsY0FDekIsS0FBSzsrRUFNUixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQU1QLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFhMUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QjtnQkFRdkMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25lUm93Tm9kZSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLXJvdy1ub2RlLmNsYXNzJztcbmltcG9ydCB7IE9uZUNvbHVtbkRlZiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudCwgT25lQ2VsbE9wdGlvbk1lbnUgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51JyxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnUuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBPbmVHcmlkQ2VsbE9wdGlvbk1lbnVDb21wb25lbnQge1xuXG4gIEBJbnB1dCgpIGNvbHVtbjogT25lQ29sdW1uRGVmID0gbnVsbDtcbiAgQElucHV0KCkgbm9kZTogT25lUm93Tm9kZSA9IG51bGw7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IE9uZUNlbGxPcHRpb25NZW51W10gPSBbXTtcbiAgQE91dHB1dCgpIGNlbGxPcHRpb25NZW51U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjZWxsT3B0aW9uTWVudUNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cblxuICAvLyBDbGljayBvdXRzaWRlXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcblxuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVzY2FwZSBrZXlcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxuICBvbkVzY2FwZSgpIHtcblxuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIC8vIFNjcm9sbCBjbG9zZXMgbWVudSAocHJldmVudHMgbWlzYWxpZ25tZW50KVxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpzY3JvbGwnKVxuICBvblNjcm9sbCgpIHtcblxuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIC8vIE9wdGlvbiBzZWxlY3RlZFxuICBvbk9wdGlvblNlbGVjdGVkKG9wdGlvbjogYW55KSB7XG5cbiAgICB0aGlzLmNlbGxPcHRpb25NZW51U2VsZWN0LmVtaXQoe1xuICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcbiAgICAgIG5vZGU6IHRoaXMubm9kZSxcbiAgICAgIG9wdGlvbjogb3B0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLy8gU2luZ2xlIGNsb3NlIG1ldGhvZFxuICBwcml2YXRlIGNsb3NlKCkge1xuXG4gICAgdGhpcy5ub2RlLmNlbGxPcHRpb25zW3RoaXMuY29sdW1uLmZpZWxkXSA9IGZhbHNlO1xuICAgIHRoaXMuY2VsbE9wdGlvbk1lbnVDbG9zZS5lbWl0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjZWxsLW9wdGlvbi1tZW51XCIgI21lbnVFbD5cbiAgICBAZm9yIChvcHQgb2Ygb3B0aW9uczsgdHJhY2sgb3B0LnZhbHVlKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZWxsLW9wdGlvbi1tZW51LWl0ZW1cIiAoY2xpY2spPVwib25PcHRpb25TZWxlY3RlZChvcHQpXCI+XG4gICAgICAgICAgICA8IS0tIDxzcGFuIFtzdHlsZS5wYWRkaW5nLXJpZ2h0LnB4XT1cIjhcIj48bHVjaWRlLWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTZcIiBbc3Ryb2tlV2lkdGhdPVwiMlwiPjwvbHVjaWRlLWljb24+PC9zcGFuPiAtLT5cbiAgICAgICAgICAgIDxzcGFuPnt7IG9wdC50ZXh0IH19PC9zcGFuPiBcbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9kaXY+Il19
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51L29uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUF3QixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBV3BKLE1BQU0sT0FBTyw4QkFBOEI7SUFpQnpDLElBQWMsU0FBUztRQUVyQixPQUFPLGVBQWUsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksV0FBVyxFQUFFLENBQUM7SUFDdkYsQ0FBQztJQUVELFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFwQmpDLFdBQU0sR0FBaUIsSUFBSSxDQUFDO1FBQzVCLFNBQUksR0FBZSxJQUFJLENBQUM7UUFDeEIsWUFBTyxHQUF3QixFQUFFLENBQUM7UUFDakMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7UUFDdkUsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUl6RDs7OztXQUlHO1FBQ08sZ0JBQVcsR0FBRyxDQUFDLENBQUM7SUFPbUIsQ0FBQztJQUU5Qzs7Ozs7T0FLRztJQUNILGVBQWU7UUFFYixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMs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OytCQUNFLDJCQUEyQixjQUN6QixLQUFLOytFQU1SLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRXVCLEtBQUs7c0JBQWxDLFlBQVk7dUJBQUMsTUFBTTtnQkEyRXBCLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFhMUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QjtnQkFRdkMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVDb2x1bW5EZWYgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQsIE9uZUNlbGxPcHRpb25NZW51IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb25lLWdyaWQtY2VsbC1vcHRpb24tbWVudScsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51LmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZENlbGxPcHRpb25NZW51Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQElucHV0KCkgY29sdW1uOiBPbmVDb2x1bW5EZWYgPSBudWxsO1xuICBASW5wdXQoKSBub2RlOiBPbmVSb3dOb2RlID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9uczogT25lQ2VsbE9wdGlvbk1lbnVbXSA9IFtdO1xuICBAT3V0cHV0KCkgY2VsbE9wdGlvbk1lbnVTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNlbGxPcHRpb25NZW51Q2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZHJlbignaXRlbScpIHByaXZhdGUgaXRlbXM/OiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD4+O1xuXG4gIC8qKlxuICAgKiBSb3ZpbmcgdGFiaW5kZXg6IG9uZSBpdGVtIGlzIHRhYmJhYmxlIGFuZCB0aGUgYXJyb3dzIG1vdmUgd2hpY2guIFN0YW5kYXJkXG4gICAqIGZvciBhIG1lbnUg4oCUIGEgbGlzdCBvZiBzZXBhcmF0ZWx5IHRhYmJhYmxlIGJ1dHRvbnMgbWFrZXMgYSBrZXlib2FyZCB1c2VyXG4gICAqIHRhYiB0aHJvdWdoIGV2ZXJ5IG9wdGlvbiB0byBnZXQgcGFzdCB0aGUgbWVudS5cbiAgICovXG4gIHByb3RlY3RlZCBhY3RpdmVJbmRleCA9IDA7XG5cbiAgcHJvdGVjdGVkIGdldCBtZW51TGFiZWwoKTogc3RyaW5nIHtcblxuICAgIHJldHVybiBgT3B0aW9ucyBmb3IgJHt0aGlzLmNvbHVtbj8uaGVhZGVyTmFtZSA/PyB0aGlzLmNvbHVtbj8uZmllbGQgPz8gJ3RoaXMgY2VsbCd9YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cblxuICAvKipcbiAgICogTW92ZSBmb2N1cyBpbnRvIHRoZSBtZW51IG9uY2UgaXQgZXhpc3RzLlxuICAgKlxuICAgKiBPcGVuaW5nIGEgbWVudSBhbmQgbGVhdmluZyBmb2N1cyBvbiB0aGUgdHJpZ2dlciBzdHJhbmRzIGEga2V5Ym9hcmQgdXNlcjpcbiAgICogdGhlIG1lbnUgaXMgb24gc2NyZWVuIGFuZCBub3RoaW5nIHRoZXkgcHJlc3MgcmVhY2hlcyBpdC5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuZm9jdXNJdGVtKDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSXRlbUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGluZGV4OiBudW1iZXIsIG9wdGlvbjogT25lQ2VsbE9wdGlvbk1lbnUpOiB2b2lkIHtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG5cbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKChpbmRleCArIDEpICUgdGhpcy5vcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKChpbmRleCAtIDEgKyB0aGlzLm9wdGlvbnMubGVuZ3RoKSAlIHRoaXMub3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmZvY3VzSXRlbSgwKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmZvY3VzSXRlbSh0aGlzLm9wdGlvbnMubGVuZ3RoIC0gMSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnICc6XG4gICAgICAgIC8vIEEgPGJ1dHRvbj4gYWxyZWFkeSBhY3RpdmF0ZXMgb24gYm90aCwgYnV0IG9ubHkgb25jZSB0aGUgZGVmYXVsdCBydW5zLlxuICAgICAgICAvLyBIYW5kbGluZyBpdCBoZXJlIGtlZXBzIHRoZSBtZW51J3MgYmVoYXZpb3VyIGluZGVwZW5kZW50IG9mIHRoYXQuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub25PcHRpb25TZWxlY3RlZChvcHRpb24pO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzSXRlbShpbmRleDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gaW5kZXg7XG5cbiAgICB0aGlzLml0ZW1zPy5nZXQoaW5kZXgpPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgLy8gQ2xpY2sgb3V0c2lkZVxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG5cbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBFc2NhcGUga2V5XG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKSB7XG5cbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICAvLyBTY3JvbGwgY2xvc2VzIG1lbnUgKHByZXZlbnRzIG1pc2FsaWdubWVudClcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6c2Nyb2xsJylcbiAgb25TY3JvbGwoKSB7XG5cbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICAvLyBPcHRpb24gc2VsZWN0ZWRcbiAgb25PcHRpb25TZWxlY3RlZChvcHRpb246IGFueSkge1xuXG4gICAgdGhpcy5jZWxsT3B0aW9uTWVudVNlbGVjdC5lbWl0KHtcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICBub2RlOiB0aGlzLm5vZGUsXG4gICAgICBvcHRpb246IG9wdGlvblxuICAgIH0pO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIC8vIFNpbmdsZSBjbG9zZSBtZXRob2RcbiAgcHJpdmF0ZSBjbG9zZSgpIHtcblxuICAgIHRoaXMubm9kZS5jZWxsT3B0aW9uc1t0aGlzLmNvbHVtbi5maWVsZF0gPSBmYWxzZTtcbiAgICB0aGlzLmNlbGxPcHRpb25NZW51Q2xvc2UuZW1pdCgpO1xuICB9XG59XG4iLCI8IS0tIEEgbWVudSwgc28gaXQgaXMgYW5ub3VuY2VkIGFzIG9uZSBhbmQgb3BlcmFibGUgZnJvbSB0aGUga2V5Ym9hcmQ6IHRoZSBpdGVtc1xuICAgICB3ZXJlIGA8ZGl2IChjbGljayk+YCB3aXRoIG5vIHJvbGUsIHdoaWNoIG1lYW50IHRoZSBtZW51IGNvdWxkIGJlIG9wZW5lZCBieVxuICAgICBtb3VzZSBhbmQgdGhlbiBub3QgdXNlZCBhdCBhbGwgd2l0aG91dCBvbmUuIC0tPlxuPGRpdiBjbGFzcz1cImNlbGwtb3B0aW9uLW1lbnVcIiByb2xlPVwibWVudVwiICNtZW51RWwgW2F0dHIuYXJpYS1sYWJlbF09XCJtZW51TGFiZWxcIj5cbiAgICBAZm9yIChvcHQgb2Ygb3B0aW9uczsgbGV0IGluZGV4ID0gJGluZGV4OyB0cmFjayBvcHQudmFsdWUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAgY2xhc3M9XCJjZWxsLW9wdGlvbi1tZW51LWl0ZW1cIlxuICAgICAgICAgICAgI2l0ZW1cbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJpbmRleCA9PT0gYWN0aXZlSW5kZXggPyAwIDogLTFcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3B0aW9uU2VsZWN0ZWQob3B0KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbkl0ZW1LZXlkb3duKCRldmVudCwgaW5kZXgsIG9wdClcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG9wdC50ZXh0IH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cbiJdfQ==
|
package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs
CHANGED
|
@@ -10,6 +10,8 @@ export class OneGridCheckboxHeaderComponent {
|
|
|
10
10
|
this.eventService = eventService;
|
|
11
11
|
this.selectionService = selectionService;
|
|
12
12
|
this.allowedEdit = false;
|
|
13
|
+
/** Unsubscribe callbacks for the two grid listeners below. */
|
|
14
|
+
this.teardown = [];
|
|
13
15
|
this.state = 'unchecked';
|
|
14
16
|
this.rowNodes = [];
|
|
15
17
|
}
|
|
@@ -18,19 +20,26 @@ export class OneGridCheckboxHeaderComponent {
|
|
|
18
20
|
/**
|
|
19
21
|
* Listen Row Node Selection Changed Event
|
|
20
22
|
*/
|
|
21
|
-
this.eventService.addEventListener('selectionChanged', (payload) => {
|
|
23
|
+
this.teardown.push(this.eventService.addEventListener('selectionChanged', (payload) => {
|
|
22
24
|
this.rowNodes = this.api.getAllRowNodes();
|
|
23
25
|
const rowIds = this.rowNodes && this.rowNodes.length > 0 ? this.rowNodes.map((node) => node.rowId) : [];
|
|
24
26
|
this.state = this.selectionService.getSelectAllState(rowIds);
|
|
25
|
-
});
|
|
27
|
+
}));
|
|
26
28
|
/**
|
|
27
29
|
* Listen Row Data Changed Event
|
|
28
30
|
*/
|
|
29
|
-
this.eventService.addEventListener('rowDataChanged', (payload) => {
|
|
31
|
+
this.teardown.push(this.eventService.addEventListener('rowDataChanged', (payload) => {
|
|
30
32
|
this.rowNodes = this.api.getAllRowNodes();
|
|
31
33
|
const rowIds = this.rowNodes && this.rowNodes.length > 0 ? this.rowNodes.map((node) => node.rowId) : [];
|
|
32
34
|
this.state = this.selectionService.getSelectAllState(rowIds);
|
|
33
|
-
});
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
ngOnDestroy() {
|
|
38
|
+
// Both listeners were registered and never released. The component-scoped
|
|
39
|
+
// event service happened to clean up after them; relying on that left the
|
|
40
|
+
// component's own lifecycle incomplete.
|
|
41
|
+
this.teardown.forEach(unsubscribe => unsubscribe());
|
|
42
|
+
this.teardown.length = 0;
|
|
34
43
|
}
|
|
35
44
|
/**
|
|
36
45
|
* Toggle Selection Action
|
|
@@ -59,4 +68,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
59
68
|
}], allowedEdit: [{
|
|
60
69
|
type: Input
|
|
61
70
|
}] } });
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jaGVja2JveC1oZWFkZXIvb25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jaGVja2JveC1oZWFkZXIvb25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQWlCcEUsTUFBTSxPQUFPLDhCQUE4QjtJQVl6QyxZQUNVLFlBQWlDLEVBQ2pDLGdCQUF5QztRQUR6QyxpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtRQVgxQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUV0Qyw4REFBOEQ7UUFDN0MsYUFBUSxHQUFzQixFQUFFLENBQUM7UUFFM0MsVUFBSyxHQUFxQixXQUFXLENBQUM7UUFDdEMsYUFBUSxHQUFvQixFQUFFLENBQUM7SUFNbEMsQ0FBQztJQUVMLFFBQVE7UUFFTixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBRTNDOztXQUVHO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLE9BQWlDLEVBQUUsRUFBRTtZQUU5RyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBbUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFdkgsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVKOztXQUVHO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQStCLEVBQUUsRUFBRTtZQUUxRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFMUMsTUFBTSxNQUFNLEdBQWEsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBbUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFakksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXO1FBRVQsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRXBELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0IsQ0FBQyxLQUFVO1FBRTNCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxRQUFRO1lBQUUsT0FBTztRQUU1QyxNQUFNLE9BQU8sR0FBWSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUU5QyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFFOUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFFWixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRXZCLENBQUM7aUJBQU0sQ0FBQztnQkFFTixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzsrR0E1RVUsOEJBQThCO21HQUE5Qiw4QkFBOEIsb0hDakIzQyxpYUFRTTs7NEZEU08sOEJBQThCO2tCQU4xQyxTQUFTO2lDQUNJLEtBQUssWUFDUCwwQkFBMEI7OEhBTTNCLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgT25lR3JpZEFwaSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLWdyaWQtYXBpLmNsYXNzJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgT25lQ2hlY2tib3hTdGF0ZSwgUm93RGF0YUNoYW5nZWRFdmVudCxcbiAgUm93U2VsZWN0aW9uTW9kZSxcbiAgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LFxufSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnXG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiBmYWxzZSxcbiAgc2VsZWN0b3I6ICdvbmUtZ3JpZC1jaGVja2JveC1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWNoZWNrYm94LWhlYWRlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRDaGVja2JveEhlYWRlckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSBhcGkhOiBPbmVHcmlkQXBpPFQ+O1xuICBASW5wdXQoKSBhbGxvd2VkRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBVbnN1YnNjcmliZSBjYWxsYmFja3MgZm9yIHRoZSB0d28gZ3JpZCBsaXN0ZW5lcnMgYmVsb3cuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGVhcmRvd246IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgcHVibGljIHN0YXRlOiBPbmVDaGVja2JveFN0YXRlID0gJ3VuY2hlY2tlZCc7XG4gIHB1YmxpYyByb3dOb2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIHB1YmxpYyBzZWxlY3Rpb25Nb2RlOiBSb3dTZWxlY3Rpb25Nb2RlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZXZlbnRTZXJ2aWNlOiBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU2VydmljZTogT25lR3JpZFNlbGVjdGlvblNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IHRoaXMuYXBpLnJvd1NlbGVjdGlvbjtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBSb3cgTm9kZSBTZWxlY3Rpb24gQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMudGVhcmRvd24ucHVzaCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25DaGFuZ2VkJywgKHBheWxvYWQ6IFNlbGVjdGlvbkNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICB0aGlzLnJvd05vZGVzID0gdGhpcy5hcGkuZ2V0QWxsUm93Tm9kZXMoKTtcblxuICAgICAgY29uc3Qgcm93SWRzID0gdGhpcy5yb3dOb2RlcyAmJiB0aGlzLnJvd05vZGVzLmxlbmd0aCA+IDAgPyB0aGlzLnJvd05vZGVzLm1hcCgobm9kZTogT25lUm93Tm9kZTxUPikgPT4gbm9kZS5yb3dJZCkgOiBbXTtcblxuICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3RBbGxTdGF0ZShyb3dJZHMpO1xuICAgIH0pKTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBSb3cgRGF0YSBDaGFuZ2VkIEV2ZW50XG4gICAgICovXG4gICAgdGhpcy50ZWFyZG93bi5wdXNoKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd0RhdGFDaGFuZ2VkJywgKHBheWxvYWQ6IFJvd0RhdGFDaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgdGhpcy5yb3dOb2RlcyA9IHRoaXMuYXBpLmdldEFsbFJvd05vZGVzKCk7XG5cbiAgICAgIGNvbnN0IHJvd0lkczogc3RyaW5nW10gPSB0aGlzLnJvd05vZGVzICYmIHRoaXMucm93Tm9kZXMubGVuZ3RoID4gMCA/IHRoaXMucm93Tm9kZXMubWFwKChub2RlOiBPbmVSb3dOb2RlPFQ+KSA9PiBub2RlLnJvd0lkKSA6IFtdO1xuXG4gICAgICB0aGlzLnN0YXRlID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdEFsbFN0YXRlKHJvd0lkcyk7XG4gICAgfSkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICAvLyBCb3RoIGxpc3RlbmVycyB3ZXJlIHJlZ2lzdGVyZWQgYW5kIG5ldmVyIHJlbGVhc2VkLiBUaGUgY29tcG9uZW50LXNjb3BlZFxuICAgIC8vIGV2ZW50IHNlcnZpY2UgaGFwcGVuZWQgdG8gY2xlYW4gdXAgYWZ0ZXIgdGhlbTsgcmVseWluZyBvbiB0aGF0IGxlZnQgdGhlXG4gICAgLy8gY29tcG9uZW50J3Mgb3duIGxpZmVjeWNsZSBpbmNvbXBsZXRlLlxuICAgIHRoaXMudGVhcmRvd24uZm9yRWFjaCh1bnN1YnNjcmliZSA9PiB1bnN1YnNjcmliZSgpKTtcblxuICAgIHRoaXMudGVhcmRvd24ubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgU2VsZWN0aW9uIEFjdGlvblxuICAgKi9cbiAgdG9nZ2xlU2VsZWN0aW9uQWxsKGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnKSByZXR1cm47XG5cbiAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XG5cbiAgICBpZiAodGhpcy5yb3dOb2RlcyAmJiB0aGlzLnJvd05vZGVzLmxlbmd0aCA+IDApIHtcblxuICAgICAgaWYgKGNoZWNrZWQpIHtcblxuICAgICAgICB0aGlzLmFwaS5zZWxlY3RBbGwoKTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICB0aGlzLmFwaS5kZXNlbGVjdEFsbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWNoZWNrYm94XCI+XG4gICAgPGlucHV0XG4gICAgICAgIFtpZF09XCJhcGkuaWRcIlxuICAgICAgICBbdHlwZV09XCInY2hlY2tib3gnXCJcbiAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInJvd05vZGVzIHwgaGVhZGVyQ2hlY2tib3hEaXNhYmxlZDpzZWxlY3Rpb25Nb2RlOmFsbG93ZWRFZGl0XCJcbiAgICAgICAgW2NoZWNrZWRdPVwicm93Tm9kZXMgfCBoZWFkZXJDaGVja2JveENoZWNrZWQ6c2VsZWN0aW9uTW9kZTpzdGF0ZVwiXG4gICAgICAgIFtpbmRldGVybWluYXRlXT1cInJvd05vZGVzIHwgaGVhZGVyQ2hlY2tib3hJbmRldGVybWluYXRlOnNlbGVjdGlvbk1vZGU6c3RhdGVcIlxuICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdGlvbkFsbCgkZXZlbnQpXCIgLz5cbjwvZGl2PiJdfQ==
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import {
|
|
1
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { Subscription } from 'rxjs';
|
|
3
|
+
import { resolveColumnWidth } from '../../helpers/one-column-def.helper';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
import * as i1 from "../../core/services/one-grid-event.service";
|
|
5
6
|
import * as i2 from "@angular/common";
|
|
@@ -7,16 +8,29 @@ import * as i3 from "lucide-angular";
|
|
|
7
8
|
import * as i4 from "../one-grid-checkbox-header/one-grid-checkbox-header.component";
|
|
8
9
|
import * as i5 from "../../core/pipes/column-sort-state.pipe";
|
|
9
10
|
export class OneGridHeaderComponent {
|
|
11
|
+
/**
|
|
12
|
+
* Horizontal offset of the body, mirrored here so the header tracks it.
|
|
13
|
+
*
|
|
14
|
+
* Applied to the viewport's `scrollLeft` rather than as a transform on the
|
|
15
|
+
* row: sticky positioning needs a real scrollport above it. The group row,
|
|
16
|
+
* which is a sibling of that viewport, still reads this for its transform.
|
|
17
|
+
*/
|
|
18
|
+
set scrollLeft(value) {
|
|
19
|
+
this._scrollLeft = value ?? 0;
|
|
20
|
+
this.applyScrollLeft();
|
|
21
|
+
}
|
|
22
|
+
get scrollLeft() {
|
|
23
|
+
return this._scrollLeft;
|
|
24
|
+
}
|
|
10
25
|
constructor(eventService, cdr) {
|
|
11
26
|
this.eventService = eventService;
|
|
12
27
|
this.cdr = cdr;
|
|
13
|
-
this.
|
|
28
|
+
this._scrollLeft = 0;
|
|
14
29
|
this.allowedEdit = false;
|
|
15
30
|
this.enableGroupColumnDefs = false;
|
|
16
31
|
this.groupColumnDefs = [];
|
|
17
32
|
this.columnDefs = [];
|
|
18
33
|
this.sortModel = [];
|
|
19
|
-
this.destroy$ = new Subject();
|
|
20
34
|
this.subscriptions = new Subscription();
|
|
21
35
|
this.draggedIndex = null;
|
|
22
36
|
// Track resize state
|
|
@@ -58,6 +72,16 @@ export class OneGridHeaderComponent {
|
|
|
58
72
|
// this.cdr.markForCheck();
|
|
59
73
|
}));
|
|
60
74
|
}
|
|
75
|
+
ngAfterViewInit() {
|
|
76
|
+
// The input setter can run before the view exists, so whatever arrived
|
|
77
|
+
// first is applied once here.
|
|
78
|
+
this.applyScrollLeft();
|
|
79
|
+
}
|
|
80
|
+
applyScrollLeft() {
|
|
81
|
+
if (this.headerViewport) {
|
|
82
|
+
this.headerViewport.nativeElement.scrollLeft = this._scrollLeft;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
61
85
|
onHeaderMenuOptionClick(columnDef) {
|
|
62
86
|
}
|
|
63
87
|
onHeaderMenuSortClick(colId) {
|
|
@@ -83,7 +107,12 @@ export class OneGridHeaderComponent {
|
|
|
83
107
|
this.resizing = true;
|
|
84
108
|
this.resizeColumnIndex = columnIndex;
|
|
85
109
|
this.startX = event.clientX;
|
|
86
|
-
|
|
110
|
+
// Measure what is on screen rather than trusting `col.width`, which is
|
|
111
|
+
// optional: a column sized purely by minWidth had `undefined` here, and
|
|
112
|
+
// `Math.max(50, undefined + deltaX)` is NaN — the column collapsed on the
|
|
113
|
+
// first mouse move and could not be recovered.
|
|
114
|
+
const columnElement = event.target?.closest('.one-grid-header-column');
|
|
115
|
+
this.startWidth = columnElement?.offsetWidth || resolveColumnWidth(this.columnDefs[columnIndex]);
|
|
87
116
|
// Add document-level listeners for drag and release
|
|
88
117
|
document.addEventListener('mousemove', this.onResizeMove);
|
|
89
118
|
document.addEventListener('mouseup', this.onResizeEnd);
|
|
@@ -116,19 +145,27 @@ export class OneGridHeaderComponent {
|
|
|
116
145
|
event.preventDefault();
|
|
117
146
|
this.draggedIndex = null;
|
|
118
147
|
}
|
|
119
|
-
/**
|
|
120
|
-
* Clear All Subscriptions
|
|
121
|
-
*/
|
|
122
148
|
ngOnDestroy() {
|
|
123
|
-
|
|
149
|
+
// This completed an unused Subject and left the real subscription running.
|
|
150
|
+
// It survived only because OneGridEventService is component-scoped and
|
|
151
|
+
// tears its own listeners down — the header was relying on that by accident.
|
|
152
|
+
this.subscriptions.unsubscribe();
|
|
153
|
+
// A resize in flight owns two listeners on `document`. Without this they
|
|
154
|
+
// outlive the component, and their closures keep it alive with them.
|
|
155
|
+
if (this.resizing) {
|
|
156
|
+
this.onResizeEnd();
|
|
157
|
+
}
|
|
124
158
|
}
|
|
125
159
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridHeaderComponent, deps: [{ token: i1.OneGridEventService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
126
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridHeaderComponent, selector: "one-grid-header", inputs: { scrollLeft: "scrollLeft", allowedEdit: "allowedEdit", enableGroupColumnDefs: "enableGroupColumnDefs", api: "api" }, ngImport: i0, template: "<div class=\"one-grid-header\">\n @if (enableGroupColumnDefs) {\n <div class=\"one-group-header-row\" [style.transform]=\"'translateX(-' + scrollLeft + 'px)'\">\n <ng-container *ngTemplateOutlet=\"groupColumns; context: { groups: groupColumnDefs }\"></ng-container>\n </div>\n }\n <div class=\"one-grid-header-viewport\">\n <div class=\"one-header-row\"
|
|
160
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridHeaderComponent, selector: "one-grid-header", inputs: { scrollLeft: "scrollLeft", allowedEdit: "allowedEdit", enableGroupColumnDefs: "enableGroupColumnDefs", api: "api" }, viewQueries: [{ propertyName: "headerViewport", first: true, predicate: ["headerViewport"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"one-grid-header\">\n @if (enableGroupColumnDefs) {\n <div class=\"one-group-header-row\" [style.transform]=\"'translateX(-' + scrollLeft + 'px)'\">\n <ng-container *ngTemplateOutlet=\"groupColumns; context: { groups: groupColumnDefs }\"></ng-container>\n </div>\n }\n <!-- The column row is scrolled rather than translated. `position: sticky`\n resolves against the nearest scrollport, and a transformed ancestor is\n not one \u2014 pinned headers could never hold their place inside it. The\n group row above keeps its transform: groups span contiguous columns,\n which pinning reorders, so the two features do not combine. -->\n <div #headerViewport class=\"one-grid-header-viewport\">\n <div class=\"one-header-row\">\n <ng-container *ngTemplateOutlet=\"headerColumns; context: { columns: columnDefs }\"></ng-container>\n </div>\n </div>\n</div>\n\n<!-- Group Header Cell Template -->\n<ng-template #groupColumns let-groups=\"groups\">\n @for(group of groups; track group.id) {\n <div class=\"one-group-header-cell\"\n [style.width.px]=\"group.width\"\n [ngClass]=\"group._resolvedGroupClass\"\n [ngStyle]=\"group._resolvedGroupStyle\">\n <div class=\"one-group-header-cell-text\">\n {{ group.headerName }}\n </div>\n </div>\n }\n</ng-template>\n\n<!-- Header Cell Template -->\n<ng-template #headerColumns let-columns=\"columns\">\n @for (col of columns; let colIndex = $index; track col.id) {\n <div class=\"one-grid-header-column\"\n [attr.data-index]=\"colIndex\"\n [class.one-column-pinned-left]=\"col.pinned === 'left'\"\n [class.one-column-pinned-right]=\"col.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"col._pinnedEdge\"\n [class.one-column-pinned-edge]=\"col._pinnedEdge\"\n [style.left.px]=\"col.pinned === 'left' ? col._pinnedOffset : null\"\n [style.right.px]=\"col.pinned === 'right' ? col._pinnedOffset : null\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [draggable]=\"col._resolvedDragable\"\n (dragstart)=\"onDragColumnStart($event, colIndex)\"\n (dragover)=\"onDragColumnOver($event, colIndex)\"\n (dragend)=\"onDragColumnEnd($event)\"\n (drop)=\"onDropColumn($event)\">\n <div class=\"one-grid-header-cell\"\n [ngClass]=\"col._resolvedHeaderClass\"\n [ngStyle]=\"col._resolvedHeaderStyle\"\n >\n <span class=\"one-grid-header-cell-group\">\n @if (col?.headerCheckboxSelection) {\n <one-grid-checkbox-header\n [api]=\"api\"\n [allowedEdit]=\"allowedEdit\"\n />\n }\n\n {{ col?.headerName ?? '' }}\n </span>\n\n <!-- Og Resize Handler -->\n @if (col._resolvedResizable) {\n <div class=\"og-resize-handle\" (mousedown)=\"onResizeStart($event, colIndex)\">\n <i class=\"bi bi-grip-vertical\"></i>\n </div>\n }\n\n <div class=\"one-grid-header-cell-group\">\n\n <!-- Sort Menu Button -->\n @if (col._resolvedSortable) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuSortClick(col.field)\">\n\n @if ((col.field | columnSortState:api.sortModel) === 'asc') {\n <lucide-icon name=\"arrow-up-a-z\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else if ((col.field | columnSortState:api.sortModel) === 'desc') {\n <lucide-icon name=\"arrow-down-z-a\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else {\n <lucide-icon name=\"arrow-down-up\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n </div>\n }\n\n <!-- Og Option Menu Button -->\n @if (col && !col._resolvedSuppressHeaderMenuButton) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuOptionClick(col)\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "component", type: i4.OneGridCheckboxHeaderComponent, selector: "one-grid-checkbox-header", inputs: ["api", "allowedEdit"] }, { kind: "pipe", type: i5.ColumnSortStatePipe, name: "columnSortState" }] }); }
|
|
127
161
|
}
|
|
128
162
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridHeaderComponent, decorators: [{
|
|
129
163
|
type: Component,
|
|
130
|
-
args: [{ standalone: false, selector: 'one-grid-header', template: "<div class=\"one-grid-header\">\n @if (enableGroupColumnDefs) {\n <div class=\"one-group-header-row\" [style.transform]=\"'translateX(-' + scrollLeft + 'px)'\">\n <ng-container *ngTemplateOutlet=\"groupColumns; context: { groups: groupColumnDefs }\"></ng-container>\n </div>\n }\n <div class=\"one-grid-header-viewport\">\n <div class=\"one-header-row\"
|
|
131
|
-
}], ctorParameters: () => [{ type: i1.OneGridEventService }, { type: i0.ChangeDetectorRef }], propDecorators: {
|
|
164
|
+
args: [{ standalone: false, selector: 'one-grid-header', template: "<div class=\"one-grid-header\">\n @if (enableGroupColumnDefs) {\n <div class=\"one-group-header-row\" [style.transform]=\"'translateX(-' + scrollLeft + 'px)'\">\n <ng-container *ngTemplateOutlet=\"groupColumns; context: { groups: groupColumnDefs }\"></ng-container>\n </div>\n }\n <!-- The column row is scrolled rather than translated. `position: sticky`\n resolves against the nearest scrollport, and a transformed ancestor is\n not one \u2014 pinned headers could never hold their place inside it. The\n group row above keeps its transform: groups span contiguous columns,\n which pinning reorders, so the two features do not combine. -->\n <div #headerViewport class=\"one-grid-header-viewport\">\n <div class=\"one-header-row\">\n <ng-container *ngTemplateOutlet=\"headerColumns; context: { columns: columnDefs }\"></ng-container>\n </div>\n </div>\n</div>\n\n<!-- Group Header Cell Template -->\n<ng-template #groupColumns let-groups=\"groups\">\n @for(group of groups; track group.id) {\n <div class=\"one-group-header-cell\"\n [style.width.px]=\"group.width\"\n [ngClass]=\"group._resolvedGroupClass\"\n [ngStyle]=\"group._resolvedGroupStyle\">\n <div class=\"one-group-header-cell-text\">\n {{ group.headerName }}\n </div>\n </div>\n }\n</ng-template>\n\n<!-- Header Cell Template -->\n<ng-template #headerColumns let-columns=\"columns\">\n @for (col of columns; let colIndex = $index; track col.id) {\n <div class=\"one-grid-header-column\"\n [attr.data-index]=\"colIndex\"\n [class.one-column-pinned-left]=\"col.pinned === 'left'\"\n [class.one-column-pinned-right]=\"col.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"col._pinnedEdge\"\n [class.one-column-pinned-edge]=\"col._pinnedEdge\"\n [style.left.px]=\"col.pinned === 'left' ? col._pinnedOffset : null\"\n [style.right.px]=\"col.pinned === 'right' ? col._pinnedOffset : null\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [draggable]=\"col._resolvedDragable\"\n (dragstart)=\"onDragColumnStart($event, colIndex)\"\n (dragover)=\"onDragColumnOver($event, colIndex)\"\n (dragend)=\"onDragColumnEnd($event)\"\n (drop)=\"onDropColumn($event)\">\n <div class=\"one-grid-header-cell\"\n [ngClass]=\"col._resolvedHeaderClass\"\n [ngStyle]=\"col._resolvedHeaderStyle\"\n >\n <span class=\"one-grid-header-cell-group\">\n @if (col?.headerCheckboxSelection) {\n <one-grid-checkbox-header\n [api]=\"api\"\n [allowedEdit]=\"allowedEdit\"\n />\n }\n\n {{ col?.headerName ?? '' }}\n </span>\n\n <!-- Og Resize Handler -->\n @if (col._resolvedResizable) {\n <div class=\"og-resize-handle\" (mousedown)=\"onResizeStart($event, colIndex)\">\n <i class=\"bi bi-grip-vertical\"></i>\n </div>\n }\n\n <div class=\"one-grid-header-cell-group\">\n\n <!-- Sort Menu Button -->\n @if (col._resolvedSortable) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuSortClick(col.field)\">\n\n @if ((col.field | columnSortState:api.sortModel) === 'asc') {\n <lucide-icon name=\"arrow-up-a-z\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else if ((col.field | columnSortState:api.sortModel) === 'desc') {\n <lucide-icon name=\"arrow-down-z-a\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else {\n <lucide-icon name=\"arrow-down-up\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n </div>\n }\n\n <!-- Og Option Menu Button -->\n @if (col && !col._resolvedSuppressHeaderMenuButton) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuOptionClick(col)\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</ng-template>\n" }]
|
|
165
|
+
}], ctorParameters: () => [{ type: i1.OneGridEventService }, { type: i0.ChangeDetectorRef }], propDecorators: { headerViewport: [{
|
|
166
|
+
type: ViewChild,
|
|
167
|
+
args: ['headerViewport', { static: true }]
|
|
168
|
+
}], scrollLeft: [{
|
|
132
169
|
type: Input
|
|
133
170
|
}], allowedEdit: [{
|
|
134
171
|
type: Input
|
|
@@ -137,4 +174,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
137
174
|
}], api: [{
|
|
138
175
|
type: Input
|
|
139
176
|
}] } });
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1oZWFkZXIvb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1oZWFkZXIvb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFdkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUFZN0MsTUFBTSxPQUFPLHNCQUFzQjtJQXFCakMsWUFDVSxZQUFpQyxFQUNqQyxHQUFzQjtRQUR0QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFyQnZCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QiwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFHdEMsb0JBQWUsR0FBd0IsRUFBRSxDQUFDO1FBQzFDLGVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBRXJDLGNBQVMsR0FBc0IsRUFBRSxDQUFDO1FBQ2xDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFFM0MscUJBQXFCO1FBQ2IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBQ3hDLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxlQUFVLEdBQUcsQ0FB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RUFBRSxDQUFDO1lBRXBFLE9BQU87UUFDVCxDQUFDO1FBRUQsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUUzRCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFnQjtRQUU5QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWdCO1FBRTNCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBRVQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDOytHQTNLVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixxTENkbkMsbytIQTJGQTs7NEZEN0VhLHNCQUFzQjtrQkFObEMsU0FBUztpQ0FDSSxLQUFLLFlBQ1AsaUJBQWlCO3dIQU1sQixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25lQ29sdW1uRGVmLCBPbmVHcm91cENvbHVtbkRlZiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25lR3JpZEFwaSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLWdyaWQtYXBpLmNsYXNzJztcbmltcG9ydCB7IE9uZVNvcnRNb2RlbCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IENvbHVtbkNoYW5nZWRFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1ldmVudC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICBzZWxlY3RvcjogJ29uZS1ncmlkLWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBPbmVHcmlkSGVhZGVyQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIHNjcm9sbExlZnQgPSAwO1xuICBASW5wdXQoKSBhbGxvd2VkRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlbmFibGVHcm91cENvbHVtbkRlZnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpITogT25lR3JpZEFwaTxUPjtcblxuICBwcm90ZWN0ZWQgZ3JvdXBDb2x1bW5EZWZzOiBPbmVHcm91cENvbHVtbkRlZltdID0gW107XG4gIHByb3RlY3RlZCBjb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWY8VD5bXSA9IFtdO1xuXG4gIHByaXZhdGUgc29ydE1vZGVsOiBPbmVTb3J0TW9kZWw8VD5bXSA9IFtdO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGRyYWdnZWRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVHJhY2sgcmVzaXplIHN0YXRlXG4gIHByaXZhdGUgcmVzaXppbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNpemVDb2x1bW5JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhcnRYID0gMDtcbiAgcHJpdmF0ZSBzdGFydFdpZHRoID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIExpc3RlbiBDb2x1bW4gQ2hhbmdlZCBFdmVudFxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uQ2hhbmdlZCcsIChwYXlsb2FkOiBDb2x1bW5DaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgY29uc3QgeyBncm91cHMsIGNvbHVtbnMgfSA9IHBheWxvYWQ7XG5cbiAgICAgIGlmIChncm91cHMpIHtcblxuICAgICAgICB0aGlzLmdyb3VwQ29sdW1uRGVmcyA9IGdyb3VwcyBhcyBPbmVHcm91cENvbHVtbkRlZltdO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sdW1ucykge1xuXG4gICAgICAgIHRoaXMuY29sdW1uRGVmcyA9IGNvbHVtbnMgYXMgT25lQ29sdW1uRGVmW107XG4gICAgICB9XG5cbiAgICAgIC8vIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pKTtcbiAgfVxuXG4gIG9uSGVhZGVyTWVudU9wdGlvbkNsaWNrKGNvbHVtbkRlZjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgfVxuXG4gIG9uSGVhZGVyTWVudVNvcnRDbGljayhjb2xJZDoga2V5b2YgVCkge1xuXG4gICAgY29uc3QgY3VycmVudFNvcnQgPSB0aGlzLnNvcnRNb2RlbC5maW5kKHNvcnQgPT4gc29ydC5jb2xJZCA9PT0gY29sSWQpPy5zb3J0ID8/IG51bGw7XG5cbiAgICBjb25zdCBuZXh0U29ydCA9IHRoaXMuY3ljbGVTb3J0KGN1cnJlbnRTb3J0KTtcblxuICAgIHRoaXMuc29ydE1vZGVsID0gbmV4dFNvcnQgPyBbeyBjb2xJZCwgc29ydDogbmV4dFNvcnQgfV0gOiBbXTtcblxuICAgIHRoaXMuYXBpLm9uU29ydENoYW5nZWQodGhpcy5zb3J0TW9kZWwpO1xuICB9XG5cbiAgLy8gQ3ljbGUgU29ydGluZyBNb2RlbFxuICBwcml2YXRlIGN5Y2xlU29ydChjdXJyZW50OiAnYXNjJyB8ICdkZXNjJyB8IG51bGwpOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwge1xuXG4gICAgc3dpdGNoIChjdXJyZW50KSB7XG5cbiAgICAgIGNhc2UgbnVsbDogcmV0dXJuICdhc2MnO1xuXG4gICAgICBjYXNlICdhc2MnOiByZXR1cm4gJ2Rlc2MnO1xuXG4gICAgICBjYXNlICdkZXNjJzogcmV0dXJuIG51bGw7XG5cbiAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVzaXplU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQsIGNvbHVtbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIC8vIFByZXZlbnQgdGV4dCBzZWxlY3Rpb24gYW5kIGRlZmF1bHQgYmVoYXZpb3JcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbCB2YWx1ZXNcbiAgICB0aGlzLnJlc2l6aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7XG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgIHRoaXMuc3RhcnRXaWR0aCA9IHRoaXMuY29sdW1uRGVmc1tjb2x1bW5JbmRleF0ud2lkdGg7XG5cbiAgICAvLyBBZGQgZG9jdW1lbnQtbGV2ZWwgbGlzdGVuZXJzIGZvciBkcmFnIGFuZCByZWxlYXNlXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vblJlc2l6ZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uUmVzaXplRW5kKTtcblxuICAgIC8vIEFkZCBhIGNsYXNzIHRvIGJvZHkgdG8gbWFpbnRhaW4gY3Vyc29yIGR1cmluZyBkcmFnXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnY29sLXJlc2l6ZSc7XG4gIH1cblxuICAvLyBBcnJvdyBmdW5jdGlvbiB0byBwcmVzZXJ2ZSAndGhpcycgY29udGV4dFxuICBwcml2YXRlIG9uUmVzaXplTW92ZSA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuXG4gICAgaWYgKCF0aGlzLnJlc2l6aW5nIHx8IHRoaXMucmVzaXplQ29sdW1uSW5kZXggPT09IG51bGwpIHJldHVybjtcblxuICAgIC8vIENhbGN1bGF0ZSBob3cgZmFyIHRoZSBtb3VzZSBoYXMgbW92ZWRcbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5zdGFydFg7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHdpZHRoICh3aXRoIG1pbmltdW0gb2YgNTBweClcbiAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWF4KDUwLCB0aGlzLnN0YXJ0V2lkdGggKyBkZWx0YVgpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb2x1bW4gd2lkdGhcbiAgICB0aGlzLmFwaS51cGRhdGVDb2x1bW4odGhpcy5jb2x1bW5EZWZzW3RoaXMucmVzaXplQ29sdW1uSW5kZXhdLmlkLCB7IHdpZHRoOiBuZXdXaWR0aCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZXNpemVFbmQgPSAoKTogdm9pZCA9PiB7XG5cbiAgICAvLyBDbGVhbiB1cFxuICAgIHRoaXMucmVzaXppbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbkluZGV4ID0gbnVsbDtcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICcnO1xuXG4gICAgLy8gUmVtb3ZlIGRvY3VtZW50IGxpc3RlbmVyc1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25SZXNpemVNb3ZlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vblJlc2l6ZUVuZCk7XG4gIH1cblxuICAvLyBUcmFjayB0aGUgZHJhZ2dlZCBjb2x1bW4gaW5kZXhcbiAgb25EcmFnQ29sdW1uU3RhcnQoZXZlbnQ6IERyYWdFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgdGhpcy5kcmFnZ2VkSW5kZXggPSBpbmRleDtcblxuICAgIC8vIE9wdGlvbmFsOiBTZXQgZHJhZyBpbWFnZS9lZmZlY3RcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG5cbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgIH1cbiAgfVxuXG4gIG9uRHJhZ0NvbHVtbk92ZXIoZXZlbnQ6IERyYWdFdmVudCwgdGFyZ2V0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIFNraXAgaWYgZHJhZ2dpbmcgb3ZlciBpdHNlbGYgb3Igbm8gZHJhZyBpbiBwcm9ncmVzc1xuICAgIGlmICh0aGlzLmRyYWdnZWRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLmRyYWdnZWRJbmRleCA9PT0gdGFyZ2V0SW5kZXgpIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElNTUVESUFURUxZIHJlb3JkZXIgY29sdW1uc1xuICAgIHRoaXMuYXBpLnJlb3JkZXJDb2x1bW5EZWZzKHRoaXMuZHJhZ2dlZEluZGV4LCB0YXJnZXRJbmRleCk7XG5cbiAgICAvLyBVcGRhdGUgZHJhZ2dlZEluZGV4IHRvIHRoZSBuZXcgcG9zaXRpb25cbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IHRhcmdldEluZGV4O1xuICB9XG5cbiAgb25EcmFnQ29sdW1uRW5kKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcblxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIG9uRHJvcENvbHVtbihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5kcmFnZ2VkSW5kZXggPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIEFsbCBTdWJzY3JpcHRpb25zXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlclwiPlxuICAgIEBpZiAoZW5hYmxlR3JvdXBDb2x1bW5EZWZzKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JvdXAtaGVhZGVyLXJvd1wiIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZVgoLScgKyBzY3JvbGxMZWZ0ICsgJ3B4KSdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncm91cENvbHVtbnM7IGNvbnRleHQ6IHsgZ3JvdXBzOiBncm91cENvbHVtbkRlZnMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci12aWV3cG9ydFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWhlYWRlci1yb3dcIiBbc3R5bGUudHJhbnNmb3JtXT1cIid0cmFuc2xhdGVYKC0nICsgc2Nyb2xsTGVmdCArICdweCknXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyQ29sdW1uczsgY29udGV4dDogeyBjb2x1bW5zOiBjb2x1bW5EZWZzIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBHcm91cCBIZWFkZXIgQ2VsbCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjZ3JvdXBDb2x1bW5zIGxldC1ncm91cHM9XCJncm91cHNcIj5cbiAgICBAZm9yKGdyb3VwIG9mIGdyb3VwczsgdHJhY2sgZ3JvdXAuaWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncm91cC1oZWFkZXItY2VsbFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ3JvdXAud2lkdGhcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuX3Jlc29sdmVkR3JvdXBDbGFzc1wiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJncm91cC5fcmVzb2x2ZWRHcm91cFN0eWxlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWdyb3VwLWhlYWRlci1jZWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICB7eyBncm91cC5oZWFkZXJOYW1lIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBIZWFkZXIgQ2VsbCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyQ29sdW1ucyBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cbiAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgbGV0IGNvbEluZGV4ID0gJGluZGV4OyB0cmFjayBjb2wuaWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1jb2x1bW5cIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1pbmRleF09XCJjb2xJbmRleFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29sLndpZHRoXCJcbiAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLm1pbldpZHRoXCJcbiAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sLm1heFdpZHRoXCJcbiAgICAgICAgICAgIFtkcmFnZ2FibGVdPVwiY29sPy5kcmFnYWJsZVwiXG4gICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ0NvbHVtblN0YXJ0KCRldmVudCwgY29sSW5kZXgpXCJcbiAgICAgICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdDb2x1bW5PdmVyKCRldmVudCwgY29sSW5kZXgpXCJcbiAgICAgICAgICAgIChkcmFnZW5kKT1cIm9uRHJhZ0NvbHVtbkVuZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChkcm9wKT1cIm9uRHJvcENvbHVtbigkZXZlbnQpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWdyaWQtaGVhZGVyLWNlbGxcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbC5fcmVzb2x2ZWRIZWFkZXJDbGFzc1wiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sLl9yZXNvbHZlZEhlYWRlclN0eWxlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvbmUtZ3JpZC1oZWFkZXItY2VsbC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbD8uaGVhZGVyQ2hlY2tib3hTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvbmUtZ3JpZC1jaGVja2JveC1oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBpXT1cImFwaVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB7eyBjb2w/LmhlYWRlck5hbWUgPz8gJycgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE9nIFJlc2l6ZSBIYW5kbGVyIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29sPy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9nLXJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCBjb2xJbmRleClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZ3JpcC12ZXJ0aWNhbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1jZWxsLWdyb3VwXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTb3J0IE1lbnUgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbD8uc29ydGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JpZC1oZWFkZXItbWVudS1idXR0b25cIiAoY2xpY2spPVwib25IZWFkZXJNZW51U29ydENsaWNrKGNvbC5maWVsZClcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoKGNvbC5maWVsZCB8IGNvbHVtblNvcnRTdGF0ZTphcGkuc29ydE1vZGVsKSA9PT0gJ2FzYycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJhcnJvdy11cC1hLXpcIiBbc2l6ZV09XCIxNlwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9sdWNpZGUtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2UgaWYgKChjb2wuZmllbGQgfCBjb2x1bW5Tb3J0U3RhdGU6YXBpLnNvcnRNb2RlbCkgPT09ICdkZXNjJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImFycm93LWRvd24tei1hXCIgW3NpemVdPVwiMTZcIiBbc3Ryb2tlV2lkdGhdPVwiMlwiPjwvbHVjaWRlLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJhcnJvdy1kb3duLXVwXCIgW3NpemVdPVwiMTZcIiBbc3Ryb2tlV2lkdGhdPVwiMlwiPjwvbHVjaWRlLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIE9nIE9wdGlvbiBNZW51IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wgJiYgIWNvbC5zdXBwcmVzc0hlYWRlck1lbnVCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JpZC1oZWFkZXItbWVudS1idXR0b25cIiAoY2xpY2spPVwib25IZWFkZXJNZW51T3B0aW9uQ2xpY2soY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktdGhyZWUtZG90cy12ZXJ0aWNhbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1oZWFkZXIvb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1oZWFkZXIvb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFjLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7QUFRekUsTUFBTSxPQUFPLHNCQUFzQjtJQUlqQzs7Ozs7O09BTUc7SUFDSCxJQUNJLFVBQVUsQ0FBQyxLQUFhO1FBRTFCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUU5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksVUFBVTtRQUVaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBb0JELFlBQ1UsWUFBaUMsRUFDakMsR0FBc0I7UUFEdEIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBcEJ4QixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNmLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUd0QyxvQkFBZSxHQUF3QixFQUFFLENBQUM7UUFDMUMsZUFBVSxHQUFzQixFQUFFLENBQUM7UUFFckMsY0FB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V0FBVztRQUVULDJFQUEyRTtRQUMzRSx1RUFBdUU7UUFDdkUsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakMseUVBQXlFO1FBQ3pFLHFFQUFxRTtRQUNyRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUVsQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7K0dBN05VLHNCQUFzQjttR0FBdEIsc0JBQXNCLHFUQ2ZuQyx5eEpBc0dBOzs0RkR2RmEsc0JBQXNCO2tCQU5sQyxTQUFTO2lDQUNJLEtBQUssWUFDUCxpQkFBaUI7d0hBTTRCLGNBQWM7c0JBQXBFLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVV6QyxVQUFVO3NCQURiLEtBQUs7Z0JBY0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZUNvbHVtbkRlZiwgT25lR3JvdXBDb2x1bW5EZWYgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9uZUdyaWRBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVTb3J0TW9kZWwgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZ3JpZC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBDb2x1bW5DaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyByZXNvbHZlQ29sdW1uV2lkdGggfSBmcm9tICcuLi8uLi9oZWxwZXJzL29uZS1jb2x1bW4tZGVmLmhlbHBlcic7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiBmYWxzZSxcbiAgc2VsZWN0b3I6ICdvbmUtZ3JpZC1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWhlYWRlci5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZEhlYWRlckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBAVmlld0NoaWxkKCdoZWFkZXJWaWV3cG9ydCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgaGVhZGVyVmlld3BvcnQ/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvKipcbiAgICogSG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIGJvZHksIG1pcnJvcmVkIGhlcmUgc28gdGhlIGhlYWRlciB0cmFja3MgaXQuXG4gICAqXG4gICAqIEFwcGxpZWQgdG8gdGhlIHZpZXdwb3J0J3MgYHNjcm9sbExlZnRgIHJhdGhlciB0aGFuIGFzIGEgdHJhbnNmb3JtIG9uIHRoZVxuICAgKiByb3c6IHN0aWNreSBwb3NpdGlvbmluZyBuZWVkcyBhIHJlYWwgc2Nyb2xscG9ydCBhYm92ZSBpdC4gVGhlIGdyb3VwIHJvdyxcbiAgICogd2hpY2ggaXMgYSBzaWJsaW5nIG9mIHRoYXQgdmlld3BvcnQsIHN0aWxsIHJlYWRzIHRoaXMgZm9yIGl0cyB0cmFuc2Zvcm0uXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgc2Nyb2xsTGVmdCh2YWx1ZTogbnVtYmVyKSB7XG5cbiAgICB0aGlzLl9zY3JvbGxMZWZ0ID0gdmFsdWUgPz8gMDtcblxuICAgIHRoaXMuYXBwbHlTY3JvbGxMZWZ0KCk7XG4gIH1cblxuICBnZXQgc2Nyb2xsTGVmdCgpOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Njcm9sbExlZnQ7XG4gIH1cblxuICBwcml2YXRlIF9zY3JvbGxMZWZ0ID0gMDtcbiAgQElucHV0KCkgYWxsb3dlZEVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZW5hYmxlR3JvdXBDb2x1bW5EZWZzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwaSE6IE9uZUdyaWRBcGk8VD47XG5cbiAgcHJvdGVjdGVkIGdyb3VwQ29sdW1uRGVmczogT25lR3JvdXBDb2x1bW5EZWZbXSA9IFtdO1xuICBwcm90ZWN0ZWQgY29sdW1uRGVmczogT25lQ29sdW1uRGVmPFQ+W10gPSBbXTtcblxuICBwcml2YXRlIHNvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGRyYWdnZWRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVHJhY2sgcmVzaXplIHN0YXRlXG4gIHByaXZhdGUgcmVzaXppbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNpemVDb2x1bW5JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhcnRYID0gMDtcbiAgcHJpdmF0ZSBzdGFydFdpZHRoID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIExpc3RlbiBDb2x1bW4gQ2hhbmdlZCBFdmVudFxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uQ2hhbmdlZCcsIChwYXlsb2FkOiBDb2x1bW5DaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgY29uc3QgeyBncm91cHMsIGNvbHVtbnMgfSA9IHBheWxvYWQ7XG5cbiAgICAgIGlmIChncm91cHMpIHtcblxuICAgICAgICB0aGlzLmdyb3VwQ29sdW1uRGVmcyA9IGdyb3VwcyBhcyBPbmVHcm91cENvbHVtbkRlZltdO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sdW1ucykge1xuXG4gICAgICAgIHRoaXMuY29sdW1uRGVmcyA9IGNvbHVtbnMgYXMgT25lQ29sdW1uRGVmW107XG4gICAgICB9XG5cbiAgICAgIC8vIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIFRoZSBpbnB1dCBzZXR0ZXIgY2FuIHJ1biBiZWZvcmUgdGhlIHZpZXcgZXhpc3RzLCBzbyB3aGF0ZXZlciBhcnJpdmVkXG4gICAgLy8gZmlyc3QgaXMgYXBwbGllZCBvbmNlIGhlcmUuXG4gICAgdGhpcy5hcHBseVNjcm9sbExlZnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTY3JvbGxMZWZ0KCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuaGVhZGVyVmlld3BvcnQpIHtcblxuICAgICAgdGhpcy5oZWFkZXJWaWV3cG9ydC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB0aGlzLl9zY3JvbGxMZWZ0O1xuICAgIH1cbiAgfVxuXG4gIG9uSGVhZGVyTWVudU9wdGlvbkNsaWNrKGNvbHVtbkRlZjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgfVxuXG4gIG9uSGVhZGVyTWVudVNvcnRDbGljayhjb2xJZDoga2V5b2YgVCkge1xuXG4gICAgY29uc3QgY3VycmVudFNvcnQgPSB0aGlzLnNvcnRNb2RlbC5maW5kKHNvcnQgPT4gc29ydC5jb2xJZCA9PT0gY29sSWQpPy5zb3J0ID8/IG51bGw7XG5cbiAgICBjb25zdCBuZXh0U29ydCA9IHRoaXMuY3ljbGVTb3J0KGN1cnJlbnRTb3J0KTtcblxuICAgIHRoaXMuc29ydE1vZGVsID0gbmV4dFNvcnQgPyBbeyBjb2xJZCwgc29ydDogbmV4dFNvcnQgfV0gOiBbXTtcblxuICAgIHRoaXMuYXBpLm9uU29ydENoYW5nZWQodGhpcy5zb3J0TW9kZWwpO1xuICB9XG5cbiAgLy8gQ3ljbGUgU29ydGluZyBNb2RlbFxuICBwcml2YXRlIGN5Y2xlU29ydChjdXJyZW50OiAnYXNjJyB8ICdkZXNjJyB8IG51bGwpOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwge1xuXG4gICAgc3dpdGNoIChjdXJyZW50KSB7XG5cbiAgICAgIGNhc2UgbnVsbDogcmV0dXJuICdhc2MnO1xuXG4gICAgICBjYXNlICdhc2MnOiByZXR1cm4gJ2Rlc2MnO1xuXG4gICAgICBjYXNlICdkZXNjJzogcmV0dXJuIG51bGw7XG5cbiAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVzaXplU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQsIGNvbHVtbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIC8vIFByZXZlbnQgdGV4dCBzZWxlY3Rpb24gYW5kIGRlZmF1bHQgYmVoYXZpb3JcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbCB2YWx1ZXNcbiAgICB0aGlzLnJlc2l6aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7XG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuXG4gICAgLy8gTWVhc3VyZSB3aGF0IGlzIG9uIHNjcmVlbiByYXRoZXIgdGhhbiB0cnVzdGluZyBgY29sLndpZHRoYCwgd2hpY2ggaXNcbiAgICAvLyBvcHRpb25hbDogYSBjb2x1bW4gc2l6ZWQgcHVyZWx5IGJ5IG1pbldpZHRoIGhhZCBgdW5kZWZpbmVkYCBoZXJlLCBhbmRcbiAgICAvLyBgTWF0aC5tYXgoNTAsIHVuZGVmaW5lZCArIGRlbHRhWClgIGlzIE5hTiDigJQgdGhlIGNvbHVtbiBjb2xsYXBzZWQgb24gdGhlXG4gICAgLy8gZmlyc3QgbW91c2UgbW92ZSBhbmQgY291bGQgbm90IGJlIHJlY292ZXJlZC5cbiAgICBjb25zdCBjb2x1bW5FbGVtZW50ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCcub25lLWdyaWQtaGVhZGVyLWNvbHVtbicpO1xuXG4gICAgdGhpcy5zdGFydFdpZHRoID0gY29sdW1uRWxlbWVudD8ub2Zmc2V0V2lkdGggfHwgcmVzb2x2ZUNvbHVtbldpZHRoKHRoaXMuY29sdW1uRGVmc1tjb2x1bW5JbmRleF0pO1xuXG4gICAgLy8gQWRkIGRvY3VtZW50LWxldmVsIGxpc3RlbmVycyBmb3IgZHJhZyBhbmQgcmVsZWFzZVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25SZXNpemVNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vblJlc2l6ZUVuZCk7XG5cbiAgICAvLyBBZGQgYSBjbGFzcyB0byBib2R5IHRvIG1haW50YWluIGN1cnNvciBkdXJpbmcgZHJhZ1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2NvbC1yZXNpemUnO1xuICB9XG5cbiAgLy8gQXJyb3cgZnVuY3Rpb24gdG8gcHJlc2VydmUgJ3RoaXMnIGNvbnRleHRcbiAgcHJpdmF0ZSBvblJlc2l6ZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcblxuICAgIGlmICghdGhpcy5yZXNpemluZyB8fCB0aGlzLnJlc2l6ZUNvbHVtbkluZGV4ID09PSBudWxsKSByZXR1cm47XG5cbiAgICAvLyBDYWxjdWxhdGUgaG93IGZhciB0aGUgbW91c2UgaGFzIG1vdmVkXG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhcnRYO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyB3aWR0aCAod2l0aCBtaW5pbXVtIG9mIDUwcHgpXG4gICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heCg1MCwgdGhpcy5zdGFydFdpZHRoICsgZGVsdGFYKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29sdW1uIHdpZHRoXG4gICAgdGhpcy5hcGkudXBkYXRlQ29sdW1uKHRoaXMuY29sdW1uRGVmc1t0aGlzLnJlc2l6ZUNvbHVtbkluZGV4XS5pZCwgeyB3aWR0aDogbmV3V2lkdGggfSk7XG4gIH1cblxuICBwcml2YXRlIG9uUmVzaXplRW5kID0gKCk6IHZvaWQgPT4ge1xuXG4gICAgLy8gQ2xlYW4gdXBcbiAgICB0aGlzLnJlc2l6aW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5JbmRleCA9IG51bGw7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnJztcblxuICAgIC8vIFJlbW92ZSBkb2N1bWVudCBsaXN0ZW5lcnNcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVFbmQpO1xuICB9XG5cbiAgLy8gVHJhY2sgdGhlIGRyYWdnZWQgY29sdW1uIGluZGV4XG4gIG9uRHJhZ0NvbHVtblN0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gaW5kZXg7XG5cbiAgICAvLyBPcHRpb25hbDogU2V0IGRyYWcgaW1hZ2UvZWZmZWN0XG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuXG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcbiAgICB9XG4gIH1cblxuICBvbkRyYWdDb2x1bW5PdmVyKGV2ZW50OiBEcmFnRXZlbnQsIHRhcmdldEluZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBTa2lwIGlmIGRyYWdnaW5nIG92ZXIgaXRzZWxmIG9yIG5vIGRyYWcgaW4gcHJvZ3Jlc3NcbiAgICBpZiAodGhpcy5kcmFnZ2VkSW5kZXggPT09IG51bGwgfHwgdGhpcy5kcmFnZ2VkSW5kZXggPT09IHRhcmdldEluZGV4KSB7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJTU1FRElBVEVMWSByZW9yZGVyIGNvbHVtbnNcbiAgICB0aGlzLmFwaS5yZW9yZGVyQ29sdW1uRGVmcyh0aGlzLmRyYWdnZWRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuXG4gICAgLy8gVXBkYXRlIGRyYWdnZWRJbmRleCB0byB0aGUgbmV3IHBvc2l0aW9uXG4gICAgdGhpcy5kcmFnZ2VkSW5kZXggPSB0YXJnZXRJbmRleDtcbiAgfVxuXG4gIG9uRHJhZ0NvbHVtbkVuZChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG5cbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IG51bGw7XG4gIH1cblxuICBvbkRyb3BDb2x1bW4oZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gICAgLy8gVGhpcyBjb21wbGV0ZWQgYW4gdW51c2VkIFN1YmplY3QgYW5kIGxlZnQgdGhlIHJlYWwgc3Vic2NyaXB0aW9uIHJ1bm5pbmcuXG4gICAgLy8gSXQgc3Vydml2ZWQgb25seSBiZWNhdXNlIE9uZUdyaWRFdmVudFNlcnZpY2UgaXMgY29tcG9uZW50LXNjb3BlZCBhbmRcbiAgICAvLyB0ZWFycyBpdHMgb3duIGxpc3RlbmVycyBkb3duIOKAlCB0aGUgaGVhZGVyIHdhcyByZWx5aW5nIG9uIHRoYXQgYnkgYWNjaWRlbnQuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAvLyBBIHJlc2l6ZSBpbiBmbGlnaHQgb3ducyB0d28gbGlzdGVuZXJzIG9uIGBkb2N1bWVudGAuIFdpdGhvdXQgdGhpcyB0aGV5XG4gICAgLy8gb3V0bGl2ZSB0aGUgY29tcG9uZW50LCBhbmQgdGhlaXIgY2xvc3VyZXMga2VlcCBpdCBhbGl2ZSB3aXRoIHRoZW0uXG4gICAgaWYgKHRoaXMucmVzaXppbmcpIHtcblxuICAgICAgdGhpcy5vblJlc2l6ZUVuZCgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlclwiPlxuICAgIEBpZiAoZW5hYmxlR3JvdXBDb2x1bW5EZWZzKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JvdXAtaGVhZGVyLXJvd1wiIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZVgoLScgKyBzY3JvbGxMZWZ0ICsgJ3B4KSdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncm91cENvbHVtbnM7IGNvbnRleHQ6IHsgZ3JvdXBzOiBncm91cENvbHVtbkRlZnMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPCEtLSBUaGUgY29sdW1uIHJvdyBpcyBzY3JvbGxlZCByYXRoZXIgdGhhbiB0cmFuc2xhdGVkLiBgcG9zaXRpb246IHN0aWNreWBcbiAgICAgICAgIHJlc29sdmVzIGFnYWluc3QgdGhlIG5lYXJlc3Qgc2Nyb2xscG9ydCwgYW5kIGEgdHJhbnNmb3JtZWQgYW5jZXN0b3IgaXNcbiAgICAgICAgIG5vdCBvbmUg4oCUIHBpbm5lZCBoZWFkZXJzIGNvdWxkIG5ldmVyIGhvbGQgdGhlaXIgcGxhY2UgaW5zaWRlIGl0LiBUaGVcbiAgICAgICAgIGdyb3VwIHJvdyBhYm92ZSBrZWVwcyBpdHMgdHJhbnNmb3JtOiBncm91cHMgc3BhbiBjb250aWd1b3VzIGNvbHVtbnMsXG4gICAgICAgICB3aGljaCBwaW5uaW5nIHJlb3JkZXJzLCBzbyB0aGUgdHdvIGZlYXR1cmVzIGRvIG5vdCBjb21iaW5lLiAtLT5cbiAgICA8ZGl2ICNoZWFkZXJWaWV3cG9ydCBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci12aWV3cG9ydFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJDb2x1bW5zOyBjb250ZXh0OiB7IGNvbHVtbnM6IGNvbHVtbkRlZnMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIEdyb3VwIEhlYWRlciBDZWxsIFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNncm91cENvbHVtbnMgbGV0LWdyb3Vwcz1cImdyb3Vwc1wiPlxuICAgIEBmb3IoZ3JvdXAgb2YgZ3JvdXBzOyB0cmFjayBncm91cC5pZCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWdyb3VwLWhlYWRlci1jZWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJncm91cC53aWR0aFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5fcmVzb2x2ZWRHcm91cENsYXNzXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdyb3VwLl9yZXNvbHZlZEdyb3VwU3R5bGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JvdXAtaGVhZGVyLWNlbGwtdGV4dFwiPlxuICAgICAgICAgICAgICAgIHt7IGdyb3VwLmhlYWRlck5hbWUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIEhlYWRlciBDZWxsIFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNoZWFkZXJDb2x1bW5zIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxuICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyBsZXQgY29sSW5kZXggPSAkaW5kZXg7IHRyYWNrIGNvbC5pZCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWdyaWQtaGVhZGVyLWNvbHVtblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWluZGV4XT1cImNvbEluZGV4XCJcbiAgICAgICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1sZWZ0XT1cImNvbC5waW5uZWQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtcmlnaHRdPVwiY29sLnBpbm5lZCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1lZGdlXT1cImNvbC5fcGlubmVkRWRnZVwiXG4gICAgICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtZWRnZV09XCJjb2wuX3Bpbm5lZEVkZ2VcIlxuICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sLnBpbm5lZCA9PT0gJ2xlZnQnID8gY29sLl9waW5uZWRPZmZzZXQgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS5yaWdodC5weF09XCJjb2wucGlubmVkID09PSAncmlnaHQnID8gY29sLl9waW5uZWRPZmZzZXQgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2wud2lkdGhcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wubWluV2lkdGhcIlxuICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wubWF4V2lkdGhcIlxuICAgICAgICAgICAgW2RyYWdnYWJsZV09XCJjb2wuX3Jlc29sdmVkRHJhZ2FibGVcIlxuICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdDb2x1bW5TdGFydCgkZXZlbnQsIGNvbEluZGV4KVwiXG4gICAgICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnQ29sdW1uT3ZlcigkZXZlbnQsIGNvbEluZGV4KVwiXG4gICAgICAgICAgICAoZHJhZ2VuZCk9XCJvbkRyYWdDb2x1bW5FbmQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZHJvcCk9XCJvbkRyb3BDb2x1bW4oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1jZWxsXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2wuX3Jlc29sdmVkSGVhZGVyQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbC5fcmVzb2x2ZWRIZWFkZXJTdHlsZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib25lLWdyaWQtaGVhZGVyLWNlbGwtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb2w/LmhlYWRlckNoZWNrYm94U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtY2hlY2tib3gtaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FwaV09XCJhcGlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sPy5oZWFkZXJOYW1lID8/ICcnIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBPZyBSZXNpemUgSGFuZGxlciAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGNvbC5fcmVzb2x2ZWRSZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9nLXJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCBjb2xJbmRleClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZ3JpcC12ZXJ0aWNhbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1jZWxsLWdyb3VwXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTb3J0IE1lbnUgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5fcmVzb2x2ZWRTb3J0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1tZW51LWJ1dHRvblwiIChjbGljayk9XCJvbkhlYWRlck1lbnVTb3J0Q2xpY2soY29sLmZpZWxkKVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoY29sLmZpZWxkIHwgY29sdW1uU29ydFN0YXRlOmFwaS5zb3J0TW9kZWwpID09PSAnYXNjJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImFycm93LXVwLWEtelwiIFtzaXplXT1cIjE2XCIgW3N0cm9rZVdpZHRoXT1cIjJcIj48L2x1Y2lkZS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZWxzZSBpZiAoKGNvbC5maWVsZCB8IGNvbHVtblNvcnRTdGF0ZTphcGkuc29ydE1vZGVsKSA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwiYXJyb3ctZG93bi16LWFcIiBbc2l6ZV09XCIxNlwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9sdWNpZGUtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImFycm93LWRvd24tdXBcIiBbc2l6ZV09XCIxNlwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9sdWNpZGUtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gT2cgT3B0aW9uIE1lbnUgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbCAmJiAhY29sLl9yZXNvbHZlZFN1cHByZXNzSGVhZGVyTWVudUJ1dHRvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1tZW51LWJ1dHRvblwiIChjbGljayk9XCJvbkhlYWRlck1lbnVPcHRpb25DbGljayhjb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS10aHJlZS1kb3RzLXZlcnRpY2FsXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|