@c8y/ngx-components 1018.0.98 → 1018.0.101
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/esm2020/datapoint-selector/datapoint-selector.component.mjs +3 -3
- package/fesm2015/c8y-ngx-components-datapoint-selector.mjs +2 -2
- package/fesm2015/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-datapoint-selector.mjs +2 -2
- package/fesm2020/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -147,7 +147,7 @@ DatapointSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0
|
|
|
147
147
|
multi: true,
|
|
148
148
|
useExisting: forwardRef(() => DatapointSelectorComponent)
|
|
149
149
|
}
|
|
150
|
-
], ngImport: i0, template: "<div\n class=\"d-grid grid__row--1 fit-h\"\n [ngClass]=\"{\n 'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n 'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n 'grid__col--4-8--md': allowChangingContext && hideSelection\n }\"\n>\n <div class=\"d-flex d-col p-relative bg-level-1\" *ngIf=\"allowChangingContext\">\n <c8y-asset-selector-miller\n [(ngModel)]=\"contextAsset\"\n [asset]=\"contextAsset\"\n (onSelected)=\"selectionChanged($event)\"\n [container]=\"''\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: true,\n columnHeaders: true,\n showChildDevices: true,\n showUnassignedDevices: true,\n singleColumn: true,\n search: allowSearch\n }\"\n class=\"d-contents\"\n ></c8y-asset-selector-miller>\n </div>\n <!-- center column -->\n <div class=\"inner-scroll bg-component\">\n <ng-template #noDeviceEmptyState>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Select an asset from the list.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </ng-template>\n <ng-template #loadingData>\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <div *ngIf=\"assetSelection | async as asset; else noDeviceEmptyState\" class=\"bg-inherit\">\n <div class=\"p-l-16 p-r-16 p-t-8 p-b-8 sticky-top bg-inherit separator-bottom\">\n <p class=\"text-medium text-truncate\" [title]=\"'Available data points' | translate\">\n {{ 'Available data points' | translate }}\n </p>\n <div *ngIf=\"!loadingDatapoints\" id=\"search\" class=\"input-group input-group-search m-t-4\">\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"Search\u2026\"\n [ngModel]=\"searchString\"\n (ngModelChange)=\"searchStringChanged($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"!searchString; else clearSearchString\"></i>\n <ng-template #clearSearchString>\n <i c8yIcon=\"times\" class=\"text-muted\" (click)=\"searchStringChanged()\"></i>\n </ng-template>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"filteredDatapoints$ | async as filteredDatapoints; else loadingData\">\n <ng-container *ngIf=\"!loadingDatapoints; else loadingData\">\n <ng-container *ngIf=\"datapoints$ | async as datapoints\">\n <div class=\"p-16\" *ngIf=\"!filteredDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"\n datapoints.length\n ? (emptyStateSubtitleWhenNoMatchingDataPoints | translate)\n : (emptyStateSubtitleWhenNoDataPointsInAsset | translate)\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n\n <c8y-list-group>\n <c8y-list-item\n *ngIf=\"\n datapoints.length > maxNumberOfDatapoints &&\n filteredDatapoints.length >= maxNumberOfDatapoints\n \"\n class=\"sticky-top\"\n style=\"top: 72px\"\n >\n <div class=\"alert alert-warning m-b-0\">\n {{\n 'Due to the large number, only a subset of data points is displayed. Use search to narrow down the number of results.'\n | translate\n }}\n </div>\n </c8y-list-item>\n <c8y-datapoint-selector-list-item\n [ngModel]=\"dp\"\n [isSelected]=\"selectedDatapoints | includesDatapoint: dp\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [disableTypeaheadIfSelected]=\"true\"\n (added)=\"datapointAdded($event)\"\n (removed)=\"datapointRemoved($event)\"\n [highlightText]=\"searchStringChanges$ | async\"\n class=\"d-contents\"\n *ngFor=\"let dp of filteredDatapoints; trackBy: trackByFn\"\n ></c8y-datapoint-selector-list-item>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- last column -->\n <div class=\"inner-scroll bg-level-1\" *ngIf=\"!hideSelection\">\n <p\n class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n [title]=\"'Selected data points' | translate\"\n translate\n >\n Selected data points\n </p>\n <div class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\">\n <div class=\"c8y-datapoint-pill\" *ngFor=\"let selectedDp of selectedDatapoints\">\n <button\n [title]=\"'Remove' | translate\"\n type=\"button\"\n class=\"c8y-datapoint-pill__btn\"\n (click)=\"datapointRemoved(selectedDp)\"\n >\n <i c8yIcon=\"remove\" class=\"icon-14\"></i>\n </button>\n <div\n class=\"c8y-datapoint-pill__label\"\n [title]=\"selectedDp | datapointLabel: { doNotUseLabel: true, includeDevice: true }\"\n >\n <i c8yIcon=\"circle\" class=\"m-r-4 icon-14\" [style.color]=\"selectedDp.color\"></i>\n <span class=\"text-truncate\">\n <span class=\"text-truncate\">{{ selectedDp | datapointLabel }}</span>\n <small class=\"text-muted text-10\" *ngIf=\"selectedDp?.__target?.name\">\n {{ selectedDp?.__target?.name }}\n </small>\n </span>\n </div>\n </div>\n </div>\n <div class=\"p-16\" *ngIf=\"!selectedDatapoints || !selectedDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i2.MillerViewComponent, selector: "c8y-asset-selector-miller", inputs: ["config", "asset", "selectedDevice", "rootNode", "container"], outputs: ["onSelected", "onClearSelected"] }, { kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i6.DatapointSelectorListItemComponent, selector: "c8y-datapoint-selector-list-item", inputs: ["defaultFormOptions", "isSelected", "isCollapsed", "showAddRemoveButton", "editable", "showActiveToggle", "activeToggleDisabled", "showOptions", "datapointLibraryEntries", "actions", "optionToRemove", "hasUnlinkTemplateOption", "colorPickerDisabled", "disableTypeaheadIfSelected", "highlightText"], outputs: ["added", "removed"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.IncludesDatapointPipe, name: "includesDatapoint" }, { kind: "pipe", type: i8.DatapointLabelPipe, name: "datapointLabel" }] });
|
|
150
|
+
], ngImport: i0, template: "<div\n class=\"d-grid grid__row--1 fit-h\"\n [ngClass]=\"{\n 'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n 'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n 'grid__col--4-8--md': allowChangingContext && hideSelection\n }\"\n>\n <div class=\"d-flex d-col p-relative bg-level-1\" *ngIf=\"allowChangingContext\">\n <c8y-asset-selector-miller\n [(ngModel)]=\"contextAsset\"\n [asset]=\"contextAsset\"\n (onSelected)=\"selectionChanged($event)\"\n [container]=\"''\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: true,\n columnHeaders: true,\n showChildDevices: true,\n showUnassignedDevices: true,\n singleColumn: true,\n search: allowSearch,\n showFilter: true\n }\"\n class=\"d-contents\"\n ></c8y-asset-selector-miller>\n </div>\n <!-- center column -->\n <div class=\"inner-scroll bg-component\">\n <ng-template #noDeviceEmptyState>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Select an asset from the list.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </ng-template>\n <ng-template #loadingData>\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <div *ngIf=\"assetSelection | async as asset; else noDeviceEmptyState\" class=\"bg-inherit\">\n <div class=\"p-l-16 p-r-16 p-t-8 p-b-8 sticky-top bg-inherit separator-bottom\">\n <p class=\"text-medium text-truncate\" [title]=\"'Available data points' | translate\">\n {{ 'Available data points' | translate }}\n </p>\n <div *ngIf=\"!loadingDatapoints\" id=\"search\" class=\"input-group input-group-search m-t-4\">\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"Search\u2026\"\n [ngModel]=\"searchString\"\n (ngModelChange)=\"searchStringChanged($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"!searchString; else clearSearchString\"></i>\n <ng-template #clearSearchString>\n <i c8yIcon=\"times\" class=\"text-muted\" (click)=\"searchStringChanged()\"></i>\n </ng-template>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"filteredDatapoints$ | async as filteredDatapoints; else loadingData\">\n <ng-container *ngIf=\"!loadingDatapoints; else loadingData\">\n <ng-container *ngIf=\"datapoints$ | async as datapoints\">\n <div class=\"p-16\" *ngIf=\"!filteredDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"\n datapoints.length\n ? (emptyStateSubtitleWhenNoMatchingDataPoints | translate)\n : (emptyStateSubtitleWhenNoDataPointsInAsset | translate)\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n\n <c8y-list-group>\n <c8y-list-item\n *ngIf=\"\n datapoints.length > maxNumberOfDatapoints &&\n filteredDatapoints.length >= maxNumberOfDatapoints\n \"\n class=\"sticky-top\"\n style=\"top: 72px\"\n >\n <div class=\"alert alert-warning m-b-0\">\n {{\n 'Due to the large number, only a subset of data points is displayed. Use search to narrow down the number of results.'\n | translate\n }}\n </div>\n </c8y-list-item>\n <c8y-datapoint-selector-list-item\n [ngModel]=\"dp\"\n [isSelected]=\"selectedDatapoints | includesDatapoint: dp\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [disableTypeaheadIfSelected]=\"true\"\n (added)=\"datapointAdded($event)\"\n (removed)=\"datapointRemoved($event)\"\n [highlightText]=\"searchStringChanges$ | async\"\n class=\"d-contents\"\n *ngFor=\"let dp of filteredDatapoints; trackBy: trackByFn\"\n ></c8y-datapoint-selector-list-item>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- last column -->\n <div class=\"inner-scroll bg-level-1\" *ngIf=\"!hideSelection\">\n <p\n class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n [title]=\"'Selected data points' | translate\"\n translate\n >\n Selected data points\n </p>\n <div class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\">\n <div class=\"c8y-datapoint-pill\" *ngFor=\"let selectedDp of selectedDatapoints\">\n <button\n [title]=\"'Remove' | translate\"\n type=\"button\"\n class=\"c8y-datapoint-pill__btn\"\n (click)=\"datapointRemoved(selectedDp)\"\n >\n <i c8yIcon=\"remove\" class=\"icon-14\"></i>\n </button>\n <div\n class=\"c8y-datapoint-pill__label\"\n [title]=\"selectedDp | datapointLabel: { doNotUseLabel: true, includeDevice: true }\"\n >\n <i c8yIcon=\"circle\" class=\"m-r-4 icon-14\" [style.color]=\"selectedDp.color\"></i>\n <span class=\"text-truncate\">\n <span class=\"text-truncate\">{{ selectedDp | datapointLabel }}</span>\n <small class=\"text-muted text-10\" *ngIf=\"selectedDp?.__target?.name\">\n {{ selectedDp?.__target?.name }}\n </small>\n </span>\n </div>\n </div>\n </div>\n <div class=\"p-16\" *ngIf=\"!selectedDatapoints || !selectedDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i2.MillerViewComponent, selector: "c8y-asset-selector-miller", inputs: ["config", "asset", "selectedDevice", "rootNode", "container"], outputs: ["onSelected", "onClearSelected"] }, { kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i6.DatapointSelectorListItemComponent, selector: "c8y-datapoint-selector-list-item", inputs: ["defaultFormOptions", "isSelected", "isCollapsed", "showAddRemoveButton", "editable", "showActiveToggle", "activeToggleDisabled", "showOptions", "datapointLibraryEntries", "actions", "optionToRemove", "hasUnlinkTemplateOption", "colorPickerDisabled", "disableTypeaheadIfSelected", "highlightText"], outputs: ["added", "removed"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.IncludesDatapointPipe, name: "includesDatapoint" }, { kind: "pipe", type: i8.DatapointLabelPipe, name: "datapointLabel" }] });
|
|
151
151
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DatapointSelectorComponent, decorators: [{
|
|
152
152
|
type: Component,
|
|
153
153
|
args: [{ selector: 'c8y-datapoint-selector', providers: [
|
|
@@ -156,7 +156,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
156
156
|
multi: true,
|
|
157
157
|
useExisting: forwardRef(() => DatapointSelectorComponent)
|
|
158
158
|
}
|
|
159
|
-
], template: "<div\n class=\"d-grid grid__row--1 fit-h\"\n [ngClass]=\"{\n 'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n 'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n 'grid__col--4-8--md': allowChangingContext && hideSelection\n }\"\n>\n <div class=\"d-flex d-col p-relative bg-level-1\" *ngIf=\"allowChangingContext\">\n <c8y-asset-selector-miller\n [(ngModel)]=\"contextAsset\"\n [asset]=\"contextAsset\"\n (onSelected)=\"selectionChanged($event)\"\n [container]=\"''\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: true,\n columnHeaders: true,\n showChildDevices: true,\n showUnassignedDevices: true,\n singleColumn: true,\n search: allowSearch\n }\"\n class=\"d-contents\"\n ></c8y-asset-selector-miller>\n </div>\n <!-- center column -->\n <div class=\"inner-scroll bg-component\">\n <ng-template #noDeviceEmptyState>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Select an asset from the list.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </ng-template>\n <ng-template #loadingData>\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <div *ngIf=\"assetSelection | async as asset; else noDeviceEmptyState\" class=\"bg-inherit\">\n <div class=\"p-l-16 p-r-16 p-t-8 p-b-8 sticky-top bg-inherit separator-bottom\">\n <p class=\"text-medium text-truncate\" [title]=\"'Available data points' | translate\">\n {{ 'Available data points' | translate }}\n </p>\n <div *ngIf=\"!loadingDatapoints\" id=\"search\" class=\"input-group input-group-search m-t-4\">\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"Search\u2026\"\n [ngModel]=\"searchString\"\n (ngModelChange)=\"searchStringChanged($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"!searchString; else clearSearchString\"></i>\n <ng-template #clearSearchString>\n <i c8yIcon=\"times\" class=\"text-muted\" (click)=\"searchStringChanged()\"></i>\n </ng-template>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"filteredDatapoints$ | async as filteredDatapoints; else loadingData\">\n <ng-container *ngIf=\"!loadingDatapoints; else loadingData\">\n <ng-container *ngIf=\"datapoints$ | async as datapoints\">\n <div class=\"p-16\" *ngIf=\"!filteredDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"\n datapoints.length\n ? (emptyStateSubtitleWhenNoMatchingDataPoints | translate)\n : (emptyStateSubtitleWhenNoDataPointsInAsset | translate)\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n\n <c8y-list-group>\n <c8y-list-item\n *ngIf=\"\n datapoints.length > maxNumberOfDatapoints &&\n filteredDatapoints.length >= maxNumberOfDatapoints\n \"\n class=\"sticky-top\"\n style=\"top: 72px\"\n >\n <div class=\"alert alert-warning m-b-0\">\n {{\n 'Due to the large number, only a subset of data points is displayed. Use search to narrow down the number of results.'\n | translate\n }}\n </div>\n </c8y-list-item>\n <c8y-datapoint-selector-list-item\n [ngModel]=\"dp\"\n [isSelected]=\"selectedDatapoints | includesDatapoint: dp\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [disableTypeaheadIfSelected]=\"true\"\n (added)=\"datapointAdded($event)\"\n (removed)=\"datapointRemoved($event)\"\n [highlightText]=\"searchStringChanges$ | async\"\n class=\"d-contents\"\n *ngFor=\"let dp of filteredDatapoints; trackBy: trackByFn\"\n ></c8y-datapoint-selector-list-item>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- last column -->\n <div class=\"inner-scroll bg-level-1\" *ngIf=\"!hideSelection\">\n <p\n class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n [title]=\"'Selected data points' | translate\"\n translate\n >\n Selected data points\n </p>\n <div class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\">\n <div class=\"c8y-datapoint-pill\" *ngFor=\"let selectedDp of selectedDatapoints\">\n <button\n [title]=\"'Remove' | translate\"\n type=\"button\"\n class=\"c8y-datapoint-pill__btn\"\n (click)=\"datapointRemoved(selectedDp)\"\n >\n <i c8yIcon=\"remove\" class=\"icon-14\"></i>\n </button>\n <div\n class=\"c8y-datapoint-pill__label\"\n [title]=\"selectedDp | datapointLabel: { doNotUseLabel: true, includeDevice: true }\"\n >\n <i c8yIcon=\"circle\" class=\"m-r-4 icon-14\" [style.color]=\"selectedDp.color\"></i>\n <span class=\"text-truncate\">\n <span class=\"text-truncate\">{{ selectedDp | datapointLabel }}</span>\n <small class=\"text-muted text-10\" *ngIf=\"selectedDp?.__target?.name\">\n {{ selectedDp?.__target?.name }}\n </small>\n </span>\n </div>\n </div>\n </div>\n <div class=\"p-16\" *ngIf=\"!selectedDatapoints || !selectedDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n" }]
|
|
159
|
+
], template: "<div\n class=\"d-grid grid__row--1 fit-h\"\n [ngClass]=\"{\n 'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n 'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n 'grid__col--4-8--md': allowChangingContext && hideSelection\n }\"\n>\n <div class=\"d-flex d-col p-relative bg-level-1\" *ngIf=\"allowChangingContext\">\n <c8y-asset-selector-miller\n [(ngModel)]=\"contextAsset\"\n [asset]=\"contextAsset\"\n (onSelected)=\"selectionChanged($event)\"\n [container]=\"''\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: true,\n columnHeaders: true,\n showChildDevices: true,\n showUnassignedDevices: true,\n singleColumn: true,\n search: allowSearch,\n showFilter: true\n }\"\n class=\"d-contents\"\n ></c8y-asset-selector-miller>\n </div>\n <!-- center column -->\n <div class=\"inner-scroll bg-component\">\n <ng-template #noDeviceEmptyState>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Select an asset from the list.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </ng-template>\n <ng-template #loadingData>\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <div *ngIf=\"assetSelection | async as asset; else noDeviceEmptyState\" class=\"bg-inherit\">\n <div class=\"p-l-16 p-r-16 p-t-8 p-b-8 sticky-top bg-inherit separator-bottom\">\n <p class=\"text-medium text-truncate\" [title]=\"'Available data points' | translate\">\n {{ 'Available data points' | translate }}\n </p>\n <div *ngIf=\"!loadingDatapoints\" id=\"search\" class=\"input-group input-group-search m-t-4\">\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"Search\u2026\"\n [ngModel]=\"searchString\"\n (ngModelChange)=\"searchStringChanged($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"!searchString; else clearSearchString\"></i>\n <ng-template #clearSearchString>\n <i c8yIcon=\"times\" class=\"text-muted\" (click)=\"searchStringChanged()\"></i>\n </ng-template>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"filteredDatapoints$ | async as filteredDatapoints; else loadingData\">\n <ng-container *ngIf=\"!loadingDatapoints; else loadingData\">\n <ng-container *ngIf=\"datapoints$ | async as datapoints\">\n <div class=\"p-16\" *ngIf=\"!filteredDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"\n datapoints.length\n ? (emptyStateSubtitleWhenNoMatchingDataPoints | translate)\n : (emptyStateSubtitleWhenNoDataPointsInAsset | translate)\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n\n <c8y-list-group>\n <c8y-list-item\n *ngIf=\"\n datapoints.length > maxNumberOfDatapoints &&\n filteredDatapoints.length >= maxNumberOfDatapoints\n \"\n class=\"sticky-top\"\n style=\"top: 72px\"\n >\n <div class=\"alert alert-warning m-b-0\">\n {{\n 'Due to the large number, only a subset of data points is displayed. Use search to narrow down the number of results.'\n | translate\n }}\n </div>\n </c8y-list-item>\n <c8y-datapoint-selector-list-item\n [ngModel]=\"dp\"\n [isSelected]=\"selectedDatapoints | includesDatapoint: dp\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [disableTypeaheadIfSelected]=\"true\"\n (added)=\"datapointAdded($event)\"\n (removed)=\"datapointRemoved($event)\"\n [highlightText]=\"searchStringChanges$ | async\"\n class=\"d-contents\"\n *ngFor=\"let dp of filteredDatapoints; trackBy: trackByFn\"\n ></c8y-datapoint-selector-list-item>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- last column -->\n <div class=\"inner-scroll bg-level-1\" *ngIf=\"!hideSelection\">\n <p\n class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n [title]=\"'Selected data points' | translate\"\n translate\n >\n Selected data points\n </p>\n <div class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\">\n <div class=\"c8y-datapoint-pill\" *ngFor=\"let selectedDp of selectedDatapoints\">\n <button\n [title]=\"'Remove' | translate\"\n type=\"button\"\n class=\"c8y-datapoint-pill__btn\"\n (click)=\"datapointRemoved(selectedDp)\"\n >\n <i c8yIcon=\"remove\" class=\"icon-14\"></i>\n </button>\n <div\n class=\"c8y-datapoint-pill__label\"\n [title]=\"selectedDp | datapointLabel: { doNotUseLabel: true, includeDevice: true }\"\n >\n <i c8yIcon=\"circle\" class=\"m-r-4 icon-14\" [style.color]=\"selectedDp.color\"></i>\n <span class=\"text-truncate\">\n <span class=\"text-truncate\">{{ selectedDp | datapointLabel }}</span>\n <small class=\"text-muted text-10\" *ngIf=\"selectedDp?.__target?.name\">\n {{ selectedDp?.__target?.name }}\n </small>\n </span>\n </div>\n </div>\n </div>\n <div class=\"p-16\" *ngIf=\"!selectedDatapoints || !selectedDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n" }]
|
|
160
160
|
}], ctorParameters: function () { return [{ type: i1.DatapointLibraryService }]; }, propDecorators: { contextAsset: [{
|
|
161
161
|
type: Input
|
|
162
162
|
}], allowChangingContext: [{
|
|
@@ -174,4 +174,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
174
174
|
}], hideSelection: [{
|
|
175
175
|
type: Input
|
|
176
176
|
}] } });
|
|
177
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50LXNlbGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RhdGFwb2ludC1zZWxlY3Rvci9kYXRhcG9pbnQtc2VsZWN0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGF0YXBvaW50LXNlbGVjdG9yL2RhdGFwb2ludC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDeEUsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsR0FBRyxFQUNILFdBQVcsRUFDWCxTQUFTLEVBQ1QsR0FBRyxFQUNKLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7Ozs7QUFjdEUsTUFBTSxPQUFPLDBCQUEwQjtJQThCckMsWUFBb0IsZ0JBQXlDO1FBQXpDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBeUI7UUE1QnBELHlCQUFvQixHQUFHLElBQUksQ0FBQztRQUM1QixzQ0FBaUMsR0FBRyxJQUFJLENBQUM7UUFDbEQsdUJBQWtCLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQztRQUNwQyx1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDMUIsNkJBQXdCLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLHVCQUFrQixHQUFHLElBQUksQ0FBQztRQUMxQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNuQixrQkFBYSxHQUFHLEtBQUssQ0FBQztR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YSwwQkFBMEI7a0JBWHRDLFNBQVM7K0JBQ0Usd0JBQXdCLGFBRXZCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLEtBQUssRUFBRSxJQUFJOzRCQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDJCQUEyQixDQUFDO3lCQUMxRDtxQkFDRjs4R0FHUSxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxpQ0FBaUM7c0JBQXpDLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJSWRlbnRpZmllZCwgSVJlc3VsdExpc3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb20sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG4gIHN3aXRjaE1hcCxcbiAgdGFwXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERhdGFwb2ludExpYnJhcnlTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhcG9pbnQtbGlicmFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IEtQSURldGFpbHMsIE1hbmFnZWRPYmplY3RLUEkgfSBmcm9tICcuL2RhdGFwb2ludC1zZWxlY3Rpb24ubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50LXNlbGVjdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFwb2ludC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRhcG9pbnRTZWxlY3RvckNvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YXBvaW50U2VsZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgY29udGV4dEFzc2V0OiBJSWRlbnRpZmllZDtcbiAgQElucHV0KCkgYWxsb3dDaGFuZ2luZ0NvbnRleHQgPSB0cnVlO1xuICBASW5wdXQoKSBhbGxvd0RhdGFwb2ludHNGcm9tTXVsdGlwbGVBc3NldHMgPSB0cnVlO1xuICBzZWxlY3RlZERhdGFwb2ludHMgPSBuZXcgQXJyYXk8S1BJRGV0YWlscz4oKTtcbiAgQElucHV0KCkgZGVmYXVsdEFjdGl2ZVN0YXRlID0gdHJ1ZTtcbiAgQElucHV0KCkgaWdub3JlRGF0YXBvaW50VGVtcGxhdGVzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGd1ZXNzRGF0YXBvaW50VW5pdCA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93U2VhcmNoID0gdHJ1ZTtcbiAgQElucHV0KCkgaGlkZVNlbGVjdGlvbiA9IGZhbHNlO1xuICBzZWFyY2hTdHJpbmcgPSAnJztcbiAgbWF4TnVtYmVyT2ZEYXRhcG9pbnRzID0gNTA7XG5cbiAgbG9hZGluZ0RhdGFwb2ludHMgPSBmYWxzZTtcbiAgYXNzZXRTZWxlY3Rpb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElJZGVudGlmaWVkPihudWxsKTtcbiAgZGF0YXBvaW50cyQ6IE9ic2VydmFibGU8S1BJRGV0YWlsc1tdPjtcbiAgZmlsdGVyZWREYXRhcG9pbnRzJDogT2JzZXJ2YWJsZTxLUElEZXRhaWxzW10+O1xuICBzZWFyY2hTdHJpbmdDaGFuZ2VzJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBkYXRhcG9pbnRMaWJyYXJ5RW50cmllczogT2JzZXJ2YWJsZTxJUmVzdWx0TGlzdDxNYW5hZ2VkT2JqZWN0S1BJPj47XG5cbiAgZW1wdHlTdGF0ZVN1YnRpdGxlV2hlbk5vTWF0Y2hpbmdEYXRhUG9pbnRzID0gZ2V0dGV4dCgnVHJ5IGFub3RoZXIgc2VhcmNoIHRlcm0uJyk7XG4gIGVtcHR5U3RhdGVTdWJ0aXRsZVdoZW5Ob0RhdGFQb2ludHNJbkFzc2V0ID0gZ2V0dGV4dChcbiAgICAnU2VsZWN0IGFuIGFzc2V0IHdpdGggZGF0YSBwb2ludHMgZnJvbSB0aGUgbGlzdC4nXG4gICk7XG5cbiAgcHJpdmF0ZSBzZWFyY2hTdHJpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIHByaXZhdGUgdG91Y2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIG9uQ2hhbmdlOiAocXVhbnRpdHk6IEtQSURldGFpbHNbXSkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhcG9pbnRTZXJ2aWNlOiBEYXRhcG9pbnRMaWJyYXJ5U2VydmljZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldHVwT2JzZXJ2YWJsZXMoKTtcbiAgICBpZiAoIXRoaXMuaWdub3JlRGF0YXBvaW50VGVtcGxhdGVzKSB7XG4gICAgICB0aGlzLmRhdGFwb2ludExpYnJhcnlFbnRyaWVzID0gZnJvbSh0aGlzLmRhdGFwb2ludFNlcnZpY2UuZ2V0Rmlyc3REYXRhcG9pbnRMaWJyYXJ5UGFnZSgpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZXh0QXNzZXQpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLmNvbnRleHRBc3NldCk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZShvYmo6IEtQSURldGFpbHNbXSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhcG9pbnRzID0gb2JqO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBkYXRhcG9pbnRBZGRlZChkcDogS1BJRGV0YWlscyk6IHZvaWQge1xuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgIGRwLl9fYWN0aXZlID0gdGhpcy5kZWZhdWx0QWN0aXZlU3RhdGU7XG4gICAgaWYgKHRoaXMuZ3Vlc3NEYXRhcG9pbnRVbml0ICYmICFkcC51bml0KSB7XG4gICAgICB0aGlzLmRhdGFwb2ludFNlcnZpY2UuZ3Vlc3NVbml0T2ZEYXRhcG9pbnQoZHAuZnJhZ21lbnQsIGRwLnNlcmllcywgZHAuX190YXJnZXQpLnRoZW4odW5pdCA9PiB7XG4gICAgICAgIGRwLnVuaXQgPSB1bml0O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWREYXRhcG9pbnRzID0gWy4uLnRoaXMuc2VsZWN0ZWREYXRhcG9pbnRzLCBkcF07XG4gICAgdGhpcy5lbWl0Q3VycmVudFNlbGVjdGlvbigpO1xuICB9XG5cbiAgZGF0YXBvaW50UmVtb3ZlZChkcDogS1BJRGV0YWlscyk6IHZvaWQge1xuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhcG9pbnRzID0gdGhpcy5zZWxlY3RlZERhdGFwb2ludHMuZmlsdGVyKFxuICAgICAgdG1wID0+XG4gICAgICAgIHRtcC5mcmFnbWVudCAhPT0gZHAuZnJhZ21lbnQgfHxcbiAgICAgICAgdG1wLnNlcmllcyAhPT0gZHAuc2VyaWVzIHx8XG4gICAgICAgIHRtcC5fX3RhcmdldD8uaWQgIT09IGRwLl9fdGFyZ2V0Py5pZFxuICAgICk7XG4gICAgdGhpcy5lbWl0Q3VycmVudFNlbGVjdGlvbigpO1xuICB9XG5cbiAgc2VsZWN0aW9uQ2hhbmdlZChldnQ6IElJZGVudGlmaWVkIHwgSUlkZW50aWZpZWRbXSk6IHZvaWQge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2dCkgJiYgZXZ0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QXNzZXQoZXZ0WzBdKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXZ0KSAmJiBldnQuaXRlbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkNoYW5nZWQoZXZ0Lml0ZW1zKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXZ0KSAmJiBldnQuaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdEFzc2V0KGV2dCk7XG4gICAgfVxuXG4gICAgLy8gcmVzZXQgc2VsZWN0aW9uXG4gICAgdGhpcy5hc3NldFNlbGVjdGlvbi5uZXh0KG51bGwpO1xuICB9XG5cbiAgdHJhY2tCeUZuKF9pbmRleDogbnVtYmVyLCBpdGVtOiBLUElEZXRhaWxzKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7aXRlbS5mcmFnbWVudH0tJHtpdGVtLl9fdGFyZ2V0Py5pZH0tJHtpdGVtLnNlcmllc31gO1xuICB9XG5cbiAgc2VhcmNoU3RyaW5nQ2hhbmdlZChuZXdWYWx1ZSA9ICcnKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hTdHJpbmckLm5leHQobmV3VmFsdWUpO1xuICAgIHRoaXMuc2VhcmNoU3RyaW5nID0gbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHNldHVwT2JzZXJ2YWJsZXMoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhcG9pbnRzJCA9IHRoaXMuYXNzZXRTZWxlY3Rpb24ucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ0RhdGFwb2ludHMgPSB0cnVlO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoYXNzZXQgPT5cbiAgICAgICAgYXNzZXQ/LmlkXG4gICAgICAgICAgPyB0aGlzLmRhdGFwb2ludFNlcnZpY2UuZ2V0RGF0YXBvaW50c09mQXNzZXQoYXNzZXQsIHRoaXMuaWdub3JlRGF0YXBvaW50VGVtcGxhdGVzKVxuICAgICAgICAgIDogW11cbiAgICAgICksXG4gICAgICB0YXAoKCkgPT4gKHRoaXMubG9hZGluZ0RhdGFwb2ludHMgPSBmYWxzZSkpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuXG4gICAgdGhpcy5zZWFyY2hTdHJpbmdDaGFuZ2VzJCA9IHRoaXMuc2VhcmNoU3RyaW5nJC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuXG4gICAgdGhpcy5maWx0ZXJlZERhdGFwb2ludHMkID0gY29tYmluZUxhdGVzdChbdGhpcy5zZWFyY2hTdHJpbmdDaGFuZ2VzJCwgdGhpcy5kYXRhcG9pbnRzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtzZWFyY2hTdHJpbmcsIGRhdGFwb2ludHNdKSA9PiB7XG4gICAgICAgIGlmICghc2VhcmNoU3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGFwb2ludHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoU3RyaW5nID0gc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBkYXRhcG9pbnRzLmZpbHRlcihkYXRhcG9pbnQgPT5cbiAgICAgICAgICB0aGlzLmluY2x1ZGVzU2VhcmNoU3RyaW5nKGRhdGFwb2ludCwgbG93ZXJDYXNlU2VhcmNoU3RyaW5nKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBtYXAoZmlsdGVyZWQgPT4gZmlsdGVyZWQuc2xpY2UoMCwgdGhpcy5tYXhOdW1iZXJPZkRhdGFwb2ludHMpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEFzc2V0KGFzc2V0OiBJSWRlbnRpZmllZCkge1xuICAgIHRoaXMuYXNzZXRTZWxlY3Rpb24ubmV4dChhc3NldCk7XG4gICAgdGhpcy5zZWFyY2hTdHJpbmdDaGFuZ2VkKCk7XG4gICAgaWYgKCF0aGlzLmFsbG93RGF0YXBvaW50c0Zyb21NdWx0aXBsZUFzc2V0cykge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGFwb2ludHMgPSBbXTtcbiAgICB0aGlzLmVtaXRDdXJyZW50U2VsZWN0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRDdXJyZW50U2VsZWN0aW9uKCkge1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy5zZWxlY3RlZERhdGFwb2ludHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNUb3VjaGVkKCkge1xuICAgIGlmICghdGhpcy50b3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluY2x1ZGVzU2VhcmNoU3RyaW5nKGRhdGFwb2ludDogS1BJRGV0YWlscywgbG93ZXJDYXNlU2VhcmNoU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsYWJlbCA9IGRhdGFwb2ludC5sYWJlbD8udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobGFiZWwgJiYgbGFiZWwuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZnJhZ21lbnQgPSBkYXRhcG9pbnQuZnJhZ21lbnQ/LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGZyYWdtZW50ICYmIGZyYWdtZW50LmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaFN0cmluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmllcyA9IGRhdGFwb2ludC5zZXJpZXM/LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHNlcmllcyAmJiBzZXJpZXMuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiZC1ncmlkIGdyaWRfX3Jvdy0tMSBmaXQtaFwiXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAnZ3JpZF9fY29sLS0zLTYtMy0tbWQnOiBhbGxvd0NoYW5naW5nQ29udGV4dCAmJiAhaGlkZVNlbGVjdGlvbixcbiAgICAnZ3JpZF9fY29sLS04LTQtLW1kJzogIWFsbG93Q2hhbmdpbmdDb250ZXh0ICYmICFoaWRlU2VsZWN0aW9uLFxuICAgICdncmlkX19jb2wtLTQtOC0tbWQnOiBhbGxvd0NoYW5naW5nQ29udGV4dCAmJiBoaWRlU2VsZWN0aW9uXG4gIH1cIlxuPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGQtY29sIHAtcmVsYXRpdmUgYmctbGV2ZWwtMVwiICpuZ0lmPVwiYWxsb3dDaGFuZ2luZ0NvbnRleHRcIj5cbiAgICA8Yzh5LWFzc2V0LXNlbGVjdG9yLW1pbGxlclxuICAgICAgWyhuZ01vZGVsKV09XCJjb250ZXh0QXNzZXRcIlxuICAgICAgW2Fzc2V0XT1cImNvbnRleHRBc3NldFwiXG4gICAgICAob25TZWxlY3RlZCk9XCJzZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIlxuICAgICAgW2NvbnRhaW5lcl09XCInJ1wiXG4gICAgICBbY29uZmlnXT1cIntcbiAgICAgICAgdmlldzogJ21pbGxlcicsXG4gICAgICAgIGdyb3Vwc1NlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIGNvbHVtbkhlYWRlcnM6IHRydWUsXG4gICAgICAgIHNob3dDaGlsZERldmljZXM6IHRydWUsXG4gICAgICAgIHNob3dVbmFzc2lnbmVkRGV2aWNlczogdHJ1ZSxcbiAgICAgICAgc2luZ2xlQ29sdW1uOiB0cnVlLFxuICAgICAgICBzZWFyY2g6IGFsbG93U2VhcmNoXG4gICAgICB9XCJcbiAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgPjwvYzh5LWFzc2V0LXNlbGVjdG9yLW1pbGxlcj5cbiAgPC9kaXY+XG4gIDwhLS0gY2VudGVyIGNvbHVtbiAtLT5cbiAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbCBiZy1jb21wb25lbnRcIj5cbiAgICA8bmctdGVtcGxhdGUgI25vRGV2aWNlRW1wdHlTdGF0ZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTE2XCI+XG4gICAgICAgIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICAgICAgICBbaWNvbl09XCInYzh5LWRhdGEtcG9pbnRzJ1wiXG4gICAgICAgICAgW3RpdGxlXT1cIidObyBkYXRhIHBvaW50cyB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFtzdWJ0aXRsZV09XCInU2VsZWN0IGFuIGFzc2V0IGZyb20gdGhlIGxpc3QuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNsb2FkaW5nRGF0YT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyXCI+XG4gICAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiYXNzZXRTZWxlY3Rpb24gfCBhc3luYyBhcyBhc3NldDsgZWxzZSBub0RldmljZUVtcHR5U3RhdGVcIiBjbGFzcz1cImJnLWluaGVyaXRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLWwtMTYgcC1yLTE2IHAtdC04IHAtYi04IHN0aWNreS10b3AgYmctaW5oZXJpdCBzZXBhcmF0b3ItYm90dG9tXCI+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1tZWRpdW0gdGV4dC10cnVuY2F0ZVwiIFt0aXRsZV09XCInQXZhaWxhYmxlIGRhdGEgcG9pbnRzJyB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgIHt7ICdBdmFpbGFibGUgZGF0YSBwb2ludHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nRGF0YXBvaW50c1wiIGlkPVwic2VhcmNoXCIgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zZWFyY2ggbS10LTRcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2jigKZcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoU3RyaW5nXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlYXJjaFN0cmluZ0NoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwic2VhcmNoXCIgKm5nSWY9XCIhc2VhcmNoU3RyaW5nOyBlbHNlIGNsZWFyU2VhcmNoU3RyaW5nXCI+PC9pPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjbGVhclNlYXJjaFN0cmluZz5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInRpbWVzXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKGNsaWNrKT1cInNlYXJjaFN0cmluZ0NoYW5nZWQoKVwiPjwvaT5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkRGF0YXBvaW50cyQgfCBhc3luYyBhcyBmaWx0ZXJlZERhdGFwb2ludHM7IGVsc2UgbG9hZGluZ0RhdGFcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nRGF0YXBvaW50czsgZWxzZSBsb2FkaW5nRGF0YVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhcG9pbnRzJCB8IGFzeW5jIGFzIGRhdGFwb2ludHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTE2XCIgKm5nSWY9XCIhZmlsdGVyZWREYXRhcG9pbnRzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiJ2M4eS1kYXRhLXBvaW50cydcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInTm8gZGF0YSBwb2ludHMgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbc3VidGl0bGVdPVwiXG4gICAgICAgICAgICAgICAgICBkYXRhcG9pbnRzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IChlbXB0eVN0YXRlU3VidGl0bGVXaGVuTm9NYXRjaGluZ0RhdGFQb2ludHMgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgIDogKGVtcHR5U3RhdGVTdWJ0aXRsZVdoZW5Ob0RhdGFQb2ludHNJbkFzc2V0IHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8Yzh5LWxpc3QtZ3JvdXA+XG4gICAgICAgICAgICAgIDxjOHktbGlzdC1pdGVtXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGRhdGFwb2ludHMubGVuZ3RoID4gbWF4TnVtYmVyT2ZEYXRhcG9pbnRzICYmXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGFwb2ludHMubGVuZ3RoID49IG1heE51bWJlck9mRGF0YXBvaW50c1xuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdGlja3ktdG9wXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInRvcDogNzJweFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBtLWItMFwiPlxuICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgJ0R1ZSB0byB0aGUgbGFyZ2UgbnVtYmVyLCBvbmx5IGEgc3Vic2V0IG9mIGRhdGEgcG9pbnRzIGlzIGRpc3BsYXllZC4gVXNlIHNlYXJjaCB0byBuYXJyb3cgZG93biB0aGUgbnVtYmVyIG9mIHJlc3VsdHMuJ1xuICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2M4eS1saXN0LWl0ZW0+XG4gICAgICAgICAgICAgIDxjOHktZGF0YXBvaW50LXNlbGVjdG9yLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImRwXCJcbiAgICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJzZWxlY3RlZERhdGFwb2ludHMgfCBpbmNsdWRlc0RhdGFwb2ludDogZHBcIlxuICAgICAgICAgICAgICAgIFtkYXRhcG9pbnRMaWJyYXJ5RW50cmllc109XCJkYXRhcG9pbnRMaWJyYXJ5RW50cmllc1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVUeXBlYWhlYWRJZlNlbGVjdGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIChhZGRlZCk9XCJkYXRhcG9pbnRBZGRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJkYXRhcG9pbnRSZW1vdmVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtoaWdobGlnaHRUZXh0XT1cInNlYXJjaFN0cmluZ0NoYW5nZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRwIG9mIGZpbHRlcmVkRGF0YXBvaW50czsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgICAgICAgPjwvYzh5LWRhdGFwb2ludC1zZWxlY3Rvci1saXN0LWl0ZW0+XG4gICAgICAgICAgICA8L2M4eS1saXN0LWdyb3VwPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPCEtLSBsYXN0IGNvbHVtbiAgLS0+XG4gIDxkaXYgY2xhc3M9XCJpbm5lci1zY3JvbGwgYmctbGV2ZWwtMVwiICpuZ0lmPVwiIWhpZGVTZWxlY3Rpb25cIj5cbiAgICA8cFxuICAgICAgY2xhc3M9XCJ0ZXh0LW1lZGl1bSBwLWwtMTYgcC1yLTE2IHAtdC04IHAtYi04IHNlcGFyYXRvci1ib3R0b20gc3RpY2t5LXRvcCB0ZXh0LXRydW5jYXRlXCJcbiAgICAgIFt0aXRsZV09XCInU2VsZWN0ZWQgZGF0YSBwb2ludHMnIHwgdHJhbnNsYXRlXCJcbiAgICAgIHRyYW5zbGF0ZVxuICAgID5cbiAgICAgIFNlbGVjdGVkIGRhdGEgcG9pbnRzXG4gICAgPC9wPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwIGdhcC04IHAtbC0xNiBwLXItMTYgcC10LTggcC1iLTE2XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWRhdGFwb2ludC1waWxsXCIgKm5nRm9yPVwibGV0IHNlbGVjdGVkRHAgb2Ygc2VsZWN0ZWREYXRhcG9pbnRzXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBbdGl0bGVdPVwiJ1JlbW92ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiYzh5LWRhdGFwb2ludC1waWxsX19idG5cIlxuICAgICAgICAgIChjbGljayk9XCJkYXRhcG9pbnRSZW1vdmVkKHNlbGVjdGVkRHApXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGM4eUljb249XCJyZW1vdmVcIiBjbGFzcz1cImljb24tMTRcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjOHktZGF0YXBvaW50LXBpbGxfX2xhYmVsXCJcbiAgICAgICAgICBbdGl0bGVdPVwic2VsZWN0ZWREcCB8IGRhdGFwb2ludExhYmVsOiB7IGRvTm90VXNlTGFiZWw6IHRydWUsIGluY2x1ZGVEZXZpY2U6IHRydWUgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwiY2lyY2xlXCIgY2xhc3M9XCJtLXItNCBpY29uLTE0XCIgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkRHAuY29sb3JcIj48L2k+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIj57eyBzZWxlY3RlZERwIHwgZGF0YXBvaW50TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkIHRleHQtMTBcIiAqbmdJZj1cInNlbGVjdGVkRHA/Ll9fdGFyZ2V0Py5uYW1lXCI+XG4gICAgICAgICAgICAgIHt7IHNlbGVjdGVkRHA/Ll9fdGFyZ2V0Py5uYW1lIH19XG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicC0xNlwiICpuZ0lmPVwiIXNlbGVjdGVkRGF0YXBvaW50cyB8fCAhc2VsZWN0ZWREYXRhcG9pbnRzLmxlbmd0aFwiPlxuICAgICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgICBbaWNvbl09XCInYzh5LWRhdGEtcG9pbnRzJ1wiXG4gICAgICAgIFt0aXRsZV09XCInTm8gZGF0YSBwb2ludHMgc2VsZWN0ZWQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtob3Jpem9udGFsXT1cInRydWVcIlxuICAgICAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50LXNlbGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RhdGFwb2ludC1zZWxlY3Rvci9kYXRhcG9pbnQtc2VsZWN0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGF0YXBvaW50LXNlbGVjdG9yL2RhdGFwb2ludC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDeEUsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsR0FBRyxFQUNILFdBQVcsRUFDWCxTQUFTLEVBQ1QsR0FBRyxFQUNKLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7Ozs7QUFjdEUsTUFBTSxPQUFPLDBCQUEwQjtJQThCckMsWUFBb0IsZ0JBQXlDO1FBQXpDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBeUI7UUE1QnBELHlCQUFvQixHQUFHLElBQUksQ0FBQztRQUM1QixzQ0FBaUMsR0FBRyxJQUFJLENBQUM7UUFDbEQsdUJBQWtCLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQztRQUNwQyx1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDMUIsNkJBQXdCLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLHVCQUFrQixHQUFHLElBQUksQ0FBQztRQUMxQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNuQixrQkFBYSxHQUFHLEtBQUssQ0FBQztR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YSwwQkFBMEI7a0JBWHRDLFNBQVM7K0JBQ0Usd0JBQXdCLGFBRXZCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLEtBQUssRUFBRSxJQUFJOzRCQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDJCQUEyQixDQUFDO3lCQUMxRDtxQkFDRjs4R0FHUSxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxpQ0FBaUM7c0JBQXpDLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJSWRlbnRpZmllZCwgSVJlc3VsdExpc3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb20sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG4gIHN3aXRjaE1hcCxcbiAgdGFwXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERhdGFwb2ludExpYnJhcnlTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhcG9pbnQtbGlicmFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IEtQSURldGFpbHMsIE1hbmFnZWRPYmplY3RLUEkgfSBmcm9tICcuL2RhdGFwb2ludC1zZWxlY3Rpb24ubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50LXNlbGVjdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFwb2ludC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRhcG9pbnRTZWxlY3RvckNvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YXBvaW50U2VsZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgY29udGV4dEFzc2V0OiBJSWRlbnRpZmllZDtcbiAgQElucHV0KCkgYWxsb3dDaGFuZ2luZ0NvbnRleHQgPSB0cnVlO1xuICBASW5wdXQoKSBhbGxvd0RhdGFwb2ludHNGcm9tTXVsdGlwbGVBc3NldHMgPSB0cnVlO1xuICBzZWxlY3RlZERhdGFwb2ludHMgPSBuZXcgQXJyYXk8S1BJRGV0YWlscz4oKTtcbiAgQElucHV0KCkgZGVmYXVsdEFjdGl2ZVN0YXRlID0gdHJ1ZTtcbiAgQElucHV0KCkgaWdub3JlRGF0YXBvaW50VGVtcGxhdGVzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGd1ZXNzRGF0YXBvaW50VW5pdCA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93U2VhcmNoID0gdHJ1ZTtcbiAgQElucHV0KCkgaGlkZVNlbGVjdGlvbiA9IGZhbHNlO1xuICBzZWFyY2hTdHJpbmcgPSAnJztcbiAgbWF4TnVtYmVyT2ZEYXRhcG9pbnRzID0gNTA7XG5cbiAgbG9hZGluZ0RhdGFwb2ludHMgPSBmYWxzZTtcbiAgYXNzZXRTZWxlY3Rpb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElJZGVudGlmaWVkPihudWxsKTtcbiAgZGF0YXBvaW50cyQ6IE9ic2VydmFibGU8S1BJRGV0YWlsc1tdPjtcbiAgZmlsdGVyZWREYXRhcG9pbnRzJDogT2JzZXJ2YWJsZTxLUElEZXRhaWxzW10+O1xuICBzZWFyY2hTdHJpbmdDaGFuZ2VzJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBkYXRhcG9pbnRMaWJyYXJ5RW50cmllczogT2JzZXJ2YWJsZTxJUmVzdWx0TGlzdDxNYW5hZ2VkT2JqZWN0S1BJPj47XG5cbiAgZW1wdHlTdGF0ZVN1YnRpdGxlV2hlbk5vTWF0Y2hpbmdEYXRhUG9pbnRzID0gZ2V0dGV4dCgnVHJ5IGFub3RoZXIgc2VhcmNoIHRlcm0uJyk7XG4gIGVtcHR5U3RhdGVTdWJ0aXRsZVdoZW5Ob0RhdGFQb2ludHNJbkFzc2V0ID0gZ2V0dGV4dChcbiAgICAnU2VsZWN0IGFuIGFzc2V0IHdpdGggZGF0YSBwb2ludHMgZnJvbSB0aGUgbGlzdC4nXG4gICk7XG5cbiAgcHJpdmF0ZSBzZWFyY2hTdHJpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIHByaXZhdGUgdG91Y2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIG9uQ2hhbmdlOiAocXVhbnRpdHk6IEtQSURldGFpbHNbXSkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhcG9pbnRTZXJ2aWNlOiBEYXRhcG9pbnRMaWJyYXJ5U2VydmljZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldHVwT2JzZXJ2YWJsZXMoKTtcbiAgICBpZiAoIXRoaXMuaWdub3JlRGF0YXBvaW50VGVtcGxhdGVzKSB7XG4gICAgICB0aGlzLmRhdGFwb2ludExpYnJhcnlFbnRyaWVzID0gZnJvbSh0aGlzLmRhdGFwb2ludFNlcnZpY2UuZ2V0Rmlyc3REYXRhcG9pbnRMaWJyYXJ5UGFnZSgpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZXh0QXNzZXQpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLmNvbnRleHRBc3NldCk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZShvYmo6IEtQSURldGFpbHNbXSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhcG9pbnRzID0gb2JqO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBkYXRhcG9pbnRBZGRlZChkcDogS1BJRGV0YWlscyk6IHZvaWQge1xuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgIGRwLl9fYWN0aXZlID0gdGhpcy5kZWZhdWx0QWN0aXZlU3RhdGU7XG4gICAgaWYgKHRoaXMuZ3Vlc3NEYXRhcG9pbnRVbml0ICYmICFkcC51bml0KSB7XG4gICAgICB0aGlzLmRhdGFwb2ludFNlcnZpY2UuZ3Vlc3NVbml0T2ZEYXRhcG9pbnQoZHAuZnJhZ21lbnQsIGRwLnNlcmllcywgZHAuX190YXJnZXQpLnRoZW4odW5pdCA9PiB7XG4gICAgICAgIGRwLnVuaXQgPSB1bml0O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWREYXRhcG9pbnRzID0gWy4uLnRoaXMuc2VsZWN0ZWREYXRhcG9pbnRzLCBkcF07XG4gICAgdGhpcy5lbWl0Q3VycmVudFNlbGVjdGlvbigpO1xuICB9XG5cbiAgZGF0YXBvaW50UmVtb3ZlZChkcDogS1BJRGV0YWlscyk6IHZvaWQge1xuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhcG9pbnRzID0gdGhpcy5zZWxlY3RlZERhdGFwb2ludHMuZmlsdGVyKFxuICAgICAgdG1wID0+XG4gICAgICAgIHRtcC5mcmFnbWVudCAhPT0gZHAuZnJhZ21lbnQgfHxcbiAgICAgICAgdG1wLnNlcmllcyAhPT0gZHAuc2VyaWVzIHx8XG4gICAgICAgIHRtcC5fX3RhcmdldD8uaWQgIT09IGRwLl9fdGFyZ2V0Py5pZFxuICAgICk7XG4gICAgdGhpcy5lbWl0Q3VycmVudFNlbGVjdGlvbigpO1xuICB9XG5cbiAgc2VsZWN0aW9uQ2hhbmdlZChldnQ6IElJZGVudGlmaWVkIHwgSUlkZW50aWZpZWRbXSk6IHZvaWQge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2dCkgJiYgZXZ0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QXNzZXQoZXZ0WzBdKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXZ0KSAmJiBldnQuaXRlbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkNoYW5nZWQoZXZ0Lml0ZW1zKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXZ0KSAmJiBldnQuaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdEFzc2V0KGV2dCk7XG4gICAgfVxuXG4gICAgLy8gcmVzZXQgc2VsZWN0aW9uXG4gICAgdGhpcy5hc3NldFNlbGVjdGlvbi5uZXh0KG51bGwpO1xuICB9XG5cbiAgdHJhY2tCeUZuKF9pbmRleDogbnVtYmVyLCBpdGVtOiBLUElEZXRhaWxzKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7aXRlbS5mcmFnbWVudH0tJHtpdGVtLl9fdGFyZ2V0Py5pZH0tJHtpdGVtLnNlcmllc31gO1xuICB9XG5cbiAgc2VhcmNoU3RyaW5nQ2hhbmdlZChuZXdWYWx1ZSA9ICcnKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hTdHJpbmckLm5leHQobmV3VmFsdWUpO1xuICAgIHRoaXMuc2VhcmNoU3RyaW5nID0gbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHNldHVwT2JzZXJ2YWJsZXMoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhcG9pbnRzJCA9IHRoaXMuYXNzZXRTZWxlY3Rpb24ucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ0RhdGFwb2ludHMgPSB0cnVlO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoYXNzZXQgPT5cbiAgICAgICAgYXNzZXQ/LmlkXG4gICAgICAgICAgPyB0aGlzLmRhdGFwb2ludFNlcnZpY2UuZ2V0RGF0YXBvaW50c09mQXNzZXQoYXNzZXQsIHRoaXMuaWdub3JlRGF0YXBvaW50VGVtcGxhdGVzKVxuICAgICAgICAgIDogW11cbiAgICAgICksXG4gICAgICB0YXAoKCkgPT4gKHRoaXMubG9hZGluZ0RhdGFwb2ludHMgPSBmYWxzZSkpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuXG4gICAgdGhpcy5zZWFyY2hTdHJpbmdDaGFuZ2VzJCA9IHRoaXMuc2VhcmNoU3RyaW5nJC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuXG4gICAgdGhpcy5maWx0ZXJlZERhdGFwb2ludHMkID0gY29tYmluZUxhdGVzdChbdGhpcy5zZWFyY2hTdHJpbmdDaGFuZ2VzJCwgdGhpcy5kYXRhcG9pbnRzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtzZWFyY2hTdHJpbmcsIGRhdGFwb2ludHNdKSA9PiB7XG4gICAgICAgIGlmICghc2VhcmNoU3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGFwb2ludHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoU3RyaW5nID0gc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBkYXRhcG9pbnRzLmZpbHRlcihkYXRhcG9pbnQgPT5cbiAgICAgICAgICB0aGlzLmluY2x1ZGVzU2VhcmNoU3RyaW5nKGRhdGFwb2ludCwgbG93ZXJDYXNlU2VhcmNoU3RyaW5nKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBtYXAoZmlsdGVyZWQgPT4gZmlsdGVyZWQuc2xpY2UoMCwgdGhpcy5tYXhOdW1iZXJPZkRhdGFwb2ludHMpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEFzc2V0KGFzc2V0OiBJSWRlbnRpZmllZCkge1xuICAgIHRoaXMuYXNzZXRTZWxlY3Rpb24ubmV4dChhc3NldCk7XG4gICAgdGhpcy5zZWFyY2hTdHJpbmdDaGFuZ2VkKCk7XG4gICAgaWYgKCF0aGlzLmFsbG93RGF0YXBvaW50c0Zyb21NdWx0aXBsZUFzc2V0cykge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGFwb2ludHMgPSBbXTtcbiAgICB0aGlzLmVtaXRDdXJyZW50U2VsZWN0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRDdXJyZW50U2VsZWN0aW9uKCkge1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy5zZWxlY3RlZERhdGFwb2ludHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNUb3VjaGVkKCkge1xuICAgIGlmICghdGhpcy50b3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluY2x1ZGVzU2VhcmNoU3RyaW5nKGRhdGFwb2ludDogS1BJRGV0YWlscywgbG93ZXJDYXNlU2VhcmNoU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsYWJlbCA9IGRhdGFwb2ludC5sYWJlbD8udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobGFiZWwgJiYgbGFiZWwuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZnJhZ21lbnQgPSBkYXRhcG9pbnQuZnJhZ21lbnQ/LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGZyYWdtZW50ICYmIGZyYWdtZW50LmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaFN0cmluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmllcyA9IGRhdGFwb2ludC5zZXJpZXM/LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHNlcmllcyAmJiBzZXJpZXMuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiZC1ncmlkIGdyaWRfX3Jvdy0tMSBmaXQtaFwiXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAnZ3JpZF9fY29sLS0zLTYtMy0tbWQnOiBhbGxvd0NoYW5naW5nQ29udGV4dCAmJiAhaGlkZVNlbGVjdGlvbixcbiAgICAnZ3JpZF9fY29sLS04LTQtLW1kJzogIWFsbG93Q2hhbmdpbmdDb250ZXh0ICYmICFoaWRlU2VsZWN0aW9uLFxuICAgICdncmlkX19jb2wtLTQtOC0tbWQnOiBhbGxvd0NoYW5naW5nQ29udGV4dCAmJiBoaWRlU2VsZWN0aW9uXG4gIH1cIlxuPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGQtY29sIHAtcmVsYXRpdmUgYmctbGV2ZWwtMVwiICpuZ0lmPVwiYWxsb3dDaGFuZ2luZ0NvbnRleHRcIj5cbiAgICA8Yzh5LWFzc2V0LXNlbGVjdG9yLW1pbGxlclxuICAgICAgWyhuZ01vZGVsKV09XCJjb250ZXh0QXNzZXRcIlxuICAgICAgW2Fzc2V0XT1cImNvbnRleHRBc3NldFwiXG4gICAgICAob25TZWxlY3RlZCk9XCJzZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIlxuICAgICAgW2NvbnRhaW5lcl09XCInJ1wiXG4gICAgICBbY29uZmlnXT1cIntcbiAgICAgICAgdmlldzogJ21pbGxlcicsXG4gICAgICAgIGdyb3Vwc1NlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIGNvbHVtbkhlYWRlcnM6IHRydWUsXG4gICAgICAgIHNob3dDaGlsZERldmljZXM6IHRydWUsXG4gICAgICAgIHNob3dVbmFzc2lnbmVkRGV2aWNlczogdHJ1ZSxcbiAgICAgICAgc2luZ2xlQ29sdW1uOiB0cnVlLFxuICAgICAgICBzZWFyY2g6IGFsbG93U2VhcmNoLFxuICAgICAgICBzaG93RmlsdGVyOiB0cnVlXG4gICAgICB9XCJcbiAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgPjwvYzh5LWFzc2V0LXNlbGVjdG9yLW1pbGxlcj5cbiAgPC9kaXY+XG4gIDwhLS0gY2VudGVyIGNvbHVtbiAtLT5cbiAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbCBiZy1jb21wb25lbnRcIj5cbiAgICA8bmctdGVtcGxhdGUgI25vRGV2aWNlRW1wdHlTdGF0ZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTE2XCI+XG4gICAgICAgIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICAgICAgICBbaWNvbl09XCInYzh5LWRhdGEtcG9pbnRzJ1wiXG4gICAgICAgICAgW3RpdGxlXT1cIidObyBkYXRhIHBvaW50cyB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFtzdWJ0aXRsZV09XCInU2VsZWN0IGFuIGFzc2V0IGZyb20gdGhlIGxpc3QuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNsb2FkaW5nRGF0YT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyXCI+XG4gICAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiYXNzZXRTZWxlY3Rpb24gfCBhc3luYyBhcyBhc3NldDsgZWxzZSBub0RldmljZUVtcHR5U3RhdGVcIiBjbGFzcz1cImJnLWluaGVyaXRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLWwtMTYgcC1yLTE2IHAtdC04IHAtYi04IHN0aWNreS10b3AgYmctaW5oZXJpdCBzZXBhcmF0b3ItYm90dG9tXCI+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1tZWRpdW0gdGV4dC10cnVuY2F0ZVwiIFt0aXRsZV09XCInQXZhaWxhYmxlIGRhdGEgcG9pbnRzJyB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgIHt7ICdBdmFpbGFibGUgZGF0YSBwb2ludHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nRGF0YXBvaW50c1wiIGlkPVwic2VhcmNoXCIgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zZWFyY2ggbS10LTRcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2jigKZcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoU3RyaW5nXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlYXJjaFN0cmluZ0NoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwic2VhcmNoXCIgKm5nSWY9XCIhc2VhcmNoU3RyaW5nOyBlbHNlIGNsZWFyU2VhcmNoU3RyaW5nXCI+PC9pPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjbGVhclNlYXJjaFN0cmluZz5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInRpbWVzXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKGNsaWNrKT1cInNlYXJjaFN0cmluZ0NoYW5nZWQoKVwiPjwvaT5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkRGF0YXBvaW50cyQgfCBhc3luYyBhcyBmaWx0ZXJlZERhdGFwb2ludHM7IGVsc2UgbG9hZGluZ0RhdGFcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nRGF0YXBvaW50czsgZWxzZSBsb2FkaW5nRGF0YVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhcG9pbnRzJCB8IGFzeW5jIGFzIGRhdGFwb2ludHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTE2XCIgKm5nSWY9XCIhZmlsdGVyZWREYXRhcG9pbnRzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiJ2M4eS1kYXRhLXBvaW50cydcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInTm8gZGF0YSBwb2ludHMgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbc3VidGl0bGVdPVwiXG4gICAgICAgICAgICAgICAgICBkYXRhcG9pbnRzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IChlbXB0eVN0YXRlU3VidGl0bGVXaGVuTm9NYXRjaGluZ0RhdGFQb2ludHMgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgIDogKGVtcHR5U3RhdGVTdWJ0aXRsZVdoZW5Ob0RhdGFQb2ludHNJbkFzc2V0IHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8Yzh5LWxpc3QtZ3JvdXA+XG4gICAgICAgICAgICAgIDxjOHktbGlzdC1pdGVtXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGRhdGFwb2ludHMubGVuZ3RoID4gbWF4TnVtYmVyT2ZEYXRhcG9pbnRzICYmXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGFwb2ludHMubGVuZ3RoID49IG1heE51bWJlck9mRGF0YXBvaW50c1xuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdGlja3ktdG9wXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInRvcDogNzJweFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBtLWItMFwiPlxuICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgJ0R1ZSB0byB0aGUgbGFyZ2UgbnVtYmVyLCBvbmx5IGEgc3Vic2V0IG9mIGRhdGEgcG9pbnRzIGlzIGRpc3BsYXllZC4gVXNlIHNlYXJjaCB0byBuYXJyb3cgZG93biB0aGUgbnVtYmVyIG9mIHJlc3VsdHMuJ1xuICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2M4eS1saXN0LWl0ZW0+XG4gICAgICAgICAgICAgIDxjOHktZGF0YXBvaW50LXNlbGVjdG9yLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImRwXCJcbiAgICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJzZWxlY3RlZERhdGFwb2ludHMgfCBpbmNsdWRlc0RhdGFwb2ludDogZHBcIlxuICAgICAgICAgICAgICAgIFtkYXRhcG9pbnRMaWJyYXJ5RW50cmllc109XCJkYXRhcG9pbnRMaWJyYXJ5RW50cmllc1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVUeXBlYWhlYWRJZlNlbGVjdGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIChhZGRlZCk9XCJkYXRhcG9pbnRBZGRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJkYXRhcG9pbnRSZW1vdmVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtoaWdobGlnaHRUZXh0XT1cInNlYXJjaFN0cmluZ0NoYW5nZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRwIG9mIGZpbHRlcmVkRGF0YXBvaW50czsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgICAgICAgPjwvYzh5LWRhdGFwb2ludC1zZWxlY3Rvci1saXN0LWl0ZW0+XG4gICAgICAgICAgICA8L2M4eS1saXN0LWdyb3VwPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPCEtLSBsYXN0IGNvbHVtbiAgLS0+XG4gIDxkaXYgY2xhc3M9XCJpbm5lci1zY3JvbGwgYmctbGV2ZWwtMVwiICpuZ0lmPVwiIWhpZGVTZWxlY3Rpb25cIj5cbiAgICA8cFxuICAgICAgY2xhc3M9XCJ0ZXh0LW1lZGl1bSBwLWwtMTYgcC1yLTE2IHAtdC04IHAtYi04IHNlcGFyYXRvci1ib3R0b20gc3RpY2t5LXRvcCB0ZXh0LXRydW5jYXRlXCJcbiAgICAgIFt0aXRsZV09XCInU2VsZWN0ZWQgZGF0YSBwb2ludHMnIHwgdHJhbnNsYXRlXCJcbiAgICAgIHRyYW5zbGF0ZVxuICAgID5cbiAgICAgIFNlbGVjdGVkIGRhdGEgcG9pbnRzXG4gICAgPC9wPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwIGdhcC04IHAtbC0xNiBwLXItMTYgcC10LTggcC1iLTE2XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWRhdGFwb2ludC1waWxsXCIgKm5nRm9yPVwibGV0IHNlbGVjdGVkRHAgb2Ygc2VsZWN0ZWREYXRhcG9pbnRzXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBbdGl0bGVdPVwiJ1JlbW92ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiYzh5LWRhdGFwb2ludC1waWxsX19idG5cIlxuICAgICAgICAgIChjbGljayk9XCJkYXRhcG9pbnRSZW1vdmVkKHNlbGVjdGVkRHApXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGM4eUljb249XCJyZW1vdmVcIiBjbGFzcz1cImljb24tMTRcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjOHktZGF0YXBvaW50LXBpbGxfX2xhYmVsXCJcbiAgICAgICAgICBbdGl0bGVdPVwic2VsZWN0ZWREcCB8IGRhdGFwb2ludExhYmVsOiB7IGRvTm90VXNlTGFiZWw6IHRydWUsIGluY2x1ZGVEZXZpY2U6IHRydWUgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwiY2lyY2xlXCIgY2xhc3M9XCJtLXItNCBpY29uLTE0XCIgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkRHAuY29sb3JcIj48L2k+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIj57eyBzZWxlY3RlZERwIHwgZGF0YXBvaW50TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkIHRleHQtMTBcIiAqbmdJZj1cInNlbGVjdGVkRHA/Ll9fdGFyZ2V0Py5uYW1lXCI+XG4gICAgICAgICAgICAgIHt7IHNlbGVjdGVkRHA/Ll9fdGFyZ2V0Py5uYW1lIH19XG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicC0xNlwiICpuZ0lmPVwiIXNlbGVjdGVkRGF0YXBvaW50cyB8fCAhc2VsZWN0ZWREYXRhcG9pbnRzLmxlbmd0aFwiPlxuICAgICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgICBbaWNvbl09XCInYzh5LWRhdGEtcG9pbnRzJ1wiXG4gICAgICAgIFt0aXRsZV09XCInTm8gZGF0YSBwb2ludHMgc2VsZWN0ZWQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtob3Jpem9udGFsXT1cInRydWVcIlxuICAgICAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -969,7 +969,7 @@ DatapointSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0
|
|
|
969
969
|
multi: true,
|
|
970
970
|
useExisting: forwardRef(() => DatapointSelectorComponent)
|
|
971
971
|
}
|
|
972
|
-
], ngImport: i0, template: "<div\n class=\"d-grid grid__row--1 fit-h\"\n [ngClass]=\"{\n 'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n 'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n 'grid__col--4-8--md': allowChangingContext && hideSelection\n }\"\n>\n <div class=\"d-flex d-col p-relative bg-level-1\" *ngIf=\"allowChangingContext\">\n <c8y-asset-selector-miller\n [(ngModel)]=\"contextAsset\"\n [asset]=\"contextAsset\"\n (onSelected)=\"selectionChanged($event)\"\n [container]=\"''\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: true,\n columnHeaders: true,\n showChildDevices: true,\n showUnassignedDevices: true,\n singleColumn: true,\n search: allowSearch\n }\"\n class=\"d-contents\"\n ></c8y-asset-selector-miller>\n </div>\n <!-- center column -->\n <div class=\"inner-scroll bg-component\">\n <ng-template #noDeviceEmptyState>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Select an asset from the list.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </ng-template>\n <ng-template #loadingData>\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <div *ngIf=\"assetSelection | async as asset; else noDeviceEmptyState\" class=\"bg-inherit\">\n <div class=\"p-l-16 p-r-16 p-t-8 p-b-8 sticky-top bg-inherit separator-bottom\">\n <p class=\"text-medium text-truncate\" [title]=\"'Available data points' | translate\">\n {{ 'Available data points' | translate }}\n </p>\n <div *ngIf=\"!loadingDatapoints\" id=\"search\" class=\"input-group input-group-search m-t-4\">\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"Search\u2026\"\n [ngModel]=\"searchString\"\n (ngModelChange)=\"searchStringChanged($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"!searchString; else clearSearchString\"></i>\n <ng-template #clearSearchString>\n <i c8yIcon=\"times\" class=\"text-muted\" (click)=\"searchStringChanged()\"></i>\n </ng-template>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"filteredDatapoints$ | async as filteredDatapoints; else loadingData\">\n <ng-container *ngIf=\"!loadingDatapoints; else loadingData\">\n <ng-container *ngIf=\"datapoints$ | async as datapoints\">\n <div class=\"p-16\" *ngIf=\"!filteredDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"\n datapoints.length\n ? (emptyStateSubtitleWhenNoMatchingDataPoints | translate)\n : (emptyStateSubtitleWhenNoDataPointsInAsset | translate)\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n\n <c8y-list-group>\n <c8y-list-item\n *ngIf=\"\n datapoints.length > maxNumberOfDatapoints &&\n filteredDatapoints.length >= maxNumberOfDatapoints\n \"\n class=\"sticky-top\"\n style=\"top: 72px\"\n >\n <div class=\"alert alert-warning m-b-0\">\n {{\n 'Due to the large number, only a subset of data points is displayed. Use search to narrow down the number of results.'\n | translate\n }}\n </div>\n </c8y-list-item>\n <c8y-datapoint-selector-list-item\n [ngModel]=\"dp\"\n [isSelected]=\"selectedDatapoints | includesDatapoint: dp\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [disableTypeaheadIfSelected]=\"true\"\n (added)=\"datapointAdded($event)\"\n (removed)=\"datapointRemoved($event)\"\n [highlightText]=\"searchStringChanges$ | async\"\n class=\"d-contents\"\n *ngFor=\"let dp of filteredDatapoints; trackBy: trackByFn\"\n ></c8y-datapoint-selector-list-item>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- last column -->\n <div class=\"inner-scroll bg-level-1\" *ngIf=\"!hideSelection\">\n <p\n class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n [title]=\"'Selected data points' | translate\"\n translate\n >\n Selected data points\n </p>\n <div class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\">\n <div class=\"c8y-datapoint-pill\" *ngFor=\"let selectedDp of selectedDatapoints\">\n <button\n [title]=\"'Remove' | translate\"\n type=\"button\"\n class=\"c8y-datapoint-pill__btn\"\n (click)=\"datapointRemoved(selectedDp)\"\n >\n <i c8yIcon=\"remove\" class=\"icon-14\"></i>\n </button>\n <div\n class=\"c8y-datapoint-pill__label\"\n [title]=\"selectedDp | datapointLabel: { doNotUseLabel: true, includeDevice: true }\"\n >\n <i c8yIcon=\"circle\" class=\"m-r-4 icon-14\" [style.color]=\"selectedDp.color\"></i>\n <span class=\"text-truncate\">\n <span class=\"text-truncate\">{{ selectedDp | datapointLabel }}</span>\n <small class=\"text-muted text-10\" *ngIf=\"selectedDp?.__target?.name\">\n {{ selectedDp?.__target?.name }}\n </small>\n </span>\n </div>\n </div>\n </div>\n <div class=\"p-16\" *ngIf=\"!selectedDatapoints || !selectedDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i2$1.MillerViewComponent, selector: "c8y-asset-selector-miller", inputs: ["config", "asset", "selectedDevice", "rootNode", "container"], outputs: ["onSelected", "onClearSelected"] }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.LoadingComponent, selector: "c8y-loading" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: DatapointSelectorListItemComponent, selector: "c8y-datapoint-selector-list-item", inputs: ["defaultFormOptions", "isSelected", "isCollapsed", "showAddRemoveButton", "editable", "showActiveToggle", "activeToggleDisabled", "showOptions", "datapointLibraryEntries", "actions", "optionToRemove", "hasUnlinkTemplateOption", "colorPickerDisabled", "disableTypeaheadIfSelected", "highlightText"], outputs: ["added", "removed"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: IncludesDatapointPipe, name: "includesDatapoint" }, { kind: "pipe", type: DatapointLabelPipe, name: "datapointLabel" }] });
|
|
972
|
+
], ngImport: i0, template: "<div\n class=\"d-grid grid__row--1 fit-h\"\n [ngClass]=\"{\n 'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n 'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n 'grid__col--4-8--md': allowChangingContext && hideSelection\n }\"\n>\n <div class=\"d-flex d-col p-relative bg-level-1\" *ngIf=\"allowChangingContext\">\n <c8y-asset-selector-miller\n [(ngModel)]=\"contextAsset\"\n [asset]=\"contextAsset\"\n (onSelected)=\"selectionChanged($event)\"\n [container]=\"''\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: true,\n columnHeaders: true,\n showChildDevices: true,\n showUnassignedDevices: true,\n singleColumn: true,\n search: allowSearch,\n showFilter: true\n }\"\n class=\"d-contents\"\n ></c8y-asset-selector-miller>\n </div>\n <!-- center column -->\n <div class=\"inner-scroll bg-component\">\n <ng-template #noDeviceEmptyState>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Select an asset from the list.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </ng-template>\n <ng-template #loadingData>\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <div *ngIf=\"assetSelection | async as asset; else noDeviceEmptyState\" class=\"bg-inherit\">\n <div class=\"p-l-16 p-r-16 p-t-8 p-b-8 sticky-top bg-inherit separator-bottom\">\n <p class=\"text-medium text-truncate\" [title]=\"'Available data points' | translate\">\n {{ 'Available data points' | translate }}\n </p>\n <div *ngIf=\"!loadingDatapoints\" id=\"search\" class=\"input-group input-group-search m-t-4\">\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"Search\u2026\"\n [ngModel]=\"searchString\"\n (ngModelChange)=\"searchStringChanged($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"!searchString; else clearSearchString\"></i>\n <ng-template #clearSearchString>\n <i c8yIcon=\"times\" class=\"text-muted\" (click)=\"searchStringChanged()\"></i>\n </ng-template>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"filteredDatapoints$ | async as filteredDatapoints; else loadingData\">\n <ng-container *ngIf=\"!loadingDatapoints; else loadingData\">\n <ng-container *ngIf=\"datapoints$ | async as datapoints\">\n <div class=\"p-16\" *ngIf=\"!filteredDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"\n datapoints.length\n ? (emptyStateSubtitleWhenNoMatchingDataPoints | translate)\n : (emptyStateSubtitleWhenNoDataPointsInAsset | translate)\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n\n <c8y-list-group>\n <c8y-list-item\n *ngIf=\"\n datapoints.length > maxNumberOfDatapoints &&\n filteredDatapoints.length >= maxNumberOfDatapoints\n \"\n class=\"sticky-top\"\n style=\"top: 72px\"\n >\n <div class=\"alert alert-warning m-b-0\">\n {{\n 'Due to the large number, only a subset of data points is displayed. Use search to narrow down the number of results.'\n | translate\n }}\n </div>\n </c8y-list-item>\n <c8y-datapoint-selector-list-item\n [ngModel]=\"dp\"\n [isSelected]=\"selectedDatapoints | includesDatapoint: dp\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [disableTypeaheadIfSelected]=\"true\"\n (added)=\"datapointAdded($event)\"\n (removed)=\"datapointRemoved($event)\"\n [highlightText]=\"searchStringChanges$ | async\"\n class=\"d-contents\"\n *ngFor=\"let dp of filteredDatapoints; trackBy: trackByFn\"\n ></c8y-datapoint-selector-list-item>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- last column -->\n <div class=\"inner-scroll bg-level-1\" *ngIf=\"!hideSelection\">\n <p\n class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n [title]=\"'Selected data points' | translate\"\n translate\n >\n Selected data points\n </p>\n <div class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\">\n <div class=\"c8y-datapoint-pill\" *ngFor=\"let selectedDp of selectedDatapoints\">\n <button\n [title]=\"'Remove' | translate\"\n type=\"button\"\n class=\"c8y-datapoint-pill__btn\"\n (click)=\"datapointRemoved(selectedDp)\"\n >\n <i c8yIcon=\"remove\" class=\"icon-14\"></i>\n </button>\n <div\n class=\"c8y-datapoint-pill__label\"\n [title]=\"selectedDp | datapointLabel: { doNotUseLabel: true, includeDevice: true }\"\n >\n <i c8yIcon=\"circle\" class=\"m-r-4 icon-14\" [style.color]=\"selectedDp.color\"></i>\n <span class=\"text-truncate\">\n <span class=\"text-truncate\">{{ selectedDp | datapointLabel }}</span>\n <small class=\"text-muted text-10\" *ngIf=\"selectedDp?.__target?.name\">\n {{ selectedDp?.__target?.name }}\n </small>\n </span>\n </div>\n </div>\n </div>\n <div class=\"p-16\" *ngIf=\"!selectedDatapoints || !selectedDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i2$1.MillerViewComponent, selector: "c8y-asset-selector-miller", inputs: ["config", "asset", "selectedDevice", "rootNode", "container"], outputs: ["onSelected", "onClearSelected"] }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.LoadingComponent, selector: "c8y-loading" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: DatapointSelectorListItemComponent, selector: "c8y-datapoint-selector-list-item", inputs: ["defaultFormOptions", "isSelected", "isCollapsed", "showAddRemoveButton", "editable", "showActiveToggle", "activeToggleDisabled", "showOptions", "datapointLibraryEntries", "actions", "optionToRemove", "hasUnlinkTemplateOption", "colorPickerDisabled", "disableTypeaheadIfSelected", "highlightText"], outputs: ["added", "removed"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: IncludesDatapointPipe, name: "includesDatapoint" }, { kind: "pipe", type: DatapointLabelPipe, name: "datapointLabel" }] });
|
|
973
973
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DatapointSelectorComponent, decorators: [{
|
|
974
974
|
type: Component,
|
|
975
975
|
args: [{ selector: 'c8y-datapoint-selector', providers: [
|
|
@@ -978,7 +978,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
978
978
|
multi: true,
|
|
979
979
|
useExisting: forwardRef(() => DatapointSelectorComponent)
|
|
980
980
|
}
|
|
981
|
-
], template: "<div\n class=\"d-grid grid__row--1 fit-h\"\n [ngClass]=\"{\n 'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n 'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n 'grid__col--4-8--md': allowChangingContext && hideSelection\n }\"\n>\n <div class=\"d-flex d-col p-relative bg-level-1\" *ngIf=\"allowChangingContext\">\n <c8y-asset-selector-miller\n [(ngModel)]=\"contextAsset\"\n [asset]=\"contextAsset\"\n (onSelected)=\"selectionChanged($event)\"\n [container]=\"''\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: true,\n columnHeaders: true,\n showChildDevices: true,\n showUnassignedDevices: true,\n singleColumn: true,\n search: allowSearch\n }\"\n class=\"d-contents\"\n ></c8y-asset-selector-miller>\n </div>\n <!-- center column -->\n <div class=\"inner-scroll bg-component\">\n <ng-template #noDeviceEmptyState>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Select an asset from the list.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </ng-template>\n <ng-template #loadingData>\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <div *ngIf=\"assetSelection | async as asset; else noDeviceEmptyState\" class=\"bg-inherit\">\n <div class=\"p-l-16 p-r-16 p-t-8 p-b-8 sticky-top bg-inherit separator-bottom\">\n <p class=\"text-medium text-truncate\" [title]=\"'Available data points' | translate\">\n {{ 'Available data points' | translate }}\n </p>\n <div *ngIf=\"!loadingDatapoints\" id=\"search\" class=\"input-group input-group-search m-t-4\">\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"Search\u2026\"\n [ngModel]=\"searchString\"\n (ngModelChange)=\"searchStringChanged($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"!searchString; else clearSearchString\"></i>\n <ng-template #clearSearchString>\n <i c8yIcon=\"times\" class=\"text-muted\" (click)=\"searchStringChanged()\"></i>\n </ng-template>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"filteredDatapoints$ | async as filteredDatapoints; else loadingData\">\n <ng-container *ngIf=\"!loadingDatapoints; else loadingData\">\n <ng-container *ngIf=\"datapoints$ | async as datapoints\">\n <div class=\"p-16\" *ngIf=\"!filteredDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"\n datapoints.length\n ? (emptyStateSubtitleWhenNoMatchingDataPoints | translate)\n : (emptyStateSubtitleWhenNoDataPointsInAsset | translate)\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n\n <c8y-list-group>\n <c8y-list-item\n *ngIf=\"\n datapoints.length > maxNumberOfDatapoints &&\n filteredDatapoints.length >= maxNumberOfDatapoints\n \"\n class=\"sticky-top\"\n style=\"top: 72px\"\n >\n <div class=\"alert alert-warning m-b-0\">\n {{\n 'Due to the large number, only a subset of data points is displayed. Use search to narrow down the number of results.'\n | translate\n }}\n </div>\n </c8y-list-item>\n <c8y-datapoint-selector-list-item\n [ngModel]=\"dp\"\n [isSelected]=\"selectedDatapoints | includesDatapoint: dp\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [disableTypeaheadIfSelected]=\"true\"\n (added)=\"datapointAdded($event)\"\n (removed)=\"datapointRemoved($event)\"\n [highlightText]=\"searchStringChanges$ | async\"\n class=\"d-contents\"\n *ngFor=\"let dp of filteredDatapoints; trackBy: trackByFn\"\n ></c8y-datapoint-selector-list-item>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- last column -->\n <div class=\"inner-scroll bg-level-1\" *ngIf=\"!hideSelection\">\n <p\n class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n [title]=\"'Selected data points' | translate\"\n translate\n >\n Selected data points\n </p>\n <div class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\">\n <div class=\"c8y-datapoint-pill\" *ngFor=\"let selectedDp of selectedDatapoints\">\n <button\n [title]=\"'Remove' | translate\"\n type=\"button\"\n class=\"c8y-datapoint-pill__btn\"\n (click)=\"datapointRemoved(selectedDp)\"\n >\n <i c8yIcon=\"remove\" class=\"icon-14\"></i>\n </button>\n <div\n class=\"c8y-datapoint-pill__label\"\n [title]=\"selectedDp | datapointLabel: { doNotUseLabel: true, includeDevice: true }\"\n >\n <i c8yIcon=\"circle\" class=\"m-r-4 icon-14\" [style.color]=\"selectedDp.color\"></i>\n <span class=\"text-truncate\">\n <span class=\"text-truncate\">{{ selectedDp | datapointLabel }}</span>\n <small class=\"text-muted text-10\" *ngIf=\"selectedDp?.__target?.name\">\n {{ selectedDp?.__target?.name }}\n </small>\n </span>\n </div>\n </div>\n </div>\n <div class=\"p-16\" *ngIf=\"!selectedDatapoints || !selectedDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n" }]
|
|
981
|
+
], template: "<div\n class=\"d-grid grid__row--1 fit-h\"\n [ngClass]=\"{\n 'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n 'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n 'grid__col--4-8--md': allowChangingContext && hideSelection\n }\"\n>\n <div class=\"d-flex d-col p-relative bg-level-1\" *ngIf=\"allowChangingContext\">\n <c8y-asset-selector-miller\n [(ngModel)]=\"contextAsset\"\n [asset]=\"contextAsset\"\n (onSelected)=\"selectionChanged($event)\"\n [container]=\"''\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: true,\n columnHeaders: true,\n showChildDevices: true,\n showUnassignedDevices: true,\n singleColumn: true,\n search: allowSearch,\n showFilter: true\n }\"\n class=\"d-contents\"\n ></c8y-asset-selector-miller>\n </div>\n <!-- center column -->\n <div class=\"inner-scroll bg-component\">\n <ng-template #noDeviceEmptyState>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Select an asset from the list.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </ng-template>\n <ng-template #loadingData>\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <div *ngIf=\"assetSelection | async as asset; else noDeviceEmptyState\" class=\"bg-inherit\">\n <div class=\"p-l-16 p-r-16 p-t-8 p-b-8 sticky-top bg-inherit separator-bottom\">\n <p class=\"text-medium text-truncate\" [title]=\"'Available data points' | translate\">\n {{ 'Available data points' | translate }}\n </p>\n <div *ngIf=\"!loadingDatapoints\" id=\"search\" class=\"input-group input-group-search m-t-4\">\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"Search\u2026\"\n [ngModel]=\"searchString\"\n (ngModelChange)=\"searchStringChanged($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"!searchString; else clearSearchString\"></i>\n <ng-template #clearSearchString>\n <i c8yIcon=\"times\" class=\"text-muted\" (click)=\"searchStringChanged()\"></i>\n </ng-template>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"filteredDatapoints$ | async as filteredDatapoints; else loadingData\">\n <ng-container *ngIf=\"!loadingDatapoints; else loadingData\">\n <ng-container *ngIf=\"datapoints$ | async as datapoints\">\n <div class=\"p-16\" *ngIf=\"!filteredDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"\n datapoints.length\n ? (emptyStateSubtitleWhenNoMatchingDataPoints | translate)\n : (emptyStateSubtitleWhenNoDataPointsInAsset | translate)\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n\n <c8y-list-group>\n <c8y-list-item\n *ngIf=\"\n datapoints.length > maxNumberOfDatapoints &&\n filteredDatapoints.length >= maxNumberOfDatapoints\n \"\n class=\"sticky-top\"\n style=\"top: 72px\"\n >\n <div class=\"alert alert-warning m-b-0\">\n {{\n 'Due to the large number, only a subset of data points is displayed. Use search to narrow down the number of results.'\n | translate\n }}\n </div>\n </c8y-list-item>\n <c8y-datapoint-selector-list-item\n [ngModel]=\"dp\"\n [isSelected]=\"selectedDatapoints | includesDatapoint: dp\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [disableTypeaheadIfSelected]=\"true\"\n (added)=\"datapointAdded($event)\"\n (removed)=\"datapointRemoved($event)\"\n [highlightText]=\"searchStringChanges$ | async\"\n class=\"d-contents\"\n *ngFor=\"let dp of filteredDatapoints; trackBy: trackByFn\"\n ></c8y-datapoint-selector-list-item>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- last column -->\n <div class=\"inner-scroll bg-level-1\" *ngIf=\"!hideSelection\">\n <p\n class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n [title]=\"'Selected data points' | translate\"\n translate\n >\n Selected data points\n </p>\n <div class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\">\n <div class=\"c8y-datapoint-pill\" *ngFor=\"let selectedDp of selectedDatapoints\">\n <button\n [title]=\"'Remove' | translate\"\n type=\"button\"\n class=\"c8y-datapoint-pill__btn\"\n (click)=\"datapointRemoved(selectedDp)\"\n >\n <i c8yIcon=\"remove\" class=\"icon-14\"></i>\n </button>\n <div\n class=\"c8y-datapoint-pill__label\"\n [title]=\"selectedDp | datapointLabel: { doNotUseLabel: true, includeDevice: true }\"\n >\n <i c8yIcon=\"circle\" class=\"m-r-4 icon-14\" [style.color]=\"selectedDp.color\"></i>\n <span class=\"text-truncate\">\n <span class=\"text-truncate\">{{ selectedDp | datapointLabel }}</span>\n <small class=\"text-muted text-10\" *ngIf=\"selectedDp?.__target?.name\">\n {{ selectedDp?.__target?.name }}\n </small>\n </span>\n </div>\n </div>\n </div>\n <div class=\"p-16\" *ngIf=\"!selectedDatapoints || !selectedDatapoints.length\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n" }]
|
|
982
982
|
}], ctorParameters: function () { return [{ type: DatapointLibraryService }]; }, propDecorators: { contextAsset: [{
|
|
983
983
|
type: Input
|
|
984
984
|
}], allowChangingContext: [{
|