{"version":3,"file":"c8y-ngx-components-asset-properties.mjs","sources":["../../asset-properties/asset-properties.model.ts","../../asset-properties/computed-properties.service.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-icon-tooltip.pipe.ts","../../asset-properties/computed-properties-config/computed-properties-config.component.ts","../../asset-properties/computed-properties-config/computed-properties-config.component.html","../../asset-properties/asset-property-list/asset-property-collapse-button-title.pipe.ts","../../asset-properties/asset-property-list/asset-property-drag-drop.service.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-tabs/asset-property-tabs.component.ts","../../asset-properties/asset-property-tabs/asset-property-tabs.component.html","../../asset-properties/custom-properties-drawer/custom-properties-drawer.component.ts","../../asset-properties/custom-properties-drawer/custom-properties-drawer.component.html","../../asset-properties/custom-properties-drawer.service.ts","../../asset-properties/asset-property-list/asset-property-label.pipe.ts","../../asset-properties/asset-property-selector/asset-property-selector.component.ts","../../asset-properties/asset-property-selector/asset-property-selector.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 { Injector, Type } from '@angular/core';\nimport { IAlarm, IEvent, IIdentified, IManagedObject } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { Observable } from 'rxjs';\n\ninterface ComputedPropertyContextMap {\n  device: { type: 'device'; value: IManagedObject };\n  group: { type: 'group'; value: IManagedObject };\n  asset: { type: 'asset'; value: IManagedObject };\n  alarm: { type: 'alarm'; value: IAlarm };\n  event: { type: 'event'; value: IEvent };\n}\n\nexport type ValueCallbackMetadata = {\n  /**\n   * Mode of operation:\n   * - 'singleValue': Get count only once (no real-time updates)\n   * - 'realtime': Enable real-time updates (default)\n   */\n  mode?: 'singleValue' | 'realtime';\n  /**\n   * Observable to control real-time updates when mode is 'realtime'.\n   * - true: Enable real-time updates (fetches current count from server and continues)\n   * - false: Disable real-time updates (preserves current count, no server call)\n   * If not provided, real-time runs continuously.\n   */\n  realtimeControl$?: Observable<boolean>;\n};\n\nexport type ComputedPropertyContextType = keyof ComputedPropertyContextMap;\nexport type ComputedPropertyContextValue =\n  ComputedPropertyContextMap[keyof ComputedPropertyContextMap]['value'];\n\ntype ComputedPropertyDefinitionBase<\n  TContext extends readonly ComputedPropertyContextType[] = ComputedPropertyContextType[],\n  TConfig = any\n> = {\n  name: string;\n  prop: BaseProperty;\n  contextType: TContext;\n  value: ({\n    config,\n    context,\n    metadata\n  }: {\n    config?: TConfig;\n    context?: ComputedPropertyContextMap[TContext[number]]['value'];\n    metadata?: ValueCallbackMetadata;\n  }) => any | Observable<any> | Promise<any>;\n  injector?: Injector;\n};\n\nexport type ComputedPropertyDefinition<\n  TContext extends readonly ComputedPropertyContextType[] = ComputedPropertyContextType[],\n  TConfig = any\n> = ComputedPropertyDefinitionBase<TContext, TConfig> &\n  (\n    | {\n        configComponent?: never;\n        loadConfigComponent?: never;\n      }\n    | {\n        configComponent: Type<any>;\n        loadConfigComponent?: never;\n      }\n    | {\n        configComponent?: never;\n        loadConfigComponent: () => Promise<Type<any>>;\n      }\n  );\n\nexport type ComputedPropertyComponent = {\n  /**\n   * The configuration which is shared between configuration component and display component.\n   * Should be serializable to allow saving it to the API.\n   */\n  config: unknown;\n  /**\n   * The asset, device, group, alarm or event for which the property is displayed.\n   */\n  asset?: IManagedObject;\n};\n\nexport type AssetPropertyListConfig = {\n  /**\n   * List of properties that should be selected by default when the asset property list is loaded.\n   */\n  selectedProperties?: AssetPropertyType[];\n  /**\n   * Flag to enable or disable the filter functionality in the asset property list.\n   * When enabled, a search input will be displayed to filter properties by their names.\n   */\n  filterable?: 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   * - `plus` - multiple properties can be selected using add/remove buttons\n   * - `none` - no properties can be selected\n   */\n  selectMode?: 'single' | 'multi' | 'plus' | '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   * Flag to allow adding custom properties to the asset property list with additional dialog.\n   */\n  allowAddingCustomProperties?: boolean;\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   * Enable or disable drag and drop functionality for reordering properties.\n   */\n  allowDragAndDrop?: boolean;\n  /**\n   * Tabs to hide in the custom properties drawer.\n   */\n  hiddenTabs?: HiddenTabs;\n  /**\n   * Flag to add context asset's ID and name to output properties.\n   */\n  addAssetToProperty?: boolean;\n};\n\nexport const defaultAssetPropertyListConfig: AssetPropertyListConfig = {\n  filterable: true,\n  selectMode: 'none',\n  expansionMode: 'expandedByDefault',\n  showHeader: true,\n  showValue: true,\n  showKey: true,\n  emptyStateContent: 'empty',\n  allowAddingCustomProperties: false,\n  inputPropertiesHandle: 'merge',\n  allowDragAndDrop: false\n};\n\nexport const defaultAssetProperties: Array<BaseProperty> = [\n  {\n    c8y_JsonSchema: { properties: { name: { type: 'string', label: 'Name' } } },\n    name: 'name',\n    label: gettext('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: gettext('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: gettext('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: gettext('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: gettext('Last updated'),\n    type: 'string',\n    isEditable: false,\n    isStandardProperty: true\n  },\n  {\n    label: gettext('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: gettext('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: gettext('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: gettext('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: gettext('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: gettext('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: gettext('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: gettext('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: gettext('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: gettext('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: gettext('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: gettext('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: gettext('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: gettext('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};\nexport type C8yPropertyType =\n  | 'string'\n  | 'number'\n  | 'integer'\n  | 'boolean'\n  | 'object'\n  | 'array'\n  | 'null'\n  | 'date'\n  | 'enum'\n  | 'file'\n  | 'c8y_JsonSchema'\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  temporary?: boolean;\n  isStandardProperty?: boolean;\n  c8y_JsonSchema?: C8yJsonSchema;\n  active?: boolean;\n  computed?: boolean;\n  instanceId?: string;\n  asset?: IIdentified;\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\nexport type HiddenTabs = { regular?: boolean; computed?: boolean; asset?: boolean };\n\nexport type AssetPropertyTab = keyof Required<HiddenTabs>;\n","import { inject, Injectable, InjectionToken, Injector } from '@angular/core';\nimport {\n  ExtensionPointForPlugins,\n  GenericHookOptions,\n  GenericHookType,\n  hookGeneric,\n  PluginsResolveService,\n  getInjectedHooks,\n  stateToFactory,\n  fromTriggerOnce,\n  GroupService\n} from '@c8y/ngx-components';\nimport {\n  ComputedPropertyContextType,\n  ComputedPropertyContextValue,\n  ComputedPropertyDefinition\n} from './asset-properties.model';\nimport { Router } from '@angular/router';\nimport {\n  distinctUntilChanged,\n  filter,\n  firstValueFrom,\n  map,\n  mergeMap,\n  Observable,\n  shareReplay,\n  take\n} from 'rxjs';\nimport { IAlarm, IEvent, IManagedObject } from '@c8y/client';\n\nexport const HOOK_COMPUTED_PROPERTY = new InjectionToken<ComputedPropertyDefinition[]>(\n  'HOOK_COMPUTED_PROPERTY'\n);\n\nexport function hookComputedProperty(\n  property: GenericHookType<ComputedPropertyDefinition>,\n  options?: Partial<GenericHookOptions>\n) {\n  return hookGeneric<ComputedPropertyDefinition>(property, HOOK_COMPUTED_PROPERTY, options);\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ComputedPropertiesService extends ExtensionPointForPlugins<ComputedPropertyDefinition> {\n  private groupService = inject(GroupService);\n\n  constructor(\n    rootInjector: Injector,\n    private router: Router,\n    plugins: PluginsResolveService\n  ) {\n    super(rootInjector, plugins);\n    this.items$ = this.setupItemsObservable();\n  }\n\n  /**\n   * Returns the current state.\n   * @readonly\n   * @returns The current set of computed properties.\n   */\n  get state(): Set<ComputedPropertyDefinition> {\n    return this.state$.value;\n  }\n\n  add(propertyDef: ComputedPropertyDefinition) {\n    this.state.add(propertyDef);\n    this.emitNewState();\n  }\n\n  getByName(name: string): Promise<ComputedPropertyDefinition> {\n    if (!name) {\n      return Promise.resolve(undefined);\n    }\n    return firstValueFrom(\n      this.items$.pipe(\n        mergeMap((propertyDefs: ComputedPropertyDefinition[]) => propertyDefs),\n        filter((propertyDef: ComputedPropertyDefinition) => propertyDef.name === name),\n        take(1)\n      )\n    );\n  }\n\n  getByContext(asset: ComputedPropertyContextValue): Promise<ComputedPropertyDefinition[]> {\n    if (!asset) {\n      return Promise.resolve([]);\n    }\n    const computedPropertyContextType: ComputedPropertyContextType = this.getTypeOfContext(asset);\n\n    return firstValueFrom(\n      this.items$.pipe(\n        map((propertyDefs: ComputedPropertyDefinition[]) =>\n          propertyDefs.filter((propertyDef: ComputedPropertyDefinition) => {\n            if (!propertyDef.contextType) {\n              return true;\n            }\n            return propertyDef.contextType.includes(computedPropertyContextType);\n          })\n        )\n      )\n    );\n  }\n\n  private getTypeOfContext(context: ComputedPropertyContextValue): ComputedPropertyContextType {\n    const isEvent = (item: IAlarm | IEvent): item is IEvent => !('severity' in item);\n    const isAlarm = (item: IAlarm | IEvent): item is IAlarm => 'severity' in item;\n\n    if (this.groupService.isDevice(context as IManagedObject)) {\n      return 'device';\n    } else if (\n      this.groupService.isGroup(context as IManagedObject) &&\n      !this.groupService.isAsset(context as IManagedObject)\n    ) {\n      return 'group';\n    } else if (this.groupService.isAsset(context as IManagedObject)) {\n      return 'asset';\n    } else if (isAlarm(context as IAlarm | IEvent)) {\n      return 'alarm';\n    } else if (isEvent(context as IAlarm | IEvent)) {\n      return 'event';\n    }\n  }\n\n  protected setupItemsObservable(): Observable<ComputedPropertyDefinition[]> {\n    return fromTriggerOnce<ComputedPropertyDefinition>(this.router, this.refresh$, [\n      getInjectedHooks<ComputedPropertyDefinition>(HOOK_COMPUTED_PROPERTY, this.injectors),\n      () => this.factories,\n      stateToFactory(this.state$)\n    ]).pipe(distinctUntilChanged(), shareReplay(1));\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { IManagedObject, InventoryService, IResultList } from '@c8y/client';\nimport { AlertService, AssetTypesRealtimeService, GroupService } from '@c8y/ngx-components';\nimport { isObjectLike, isEmpty, forOwn, isArray, find, isEqual, omit } from 'lodash-es';\nimport { firstValueFrom } from 'rxjs';\nimport { AssetPropertyType, C8yJsonSchemaProperty } from './asset-properties.model';\nimport { ComputedPropertiesService } from './computed-properties.service';\n\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  private alert = inject(AlertService);\n  private computedPropertiesService = inject(ComputedPropertiesService);\n\n  /**\n   * Filters added properties to only include those compatible with the given asset.\n   * Currently only checks compatibility for computed properties.\n   * @param allAddedProperties All properties that have been added by the user\n   * @param asset The current asset context\n   * @returns Promise resolving to properties compatible with the asset\n   */\n  async filterCompatibleProperties(\n    allAddedProperties: AssetPropertyType[],\n    asset: IManagedObject\n  ): Promise<AssetPropertyType[]> {\n    if (!asset || !allAddedProperties.length) {\n      return allAddedProperties;\n    }\n\n    let availableComputedPropertyNames: Set<string> | null = null;\n    const computedProperties = allAddedProperties.filter(prop => prop.computed);\n\n    if (computedProperties.length > 0) {\n      const availableComputedProperties = await this.computedPropertiesService.getByContext(asset);\n      availableComputedPropertyNames = new Set(\n        availableComputedProperties.map(({ prop }) => prop.name)\n      );\n    }\n\n    const compatibleProperties: AssetPropertyType[] = [];\n\n    for (const property of allAddedProperties) {\n      if (await this.isPropertyAvailable(property, availableComputedPropertyNames)) {\n        compatibleProperties.push(property);\n      }\n    }\n\n    return compatibleProperties;\n  }\n\n  /**\n   * Retrieves 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 requestAssetProperties(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.requestAssetProperties(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    computed: 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 (property.computed) {\n          acc.computed.push(property);\n        } else 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      { computed: [], 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  /**\n   * Checks if property is available based on provided available computed property names.\n   * @param property The property to check.\n   * @param availableComputedPropertyNames Set of available computed property names.\n   * @returns True if the property is available, false otherwise.\n   */\n  async isPropertyAvailable(\n    property: AssetPropertyType,\n    availableComputedPropertyNames: Set<string>\n  ): Promise<boolean> {\n    if (property.computed) {\n      if (!availableComputedPropertyNames) {\n        return false;\n      }\n      return availableComputedPropertyNames.has(property.name);\n    }\n\n    return true;\n  }\n\n  /**\n   * Checks if two properties match for selection purposes.\n   * @param property1 First property to compare.\n   * @param property2 Second property to compare.\n   * @param omitProperties Optional list of property keys to omit from comparison (e.g., ['instanceId','configuredAssetId']).\n   * @returns True if properties match.\n   */\n  propertiesMatch(\n    property1: AssetPropertyType,\n    property2: AssetPropertyType,\n    omitProperties: (keyof AssetPropertyType)[] = []\n  ): boolean {\n    if (property1.name === property2.name) {\n      const propertiesToOmit: (keyof AssetPropertyType)[] = ['active', ...omitProperties];\n      const areEqual = isEqual(\n        omit(property1, propertiesToOmit),\n        omit(property2, propertiesToOmit)\n      );\n      return areEqual;\n    }\n    return false;\n  }\n\n  /**\n   * Retrieves custom properties from the properties library, optionally filtered by search text.\n   * @param searchText Optional search text to filter properties.\n   * @returns A promise resolving to the list of properties and paging information.\n   */\n  async getPropertiesFromPropertiesLibrary(searchText?: string) {\n    const propertiesFromLibrary: AssetPropertyType[] = [];\n    const { data: propertiesMOs, paging } =\n      await this.requestPropertiesFromPropertiesLibrary(searchText);\n    propertiesMOs.forEach(prop => {\n      const name = Object.keys(prop.c8y_JsonSchema.properties)[0];\n      propertiesFromLibrary.push({\n        c8y_JsonSchema: prop.c8y_JsonSchema,\n        label: prop.name,\n        name,\n        type: prop.c8y_JsonSchema.properties[name].type\n      });\n    });\n    return { propertiesFromLibrary, paging };\n  }\n\n  private async requestPropertiesFromPropertiesLibrary(\n    searchText?: string\n  ): Promise<IResultList<IManagedObject>> {\n    let queryFilter = '(type eq c8y_JsonSchema) and (appliesTo.MANAGED_OBJECTS eq true)';\n\n    if (searchText?.trim()) {\n      const escapedSearchText = searchText.replace(/'/g, \"''\");\n      queryFilter += ` and (name eq '*${escapedSearchText}*')`;\n    }\n\n    const query = `$filter=(${queryFilter})`;\n    const filter = {\n      pageSize: 20,\n      revert: true,\n      query,\n      withTotalPages: true,\n      withTotalElements: true\n    };\n    try {\n      const results = await this.inventoryService.list(filter);\n      return results;\n    } catch (error) {\n      this.alert.addServerFailure(error);\n      return null;\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({\n        ...property,\n        name: key,\n        label: property.label || property.title || key,\n        keyPath: [...path, key]\n      } 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   * ID of asset that was selected while configuring the computed property.\n   */\n  configuredAssetId?: string;\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, Injector, Pipe, runInInjectionContext } from '@angular/core';\nimport { AssetPropertyType, ComputedPropertyContextValue } from '../asset-properties.model';\nimport { AssetPropertiesService } from '../asset-properties.service';\nimport { get } from 'lodash-es';\nimport { ComputedPropertiesService } from '../computed-properties.service';\nimport { from, isObservable, map, Observable, of, switchMap } from 'rxjs';\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  private computedPropertiesService = inject(ComputedPropertiesService);\n  private injector = inject(Injector);\n\n  transform(\n    property: AssetPropertyType,\n    context: ComputedPropertyContextValue\n  ): Promise<string> | Observable<string> {\n    if (property.computed) {\n      return this.getCallbackComputedPropertyValue(property, context).pipe(\n        map(val => this.formatPropertyValue(val))\n      );\n    }\n\n    if (!property) {\n      return of('-');\n    }\n    let value: string;\n    if (this.assetPropertiesService.isComplexProperty(property)) {\n      value = JSON.stringify(context[property.name]);\n    } else if ('keyPath' in property) {\n      value = this.formatPropertyValue(get(context, property.keyPath));\n    } else {\n      value = this.formatPropertyValue(context[property.name]);\n    }\n    return of(value ?? '-');\n  }\n\n  private formatPropertyValue(value: any): string {\n    if (value == null) {\n      return null;\n    }\n    return typeof value === 'string' ? value : JSON.stringify(value);\n  }\n\n  private getCallbackComputedPropertyValue(\n    property: AssetPropertyType,\n    context: ComputedPropertyContextValue\n  ): any | Promise<any> | Observable<any> {\n    return from(this.computedPropertiesService.getByName(property.name)).pipe(\n      switchMap(definition => {\n        let value: any | Observable<any> | Promise<any> = '-';\n        runInInjectionContext(definition.injector || this.injector, () => {\n          value = definition.value({ config: property.config, context });\n        });\n\n        if (isObservable(value) || value instanceof Promise) {\n          return value;\n        } else {\n          return of(value);\n        }\n      })\n    );\n  }\n}\n","import { Pipe } from '@angular/core';\nimport { AssetPropertyType } from '../asset-properties.model';\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(assetProperty: AssetPropertyType): string {\n    if (assetProperty.computed) {\n      return 'bolt';\n    }\n    const type = assetProperty.type;\n    switch (type) {\n      case 'string':\n        return 'string';\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 'c8y-css';\n      case 'enum':\n        return 'content';\n      case 'file':\n        return 'file';\n      case 'integer':\n        return 'unit';\n      default:\n        return 'mix-words';\n    }\n  }\n}\n","import { inject, Pipe } from '@angular/core';\nimport { AssetPropertyType, C8yPropertyType } from '../asset-properties.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n/**\n * A pipe that transforms an asset property type into a tooltip string.\n * If the property is temporary, it appends \"(temporary)\" to the type and handles translation.\n * Otherwise, it returns the type as is.\n */\n@Pipe({\n  name: 'c8yAssetPropertyIconTooltip',\n  standalone: true\n})\nexport class AssetPropertyIconTooltipPipe {\n  private translateService = inject(TranslateService);\n\n  transform(property: AssetPropertyType): string | C8yPropertyType {\n    if (!property) {\n      return '';\n    } else if (property.temporary) {\n      return this.translateService.instant(gettext('{{assetPropertyType}}\\n(temporary)'), {\n        assetPropertyType: property.type\n      });\n    } else {\n      return property.type;\n    }\n  }\n}\n","import {\n  Component,\n  ComponentRef,\n  EnvironmentInjector,\n  inject,\n  Injector,\n  Input,\n  reflectComponentType,\n  Type,\n  effect,\n  viewChildren,\n  ViewContainerRef\n} from '@angular/core';\nimport {\n  AssetPropertyType,\n  ComputedPropertyComponent,\n  ComputedPropertyDefinition\n} from '../asset-properties.model';\nimport { C8yTranslatePipe, IconDirective, isPromise, OnBeforeSave } from '@c8y/ngx-components';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { FormsModule, NgForm } from '@angular/forms';\nimport { firstValueFrom, from, isObservable, Observable, of } from 'rxjs';\nimport { isUndefined } from 'lodash-es';\nimport { NgFor } from '@angular/common';\nimport { IManagedObject } from '@c8y/client';\n\ninterface PropertyConfig {\n  property: AssetPropertyType;\n  definition: ComputedPropertyDefinition;\n  config: unknown;\n  componentRef?: ComponentRef<Component>;\n  componentInstance?: ComputedPropertyComponent;\n}\n\n@Component({\n  selector: 'c8y-computed-properties-config',\n  templateUrl: './computed-properties-config.component.html',\n  standalone: true,\n  imports: [C8yTranslatePipe, IconDirective, FormsModule, NgFor]\n})\nexport class ComputedPropertiesConfigComponent {\n  @Input() properties: AssetPropertyType[] = [];\n  @Input() definitions: ComputedPropertyDefinition[] = [];\n  @Input() asset?: IManagedObject;\n\n  hosts = viewChildren('host', { read: ViewContainerRef });\n  configForms = viewChildren('configForm', { read: NgForm });\n\n  propertyConfigs: PropertyConfig[] = [];\n  result: Promise<unknown[]> = new Promise((resolve, reject) => {\n    this._close = resolve;\n    this._cancel = reject;\n  });\n\n  private injector = inject(Injector);\n  private bsModalRef = inject(BsModalRef);\n  private _close: (value: unknown[]) => void;\n  private _cancel: (reason?: any) => void;\n\n  constructor() {\n    effect(async () => {\n      const hosts = this.hosts();\n      if (!hosts || hosts.length === 0) {\n        return;\n      }\n      for (let i = 0; i < this.propertyConfigs.length; i++) {\n        const propertyConfig = this.propertyConfigs[i];\n        const host = hosts[i];\n        if (host && propertyConfig.definition) {\n          await this.createConfigComponent(propertyConfig, host);\n        }\n      }\n    });\n  }\n\n  ngOnInit() {\n    this.propertyConfigs = this.properties.map((property, index) => ({\n      property,\n      definition: this.definitions[index],\n      config: property.config || this.definitions[index].prop.config\n    }));\n  }\n\n  get isFormValid(): boolean {\n    return this.configForms().every(form => form.valid) ?? false;\n  }\n\n  async apply(): Promise<void> {\n    const allValid = await this.callOnBeforeSaveHooks();\n    if (allValid) {\n      const configs = this.propertyConfigs.map(pc => pc.config);\n      this._close(configs);\n      this.bsModalRef.hide();\n    }\n  }\n\n  cancel(): void {\n    this.bsModalRef.hide();\n    this._cancel();\n  }\n\n  private async createConfigComponent(\n    propertyConfig: PropertyConfig,\n    host: ViewContainerRef\n  ): Promise<void> {\n    const component = await this.getComponent(propertyConfig.definition);\n    host.clear();\n    const componentRef = host.createComponent(component, {\n      environmentInjector: this.injector as EnvironmentInjector\n    });\n\n    propertyConfig.componentRef = componentRef;\n    propertyConfig.componentInstance = componentRef.instance as ComputedPropertyComponent;\n\n    const componentMetadata = this.safeReflectComponentType(component);\n    const hasConfigInput = componentMetadata?.inputs.some(input => input.propName === 'config');\n\n    if (hasConfigInput) {\n      componentRef.setInput('config', propertyConfig.config);\n    } else {\n      propertyConfig.componentInstance.config = propertyConfig.config;\n    }\n\n    const hasAssetInput = componentMetadata?.inputs.some(input => input.propName === 'asset');\n    if (hasAssetInput) {\n      componentRef.setInput('asset', this.asset);\n    } else {\n      propertyConfig.componentInstance.asset = this.asset;\n    }\n  }\n\n  private safeReflectComponentType(componentType: Type<any>) {\n    try {\n      return reflectComponentType(componentType);\n    } catch (error) {\n      console.warn('Failed to reflect component metadata:', error);\n      return { inputs: [] };\n    }\n  }\n\n  private async getComponent(definition: ComputedPropertyDefinition): Promise<Type<any>> {\n    if (!!definition.loadConfigComponent) {\n      return await definition.loadConfigComponent();\n    } else if (!!definition.configComponent) {\n      return definition.configComponent;\n    }\n  }\n\n  private async callOnBeforeSaveHooks(): Promise<boolean> {\n    const validationObservables = this.propertyConfigs\n      .filter(pc => pc.componentRef)\n      .map(pc => this.callSingleOnBeforeSaveHook(pc.componentRef, pc.config));\n\n    try {\n      const validationPromises = validationObservables.map(obs => firstValueFrom(obs));\n      const results = await Promise.all(validationPromises);\n      return results.every(result => result === true);\n    } catch (error) {\n      return false;\n    }\n  }\n\n  private callSingleOnBeforeSaveHook(\n    componentRef: ComponentRef<Component>,\n    config: unknown\n  ): Observable<boolean> {\n    if (!componentRef) {\n      return of(true);\n    }\n    const hook = (componentRef.instance as OnBeforeSave).onBeforeSave;\n    if (hook) {\n      const result = hook.call(componentRef.instance, config);\n      if (isUndefined(result)) {\n        return of(true);\n      }\n      if (isPromise(result)) {\n        return from(result) as Observable<boolean>;\n      }\n      return (isObservable(result) ? result : of(result)) as Observable<boolean>;\n    }\n    return of(true);\n  }\n}\n","<div class=\"viewport-modal has-asset-selector\">\n  <div class=\"modal-header dialog-header\">\n    <i [c8yIcon]=\"'bolt'\"></i>\n    <div\n      class=\"modal-title\"\n      id=\"modal-title\"\n      translate\n    >\n      Configure computed properties\n    </div>\n  </div>\n  <div\n    class=\"inner-scroll\"\n    id=\"modal-body\"\n  >\n    <p\n      class=\"p-t-16 p-l-24 p-r-24 p-b-16 bg-component separator-bottom sticky-top text-center text-balance\"\n      translate\n    >\n      Configure the settings below for each computed property. These configurations determine how\n      the properties will be calculated and displayed. All required fields must be completed before\n      you can apply the changes.\n    </p>\n    <div class=\"p-24 p-t-0\">\n      <fieldset\n        class=\"property-config-section c8y-fieldset p-b-8\"\n        *ngFor=\"let propertyConfig of propertyConfigs; let i = index\"\n      >\n        <legend>\n          {{ (propertyConfig.property.label || propertyConfig.property.name) | translate }}\n          <span class=\"a-s-center m-l-8 tag tag--default\">{{ propertyConfig.property.name }}</span>\n        </legend>\n        <form\n          class=\"property-config-form\"\n          name=\"configForm{{ i }}\"\n          #configForm=\"ngForm\"\n        >\n          <ng-template #host></ng-template>\n        </form>\n      </fieldset>\n    </div>\n  </div>\n  <div class=\"modal-footer\">\n    <button\n      class=\"btn btn-default\"\n      [title]=\"'Cancel' | translate\"\n      type=\"button\"\n      (click)=\"cancel()\"\n    >\n      {{ 'Cancel' | translate }}\n    </button>\n    <button\n      class=\"btn btn-primary\"\n      [title]=\"'Apply' | translate\"\n      type=\"button\"\n      (click)=\"apply()\"\n      [disabled]=\"!isFormValid\"\n    >\n      {{ 'Apply' | translate }}\n    </button>\n  </div>\n</div>\n","import { inject, Pipe } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AssetPropertyFlatNode } from './tree-data-source';\n\n/**\n * Pipe to get the title for the collapse/expand button of a tree node.\n */\n@Pipe({\n  name: 'c8yAssetPropertyCollapseButtonTitle',\n  standalone: true\n})\nexport class AssetPropertyCollapseButtonTitlePipe {\n  private collapseLabel = gettext('Collapse \"{{ assetPropertyLabel }}\"');\n  private expandLabel = gettext('Expand \"{{ assetPropertyLabel }}\"');\n  private readonly translateService = inject(TranslateService);\n\n  transform(expanded: boolean, node: AssetPropertyFlatNode): string {\n    if (!node) {\n      return '';\n    } else {\n      const template = expanded ? this.collapseLabel : this.expandLabel;\n      const assetPropertyLabel = node.property.label || node.property.title || node.property.name;\n      return this.translateService.instant(template, {\n        assetPropertyLabel: this.translateService.instant(assetPropertyLabel)\n      });\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { AssetPropertyFlatNode } from './tree-data-source';\nimport { NestedPropertyFields } from '../asset-properties.model';\n\nexport interface DragDropContext {\n  draggedNode: AssetPropertyFlatNode;\n  previousIndex: number;\n  currentIndex: number;\n  data: AssetPropertyFlatNode[];\n}\n\nexport interface DropPosition {\n  targetLevel: number;\n  targetParentPath: string;\n  insertIndex: number;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AssetPropertyDragDropService {\n  /**\n   * Main method to handle the drag and drop operation\n   */\n  handleDrop(context: DragDropContext): AssetPropertyFlatNode[] | null {\n    if (context.previousIndex === context.currentIndex) {\n      return null;\n    }\n\n    if (!this.validateDrop(context)) {\n      return null;\n    }\n\n    return this.performMove(context);\n  }\n\n  /**\n   * Validates if the drop operation is allowed\n   */\n  private validateDrop(context: DragDropContext): boolean {\n    const { draggedNode } = context;\n\n    // Get source and target information\n    const draggedLevel = this.getNodeLevel(draggedNode);\n    const dropPosition = this.calculateDropPosition(context);\n\n    // Validation 1: Check level compatibility\n    if (!this.validateLevelCompatibility(draggedLevel, dropPosition.targetLevel)) {\n      return false;\n    }\n\n    // Validation 2: For children, check parent compatibility\n    if (draggedLevel > 0) {\n      if (\n        !this.validateParentCompatibility(draggedNode, dropPosition.targetParentPath, draggedLevel)\n      ) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Validates that source and target levels match\n   */\n  private validateLevelCompatibility(sourceLevel: number, targetLevel: number): boolean {\n    return sourceLevel === targetLevel;\n  }\n\n  /**\n   * Validates that child nodes stay within their parent\n   */\n  private validateParentCompatibility(\n    node: AssetPropertyFlatNode,\n    targetParentPath: string,\n    nodeLevel: number\n  ): boolean {\n    const sourceParentPath = this.getParentPath(node, nodeLevel);\n    return !!targetParentPath && sourceParentPath === targetParentPath;\n  }\n\n  /**\n   * Performs the actual move operation\n   */\n  private performMove(context: DragDropContext): AssetPropertyFlatNode[] {\n    const { draggedNode } = context;\n\n    return this.isExpandableNode(draggedNode)\n      ? this.moveNodeWithChildren(context)\n      : this.moveSingleNode(context);\n  }\n\n  /**\n   * Moves a single node without children\n   */\n  private moveSingleNode(context: DragDropContext): AssetPropertyFlatNode[] {\n    const result = [...context.data];\n    const [removed] = result.splice(context.previousIndex, 1);\n    result.splice(context.currentIndex, 0, removed);\n    return result;\n  }\n\n  /**\n   * Moves a parent node along with all its children\n   */\n  private moveNodeWithChildren(context: DragDropContext): AssetPropertyFlatNode[] {\n    const { draggedNode, previousIndex, currentIndex, data } = context;\n\n    // Find all children of the parent\n    const childIndices = this.findChildIndices(draggedNode, data, previousIndex);\n\n    // Collect all nodes to move (parent + children)\n    const nodesToMove = this.collectNodesToMove(data, previousIndex, childIndices);\n\n    // Remove nodes from their current position\n    const remainingNodes = this.removeNodesFromData(data, previousIndex, childIndices);\n\n    // Calculate adjusted insertion index\n    const insertIndex = this.calculateAdjustedInsertIndex(\n      previousIndex,\n      currentIndex,\n      childIndices\n    );\n\n    // Insert nodes at new position\n    remainingNodes.splice(insertIndex, 0, ...nodesToMove);\n\n    return remainingNodes;\n  }\n\n  /**\n   * Finds indices of all children of a parent node\n   */\n  private findChildIndices(\n    parentNode: AssetPropertyFlatNode,\n    data: AssetPropertyFlatNode[],\n    parentIndex: number\n  ): number[] {\n    const childIndices: number[] = [];\n    const parentKey = this.getNodeKey(parentNode);\n    const parentLevel = this.getNodeLevel(parentNode);\n\n    for (let i = parentIndex + 1; i < data.length; i++) {\n      const node = data[i];\n\n      if (node.level <= parentLevel) {\n        // Reached a sibling or parent level - no more children\n        break;\n      }\n\n      if (this.isChildOfParent(node, parentKey, parentLevel)) {\n        childIndices.push(i);\n      }\n    }\n\n    return childIndices;\n  }\n\n  /**\n   * Collects parent and children nodes to move\n   */\n  private collectNodesToMove(\n    data: AssetPropertyFlatNode[],\n    parentIndex: number,\n    childIndices: number[]\n  ): AssetPropertyFlatNode[] {\n    const nodes = [data[parentIndex]];\n    childIndices.forEach(index => nodes.push(data[index]));\n    return nodes;\n  }\n\n  /**\n   * Removes nodes from data array\n   */\n  private removeNodesFromData(\n    data: AssetPropertyFlatNode[],\n    parentIndex: number,\n    childIndices: number[]\n  ): AssetPropertyFlatNode[] {\n    const indicesToRemove = new Set([parentIndex, ...childIndices]);\n    return data.filter((_, index) => !indicesToRemove.has(index));\n  }\n\n  /**\n   * Calculates the adjusted insertion index when moving with children\n   */\n  private calculateAdjustedInsertIndex(\n    previousIndex: number,\n    targetIndex: number,\n    childIndices: number[]\n  ): number {\n    if (targetIndex <= previousIndex) {\n      // Moving up - no adjustment needed\n      return targetIndex;\n    }\n\n    // Moving down - adjust for removed children\n    const lastChildIndex =\n      childIndices.length > 0 ? childIndices[childIndices.length - 1] : previousIndex;\n\n    // Check if dropping within own children (only when children are visible)\n    // After parent removal, children shift down by 1, so last child is at lastChildIndex - 1\n    if (childIndices.length > 0 && targetIndex <= lastChildIndex - 1) {\n      // Target is within our own children - no real move\n      return previousIndex;\n    }\n\n    // Adjust for the number of removed children\n    // currentIndex accounts for parent removal, we need to adjust for children\n    return targetIndex - childIndices.length;\n  }\n\n  /**\n   * Calculates the drop position details\n   */\n  private calculateDropPosition(context: DragDropContext): DropPosition {\n    const { draggedNode, currentIndex, data, previousIndex } = context;\n    const draggedLevel = this.getNodeLevel(draggedNode);\n\n    // Create simulated data with item removed\n    const simulatedData = [...data];\n    simulatedData.splice(previousIndex, 1);\n\n    // Calculate target level\n    const targetLevel = this.calculateTargetLevel(simulatedData, currentIndex, draggedLevel);\n\n    // Calculate target parent path for child nodes\n    const targetParentPath =\n      draggedLevel > 0 ? this.findTargetParentPath(simulatedData, currentIndex, draggedLevel) : '';\n\n    return {\n      targetLevel,\n      targetParentPath,\n      insertIndex: currentIndex\n    };\n  }\n\n  /**\n   * Determines the expected level at the target position\n   */\n  private calculateTargetLevel(\n    simulatedData: AssetPropertyFlatNode[],\n    targetIndex: number,\n    draggedLevel: number\n  ): number {\n    // Handle edge cases\n    if (targetIndex === 0) {\n      return 0;\n    }\n\n    if (targetIndex >= simulatedData.length) {\n      return this.calculateEndPositionLevel(simulatedData, draggedLevel);\n    }\n\n    // Handle middle positions\n    return this.calculateMiddlePositionLevel(simulatedData, targetIndex, draggedLevel);\n  }\n\n  /**\n   * Calculates level for end position drops\n   */\n  private calculateEndPositionLevel(\n    simulatedData: AssetPropertyFlatNode[],\n    draggedLevel: number\n  ): number {\n    if (simulatedData.length === 0) {\n      return 0;\n    }\n\n    const lastItem = simulatedData[simulatedData.length - 1];\n\n    // Allow root items to be placed after child groups\n    if (lastItem.level > 0 && draggedLevel === 0) {\n      return 0;\n    }\n\n    return lastItem.level;\n  }\n\n  /**\n   * Calculates level for middle position drops\n   */\n  private calculateMiddlePositionLevel(\n    simulatedData: AssetPropertyFlatNode[],\n    targetIndex: number,\n    draggedLevel: number\n  ): number {\n    const prevItem = simulatedData[targetIndex - 1];\n    const nextItem = simulatedData[targetIndex];\n\n    // Check for boundary positions\n    if (this.isBoundaryPosition(prevItem, nextItem)) {\n      return this.handleBoundaryPosition(prevItem, nextItem, draggedLevel);\n    }\n\n    // Check for parent-first-child position\n    if (this.isParentFirstChildPosition(prevItem, nextItem)) {\n      return nextItem.level;\n    }\n\n    // Default to previous item's level\n    return prevItem?.level || 0;\n  }\n\n  /**\n   * Finds the parent path for the target position\n   */\n  private findTargetParentPath(\n    simulatedData: AssetPropertyFlatNode[],\n    targetIndex: number,\n    targetLevel: number\n  ): string {\n    // Look at surrounding items\n    const prevItem = targetIndex > 0 ? simulatedData[targetIndex - 1] : null;\n    const nextItem = targetIndex < simulatedData.length ? simulatedData[targetIndex] : null;\n\n    // Check if dropping after a parent (becoming first child)\n    if (this.isDroppingAfterParent(prevItem, targetLevel)) {\n      return this.getNodeKey(prevItem);\n    }\n\n    // Check siblings for parent path\n    const siblingParentPath = this.getParentPathFromSiblings(prevItem, nextItem, targetLevel);\n\n    if (siblingParentPath) {\n      return siblingParentPath;\n    }\n\n    // Search backwards for parent\n    return this.searchBackwardsForParent(simulatedData, targetIndex, targetLevel);\n  }\n\n  private getNodeLevel(node: AssetPropertyFlatNode): number {\n    return node.level;\n  }\n\n  private getNodeKey(node: AssetPropertyFlatNode): string {\n    const keyPath = (node.property as NestedPropertyFields).keyPath;\n    return keyPath?.join('.') || node.property.name;\n  }\n\n  private getParentPath(node: AssetPropertyFlatNode, level: number): string {\n    const keyPath = (node.property as NestedPropertyFields).keyPath;\n    return keyPath?.slice(0, level).join('.') || '';\n  }\n\n  private isExpandableNode(node: AssetPropertyFlatNode): boolean {\n    return node.expandable;\n  }\n\n  private isChildOfParent(\n    node: AssetPropertyFlatNode,\n    parentKey: string,\n    parentLevel: number\n  ): boolean {\n    const nodeKeyPath = (node.property as NestedPropertyFields).keyPath;\n    if (!nodeKeyPath) return false;\n\n    const nodeParentPath = nodeKeyPath.slice(0, parentLevel + 1).join('.');\n    return nodeParentPath === parentKey;\n  }\n\n  private isBoundaryPosition(\n    prevItem: AssetPropertyFlatNode | null,\n    nextItem: AssetPropertyFlatNode | null\n  ): boolean {\n    return !!(prevItem && nextItem && prevItem.level > 0 && nextItem.level === 0);\n  }\n\n  private isParentFirstChildPosition(\n    prevItem: AssetPropertyFlatNode | null,\n    nextItem: AssetPropertyFlatNode | null\n  ): boolean {\n    return !!(prevItem?.expandable && nextItem && nextItem.level > prevItem.level);\n  }\n\n  private isDroppingAfterParent(\n    prevItem: AssetPropertyFlatNode | null,\n    targetLevel: number\n  ): boolean {\n    return !!(prevItem?.expandable && prevItem.level === targetLevel - 1);\n  }\n\n  private handleBoundaryPosition(\n    prevItem: AssetPropertyFlatNode,\n    nextItem: AssetPropertyFlatNode,\n    draggedLevel: number\n  ): number {\n    if (draggedLevel === 0) {\n      return 0;\n    }\n\n    if (draggedLevel === prevItem.level) {\n      // Additional validation could go here for same-parent check\n      return prevItem.level;\n    }\n\n    return prevItem.level;\n  }\n\n  private getParentPathFromSiblings(\n    prevItem: AssetPropertyFlatNode | null,\n    nextItem: AssetPropertyFlatNode | null,\n    targetLevel: number\n  ): string {\n    if (prevItem?.level === targetLevel) {\n      return this.getParentPath(prevItem, targetLevel);\n    }\n\n    if (nextItem?.level === targetLevel) {\n      return this.getParentPath(nextItem, targetLevel);\n    }\n\n    return '';\n  }\n\n  private searchBackwardsForParent(\n    data: AssetPropertyFlatNode[],\n    startIndex: number,\n    targetLevel: number\n  ): string {\n    for (let i = startIndex - 1; i >= 0; i--) {\n      const node = data[i];\n\n      if (node.level === targetLevel - 1 && node.expandable) {\n        return this.getNodeKey(node);\n      }\n\n      if (node.level < targetLevel - 1) {\n        break;\n      }\n    }\n\n    return '';\n  }\n}\n","import { NgClass, NgTemplateOutlet, AsyncPipe } from '@angular/common';\nimport { CdkDragDrop, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop';\nimport {\n  Component,\n  ContentChild,\n  EventEmitter,\n  inject,\n  Input,\n  OnChanges,\n  OnDestroy,\n  OnInit,\n  Output,\n  effect,\n  viewChild,\n  SimpleChanges\n} from '@angular/core';\nimport {\n  AssetPropertyListConfig,\n  AssetPropertyType,\n  ComputedPropertyDefinition,\n  defaultAssetProperties,\n  defaultAssetPropertyListConfig,\n  NestedPropertyFields\n} from '../asset-properties.model';\nimport { AssetPropertiesService } from '../asset-properties.service';\nimport {\n  C8yTranslatePipe,\n  EmptyStateComponent,\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 { CustomPropertiesDrawerService } from '../custom-properties-drawer.service';\nimport { AssetPropertyIconPipe } from './asset-property-icon.pipe';\nimport { AssetPropertyIconTooltipPipe } from './asset-property-icon-tooltip.pipe';\nimport { ComputedPropertiesService } from '../computed-properties.service';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ComputedPropertiesConfigComponent } from '../computed-properties-config/computed-properties-config.component';\nimport { AssetPropertyCollapseButtonTitlePipe } from './asset-property-collapse-button-title.pipe';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AssetPropertyDragDropService } from './asset-property-drag-drop.service';\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    NgClass,\n    AsyncPipe,\n    FormsModule,\n    ListGroupModule,\n    C8yTranslatePipe,\n    TooltipModule,\n    IconDirective,\n    CdkTreeModule,\n    NgTemplateOutlet,\n    AssetPropertyValuePipe,\n    EmptyStateComponent,\n    AssetPropertyIconPipe,\n    NgClass,\n    AssetPropertyIconTooltipPipe,\n    AssetPropertyCollapseButtonTitlePipe,\n    CdkDropList,\n    CdkDrag\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   * Extra properties to be displayed in the list.\n   */\n  @Input() extraProperties: 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 filtering properties.\n   */\n  filterText = '';\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  hasExpandableNodes: boolean;\n  areAllNodesExpanded: boolean;\n  collapseAllLabel = gettext('Collapse all');\n  expandAllLabel = gettext('Expand all');\n  dragHandleEnabledLabel = gettext('Click and drag to reorder');\n  dragHandleDisabledLabel = gettext('Clear filtering to reorder');\n  get cdkDragDisabled() {\n    return !!this.filterText;\n  }\n\n  readonly TREE_NODE_INDENT = 24;\n  /**\n   * Stores all nodes in their complete ordered state (source of truth for order)\n   */\n  private allNodesComplete: AssetPropertyFlatNode[] = [];\n  /**\n   * Tracks which parent nodes are expanded (key = node key, value = expanded state)\n   */\n  private expansionState = new Map<string, boolean>();\n  /**\n   * List of properties that have been added temporarily as custom properties.\n   */\n  private allAddedProperties: AssetPropertyType[] = [];\n  /**\n   * List of properties that have been added temporarily as custom properties filtered according to context asset.\n   */\n  private displayAddedProperties: AssetPropertyType[] = [];\n  /**\n   * Subject for handling filter input.\n   */\n  private filterSubject$ = 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  private customPropertiesDrawerService = inject(CustomPropertiesDrawerService);\n  private computedPropertiesService = inject(ComputedPropertiesService);\n  private modalService = inject(BsModalService);\n  private dragDropService = inject(AssetPropertyDragDropService);\n\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.expandAllNodesInState();\n          this.rebuildVisibleData();\n        });\n      }\n    });\n  }\n\n  ngOnInit() {\n    this.config = {\n      ...defaultAssetPropertyListConfig,\n      ...this.config\n    };\n    this.filterSubject$\n      .pipe(takeUntil(this.destroy$), debounceTime(200))\n      .subscribe(() => this.filterTree());\n  }\n\n  async ngOnChanges(changes: SimpleChanges) {\n    if (changes['asset'] && !changes['asset'].firstChange) {\n      await this.updateDisplayAddedProperties();\n    }\n    const shouldRebuild = changes['asset'] || changes['extraProperties'];\n    await this.updateProperties(!!shouldRebuild);\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   * Opens the drawer to add new custom properties.\n   */\n  async addProperty() {\n    const propertiesToAdd = await this.customPropertiesDrawerService.getCustomProperties(\n      this.asset,\n      { hiddenTabs: { asset: true, ...this.config.hiddenTabs } }\n    );\n    if (!propertiesToAdd || propertiesToAdd.length === 0) {\n      return;\n    }\n\n    const propertiesNeedingConfig: AssetPropertyType[] = [];\n    const definitionsNeedingConfig: ComputedPropertyDefinition[] = [];\n    const propertiesToActuallyAdd: AssetPropertyType[] = [];\n\n    for (const prop of propertiesToAdd) {\n      if (prop.computed) {\n        const definition = await this.computedPropertiesService.getByName(prop.name);\n        if (definition.configComponent || definition.loadConfigComponent) {\n          propertiesNeedingConfig.push(prop);\n          definitionsNeedingConfig.push(definition);\n        } else {\n          prop.temporary = true;\n          propertiesToActuallyAdd.push(prop);\n        }\n      } else {\n        prop.temporary = true;\n        propertiesToActuallyAdd.push(prop);\n      }\n    }\n\n    if (propertiesNeedingConfig.length > 0) {\n      try {\n        const configs = await this.configureMultipleProperties(\n          propertiesNeedingConfig,\n          definitionsNeedingConfig\n        );\n\n        propertiesNeedingConfig.forEach((prop, index) => {\n          prop.config = configs[index];\n          prop.temporary = true;\n          propertiesToActuallyAdd.push(prop);\n        });\n      } catch {}\n    }\n\n    if (propertiesToActuallyAdd.length === 0) {\n      return;\n    }\n\n    propertiesToActuallyAdd.forEach(prop => {\n      if (this.asset?.id) {\n        prop.configuredAssetId = this.asset.id;\n      }\n      // Generate instanceId for computed properties to allow multiple instances\n      if (prop.computed && !prop.instanceId) {\n        prop.instanceId = crypto.randomUUID();\n      }\n    });\n    this.allAddedProperties = this.allAddedProperties.concat(propertiesToActuallyAdd);\n    await this.updateDisplayAddedProperties();\n    await this.updateProperties(false, propertiesToActuallyAdd);\n    this.selectedProperties.next(\n      this.dataSource.data.filter(n => n.property.active).map(n => n.property)\n    );\n  }\n\n  /**\n   * Displays the configuration modal for multiple computed properties and updates their configurations.\n   * @param properties Properties to configure.\n   * @param definitions Computed property definitions including config components.\n   * @returns Promise resolving to array of configurations.\n   */\n  configureMultipleProperties(\n    properties: AssetPropertyType[],\n    definitions: ComputedPropertyDefinition[]\n  ): Promise<unknown[]> {\n    const modalRef = this.modalService.show(ComputedPropertiesConfigComponent, {\n      ignoreBackdropClick: true,\n      class: 'modal-lg',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      initialState: {\n        properties,\n        definitions,\n        asset: this.asset\n      }\n    }).content;\n    return modalRef.result;\n  }\n\n  /**\n   * Displays the configuration modal for a computed property and updates its configuration.\n   * @param property Property to configure.\n   * @param definition Computed property definition including config component.\n   * @returns true if the property was configured, false if cancelled.\n   */\n  async configureProperty(\n    property: AssetPropertyType,\n    definition: ComputedPropertyDefinition\n  ): Promise<boolean> {\n    try {\n      const configs = await this.configureMultipleProperties([property], [definition]);\n      property.config = configs[0];\n      return true;\n    } catch (err) {\n      return false;\n    }\n  }\n\n  /**\n   * Removes temporary property from the list.\n   * @param property The property to remove.\n   */\n  async removeProperty(property: AssetPropertyType): Promise<void> {\n    let filterFn;\n    if (this.assetPropertiesService.isComplexProperty(property)) {\n      filterFn = (p: AssetPropertyType) => {\n        if (p === property) {\n          // remove complex property itself\n          return false;\n        }\n        if ('keyPath' in p && Array.isArray((p as NestedPropertyFields).keyPath)) {\n          // remove children of complex property\n          const keyPath = (p as NestedPropertyFields).keyPath;\n          return keyPath[0] !== property.name;\n        }\n        return true;\n      };\n    } else {\n      // Remove only the property itself\n      filterFn = (p: AssetPropertyType) => p !== property;\n    }\n\n    this.allAddedProperties = this.allAddedProperties.filter(filterFn);\n    this.displayAddedProperties = this.displayAddedProperties.filter(filterFn);\n\n    // Also update the complete data when removing properties\n    const propertyKey = (property as NestedPropertyFields).keyPath?.join('.') || property.name;\n    this.allNodesComplete = this.allNodesComplete.filter(node => {\n      const nodeKey =\n        (node.property as NestedPropertyFields).keyPath?.join('.') || node.property.name;\n      if (this.assetPropertiesService.isComplexProperty(property)) {\n        // Remove the property and its children\n        return !nodeKey.startsWith(propertyKey);\n      } else {\n        return nodeKey !== propertyKey;\n      }\n    });\n\n    this.properties = this.allNodesComplete.map(node => node.property);\n\n    await this.updateProperties(false);\n  }\n\n  async editProperty(property: AssetPropertyType): Promise<void> {\n    const definition = await this.computedPropertiesService.getByName(property.name);\n    const configured = await this.configureProperty(property, definition);\n    if (configured && this.asset?.id) {\n      property.configuredAssetId = this.asset.id;\n    }\n    await this.updateProperties(false);\n    this.selectedProperties.next(\n      this.dataSource.data.filter(n => n.property.active).map(n => n.property)\n    );\n  }\n\n  hasChild(node: AssetPropertyFlatNode): boolean {\n    return node.expandable;\n  }\n\n  /**\n   * Checks if the property's context asset matches the current asset.\n   * @param node The node to check.\n   * @returns True if the context asset doesn't match the current asset.\n   */\n  isContextMismatch(node: AssetPropertyFlatNode): boolean {\n    if (!node.property.computed || !node.configuredAssetId) {\n      return false;\n    }\n    return this.asset?.id !== node.configuredAssetId;\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   * Checks if a node is expanded.\n   * @param node The node to check.\n   * @returns True if the node is expanded.\n   */\n  isNodeExpanded(node: AssetPropertyFlatNode): boolean {\n    if (!node.expandable) {\n      return false;\n    }\n    const key = this.getNodeKey(node);\n    return this.expansionState.get(key) ?? false;\n  }\n\n  /**\n   * Toggles the expansion state of a node.\n   * @param node The node to toggle.\n   */\n  toggleNode(node: AssetPropertyFlatNode): void {\n    if (!node.expandable) {\n      return;\n    }\n\n    const key = this.getNodeKey(node);\n    const currentState = this.expansionState.get(key) ?? false;\n    this.expansionState.set(key, !currentState);\n\n    this.rebuildVisibleData();\n    this.updateAreAllNodesExpandedState();\n    this.applySelectedPropertiesFromConfig();\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, emit = true): void {\n    const matchingNode = this.allNodesComplete.find(n => n === node);\n    if (matchingNode && matchingNode.property.active === selected) {\n      return;\n    }\n    this.allNodesComplete.forEach(n => {\n      n.property.active = false;\n    });\n\n    node.property.active = selected;\n\n    if (selected && node.expandable && !this.isNodeExpanded(node)) {\n      const key = this.getNodeKey(node);\n      this.expansionState.set(key, true);\n      this.rebuildVisibleData();\n      this.updateAreAllNodesExpandedState();\n    }\n    if (selected && emit) {\n      this.selectedProperties.next([node.property]);\n    }\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, emit = true): void {\n    node.property.active = selected;\n\n    if (selected && node.expandable && !this.isNodeExpanded(node)) {\n      const key = this.getNodeKey(node);\n      this.expansionState.set(key, true);\n      this.rebuildVisibleData();\n      this.updateAreAllNodesExpandedState();\n    }\n\n    if (node.expandable) {\n      this.updateChildSelectionStatus(node, selected);\n    }\n\n    this.updateSelectAllState();\n\n    const selectedProperties = this.allNodesComplete\n      .filter(n => n.property.active)\n      .map(n => n.property);\n\n    if (emit) {\n      this.selectedProperties.next(selectedProperties);\n    }\n  }\n\n  /**\n   * Initiates a filter operation.\n   */\n  onFilter(): void {\n    this.filterSubject$.next(this.filterText);\n  }\n\n  /**\n   * Clears the filter input.\n   */\n  clearFilter(): void {\n    this.filterText = '';\n    this.onFilter();\n  }\n\n  drop(event: CdkDragDrop<AssetPropertyFlatNode[]>) {\n    if (this.cdkDragDisabled || !event.isPointerOverContainer) {\n      return;\n    }\n\n    const newVisibleData = this.dragDropService.handleDrop({\n      draggedNode: this.dataSource.data[event.previousIndex],\n      previousIndex: event.previousIndex,\n      currentIndex: event.currentIndex,\n      data: this.dataSource.data\n    });\n\n    if (newVisibleData) {\n      this.updateCompleteDataOrder(newVisibleData);\n      this.rebuildVisibleData();\n\n      const selectedProperties = this.allNodesComplete\n        .filter(n => n.property.active)\n        .map(n => n.property);\n\n      this.selectedProperties.next(selectedProperties);\n    }\n  }\n\n  /**\n   * Toggles expansion of all nodes - expands all if any are collapsed, otherwise collapses all.\n   */\n  toggleExpandCollapseAll(): void {\n    if (this.areAllNodesExpanded) {\n      this.collapseAllNodesInState();\n    } else {\n      this.expandAllNodesInState();\n    }\n    this.rebuildVisibleData();\n    this.updateAreAllNodesExpandedState();\n  }\n\n  /**\n   * Calculates the max-width for a column based on node level and configuration.\n   * @param node The node to calculate width for.\n   * @returns The calculated max-width CSS value.\n   */\n  getColumnMaxWidth(node: AssetPropertyFlatNode): string {\n    const percentage = !this.config.showKey && !this.config.showValue ? '100' : '50';\n    const levelOffset = (this.getLevel(node) + 1) * this.TREE_NODE_INDENT;\n    const levelAdjustment = this.getLevel(node) * 12;\n    return `calc(${percentage}% - ${levelOffset}px + ${levelAdjustment}px)`;\n  }\n\n  /**\n   * Gets the unique key for a node.\n   * @param node The node.\n   * @returns The unique key.\n   */\n  private getNodeKey(node: AssetPropertyFlatNode): string {\n    const keyPath = (node.property as NestedPropertyFields).keyPath;\n    if (keyPath) {\n      return keyPath.join('.');\n    }\n    if (node.property.computed && node.property.instanceId) {\n      return `${node.property.name}:${node.property.instanceId}`;\n    }\n    return node.property.name;\n  }\n\n  /**\n   * Updates the areAllNodesExpanded state based on expansion state.\n   */\n  private updateAreAllNodesExpandedState(): void {\n    const parentNodes = this.allNodesComplete.filter(node => node.expandable);\n    if (parentNodes.length === 0) {\n      this.areAllNodesExpanded = false;\n      return;\n    }\n\n    this.areAllNodesExpanded = parentNodes.every(node => {\n      const key = this.getNodeKey(node);\n      return this.expansionState.get(key) ?? false;\n    });\n  }\n\n  /**\n   * Expands all nodes in the expansion state.\n   */\n  private expandAllNodesInState(): void {\n    const parentNodes = this.allNodesComplete.filter(node => node.expandable);\n    parentNodes.forEach(node => {\n      const key = this.getNodeKey(node);\n      this.expansionState.set(key, true);\n    });\n    this.areAllNodesExpanded = true;\n  }\n\n  /**\n   * Collapses all nodes in the expansion state.\n   */\n  private collapseAllNodesInState(): void {\n    const parentNodes = this.allNodesComplete.filter(node => node.expandable);\n    parentNodes.forEach(node => {\n      const key = this.getNodeKey(node);\n      this.expansionState.set(key, false);\n    });\n    this.areAllNodesExpanded = false;\n  }\n\n  /**\n   * Updates the list of properties based on the configuration.\n   * @param rebuildFromAsset If true, rebuilds from scratch. Otherwise preserves existing order and only adds new properties.\n   * @param prependProperties New properties to add if not rebuilding from asset.\n   */\n  private async updateProperties(\n    rebuildFromAsset = false,\n    prependProperties: AssetPropertyType[] = []\n  ): Promise<void> {\n    const previouslySelectedProperties = this.dataSource.data\n      .filter(node => node.property.active)\n      .map(node => node.property);\n\n    if (this.config.inputPropertiesHandle === 'merge' || !this.config.inputPropertiesHandle) {\n      if (rebuildFromAsset) {\n        this.properties = [\n          ...prependProperties,\n          ...this.displayAddedProperties,\n          ...this.extraProperties,\n          ...(await this.getProperties())\n        ];\n      } else {\n        this.properties = [...prependProperties, ...this.properties];\n      }\n    } else if (this.config.inputPropertiesHandle === 'override') {\n      this.properties = [\n        ...prependProperties,\n        ...this.displayAddedProperties,\n        ...this.extraProperties\n      ];\n    }\n\n    this.buildTreeNodes();\n\n    if (previouslySelectedProperties.length > 0) {\n      previouslySelectedProperties.forEach(selectedProp => {\n        const matchingNode = this.dataSource.data.find(node =>\n          this.assetPropertiesService.propertiesMatch(node.property, selectedProp)\n        );\n        if (matchingNode) {\n          matchingNode.property.active = true;\n        }\n      });\n      this.updateSelectAllState();\n    }\n\n    // Needed because otherwise race condition occurs where the nested nodes are not yet built\n    queueMicrotask(() => {\n      this.applySelectedPropertiesFromConfig();\n    });\n  }\n\n  private applySelectedPropertiesFromConfig(): void {\n    if (!this.config.selectedProperties) {\n      return;\n    }\n    if (this.config.selectedProperties?.length === 0) {\n      this.allNodesComplete.forEach(node => {\n        node.property.active = false;\n      });\n      this.updateSelectAllState();\n      return;\n    }\n\n    let selectedPropertiesToApply = this.config.selectedProperties;\n    if (this.config.selectMode === 'single') {\n      selectedPropertiesToApply = this.config.selectedProperties.slice(0, 1);\n      // For single mode, find the matching node and only call onSelectSingle once\n      const nodeToSelect = this.dataSource.data.find(node =>\n        selectedPropertiesToApply.some(configProperty =>\n          this.assetPropertiesService.propertiesMatch(node.property, configProperty, [\n            'instanceId',\n            'configuredAssetId',\n            'config'\n          ])\n        )\n      );\n      if (nodeToSelect) {\n        this.onSelectSingle(true, nodeToSelect, false);\n      } else {\n        this.allNodesComplete.forEach(node => {\n          node.property.active = false;\n        });\n      }\n    } else {\n      // Multi or plus mode - iterate through all nodes\n      this.dataSource.data.forEach(node => {\n        const matchingNode = selectedPropertiesToApply.find(configProperty =>\n          this.assetPropertiesService.propertiesMatch(node.property, configProperty)\n        );\n        if (matchingNode) {\n          this.onSelectMulti(true, node, false);\n        } else {\n          this.onSelectMulti(false, node, false);\n        }\n      });\n    }\n  }\n\n  /**\n   * Updates the display added properties based on compatibility with current asset.\n   */\n  private async updateDisplayAddedProperties(): Promise<void> {\n    this.displayAddedProperties = await this.assetPropertiesService.filterCompatibleProperties(\n      this.allAddedProperties,\n      this.asset\n    );\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.allNodesComplete.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 filter criteria.\n   * @param property The property to check.\n   * @param filterText The filter text.\n   * @returns True if the property matches.\n   */\n  private matchesSearch(property: AssetPropertyType, filterText: string): boolean {\n    const filterByFields = [\n      property.label,\n      property.name,\n      (property as NestedPropertyFields).keyPath?.join('.'),\n      (property as NestedPropertyFields).title\n    ].filter(Boolean);\n\n    return filterByFields.some(field => field?.toLowerCase().includes(filterText));\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      // For computed properties with instanceId, include it in the key to allow multiple instances\n      let key: string;\n      if (hasKeyPath) {\n        key = (property as NestedPropertyFields).keyPath.join('.');\n      } else if (property.computed && property.instanceId) {\n        key = `${property.name}:${property.instanceId}`;\n      } else {\n        key = property.name;\n      }\n      if (this.config.addAssetToProperty && this.asset?.id) {\n        property.asset = { id: this.asset.id, name: this.asset.name };\n      }\n\n      const node: AssetPropertyFlatNode = {\n        expandable: isComplex,\n        level,\n        property,\n        isVisible: true,\n        indeterminate: false,\n        configuredAssetId: property.configuredAssetId\n      };\n\n      this.flatNodeMap.set(key, node);\n      treeData.push(node);\n    });\n\n    this.allNodesComplete = [...treeData];\n\n    // Apply filter and rebuild visible data\n    this.filterTree();\n    this.updateSelectAllState();\n    this.hasExpandableNodes = this.allNodesComplete.some(node => node.expandable);\n\n    if (\n      this.config.expansionMode === 'nonCollapsible' ||\n      this.config.expansionMode === 'expandedByDefault'\n    ) {\n      queueMicrotask(() => {\n        this.expandAllNodesInState();\n        this.rebuildVisibleData();\n        this.updateAreAllNodesExpandedState();\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 in complete data\n    this.allNodesComplete.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.allNodesComplete.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   * Filters the tree nodes based on the filter input.\n   */\n  private filterTree(): void {\n    const filterText = this.filterText?.toLowerCase() || '';\n\n    const allNodes =\n      this.allNodesComplete.length > 0\n        ? [...this.allNodesComplete]\n        : Array.from(this.flatNodeMap.values());\n\n    if (!filterText) {\n      allNodes.forEach(node => (node.isVisible = true));\n      this.rebuildVisibleData();\n      this.updateSelectAllState();\n      return;\n    }\n\n    // First pass: Mark nodes that match the filter criteria\n    allNodes.forEach(node => {\n      node.isVisible = this.matchesSearch(node.property, filterText);\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    // When filtering, show all matching nodes regardless of expansion state\n    const filteredNodes = allNodes.filter(node => node.isVisible);\n\n    // Update the data source with filtered nodes (ignoring expansion state during filter)\n    this.dataSource.data = filteredNodes;\n    this.updateSelectAllState();\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 and find parents in the complete data\n    for (let i = 1; i < keyPath.length; i++) {\n      const parentPath = keyPath.slice(0, i).join('.');\n      const parent = this.allNodesComplete.find(n => {\n        const nodeKey = (n.property as NestedPropertyFields).keyPath?.join('.') || n.property.name;\n        return nodeKey === parentPath;\n      });\n      if (parent) {\n        parent.isVisible = true;\n      } else {\n        break;\n      }\n    }\n  }\n\n  /**\n   * Rebuilds visible data based on expansion state (only when not filtering).\n   */\n  private rebuildVisibleData(): void {\n    if (this.filterText) {\n      return;\n    }\n\n    const visible: AssetPropertyFlatNode[] = [];\n\n    for (const node of this.allNodesComplete) {\n      if (this.shouldNodeBeVisible(node)) {\n        visible.push(node);\n      }\n    }\n\n    this.dataSource.data = visible;\n    this.updateSelectAllState();\n  }\n\n  /**\n   * Determines if a node should be visible based on expansion state.\n   * @param node The node to check.\n   * @returns True if the node should be visible.\n   */\n  private shouldNodeBeVisible(node: AssetPropertyFlatNode): boolean {\n    // Root nodes always visible (when not filtered)\n    if (node.level === 0) {\n      return node.isVisible;\n    }\n\n    // Check all parents are expanded\n    const keyPath = (node.property as NestedPropertyFields).keyPath;\n    if (!keyPath) {\n      return node.isVisible;\n    }\n\n    for (let i = 1; i <= node.level; i++) {\n      const parentPath = keyPath.slice(0, i).join('.');\n      if (!this.expansionState.get(parentPath)) {\n        return false;\n      }\n    }\n\n    return node.isVisible;\n  }\n\n  /**\n   * Updates complete data order after drag-drop on visible data.\n   * @param newVisibleData The new order of visible nodes.\n   */\n  private updateCompleteDataOrder(newVisibleData: AssetPropertyFlatNode[]): void {\n    // Create a map of visible nodes to their new positions\n    const visiblePositionMap = new Map<AssetPropertyFlatNode, number>();\n    newVisibleData.forEach((node, index) => {\n      visiblePositionMap.set(node, index);\n    });\n\n    // Separate nodes into visible and hidden\n    const visibleNodes: AssetPropertyFlatNode[] = [];\n    const hiddenNodes: AssetPropertyFlatNode[] = [];\n\n    this.allNodesComplete.forEach(node => {\n      if (visiblePositionMap.has(node)) {\n        visibleNodes.push(node);\n      } else {\n        hiddenNodes.push(node);\n      }\n    });\n\n    // Sort visible nodes by their new positions\n    visibleNodes.sort((a, b) => {\n      return visiblePositionMap.get(a)! - visiblePositionMap.get(b)!;\n    });\n\n    // Reconstruct complete data: insert hidden children after their parents\n    const result: AssetPropertyFlatNode[] = [];\n\n    for (const visibleNode of visibleNodes) {\n      result.push(visibleNode);\n\n      if (visibleNode.expandable) {\n        const parentKey = this.getNodeKey(visibleNode);\n        const children = hiddenNodes.filter(hiddenNode => {\n          const childKeyPath = (hiddenNode.property as NestedPropertyFields).keyPath;\n          if (!childKeyPath) return false;\n          const childParentPath = childKeyPath.slice(0, visibleNode.level + 1).join('.');\n          return childParentPath === parentKey;\n        });\n\n        // Sort children by their original order (by level then by name)\n        children.sort((a, b) => {\n          if (a.level !== b.level) return a.level - b.level;\n          const aKey = this.getNodeKey(a);\n          const bKey = this.getNodeKey(b);\n          return aKey.localeCompare(bKey);\n        });\n\n        result.push(...children);\n      }\n    }\n\n    this.allNodesComplete = result;\n    this.properties = result.map(node => node.property);\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 { computed, simple, complex } =\n      this.assetPropertiesService.categorizeAndFlattenHierarchicalProperties(properties);\n    return [...computed, ...simple, ...complex];\n  }\n}\n","<div\n  class=\"tree-container bg-inherit\"\n  [attr.aria-label]=\"'Asset property list' | translate\"\n  role=\"tree\"\n>\n  @if (config.showHeader || config.filterable) {\n    <div\n      class=\"select-all-container bg-inherit sticky-top\"\n      [ngClass]=\"{\n        'separator-bottom': config.filterable || (config.showHeader && dataSource.data.length)\n      }\"\n    >\n      @if (config.filterable) {\n        <div\n          class=\"form-group m-b-0 p-16 d-flex\"\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)]=\"filterText\"\n              (input)=\"onFilter()\"\n              [disabled]=\"!dataSource.data.length\"\n              #filter\n            />\n            @if (filter.value.length === 0) {\n              <span\n                class=\"input-group-addon\"\n                [attr.aria-hidden]=\"true\"\n              >\n                <i\n                  class=\"dlt-c8y-icon-search\"\n                  [c8yIcon]=\"'search'\"\n                ></i>\n              </span>\n            }\n            @if (filter.value.length > 0) {\n              <span\n                class=\"input-group-addon\"\n                [attr.aria-hidden]=\"true\"\n              >\n                <i\n                  class=\"text-muted dlt-c8y-icon-times\"\n                  [c8yIcon]=\"'times'\"\n                  [attr.aria-label]=\"'Clear filter' | translate\"\n                  tabindex=\"0\"\n                  role=\"button\"\n                  (click)=\"clearFilter()\"\n                ></i>\n              </span>\n            }\n          </div>\n        </div>\n      }\n      @if (config.showHeader && dataSource.data.length) {\n        <div class=\"d-flex a-i-center overflow-hidden\">\n          <div\n            class=\"flex-no-shrink d-flex a-i-center\"\n            [ngClass]=\"{\n              'p-l-40': !hasExpandableNodes && config.expansionMode !== 'nonCollapsible',\n              'p-r-8': config.selectMode !== 'none' && config.expansionMode === 'nonCollapsible'\n            }\"\n          >\n            @if (config.expansionMode !== 'nonCollapsible' && hasExpandableNodes) {\n              @let collapseAllButtonTitle =\n                (areAllNodesExpanded ? collapseAllLabel : expandAllLabel) | translate;\n              <button\n                class=\"collapse-btn btn-dot flex-no-shrink\"\n                [title]=\"collapseAllButtonTitle\"\n                [attr.aria-label]=\"collapseAllButtonTitle\"\n                type=\"button\"\n                [ngClass]=\"{ active: areAllNodesExpanded }\"\n                (click)=\"toggleExpandCollapseAll()\"\n              >\n                <i [c8yIcon]=\"'chevron-right'\"></i>\n              </button>\n            }\n          </div>\n          @if (config.selectMode === 'multi') {\n            <c8y-list-item-checkbox\n              class=\"p-l-4 p-r-4\"\n              [ngModel]=\"allSelected\"\n              [indeterminate]=\"indeterminate\"\n              (onSelect)=\"selectAll($event)\"\n            ></c8y-list-item-checkbox>\n          }\n          <div\n            class=\"p-t-40\"\n            [ngClass]=\"{\n              'p-l-24': config.selectMode === 'single',\n              'p-l-8': config.selectMode === 'none' && config.expansionMode === 'nonCollapsible'\n            }\"\n          ></div>\n          <div class=\"content-flex-30 fit-w m-t-4 m-b-4 m-0\">\n            <div class=\"col-6 d-flex a-i-center m-l-0 m-r-0\">\n              <span class=\"flex-no-shrink p-l-4 p-r-8\">\n                <div class=\"c8y-icon\"></div>\n              </span>\n              <span class=\"text-medium m-l-8\">\n                {{ 'Property' | translate }}\n              </span>\n            </div>\n            @if (config.showKey) {\n              <div [ngClass]=\"{ 'col-3': config.showValue, 'col-6': !config.showValue }\">\n                <span class=\"text-medium\">{{ 'Key' | translate }}</span>\n              </div>\n            }\n            @if (config.showValue) {\n              <div [ngClass]=\"{ 'col-3': config.showKey, 'col-6': !config.showKey }\">\n                <span class=\"text-medium\">{{ 'Value' | translate }}</span>\n              </div>\n            }\n          </div>\n          @if (assetPropertyAction) {\n            <div\n              class=\"m-l-8 p-l-24 asset-property-list__actions\"\n              [ngClass]=\"{\n                'p-r-40': config.allowAddingCustomProperties,\n                'p-r-8': !config.allowAddingCustomProperties\n              }\"\n            ></div>\n          }\n        </div>\n      }\n    </div>\n  }\n\n  @if (dataSource.data.length) {\n    <cdk-tree\n      role=\"presentation\"\n      #tree\n      [dataSource]=\"dataSource\"\n      [levelAccessor]=\"getLevel\"\n      cdkDropList\n      cdkDropListOrientation=\"vertical\"\n      (cdkDropListDropped)=\"drop($event)\"\n      [cdkDropListDisabled]=\"!config.allowDragAndDrop || dataSource.data.length < 2\"\n    >\n      <!-- Tree Node Definition -->\n      <cdk-tree-node\n        class=\"c8y-list__item--dense\"\n        [attr.tabindex]=\"0\"\n        [attr.aria-level]=\"getLevel(node) + 1\"\n        [attr.aria-expanded]=\"hasChild(node) ? isNodeExpanded(node) : null\"\n        [attr.aria-selected]=\"config.selectMode !== 'none' ? node.property.active : null\"\n        role=\"treeitem\"\n        *cdkTreeNodeDef=\"let node\"\n        cdkTreeNodePadding\n        [cdkTreeNodePaddingIndent]=\"TREE_NODE_INDENT\"\n        [ngClass]=\"{\n          nonCollapsible: config.expansionMode === 'nonCollapsible',\n          nonSelectable: config.selectMode === 'none'\n        }\"\n        cdkDrag\n        cdkDragLockAxis=\"y\"\n        [cdkDragDisabled]=\"cdkDragDisabled\"\n      >\n        <div class=\"d-flex p-relative overflow-visible bg-inherit fit-h\">\n          @if (config.allowDragAndDrop && dataSource.data.length > 1) {\n            <div\n              class=\"drag-handle-wrapper\"\n              [ngClass]=\"{ 'drag-handle-disabled': cdkDragDisabled }\"\n            >\n              <button\n                class=\"drag-handle btn-clean\"\n                [title]=\"\n                  (cdkDragDisabled ? dragHandleDisabledLabel : dragHandleEnabledLabel) | translate\n                \"\n                [attr.aria-label]=\"\n                  (cdkDragDisabled ? dragHandleDisabledLabel : dragHandleEnabledLabel) | translate\n                \"\n                tabindex=\"-1\"\n                type=\"button\"\n                [disabled]=\"cdkDragDisabled\"\n              >\n                <i [c8yIcon]=\"'drag-reorder'\"></i>\n              </button>\n            </div>\n          }\n          <!-- Toggle Button for expandable nodes -->\n          @if (config.expansionMode !== 'nonCollapsible' && hasChild(node)) {\n            @let collapseButtonTitle =\n              isNodeExpanded(node) | c8yAssetPropertyCollapseButtonTitle: node;\n            <button\n              class=\"collapse-btn btn-dot flex-no-shrink\"\n              [title]=\"collapseButtonTitle\"\n              [attr.aria-label]=\"collapseButtonTitle\"\n              [attr.aria-expanded]=\"isNodeExpanded(node)\"\n              type=\"button\"\n              (click)=\"toggleNode(node)\"\n              [ngClass]=\"{ active: isNodeExpanded(node) }\"\n            >\n              <i [c8yIcon]=\"'chevron-right'\"></i>\n            </button>\n          }\n          <!-- Placeholder for non-expandable nodes to maintain alignment -->\n          @if (!hasChild(node) || config.expansionMode === 'nonCollapsible') {\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            ></div>\n          }\n          <!-- Selection Controls -->\n          @if (config.selectMode !== 'none') {\n            <div class=\"d-contents\">\n              @if (config.selectMode === 'single') {\n                <c8y-list-item-radio\n                  class=\"p-l-4 p-r-4\"\n                  type=\"radio\"\n                  [selected]=\"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 p-r-4\"\n                  [ngModel]=\"node.property.active\"\n                  [indeterminate]=\"node.indeterminate\"\n                  (onSelect)=\"onSelectMulti($event, node)\"\n                ></c8y-list-item-checkbox>\n              } @else if (config.selectMode === 'plus') {\n                @if (node.property.active) {\n                  <button\n                    class=\"btn btn-dot btn-dot--danger m-l-4 m-r-4 p-relative a-s-center\"\n                    style=\"z-index: 5\"\n                    [attr.aria-label]=\"'Remove' | translate\"\n                    [tooltip]=\"'Remove from selected properties' | translate\"\n                    type=\"button\"\n                    [delay]=\"500\"\n                    (click)=\"onSelectMulti(false, node)\"\n                  >\n                    <i\n                      class=\"icon-20\"\n                      c8yIcon=\"minus-circle\"\n                    ></i>\n                  </button>\n                }\n                @if (!node.property.active) {\n                  <button\n                    class=\"btn btn-dot text-primary m-l-4 m-r-4 p-relative a-s-center\"\n                    style=\"z-index: 5\"\n                    [attr.aria-label]=\"'Add to selected properties' | translate\"\n                    [tooltip]=\"\n                      (node.property.config\n                        ? 'Add to selected properties (requires configuration)'\n                        : 'Add to selected properties'\n                      ) | translate\n                    \"\n                    container=\"body\"\n                    type=\"button\"\n                    [delay]=\"500\"\n                    (click)=\"onSelectMulti(true, node)\"\n                  >\n                    <i\n                      class=\"text-primary icon-20\"\n                      [c8yIcon]=\"node.property.config ? 'plus-circle-o' : 'plus-circle'\"\n                    ></i>\n                  </button>\n                }\n              }\n            </div>\n          }\n          <div class=\"content-flex-30 fit-w bg-inherit m-0 min-width-0\">\n            <div\n              class=\"d-flex a-i-center bg-inherit m-0 flex-grow\"\n              [style.max-width]=\"getColumnMaxWidth(node)\"\n            >\n              <c8y-li-icon\n                class=\"p-r-4 p-l-4\"\n                [icon]=\"node.property | c8yAssetPropertyIcon\"\n                tooltip=\"{{ node.property | c8yAssetPropertyIconTooltip }}\"\n                container=\"body\"\n                [delay]=\"500\"\n                [ngClass]=\"{\n                  'p-l-4': config.selectMode !== 'none',\n                  'p-l-8': config.selectMode === 'none'\n                }\"\n              ></c8y-li-icon>\n\n              <span class=\"p-r-8 min-width-0 d-flex a-i-center\">\n                @if (isContextMismatch(node)) {\n                  @let tooltipText =\n                    'Property configured for a different asset. Reconfigure to match current asset.'\n                      | translate;\n                  <button\n                    class=\"btn-clean m-r-4\"\n                    [attr.aria-label]=\"tooltipText\"\n                    [tooltip]=\"tooltipText\"\n                    placement=\"top\"\n                    type=\"button\"\n                    [container]=\"'body'\"\n                  >\n                    <i\n                      class=\"status critical stroked-icon\"\n                      c8yIcon=\"exclamation-circle\"\n                    ></i>\n                  </button>\n                }\n\n                <div\n                  class=\"text-truncate\"\n                  title=\"{{\n                    node.property.label || node.property.title || node.property.name | translate\n                  }}\"\n                  [ngClass]=\"{\n                    'text-muted': node.property.temporary,\n                    'text-danger': isContextMismatch(node)\n                  }\"\n                >\n                  {{ node.property.label || node.property.title || node.property.name | translate }}\n                </div>\n              </span>\n            </div>\n            @if (config.showKey) {\n              <div\n                class=\"d-flex a-i-center\"\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=\"{{\n                    node.property.keyPath?.join('.') || (node.property?.name | translate)\n                  }}\"\n                >\n                  {{ node.property.keyPath?.join('.') || (node.property?.name | translate) }}\n                </span>\n              </div>\n            }\n            @if (asset && config.showValue) {\n              <div\n                class=\"d-flex a-i-center\"\n                [ngClass]=\"{ 'col-3': config.showKey, 'col-6': !config.showKey }\"\n              >\n                @let value = node.property | c8yAssetPropertyValue: asset | async;\n                <span\n                  class=\"tag tag--info d-inline-block a-s-center text-truncate\"\n                  title=\"{{ value }}\"\n                >\n                  {{ value }}\n                </span>\n              </div>\n            }\n          </div>\n          @if (assetPropertyAction || node.property.temporary) {\n            <div\n              class=\"m-l-8 showOnHover d-flex a-i-center j-c-end asset-property-list__actions\"\n              [ngClass]=\"{\n                'p-l-32': !node.property.temporary && config.allowAddingCustomProperties,\n                'has-computed': node.property.computed && node.property.config\n              }\"\n            >\n              @if (node.property.computed && node.property.config) {\n                <button\n                  class=\"btn btn-dot m-l-auto\"\n                  title=\"{{ 'Configure' | translate }}\"\n                  (click)=\"editProperty(node.property)\"\n                >\n                  <i [c8yIcon]=\"'cog'\"></i>\n                </button>\n              }\n              @if (node.property.temporary) {\n                <button\n                  class=\"btn btn-dot btn-dot--danger\"\n                  [attr.aria-label]=\"'Remove' | translate\"\n                  tooltip=\"{{ 'Remove' | translate }}\"\n                  container=\"body\"\n                  type=\"button\"\n                  [ngClass]=\"{ 'm-l-auto': !node.property.computed || !node.property.config }\"\n                  [delay]=\"500\"\n                  (click)=\"removeProperty(node.property)\"\n                >\n                  <i c8yIcon=\"minus-circle\"></i>\n                </button>\n              }\n              <ng-container\n                *ngTemplateOutlet=\"\n                  assetPropertyAction?.template;\n                  context: {\n                    $implicit: node.property\n                  }\n                \"\n              ></ng-container>\n            </div>\n          }\n        </div>\n      </cdk-tree-node>\n    </cdk-tree>\n  } @else {\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  }\n  @if (config.allowAddingCustomProperties) {\n    <div class=\"sticky-bottom bg-inherit separator-top p-16\">\n      <button\n        class=\"btn btn-default btn-sm m-l-8\"\n        (click)=\"addProperty()\"\n        data-cy=\"asset-property-item-add-button\"\n      >\n        <i [c8yIcon]=\"'plus'\"></i>\n        {{ 'Add property' | translate }}\n      </button>\n    </div>\n  }\n</div>\n","import {\n  Component,\n  EventEmitter,\n  inject,\n  Input,\n  OnInit,\n  Output,\n  OnDestroy,\n  OnChanges,\n  SimpleChanges\n} from '@angular/core';\nimport { IManagedObject, Paging } from '@c8y/client';\nimport {\n  C8yTranslatePipe,\n  FormsModule,\n  IconDirective,\n  LoadMoreComponent,\n  TabComponent,\n  TabsOutletComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { cloneDeep } from 'lodash-es';\nimport {\n  AssetPropertyListConfig,\n  AssetPropertyTab,\n  AssetPropertyType,\n  HiddenTabs,\n  defaultAssetProperties\n} from '../asset-properties.model';\nimport { AssetPropertyListComponent } from '../asset-property-list/asset-property-list.component';\nimport { AssetPropertiesService } from '../asset-properties.service';\nimport { debounceTime, Subject, takeUntil } from 'rxjs';\nimport { ComputedPropertiesService } from '../computed-properties.service';\n\n/**\n * Represents a reusable component for displaying and managing library properties (regular and computed).\n * This component handles the search, tabs, and property list display logic.\n */\n@Component({\n  selector: 'c8y-asset-property-tabs',\n  templateUrl: './asset-property-tabs.component.html',\n  host: {\n    class: 'd-contents'\n  },\n  standalone: true,\n  imports: [\n    C8yTranslatePipe,\n    FormsModule,\n    AssetPropertyListComponent,\n    LoadMoreComponent,\n    IconDirective,\n    TabComponent,\n    TabsOutletComponent\n  ]\n})\nexport class AssetPropertyTabsComponent implements OnInit, OnChanges, OnDestroy {\n  /**\n   * The asset context for loading properties.\n   */\n  @Input() asset: IManagedObject;\n  /**\n   * Configuration for the asset property list.\n   */\n  @Input() config: AssetPropertyListConfig = {\n    filterable: false,\n    selectMode: 'multi',\n    expansionMode: 'collapsedByDefault',\n    showValue: false,\n    emptyStateContent: 'default-properties',\n    allowAddingCustomProperties: false,\n    inputPropertiesHandle: 'override'\n  };\n  /**\n   * Currently selected properties to be highlighted in the list.\n   */\n  @Input() selectedProperties: AssetPropertyType[] = [];\n  /**\n   * Controls which tabs are hidden.\n   */\n  @Input() hiddenTabs: HiddenTabs = {};\n  /**\n   * The name of the tabs outlet.\n   */\n  @Input() tabsOutletName = 'libraryPropertiesTabs';\n  /**\n   * Whether to show the search input.\n   */\n  @Input() showSearch = true;\n\n  /**\n   * Emits when the selected properties change.\n   */\n  @Output() selectedPropertiesChange = new EventEmitter<AssetPropertyType[]>();\n\n  tabNames: Record<AssetPropertyTab, string> = {\n    asset: gettext('Asset properties'),\n    regular: gettext('Custom properties'),\n    computed: gettext('Computed properties')\n  };\n  paging: Paging<IManagedObject>;\n  inputText = '';\n  selectedTab: AssetPropertyTab = 'asset';\n\n  set assetProperties(value: AssetPropertyType[]) {\n    this._assetProperties = this.withContextAssetId(value);\n  }\n  get assetProperties(): AssetPropertyType[] {\n    return this._assetProperties;\n  }\n  private _assetProperties: AssetPropertyType[] = [];\n\n  set regularProperties(value: AssetPropertyType[]) {\n    this._regularProperties = this.withContextAssetId(value);\n  }\n  get regularProperties(): AssetPropertyType[] {\n    return this._regularProperties;\n  }\n  private _regularProperties: AssetPropertyType[] = [];\n\n  set computedProperties(value: AssetPropertyType[]) {\n    this._computedProperties = this.withContextAssetId(value);\n  }\n  get computedProperties(): AssetPropertyType[] {\n    return this._computedProperties;\n  }\n  private _computedProperties: AssetPropertyType[] = [];\n\n  displayedProperties: AssetPropertyType[] = [];\n  assetCount = 0;\n  regularCount = 0;\n  computedCount = 0;\n  allComputedProperties: AssetPropertyType[] = [];\n\n  get showAsset(): boolean {\n    return !this.hiddenTabs.asset;\n  }\n\n  get showRegular(): boolean {\n    return !this.hiddenTabs.regular;\n  }\n\n  get showComputed(): boolean {\n    return !this.hiddenTabs.computed;\n  }\n\n  get showTabBar(): boolean {\n    const visibleTabs = [this.showAsset, this.showRegular, this.showComputed].filter(Boolean);\n    return visibleTabs.length > 1;\n  }\n\n  private searchSubject$ = new Subject<string>();\n  private destroy$ = new Subject<void>();\n  private readonly assetPropertiesService = inject(AssetPropertiesService);\n  private readonly computedPropertiesService = inject(ComputedPropertiesService);\n\n  private selectedAssetProperties: AssetPropertyType[] = [];\n  private selectedRegularProperties: AssetPropertyType[] = [];\n  private selectedComputedProperties: AssetPropertyType[] = [];\n\n  async ngOnInit() {\n    this.config = { ...this.config, selectedProperties: this.selectedProperties };\n\n    if (this.showAsset) {\n      this.selectedTab = 'asset';\n    } else if (this.showRegular) {\n      this.selectedTab = 'regular';\n    } else if (this.showComputed) {\n      this.selectedTab = 'computed';\n    }\n\n    if (this.showComputed) {\n      this.loadComputedProperties();\n    }\n\n    if (this.showAsset && this.asset) {\n      await this.loadAssetProperties();\n    }\n\n    await this.updateProperties();\n    this.categorizeSelectedProperties();\n    this.updateConfigWithCurrentTabSelections();\n\n    this.searchSubject$\n      .pipe(takeUntil(this.destroy$), debounceTime(350))\n      .subscribe(() => this.updateProperties());\n  }\n\n  async ngOnChanges(changes: SimpleChanges) {\n    this.config = { ...this.config, allowAddingCustomProperties: false };\n\n    if (changes['selectedProperties']) {\n      this.categorizeSelectedProperties();\n      this.updateConfigWithCurrentTabSelections();\n    }\n\n    if (changes['asset'] && !changes['asset'].firstChange && this.showAsset) {\n      await this.loadAssetProperties();\n      await this.loadComputedProperties();\n      this.updateProperties();\n      this.categorizeSelectedProperties();\n      this.updateDisplayedProperties();\n    }\n  }\n\n  ngOnDestroy() {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  /**\n   * Updates the selected properties.\n   * @param properties The selected properties.\n   */\n  onSelectedProperties(properties: AssetPropertyType[]): void {\n    if (this.config.selectMode === 'single') {\n      this.selectedAssetProperties = [];\n      this.selectedRegularProperties = [];\n      this.selectedComputedProperties = [];\n    }\n    // Update the selected properties for the current tab\n    if (this.selectedTab === 'asset') {\n      this.selectedAssetProperties = cloneDeep(properties);\n    } else if (this.selectedTab === 'regular') {\n      this.selectedRegularProperties = cloneDeep(properties);\n    } else {\n      this.selectedComputedProperties = cloneDeep(properties);\n    }\n\n    const allSelected = [\n      ...this.selectedAssetProperties,\n      ...this.selectedRegularProperties,\n      ...this.selectedComputedProperties\n    ];\n    this.selectedPropertiesChange.emit(cloneDeep(allSelected));\n  }\n\n  onTabChange(tabName: keyof typeof this.tabNames): void {\n    this.selectedTab = tabName;\n    this.updateDisplayedProperties();\n  }\n\n  onSearch() {\n    this.searchSubject$.next(this.inputText);\n  }\n\n  clearSearch(): void {\n    this.inputText = '';\n    this.onSearch();\n  }\n\n  async loadMore() {\n    if (this.selectedTab !== 'regular' || !this.paging) {\n      return;\n    }\n\n    const res = await this.paging.next();\n\n    this.paging = res.paging;\n\n    const propertiesFromLibrary: AssetPropertyType[] = [];\n    const propertiesMOs = res.data;\n    propertiesMOs.forEach(prop => {\n      propertiesFromLibrary.push({\n        c8y_JsonSchema: prop.c8y_JsonSchema,\n        label: prop.name,\n        name: Object.keys(prop.c8y_JsonSchema.properties)[0],\n        type: prop.c8y_JsonSchema.type\n      });\n    });\n\n    const categorizedNewProps =\n      this.categorizeAndFlattenHierarchicalProperties(propertiesFromLibrary);\n    const newRegularProps = categorizedNewProps.filter(prop => !prop.computed);\n\n    this.regularProperties = [...this.regularProperties, ...newRegularProps];\n\n    if (this.selectedTab === 'regular') {\n      this.displayedProperties = this.regularProperties;\n    }\n  }\n\n  private async loadComputedProperties() {\n    const computedPropsResult = await this.computedPropertiesService.getByContext(this.asset);\n    this.allComputedProperties = computedPropsResult.map(({ prop }) => prop);\n  }\n\n  private async loadAssetProperties() {\n    if (!this.asset) {\n      this.assetProperties = [];\n      this.assetCount = 0;\n      return;\n    }\n\n    const properties = await this.assetPropertiesService.getInitialProperties(this.asset);\n    const categorized = this.categorizeAndFlattenHierarchicalProperties(properties);\n\n    // Filter to apply search\n    const filtered = categorized.filter(prop =>\n      prop.label.toLowerCase().includes(this.inputText?.trim().toLowerCase() || '')\n    );\n\n    this.assetProperties = filtered;\n    this.assetCount = categorized.length;\n  }\n\n  private async updateProperties() {\n    let propertiesFromLibrary: AssetPropertyType[] = [];\n    let filteredDefaultProperties: AssetPropertyType[] = [];\n\n    if (this.showRegular) {\n      const result = await this.assetPropertiesService.getPropertiesFromPropertiesLibrary(\n        this.inputText\n      );\n      propertiesFromLibrary = result.propertiesFromLibrary;\n      this.paging = result.paging;\n\n      filteredDefaultProperties = defaultAssetProperties.filter(prop =>\n        prop.label.toLowerCase().includes(this.inputText?.trim().toLowerCase() || '')\n      );\n    }\n\n    let filteredComputedProperties: AssetPropertyType[] = [];\n    if (this.showComputed) {\n      filteredComputedProperties = this.allComputedProperties.filter(prop =>\n        prop.label.toLowerCase().includes(this.inputText?.trim().toLowerCase() || '')\n      );\n    }\n\n    if (this.showAsset) {\n      await this.loadAssetProperties();\n    }\n\n    const allProperties = this.categorizeAndFlattenHierarchicalProperties([\n      ...filteredComputedProperties,\n      ...propertiesFromLibrary,\n      ...filteredDefaultProperties\n    ]);\n\n    this.regularProperties = allProperties.filter(prop => !prop.computed);\n    this.computedProperties = allProperties.filter(prop => prop.computed);\n\n    this.regularCount = (this.paging?.totalElements || 0) + filteredDefaultProperties.length;\n    this.computedCount = filteredComputedProperties.length;\n\n    this.updateDisplayedProperties();\n  }\n\n  private updateDisplayedProperties(): void {\n    if (this.selectedTab === 'asset') {\n      this.displayedProperties = this.assetProperties;\n    } else if (this.selectedTab === 'regular') {\n      this.displayedProperties = this.regularProperties;\n    } else {\n      this.displayedProperties = this.computedProperties;\n    }\n    this.updateConfigWithCurrentTabSelections();\n  }\n\n  /**\n   * Updates the config to show only the current tab's selected properties.\n   */\n  private updateConfigWithCurrentTabSelections(): void {\n    let currentTabSelections: AssetPropertyType[] = [];\n\n    if (this.selectedTab === 'asset') {\n      currentTabSelections = this.selectedAssetProperties;\n    } else if (this.selectedTab === 'regular') {\n      currentTabSelections = this.selectedRegularProperties;\n    } else {\n      currentTabSelections = this.selectedComputedProperties;\n    }\n\n    this.config = { ...this.config, selectedProperties: currentTabSelections };\n  }\n\n  /**\n   * Categorizes incoming selectedProperties by matching them against loaded properties.\n   */\n  private categorizeSelectedProperties(): void {\n    if (!this.selectedProperties) {\n      return;\n    }\n\n    const assetSelected: AssetPropertyType[] = [];\n    const regularSelected: AssetPropertyType[] = [];\n    const computedSelected: AssetPropertyType[] = [];\n\n    for (const selectedProp of this.selectedProperties) {\n      // Check if it's in asset properties\n      const inAsset = this.assetProperties.some(prop =>\n        this.assetPropertiesService.propertiesMatch(prop, selectedProp)\n      );\n      if (inAsset) {\n        assetSelected.push(selectedProp);\n        continue;\n      }\n\n      const inComputed = this.computedProperties.some(prop =>\n        this.assetPropertiesService.propertiesMatch(prop, selectedProp)\n      );\n      if (inComputed) {\n        computedSelected.push(selectedProp);\n        continue;\n      }\n\n      // Check if it's in regular properties\n      const inRegular = this.regularProperties.some(prop =>\n        this.assetPropertiesService.propertiesMatch(prop, selectedProp)\n      );\n      if (inRegular) {\n        regularSelected.push(selectedProp);\n        continue;\n      }\n\n      // If computed property but not yet loaded, check by computed flag\n      if (selectedProp.computed) {\n        computedSelected.push(selectedProp);\n      } else {\n        // Default to regular if can't determine\n        regularSelected.push(selectedProp);\n      }\n    }\n\n    this.selectedAssetProperties = assetSelected;\n    this.selectedRegularProperties = regularSelected;\n    this.selectedComputedProperties = computedSelected;\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 { computed, simple, complex } =\n      this.assetPropertiesService.categorizeAndFlattenHierarchicalProperties(properties);\n    return [...computed, ...simple, ...complex];\n  }\n\n  private withContextAssetId(properties: AssetPropertyType[]): AssetPropertyType[] {\n    if (!this.config.addAssetToProperty) {\n      return properties;\n    }\n    return properties.map(prop => ({\n      ...prop,\n      asset: { id: this.asset.id, name: this.asset.name }\n    }));\n  }\n}\n","@if (showSearch) {\n  <div class=\"form-group p-16 m-b-0 d-flex sticky-top bg-component\">\n    <div class=\"input-group input-group-search\">\n      <input\n        class=\"form-control\"\n        [attr.aria-label]=\"'Search properties' | translate\"\n        placeholder=\"{{ 'Search properties' | translate }}\"\n        role=\"searchbox\"\n        type=\"search\"\n        autocomplete=\"off\"\n        [(ngModel)]=\"inputText\"\n        (input)=\"onSearch()\"\n        #filter\n      />\n      @if (filter.value.length === 0) {\n        <span\n          class=\"input-group-addon\"\n          [attr.aria-hidden]=\"true\"\n        >\n          <i\n            class=\"dlt-c8y-icon-search\"\n            [c8yIcon]=\"'search'\"\n          ></i>\n        </span>\n      }\n      @if (filter.value.length > 0) {\n        <span\n          class=\"input-group-addon\"\n          [attr.aria-hidden]=\"true\"\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      }\n    </div>\n  </div>\n}\n\n@if (showTabBar) {\n  <c8y-tabs-outlet\n    class=\"elevation-none m-b-16 p-sticky bg-component d-block\"\n    [outletName]=\"tabsOutletName\"\n    orientation=\"horizontal\"\n  ></c8y-tabs-outlet>\n\n  @if (showAsset) {\n    <c8y-tab\n      [isActive]=\"selectedTab === 'asset'\"\n      [tabsOutlet]=\"tabsOutletName\"\n      [priority]=\"1100\"\n      (onSelect)=\"onTabChange('asset')\"\n    >\n      <i [c8yIcon]=\"'cube'\"></i>\n      <span>\n        {{ tabNames.asset | translate }}\n        <span\n          class=\"m-l-4 badge badge-default flex-no-shrink\"\n          aria-live=\"assertive\"\n        >\n          {{ assetCount }}\n        </span>\n      </span>\n    </c8y-tab>\n  }\n\n  @if (showRegular) {\n    <c8y-tab\n      [isActive]=\"selectedTab === 'regular'\"\n      [tabsOutlet]=\"tabsOutletName\"\n      [priority]=\"1000\"\n      (onSelect)=\"onTabChange('regular')\"\n    >\n      <i [c8yIcon]=\"'new-property'\"></i>\n      <span>\n        {{ tabNames.regular | translate }}\n        <span\n          class=\"m-l-4 badge badge-default flex-no-shrink\"\n          aria-live=\"assertive\"\n        >\n          {{ regularCount }}\n        </span>\n      </span>\n    </c8y-tab>\n  }\n\n  @if (showComputed) {\n    <c8y-tab\n      [isActive]=\"selectedTab === 'computed'\"\n      [tabsOutlet]=\"tabsOutletName\"\n      [priority]=\"900\"\n      (onSelect)=\"onTabChange('computed')\"\n    >\n      <i [c8yIcon]=\"'bolt'\"></i>\n      <span>\n        {{ tabNames.computed | translate }}\n        <span\n          class=\"m-l-4 badge badge-default flex-no-shrink\"\n          aria-live=\"assertive\"\n        >\n          {{ computedCount }}\n        </span>\n      </span>\n    </c8y-tab>\n  }\n}\n\n<c8y-asset-property-list\n  class=\"bg-component d-block\"\n  [config]=\"config\"\n  [extraProperties]=\"displayedProperties\"\n  (selectedProperties)=\"onSelectedProperties($event)\"\n></c8y-asset-property-list>\n@if (selectedTab === 'regular') {\n  <c8y-load-more\n    [paging]=\"paging\"\n    [useIntersection]=\"true\"\n    (onLoad)=\"loadMore()\"\n  ></c8y-load-more>\n}\n","import { Component, EventEmitter, inject, Output } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { BottomDrawerRef, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { cloneDeep } from 'lodash-es';\nimport { AssetPropertyListConfig, AssetPropertyType, HiddenTabs } from '../asset-properties.model';\nimport { AssetPropertyTabsComponent } from '../asset-property-tabs/asset-property-tabs.component';\n\n/**\n * Represents a drawer component for selecting asset properties.\n * This is a thin wrapper around the LibraryPropertiesTabsComponent.\n */\n@Component({\n  selector: 'c8y-custom-properties-drawer-component',\n  templateUrl: './custom-properties-drawer.component.html',\n  host: {\n    class: 'd-contents'\n  },\n  standalone: true,\n  imports: [C8yTranslatePipe, AssetPropertyTabsComponent]\n})\nexport class CustomPropertiesDrawerComponent {\n  asset: IManagedObject;\n  /**\n   * Title of the drawer.\n   */\n  title = gettext('Select property');\n  /**\n   * Configuration for the asset property list.\n   */\n  config: AssetPropertyListConfig = {\n    filterable: false,\n    selectMode: 'multi',\n    expansionMode: 'collapsedByDefault',\n    showValue: false,\n    emptyStateContent: 'default-properties',\n    allowAddingCustomProperties: false,\n    inputPropertiesHandle: 'override'\n  };\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   * Controls which tabs are hidden.\n   */\n  hiddenTabs: HiddenTabs = {};\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  /**\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<c8y-asset-property-tabs\n  [asset]=\"asset\"\n  [config]=\"config\"\n  [selectedProperties]=\"selectedProperties\"\n  [hiddenTabs]=\"hiddenTabs\"\n  [tabsOutletName]=\"'assetPropertiesDrawerTabs'\"\n  [showSearch]=\"true\"\n  (selectedPropertiesChange)=\"onSelectedProperties($event)\"\n></c8y-asset-property-tabs>\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","import { inject, Injectable } from '@angular/core';\nimport { AssetPropertyType, HiddenTabs } from './asset-properties.model';\nimport { BottomDrawerService } from '@c8y/ngx-components';\nimport { CustomPropertiesDrawerComponent } from './custom-properties-drawer/custom-properties-drawer.component';\nimport { IManagedObject } from '@c8y/client';\n\n/**\n * Service to open a drawer for selecting custom asset properties.\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class CustomPropertiesDrawerService {\n  private bottomDrawerService = inject(BottomDrawerService);\n\n  async getCustomProperties(\n    asset: IManagedObject,\n    options?: { hiddenTabs?: HiddenTabs }\n  ): Promise<AssetPropertyType[]> {\n    const drawer = this.bottomDrawerService.openDrawer(CustomPropertiesDrawerComponent, {\n      disableClickOutside: true,\n      initialState: {\n        asset,\n        hiddenTabs: options?.hiddenTabs ?? {}\n      }\n    });\n\n    try {\n      const resultOf = await drawer.instance.result;\n      return resultOf;\n    } catch (ex) {\n      return [];\n    }\n  }\n}\n","import { inject, Pipe } from '@angular/core';\nimport { AssetPropertyType } from '../asset-properties.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n/**\n * A pipe that returns the display label for an asset property.\n * If the property has an `asset`, the label is prefixed with the asset name.\n * Otherwise, only the translated property label is returned.\n */\n@Pipe({\n  name: 'c8yAssetPropertyLabel',\n  standalone: true\n})\nexport class AssetPropertyLabelPipe {\n  private translateService = inject(TranslateService);\n\n  transform(property: AssetPropertyType): string {\n    if (!property) {\n      return '';\n    }\n\n    const label = this.translateService.instant(\n      property.label || property.title || property.name || ''\n    );\n\n    if (!property.asset) {\n      return label;\n    }\n\n    return this.translateService.instant(gettext('Asset: {{assetName}}\\nProperty: {{label}}'), {\n      assetName: property.asset?.name,\n      label\n    });\n  }\n}\n","import { Component, forwardRef, inject, Input, OnInit } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\nimport { IIdentified, IManagedObject } from '@c8y/client';\nimport { EmptyStateComponent, C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';\nimport { BehaviorSubject } from 'rxjs';\nimport { cloneDeep } from 'lodash-es';\nimport {\n  AssetPropertyListConfig,\n  AssetPropertyType,\n  HiddenTabs,\n  ComputedPropertyDefinition\n} from '../asset-properties.model';\nimport {\n  AssetSelectionChangeEvent,\n  MillerViewComponent\n} from '@c8y/ngx-components/assets-navigator';\nimport { AsyncPipe, JsonPipe, NgClass } from '@angular/common';\nimport { AssetPropertyIconPipe } from '../asset-property-list/asset-property-icon.pipe';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AssetPropertyIconTooltipPipe } from '../asset-property-list/asset-property-icon-tooltip.pipe';\nimport { AssetPropertyLabelPipe } from '../asset-property-list/asset-property-label.pipe';\nimport { AssetPropertyTabsComponent } from '../asset-property-tabs/asset-property-tabs.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ComputedPropertiesService } from '../computed-properties.service';\nimport { ComputedPropertiesConfigComponent } from '../computed-properties-config/computed-properties-config.component';\nimport { AssetPropertiesService } from '../asset-properties.service';\n\n/**\n * Represents a component for selecting asset properties.\n * This component handles all selection logic and can be used standalone or within drawer/modal wrappers.\n */\n@Component({\n  selector: 'c8y-asset-property-selector',\n  templateUrl: './asset-property-selector.component.html',\n  standalone: true,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => AssetPropertySelectorComponent)\n    }\n  ],\n  imports: [\n    C8yTranslatePipe,\n    FormsModule,\n    AssetPropertyTabsComponent,\n    MillerViewComponent,\n    NgClass,\n    AsyncPipe,\n    EmptyStateComponent,\n    AssetPropertyIconPipe,\n    TooltipModule,\n    AssetPropertyIconTooltipPipe,\n    AssetPropertyLabelPipe,\n    IconDirective,\n    JsonPipe\n  ]\n})\nexport class AssetPropertySelectorComponent implements OnInit, ControlValueAccessor {\n  /**\n   * Managed object representing the initial/context asset.\n   */\n  @Input() contextAsset: IManagedObject;\n  /**\n   * Configuration for the asset property list.\n   */\n  @Input() config: AssetPropertyListConfig = {};\n  /**\n   * Extra properties to be displayed in the list.\n   */\n  @Input() extraProperties: AssetPropertyType[] = [];\n  /**\n   * Flag to allow changing the context (asset) within the selector.\n   */\n  @Input() allowChangingContext = false;\n  /**\n   * Flag to allow properties from multiple assets to be selected at once.\n   */\n  @Input() allowPropertiesFromMultipleAssets = true;\n  /**\n   * Flag to hide the selection panel.\n   */\n  @Input() hideSelection = false;\n  /**\n   * Flag to allow search in asset selector.\n   */\n  @Input() allowSearch = true;\n\n  /**\n   * List of selected properties.\n   */\n  selectedProperties: AssetPropertyType[] = [];\n  /**\n   * Current asset selection as observable.\n   */\n  assetSelection = new BehaviorSubject<IManagedObject>(null);\n\n  hiddenTabs: HiddenTabs;\n\n  private touched = false;\n  private onChange: (properties: AssetPropertyType[]) => void;\n  private onTouched: () => void;\n  private modalService = inject(BsModalService);\n  private computedPropertiesService = inject(ComputedPropertiesService);\n  private assetPropertiesService = inject(AssetPropertiesService);\n\n  ngOnInit(): void {\n    if (this.contextAsset) {\n      this.assetSelection.next(this.contextAsset);\n    }\n\n    this.hiddenTabs = this.config.allowAddingCustomProperties\n      ? {}\n      : { regular: true, computed: true };\n  }\n\n  /**\n   * ControlValueAccessor implementation - write value from form model.\n   */\n  writeValue(obj: AssetPropertyType[]): void {\n    this.selectedProperties = obj || [];\n  }\n\n  /**\n   * ControlValueAccessor implementation - register onChange callback.\n   */\n  registerOnChange(fn: (properties: AssetPropertyType[]) => void): void {\n    this.onChange = fn;\n  }\n\n  /**\n   * ControlValueAccessor implementation - register onTouched callback.\n   */\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  /**\n   * Updates the selected properties.\n   * @param properties The selected properties.\n   */\n  async onSelectedProperties(properties: AssetPropertyType[]): Promise<void> {\n    this.markAsTouched();\n    if (this.config.selectMode === 'single') {\n      this.selectedProperties = [];\n    }\n\n    // Handle computed properties configuration\n    const configuredProperties = await this.handleComputedPropertiesConfiguration(properties);\n\n    this.selectedProperties = cloneDeep(configuredProperties);\n    this.emitCurrentSelection();\n  }\n\n  /**\n   * Handles asset selection changes.\n   * @param evt Asset selection change event.\n   */\n  selectionChanged(evt: AssetSelectionChangeEvent): void {\n    if (evt.change.item) {\n      return this.selectAsset(evt.change.item);\n    }\n\n    // reset selection\n    this.assetSelection.next(null);\n  }\n\n  /**\n   * Removes a property from the selection.\n   * @param property The property to remove.\n   */\n  propertyRemoved(property: AssetPropertyType): void {\n    this.markAsTouched();\n    this.selectedProperties = this.selectedProperties.filter(prop => prop !== property);\n    this.emitCurrentSelection();\n  }\n\n  /**\n   * Edits (reconfigures) a computed property.\n   * @param property The property to edit.\n   */\n  async editProperty(property: AssetPropertyType): Promise<void> {\n    const definition = await this.computedPropertiesService.getByName(property.name);\n    const configured = await this.configureProperty(property, definition);\n    if (configured) {\n      const currentAsset = this.assetSelection.getValue();\n      if (currentAsset?.id) {\n        property.configuredAssetId = currentAsset.id;\n      }\n      this.emitCurrentSelection();\n    }\n  }\n\n  /**\n   * Selects an asset and updates the selection.\n   * @param asset The asset to select.\n   */\n  private selectAsset(asset: IIdentified): void {\n    this.assetSelection.next(asset as IManagedObject);\n    if (!this.allowPropertiesFromMultipleAssets) {\n      this.clearSelection();\n    }\n  }\n\n  /**\n   * Clears all selected properties.\n   */\n  private clearSelection(): void {\n    this.selectedProperties = [];\n    this.emitCurrentSelection();\n  }\n\n  /**\n   * Emits the current selection to the form model.\n   */\n  private emitCurrentSelection(): void {\n    if (this.onChange) {\n      this.onChange(this.selectedProperties);\n    }\n  }\n\n  /**\n   * Marks the control as touched.\n   */\n  private markAsTouched(): void {\n    if (!this.touched && this.onTouched) {\n      this.onTouched();\n      this.touched = true;\n    }\n  }\n\n  /**\n   * Handles configuration for newly added computed properties.\n   * @param properties The selected properties.\n   * @returns The properties with configured ones included.\n   */\n  private async handleComputedPropertiesConfiguration(\n    properties: AssetPropertyType[]\n  ): Promise<AssetPropertyType[]> {\n    // Combine previously selected properties with newly added/configured ones\n    const previouslySelected = this.selectedProperties.filter(existing => {\n      if (existing.computed && existing.instanceId) {\n        // computed props that has config (so they get instanceId) can be added multiple times and are not removed from middle list\n        return true;\n      }\n      return properties.some(prop => this.assetPropertiesService.propertiesMatch(existing, prop));\n    });\n\n    if (properties.length === 0) {\n      // selector might emit properties array as empty array, but we should keep previously selected computed properties with config in that case, as they are not removed from middle list\n      return previouslySelected?.length !== 0 ? previouslySelected : [];\n    }\n\n    // Find newly added computed properties (not in previous selection)\n    const newlyAdded = properties.filter(\n      prop =>\n        prop.computed &&\n        !this.selectedProperties.some(existing =>\n          this.assetPropertiesService.propertiesMatch(existing, prop)\n        )\n    );\n\n    if (newlyAdded.length === 0) {\n      return properties;\n    }\n\n    const propertiesNeedingConfig: AssetPropertyType[] = [];\n    const definitionsNeedingConfig: ComputedPropertyDefinition[] = [];\n    const propertiesToActuallyAdd: AssetPropertyType[] = [];\n\n    // Separate properties that need configuration from those that don't\n    for (const prop of newlyAdded) {\n      const definition = await this.computedPropertiesService.getByName(prop.name);\n      if (definition.configComponent || definition.loadConfigComponent) {\n        propertiesNeedingConfig.push(prop);\n        definitionsNeedingConfig.push(definition);\n      } else {\n        propertiesToActuallyAdd.push(cloneDeep(prop));\n      }\n    }\n\n    // Configure properties that need it\n    if (propertiesNeedingConfig.length > 0) {\n      try {\n        const configs = await this.configureMultipleProperties(\n          propertiesNeedingConfig,\n          definitionsNeedingConfig\n        );\n\n        propertiesNeedingConfig.forEach((prop, index) => {\n          const clonedProp = cloneDeep(prop);\n          clonedProp.config = configs[index];\n          const currentAsset = this.assetSelection.getValue();\n          if (currentAsset?.id) {\n            clonedProp.configuredAssetId = currentAsset.id;\n          }\n          // Generate instanceId for computed properties to allow multiple instances\n          if (!clonedProp.instanceId) {\n            clonedProp.instanceId = crypto.randomUUID();\n          }\n          propertiesToActuallyAdd.push(clonedProp);\n        });\n      } catch {\n        // User cancelled configuration, don't add these properties\n        // propertiesToActuallyAdd already contains properties that didn't need config\n      }\n    }\n\n    const nonComputedNewlyAdded = properties.filter(\n      prop =>\n        !prop.computed &&\n        !this.selectedProperties.some(existing =>\n          this.assetPropertiesService.propertiesMatch(existing, prop)\n        )\n    );\n\n    return [...previouslySelected, ...propertiesToActuallyAdd, ...nonComputedNewlyAdded];\n  }\n\n  /**\n   * Displays the configuration modal for multiple computed properties and updates their configurations.\n   * @param properties Properties to configure.\n   * @param definitions Computed property definitions including config components.\n   * @returns Promise resolving to array of configurations.\n   */\n  private configureMultipleProperties(\n    properties: AssetPropertyType[],\n    definitions: ComputedPropertyDefinition[]\n  ): Promise<unknown[]> {\n    const currentAsset = this.assetSelection.getValue();\n    const modalRef = this.modalService.show(ComputedPropertiesConfigComponent, {\n      ignoreBackdropClick: true,\n      class: 'modal-lg',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      initialState: {\n        properties,\n        definitions,\n        asset: currentAsset\n      }\n    }).content;\n    return modalRef.result;\n  }\n\n  /**\n   * Displays the configuration modal for a single computed property and updates its configuration.\n   * @param property Property to configure.\n   * @param definition Computed property definition including config component.\n   * @returns true if the property was configured, false if cancelled.\n   */\n  private async configureProperty(\n    property: AssetPropertyType,\n    definition: ComputedPropertyDefinition\n  ): Promise<boolean> {\n    try {\n      const configs = await this.configureMultipleProperties([property], [definition]);\n      property.config = configs[0];\n      return true;\n    } catch (err) {\n      return false;\n    }\n  }\n}\n","<div\n  class=\"d-grid grid__row--1 fit-h\"\n  [ngClass]=\"{\n    'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n    'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n    'grid__col--4-8--md': allowChangingContext && hideSelection\n  }\"\n>\n  @if (allowChangingContext) {\n    <div class=\"d-flex d-col p-relative bg-level-1\">\n      <c8y-asset-selector-miller\n        class=\"d-contents\"\n        [(ngModel)]=\"contextAsset\"\n        [asset]=\"contextAsset\"\n        (onSelected)=\"selectionChanged($event)\"\n        [container]=\"''\"\n        [config]=\"{\n          view: 'miller',\n          groupsSelectable: true,\n          columnHeaders: true,\n          showChildDevices: true,\n          showUnassignedDevices: true,\n          singleColumn: true,\n          search: allowSearch,\n          showFilter: true\n        }\"\n      ></c8y-asset-selector-miller>\n    </div>\n  }\n\n  <div class=\"bg-component inner-scroll\">\n    <c8y-asset-property-tabs\n      class=\"bg-component d-contents\"\n      [asset]=\"assetSelection | async\"\n      [config]=\"config\"\n      [selectedProperties]=\"selectedProperties\"\n      [hiddenTabs]=\"hiddenTabs\"\n      [showSearch]=\"true\"\n      (selectedPropertiesChange)=\"onSelectedProperties($event)\"\n    ></c8y-asset-property-tabs>\n  </div>\n\n  @if (!hideSelection) {\n    <div class=\"inner-scroll bg-level-1\">\n      <p\n        class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n        [title]=\"'Selected properties' | translate\"\n      >\n        {{ 'Selected properties' | translate }}\n      </p>\n      @if (selectedProperties?.length) {\n        <div class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\">\n          @for (selectedProp of selectedProperties; track selectedProp.label) {\n            <div\n              [ngClass]=\"{\n                'c8y-datapoint-pill': selectedProp.computed && selectedProp.config,\n                'c8y-alarm-pill': !(selectedProp.computed && selectedProp.config)\n              }\"\n            >\n              <button\n                class=\"c8y-alarm-pill__btn\"\n                [title]=\"'Remove' | translate\"\n                type=\"button\"\n                (click)=\"propertyRemoved(selectedProp)\"\n              >\n                <i\n                  class=\"icon-14\"\n                  c8yIcon=\"remove\"\n                ></i>\n              </button>\n              @if (selectedProp.computed && selectedProp.config) {\n                <button\n                  class=\"c8y-datapoint-pill__btn\"\n                  title=\"{{ 'Configure' | translate }}\"\n                  (click)=\"editProperty(selectedProp)\"\n                >\n                  <i [c8yIcon]=\"'cog'\"></i>\n                </button>\n              }\n              @let label =\n                selectedProp.label || selectedProp.title || selectedProp.name | translate;\n              <div\n                class=\"c8y-alarm-pill__label\"\n                [title]=\"selectedProp | c8yAssetPropertyLabel\"\n              >\n                <button\n                  class=\"btn-clean m-r-4\"\n                  [attr.aria-label]=\"selectedProp | c8yAssetPropertyIconTooltip\"\n                  tooltip=\"{{ selectedProp | c8yAssetPropertyIconTooltip }}\"\n                  container=\"body\"\n                  type=\"button\"\n                  [delay]=\"500\"\n                >\n                  <i [c8yIcon]=\"selectedProp | c8yAssetPropertyIcon\"></i>\n                </button>\n                <span class=\"text-truncate\">\n                  <span class=\"text-truncate\">{{ label }}</span>\n                  @if (selectedProp.config) {\n                    <small\n                      class=\"text-muted\"\n                      title=\"{{ selectedProp.config | json }}\"\n                      >{{ selectedProp.config | json }}</small\n                    >\n                  }\n                </span>\n              </div>\n            </div>\n          }\n        </div>\n      }\n\n      @if (!selectedProperties || !selectedProperties.length) {\n        <div class=\"p-r-8\">\n          <c8y-ui-empty-state\n            [icon]=\"'c8y-data-points'\"\n            [title]=\"'No properties to display' | translate\"\n            [subtitle]=\"\n              'Select the asset, then on the available properties list, select desired property.'\n                | translate\n            \"\n            [horizontal]=\"true\"\n          ></c8y-ui-empty-state>\n        </div>\n      }\n    </div>\n  }\n</div>\n","import { Component, inject, Input } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { BottomDrawerRef, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { AssetPropertyListConfig, AssetPropertyType } from '../asset-properties.model';\nimport { AssetPropertySelectorComponent } from '../asset-property-selector/asset-property-selector.component';\nimport { FormsModule } from '@angular/forms';\n\n/**\n * Represents a drawer component for selecting asset properties.\n * This is a thin wrapper around AssetPropertySelectorComponent that handles drawer-specific logic.\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, AssetPropertySelectorComponent]\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  contextAsset!: IManagedObject;\n  /**\n   * Configuration for the asset property list.\n   */\n  config: AssetPropertyListConfig;\n  /**\n   * Extra properties to be displayed in the list.\n   */\n  extraProperties: AssetPropertyType[] = [];\n  /**\n   * List of selected properties.\n   */\n  selectedProperties: AssetPropertyType[] = [];\n  /**\n   * Flag to allow changing the context (asset) within the drawer.\n   */\n  allowChangingContext = false;\n  /**\n   * Flag to hide the selection\n   * */\n  hideSelection = false;\n  /**\n   * Flag to allow selecting properties from multiple assets (if context change is allowed).\n   */\n  allowPropertiesFromMultipleAssets = true;\n  /**\n   * Flag to enable search functionality for asset properties.\n   */\n  allowSearch = true;\n\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  ngOnInit(): void {\n    this.selectedProperties = this.config?.selectedProperties ?? [];\n  }\n\n  /**\n   * Handles selection changes from the selector component.\n   * @param selection The selected properties.\n   */\n  selectionChange(selection: AssetPropertyType[]): void {\n    this.selectedProperties = selection;\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 no active properties are selected.\n   */\n  selectIsDisabled(): boolean {\n    return (\n      !this.selectedProperties?.length || this.selectedProperties?.every(({ active }) => !active)\n    );\n  }\n}\n","<div class=\"card-header separator\">\n  <span class=\"h4 card-title\">{{ title | translate }}</span>\n</div>\n\n<div class=\"card-inner-scroll fit-h\">\n  <c8y-asset-property-selector\n    [contextAsset]=\"contextAsset\"\n    [config]=\"config\"\n    [extraProperties]=\"extraProperties\"\n    [allowChangingContext]=\"allowChangingContext\"\n    [allowPropertiesFromMultipleAssets]=\"allowPropertiesFromMultipleAssets\"\n    [hideSelection]=\"hideSelection\"\n    [allowSearch]=\"allowSearch\"\n    [ngModel]=\"selectedProperties\"\n    (ngModelChange)=\"selectionChange($event)\"\n  ></c8y-asset-property-selector>\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":["i1","FormsModule"],"mappings":"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"}