@c8y/ngx-components 1021.51.1 → 1021.54.2
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/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.d.ts +10 -2
- package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.d.ts.map +1 -1
- package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.d.ts +11 -0
- package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.d.ts.map +1 -0
- package/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.d.ts +10 -4
- package/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.d.ts.map +1 -1
- package/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.d.ts +3 -1
- package/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.d.ts.map +1 -1
- package/alarm-event-selector/alarm-event-selector.model.d.ts +7 -0
- package/alarm-event-selector/alarm-event-selector.model.d.ts.map +1 -1
- package/core/dashboard/dashboard-child-action.component.d.ts +1 -1
- package/core/dashboard/dashboard-child-action.component.d.ts.map +1 -1
- package/core/dashboard/dashboard.module.d.ts +29 -29
- package/core/dashboard/index.d.ts +3 -0
- package/core/dashboard/index.d.ts.map +1 -1
- package/core/dashboard/widgets-dashboard.component.d.ts +1 -1
- package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +1 -1
- package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.d.ts +1 -1
- package/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-date-range.service.d.ts +10 -0
- package/core/dashboard/wiget-time-context/widget-time-context-date-range.service.d.ts.map +1 -0
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +7 -4
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +0 -1
- package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
- package/core/date-picker/date-picker.component.d.ts +1 -1
- package/core/date-picker/date-picker.component.d.ts.map +1 -1
- package/core/date-picker/date-picker.module.d.ts +9 -9
- package/core/date-time-picker/close-date-picker.directive.d.ts +1 -1
- package/core/date-time-picker/close-date-picker.directive.d.ts.map +1 -1
- package/core/date-time-picker/date-time-picker.component.d.ts +6 -3
- package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
- package/core/date-time-picker/date-time-picker.module.d.ts +11 -11
- package/core/date-time-picker/date-time-picker.module.d.ts.map +1 -1
- package/core/forms/forms.module.d.ts +18 -18
- package/core/forms/required-input-placeholder.directive.d.ts +1 -1
- package/core/forms/required-input-placeholder.directive.d.ts.map +1 -1
- package/core/router/router.service.d.ts.map +1 -1
- package/core/user/user-menu.service.d.ts +36 -11
- package/core/user/user-menu.service.d.ts.map +1 -1
- package/datapoint-explorer/c8y-ngx-components-datapoint-explorer.d.ts.map +1 -0
- package/datapoint-explorer/datapoint-explorer.module.d.ts +7 -0
- package/datapoint-explorer/datapoint-explorer.module.d.ts.map +1 -0
- package/datapoint-explorer/index.d.ts +2 -0
- package/datapoint-explorer/index.d.ts.map +1 -0
- package/datapoint-explorer/view/c8y-ngx-components-datapoint-explorer-view.d.ts.map +1 -0
- package/datapoint-explorer/view/configuration/naming-dictionary.d.ts +3 -0
- package/datapoint-explorer/view/configuration/naming-dictionary.d.ts.map +1 -0
- package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts +38 -0
- package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts.map +1 -0
- package/datapoint-explorer/view/configuration/workspace-configuration.model.d.ts +7 -0
- package/datapoint-explorer/view/configuration/workspace-configuration.model.d.ts.map +1 -0
- package/datapoint-explorer/view/configuration/workspace-configuration.service.d.ts +15 -0
- package/datapoint-explorer/view/configuration/workspace-configuration.service.d.ts.map +1 -0
- package/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.d.ts +25 -0
- package/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.d.ts.map +1 -0
- package/datapoint-explorer/view/datapoint-explorer.component.d.ts +67 -0
- package/datapoint-explorer/view/datapoint-explorer.component.d.ts.map +1 -0
- package/datapoint-explorer/view/datapoint-explorer.service.d.ts +9 -0
- package/datapoint-explorer/view/datapoint-explorer.service.d.ts.map +1 -0
- package/datapoint-explorer/view/index.d.ts +2 -0
- package/datapoint-explorer/view/index.d.ts.map +1 -0
- package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts +23 -0
- package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts.map +1 -0
- package/echart/c8y-ngx-components-echart.d.ts.map +1 -0
- package/echart/chart-alerts/chart-alerts.component.d.ts +8 -0
- package/echart/chart-alerts/chart-alerts.component.d.ts.map +1 -0
- package/echart/charts.component.d.ts +63 -0
- package/echart/charts.component.d.ts.map +1 -0
- package/echart/index.d.ts +5 -0
- package/echart/index.d.ts.map +1 -0
- package/echart/models/c8y-ngx-components-echart-models.d.ts.map +1 -0
- package/echart/models/chart.model.d.ts +37 -0
- package/echart/models/chart.model.d.ts.map +1 -0
- package/echart/models/datapoints-graph-widget.model.d.ts +126 -0
- package/echart/models/datapoints-graph-widget.model.d.ts.map +1 -0
- package/echart/models/index.d.ts +4 -0
- package/echart/models/index.d.ts.map +1 -0
- package/echart/models/svg-icons.model.d.ts +22 -0
- package/echart/models/svg-icons.model.d.ts.map +1 -0
- package/echart/services/chart-alarms.service.d.ts +17 -0
- package/echart/services/chart-alarms.service.d.ts.map +1 -0
- package/echart/services/chart-events.service.d.ts +17 -0
- package/echart/services/chart-events.service.d.ts.map +1 -0
- package/echart/services/chart-realtime.service.d.ts +35 -0
- package/echart/services/chart-realtime.service.d.ts.map +1 -0
- package/echart/services/chart-types.service.d.ts +15 -0
- package/echart/services/chart-types.service.d.ts.map +1 -0
- package/echart/services/custom-measurements.service.d.ts +12 -0
- package/echart/services/custom-measurements.service.d.ts.map +1 -0
- package/echart/services/echarts-options.service.d.ts +143 -0
- package/echart/services/echarts-options.service.d.ts.map +1 -0
- package/echart/services/y-axis.service.d.ts +17 -0
- package/echart/services/y-axis.service.d.ts.map +1 -0
- package/esm2022/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.mjs +37 -12
- package/esm2022/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.mjs +2 -0
- package/esm2022/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.mjs +39 -12
- package/esm2022/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.mjs +6 -4
- package/esm2022/alarm-event-selector/alarm-event-selector.component.mjs +1 -1
- package/esm2022/alarm-event-selector/alarm-event-selector.model.mjs +1 -1
- package/esm2022/alarm-event-selector/custom-alarm-event-form/custom-alarm-event-form.component.mjs +1 -1
- package/esm2022/alarms/alarms-filter.component.mjs +3 -3
- package/esm2022/core/dashboard/dashboard-child-action.component.mjs +3 -3
- package/esm2022/core/dashboard/dashboard.module.mjs +17 -14
- package/esm2022/core/dashboard/index.mjs +4 -1
- package/esm2022/core/dashboard/widgets-dashboard.component.mjs +9 -9
- package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +11 -9
- package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +8 -7
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-date-range.service.mjs +23 -0
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +70 -26
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -1
- package/esm2022/core/date-picker/date-picker.component.mjs +29 -14
- package/esm2022/core/date-picker/date-picker.module.mjs +9 -7
- package/esm2022/core/date-time-picker/close-date-picker.directive.mjs +4 -3
- package/esm2022/core/date-time-picker/date-time-picker.component.mjs +57 -29
- package/esm2022/core/date-time-picker/date-time-picker.module.mjs +11 -7
- package/esm2022/core/forms/forms.module.mjs +3 -3
- package/esm2022/core/forms/ip-range-input-list.component.mjs +5 -5
- package/esm2022/core/forms/required-input-placeholder.directive.mjs +4 -3
- package/esm2022/core/router/router.service.mjs +1 -1
- package/esm2022/core/user/user-menu.service.mjs +57 -17
- package/esm2022/datapoint-explorer/c8y-ngx-components-datapoint-explorer.mjs +5 -0
- package/esm2022/datapoint-explorer/datapoint-explorer.module.mjs +65 -0
- package/esm2022/datapoint-explorer/index.mjs +2 -0
- package/esm2022/datapoint-explorer/view/c8y-ngx-components-datapoint-explorer-view.mjs +5 -0
- package/esm2022/datapoint-explorer/view/configuration/naming-dictionary.mjs +65 -0
- package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.component.mjs +169 -0
- package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.model.mjs +2 -0
- package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.service.mjs +40 -0
- package/esm2022/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.mjs +64 -0
- package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +279 -0
- package/esm2022/datapoint-explorer/view/datapoint-explorer.service.mjs +23 -0
- package/esm2022/datapoint-explorer/view/index.mjs +2 -0
- package/esm2022/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.mjs +48 -0
- package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +3 -3
- package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.mjs +3 -3
- package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +3 -3
- package/esm2022/device-list/add-smart-group.component.mjs +3 -3
- package/esm2022/echart/c8y-ngx-components-echart.mjs +5 -0
- package/esm2022/echart/chart-alerts/chart-alerts.component.mjs +16 -0
- package/esm2022/echart/charts.component.mjs +560 -0
- package/esm2022/echart/index.mjs +5 -0
- package/esm2022/echart/models/c8y-ngx-components-echart-models.mjs +5 -0
- package/esm2022/echart/models/chart.model.mjs +2 -0
- package/esm2022/echart/models/datapoints-graph-widget.model.mjs +17 -0
- package/esm2022/echart/models/index.mjs +4 -0
- package/esm2022/echart/models/svg-icons.model.mjs +22 -0
- package/esm2022/echart/services/chart-alarms.service.mjs +58 -0
- package/esm2022/echart/services/chart-events.service.mjs +44 -0
- package/esm2022/echart/services/chart-realtime.service.mjs +193 -0
- package/esm2022/echart/services/chart-types.service.mjs +102 -0
- package/esm2022/echart/services/custom-measurements.service.mjs +52 -0
- package/esm2022/echart/services/echarts-options.service.mjs +857 -0
- package/esm2022/echart/services/y-axis.service.mjs +150 -0
- package/esm2022/icon-selector/icons/platform/index.mjs +10 -8
- package/esm2022/interval-picker/interval-picker.component.mjs +3 -3
- package/esm2022/interval-picker/interval-picker.model.mjs +1 -1
- package/esm2022/report-dashboard/index.mjs +2 -1
- package/esm2022/time-context/c8y-ngx-components-time-context.mjs +5 -0
- package/esm2022/time-context/index.mjs +2 -0
- package/esm2022/time-context/time-context.component.mjs +217 -0
- package/esm2022/time-context/time-context.service.mjs +83 -0
- package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +6 -5
- package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
- package/esm2022/widgets/definitions/datapoints-graph/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +5 -0
- package/esm2022/widgets/definitions/datapoints-graph/index.mjs +31 -0
- package/esm2022/widgets/definitions/index.mjs +3 -2
- package/esm2022/widgets/implementations/datapoints-graph/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +5 -0
- package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.mjs +239 -0
- package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.mjs +241 -0
- package/esm2022/widgets/implementations/datapoints-graph/index.mjs +3 -0
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +80 -28
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +2 -2
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +658 -0
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +72 -0
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +4 -4
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +4 -4
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-list.mjs +2 -2
- package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs +46 -0
- package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-echart.mjs +2023 -0
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-icon-selector-icons-platform.mjs +9 -7
- package/fesm2022/c8y-ngx-components-icon-selector-icons-platform.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-interval-picker.mjs +2 -2
- package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs +1 -1
- package/fesm2022/c8y-ngx-components-time-context.mjs +300 -0
- package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +5 -4
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +38 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +467 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components.mjs +429 -277
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/icon-selector/icons/index.d.ts +1 -1
- package/icon-selector/icons/platform/index.d.ts +2 -2
- package/icon-selector/icons/platform/index.d.ts.map +1 -1
- package/interval-picker/interval-picker.component.d.ts.map +1 -1
- package/interval-picker/interval-picker.model.d.ts.map +1 -1
- package/locales/de.po +206 -279
- package/locales/es.po +206 -279
- package/locales/fr.po +206 -279
- package/locales/ja_JP.po +196 -279
- package/locales/ko.po +455 -444
- package/locales/locales.pot +190 -272
- package/locales/nl.po +206 -279
- package/locales/pl.po +206 -279
- package/locales/pt_BR.po +206 -279
- package/locales/zh_CN.po +450 -443
- package/locales/zh_TW.po +452 -445
- package/package.json +1 -1
- package/report-dashboard/index.d.ts +1 -0
- package/report-dashboard/index.d.ts.map +1 -1
- package/time-context/c8y-ngx-components-time-context.d.ts.map +1 -0
- package/time-context/index.d.ts +2 -0
- package/time-context/index.d.ts.map +1 -0
- package/time-context/time-context.component.d.ts +61 -0
- package/time-context/time-context.component.d.ts.map +1 -0
- package/time-context/time-context.service.d.ts +25 -0
- package/time-context/time-context.service.d.ts.map +1 -0
- package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -1
- package/widgets/cockpit-exports/index.d.ts +6 -0
- package/widgets/cockpit-exports/index.d.ts.map +1 -1
- package/widgets/definitions/datapoints-graph/c8y-ngx-components-widgets-definitions-datapoints-graph.d.ts.map +1 -0
- package/widgets/definitions/datapoints-graph/index.d.ts +16 -0
- package/widgets/definitions/datapoints-graph/index.d.ts.map +1 -0
- package/widgets/definitions/index.d.ts +1 -0
- package/widgets/definitions/index.d.ts.map +1 -1
- package/widgets/implementations/datapoints-graph/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts.map +1 -0
- package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts +43 -0
- package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts +54 -0
- package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-graph/index.d.ts +3 -0
- package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { Component, DestroyRef, ElementRef, inject, ViewChild } from '@angular/core';
|
|
2
|
+
import { AlertService, CommonModule, ContextRouteService, CoreModule, FormsModule, gettext, Permissions, ViewContext } from '@c8y/ngx-components';
|
|
3
|
+
import { AlarmEventSelectorModule } from '@c8y/ngx-components/alarm-event-selector';
|
|
4
|
+
import { TimeContextComponent } from '@c8y/ngx-components/time-context';
|
|
5
|
+
import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
|
|
6
|
+
import { ChartAlarmsService, ChartEventsService, ChartsComponent } from '@c8y/ngx-components/echart';
|
|
7
|
+
import { FormBuilder } from '@angular/forms';
|
|
8
|
+
import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
|
|
9
|
+
import { TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
10
|
+
import { PopoverModule } from 'ngx-bootstrap/popover';
|
|
11
|
+
import { BsModalService } from 'ngx-bootstrap/modal';
|
|
12
|
+
import { A11yModule } from '@angular/cdk/a11y';
|
|
13
|
+
import { SendAsWidgetToReportModal } from './send-as-widget-to-report-modal/send-as-widget-to-report-modal.component';
|
|
14
|
+
import { ContextDashboardService } from '@c8y/ngx-components/context-dashboard';
|
|
15
|
+
import { DatapointsExportSelectorComponent } from '@c8y/ngx-components/datapoints-export-selector';
|
|
16
|
+
import { CreateNewReportModalComponent } from './create-new-report-modal/create-new-report-modal.component';
|
|
17
|
+
import { DataExplorerService } from './datapoint-explorer.service';
|
|
18
|
+
import { WorkspaceConfigComponent } from './configuration/workspace-configuration.component';
|
|
19
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
20
|
+
import { ActivatedRoute } from '@angular/router';
|
|
21
|
+
import * as i0 from "@angular/core";
|
|
22
|
+
import * as i1 from "@c8y/ngx-components";
|
|
23
|
+
import * as i2 from "@angular/common";
|
|
24
|
+
import * as i3 from "@angular/forms";
|
|
25
|
+
import * as i4 from "@c8y/ngx-components/datapoint-selector";
|
|
26
|
+
import * as i5 from "@c8y/ngx-components/alarm-event-selector";
|
|
27
|
+
import * as i6 from "ngx-bootstrap/tooltip";
|
|
28
|
+
export class DatapointExplorerComponent {
|
|
29
|
+
#destroyRef;
|
|
30
|
+
constructor() {
|
|
31
|
+
this.config = { datapoints: [], alarmsEventsConfigs: [] };
|
|
32
|
+
this.alarms = [];
|
|
33
|
+
this.events = [];
|
|
34
|
+
this.datapointsOutOfSync = new Map();
|
|
35
|
+
this.hasAtLeastOneDatapointActive = true;
|
|
36
|
+
this.hasAtLeastOneAlarmActive = true;
|
|
37
|
+
this.isMarkedAreaEnabled = false;
|
|
38
|
+
this.alarmsOrEventsHaveNoMatchingDps = false;
|
|
39
|
+
this.canAddReport = false;
|
|
40
|
+
this.datapointSelectDefaultFormOptions = {
|
|
41
|
+
showRange: true,
|
|
42
|
+
showChart: true
|
|
43
|
+
};
|
|
44
|
+
this.#destroyRef = inject(DestroyRef);
|
|
45
|
+
this.dataExplorerService = inject(DataExplorerService);
|
|
46
|
+
this.formBuilder = inject(FormBuilder);
|
|
47
|
+
this.alertService = inject(AlertService);
|
|
48
|
+
this.bsModalService = inject(BsModalService);
|
|
49
|
+
this.permissions = inject(Permissions);
|
|
50
|
+
this.contextDashboardService = inject(ContextDashboardService);
|
|
51
|
+
this.activatedRoute = inject(ActivatedRoute);
|
|
52
|
+
this.contextRouteService = inject(ContextRouteService);
|
|
53
|
+
this.formGroup = this.initForm();
|
|
54
|
+
}
|
|
55
|
+
ngOnInit() {
|
|
56
|
+
this.contextAsset = this.initializeContextSourceId();
|
|
57
|
+
this.checkForMatchingDatapoints();
|
|
58
|
+
this.canAddReport = this.permissions.hasAnyRole([
|
|
59
|
+
Permissions.ROLE_INVENTORY_CREATE,
|
|
60
|
+
Permissions.ROLE_INVENTORY_ADMIN,
|
|
61
|
+
Permissions.ROLE_MANAGED_OBJECT_ADMIN,
|
|
62
|
+
Permissions.ROLE_MANAGED_OBJECT_CREATE
|
|
63
|
+
]);
|
|
64
|
+
this.formGroup.valueChanges
|
|
65
|
+
.pipe(takeUntilDestroyed(this.#destroyRef))
|
|
66
|
+
.subscribe(configChange => {
|
|
67
|
+
const { alarms, events, ...configValues } = configChange;
|
|
68
|
+
this.config = {
|
|
69
|
+
...configValues,
|
|
70
|
+
alarmsEventsConfigs: [...(alarms || []), ...(events || [])]
|
|
71
|
+
};
|
|
72
|
+
this.updateExportConfig();
|
|
73
|
+
this.checkForMatchingDatapoints();
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
onTimeContextChange(timeProps) {
|
|
77
|
+
const realtime = this.formGroup.controls.realtime.value;
|
|
78
|
+
if (timeProps.realtime !== realtime) {
|
|
79
|
+
this.formGroup.patchValue({ realtime: timeProps.realtime });
|
|
80
|
+
}
|
|
81
|
+
if (timeProps.realtime) {
|
|
82
|
+
if (timeProps.currentDateContextInterval !== this.formGroup.value.interval) {
|
|
83
|
+
this.formGroup.patchValue({ interval: timeProps.currentDateContextInterval });
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.formGroup.patchValue({
|
|
88
|
+
dateFrom: timeProps.currentDateContextFromDate,
|
|
89
|
+
dateTo: timeProps.currentDateContextToDate,
|
|
90
|
+
interval: timeProps.currentDateContextInterval,
|
|
91
|
+
aggregation: timeProps.aggregation || null
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
onConfigurationChange(config) {
|
|
95
|
+
if (config.dateFrom && config.dateTo) {
|
|
96
|
+
this.timeProps = {
|
|
97
|
+
dateFrom: new Date(config?.dateFrom),
|
|
98
|
+
dateTo: new Date(config?.dateTo),
|
|
99
|
+
interval: config?.interval,
|
|
100
|
+
realtime: config?.realtime,
|
|
101
|
+
aggregation: config?.realtime ? null : config?.aggregation
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
this.alarms = config.alarmsEventsConfigs.filter(ae => ae.timelineType === 'ALARM');
|
|
105
|
+
this.events = config.alarmsEventsConfigs.filter(ae => ae.timelineType === 'EVENT');
|
|
106
|
+
this.formGroup.patchValue({ alarms: this.alarms, events: this.events, ...config });
|
|
107
|
+
}
|
|
108
|
+
onSliderZoom(timeProps) {
|
|
109
|
+
this.formGroup.patchValue(timeProps);
|
|
110
|
+
this.timeProps = { ...timeProps, realtime: false };
|
|
111
|
+
}
|
|
112
|
+
updateTimeRangeOnRealtime(timeRange) {
|
|
113
|
+
this.formGroup.patchValue(timeRange, { emitEvent: false });
|
|
114
|
+
}
|
|
115
|
+
createNewReportWithWidget() {
|
|
116
|
+
const modal = this.bsModalService.show(CreateNewReportModalComponent, {
|
|
117
|
+
ignoreBackdropClick: true,
|
|
118
|
+
keyboard: false,
|
|
119
|
+
class: 'modal-sm'
|
|
120
|
+
});
|
|
121
|
+
const content = modal.content;
|
|
122
|
+
content.result
|
|
123
|
+
.then(async (report) => {
|
|
124
|
+
const reportDashboard = await this.dataExplorerService.fetchReportDashboard(report.id);
|
|
125
|
+
const widget = this.createWidgetConfig();
|
|
126
|
+
reportDashboard.c8y_Dashboard.children = { [widget.id]: widget };
|
|
127
|
+
await this.contextDashboardService.update(reportDashboard);
|
|
128
|
+
this.alertService.success(gettext('Report and widget created.'));
|
|
129
|
+
})
|
|
130
|
+
.catch(e => {
|
|
131
|
+
if (e) {
|
|
132
|
+
this.alertService.danger(gettext('Failed to create report and widget.'));
|
|
133
|
+
this.alertService.addServerFailure(e);
|
|
134
|
+
}
|
|
135
|
+
// else: modal was closed
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
sendAsWidgetToReport() {
|
|
139
|
+
const modal = this.bsModalService.show(SendAsWidgetToReportModal, {
|
|
140
|
+
ignoreBackdropClick: true,
|
|
141
|
+
keyboard: false,
|
|
142
|
+
class: 'modal-sm'
|
|
143
|
+
});
|
|
144
|
+
const content = modal.content;
|
|
145
|
+
content.result
|
|
146
|
+
.then(async (reports) => {
|
|
147
|
+
const selectedReports = Object.entries(reports).filter(([, value]) => value);
|
|
148
|
+
const reportPromises = selectedReports.map(async ([reportId]) => {
|
|
149
|
+
const reportDashboard = await this.dataExplorerService.fetchReportDashboard(reportId);
|
|
150
|
+
const widget = this.createWidgetConfig();
|
|
151
|
+
const children = reportDashboard.c8y_Dashboard.children || {};
|
|
152
|
+
reportDashboard.c8y_Dashboard.children = { ...children, [widget.id]: widget };
|
|
153
|
+
await this.contextDashboardService.update(reportDashboard);
|
|
154
|
+
});
|
|
155
|
+
await Promise.all(reportPromises);
|
|
156
|
+
this.alertService.success(gettext('Widget created.'));
|
|
157
|
+
})
|
|
158
|
+
.catch(e => {
|
|
159
|
+
if (e) {
|
|
160
|
+
this.alertService.danger(gettext('Failed to create widget.'));
|
|
161
|
+
this.alertService.addServerFailure(e);
|
|
162
|
+
}
|
|
163
|
+
// else: modal was closed
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
updateAlarmsAndEvents(alarmsEventsConfigs) {
|
|
167
|
+
this.alarms = alarmsEventsConfigs.filter(this.isAlarm);
|
|
168
|
+
this.events = alarmsEventsConfigs.filter(this.isEvent);
|
|
169
|
+
this.hasAtLeastOneAlarmActive = this.hasActiveAlarms(this.alarms);
|
|
170
|
+
}
|
|
171
|
+
handleDatapointOutOfSync(dpOutOfSync) {
|
|
172
|
+
const key = (dp) => dp.__target?.id + dp.fragment + dp.series;
|
|
173
|
+
const dpMatch = this.config.datapoints?.find(dp => key(dp) === key(dpOutOfSync));
|
|
174
|
+
if (!dpMatch) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
this.datapointsOutOfSync.set(dpMatch, true);
|
|
178
|
+
}
|
|
179
|
+
isAlarm(item) {
|
|
180
|
+
return item.timelineType === 'ALARM';
|
|
181
|
+
}
|
|
182
|
+
isEvent(item) {
|
|
183
|
+
return item.timelineType === 'EVENT';
|
|
184
|
+
}
|
|
185
|
+
hasActiveAlarms(alarms) {
|
|
186
|
+
return alarms.length > 0 && alarms.some(alarm => alarm.__active);
|
|
187
|
+
}
|
|
188
|
+
checkForMatchingDatapoints() {
|
|
189
|
+
const allMatch = this.config?.alarmsEventsConfigs?.every(ae => this.formGroup.value.datapoints?.some(dp => dp.__target?.id === ae.__target?.id));
|
|
190
|
+
queueMicrotask(() => {
|
|
191
|
+
this.alarmsOrEventsHaveNoMatchingDps = !allMatch;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
updateExportConfig() {
|
|
195
|
+
const datapointDetails = this.config.datapoints
|
|
196
|
+
.filter(({ __active }) => __active)
|
|
197
|
+
.map(({ __target, fragment, series }) => ({
|
|
198
|
+
deviceName: __target.name,
|
|
199
|
+
source: __target.id,
|
|
200
|
+
valueFragmentSeries: series,
|
|
201
|
+
valueFragmentType: fragment
|
|
202
|
+
}));
|
|
203
|
+
if (datapointDetails.length === 0) {
|
|
204
|
+
this.exportConfig = null;
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
this.exportConfig = {
|
|
208
|
+
aggregation: this.config.aggregation,
|
|
209
|
+
dateFrom: new Date(this.config.dateFrom).toISOString(),
|
|
210
|
+
dateTo: new Date(this.config.dateTo).toISOString(),
|
|
211
|
+
datapointDetails: datapointDetails
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
initializeContextSourceId() {
|
|
216
|
+
const routeContext = this.contextRouteService.getContextData(this.activatedRoute);
|
|
217
|
+
if (!routeContext) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const { context, contextData } = routeContext;
|
|
221
|
+
if ([ViewContext.Device, ViewContext.Group].includes(context)) {
|
|
222
|
+
return contextData;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
createWidgetConfig() {
|
|
226
|
+
return {
|
|
227
|
+
name: 'Data points graph 2',
|
|
228
|
+
title: gettext('Data points graph 2'),
|
|
229
|
+
id: String(Math.random()).substr(2),
|
|
230
|
+
_width: 24,
|
|
231
|
+
_height: 5,
|
|
232
|
+
config: this.config
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
initForm() {
|
|
236
|
+
return this.formBuilder.group({
|
|
237
|
+
datapoints: [this.config.datapoints || []],
|
|
238
|
+
alarms: [this.alarms || []],
|
|
239
|
+
events: [this.events || []],
|
|
240
|
+
dateFrom: [this.config.dateFrom || null],
|
|
241
|
+
dateTo: [this.config.dateFrom || null],
|
|
242
|
+
interval: [this.config.interval || 'hours'],
|
|
243
|
+
aggregation: [this.config.aggregation || null],
|
|
244
|
+
realtime: [this.config.realtime || false],
|
|
245
|
+
displayMarkedLine: [true, []],
|
|
246
|
+
displayMarkedPoint: [true, []],
|
|
247
|
+
mergeMatchingDatapoints: [true, []],
|
|
248
|
+
showLabelAndUnit: [true, []],
|
|
249
|
+
showSlider: [true, []],
|
|
250
|
+
displayDateSelection: [false, []],
|
|
251
|
+
yAxisSplitLines: [false],
|
|
252
|
+
xAxisSplitLines: [false]
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointExplorerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
256
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointExplorerComponent, isStandalone: true, selector: "c8y-datapoint-explorer", providers: [ChartEventsService, ChartAlarmsService], viewQueries: [{ propertyName: "chart", first: true, predicate: ["chart"], descendants: true }], ngImport: i0, template: "<c8y-title>{{ 'Data explorer' | translate }}</c8y-title>\n\n<c8y-time-context\n (contextChange)=\"onTimeContextChange($event)\"\n [changedDateContext]=\"timeProps\"\n></c8y-time-context>\n\n<c8y-action-bar-item [placement]=\"'left'\">\n <c8y-workspace-config\n [updatedConfig]=\"config\"\n (onConfigurationChange)=\"onConfigurationChange($event)\"\n ></c8y-workspace-config>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item placement=\"right\">\n <c8y-datapoints-export-selector [exportConfig]=\"exportConfig\"></c8y-datapoints-export-selector>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n>\n <button\n title=\"{{ 'Send as widget to report' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"sendAsWidgetToReport()\"\n [disabled]=\"config?.datapoints?.length === 0 || !canAddReport\"\n >\n <i c8yIcon=\"c8y-reports\"></i>\n <span>{{ 'Send as widget to report' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n>\n <button\n title=\"{{ 'Create a new report with widget' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"createNewReportWithWidget()\"\n [disabled]=\"config?.datapoints?.length === 0 || !canAddReport\"\n >\n <i c8yIcon=\"c8y-reports\"></i>\n <span>{{ 'Create a new report with widget' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"content-fullpage d-grid grid_col--auto-360 gap-24\">\n <div class=\"d-col gap-16\">\n <c8y-charts\n class=\"flex-grow data-point-explorer\"\n #chart\n [config]=\"config\"\n [alerts]=\"alerts\"\n (updateAlarmsAndEvents)=\"updateAlarmsAndEvents($event)\"\n (configChangeOnZoomOut)=\"onSliderZoom($event)\"\n (datapointOutOfSync)=\"handleDatapointOutOfSync($event)\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (isMarkedAreaEnabled)=\"isMarkedAreaEnabled = $event\"\n ></c8y-charts>\n <form\n class=\"m-l-48 m-r-48\"\n [formGroup]=\"formGroup\"\n >\n <div class=\"d-grid-md grid__col--4-4-4 gap-16\">\n <fieldset class=\"c8y-fieldset form-group-sm m-t-md-0 p-b-8\">\n <legend>{{ 'Axis' | translate }}</legend>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n </label>\n </fieldset>\n <fieldset class=\"c8y-fieldset form-group-sm m-t-md-0 p-b-8\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line when alarm occurs' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when alarm or event occurs' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span>\n {{\n 'Show icon when triggered`When alarms and events occur the icon will be shown`'\n | translate\n }}\n </span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n </fieldset>\n <fieldset class=\"c8y-fieldset form-group-sm m-t-md-0 p-b-8\">\n <legend>{{ 'Chart' | translate }}</legend>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </fieldset>\n </div>\n </form>\n </div>\n <div class=\"card inner-scroll bg-level-1\">\n <form\n class=\"bg-inherit\"\n [formGroup]=\"formGroup\"\n >\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"0\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"{ contextAsset: contextAsset }\"\n formControlName=\"datapoints\"\n [allowDragAndDrop]=\"true\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i4.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "ngmodule", type: AlarmEventSelectorModule }, { kind: "component", type: i5.AlarmEventSelectionListComponent, selector: "c8y-alarm-event-selection-list", inputs: ["timelineType", "canRemove", "canEdit", "canDragAndDrop", "title", "addButtonLabel", "hideSource", "inline", "activeToggleAsSwitch", "omitProperties", "datapoints", "config"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i6.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: TimeContextComponent, selector: "c8y-time-context", inputs: ["changedDateContext", "controlsAvailable", "context"], outputs: ["contextChange"] }, { kind: "component", type: ChartsComponent, selector: "c8y-charts", inputs: ["config", "alerts"], outputs: ["configChangeOnZoomOut", "timeRangeChangeOnRealtime", "datapointOutOfSync", "updateAlarmsAndEvents", "isMarkedAreaEnabled"] }, { kind: "ngmodule", type: BsDropdownModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: A11yModule }, { kind: "component", type: DatapointsExportSelectorComponent, selector: "c8y-datapoints-export-selector", inputs: ["exportConfig"], outputs: ["isOpen"] }, { kind: "component", type: WorkspaceConfigComponent, selector: "c8y-workspace-config", inputs: ["updatedConfig"], outputs: ["onConfigurationChange"] }] }); }
|
|
257
|
+
}
|
|
258
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointExplorerComponent, decorators: [{
|
|
259
|
+
type: Component,
|
|
260
|
+
args: [{ selector: 'c8y-datapoint-explorer', standalone: true, imports: [
|
|
261
|
+
CoreModule,
|
|
262
|
+
CommonModule,
|
|
263
|
+
DatapointSelectorModule,
|
|
264
|
+
AlarmEventSelectorModule,
|
|
265
|
+
TooltipModule,
|
|
266
|
+
PopoverModule,
|
|
267
|
+
TimeContextComponent,
|
|
268
|
+
ChartsComponent,
|
|
269
|
+
BsDropdownModule,
|
|
270
|
+
FormsModule,
|
|
271
|
+
A11yModule,
|
|
272
|
+
DatapointsExportSelectorComponent,
|
|
273
|
+
WorkspaceConfigComponent
|
|
274
|
+
], providers: [ChartEventsService, ChartAlarmsService], template: "<c8y-title>{{ 'Data explorer' | translate }}</c8y-title>\n\n<c8y-time-context\n (contextChange)=\"onTimeContextChange($event)\"\n [changedDateContext]=\"timeProps\"\n></c8y-time-context>\n\n<c8y-action-bar-item [placement]=\"'left'\">\n <c8y-workspace-config\n [updatedConfig]=\"config\"\n (onConfigurationChange)=\"onConfigurationChange($event)\"\n ></c8y-workspace-config>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item placement=\"right\">\n <c8y-datapoints-export-selector [exportConfig]=\"exportConfig\"></c8y-datapoints-export-selector>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n>\n <button\n title=\"{{ 'Send as widget to report' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"sendAsWidgetToReport()\"\n [disabled]=\"config?.datapoints?.length === 0 || !canAddReport\"\n >\n <i c8yIcon=\"c8y-reports\"></i>\n <span>{{ 'Send as widget to report' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n>\n <button\n title=\"{{ 'Create a new report with widget' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"createNewReportWithWidget()\"\n [disabled]=\"config?.datapoints?.length === 0 || !canAddReport\"\n >\n <i c8yIcon=\"c8y-reports\"></i>\n <span>{{ 'Create a new report with widget' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"content-fullpage d-grid grid_col--auto-360 gap-24\">\n <div class=\"d-col gap-16\">\n <c8y-charts\n class=\"flex-grow data-point-explorer\"\n #chart\n [config]=\"config\"\n [alerts]=\"alerts\"\n (updateAlarmsAndEvents)=\"updateAlarmsAndEvents($event)\"\n (configChangeOnZoomOut)=\"onSliderZoom($event)\"\n (datapointOutOfSync)=\"handleDatapointOutOfSync($event)\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (isMarkedAreaEnabled)=\"isMarkedAreaEnabled = $event\"\n ></c8y-charts>\n <form\n class=\"m-l-48 m-r-48\"\n [formGroup]=\"formGroup\"\n >\n <div class=\"d-grid-md grid__col--4-4-4 gap-16\">\n <fieldset class=\"c8y-fieldset form-group-sm m-t-md-0 p-b-8\">\n <legend>{{ 'Axis' | translate }}</legend>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n </label>\n </fieldset>\n <fieldset class=\"c8y-fieldset form-group-sm m-t-md-0 p-b-8\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line when alarm occurs' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when alarm or event occurs' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span>\n {{\n 'Show icon when triggered`When alarms and events occur the icon will be shown`'\n | translate\n }}\n </span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n </fieldset>\n <fieldset class=\"c8y-fieldset form-group-sm m-t-md-0 p-b-8\">\n <legend>{{ 'Chart' | translate }}</legend>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </fieldset>\n </div>\n </form>\n </div>\n <div class=\"card inner-scroll bg-level-1\">\n <form\n class=\"bg-inherit\"\n [formGroup]=\"formGroup\"\n >\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"0\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"{ contextAsset: contextAsset }\"\n formControlName=\"datapoints\"\n [allowDragAndDrop]=\"true\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n</div>\n" }]
|
|
275
|
+
}], ctorParameters: () => [], propDecorators: { chart: [{
|
|
276
|
+
type: ViewChild,
|
|
277
|
+
args: ['chart']
|
|
278
|
+
}] } });
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50LWV4cGxvcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RhdGFwb2ludC1leHBsb3Jlci92aWV3L2RhdGFwb2ludC1leHBsb3Jlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9kYXRhcG9pbnQtZXhwbG9yZXIvdmlldy9kYXRhcG9pbnQtZXhwbG9yZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckYsT0FBTyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLFVBQVUsRUFFVixXQUFXLEVBQ1gsT0FBTyxFQUNQLFdBQVcsRUFDWCxXQUFXLEVBQ1osTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN4RSxPQUFPLEVBRUwsdUJBQXVCLEVBRXhCLE1BQU0sd0NBQXdDLENBQUM7QUFTaEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNoQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJB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QUUsQ0FBQyxLQUFLLENBQUM7U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0F2UVUsMEJBQTBCO2tHQUExQiwwQkFBMEIscUVBRjFCLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsMEhDdkVyRCxxNk9BZ09BLDJDRHZLSSxVQUFVLDJsREFDVixZQUFZLDhCQUNaLHVCQUF1QixxVEFDdkIsd0JBQXdCLHFVQUN4QixhQUFhLGlrQkFDYixhQUFhLCtCQUNiLG9CQUFvQix5SkFDcEIsZUFBZSwyTkFDZixnQkFBZ0IsOEJBQ2hCLFdBQVcsOEJBQ1gsVUFBVSwrQkFDVixpQ0FBaUMsMEhBQ2pDLHdCQUF3Qjs7MkZBSWYsMEJBQTBCO2tCQXJCdEMsU0FBUzsrQkFDRSx3QkFBd0IsY0FFdEIsSUFBSSxXQUNQO3dCQUNQLFVBQVU7d0JBQ1YsWUFBWTt3QkFDWix1QkFBdUI7d0JBQ3ZCLHdCQUF3Qjt3QkFDeEIsYUFBYTt3QkFDYixhQUFhO3dCQUNiLG9CQUFvQjt3QkFDcEIsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLFdBQVc7d0JBQ1gsVUFBVTt3QkFDVixpQ0FBaUM7d0JBQ2pDLHdCQUF3QjtxQkFDekIsYUFDVSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDO3dEQUcvQixLQUFLO3NCQUF4QixTQUFTO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIERlc3Ryb3lSZWYsIEVsZW1lbnRSZWYsIGluamVjdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIENvbW1vbk1vZHVsZSxcbiAgQ29udGV4dFJvdXRlU2VydmljZSxcbiAgQ29yZU1vZHVsZSxcbiAgRHluYW1pY0NvbXBvbmVudEFsZXJ0QWdncmVnYXRvcixcbiAgRm9ybXNNb2R1bGUsXG4gIGdldHRleHQsXG4gIFBlcm1pc3Npb25zLFxuICBWaWV3Q29udGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFsYXJtRXZlbnRTZWxlY3Rvck1vZHVsZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvYWxhcm0tZXZlbnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgVGltZUNvbnRleHRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3RpbWUtY29udGV4dCc7XG5pbXBvcnQge1xuICBEYXRhcG9pbnRBdHRyaWJ1dGVzRm9ybUNvbmZpZyxcbiAgRGF0YXBvaW50U2VsZWN0b3JNb2R1bGUsXG4gIEtQSURldGFpbHNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnQtc2VsZWN0b3InO1xuaW1wb3J0IHtcbiAgQWxhcm1EZXRhaWxzRXh0ZW5kZWQsXG4gIEFsYXJtT3JFdmVudEV4dGVuZGVkLFxuICBEYXRhcG9pbnRzR3JhcGhLUElEZXRhaWxzLFxuICBEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWcsXG4gIEV2ZW50RGV0YWlsc0V4dGVuZGVkLFxuICBUaW1lQ29udGV4dFByb3BzXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZWNoYXJ0L21vZGVscyc7XG5pbXBvcnQge1xuICBDaGFydEFsYXJtc1NlcnZpY2UsXG4gIENoYXJ0RXZlbnRzU2VydmljZSxcbiAgQ2hhcnRzQ29tcG9uZW50XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZWNoYXJ0JztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCc0Ryb3Bkb3duTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9kcm9wZG93bic7XG5pbXBvcnQgeyBhZ2dyZWdhdGlvblR5cGUsIElJZGVudGlmaWVkIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvdG9vbHRpcCc7XG5pbXBvcnQgeyBQb3BvdmVyTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9wb3BvdmVyJztcbmltcG9ydCB7IEludGVydmFsIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9pbnRlcnZhbC1waWNrZXInO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IEExMXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBTZW5kQXNXaWRnZXRUb1JlcG9ydE1vZGFsIH0gZnJvbSAnLi9zZW5kLWFzLXdpZGdldC10by1yZXBvcnQtbW9kYWwvc2VuZC1hcy13aWRnZXQtdG8tcmVwb3J0LW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb250ZXh0RGFzaGJvYXJkU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHtcbiAgRGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yQ29tcG9uZW50LFxuICBFeHBvcnRDb25maWdcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvcic7XG5pbXBvcnQgeyBDcmVhdGVOZXdSZXBvcnRNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vY3JlYXRlLW5ldy1yZXBvcnQtbW9kYWwvY3JlYXRlLW5ldy1yZXBvcnQtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGFFeHBsb3JlclNlcnZpY2UgfSBmcm9tICcuL2RhdGFwb2ludC1leHBsb3Jlci5zZXJ2aWNlJztcbmltcG9ydCB7IFdvcmtzcGFjZUNvbmZpZ0NvbXBvbmVudCB9IGZyb20gJy4vY29uZmlndXJhdGlvbi93b3Jrc3BhY2UtY29uZmlndXJhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50LWV4cGxvcmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFwb2ludC1leHBsb3Jlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb3JlTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBEYXRhcG9pbnRTZWxlY3Rvck1vZHVsZSxcbiAgICBBbGFybUV2ZW50U2VsZWN0b3JNb2R1bGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgICBQb3BvdmVyTW9kdWxlLFxuICAgIFRpbWVDb250ZXh0Q29tcG9uZW50LFxuICAgIENoYXJ0c0NvbXBvbmVudCxcbiAgICBCc0Ryb3Bkb3duTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEExMXlNb2R1bGUsXG4gICAgRGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yQ29tcG9uZW50LFxuICAgIFdvcmtzcGFjZUNvbmZpZ0NvbXBvbmVudFxuICBdLFxuICBwcm92aWRlcnM6IFtDaGFydEV2ZW50c1NlcnZpY2UsIENoYXJ0QWxhcm1zU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YXBvaW50RXhwbG9yZXJDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCdjaGFydCcpIGNoYXJ0OiBFbGVtZW50UmVmO1xuICBjb25maWc6IERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZyA9IHsgZGF0YXBvaW50czogW10sIGFsYXJtc0V2ZW50c0NvbmZpZ3M6IFtdIH07XG4gIGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnO1xuICBhbGVydHM6IER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IgfCB1bmRlZmluZWQ7XG4gIGFsYXJtczogQWxhcm1EZXRhaWxzRXh0ZW5kZWRbXSA9IFtdO1xuICBldmVudHM6IEV2ZW50RGV0YWlsc0V4dGVuZGVkW10gPSBbXTtcbiAgZGF0YXBvaW50c091dE9mU3luYyA9IG5ldyBNYXA8RGF0YXBvaW50c0dyYXBoS1BJRGV0YWlscywgYm9vbGVhbj4oKTtcbiAgY29udGV4dEFzc2V0OiBJSWRlbnRpZmllZDtcbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gIGhhc0F0TGVhc3RPbmVEYXRhcG9pbnRBY3RpdmUgPSB0cnVlO1xuICBoYXNBdExlYXN0T25lQWxhcm1BY3RpdmUgPSB0cnVlO1xuICBpc01hcmtlZEFyZWFFbmFibGVkID0gZmFsc2U7XG4gIGFsYXJtc09yRXZlbnRzSGF2ZU5vTWF0Y2hpbmdEcHMgPSBmYWxzZTtcbiAgY2FuQWRkUmVwb3J0ID0gZmFsc2U7XG4gIHRpbWVQcm9wczoge1xuICAgIGRhdGVGcm9tOiBEYXRlO1xuICAgIGRhdGVUbzogRGF0ZTtcbiAgICBpbnRlcnZhbD86IEludGVydmFsWydpZCddO1xuICAgIHJlYWx0aW1lPzogYm9vbGVhbjtcbiAgICBhZ2dyZWdhdGlvbj86IGFnZ3JlZ2F0aW9uVHlwZSB8IG51bGw7XG4gIH07XG4gIGRhdGFwb2ludFNlbGVjdERlZmF1bHRGb3JtT3B0aW9uczogUGFydGlhbDxEYXRhcG9pbnRBdHRyaWJ1dGVzRm9ybUNvbmZpZz4gPSB7XG4gICAgc2hvd1JhbmdlOiB0cnVlLFxuICAgIHNob3dDaGFydDogdHJ1ZVxuICB9O1xuXG4gICNkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YUV4cGxvcmVyU2VydmljZSA9IGluamVjdChEYXRhRXhwbG9yZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtQnVpbGRlciA9IGluamVjdChGb3JtQnVpbGRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxlcnRTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnNNb2RhbFNlcnZpY2UgPSBpbmplY3QoQnNNb2RhbFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25zID0gaW5qZWN0KFBlcm1pc3Npb25zKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0RGFzaGJvYXJkU2VydmljZSA9IGluamVjdChDb250ZXh0RGFzaGJvYXJkU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRSb3V0ZVNlcnZpY2UgPSBpbmplY3QoQ29udGV4dFJvdXRlU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmluaXRGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHRBc3NldCA9IHRoaXMuaW5pdGlhbGl6ZUNvbnRleHRTb3VyY2VJZCgpO1xuICAgIHRoaXMuY2hlY2tGb3JNYXRjaGluZ0RhdGFwb2ludHMoKTtcbiAgICB0aGlzLmNhbkFkZFJlcG9ydCA9IHRoaXMucGVybWlzc2lvbnMuaGFzQW55Um9sZShbXG4gICAgICBQZXJtaXNzaW9ucy5ST0xFX0lOVkVOVE9SWV9DUkVBVEUsXG4gICAgICBQZXJtaXNzaW9ucy5ST0xFX0lOVkVOVE9SWV9BRE1JTixcbiAgICAgIFBlcm1pc3Npb25zLlJPTEVfTUFOQUdFRF9PQkpFQ1RfQURNSU4sXG4gICAgICBQZXJtaXNzaW9ucy5ST0xFX01BTkFHRURfT0JKRUNUX0NSRUFURVxuICAgIF0pO1xuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuI2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZShjb25maWdDaGFuZ2UgPT4ge1xuICAgICAgICBjb25zdCB7IGFsYXJtcywgZXZlbnRzLCAuLi5jb25maWdWYWx1ZXMgfSA9IGNvbmZpZ0NoYW5nZTtcbiAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgLi4uY29uZmlnVmFsdWVzLFxuICAgICAgICAgIGFsYXJtc0V2ZW50c0NvbmZpZ3M6IFsuLi4oYWxhcm1zIHx8IFtdKSwgLi4uKGV2ZW50cyB8fCBbXSldXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudXBkYXRlRXhwb3J0Q29uZmlnKCk7XG4gICAgICAgIHRoaXMuY2hlY2tGb3JNYXRjaGluZ0RhdGFwb2ludHMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgb25UaW1lQ29udGV4dENoYW5nZSh0aW1lUHJvcHM6IFRpbWVDb250ZXh0UHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCByZWFsdGltZSA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnJlYWx0aW1lLnZhbHVlO1xuICAgIGlmICh0aW1lUHJvcHMucmVhbHRpbWUgIT09IHJlYWx0aW1lKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgcmVhbHRpbWU6IHRpbWVQcm9wcy5yZWFsdGltZSB9KTtcbiAgICB9XG4gICAgaWYgKHRpbWVQcm9wcy5yZWFsdGltZSkge1xuICAgICAgaWYgKHRpbWVQcm9wcy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCAhPT0gdGhpcy5mb3JtR3JvdXAudmFsdWUuaW50ZXJ2YWwpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IGludGVydmFsOiB0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAgZGF0ZUZyb206IHRpbWVQcm9wcy5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZSxcbiAgICAgIGRhdGVUbzogdGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSxcbiAgICAgIGludGVydmFsOiB0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwsXG4gICAgICBhZ2dyZWdhdGlvbjogdGltZVByb3BzLmFnZ3JlZ2F0aW9uIHx8IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ29uZmlndXJhdGlvbkNoYW5nZShjb25maWc6IERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZyk6IHZvaWQge1xuICAgIGlmIChjb25maWcuZGF0ZUZyb20gJiYgY29uZmlnLmRhdGVUbykge1xuICAgICAgdGhpcy50aW1lUHJvcHMgPSB7XG4gICAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZShjb25maWc/LmRhdGVGcm9tKSxcbiAgICAgICAgZGF0ZVRvOiBuZXcgRGF0ZShjb25maWc/LmRhdGVUbyksXG4gICAgICAgIGludGVydmFsOiBjb25maWc/LmludGVydmFsLFxuICAgICAgICByZWFsdGltZTogY29uZmlnPy5yZWFsdGltZSxcbiAgICAgICAgYWdncmVnYXRpb246IGNvbmZpZz8ucmVhbHRpbWUgPyBudWxsIDogY29uZmlnPy5hZ2dyZWdhdGlvblxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5hbGFybXMgPSBjb25maWcuYWxhcm1zRXZlbnRzQ29uZmlncy5maWx0ZXIoYWUgPT4gYWUudGltZWxpbmVUeXBlID09PSAnQUxBUk0nKTtcbiAgICB0aGlzLmV2ZW50cyA9IGNvbmZpZy5hbGFybXNFdmVudHNDb25maWdzLmZpbHRlcihhZSA9PiBhZS50aW1lbGluZVR5cGUgPT09ICdFVkVOVCcpO1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyBhbGFybXM6IHRoaXMuYWxhcm1zLCBldmVudHM6IHRoaXMuZXZlbnRzLCAuLi5jb25maWcgfSk7XG4gIH1cblxuICBvblNsaWRlclpvb20odGltZVByb3BzOiB7IGRhdGVGcm9tOiBEYXRlOyBkYXRlVG86IERhdGU7IGludGVydmFsPzogSW50ZXJ2YWxbJ2lkJ10gfSkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUodGltZVByb3BzKTtcbiAgICB0aGlzLnRpbWVQcm9wcyA9IHsgLi4udGltZVByb3BzLCByZWFsdGltZTogZmFsc2UgfTtcbiAgfVxuXG4gIHVwZGF0ZVRpbWVSYW5nZU9uUmVhbHRpbWUoXG4gICAgdGltZVJhbmdlOiBQaWNrPERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZywgJ2RhdGVGcm9tJyB8ICdkYXRlVG8nPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRpbWVSYW5nZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICB9XG5cbiAgY3JlYXRlTmV3UmVwb3J0V2l0aFdpZGdldCgpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RhbCA9IHRoaXMuYnNNb2RhbFNlcnZpY2Uuc2hvdyhDcmVhdGVOZXdSZXBvcnRNb2RhbENvbXBvbmVudCwge1xuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSxcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcbiAgICAgIGNsYXNzOiAnbW9kYWwtc20nXG4gICAgfSk7XG4gICAgY29uc3QgY29udGVudCA9IG1vZGFsLmNvbnRlbnQgYXMgQ3JlYXRlTmV3UmVwb3J0TW9kYWxDb21wb25lbnQ7XG4gICAgY29udGVudC5yZXN1bHRcbiAgICAgIC50aGVuKGFzeW5jIHJlcG9ydCA9PiB7XG4gICAgICAgIGNvbnN0IHJlcG9ydERhc2hib2FyZCA9IGF3YWl0IHRoaXMuZGF0YUV4cGxvcmVyU2VydmljZS5mZXRjaFJlcG9ydERhc2hib2FyZChyZXBvcnQuaWQpO1xuICAgICAgICBjb25zdCB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldENvbmZpZygpO1xuICAgICAgICByZXBvcnREYXNoYm9hcmQuYzh5X0Rhc2hib2FyZC5jaGlsZHJlbiA9IHsgW3dpZGdldC5pZF06IHdpZGdldCB9O1xuICAgICAgICBhd2FpdCB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLnVwZGF0ZShyZXBvcnREYXNoYm9hcmQpO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ1JlcG9ydCBhbmQgd2lkZ2V0IGNyZWF0ZWQuJykpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5kYW5nZXIoZ2V0dGV4dCgnRmFpbGVkIHRvIGNyZWF0ZSByZXBvcnQgYW5kIHdpZGdldC4nKSk7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlOiBtb2RhbCB3YXMgY2xvc2VkXG4gICAgICB9KTtcbiAgfVxuXG4gIHNlbmRBc1dpZGdldFRvUmVwb3J0KCk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5ic01vZGFsU2VydmljZS5zaG93KFNlbmRBc1dpZGdldFRvUmVwb3J0TW9kYWwsIHtcbiAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWUsXG4gICAgICBrZXlib2FyZDogZmFsc2UsXG4gICAgICBjbGFzczogJ21vZGFsLXNtJ1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBtb2RhbC5jb250ZW50IGFzIFNlbmRBc1dpZGdldFRvUmVwb3J0TW9kYWw7XG4gICAgY29udGVudC5yZXN1bHRcbiAgICAgIC50aGVuKGFzeW5jIHJlcG9ydHMgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFJlcG9ydHMgPSBPYmplY3QuZW50cmllcyhyZXBvcnRzKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUpO1xuICAgICAgICBjb25zdCByZXBvcnRQcm9taXNlcyA9IHNlbGVjdGVkUmVwb3J0cy5tYXAoYXN5bmMgKFtyZXBvcnRJZF0pID0+IHtcbiAgICAgICAgICBjb25zdCByZXBvcnREYXNoYm9hcmQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3JlclNlcnZpY2UuZmV0Y2hSZXBvcnREYXNoYm9hcmQocmVwb3J0SWQpO1xuICAgICAgICAgIGNvbnN0IHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0Q29uZmlnKCk7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSByZXBvcnREYXNoYm9hcmQuYzh5X0Rhc2hib2FyZC5jaGlsZHJlbiB8fCB7fTtcbiAgICAgICAgICByZXBvcnREYXNoYm9hcmQuYzh5X0Rhc2hib2FyZC5jaGlsZHJlbiA9IHsgLi4uY2hpbGRyZW4sIFt3aWRnZXQuaWRdOiB3aWRnZXQgfTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLnVwZGF0ZShyZXBvcnREYXNoYm9hcmQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXBvcnRQcm9taXNlcyk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnV2lkZ2V0IGNyZWF0ZWQuJykpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5kYW5nZXIoZ2V0dGV4dCgnRmFpbGVkIHRvIGNyZWF0ZSB3aWRnZXQuJykpO1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZTogbW9kYWwgd2FzIGNsb3NlZFxuICAgICAgfSk7XG4gIH1cblxuICB1cGRhdGVBbGFybXNBbmRFdmVudHMoYWxhcm1zRXZlbnRzQ29uZmlnczogQWxhcm1PckV2ZW50RXh0ZW5kZWRbXSk6IHZvaWQge1xuICAgIHRoaXMuYWxhcm1zID0gYWxhcm1zRXZlbnRzQ29uZmlncy5maWx0ZXIodGhpcy5pc0FsYXJtKTtcbiAgICB0aGlzLmV2ZW50cyA9IGFsYXJtc0V2ZW50c0NvbmZpZ3MuZmlsdGVyKHRoaXMuaXNFdmVudCk7XG4gICAgdGhpcy5oYXNBdExlYXN0T25lQWxhcm1BY3RpdmUgPSB0aGlzLmhhc0FjdGl2ZUFsYXJtcyh0aGlzLmFsYXJtcyk7XG4gIH1cblxuICBoYW5kbGVEYXRhcG9pbnRPdXRPZlN5bmMoZHBPdXRPZlN5bmM6IERhdGFwb2ludHNHcmFwaEtQSURldGFpbHMpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSAoZHA6IEtQSURldGFpbHMpID0+IGRwLl9fdGFyZ2V0Py5pZCArIGRwLmZyYWdtZW50ICsgZHAuc2VyaWVzO1xuICAgIGNvbnN0IGRwTWF0Y2ggPSB0aGlzLmNvbmZpZy5kYXRhcG9pbnRzPy5maW5kKGRwID0+IGtleShkcCkgPT09IGtleShkcE91dE9mU3luYykpO1xuICAgIGlmICghZHBNYXRjaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRhdGFwb2ludHNPdXRPZlN5bmMuc2V0KGRwTWF0Y2gsIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FsYXJtKGl0ZW06IEFsYXJtT3JFdmVudEV4dGVuZGVkKTogaXRlbSBpcyBBbGFybURldGFpbHNFeHRlbmRlZCB7XG4gICAgcmV0dXJuIGl0ZW0udGltZWxpbmVUeXBlID09PSAnQUxBUk0nO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0V2ZW50KGl0ZW06IEFsYXJtT3JFdmVudEV4dGVuZGVkKTogaXRlbSBpcyBFdmVudERldGFpbHNFeHRlbmRlZCB7XG4gICAgcmV0dXJuIGl0ZW0udGltZWxpbmVUeXBlID09PSAnRVZFTlQnO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNBY3RpdmVBbGFybXMoYWxhcm1zOiBBbGFybURldGFpbHNFeHRlbmRlZFtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFsYXJtcy5sZW5ndGggPiAwICYmIGFsYXJtcy5zb21lKGFsYXJtID0+IGFsYXJtLl9fYWN0aXZlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JNYXRjaGluZ0RhdGFwb2ludHMoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsTWF0Y2ggPSB0aGlzLmNvbmZpZz8uYWxhcm1zRXZlbnRzQ29uZmlncz8uZXZlcnkoYWUgPT5cbiAgICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlLmRhdGFwb2ludHM/LnNvbWUoZHAgPT4gZHAuX190YXJnZXQ/LmlkID09PSBhZS5fX3RhcmdldD8uaWQpXG4gICAgKTtcblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHRoaXMuYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0RwcyA9ICFhbGxNYXRjaDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRXhwb3J0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFwb2ludERldGFpbHMgPSB0aGlzLmNvbmZpZy5kYXRhcG9pbnRzXG4gICAgICAuZmlsdGVyKCh7IF9fYWN0aXZlIH0pID0+IF9fYWN0aXZlKVxuICAgICAgLm1hcCgoeyBfX3RhcmdldCwgZnJhZ21lbnQsIHNlcmllcyB9KSA9PiAoe1xuICAgICAgICBkZXZpY2VOYW1lOiBfX3RhcmdldC5uYW1lLFxuICAgICAgICBzb3VyY2U6IF9fdGFyZ2V0LmlkLFxuICAgICAgICB2YWx1ZUZyYWdtZW50U2VyaWVzOiBzZXJpZXMsXG4gICAgICAgIHZhbHVlRnJhZ21lbnRUeXBlOiBmcmFnbWVudFxuICAgICAgfSkpO1xuXG4gICAgaWYgKGRhdGFwb2ludERldGFpbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV4cG9ydENvbmZpZyA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwb3J0Q29uZmlnID0ge1xuICAgICAgICBhZ2dyZWdhdGlvbjogdGhpcy5jb25maWcuYWdncmVnYXRpb24sXG4gICAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZSh0aGlzLmNvbmZpZy5kYXRlRnJvbSkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZGF0ZVRvOiBuZXcgRGF0ZSh0aGlzLmNvbmZpZy5kYXRlVG8pLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGRhdGFwb2ludERldGFpbHM6IGRhdGFwb2ludERldGFpbHNcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29udGV4dFNvdXJjZUlkKCk6IElJZGVudGlmaWVkIHtcbiAgICBjb25zdCByb3V0ZUNvbnRleHQgPSB0aGlzLmNvbnRleHRSb3V0ZVNlcnZpY2UuZ2V0Q29udGV4dERhdGEodGhpcy5hY3RpdmF0ZWRSb3V0ZSk7XG4gICAgaWYgKCFyb3V0ZUNvbnRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBjb250ZXh0LCBjb250ZXh0RGF0YSB9ID0gcm91dGVDb250ZXh0O1xuICAgIGlmIChbVmlld0NvbnRleHQuRGV2aWNlLCBWaWV3Q29udGV4dC5Hcm91cF0uaW5jbHVkZXMoY29udGV4dCkpIHtcbiAgICAgIHJldHVybiBjb250ZXh0RGF0YTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdpZGdldENvbmZpZygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnRGF0YSBwb2ludHMgZ3JhcGggMicsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnRGF0YSBwb2ludHMgZ3JhcGggMicpLFxuICAgICAgaWQ6IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zdWJzdHIoMiksXG4gICAgICBfd2lkdGg6IDI0LFxuICAgICAgX2hlaWdodDogNSxcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWdcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Rm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBkYXRhcG9pbnRzOiBbdGhpcy5jb25maWcuZGF0YXBvaW50cyB8fCBbXV0sXG4gICAgICBhbGFybXM6IFt0aGlzLmFsYXJtcyB8fCBbXV0sXG4gICAgICBldmVudHM6IFt0aGlzLmV2ZW50cyB8fCBbXV0sXG4gICAgICBkYXRlRnJvbTogW3RoaXMuY29uZmlnLmRhdGVGcm9tIHx8IChudWxsIGFzIERhdGUpXSxcbiAgICAgIGRhdGVUbzogW3RoaXMuY29uZmlnLmRhdGVGcm9tIHx8IChudWxsIGFzIERhdGUpXSxcbiAgICAgIGludGVydmFsOiBbdGhpcy5jb25maWcuaW50ZXJ2YWwgfHwgJ2hvdXJzJ10sXG4gICAgICBhZ2dyZWdhdGlvbjogW3RoaXMuY29uZmlnLmFnZ3JlZ2F0aW9uIHx8IChudWxsIGFzIGFnZ3JlZ2F0aW9uVHlwZSB8IG51bGwpXSxcbiAgICAgIHJlYWx0aW1lOiBbdGhpcy5jb25maWcucmVhbHRpbWUgfHwgZmFsc2VdLFxuICAgICAgZGlzcGxheU1hcmtlZExpbmU6IFt0cnVlLCBbXV0sXG4gICAgICBkaXNwbGF5TWFya2VkUG9pbnQ6IFt0cnVlLCBbXV0sXG4gICAgICBtZXJnZU1hdGNoaW5nRGF0YXBvaW50czogW3RydWUsIFtdXSxcbiAgICAgIHNob3dMYWJlbEFuZFVuaXQ6IFt0cnVlLCBbXV0sXG4gICAgICBzaG93U2xpZGVyOiBbdHJ1ZSwgW11dLFxuICAgICAgZGlzcGxheURhdGVTZWxlY3Rpb246IFtmYWxzZSwgW11dLFxuICAgICAgeUF4aXNTcGxpdExpbmVzOiBbZmFsc2VdLFxuICAgICAgeEF4aXNTcGxpdExpbmVzOiBbZmFsc2VdXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGU+e3sgJ0RhdGEgZXhwbG9yZXInIHwgdHJhbnNsYXRlIH19PC9jOHktdGl0bGU+XG5cbjxjOHktdGltZS1jb250ZXh0XG4gIChjb250ZXh0Q2hhbmdlKT1cIm9uVGltZUNvbnRleHRDaGFuZ2UoJGV2ZW50KVwiXG4gIFtjaGFuZ2VkRGF0ZUNvbnRleHRdPVwidGltZVByb3BzXCJcbj48L2M4eS10aW1lLWNvbnRleHQ+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCI+XG4gIDxjOHktd29ya3NwYWNlLWNvbmZpZ1xuICAgIFt1cGRhdGVkQ29uZmlnXT1cImNvbmZpZ1wiXG4gICAgKG9uQ29uZmlndXJhdGlvbkNoYW5nZSk9XCJvbkNvbmZpZ3VyYXRpb25DaGFuZ2UoJGV2ZW50KVwiXG4gID48L2M4eS13b3Jrc3BhY2UtY29uZmlnPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBwbGFjZW1lbnQ9XCJyaWdodFwiPlxuICA8Yzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yIFtleHBvcnRDb25maWddPVwiZXhwb3J0Q29uZmlnXCI+PC9jOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3I+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ21vcmUnXCJcbiAgW3ByaW9yaXR5XT1cIi0yMDAwXCJcbj5cbiAgPGJ1dHRvblxuICAgIHRpdGxlPVwie3sgJ1NlbmQgYXMgd2lkZ2V0IHRvIHJlcG9ydCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGRhdGEtY3k9XCJ3aWRnZXRzLWRhc2hib2FyZC0tY29weS1kYXNoYm9hcmRcIlxuICAgIChjbGljayk9XCJzZW5kQXNXaWRnZXRUb1JlcG9ydCgpXCJcbiAgICBbZGlzYWJsZWRdPVwiY29uZmlnPy5kYXRhcG9pbnRzPy5sZW5ndGggPT09IDAgfHwgIWNhbkFkZFJlcG9ydFwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwiYzh5LXJlcG9ydHNcIj48L2k+XG4gICAgPHNwYW4+e3sgJ1NlbmQgYXMgd2lkZ2V0IHRvIHJlcG9ydCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbcGxhY2VtZW50XT1cIidtb3JlJ1wiXG4gIFtwcmlvcml0eV09XCItMjAwMFwiXG4+XG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdDcmVhdGUgYSBuZXcgcmVwb3J0IHdpdGggd2lkZ2V0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgZGF0YS1jeT1cIndpZGdldHMtZGFzaGJvYXJkLS1jb3B5LWRhc2hib2FyZFwiXG4gICAgKGNsaWNrKT1cImNyZWF0ZU5ld1JlcG9ydFdpdGhXaWRnZXQoKVwiXG4gICAgW2Rpc2FibGVkXT1cImNvbmZpZz8uZGF0YXBvaW50cz8ubGVuZ3RoID09PSAwIHx8ICFjYW5BZGRSZXBvcnRcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cImM4eS1yZXBvcnRzXCI+PC9pPlxuICAgIDxzcGFuPnt7ICdDcmVhdGUgYSBuZXcgcmVwb3J0IHdpdGggd2lkZ2V0JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxkaXYgY2xhc3M9XCJjb250ZW50LWZ1bGxwYWdlIGQtZ3JpZCBncmlkX2NvbC0tYXV0by0zNjAgZ2FwLTI0XCI+XG4gIDxkaXYgY2xhc3M9XCJkLWNvbCBnYXAtMTZcIj5cbiAgICA8Yzh5LWNoYXJ0c1xuICAgICAgY2xhc3M9XCJmbGV4LWdyb3cgZGF0YS1wb2ludC1leHBsb3JlclwiXG4gICAgICAjY2hhcnRcbiAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgIFthbGVydHNdPVwiYWxlcnRzXCJcbiAgICAgICh1cGRhdGVBbGFybXNBbmRFdmVudHMpPVwidXBkYXRlQWxhcm1zQW5kRXZlbnRzKCRldmVudClcIlxuICAgICAgKGNvbmZpZ0NoYW5nZU9uWm9vbU91dCk9XCJvblNsaWRlclpvb20oJGV2ZW50KVwiXG4gICAgICAoZGF0YXBvaW50T3V0T2ZTeW5jKT1cImhhbmRsZURhdGFwb2ludE91dE9mU3luYygkZXZlbnQpXCJcbiAgICAgICh0aW1lUmFuZ2VDaGFuZ2VPblJlYWx0aW1lKT1cInVwZGF0ZVRpbWVSYW5nZU9uUmVhbHRpbWUoJGV2ZW50KVwiXG4gICAgICAoaXNNYXJrZWRBcmVhRW5hYmxlZCk9XCJpc01hcmtlZEFyZWFFbmFibGVkID0gJGV2ZW50XCJcbiAgICA+PC9jOHktY2hhcnRzPlxuICAgIDxmb3JtXG4gICAgICBjbGFzcz1cIm0tbC00OCBtLXItNDhcIlxuICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWdyaWQtbWQgZ3JpZF9fY29sLS00LTQtNCBnYXAtMTZcIj5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IGZvcm0tZ3JvdXAtc20gbS10LW1kLTAgcC1iLThcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdBeGlzJyB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidZIGF4aXMgaGVscGVyIGxpbmVzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG5hbWU9XCJ5QXhpc1NwbGl0TGluZXNcIlxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ5QXhpc1NwbGl0TGluZXNcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5ZLWF4aXMgaGVscGVyIGxpbmVzPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ1ggYXhpcyBoZWxwZXIgbGluZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbmFtZT1cInhBeGlzU3BsaXRMaW5lc1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInhBeGlzU3BsaXRMaW5lc1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlgtYXhpcyBoZWxwZXIgbGluZXM8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInTWVyZ2UgbWF0Y2hpbmcgZGF0YSBwb2ludHMgaW50byBzaW5nbGUgYXhpcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBuYW1lPVwibWVyZ2VNYXRjaGluZ0RhdGFwb2ludHNcIlxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtZXJnZU1hdGNoaW5nRGF0YXBvaW50c1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPk1lcmdlIG1hdGNoaW5nIGRhdGEgcG9pbnRzIGludG8gc2luZ2xlIGF4aXM8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IGZvcm0tZ3JvdXAtc20gbS10LW1kLTAgcC1iLThcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdBbGFybXMgJiBldmVudHMnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgdmVydGljYWwgbGluZSB3aGVuIGFsYXJtIG9jY3VycycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkaXNwbGF5TWFya2VkTGluZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlNob3cgdmVydGljYWwgbGluZSBvbiBldmVyeSBvY2N1cnJlbmNlPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInU2hvdyBpY29uIHdoZW4gYWxhcm0gb3IgZXZlbnQgb2NjdXJzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG5hbWU9XCJkaXNwbGF5TWFya2VkUG9pbnRcIlxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkaXNwbGF5TWFya2VkUG9pbnRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICdTaG93IGljb24gd2hlbiB0cmlnZ2VyZWRgV2hlbiBhbGFybXMgYW5kIGV2ZW50cyBvY2N1ciB0aGUgaWNvbiB3aWxsIGJlIHNob3duYCdcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWRvdCBtLWwtOFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgICAgICAgICdTb21lIGFsYXJtcyBvciBldmVudHMgaGF2ZSBubyBtYXRjaGluZyBkYXRhIHBvaW50cy4gTm8gaWNvbnMgd2lsbCBiZSBzaG93biBmb3IgdGhlbS4nXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0Rwc1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWluZm9cIlxuICAgICAgICAgICAgICAgIGM4eUljb249XCJpbmZvXCJcbiAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBmb3JtLWdyb3VwLXNtIG0tdC1tZC0wIHAtYi04XCI+XG4gICAgICAgICAgPGxlZ2VuZD57eyAnQ2hhcnQnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgbGFiZWxzIGFuZCB1bml0cycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBuYW1lPVwic2hvd0xhYmVsQW5kVW5pdFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNob3dMYWJlbEFuZFVuaXRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5EaXNwbGF5IGxhYmVscyBhbmQgdW5pdHMgb24gWS1heGlzPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgc2xpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG5hbWU9XCJzaG93U2xpZGVyXCJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2hvd1NsaWRlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlNob3cgc2xpZGVyPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2FyZCBpbm5lci1zY3JvbGwgYmctbGV2ZWwtMVwiPlxuICAgIDxmb3JtXG4gICAgICBjbGFzcz1cImJnLWluaGVyaXRcIlxuICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICAgID5cbiAgICAgIDxjOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0XG4gICAgICAgIGNsYXNzPVwiYmctaW5oZXJpdCBzZXBhcmF0b3ItdG9wIGQtYmxvY2tcIlxuICAgICAgICBuYW1lPVwiZGF0YXBvaW50c1wiXG4gICAgICAgIFttaW5BY3RpdmVDb3VudF09XCIwXCJcbiAgICAgICAgW2RlZmF1bHRGb3JtT3B0aW9uc109XCJkYXRhcG9pbnRTZWxlY3REZWZhdWx0Rm9ybU9wdGlvbnNcIlxuICAgICAgICBbY29uZmlnXT1cInsgY29udGV4dEFzc2V0OiBjb250ZXh0QXNzZXQgfVwiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICBbYWxsb3dEcmFnQW5kRHJvcF09XCJ0cnVlXCJcbiAgICAgID48L2M4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3Q+XG5cbiAgICAgIDxjOHktYWxhcm0tZXZlbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgY2xhc3M9XCJiZy1pbmhlcml0XCJcbiAgICAgICAgbmFtZT1cImFsYXJtc1wiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFsYXJtc1wiXG4gICAgICAgIFt0aW1lbGluZVR5cGVdPVwiJ0FMQVJNJ1wiXG4gICAgICAgIFtkYXRhcG9pbnRzXT1cImNvbmZpZy5kYXRhcG9pbnRzXCJcbiAgICAgID48L2M4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdD5cblxuICAgICAgPGM4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICBjbGFzcz1cImJnLWluaGVyaXRcIlxuICAgICAgICBuYW1lPVwiZXZlbnRzXCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZXZlbnRzXCJcbiAgICAgICAgW3RpbWVsaW5lVHlwZV09XCInRVZFTlQnXCJcbiAgICAgICAgW2RhdGFwb2ludHNdPVwiY29uZmlnLmRhdGFwb2ludHNcIlxuICAgICAgPjwvYzh5LWFsYXJtLWV2ZW50LXNlbGVjdGlvbi1saXN0PlxuICAgIDwvZm9ybT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { InventoryService } from '@c8y/client';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class DataExplorerService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.inventory = inject(InventoryService);
|
|
7
|
+
}
|
|
8
|
+
async fetchReportDashboard(reportId) {
|
|
9
|
+
return (await this.inventory.list({
|
|
10
|
+
pageSize: 1,
|
|
11
|
+
query: `has('c8y_Dashboard!name!report_${reportId}')`
|
|
12
|
+
})).data[0];
|
|
13
|
+
}
|
|
14
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DataExplorerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
15
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DataExplorerService, providedIn: 'root' }); }
|
|
16
|
+
}
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DataExplorerService, decorators: [{
|
|
18
|
+
type: Injectable,
|
|
19
|
+
args: [{
|
|
20
|
+
providedIn: 'root'
|
|
21
|
+
}]
|
|
22
|
+
}] });
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50LWV4cGxvcmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kYXRhcG9pbnQtZXhwbG9yZXIvdmlldy9kYXRhcG9pbnQtZXhwbG9yZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDOztBQUsvRCxNQUFNLE9BQU8sbUJBQW1CO0lBSGhDO1FBSW1CLGNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQVV2RDtJQVJDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxRQUFnQjtRQUN6QyxPQUFPLENBQ0wsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUN4QixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxrQ0FBa0MsUUFBUSxJQUFJO1NBQ3RELENBQUMsQ0FDSCxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7OEdBVlUsbUJBQW1CO2tIQUFuQixtQkFBbUIsY0FGbEIsTUFBTTs7MkZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERhdGFFeHBsb3JlclNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGludmVudG9yeSA9IGluamVjdChJbnZlbnRvcnlTZXJ2aWNlKTtcblxuICBhc3luYyBmZXRjaFJlcG9ydERhc2hib2FyZChyZXBvcnRJZDogc3RyaW5nKTogUHJvbWlzZTxJTWFuYWdlZE9iamVjdD4ge1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCB0aGlzLmludmVudG9yeS5saXN0KHtcbiAgICAgICAgcGFnZVNpemU6IDEsXG4gICAgICAgIHF1ZXJ5OiBgaGFzKCdjOHlfRGFzaGJvYXJkIW5hbWUhcmVwb3J0XyR7cmVwb3J0SWR9JylgXG4gICAgICB9KVxuICAgICkuZGF0YVswXTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './datapoint-explorer.component';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kYXRhcG9pbnQtZXhwbG9yZXIvdmlldy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdDQUFnQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kYXRhcG9pbnQtZXhwbG9yZXIuY29tcG9uZW50JztcbiJdfQ==
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
+
import { CoreModule, gettext } from '@c8y/ngx-components';
|
|
4
|
+
import { merge, of } from 'rxjs';
|
|
5
|
+
import { map } from 'rxjs/operators';
|
|
6
|
+
import { ReportDashboardModule, ReportDashboardService } from '@c8y/ngx-components/report-dashboard';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/forms";
|
|
9
|
+
import * as i2 from "@c8y/ngx-components";
|
|
10
|
+
import * as i3 from "@angular/common";
|
|
11
|
+
export class SendAsWidgetToReportModal {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.reports = [];
|
|
14
|
+
this.result = new Promise((resolve, reject) => {
|
|
15
|
+
this._resolve = resolve;
|
|
16
|
+
this._reject = reject;
|
|
17
|
+
});
|
|
18
|
+
this.labels = { cancel: gettext('Cancel'), ok: gettext('Send') };
|
|
19
|
+
this.reportDashboardService = inject(ReportDashboardService);
|
|
20
|
+
}
|
|
21
|
+
async ngOnInit() {
|
|
22
|
+
this.reports = (await this.reportDashboardService.listReports({ pageSize: 2000 })).data;
|
|
23
|
+
if (this.reports.length > 0) {
|
|
24
|
+
this.form = this.initForm();
|
|
25
|
+
}
|
|
26
|
+
this.numberOfSelectedReports$ = merge(this.form.valueChanges, of(this.form.value)).pipe(map(value => Object.values(value).filter(Boolean).length));
|
|
27
|
+
}
|
|
28
|
+
save() {
|
|
29
|
+
this._resolve(this.form.value);
|
|
30
|
+
}
|
|
31
|
+
cancel() {
|
|
32
|
+
this._reject();
|
|
33
|
+
}
|
|
34
|
+
initForm() {
|
|
35
|
+
const controls = this.reports.reduce((acc, report) => ({
|
|
36
|
+
...acc,
|
|
37
|
+
[report.id]: new FormControl(false)
|
|
38
|
+
}), {});
|
|
39
|
+
return new FormGroup(controls);
|
|
40
|
+
}
|
|
41
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: SendAsWidgetToReportModal, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
42
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: SendAsWidgetToReportModal, isStandalone: true, selector: "c8y-apply-branding-to-app-modal", ngImport: i0, template: "<c8y-modal\n [title]=\"'Send as widget to reports' | translate\"\n [disabled]=\"!form || form.invalid\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [labels]=\"labels\"\n>\n <ng-container c8y-modal-title>\n <span c8yIcon=\"c8y-reports\"></span>\n </ng-container>\n\n <c8y-list-group\n class=\"m-b-0 no-border-last\"\n *ngIf=\"form\"\n [formGroup]=\"form\"\n >\n <c8y-li>\n <p\n class=\"text-center text-medium\"\n *ngIf=\"numberOfSelectedReports$ | async as numberOfReports; else noSelectedReports\"\n translate\n [translateParams]=\"{ numberOfReports: numberOfReports }\"\n ngNonBindable\n >\n {{ numberOfReports }} reports selected for widget\n </p>\n <ng-template #noSelectedReports>\n <p\n class=\"text-center text-medium\"\n translate\n >\n Select one or more reports to send the Data points graph widget with the current configuration\n </p>\n </ng-template>\n </c8y-li>\n <c8y-li *ngFor=\"let report of reports\">\n <c8y-li-checkbox\n [attr.data-cy]=\"'branding-apply-branding-to-app-checkbox-' + report.id\"\n [formControlName]=\"report.id\"\n ></c8y-li-checkbox>\n <c8y-li-icon class=\"p-l-0\">\n <i c8yIcon=\"{{ report.icon }}\"></i>\n </c8y-li-icon>\n <div class=\"text-truncate\" title=\"{{report.name}}\">{{ report.name }}</div>\n </c8y-li>\n </c8y-list-group>\n\n <c8y-ui-empty-state\n [icon]=\"'c8y-reports'\"\n [title]=\"'There are no reports defined.' | translate\"\n [subtitle]=\"'Add a report first.' | translate\"\n *ngIf=\"reports.length === 0\"\n ></c8y-ui-empty-state>\n</c8y-modal>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CoreModule }, { 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: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "component", type: i2.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "ngmodule", type: ReportDashboardModule }] }); }
|
|
43
|
+
}
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: SendAsWidgetToReportModal, decorators: [{
|
|
45
|
+
type: Component,
|
|
46
|
+
args: [{ selector: 'c8y-apply-branding-to-app-modal', standalone: true, imports: [ReactiveFormsModule, CoreModule, ReportDashboardModule], template: "<c8y-modal\n [title]=\"'Send as widget to reports' | translate\"\n [disabled]=\"!form || form.invalid\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [labels]=\"labels\"\n>\n <ng-container c8y-modal-title>\n <span c8yIcon=\"c8y-reports\"></span>\n </ng-container>\n\n <c8y-list-group\n class=\"m-b-0 no-border-last\"\n *ngIf=\"form\"\n [formGroup]=\"form\"\n >\n <c8y-li>\n <p\n class=\"text-center text-medium\"\n *ngIf=\"numberOfSelectedReports$ | async as numberOfReports; else noSelectedReports\"\n translate\n [translateParams]=\"{ numberOfReports: numberOfReports }\"\n ngNonBindable\n >\n {{ numberOfReports }} reports selected for widget\n </p>\n <ng-template #noSelectedReports>\n <p\n class=\"text-center text-medium\"\n translate\n >\n Select one or more reports to send the Data points graph widget with the current configuration\n </p>\n </ng-template>\n </c8y-li>\n <c8y-li *ngFor=\"let report of reports\">\n <c8y-li-checkbox\n [attr.data-cy]=\"'branding-apply-branding-to-app-checkbox-' + report.id\"\n [formControlName]=\"report.id\"\n ></c8y-li-checkbox>\n <c8y-li-icon class=\"p-l-0\">\n <i c8yIcon=\"{{ report.icon }}\"></i>\n </c8y-li-icon>\n <div class=\"text-truncate\" title=\"{{report.name}}\">{{ report.name }}</div>\n </c8y-li>\n </c8y-list-group>\n\n <c8y-ui-empty-state\n [icon]=\"'c8y-reports'\"\n [title]=\"'There are no reports defined.' | translate\"\n [subtitle]=\"'Add a report first.' | translate\"\n *ngIf=\"reports.length === 0\"\n ></c8y-ui-empty-state>\n</c8y-modal>\n" }]
|
|
47
|
+
}] });
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1hcy13aWRnZXQtdG8tcmVwb3J0LW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2RhdGFwb2ludC1leHBsb3Jlci92aWV3L3NlbmQtYXMtd2lkZ2V0LXRvLXJlcG9ydC1tb2RhbC9zZW5kLWFzLXdpZGdldC10by1yZXBvcnQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZGF0YXBvaW50LWV4cGxvcmVyL3ZpZXcvc2VuZC1hcy13aWRnZXQtdG8tcmVwb3J0LW1vZGFsL3NlbmQtYXMtd2lkZ2V0LXRvLXJlcG9ydC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFlLE1BQU0scUJBQXFCLENBQUM7QUFDdkUsT0FBTyxFQUFjLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3ZCLE1BQU0sc0NBQXNDLENBQUM7Ozs7O0FBUTlDLE1BQU0sT0FBTyx5QkFBeUI7SUFOdEM7UUFPRSxZQUFPLEdBQXFCLEVBQUUsQ0FBQztRQUcvQixXQUFNLEdBQUcsSUFBSSxPQUFPLENBQTRDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2xGLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsV0FBTSxHQUFnQixFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2pFLDJCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0tBNEJqRTtJQXpCQyxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFDRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNyRixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxNQUFNO1FBQ0osSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDTyxRQUFRO1FBQ2QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ2xDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQixHQUFHLEdBQUc7WUFDTixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUM7U0FDcEMsQ0FBQyxFQUNGLEVBQUUsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDOzhHQXBDVSx5QkFBeUI7a0dBQXpCLHlCQUF5QiwyRkNoQnRDLG91REF1REEsMkNEekNZLG1CQUFtQixtbEJBQUUsVUFBVSxpL0NBQUUscUJBQXFCOzsyRkFFckQseUJBQXlCO2tCQU5yQyxTQUFTOytCQUNFLGlDQUFpQyxjQUUvQixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUUscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvcmVNb2R1bGUsIGdldHRleHQsIE1vZGFsTGFiZWxzIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtZXJnZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIFJlcG9ydERhc2hib2FyZE1vZHVsZSxcbiAgUmVwb3J0RGFzaGJvYXJkU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3JlcG9ydC1kYXNoYm9hcmQnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYXBwbHktYnJhbmRpbmctdG8tYXBwLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbmQtYXMtd2lkZ2V0LXRvLXJlcG9ydC1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDb3JlTW9kdWxlLCBSZXBvcnREYXNoYm9hcmRNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFNlbmRBc1dpZGdldFRvUmVwb3J0TW9kYWwge1xuICByZXBvcnRzOiBJTWFuYWdlZE9iamVjdFtdID0gW107XG4gIG51bWJlck9mU2VsZWN0ZWRSZXBvcnRzJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBmb3JtOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmluaXRGb3JtPjtcbiAgcmVzdWx0ID0gbmV3IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5pbml0Rm9ybT5bJ3ZhbHVlJ10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gIH0pO1xuICBsYWJlbHM6IE1vZGFsTGFiZWxzID0geyBjYW5jZWw6IGdldHRleHQoJ0NhbmNlbCcpLCBvazogZ2V0dGV4dCgnU2VuZCcpIH07XG4gIHByaXZhdGUgcmVwb3J0RGFzaGJvYXJkU2VydmljZSA9IGluamVjdChSZXBvcnREYXNoYm9hcmRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcmVzb2x2ZTogKHZhbHVlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmluaXRGb3JtPlsndmFsdWUnXSkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBfcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnJlcG9ydHMgPSAoYXdhaXQgdGhpcy5yZXBvcnREYXNoYm9hcmRTZXJ2aWNlLmxpc3RSZXBvcnRzKHsgcGFnZVNpemU6IDIwMDAgfSkpLmRhdGE7XG4gICAgaWYgKHRoaXMucmVwb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZvcm0gPSB0aGlzLmluaXRGb3JtKCk7XG4gICAgfVxuICAgIHRoaXMubnVtYmVyT2ZTZWxlY3RlZFJlcG9ydHMkID0gbWVyZ2UodGhpcy5mb3JtLnZhbHVlQ2hhbmdlcywgb2YodGhpcy5mb3JtLnZhbHVlKSkucGlwZShcbiAgICAgIG1hcCh2YWx1ZSA9PiBPYmplY3QudmFsdWVzKHZhbHVlKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoKVxuICAgICk7XG4gIH1cbiAgc2F2ZSgpIHtcbiAgICB0aGlzLl9yZXNvbHZlKHRoaXMuZm9ybS52YWx1ZSk7XG4gIH1cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuX3JlamVjdCgpO1xuICB9XG4gIHByaXZhdGUgaW5pdEZvcm0oKTogRm9ybUdyb3VwPFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPGJvb2xlYW4+Pj4ge1xuICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy5yZXBvcnRzLnJlZHVjZShcbiAgICAgIChhY2MsIHJlcG9ydCkgPT4gKHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICBbcmVwb3J0LmlkXTogbmV3IEZvcm1Db250cm9sKGZhbHNlKVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoY29udHJvbHMpO1xuICB9XG59XG4iLCI8Yzh5LW1vZGFsXG4gIFt0aXRsZV09XCInU2VuZCBhcyB3aWRnZXQgdG8gcmVwb3J0cycgfCB0cmFuc2xhdGVcIlxuICBbZGlzYWJsZWRdPVwiIWZvcm0gfHwgZm9ybS5pbnZhbGlkXCJcbiAgW2hlYWRlckNsYXNzZXNdPVwiJ2RpYWxvZy1oZWFkZXInXCJcbiAgKG9uRGlzbWlzcyk9XCJjYW5jZWwoKVwiXG4gIChvbkNsb3NlKT1cInNhdmUoKVwiXG4gIFtsYWJlbHNdPVwibGFiZWxzXCJcbj5cbiAgPG5nLWNvbnRhaW5lciBjOHktbW9kYWwtdGl0bGU+XG4gICAgPHNwYW4gYzh5SWNvbj1cImM4eS1yZXBvcnRzXCI+PC9zcGFuPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8Yzh5LWxpc3QtZ3JvdXBcbiAgICBjbGFzcz1cIm0tYi0wIG5vLWJvcmRlci1sYXN0XCJcbiAgICAqbmdJZj1cImZvcm1cIlxuICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gID5cbiAgICA8Yzh5LWxpPlxuICAgICAgPHBcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW1lZGl1bVwiXG4gICAgICAgICpuZ0lmPVwibnVtYmVyT2ZTZWxlY3RlZFJlcG9ydHMkIHwgYXN5bmMgYXMgbnVtYmVyT2ZSZXBvcnRzOyBlbHNlIG5vU2VsZWN0ZWRSZXBvcnRzXCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBudW1iZXJPZlJlcG9ydHM6IG51bWJlck9mUmVwb3J0cyB9XCJcbiAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgPlxuICAgICAgICB7eyBudW1iZXJPZlJlcG9ydHMgfX0gcmVwb3J0cyBzZWxlY3RlZCBmb3Igd2lkZ2V0XG4gICAgICA8L3A+XG4gICAgICA8bmctdGVtcGxhdGUgI25vU2VsZWN0ZWRSZXBvcnRzPlxuICAgICAgICA8cFxuICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tZWRpdW1cIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgU2VsZWN0IG9uZSBvciBtb3JlIHJlcG9ydHMgdG8gc2VuZCB0aGUgRGF0YSBwb2ludHMgZ3JhcGggd2lkZ2V0IHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvblxuICAgICAgICA8L3A+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvYzh5LWxpPlxuICAgIDxjOHktbGkgKm5nRm9yPVwibGV0IHJlcG9ydCBvZiByZXBvcnRzXCI+XG4gICAgICA8Yzh5LWxpLWNoZWNrYm94XG4gICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2JyYW5kaW5nLWFwcGx5LWJyYW5kaW5nLXRvLWFwcC1jaGVja2JveC0nICsgcmVwb3J0LmlkXCJcbiAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJyZXBvcnQuaWRcIlxuICAgICAgPjwvYzh5LWxpLWNoZWNrYm94PlxuICAgICAgPGM4eS1saS1pY29uIGNsYXNzPVwicC1sLTBcIj5cbiAgICAgICAgPGkgYzh5SWNvbj1cInt7IHJlcG9ydC5pY29uIH19XCI+PC9pPlxuICAgICAgPC9jOHktbGktaWNvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7e3JlcG9ydC5uYW1lfX1cIj57eyByZXBvcnQubmFtZSB9fTwvZGl2PlxuICAgIDwvYzh5LWxpPlxuICA8L2M4eS1saXN0LWdyb3VwPlxuXG4gIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICBbaWNvbl09XCInYzh5LXJlcG9ydHMnXCJcbiAgICBbdGl0bGVdPVwiJ1RoZXJlIGFyZSBubyByZXBvcnRzIGRlZmluZWQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgW3N1YnRpdGxlXT1cIidBZGQgYSByZXBvcnQgZmlyc3QuJyB8IHRyYW5zbGF0ZVwiXG4gICAgKm5nSWY9XCJyZXBvcnRzLmxlbmd0aCA9PT0gMFwiXG4gID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbjwvYzh5LW1vZGFsPlxuIl19
|