@c8y/ngx-components 1022.21.3 → 1022.26.1
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/asset-properties/asset-properties.model.d.ts +117 -0
- package/asset-properties/asset-properties.model.d.ts.map +1 -0
- package/asset-properties/asset-properties.service.d.ts +72 -0
- package/asset-properties/asset-properties.service.d.ts.map +1 -0
- package/asset-properties/asset-property-list/asset-property-action.directive.d.ts +11 -0
- package/asset-properties/asset-property-list/asset-property-action.directive.d.ts.map +1 -0
- package/asset-properties/asset-property-list/asset-property-icon.pipe.d.ts +11 -0
- package/asset-properties/asset-property-list/asset-property-icon.pipe.d.ts.map +1 -0
- package/asset-properties/asset-property-list/asset-property-list.component.d.ts +195 -0
- package/asset-properties/asset-property-list/asset-property-list.component.d.ts.map +1 -0
- package/asset-properties/asset-property-list/asset-property-value.pipe.d.ts +17 -0
- package/asset-properties/asset-property-list/asset-property-value.pipe.d.ts.map +1 -0
- package/asset-properties/asset-property-list/tree-data-source.d.ts +19 -0
- package/asset-properties/asset-property-list/tree-data-source.d.ts.map +1 -0
- package/asset-properties/asset-property-selector-drawer/asset-property-selector-drawer.component.d.ts +75 -0
- package/asset-properties/asset-property-selector-drawer/asset-property-selector-drawer.component.d.ts.map +1 -0
- package/asset-properties/c8y-ngx-components-asset-properties.d.ts.map +1 -0
- package/asset-properties/index.d.ts +6 -0
- package/asset-properties/index.d.ts.map +1 -0
- package/core/user/user-edit-modal.component.d.ts.map +1 -1
- package/datapoint-explorer/view/datapoint-explorer.component.d.ts +2 -0
- package/datapoint-explorer/view/datapoint-explorer.component.d.ts.map +1 -1
- package/device-provisioned-certificates/device-tab-provisioned-certificates.component.d.ts +8 -2
- package/device-provisioned-certificates/device-tab-provisioned-certificates.component.d.ts.map +1 -1
- package/echart/charts.component.d.ts +1 -1
- package/echart/charts.component.d.ts.map +1 -1
- package/echart/index.d.ts +1 -0
- package/echart/index.d.ts.map +1 -1
- package/echart/models/datapoints-graph-widget.model.d.ts +13 -0
- package/echart/models/datapoints-graph-widget.model.d.ts.map +1 -1
- package/echart/services/chart-helpers.service.d.ts +23 -0
- package/echart/services/chart-helpers.service.d.ts.map +1 -0
- package/echart/services/echarts-options.service.d.ts +1 -1
- package/echart/services/echarts-options.service.d.ts.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-asset-properties.mjs +1573 -0
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +22 -7
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.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-device-provisioned-certificates.mjs +32 -18
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs +14 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +88 -29
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +3 -3
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +6 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +12 -4
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +51 -10
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +1 -1
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +38 -24
- package/locales/es.po +38 -24
- package/locales/fr.po +38 -24
- package/locales/ja_JP.po +37 -24
- package/locales/ko.po +37 -24
- package/locales/locales.pot +43 -12
- package/locales/nl.po +38 -24
- package/locales/pl.po +38 -24
- package/locales/pt_BR.po +38 -24
- package/locales/zh_CN.po +38 -24
- package/locales/zh_TW.po +38 -24
- package/package.json +1 -1
- package/widgets/definitions/html-widget/html-widget-config.factory.d.ts.map +1 -1
- package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts +2 -0
- package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/html-widget/html-widget-properties-selector/html-widget-properties-selector.component.d.ts +17 -0
- package/widgets/implementations/html-widget/html-widget-properties-selector/html-widget-properties-selector.component.d.ts.map +1 -0
- package/widgets/implementations/html-widget/html-widget.model.d.ts +2 -2
- package/widgets/implementations/html-widget/html-widget.model.d.ts.map +1 -1
- package/widgets/implementations/html-widget/index.d.ts +1 -0
- package/widgets/implementations/html-widget/index.d.ts.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-asset-properties.mjs","sources":["../../asset-properties/asset-properties.model.ts","../../asset-properties/asset-properties.service.ts","../../asset-properties/asset-property-list/tree-data-source.ts","../../asset-properties/asset-property-list/asset-property-action.directive.ts","../../asset-properties/asset-property-list/asset-property-value.pipe.ts","../../asset-properties/asset-property-list/asset-property-icon.pipe.ts","../../asset-properties/asset-property-list/asset-property-list.component.ts","../../asset-properties/asset-property-list/asset-property-list.component.html","../../asset-properties/asset-property-selector-drawer/asset-property-selector-drawer.component.ts","../../asset-properties/asset-property-selector-drawer/asset-property-selector-drawer.component.html","../../asset-properties/c8y-ngx-components-asset-properties.ts"],"sourcesContent":["import { gettext } from '@c8y/ngx-components';\n\nexport type AssetPropertyListConfig = {\n /**\n * Flag to enable or disable the search functionality in the asset property list.\n * When enabled, a search input will be displayed to filter properties by their names.\n */\n searchable?: boolean;\n /**\n * The mode of the asset property list describing how the properties are selected.\n * - `single` - only one property can be selected at a time\n * - `multi` - multiple properties can be selected at a time\n * - `none` - no properties can be selected\n */\n selectMode?: 'single' | 'multi' | 'none';\n /**\n * The mode of the asset property list describing how the properties are expanded.\n * - `expandedByDefault` - all properties are expanded by default and collapse button is shown\n * - `collapsedByDefault` - all properties are collapsed by default and expand button is shown\n * - `nonCollapsible` - all properties are expanded all the time and collapse button is hidden\n */\n expansionMode?: 'expandedByDefault' | 'collapsedByDefault' | 'nonCollapsible';\n /**\n * Flag to show or hide the header of the asset property list.\n * Header includes select all checkbox (if applicable) and the title of the list columns.\n */\n showHeader?: boolean;\n /**\n * Flag to show or hide the value of the asset property.\n */\n showValue?: boolean;\n /**\n * Flag to show or hide the key of the asset property.\n * If set to true, the key of the property will be displayed alongside its value.\n */\n showKey?: boolean;\n /**\n * Defines what should be displayed when asset is not selected and there are no properties to show.\n * - `empty` - empty state with a message\n * - `default-properties` - default properties are shown (like ID, name, type, etc.)\n */\n emptyStateContent?: 'empty' | 'default-properties';\n /**\n * Asset property list allows to provide custom properties as an input.\n * This flag defines how the input properties are handled.\n * - `merge` - input properties are merged with properties from asset list\n * - `override` - input properties override properties from asset list, meaning that only input properties are shown\n */\n inputPropertiesHandle?: 'merge' | 'override';\n};\n\nexport const defaultAssetPropertyListConfig: AssetPropertyListConfig = {\n searchable: true,\n selectMode: 'none',\n expansionMode: 'expandedByDefault',\n showHeader: true,\n showValue: true,\n showKey: true,\n emptyStateContent: 'empty',\n inputPropertiesHandle: 'merge'\n};\n\nexport const defaultAssetProperties: Array<BaseProperty> = [\n {\n c8y_JsonSchema: { properties: { name: { type: 'string', label: 'Name' } } },\n name: 'name',\n label: 'Name',\n type: 'string',\n active: true,\n isEditable: true,\n isStandardProperty: true\n },\n {\n c8y_JsonSchema: { properties: { id: { type: 'string', label: 'ID' } } },\n name: 'id',\n label: 'ID',\n type: 'string',\n active: true,\n isEditable: false,\n isStandardProperty: true\n },\n {\n c8y_JsonSchema: {\n properties: { type: { type: 'string', label: 'Type' } }\n },\n name: 'type',\n label: 'Type',\n type: 'string',\n active: true,\n isEditable: false,\n isStandardProperty: true\n },\n {\n c8y_JsonSchema: {\n properties: { owner: { type: 'string', label: 'Owner' } }\n },\n name: 'owner',\n label: 'Owner',\n type: 'string',\n isEditable: false,\n isStandardProperty: true\n },\n {\n c8y_JsonSchema: {\n properties: { lastUpdated: { type: 'string', label: 'Last updated' } }\n },\n name: 'lastUpdated',\n label: 'Last updated',\n type: 'string',\n isEditable: false,\n isStandardProperty: true\n }\n];\n\nexport const deviceAssetProperties: Array<BaseProperty> = [\n {\n label: 'Active alarms status',\n type: 'object',\n isEditable: false,\n isStandardProperty: true,\n name: 'c8y_ActiveAlarmsStatus',\n c8y_JsonSchema: {\n properties: {\n c8y_ActiveAlarmsStatus: {\n key: 'c8y_ActiveAlarmsStatus',\n type: 'object',\n label: 'Active alarms status',\n properties: {\n critical: {\n title: 'Critical',\n type: 'number'\n },\n major: {\n title: 'Major',\n type: 'number'\n },\n minor: {\n title: 'Minor',\n type: 'number'\n },\n warning: {\n title: 'Warning',\n type: 'number'\n }\n }\n }\n }\n }\n },\n {\n label: 'Address',\n type: 'object',\n isEditable: true,\n isStandardProperty: true,\n name: 'c8y_Address',\n c8y_JsonSchema: {\n properties: {\n c8y_Address: {\n key: 'c8y_Address',\n type: 'object',\n label: 'Address',\n properties: {\n street: {\n title: 'Street',\n type: 'string'\n },\n city: {\n title: 'City',\n type: 'string'\n },\n cityCode: {\n title: 'City code',\n type: 'string'\n },\n territory: {\n title: 'Territory',\n type: 'string'\n },\n region: {\n title: 'Region',\n type: 'string'\n },\n country: {\n title: 'Country',\n type: 'string'\n }\n }\n }\n }\n }\n },\n {\n label: 'Agent',\n type: 'object',\n isEditable: true,\n isStandardProperty: true,\n name: 'c8y_Agent',\n c8y_JsonSchema: {\n properties: {\n c8y_Agent: {\n key: 'c8y_Agent',\n type: 'object',\n label: 'Agent',\n properties: {\n name: {\n title: 'Name',\n type: 'string'\n },\n version: {\n title: 'Version',\n type: 'string'\n },\n url: {\n title: 'URL',\n type: 'string'\n },\n maintainer: {\n title: 'Maintainer',\n type: 'string'\n }\n }\n }\n }\n }\n },\n {\n label: 'Availability',\n type: 'object',\n isEditable: false,\n isStandardProperty: true,\n name: 'c8y_Availability',\n c8y_JsonSchema: {\n properties: {\n c8y_Availability: {\n key: 'c8y_Availability',\n type: 'object',\n label: 'Availability',\n properties: {\n status: {\n title: 'Status',\n type: 'string'\n },\n lastMessage: {\n title: 'Last message',\n type: 'string',\n printFormat: 'datetime'\n }\n }\n }\n }\n }\n },\n {\n label: 'Connection',\n type: 'object',\n isEditable: false,\n isStandardProperty: true,\n name: 'c8y_Connection',\n c8y_JsonSchema: {\n properties: {\n c8y_Connection: {\n key: 'c8y_Connection',\n type: 'object',\n label: 'Connection',\n properties: {\n status: {\n title: 'Status',\n type: 'string'\n }\n }\n }\n }\n }\n },\n {\n label: 'Communication mode',\n type: 'object',\n isEditable: true,\n isStandardProperty: true,\n name: 'c8y_CommunicationMode',\n c8y_JsonSchema: {\n properties: {\n c8y_CommunicationMode: {\n key: 'c8y_CommunicationMode',\n type: 'object',\n label: 'Communication mode',\n properties: {\n mode: {\n title: 'Mode',\n type: 'string'\n }\n }\n }\n }\n }\n },\n {\n label: 'Firmware',\n type: 'object',\n isEditable: false,\n isStandardProperty: true,\n name: 'c8y_Firmware',\n c8y_JsonSchema: {\n properties: {\n c8y_Firmware: {\n key: 'c8y_Firmware',\n type: 'object',\n label: 'Firmware',\n properties: {\n moduleVersion: {\n title: 'Module version',\n type: 'string'\n },\n name: {\n title: 'Name',\n type: 'string'\n },\n version: {\n title: 'Version',\n type: 'string'\n },\n url: {\n title: 'URL',\n type: ['string', 'null']\n }\n }\n }\n }\n }\n },\n {\n label: 'Hardware',\n type: 'object',\n isEditable: true,\n isStandardProperty: true,\n name: 'c8y_Hardware',\n c8y_JsonSchema: {\n properties: {\n c8y_Hardware: {\n key: 'c8y_Hardware',\n type: 'object',\n label: 'Hardware',\n properties: {\n model: {\n title: 'Model',\n type: 'string'\n },\n serialNumber: {\n title: 'Serial number',\n type: 'string'\n },\n revision: {\n title: 'Revision',\n type: 'string'\n }\n }\n }\n }\n }\n },\n {\n label: 'LPWAN device',\n type: 'object',\n isEditable: false,\n isStandardProperty: true,\n name: 'c8y_LpwanDevice',\n c8y_JsonSchema: {\n properties: {\n c8y_LpwanDevice: {\n key: 'c8y_LpwanDevice',\n type: 'object',\n label: 'LPWAN device',\n properties: {\n provisioned: {\n title: 'Provisioned',\n type: 'boolean'\n }\n }\n }\n }\n }\n },\n {\n label: 'Mobile',\n type: 'object',\n isEditable: true,\n isStandardProperty: true,\n name: 'c8y_Mobile',\n c8y_JsonSchema: {\n properties: {\n c8y_Mobile: {\n key: 'c8y_Mobile',\n type: 'object',\n label: 'Mobile',\n properties: {\n cellId: {\n title: 'Cell ID',\n type: ['string', 'null']\n },\n connType: {\n title: 'Connection type',\n type: 'string',\n readOnly: true\n },\n currentOperator: {\n title: 'Current operator',\n type: 'string',\n readOnly: true\n },\n currentBand: {\n title: 'Current band',\n type: 'string',\n readOnly: true\n },\n ecn0: {\n title: 'ECN0',\n type: 'string',\n readOnly: true\n },\n iccid: {\n title: 'ICCID',\n type: ['string', 'null']\n },\n imei: {\n title: 'IMEI',\n type: ['string', 'null']\n },\n imsi: {\n title: 'IMSI',\n type: ['string', 'null']\n },\n lac: {\n title: 'LAC',\n type: ['string', 'null']\n },\n mcc: {\n title: 'MCC',\n type: ['string', 'null']\n },\n mnc: {\n title: 'MNC',\n type: ['string', 'null']\n },\n msisdn: {\n title: 'MSISDN',\n type: 'string'\n },\n rcsp: {\n title: 'RCSP',\n type: 'string',\n readOnly: true\n },\n rscp: {\n title: 'RSCP',\n type: 'string',\n readOnly: true\n },\n rsrp: {\n title: 'RSRP',\n type: 'string',\n readOnly: true\n },\n rsrq: {\n title: 'RSRQ',\n type: 'string',\n readOnly: true\n },\n rssi: {\n title: 'RSSI',\n type: 'string',\n readOnly: true\n }\n }\n }\n }\n }\n },\n {\n name: 'c8y_Notes',\n label: 'Notes',\n type: 'string',\n isEditable: true,\n isStandardProperty: true,\n c8y_JsonSchema: {\n properties: {\n c8y_Notes: {\n type: 'string',\n label: 'Notes',\n 'x-schema-form': {\n type: 'textarea'\n }\n }\n }\n }\n },\n {\n label: 'Position',\n type: 'object',\n isEditable: true,\n isStandardProperty: true,\n name: 'c8y_Position',\n c8y_JsonSchema: {\n properties: {\n c8y_Position: {\n key: 'c8y_Position',\n type: 'object',\n label: 'Position',\n properties: {\n lat: {\n title: 'Latitude',\n type: 'number'\n },\n lng: {\n title: 'Longitude',\n type: 'number'\n },\n alt: {\n title: 'Altitude',\n type: 'number'\n }\n }\n }\n }\n }\n },\n {\n label: 'Required availability',\n type: 'object',\n isEditable: true,\n isStandardProperty: true,\n name: 'c8y_RequiredAvailability',\n c8y_JsonSchema: {\n properties: {\n c8y_RequiredAvailability: {\n key: 'c8y_RequiredAvailability',\n type: 'object',\n label: 'Required availability',\n properties: {\n responseInterval: {\n title: 'Response interval',\n description:\n 'Takes a value between -32768 and 32767 minutes (a negative value indicates that the device is under maintenance).',\n type: 'integer',\n minimum: -32768,\n maximum: 32767\n }\n }\n }\n }\n }\n },\n {\n label: 'Software',\n type: 'object',\n isEditable: false,\n isStandardProperty: true,\n name: 'c8y_Software',\n c8y_JsonSchema: {\n properties: {\n c8y_Software: {\n key: 'c8y_Software',\n type: 'object',\n label: 'Software',\n properties: {\n name: {\n title: 'Name',\n type: 'string'\n },\n version: {\n title: 'Version',\n type: 'string'\n },\n url: {\n title: 'URL',\n type: ['string', 'null']\n }\n }\n }\n }\n }\n },\n {\n label: 'Network',\n type: 'object',\n isEditable: true,\n isStandardProperty: true,\n name: 'c8y_Network',\n c8y_JsonSchema: {\n properties: {\n c8y_Network: {\n key: 'c8y_Network',\n type: 'object',\n label: 'Network',\n properties: {\n c8y_DHCP: {\n title: 'DHCP',\n type: 'object',\n printFormat: 'hidden',\n name: 'c8y_DHCP',\n properties: {\n addressRange: {\n title: 'Address range',\n type: 'object',\n name: 'addressRange',\n printFormat: 'hidden',\n properties: {\n start: {\n title: 'Start',\n type: 'string'\n },\n end: {\n title: 'End',\n type: 'string'\n }\n }\n },\n dns1: {\n title: 'DNS 1',\n type: 'string'\n },\n dns2: {\n title: 'DNS 2',\n type: 'string'\n },\n enabled: {\n title: 'Enabled',\n type: 'integer'\n }\n }\n },\n c8y_LAN: {\n title: 'LAN',\n type: 'object',\n name: 'c8y_LAN',\n printFormat: 'hidden',\n properties: {\n enabled: {\n title: 'Enabled',\n type: 'integer'\n },\n ip: {\n title: 'IP',\n type: 'string'\n },\n mac: {\n title: 'MAC',\n type: 'string'\n },\n name: {\n title: 'Name',\n type: 'string'\n },\n netmask: {\n title: 'Netmask',\n type: 'string'\n }\n }\n },\n c8y_WAN: {\n title: 'WAN',\n type: 'object',\n name: 'c8y_WAN',\n printFormat: 'hidden',\n properties: {\n apn: {\n title: 'APN',\n type: 'string'\n },\n authType: {\n title: 'Auth type',\n type: 'string'\n },\n ip: {\n title: 'IP',\n type: 'string'\n },\n password: {\n title: 'Password',\n type: 'string'\n },\n simStatus: {\n title: 'SIM status',\n type: 'string'\n },\n username: {\n title: 'Username',\n type: 'string'\n }\n }\n }\n }\n }\n }\n }\n }\n];\n\nexport const RESULT_TYPES = {\n VALUE: { name: 'VALUE', value: 1, label: gettext('Only value') },\n VALUE_UNIT: { name: 'VALUE_UNIT', value: 2, label: gettext('Value and unit') },\n VALUE_UNIT_TIME: { name: 'VALUE_UNIT_TIME', value: 3, label: gettext('Value, unit and time') }\n};\ntype C8yPropertyType =\n | 'string'\n | 'number'\n | 'integer'\n | 'boolean'\n | 'object'\n | 'array'\n | 'null'\n | ['string', 'null']\n | Array<C8yPropertyType>;\n\ntype C8yPropertyFormat = 'datetime' | 'hidden' | 'textarea';\n\nexport interface C8yJsonSchemaProperty {\n type: C8yPropertyType;\n title?: string;\n label?: string;\n description?: string;\n key?: string;\n name?: string;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n required?: boolean;\n readOnly?: boolean;\n printFormat?: C8yPropertyFormat;\n 'x-schema-form'?: {\n type: string;\n };\n properties?: Record<string, C8yJsonSchemaProperty>;\n items?: C8yJsonSchemaProperty;\n 'x-show-if-any-available'?: { contextPath: string }[];\n [key: string]: any;\n}\n\nexport interface C8yJsonSchema {\n properties: Record<string, C8yJsonSchemaProperty>;\n required?: string[];\n}\n\nexport interface BaseProperty {\n name: string;\n label: string;\n type: C8yPropertyType;\n isEditable?: boolean;\n isStandardProperty?: boolean;\n c8y_JsonSchema?: C8yJsonSchema;\n active?: boolean;\n [key: string]: any;\n}\n\nexport interface NestedPropertyFields extends BaseProperty {\n title?: string;\n properties?: object;\n keyPath: string[];\n}\n\nexport type AssetPropertyType = BaseProperty | NestedPropertyFields;\n","import { inject, Injectable } from '@angular/core';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { AssetTypesRealtimeService, GroupService } from '@c8y/ngx-components';\nimport { isObjectLike, isEmpty, forOwn, isArray, find } from 'lodash-es';\nimport { firstValueFrom } from 'rxjs';\nimport { AssetPropertyType, C8yJsonSchemaProperty } from './asset-properties.model';\n/**\n * Service for managing asset properties.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AssetPropertiesService {\n private readonly FRAGMENTS_TO_OMIT = [\n 'additionParents',\n 'assetParents',\n 'deviceParents',\n 'childAdditions',\n 'childAssets',\n 'childDevices',\n 'c8y_IsDevice',\n '__children',\n 'c8y_ui',\n 'self',\n 'parent',\n 'c8y_DataPoint',\n 'c8y_Kpi_Migrated',\n /^c8y_Dashboard!\\d+/\n ];\n\n private inventoryService = inject(InventoryService);\n private assetTypesRealtimeService = inject(AssetTypesRealtimeService);\n private groupService = inject(GroupService);\n\n /**\n * Retrieves custom properties for an asset from asset library.\n * @param asset The asset for which to retrieve custom properties.\n * @returns A promise resolving to the list of custom properties.\n */\n async getCustomProperties(asset: IManagedObject): Promise<IManagedObject[]> {\n if (asset && asset.type) {\n const assetType = await firstValueFrom(\n this.assetTypesRealtimeService.getAssetTypeByName$(asset.type)\n );\n if (assetType) {\n const { data } = await this.inventoryService.childAdditionsList(assetType, {\n pageSize: 2000,\n query: \"$filter=(has('c8y_IsAssetProperty'))\"\n });\n return data;\n }\n }\n return [];\n }\n\n /**\n * Retrieves the initial set of properties for an asset, based on its type.\n * @param asset The asset for which to retrieve properties.\n * @returns A promise resolving to the list of initial properties.\n */\n async getInitialProperties(asset: IManagedObject): Promise<AssetPropertyType[]> {\n if (!asset) {\n return [];\n } else if (this.groupService.isDevice(asset)) {\n return await this.getDeviceProperties(asset);\n } else if (this.groupService.isGroup(asset) && !this.groupService.isAsset(asset)) {\n return await this.getGroupProperties(asset);\n } else if (this.groupService.isAsset(asset)) {\n return await this.getAssetProperties(asset);\n }\n return [];\n }\n\n /**\n * Retrieves properties for a device asset.\n * @param asset The device asset for which to retrieve properties.\n * @returns A promise resolving to the list of device properties.\n */\n async getDeviceProperties(asset: IManagedObject): Promise<AssetPropertyType[]> {\n return this.getManagedObjectProperties(asset);\n }\n\n /**\n * Retrieves properties for a group asset.\n * @param asset The group asset for which to retrieve properties.\n * @returns A promise resolving to the list of group properties.\n */\n async getGroupProperties(asset: IManagedObject): Promise<AssetPropertyType[]> {\n return this.getManagedObjectProperties(asset);\n }\n\n /**\n * Retrieves properties for a regular asset.\n * @param asset The asset for which to retrieve properties.\n * @returns A promise resolving to the list of asset properties.\n */\n async getAssetProperties(asset: IManagedObject): Promise<AssetPropertyType[]> {\n const customProperties =\n this.categorizeCustomProperties(await this.getCustomProperties(asset)) || [];\n return customProperties;\n }\n\n /**\n * Categorizes custom properties into simple and complex types.\n * @param properties The custom properties to categorize.\n * @returns The categorized custom properties.\n */\n categorizeCustomProperties(properties: IManagedObject[]): AssetPropertyType[] {\n const { simple, complex } = properties.reduce(\n (acc, property) => {\n const schema = property.c8y_JsonSchema.properties[property.name];\n if (schema.type === 'object') {\n acc.complex.push(property);\n } else {\n acc.simple.push(property);\n }\n return acc;\n },\n { simple: [], complex: [] }\n );\n\n return [...simple, ...complex] as AssetPropertyType[];\n }\n\n /**\n * Categorizes and flattens hierarchical properties into simple and complex types.\n * @param properties The hierarchical properties to categorize and flatten.\n * @returns The categorized and flattened properties.\n */\n categorizeAndFlattenHierarchicalProperties(properties: AssetPropertyType[]): {\n simple: AssetPropertyType[];\n complex: AssetPropertyType[];\n } {\n const sortedProperties = [...properties].sort((a, b) => {\n const aLabel = (a.label || a.name || '').toLowerCase();\n const bLabel = (b.label || b.name || '').toLowerCase();\n return aLabel.localeCompare(bLabel);\n });\n const result = sortedProperties.reduce(\n (acc, property) => {\n property.active = false;\n if (this.isComplexProperty(property)) {\n acc.complex.push(property);\n this.addNestedProperties(property, acc.complex, true);\n } else {\n acc.simple.push(property);\n }\n return acc;\n },\n { simple: [], complex: [] }\n );\n return result;\n }\n\n /**\n * Checks if a property is complex (i.e., has nested properties).\n * @param property The property to check.\n * @returns True if the property is complex, false otherwise.\n */\n isComplexProperty(property: AssetPropertyType): boolean {\n return (\n property.c8y_JsonSchema?.properties[property.name]?.type === 'object' ||\n property.properties !== undefined\n );\n }\n\n private addNestedProperties(\n parentProperty: AssetPropertyType,\n complexProperties: AssetPropertyType[],\n sortChildren = false\n ): void {\n const schema = parentProperty.c8y_JsonSchema?.properties[parentProperty.name];\n if (!schema?.properties) {\n return;\n }\n this.flattenProperties(schema, complexProperties, parentProperty.name, [], sortChildren);\n }\n\n private flattenProperties(\n schema: C8yJsonSchemaProperty,\n result: AssetPropertyType[],\n parentName: string,\n parentPath: string[] = [],\n sortChildren = false\n ): void {\n const properties = schema.properties?.[parentName]?.properties || schema.properties;\n let entries = Object.entries(properties);\n if (sortChildren) {\n entries = entries.sort((a, b) => {\n const aLabel = (a[1].title || a[1].label || a[1].name || a[0] || '').toLowerCase();\n const bLabel = (b[1].title || b[1].label || b[1].name || b[0] || '').toLowerCase();\n return aLabel.localeCompare(bLabel);\n });\n }\n entries.forEach(([key, property]) => {\n const path = parentPath.includes(parentName) ? parentPath : [...parentPath, parentName];\n result.push({ ...property, keyPath: [...path, key] } as AssetPropertyType);\n if (property.properties) {\n this.flattenProperties(\n { properties: { [key]: property } } as C8yJsonSchemaProperty,\n result,\n key,\n [...path, key],\n sortChildren\n );\n }\n });\n }\n\n private getManagedObjectProperties(asset: IManagedObject): AssetPropertyType[] {\n return this.extractFragments(asset);\n }\n\n private extractFragments(object: IManagedObject): AssetPropertyType[] {\n const properties = [];\n for (const [key, value] of Object.entries(object)) {\n if (\n this.shouldSkipFragment(key) ||\n isArray(value) ||\n (isObjectLike(value) && isEmpty(value))\n ) {\n continue;\n }\n const newProp = {\n label: key,\n name: key,\n type: isObjectLike(value) ? 'object' : 'string',\n isEditable: true,\n c8y_JsonSchema: {\n properties: {\n [key]: {\n key: key,\n type: isObjectLike(value) ? 'object' : 'string',\n label: key,\n properties: {}\n }\n }\n }\n };\n\n if (isObjectLike(value)) {\n this.addPropertyItem(newProp.c8y_JsonSchema.properties[key].properties, value);\n }\n\n properties.push(newProp);\n }\n\n return properties;\n }\n\n private shouldSkipFragment(key: string): boolean {\n return !!find(this.FRAGMENTS_TO_OMIT, (fragmentToOmit: string | RegExp) => {\n if (fragmentToOmit instanceof RegExp) {\n return fragmentToOmit.test(key);\n }\n return fragmentToOmit === key;\n });\n }\n\n private addPropertyItem(properties, object) {\n if (!properties) {\n return;\n }\n forOwn(object, (value, key) => {\n properties[key] = { title: key, type: value ? typeof value : 'string' };\n if (isObjectLike(value)) {\n properties[key].type = 'object';\n this.addPropertyItem(properties[key]['properties'], value);\n }\n });\n }\n}\n","import { DataSource } from '@angular/cdk/collections';\nimport { AssetPropertyType } from '../asset-properties.model';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport interface AssetPropertyFlatNode {\n expandable: boolean;\n level: number;\n property: AssetPropertyType;\n isVisible: boolean;\n indeterminate?: boolean;\n}\n\nexport class FlatTreeDataSource extends DataSource<AssetPropertyFlatNode> {\n private _dataChange = new BehaviorSubject<AssetPropertyFlatNode[]>([]);\n\n constructor() {\n super();\n }\n\n get data(): AssetPropertyFlatNode[] {\n return this._dataChange.value;\n }\n\n set data(value: AssetPropertyFlatNode[]) {\n this._dataChange.next(value);\n }\n\n connect(): Observable<AssetPropertyFlatNode[]> {\n return this._dataChange.asObservable();\n }\n\n disconnect(): void {\n // No need to unsubscribe from the _dataChange subject since it's a BehaviorSubject\n }\n}\n","import { Directive, ElementRef, TemplateRef, ViewContainerRef } from '@angular/core';\n\n@Directive({\n selector: '[c8yAssetPropertyAction]',\n standalone: true\n})\nexport class AssetPropertyActionDirective {\n constructor(\n public template: TemplateRef<unknown>,\n public elementRef: ElementRef,\n public viewContainer: ViewContainerRef\n ) {}\n}\n","import { inject, Pipe } from '@angular/core';\nimport { AssetPropertyType } from '../asset-properties.model';\nimport { IManagedObject } from '@c8y/client';\nimport { AssetPropertiesService } from '../asset-properties.service';\nimport { get } from 'lodash-es';\n\n/**\n * Formats the value of an asset property.\n * If the property is complex, it will be stringified.\n * If the property has a keyPath, it will be used to retrieve the value from the asset.\n * Otherwise, the value will be taken directly from the asset.\n * If the value is null or undefined, a dash ('-') will be returned.\n */\n@Pipe({\n name: 'c8yAssetPropertyValue',\n standalone: true\n})\nexport class AssetPropertyValuePipe {\n private assetPropertiesService = inject(AssetPropertiesService);\n\n transform(property: AssetPropertyType, asset: IManagedObject): string {\n if (!property) {\n return '-';\n }\n let value: string;\n if (this.assetPropertiesService.isComplexProperty(property)) {\n value = JSON.stringify(asset[property.name]);\n } else if ('keyPath' in property) {\n value = get(asset, property.keyPath);\n } else {\n value = asset[property.name];\n }\n return value ?? '-';\n }\n}\n","import { Pipe } from '@angular/core';\n\n/**\n * Pipe to transform asset property types into icon names.\n * Maps various property types to corresponding icon names.\n */\n@Pipe({\n name: 'c8yAssetPropertyIcon',\n standalone: true\n})\nexport class AssetPropertyIconPipe {\n transform(type: string): string {\n switch (type) {\n case 'string':\n return 'paragraph';\n case 'number':\n return 'hashtag';\n case 'boolean':\n return 'true-false';\n case 'date':\n return 'calendar';\n case 'object':\n case 'c8y_JsonSchema':\n return 'open-parcel';\n case 'enum':\n return 'content';\n case 'file':\n return 'file';\n default:\n return 'window-minimize';\n }\n }\n}\n","import { NgClass, NgIf, NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n ContentChild,\n EventEmitter,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n effect,\n viewChild\n} from '@angular/core';\nimport {\n AssetPropertyListConfig,\n AssetPropertyType,\n defaultAssetProperties,\n defaultAssetPropertyListConfig,\n NestedPropertyFields\n} from '../asset-properties.model';\nimport { AssetPropertiesService } from '../asset-properties.service';\nimport {\n C8yTranslatePipe,\n EmptyStateComponent,\n gettext,\n IconDirective,\n ListGroupModule\n} from '@c8y/ngx-components';\nimport { FormsModule } from '@angular/forms';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { IManagedObject } from '@c8y/client';\nimport { BehaviorSubject, debounceTime, Subject, takeUntil } from 'rxjs';\nimport { CdkTree, CdkTreeModule } from '@angular/cdk/tree';\nimport { AssetPropertyFlatNode, FlatTreeDataSource } from './tree-data-source';\nimport { AssetPropertyActionDirective } from './asset-property-action.directive';\nimport { AssetPropertyValuePipe } from './asset-property-value.pipe';\nimport { AssetPropertyIconPipe } from './asset-property-icon.pipe';\n\n/**\n * Represents a list of asset properties with hierarchical tree structure.\n */\n@Component({\n selector: 'c8y-asset-property-list',\n templateUrl: './asset-property-list.component.html',\n standalone: true,\n imports: [\n NgIf,\n NgClass,\n FormsModule,\n ListGroupModule,\n C8yTranslatePipe,\n TooltipModule,\n IconDirective,\n CdkTreeModule,\n NgTemplateOutlet,\n AssetPropertyValuePipe,\n EmptyStateComponent,\n AssetPropertyIconPipe\n ]\n})\nexport class AssetPropertyListComponent implements OnInit, OnChanges, OnDestroy {\n /**\n * Reference to the CDdk tree component.\n */\n tree = viewChild<CdkTree<AssetPropertyFlatNode>>('tree');\n /**\n * Configuration for the asset property list.\n */\n @Input() config: AssetPropertyListConfig = {};\n /**\n * Managed object representing the asset.\n */\n @Input() asset!: IManagedObject;\n /**\n * Custom properties to be displayed in the list.\n */\n @Input() customProperties: AssetPropertyType[] = [];\n /**\n * Emits the selected properties.\n */\n @Output() selectedProperties = new EventEmitter<AssetPropertyType[]>();\n /**\n * List of all properties.\n */\n properties: AssetPropertyType[] = [];\n /**\n * Text input for searching properties.\n */\n inputText = '';\n /**\n * Data source for the tree structure.\n */\n dataSource = new FlatTreeDataSource();\n /**\n * Map of flat nodes for quick lookup.\n */\n flatNodeMap = new Map<string, AssetPropertyFlatNode>();\n /**\n * Indicates if all nodes are selected.\n */\n allSelected = false;\n /**\n * Indicates if the selection state is indeterminate.\n */\n indeterminate = false;\n /**\n * Directive for asset property actions.\n */\n @ContentChild(AssetPropertyActionDirective)\n assetPropertyAction: AssetPropertyActionDirective;\n /**\n * Subject for handling search input.\n */\n private searchSubject$ = new BehaviorSubject<string>('');\n /**\n * Subject for handling component destruction.\n */\n private destroy$ = new Subject<void>();\n /**\n * Service for managing asset properties.\n */\n private assetPropertiesService = inject(AssetPropertiesService);\n /**\n * Constructor initializes reactive effects for expansion modes.\n */\n constructor() {\n effect(() => {\n if (\n (this.config.expansionMode === 'nonCollapsible' ||\n this.config.expansionMode === 'expandedByDefault') &&\n this.tree()\n ) {\n queueMicrotask(() => {\n this.expandAllNodes();\n });\n }\n });\n }\n\n ngOnInit() {\n this.config = {\n ...defaultAssetPropertyListConfig,\n ...this.config\n };\n this.searchSubject$\n .pipe(takeUntil(this.destroy$), debounceTime(200))\n .subscribe(() => this.filterTree());\n }\n\n async ngOnChanges() {\n await this.updateProperties();\n }\n\n ngAfterViewInit() {\n if (this.config.selectMode === 'single') {\n this.selectedProperties.next([]);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Fetches and categorizes properties.\n * @returns A promise resolving to the list of asset properties.\n */\n async getProperties(): Promise<AssetPropertyType[]> {\n if (this.asset) {\n return this.categorizeAndFlattenHierarchicalProperties(\n await this.assetPropertiesService.getInitialProperties(this.asset)\n );\n } else {\n if (this.config?.emptyStateContent === 'default-properties') {\n return this.categorizeAndFlattenHierarchicalProperties(defaultAssetProperties);\n } else if (Array.isArray(this.config?.emptyStateContent)) {\n return this.config.emptyStateContent;\n }\n }\n return [];\n }\n\n /**\n * Checks if a node has children.\n * @param node The node to check.\n * @returns True if the node has children.\n */\n hasChild(node: AssetPropertyFlatNode): boolean {\n return node.expandable;\n }\n\n /**\n * Gets the level of a node.\n * @param node The node to check.\n * @returns The level of the node.\n */\n getLevel(node: AssetPropertyFlatNode): number {\n return node.level;\n }\n\n /**\n * Gets the parent node of a given node.\n * @param node The node to check.\n * @returns The parent node or null if none exists.\n */\n getParentNode(node: AssetPropertyFlatNode): AssetPropertyFlatNode | null {\n const keyPath = (node.property as NestedPropertyFields).keyPath;\n\n if (!keyPath || keyPath.length <= 1) {\n return null;\n }\n\n const parentPath = keyPath.slice(0, -1).join('.');\n return this.flatNodeMap.get(parentPath) || null;\n }\n\n /**\n * Determines if a node should be rendered.\n * @param node The node to check.\n * @returns True if the node should be rendered.\n */\n shouldRender(node: AssetPropertyFlatNode): boolean {\n // Always render root nodes\n if (node.level === 0) {\n return true;\n }\n\n // For non-root nodes, check if parent is expanded\n let parent = this.getParentNode(node);\n while (parent) {\n if (!this.tree()?.isExpanded(parent)) {\n return false;\n }\n parent = this.getParentNode(parent);\n }\n return true;\n }\n\n /**\n * Selects or deselects all nodes.\n * @param selected True to select all, false to deselect.\n */\n selectAll(selected: boolean): void {\n this.allSelected = selected;\n this.indeterminate = false;\n\n const visibleNodes = this.dataSource.data.filter(node => node.isVisible);\n\n visibleNodes.forEach(node => {\n node.property.active = selected;\n });\n\n const selectedProperties = this.dataSource.data\n .filter(n => n.property.active)\n .map(n => n.property);\n\n this.selectedProperties.next(selectedProperties);\n }\n\n /**\n * Handles single selection mode.\n * @param selected True if the node is selected.\n * @param node The node to select.\n */\n onSelectSingle(selected: boolean, node: AssetPropertyFlatNode): void {\n this.dataSource.data.forEach(n => {\n n.property.active = false;\n });\n\n node.property.active = selected;\n\n if (selected && node.expandable && this.tree() && !this.tree().isExpanded(node)) {\n this.tree().expand(node);\n }\n\n this.selectedProperties.next([node.property]);\n }\n\n /**\n * Handles multi-selection mode.\n * @param selected True if the node is selected.\n * @param node The node to select.\n */\n onSelectMulti(selected: boolean, node: AssetPropertyFlatNode): void {\n node.property.active = selected;\n\n if (selected && node.expandable && this.tree() && !this.tree().isExpanded(node)) {\n this.tree().expand(node);\n }\n\n if (node.expandable) {\n this.updateChildSelectionStatus(node, selected);\n }\n\n this.updateSelectAllState();\n\n const selectedProperties = this.dataSource.data\n .filter(n => n.property.active)\n .map(n => n.property);\n\n this.selectedProperties.next(selectedProperties);\n }\n\n /**\n * Initiates a search operation.\n */\n onSearch(): void {\n this.searchSubject$.next(this.inputText);\n }\n\n /**\n * Clears the search input.\n */\n clearSearch(): void {\n this.inputText = '';\n this.onSearch();\n }\n\n collapseButtonTitle(node: AssetPropertyFlatNode): string {\n const expanded = this.tree().isExpanded(node);\n return expanded\n ? gettext('Collapse {{ assetPropertyLabel }}')\n : gettext('Expand {{ assetPropertyLabel }}');\n }\n\n /**\n * Updates the list of properties based on the configuration.\n */\n private async updateProperties() {\n if (this.config.inputPropertiesHandle === 'merge' || !this.config.inputPropertiesHandle) {\n this.properties = [...this.customProperties, ...(await this.getProperties())];\n } else if (this.config.inputPropertiesHandle === 'override') {\n this.properties = [...this.customProperties];\n }\n\n this.buildTreeNodes();\n }\n\n /**\n * Updates the selection status of child nodes.\n * @param parent The parent node.\n * @param selected True if the parent is selected.\n */\n private updateChildSelectionStatus(parent: AssetPropertyFlatNode, selected: boolean): void {\n if (!parent.expandable) return;\n\n const parentKey =\n (parent.property as NestedPropertyFields).keyPath?.join('.') || parent.property.name;\n\n this.dataSource.data.forEach(node => {\n const nodePath = (node.property as NestedPropertyFields).keyPath;\n if (nodePath && nodePath.join('.').startsWith(parentKey) && node !== parent) {\n node.property.active = selected;\n }\n });\n }\n\n /**\n * Checks if a property matches the search criteria.\n * @param property The property to check.\n * @param search The search text.\n * @returns True if the property matches.\n */\n private matchesSearch(property: AssetPropertyType, search: string): boolean {\n const searchableFields = [\n property.label,\n property.name,\n (property as NestedPropertyFields).keyPath?.join('.'),\n (property as NestedPropertyFields).title\n ].filter(Boolean);\n\n return searchableFields.some(field => field?.toLowerCase().includes(search));\n }\n\n /**\n * Updates the selection state for all nodes.\n */\n private updateSelectAllState(): void {\n if (this.config.selectMode !== 'multi') return;\n\n const visibleNodes = this.dataSource.data.filter(node => node.isVisible);\n\n const totalCount = visibleNodes.length;\n const selectedCount = visibleNodes.filter(node => node.property.active).length;\n\n this.allSelected = totalCount > 0 && selectedCount === totalCount;\n this.indeterminate = selectedCount > 0 && selectedCount < totalCount;\n\n // Update indeterminate state for each complex node\n this.updateIndeterminateStates();\n }\n\n /**\n * Builds the tree nodes from the properties.\n */\n private buildTreeNodes(): void {\n const treeData: AssetPropertyFlatNode[] = [];\n this.flatNodeMap.clear();\n\n this.properties.forEach(property => {\n const isComplex = this.assetPropertiesService.isComplexProperty(property);\n const hasKeyPath = !!(property as NestedPropertyFields).keyPath;\n const level = hasKeyPath ? (property as NestedPropertyFields).keyPath.length - 1 : 0;\n\n const key = hasKeyPath ? (property as NestedPropertyFields).keyPath.join('.') : property.name;\n\n const node: AssetPropertyFlatNode = {\n expandable: isComplex,\n level,\n property,\n isVisible: true,\n indeterminate: false // add indeterminate property\n };\n\n this.flatNodeMap.set(key, node);\n treeData.push(node);\n });\n\n this.dataSource.data = treeData;\n this.filterTree();\n this.updateSelectAllState();\n\n if (\n this.config.expansionMode === 'nonCollapsible' ||\n this.config.expansionMode === 'expandedByDefault'\n ) {\n queueMicrotask(() => {\n this.expandAllNodes();\n });\n }\n }\n\n /**\n * Update indeterminate state for all complex nodes\n */\n private updateIndeterminateStates(): void {\n // Only for multi-select mode\n if (this.config.selectMode !== 'multi') return;\n\n // For each complex node, check its children\n this.dataSource.data.forEach(node => {\n if (node.expandable) {\n const parentKey =\n (node.property as NestedPropertyFields).keyPath?.join('.') || node.property.name;\n // Find direct children (level = parent.level + 1, keyPath starts with parentKey)\n const children = this.dataSource.data.filter(child => {\n if (child === node) return false;\n const childKeyPath = (child.property as NestedPropertyFields).keyPath;\n if (!childKeyPath) return false;\n // Direct child: one level deeper, and keyPath starts with parentKey\n return (\n childKeyPath.length === node.level + 2 &&\n childKeyPath.slice(0, node.level + 1).join('.') === parentKey\n );\n });\n if (children.length > 0) {\n const selectedCount = children.filter(child => child.property.active).length;\n node.indeterminate = selectedCount > 0 && selectedCount < children.length;\n } else {\n node.indeterminate = false;\n }\n } else {\n node.indeterminate = false;\n }\n });\n }\n\n /**\n * Expands all nodes in the tree.\n */\n private expandAllNodes(): void {\n if (!this.tree()) return;\n\n const parentNodes = this.dataSource.data.filter(node => node.expandable);\n parentNodes.forEach(node => {\n if (!this.tree().isExpanded(node)) {\n this.tree().expand(node);\n }\n });\n }\n\n /**\n * Filters the tree nodes based on the search input.\n */\n private filterTree(): void {\n const searchText = this.inputText?.toLowerCase() || '';\n const allNodes = [...this.dataSource.data];\n\n if (!searchText) {\n allNodes.forEach(node => (node.isVisible = true));\n this.dataSource.data = Array.from(this.flatNodeMap.values());\n this.updateSelectAllState();\n return;\n }\n\n // First pass: Mark nodes that match the search criteria\n allNodes.forEach(node => {\n node.isVisible = this.matchesSearch(node.property, searchText);\n });\n\n // Second pass: Make parent nodes of visible nodes also visible\n allNodes.forEach(node => {\n if (node.isVisible && node.level > 0) {\n // Find and mark parent nodes as visible\n this.makeParentsVisible(node);\n }\n });\n\n // Final filtered list\n const filteredNodes = allNodes.filter(node => node.isVisible);\n\n // Update the data source with filtered nodes\n this.dataSource.data = filteredNodes;\n this.updateSelectAllState();\n\n // After data is updated, expand all parent nodes\n queueMicrotask(() => {\n this.expandNodesForSearch();\n });\n }\n\n /**\n * Expand parent nodes when filtering\n * This method expands all nodes with children when a search is active\n */\n private expandNodesForSearch(): void {\n if (!this.inputText || !this.tree()) {\n return;\n }\n\n const parentNodes = this.dataSource.data.filter(node => node.expandable);\n\n // Expand all parent nodes when searching\n parentNodes.forEach(node => {\n if (!this.tree().isExpanded(node)) {\n this.tree().expand(node);\n }\n });\n }\n\n /**\n * Makes all parent nodes visible.\n * @param node The node whose parents should be made visible.\n */\n private makeParentsVisible(node: AssetPropertyFlatNode): void {\n if (!node || node.level === 0) return;\n\n const keyPath = (node.property as NestedPropertyFields).keyPath;\n if (!keyPath) return;\n\n // Navigate up the path\n for (let i = 1; i < keyPath.length; i++) {\n const parentPath = keyPath.slice(0, i).join('.');\n const parent = this.flatNodeMap.get(parentPath);\n if (parent) {\n parent.isVisible = true;\n } else {\n break;\n }\n }\n }\n\n /**\n * Categorizes and flattens hierarchical properties.\n * @param properties The properties to categorize.\n * @returns The flattened list of properties.\n */\n private categorizeAndFlattenHierarchicalProperties(\n properties: AssetPropertyType[]\n ): AssetPropertyType[] {\n const { simple, complex } =\n this.assetPropertiesService.categorizeAndFlattenHierarchicalProperties(properties);\n return [...simple, ...complex];\n }\n\n /**\n * Fix syntax error in the file.\n */\n private fixSyntaxError(): void {\n if (true) {\n // Correct syntax\n }\n }\n}\n","<div\n class=\"tree-container bg-inherit\"\n [attr.aria-label]=\"'Asset property list' | translate\"\n role=\"tree\"\n>\n <div\n class=\"select-all-container bg-inherit sticky-top separator-bottom\"\n *ngIf=\"config.showHeader || config.searchable\"\n >\n <div\n class=\"form-group m-b-0 p-16\"\n *ngIf=\"config.searchable\"\n [ngClass]=\"{ 'separator-bottom': config.showHeader }\"\n >\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Filter properties' | translate\"\n placeholder=\"{{ 'Filter properties' | translate }}\"\n role=\"searchbox\"\n type=\"search\"\n autocomplete=\"off\"\n [(ngModel)]=\"inputText\"\n (input)=\"onSearch()\"\n [disabled]=\"!dataSource.data.length\"\n #filter\n />\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length === 0\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n [c8yIcon]=\"'search'\"\n ></i>\n </span>\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length > 0\"\n >\n <i\n class=\"text-muted dlt-c8y-icon-times\"\n [c8yIcon]=\"'times'\"\n [attr.aria-label]=\"'Clear search' | translate\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"clearSearch()\"\n ></i>\n </span>\n </div>\n </div>\n <div\n class=\"d-flex a-i-center overflow-hidden\"\n *ngIf=\"config.showHeader && dataSource.data.length\"\n >\n <div\n class=\"flex-no-shrink\"\n [ngClass]=\"{\n 'p-r-40': config.selectMode !== 'none' && config.expansionMode !== 'nonCollapsible',\n 'p-r-16': config.selectMode === 'none',\n 'p-r-8': config.selectMode !== 'none' && config.expansionMode === 'nonCollapsible'\n }\"\n ></div>\n <c8y-list-item-checkbox\n class=\"p-l-4 p-r-4\"\n *ngIf=\"config.selectMode === 'multi'\"\n [ngModel]=\"allSelected\"\n [indeterminate]=\"indeterminate\"\n (onSelect)=\"selectAll($event)\"\n ></c8y-list-item-checkbox>\n <div\n class=\"p-l-24 p-t-40\"\n *ngIf=\"config.selectMode !== 'multi'\"\n ></div>\n <div class=\"content-flex-30 fit-w m-t-4 m-b-4\">\n <div class=\"col-6 d-flex a-i-center m-l-0 m-r-0\">\n <span class=\"p-r-4 p-l-16 flex-no-shrink\">\n <div class=\"c8y-icon\"></div>\n </span>\n <span class=\"text-medium m-l-8\">\n {{ 'Property' | translate }}\n </span>\n </div>\n <div\n [ngClass]=\"{ 'col-3': config.showValue, 'col-6': !config.showValue }\"\n *ngIf=\"config.showKey\"\n >\n <span class=\"text-medium\">{{ 'Key' | translate }}</span>\n </div>\n <div\n [ngClass]=\"{ 'col-3': config.showKey, 'col-6': !config.showKey }\"\n *ngIf=\"config.showValue\"\n >\n <span class=\"text-medium\">{{ 'Value' | translate }}</span>\n </div>\n </div>\n <div\n class=\"m-l-8 p-l-24\"\n *ngIf=\"assetPropertyAction\"\n ></div>\n </div>\n </div>\n\n <cdk-tree\n role=\"presentation\"\n *ngIf=\"dataSource.data.length; else emptyState\"\n #tree\n [dataSource]=\"dataSource\"\n [levelAccessor]=\"getLevel\"\n >\n <!-- Tree Node Definition -->\n <cdk-tree-node\n [style.display]=\"shouldRender(node) ? 'flex' : 'none'\"\n [attr.tabindex]=\"0\"\n [attr.aria-level]=\"getLevel(node) + 1\"\n [attr.aria-expanded]=\"hasChild(node) ? tree.isExpanded(node) : null\"\n [attr.aria-selected]=\"config.selectMode !== 'none' ? node.property.active : null\"\n role=\"treeitem\"\n *cdkTreeNodeDef=\"let node\"\n cdkTreeNodePadding\n [cdkTreeNodePaddingIndent]=\"24\"\n [ngClass]=\"{\n nonCollapsible: config.expansionMode === 'nonCollapsible',\n nonSelectable: config.selectMode === 'none'\n }\"\n >\n <div class=\"d-flex p-relative overflow-visible bg-inherit fit-h\">\n <!-- Toggle Button for expandable nodes -->\n <button\n class=\"collapse-btn btn-dot flex-no-shrink\"\n [attr.aria-label]=\"\n collapseButtonTitle(node)\n | translate\n : {\n assetPropertyLabel:\n node.property.label || node.property.title || node.property.name\n }\n \"\n [attr.aria-expanded]=\"tree.isExpanded(node)\"\n *ngIf=\"config.expansionMode !== 'nonCollapsible' && hasChild(node)\"\n cdkTreeNodeToggle\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n <!-- Placeholder for non-expandable nodes to maintain alignment -->\n <div\n class=\"flex-no-shrink\"\n [ngClass]=\"{\n 'p-r-40': config.expansionMode !== 'nonCollapsible',\n 'p-r-8': config.expansionMode === 'nonCollapsible'\n }\"\n *ngIf=\"!hasChild(node) || config.expansionMode === 'nonCollapsible'\"\n ></div>\n\n <!-- Selection Controls -->\n <div\n class=\"d-contents\"\n *ngIf=\"config.selectMode !== 'none'\"\n >\n @if (config.selectMode === 'single') {\n <c8y-list-item-radio\n class=\"p-l-4\"\n type=\"radio\"\n [ngModel]=\"node.property.active\"\n (onSelect)=\"onSelectSingle($event, node)\"\n ></c8y-list-item-radio>\n } @else if (config.selectMode === 'multi') {\n <c8y-list-item-checkbox\n class=\"p-l-4\"\n [ngModel]=\"node.property.active\"\n [indeterminate]=\"node.indeterminate\"\n (onSelect)=\"onSelectMulti($event, node)\"\n ></c8y-list-item-checkbox>\n }\n </div>\n\n <div class=\"content-flex-30 fit-w bg-inherit\">\n <div\n class=\"d-flex a-i-center bg-inherit m-0\"\n [ngClass]=\"{\n 'col-6': config.showKey || config.showValue,\n 'col-12': !config.showKey && !config.showValue\n }\"\n >\n <c8y-li-icon\n class=\"p-r-4\"\n [icon]=\"node.property.type | c8yAssetPropertyIcon\"\n tooltip=\"{{ node.property.type }}\"\n [delay]=\"500\"\n [ngClass]=\"{\n 'p-l-4': config.selectMode !== 'none',\n 'p-r-16': config.selectMode === 'none'\n }\"\n ></c8y-li-icon>\n\n <span class=\"p-r-8\">\n <div\n class=\"text-truncate\"\n title=\"{{\n node.property.label || node.property.title || node.property.name | translate\n }}\"\n >\n {{ node.property.label || node.property.title || node.property.name | translate }}\n </div>\n </span>\n </div>\n <div\n class=\"d-flex a-i-center\"\n *ngIf=\"config.showKey\"\n [ngClass]=\"{ 'col-3': config.showValue, 'col-6': !config.showValue }\"\n >\n <span\n class=\"d-inline-block tag tag--default a-s-center text-truncate\"\n title=\"{{ node.property.keyPath?.join('.') || (node.property?.name | translate) }}\"\n >\n {{ node.property.keyPath?.join('.') || (node.property?.name | translate) }}\n </span>\n </div>\n <div\n class=\"d-flex a-i-center\"\n [ngClass]=\"{ 'col-3': config.showKey, 'col-6': !config.showKey }\"\n *ngIf=\"asset && config.showValue\"\n >\n <span\n class=\"tag tag--info d-inline-block a-s-center text-truncate\"\n title=\"{{ node.property | c8yAssetPropertyValue: asset }}\"\n >\n {{ node.property | c8yAssetPropertyValue: asset }}\n </span>\n </div>\n </div>\n <div\n class=\"m-l-8 showOnHover d-flex a-i-center\"\n *ngIf=\"assetPropertyAction\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n assetPropertyAction?.template;\n context: {\n $implicit: node.property\n }\n \"\n ></ng-container>\n </div>\n </div>\n </cdk-tree-node>\n </cdk-tree>\n</div>\n\n<ng-template #emptyState>\n <c8y-ui-empty-state\n icon=\"list\"\n title=\"{{ 'No properties to display' | translate }}\"\n subtitle=\"{{ 'Select an asset to see the available properties.' | translate }}\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</ng-template>\n","import { Component, EventEmitter, inject, Input, Output } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { BottomDrawerRef, C8yTranslatePipe, FormsModule, gettext } from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { AssetPropertyListConfig, AssetPropertyType } from '../asset-properties.model';\nimport { AssetPropertyListComponent } from '../asset-property-list/asset-property-list.component';\n\n/**\n * Represents a drawer component for selecting asset properties.\n */\n@Component({\n selector: 'c8y-asset-property-selector-drawer-component',\n templateUrl: './asset-property-selector-drawer.component.html',\n host: {\n class: 'd-contents'\n },\n standalone: true,\n imports: [C8yTranslatePipe, FormsModule, AssetPropertyListComponent]\n})\nexport class AssetPropertySelectorDrawerComponent {\n /**\n * Title of the drawer.\n */\n @Input() title = gettext('Select property');\n /**\n * Managed object representing the asset.\n */\n asset!: IManagedObject;\n /**\n * Configuration for the asset property list.\n */\n config: AssetPropertyListConfig;\n /**\n * Custom properties to be displayed in the list.\n */\n customProperties: AssetPropertyType[] = [];\n /**\n * Emits the selected properties when saved.\n */\n @Output() savePropertySelection = new EventEmitter<AssetPropertyType[]>();\n /**\n * Emits an event when the selection is canceled.\n */\n @Output() cancelPropertySelection = new EventEmitter<void>();\n /**\n * List of selected properties.\n */\n selectedProperties: AssetPropertyType[] = [];\n /**\n * Reference to the bottom drawer.\n */\n bottomDrawerRef = inject(BottomDrawerRef);\n /**\n * Promise resolving to the selected properties.\n */\n result: Promise<AssetPropertyType[]> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n /**\n * Internal save handler.\n */\n private _save: (value: AssetPropertyType[]) => void;\n /**\n * Internal cancel handler.\n */\n private _cancel: (reason?: string | Error) => void;\n /**\n * Updates the selected properties.\n * @param properties The selected properties.\n */\n onSelectedProperties(properties: AssetPropertyType[]): void {\n this.selectedProperties = cloneDeep(properties);\n }\n\n /**\n * Saves the selected properties and closes the drawer.\n */\n onSave(): void {\n this._save(this.selectedProperties);\n this.bottomDrawerRef.close();\n }\n\n /**\n * Cancels the selection and closes the drawer.\n */\n onCancel(): void {\n this._cancel();\n this.bottomDrawerRef.close();\n }\n\n /**\n * Checks if the select button should be disabled.\n * @returns True if all selected properties are inactive.\n */\n selectIsDisabled(): boolean {\n return this.selectedProperties?.every(({ active }) => !active);\n }\n}\n","<div class=\"card-header separator\">\n <span class=\"h4 card-title\">{{ title | translate }}</span>\n</div>\n\n<div class=\"inner-scroll flex-grow\">\n <c8y-asset-property-list\n class=\"bg-component\"\n [asset]=\"asset\"\n [config]=\"config\"\n [customProperties]=\"customProperties\"\n (selectedProperties)=\"onSelectedProperties($event)\"\n ></c8y-asset-property-list>\n</div>\n\n<div class=\"card-footer text-center p-24 separator flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Select' | translate }}\"\n type=\"button\"\n [disabled]=\"selectIsDisabled()\"\n (click)=\"onSave()\"\n >\n {{ 'Select' | translate }}\n </button>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["FormsModule"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import * as i3$1 from '@angular/forms';
|
|
|
7
7
|
import { FormBuilder, FormsModule, ReactiveFormsModule, FormControl, FormGroup, Validators } from '@angular/forms';
|
|
8
8
|
import { ActivatedRoute, Router } from '@angular/router';
|
|
9
9
|
import * as i2 from '@c8y/ngx-components';
|
|
10
|
-
import { gettext, ContextRouteService, ClipboardService, ViewContext, CoreModule, AlertService, Permissions, CommonModule, FormsModule as FormsModule$1 } from '@c8y/ngx-components';
|
|
10
|
+
import { gettext, ContextRouteService, ClipboardService, ViewContext, CoreModule, AlertService, Permissions, GainsightService, CommonModule, FormsModule as FormsModule$1 } from '@c8y/ngx-components';
|
|
11
11
|
import * as i5$1 from '@c8y/ngx-components/alarm-event-selector';
|
|
12
12
|
import { AlarmEventSelectorModule } from '@c8y/ngx-components/alarm-event-selector';
|
|
13
13
|
import * as i1 from '@c8y/ngx-components/context-dashboard';
|
|
@@ -15,14 +15,15 @@ import { ContextDashboardService, ContextDashboardType, ContextDashboardModule }
|
|
|
15
15
|
import * as i4$1 from '@c8y/ngx-components/datapoint-selector';
|
|
16
16
|
import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
|
|
17
17
|
import { DatapointsExportSelectorComponent } from '@c8y/ngx-components/datapoints-export-selector';
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
18
|
+
import { PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH } from '@c8y/ngx-components/echart/models';
|
|
19
|
+
import { ChartHelpersService, ChartsComponent, ChartEventsService, ChartAlarmsService } from '@c8y/ngx-components/echart';
|
|
20
20
|
import * as i4 from 'ngx-bootstrap/dropdown';
|
|
21
21
|
import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
|
|
22
|
-
import { BsModalService } from 'ngx-bootstrap/modal';
|
|
23
|
-
import { PopoverModule } from 'ngx-bootstrap/popover';
|
|
24
22
|
import * as i6 from 'ngx-bootstrap/tooltip';
|
|
25
23
|
import { TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
24
|
+
import { PopoverModule } from 'ngx-bootstrap/popover';
|
|
25
|
+
import { TimeContextComponent } from '@c8y/ngx-components/time-context';
|
|
26
|
+
import { BsModalService } from 'ngx-bootstrap/modal';
|
|
26
27
|
import { firstValueFrom, merge, of, map as map$1 } from 'rxjs';
|
|
27
28
|
import * as i3 from '@angular/common';
|
|
28
29
|
import { ReportDashboardModule, ReportDashboardService } from '@c8y/ngx-components/report-dashboard';
|
|
@@ -495,6 +496,8 @@ class DatapointExplorerComponent {
|
|
|
495
496
|
this.contextDashboardService = inject(ContextDashboardService);
|
|
496
497
|
this.activatedRoute = inject(ActivatedRoute);
|
|
497
498
|
this.contextRouteService = inject(ContextRouteService);
|
|
499
|
+
this.chartHelpersService = inject(ChartHelpersService);
|
|
500
|
+
this.gainsightService = inject(GainsightService);
|
|
498
501
|
this.formGroup = this.initForm();
|
|
499
502
|
this.settings$ = this.activatedRoute.data.pipe(map$1(data => data.settings));
|
|
500
503
|
}
|
|
@@ -518,6 +521,12 @@ class DatapointExplorerComponent {
|
|
|
518
521
|
this.updateExportConfig();
|
|
519
522
|
this.checkForMatchingDatapoints();
|
|
520
523
|
});
|
|
524
|
+
const configSummaryGS = this.chartHelpersService.getConfigSummaryForGainsight(this.config);
|
|
525
|
+
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.EVENTS.DATA_EXPLORER_AND_GRAPH, {
|
|
526
|
+
component: PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.COMPONENTS.DATA_EXPLORER_DETAILS,
|
|
527
|
+
action: PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.ACTIONS.DATA_EXPLORER_CONFIG_INIT,
|
|
528
|
+
...configSummaryGS
|
|
529
|
+
});
|
|
521
530
|
}
|
|
522
531
|
onTimeContextChange(timeProps) {
|
|
523
532
|
const realtime = this.formGroup.controls.realtime.value;
|
|
@@ -549,6 +558,12 @@ class DatapointExplorerComponent {
|
|
|
549
558
|
}
|
|
550
559
|
this.alarms = config.alarmsEventsConfigs.filter(ae => ae.timelineType === 'ALARM');
|
|
551
560
|
this.events = config.alarmsEventsConfigs.filter(ae => ae.timelineType === 'EVENT');
|
|
561
|
+
const configSummaryGS = this.chartHelpersService.getConfigSummaryForGainsight(config);
|
|
562
|
+
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.EVENTS.DATA_EXPLORER_AND_GRAPH, {
|
|
563
|
+
component: PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.COMPONENTS.DATA_EXPLORER_DETAILS,
|
|
564
|
+
action: PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.ACTIONS.DATA_EXPLORER_CONFIG_CHANGE,
|
|
565
|
+
...configSummaryGS
|
|
566
|
+
});
|
|
552
567
|
this.formGroup.patchValue({ alarms: this.alarms, events: this.events, ...config });
|
|
553
568
|
}
|
|
554
569
|
onSliderZoom(timeProps) {
|
|
@@ -731,7 +746,7 @@ class DatapointExplorerComponent {
|
|
|
731
746
|
});
|
|
732
747
|
}
|
|
733
748
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DatapointExplorerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
734
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", 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 [timeContext]=\"(settings$ | async)?.timeContext\"\n></c8y-time-context>\n\n<c8y-action-bar-item\n *ngIf=\"!(settings$ | async)?.hideWorkspaceConfig\"\n [placement]=\"'left'\"\n>\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\n *ngIf=\"!(settings$ | async)?.hideExportSelector\"\n [placement]=\"'right'\"\n>\n <c8y-datapoints-export-selector\n [exportConfig]=\"exportConfig\"\n [containerClass]=\"'d-contents'\"\n ></c8y-datapoints-export-selector>\n</c8y-action-bar-item>\n\n@if (!(settings$ | async)?.hideWidgetActions) {\n <ng-container *ngIf=\"contextAsset\">\n <c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Send as widget to dashboard' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"sendAsWidgetToDashboard()\"\n [disabled]=\"config?.datapoints?.length === 0 || !canAddReport\"\n >\n <i c8yIcon=\"th\"></i>\n <span>{{ 'Send as widget to dashboard' | translate }}</span>\n </button>\n </c8y-action-bar-item>\n </ng-container>\n\n <ng-container *ngIf=\"!contextAsset\">\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 </ng-container>\n}\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 <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [tooltip]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\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]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all data points into single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [tooltip]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\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>{{ '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\n <div class=\"p-l-16 p-r-16 form-group p-b-16\">\n <label\n [title]=\"'Number of decimal places' | translate\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 1 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </div>\n </form>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { 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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i3$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i2.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i4$1.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$1.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", "timeContext", "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$1 }, { kind: "ngmodule", type: A11yModule }, { kind: "component", type: DatapointsExportSelectorComponent, selector: "c8y-datapoints-export-selector", inputs: ["containerClass", "exportConfig"], outputs: ["isOpen"] }, { kind: "component", type: WorkspaceConfigComponent, selector: "c8y-workspace-config", inputs: ["updatedConfig"], outputs: ["onConfigurationChange"] }] }); }
|
|
749
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DatapointExplorerComponent, isStandalone: true, selector: "c8y-datapoint-explorer", providers: [ChartEventsService, ChartAlarmsService, ChartHelpersService], 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 [timeContext]=\"(settings$ | async)?.timeContext\"\n></c8y-time-context>\n\n<c8y-action-bar-item\n *ngIf=\"!(settings$ | async)?.hideWorkspaceConfig\"\n [placement]=\"'left'\"\n>\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\n *ngIf=\"!(settings$ | async)?.hideExportSelector\"\n [placement]=\"'right'\"\n>\n <c8y-datapoints-export-selector\n [exportConfig]=\"exportConfig\"\n [containerClass]=\"'d-contents'\"\n ></c8y-datapoints-export-selector>\n</c8y-action-bar-item>\n\n@if (!(settings$ | async)?.hideWidgetActions) {\n <ng-container *ngIf=\"contextAsset\">\n <c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Send as widget to dashboard' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"sendAsWidgetToDashboard()\"\n [disabled]=\"config?.datapoints?.length === 0 || !canAddReport\"\n >\n <i c8yIcon=\"th\"></i>\n <span>{{ 'Send as widget to dashboard' | translate }}</span>\n </button>\n </c8y-action-bar-item>\n </ng-container>\n\n <ng-container *ngIf=\"!contextAsset\">\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 </ng-container>\n}\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 <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [tooltip]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\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]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all data points into single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [tooltip]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\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>{{ '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\n <div class=\"p-l-16 p-r-16 form-group p-b-16\">\n <label\n [title]=\"'Number of decimal places' | translate\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 1 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </div>\n </form>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { 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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i3$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i2.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i4$1.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$1.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", "timeContext", "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$1 }, { kind: "ngmodule", type: A11yModule }, { kind: "component", type: DatapointsExportSelectorComponent, selector: "c8y-datapoints-export-selector", inputs: ["containerClass", "exportConfig"], outputs: ["isOpen"] }, { kind: "component", type: WorkspaceConfigComponent, selector: "c8y-workspace-config", inputs: ["updatedConfig"], outputs: ["onConfigurationChange"] }] }); }
|
|
735
750
|
}
|
|
736
751
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DatapointExplorerComponent, decorators: [{
|
|
737
752
|
type: Component,
|
|
@@ -749,7 +764,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
749
764
|
A11yModule,
|
|
750
765
|
DatapointsExportSelectorComponent,
|
|
751
766
|
WorkspaceConfigComponent
|
|
752
|
-
], providers: [ChartEventsService, ChartAlarmsService], template: "<c8y-title>{{ 'Data explorer' | translate }}</c8y-title>\n\n<c8y-time-context\n (contextChange)=\"onTimeContextChange($event)\"\n [changedDateContext]=\"timeProps\"\n [timeContext]=\"(settings$ | async)?.timeContext\"\n></c8y-time-context>\n\n<c8y-action-bar-item\n *ngIf=\"!(settings$ | async)?.hideWorkspaceConfig\"\n [placement]=\"'left'\"\n>\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\n *ngIf=\"!(settings$ | async)?.hideExportSelector\"\n [placement]=\"'right'\"\n>\n <c8y-datapoints-export-selector\n [exportConfig]=\"exportConfig\"\n [containerClass]=\"'d-contents'\"\n ></c8y-datapoints-export-selector>\n</c8y-action-bar-item>\n\n@if (!(settings$ | async)?.hideWidgetActions) {\n <ng-container *ngIf=\"contextAsset\">\n <c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Send as widget to dashboard' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"sendAsWidgetToDashboard()\"\n [disabled]=\"config?.datapoints?.length === 0 || !canAddReport\"\n >\n <i c8yIcon=\"th\"></i>\n <span>{{ 'Send as widget to dashboard' | translate }}</span>\n </button>\n </c8y-action-bar-item>\n </ng-container>\n\n <ng-container *ngIf=\"!contextAsset\">\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 </ng-container>\n}\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 <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [tooltip]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\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]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all data points into single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [tooltip]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\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>{{ '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\n <div class=\"p-l-16 p-r-16 form-group p-b-16\">\n <label\n [title]=\"'Number of decimal places' | translate\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 1 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </div>\n </form>\n </div>\n</div>\n" }]
|
|
767
|
+
], providers: [ChartEventsService, ChartAlarmsService, ChartHelpersService], template: "<c8y-title>{{ 'Data explorer' | translate }}</c8y-title>\n\n<c8y-time-context\n (contextChange)=\"onTimeContextChange($event)\"\n [changedDateContext]=\"timeProps\"\n [timeContext]=\"(settings$ | async)?.timeContext\"\n></c8y-time-context>\n\n<c8y-action-bar-item\n *ngIf=\"!(settings$ | async)?.hideWorkspaceConfig\"\n [placement]=\"'left'\"\n>\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\n *ngIf=\"!(settings$ | async)?.hideExportSelector\"\n [placement]=\"'right'\"\n>\n <c8y-datapoints-export-selector\n [exportConfig]=\"exportConfig\"\n [containerClass]=\"'d-contents'\"\n ></c8y-datapoints-export-selector>\n</c8y-action-bar-item>\n\n@if (!(settings$ | async)?.hideWidgetActions) {\n <ng-container *ngIf=\"contextAsset\">\n <c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Send as widget to dashboard' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"sendAsWidgetToDashboard()\"\n [disabled]=\"config?.datapoints?.length === 0 || !canAddReport\"\n >\n <i c8yIcon=\"th\"></i>\n <span>{{ 'Send as widget to dashboard' | translate }}</span>\n </button>\n </c8y-action-bar-item>\n </ng-container>\n\n <ng-container *ngIf=\"!contextAsset\">\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 </ng-container>\n}\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 <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [tooltip]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\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]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all data points into single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [tooltip]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\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>{{ '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\n <div class=\"p-l-16 p-r-16 form-group p-b-16\">\n <label\n [title]=\"'Number of decimal places' | translate\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 1 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </div>\n </form>\n </div>\n</div>\n" }]
|
|
753
768
|
}], ctorParameters: () => [], propDecorators: { chart: [{
|
|
754
769
|
type: ViewChild,
|
|
755
770
|
args: ['chart']
|