@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,467 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Component, Optional, Input, ViewChild } from '@angular/core';
|
|
3
|
+
import * as i4 from '@angular/forms';
|
|
4
|
+
import { FormBuilder, NgForm, Validators } from '@angular/forms';
|
|
5
|
+
import * as i2 from '@c8y/ngx-components';
|
|
6
|
+
import { WidgetTimeContextDateRangeService, gettext, CommonModule, CoreModule, FormsModule, AGGREGATION_ICONS, AGGREGATION_TEXTS } from '@c8y/ngx-components';
|
|
7
|
+
import * as i2$1 from '@ngx-translate/core';
|
|
8
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
9
|
+
import { takeUntil } from 'rxjs/operators';
|
|
10
|
+
import { Subject } from 'rxjs';
|
|
11
|
+
import * as i7 from '@c8y/ngx-components/datapoint-selector';
|
|
12
|
+
import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
|
|
13
|
+
import { omit, cloneDeep } from 'lodash-es';
|
|
14
|
+
import * as i1 from '@c8y/ngx-components/context-dashboard';
|
|
15
|
+
import * as i8 from '@c8y/ngx-components/alarm-event-selector';
|
|
16
|
+
import { AlarmEventSelectorModule } from '@c8y/ngx-components/alarm-event-selector';
|
|
17
|
+
import * as i5$1 from 'ngx-bootstrap/tooltip';
|
|
18
|
+
import { TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
19
|
+
import * as i6 from 'ngx-bootstrap/popover';
|
|
20
|
+
import { PopoverModule } from 'ngx-bootstrap/popover';
|
|
21
|
+
import { DATE_SELECTION_EXTENDED, ChartEventsService, ChartAlarmsService, ChartsComponent } from '@c8y/ngx-components/echart';
|
|
22
|
+
import { TimeContextComponent } from '@c8y/ngx-components/time-context';
|
|
23
|
+
import * as i5 from '@angular/common';
|
|
24
|
+
import { CommonModule as CommonModule$1 } from '@angular/common';
|
|
25
|
+
import { ALARM_STATUS_LABELS } from '@c8y/client';
|
|
26
|
+
import { A11yModule } from '@angular/cdk/a11y';
|
|
27
|
+
import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
|
|
28
|
+
import * as i8$1 from '@c8y/ngx-components/alarms';
|
|
29
|
+
import { AlarmsModule } from '@c8y/ngx-components/alarms';
|
|
30
|
+
|
|
31
|
+
class DatapointsGraphWidgetConfigComponent {
|
|
32
|
+
constructor(widgetConfig, dashboardContextComponent) {
|
|
33
|
+
this.widgetConfig = widgetConfig;
|
|
34
|
+
this.dashboardContextComponent = dashboardContextComponent;
|
|
35
|
+
this.formBuilder = inject(FormBuilder);
|
|
36
|
+
this.form = inject(NgForm);
|
|
37
|
+
this.translate = inject(TranslateService);
|
|
38
|
+
this.widgetTimeContextDateRangeService = inject(WidgetTimeContextDateRangeService);
|
|
39
|
+
this.DATE_SELECTION = DATE_SELECTION_EXTENDED;
|
|
40
|
+
this.dateSelectionHelp = this.translate.instant(gettext(`Choose how to select a date range, the available options are:
|
|
41
|
+
<ul class="m-l-0 p-l-8 m-t-8 m-b-0">
|
|
42
|
+
<li>
|
|
43
|
+
<b>Widget configuration:</b>
|
|
44
|
+
restricts the date selection only to the widget configuration
|
|
45
|
+
</li>
|
|
46
|
+
<li>
|
|
47
|
+
<b>Widget and widget configuration:</b>
|
|
48
|
+
restricts the date selection to the widget view and widget configuration only
|
|
49
|
+
</li>
|
|
50
|
+
<li>
|
|
51
|
+
<b>Dashboard time range:</b>
|
|
52
|
+
restricts date selection to the global dashboard configuration only
|
|
53
|
+
</li>
|
|
54
|
+
</ul>`));
|
|
55
|
+
this.datapointSelectDefaultFormOptions = {
|
|
56
|
+
showRange: true,
|
|
57
|
+
showChart: true
|
|
58
|
+
};
|
|
59
|
+
this.datapointSelectionConfig = {};
|
|
60
|
+
this.activeDatapointsExists = false;
|
|
61
|
+
this.alarmsOrEventsHaveNoMatchingDps = false;
|
|
62
|
+
this.destroy$ = new Subject();
|
|
63
|
+
this.formGroup = this.initForm();
|
|
64
|
+
}
|
|
65
|
+
ngOnInit() {
|
|
66
|
+
this.config?.datapoints?.forEach(dp => this.assignContextFromContextDashboard(dp));
|
|
67
|
+
this.form.form.addControl('config', this.formGroup);
|
|
68
|
+
this.formGroup.patchValue(this.config || {});
|
|
69
|
+
this.formGroup.controls.alarms.setValue(this.config?.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'ALARM'));
|
|
70
|
+
this.formGroup.controls.events.setValue(this.config?.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'EVENT'));
|
|
71
|
+
this.initDateSelection();
|
|
72
|
+
this.setActiveDatapointsExists();
|
|
73
|
+
this.checkForMatchingDatapoints();
|
|
74
|
+
this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {
|
|
75
|
+
this.config = {
|
|
76
|
+
...value,
|
|
77
|
+
alarmsEventsConfigs: [
|
|
78
|
+
...(this.formGroup.value.alarms || []),
|
|
79
|
+
...(this.formGroup.value.events || [])
|
|
80
|
+
]
|
|
81
|
+
};
|
|
82
|
+
this.setActiveDatapointsExists();
|
|
83
|
+
this.checkForMatchingDatapoints();
|
|
84
|
+
});
|
|
85
|
+
if (this.config?.widgetInstanceGlobalTimeContext) {
|
|
86
|
+
this.updateDashboardTimeContext(this.widgetTimeContextDateRangeService.initialTimeRange());
|
|
87
|
+
}
|
|
88
|
+
if (this.config.dateFrom && this.config.dateTo) {
|
|
89
|
+
this.timeProps = {
|
|
90
|
+
dateFrom: new Date(this.config?.dateFrom),
|
|
91
|
+
dateTo: new Date(this.config?.dateTo),
|
|
92
|
+
interval: this.config?.interval,
|
|
93
|
+
realtime: this.config?.realtime,
|
|
94
|
+
aggregation: this.config?.realtime ? null : this.config?.aggregation
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
ngOnDestroy() {
|
|
99
|
+
this.destroy$.next();
|
|
100
|
+
this.destroy$.complete();
|
|
101
|
+
}
|
|
102
|
+
onBeforeSave(config) {
|
|
103
|
+
if (this.formGroup.valid && config) {
|
|
104
|
+
Object.assign(config, omit(this.formGroup.value, ['alarms', 'events']), {
|
|
105
|
+
alarmsEventsConfigs: [
|
|
106
|
+
...(this.formGroup.value.alarms || []),
|
|
107
|
+
...(this.formGroup.value.events || [])
|
|
108
|
+
]
|
|
109
|
+
});
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
timePropsChanged(timeProps) {
|
|
115
|
+
if (timeProps.realtime !== this.config.realtime) {
|
|
116
|
+
this.formGroup.patchValue({ realtime: timeProps.realtime });
|
|
117
|
+
}
|
|
118
|
+
if (timeProps.realtime) {
|
|
119
|
+
if (timeProps.currentDateContextInterval !== this.formGroup.value.interval) {
|
|
120
|
+
this.formGroup.patchValue({ interval: timeProps.currentDateContextInterval });
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const patchValues = {
|
|
125
|
+
dateFrom: new Date(timeProps.currentDateContextFromDate),
|
|
126
|
+
dateTo: new Date(timeProps.currentDateContextToDate),
|
|
127
|
+
interval: timeProps.currentDateContextInterval,
|
|
128
|
+
...(timeProps.aggregation && { aggregation: timeProps.aggregation }),
|
|
129
|
+
...(timeProps.realtime && { realtime: timeProps.realtime })
|
|
130
|
+
};
|
|
131
|
+
this.formGroup.patchValue(patchValues);
|
|
132
|
+
}
|
|
133
|
+
updateDashboardTimeContext(timeProps) {
|
|
134
|
+
const initialTimeRange = {
|
|
135
|
+
dateFrom: timeProps.dateFrom,
|
|
136
|
+
dateTo: timeProps.dateTo,
|
|
137
|
+
interval: timeProps.interval || 'custom'
|
|
138
|
+
};
|
|
139
|
+
if (!this.widgetTimeContextDateRangeService.initialTimeRange()) {
|
|
140
|
+
this.widgetTimeContextDateRangeService.updateInitialTimeRange(initialTimeRange);
|
|
141
|
+
}
|
|
142
|
+
this.formGroup.patchValue({ ...timeProps, ...initialTimeRange });
|
|
143
|
+
}
|
|
144
|
+
updateTimeRangeOnRealtime(timeRange) {
|
|
145
|
+
this.formGroup.patchValue(timeRange, { emitEvent: false });
|
|
146
|
+
}
|
|
147
|
+
dateSelectionChange(dateSelection) {
|
|
148
|
+
this.dateSelection = dateSelection;
|
|
149
|
+
if (dateSelection === DATE_SELECTION_EXTENDED.CONFIG) {
|
|
150
|
+
this.formGroup.controls.displayDateSelection.enable();
|
|
151
|
+
this.formGroup.patchValue({ widgetInstanceGlobalTimeContext: false });
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// displayDateSelection should be false and disabled when dateSelection is not CONFIG
|
|
155
|
+
this.formGroup.controls.displayDateSelection.disable();
|
|
156
|
+
this.formGroup.patchValue({
|
|
157
|
+
widgetInstanceGlobalTimeContext: true,
|
|
158
|
+
realtime: false,
|
|
159
|
+
displayDateSelection: false
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
assignContextFromContextDashboard(datapoint) {
|
|
163
|
+
if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const context = this.widgetConfig?.context;
|
|
167
|
+
if (context?.id) {
|
|
168
|
+
const { name, id } = context;
|
|
169
|
+
datapoint.__target = { name, id };
|
|
170
|
+
this.datapointSelectionConfig.contextAsset = { id };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
checkForMatchingDatapoints() {
|
|
174
|
+
const allMatch = this.config?.alarmsEventsConfigs?.every(ae => this.formGroup.value.datapoints?.some(dp => dp.__target?.id === ae.__target?.id));
|
|
175
|
+
queueMicrotask(() => {
|
|
176
|
+
if (allMatch) {
|
|
177
|
+
this.alarmsOrEventsHaveNoMatchingDps = false;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
this.alarmsOrEventsHaveNoMatchingDps = true;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
initForm() {
|
|
185
|
+
const form = this.formBuilder.group({
|
|
186
|
+
datapoints: [
|
|
187
|
+
[],
|
|
188
|
+
[Validators.required, Validators.minLength(1)]
|
|
189
|
+
],
|
|
190
|
+
alarms: [[]],
|
|
191
|
+
events: [[]],
|
|
192
|
+
displayMarkedLine: [true, []],
|
|
193
|
+
displayMarkedPoint: [true, []],
|
|
194
|
+
mergeMatchingDatapoints: [true, []],
|
|
195
|
+
showLabelAndUnit: [true, []],
|
|
196
|
+
displayDateSelection: [false, []],
|
|
197
|
+
displayAggregationSelection: [false, []],
|
|
198
|
+
widgetInstanceGlobalTimeContext: [false, []],
|
|
199
|
+
canDecoupleGlobalTimeContext: [false, []],
|
|
200
|
+
dateFrom: [null, []],
|
|
201
|
+
dateTo: [null, []],
|
|
202
|
+
interval: ['days', [Validators.required]],
|
|
203
|
+
aggregation: [null, []],
|
|
204
|
+
realtime: [false, [Validators.required]],
|
|
205
|
+
showSlider: [true, [Validators.required]],
|
|
206
|
+
yAxisSplitLines: [false, [Validators.required]],
|
|
207
|
+
xAxisSplitLines: [false, [Validators.required]]
|
|
208
|
+
});
|
|
209
|
+
return form;
|
|
210
|
+
}
|
|
211
|
+
initDateSelection() {
|
|
212
|
+
if (!this.config?.widgetInstanceGlobalTimeContext) {
|
|
213
|
+
this.dateSelection = DATE_SELECTION_EXTENDED.CONFIG;
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
this.dateSelection = DATE_SELECTION_EXTENDED.DASHBOARD_CONTEXT;
|
|
217
|
+
this.formGroup.controls.displayDateSelection.disable();
|
|
218
|
+
}
|
|
219
|
+
setActiveDatapointsExists() {
|
|
220
|
+
this.activeDatapointsExists =
|
|
221
|
+
(this.config?.datapoints?.filter(dp => dp.__active)?.length || 0) > 0;
|
|
222
|
+
}
|
|
223
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsGraphWidgetConfigComponent, deps: [{ token: i1.WidgetConfigComponent, optional: true }, { token: i1.ContextDashboardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
224
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsGraphWidgetConfigComponent, isStandalone: true, selector: "c8y-datapoints-graph-widget-config", inputs: { config: "config" }, host: { classAttribute: "d-contents" }, providers: [ChartEventsService, ChartAlarmsService], ngImport: i0, template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\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\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\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 axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching datapoints into single axis.</span>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & Events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | 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 <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean 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-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\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 </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5$1.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: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: ChartsComponent, selector: "c8y-charts", inputs: ["config", "alerts"], outputs: ["configChangeOnZoomOut", "timeRangeChangeOnRealtime", "datapointOutOfSync", "updateAlarmsAndEvents", "isMarkedAreaEnabled"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i7.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: i8.AlarmEventSelectionListComponent, selector: "c8y-alarm-event-selection-list", inputs: ["timelineType", "canRemove", "canEdit", "canDragAndDrop", "title", "addButtonLabel", "hideSource", "inline", "activeToggleAsSwitch", "omitProperties", "datapoints", "config"] }, { kind: "component", type: TimeContextComponent, selector: "c8y-time-context", inputs: ["changedDateContext", "controlsAvailable", "context"], outputs: ["contextChange"] }] }); }
|
|
225
|
+
}
|
|
226
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsGraphWidgetConfigComponent, decorators: [{
|
|
227
|
+
type: Component,
|
|
228
|
+
args: [{ selector: 'c8y-datapoints-graph-widget-config', host: { class: 'd-contents' }, standalone: true, imports: [
|
|
229
|
+
CommonModule,
|
|
230
|
+
CoreModule,
|
|
231
|
+
FormsModule,
|
|
232
|
+
TooltipModule,
|
|
233
|
+
PopoverModule,
|
|
234
|
+
ChartsComponent,
|
|
235
|
+
DatapointSelectorModule,
|
|
236
|
+
AlarmEventSelectorModule,
|
|
237
|
+
TimeContextComponent
|
|
238
|
+
], providers: [ChartEventsService, ChartAlarmsService], template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\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\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\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 axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching datapoints into single axis.</span>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & Events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | 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 <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean 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-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\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 </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n" }]
|
|
239
|
+
}], ctorParameters: () => [{ type: i1.WidgetConfigComponent, decorators: [{
|
|
240
|
+
type: Optional
|
|
241
|
+
}] }, { type: i1.ContextDashboardComponent, decorators: [{
|
|
242
|
+
type: Optional
|
|
243
|
+
}] }], propDecorators: { config: [{
|
|
244
|
+
type: Input
|
|
245
|
+
}] } });
|
|
246
|
+
|
|
247
|
+
class DatapointsGraphWidgetViewComponent {
|
|
248
|
+
set config(value) {
|
|
249
|
+
this.displayConfig = cloneDeep(value);
|
|
250
|
+
}
|
|
251
|
+
get config() {
|
|
252
|
+
throw Error('"config" property should not be referenced in view component to avoid mutating data.');
|
|
253
|
+
}
|
|
254
|
+
constructor(formBuilder, translate, widgetTimeContextDateRangeService, dashboardContextComponent) {
|
|
255
|
+
this.formBuilder = formBuilder;
|
|
256
|
+
this.translate = translate;
|
|
257
|
+
this.widgetTimeContextDateRangeService = widgetTimeContextDateRangeService;
|
|
258
|
+
this.dashboardContextComponent = dashboardContextComponent;
|
|
259
|
+
this.events = [];
|
|
260
|
+
this.alarms = [];
|
|
261
|
+
this.AGGREGATION_ICONS = AGGREGATION_ICONS;
|
|
262
|
+
this.AGGREGATION_TEXTS = AGGREGATION_TEXTS;
|
|
263
|
+
this.datapointsOutOfSync = new Map();
|
|
264
|
+
this.hasAtLeastOneDatapointActive = true;
|
|
265
|
+
this.hasAtLeastOneAlarmActive = true;
|
|
266
|
+
this.isMarkedAreaEnabled = false;
|
|
267
|
+
this.legendHelp = this.translate.instant(gettext(`<ul class="m-l-0 p-l-8 m-t-8 m-b-0">
|
|
268
|
+
<li>
|
|
269
|
+
<b>Visibility:</b>
|
|
270
|
+
use visibility icon to toggle datapoint, alarm or event visibility on chart. At least one datapoint is required to display chart.
|
|
271
|
+
</li>
|
|
272
|
+
<li>
|
|
273
|
+
<b>Alarm details</b>
|
|
274
|
+
Click alarm legend item to highlight area between alarm raised timestamp and alarm cleared timestamp.
|
|
275
|
+
You can also click alarm markline on chart to highlight alarm and to pause tooltip. Click on highlighted area or legend item to cancel highlighting.
|
|
276
|
+
</li>
|
|
277
|
+
</ul>`));
|
|
278
|
+
this.disableZoomInLabel = gettext('Disable zoom in');
|
|
279
|
+
this.enableZoomInLabel = gettext('Click to enable zoom, then click and drag on the desired area in the chart.');
|
|
280
|
+
this.hideDatapointLabel = gettext('Hide data point');
|
|
281
|
+
this.showDatapointLabel = gettext('Show data point');
|
|
282
|
+
this.destroy$ = new Subject();
|
|
283
|
+
this.timeControlsFormGroup = this.initForm();
|
|
284
|
+
this.timeControlsFormGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {
|
|
285
|
+
this.displayConfig = { ...this.displayConfig, ...value };
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
ngOnInit() {
|
|
289
|
+
this.displayConfig?.datapoints?.forEach(dp => this.assignContextFromContextDashboard(dp));
|
|
290
|
+
if (this.displayConfig.dateFrom && this.displayConfig.dateTo) {
|
|
291
|
+
this.timeProps = {
|
|
292
|
+
dateFrom: new Date(this.displayConfig?.dateFrom),
|
|
293
|
+
dateTo: new Date(this.displayConfig?.dateTo),
|
|
294
|
+
interval: this.displayConfig?.interval,
|
|
295
|
+
realtime: this.displayConfig?.realtime,
|
|
296
|
+
aggregation: this.displayConfig?.realtime ? null : this.displayConfig?.aggregation
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
ngOnDestroy() {
|
|
301
|
+
this.destroy$.next();
|
|
302
|
+
this.destroy$.complete();
|
|
303
|
+
}
|
|
304
|
+
ngOnChanges(changes) {
|
|
305
|
+
this.timeControlsFormGroup.patchValue(this.displayConfig || {});
|
|
306
|
+
const config = changes['config']?.currentValue;
|
|
307
|
+
if (config?.date && config?.widgetInstanceGlobalTimeContext && this.displayConfig?.date) {
|
|
308
|
+
if (!this.displayConfig.sliderChange) {
|
|
309
|
+
this.widgetTimeContextDateRangeService.updateInitialTimeRange(null);
|
|
310
|
+
}
|
|
311
|
+
this.timePropsChanged({
|
|
312
|
+
currentDateContextFromDate: this.displayConfig?.date[0].toISOString(),
|
|
313
|
+
currentDateContextToDate: this.displayConfig?.date[1].toISOString(),
|
|
314
|
+
currentDateContextInterval: this.displayConfig?.interval,
|
|
315
|
+
realtime: this.displayConfig?.realtime,
|
|
316
|
+
aggregation: this.displayConfig?.aggregation
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
timePropsChanged(timeProps) {
|
|
321
|
+
const patchValues = {
|
|
322
|
+
dateFrom: new Date(timeProps.currentDateContextFromDate),
|
|
323
|
+
dateTo: new Date(timeProps.currentDateContextToDate),
|
|
324
|
+
interval: timeProps.currentDateContextInterval,
|
|
325
|
+
...(timeProps.aggregation && { aggregation: timeProps.aggregation }),
|
|
326
|
+
...(timeProps.realtime && { realtime: timeProps.realtime })
|
|
327
|
+
};
|
|
328
|
+
this.timeControlsFormGroup.patchValue(patchValues);
|
|
329
|
+
}
|
|
330
|
+
updateDashboardTimeContext(timeProps) {
|
|
331
|
+
if (this.displayConfig?.widgetInstanceGlobalTimeContext) {
|
|
332
|
+
this.widgetTimeContextDateRangeService.emitPropertyUpdate(timeProps);
|
|
333
|
+
}
|
|
334
|
+
this.timeControlsFormGroup.patchValue(timeProps);
|
|
335
|
+
this.timeProps = { ...timeProps, realtime: false };
|
|
336
|
+
}
|
|
337
|
+
updateTimeRangeOnRealtime(timeRange) {
|
|
338
|
+
this.timeControlsFormGroup.patchValue(timeRange, { emitEvent: false });
|
|
339
|
+
}
|
|
340
|
+
toggleChart(datapoint) {
|
|
341
|
+
if (this.displayConfig?.datapoints?.filter(dp => dp.__active).length === 1 &&
|
|
342
|
+
datapoint.__active) {
|
|
343
|
+
// at least 1 datapoint should be active
|
|
344
|
+
this.hasAtLeastOneDatapointActive = false;
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
datapoint.__active = !datapoint.__active;
|
|
348
|
+
this.hasAtLeastOneDatapointActive = true;
|
|
349
|
+
this.displayConfig = { ...this.displayConfig };
|
|
350
|
+
}
|
|
351
|
+
handleDatapointOutOfSync(dpOutOfSync) {
|
|
352
|
+
const key = (dp) => dp.__target?.id + dp.fragment + dp.series;
|
|
353
|
+
const dpMatch = this.displayConfig?.datapoints?.find(dp => key(dp) === key(dpOutOfSync));
|
|
354
|
+
if (!dpMatch) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
this.datapointsOutOfSync.set(dpMatch, true);
|
|
358
|
+
}
|
|
359
|
+
toggleMarkedArea(alarm) {
|
|
360
|
+
this.enabledMarkedAreaAlarmType = alarm.filters.type;
|
|
361
|
+
const params = {
|
|
362
|
+
data: {
|
|
363
|
+
itemType: alarm.filters.type
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
this.chartComponent.onChartClick(params);
|
|
367
|
+
}
|
|
368
|
+
toggleAlarmEventType(alarmOrEvent) {
|
|
369
|
+
if (alarmOrEvent.timelineType === 'ALARM') {
|
|
370
|
+
this.alarms = this.alarms.map(alarm => {
|
|
371
|
+
if (alarm.filters.type === alarmOrEvent.filters.type) {
|
|
372
|
+
alarm.__hidden = !alarm.__hidden;
|
|
373
|
+
}
|
|
374
|
+
return alarm;
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
this.events = this.events.map(event => {
|
|
379
|
+
if (event.filters.type === alarmOrEvent.filters.type) {
|
|
380
|
+
event.__hidden = !event.__hidden;
|
|
381
|
+
}
|
|
382
|
+
return event;
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
this.displayConfig = { ...this.displayConfig };
|
|
386
|
+
}
|
|
387
|
+
updateAlarmsAndEvents(alarmsEventsConfigs) {
|
|
388
|
+
this.alarms = alarmsEventsConfigs.filter(alarm => alarm.timelineType === 'ALARM');
|
|
389
|
+
this.events = alarmsEventsConfigs.filter(event => event.timelineType === 'EVENT');
|
|
390
|
+
if (this.alarms.length === 0 || !this.alarms.find(alarm => alarm.__active)) {
|
|
391
|
+
this.hasAtLeastOneAlarmActive = false;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
filterSeverity(eventTarget) {
|
|
395
|
+
this.alarms = this.alarms.map(alarm => {
|
|
396
|
+
if (!alarm.__severity) {
|
|
397
|
+
alarm.__severity = [];
|
|
398
|
+
}
|
|
399
|
+
alarm.__severity = Object.keys(eventTarget.severityOptions).filter((severity) => eventTarget.severityOptions[severity]);
|
|
400
|
+
if (!alarm.__status) {
|
|
401
|
+
alarm.__status = [];
|
|
402
|
+
}
|
|
403
|
+
const statuses = Object.keys(ALARM_STATUS_LABELS);
|
|
404
|
+
const filteredStatuses = eventTarget.showCleared
|
|
405
|
+
? statuses
|
|
406
|
+
: statuses.filter(status => status !== 'CLEARED');
|
|
407
|
+
alarm.__status = filteredStatuses;
|
|
408
|
+
return alarm;
|
|
409
|
+
});
|
|
410
|
+
this.displayConfig = { ...this.displayConfig };
|
|
411
|
+
}
|
|
412
|
+
assignContextFromContextDashboard(datapoint) {
|
|
413
|
+
if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
const context = this.dashboardContextComponent?.context;
|
|
417
|
+
if (context?.id) {
|
|
418
|
+
const { name, id } = context;
|
|
419
|
+
datapoint.__target = { name, id };
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
initForm() {
|
|
423
|
+
const form = this.formBuilder.group({
|
|
424
|
+
dateFrom: [undefined, [Validators.required]],
|
|
425
|
+
dateTo: [undefined, [Validators.required]],
|
|
426
|
+
interval: [
|
|
427
|
+
this.displayConfig?.interval || 'hours',
|
|
428
|
+
[Validators.required]
|
|
429
|
+
],
|
|
430
|
+
aggregation: [null, []],
|
|
431
|
+
realtime: [false, [Validators.required]],
|
|
432
|
+
widgetInstanceGlobalTimeContext: [false, []]
|
|
433
|
+
});
|
|
434
|
+
form.patchValue(this.displayConfig || {});
|
|
435
|
+
return form;
|
|
436
|
+
}
|
|
437
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsGraphWidgetViewComponent, deps: [{ token: i4.FormBuilder }, { token: i2$1.TranslateService }, { token: i2.WidgetTimeContextDateRangeService }, { token: i1.ContextDashboardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
438
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsGraphWidgetViewComponent, isStandalone: true, selector: "c8y-datapoints-graph-widget-view", inputs: { config: "config" }, providers: [ChartEventsService, ChartAlarmsService], viewQueries: [{ propertyName: "chartComponent", first: true, predicate: ChartsComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"p-l-16 p-r-16\">\n <div class=\"d-flex gap-16 a-i-start\">\n <div\n class=\"btn-group btn-group-sm flex-no-shrink\"\n *ngIf=\"!displayConfig?.widgetInstanceGlobalTimeContext\"\n >\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (displayConfig?.aggregation\n ? AGGREGATION_TEXTS[displayConfig.aggregation]\n : AGGREGATION_TEXTS.undefined\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n displayConfig?.aggregation\n ? AGGREGATION_ICONS[displayConfig.aggregation]\n : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n\n <c8y-time-context\n class=\"d-contents\"\n (contextChange)=\"timePropsChanged($event)\"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: displayConfig?.displayDateSelection,\n interval: displayConfig?.displayDateSelection,\n aggregation: displayConfig?.displayAggregationSelection\n }\"\n ></c8y-time-context>\n </div>\n <c8y-alarms-filter\n class=\"d-contents form-group-sm\"\n *ngIf=\"hasAtLeastOneAlarmActive\"\n (filterApplied)=\"filterSeverity($event)\"\n ></c8y-alarms-filter>\n\n <div class=\"m-l-auto btn-group btn-group-sm flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Save as image' | translate\"\n tooltip=\"{{ 'Save as image' | translate }}\"\n container=\"body\"\n type=\"button\"\n (click)=\"chart.saveAsImage()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"image-file-checked\"\n ></i>\n </button>\n </div>\n </div>\n <div\n class=\"d-flex\"\n style=\"align-items: center\"\n >\n <button\n class=\"btn-help btn-help--sm m-r-8\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"legendHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n <div class=\"inner-scroll\">\n <div class=\"flex-grow p-t-8 d-flex a-i-start gap-8 p-b-4\">\n <div\n class=\"c8y-datapoint-pill flex-no-shrink\"\n title=\"{{ datapoint.label }} - {{ datapoint.__target.name }}\"\n *ngFor=\"let datapoint of displayConfig.datapoints\"\n [ngClass]=\"{ active: datapoint.__active }\"\n >\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'At least 1 active data points must be active.' | translate\"\n container=\"body\"\n *ngIf=\"!hasAtLeastOneDatapointActive && datapoint.__active\"\n [adaptivePosition]=\"false\"\n ></i>\n <button\n class=\"c8y-datapoint-pill__btn\"\n title=\"{{\n (datapoint.__active ? hideDatapointLabel : showDatapointLabel) | translate\n }} \"\n type=\"button\"\n (click)=\"toggleChart(datapoint)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"datapoint.__active ? 'eye text-primary' : 'eye-slash text-muted'\"\n ></i>\n </button>\n <div class=\"c8y-datapoint-pill__label c8y-datapoint-pill__btn\">\n <i\n class=\"m-r-4 icon-14\"\n c8yIcon=\"circle\"\n [ngStyle]=\"{\n color: datapoint.color\n }\"\n ></i>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': !datapoint.__active }\"\n >\n <span class=\"text-truncate\">\n {{ datapoint.label }}\n </span>\n <small class=\"text-muted text-10\">\n {{ datapoint.__target.name }}\n </small>\n </span>\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Measurements received for this data point may be out of sync.' | translate\n \"\n container=\"body\"\n *ngIf=\"datapointsOutOfSync.get(datapoint)\"\n [adaptivePosition]=\"false\"\n ></i>\n </div>\n </div>\n <!-- Alarms -->\n\n <ng-container *ngFor=\"let alarm of alarms\">\n <div\n class=\"c8y-alarm-pill flex-no-shrink\"\n title=\"{{ alarm.filters.type }} \"\n *ngIf=\"alarm.__active\"\n >\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Alarm of this type is currently active and outside of the selected time range'\n | translate\n \"\n container=\"body\"\n *ngIf=\"displayConfig?.activeAlarmTypesOutOfRange?.includes(alarm.filters.type)\"\n [adaptivePosition]=\"false\"\n ></i>\n <button\n class=\"c8y-alarm-pill__btn\"\n title=\"{{ alarm.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(alarm)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"alarm.__hidden ? 'eye-slash text-muted' : 'eye text-primary'\"\n ></i>\n </button>\n <button\n class=\"c8y-alarm-pill__label c8y-alarm-pill__btn\"\n (click)=\"toggleMarkedArea(alarm)\"\n [ngClass]=\"{\n active: !isMarkedAreaEnabled && alarm.filters.type === enabledMarkedAreaAlarmType\n }\"\n >\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [style.background-color]=\"alarm.color\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': alarm.__hidden }\"\n >\n <span class=\"text-truncate\">\n {{ alarm.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ alarm.__target.name }}\n </small>\n </span>\n </button>\n </div>\n </ng-container>\n\n <!-- Events -->\n <ng-container *ngFor=\"let event of events\">\n <div\n class=\"c8y-event-pill flex-no-shrink\"\n title=\"{{ event.filters.type }}\"\n *ngIf=\"event.__active\"\n >\n <button\n class=\"c8y-event-pill__btn\"\n title=\"{{ event.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(event)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"event.__hidden ? 'eye-slash text-muted' : 'eye text-primary'\"\n ></i>\n </button>\n <div class=\"c8y-event-pill__label c8y-event-pill__btn\">\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [ngStyle]=\"{ 'background-color': event.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"c8y-events\"\n ></i>\n </span>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': event.__hidden }\"\n >\n <span class=\"text-truncate\">\n {{ event.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ event.__target.name }}\n </small>\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n\n<c8y-charts\n #chart\n [config]=\"displayConfig\"\n [alerts]=\"alerts\"\n (updateAlarmsAndEvents)=\"updateAlarmsAndEvents($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n (datapointOutOfSync)=\"handleDatapointOutOfSync($event)\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (isMarkedAreaEnabled)=\"isMarkedAreaEnabled = $event\"\n></c8y-charts>\n\n<ng-template #legendHelpTemplate>\n <div [innerHTML]=\"legendHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: A11yModule }, { kind: "ngmodule", type: CommonModule$1 }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ChartsComponent, selector: "c8y-charts", inputs: ["config", "alerts"], outputs: ["configChangeOnZoomOut", "timeRangeChangeOnRealtime", "datapointOutOfSync", "updateAlarmsAndEvents", "isMarkedAreaEnabled"] }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5$1.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: BsDropdownModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "ngmodule", type: AlarmsModule }, { kind: "component", type: i8$1.AlarmsFilterComponent, selector: "c8y-alarms-filter", inputs: ["contextSourceId"], outputs: ["onFilterApplied"] }, { kind: "component", type: TimeContextComponent, selector: "c8y-time-context", inputs: ["changedDateContext", "controlsAvailable", "context"], outputs: ["contextChange"] }] }); }
|
|
439
|
+
}
|
|
440
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsGraphWidgetViewComponent, decorators: [{
|
|
441
|
+
type: Component,
|
|
442
|
+
args: [{ selector: 'c8y-datapoints-graph-widget-view', standalone: true, imports: [
|
|
443
|
+
A11yModule,
|
|
444
|
+
CommonModule$1,
|
|
445
|
+
ChartsComponent,
|
|
446
|
+
CoreModule,
|
|
447
|
+
TooltipModule,
|
|
448
|
+
BsDropdownModule,
|
|
449
|
+
PopoverModule,
|
|
450
|
+
AlarmsModule,
|
|
451
|
+
TimeContextComponent
|
|
452
|
+
], providers: [ChartEventsService, ChartAlarmsService], template: "<div class=\"p-l-16 p-r-16\">\n <div class=\"d-flex gap-16 a-i-start\">\n <div\n class=\"btn-group btn-group-sm flex-no-shrink\"\n *ngIf=\"!displayConfig?.widgetInstanceGlobalTimeContext\"\n >\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (displayConfig?.aggregation\n ? AGGREGATION_TEXTS[displayConfig.aggregation]\n : AGGREGATION_TEXTS.undefined\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n displayConfig?.aggregation\n ? AGGREGATION_ICONS[displayConfig.aggregation]\n : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n\n <c8y-time-context\n class=\"d-contents\"\n (contextChange)=\"timePropsChanged($event)\"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: displayConfig?.displayDateSelection,\n interval: displayConfig?.displayDateSelection,\n aggregation: displayConfig?.displayAggregationSelection\n }\"\n ></c8y-time-context>\n </div>\n <c8y-alarms-filter\n class=\"d-contents form-group-sm\"\n *ngIf=\"hasAtLeastOneAlarmActive\"\n (filterApplied)=\"filterSeverity($event)\"\n ></c8y-alarms-filter>\n\n <div class=\"m-l-auto btn-group btn-group-sm flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Save as image' | translate\"\n tooltip=\"{{ 'Save as image' | translate }}\"\n container=\"body\"\n type=\"button\"\n (click)=\"chart.saveAsImage()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"image-file-checked\"\n ></i>\n </button>\n </div>\n </div>\n <div\n class=\"d-flex\"\n style=\"align-items: center\"\n >\n <button\n class=\"btn-help btn-help--sm m-r-8\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"legendHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n <div class=\"inner-scroll\">\n <div class=\"flex-grow p-t-8 d-flex a-i-start gap-8 p-b-4\">\n <div\n class=\"c8y-datapoint-pill flex-no-shrink\"\n title=\"{{ datapoint.label }} - {{ datapoint.__target.name }}\"\n *ngFor=\"let datapoint of displayConfig.datapoints\"\n [ngClass]=\"{ active: datapoint.__active }\"\n >\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'At least 1 active data points must be active.' | translate\"\n container=\"body\"\n *ngIf=\"!hasAtLeastOneDatapointActive && datapoint.__active\"\n [adaptivePosition]=\"false\"\n ></i>\n <button\n class=\"c8y-datapoint-pill__btn\"\n title=\"{{\n (datapoint.__active ? hideDatapointLabel : showDatapointLabel) | translate\n }} \"\n type=\"button\"\n (click)=\"toggleChart(datapoint)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"datapoint.__active ? 'eye text-primary' : 'eye-slash text-muted'\"\n ></i>\n </button>\n <div class=\"c8y-datapoint-pill__label c8y-datapoint-pill__btn\">\n <i\n class=\"m-r-4 icon-14\"\n c8yIcon=\"circle\"\n [ngStyle]=\"{\n color: datapoint.color\n }\"\n ></i>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': !datapoint.__active }\"\n >\n <span class=\"text-truncate\">\n {{ datapoint.label }}\n </span>\n <small class=\"text-muted text-10\">\n {{ datapoint.__target.name }}\n </small>\n </span>\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Measurements received for this data point may be out of sync.' | translate\n \"\n container=\"body\"\n *ngIf=\"datapointsOutOfSync.get(datapoint)\"\n [adaptivePosition]=\"false\"\n ></i>\n </div>\n </div>\n <!-- Alarms -->\n\n <ng-container *ngFor=\"let alarm of alarms\">\n <div\n class=\"c8y-alarm-pill flex-no-shrink\"\n title=\"{{ alarm.filters.type }} \"\n *ngIf=\"alarm.__active\"\n >\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Alarm of this type is currently active and outside of the selected time range'\n | translate\n \"\n container=\"body\"\n *ngIf=\"displayConfig?.activeAlarmTypesOutOfRange?.includes(alarm.filters.type)\"\n [adaptivePosition]=\"false\"\n ></i>\n <button\n class=\"c8y-alarm-pill__btn\"\n title=\"{{ alarm.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(alarm)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"alarm.__hidden ? 'eye-slash text-muted' : 'eye text-primary'\"\n ></i>\n </button>\n <button\n class=\"c8y-alarm-pill__label c8y-alarm-pill__btn\"\n (click)=\"toggleMarkedArea(alarm)\"\n [ngClass]=\"{\n active: !isMarkedAreaEnabled && alarm.filters.type === enabledMarkedAreaAlarmType\n }\"\n >\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [style.background-color]=\"alarm.color\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': alarm.__hidden }\"\n >\n <span class=\"text-truncate\">\n {{ alarm.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ alarm.__target.name }}\n </small>\n </span>\n </button>\n </div>\n </ng-container>\n\n <!-- Events -->\n <ng-container *ngFor=\"let event of events\">\n <div\n class=\"c8y-event-pill flex-no-shrink\"\n title=\"{{ event.filters.type }}\"\n *ngIf=\"event.__active\"\n >\n <button\n class=\"c8y-event-pill__btn\"\n title=\"{{ event.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(event)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"event.__hidden ? 'eye-slash text-muted' : 'eye text-primary'\"\n ></i>\n </button>\n <div class=\"c8y-event-pill__label c8y-event-pill__btn\">\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [ngStyle]=\"{ 'background-color': event.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"c8y-events\"\n ></i>\n </span>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': event.__hidden }\"\n >\n <span class=\"text-truncate\">\n {{ event.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ event.__target.name }}\n </small>\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n\n<c8y-charts\n #chart\n [config]=\"displayConfig\"\n [alerts]=\"alerts\"\n (updateAlarmsAndEvents)=\"updateAlarmsAndEvents($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n (datapointOutOfSync)=\"handleDatapointOutOfSync($event)\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (isMarkedAreaEnabled)=\"isMarkedAreaEnabled = $event\"\n></c8y-charts>\n\n<ng-template #legendHelpTemplate>\n <div [innerHTML]=\"legendHelp\"></div>\n</ng-template>\n" }]
|
|
453
|
+
}], ctorParameters: () => [{ type: i4.FormBuilder }, { type: i2$1.TranslateService }, { type: i2.WidgetTimeContextDateRangeService }, { type: i1.ContextDashboardComponent, decorators: [{
|
|
454
|
+
type: Optional
|
|
455
|
+
}] }], propDecorators: { config: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], chartComponent: [{
|
|
458
|
+
type: ViewChild,
|
|
459
|
+
args: [ChartsComponent]
|
|
460
|
+
}] } });
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Generated bundle index. Do not edit.
|
|
464
|
+
*/
|
|
465
|
+
|
|
466
|
+
export { DatapointsGraphWidgetConfigComponent, DatapointsGraphWidgetViewComponent };
|
|
467
|
+
//# sourceMappingURL=c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map
|