@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
1 lines • 907 kB
Source Map (JSON)
{"version":3,"file":"c8y-ngx-components-global-context.mjs","sources":["../../global-context/models/global-context.model.ts","../../global-context/models/auto-refresh.model.ts","../../global-context/models/interval-picker.model.ts","../../global-context/models/global-context-defaults.ts","../../global-context/models/control-flow.model.ts","../../global-context/models/aggregation.model.ts","../../global-context/models/constants.ts","../../global-context/utils/date-time-context.util.ts","../../global-context/utils/global-context-defaults.util.ts","../../global-context/services/state/global-context.service.ts","../../global-context/services/state/global-context-form.service.ts","../../global-context/services/state/global-context-event.service.ts","../../global-context/services/domain/widget-control.service.ts","../../global-context/services/domain/date-time-context-picker.service.ts","../../global-context/services/domain/widget-config-migration.service.ts","../../global-context/services/domain/global-context-validation.service.ts","../../global-context/services/domain/aggregation-validation.service.ts","../../global-context/services/domain/aggregation-picker.service.ts","../../global-context/services/infrastructure/global-context-utils.service.ts","../../global-context/features/aggregation/aggregation-picker/aggregation-picker.component.ts","../../global-context/features/aggregation/aggregation-picker/aggregation-picker.component.html","../../global-context/features/configuration/history-mode-configuration-controls/history-mode-configuration-controls.component.ts","../../global-context/features/configuration/history-mode-configuration-controls/history-mode-configuration-controls.component.html","../../global-context/features/time-context/interval-picker/interval-picker.component.ts","../../global-context/features/time-context/interval-picker/interval-picker.component.html","../../global-context/features/time-context/time-range-picker/date-time-context-picker.component.ts","../../global-context/features/time-context/time-range-picker/date-time-context-picker.component.html","../../global-context/features/configuration/live-mode-configuration-controls/live-mode-configuration-controls.component.ts","../../global-context/features/configuration/live-mode-configuration-controls/live-mode-configuration-controls.component.html","../../global-context/features/configuration/configuration-controls/configuration-controls.component.ts","../../global-context/features/configuration/configuration-collapse/configuration-collapse.component.ts","../../global-context/features/configuration/configuration-collapse/configuration-collapse.component.html","../../global-context/services/infrastructure/global-context-query.service.ts","../../global-context/features/aggregation/aggregation-display/aggregation-display.component.ts","../../global-context/features/aggregation/aggregation-display/aggregation-display.component.html","../../global-context/features/refresh/auto-refresh/auto-refresh-control.component.ts","../../global-context/features/refresh/auto-refresh/auto-refresh-control.component.html","../../global-context/features/time-context/time-range-display/time-range-display.component.ts","../../global-context/features/time-context/time-range-display/time-range-display.component.html","../../global-context/shared/context-controls/context-controls.component.ts","../../global-context/shared/context-controls/context-controls.component.html","../../global-context/core/global-context.component.ts","../../global-context/core/global-context.component.html","../../global-context/services/infrastructure/global-context-navigation.service.ts","../../global-context/core/widget-inline/inline-link-controls.component.ts","../../global-context/core/widget-inline/inline-link-helpers.ts","../../global-context/core/widget-inline/orchestrator/config-composer.util.ts","../../global-context/core/widget-inline/inline-refresh-helpers.ts","../../global-context/core/widget-inline/orchestrator/shared-mode-aggregation.helper.ts","../../global-context/core/widget-inline/orchestrator/shared-mode-context.helper.ts","../../global-context/core/widget-inline/orchestrator/shared-mode-refresh.helper.ts","../../global-context/core/widget-inline/orchestrator/shared-mode-state.helper.ts","../../global-context/core/widget-inline/orchestrator/shared-mode-toggle.helper.ts","../../global-context/core/widget-inline/orchestrator/validation.util.ts","../../global-context/core/widget-inline/orchestrator/shared-mode-orchestrator.ts","../../global-context/core/widget-inline/orchestrator/history-mode-orchestrator.ts","../../global-context/core/widget-inline/orchestrator/live-mode-orchestrator.ts","../../global-context/core/widget-inline/orchestrator/global-context-inline-orchestrator.service.ts","../../global-context/core/global-context-inline.component.ts","../../global-context/core/global-context-inline.component.html","../../global-context/services/state/global-context-store.service.ts","../../global-context/core/global-context-config.component.ts","../../global-context/core/global-context-config.component.html","../../global-context/features/configuration/config-context-selector/config-context-selector.component.ts","../../global-context/core/global-context-widget-config.component.ts","../../global-context/core/index.ts","../../global-context/features/time-context/index.ts","../../global-context/features/refresh/realtime-control/realtime-control.component.ts","../../global-context/features/refresh/realtime-control/realtime-control.component.html","../../global-context/features/refresh/index.ts","../../global-context/features/configuration/index.ts","../../global-context/shared/preview-controls/preview-controls.component.ts","../../global-context/shared/preview-controls/preview-controls.component.html","../../global-context/shared/index.ts","../../global-context/integration/widget-controls/default-widget-template.ts","../../global-context/integration/widget-controls/widget-controls-factory.ts","../../global-context/integration/widget-controls/guards.ts","../../global-context/integration/widget-controls/update-helpers.ts","../../global-context/integration/widget-controls/widget-controls-presets.helpers.ts","../../global-context/integration/widget-controls/widget-controls-presets.ts","../../global-context/integration/widget-wrapper/global-context-widget-wrapper.component.ts","../../global-context/integration/presets/control-presets.ts","../../global-context/integration/config-mode-controls/config-mode-controls.component.ts","../../global-context/integration/context-controls/context-controls.component.ts","../../global-context/integration/link-buttons/link-buttons.component.ts","../../global-context/integration/global-context-connector/global-context-connector.component.ts","../../global-context/integration/local-controls/local-controls.component.ts","../../global-context/integration/index.ts","../../global-context/global-context.module.ts","../../global-context/c8y-ngx-components-global-context.ts"],"sourcesContent":["import { aggregationType } from '@c8y/client';\nimport { RefreshOption } from './auto-refresh.model';\nimport { LinkStatesMap } from './control-flow.model';\nimport { DateTimeContext } from './date-time-context-picker.model';\nimport { Interval, TimeInterval } from './interval-picker.model';\n\nexport const GLOBAL_CONTEXT_EVENTS = {\n STATE_CHANGE: 'GLOBAL_CONTEXT_STATE_CHANGE',\n REFRESH: 'REFRESH',\n REFRESH_OPTION_CHANGE: 'GLOBAL_CONTEXT_REFRESH_OPTION_CHANGE',\n UPDATE_GLOBAL_CONTEXT_LIVE: 'UPDATE_GLOBAL_CONTEXT_LIVE',\n UPDATE_GLOBAL_CONTEXT_HISTORY: 'UPDATE_GLOBAL_CONTEXT_HISTORY',\n INIT_GLOBAL_CONTEXT: 'INIT_GLOBAL_CONTEXT'\n} as const;\n\nexport enum GLOBAL_CONTEXT_DISPLAY_MODE {\n DASHBOARD = 'dashboard',\n CONFIG = 'config',\n VIEW_AND_CONFIG = 'view_and_config'\n}\n\nexport type GlobalContextKeys = (keyof GlobalContextState)[];\n\n/**\n * State object passed to widget state handlers\n */\nexport interface WidgetState {\n config?: GlobalContextState;\n inlineControlSettings?: Partial<GlobalContextSettings>;\n dashboardControlSettings?: Partial<GlobalContextSettings>;\n currentLinks?: LinkStatesMap;\n displayMode?: string;\n [key: string]: unknown;\n}\n\n/**\n * Result returned from widget state handlers\n */\nexport interface WidgetStateHandlerResult {\n inlineControlSettings: Partial<GlobalContextSettings>;\n dashboardControlSettings?: Partial<GlobalContextSettings>;\n links?: Partial<LinkStatesMap>;\n options?: { noAutoRefreshCounter?: boolean };\n}\n\nexport interface WidgetControls {\n supports: GlobalContextKeys;\n supportedModes?: RefreshOption[];\n options?: { noAutoRefreshCounter?: boolean };\n configSettings: {\n [mode in GLOBAL_CONTEXT_DISPLAY_MODE]?: {\n [option in RefreshOption]?: Partial<GlobalContextSettings>;\n };\n };\n settings: {\n [mode in GLOBAL_CONTEXT_DISPLAY_MODE]?: {\n [option in RefreshOption]?: Partial<GlobalContextSettings>;\n };\n };\n defaultLinks?: {\n [mode in GLOBAL_CONTEXT_DISPLAY_MODE]?: {\n [option in RefreshOption]?: LinkStatesMap;\n };\n };\n stateHandlers?: {\n [stateName: string]: (widgetState?: WidgetState) => WidgetStateHandlerResult;\n };\n}\n\n/** Settings to control which features are visible in the global context UI */\nexport interface GlobalContextSettings {\n showTimeContext: boolean;\n showAggregation: boolean;\n showAutoRefresh: boolean;\n showRefresh: boolean;\n showRefreshInterval: boolean;\n}\n\n/** Base interface for all global context events */\nexport interface GlobalContextEventBase<Type extends string, Payload> {\n type: Type;\n payload: Payload;\n timestamp?: number;\n}\n\n/**\n * Registry of all available global context events and their payloads\n *\n * Extend with new events by declaring module augmentation:\n * interface GlobalContextEventRegistry {\n * NEW_EVENT: boolean; // Add your event payload type\n * }\n */\nexport interface GlobalContextEventRegistry {\n [GLOBAL_CONTEXT_EVENTS.REFRESH]: {\n dateFrom?: string | Date;\n dateTo?: string | Date;\n interval?: TimeInterval;\n };\n [GLOBAL_CONTEXT_EVENTS.STATE_CHANGE]: Partial<GlobalContextState>;\n [GLOBAL_CONTEXT_EVENTS.REFRESH_OPTION_CHANGE]: RefreshOption;\n [GLOBAL_CONTEXT_EVENTS.UPDATE_GLOBAL_CONTEXT_LIVE]: Partial<GlobalContextState>;\n [GLOBAL_CONTEXT_EVENTS.UPDATE_GLOBAL_CONTEXT_HISTORY]: Partial<GlobalContextState>;\n [GLOBAL_CONTEXT_EVENTS.INIT_GLOBAL_CONTEXT]: void;\n}\n\n/** Union of all possible event type strings */\nexport type GlobalContextEventType = keyof GlobalContextEventRegistry;\n/** Union type of all possible global context events */\nexport type GlobalContextEventUnion = {\n [K in GlobalContextEventType]: GlobalContextEventBase<K, GlobalContextEventRegistry[K]>;\n}[GlobalContextEventType];\n\nexport enum DateContextQueryParamNames {\n DATE_CONTEXT_FROM = 'dateContextFrom',\n DATE_CONTEXT_TO = 'dateContextTo',\n DATE_CONTEXT_INTERVAL = 'dateContextInterval',\n DATE_CONTEXT_AGGREGATION = 'dateContextAggregation',\n DATE_CONTEXT_AUTO_REFRESH = 'globalContextAutoRefresh',\n DATE_CONTEXT_REFRESH_MODE = 'globalContextRefreshMode'\n}\n\ntype DateContextFromToQueryParams = {\n [DateContextQueryParamNames.DATE_CONTEXT_FROM]: string;\n [DateContextQueryParamNames.DATE_CONTEXT_TO]: string;\n [DateContextQueryParamNames.DATE_CONTEXT_INTERVAL]?: never;\n};\n\ntype DateContextIntervalQueryParams = {\n [DateContextQueryParamNames.DATE_CONTEXT_FROM]?: never;\n [DateContextQueryParamNames.DATE_CONTEXT_TO]?: never;\n [DateContextQueryParamNames.DATE_CONTEXT_INTERVAL]: Interval['id'];\n};\n\n/**\n * Input query params is an object representing all possible query params related to widget time context.\n * It can be provided by user typing them in browser URL address bar, so all of them should be considered.\n */\nexport type InputDateContextQueryParams = {\n [DateContextQueryParamNames.DATE_CONTEXT_FROM]?: string;\n [DateContextQueryParamNames.DATE_CONTEXT_TO]?: string;\n [DateContextQueryParamNames.DATE_CONTEXT_INTERVAL]?: Interval['id'];\n [DateContextQueryParamNames.DATE_CONTEXT_AGGREGATION]?: aggregationType;\n [DateContextQueryParamNames.DATE_CONTEXT_AUTO_REFRESH]?: boolean;\n [DateContextQueryParamNames.DATE_CONTEXT_REFRESH_MODE]?: string;\n};\n\n/**\n * Output query params is an object representing params that are applied to current URL in browser address bar.\n * These params are set programmatically.\n * Time context interval and time range described by date \"from\" and date \"to\" exclude each other.\n */\nexport type OutputDateContextQueryParams = (\n | DateContextFromToQueryParams\n | DateContextIntervalQueryParams\n) & {\n [DateContextQueryParamNames.DATE_CONTEXT_AGGREGATION]: aggregationType;\n};\n\nexport type GlobalContextDisplayMode = `${GLOBAL_CONTEXT_DISPLAY_MODE}`;\n\nexport const GLOBAL_CONTEXT_SOURCE = {\n WIDGET: 'widget',\n DASHBOARD: 'dashboard'\n} as const;\n\nexport type GlobalContextSource =\n (typeof GLOBAL_CONTEXT_SOURCE)[keyof typeof GLOBAL_CONTEXT_SOURCE];\n\n// TODO: This type should extend ContextWidgetConfig from @c8y/ngx-components/context-dashboard\n// but importing it creates a circular dependency (global-context <-> context-dashboard)\nexport interface GlobalContextState {\n dateTimeContext?: DateTimeContext;\n aggregation?: aggregationType | null;\n isAutoRefreshEnabled?: boolean;\n refreshInterval?: number;\n refreshOption?: RefreshOption;\n displayMode?: `${GLOBAL_CONTEXT_DISPLAY_MODE}`;\n source?: GlobalContextSource;\n eventSourceId?: string;\n /**\n * Flag indicating global context values have been applied.\n * For dashboard mode, widgets should wait for this flag before processing config.\n */\n isGlobalContextReady?: boolean;\n}\n\n/**\n * Interface for date context parameters passed to setDateContextQueryParams method.\n * Provides strong typing for all possible parameters.\n */\nexport interface DateContextParams {\n /** Time interval ID ('DAYS', 'HOURS', etc.) or 'custom' for date ranges */\n interval?: Interval['id'];\n /** Array containing [dateFrom, dateTo] strings or Date objects for custom date ranges */\n date?: (string | Date)[] | null;\n /** Data aggregation type ('HOURLY', 'DAILY', etc.) */\n aggregation?: aggregationType;\n /** Whether auto-refresh should be enabled */\n isAutoRefreshEnabled?: boolean;\n /** Refresh mode ('live' or 'history') */\n refreshOption?: RefreshOption;\n}\n\n/**\n * Result type for query parameter validation status.\n * Provides detailed validation information for debugging and UI state management.\n */\nexport interface ParameterValidationStatus {\n /** True if interval parameter is valid and selectable */\n interval: boolean;\n /** True if aggregation parameter is valid */\n aggregation: boolean;\n /** True if both dateFrom and dateTo form a valid date range */\n dateRange: boolean;\n /** Parsed boolean value, or undefined if invalid/missing */\n autoRefresh: boolean | undefined;\n}\n\nexport const WIDGET_DISPLAY_MODE = {\n INLINE: 'inline',\n CONFIG: 'config',\n PREVIEW: 'preview'\n} as const;\n\nexport type WidgetDisplayMode = (typeof WIDGET_DISPLAY_MODE)[keyof typeof WIDGET_DISPLAY_MODE];\n\nexport interface GlobalContextEvent {\n context: Partial<GlobalContextState>;\n diff: Partial<GlobalContextState>;\n}\n","export const REFRESH_OPTION = {\n LIVE: 'live',\n HISTORY: 'history'\n} as const;\n\nexport type RefreshOption = (typeof REFRESH_OPTION)[keyof typeof REFRESH_OPTION];\n","import { gettext } from '@c8y/ngx-components/gettext';\n\nconst todayDate = new Date();\n\nexport const TIME_SPAN_MS = {\n MINUTE: 1000 * 60,\n HOUR: 1000 * 60 * 60,\n DAY: 1000 * 60 * 60 * 24,\n WEEK: 1000 * 60 * 60 * 24 * 7,\n MONTH: todayDate.valueOf() - new Date(todayDate.setMonth(todayDate.getMonth() - 1)).valueOf()\n} as const;\n\nexport const TIME_INTERVAL = {\n NONE: 'none',\n MINUTES: 'minutes',\n HOURS: 'hours',\n DAYS: 'days',\n WEEKS: 'weeks',\n MONTHS: 'months',\n CUSTOM: 'custom'\n} as const;\n\nexport type TimeInterval = (typeof TIME_INTERVAL)[keyof typeof TIME_INTERVAL];\n\nexport type Interval = {\n id: 'minutes' | 'hours' | 'days' | 'weeks' | 'months' | 'custom' | string;\n title: string;\n timespanInMs?: number;\n};\n\nexport type AlarmFilterInterval =\n | Interval\n | {\n id: 'none';\n title: string;\n timespanInMs?: number;\n };\n\nexport const INTERVALS: Interval[] = [\n {\n id: 'minutes',\n title: gettext('Last minute'),\n timespanInMs: TIME_SPAN_MS.MINUTE\n },\n {\n id: 'hours',\n title: gettext('Last hour'),\n timespanInMs: TIME_SPAN_MS.HOUR\n },\n {\n id: 'days',\n title: gettext('Last day'),\n timespanInMs: TIME_SPAN_MS.DAY\n },\n {\n id: 'weeks',\n title: gettext('Last week'),\n timespanInMs: TIME_SPAN_MS.WEEK\n },\n {\n id: 'months',\n title: gettext('Last month'),\n timespanInMs: TIME_SPAN_MS.MONTH\n },\n { id: 'custom', title: gettext('Custom') }\n];\n\nexport const INTERVAL_TITLES: Record<AlarmFilterInterval['id'], string> = {\n none: gettext('No date filter'),\n minutes: gettext('Last minute'),\n hours: gettext('Last hour'),\n days: gettext('Last day'),\n weeks: gettext('Last week'),\n months: gettext('Last month'),\n custom: gettext('Custom')\n};\n","import { REFRESH_OPTION } from './auto-refresh.model';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE } from './global-context.model';\nimport { TIME_INTERVAL } from './interval-picker.model';\n\n/**\n * Default values for global context configuration\n * Single source of truth for all default values across the global context feature\n */\nexport const GLOBAL_CONTEXT_DEFAULTS = {\n /** Default refresh option - live mode */\n REFRESH_OPTION: REFRESH_OPTION.LIVE,\n\n /** Default auto-refresh state */\n IS_AUTO_REFRESH_ENABLED: true,\n\n /** Default refresh interval in milliseconds (5 seconds) */\n REFRESH_INTERVAL: 5000,\n\n /** Default aggregation type */\n AGGREGATION: null,\n\n /** Default display mode */\n DISPLAY_MODE: GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD,\n\n /** Default date range duration in milliseconds (1 hour) */\n DATE_RANGE_DURATION_MS: 60 * 60 * 1000,\n\n /** Default time interval for custom ranges */\n TIME_INTERVAL: TIME_INTERVAL.HOURS\n} as const;\n","import { gettext } from '@c8y/ngx-components/gettext';\nimport { GlobalContextSettings, GlobalContextState } from './global-context.model';\n\n/**\n * Define the mapping between GlobalContextState keys and their equivalent in GlobalContextSettings\n */\nexport const LINK_BTNS_CONFIG: {\n [K in Extract<\n keyof GlobalContextState,\n 'dateTimeContext' | 'aggregation' | 'isAutoRefreshEnabled'\n >]: {\n /** Form control name, same as global state key */\n formControlName: K;\n /** Setting key in GlobalContextSettings */\n settingKey: keyof GlobalContextSettings;\n /** User-friendly label for UI */\n label: string;\n /** Css Class for link button visualization */\n cssClass: string;\n icon: string;\n };\n} = {\n dateTimeContext: {\n formControlName: 'dateTimeContext',\n settingKey: 'showTimeContext',\n label: gettext('date/time'),\n cssClass: 'time-context',\n icon: 'calendar'\n },\n isAutoRefreshEnabled: {\n formControlName: 'isAutoRefreshEnabled',\n settingKey: 'showAutoRefresh',\n label: gettext('auto refresh'),\n cssClass: 'auto-refresh',\n icon: 'refresh'\n },\n aggregation: {\n formControlName: 'aggregation',\n settingKey: 'showAggregation',\n label: gettext('aggregation'),\n cssClass: 'aggregation',\n icon: 'input'\n }\n} as const;\n\n/**\n * Type for link toggle event\n */\nexport interface LinkToggleEvent {\n key: Extract<\n keyof GlobalContextState,\n 'dateTimeContext' | 'aggregation' | 'isAutoRefreshEnabled'\n >;\n isLinked: boolean;\n}\n\n/**\n * Type for link states map\n */\nexport type LinkStatesMap = Partial<\n Record<\n Extract<keyof GlobalContextState, 'dateTimeContext' | 'aggregation' | 'isAutoRefreshEnabled'>,\n boolean\n >\n>;\n\n/**\n * Type for control configs map\n */\nexport type ControlConfigsMap = Partial<\n Record<\n Extract<keyof GlobalContextState, 'dateTimeContext' | 'aggregation' | 'isAutoRefreshEnabled'>,\n {\n cssClass?: string;\n linkTooltip?: string;\n unlinkTooltip?: string;\n icon?: string;\n disabled?: boolean;\n disabledTooltip?: string;\n autoUnlinked?: boolean;\n }\n >\n>;\n","import { aggregationType } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TIME_SPAN_MS } from './interval-picker.model';\n\nexport type Aggregation = {\n id: aggregationType | null;\n title: string;\n};\n\nexport const AGGREGATIONS: Aggregation[] = [\n { id: null, title: gettext('None') },\n { id: aggregationType.MINUTELY, title: gettext('Minutely') },\n { id: aggregationType.HOURLY, title: gettext('Hourly') },\n { id: aggregationType.DAILY, title: gettext('Daily') }\n];\n\nexport const AGGREGATION_LIMITS = {\n MINUTELY_LIMIT: TIME_SPAN_MS.MINUTE * 10,\n HOURLY_LIMIT: TIME_SPAN_MS.DAY * 1,\n DAILY_LIMIT: TIME_SPAN_MS.DAY * 4\n};\n\nexport const AGGREGATION_ICON_TYPE = {\n UNDEFINED: 'line-chart',\n MINUTELY: 'hourglass',\n HOURLY: 'clock-o',\n DAILY: 'calendar-o'\n} as const;\n\nexport type AggregationIconType =\n (typeof AGGREGATION_ICON_TYPE)[keyof typeof AGGREGATION_ICON_TYPE];\n\nexport const AGGREGATION_ICONS: Record<aggregationType | 'undefined', AggregationIconType> = {\n undefined: AGGREGATION_ICON_TYPE.UNDEFINED,\n MINUTELY: AGGREGATION_ICON_TYPE.MINUTELY,\n HOURLY: AGGREGATION_ICON_TYPE.HOURLY,\n DAILY: AGGREGATION_ICON_TYPE.DAILY\n};\n\nexport const AGGREGATION_TEXTS: Record<\n aggregationType | 'undefined' | 'null' | 'disabled',\n string\n> = {\n disabled: gettext('No aggregation with realtime enabled'),\n undefined: gettext('No aggregation'),\n null: gettext('No aggregation'),\n MINUTELY: gettext('Minutely aggregation'),\n HOURLY: gettext('Hourly aggregation'),\n DAILY: gettext('Daily aggregation')\n};\n\nexport const AGGREGATION_VALUES = {\n none: 'NONE',\n minutely: aggregationType.MINUTELY,\n hourly: aggregationType.HOURLY,\n daily: aggregationType.DAILY\n} as const;\n\nexport const AGGREGATION_VALUES_ARR = [\n AGGREGATION_VALUES.none,\n AGGREGATION_VALUES.minutely,\n AGGREGATION_VALUES.hourly,\n AGGREGATION_VALUES.daily\n] as const;\n\nexport const AGGREGATION_LABELS = {\n NONE: AGGREGATIONS[0].title,\n [aggregationType.MINUTELY]: AGGREGATIONS[1].title,\n [aggregationType.HOURLY]: AGGREGATIONS[2].title,\n [aggregationType.DAILY]: AGGREGATIONS[3].title\n} as const;\n\n/**\n * Represents the available aggregation options.\n * Aggregation 'none' is not handled by our backend.\n */\nexport type AggregationOption = typeof AGGREGATION_VALUES.none | `${aggregationType}`;\n/**\n * Represents the status of aggregation options.\n * Used to determine which aggregation options should be disabled.\n */\nexport type AggregationOptionStatus = {\n [key in AggregationOption]?: boolean;\n};\n\nexport interface AggregationState {\n aggregationType: aggregationType;\n isDisabled: boolean;\n}\n","/**\n * Time duration constants (ms)\n */\nexport const TIME_DURATION = {\n /** One hour in milliseconds */\n ONE_HOUR_MS: 60 * 60 * 1000,\n /** One minute in milliseconds */\n ONE_MINUTE_MS: 60 * 1000,\n /** One second in milliseconds */\n ONE_SECOND_MS: 1000\n} as const;\n\n/**\n * Timing constants for debouncing and throttling\n */\nexport const TIMING = {\n /** Debounce time for form value changes (ms) */\n FORM_DEBOUNCE: 100,\n /** Throttle time for context changes (ms) */\n CONTEXT_THROTTLE: 200,\n /** Tooltip delay time (ms) */\n TOOLTIP_DELAY: 500,\n /** Default debounce time (ms) */\n DEFAULT_DEBOUNCE: 100\n} as const;\n\n/**\n * UI priority constants\n */\nexport const UI_PRIORITIES = {\n /** High priority for configuration controls */\n CONFIGURATION_PRIORITY: 1000\n} as const;\n","import { DateTimeContext } from '../models/date-time-context-picker.model';\nimport { INTERVALS, TIME_INTERVAL, TimeInterval } from '../models/interval-picker.model';\n\n/**\n * Central utility for all DateTimeContext operations.\n * Single source of truth for date validation, conversion, and context normalization.\n */\nexport class DateTimeContextUtil {\n /**\n * Converts a value to a Date object, handling various input types.\n * Allows JavaScript's natural type coercion for compatibility with existing tests.\n */\n static toDate(value: unknown): Date | null {\n // Handle undefined explicitly - new Date(undefined) is Invalid Date\n if (value === undefined) {\n return null;\n }\n\n // Already a Date object\n if (value instanceof Date) {\n return isNaN(value.getTime()) ? null : value;\n }\n\n // Let JavaScript's natural type coercion handle all other cases\n // This allows null, false, true, numbers, strings to be handled like new Date() would\n const date = new Date(value as never);\n return isNaN(date.getTime()) ? null : date;\n }\n\n /**\n * Converts a date value to ISO string format.\n */\n static toIso(value: Date | string | null | undefined): string | null {\n const date = this.toDate(value);\n return date ? date.toISOString() : null;\n }\n\n /**\n * Normalizes an ISO string to remove milliseconds (sets to .000Z).\n * This ensures date comparisons ignore millisecond precision.\n *\n * @param isoString - ISO date string (e.g., \"2025-10-27T15:10:04.405Z\")\n * @returns ISO string with milliseconds zeroed (e.g., \"2025-10-27T15:10:04.000Z\")\n */\n static normalizeIsoToSeconds(isoString: string | null | undefined): string | null {\n if (!isoString || typeof isoString !== 'string') {\n return null;\n }\n\n // Parse the ISO string to a Date\n const date = this.toDate(isoString);\n if (!date) {\n return null;\n }\n\n // Set milliseconds to 0\n date.setMilliseconds(0);\n return date.toISOString();\n }\n\n /**\n * Validates if a single date value is valid.\n * Only accepts Date objects and valid date strings (not numbers, null, etc.)\n * This is the strict validation used for form inputs and user-facing APIs.\n */\n static isValidDate(value: unknown): boolean {\n // Only accept Date instances or strings\n if (value instanceof Date) {\n return !isNaN(value.getTime());\n }\n if (typeof value === 'string') {\n const date = new Date(value);\n return !isNaN(date.getTime());\n }\n return false;\n }\n\n /**\n * Validates if a value can be converted to a valid date.\n * Uses JavaScript's natural type coercion, accepting null, numbers, booleans, etc.\n * This is used internally for range validation.\n */\n static isCoercibleToDate(value: unknown): boolean {\n return this.toDate(value) !== null;\n }\n\n /**\n * Validates if a date range is valid (from < to).\n */\n static isValidRange(from: unknown, to: unknown): boolean {\n const fromDate = this.toDate(from);\n const toDate = this.toDate(to);\n\n // Both dates must be valid and fromDate must be before toDate\n return fromDate !== null && toDate !== null && fromDate < toDate;\n }\n\n /**\n * Validates if a date range is valid, allowing equal dates (from <= to).\n */\n static isValidRangeOrEqual(from: unknown, to: unknown): boolean {\n const fromDate = this.toDate(from);\n const toDate = this.toDate(to);\n\n // Both dates must be valid and fromDate must be before or equal to toDate\n return fromDate !== null && toDate !== null && fromDate <= toDate;\n }\n\n /**\n * Calculates date range from an interval.\n * Pure implementation based on INTERVALS configuration.\n */\n static dateRangeFromInterval(\n interval: TimeInterval,\n now: Date = new Date()\n ): [Date, Date] | null {\n // Special case: 'none' returns epoch to current time\n if (interval === 'none') {\n return [new Date(0), now];\n }\n\n // Special case: 'custom' has no default range\n if (interval === TIME_INTERVAL.CUSTOM) {\n return null;\n }\n\n // Find the interval configuration\n const intervalConfig = INTERVALS.find(({ id }) => id === interval);\n if (!intervalConfig || !intervalConfig.timespanInMs) {\n return null;\n }\n\n // Calculate date range: current time minus interval timespan\n const dateTo = new Date(now);\n const dateFrom = new Date(dateTo.valueOf() - intervalConfig.timespanInMs);\n return [dateFrom, dateTo];\n }\n\n /**\n * Ensures all dates in a DateTimeContext are ISO strings with milliseconds normalized to .000Z.\n */\n static ensureIsoContext(ctx: Partial<DateTimeContext>): DateTimeContext {\n const result: DateTimeContext = {\n interval: ctx.interval || TIME_INTERVAL.CUSTOM,\n dateFrom: null,\n dateTo: null\n };\n\n if (ctx.dateFrom) {\n const iso = this.toIso(ctx.dateFrom);\n result.dateFrom = this.normalizeIsoToSeconds(iso);\n }\n if (ctx.dateTo) {\n const iso = this.toIso(ctx.dateTo);\n result.dateTo = this.normalizeIsoToSeconds(iso);\n }\n\n return result;\n }\n\n /**\n * Normalizes a DateTimeContext for live mode.\n * - For non-custom intervals: recomputes range based on current time\n * - For custom interval: updates dateTo to current time\n */\n static normalizeForLive(ctx: Partial<DateTimeContext>, now: Date = new Date()): DateTimeContext {\n const interval = ctx.interval || TIME_INTERVAL.CUSTOM;\n\n if (interval !== TIME_INTERVAL.CUSTOM) {\n // Recompute range from interval\n const range = this.dateRangeFromInterval(interval, now);\n if (range) {\n return this.ensureIsoContext({\n interval,\n dateFrom: range[0],\n dateTo: range[1]\n });\n }\n }\n\n // For custom interval, keep dateFrom but update dateTo to now\n return this.ensureIsoContext({\n interval: TIME_INTERVAL.CUSTOM,\n dateFrom: ctx.dateFrom,\n dateTo: now\n });\n }\n\n /**\n * Normalizes a DateTimeContext for history mode.\n * Forces interval to CUSTOM and preserves explicit date range.\n */\n static normalizeForHistory(ctx: Partial<DateTimeContext>): DateTimeContext {\n return this.ensureIsoContext({\n interval: TIME_INTERVAL.CUSTOM,\n dateFrom: ctx.dateFrom,\n dateTo: ctx.dateTo\n });\n }\n\n /**\n * Type guard to check if a value is a valid DateTimeContext object.\n */\n static isValidDateTimeContext(context: unknown): context is DateTimeContext {\n if (!context || typeof context !== 'object') return false;\n\n const ctx = context as Record<string, unknown>;\n\n const hasDates = 'dateFrom' in ctx && 'dateTo' in ctx && 'interval' in ctx;\n if (!hasDates) return false;\n\n return (\n typeof ctx.interval === 'string' &&\n ctx.interval.length > 0 &&\n this.isValidDate(ctx.dateFrom) &&\n this.isValidDate(ctx.dateTo)\n );\n }\n\n /**\n * Checks if a partial DateTimeContext has all required fields.\n * Business logic: Allow single field updates or complete updates (all 3 fields),\n * but reject incomplete updates with 2 fields.\n */\n static isCompleteDateTimeContext(\n diff: Partial<{ dateTimeContext: Partial<DateTimeContext> }>\n ): boolean {\n // If no dateTimeContext in diff, it's considered complete\n if (!('dateTimeContext' in diff) || !diff.dateTimeContext) {\n return true;\n }\n\n const keys = Object.keys(diff.dateTimeContext);\n // Allow single field updates (e.g., just interval) or complete updates (all 3 fields)\n // Reject incomplete updates with 2 fields\n return keys.length === 1 || keys.length === 3;\n }\n\n /**\n * Formats a context for emission, ensuring ISO dates and filtering by supported fields.\n */\n static formatForEmission(\n context: Partial<{ dateTimeContext: Partial<DateTimeContext> }>,\n supports: string[]\n ): Partial<{ dateTimeContext: DateTimeContext }> {\n if (!supports.includes('dateTimeContext') || !context.dateTimeContext) {\n return {};\n }\n\n const dateTimeContext = context.dateTimeContext;\n\n // For live mode with custom interval, default dateTo to now if missing\n if (dateTimeContext.interval === TIME_INTERVAL.CUSTOM && !dateTimeContext.dateTo) {\n return {\n dateTimeContext: this.ensureIsoContext({\n ...dateTimeContext,\n dateTo: new Date()\n })\n };\n }\n\n return {\n dateTimeContext: this.ensureIsoContext(dateTimeContext)\n };\n }\n}\n","import { GLOBAL_CONTEXT_DEFAULTS } from '../models/global-context-defaults';\nimport type { DateTimeContext } from '../models/date-time-context-picker.model';\nimport type { GlobalContextState } from '../models/global-context.model';\nimport { DateTimeContextUtil } from './date-time-context.util';\n\n/**\n * Creates a complete default global context state\n *\n * @returns A complete GlobalContextState with all required properties set to sensible defaults\n */\nexport function createDefaultGlobalContextState(): GlobalContextState {\n const now = new Date();\n const dateFrom = new Date(now.getTime() - GLOBAL_CONTEXT_DEFAULTS.DATE_RANGE_DURATION_MS);\n\n return {\n dateTimeContext: {\n dateFrom: dateFrom.toISOString(),\n dateTo: now.toISOString(),\n interval: GLOBAL_CONTEXT_DEFAULTS.TIME_INTERVAL\n },\n refreshOption: GLOBAL_CONTEXT_DEFAULTS.REFRESH_OPTION,\n isAutoRefreshEnabled: GLOBAL_CONTEXT_DEFAULTS.IS_AUTO_REFRESH_ENABLED,\n refreshInterval: GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL,\n aggregation: GLOBAL_CONTEXT_DEFAULTS.AGGREGATION,\n displayMode: GLOBAL_CONTEXT_DEFAULTS.DISPLAY_MODE\n };\n}\n\n/**\n * Fills missing or invalid properties in a partial global context state with defaults\n *\n * @param state - Partial global context state that may have missing or invalid values\n * @returns Complete GlobalContextState with all required properties\n */\nexport function fillMissingDefaults(state: Partial<GlobalContextState>): GlobalContextState {\n const defaults = createDefaultGlobalContextState();\n\n // Use central utility to ensure ISO formatting for dateTimeContext\n const dateTimeContext = state.dateTimeContext\n ? DateTimeContextUtil.ensureIsoContext({\n ...defaults.dateTimeContext,\n ...state.dateTimeContext,\n // Use defaults for invalid dates\n dateFrom: DateTimeContextUtil.isValidDate(state.dateTimeContext?.dateFrom)\n ? state.dateTimeContext.dateFrom\n : defaults.dateTimeContext.dateFrom,\n dateTo: DateTimeContextUtil.isValidDate(state.dateTimeContext?.dateTo)\n ? state.dateTimeContext.dateTo\n : defaults.dateTimeContext.dateTo,\n interval: state.dateTimeContext?.interval || defaults.dateTimeContext.interval\n })\n : defaults.dateTimeContext;\n\n return {\n ...defaults,\n ...state,\n dateTimeContext,\n // Always override refreshInterval to use the fixed 5s default\n // This ensures old dashboards with custom intervals are migrated to the new fixed interval\n refreshInterval: GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL\n };\n}\n\n/**\n * Validates if a value is a valid date (either Date object or ISO string)\n * Delegates to central utility for consistency.\n *\n * @param value - Value to validate (string, Date, or undefined)\n * @returns true if the value represents a valid date\n */\nexport function isValidDateValue(value: string | Date | undefined): value is string | Date {\n return DateTimeContextUtil.isValidDate(value);\n}\n\n/**\n * Checks if a date time context object has all required valid properties\n * Delegates to central utility for consistency.\n *\n * @param context - DateTimeContext to validate\n * @returns true if the context is complete and valid\n */\nexport function isValidDateTimeContext(context: unknown): context is DateTimeContext {\n return DateTimeContextUtil.isValidDateTimeContext(context);\n}\n\n/**\n * Checks if a dateTimeContext diff object is complete (has all 3 required fields).\n * Delegates to central utility for consistency.\n *\n * @param diff - Partial state that may contain dateTimeContext\n * @returns true if dateTimeContext is absent, has only 1 field, or has all 3 fields; false if it has 2 fields (incomplete)\n */\nexport function isCompleteDateTimeContext(diff: Partial<GlobalContextState>): boolean {\n return DateTimeContextUtil.isCompleteDateTimeContext(diff);\n}\n\n/**\n * Formats dateTimeContext for emission, handling date conversions and defaults.\n * Delegates to central utility for consistency.\n *\n * @param context - Global context state to format\n * @param supports - Array of supported fields from widget template\n * @returns Formatted context with properly formatted dateTimeContext\n */\nexport function formatDateTimeContextForEmission(\n context: Partial<GlobalContextState>,\n supports: string[]\n): Partial<GlobalContextState> {\n const result = DateTimeContextUtil.formatForEmission(context, supports);\n\n // Merge back with original context to preserve other fields\n return {\n ...context,\n ...result\n };\n}\n","import { computed, Injectable, signal } from '@angular/core';\nimport { ViewContext } from '@c8y/ngx-components';\nimport { BehaviorSubject, distinctUntilChanged, map, Observable, shareReplay } from 'rxjs';\nimport { GlobalContextSettings, GlobalContextState } from '../../models/global-context.model';\nimport { createDefaultGlobalContextState } from '../../utils/global-context-defaults.util';\n\n/**\n * Interface representing a registered widget's global context settings with its unique identifier.\n */\ninterface RegisteredGlobalContextSettings extends Partial<GlobalContextSettings> {\n /** Unique identifier for the widget that registered these settings */\n readonly id: string;\n}\n\n/**\n * Default settings applied when no widgets have registered any settings.\n */\nconst DEFAULT_GLOBAL_CONTEXT_SETTINGS: GlobalContextSettings = {\n showTimeContext: false,\n showAggregation: false,\n showAutoRefresh: false,\n showRefresh: false,\n showRefreshInterval: false\n} as const;\n\n/**\n * GlobalContextService manages widget settings registration and loading states.\n *\n * This service is responsible for:\n * - Registering and managing widget-specific global context settings\n * - Consolidating settings from multiple widgets using OR logic\n * - Tracking loading states across multiple widgets\n * - Providing default configurations for the global context\n *\n * @example\n * ```typescript\n * // Register widget settings\n * globalContextService.register('widget-1', { showTimeContext: true });\n *\n * // Get consolidated settings from all widgets\n * globalContextService.getConsolidatedSettings().subscribe(settings => {\n * console.log(settings); // { showTimeContext: true, ... }\n * });\n *\n * // Track loading state\n * globalContextService.registerLoading('widget-1');\n * console.log(globalContextService.isLoading()); // true\n * ```\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class GlobalContextService {\n /**\n * Computed signal that indicates if any widgets are currently in a loading state.\n * Returns true if at least one widget has registered a loading state.\n */\n readonly isLoading = computed(() => this.loadingIds().size > 0);\n\n /** Target context for the global context service */\n protected readonly targetContext: ViewContext.Device | ViewContext.Group = ViewContext.Group;\n\n /** Observable stream of all registered widget settings */\n private readonly settings$ = new BehaviorSubject<readonly RegisteredGlobalContextSettings[]>([]);\n\n /** Signal storing unique identifiers of widgets currently in loading state */\n private readonly loadingIds = signal<Set<string>>(new Set());\n\n /**\n * Registers global context settings for a specific widget.\n * If settings for the same widget ID already exist, they will be updated.\n *\n * @param id - Unique identifier for the widget\n * @param settings - Partial global context settings to register\n *\n * @throws {Error} When id is empty or null\n *\n * @example\n * ```typescript\n * globalContextService.register('my-widget', {\n * showTimeContext: true,\n * showAutoRefresh: false\n * });\n * ```\n */\n register(id: string, settings: Partial<GlobalContextSettings>): void {\n this.validateWidgetId(id);\n\n const registeredSettings: RegisteredGlobalContextSettings = {\n ...settings,\n id\n };\n\n const currentSettings = this.settings$.value;\n const existingIndex = this.findSettingsIndex(id, currentSettings);\n\n if (existingIndex >= 0) {\n this.updateExistingSettings(existingIndex, registeredSettings, currentSettings);\n } else {\n this.addNewSettings(registeredSettings, currentSettings);\n }\n }\n\n /**\n * Retrieves all currently registered widget settings.\n *\n * @returns Array of all registered settings with their widget IDs\n */\n getSettings(): readonly RegisteredGlobalContextSettings[] {\n return this.settings$.value;\n }\n\n /**\n * Removes all registered widget settings.\n * This will cause the consolidated settings to return to default values.\n */\n resetSettings(): void {\n this.settings$.next([]);\n }\n\n /**\n * Unregisters settings for a specific widget.\n *\n * @param id - Unique identifier of the widget to unregister\n *\n * @example\n * ```typescript\n * globalContextService.unregister('my-widget');\n * ```\n */\n unregister(id: string): void {\n if (!id) return; // Silently ignore invalid IDs\n\n const currentSettings = this.settings$.value;\n const filteredSettings = currentSettings.filter(s => s.id !== id);\n\n if (filteredSettings.length !== currentSettings.length) {\n this.settings$.next(filteredSettings);\n }\n }\n\n /**\n * Returns an observable of consolidated global context settings.\n *\n * Settings are consolidated using OR logic - if any widget requires a setting to be shown,\n * it will be included in the consolidated result. The observable emits distinct values only\n * and is shared among all subscribers for optimal performance.\n *\n * @returns Observable that emits consolidated settings whenever they change\n *\n * @example\n * ```typescript\n * globalContextService.getConsolidatedSettings().subscribe(settings => {\n * if (settings.showTimeContext) {\n * // Show time context controls\n * }\n * });\n * ```\n */\n getConsolidatedSettings(): Observable<GlobalContextSettings> {\n return this.settings$.pipe(\n map(settingsArray => this.consolidateSettings(settingsArray)),\n distinctUntilChanged(this.areSettingsEqual),\n shareReplay(1)\n );\n }\n\n /**\n * Returns the default global context settings.\n * These settings are used when no widgets have registered any settings.\n *\n * @returns Default settings object with all options disabled\n */\n getDefaultSettings(): GlobalContextSettings {\n return { ...DEFAULT_GLOBAL_CONTEXT_SETTINGS };\n }\n\n /**\n * Registers a loading state for a specific widget.\n * This will cause the `isLoading` computed signal to return true.\n *\n * @param id - Unique identifier of the widget in loading state\n *\n * @example\n * ```typescript\n * globalContextService.registerLoading('my-widget');\n * console.log(globalContextService.isLoading()); // true\n * ```\n */\n registerLoading(id: string): void {\n if (!id) return; // Silently ignore invalid IDs\n\n this.loadingIds.update(ids => {\n const newIds = new Set(ids);\n newIds.add(id);\n return newIds;\n });\n }\n\n /**\n * Unregisters a loading state for a specific widget.\n * When no widgets are in loading state, `isLoading` will return false.\n *\n * @param id - Unique identifier of the widget to remove from loading state\n *\n * @example\n * ```typescript\n * globalContextService.unregisterLoading('my-widget');\n * ```\n */\n unregisterLoading(id: string): void {\n if (!id) return; // Silently ignore invalid IDs\n\n this.loadingIds.update(ids => {\n const newIds = new Set(ids);\n newIds.delete(id);\n return newIds;\n });\n }\n\n /**\n * Returns the default global context state.\n * This state is used as the initial configuration for new global context instances.\n *\n * @returns Default global context state with live refresh enabled and 1-minute time range\n *\n * @example\n * ```typescript\n * const defaultState = globalContextService.getDefaultState();\n * console.log(defaultState.refreshOption); // 'live'\n * ```\n */\n getDefaultState(): GlobalContextState {\n return createDefaultGlobalContextState();\n }\n\n /**\n * Validates that a widget ID is not empty or null.\n *\n * @param id - Widget ID to validate\n * @throws {Error} When ID is invalid\n */\n private validateWidgetId(id: string): void {\n if (!id || id.trim().length === 0) {\n throw new Error('Widget ID cannot be empty or null');\n }\n }\n\n /**\n * Finds the index of settings for a given widget ID.\n *\n * @param id - Widget ID to search for\n * @param settings - Array of settings to search in\n * @returns Index of the settings or -1 if not found\n */\n private findSettingsIndex(\n id: string,\n settings: readonly RegisteredGlobalContextSettings[]\n ): number {\n return settings.findIndex(s => s.id === id);\n }\n\n /**\n * Updates existing settings for a widget.\n *\n * @param index - Index of the settings to update\n * @param newSettings - New settings to apply\n * @param currentSettings - Current settings array\n */\n private updateExistingSettings(\n index: number,\n newSettings: RegisteredGlobalContextSettings,\n currentSettings: readonly RegisteredGlobalContextSettings[]\n ): void {\n const updatedSettings = [...currentSettings];\n updatedSettings[index] = newSettings;\n this.settings$.next(updatedSettings);\n }\n\n /**\n * Adds new settings to the settings array.\n *\n * @param newSettings - Settings to add\n * @param currentSettings - Current settings array\n */\n private addNewSettings(\n newSettings: RegisteredGlobalContextSettings,\n currentSettings: readonly RegisteredGlobalContextSettings[]\n ): void {\n this.settings$.next([...currentSettings, newSettings]);\n }\n\n /**\n * Consolidates multiple widget settings using OR logic.\n *\n * @param settingsArray - Array of widget settings to consolidate\n * @returns Consolidated settings object\n */\n private consolidateSettings(\n settingsArray: readonly RegisteredGlobalContextSettings[]\n ): GlobalContextSettings {\n return settingsArray.reduce(\n (consolidated, current) => ({\n showTimeContext: consolidated.showTimeContext || !!current.showTimeContext,\n showAggregation: consolidated.showAggregation || !!current.showAggregation,\n showAutoRefresh: consolidated.showAutoRefresh || !!current.showAutoRefresh,\n showRefresh: consolidated.showRefresh || !!current.showRefresh,\n showRefreshInterval: consolidated.showRefreshInterval || !!current.showRefreshInterval\n }),\n { ...DEFAULT_GLOBAL_CONTEXT_SETTINGS }\n );\n }\n\n /**\n * Compares two settings objects for deep equality.\n *\n * @param prev - Previous settings\n * @param curr - Current settings\n * @returns True if settings are equal, false otherwise\n */\n private areSettingsEqual(prev: GlobalContextSettings, curr: GlobalContextSettings): boolean {\n return (\n prev.showTimeContext === curr.showTimeContext &&\n prev.showAggregation === curr.showAggregation &&\n prev.showAutoRefresh === curr.showAutoRefresh &&\n prev.showRefresh === curr.showRefresh &&\n prev.showRefreshInterval === curr.showRefreshInterval\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { FormBuilder, type FormGroup } from '@angular/forms';\nimport { omit, pick } from 'lodash-es';\nimport { GLOBAL_CONTEXT_DEFAULTS } from '../../models/global-context-defaults';\nimport type { GlobalContextState } from '../../models/global-context.model';\nimport { createDefaultGlobalContextState } from '../../utils/global-context-defaults.util';\n\n/**\n * Service responsible for building and managing form groups for global context configuration.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class GlobalContextFormService {\n private readonly fb = inject(FormBuilder);\n\n /**\n * Creates a FormGroup for global context configuration.\n * @param config Optional existing configuration to initialize form values\n * @param defaults Optional override values for specific controls\n * @returns A fully configured FormGroup\n */\n buildForm(\n config: Partial<GlobalContextState> = {},\n defaults?: Partial<GlobalContextState>,\n skipProp?: Array<keyof GlobalContextState>\n ) {\n // Get base default values\n const defaultValues = this.getDefaultValues();\n\n // Extract valid config values\n const validConfigKeys = Object.keys(defaultValues) as Array<keyof GlobalContextState>;\n const configValues = pick(config, validConfigKeys) as Partial<GlobalContextState>;\n\n // Merge configurations with appropriate precedence\n const mergedValues = structuredClone(this.mergeValues(defaultValues, configValues, defaults));\n const filtered = omit(mergedValues, skipProp) as Partial<GlobalContextState>;\n\n return skipProp ? this.fb.group(filtered) : this.fb.group(mergedValues);\n }\n\n /**\n * Extracts form values into a configuration object\n * @param form The form to extract values from\n * @returns GlobalContextConfig object\n */\n getConfigFromForm(form: FormGroup): GlobalContextState {\n if (!form) return null;\n\n // Get raw form values\n const formValue = form.getRawValue();\n\n return {\n dateTimeContext: formValue.dateTimeContext,\n aggregation: formValue.aggregation,\n isAutoRefreshEnabled: formValue.isAutoRefreshEnabled,\n // Always use fixed 5s interval, ignore any form value\n refreshInterval: GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL,\n refreshOption: formValue.refreshOption\n };\n }\n\n /**\n * Gets the default values for the global context form\n */\n getDefaultValues(): GlobalContextState {\n return createDefaultGlobalContextState();\n }\n\n /**\n * Merges default values with config and explicit overrides\n */\n private mergeValues(\n defaultValues: GlobalContextState,\n configValues: Partial<GlobalContextState>,\n overrideValues?: Partial<GlobalContextState>\n ): GlobalContextState {\n // First merge config values over defaults\n const mergedBasicValues: GlobalContextState = {\n ...defaultValues,\n ...configValues\n };\n\n // Special handling for dateTimeContext\n if (configValues.dateTimeContext) {\n mergedBasicValues.dateTimeContext = {\n ...defaultValues.dateTimeContext,\n ...configValues.dateTimeContext\n };\n }\n\n // Apply explicit overrides if present\n if (overrideValues) {\n const result: GlobalContextState = {\n ...mergedBasicValues,\n ...overrideValues\n };\n\n if (overrideValues.dateTimeContext) {\n result.dateTimeContext = {\n ...mergedBasicValues.dateTimeContext,\n ...overrideValues.dateTimeContext\n };\n }\n\n return result;\n }\n\n return mergedBasicValues;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, filter, fromEvent, map, Observable } from 'rxjs';\nimport {\n GLOBAL_CONTEXT_EVENTS,\n GlobalContextEventRegistry,\n GlobalContextEventType,\n GlobalContextEventUnion\n} from '../../models/global-context.model';\n\n/**\n * Configuration constants for the event service.\n */\nconst EVENT_CONFIG = {\n /** Name of the custom event dispatched on the window object */\n EVENT_NAME: 'global-context',\n /** Maximum number of cached event subjects to prevent memory leaks */\n MAX_CACHED_SUBJECTS: 50\n} as const;\n\n/**\n * GlobalContextEventService manages global context events using the browser's native event system.\n *\n * This service provides a type-safe wrapper around window custom events for global context communication.\n * It maintains event subjects for efficient observable-based event handling while ensuring proper\n * cleanup and memory management.\n *\n * Key features:\n * - Type-safe event emission and subscription\n * - Latest value caching for each event type\n * - Memory-efficient subject management\n * - Integration with browser's native event system\n *\n * @example\n * ```typescript\n * // Emit an event\n * eventService.emit('GLOBAL_CONTEXT_STATE_CHANGE', {\n * refreshOption: 'live',\n * isAutoRefreshEnabled: true\n * });\n *\n * // Subscribe to events\n * eventService.on('GLOBAL_CONTEXT_STATE_CHANGE').subscribe(state => {\n * console.log('State changed:', state);\n * });\n *\n * // Get the latest value\n * const latestState = eventService.getLatestValue('GLOBAL_CONTEXT_STATE_CHANGE');\n * ```\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class GlobalContextEventService {\n /** Map storing BehaviorSubjects for each event type to cache latest values */\n private readonly eventSubjects = new Map<\n GlobalContextEventType,\n BehaviorSubject<GlobalContextEventRegistry[GlobalContextEventType] | null>\n >();\n\n /** Observable stream of all global context events from the window */\n private readonly events$ = fromEvent<CustomEvent<GlobalContextEventUnion>>(\n window,\n EVENT_CONFIG.EVENT_NAME\n ).pipe(map(event => event.detail));\n\n /**\n * Emits a global context event with type-safe payload.\n *\n * The event is both stored locally for latest value retrieval and dispatched\n * as a browser custom event for cross-component communication.\n *\n * @param type - The specific event type to emit (must be a valid GlobalContextEventType)\n * @param payload - Type-safe payload matching the event type requirements\n *\n * @throws {Error} When event type is invalid or payload validation fails\n *\n * @example\n * ```typescript\n * // Emit a state change event\n * eventService.emit('GLOBAL_CONTEXT_STATE_CHANGE', {\n * refreshOption: 'live',\n * isAutoRefreshEnabled: true\n * });\n *\n * // Emit a refresh event\n * eventService.emit('GLOBAL_CONTEXT_REFRESH', {\n * dateFrom: '2024-01-01',\n * dateTo: '2024-01-02'\n * });\n * ```\n */\n emit<T extends GlobalContextEventType>(type: T, payload?: GlobalContextEventRegistry[T]): void {\n const payloadCopy = structuredClone(payload);\n\n try {\n this.validateEventType(type);\n\n // Update the local subject with the new value\n const subject = this.getOrCreateEventSubject(type);\n subject.next(payloadCopy ?? null);\n\n // Dispatch the browser event for cross-component communication\n this.dispatchBrowserEvent(type, payloadCopy);\n } catch (error) {\n console.error(`Failed to emit global context event '${type}':`, error);\n throw error;\n }\n }\n\n /**\n * Creates an observable that emits whenever a specific event type occurs.\n *\n * The observable filters the global event stream to only emit events of the specified type.\n * This provides efficient, reactive event handling without manual event listener management.\n *\n * @param eventType - The specific event type to observe\n * @returns Observable that emits payloads of the specified event type\n *\n * @throws {Error} When event type is invalid\n *\n * @example\n * ```typescript\n * // Subscribe to state changes\n * eventService.on('GLOBAL_CONTEXT_STATE_CHANGE')\n * .pipe(takeUntilDestroyed())\n * .subscribe(state => {\n * console.log('New state:', state);\n * });\n *\n * // Subscribe to refresh events with filtering\n * eventService.on('GLOBAL_CONTEXT_REFRESH')\n * .pipe(\n * filter(data => data?.interval === 'MINUTES'),\n * takeUntilDestroyed()\n * )\n * .subscribe(refreshData => {\n * console.log('Minute-based refresh:', refreshData);\n * });\n * ```\n */\n on<T extends GlobalContextEventType>(eventType: T): Observable<GlobalContextEventRegistry[T]> {\n try {\n this.validateEventType(eventType);\n\n return this.events$.pipe(\n filter((event): event is GlobalContextEventUnion => event.type === eventType),\n map(event => event.payload as GlobalContextEventRegistry[T])\n );\n } catch (error) {\n console.error(`Failed to create observable for event '${eventType}':`, error);\n throw error;\n }\n }\n\n /**\n * Retrieves the most recently emitted value for a specific event type.\n *\n * This method provides synchronous access to the latest event data without\n * requiring a subscription. Returns null if no event of the specified type\n * has been emitted yet.\n *\n * @param eventType - The event type to retrieve the latest value for\n * @returns The latest emitted value or null if none exists\n *\n * @throws {Error} When event type is invalid\n *\n * @example\n * ```typescript\n * // Get the current state\n * const currentState = eventService.getLatestValue('GLOBAL_CONTEXT_STATE_CHANGE');\n * if (currentState) {\n * console.log('Current refresh option:', currentState.refreshOption);\n * }\n *\n * // Check for latest refresh data\n * const refreshData = eventService.getLatestValue('GLOBAL_CONTEXT_REFRESH');\n * if (refreshData?.dateFrom) {\n * console.log('Last refresh from:', refreshData.dateFrom);\n * }\n * ```\n */\n getLatestValue<T extends GlobalContextEventType>(\n eventType: T\n ): GlobalContextEventRegistry[T] | null {\n try {\n this.validateEventType(eventType);\n\n const value = this.getOrCreateEventSubject(eventType).getValue();\n return structuredClone(value);\n } catch (error) {\n console.error(`Failed to get latest value for event '${eventType}':`, error);\n throw error;\n }\n }\n\n /**\n * Synchronizes dateTimeContext from REFRESH event to STATE_CHANGE event.\n *\n * This method ensures that when a REFRESH event contains dateTimeContext data,\n * it updates the STATE_CHANGE event subject's value directly without emitting a new event.\n * This keeps the internal state synchronized without triggering listeners.\n *\n * @param refreshDateTimeContext - The dateTimeContext from the REFRESH event to sync\n *\n * @example\n * ```typescript\n * // When a refresh occurs with new dateTimeContext\n * const refreshData = { dateFrom: '2024-01-01', dateTo: '2024-01-02', interval: 'HOURLY' };\n * eventService.emit(GLOBAL_CONTEXT_EVENTS.REFRESH, refreshData);\n *\n * // Sync it to STATE_CHANGE internal state\n * eventService.syncRefreshToStateChange(refreshData);\n * ```\n */\n syncRefreshToStateChange(\n refreshDateTimeContext?: GlobalContextEventRegistry[typeof GLOBAL_CONTEXT_EVENTS.REFRESH]\n ): void {\n if (!refreshDateTimeContext) {\n return;\n }\n\n // Only update if we have all required properties for DateTimeContext\n if (\n refreshDateTimeContext.dateFrom &&\n refreshDateTimeContext.dateTo &&\n refreshDateTimeContext.interval\n ) {\n // Get the STATE_CHANGE subject\n const stateChangeSubject = this.getOrCreateEventSubject(GLOBAL_CONTEXT_EVENTS.STATE_CHANGE);\n const currentState = stateChangeSubject.getValue() || {};\n\n // Merge refresh dateTimeContext into current state\n const updatedState = {\n ...currentState,\n dateTimeContext: {\n dateFrom: refreshDateTimeContext.dateFrom,\n dateTo: refreshDateTimeContext.dateTo,\n interval: refreshDateTimeContext.interval\n }\n };\n\n // Update the subject's value directly without emitting an event\n stateChangeSubject.next(updatedState);\n }\n }\n\n /**\n * Validates that an event type is not empty or invalid.\n *\n * @param eventType - The event type to validate\n * @throws {Error} When event type is invalid\n */\n private validateEventType(eventType: string): void {\n if (!eventType || typeof eventType !== 'string' || eventType.trim().length === 0) {\n throw new Error('Event type must be a non-empty string');\n }\n }\n\n /**\n * Dispatches a browser custom event for cross-component communication.\n *\n * @param type - Event type\n * @param payload - Event payload\n */\n private dispatchBrowserEvent<T extends GlobalContextEventType>(\n type: T,\n payload?: GlobalContextEventRegistry[T]\n ): void {\n const customEvent = new CustomEvent(EVENT_CONFIG.EVENT_NAME, {\n detail: {\n type,\n payload,\n timestamp: Date.now()\n }\n });\n\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Gets or creates a BehaviorSubject for a specific event type.\n * Implements memory management by limiting the number of cached subjects.\n *\n * @param type - The event type\n * @returns BehaviorSubject for the event type\n */\n private getOrCreateEventSubject<T extends GlobalContextEventType>(\n type: T\n ): BehaviorSubject<GlobalContextEventRegistry[T] | null> {\n if (!this.eventSubjects.has(type)) {\n // Implement basic memory management\n this.ensureSubjectCacheLimit();\n\n const newSubject = new BehaviorSubject<GlobalContextEventRegistry[T] | null>(null);\n this.eventSubjects.set(type, newSubject as BehaviorSubject<any>);\n }\n\n return this.eventSubjects.get(type) as BehaviorSubject<GlobalContextEventRegistry[T] | null>;\n }\n\n /**\n * Ensures the event subject cache doesn't exceed the maximum limit.\n * Removes the oldest subjects when limit is reached.\n */\n private ensureSubjectCacheLimit(): void {\n if (this.eventSubjects.size >= EVENT_CONFIG.MAX_CACHED_SUBJECTS) {\n const firstKey = this.eventSubjects.keys().next().value;\n if (firstKey) {\n const subject = this.eventSubjects.get(firstKey);\n if (subject && !subject.closed) {\n subject.complete();\n }\n this.eventSubjects.delete(firstKey);\n }\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { REFRESH_OPTION, RefreshOption } from '../../models/auto-refresh.model';\nimport { LinkStatesMap } from '../../models/control-flow.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextDisplayMode,\n GlobalContextSettings,\n WidgetControls\n} from '../../models/global-context.model';\n\n/**\n * Standard result interface for all widget settings operations.\n * Used consistently across resolution, toggle, and configuration methods.\n */\nexport interface WidgetSettingsResult {\n /** Settings for inline (widget-level) controls (new naming) */\n settings: Partial<GlobalContextSettings>;\n /** Link states determining dashboard vs inline control visibility */\n links: LinkStatesMap;\n /** Settings for dashboard-level controls (new naming) */\n dashboardControls: Partial<GlobalContextSettings>;\n}\n\n/**\n * Service responsible for managing widget-level control settings and their interaction\n * with dashboard-level controls. Handles the resolution of settings based on display mode,\n * link states, and refresh options.\n *\n * Key responsibilities:\n * - Widget settings resolution for different display modes\n * - Link state management between inline and dashboard controls\n * - Dashboard control calculations based on link states\n * - Settings toggle operations for individual and bulk link changes\n */\n@Injectable({ providedIn: 'root' })\nexport class WidgetControlService {\n // ========================================\n // PUBLIC API METHODS\n // ========================================\n\n /**\n * Resolves widget settings for inline controls based on the specified mode and refresh option.\n * For dashboard mode, calculates the split between inline and dashboard controls.\n *\n * @param controls - Widget control configuration containing settings and links\n * @param mode - Display mode determining which settings to use\n * @param refreshOption - Refresh mode (live/history) for settings selection\n * @returns Resolved settings with inline controls, links, and dashboard controls\n */\n resolveInlineControlSettings(\n controls: WidgetControls,\n mode: GlobalContextDisplayMode,\n refreshOption: RefreshOption\n ): WidgetSettingsResult {\n const baseSettings = this.getInlineSettingsFromWidgetControls(controls, mode, refreshOption);\n const baseLinks = this.getDefaultLinksFromControls(controls, mode, refreshOption);\n\n if (mode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n // Calculate dashboard controls with the merged settings and links\n const { newSettings: newInlineSettings, dashboardSettings } = this.calculateDashboardSettings(\n baseSettings,\n baseLinks\n );\n return {\n settings: newInlineSettings,\n links: baseLinks,\n dashboardControls: dashboardSettings\n };\n }\n\n return {\n settings: baseSettings,\n links: baseLinks,\n dashboardControls: {}\n };\n }\n\n /**\n * Resolves widget settings for configuration controls based on the specified mode and refresh option.\n * Configuration controls are simpler and don't require dashboard control calculations.\n *\n * @param controls - Widget control configuration containing config settings\n * @param mode - Display mode determining which config settings to use\n * @param refreshOption - Refresh mode (live/history) for settings selection\n * @returns Resolved configuration settings with empty links and dashboard controls\n */\n resolveConfigControlSettings(\n controls: WidgetControls,\n mode: GlobalContextDisplayMode,\n refreshOption: RefreshOption\n ): WidgetSettingsResult {\n const baseSettings = this.getConfigSettingsFromWidgetControls(controls, mode, refreshOption);\n return {\n settings: baseSettings,\n links: {},\n dashboardControls: {}\n };\n }\n\n /**\n * Extracts inline settings from widget controls for the specified display mode and refresh option.\n * Applies fallback logic for invalid refresh options, defaulting to LIVE mode.\n *\n * @param controls - Widget control configuration\n * @param displayMode - Display mode (dashboard, config, view_and_config)\n * @param refreshOption - Refresh mode, may be invalid and will fallback to LIVE\n * @returns Inline settings for the specified mode and refresh option\n */\n getInlineSettingsFromWidgetControls(\n controls: WidgetControls,\n displayMode: GlobalContextDisplayMode,\n refreshOption: RefreshOption | string\n ): Partial<GlobalContextSettings> {\n const validatedRefresh = this.validateRefreshOption(refreshOption);\n const templateSettings = controls?.settings?.[displayMode]?.[validatedRefresh] || {};\n return { ...templateSettings };\n }\n\n /**\n * Extracts configuration settings from widget controls for the specified display mode and refresh option.\n * Applies fallback logic for invalid refresh options, defaulting to LIVE mode.\n *\n * @param controls - Widget control configuration\n * @param displayMode - Display mode (dashboard, config, view_and_config)\n * @param refreshOption - Refresh mode, may be invalid and will fallback to LIVE\n * @returns Configuration settings for the specified mode and refresh option\n */\n getConfigSettingsFromWidgetControls(\n controls: WidgetControls,\n displayMode: GlobalContextDisplayMode,\n refreshOption: RefreshOption | string\n ): Partial<GlobalContextSettings> {\n const validatedRefresh = this.validateRefreshOption(refreshOption);\n const configSettings = controls?.configSettings?.[displayMode]?.[validatedRefresh] || {};\n return { ...configSettings };\n }\n\n /**\n * Extracts default link states from widget controls for the specified display mode and refresh option.\n * Applies fallback logic for invalid refresh options, defaulting to LIVE mode.\n *\n * @param controls - Widget control configuration\n * @param displayMode - Display mode (dashboard, config, view_and_config)\n * @param refreshOption - Refresh mode, may be invalid and will fallback to LIVE\n * @returns Default link states for the specified mode and refresh option\n */\n getDefaultLinksFromControls(\n controls: WidgetControls,\n displayMode: GlobalContextDisplayMode,\n refreshOption: RefreshOption | string\n ): LinkStatesMap {\n const validatedRefresh = this.validateRefreshOption(refreshOption);\n const defaultLinks = controls?.defaultLinks?.[displayMode]?.[validatedRefresh] || {};\n return { ...defaultLinks };\n }\n\n /**\n * Toggles a single link state and recalculates the resulting settings and dashboard controls.\n * When a link is toggled, it affects how controls are distributed between inline and dashboard.\n *\n * @param linkKey - The key of the link to toggle\n * @param currentSettings - Current inline control settings\n * @param currentLinks - Current link states\n * @returns Updated settings with toggled link and recalculated dashboard controls\n */\n toggleControlLink(\n linkKey: string,\n currentSettings: Partial<GlobalContextSettings>,\n currentLinks: LinkStatesMap\n ): WidgetSettingsResult {\n const updatedLinks = { ...currentLinks };\n updatedLinks[linkKey] = !updatedLinks[linkKey];\n\n const { newSettings, dashboardSettings } = this.calculateDashboardSettings(\n currentSettings,\n updatedLinks\n );\n\n return {\n settings: newSettings,\n links: updatedLinks,\n dashboardControls: dashboardSettings\n };\n }\n\n /**\n * Sets all link states to the specified value and recalculates the resulting settings.\n * This is used for bulk operations like \"link all\" or \"unlink all\" controls.\n *\n * @param state - The state to set for all links (true = linked, false = unlinked)\n * @param currentSettings - Current inline control settings\n * @param currentLinks - Current link states\n * @returns Updated settings with all links set to the specified state\n */\n toggleAllControlLinks(\n state: boolean,\n currentSettings: Partial<GlobalContextSettings>,\n currentLinks: LinkStatesMap\n ): WidgetSettingsResult {\n const updatedLinks = { ...currentLinks };\n Object.keys(updatedLinks).forEach(key => {\n updatedLinks[key] = state;\n });\n\n const { newSettings, dashboardSettings } = this.calculateDashboardSettings(\n currentSettings,\n updatedLinks\n );\n\n return {\n settings: newSettings,\n links: updatedLinks,\n dashboardControls: dashboardSettings\n };\n }\n\n /**\n * Validates and normalizes a refresh option, providing fallback to LIVE for invalid values.\n * Handles type coercion and validates against the REFRESH_OPTION enum.\n *\n * @param refreshOption - Refresh option to validate (may be string or RefreshOption)\n * @returns Valid RefreshOption, defaulting to LIVE for invalid inputs\n */\n private validateRefreshOption(refreshOption: RefreshOption | string): RefreshOption {\n return Object.values(REFRESH_OPTION).includes(refreshOption as RefreshOption)\n ? (refreshOption as RefreshOption)\n : REFRESH_OPTION.LIVE;\n }\n\n /**\n * Calculates how settings should be split between dashboard and inline controls based on link states.\n * When a control is linked (true), it appears on the dashboard. When unlinked (false), it appears inline.\n * This method implements the core business logic for the dashboard/inline control relationship.\n *\n * @param settings - Base settings to split between dashboard and inline\n * @param links - Link states determining where each control should appear\n * @returns Object containing settings for both inline and dashboard controls\n */\n private calculateDashboardSettings(\n settings: Partial<GlobalContextSettings>,\n links: LinkStatesMap\n ): {\n newSettings: Partial<GlobalContextSettings>;\n dashboardSettings: Partial<GlobalContextSettings>;\n } {\n const inlineSettings = { ...(settings || {}) };\n const dashboardSettings: Partial<GlobalContextSettings> = {};\n\n // If links is empty, set all dashboard settings to false\n if (Object.keys(links ?? {}).length === 0) {\n if (settings && 'showTimeContext' in settings) dashboardSettings.showTimeContext = false;\n if (settings && 'showAutoRefresh' in settings) dashboardSettings.showAutoRefresh = false;\n if (settings && 'showRefresh' in settings) dashboardSettings.showRefresh = false;\n if (settings && 'showRefreshInterval' in settings)\n dashboardSettings.showRefreshInterval = false;\n if (settings && 'showAggregation' in settings) dashboardSettings.showAggregation = false;\n } else {\n // Otherwise, set based on links values\n if (settings && 'showTimeContext' in settings && 'dateTimeContext' in links) {\n dashboardSettings.showTimeContext = links.dateTimeContext;\n inlineSettings.showTimeContext = !links.dateTimeContext;\n }\n if (settings && 'showAutoRefresh' in settings && 'isAutoRefreshEnabled' in links) {\n dashboardSettings.showAutoRefresh = links.isAutoRefreshEnabled;\n inlineSettings.showAutoRefresh = !links.isAutoRefreshEnabled;\n }\n if (settings && 'showRefresh' in settings) {\n dashboardSettings.showRefresh = !settings.showRefresh;\n inlineSettings.showRefresh = settings.showRefresh;\n }\n if (settings && 'showRefreshInterval' in settings && 'isAutoRefreshEnabled' in links) {\n dashboardSettings.showRefreshInterval =\n settings.showRefreshInterval && links.isAutoRefreshEnabled;\n inlineSettings.showRefreshInterval = inlineSettings.showAutoRefresh;\n }\n if (settings && 'showAggregation' in settings && 'aggregation' in links) {\n dashboardSettings.showAggregation = links.aggregation;\n inlineSettings.showAggregation = !links.aggregation;\n }\n }\n\n return { newSettings: inlineSettings, dashboardSettings };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { aggregationType } from '@c8y/client';\nimport { type Interval, INTERVALS, type TimeInterval } from '../../models/interval-picker.model';\nimport { DateTimeContextUtil } from '../../utils/date-time-context.util';\n\n@Injectable({ providedIn: 'root' })\nexport class DateTimeContextPickerService {\n /**\n * Calculates date time context according to provided interval.\n *\n * @param intervalId - Interval id indicating time range\n * @returns Tuple of [dateFrom, dateTo] where dateTo is current time, or null if interval is invalid\n *\n * @example\n * ```typescript\n * // Returns [epoch, current date] for 'none' interval\n * service.getDateTimeContextByInterval('none');\n *\n * // Returns [1 hour ago, now] for 'hours' interval\n * service.getDateTimeContextByInterval('hours');\n *\n * // Returns null for invalid intervals\n * service.getDateTimeContextByInterval('invalid'); // null\n * ```\n */\n getDateTimeContextByInterval(intervalId: TimeInterval): [Date, Date] | null {\n // Delegate to the central utility\n return DateTimeContextUtil.dateRangeFromInterval(intervalId);\n }\n\n /**\n * Validates provided param for being selectable Interval id.\n * @param intervalId Interval id to be validated.\n * @returns True if provided id is valid, selectable Interval id and false if it's not.\n */\n isSelectableInterval(intervalId: Interval['id']): boolean {\n // Handle type safety - return false for non-string inputs\n if (typeof intervalId !== 'string') {\n return false;\n }\n\n // 'custom' interval is not selectable\n if (intervalId === 'custom') {\n return false;\n }\n\n // 'none' interval is selectable (special case)\n if (intervalId === 'none') {\n return true;\n }\n\n // Check if interval exists in INTERVALS array\n return INTERVALS.some(({ id }) => id === intervalId);\n }\n\n /**\n * Validates provided date \"from\" and date \"to\":\n * - if both dates are proper date strings/values\n * - if provided date from is earlier than date to.\n * @param stringifiedDateFrom Date \"from\" that should be validated.\n * @param stringifiedDateTo Date \"to\" that should be validated.\n * @returns Result of validation of dates range.\n */\n isValidDateRange(stringifiedDateFrom: string, stringifiedDateTo: string): boolean {\n // Delegate to the central utility\n return DateTimeContextUtil.isValidRange(stringifiedDateFrom, stringifiedDateTo);\n }\n\n /**\n * Validates provided aggregation type.\n * @param aggregation Aggregation type to be validated.\n * @returns Result of validation of aggregation.\n */\n isValidAggregation(aggregation: aggregationType | null): boolean {\n // null is a valid aggregation (no aggregation)\n if (aggregation === null) {\n return true;\n }\n\n // Check if aggregation is one of the valid enum values\n return Object.values(aggregationType).includes(aggregation);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { aggregationType } from '@c8y/client';\nimport { REFRESH_OPTION, RefreshOption } from '../../models/auto-refresh.model';\nimport { DateTimeContext } from '../../models/date-time-context-picker.model';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE, GlobalContextState } from '../../models/global-context.model';\nimport { GLOBAL_CONTEXT_DEFAULTS } from '../../models/global-context-defaults';\nimport { TIME_INTERVAL, TIME_SPAN_MS, TimeInterval } from '../../models/interval-picker.model';\nimport { DateTimeContextPickerService } from './date-time-context-picker.service';\nimport { DateTimeContextUtil } from '../../utils/date-time-context.util';\n\n/**\n * Legacy widget configuration interface representing the various formats used in older widgets.\n *\n * This interface captures all possible legacy configuration properties that need to be migrated\n * to the new GlobalContextState format. Legacy widgets could store these properties at different\n * nesting levels (root, config, or mapConfig) with varying naming conventions.\n *\n * Note: The field 'canDecoupleGlobalTimeContext' was intentionally excluded from migration logic.\n * This field was used in legacy configurations but is no longer relevant for the new Global Context system.\n */\nexport interface LegacyWidgetConfig {\n /**\n * Widget capability declarations from widget definitions.\n * These indicate which global context features the widget supports,\n * but don't represent the actual configuration values.\n */\n displaySettings?: {\n /** Whether widget supports global time context feature */\n globalTimeContext?: boolean;\n /** Whether widget supports auto-refresh feature */\n globalAutoRefreshContext?: boolean;\n /** Whether widget supports realtime updates */\n globalRealtimeContext?: boolean;\n /** Whether widget supports data aggregation */\n globalAggregationContext?: boolean;\n };\n\n /**\n * Actual widget instance configuration determining which features are active.\n * These take precedence over displaySettings when determining migration behavior.\n */\n /** Whether this widget instance uses global time context */\n widgetInstanceGlobalTimeContext?: boolean;\n /** Whether this widget instance uses global auto-refresh */\n widgetInstanceGlobalAutoRefreshContext?: boolean;\n /** @deprecated Deprecated field not used in migration */\n canDecoupleGlobalTimeContext?: boolean;\n /** Whether to display date selection controls in the widget */\n displayDateSelection?: boolean;\n\n /** Legacy time configuration properties (multiple formats supported) */\n /** Date range as array [from, to] - used by some widgets */\n dateFilter?: string[] | [string, string];\n /** Date range as array [from, to] - alternative legacy format */\n date?: string[] | [string, string];\n /** Start date as ISO string */\n dateFrom?: string;\n /** End date as ISO string */\n dateTo?: string;\n /** Time interval identifier (e.g., 'hours', 'days', 'none') */\n interval?: string;\n\n /** Legacy refresh configuration properties */\n /** Legacy refresh mode ('interval', 'global-interval', 'none') */\n refreshOption?: string;\n /** Whether auto-refresh is enabled */\n isAutoRefreshEnabled?: boolean;\n /** Refresh interval in milliseconds */\n refreshInterval?: number;\n /** Whether widget is in realtime mode */\n isRealtime?: boolean;\n /** Alternative realtime flag used by some widgets */\n realtime?: boolean;\n\n /**\n * Nested configuration objects where widgets might store their settings.\n * The migration service checks these nested levels to ensure all configuration is captured.\n */\n /** Map widget specific configuration */\n mapConfig?: Record<string, unknown>;\n /** Generic nested configuration */\n config?: Record<string, unknown>;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WidgetConfigMigrationService {\n constructor(private dateTimeContextPickerService: DateTimeContextPickerService) {}\n\n /**\n * Transforms legacy widget configurations into the standardized GlobalContextState format.\n *\n * This migration handles the transition from various legacy configuration formats to the new\n * unified global context system. It detects which properties need updating and\n * preserves configurations that are already in the correct format.\n *\n * **What is migrated:**\n * - `displayMode`: Derived from widgetInstanceGlobalTimeContext/AutoRefreshContext flags\n * - `dateTimeContext`: Normalized from dateFilter, date, dateFrom/dateTo, or interval fields\n * - `refreshOption`: Converted from legacy 'interval'/'global-interval'/'none' values to LIVE/HISTORY\n * - `isAutoRefreshEnabled` + `refreshInterval`: Determined from realtime flags and legacy settings\n * - `aggregation`: Normalized from legacy 'NONE' string to null\n *\n *\n * **Use case:**\n * Call this on every widget configuration before rendering to ensure compatibility with\n * the global context system, regardless of when the widget was created or last saved.\n *\n * @param config - Widget configuration object that may contain legacy or new format properties.\n * Can be any object type, but should contain widget configuration fields.\n * @returns Configuration with all required GlobalContextState properties, either migrated from\n * legacy format or preserved if already valid. Returns input unchanged if null/undefined.\n *\n * @example\n * ```ts\n * // Legacy config with old format\n * const legacyConfig = {\n * widgetInstanceGlobalTimeContext: true,\n * dateFrom: '2024-01-01',\n * dateTo: '2024-01-02',\n * refreshOption: 'interval'\n * };\n *\n * // After migration\n * const migrated = migrationService.migrateWidgetConfig(legacyConfig);\n * // {\n * // displayMode: 'dashboard',\n * // dateTimeContext: { dateFrom: '2024-01-01T00:00:00.000Z', dateTo: '2024-01-02T00:00:00.000Z', interval: 'custom' },\n * // refreshOption: 'live',\n * // isAutoRefreshEnabled: true,\n * // refreshInterval: 60000,\n * // aggregation: null\n * // }\n * ```\n */\n migrateWidgetConfig<T extends object = object>(config: T): Partial<GlobalContextState> {\n // Guard: Handle invalid config\n if (!config) {\n return config as Partial<GlobalContextState>;\n }\n\n // Cast to unknown first, then to our working type\n const configObj = config as unknown as Record<string, unknown>;\n\n // Check if already has valid new format (minimal check)\n const hasValidDisplayMode =\n typeof configObj.displayMode === 'string' && this.isValidDisplayMode(configObj.displayMode);\n const hasValidRefreshOption =\n typeof configObj.refreshOption === 'string' &&\n this.isValidRefreshOption(configObj.refreshOption);\n\n // If has basic valid format and no legacy fields needing migration, return as is\n if (hasValidDisplayMode && hasValidRefreshOption && !this.hasLegacyFields(configObj)) {\n return config as Partial<GlobalContextState>;\n }\n\n // Extract settings from all levels (including nested) for migration decisions\n const settingsForMigration = this.extractGlobalContextSettings(configObj);\n\n // Create a flat config without nested objects (to avoid duplication in output)\n const flatConfig = this.createFlatConfig(configObj);\n\n // Apply migrations based on the merged settings\n this.applyGlobalContextProperties(flatConfig, settingsForMigration);\n\n return flatConfig;\n }\n\n /**\n * Creates a flattened configuration by excluding nested configuration objects.\n *\n * Legacy widgets often stored settings in nested objects like `mapConfig` or `config`.\n * This method creates a copy of the configuration without these nested objects to prevent\n * duplication in the migrated output - the nested values are extracted and merged separately\n * by extractGlobalContextSettings().\n *\n * @param config - The raw widget configuration potentially containing nested objects\n * @returns Flattened configuration without mapConfig and config properties\n *\n */\n private createFlatConfig(config: Record<string, unknown>): Partial<GlobalContextState> {\n const { mapConfig: _mapConfig, config: _nestedConfig, ...flatConfig } = config;\n return structuredClone(flatConfig) as Partial<GlobalContextState>;\n }\n\n /**\n * Applies or migrates all global context properties to ensure complete configuration.\n *\n * This method implements a selective migration strategy:\n * - Checks which properties are missing or invalid in the current config\n * - Migrates only the properties that need updating\n * - Forces full migration when config has NO global context properties at all\n *\n * The method ensures that all widgets end up with valid displayMode, dateTimeContext,\n * refreshOption/isAutoRefreshEnabled/refreshInterval, and aggregation settings.\n *\n * @param config - The configuration object to modify (mutated in place)\n * @param mergedSettings - Combined settings from all config levels used for migration decisions\n *\n */\n private applyGlobalContextProperties(\n config: Partial<GlobalContextState>,\n mergedSettings: Record<string, unknown>\n ): void {\n // Check if this config has no global context properties at all\n const hasNoGlobalContext = this.hasNoGlobalContextProperties(config);\n\n // Check what needs migration\n const needsDisplayMode = !this.isValidDisplayMode(config.displayMode);\n const needsDateTimeContext = !config.dateTimeContext;\n const needsRefreshSettings = this.needsRefreshSettingsMigration(config, mergedSettings);\n const needsAggregation =\n (mergedSettings.aggregation as string) === 'NONE' || config.aggregation === undefined;\n\n // Apply migrations based on needs or if no global context exists\n if (needsDisplayMode || hasNoGlobalContext) {\n config.displayMode = this.resolveDisplayMode(mergedSettings);\n }\n\n if (needsDateTimeContext || hasNoGlobalContext) {\n config.dateTimeContext = this.resolveDateTimeContext(mergedSettings);\n }\n\n if (needsRefreshSettings || hasNoGlobalContext) {\n this.applyRefreshSettings(config, mergedSettings);\n }\n\n if (needsAggregation || hasNoGlobalContext) {\n config.aggregation = this.normalizeAggregation(config.aggregation);\n }\n }\n\n /**\n * Determines if a configuration completely lacks global context properties.\n *\n * Used to detect widgets that have never been configured for global context integration.\n * When true, the migration applies full default configuration rather than selective updates.\n *\n * @param config - The configuration to check\n * @returns true if all global context properties are missing or undefined\n *\n */\n private hasNoGlobalContextProperties(config: Partial<GlobalContextState>): boolean {\n return (\n !config.displayMode &&\n !config.dateTimeContext &&\n config.refreshOption === undefined &&\n config.isAutoRefreshEnabled === undefined &&\n config.refreshInterval === undefined &&\n config.aggregation === undefined\n );\n }\n\n /**\n * Applies refresh settings as a cohesive unit to ensure consistency.\n *\n * The three refresh properties (refreshOption, isAutoRefreshEnabled, refreshInterval) are\n * interdependent and must be migrated together to avoid inconsistent states:\n * - refreshOption determines the mode (LIVE vs HISTORY)\n * - isAutoRefreshEnabled controls whether auto-refresh is active\n * - refreshInterval sets the refresh frequency in milliseconds\n *\n * Special handling:\n * - Realtime widgets get LIVE mode with 5-second interval\n * - Legacy refreshOption values are normalized to LIVE or HISTORY\n * - Nested config refreshInterval values are prioritized\n *\n * @param config - The configuration object to update (mutated in place)\n * @param mergedSettings - Combined settings from all levels for migration decisions\n *\n */\n private applyRefreshSettings(\n config: Partial<GlobalContextState>,\n mergedSettings: Record<string, unknown>\n ): void {\n const isRealtime = this.isRealtimeWidget(mergedSettings);\n const legacyRefreshOption = mergedSettings.refreshOption;\n\n // Refresh Option\n if (!this.isValidRefreshOption(config.refreshOption)) {\n config.refreshOption = this.resolveRefreshOption(\n isRealtime,\n typeof legacyRefreshOption === 'string' ? legacyRefreshOption : undefined\n );\n }\n\n // Auto Refresh Enabled\n if (config.isAutoRefreshEnabled === undefined) {\n config.isAutoRefreshEnabled = this.resolveAutoRefreshEnabled(\n isRealtime,\n typeof legacyRefreshOption === 'string' ? legacyRefreshOption : undefined\n );\n }\n\n // Refresh Interval - always use default 5s interval (ignore stored values)\n // This ensures old dashboards with custom intervals are migrated to the fixed 5s interval\n config.refreshInterval = GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL;\n }\n\n /**\n * Determines the appropriate display mode based on legacy widget configuration.\n *\n * Display mode controls how the widget integrates with global context:\n * - DASHBOARD: Fully controlled by dashboard-level global context\n * - CONFIG: Widget manages its own settings independently\n * - VIEW_AND_CONFIG: Widget shows inline controls and can configure itself\n *\n * Decision logic priority:\n * 1. displayDateSelection=true → VIEW_AND_CONFIG (explicit request for date controls)\n * 2. Both time and refresh are global → DASHBOARD (full integration)\n * 3. One global, one local → VIEW_AND_CONFIG (partial integration)\n * 4. One setting defined → DASHBOARD (assume global by default)\n * 5. Both undefined → CONFIG (widget manages itself)\n *\n * @param settings - Merged settings from all config levels\n * @returns The appropriate display mode for the widget\n *\n */\n private resolveDisplayMode(settings: Record<string, unknown>): GLOBAL_CONTEXT_DISPLAY_MODE {\n // Special case: Display date selection\n if (settings.displayDateSelection === true) {\n return GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG;\n }\n\n const timeGlobal = settings.widgetInstanceGlobalTimeContext;\n const refreshGlobal = settings.widgetInstanceGlobalAutoRefreshContext;\n\n // Explicit configurations\n if (timeGlobal === true && refreshGlobal === true) {\n return GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n }\n\n if (timeGlobal === true && refreshGlobal === false) {\n return GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG;\n }\n\n if (timeGlobal === false && refreshGlobal === true) {\n return GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG;\n }\n\n // Single setting defined\n if (timeGlobal === true && refreshGlobal === undefined) {\n return GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n }\n\n if (timeGlobal === undefined && refreshGlobal === true) {\n return GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n }\n\n // Both undefined - widget manages itself\n if (timeGlobal === undefined && refreshGlobal === undefined) {\n return GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG;\n }\n\n // Default to CONFIG (widget manages itself)\n return GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG;\n }\n\n /**\n * Builds date/time context from various legacy configuration formats.\n *\n * Legacy widgets stored time configuration in many different ways. This method\n * normalizes all formats into the new DateTimeContext structure with consistent\n * ISO date strings and proper interval classification.\n *\n * Resolution priority:\n * 1. interval='none' → Always epoch (1970) to now with CUSTOM interval\n * 2. Predefined intervals (hours, days, etc.) → Calculate fresh dates based on interval\n * 3. Legacy date fields → Use provided dates with calculated/custom interval\n * 4. Widget needs time context → Apply default (last hour)\n * 5. Fallback → Last hour with HOURS interval\n *\n * Special cases:\n * - interval='none' always means \"all data\" regardless of other date fields\n * - Predefined intervals recalculate dates to be relative to current time\n * - Custom date ranges preserve the exact dates provided\n *\n * @param settings - Merged settings from all config levels\n * @returns Complete DateTimeContext with ISO dates and interval\n *\n */\n private resolveDateTimeContext(settings: Record<string, unknown>): DateTimeContext {\n // Special case: interval \"none\" always means \"all data from 1970 to now\"\n if (\n settings.interval &&\n typeof settings.interval === 'string' &&\n settings.interval.toLowerCase() === 'none'\n ) {\n return {\n dateFrom: '1970-01-01T00:00:00.000Z', // Always use epoch start\n dateTo: DateTimeContextUtil.toIso(new Date()), // Always use current time\n interval: TIME_INTERVAL.CUSTOM\n };\n }\n\n // Check if we have a predefined interval (not custom or none)\n // For predefined intervals, we should calculate fresh dates based on current time\n if (\n settings.interval &&\n typeof settings.interval === 'string' &&\n this.isPredefinedInterval(settings.interval)\n ) {\n const interval = this.resolveInterval(settings.interval as string);\n const dateRange = this.dateTimeContextPickerService.getDateTimeContextByInterval(interval);\n\n return DateTimeContextUtil.ensureIsoContext({\n dateFrom: dateRange![0],\n dateTo: dateRange![1],\n interval\n });\n }\n\n // Try legacy date fields (for custom intervals or when no interval specified)\n const legacyDates = this.extractLegacyDates(settings);\n if (legacyDates) {\n return {\n dateFrom: legacyDates.dateFrom,\n dateTo: legacyDates.dateTo,\n interval: this.calculateInterval(\n legacyDates.dateFrom,\n legacyDates.dateTo,\n typeof settings.interval === 'string' ? settings.interval : undefined\n )\n };\n }\n\n // Create default context if widget needs it\n if (this.needsDefaultDateTimeContext(settings)) {\n const interval = this.resolveInterval(settings.interval as string);\n const dateRange = this.dateTimeContextPickerService.getDateTimeContextByInterval(interval);\n\n return DateTimeContextUtil.ensureIsoContext({\n dateFrom: dateRange![0],\n dateTo: dateRange![1],\n interval\n });\n }\n\n // Absolute fallback: last hour\n return this.getDefaultDateTimeContext();\n }\n\n /**\n * Resolves the refresh option (LIVE or HISTORY) from legacy configuration.\n *\n * Maps legacy refresh option values to the new binary system:\n * - 'interval' or 'global-interval' → LIVE (auto-refresh enabled)\n * - 'none' → HISTORY (no auto-refresh)\n * - Realtime widgets with any option → LIVE\n * - Default → LIVE\n *\n * @param isRealtime - Whether the widget is in realtime mode\n * @param legacyOption - Legacy refreshOption value if present\n * @returns LIVE or HISTORY refresh option\n *\n */\n private resolveRefreshOption(isRealtime: boolean, legacyOption?: string): RefreshOption {\n // Only use LIVE for realtime if there's an actual legacy option indicating it\n if (isRealtime && legacyOption) {\n return REFRESH_OPTION.LIVE;\n }\n\n // Handle legacy refresh option\n const normalizedOption = legacyOption?.toLowerCase();\n switch (normalizedOption) {\n case 'global-interval':\n case 'interval':\n return REFRESH_OPTION.LIVE;\n case 'none':\n return REFRESH_OPTION.HISTORY;\n default:\n // Default to LIVE for all widgets (including interval='none')\n return REFRESH_OPTION.LIVE;\n }\n }\n\n /**\n * Resolves whether auto-refresh should be enabled based on widget configuration.\n *\n * Determines the initial state of the auto-refresh toggle:\n * - Realtime widgets → always enabled\n * - refreshOption='none' → disabled\n * - All other cases → enabled (including interval='none')\n *\n * @param isRealtime - Whether the widget is in realtime mode\n * @param legacyOption - Legacy refreshOption value if present\n * @returns true if auto-refresh should be enabled\n *\n */\n private resolveAutoRefreshEnabled(isRealtime: boolean, legacyOption?: string): boolean {\n if (isRealtime) {\n return true;\n }\n\n // Only disable auto-refresh if refreshOption is explicitly 'none'\n if (legacyOption && legacyOption.toLowerCase() === 'none') {\n return false;\n }\n\n return true; // Default to enabled (including interval='none')\n }\n\n /**\n * Detects if a widget is configured for realtime operation.\n *\n * Realtime widgets continuously update with live data and require special handling\n * with shorter refresh intervals (5 seconds) and LIVE mode.\n *\n * Detection criteria:\n * - Explicit realtime/isRealtime flags\n * - globalRealtimeContext capability + active refresh option\n *\n * @param settings - Widget settings to check\n * @returns true if widget should operate in realtime mode\n *\n */\n private isRealtimeWidget(settings: Record<string, unknown>): boolean {\n // Consider explicit realtime settings\n if (settings.realtime === true || settings.isRealtime === true) {\n return true;\n }\n\n // Also consider display settings if there's a refresh option indicating active refresh\n const displaySettings = settings.displaySettings as Record<string, unknown> | undefined;\n if (\n displaySettings?.globalRealtimeContext === true &&\n typeof settings.refreshOption === 'string' &&\n ['interval', 'global-interval'].includes(settings.refreshOption)\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Extracts date range from various legacy property formats.\n *\n * Legacy widgets stored dates in multiple ways. This method checks all possible\n * locations and returns the first valid date range found.\n *\n * Priority order:\n * 1. dateFrom + dateTo (most explicit)\n * 2. dateFilter array\n * 3. date array\n *\n * @param settings - Widget settings containing potential date properties\n * @returns Date range object or null if no valid dates found\n *\n */\n private extractLegacyDates(\n settings: Record<string, unknown>\n ): { dateFrom: string; dateTo: string } | null {\n // Priority 1: dateFrom/dateTo\n if (typeof settings.dateFrom === 'string' && typeof settings.dateTo === 'string') {\n return { dateFrom: settings.dateFrom, dateTo: settings.dateTo };\n }\n\n // Priority 2: dateFilter array\n if (Array.isArray(settings.dateFilter) && settings.dateFilter.length >= 2) {\n return { dateFrom: settings.dateFilter[0], dateTo: settings.dateFilter[1] };\n }\n\n // Priority 3: date array\n if (Array.isArray(settings.date) && settings.date.length >= 2) {\n return { dateFrom: settings.date[0], dateTo: settings.date[1] };\n }\n\n return null;\n }\n\n /**\n * Calculates the appropriate time interval based on date range duration.\n *\n * Uses the provided interval if valid, otherwise calculates from the date range span:\n * - ≤1 minute → MINUTES\n * - ≤1 hour → HOURS\n * - ≤1 day → DAYS\n * - ≤1 week → WEEKS\n * - ≤1 month → MONTHS\n * - >1 month → CUSTOM\n *\n * Special case: interval='none' → CUSTOM\n *\n * @param dateFrom - Start date as ISO string\n * @param dateTo - End date as ISO string\n * @param providedInterval - Optional interval from legacy config\n * @returns Appropriate TimeInterval enum value\n *\n */\n private calculateInterval(\n dateFrom: string,\n dateTo: string,\n providedInterval?: string\n ): TimeInterval {\n // Use provided interval if valid\n if (providedInterval) {\n // Handle case-insensitive 'none' variations\n if (providedInterval.toLowerCase() === 'none') {\n return TIME_INTERVAL.CUSTOM;\n }\n\n if (Object.values(TIME_INTERVAL).includes(providedInterval as TimeInterval)) {\n return providedInterval as TimeInterval;\n }\n }\n\n // Calculate from date range\n try {\n const from = new Date(dateFrom);\n const to = new Date(dateTo);\n const diffMs = to.getTime() - from.getTime();\n\n if (diffMs <= TIME_SPAN_MS.MINUTE) return TIME_INTERVAL.MINUTES;\n if (diffMs <= TIME_SPAN_MS.HOUR) return TIME_INTERVAL.HOURS;\n if (diffMs <= TIME_SPAN_MS.DAY) return TIME_INTERVAL.DAYS;\n if (diffMs <= TIME_SPAN_MS.WEEK) return TIME_INTERVAL.WEEKS;\n if (diffMs <= TIME_SPAN_MS.MONTH) return TIME_INTERVAL.MONTHS;\n\n return TIME_INTERVAL.CUSTOM;\n } catch {\n return TIME_INTERVAL.CUSTOM;\n }\n }\n\n /**\n * Resolves and validates a time interval string.\n *\n * @param interval - Interval string to validate\n * @returns Valid TimeInterval or HOURS as default\n *\n */\n private resolveInterval(interval?: string): TimeInterval {\n if (interval && this.dateTimeContextPickerService.isSelectableInterval(interval)) {\n return interval as TimeInterval;\n }\n return TIME_INTERVAL.HOURS;\n }\n\n /**\n * Normalizes legacy aggregation values to the new format.\n *\n * Converts legacy 'NONE' string to null (meaning no aggregation).\n *\n * @param value - Legacy aggregation value\n * @returns Normalized aggregationType or null\n *\n */\n private normalizeAggregation(value?: string | aggregationType | null): aggregationType | null {\n if (value === 'NONE' || value === undefined) {\n return null;\n }\n return value as aggregationType;\n }\n\n /**\n * Checks if an interval is predefined (relative to current time) rather than custom.\n *\n * Predefined intervals (hours, days, etc.) are recalculated relative to current time\n * during migration, while custom intervals preserve their exact date ranges.\n *\n * @param interval - Interval string to check\n * @returns true if interval is predefined (not CUSTOM or 'none')\n *\n */\n private isPredefinedInterval(interval: string): boolean {\n const predefinedIntervals: string[] = [\n TIME_INTERVAL.MINUTES,\n TIME_INTERVAL.HOURS,\n TIME_INTERVAL.DAYS,\n TIME_INTERVAL.WEEKS,\n TIME_INTERVAL.MONTHS\n ];\n return predefinedIntervals.includes(interval);\n }\n\n /**\n * Determines if a widget requires a default date/time context to be generated.\n *\n * Returns true when the widget has time-related settings but no explicit date values,\n * indicating it expects time context but didn't provide specific dates.\n *\n * @param settings - Widget settings to evaluate\n * @returns true if default date/time context should be applied\n *\n */\n private needsDefaultDateTimeContext(settings: Record<string, unknown>): boolean {\n const displaySettings = settings.displaySettings as Record<string, unknown> | undefined;\n const hasTimeSettings = !!(\n settings.displayDateSelection ||\n settings.widgetInstanceGlobalTimeContext !== undefined ||\n displaySettings?.globalTimeContext ||\n settings.interval\n );\n\n const hasExplicitDates = !!(\n (settings.dateFrom && settings.dateTo) ||\n settings.dateFilter ||\n settings.date\n );\n\n return hasTimeSettings && !hasExplicitDates;\n }\n\n /**\n * Creates a default date/time context for widgets without explicit time configuration.\n *\n * Returns the last hour as a safe default that works for most widgets.\n *\n * @returns DateTimeContext configured for the last hour\n *\n */\n private getDefaultDateTimeContext(): DateTimeContext {\n const interval = TIME_INTERVAL.HOURS;\n const dateRange = this.dateTimeContextPickerService.getDateTimeContextByInterval(interval);\n\n return DateTimeContextUtil.ensureIsoContext({\n dateFrom: dateRange![0],\n dateTo: dateRange![1],\n interval\n });\n }\n\n /**\n * Detects if a configuration contains legacy fields requiring migration.\n *\n * Recursively checks for legacy date fields, refresh options, aggregation values,\n * and nested configurations that need updating.\n *\n * @param config - Configuration object to check\n * @returns true if any legacy fields are found\n *\n */\n private hasLegacyFields(config: Record<string, unknown>): boolean {\n // Check for legacy date fields\n if (\n config.dateFilter ||\n config.date ||\n (config.dateFrom && config.dateTo && !config.dateTimeContext)\n ) {\n return true;\n }\n\n // Check for legacy refresh options (case-insensitive)\n if (\n typeof config.refreshOption === 'string' &&\n ['global-interval', 'interval', 'none'].includes(config.refreshOption.toLowerCase())\n ) {\n return true;\n }\n\n // Check for legacy aggregation\n if (config.aggregation === 'NONE') {\n return true;\n }\n\n // Check nested configs\n if (\n config.mapConfig &&\n typeof config.mapConfig === 'object' &&\n this.hasLegacyFields(config.mapConfig as Record<string, unknown>)\n ) {\n return true;\n }\n\n if (\n config.config &&\n typeof config.config === 'object' &&\n this.hasLegacyFields(config.config as Record<string, unknown>)\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Check if widget needs refresh settings migration.\n */\n private needsRefreshSettingsMigration(\n config: Partial<GlobalContextState>,\n settings: Record<string, unknown>\n ): boolean {\n // Already has valid refresh option\n if (this.isValidRefreshOption(config.refreshOption)) {\n // But check if realtime needs special handling\n const isRealtime = this.isRealtimeWidget(settings);\n if (\n isRealtime &&\n (config.refreshInterval === undefined || config.isAutoRefreshEnabled === undefined)\n ) {\n return true;\n }\n return false;\n }\n\n // Has legacy refresh option or undefined\n return true;\n }\n\n /**\n * Validates if a value is a recognized display mode.\n *\n * @param value - Value to validate\n * @returns true if value is a valid GLOBAL_CONTEXT_DISPLAY_MODE\n *\n */\n private isValidDisplayMode(value?: string): boolean {\n return (\n value === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD ||\n value === GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG ||\n value === GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG\n );\n }\n\n /**\n * Validates if a value is a recognized refresh option.\n *\n * @param value - Value to validate\n * @returns true if value is LIVE or HISTORY\n *\n */\n private isValidRefreshOption(value?: string): boolean {\n return value === REFRESH_OPTION.LIVE || value === REFRESH_OPTION.HISTORY;\n }\n\n /**\n * Extracts and merges global context settings from all configuration levels.\n *\n * Legacy widgets stored settings at different nesting levels (root, config, mapConfig).\n * This method extracts relevant settings from all levels and merges them with proper\n * precedence to ensure nothing is missed during migration.\n *\n * Precedence order (highest to lowest):\n * 1. mapConfig (most specific)\n * 2. config (nested level)\n * 3. root level (main config)\n *\n * @param config - Full widget configuration with potential nesting\n * @returns Merged settings object containing all relevant properties\n *\n */\n private extractGlobalContextSettings(config: Record<string, unknown>): Record<string, unknown> {\n const mainLevel = this.extractRelevantSettings(config);\n const configLevel =\n config.config && typeof config.config === 'object'\n ? this.extractRelevantSettings(config.config as Record<string, unknown>)\n : {};\n const mapConfigLevel =\n config.mapConfig && typeof config.mapConfig === 'object'\n ? this.extractRelevantSettings(config.mapConfig as Record<string, unknown>)\n : {};\n\n // Merge with precedence\n return {\n ...mainLevel,\n ...configLevel,\n ...mapConfigLevel\n };\n }\n\n /**\n * Filters a configuration object to include only global context relevant properties.\n *\n * Reduces noise by extracting only the properties needed for migration decisions,\n * ignoring widget-specific configuration that doesn't affect global context.\n *\n * @param obj - Configuration object to filter\n * @returns Object containing only relevant properties\n *\n */\n private extractRelevantSettings(obj: Record<string, unknown>): Record<string, unknown> {\n const relevantKeys = [\n 'displaySettings',\n 'widgetInstanceGlobalTimeContext',\n 'widgetInstanceGlobalAutoRefreshContext',\n 'dateFilter',\n 'date',\n 'dateFrom',\n 'dateTo',\n 'refreshOption',\n 'refreshInterval',\n 'displayDateSelection',\n 'isAutoRefreshEnabled',\n 'isRealtime',\n 'realtime',\n 'interval',\n 'aggregation'\n ];\n\n return Object.fromEntries(\n relevantKeys.filter(key => obj[key] !== undefined).map(key => [key, obj[key]])\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { aggregationType } from '@c8y/client';\nimport { Interval } from '../../models/interval-picker.model';\nimport { DateTimeContextPickerService } from './date-time-context-picker.service';\n\n/**\n * Service responsible for validating global context parameters.\n *\n * This service centralizes all validation logic for global context parameters,\n * including intervals, aggregations, date ranges, and boolean values.\n * It provides a single source of truth for validation rules across the application.\n *\n * @example\n * ```typescript\n * constructor(private validationService: GlobalContextValidationService) {}\n *\n * const isValid = this.validationService.isValidInterval('HOURS');\n * const dateRangeValid = this.validationService.isValidDateRange('2024-01-01', '2024-01-02');\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class GlobalContextValidationService {\n private dateTimeContextPickerService = inject(DateTimeContextPickerService);\n\n /**\n * Validates if the provided interval is selectable and supported.\n *\n * @param interval - The interval to validate\n * @returns True if the interval is valid and selectable, false otherwise\n *\n * @example\n * ```typescript\n * const isValid = validationService.isValidInterval('HOURS'); // true\n * const isInvalid = validationService.isValidInterval('INVALID'); // false\n * ```\n */\n isValidInterval(interval: string | unknown): boolean {\n return (\n typeof interval === 'string' &&\n this.dateTimeContextPickerService.isSelectableInterval(interval as Interval['id'])\n );\n }\n\n /**\n * Validates if the provided aggregation type is supported.\n *\n * @param aggregation - The aggregation type to validate\n * @returns True if the aggregation is valid, false otherwise\n *\n * @example\n * ```typescript\n * const isValid = validationService.isValidAggregation(aggregationType.HOURLY); // true\n * const isInvalid = validationService.isValidAggregation('INVALID' as any); // false\n * ```\n */\n isValidAggregation(aggregation: string | unknown): boolean {\n return (\n typeof aggregation === 'string' &&\n this.dateTimeContextPickerService.isValidAggregation(aggregation as aggregationType)\n );\n }\n\n /**\n * Validates if the provided date range is valid.\n *\n * @param dateFrom - The start date of the range\n * @param dateTo - The end date of the range\n * @returns True if the date range is valid, false otherwise\n *\n * @example\n * ```typescript\n * const isValid = validationService.isValidDateRange('2024-01-01', '2024-01-02'); // true\n * const isInvalid = validationService.isValidDateRange('invalid', '2024-01-02'); // false\n * ```\n */\n isValidDateRange(dateFrom: string, dateTo: string): boolean {\n return this.dateTimeContextPickerService.isValidDateRange(dateFrom, dateTo);\n }\n\n /**\n * Parses a string value to boolean or undefined.\n *\n * Only accepts the exact strings 'true' and 'false'. All other values,\n * including different cases, whitespace, or non-string types return undefined.\n *\n * @param value - The value to parse\n * @returns true for 'true', false for 'false', undefined for all other values\n *\n * @example\n * ```typescript\n * const result1 = validationService.parseBoolean('true'); // true\n * const result2 = validationService.parseBoolean('false'); // false\n * const result3 = validationService.parseBoolean('True'); // undefined\n * const result4 = validationService.parseBoolean(null); // undefined\n * ```\n */\n parseBoolean(value: string | unknown): boolean | undefined {\n if (typeof value !== 'string') return undefined;\n\n const map: Record<string, boolean> = {\n true: true,\n false: false\n };\n\n return map[value] ?? undefined;\n }\n\n /**\n * Validates multiple parameters at once and returns detailed results.\n *\n * @param params - Object containing parameters to validate\n * @returns Validation results for each parameter\n *\n * @example\n * ```typescript\n * const results = validationService.validateParameters({\n * interval: 'HOURS',\n * aggregation: aggregationType.HOURLY,\n * autoRefresh: 'true'\n * });\n * ```\n */\n validateParameters(params: {\n interval?: string | unknown;\n aggregation?: string | unknown;\n dateFrom?: string | null;\n dateTo?: string | null;\n autoRefresh?: string | unknown;\n }): {\n interval: boolean;\n aggregation: boolean;\n dateRange: boolean;\n autoRefresh: boolean | undefined;\n } {\n return {\n interval: params.interval ? this.isValidInterval(params.interval) : false,\n aggregation: params.aggregation ? this.isValidAggregation(params.aggregation) : false,\n dateRange:\n params.dateFrom && params.dateTo\n ? this.isValidDateRange(params.dateFrom, params.dateTo)\n : false,\n autoRefresh: params.autoRefresh ? this.parseBoolean(params.autoRefresh) : undefined\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { aggregationType } from '@c8y/client';\nimport { AggregationState } from '../../models/aggregation.model';\nimport { TIME_SPAN_MS } from '../../models/interval-picker.model';\n\n/**\n * AggregationValidationService handles the validation of time ranges against\n * aggregation type requirements in the global context system.\n *\n * This service determines which aggregation types (MINUTELY, HOURLY, DAILY) are valid\n * for a given time range based on predefined business rules. It provides the core\n * validation logic that determines UI state and aggregation availability.\n *\n * Key responsibilities:\n * - Validate time ranges against minimum aggregation requirements\n * - Calculate time range durations in milliseconds\n * - Transform validation results into UI-friendly disabled state maps\n * - Provide consistent validation logic across the application\n *\n * Validation Rules:\n * - MINUTELY: Disabled for time ranges <= 1 minute\n * - HOURLY: Disabled for time ranges <= 1 hour\n * - DAILY: Disabled for time ranges <= 1 day\n *\n * @example\n * ```typescript\n * const validationService = inject(AggregationValidationService);\n *\n * // Validate a 2-hour time range\n * const dateRange: [Date, Date] = [\n * new Date('2024-01-01T10:00:00Z'),\n * new Date('2024-01-01T12:00:00Z')\n * ];\n *\n * const disabledAggregations = validationService.getDisabledAggregations(dateRange);\n * console.log(disabledAggregations);\n * // { DAILY: true, HOURLY: false, MINUTELY: false }\n *\n * // Check if specific aggregation is valid\n * const isHourlyValid = validationService.isAggregationValid(dateRange, aggregationType.HOURLY);\n * console.log(isHourlyValid); // true (2 hours > 1 hour requirement)\n * ```\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AggregationValidationService {\n /**\n * Determines which aggregation types should be disabled for a given time range.\n *\n * This method validates the time range against all aggregation type requirements\n * and returns a map indicating which aggregations should be disabled in the UI.\n *\n * @param dateRange - Tuple of [dateFrom, dateTo] defining the time range\n * @returns Map of aggregation types to their disabled boolean state\n *\n * @example\n * ```typescript\n * const shortRange: [Date, Date] = [\n * new Date('2024-01-01T12:00:00Z'),\n * new Date('2024-01-01T12:30:00Z') // 30 minutes\n * ];\n *\n * const disabled = validationService.getDisabledAggregations(shortRange);\n * // { DAILY: true, HOURLY: true, MINUTELY: false }\n * ```\n */\n getDisabledAggregations([dateFrom, dateTo]: [Date, Date]): Partial<\n Record<aggregationType, boolean>\n > {\n const timeRangeValidations = this.validateTimeRanges([dateFrom, dateTo]);\n return this.transformValidationsToDisabledMap(timeRangeValidations);\n }\n\n /**\n * Checks if a specific aggregation type is valid for the given time range.\n *\n * This method provides a convenient way to check if a single aggregation type\n * meets the minimum time range requirements without needing to validate all types.\n *\n * @param dateRange - Tuple of [dateFrom, dateTo] defining the time range\n * @param aggregation - The aggregation type to validate\n * @returns True if the aggregation is valid for the time range, false if disabled\n *\n * @example\n * ```typescript\n * const oneHourRange: [Date, Date] = [\n * new Date('2024-01-01T12:00:00Z'),\n * new Date('2024-01-01T13:00:00Z')\n * ];\n *\n * const isMinutelyValid = validationService.isAggregationValid(oneHourRange, aggregationType.MINUTELY);\n * // true (1 hour > 1 minute requirement)\n *\n * const isDailyValid = validationService.isAggregationValid(oneHourRange, aggregationType.DAILY);\n * // false (1 hour <= 1 day requirement)\n * ```\n */\n isAggregationValid([dateFrom, dateTo]: [Date, Date], aggregation: aggregationType): boolean {\n const timeRangeInMs = this.getTimeRangeInMs(dateFrom, dateTo);\n\n switch (aggregation) {\n case aggregationType.DAILY:\n return timeRangeInMs > TIME_SPAN_MS.DAY;\n case aggregationType.HOURLY:\n return timeRangeInMs > TIME_SPAN_MS.HOUR;\n case aggregationType.MINUTELY:\n return timeRangeInMs > TIME_SPAN_MS.MINUTE;\n default:\n return false;\n }\n }\n\n /**\n * Calculates the time range duration in milliseconds.\n *\n * This method provides a standardized way to calculate time range durations\n * that can be used for validation and threshold comparisons.\n *\n * @param dateFrom - Start date of the range\n * @param dateTo - End date of the range\n * @returns Duration in milliseconds between the two dates\n *\n * @example\n * ```typescript\n * const duration = validationService.getTimeRangeInMs(\n * new Date('2024-01-01T10:00:00Z'),\n * new Date('2024-01-01T12:00:00Z')\n * );\n * console.log(duration); // 7200000 (2 hours in milliseconds)\n * ```\n */\n getTimeRangeInMs(dateFrom: Date, dateTo: Date): number {\n // Normalize dates to remove milliseconds for consistent comparisons\n // This prevents issues where date pickers might strip milliseconds inconsistently\n const normalizedFrom = new Date(dateFrom);\n normalizedFrom.setMilliseconds(0);\n\n const normalizedTo = new Date(dateTo);\n normalizedTo.setMilliseconds(0);\n\n return normalizedTo.valueOf() - normalizedFrom.valueOf();\n }\n\n /**\n * Validates time ranges against all aggregation type requirements.\n *\n * Determines which aggregation types should be disabled based on the time range duration.\n * Each aggregation type has a minimum time range requirement to be meaningful.\n *\n * Validation Logic:\n * - DAILY: Disabled if time range <= 1 day\n * - HOURLY: Disabled if time range <= 1 hour\n * - MINUTELY: Disabled if time range <= 1 minute\n *\n * @param dateRange - Tuple of [dateFrom, dateTo] to validate\n * @returns Array of aggregation states with their disabled status\n */\n private validateTimeRanges([dateFrom, dateTo]: [Date, Date]): AggregationState[] {\n const timeRangeInMs = this.getTimeRangeInMs(dateFrom, dateTo);\n\n return [\n {\n aggregationType: aggregationType.DAILY,\n isDisabled: timeRangeInMs <= TIME_SPAN_MS.DAY\n },\n {\n aggregationType: aggregationType.HOURLY,\n isDisabled: timeRangeInMs <= TIME_SPAN_MS.HOUR\n },\n {\n aggregationType: aggregationType.MINUTELY,\n isDisabled: timeRangeInMs <= TIME_SPAN_MS.MINUTE\n }\n ];\n }\n\n /**\n * Converts aggregation state array to a disabled aggregations map.\n *\n * Transforms the validation results into a map structure that indicates\n * which aggregation types should be disabled in the UI.\n *\n * @param timeRangeValidations - Array of aggregation states from validation\n * @returns Map of aggregation types to their disabled boolean state\n */\n private transformValidationsToDisabledMap(\n timeRangeValidations: AggregationState[]\n ): Partial<Record<aggregationType, boolean>> {\n return timeRangeValidations.reduce(\n (acc, { aggregationType, isDisabled }) => ({\n ...acc,\n [aggregationType]: isDisabled\n }),\n {}\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { aggregationType } from '@c8y/client';\nimport { AGGREGATION_LIMITS } from '../../models/aggregation.model';\nimport { AggregationValidationService } from './aggregation-validation.service';\n\n/**\n * Interface defining the result of aggregation calculation.\n * Contains both the selected aggregation and information about which aggregations are disabled.\n */\nexport interface AggregationCalculationResult {\n /** The selected aggregation type or null if no aggregation is selected */\n readonly selectedAggregation: aggregationType | null;\n /** Map of aggregation types to their disabled state */\n readonly disabledAggregations: Partial<Record<aggregationType, boolean>>;\n}\n\n/**\n * AggregationPickerService handles the logic for selecting appropriate data aggregations\n * based on time ranges and user preferences in the global context system.\n *\n * This service focuses on aggregation selection and automatic fallback logic when requested\n * aggregations are not appropriate for the data range. It delegates validation concerns\n * to the AggregationValidationService for better separation of concerns.\n *\n * Key responsibilities:\n * - Calculate optimal aggregation selection for given time ranges and preferences\n * - Handle automatic aggregation selection based on time range thresholds\n * - Provide fallback logic when requested aggregations are invalid\n * - Combine validation results with selection logic for complete aggregation calculation\n *\n * Auto-selection Logic:\n * - Uses AGGREGATION_LIMITS thresholds (10min, 1day, 4days) for fallback selection\n * - Delegates validation to AggregationValidationService\n * - Returns comprehensive results including both selection and validation state\n *\n * @example\n * ```typescript\n * const service = inject(AggregationPickerService);\n *\n * // Calculate aggregation for a 2-day time range\n * const dateRange: [Date, Date] = [\n * new Date('2024-01-01T00:00:00Z'),\n * new Date('2024-01-03T00:00:00Z')\n * ];\n *\n * const result = service.calculateAggregation(dateRange, aggregationType.HOURLY);\n * console.log(result.selectedAggregation); // 'HOURLY' (valid for 2-day range)\n * console.log(result.disabledAggregations); // { DAILY: true, HOURLY: false, MINUTELY: false }\n *\n * // Auto-selection when requested aggregation is disabled\n * const shortRange: [Date, Date] = [\n * new Date('2024-01-01T12:00:00Z'),\n * new Date('2024-01-01T12:30:00Z') // 30 minutes\n * ];\n *\n * const autoResult = service.calculateAggregation(shortRange, aggregationType.DAILY);\n * // DAILY is disabled for 30min range, so falls back to MINUTELY\n * console.log(autoResult.selectedAggregation); // 'MINUTELY'\n * ```\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AggregationPickerService {\n /** Service for validating time ranges against aggregation requirements */\n private readonly validationService = inject(AggregationValidationService);\n\n /**\n * Calculates the appropriate aggregation for a given time range and user preference.\n *\n * This method validates the time range against aggregation requirements and determines\n * which aggregations should be disabled. If the requested aggregation is not valid\n * for the time range, it automatically selects the most appropriate alternative.\n *\n * Validation Rules:\n * - MINUTELY: Requires time range > 1 minute\n * - HOURLY: Requires time range > 1 hour\n * - DAILY: Requires time range > 1 day\n *\n * Auto-selection Thresholds (when fallback is needed):\n * - >= 4 days: Selects DAILY aggregation\n * - >= 1 day: Selects HOURLY aggregation\n * - >= 10 minutes: Selects MINUTELY aggregation\n * - < 10 minutes: Returns null (no aggregation)\n *\n * @param dateRange - Tuple of [dateFrom, dateTo] defining the time range\n * @param requestedAggregation - User's preferred aggregation type or null for no preference\n * @returns Object containing the selected aggregation and disabled aggregation states\n *\n * @example\n * ```typescript\n * // Valid aggregation request\n * const result = service.calculateAggregation(\n * [new Date('2024-01-01'), new Date('2024-01-03')], // 2 days\n * aggregationType.HOURLY\n * );\n * // result.selectedAggregation === 'HOURLY' (valid for 2-day range)\n *\n * // Invalid aggregation request with fallback\n * const fallbackResult = service.calculateAggregation(\n * [new Date('2024-01-01T12:00'), new Date('2024-01-01T12:30')], // 30 minutes\n * aggregationType.DAILY // Not valid for 30min range\n * );\n * // fallbackResult.selectedAggregation === 'MINUTELY' (auto-selected)\n *\n * // Explicit null request\n * const nullResult = service.calculateAggregation(\n * [new Date('2024-01-01'), new Date('2024-01-03')],\n * null\n * );\n * // nullResult.selectedAggregation === null (as requested)\n * ```\n */\n calculateAggregation(\n [dateFrom, dateTo]: [Date, Date],\n requestedAggregation: aggregationType | null\n ): AggregationCalculationResult {\n const disabledAggregations = this.validationService.getDisabledAggregations([dateFrom, dateTo]);\n const timeRangeInMs = this.validationService.getTimeRangeInMs(dateFrom, dateTo);\n\n const isRequestedAggregationValid =\n requestedAggregation === null || !disabledAggregations[requestedAggregation];\n\n const selectedAggregation = isRequestedAggregationValid\n ? requestedAggregation\n : this.determineAggregation(timeRangeInMs);\n\n return {\n selectedAggregation,\n disabledAggregations\n };\n }\n\n /**\n * Determines the most appropriate aggregation type based on time range duration.\n *\n * Uses predefined thresholds to automatically select the best aggregation type\n * when the requested aggregation is not valid for the time range. This method\n * implements the fallback logic that ensures users always get meaningful aggregations.\n *\n * Selection Logic (based on AGGREGATION_LIMITS):\n * - >= 4 days (DAILY_LIMIT): Select DAILY aggregation\n * - >= 1 day (HOURLY_LIMIT): Select HOURLY aggregation\n * - >= 10 minutes (MINUTELY_LIMIT): Select MINUTELY aggregation\n * - < 10 minutes: Return null (no aggregation appropriate)\n *\n * @param timeRangeInMs - Duration of the time range in milliseconds\n * @returns The most appropriate aggregation type or null if no aggregation is suitable\n *\n * @example\n * ```typescript\n * // Large time range - selects DAILY\n * const dailyResult = service.determineAggregation(5 * 24 * 60 * 60 * 1000); // 5 days\n * // Returns aggregationType.DAILY\n *\n * // Medium time range - selects HOURLY\n * const hourlyResult = service.determineAggregation(2 * 24 * 60 * 60 * 1000); // 2 days\n * // Returns aggregationType.HOURLY\n *\n * // Small time range - selects MINUTELY\n * const minutelyResult = service.determineAggregation(30 * 60 * 1000); // 30 minutes\n * // Returns aggregationType.MINUTELY\n *\n * // Very small time range - no aggregation\n * const nullResult = service.determineAggregation(5 * 60 * 1000); // 5 minutes\n * // Returns null\n * ```\n */\n private determineAggregation(timeRangeInMs: number): aggregationType | null {\n if (timeRangeInMs >= AGGREGATION_LIMITS.DAILY_LIMIT) {\n return aggregationType.DAILY;\n } else if (timeRangeInMs >= AGGREGATION_LIMITS.HOURLY_LIMIT) {\n return aggregationType.HOURLY;\n } else if (timeRangeInMs >= AGGREGATION_LIMITS.MINUTELY_LIMIT) {\n return aggregationType.MINUTELY;\n }\n return null;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { isEqual, isObject, transform } from 'lodash-es';\nimport { DateTimeContextUtil } from '../../utils/date-time-context.util';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GlobalContextUtilsService {\n /**\n * Compares two objects and returns an object containing only the fields that changed.\n * For nested objects, recursively identifies changes at each level.\n * Converts Date objects to ISO strings for comparison and in the result.\n *\n * @param oldObj - The original object to compare\n * @param newObj - The new object to compare against\n * @returns An object containing only the changed fields and their new values\n * @throws Error if inputs are not valid objects\n */\n getChangedFields<T extends object>(oldObj: T, newObj: T): Partial<T> {\n // Validate inputs\n if (!isObject(oldObj) || !isObject(newObj)) {\n throw new Error('Both arguments must be objects');\n }\n\n // Set to track visited objects (to avoid infinite recursion on circular refs)\n const visited = new WeakSet<object>();\n\n const diff = this.findChanges(oldObj, newObj, visited);\n return (diff === undefined ? {} : diff) as Partial<T>;\n }\n\n /**\n * Checks if a value is a Date object\n * @param val - The value to check\n * @returns True if the value is a Date object\n */\n private isDate(val: unknown): val is Date {\n return val instanceof Date && !isNaN(val.getTime());\n }\n\n /**\n * Recursive helper function to find changes between two values\n * @param oldVal - Original value\n * @param newVal - New value to compare against\n * @param visited - Set to track visited objects to avoid circular references\n * @returns The changed value or undefined if no changes\n */\n private findChanges(oldVal: unknown, newVal: unknown, visited: WeakSet<object>): unknown {\n // Handle Date objects - convert to ISO string for comparison\n let oldDateString: string | undefined;\n if (this.isDate(oldVal)) {\n oldDateString = DateTimeContextUtil.normalizeIsoToSeconds(oldVal.toISOString());\n }\n if (this.isDate(newVal)) {\n const isoString = DateTimeContextUtil.normalizeIsoToSeconds(newVal.toISOString());\n // If old value wasn't a date, or if the ISO strings differ, return new ISO string\n if (!oldDateString || oldDateString !== isoString) {\n return isoString;\n }\n return undefined; // Dates are equal, no change\n }\n // Update oldVal if it was converted to string\n if (oldDateString) {\n oldVal = oldDateString;\n }\n\n // Handle ISO string comparisons - normalize to seconds precision\n if (typeof oldVal === 'string' && typeof newVal === 'string') {\n const normalizedOld = DateTimeContextUtil.normalizeIsoToSeconds(oldVal);\n const normalizedNew = DateTimeContextUtil.normalizeIsoToSeconds(newVal);\n\n // If both are valid ISO dates, compare normalized versions\n if (normalizedOld && normalizedNew) {\n if (normalizedOld === normalizedNew) {\n return undefined; // Dates are equal (ignoring milliseconds)\n }\n return normalizedNew; // Return normalized version\n }\n }\n\n // If we've seen this object reference before, break out (circular reference)\n if (isObject(oldVal) && isObject(newVal)) {\n if (visited.has(oldVal as object) || visited.has(newVal as object)) {\n return undefined; // avoid infinite loop, no changes deeper\n }\n visited.add(oldVal as object);\n visited.add(newVal as object);\n }\n\n // If values are deeply equal, no change; return nothing\n if (isEqual(oldVal, newVal)) {\n return undefined;\n }\n\n // If both values are objects, recurse into their properties\n if (isObject(oldVal) && isObject(newVal)) {\n const result = transform(\n newVal,\n (result: Record<string, unknown>, value: unknown, key: string) => {\n const change = this.findChanges(oldVal[key], value, visited);\n if (change !== undefined) {\n // Only include the key if there is a difference\n result[key] = change;\n }\n },\n Array.isArray(newVal) ? [] : {}\n ); // preserve array vs object in result\n\n // If result is empty (no changes found in nested objects), return undefined\n return Object.keys(result).length === 0 ? undefined : result;\n }\n\n // For primitive values (or if types differ), return the new value\n return newVal;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n signal\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { aggregationType } from '@c8y/client';\nimport { I18nModule, IconDirective } from '@c8y/ngx-components';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport {\n AGGREGATION_ICONS,\n AGGREGATION_TEXTS,\n AGGREGATIONS\n} from '../../../models/aggregation.model';\n\n@Component({\n selector: 'c8y-aggregation-picker',\n templateUrl: './aggregation-picker.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AggregationPickerComponent),\n multi: true\n }\n ],\n standalone: true,\n imports: [TooltipModule, BsDropdownModule, I18nModule, IconDirective, FormsModule]\n})\nexport class AggregationPickerComponent implements ControlValueAccessor {\n /**\n * Configuration for disabling specific types of aggregation.\n * By default no aggregation type is disabled.\n *\n * Uses input transform to normalize null/undefined to empty object,\n * preventing template errors when accessing properties.\n */\n readonly disabledAggregations = input(\n {},\n {\n transform: (\n value: Partial<Record<aggregationType, boolean>> | null | undefined\n ): Partial<Record<aggregationType, boolean>> => value ?? {}\n }\n );\n\n /**\n * Whether to reset the aggregation value to default when disabled.\n * Default is false.\n */\n readonly resetToDefault = input(false);\n\n /**\n * Whether to show the aggregation picker options as a radio-group or as a dropdown.\n * Default is dropdown.\n */\n readonly layout = input<'radio' | 'dropdown'>('dropdown');\n\n private readonly _disabled = signal(false);\n readonly disabled = computed(() => this._disabled());\n\n readonly AGGREGATIONS = AGGREGATIONS;\n readonly AGGREGATION_ICONS = AGGREGATION_ICONS;\n readonly AGGREGATION_TEXTS = AGGREGATION_TEXTS;\n\n private readonly _value = signal<aggregationType | null>(null);\n readonly value = computed(() => this._value());\n private readonly _touched = signal(false);\n readonly touched = computed(() => this._touched());\n\n // Computed helpers for cleaner templates\n readonly currentText = computed(() => {\n const value = this._value();\n return value ? this.AGGREGATION_TEXTS[value] : this.AGGREGATION_TEXTS.undefined;\n });\n\n readonly currentIcon = computed(() => {\n const value = this._value();\n return value ? this.AGGREGATION_ICONS[value] : this.AGGREGATION_ICONS.undefined;\n });\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onChange = _ => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onTouched = () => {};\n\n writeValue(value: aggregationType | null): void {\n if (this._value() === value) {\n return;\n }\n\n this._value.set(value);\n }\n\n registerOnChange(fn: (value: aggregationType | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(onTouched: () => void): void {\n this.onTouched = onTouched;\n }\n\n markAsTouched() {\n if (!this._touched()) {\n this.onTouched();\n this._touched.set(true);\n }\n }\n\n setDisabledState(disabled: boolean) {\n this._disabled.set(disabled);\n\n if (disabled && this.resetToDefault()) {\n this.resetValue();\n }\n }\n\n selectAggregation(aggregation: aggregationType | null): void {\n // Early return if value hasn't changed (no-op)\n if (aggregation === this._value()) {\n return;\n }\n\n this.markAsTouched();\n this._value.set(aggregation);\n this.onChange(aggregation);\n }\n\n private resetValue() {\n if (this._value() !== null) {\n this._value.set(null);\n this.onChange(null);\n }\n }\n}\n","@if (layout() === 'dropdown') {\n <div\n class=\"dropdown\"\n style=\"border: 0; margin-left: -1px\"\n container=\"body\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [attr.data-cy]=\"'global-context--aggregation-picker'\"\n [insideClick]=\"true\"\n [isDisabled]=\"disabled()\"\n >\n <button\n class=\"dropdown-toggle form-control p-t-0 p-b-0 l-h-1 d-flex a-i-center\"\n [attr.aria-label]=\"currentText() | translate\"\n tooltip=\"{{ (disabled() ? AGGREGATION_TEXTS.disabled : currentText()) | translate }}\"\n placement=\"top\"\n container=\"body\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"dropdown.isOpen\"\n type=\"button\"\n [attr.data-cy]=\"'global-context--aggregation-picker-' + value()\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"currentIcon()\"\n ></i>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu-right--xs\"\n role=\"listbox\"\n *dropdownMenu\n >\n @for (aggregation of AGGREGATIONS; track aggregation.id || $index) {\n @let isDisabled = aggregation.id ? disabledAggregations()[aggregation.id] : false;\n <li\n [class.active]=\"aggregation.id === value()\"\n [class.disabled]=\"isDisabled\"\n >\n <button\n class=\"\"\n [attr.aria-selected]=\"aggregation.id === value()\"\n role=\"option\"\n (click)=\"selectAggregation(aggregation.id); dropdown.isOpen = false\"\n [disabled]=\"isDisabled\"\n [attr.data-cy]=\"'global-context--aggregation-picker-input-' + aggregation.id\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n aggregation.id ? AGGREGATION_ICONS[aggregation.id] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <span>{{ aggregation.title | translate }}</span>\n </button>\n </li>\n }\n </ul>\n </div>\n}\n\n@if (layout() === 'radio') {\n <div\n class=\"radio-group d-flex-md a-i-center gap-16\"\n [attr.aria-label]=\"'Aggregation options' | translate\"\n role=\"radiogroup\"\n >\n @for (aggregation of AGGREGATIONS; track aggregation.id || $index) {\n @let isDisabled = aggregation.id ? disabledAggregations()[aggregation.id] : false;\n <label\n class=\"c8y-radio\"\n [attr.data-cy]=\"'global-context--aggregation-picker-input-' + aggregation.id\"\n >\n <input\n name=\"aggregation\"\n role=\"radio\"\n type=\"radio\"\n [value]=\"aggregation.id\"\n [checked]=\"aggregation.id === value()\"\n [disabled]=\"isDisabled\"\n (change)=\"selectAggregation(aggregation.id)\"\n />\n <span></span>\n <i\n class=\"icon-16 m-l-4\"\n [c8yIcon]=\"\n aggregation.id ? AGGREGATION_ICONS[aggregation.id] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <span>{{ aggregation.title | translate }}</span>\n </label>\n }\n </div>\n}\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n Input,\n output,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AbstractControl,\n FormBuilder,\n FormsModule,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn\n} from '@angular/forms';\nimport { aggregationType } from '@c8y/client';\nimport {\n C8yTranslatePipe,\n DateTimePickerModule,\n FormGroupComponent,\n I18nModule,\n IconDirective,\n MessageDirective,\n MessagesComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { isEqual } from 'lodash-es';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { debounceTime } from 'rxjs';\nimport { AGGREGATION_TEXTS } from '../../../models/aggregation.model';\nimport { TIME_DURATION } from '../../../models/constants';\nimport type { DateTimeContext } from '../../../models/date-time-context-picker.model';\nimport type {\n GlobalContextSettings,\n GlobalContextState\n} from '../../../models/global-context.model';\nimport { TIME_INTERVAL } from '../../../models/interval-picker.model';\nimport { AggregationPickerService } from '../../../services/domain/aggregation-picker.service';\nimport { DateTimeContextUtil } from '../../../utils/date-time-context.util';\nimport { AggregationPickerComponent } from '../../aggregation/aggregation-picker';\n\n/**\n * Component for configuring history mode settings\n * Stateless component that emits changes immediately\n */\n@Component({\n selector: 'c8y-history-mode-configuration-controls',\n templateUrl: './history-mode-configuration-controls.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n C8yTranslatePipe,\n I18nModule,\n TooltipModule,\n ReactiveFormsModule,\n IconDirective,\n FormsModule,\n PopoverModule,\n FormGroupComponent,\n AggregationPickerComponent,\n MessagesComponent,\n MessageDirective,\n DateTimePickerModule,\n NgClass\n ]\n})\nexport class HistoryModeConfigurationControlsComponent {\n readonly AGGREGATION_TEXTS = AGGREGATION_TEXTS;\n readonly DATE_FORMAT = 'medium';\n\n readonly errorMessages = {\n dateAfterRangeMax: gettext('This date is after the latest allowed date.'),\n dateBeforeRangeMin: gettext('This date is before the earliest allowed date.'),\n invalidDateTime: gettext('This date is invalid.'),\n invalidDateRange: gettext('Start date must be before end date.')\n } as const;\n\n // Popover messages for translation extraction\n readonly TIME_RANGE_PICKER_POPOVER = gettext(\n 'Specify the exact start and end date/time of the time period to analyse. This provides a static view of historical data within the selected timeframe.'\n );\n readonly AGGREGATION_POPOVER = gettext(\n \"Groups data points into larger time intervals to simplify visualization and improve performance. 'None' shows raw data, while other options combine data points into minute, hour, or day groupings.\"\n );\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly formBuilder = inject(FormBuilder);\n private readonly aggregationPickerService = inject(AggregationPickerService);\n\n private readonly settingsSignal = signal<Partial<GlobalContextSettings>>({\n showAutoRefresh: true,\n showTimeContext: true,\n showAggregation: true\n });\n private readonly contextState = signal<GlobalContextState | null>(null);\n\n @Input()\n set settings(value: Partial<GlobalContextSettings> | null) {\n this.settingsSignal.set({\n showAutoRefresh: true,\n showTimeContext: true,\n showAggregation: true,\n ...(value ?? {})\n });\n }\n get settings(): Partial<GlobalContextSettings> {\n return this.settingsSignal();\n }\n\n @Input()\n set context(value: GlobalContextState | null) {\n const cloned = value ? structuredClone(value) : null;\n\n // Only update if context actually changed to avoid unnecessary form patches\n const prev = this.contextState();\n const isDifferent = !isEqual(prev, cloned);\n\n if (isDifferent) {\n this.contextState.set(cloned);\n this.patchFormFromContext(cloned);\n }\n }\n\n readonly contextChange = output<Partial<GlobalContextState>>();\n readonly validationStatus = output<boolean>();\n\n currentForm: ReturnType<typeof this.createForm>;\n readonly disabledAggregations = signal<Partial<Record<aggregationType, boolean>>>({});\n readonly dateFromErrors = signal<Record<string, any> | null>(null);\n readonly dateToErrors = signal<Record<string, any> | null>(null);\n\n constructor() {\n this.currentForm = this.createForm();\n\n this.currentForm.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(100))\n .subscribe(formValue => {\n this.handleFormValueChange(formValue as Partial<GlobalContextState>);\n });\n\n this.currentForm.statusChanges\n .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(100))\n .subscribe(() => {\n this.updateErrorSignals();\n this.validationStatus.emit(this.currentForm.valid);\n });\n\n this.updateErrorSignals();\n this.validationStatus.emit(this.currentForm.valid);\n }\n\n private updateErrorSignals(): void {\n const dateTimeContext = this.currentForm?.get('dateTimeContext');\n const dateFromControl = dateTimeContext?.get('dateFrom');\n const dateToControl = dateTimeContext?.get('dateTo');\n\n const dateFromControlErrors = dateFromControl?.errors || {};\n const groupErrors = dateTimeContext?.errors || {};\n\n if (Object.keys(dateFromControlErrors).length > 0) {\n this.dateFromErrors.set(dateFromControlErrors);\n } else if (Object.keys(groupErrors).length > 0) {\n this.dateFromErrors.set(groupErrors);\n } else {\n this.dateFromErrors.set(null);\n }\n\n const dateToControlErrors = dateToControl?.errors || {};\n this.dateToErrors.set(Object.keys(dateToControlErrors).length > 0 ? dateToControlErrors : null);\n }\n\n private handleFormValueChange(formValue: Partial<GlobalContextState>): void {\n const { dateTimeContext, aggregation } = formValue;\n\n if (!dateTimeContext) {\n return;\n }\n\n // Normalize seconds and milliseconds BEFORE validation to prevent precision issues\n const normalizedFrom = new Date(dateTimeContext.dateFrom);\n normalizedFrom.setSeconds(0, 0);\n const normalizedTo = new Date(dateTimeContext.dateTo);\n normalizedTo.setSeconds(0, 0);\n\n dateTimeContext.dateFrom = normalizedFrom.toISOString();\n dateTimeContext.dateTo = normalizedTo.toISOString();\n\n // Calculate disabled aggregations regardless of validation\n // This allows us to disable aggregations even for edge cases like dateFrom === dateTo\n dateTimeContext.interval = TIME_INTERVAL.CUSTOM;\n\n const { selectedAggregation, disabledAggregations } =\n this.aggregationPickerService.calculateAggregation(\n [new Date(dateTimeContext.dateFrom), new Date(dateTimeContext.dateTo)],\n aggregation ?? null\n );\n this.disabledAggregations.set(disabledAggregations);\n\n // Skip emission if validation fails (e.g., dateFrom > dateTo), but still update UI\n if (!this.isValidDateTimeContext(dateTimeContext)) {\n return;\n }\n\n if (selectedAggregation !== undefined) {\n this.currentForm.patchValue({ aggregation: selectedAggregation }, { emitEvent: false });\n }\n\n const emission = structuredClone(this.currentForm.value) as GlobalContextState;\n this.contextChange.emit(emission);\n }\n\n private isValidDateTimeContext(dateTimeContext: DateTimeContext | null): boolean {\n if (!dateTimeContext) {\n return false;\n }\n\n const normalizedFrom = new Date(dateTimeContext.dateFrom);\n normalizedFrom.setSeconds(0, 0);\n const normalizedTo = new Date(dateTimeContext.dateTo);\n normalizedTo.setSeconds(0, 0);\n\n return DateTimeContextUtil.isValidRange(normalizedFrom, normalizedTo);\n }\n\n private patchFormFromContext(context?: GlobalContextState | null): void {\n if (!this.currentForm) {\n return;\n }\n\n const ctx = context ?? this.contextState();\n\n if (!ctx) {\n const defaults = this.getDefaultDateRange();\n this.currentForm.patchValue(\n {\n dateTimeContext: {\n interval: TIME_INTERVAL.CUSTOM,\n dateFrom: defaults.dateFrom,\n dateTo: defaults.dateTo\n },\n aggregation: null\n },\n { emitEvent: false }\n );\n this.disabledAggregations.set({});\n this.validationStatus.emit(this.currentForm.valid);\n return;\n }\n\n let clonedContext: DateTimeContext | null = null;\n if (ctx.dateTimeContext) {\n clonedContext = structuredClone(ctx.dateTimeContext);\n } else {\n const defaults = this.getDefaultDateRange();\n clonedContext = {\n interval: TIME_INTERVAL.CUSTOM,\n dateFrom: defaults.dateFrom,\n dateTo: defaults.dateTo\n };\n }\n\n clonedContext.interval = TIME_INTERVAL.CUSTOM;\n\n const normalizedFrom = new Date(clonedContext.dateFrom);\n normalizedFrom.setSeconds(0, 0);\n const normalizedTo = new Date(clonedContext.dateTo);\n normalizedTo.setSeconds(0, 0);\n\n clonedContext.dateFrom = normalizedFrom.toISOString();\n clonedContext.dateTo = normalizedTo.toISOString();\n\n this.currentForm.patchValue(\n {\n dateTimeContext: clonedContext,\n aggregation: ctx.aggregation ?? null\n },\n { emitEvent: false }\n );\n\n // Update disabled aggregations but DON'T override the value\n const { disabledAggregations } = this.aggregationPickerService.calculateAggregation(\n [new Date(clonedContext.dateFrom), new Date(clonedContext.dateTo)],\n ctx.aggregation ?? null\n );\n this.disabledAggregations.set(disabledAggregations);\n this.validationStatus.emit(this.currentForm.valid);\n }\n\n private createForm() {\n const defaultDates = this.getDefaultDateRange();\n\n const dateTimeContext = this.formBuilder.group<DateTimeContext>(\n {\n interval: TIME_INTERVAL.CUSTOM,\n dateFrom: defaultDates.dateFrom,\n dateTo: defaultDates.dateTo\n },\n {\n validators: [this.createDateRangeValidator()]\n }\n );\n\n return this.formBuilder.group({\n dateTimeContext,\n aggregation: this.formBuilder.control<aggregationType | null>(null)\n });\n }\n\n private getDefaultDateRange(): { dateFrom: string; dateTo: string } {\n const now = new Date();\n now.setSeconds(0, 0);\n const oneHourAgo = new Date(now.getTime() - TIME_DURATION.ONE_HOUR_MS);\n oneHourAgo.setSeconds(0, 0);\n\n return {\n dateFrom: oneHourAgo.toISOString(),\n dateTo: now.toISOString()\n };\n }\n\n private createDateRangeValidator(): ValidatorFn {\n return (group: AbstractControl): ValidationErrors | null => {\n const dateFrom = group.get('dateFrom')?.value;\n const dateTo = group.get('dateTo')?.value;\n\n if (!dateFrom || !dateTo) {\n return null;\n }\n\n const normalizedFrom = new Date(dateFrom);\n normalizedFrom.setSeconds(0, 0);\n const normalizedTo = new Date(dateTo);\n normalizedTo.setSeconds(0, 0);\n\n if (!DateTimeContextUtil.isValidRange(normalizedFrom, normalizedTo)) {\n return { invalidDateRange: true };\n }\n\n return null;\n };\n }\n}\n","@if (currentForm) {\n @let SHOW_TIME_CONTEXT = settings.showTimeContext;\n @let SHOW_AGGREGATION = settings.showAggregation;\n\n <form [formGroup]=\"currentForm\">\n <div class=\"content-flex-100\">\n <div\n class=\"col-4\"\n [ngClass]=\"{ 'm-b-8': !SHOW_AGGREGATION }\"\n >\n @if (SHOW_TIME_CONTEXT) {\n @let dateTimeContext = currentForm.get('dateTimeContext');\n @let tempDateFromValue = dateTimeContext.get('dateFrom')?.value;\n @let tempDateToValue = dateTimeContext.get('dateTo')?.value;\n @let fromErrors = dateFromErrors();\n @let toErrors = dateToErrors();\n\n <fieldset class=\"c8y-fieldset\">\n <legend>\n <div class=\"standalone btn-icon-dot__item time-context m-r-4\">\n <i\n class=\"\"\n [c8yIcon]=\"'calendar'\"\n ></i>\n </div>\n {{ 'Date & time range' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"TIME_RANGE_PICKER_POPOVER | translate\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"content-flex-58 d-flex a-i-center m-b-0 p-t-16\">\n <c8y-form-group\n [class.has-error]=\"fromErrors\"\n class=\"form-group-sm d-flex a-i-center col-6 flex-wrap\"\n >\n <label\n class=\"m-b-sm-0 m-r-8 text-nowrap\"\n style=\"min-width: 30px\"\n [title]=\"'From`date`' | translate\"\n for=\"dateFrom\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n [class.has-error]=\"fromErrors\"\n id=\"dateFrom\"\n [maxDate]=\"tempDateToValue\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"dateTimeContext.get('dateFrom')\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"fromErrors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"errorMessages.dateAfterRangeMax | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"errorMessages.invalidDateTime | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateRange\"\n [text]=\"errorMessages.invalidDateRange | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [class.has-error]=\"toErrors\"\n class=\"form-group-sm d-flex flex-wrap col-6 a-i-center\"\n >\n <label\n class=\"m-b-sm-0 text-nowrap m-r-8\"\n style=\"min-width: 30px\"\n [title]=\"'To`date`' | translate\"\n for=\"dateTo\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n [class.has-error]=\"toErrors\"\n id=\"dateTo\"\n [minDate]=\"tempDateFromValue\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"dateTimeContext.get('dateTo')\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"toErrors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"errorMessages.dateBeforeRangeMin | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"errorMessages.invalidDateTime | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </c8y-form-group>\n </fieldset>\n }\n </div>\n <div class=\"col-\">\n @if (SHOW_AGGREGATION) {\n @let selectedAggregation = currentForm.get('aggregation')?.value;\n\n <fieldset class=\"c8y-fieldset\">\n <legend>\n <div class=\"standalone btn-icon-dot__item aggregation m-r-4\">\n <i [c8yIcon]=\"'input'\"></i>\n </div>\n {{ 'Aggregation' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"AGGREGATION_POPOVER | translate\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"p-t-16 p-b-16 m-b-4\">\n <c8y-aggregation-picker\n formControlName=\"aggregation\"\n [resetToDefault]=\"true\"\n [disabledAggregations]=\"disabledAggregations()\"\n [layout]=\"'radio'\"\n ></c8y-aggregation-picker>\n </c8y-form-group>\n </fieldset>\n }\n </div>\n </div>\n </form>\n}\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, forwardRef, Input } from '@angular/core';\nimport {\n ControlValueAccessor,\n FormsModule,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule\n} from '@angular/forms';\nimport { C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport type { Interval } from '../../../models/interval-picker.model';\nimport { INTERVALS } from '../../../models/interval-picker.model';\n\n@Component({\n selector: 'c8y-interval-picker',\n templateUrl: './interval-picker.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => IntervalPickerComponent),\n multi: true\n }\n ],\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n A11yModule,\n ReactiveFormsModule,\n BsDropdownModule,\n IconDirective,\n PopoverModule,\n C8yTranslatePipe\n ]\n})\nexport class IntervalPickerComponent implements ControlValueAccessor {\n @Input() INTERVALS: Interval[] = [...INTERVALS];\n @Input() shouldDisableInterval = { isDisabled: false, msg: null };\n\n value: Interval['id'];\n touched = false;\n disabled = false;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onChange = _ => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onTouched = () => {};\n\n writeValue(value: Interval['id']) {\n this.value = value;\n }\n\n registerOnChange(fn: (value: Interval['id']) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(onTouched: () => void): void {\n this.onTouched = onTouched;\n }\n\n markAsTouched() {\n if (!this.touched) {\n this.onTouched();\n this.touched = true;\n }\n }\n\n onIntervalSelect(intervalId: Interval['id']) {\n this.markAsTouched();\n this.value = intervalId;\n this.onChange(intervalId);\n }\n\n setDisabledState(disabled: boolean) {\n this.disabled = disabled;\n }\n}\n","@for (interval of INTERVALS; track interval.id) {\n @let isSelected = interval.id === value;\n @let checkVisibility = isSelected ? 'visible' : 'hidden';\n @let isIntervalDisabled = shouldDisableInterval?.isDisabled;\n @let isIntervalDisabledMsg = shouldDisableInterval?.msg;\n @let isCustom = interval.id === 'custom';\n\n <li [class.active]=\"isSelected\">\n <div\n [ngStyle]=\"{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center'\n }\"\n >\n <button\n class=\"mr-2\"\n type=\"button\"\n [attr.data-cy]=\"'global-context--interval-' + interval.id\"\n (click)=\"onIntervalSelect(interval.id)\"\n [disabled]=\"isCustom && isIntervalDisabled\"\n >\n <span [class.text-primary]=\"isSelected\">\n <span\n [c8yIcon]=\"'check'\"\n [style.visibility]=\"checkVisibility\"\n ></span>\n {{ interval.title | translate }}\n </span>\n </button>\n </div>\n </li>\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n Input,\n OnInit,\n ViewChild,\n computed,\n forwardRef,\n inject,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n ControlValueAccessor,\n FormBuilder,\n FormControl,\n FormGroup,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule\n} from '@angular/forms';\nimport {\n DatePipe,\n DateTimePickerModule,\n FormGroupComponent,\n I18nModule,\n IconDirective,\n MessageDirective,\n MessagesComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { BsDropdownDirective, BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { distinctUntilChanged } from 'rxjs';\nimport {\n DateTimeContext,\n DateTimeContextPickerConfig\n} from '../../../models/date-time-context-picker.model';\nimport {\n INTERVAL_TITLES,\n TIME_INTERVAL,\n TimeInterval\n} from '../../../models/interval-picker.model';\nimport { DateTimeContextPickerService } from '../../../services/domain/date-time-context-picker.service';\nimport { DateTimeContextUtil } from '../../../utils/date-time-context.util';\nimport { IntervalPickerComponent } from '../interval-picker';\n\n@Component({\n selector: 'c8y-date-time-context-picker',\n templateUrl: './date-time-context-picker.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ReactiveFormsModule,\n TooltipModule,\n BsDropdownModule,\n I18nModule,\n IconDirective,\n DatePipe,\n MessagesComponent,\n MessageDirective,\n FormGroupComponent,\n IntervalPickerComponent,\n DateTimePickerModule\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DateTimeContextPickerComponent),\n multi: true\n }\n ]\n})\nexport class DateTimeContextPickerComponent implements OnInit, ControlValueAccessor {\n @Input() disabled = false;\n @Input() shouldDisableInterval: Record<string, boolean> = {};\n @Input() config: DateTimeContextPickerConfig = {\n showDateFrom: true,\n showDateTo: true\n };\n\n @ViewChild(BsDropdownDirective) dropdown?: BsDropdownDirective;\n\n private readonly service = inject(DateTimeContextPickerService);\n private readonly formBuilder = inject(FormBuilder);\n private readonly destroyRef = inject(DestroyRef);\n private readonly datePipe = inject(DatePipe);\n private readonly cdr = inject(ChangeDetectorRef);\n\n readonly INTERVALS = INTERVAL_TITLES;\n readonly DATE_FORMAT = 'medium';\n readonly TIME_INTERVAL = TIME_INTERVAL;\n\n readonly errorMessages = {\n dateAfterRangeMax: gettext('This date is after the latest allowed date.'),\n dateBeforeRangeMin: gettext('This date is before the earliest allowed date.'),\n invalidDateTime: gettext('This date is invalid.'),\n invalidDateRange: gettext('Start date must be before end date.')\n } as const;\n\n form!: FormGroup;\n tempDateFromControl!: FormControl;\n tempDateToControl!: FormControl;\n\n private readonly customSnapshot = signal<DateTimeContext | null>(null);\n private readonly isRestoring = signal(false);\n private readonly canEmit = signal(true);\n private readonly currentInterval = signal<TimeInterval | null>(null);\n private onChangeCallback?: (value: Partial<DateTimeContext>) => void;\n private onTouchedCallback?: () => void;\n\n readonly isCustomMode = computed(() => this.currentInterval() === TIME_INTERVAL.CUSTOM);\n readonly isEditing = computed(() => this.dropdown?.isOpen && this.isCustomMode());\n\n ngOnInit(): void {\n this.form = this.formBuilder.group<DateTimeContext>({\n interval: null,\n dateFrom: null,\n dateTo: null\n });\n this.tempDateFromControl = new FormControl(null);\n this.tempDateToControl = new FormControl(null);\n\n this.setupIntervalChangeHandler();\n }\n\n writeValue(value: DateTimeContext): void {\n // Prevent updates when dropdown is open and custom mode is active\n if (this.dropdown?.isOpen && this.isCustomMode()) return;\n\n if (value && this.form) {\n const normalized = this.normalizeContext(value);\n this.form.patchValue(normalized, { emitEvent: false });\n this.currentInterval.set(normalized.interval);\n\n if (normalized.interval === TIME_INTERVAL.CUSTOM) {\n this.canEmit.set(false);\n this.customSnapshot.set({ ...this.form.value });\n this.syncTempControls();\n } else {\n this.canEmit.set(true);\n this.customSnapshot.set(null);\n }\n this.cdr.markForCheck();\n }\n }\n\n registerOnChange(fn: (value: DateTimeContext) => void): void {\n this.onChangeCallback = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedCallback = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n isDisabled ? this.form.disable({ emitEvent: false }) : this.form.enable({ emitEvent: false });\n }\n\n onShownDropdown(): void {\n if (this.isCustomMode()) {\n this.syncTempControls();\n this.customSnapshot.set({ ...this.form.value });\n }\n }\n\n onHiddenDropdown(): void {\n const snapshot = this.customSnapshot();\n if (snapshot && this.isCustomMode()) {\n this.isRestoring.set(true);\n this.form.patchValue(snapshot, { emitEvent: true });\n this.currentInterval.set(snapshot.interval);\n this.isRestoring.set(false);\n this.customSnapshot.set(null);\n }\n\n this.canEmit.set(!this.isCustomMode());\n this.onTouchedCallback?.();\n }\n\n getDateRangeLabel(): string {\n const dateFrom = this.isEditing()\n ? this.tempDateFromControl?.value\n : this.form.get('dateFrom')?.value;\n const dateTo = this.isEditing()\n ? this.tempDateToControl?.value\n : this.form.get('dateTo')?.value;\n\n if (!dateFrom || !dateTo) return '';\n return `${this.datePipe.transform(dateFrom, this.DATE_FORMAT)} — ${this.datePipe.transform(dateTo, this.DATE_FORMAT)}`;\n }\n\n isApplyDisabled(): boolean {\n if (!this.isCustomMode()) return this.form.invalid;\n\n const tempFrom = this.tempDateFromControl?.value;\n const tempTo = this.tempDateToControl?.value;\n\n if (this.config?.showDateFrom && !tempFrom) return true;\n if (this.config?.showDateTo && !tempTo) return true;\n\n if (tempFrom && tempTo) {\n const fromTime = this.normalizeTimestamp(tempFrom);\n const toTime = this.normalizeTimestamp(tempTo);\n if (fromTime >= toTime) return true;\n }\n\n const formFrom = this.form.get('dateFrom')?.value;\n const formTo = this.form.get('dateTo')?.value;\n const hasChanged =\n (this.config?.showDateFrom && tempFrom !== formFrom) ||\n (this.config?.showDateTo && tempTo !== formTo);\n\n return !hasChanged;\n }\n\n getDateFromErrors() {\n if (!this.tempDateFromControl?.touched) return null;\n const errors = this.tempDateFromControl?.errors || {};\n\n if (\n !this.config?.showDateTo &&\n this.tempDateFromControl?.value &&\n this.tempDateToControl?.value\n ) {\n const fromTime = this.normalizeTimestamp(this.tempDateFromControl.value);\n const toTime = this.normalizeTimestamp(this.tempDateToControl.value);\n if (fromTime >= toTime) {\n const {\n dateAfterRangeMax: _dateAfterRangeMax,\n dateBeforeRangeMin: _dateBeforeRangeMin,\n ...rest\n } = errors;\n return { ...rest, invalidDateRange: true };\n }\n }\n\n return Object.keys(errors).length > 0 ? errors : null;\n }\n\n getDateToErrors() {\n if (!this.config?.showDateTo) return null;\n if (!this.tempDateToControl?.touched && !this.tempDateFromControl?.touched) return null;\n\n const errors = this.tempDateToControl?.errors || {};\n const fromVal = this.tempDateFromControl?.value;\n const toVal = this.tempDateToControl?.value;\n\n if (fromVal && toVal) {\n const fromTime = this.normalizeTimestamp(fromVal);\n const toTime = this.normalizeTimestamp(toVal);\n if (fromTime >= toTime) {\n const {\n dateAfterRangeMax: _dateAfterRangeMax,\n dateBeforeRangeMin: _dateBeforeRangeMin,\n ...rest\n } = errors;\n return { ...rest, invalidDateRange: true };\n }\n }\n\n return Object.keys(errors).length > 0 ? errors : null;\n }\n\n protected applyDateTimeContext(intervalVal: TimeInterval = TIME_INTERVAL.CUSTOM): void {\n if (intervalVal === null) return;\n\n if (intervalVal === TIME_INTERVAL.CUSTOM) {\n this.applyCustomDates();\n } else if (intervalVal === 'none') {\n this.updateDates([new Date(0), new Date()], intervalVal);\n } else {\n const dates = this.service.getDateTimeContextByInterval(intervalVal);\n this.updateDates(dates, intervalVal);\n }\n\n this.closeDropdown();\n this.onTouchedCallback?.();\n }\n\n protected reset(): void {\n const dates = this.service.getDateTimeContextByInterval(TIME_INTERVAL.DAYS);\n this.updateDates(dates, TIME_INTERVAL.DAYS);\n this.closeDropdown();\n }\n\n private setupIntervalChangeHandler(): void {\n this.form.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(value => {\n if (this.canEmit() && !this.isRestoring() && this.onChangeCallback) {\n this.onChangeCallback({ ...value });\n }\n });\n\n this.form\n .get('interval')\n ?.valueChanges.pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe(interval => {\n this.currentInterval.set(interval);\n if (this.isRestoring()) return;\n\n if (interval === TIME_INTERVAL.CUSTOM) {\n this.canEmit.set(false);\n this.customSnapshot.set({ ...this.form.value });\n this.syncTempControls();\n } else {\n this.canEmit.set(true);\n this.customSnapshot.set(null);\n this.applyDateTimeContext(interval);\n }\n });\n }\n\n private applyCustomDates(): void {\n const normalizeDate = (dateStr: string): string => {\n const date = new Date(dateStr);\n date.setSeconds(0, 0);\n return date.toISOString();\n };\n\n const dateFrom = this.tempDateFromControl.value\n ? normalizeDate(this.tempDateFromControl.value)\n : null;\n const dateTo = this.tempDateToControl.value\n ? normalizeDate(this.tempDateToControl.value)\n : null;\n\n const ensured = DateTimeContextUtil.ensureIsoContext({\n interval: TIME_INTERVAL.CUSTOM,\n dateFrom,\n dateTo\n });\n\n const next: DateTimeContext = {\n interval: ensured.interval ?? TIME_INTERVAL.CUSTOM,\n dateFrom: ensured.dateFrom,\n dateTo: ensured.dateTo\n };\n\n this.canEmit.set(true);\n this.customSnapshot.set(null);\n\n this.form.patchValue(next, { emitEvent: false });\n if (this.onChangeCallback) {\n this.onChangeCallback({ ...next });\n }\n }\n\n private updateDates(dates: [Date, Date], interval: TimeInterval): void {\n const [dateFrom, dateTo] = dates.map(date => DateTimeContextUtil.toIso(date));\n this.form.patchValue({ dateFrom, dateTo, interval });\n }\n\n private syncTempControls(): void {\n const dateFrom = this.form.get('dateFrom')?.value;\n const dateTo = this.form.get('dateTo')?.value;\n this.tempDateFromControl.setValue(dateFrom, { emitEvent: false });\n this.tempDateToControl.setValue(dateTo, { emitEvent: false });\n }\n\n private normalizeContext(value: DateTimeContext): DateTimeContext {\n const normalized = { ...value };\n if (normalized?.dateFrom instanceof Date) {\n normalized.dateFrom = normalized.dateFrom.toISOString();\n }\n if (normalized?.dateTo instanceof Date) {\n normalized.dateTo = normalized.dateTo.toISOString();\n }\n return normalized;\n }\n\n private normalizeTimestamp(dateStr: string): number {\n const date = new Date(dateStr);\n date.setSeconds(0, 0);\n return date.getTime();\n }\n\n private closeDropdown(): void {\n if (this.dropdown?.isOpen) {\n this.dropdown.hide();\n }\n }\n}\n","@if (form) {\n @let intervalValue = form.get('interval')?.value;\n @let isIntervalNone = intervalValue === 'none';\n @let dateFromControl = form.get('dateFrom');\n @let dateToControl = form.get('dateTo');\n @let dateRangeLabel = getDateRangeLabel();\n\n <form [formGroup]=\"form\">\n <div\n class=\"dropdown max-width-100\"\n container=\"body\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n [isDisabled]=\"disabled\"\n (onShown)=\"onShownDropdown()\"\n (onHidden)=\"onHiddenDropdown()\"\n >\n <!-- Dropdown toggle button with better accessibility -->\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n [attr.aria-label]=\"dateRangeLabel\"\n [tooltip]=\"dateRangeLabel\"\n placement=\"top\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n data-cy=\"c8y-date-time-context-picker--picker-toggle\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'schedule1'\"\n aria-hidden=\"true\"\n ></i>\n <div class=\"d-col text-left flex-grow min-width-0\">\n @if (isIntervalNone) {\n <span class=\"text-10 text-muted l-h-1\">\n {{ 'No date filter' | translate }}\n </span>\n } @else {\n <span\n class=\"text-10 text-muted l-h-1\"\n data-cy=\"c8y-date-time-context-picker--picker-label\"\n >\n {{ INTERVALS[intervalValue] | translate }}\n </span>\n <span\n class=\"text-12 l-h-1 text-medium text-truncate\"\n data-cy=\"c8y-date-time-context-picker--picker-time-range\"\n >\n {{ form.get('dateFrom')?.value | c8yDate: DATE_FORMAT }} —\n {{ form.get('dateTo')?.value | c8yDate: DATE_FORMAT }}\n </span>\n }\n </div>\n <span\n class=\"caret m-r-16 m-l-4\"\n aria-hidden=\"true\"\n ></span>\n </button>\n\n <!-- Dropdown menu -->\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n role=\"menu\"\n *dropdownMenu\n >\n @if (dropdown.isOpen) {\n <!-- Interval picker section -->\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"interval\"\n [shouldDisableInterval]=\"shouldDisableInterval\"\n ></c8y-interval-picker>\n\n <!-- Custom date range section -->\n @if (isCustomMode() && (config?.showDateFrom || config?.showDateTo)) {\n <div class=\"p-l-16 p-r-16\">\n @if (config?.showDateFrom) {\n <c8y-form-group [class.has-error]=\"getDateFromErrors()\">\n <label\n [title]=\"'From`date`' | translate\"\n for=\"dateFrom\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n [class.has-error]=\"getDateFromErrors()\"\n id=\"dateFrom\"\n [maxDate]=\"tempDateToControl?.value\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"tempDateFromControl\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"getDateFromErrors()\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"errorMessages.dateAfterRangeMax | translate\"\n ></c8y-message>\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"errorMessages.dateBeforeRangeMin | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"errorMessages.invalidDateTime | translate\"\n ></c8y-message>\n <c8y-message\n name=\"bsDate\"\n [text]=\"errorMessages.invalidDateTime | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateRange\"\n [text]=\"errorMessages.invalidDateRange | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n }\n\n @if (config?.showDateTo) {\n <c8y-form-group [class.has-error]=\"getDateToErrors()\">\n <label\n [title]=\"'To`date`' | translate\"\n for=\"dateTo\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n [class.has-error]=\"getDateToErrors()\"\n id=\"dateTo\"\n [minDate]=\"tempDateFromControl?.value\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"tempDateToControl\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"getDateToErrors()\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"errorMessages.dateAfterRangeMax | translate\"\n ></c8y-message>\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"errorMessages.dateBeforeRangeMin | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"errorMessages.invalidDateTime | translate\"\n ></c8y-message>\n <c8y-message\n name=\"bsDate\"\n [text]=\"errorMessages.invalidDateTime | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateRange\"\n [text]=\"errorMessages.invalidDateRange | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n }\n </div>\n\n <!-- Action buttons -->\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset()\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDateTimeContext()\"\n [disabled]=\"isApplyDisabled()\"\n translate\n >\n Apply\n </button>\n </div>\n }\n }\n </ul>\n </div>\n </form>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Input,\n inject,\n output,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { C8yTranslatePipe, FormGroupComponent, IconDirective } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { debounceTime } from 'rxjs';\nimport { REFRESH_OPTION } from '../../../models/auto-refresh.model';\nimport type { DateTimeContext } from '../../../models/date-time-context-picker.model';\nimport { GLOBAL_CONTEXT_DEFAULTS } from '../../../models';\nimport type {\n GlobalContextSettings,\n GlobalContextState\n} from '../../../models/global-context.model';\nimport { fillMissingDefaults } from '../../../utils/global-context-defaults.util';\nimport { DateTimeContextPickerComponent } from '../../time-context/time-range-picker/date-time-context-picker.component';\n\n/**\n * Component for configuring live mode settings\n * Stateless component that emits changes immediately\n */\n@Component({\n selector: 'c8y-live-mode-configuration-controls',\n templateUrl: './live-mode-configuration-controls.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n C8yTranslatePipe,\n TooltipModule,\n ReactiveFormsModule,\n DateTimeContextPickerComponent,\n IconDirective,\n FormsModule,\n PopoverModule,\n FormGroupComponent\n ]\n})\nexport class LiveModeConfigurationControlsComponent {\n // Popover messages for translation extraction\n readonly REFRESH_POPOVER_MESSAGE = gettext(\n 'The update method is determined by the widget type. Some widgets support real-time updates via WebSocket connection, while others use periodic refreshes.'\n );\n readonly TIME_RANGE_PICKER_POPOVER = gettext(\n 'Sets a rolling time window relative to the current time. As time progresses, the window automatically shifts to maintain the selected duration, always showing the most recent data.'\n );\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly formBuilder = inject(FormBuilder);\n\n private readonly settingsSignal = signal<Partial<GlobalContextSettings>>({\n showAutoRefresh: true,\n showTimeContext: true\n });\n private readonly defaultLiveContext = fillMissingDefaults({ refreshOption: REFRESH_OPTION.LIVE });\n private readonly currentContext = signal<GlobalContextState>(\n structuredClone(this.defaultLiveContext)\n );\n\n @Input()\n set settings(value: Partial<GlobalContextSettings> | null) {\n this.settingsSignal.set({\n showAutoRefresh: true,\n showTimeContext: true,\n ...(value ?? {})\n });\n }\n get settings(): Partial<GlobalContextSettings> {\n return this.settingsSignal();\n }\n\n @Input()\n set context(value: GlobalContextState | null) {\n if (!value) {\n return;\n }\n\n const normalized = fillMissingDefaults({\n ...value,\n refreshOption: REFRESH_OPTION.LIVE\n });\n const cloned = structuredClone(normalized);\n\n this.currentContext.set(cloned);\n this.patchFormFromContext(cloned);\n }\n\n readonly contextChange = output<Partial<GlobalContextState>>();\n\n form: ReturnType<typeof this.createForm>;\n\n constructor() {\n this.form = this.createForm();\n\n this.form.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(100))\n .subscribe(value => {\n this.contextChange.emit({\n dateTimeContext: value.dateTimeContext ?? null,\n refreshInterval: GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL,\n isAutoRefreshEnabled: value.isAutoRefreshEnabled ?? null,\n aggregation: null\n });\n });\n\n this.patchFormFromContext(this.currentContext());\n }\n\n private createForm() {\n return this.formBuilder.group({\n dateTimeContext: this.formBuilder.control<DateTimeContext | null>(null),\n refreshInterval: this.formBuilder.control<number>(GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL),\n isAutoRefreshEnabled: this.formBuilder.control<boolean | null>(true)\n });\n }\n\n private patchFormFromContext(context?: GlobalContextState): void {\n if (!this.form) {\n return;\n }\n\n const ctx = context ?? this.currentContext();\n const { dateTimeContext, isAutoRefreshEnabled } = ctx;\n this.form.patchValue(\n {\n dateTimeContext: dateTimeContext ? structuredClone(dateTimeContext) : null,\n refreshInterval: GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL,\n isAutoRefreshEnabled: isAutoRefreshEnabled ?? null\n },\n { emitEvent: false }\n );\n }\n}\n","@if (form) {\n @let SHOW_TIME_CONTEXT = settings.showTimeContext;\n @let SHOW_AUTO_REFRESH = settings.showAutoRefresh;\n\n <form [formGroup]=\"form\">\n <div class=\"content-flex-82\">\n <div class=\"col-5\">\n @if (SHOW_TIME_CONTEXT) {\n <fieldset class=\"c8y-fieldset\">\n <legend>\n <div class=\"standalone btn-icon-dot__item time-context m-r-4\">\n <i [c8yIcon]=\"'calendar'\"></i>\n </div>\n {{ 'Date & time' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"TIME_RANGE_PICKER_POPOVER | translate\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-4 p-t-16 p-b-16\">\n <c8y-date-time-context-picker\n formControlName=\"dateTimeContext\"\n [config]=\"{ showDateTo: false, showDateFrom: true }\"\n ></c8y-date-time-context-picker>\n </c8y-form-group>\n </fieldset>\n }\n </div>\n <div class=\"col-3\">\n @if (SHOW_AUTO_REFRESH) {\n <fieldset class=\"c8y-fieldset\">\n <legend class=\"d-flex\">\n <div class=\"standalone btn-icon-dot__item auto-refresh m-r-4\">\n <i [c8yIcon]=\"'refresh'\"></i>\n </div>\n {{ 'Auto refresh' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"REFRESH_POPOVER_MESSAGE | translate\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-8 form-group-sm p-t-16 p-b-16\">\n <div class=\"d-flex gap-8 a-i-center\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n type=\"checkbox\"\n #arInput\n formControlName=\"isAutoRefreshEnabled\"\n />\n <span></span>\n <span>\n {{ 'Auto refresh enabled' | translate }}\n </span>\n </label>\n </div>\n </c8y-form-group>\n </fieldset>\n }\n </div>\n </div>\n </form>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n TemplateRef,\n computed,\n effect,\n input,\n output,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport {\n C8yTranslatePipe,\n FormsModule,\n IconDirective,\n TabWithTemplate,\n TabsOutletComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport type { RefreshOption } from '../../../models/auto-refresh.model';\nimport { REFRESH_OPTION } from '../../../models/auto-refresh.model';\nimport type {\n GlobalContextSettings,\n GlobalContextState\n} from '../../../models/global-context.model';\nimport { HistoryModeConfigurationControlsComponent } from '../history-mode-configuration-controls/history-mode-configuration-controls.component';\nimport { LiveModeConfigurationControlsComponent } from '../live-mode-configuration-controls/live-mode-configuration-controls.component';\n\ntype InlineTab = TabWithTemplate & { isActive?: boolean };\n\n@Component({\n selector: 'c8y-configuration-controls',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"p-relative fit-h\">\n <div [attr.class]=\"containerClass()\">\n <c8y-tabs-outlet\n [orientation]=\"controlsDisplayMode()\"\n [outletName]=\"resolvedOutletName()\"\n [attr.outletname]=\"resolvedOutletName()\"\n [openFirstTab]=\"false\"\n [tabs]=\"inlineTabs()\"\n ></c8y-tabs-outlet>\n\n @if (selectedMode() === REFRESH_OPTION.LIVE) {\n <div class=\"p-l-24 p-r-24 fit-w min-width-0\">\n <c8y-live-mode-configuration-controls\n [settings]=\"settings()\"\n [context]=\"liveContext()\"\n (contextChange)=\"handleLiveChanges($event)\"\n ></c8y-live-mode-configuration-controls>\n </div>\n }\n\n @if (selectedMode() === REFRESH_OPTION.HISTORY) {\n <div class=\"p-l-24 p-r-24 fit-w min-width-0\">\n <c8y-history-mode-configuration-controls\n [settings]=\"settings()\"\n [context]=\"historyContext()\"\n (contextChange)=\"handleHistoryChanges($event)\"\n (validationStatus)=\"handleValidationStatus($event)\"\n ></c8y-history-mode-configuration-controls>\n </div>\n }\n </div>\n\n <ng-template #LiveTab>\n <i [c8yIcon]=\"'process'\"></i>\n <div>\n <p class=\"text-bold\">{{ MODE_LABELS.LIVE | translate }}</p>\n <p class=\"tab-description text-12 l-h-tight\">\n {{ MODE_DESCRIPTIONS.LIVE | translate }}\n </p>\n </div>\n </ng-template>\n <ng-template #HistoryTab>\n <i [c8yIcon]=\"'schedule1'\"></i>\n <div>\n <p class=\"text-bold\">{{ MODE_LABELS.HISTORY | translate }}</p>\n <p class=\"tab-description text-12 l-h-tight\">\n {{ MODE_DESCRIPTIONS.HISTORY | translate }}\n </p>\n </div>\n </ng-template>\n </div>\n `,\n standalone: true,\n imports: [\n TooltipModule,\n CollapseModule,\n TabsOutletComponent,\n ReactiveFormsModule,\n FormsModule,\n PopoverModule,\n HistoryModeConfigurationControlsComponent,\n LiveModeConfigurationControlsComponent,\n C8yTranslatePipe,\n IconDirective\n ]\n})\nexport class ConfigurationControlsComponent {\n readonly MODE_LABELS = {\n LIVE: gettext('Live'),\n HISTORY: gettext('History')\n } as const;\n\n readonly MODE_DESCRIPTIONS = {\n LIVE: gettext('Dynamic time window that moves with current time to show recent data.'),\n HISTORY: gettext('Fixed time period for analyzing historical data.')\n } as const;\n readonly REFRESH_OPTION = REFRESH_OPTION;\n\n readonly controlsDisplayMode = input<'horizontal' | 'vertical'>('vertical');\n readonly settings = input<Partial<GlobalContextSettings>>({\n showAutoRefresh: true,\n showTimeContext: true,\n showAggregation: true\n });\n readonly activeMode = input<RefreshOption>(REFRESH_OPTION.LIVE);\n readonly liveContext = input<GlobalContextState | null>(null);\n readonly historyContext = input<GlobalContextState | null>(null);\n readonly supportedModes = input<RefreshOption[]>([REFRESH_OPTION.LIVE, REFRESH_OPTION.HISTORY]);\n\n readonly tabsOutletName = input<string | null>(null);\n private readonly liveTabSelect = new EventEmitter<void>();\n private readonly historyTabSelect = new EventEmitter<void>();\n readonly refreshOptionChange = output<RefreshOption>();\n readonly contextChange = output<Partial<GlobalContextState>>();\n readonly validationStatus = output<boolean>();\n\n readonly selectedMode = computed(() => this.activeMode());\n readonly containerClass = computed(() =>\n this.controlsDisplayMode() === 'horizontal' ? 'horizontal d-col' : 'd-flex'\n );\n readonly resolvedOutletName = computed(\n () => this.tabsOutletName() ?? 'verticalTabOutletForConfigurationModes'\n );\n\n readonly liveTabTemplate = viewChild<TemplateRef<any>>('LiveTab');\n readonly historyTabTemplate = viewChild<TemplateRef<any>>('HistoryTab');\n\n readonly inlineTabs = computed(() => {\n const liveTemp = this.liveTabTemplate();\n const historyTemp = this.historyTabTemplate();\n\n if (!liveTemp || !historyTemp) {\n return [];\n }\n\n const modes = this.supportedModes();\n const allTabs: InlineTab[] = [\n {\n title: this.MODE_LABELS.LIVE,\n template: liveTemp,\n showAlways: true,\n tabsOutlet: this.resolvedOutletName(),\n onSelect: this.liveTabSelect,\n isActive: this.selectedMode() === REFRESH_OPTION.LIVE\n },\n {\n title: this.MODE_LABELS.HISTORY,\n template: historyTemp,\n showAlways: true,\n tabsOutlet: this.resolvedOutletName(),\n onSelect: this.historyTabSelect,\n isActive: this.selectedMode() === REFRESH_OPTION.HISTORY\n }\n ];\n\n return allTabs.filter((tab, index) => {\n const mode = index === 0 ? REFRESH_OPTION.LIVE : REFRESH_OPTION.HISTORY;\n return modes.includes(mode);\n });\n });\n\n constructor() {\n this.liveTabSelect\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.handleTabSelect(REFRESH_OPTION.LIVE));\n this.historyTabSelect\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.handleTabSelect(REFRESH_OPTION.HISTORY));\n\n // Validate active mode and fallback to first available if not supported\n effect(() => {\n const currentMode = this.activeMode();\n const modes = this.supportedModes();\n\n if (!modes.includes(currentMode) && modes.length > 0) {\n this.refreshOptionChange.emit(modes[0]);\n }\n });\n\n // Emit validation status when mode changes\n effect(() => {\n const mode = this.selectedMode();\n if (mode === REFRESH_OPTION.LIVE) {\n this.validationStatus.emit(true);\n }\n });\n }\n\n handleTabSelect(mode: RefreshOption): void {\n if (this.selectedMode() === mode) {\n return;\n }\n\n this.refreshOptionChange.emit(mode);\n }\n\n handleLiveChanges(changes: Partial<GlobalContextState>): void {\n this.contextChange.emit({ ...changes, refreshOption: REFRESH_OPTION.LIVE });\n }\n\n handleHistoryChanges(changes: Partial<GlobalContextState>): void {\n this.contextChange.emit({ ...changes, refreshOption: REFRESH_OPTION.HISTORY });\n }\n\n handleValidationStatus(isValid: boolean): void {\n this.validationStatus.emit(isValid);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n Input,\n output,\n signal\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { C8yTranslatePipe, FormsModule } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { isEqual } from 'lodash-es';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport type { RefreshOption } from '../../../models/auto-refresh.model';\nimport { REFRESH_OPTION } from '../../../models/auto-refresh.model';\nimport { TIME_DURATION } from '../../../models/constants';\nimport type { GlobalContextState } from '../../../models/global-context.model';\nimport { TIME_INTERVAL } from '../../../models/interval-picker.model';\nimport { fillMissingDefaults } from '../../../utils/global-context-defaults.util';\nimport { ConfigurationControlsComponent } from '../configuration-controls/configuration-controls.component';\n\n@Component({\n selector: 'c8y-configuration-collapse',\n templateUrl: './configuration-collapse.component.html',\n host: { class: 'd-contents' },\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n TooltipModule,\n CollapseModule,\n ReactiveFormsModule,\n FormsModule,\n PopoverModule,\n ConfigurationControlsComponent,\n C8yTranslatePipe\n ]\n})\nexport class ConfigurationCollapseComponent {\n readonly REFRESH_OPTION = REFRESH_OPTION;\n\n readonly isCollapsed = signal(true);\n readonly shouldSave = signal(false);\n readonly hasPendingChanges = signal(false);\n readonly activeMode = signal<RefreshOption>(REFRESH_OPTION.LIVE);\n readonly supportedModes = input<RefreshOption[]>([REFRESH_OPTION.LIVE, REFRESH_OPTION.HISTORY]);\n readonly isFormValid = signal(true);\n\n readonly helpText = gettext(\n 'When checked, saves these settings as the default configuration for this dashboard. If unchecked, changes will only apply for the current session and will reset when you reload the page.'\n );\n\n private readonly latestContext = signal<GlobalContextState | null>(null);\n private readonly snapshots = signal<Record<RefreshOption, GlobalContextState | null>>({\n [REFRESH_OPTION.LIVE]: null,\n [REFRESH_OPTION.HISTORY]: null\n });\n\n readonly liveViewContext = computed(() => {\n return this.snapshots()[REFRESH_OPTION.LIVE] ?? undefined;\n });\n readonly historyViewContext = computed(() => {\n return this.snapshots()[REFRESH_OPTION.HISTORY] ?? undefined;\n });\n\n @Input() set context(value: GlobalContextState) {\n if (!value) {\n return;\n }\n\n this.latestContext.set(structuredClone(value));\n\n // CRITICAL: Don't update form snapshots while dropdown is open\n // User is actively editing - external updates would overwrite their changes\n if (this.isCollapsed()) {\n this.activeMode.set(value.refreshOption ?? REFRESH_OPTION.LIVE);\n\n this.snapshots.set({\n [REFRESH_OPTION.LIVE]:\n value.refreshOption === REFRESH_OPTION.LIVE ? structuredClone(value) : null,\n [REFRESH_OPTION.HISTORY]:\n value.refreshOption === REFRESH_OPTION.HISTORY ? structuredClone(value) : null\n });\n\n this.hasPendingChanges.set(false);\n } else {\n // Dropdown is open - only recalculate if current state differs from latest\n this.recalculatePendingChanges();\n }\n }\n\n readonly contextChange = output<Partial<GlobalContextState>>();\n readonly refreshOptionChange = output<RefreshOption>();\n readonly savePreferenceChange = output<boolean>();\n\n toggle(): void {\n this.isCollapsed.update(value => !value);\n }\n\n close(): void {\n if (this.isCollapsed()) {\n return;\n }\n\n this.isCollapsed.set(true);\n this.resetToLatest();\n }\n\n onCollapsed(): void {\n this.isCollapsed.set(true);\n this.shouldSave.set(false);\n this.resetToLatest();\n }\n\n onExpanded(): void {\n this.isCollapsed.set(false);\n\n const mode = this.activeMode();\n const snapshot = this.snapshots()[mode];\n\n if (!snapshot) {\n const defaultContext = this.createDefaultContext(mode);\n this.snapshots.update(previous => ({\n ...previous,\n [mode]: structuredClone(defaultContext)\n }));\n }\n\n this.recalculatePendingChanges();\n }\n\n onModeChange(changes: Partial<GlobalContextState>): void {\n const mode = changes.refreshOption ?? this.activeMode();\n if (!mode) {\n return;\n }\n\n const current = this.snapshots()[mode]\n ? structuredClone(this.snapshots()[mode]!)\n : this.createDefaultContext(mode);\n\n const { refreshOption: _ignored, ...rest } = changes;\n const merged: GlobalContextState = { ...current, ...rest, refreshOption: mode };\n\n if (mode === REFRESH_OPTION.LIVE) {\n const normalized = fillMissingDefaults({ ...merged, refreshOption: REFRESH_OPTION.LIVE });\n merged.dateTimeContext = normalized.dateTimeContext;\n merged.isAutoRefreshEnabled = normalized.isAutoRefreshEnabled;\n merged.refreshInterval = normalized.refreshInterval;\n }\n\n this.snapshots.update(previous => ({\n ...previous,\n [mode]: structuredClone(merged)\n }));\n\n if (mode === this.activeMode()) {\n this.recalculatePendingChanges();\n }\n }\n\n onModeSelected(mode: RefreshOption): void {\n if (this.activeMode() === mode) {\n return;\n }\n\n this.activeMode.set(mode);\n\n const snapshot = this.snapshots()[mode];\n if (!snapshot) {\n const defaultContext = this.createDefaultContext(mode);\n this.snapshots.update(previous => ({\n ...previous,\n [mode]: structuredClone(defaultContext)\n }));\n }\n\n this.recalculatePendingChanges();\n }\n\n apply(): void {\n const shouldPersist = this.shouldSave();\n this.savePreferenceChange.emit(shouldPersist);\n\n if (!this.hasPendingChanges()) {\n return;\n }\n\n const mode = this.activeMode();\n const activeSnapshot = this.snapshots()[mode];\n if (!activeSnapshot) {\n return;\n }\n\n const payload = structuredClone(activeSnapshot);\n\n this.contextChange.emit(payload);\n this.refreshOptionChange.emit(mode);\n\n this.latestContext.set(structuredClone(payload));\n\n this.hasPendingChanges.set(false);\n this.shouldSave.set(false);\n this.isCollapsed.set(true);\n }\n\n shouldSaveInDashboard(change: boolean): void {\n this.shouldSave.set(change);\n }\n\n onValidationStatusChange(isValid: boolean): void {\n this.isFormValid.set(isValid);\n }\n\n private resetToLatest(): void {\n const latest = this.latestContext();\n const latestMode = latest?.refreshOption ?? REFRESH_OPTION.LIVE;\n\n this.snapshots.set({\n [REFRESH_OPTION.LIVE]:\n latest && latestMode === REFRESH_OPTION.LIVE ? structuredClone(latest) : null,\n [REFRESH_OPTION.HISTORY]:\n latest && latestMode === REFRESH_OPTION.HISTORY ? structuredClone(latest) : null\n });\n\n this.activeMode.set(latestMode);\n this.hasPendingChanges.set(false);\n this.shouldSave.set(false);\n this.isFormValid.set(true);\n }\n\n private createDefaultContext(mode: RefreshOption): GlobalContextState {\n if (mode === REFRESH_OPTION.LIVE) {\n return fillMissingDefaults({ refreshOption: REFRESH_OPTION.LIVE });\n }\n\n const now = new Date();\n const dateTo = now.toISOString();\n const dateFrom = new Date(now.getTime() - TIME_DURATION.ONE_HOUR_MS).toISOString();\n\n return {\n refreshOption: REFRESH_OPTION.HISTORY,\n dateTimeContext: {\n dateFrom,\n dateTo,\n interval: TIME_INTERVAL.CUSTOM\n },\n aggregation: null\n };\n }\n\n private recalculatePendingChanges(): void {\n const latest = this.latestContext();\n if (!latest) {\n this.hasPendingChanges.set(false);\n return;\n }\n\n const latestMode = latest.refreshOption ?? REFRESH_OPTION.LIVE;\n if (this.activeMode() !== latestMode) {\n this.hasPendingChanges.set(true);\n return;\n }\n\n const snapshot = this.snapshots()[this.activeMode()];\n if (!snapshot) {\n this.hasPendingChanges.set(false);\n return;\n }\n\n this.hasPendingChanges.set(!isEqual(snapshot, latest));\n }\n}\n","<div\n class=\"c8y-global-context\"\n [collapse]=\"isCollapsed()\"\n (collapsed)=\"onCollapsed()\"\n (expanded)=\"onExpanded()\"\n [isAnimated]=\"true\"\n>\n <div class=\"p-t-16 p-b-16 p-l-24 p-r-24 separator-bottom\">\n <span\n class=\"h4\"\n translate\n >\n Time mode\n </span>\n </div>\n <div>\n @if (!isCollapsed()) {\n <c8y-configuration-controls\n [activeMode]=\"activeMode()\"\n [liveContext]=\"liveViewContext()\"\n [historyContext]=\"historyViewContext()\"\n [supportedModes]=\"supportedModes()\"\n (refreshOptionChange)=\"onModeSelected($event)\"\n (contextChange)=\"onModeChange($event)\"\n (validationStatus)=\"onValidationStatusChange($event)\"\n ></c8y-configuration-controls>\n }\n </div>\n <div class=\"c8y-top-drawer--footer\">\n <div class=\"d-flex a-i-center gap-8\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Close help' | translate\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed()\"\n type=\"button\"\n (click)=\"toggle()\"\n translate\n >\n Close\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Apply global context' | translate\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed()\"\n type=\"button\"\n (click)=\"apply()\"\n [disabled]=\"!hasPendingChanges() || !isFormValid()\"\n translate\n data-cy=\"global-date-context--Apply-button\"\n >\n Apply\n </button>\n\n <label class=\"c8y-checkbox d-flex align-items-center m-b-0\">\n <input\n class=\"m-r-4\"\n type=\"checkbox\"\n [ngModel]=\"shouldSave()\"\n (ngModelChange)=\"shouldSaveInDashboard($event)\"\n />\n <span class=\"a-s-center m-r-8\"></span>\n <span\n class=\"text-truncate\"\n translate\n >\n Save in dashboard configuration\n </span>\n <button\n class=\"btn-help btn-help--sm m-l-4\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"helpText | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n </div>\n </div>\n</div>\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRoute, NavigationExtras, Router } from '@angular/router';\nimport { aggregationType } from '@c8y/client';\nimport { map, Observable } from 'rxjs';\nimport { REFRESH_OPTION } from '../../models/auto-refresh.model';\nimport { GLOBAL_CONTEXT_DEFAULTS } from '../../models/global-context-defaults';\nimport {\n DateContextParams,\n DateContextQueryParamNames,\n GlobalContextState,\n InputDateContextQueryParams,\n ParameterValidationStatus\n} from '../../models/global-context.model';\nimport { Interval, TIME_INTERVAL, TimeInterval } from '../../models/interval-picker.model';\nimport { DateTimeContextPickerService } from '../domain/date-time-context-picker.service';\nimport { DateTimeContextUtil } from '../../utils/date-time-context.util';\nimport { GlobalContextValidationService } from '../domain/global-context-validation.service';\n\n/**\n * Service responsible for managing date context query parameters in the URL.\n *\n * This service provides a centralized way to handle reading, writing, and validation\n * of date context query parameters. It supports both interval-based and date-range-based\n * time contexts, with interval taking precedence when both are present.\n *\n * Key features:\n * - Reactive query parameter changes via observables\n * - Validation of query parameter values\n * - Conversion between query parameters and typed objects\n * - URL navigation with proper parameter handling\n * - Support for both interval and custom date ranges\n *\n * @example\n * ```typescript\n * // Subscribe to query parameter changes\n * queryService.queryParamsChange$().subscribe(params => {\n * console.log('Date context params:', params);\n * });\n *\n * // Set new query parameters\n * queryService.setDateContextQueryParams({\n * interval: TIME_INTERVAL.DAYS,\n * aggregation: aggregationType.HOURLY,\n * isAutoRefreshEnabled: true,\n * refreshOption: 'live'\n * });\n *\n * // Get context from current URL\n * const context = queryService.dateTimeContextFromQueryParams();\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class GlobalContextQueryService {\n private activatedRoute = inject(ActivatedRoute);\n private dateTimeContextPickerService = inject(DateTimeContextPickerService);\n private router = inject(Router);\n private validationService = inject(GlobalContextValidationService);\n\n /**\n * Stores the state when browser navigation occurs via back/forward buttons.\n * Used to preserve the global context state during browser history navigation\n * to ensure consistency between URL and component state.\n */\n navigationPopState = null;\n\n /**\n * Returns an observable that emits processed date context query parameters.\n *\n * This observable emits every time the route's query parameters change, providing\n * validated and typed parameter values. Invalid parameter values are automatically\n * filtered out and replaced with null or undefined as appropriate.\n *\n * The emitted object includes:\n * - `dateContextInterval`: Validated interval ID or null\n * - `dateContextAggregation`: Validated aggregation type or null\n * - `globalContextAutoRefresh`: Parsed boolean value or undefined\n * - All other original query parameters (preserved as-is)\n *\n * @returns Observable that emits InputDateContextQueryParams whenever route query params change\n *\n * @example\n * ```typescript\n * // Subscribe to parameter changes\n * queryService.queryParamsChange$().pipe(\n * takeUntilDestroyed()\n * ).subscribe(params => {\n * if (params.dateContextInterval) {\n * console.log('Valid interval:', params.dateContextInterval);\n * }\n * if (params.globalContextAutoRefresh === true) {\n * console.log('Auto-refresh is enabled');\n * }\n * });\n * ```\n */\n queryParamsChange$(): Observable<InputDateContextQueryParams> {\n // Get root route for consistent query param access\n let currentRoute = this.activatedRoute;\n while (currentRoute.parent) {\n currentRoute = currentRoute.parent;\n }\n\n return currentRoute.queryParams.pipe(\n map((params: Record<DateContextQueryParamNames, string>) => this.processQueryParams(params))\n );\n }\n\n /**\n * Creates a global context state object from the current route's query parameters.\n *\n * This method reads the current query parameters and attempts to build a valid\n * GlobalContextState object. It handles validation of parameters and applies\n * business logic for parameter precedence and conflicts.\n *\n * **Parameter Precedence Rules:**\n * 1. **Interval takes precedence**: If a valid interval is provided, any date range\n * parameters (dateFrom/dateTo) are ignored and recalculated based on the interval\n * 2. **Date range fallback**: If no valid interval is found, the method attempts\n * to use explicit date range parameters\n * 3. **Partial context**: If only non-temporal parameters are valid (aggregation,\n * refresh settings), a partial context without dateTimeContext is returned\n *\n * **Validation Logic:**\n * - Intervals are validated through DateTimeContextPickerService.isSelectableInterval()\n * - Date ranges are validated through DateTimeContextPickerService.isValidDateRange()\n * - Boolean parameters are strictly parsed (only 'true'/'false' strings accepted)\n * - Invalid refresh modes default to 'live'\n *\n * @returns Partial GlobalContextState object with valid parameters, or null if no valid context can be built\n *\n * @example\n * ```typescript\n * // With interval parameter: ?dateContextInterval=DAYS&dateContextAggregation=HOURLY\n * const context = queryService.dateTimeContextFromQueryParams();\n * // Returns: {\n * // aggregation: 'HOURLY',\n * // dateTimeContext: {\n * // dateFrom: '2024-01-01T00:00:00.000Z',\n * // dateTo: '2024-01-02T00:00:00.000Z',\n * // interval: 'DAYS'\n * // }\n * // }\n *\n * // With date range: ?dateContextFrom=2024-01-01&dateContextTo=2024-01-02\n * const context2 = queryService.dateTimeContextFromQueryParams();\n * // Returns: {\n * // dateTimeContext: {\n * // dateFrom: '2024-01-01',\n * // dateTo: '2024-01-02',\n * // interval: 'custom'\n * // }\n * // }\n *\n * // Invalid parameters\n * const context3 = queryService.dateTimeContextFromQueryParams();\n * // Returns: null\n * ```\n */\n dateTimeContextFromQueryParams(): Partial<GlobalContextState> | null {\n // Try multiple methods to get query params due to Angular routing inconsistencies\n let params = {};\n\n // Method 1: Navigate up to root route to get query params\n // Query params can be \"lost\" in child routes, so we traverse to the root\n // where they are most reliably available during navigation\n let currentRoute = this.activatedRoute;\n while (currentRoute.parent) {\n currentRoute = currentRoute.parent;\n }\n params = currentRoute.snapshot.queryParams;\n\n // Method 2: Fallback to manual URL parsing if root route params are empty\n if (!params || Object.keys(params).length === 0) {\n const currentUrl = this.router.url;\n if (currentUrl) {\n const questionMarkIndex = currentUrl.indexOf('?');\n if (questionMarkIndex > -1) {\n const queryString = currentUrl.substring(questionMarkIndex + 1);\n const urlParams = new URLSearchParams(queryString);\n params = {};\n urlParams.forEach((value, key) => {\n params[key] = value;\n });\n }\n }\n }\n\n // Extract and validate query parameters\n const dateContextInterval = params[DateContextQueryParamNames.DATE_CONTEXT_INTERVAL];\n const isValidInterval =\n this.dateTimeContextPickerService.isSelectableInterval(dateContextInterval);\n\n // Build the base context object without undefined values\n const baseContext: Partial<GlobalContextState> = {};\n\n const aggregation = params[DateContextQueryParamNames.DATE_CONTEXT_AGGREGATION];\n if (aggregation) {\n baseContext.aggregation = aggregation;\n }\n\n const refreshOption = params[DateContextQueryParamNames.DATE_CONTEXT_REFRESH_MODE];\n if (refreshOption) {\n baseContext.refreshOption =\n refreshOption === REFRESH_OPTION.HISTORY || refreshOption === REFRESH_OPTION.LIVE\n ? refreshOption\n : GLOBAL_CONTEXT_DEFAULTS.REFRESH_OPTION;\n }\n\n const isAutoRefreshEnabled = this.validationService.parseBoolean(\n params[DateContextQueryParamNames.DATE_CONTEXT_AUTO_REFRESH]\n );\n if (isAutoRefreshEnabled !== undefined) {\n baseContext.isAutoRefreshEnabled = isAutoRefreshEnabled;\n }\n\n // Try to get context from interval first\n if (isValidInterval && dateContextInterval) {\n const intervalId = dateContextInterval as Interval['id'];\n const range = DateTimeContextUtil.dateRangeFromInterval(\n intervalId as unknown as TimeInterval\n );\n if (range) {\n const [dateFrom, dateTo] = range;\n return {\n ...baseContext,\n dateTimeContext: DateTimeContextUtil.ensureIsoContext({\n interval: intervalId as unknown as TimeInterval,\n dateFrom,\n dateTo\n })\n };\n }\n }\n\n // If interval not provided, try getting date range from query params\n const dateRange = this.getDateContextFromQueryParams();\n if (dateRange) {\n return {\n ...baseContext,\n dateTimeContext: DateTimeContextUtil.ensureIsoContext({\n interval: TIME_INTERVAL.CUSTOM,\n dateFrom: dateRange[0],\n dateTo: dateRange[1]\n })\n };\n }\n\n // If we have some context values but no valid time range,\n // check if we should return the partial context or null\n if (Object.keys(baseContext).length > 0) {\n return baseContext;\n }\n\n // No valid context found at all\n return null;\n }\n\n /**\n * Updates the URL query parameters with new date context values.\n *\n * This method translates a context state object into URL query parameters and\n * navigates to update the current route. It handles the mutual exclusivity\n * between interval-based and date-range-based parameters.\n *\n * **Parameter Logic:**\n * - **Interval mode**: When a valid interval is provided (not 'custom'),\n * date-specific parameters (dateFrom/dateTo) are cleared\n * - **Date range mode**: When interval is 'custom' or undefined,\n * interval parameter is cleared and date range parameters are set\n * - **Navigation behavior**: Uses 'merge' strategy to preserve other query parameters\n * - **Browser history**: Handles popstate navigation differently than programmatic navigation\n *\n * **Performance Optimization:**\n * The method includes normalization logic to prevent unnecessary navigation\n * when the new parameters would result in the same normalized URL state.\n *\n * @param contextState Object containing the new context state values\n * @param contextState.interval - Time interval ('DAYS', 'HOURS', etc.) or 'custom'\n * @param contextState.date - Array of [dateFrom, dateTo] strings for custom ranges\n * @param contextState.aggregation - Data aggregation type ('HOURLY', 'DAILY', etc.)\n * @param contextState.isAutoRefreshEnabled - Whether auto-refresh should be enabled\n * @param contextState.refreshOption - Refresh mode ('live' or 'history')\n *\n * @example\n * ```typescript\n * // Set interval-based context\n * queryService.setDateContextQueryParams({\n * interval: TIME_INTERVAL.DAYS,\n * aggregation: aggregationType.HOURLY,\n * isAutoRefreshEnabled: true,\n * refreshOption: 'live'\n * });\n * // Results in: https://example.com/apps/cockpit/#/?dateContextInterval=DAYS&dateContextAggregation=HOURLY&globalContextAutoRefresh=true&globalContextRefreshMode=live\n *\n * // Set custom date range context\n * queryService.setDateContextQueryParams({\n * interval: TIME_INTERVAL.CUSTOM,\n * date: ['2024-01-01T00:00:00.000Z', '2024-01-02T00:00:00.000Z'],\n * aggregation: aggregationType.DAILY,\n * isAutoRefreshEnabled: false,\n * refreshOption: 'history'\n * });\n * // Results in: https://example.com/apps/cockpit/#/?dateContextFrom=2024-01-01T00:00:00.000Z&dateContextTo=2024-01-02T00:00:00.000Z&dateContextAggregation=DAILY&globalContextAutoRefresh=false&globalContextRefreshMode=history\n * ```\n */\n setDateContextQueryParams(contextState: DateContextParams): void {\n const { interval, date, aggregation, isAutoRefreshEnabled, refreshOption } = contextState;\n const queryParams = this.buildQueryParams({\n interval,\n date,\n aggregation,\n isAutoRefreshEnabled,\n refreshOption\n });\n\n const navigation = this.router.getCurrentNavigation();\n\n this.navigateWithQueryParams(queryParams, {\n queryParamsHandling: 'merge',\n state: {\n clearParams: navigation?.trigger === 'popstate' ? false : true\n }\n });\n }\n\n /**\n * Removes all date context query parameters from the current URL.\n *\n * This method performs a selective cleanup by detecting which date context\n * parameters are currently present in the URL and removing only those.\n * It preserves all non-date-context parameters unchanged.\n *\n * **Behavior:**\n * - **Selective removal**: Only removes parameters that are actually present\n * - **Preserve other params**: Non-date-context parameters remain unchanged\n * - **No-op optimization**: If no date context parameters exist, no navigation occurs\n * - **Merge strategy**: Uses 'merge' queryParamsHandling to maintain other URL state\n *\n * **Parameters removed (if present):**\n * - `dateContextFrom`\n * - `dateContextTo`\n * - `dateContextInterval`\n * - `dateContextAggregation`\n * - `globalContextAutoRefresh`\n * - `globalContextRefreshMode`\n *\n * @example\n * ```typescript\n * // Current URL: https://example.com/apps/cockpit/#/dashboard?dateContextInterval=DAYS&dateContextAggregation=HOURLY&otherParam=value\n * queryService.checkAndRemoveDateContextParams();\n * // Result URL: https://example.com/apps/cockpit/#/dashboard?otherParam=value\n *\n * // Current URL: https://example.com/apps/cockpit/#/dashboard?someOtherParam=value (no date context params)\n * queryService.checkAndRemoveDateContextParams();\n * // Result: No navigation occurs (no-op)\n * ```\n */\n checkAndRemoveDateContextParams(): void {\n const currentParams = this.activatedRoute.snapshot.queryParams;\n const dateContextParamNames = Object.values(DateContextQueryParamNames);\n\n // Check if any date context params exist in the current URL\n const dateContextParamsPresent = dateContextParamNames.some(\n paramName => currentParams[paramName] !== undefined\n );\n\n if (dateContextParamsPresent) {\n // Create an object with null values for all date context params that are present\n const paramsToRemove = dateContextParamNames.reduce(\n (acc, paramName) => {\n if (currentParams[paramName] !== undefined) {\n acc[paramName] = null;\n }\n return acc;\n },\n {} as Record<string, null>\n );\n\n // Only navigate if there are params to remove\n if (Object.keys(paramsToRemove).length > 0) {\n this.navigateWithQueryParams(paramsToRemove, { queryParamsHandling: 'merge' });\n }\n }\n }\n\n /**\n * Gets the current parameter validation status for debugging and UI state management.\n *\n * This method analyzes the current query parameters and returns detailed validation\n * information for each parameter type. Useful for debugging parameter issues and\n * providing user feedback about parameter validity.\n *\n * @returns ParameterValidationStatus object containing validation results for each parameter type\n *\n * @example\n * ```typescript\n * const status = queryService.getParameterValidationStatus();\n *\n * if (!status.interval && !status.dateRange) {\n * console.warn('No valid time context found in URL parameters');\n * }\n *\n * if (status.autoRefresh === undefined) {\n * console.info('Auto-refresh parameter not specified or invalid');\n * }\n *\n * // Use for conditional UI rendering\n * const hasValidTimeContext = status.interval || status.dateRange;\n * ```\n */\n getParameterValidationStatus(): ParameterValidationStatus {\n // Get params from root route\n let currentRoute = this.activatedRoute;\n while (currentRoute.parent) {\n currentRoute = currentRoute.parent;\n }\n const params = currentRoute.snapshot.queryParams;\n\n return this.validationService.validateParameters({\n interval: params[DateContextQueryParamNames.DATE_CONTEXT_INTERVAL],\n aggregation: params[DateContextQueryParamNames.DATE_CONTEXT_AGGREGATION],\n dateFrom: params[DateContextQueryParamNames.DATE_CONTEXT_FROM],\n dateTo: params[DateContextQueryParamNames.DATE_CONTEXT_TO],\n autoRefresh: params[DateContextQueryParamNames.DATE_CONTEXT_AUTO_REFRESH]\n });\n }\n\n /**\n * Validates if the current query parameters represent a valid global context.\n *\n * This is a convenience method that combines parameter validation with context building\n * to determine if the URL contains sufficient valid parameters to create a global context.\n *\n * @returns True if current parameters can build a valid global context, false otherwise\n *\n * @example\n * ```typescript\n * if (queryService.hasValidContext()) {\n * const context = queryService.dateTimeContextFromQueryParams();\n * // Context is guaranteed to be non-null\n * } else {\n * // Show default state or parameter input form\n * }\n * ```\n */\n hasValidContext(): boolean {\n const context = this.dateTimeContextFromQueryParams();\n return (\n context !== null && (context.dateTimeContext !== undefined || Object.keys(context).length > 0)\n );\n }\n\n /**\n * Builds query parameters based on the provided context state.\n * Chooses between interval-based or date-range-based parameters.\n *\n * @param contextState The global context state containing interval, date, aggregation, etc.\n * @returns Record of query parameters to be set in the URL\n */\n private buildQueryParams(\n contextState: DateContextParams\n ): Record<DateContextQueryParamNames, null | string | boolean> {\n const { interval, date, aggregation, isAutoRefreshEnabled, refreshOption } = contextState;\n if (interval && interval !== TIME_INTERVAL.CUSTOM) {\n return this.buildIntervalBasedQueryParams(\n interval,\n aggregation,\n isAutoRefreshEnabled,\n refreshOption\n );\n } else {\n return this.buildDateRangeBasedQueryParams(\n date,\n aggregation,\n isAutoRefreshEnabled,\n refreshOption\n );\n }\n }\n\n /**\n * Builds query parameters for interval-based time context.\n * Clears date-specific parameters and sets interval-related ones.\n *\n * @param interval The time interval\n * @param aggregation The aggregation type\n * @param isAutoRefreshEnabled Auto-refresh enabled flag\n * @param refreshOption The refresh option ('live' or 'history')\n * @returns Query parameters object for interval-based context\n */\n private buildIntervalBasedQueryParams(\n interval: string,\n aggregation: string | null,\n isAutoRefreshEnabled: boolean,\n refreshOption: string\n ): Record<DateContextQueryParamNames, null | string | boolean> {\n return {\n dateContextInterval: interval,\n dateContextAggregation: aggregation,\n dateContextTo: null,\n dateContextFrom: null,\n globalContextAutoRefresh: isAutoRefreshEnabled,\n globalContextRefreshMode: refreshOption\n };\n }\n\n /**\n * Builds query parameters for date-range-based time context.\n * Clears interval parameter and sets date-specific ones.\n *\n * @param date Array containing [dateFrom, dateTo] strings or Date objects, or null\n * @param aggregation The aggregation type\n * @param isAutoRefreshEnabled Auto-refresh enabled flag\n * @param refreshOption The refresh option ('live' or 'history')\n * @returns Query parameters object for date-range-based context\n */\n private buildDateRangeBasedQueryParams(\n date: (string | Date)[] | null,\n aggregation: string | null,\n isAutoRefreshEnabled: boolean,\n refreshOption: string\n ): Record<DateContextQueryParamNames, null | string | boolean> {\n return {\n dateContextFrom: date && date[0] ? DateTimeContextUtil.toIso(date[0]) : null,\n dateContextTo: date && date[1] ? DateTimeContextUtil.toIso(date[1]) : null,\n dateContextAggregation: aggregation,\n dateContextInterval: null,\n globalContextAutoRefresh: isAutoRefreshEnabled,\n globalContextRefreshMode: refreshOption\n };\n }\n\n /**\n * Helper method to navigate with query parameters\n * Centralizes navigation logic for consistent handling across methods\n *\n * @param queryParams The query parameters to set\n * @param options Additional navigation options\n */\n private navigateWithQueryParams(\n queryParams: Record<string, any>,\n options: Partial<NavigationExtras> = {}\n ): void {\n // Get root route for navigation\n let rootRoute = this.activatedRoute;\n while (rootRoute.parent) {\n rootRoute = rootRoute.parent;\n }\n\n const currentParams = rootRoute.snapshot.queryParams;\n\n // Helper to normalize boolean-like values\n const normalize = (obj: Record<string, any>) =>\n Object.fromEntries(\n Object.entries(obj)\n .filter(([_, v]) => v !== undefined && v !== null && v !== '')\n .map(([k, v]) => [k, v === 'true' ? true : v === 'false' ? false : v])\n );\n\n const current = normalize(currentParams);\n const next = normalize(queryParams);\n\n const hasChanged = JSON.stringify(current) !== JSON.stringify(next);\n\n if (hasChanged) {\n const navigationExtras: NavigationExtras = {\n relativeTo: rootRoute,\n queryParams,\n ...options\n };\n\n this.router.navigate([], navigationExtras);\n }\n }\n\n /**\n * Parses and validates date context from query params described by date \"from\" and date \"to\".\n *\n * @returns Date context as tuple of date \"from\" and date \"to\", or null if date context is invalid.\n */\n private getDateContextFromQueryParams(): [string, string] | null {\n // Get params from root route\n let currentRoute = this.activatedRoute;\n while (currentRoute.parent) {\n currentRoute = currentRoute.parent;\n }\n const params = currentRoute.snapshot.queryParams;\n const dateContextFrom = params[DateContextQueryParamNames.DATE_CONTEXT_FROM];\n const dateContextTo = params[DateContextQueryParamNames.DATE_CONTEXT_TO];\n\n if (this.validationService.isValidDateRange(dateContextFrom, dateContextTo)) {\n return [dateContextFrom, dateContextTo];\n }\n return null;\n }\n\n /**\n * Maps query params object to proper type with validation.\n *\n * Transforms raw string query parameters into properly typed values,\n * filtering out invalid values and converting boolean strings.\n *\n * @param params Query parameters object with string values only.\n * @returns Query params object of proper type with validated values.\n */\n private processQueryParams(\n params: Record<DateContextQueryParamNames, string>\n ): InputDateContextQueryParams {\n // Use validation service to get validated values in one call\n const validated = this.validationService.validateParameters({\n interval: params.dateContextInterval,\n aggregation: params.dateContextAggregation,\n autoRefresh: params.globalContextAutoRefresh\n });\n\n return {\n ...params,\n dateContextInterval: validated.interval\n ? (params.dateContextInterval as Interval['id'])\n : null,\n dateContextAggregation: validated.aggregation\n ? (params.dateContextAggregation as aggregationType)\n : null,\n globalContextAutoRefresh: validated.autoRefresh\n };\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { aggregationType } from '@c8y/client';\nimport { C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';\nimport { AGGREGATION_ICONS, AGGREGATION_TEXTS } from '../../../models/aggregation.model';\n\n@Component({\n selector: 'c8y-aggregation-display',\n templateUrl: './aggregation-display.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [C8yTranslatePipe, IconDirective]\n})\nexport class AggregationDisplayComponent {\n readonly aggregation = input<aggregationType | null>(null);\n readonly AGGREGATION_ICONS = AGGREGATION_ICONS;\n readonly AGGREGATION_TEXTS = AGGREGATION_TEXTS;\n}\n","<div class=\"d-flex a-i-center l-h-tight form-control\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"aggregation() ? AGGREGATION_ICONS[aggregation()] : AGGREGATION_ICONS.undefined\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span class=\"text-10 l-h-1 text-muted\">\n {{ 'Aggregation' | translate }}\n </span>\n <span\n class=\"text-12 l-h-1 text-medium text-truncate\"\n data-cy=\"global-date-context--Aggregation-display-value\"\n >\n {{ AGGREGATION_TEXTS[aggregation()] | translate }}\n </span>\n </div>\n</div>\n","import { AsyncPipe } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n EventEmitter,\n forwardRef,\n HostListener,\n inject,\n Input,\n OnDestroy,\n Output,\n ViewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n C8yTranslatePipe,\n CountdownIntervalComponent,\n CountdownIntervalModule,\n IconDirective\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { BehaviorSubject } from 'rxjs';\nimport { filter, tap, withLatestFrom } from 'rxjs/operators';\nimport { GLOBAL_CONTEXT_DEFAULTS } from '../../../models';\n\n/**\n * Source of auto-refresh state change.\n */\nenum AutoRefreshChangeSource {\n /** External change from user interaction or form value changes */\n External = 'external',\n /** Internal change from tab visibility detection */\n Visibility = 'visibility'\n}\n\n/**\n * Auto-refresh toggle control with countdown timer.\n *\n * Displays a toggle button that enables/disables automatic refresh with a visual countdown\n * showing time until next refresh. Integrates with Angular forms via ControlValueAccessor.\n */\n@Component({\n selector: 'c8y-auto-refresh-control',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AutoRefreshControlComponent),\n multi: true\n }\n ],\n standalone: true,\n imports: [CountdownIntervalModule, C8yTranslatePipe, TooltipModule, IconDirective, AsyncPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './auto-refresh-control.component.html'\n})\nexport class AutoRefreshControlComponent implements AfterViewInit, OnDestroy, ControlValueAccessor {\n countdownIntervalConfig = {\n enforcePulseIcon: false\n };\n\n @Input() isAutoRefreshConnected = false;\n\n @Input()\n set autoRefreshSeconds(_value: number) {\n // Value hardcoded to 5000ms for now, as per requirements\n // It will be adjusted later when dynamic intervals are supported (based on the request execution time)\n this.autoRefreshSeconds$ = new BehaviorSubject<number>(\n GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL\n );\n\n // Always show pulse icon, never show countdown timer\n this.countdownIntervalConfig = {\n enforcePulseIcon: true\n };\n }\n\n @Input() disableCounter = false;\n\n readonly DISABLE_AUTO_REFRESH = gettext('Auto refresh enabled');\n readonly ENABLE_AUTO_REFRESH = gettext('Auto refresh paused');\n readonly DEFAULT_INTERVAL_VALUE = GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL;\n\n private countdownComponentReady$ = new BehaviorSubject<CountdownIntervalComponent | null>(null);\n private readonly loading$ = new BehaviorSubject<boolean>(false);\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n // Grace period handling for widgets without proper loading state\n private gracePeriodTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Track if auto-refresh was disabled by tab visibility (not user action)\n private disabledByTabVisibility = false;\n\n @Input() isEnabled: boolean;\n\n private _isLoading: boolean;\n\n @Input()\n set isLoading(value: boolean) {\n const wasLoading = this._isLoading;\n this._isLoading = value;\n\n // If loading started, cancel any pending grace period\n if (value && this.gracePeriodTimeout) {\n this.clearGracePeriod();\n }\n\n this.loading$.next(value);\n\n // Handle loading -> not loading transition\n if (wasLoading && !value && this.countdownIntervalComponent) {\n this.countdownIntervalComponent.reset();\n }\n }\n get isLoading(): boolean {\n return this._isLoading;\n }\n\n @ViewChild(CountdownIntervalComponent)\n countdownIntervalComponent: CountdownIntervalComponent;\n\n @Output() loadingChange = new EventEmitter<boolean>();\n\n @Output() refresh = new EventEmitter<void>();\n\n autoRefreshSeconds$: BehaviorSubject<number>;\n\n onChange: (value: boolean) => void;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onTouched = () => {};\n\n ngAfterViewInit() {\n this.countdownComponentReady$.next(this.countdownIntervalComponent);\n this.setUpOnCountdownEndedListener();\n this.setupLoadingHandler();\n this.syncCountdownState();\n }\n\n ngOnDestroy() {\n this.clearGracePeriod();\n }\n\n @HostListener('document:visibilitychange')\n onVisibilityChange(): void {\n if (document.hidden && this.isEnabled) {\n this.disabledByTabVisibility = true;\n this.setAutoRefreshEnabled(false, AutoRefreshChangeSource.Visibility);\n } else {\n if (this.disabledByTabVisibility) {\n this.setAutoRefreshEnabled(true, AutoRefreshChangeSource.Visibility);\n }\n }\n }\n\n toggleIntervalRefresh() {\n this.setAutoRefreshEnabled(!this.isEnabled, AutoRefreshChangeSource.External);\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n writeValue(showIntervalRefresh: boolean): void {\n this.isEnabled = showIntervalRefresh;\n\n // External state change always clears the flag\n // This ensures visibility doesn't re-enable after external disable\n this.disabledByTabVisibility = false;\n\n this.syncCountdownState();\n this.cdr.markForCheck();\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n resetCountdown() {\n this.clearGracePeriod();\n this.countdownIntervalComponent?.reset();\n }\n\n /**\n * Internal method to change auto-refresh state with proper flag management.\n * @param enabled - New enabled state\n * @param source - Source of the change (External or Visibility)\n */\n private setAutoRefreshEnabled(enabled: boolean, source: AutoRefreshChangeSource): void {\n this.isEnabled = enabled;\n\n if (enabled || source === AutoRefreshChangeSource.External) {\n this.disabledByTabVisibility = false;\n }\n\n if (source === AutoRefreshChangeSource.External) {\n this.onChange(this.isEnabled);\n }\n\n this.syncCountdownState();\n this.cdr.markForCheck();\n }\n\n private setupLoadingHandler() {\n this.loading$\n .pipe(\n withLatestFrom(this.countdownComponentReady$),\n filter(([_, component]) => component !== null),\n tap(([isLoading, component]) => {\n if (isLoading) {\n // Stop without showing \"0\" - keep the last countdown value visible\n component?.stop(false);\n }\n // Reset is now handled in the isLoading setter\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n }\n\n private setUpOnCountdownEndedListener() {\n this.countdownIntervalComponent?.countdownEnded\n .pipe(\n filter(() => this.isEnabled),\n tap(() => this.handleCountdownEnded()),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n }\n\n private handleCountdownEnded(): void {\n this.refresh.emit();\n\n // For widgets not connected to auto-refresh, implement grace period\n if (!this.isAutoRefreshConnected) {\n // Give widget 500ms to set loading state\n this.gracePeriodTimeout = setTimeout(() => {\n // If still no loading state, reset the countdown\n if (!this.isLoading) {\n this.resetCountdown();\n }\n this.gracePeriodTimeout = null;\n }, 500);\n }\n }\n\n private syncCountdownState(): void {\n if (!this.countdownIntervalComponent) return;\n\n if (this.isEnabled && !this.isLoading) {\n this.countdownIntervalComponent.start();\n } else if (!this.isEnabled) {\n this.countdownIntervalComponent.stop();\n }\n }\n\n private clearGracePeriod(): void {\n if (this.gracePeriodTimeout) {\n clearTimeout(this.gracePeriodTimeout);\n this.gracePeriodTimeout = null;\n }\n }\n}\n","@let autoRefreshTooltip = (isEnabled ? DISABLE_AUTO_REFRESH : ENABLE_AUTO_REFRESH) | translate;\n@let countdownInterval = (autoRefreshSeconds$ | async) ?? DEFAULT_INTERVAL_VALUE;\n\n<button\n [class.btn]=\"disableCounter\"\n [class.btn-link]=\"disableCounter\"\n [class.c8y-realtime]=\"disableCounter\"\n [class.toggle-countdown]=\"!disableCounter\"\n [attr.aria-label]=\"autoRefreshTooltip\"\n [tooltip]=\"tooltipTpl\"\n placement=\"bottom\"\n container=\"body\"\n [delay]=\"500\"\n (click)=\"toggleIntervalRefresh(); $event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n [disabled]=\"isLoading\"\n mode\n data-cy=\"global-date-context--Auto-refresh-toggle\"\n>\n <div class=\"d-flex a-i-center\">\n @if (!disableCounter) {\n <c8y-countdown-interval\n #countdown\n [hidden]=\"!isEnabled\"\n [countdownInterval]=\"countdownInterval\"\n [config]=\"countdownIntervalConfig\"\n ></c8y-countdown-interval>\n }\n\n @if (!isEnabled) {\n <i\n class=\"icon-20 text-primary\"\n [c8yIcon]=\"'pause-circle'\"\n data-cy=\"global-date-context--Auto-refresh-toggle-pause\"\n ></i>\n } @else if (disableCounter) {\n <span class=\"c8y-pulse m-0 active\"></span>\n }\n </div>\n</button>\n\n<ng-template #tooltipTpl>\n {{ autoRefreshTooltip }}\n</ng-template>\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { C8yTranslatePipe, DatePipe, IconDirective } from '@c8y/ngx-components';\nimport { REFRESH_OPTION } from '../../../models/auto-refresh.model';\nimport type { DateTimeContext } from '../../../models/date-time-context-picker.model';\nimport { INTERVAL_TITLES } from '../../../models/interval-picker.model';\n\n@Component({\n selector: 'c8y-time-range-display',\n templateUrl: './time-range-display.component.html',\n standalone: true,\n imports: [IconDirective, C8yTranslatePipe, DatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TimeRangeDisplayComponent {\n REFRESH_OPTION = REFRESH_OPTION;\n @Input() dateTimeContext: DateTimeContext;\n @Input() mode: 'from' | 'to' | 'default' = 'default';\n\n dateTo = new Date();\n\n readonly INTERVALS = INTERVAL_TITLES;\n readonly DATE_FORMAT = 'medium';\n}\n","@if (dateTimeContext) {\n <div class=\"d-flex a-i-center l-h-tight form-control\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'schedule1'\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-10 l-h-1 text-muted\"\n data-cy=\"global-date-context--Selected-interval\"\n >\n {{ INTERVALS[dateTimeContext.interval] | translate }}\n </span>\n\n @if (mode === 'from') {\n <span class=\"text-12 text-medium text-truncate\">\n {{ 'From`date`' | translate }} {{ dateTimeContext.dateFrom | c8yDate: DATE_FORMAT }}\n </span>\n }\n\n @if (mode === 'to') {\n <span class=\"text-12 l-h-1 text-medium text-truncate\">\n {{ 'To`date`' | translate }} {{ dateTimeContext.dateTo | c8yDate: DATE_FORMAT }}\n </span>\n }\n\n @if (mode === 'default') {\n <span\n class=\"text-12 l-h-1 text-medium text-truncate\"\n data-cy=\"global-date-context--Selected-time-range\"\n >\n {{ dateTimeContext.dateFrom | c8yDate: DATE_FORMAT }} —\n {{ dateTimeContext.dateTo | c8yDate: DATE_FORMAT }}\n </span>\n }\n </div>\n </div>\n}\n","import { AsyncPipe, TitleCasePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { C8yTranslatePipe, FormsModule } from '@c8y/ngx-components';\nimport { pick } from 'lodash-es';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport {\n BehaviorSubject,\n debounceTime,\n distinctUntilChanged,\n map,\n Observable,\n startWith\n} from 'rxjs';\nimport { AggregationDisplayComponent } from '../../features/aggregation/aggregation-display/aggregation-display.component';\nimport { AutoRefreshControlComponent } from '../../features/refresh/auto-refresh/auto-refresh-control.component';\nimport { TimeRangeDisplayComponent } from '../../features/time-context/time-range-display/time-range-display.component';\nimport { REFRESH_OPTION, RefreshOption } from '../../models/auto-refresh.model';\nimport { GlobalContextSettings, GlobalContextState } from '../../models/global-context.model';\nimport { GlobalContextFormService } from '../../services/state/global-context-form.service';\n\n/**\n * Context controls component for managing global context state and refresh options.\n *\n * Provides controls for time range, aggregation, and auto-refresh functionality\n * with reactive form handling and optimized change detection.\n *\n * @usageNotes\n *\n * ### Basic Usage\n * ```html\n * <c8y-context-controls\n * [settings]=\"globalSettings\"\n * [context]=\"currentContext\"\n * [isLoading]=\"loading\"\n * (contextChange)=\"handleContextChange($event)\"\n * (refresh)=\"handleRefresh()\"\n * (contextClick)=\"handleClick($event)\">\n * </c8y-context-controls>\n * ```\n *\n */\n@Component({\n selector: 'c8y-context-controls',\n standalone: true,\n templateUrl: './context-controls.component.html',\n imports: [\n C8yTranslatePipe,\n TooltipModule,\n CollapseModule,\n ReactiveFormsModule,\n FormsModule,\n PopoverModule,\n AutoRefreshControlComponent,\n TitleCasePipe,\n TimeRangeDisplayComponent,\n AggregationDisplayComponent,\n AsyncPipe\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ContextControlsComponent implements OnInit {\n // Static properties\n readonly REFRESH_OPTION = REFRESH_OPTION;\n\n // Inputs\n @Input() showDisplayModeLabel = false;\n @Input() isLoading = false;\n\n @Input()\n set settings(value: GlobalContextSettings) {\n this._settings.next(value);\n }\n get settings(): GlobalContextSettings {\n return this._settings.value;\n }\n\n @Input()\n set context(value: GlobalContextState) {\n this._context.next(value);\n }\n get context(): GlobalContextState {\n return this._context.value;\n }\n\n // Outputs\n @Output() contextChange = new EventEmitter<Partial<GlobalContextState>>();\n @Output() refresh = new EventEmitter<void>();\n @Output() contextClick = new EventEmitter<Event>();\n\n // Public properties\n form: ReturnType<(typeof this.globalContextFormService)['buildForm']>;\n isAnySettingEnabled = true;\n refreshOption: RefreshOption;\n isAutoRefreshConnected = false;\n\n // Private properties\n private readonly globalContextFormService = inject(GlobalContextFormService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly cd = inject(ChangeDetectorRef);\n private readonly _settings = new BehaviorSubject<GlobalContextSettings>(null);\n private readonly _context = new BehaviorSubject<GlobalContextState>(null);\n private readonly _isAnySettingsEnabled$ = new BehaviorSubject<boolean>(true);\n\n // Reactive state with optimized observables\n readonly isAnySettingsEnabled$: Observable<boolean> = this._isAnySettingsEnabled$.pipe(\n debounceTime(500),\n startWith(true),\n distinctUntilChanged()\n );\n\n // Lifecycle hooks\n ngOnInit(): void {\n this.initializeForm();\n this.setupContextSubscription();\n this.setupSettingsSubscription();\n this.setupFormValueChanges();\n }\n\n // Private methods\n private initializeForm(): void {\n this.form = this.globalContextFormService.buildForm(this.context, {});\n this.refreshOption = this.context?.refreshOption || REFRESH_OPTION.LIVE;\n }\n\n private setupContextSubscription(): void {\n this._context.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(context => {\n if (this.form && context) {\n this.form.patchValue(context, { emitEvent: false });\n }\n if (context && 'refreshOption' in context) {\n this.refreshOption = context.refreshOption;\n }\n });\n }\n\n private setupSettingsSubscription(): void {\n this._settings\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n map(settings => this.extractRelevantSettings(settings)),\n distinctUntilChanged()\n )\n .subscribe(settingsToCheck => {\n const hasEnabledSettings = Object.values(settingsToCheck).some(setting => setting);\n this._isAnySettingsEnabled$.next(hasEnabledSettings);\n this.isAutoRefreshConnected = settingsToCheck.showAutoRefresh;\n this.cd.markForCheck();\n });\n }\n\n private setupFormValueChanges(): void {\n this.form.valueChanges\n .pipe(startWith(this.form.value), takeUntilDestroyed(this.destroyRef), distinctUntilChanged())\n .subscribe(value => {\n this.contextChange.emit(value);\n });\n }\n\n private extractRelevantSettings(settings: GlobalContextSettings): {\n showTimeContext: boolean;\n showAggregation: boolean;\n showAutoRefresh: boolean;\n } {\n const requiredKeys: (keyof GlobalContextSettings)[] = [\n 'showTimeContext',\n 'showAggregation',\n 'showAutoRefresh'\n ];\n\n return pick(settings, requiredKeys);\n }\n}\n","@if (form) {\n @let SHOW_TIME_CONTEXT = settings.showTimeContext;\n @let SHOW_AGGREGATION = settings.showAggregation;\n @let SHOW_AUTO_REFRESH = settings.showAutoRefresh;\n @let refreshIntervalValue = form?.get('refreshInterval')?.value;\n @let isLiveMode = refreshOption === REFRESH_OPTION.LIVE;\n\n @if (isLiveMode) {\n <form\n class=\"input-group\"\n [formGroup]=\"form\"\n >\n <c8y-auto-refresh-control\n #autoRefreshControl\n [isLoading]=\"isLoading\"\n [isAutoRefreshConnected]=\"isAutoRefreshConnected\"\n formControlName=\"isAutoRefreshEnabled\"\n [autoRefreshSeconds]=\"refreshIntervalValue\"\n (refresh)=\"refresh.emit()\"\n ></c8y-auto-refresh-control>\n <button\n class=\"btn-clean d-flex p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n style=\"margin-left: -1px\"\n (click)=\"contextClick.emit($event); $event.stopPropagation()\"\n >\n <div class=\"d-col a-i-start form-control\">\n <p class=\"text-muted fit-w text-10 l-h-1\">\n {{ 'Time mode' | translate }}\n </p>\n <p\n class=\"text-bold text-12 fit-w l-h-1\"\n data-cy=\"global-time-context-controls--Display-mode\"\n >\n {{ refreshOption | translate | titlecase }}\n </p>\n </div>\n\n @let interval = form.get('dateTimeContext')?.value?.interval;\n @let isCustomInterval = interval === 'custom';\n\n <c8y-time-range-display\n style=\"margin-left: -1px\"\n [dateTimeContext]=\"form.get('dateTimeContext')?.value\"\n ></c8y-time-range-display>\n\n @if (!(isAnySettingsEnabled$ | async)) {\n <div\n class=\"d-col a-i-center form-control\"\n style=\"margin-left: -1px\"\n >\n <i\n class=\"dlt-c8y-icon-disconnected icon-20 text-danger\"\n [tooltip]=\"'No synced widgets' | translate\"\n placement=\"right\"\n container=\"body\"\n [delay]=\"500\"\n data-cy=\"global-time-context-controls--Widgets-disconnected\"\n ></i>\n </div>\n }\n </button>\n </form>\n } @else {\n <form [formGroup]=\"form\">\n <button\n class=\"btn-clean d-flex p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n (click)=\"contextClick.emit($event); $event.stopPropagation()\"\n >\n <div class=\"d-col a-i-center form-control\">\n <i class=\"dlt-c8y-icon-schedule1 icon-20 text-primary\"></i>\n </div>\n\n <div\n class=\"d-col a-i-start form-control\"\n style=\"margin-left: -1px\"\n >\n <p class=\"text-muted fit-w text-10 l-h-1\">\n {{ 'Time mode' | translate }}\n </p>\n <p\n class=\"text-bold text-12 fit-w l-h-1\"\n data-cy=\"global-time-context-controls--Display-mode\"\n >\n {{ refreshOption | translate | titlecase }}\n </p>\n </div>\n\n <c8y-time-range-display\n style=\"margin-left: -1px\"\n [dateTimeContext]=\"form.get('dateTimeContext')?.value\"\n ></c8y-time-range-display>\n <c8y-aggregation-display\n style=\"margin-left: -1px\"\n [aggregation]=\"form.get('aggregation')?.value\"\n ></c8y-aggregation-display>\n\n @if (!(isAnySettingsEnabled$ | async)) {\n <div\n class=\"d-col a-i-center form-control\"\n style=\"margin-left: -1px\"\n >\n <i\n class=\"dlt-c8y-icon-disconnected icon-20 text-danger\"\n [tooltip]=\"'No synced widgets' | translate\"\n placement=\"right\"\n container=\"body\"\n [delay]=\"500\"\n data-cy=\"global-time-context-controls--Widgets-disconnected\"\n ></i>\n </div>\n }\n </button>\n </form>\n }\n}\n","import { Location } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n inject,\n signal,\n ViewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport {\n ActivatedRoute,\n ActivationEnd,\n Navigation,\n NavigationEnd,\n NavigationStart,\n Router\n} from '@angular/router';\nimport { AlertService } from '@c8y/ngx-components';\nimport { ContextDashboardStateService } from '@c8y/ngx-components/context-dashboard-state';\nimport { isEqual, pick, some } from 'lodash-es';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport {\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n filter,\n firstValueFrom,\n fromEvent,\n map,\n shareReplay,\n startWith,\n tap\n} from 'rxjs';\n\nimport { ConfigurationCollapseComponent } from '../features/configuration/configuration-collapse/configuration-collapse.component';\nimport type { RefreshOption } from '../models/auto-refresh.model';\nimport { REFRESH_OPTION } from '../models/auto-refresh.model';\nimport {\n DashboardChildConfig,\n DashboardChildSlot,\n DashboardManagedObject\n} from '../models/dashboard-context.model';\nimport { GLOBAL_CONTEXT_DEFAULTS } from '../models/global-context-defaults';\nimport type { DateTimeContext } from '../models/date-time-context-picker.model';\nimport type { GlobalContextSettings, GlobalContextState } from '../models/global-context.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GLOBAL_CONTEXT_EVENTS,\n GLOBAL_CONTEXT_SOURCE\n} from '../models/global-context.model';\nimport { INTERVALS, TIME_INTERVAL } from '../models/interval-picker.model';\nimport { AggregationPickerService } from '../services/domain/aggregation-picker.service';\nimport { GlobalContextQueryService } from '../services/infrastructure/global-context-query.service';\nimport { GlobalContextEventService } from '../services/state/global-context-event.service';\nimport { GlobalContextFormService } from '../services/state/global-context-form.service';\nimport { GlobalContextService } from '../services/state/global-context.service';\nimport { ContextControlsComponent } from '../shared/context-controls/context-controls.component';\nimport { DateTimeContextUtil } from '../utils/date-time-context.util';\n\n/**\n * GlobalContextComponent\n *\n * This component manages the global context across the application.\n * It synchronizes state between:\n * - Form UI state (user interactions)\n * - URL parameters (for permalink support)\n * - Dashboard state (for dashboard-specific settings)\n *\n * Key lifecycle phases:\n * 1. Initial load: URL params > Dashboard defaults > Form defaults\n * 2. User interactions: Form > URL params + Dashboard state\n * 3. Dashboard switching: Consider dashboard defaults if no settings\n */\n@Component({\n standalone: true,\n imports: [\n ReactiveFormsModule,\n TooltipModule,\n ContextControlsComponent,\n ConfigurationCollapseComponent\n ],\n selector: 'c8y-global-context',\n templateUrl: './global-context.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class GlobalContextComponent implements AfterViewInit {\n // Service Dependencies\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n private readonly location = inject(Location);\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly alertService = inject(AlertService);\n private readonly cd = inject(ChangeDetectorRef);\n\n // Context Services\n readonly globalContextService = inject(GlobalContextService);\n readonly globalContextEventService = inject(GlobalContextEventService);\n private readonly globalContextFormService = inject(GlobalContextFormService);\n private readonly globalContextQueryService = inject(GlobalContextQueryService);\n private readonly aggregationPickerService = inject(AggregationPickerService);\n private readonly contextDashboardStateService = inject(ContextDashboardStateService, {\n optional: true\n }) as ContextDashboardStateService<GlobalContextState>;\n\n // Component State\n private blockUrlSync = true; // Start with blocking enabled to prevent early syncs\n private readonly navigationState$ = this.createNavigationStateStream();\n private initialUrlParams: Partial<GlobalContextState> | null = null;\n readonly intervals = INTERVALS;\n form!: ReturnType<typeof this.globalContextFormService.buildForm>;\n settings: GlobalContextSettings = this.globalContextService.getDefaultSettings();\n shouldSaveDashboardState = false;\n globalContextState = signal<GlobalContextState | null>(null);\n isVisible = signal<boolean>(false);\n\n @ViewChild(ConfigurationCollapseComponent, { static: false })\n configurationCollapseComponent!: ConfigurationCollapseComponent;\n\n constructor() {\n // Capture URL params immediately in constructor before anything can clear them\n const urlParams = this.globalContextQueryService.dateTimeContextFromQueryParams();\n if (urlParams && Object.keys(urlParams).length > 0) {\n this.initialUrlParams = urlParams;\n }\n // Keep blockUrlSync as true for all cases initially - will be unblocked after init\n }\n\n ngAfterViewInit() {\n this.initializeComponent();\n this.setupGlobalContextEvents();\n this.setupNavigationHandling();\n this.setupWidgetConfigListener();\n }\n\n onRefresh(): void {\n const currentState = this.getGlobalContextState();\n if (!currentState) return;\n\n if (this.isCustomInterval()) {\n this.handleCustomIntervalRefresh(currentState);\n } else {\n this.handleStandardIntervalRefresh();\n }\n }\n\n updateQueryParamsWithoutNavigation(\n queryParams: Record<string, string | number | boolean | null>\n ): void {\n const urlTree = this.router.createUrlTree([], {\n relativeTo: this.activatedRoute,\n queryParams: {\n ...this.activatedRoute.snapshot.queryParams,\n ...queryParams\n }\n });\n\n const url = this.router.serializeUrl(urlTree);\n this.location.replaceState(url);\n }\n\n onChanges(changes: GlobalContextState): void {\n // User has made a manual change - unblock URL sync\n if (this.blockUrlSync) {\n this.blockUrlSync = false;\n }\n\n const processedChanges = this.processStateChanges(changes);\n const stateToSave = this.extractSaveableState(processedChanges);\n const stateToEmit = structuredClone(processedChanges);\n\n this.patchGlobalContextState(stateToSave);\n this.broadcastStateChanges(stateToEmit);\n this.scheduleQueryParamSync();\n this.saveDashboardStateIfNeeded(stateToSave);\n }\n\n onRefreshOptionChanges(refreshOption: RefreshOption) {\n this.globalContextEventService.emit('GLOBAL_CONTEXT_REFRESH_OPTION_CHANGE', refreshOption);\n }\n\n getGlobalContextState(): GlobalContextState | null {\n return this.globalContextState();\n }\n\n updateGlobalContextState(globalContextState: GlobalContextState): void {\n const adjustedState = this.adjustGlobalState(globalContextState);\n\n // Remove non-persistent fields\n delete adjustedState.source;\n delete adjustedState.eventSourceId;\n\n this.patchGlobalContextState(adjustedState);\n }\n\n patchGlobalContextState(partialState: Partial<GlobalContextState>): boolean {\n const adjustedState = this.adjustGlobalState(partialState);\n const currentState = this.globalContextState();\n\n if (this.isStateUnchanged(currentState, adjustedState)) {\n return false;\n }\n\n this.globalContextState.set({ ...(currentState ?? {}), ...adjustedState });\n\n return true;\n }\n\n adjustGlobalState(globalContextState: GlobalContextState): Partial<GlobalContextState> {\n const gcCopy = structuredClone(globalContextState);\n\n const { dateTimeContext, aggregation } = gcCopy;\n\n // Adjust aggregation based on date range\n if ('aggregation' in gcCopy) {\n const { selectedAggregation } = this.aggregationPickerService.calculateAggregation(\n [new Date(dateTimeContext.dateFrom), new Date(dateTimeContext.dateTo)],\n aggregation\n );\n\n gcCopy.aggregation = selectedAggregation;\n }\n return gcCopy;\n }\n\n private setupWidgetConfigListener(): void {\n // Listen for dashboard save events to re-evaluate visibility\n this.contextDashboardStateService?.dashboardSaved\n .pipe(\n filter(Boolean),\n takeUntilDestroyed(this.destroyRef),\n tap(dashboard => {\n // Update visibility based on dashboard children\n const shouldShow = this.shouldShowGlobalContextForDashboard(dashboard);\n this.isVisible.set(shouldShow);\n })\n )\n ?.subscribe();\n }\n private createNavigationStateStream() {\n return this.router.events.pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(\n e =>\n e instanceof NavigationStart || e instanceof NavigationEnd || e instanceof ActivationEnd\n ),\n map(e => e instanceof NavigationStart),\n startWith(false),\n tap(isNavigationStart => {\n if (isNavigationStart) {\n this.configurationCollapseComponent?.close();\n }\n }),\n shareReplay(1)\n );\n }\n\n private setupNavigationHandling(): void {\n this.router.events\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(event => event instanceof NavigationEnd),\n filter(() => !this.isNavigationInProgress()),\n tap(() => this.handleNavigationEnd())\n )\n ?.subscribe();\n }\n\n private isNavigationInProgress(): boolean {\n // Prevent unnecessary data refetching during navigation.\n // Exception: allow events when navigation is user-triggered.\n // Without this, leaving dashboard triggers `GLOBAL_CONTEXT_EVENTS.STATE_CHANGE`,\n // causing unwanted widget data refetch.\n return (\n !!this.router.getCurrentNavigation() &&\n this.router.getCurrentNavigation().trigger !== 'popstate'\n );\n }\n\n private setupGlobalContextEvents(): void {\n this.setupContextHistoryEvents();\n this.setupContextLiveEvents();\n }\n\n private setupContextHistoryEvents(): void {\n fromEvent<CustomEvent>(window, GLOBAL_CONTEXT_EVENTS.UPDATE_GLOBAL_CONTEXT_HISTORY)\n .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(250))\n ?.subscribe(event => {\n const detail = event.detail;\n if (detail?.type === GLOBAL_CONTEXT_EVENTS.UPDATE_GLOBAL_CONTEXT_HISTORY) {\n detail.payload.refreshOption = REFRESH_OPTION.HISTORY;\n this.onChanges(detail.payload);\n }\n });\n }\n\n private setupContextLiveEvents(): void {\n fromEvent<CustomEvent>(window, GLOBAL_CONTEXT_EVENTS.UPDATE_GLOBAL_CONTEXT_LIVE)\n .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(250))\n ?.subscribe(event => {\n const detail = event.detail;\n if (detail?.type === GLOBAL_CONTEXT_EVENTS.UPDATE_GLOBAL_CONTEXT_LIVE) {\n detail.payload.refreshOption = REFRESH_OPTION.LIVE;\n this.onChanges(detail.payload);\n }\n });\n }\n\n private handleNavigationEnd(): void {\n this.applyUrlStateIfPresent();\n }\n\n private applyUrlStateIfPresent(): void {\n const queryParamsContext = this.globalContextQueryService.dateTimeContextFromQueryParams();\n\n if (queryParamsContext) {\n const isStateChanged = this.patchGlobalContextState(queryParamsContext);\n\n if (isStateChanged) {\n this.emitStateChange();\n }\n }\n }\n\n private handleCustomIntervalRefresh(state: GlobalContextState): void {\n const { dateTimeContext, refreshOption } = state;\n\n if (refreshOption === REFRESH_OPTION.LIVE) {\n this.refreshCustomLiveInterval(dateTimeContext);\n } else if (refreshOption === REFRESH_OPTION.HISTORY) {\n this.refreshCustomHistoryInterval(dateTimeContext);\n }\n }\n\n private refreshCustomLiveInterval(dateTimeContext: DateTimeContext): void {\n const updatedContext = DateTimeContextUtil.normalizeForLive(dateTimeContext);\n\n this.patchGlobalContextState({ dateTimeContext: updatedContext });\n\n const { dateTimeContext: currentContext } = this.getGlobalContextState();\n const fromIso =\n DateTimeContextUtil.toIso(currentContext.dateFrom) || DateTimeContextUtil.toIso(new Date());\n const toIso =\n DateTimeContextUtil.toIso(currentContext.dateTo) || DateTimeContextUtil.toIso(new Date());\n this.updateQueryParamsWithoutNavigation({\n dateContextFrom: fromIso,\n dateContextTo: toIso\n });\n\n this.globalContextEventService.emit(GLOBAL_CONTEXT_EVENTS.REFRESH, { ...currentContext });\n }\n\n private refreshCustomHistoryInterval(dateTimeContext: DateTimeContext): void {\n const normalizedContext = DateTimeContextUtil.normalizeForHistory(dateTimeContext);\n\n this.globalContextEventService.emit(GLOBAL_CONTEXT_EVENTS.REFRESH, normalizedContext);\n }\n\n private handleStandardIntervalRefresh(): void {\n this.updateDateTimeContext();\n const { dateTimeContext } = this.getGlobalContextState();\n this.globalContextEventService.emit(GLOBAL_CONTEXT_EVENTS.REFRESH, { ...dateTimeContext });\n this.globalContextEventService.syncRefreshToStateChange({ ...dateTimeContext });\n }\n\n private processStateChanges(changes: GlobalContextState): GlobalContextState {\n const processedChanges = { ...changes };\n\n if (this.shouldSetCustomDateTo(processedChanges.dateTimeContext)) {\n processedChanges.dateTimeContext.dateTo = DateTimeContextUtil.toIso(new Date());\n }\n\n return processedChanges;\n }\n\n private shouldSetCustomDateTo(dateTimeContext: DateTimeContext): boolean {\n return (\n dateTimeContext &&\n dateTimeContext.interval === TIME_INTERVAL.CUSTOM &&\n !dateTimeContext.dateTo\n );\n }\n\n private extractSaveableState(changes: GlobalContextState): Partial<GlobalContextState> {\n return pick(changes, [\n 'dateTimeContext',\n 'aggregation',\n 'isAutoRefreshEnabled',\n 'refreshInterval',\n 'refreshOption',\n 'displayMode'\n ]);\n }\n\n private broadcastStateChanges(stateToEmit: GlobalContextState): void {\n this.emitStateChange(stateToEmit);\n this.contextDashboardStateService?.updateGlobalState(structuredClone(stateToEmit));\n }\n\n private scheduleQueryParamSync(): void {\n queueMicrotask(() => this.syncFormStateToQueryParams());\n }\n\n private saveDashboardStateIfNeeded(stateToSave: Partial<GlobalContextState>): void {\n if (!this.shouldSaveDashboardState) return;\n\n try {\n this.contextDashboardStateService?.saveDashboardState(\n this.contextDashboardStateService.selected$.value,\n structuredClone(stateToSave)\n );\n } catch (error) {\n this.alertService.addServerFailure(error);\n }\n }\n\n private isStateUnchanged(\n currentState: GlobalContextState | null,\n newState: Partial<GlobalContextState>\n ): boolean {\n if (!currentState) return false;\n\n const keys = Object.keys(newState) as (keyof GlobalContextState)[];\n const currentStateSubset = pick(currentState, keys);\n return isEqual(currentStateSubset, newState);\n }\n\n private emitStateChange(state?: GlobalContextState): void {\n const stateToEmit = state ?? this.getGlobalContextState();\n\n if (!stateToEmit) {\n return;\n }\n\n this.globalContextEventService.emit(GLOBAL_CONTEXT_EVENTS.STATE_CHANGE, {\n source: GLOBAL_CONTEXT_SOURCE.DASHBOARD,\n eventSourceId: null,\n ...structuredClone(stateToEmit)\n });\n }\n\n private async initializeComponent(): Promise<void> {\n await this.initGlobalContextState();\n this.setupStateSubscriptions();\n\n // Unblock URL sync after initialization if no initial URL params\n if (!this.initialUrlParams) {\n this.blockUrlSync = false;\n }\n }\n\n private setupStateSubscriptions(): void {\n this.setupDashboardSubscription();\n this.emitStateChange();\n this.setupSettingsSubscription();\n }\n\n private async initGlobalContextState() {\n const initialState = await this.buildInitialState();\n\n this.updateGlobalContextState(initialState);\n }\n\n private async buildInitialState(): Promise<GlobalContextState> {\n // Get the selected dashboard (works for both dashboard and device routes)\n const selectedDashboard = await firstValueFrom(\n this.contextDashboardStateService?.selected$.pipe(filter(Boolean))\n );\n\n // Check if we're on a dashboard or device route\n const currentUrl = this.router.url;\n const isDashboardRoute = currentUrl?.includes('/dashboard/');\n const isDeviceRoute = currentUrl?.includes('/device/') && currentUrl?.includes('/device-info');\n\n // Determine visibility based on route type\n if (isDashboardRoute) {\n // Dashboard route - check children for displayMode\n const shouldShow = this.shouldShowGlobalContextForDashboard(selectedDashboard);\n this.isVisible.set(shouldShow);\n\n // Even if not visible, continue to build and return proper state\n // This ensures widgets can still get initial state via event service\n // Temporary solution, should be removed and isDeviceRoute check should be added to isDashboardRoute || isDeviceRoute\n // As for now dashboard children do not have proper configuration in the devicemanagement device-info dashboard\n } else if (isDeviceRoute) {\n const shouldShow = this.shouldShowGlobalContextForDashboard(selectedDashboard);\n this.isVisible.set(shouldShow ?? false);\n // Home dashboard\n } else if (selectedDashboard && this.shouldShowGlobalContextForDashboard(selectedDashboard)) {\n this.isVisible.set(true);\n }\n\n // Build state exactly like dashboard routes\n const globalContextDefaultState = this.globalContextService.getDefaultState();\n const dashboardGlobalContextState = selectedDashboard?.c8y_Dashboard?.dashboardState ?? {};\n const urlParams = this.initialUrlParams ?? {};\n const userInputQueryParams = { ...(this.globalContextQueryService.navigationPopState ?? {}) };\n\n this.globalContextQueryService.navigationPopState = null;\n\n let currentState: GlobalContextState = {\n ...globalContextDefaultState,\n ...dashboardGlobalContextState,\n ...urlParams,\n ...userInputQueryParams\n };\n\n // In live mode we always need to keep a valid date range (based on the interval)\n if (currentState.refreshOption === REFRESH_OPTION.LIVE) {\n const normalized =\n currentState?.dateTimeContext.interval === TIME_INTERVAL.CUSTOM\n ? DateTimeContextUtil.normalizeForLive(currentState.dateTimeContext)\n : (() => {\n const range = DateTimeContextUtil.dateRangeFromInterval(\n currentState.dateTimeContext?.interval\n );\n if (!range) return currentState.dateTimeContext;\n return DateTimeContextUtil.ensureIsoContext({\n interval: currentState.dateTimeContext.interval,\n dateFrom: range[0],\n dateTo: range[1]\n });\n })();\n\n currentState = {\n ...currentState,\n dateTimeContext: normalized\n };\n }\n\n // Always enforce the fixed 5s refresh interval\n // This ensures old dashboards with custom intervals stored in dashboardState are migrated\n currentState.refreshInterval = GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL;\n\n return currentState;\n }\n\n private setupDashboardSubscription(): void {\n this.contextDashboardStateService?.selected$\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n tap(() => this.globalContextService.resetSettings()),\n filter(Boolean),\n tap(() => this.handleDashboardNavigation())\n )\n ?.subscribe();\n }\n\n private handleDashboardNavigation(): void {\n const navigation = this.router.getCurrentNavigation();\n const queryParamsContext = this.globalContextQueryService.dateTimeContextFromQueryParams();\n\n if (this.isPopstateNavigation(navigation)) {\n this.handlePopstateNavigation(queryParamsContext);\n }\n }\n\n private isPopstateNavigation(navigation: Navigation | null): boolean {\n return navigation?.trigger === 'popstate';\n }\n\n private handlePopstateNavigation(queryParamsContext: Partial<GlobalContextState>): void {\n if (queryParamsContext) {\n this.patchGlobalContextState(queryParamsContext);\n\n this.globalContextQueryService.navigationPopState = { ...this.globalContextState() };\n\n this.syncFormStateToQueryParams();\n }\n }\n\n private setupSettingsSubscription(): void {\n combineLatest([this.globalContextService.getConsolidatedSettings(), this.navigationState$])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n tap(([settings]) => this.updateSettings(settings)),\n filter(([, navigationInProgress]) => !navigationInProgress),\n distinctUntilChanged((prev, curr) => isEqual(prev[0], curr[0]))\n )\n ?.subscribe(([settings]) => this.handleSettingsChange(settings));\n }\n\n private updateSettings(settings: GlobalContextSettings): void {\n this.settings = { ...settings };\n this.cd.markForCheck();\n }\n\n private handleSettingsChange(settings: GlobalContextSettings): void {\n const hasEnabledSettings = some(settings, Boolean);\n\n if (hasEnabledSettings) {\n this.syncFormStateToQueryParams();\n }\n }\n\n private syncFormStateToQueryParams(): void {\n // Block sync until initialization is complete AND user has interacted (if URL params exist)\n if (this.blockUrlSync) {\n return;\n }\n\n const currentState = this.getGlobalContextState();\n\n if (!currentState) return;\n\n const queryParams = this.buildQueryParamsFromState(currentState);\n\n this.globalContextQueryService.setDateContextQueryParams(queryParams);\n }\n\n private buildQueryParamsFromState(state: GlobalContextState) {\n const isAnyTrue = Object.values(this.settings).some(value => value === true);\n\n const queryParams = {\n interval: this.getIntervalForQuery(state),\n date: this.getDateRangeForQuery(state),\n aggregation: this.getAggregationForQuery(state),\n isAutoRefreshEnabled: this.getAutoRefreshForQuery(state),\n refreshOption: isAnyTrue ? state.refreshOption || REFRESH_OPTION.LIVE : null\n };\n\n return queryParams;\n }\n\n private getIntervalForQuery(state: GlobalContextState) {\n return this.settings.showTimeContext ? state.dateTimeContext?.interval || null : null;\n }\n\n private getDateRangeForQuery(state: GlobalContextState) {\n if (!this.settings.showTimeContext || !state.dateTimeContext) {\n return null;\n }\n return [state.dateTimeContext.dateFrom, state.dateTimeContext.dateTo];\n }\n\n private getAggregationForQuery(state: GlobalContextState) {\n // Live mode never has aggregation (business rule)\n if (state?.refreshOption === REFRESH_OPTION.LIVE) {\n return null;\n }\n // Include aggregation in URL if it has a value for History mode\n // This ensures aggregation is persisted in dashboard URLs\n return state?.aggregation || null;\n }\n\n private getAutoRefreshForQuery(state: GlobalContextState) {\n return this.settings.showAutoRefresh ? !!state.isAutoRefreshEnabled : null;\n }\n\n private isCustomInterval(): boolean {\n const state = this.getGlobalContextState();\n return state?.dateTimeContext?.interval === TIME_INTERVAL.CUSTOM;\n }\n\n private updateDateTimeContext(): void {\n const state = this.getGlobalContextState();\n const currentInterval = state?.dateTimeContext?.interval;\n\n if (!currentInterval) return;\n\n const range = DateTimeContextUtil.dateRangeFromInterval(currentInterval);\n if (!range) return;\n const [dateFrom, dateTo] = range;\n const ctx = DateTimeContextUtil.ensureIsoContext({\n interval: currentInterval,\n dateFrom,\n dateTo\n });\n this.patchGlobalContextState({ dateTimeContext: ctx });\n }\n\n /**\n * Checks if global context should be shown based on dashboard children configuration\n * NOTE: Using DashboardManagedObject instead of ContextDashboardManagedObject\n * to avoid circular dependency issues with the type imports.\n * @param dashboard - The dashboard object containing children\n * @returns true if any child has displayMode set to 'dashboard', false otherwise\n */\n private shouldShowGlobalContextForDashboard(\n dashboard: DashboardManagedObject | null | undefined\n ): boolean {\n // If no dashboard or no c8y_Dashboard property, show by default\n if (!dashboard?.c8y_Dashboard) {\n return true;\n }\n\n const children = dashboard.c8y_Dashboard.children;\n\n // If no children, don't show global context\n if (!children || typeof children !== 'object' || Object.keys(children).length === 0) {\n return false;\n }\n\n // Check if any child needs global context\n return Object.values(children).some((child: DashboardChildSlot | null | undefined) => {\n const config: DashboardChildConfig | null | undefined = child?.config;\n\n if (!config) {\n return false;\n }\n\n const {\n widgetInstanceGlobalAutoRefreshContext,\n widgetInstanceGlobalTimeContext,\n displayMode\n } = config;\n\n // Show global context if widget uses it in any way\n // - 'dashboard' mode: fully connected to global context\n if (displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n return true;\n }\n\n // For backwards compatibility: check legacy fields if displayMode is not set\n if (!displayMode) {\n const hasTimeContext = widgetInstanceGlobalTimeContext === true;\n const hasRefreshContext = widgetInstanceGlobalAutoRefreshContext === true;\n const timeExplicitlyFalse = widgetInstanceGlobalTimeContext === false;\n const refreshExplicitlyFalse = widgetInstanceGlobalAutoRefreshContext === false;\n\n // Hide when contexts are incompatible: one is true and the other is explicitly false\n const hasIncompatibleConfiguration =\n (hasTimeContext && refreshExplicitlyFalse) || (hasRefreshContext && timeExplicitlyFalse);\n\n if (hasIncompatibleConfiguration) {\n return false;\n }\n\n // Show if at least one context is explicitly true\n return hasTimeContext || hasRefreshContext;\n }\n\n return false;\n });\n }\n}\n","@if (globalContextState() !== null && isVisible()) {\n <c8y-context-controls\n [settings]=\"settings\"\n [context]=\"globalContextState()\"\n [isLoading]=\"globalContextService.isLoading()\"\n (refresh)=\"onRefresh()\"\n (contextChange)=\"onChanges($event)\"\n (contextClick)=\"gcs.toggle()\"\n ></c8y-context-controls>\n\n <c8y-configuration-collapse\n #gcs\n [context]=\"globalContextState()\"\n (contextChange)=\"onChanges($event)\"\n (refreshOptionChange)=\"onRefreshOptionChanges($event)\"\n (savePreferenceChange)=\"shouldSaveDashboardState = $event\"\n ></c8y-configuration-collapse>\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { ActionBarFactory, ActionBarItem, ContextRouteService } from '@c8y/ngx-components';\nimport { GlobalContextComponent } from '../../core/global-context.component';\nimport { GlobalContextQueryService } from './global-context-query.service';\n\n/**\n * Constants defining the supported route paths for global context integration.\n */\nexport const ROUTE_PATHS = {\n /** Home route path identifier */\n HOME: 'home',\n /** Dashboard route path identifier */\n DASHBOARD: 'dashboard',\n /** General route path identifier */\n GENERAL: 'general',\n /** Device info route path identifier */\n DEVICE: 'device-info'\n} as const;\n\n/**\n * Type definition for supported route path values.\n */\nexport type RoutePath = (typeof ROUTE_PATHS)[keyof typeof ROUTE_PATHS];\n\n/**\n * Interface defining the structure of a global context instance.\n * Contains both the ActionBar configuration and metadata about the current route context.\n */\nexport interface GlobalContextInstance {\n /** ActionBar item configuration for rendering the global context component */\n readonly actionBarItem: ActionBarItem;\n /** Source route path that created this instance */\n readonly source: RoutePath | null;\n /** Unique identifier for the source (e.g., dashboard ID) */\n readonly sourceId: string | null;\n}\n\n/**\n * Default global context instance configuration.\n */\nconst DEFAULT_INSTANCE: GlobalContextInstance = {\n actionBarItem: {\n component: GlobalContextComponent,\n placement: 'left'\n },\n source: null,\n sourceId: null\n} as const;\n\n/**\n * GlobalContextNavigationService manages the integration of global context functionality\n * with Angular's routing system and the Cumulocity ActionBar.\n *\n * This service implements the ActionBarFactory interface to provide context-aware\n * global context components in different route contexts (home, dashboard, general).\n * It handles route transitions, manages query parameter cleanup, and maintains\n * instance state across navigation.\n *\n * Key responsibilities:\n * - Determine when and where to show global context components\n * - Manage global context instances across different routes\n * - Handle query parameter cleanup during navigation\n * - Provide ActionBar integration for the global context component\n *\n * @example\n * ```typescript\n * // Service is automatically used by ActionBar system\n * // Get current instance\n * const instance = navigationService.getInstance();\n * console.log(instance.source); // 'home' | 'dashboard' | null\n *\n * // Manual instance management (rarely needed)\n * navigationService.setInstance({\n * actionBarItem: { component: GlobalContextComponent, placement: 'left' },\n * source: 'dashboard',\n * sourceId: 'my-dashboard-id'\n * });\n * ```\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class GlobalContextNavigationService implements ActionBarFactory {\n /** Service for managing global context query parameters */\n private readonly globalContextQueryService = inject(GlobalContextQueryService);\n\n /** Service for accessing route context data */\n private readonly contextRoute = inject(ContextRouteService);\n\n /** Angular router for navigation state access */\n private readonly router = inject(Router);\n\n /** Signal storing the current global context instance configuration */\n private readonly instance = signal<GlobalContextInstance>({\n ...DEFAULT_INSTANCE,\n source: ROUTE_PATHS.HOME\n });\n\n /**\n * Determines the appropriate ActionBarItem based on the current route context.\n *\n * This is the main entry point called by the ActionBar system to determine\n * if and how the global context component should be displayed for a given route.\n *\n * Route handling logic:\n * - Home routes: Always show global context\n * - Dashboard routes: Show if valid dashboard ID exists\n * - Device routes: Show if valid device ID exists\n * - General routes: Hide global context\n * - Other routes: Show only if context data is available\n *\n * @param activeRoute - The currently active Angular route\n * @returns ActionBarItem configuration or null if global context should not be shown\n *\n * @example\n * ```typescript\n * // Called automatically by ActionBar system\n * const actionBarItem = navigationService.get(activatedRoute);\n * if (actionBarItem) {\n * // Global context will be shown in ActionBar\n * }\n * ```\n */\n get(activeRoute: ActivatedRoute): ActionBarItem | null {\n const contextData = this.contextRoute.getContextData(activeRoute);\n const currentPath = this.extractCurrentPath(activeRoute);\n\n // Handle home route - always show global context\n if (this.isHomePath(currentPath)) {\n return this.handleHome();\n }\n\n // Handle general route - never show global context\n if (this.isGeneralPath(currentPath)) {\n this.resetInstance();\n return null;\n }\n\n // Handle dashboard route - show if valid dashboard context\n if (this.isDashboardRoute(activeRoute)) {\n return this.handleDashboard(activeRoute);\n }\n\n if (this.isDevicePath(currentPath)) {\n return this.handleDevice(activeRoute);\n }\n\n // For other routes, check if we have context data\n if (!contextData) {\n return null;\n }\n\n // Check if we need to clean up from previous contexts\n const current = this.getInstance();\n\n // Clean up if we were on a dashboard and now we're not\n if (current.source === ROUTE_PATHS.DASHBOARD) {\n this.handleQueryParamCleanup(true);\n this.resetInstance();\n return null;\n }\n\n // Check if we're on a device sub-route (has device ID but not device-info)\n const deviceId = this.extractDeviceId(activeRoute);\n if (deviceId) {\n // We're on a device route, but not device-info\n // Check if we need to clean up from a previous device-info view\n if (current.source === ROUTE_PATHS.DEVICE) {\n this.handleQueryParamCleanup(true);\n this.resetInstance();\n }\n return null;\n }\n\n // Default: don't show global context for unknown routes\n return null;\n }\n\n /**\n * Retrieves the current global context instance configuration.\n *\n * The instance contains both the ActionBar configuration and metadata\n * about the current route context that created this instance.\n *\n * @returns Current GlobalContextInstance with ActionBar config and route metadata\n *\n * @example\n * ```typescript\n * const instance = navigationService.getInstance();\n * console.log(instance.source); // 'home', 'dashboard', or null\n * console.log(instance.sourceId); // dashboard ID if applicable\n *\n * // Use ActionBar configuration\n * const actionBarItem = instance.actionBarItem;\n * ```\n */\n getInstance(): GlobalContextInstance {\n return this.instance();\n }\n\n /**\n * Sets a new global context instance configuration.\n *\n * This method allows manual control over the global context instance,\n * though it's typically managed automatically by the route handlers.\n * Passing null will reset the instance to default configuration.\n *\n * @param instance - New instance configuration or null to reset to defaults\n *\n * @example\n * ```typescript\n * // Set custom instance\n * navigationService.setInstance({\n * actionBarItem: {\n * component: GlobalContextComponent,\n * placement: 'right'\n * },\n * source: 'dashboard',\n * sourceId: 'custom-dashboard'\n * });\n *\n * // Reset to defaults\n * navigationService.setInstance(null);\n * ```\n */\n setInstance(instance: GlobalContextInstance | null): void {\n if (instance === null) {\n this.resetInstance();\n } else {\n this.instance.set(instance);\n }\n }\n\n /**\n * Handles navigation to home routes.\n *\n * Home routes always display the global context component.\n * Updates the instance if the source has changed.\n *\n * @returns ActionBarItem configuration for home context\n */\n private handleHome(): ActionBarItem {\n const current = this.getInstance();\n\n // Only update instance if source has changed\n if (current.source !== ROUTE_PATHS.HOME) {\n const homeInstance: GlobalContextInstance = {\n actionBarItem: {\n component: GlobalContextComponent,\n placement: 'left'\n },\n source: ROUTE_PATHS.HOME,\n sourceId: null\n };\n\n this.instance.set(homeInstance);\n }\n\n return this.getInstance().actionBarItem;\n }\n\n /**\n * Handles navigation to dashboard routes.\n *\n * Dashboard routes display global context only if a valid dashboard ID exists.\n * Manages query parameter cleanup during dashboard transitions.\n *\n * @param activeRoute - The active route containing dashboard parameters\n * @returns ActionBarItem configuration for dashboard context or null if invalid\n */\n private handleDashboard(activeRoute: ActivatedRoute): ActionBarItem | null {\n const dashboardId = this.extractDashboardId(activeRoute);\n\n if (!dashboardId) {\n return null;\n }\n\n const current = this.getInstance();\n\n // Return existing instance if same dashboard\n if (current.source === ROUTE_PATHS.DASHBOARD && current.sourceId === dashboardId) {\n return current.actionBarItem;\n }\n\n // We're changing contexts if coming from a different dashboard\n const isChangingContext =\n current.source === ROUTE_PATHS.DASHBOARD && current.sourceId !== dashboardId;\n this.handleQueryParamCleanup(isChangingContext);\n\n // Create new dashboard instance\n const dashboardInstance: GlobalContextInstance = {\n actionBarItem: {\n component: GlobalContextComponent,\n placement: 'left'\n },\n source: ROUTE_PATHS.DASHBOARD,\n sourceId: dashboardId\n };\n\n this.instance.set(dashboardInstance);\n return this.getInstance().actionBarItem;\n }\n\n private handleDevice(activeRoute: ActivatedRoute): ActionBarItem | null {\n const deviceId = this.extractDeviceId(activeRoute);\n\n if (!deviceId) {\n return null;\n }\n\n const current = this.getInstance();\n\n // Return existing instance if same device\n if (current.source === ROUTE_PATHS.DEVICE && current.sourceId === deviceId) {\n return current.actionBarItem;\n }\n\n // We're changing contexts if coming from a different device\n const isChangingContext =\n current.source === ROUTE_PATHS.DEVICE && current.sourceId !== deviceId;\n this.handleQueryParamCleanup(isChangingContext);\n\n // Create new device instance\n const deviceInstance: GlobalContextInstance = {\n actionBarItem: {\n component: GlobalContextComponent,\n placement: 'left'\n },\n source: ROUTE_PATHS.DEVICE,\n sourceId: deviceId\n };\n\n this.instance.set(deviceInstance);\n return this.getInstance().actionBarItem;\n }\n\n /**\n * Extracts the current path from an activated route.\n *\n * @param activeRoute - The route to extract path from\n * @returns The first URL segment path or undefined\n */\n private extractCurrentPath(activeRoute: ActivatedRoute): string | undefined {\n return activeRoute?.snapshot?.url?.[0]?.path;\n }\n\n /**\n * Extracts dashboard ID from route parameters.\n *\n * @param activeRoute - The route containing dashboard parameters\n * @returns Dashboard ID or undefined if not present\n */\n private extractDashboardId(activeRoute: ActivatedRoute): string | undefined {\n const dashboardId = activeRoute?.snapshot?.params?.['dashboardId'];\n return dashboardId && typeof dashboardId === 'string' ? dashboardId : undefined;\n }\n\n /**\n * Extracts device ID from route parameters.\n *\n * @param activeRoute - The route containing device parameters\n * @returns Device ID or undefined if not present\n */\n private extractDeviceId(activeRoute: ActivatedRoute): string | undefined {\n let currentRoute: ActivatedRoute | null = activeRoute;\n while (currentRoute) {\n const deviceId = currentRoute.snapshot.params['id'];\n if (deviceId && typeof deviceId === 'string') {\n return deviceId;\n }\n currentRoute = currentRoute.parent;\n }\n return undefined;\n }\n\n /**\n * Checks if the current path is a home route.\n *\n * @param path - Path to check\n * @returns True if path is home route\n */\n private isHomePath(path: string | undefined): boolean {\n return path === ROUTE_PATHS.HOME;\n }\n\n /**\n * Checks if the current path is a dashboard route.\n * Handles both direct dashboard routes and nested dashboard routes (e.g., group dashboards)\n *\n * @param activeRoute - The active route to check\n * @returns True if this is a dashboard route\n */\n private isDashboardRoute(activeRoute: ActivatedRoute): boolean {\n try {\n // Check if any segment in the URL path is 'dashboard'\n const urlSegments = activeRoute?.snapshot?.url || [];\n const hasDashboardSegment = urlSegments.some(\n segment => segment.path === ROUTE_PATHS.DASHBOARD\n );\n\n // Also check if we have a dashboardId parameter (for nested routes)\n const hasDashboardId = !!activeRoute?.snapshot?.params?.['dashboardId'];\n\n return hasDashboardSegment || hasDashboardId;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Checks if the current path is a dashboard route.\n *\n * @param path - Path to check\n * @returns True if path is dashboard route\n */\n private isDashboardPath(path: string | undefined): boolean {\n return path === ROUTE_PATHS.DASHBOARD;\n }\n\n private isDevicePath(path: string | undefined): boolean {\n return path === ROUTE_PATHS.DEVICE;\n }\n\n /**\n * Checks if the current path is a general route.\n *\n * @param path - Path to check\n * @returns True if path is general route\n */\n private isGeneralPath(path: string | undefined): boolean {\n return path === ROUTE_PATHS.GENERAL;\n }\n\n /**\n * Handles query parameter cleanup during navigation.\n *\n * Cleans up global context query parameters when:\n * 1. Explicitly requested via navigation state\n * 2. Actually changing contexts (different dashboard/device)\n */\n private handleQueryParamCleanup(isChangingContext = false): void {\n const navigation = this.router.getCurrentNavigation();\n\n // Clear params when explicitly requested OR when changing contexts\n const shouldClearParams =\n navigation?.extras?.state?.clearParams === true || (navigation !== null && isChangingContext);\n\n if (shouldClearParams) {\n this.globalContextQueryService.checkAndRemoveDateContextParams();\n }\n }\n\n /**\n * Resets the instance to default configuration.\n */\n private resetInstance(): void {\n this.instance.set({ ...DEFAULT_INSTANCE });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output,\n signal\n} from '@angular/core';\nimport { C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { TranslateService } from '@ngx-translate/core';\n\nimport type { LinkControlConfig, LinkControlInfo } from './inline-context.models';\n\n/**\n * Component to display and manage link controls for global context items\n */\n@Component({\n selector: 'c8y-global-context-link-controls',\n standalone: true,\n imports: [IconDirective, TooltipModule, C8yTranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\n `\n .btn-icon-dot[disabled] {\n cursor: not-allowed;\n opacity: 0.75;\n }\n\n .btn-icon-dot.link-auto-unlinked,\n .btn-icon-dot.link-auto-unlinked:focus {\n box-shadow: 0 0 0 2px var(--c8y-palette-status-danger);\n border-color: var(--c8y-palette-status-danger);\n }\n `\n ],\n template: `\n @if (showLinks()) {\n <button\n class=\"btn-icon-dot-set\"\n [class.active]=\"someControlsLinked()\"\n [attr.aria-label]=\"'Global context sync controls' | translate\"\n [tooltip]=\"masterTooltipTemplate\"\n delay=\"500\"\n container=\"body\"\n (click)=\"toggleAll()\"\n data-cy=\"global-context-link--all\"\n >\n <span class=\"btn-icon-dot__item default\" [class.active]=\"allControlsLinked()\">\n <i [c8yIcon]=\"someControlsLinked() ? 'link' : 'unlink'\"></i>\n </span>\n <!-- Individual Link icons -->\n @for (control of visibleControls(); track control.key) {\n <span\n [class]=\"control.cssClass + ' btn-icon-dot__item'\"\n [class.active]=\"control.isLinked\"\n [class.link-disabled]=\"control.disabled\"\n [class.link-auto-unlinked]=\"control.autoUnlinked\"\n [attr.data-cy]=\"'global-context-link--' + control.key\"\n >\n <i [c8yIcon]=\"control.icon\"></i>\n </span>\n }\n </button>\n <ng-template #masterTooltipTemplate>{{ masterTooltipText() | translate }}</ng-template>\n }\n `\n})\nexport class GlobalContextLinkControlsComponent implements OnInit {\n // Single output event - all controls toggle together (v2 pattern)\n @Output() allLinksToggled = new EventEmitter<boolean>();\n\n private translateService: TranslateService = inject(TranslateService);\n private _linkStates: { [key: string]: boolean } = {};\n private linkStatesSignal = signal<{ [key: string]: boolean }>({});\n private controlConfigsSignal = signal<Record<string, LinkControlConfig>>({});\n\n showLinks = computed<boolean>(() => {\n const linkStates = this.linkStatesSignal();\n return Object.keys(linkStates).length > 0;\n });\n\n visibleControls = computed<LinkControlInfo[]>(() => {\n const linkStates = this.linkStatesSignal();\n const controlConfigs = this.controlConfigsSignal();\n\n return Object.entries(linkStates)\n .filter(([key]) => controlConfigs[key])\n .map(([key, isLinked]) => ({\n key,\n isLinked,\n cssClass: (controlConfigs[key]?.cssClass || 'default').trim(),\n icon: controlConfigs[key]?.icon || '',\n disabled: !!controlConfigs[key]?.disabled,\n disabledTooltip: controlConfigs[key]?.disabledTooltip,\n autoUnlinked: !!controlConfigs[key]?.autoUnlinked\n }));\n });\n\n allControlsLinked = computed<boolean>(() => {\n const controls = this.visibleControls();\n return controls.length > 0 && controls.every(control => control.isLinked);\n });\n\n someControlsLinked = computed<boolean>(() => {\n const controls = this.visibleControls();\n return controls.length > 0 && controls.some(control => control.isLinked);\n });\n\n masterTooltipText = computed<string>(() => {\n const controls = this.visibleControls();\n const linkedControls = controls.filter(control => control.isLinked);\n const controlConfigs = this.controlConfigsSignal();\n const clickToToggleLabel = this.translateService.instant(gettext('(click to toggle)'));\n\n if (linkedControls.length === 0) {\n const usingWidgetCustomTimeSettingsLabel = this.translateService.instant(\n gettext('Using widget custom time settings')\n );\n return `${usingWidgetCustomTimeSettingsLabel}\\n${clickToToggleLabel}`;\n }\n\n const linkedNames = linkedControls.map(control => {\n const config = controlConfigs[control.key];\n return this.translateService.instant(config?.label);\n });\n\n const formatter = new Intl.ListFormat(\n this.translateService.getCurrentLang()?.replace('_', '-'),\n { type: 'conjunction' }\n );\n const linkedNamesList = formatter.format(linkedNames);\n const linkedToDashboardLabel = this.translateService.instant(gettext('Synced to dashboard:'));\n return `${linkedToDashboardLabel}\\n${linkedNamesList}\\n${clickToToggleLabel}`;\n });\n\n @Input()\n set linkStates(value: { [key: string]: boolean }) {\n this._linkStates = value || {};\n this.linkStatesSignal.set(this._linkStates);\n }\n get linkStates(): { [key: string]: boolean } {\n return this._linkStates;\n }\n\n @Input()\n set controlConfigs(value: Record<string, LinkControlConfig>) {\n this.controlConfigsSignal.set(value || {});\n }\n\n ngOnInit(): void {\n this.linkStatesSignal.set(this._linkStates);\n }\n\n toggleAll(): void {\n const newLinkState = !this.allControlsLinked();\n const updatedLinkStates = { ...this._linkStates };\n const config = this.controlConfigsSignal();\n\n // Update only controls that are part of the current configuration\n for (const key of Object.keys(config)) {\n if (key in updatedLinkStates && !config[key]?.disabled) {\n updatedLinkStates[key] = newLinkState;\n }\n }\n this._linkStates = updatedLinkStates;\n this.linkStatesSignal.set(this._linkStates);\n this.allLinksToggled.emit(newLinkState);\n }\n}\n","import { aggregationType } from '@c8y/client';\nimport {\n LINK_BTNS_CONFIG,\n type ControlConfigsMap,\n type LinkStatesMap,\n type LinkToggleEvent\n} from '../../models/control-flow.model';\nimport type {\n GlobalContextSettings,\n GlobalContextState,\n WidgetState,\n WidgetStateHandlerResult\n} from '../../models/global-context.model';\nimport type { LinkHelpersContext } from './inline-context.models';\n\nexport function handleLinkToggle(\n ctx: LinkHelpersContext,\n event: LinkToggleEvent,\n options?: { suppressEmit?: boolean; fromHandler?: boolean }\n): boolean {\n const sources = ctx.getFieldSources();\n if (!options?.fromHandler) {\n resetHandlerOverrides(ctx);\n }\n\n if (event.isLinked && event.key === 'aggregation' && sources.dateTimeContext === 'local') {\n const localDateTimeContext = ctx.getLocalState().dateTimeContext;\n const validation = ctx.orchestrator.validateAggregationLink({\n globalAggregation: ctx.getGlobalState().aggregation,\n localDateTimeContext,\n calculateValidAggregation: (_dateRange, target) => ({\n selectedAggregation: ctx.orchestrator.calculateAggregation(\n localDateTimeContext,\n target as aggregationType | null\n )\n })\n });\n\n if (!validation.canLink) {\n ctx.updateAggregationValue(validation.nextAggregation ?? null);\n return false;\n }\n }\n\n const outcome = ctx.orchestrator.toggleLink({\n key: event.key,\n isLinked: event.isLinked,\n fieldSources: sources\n });\n\n applyLocalStateToForm(ctx, outcome.snapshotKeys);\n\n if (outcome.recalcLocalAggregation) {\n ctx.recalcLocalAggregation();\n }\n\n if (outcome.recalcGlobalAggregation) {\n ctx.recalcGlobalAggregation();\n }\n\n if (!options?.suppressEmit) {\n ctx.emitBasedOnFieldSources();\n if (outcome.shouldEmitRefresh) {\n ctx.emitRefresh(null);\n }\n }\n\n if (outcome.clearLocalKeys.length) {\n outcome.clearLocalKeys.forEach(key => applyGlobalValueToForm(ctx, key));\n }\n\n syncWithEffectiveConfig(ctx, outcome.snapshotKeys);\n\n return outcome.shouldEmitRefresh;\n}\n\nexport function toggleAllLinks(\n ctx: LinkHelpersContext,\n args: {\n keys: Array<keyof LinkStatesMap>;\n isLinked: boolean;\n suppressRefresh: boolean;\n suppressEmit: boolean;\n }\n): void {\n resetHandlerOverrides(ctx);\n let supportedLinks: Array<keyof LinkStatesMap> = [...args.keys];\n\n if (!supportedLinks.length) {\n return;\n }\n\n const currentSources = ctx.getFieldSources();\n\n if (args.isLinked && supportedLinks.includes('aggregation')) {\n const dateTimeWillStayLocal =\n currentSources.dateTimeContext === 'local' && !supportedLinks.includes('dateTimeContext');\n\n if (dateTimeWillStayLocal) {\n const localDateTimeContext = ctx.getLocalState().dateTimeContext;\n const validation = ctx.orchestrator.validateAggregationLink({\n globalAggregation: ctx.getGlobalState().aggregation,\n localDateTimeContext,\n calculateValidAggregation: (_dateRange, target) => ({\n selectedAggregation: ctx.orchestrator.calculateAggregation(\n localDateTimeContext,\n target as aggregationType | null\n )\n })\n });\n\n if (!validation.canLink) {\n supportedLinks = supportedLinks.filter(link => link !== 'aggregation');\n ctx.updateAggregationValue(validation.nextAggregation ?? null);\n }\n }\n }\n\n if (!supportedLinks.length) {\n return;\n }\n\n const outcome = ctx.orchestrator.toggleAllLinks({\n keys: supportedLinks,\n isLinked: args.isLinked,\n fieldSources: currentSources\n });\n\n if (outcome.clearLocalKeys.length) {\n outcome.clearLocalKeys.forEach(key => applyGlobalValueToForm(ctx, key));\n }\n\n if (outcome.snapshotKeys.length) {\n applyLocalStateToForm(ctx, outcome.snapshotKeys);\n }\n\n if (outcome.recalcLocalAggregation) {\n ctx.recalcLocalAggregation();\n }\n\n if (outcome.recalcGlobalAggregation) {\n ctx.recalcGlobalAggregation();\n }\n\n // Only emit configuration updates if not suppressed\n if (!args.suppressEmit) {\n ctx.emitBasedOnFieldSources();\n }\n\n // Only emit refresh if not suppressed (when unlinking, data is already loaded)\n if (outcome.shouldEmitRefresh && !args.suppressRefresh) {\n ctx.emitRefresh(null);\n }\n\n syncWithEffectiveConfig(ctx, outcome.snapshotKeys);\n}\n\nexport function applyConfigOverride(\n ctx: LinkHelpersContext,\n config: Partial<GlobalContextState>\n): void {\n const fieldsToUpdate = [\n 'isAutoRefreshEnabled',\n 'refreshInterval',\n 'refreshOption',\n 'dateTimeContext',\n 'aggregation'\n ] as const;\n\n fieldsToUpdate.forEach(field => {\n if (config[field] !== undefined) {\n updateFormAndLocalState(ctx, field, config[field]);\n }\n });\n}\n\nexport function buildWidgetState(\n ctx: LinkHelpersContext,\n configOverride?: GlobalContextState | null\n): WidgetState {\n const config = configOverride ?? ctx.getEffectiveConfig();\n return {\n config,\n inlineControlSettings: ctx.inlineSettings(),\n dashboardControlSettings: ctx.dashboardControlSettings(),\n currentLinks: ctx.controlLinkStatus(),\n displayMode: config?.displayMode\n };\n}\n\nexport function applyHandlerResult(\n ctx: LinkHelpersContext,\n result: WidgetStateHandlerResult\n): boolean {\n let shouldEmitRefresh = false;\n\n if (result.inlineControlSettings) {\n ctx.setInlineOverrides(structuredClone(result.inlineControlSettings));\n }\n\n if (result.dashboardControlSettings) {\n ctx.setDashboardOverrides(structuredClone(result.dashboardControlSettings));\n }\n\n if (result.links) {\n shouldEmitRefresh = processLinkUpdates(ctx, result.links, { suppressEmit: true });\n }\n\n if (result.options) {\n processOptions(ctx, result.options);\n }\n\n return shouldEmitRefresh;\n}\n\nexport function processLinkUpdates(\n ctx: LinkHelpersContext,\n links: Partial<LinkStatesMap>,\n options?: { suppressEmit?: boolean }\n): boolean {\n let shouldEmitRefresh = false;\n\n Object.entries(links).forEach(([key, isLinked]) => {\n const linkKey = key as LinkToggleEvent['key'];\n const refreshRequested = handleLinkToggle(\n ctx,\n { key: linkKey, isLinked: !!isLinked },\n { suppressEmit: true, fromHandler: true }\n );\n\n shouldEmitRefresh = shouldEmitRefresh || refreshRequested;\n });\n\n if (!options?.suppressEmit) {\n ctx.emitBasedOnFieldSources();\n if (shouldEmitRefresh) {\n ctx.emitRefresh(null);\n }\n }\n\n return shouldEmitRefresh;\n}\n\nexport function processOptions(ctx: LinkHelpersContext, options: Record<string, unknown>): void {\n if (options.noAutoRefreshCounter !== undefined) {\n ctx.setShouldDisableCounter(!!options.noAutoRefreshCounter);\n }\n}\n\nexport function resetHandlerOverrides(ctx: LinkHelpersContext): void {\n if (Object.keys(ctx.inlineOverrides()).length) {\n ctx.setInlineOverrides({});\n }\n if (Object.keys(ctx.dashboardOverrides()).length) {\n ctx.setDashboardOverrides({});\n }\n}\n\nexport function buildControlLinkConfig(\n ctx: LinkHelpersContext,\n settings: Partial<GlobalContextSettings>,\n linkStates: LinkStatesMap | null\n): { controlConfig: ControlConfigsMap; filteredStates: LinkStatesMap } {\n const config: ControlConfigsMap = {};\n const filteredStates: LinkStatesMap = {};\n const disableReasons = ctx.orchestrator.getLinkDisableReasons();\n const aggregationReason = ctx.orchestrator.getAggregationUnlinkReason();\n const isAggregationAutoUnlinked =\n aggregationReason?.source === 'validation' && aggregationReason.canAutoRecover;\n\n const desiredKeys = new Set<keyof LinkStatesMap>();\n\n if (settings.showTimeContext) {\n desiredKeys.add('dateTimeContext');\n }\n if (settings.showAggregation) {\n desiredKeys.add('aggregation');\n }\n if (settings.showAutoRefresh) {\n desiredKeys.add('isAutoRefreshEnabled');\n }\n\n if (linkStates) {\n Object.keys(linkStates).forEach(key => {\n desiredKeys.add(key as keyof LinkStatesMap);\n });\n }\n\n const BASE_ORDER: Array<keyof LinkStatesMap> = [\n 'dateTimeContext',\n 'aggregation',\n 'isAutoRefreshEnabled'\n ];\n\n const orderedKeys = [\n ...BASE_ORDER.filter(key => desiredKeys.has(key)),\n ...Array.from(desiredKeys)\n .filter(key => !BASE_ORDER.includes(key))\n .sort()\n ];\n\n orderedKeys.forEach(key => {\n const baseConfig = LINK_BTNS_CONFIG[key];\n if (baseConfig) {\n const disableReason = disableReasons?.[key as keyof GlobalContextState];\n const baseCssClass = (baseConfig.cssClass ?? '').trim();\n const baseAutoUnlinked =\n key === 'aggregation'\n ? isAggregationAutoUnlinked\n : (baseConfig as { autoUnlinked?: boolean }).autoUnlinked;\n config[key] = {\n ...baseConfig,\n cssClass: baseCssClass || 'default',\n disabled: !!disableReason,\n disabledTooltip: disableReason ?? baseConfig.label,\n ...(baseAutoUnlinked !== undefined ? { autoUnlinked: baseAutoUnlinked } : {})\n };\n filteredStates[key] = linkStates?.[key] ?? false;\n }\n });\n\n return { controlConfig: config, filteredStates };\n}\n\nfunction updateFormAndLocalState<T extends keyof GlobalContextState>(\n ctx: LinkHelpersContext,\n field: T,\n value: GlobalContextState[T]\n): void {\n const control = ctx.form()?.get(field as string);\n if (control) {\n control.setValue(value, { emitEvent: false });\n }\n ctx.updateLocalState(state => ({ ...state, [field]: value }));\n}\n\nfunction applyGlobalValueToForm(ctx: LinkHelpersContext, key: keyof GlobalContextState): void {\n const control = ctx.form()?.get(key as string);\n if (!control) {\n return;\n }\n\n const globalState = ctx.getGlobalState();\n const configState = ctx.getInitialConfig();\n const globalStateValue = globalState[key];\n const configValue = configState ? configState[key] : undefined;\n let valueToApply = globalStateValue !== undefined ? globalStateValue : configValue;\n\n if (key === 'aggregation') {\n valueToApply = ctx.orchestrator.deriveAggregationValue(ctx.getEffectiveConfig());\n }\n\n control.setValue(valueToApply ?? null, { emitEvent: false });\n\n if (key === 'isAutoRefreshEnabled') {\n const refreshIntervalControl = ctx.form()?.get('refreshInterval');\n const refreshOptionControl = ctx.form()?.get('refreshOption');\n const refreshIntervalValue =\n ctx.getGlobalState().refreshInterval ?? ctx.getInitialConfig()?.refreshInterval ?? null;\n const refreshOptionValue =\n ctx.getGlobalState().refreshOption ?? ctx.getInitialConfig()?.refreshOption ?? null;\n\n refreshIntervalControl?.setValue(refreshIntervalValue, { emitEvent: false });\n refreshOptionControl?.setValue(refreshOptionValue, { emitEvent: false });\n }\n}\n\nfunction updateFormField(\n ctx: LinkHelpersContext,\n key: keyof GlobalContextState,\n value: GlobalContextState[keyof GlobalContextState] | null | undefined\n): void {\n const control = ctx.form()?.get(key as string);\n if (control) {\n const nextValue = value === undefined ? null : structuredClone(value);\n control.setValue(nextValue as unknown, { emitEvent: false });\n }\n}\n\nfunction syncWithEffectiveConfig(\n ctx: LinkHelpersContext,\n keys: Array<keyof GlobalContextState>\n): void {\n if (!keys.length) {\n return;\n }\n\n const latest = ctx.getEffectiveConfig();\n\n keys.forEach(key => {\n if (latest[key] === undefined) {\n return;\n }\n\n const value = structuredClone(latest[key]) as GlobalContextState[keyof GlobalContextState];\n ctx.updateLocalState(current => ({ ...current, [key]: value }));\n updateFormField(ctx, key, value);\n });\n}\n\nfunction applyLocalStateToForm(\n ctx: LinkHelpersContext,\n keys: Array<keyof GlobalContextState>\n): void {\n if (!keys.length) {\n return;\n }\n\n const localState = ctx.getLocalState();\n\n keys.forEach(key => {\n if (Object.prototype.hasOwnProperty.call(localState, key)) {\n const value = localState[key];\n updateFormField(ctx, key, value ?? null);\n }\n });\n}\n","import { GLOBAL_CONTEXT_DEFAULTS } from '../../../models/global-context-defaults';\nimport type { GlobalContextState } from '../../../models/global-context.model';\n\nexport const FIELD_SOURCE_LOCAL = 'local' as const;\nexport const FIELD_SOURCE_GLOBAL = 'global' as const;\nexport type FieldSource = typeof FIELD_SOURCE_LOCAL | typeof FIELD_SOURCE_GLOBAL;\n\nexport type FieldSourcesMap = Partial<Record<keyof GlobalContextState, FieldSource>>;\n\nexport interface EffectiveConfigContext {\n baseConfig: GlobalContextState | null | undefined;\n localState: Partial<GlobalContextState>;\n globalState: Partial<GlobalContextState>;\n fieldSources: FieldSourcesMap;\n}\n\nconst CORE_GLOBAL_CONTEXT_FIELDS: Array<keyof GlobalContextState> = [\n 'dateTimeContext',\n 'aggregation',\n 'isAutoRefreshEnabled',\n 'refreshInterval',\n 'refreshOption',\n 'source'\n];\n\nexport function composeEffectiveConfig(context: EffectiveConfigContext): GlobalContextState {\n const baseConfiguration: Partial<GlobalContextState> = structuredClone(context.baseConfig ?? {});\n const configuration: Partial<\n Record<keyof GlobalContextState, GlobalContextState[keyof GlobalContextState]>\n > = { ...baseConfiguration };\n\n CORE_GLOBAL_CONTEXT_FIELDS.forEach(key => {\n const resolvedValue = resolveConfigurationValue(\n key,\n context.fieldSources,\n context.localState,\n context.globalState,\n baseConfiguration\n );\n if (resolvedValue === undefined) {\n delete configuration[key];\n } else {\n configuration[key] = resolvedValue;\n }\n });\n\n Object.entries(context.globalState).forEach(([key, value]) => {\n const isStandardKey = CORE_GLOBAL_CONTEXT_FIELDS.includes(key as keyof GlobalContextState);\n if (!isStandardKey && value !== undefined) {\n (configuration as Record<string, unknown>)[key] = structuredClone(value);\n }\n });\n\n return configuration as GlobalContextState;\n}\n\nfunction resolveConfigurationValue<K extends keyof GlobalContextState>(\n key: K,\n sources: FieldSourcesMap,\n localStateValues: Partial<GlobalContextState>,\n globalStateValues: Partial<GlobalContextState>,\n baseConfiguration: Partial<GlobalContextState>\n): GlobalContextState[K] | undefined {\n const localValue = localStateValues[key];\n const globalValue = globalStateValues[key];\n const baseValue = baseConfiguration[key];\n\n if (sources[key] === FIELD_SOURCE_LOCAL && localValue !== undefined) {\n return safeCloneValue(localValue);\n }\n\n if (sources[key] === FIELD_SOURCE_GLOBAL && globalValue !== undefined) {\n return safeCloneValue(globalValue);\n }\n\n if (baseValue !== undefined) {\n return safeCloneValue(baseValue);\n }\n\n switch (key) {\n case 'isAutoRefreshEnabled':\n return GLOBAL_CONTEXT_DEFAULTS.IS_AUTO_REFRESH_ENABLED as GlobalContextState[K];\n case 'refreshOption':\n return GLOBAL_CONTEXT_DEFAULTS.REFRESH_OPTION as GlobalContextState[K];\n case 'refreshInterval':\n return GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL as GlobalContextState[K];\n case 'aggregation':\n return GLOBAL_CONTEXT_DEFAULTS.AGGREGATION as GlobalContextState[K];\n case 'displayMode':\n return GLOBAL_CONTEXT_DEFAULTS.DISPLAY_MODE as GlobalContextState[K];\n case 'dateTimeContext':\n return undefined;\n case 'source':\n return undefined;\n case 'eventSourceId':\n return undefined;\n case 'isGlobalContextReady':\n return undefined;\n default: {\n // Exhaustive check: ensures all keys are handled at compile time\n const _exhaustive: never = key;\n return undefined;\n }\n }\n}\n\nfunction safeCloneValue<T>(value: T): T {\n return typeof value === 'object' && value !== null ? structuredClone(value) : value;\n}\n","import { aggregationType } from '@c8y/client';\nimport type { DateTimeContext } from '../../models/date-time-context-picker.model';\nimport type { GlobalContextState } from '../../models/global-context.model';\nimport type { TimeInterval } from '../../models/interval-picker.model';\nimport { TIME_INTERVAL } from '../../models/interval-picker.model';\nimport { DateTimeContextUtil } from '../../utils/date-time-context.util';\nimport type { RefreshHelpersContext } from './inline-context.models';\nimport { FIELD_SOURCE_GLOBAL, FIELD_SOURCE_LOCAL } from './orchestrator/config-composer.util';\nimport type { RefreshResult } from './orchestrator/global-context-inline-orchestrator.service';\nimport type { AggregationChangeInstruction } from './orchestrator/shared-mode-orchestrator.types';\n\nexport function recalculateAggregationForLocalDateTime(ctx: RefreshHelpersContext): void {\n const localDateTimeContext = ctx.getLocalState().dateTimeContext;\n const currentAggregation = ctx.form()?.get('aggregation')?.value as aggregationType | null;\n\n if (!localDateTimeContext) {\n return;\n }\n\n const adjustment = ctx.orchestrator.adjustAggregationForDateTime({\n dateTimeContext: localDateTimeContext,\n aggregation: currentAggregation\n });\n\n if (adjustment.changed) {\n updateAggregationValue(ctx, adjustment.nextAggregation);\n }\n}\n\nexport function recalculateAggregationForGlobalDateTime(ctx: RefreshHelpersContext): void {\n const globalDateTimeContext =\n ctx.getGlobalState().dateTimeContext ?? ctx.getInitialConfig()?.dateTimeContext;\n const currentAggregation = ctx.form()?.get('aggregation')?.value as aggregationType | null;\n\n if (!globalDateTimeContext) {\n return;\n }\n\n const adjustment = ctx.orchestrator.adjustAggregationForDateTime({\n dateTimeContext: globalDateTimeContext,\n aggregation: currentAggregation\n });\n\n if (adjustment.changed) {\n updateAggregationValue(ctx, adjustment.nextAggregation);\n }\n}\n\nexport function handleGlobalRefresh(\n ctx: RefreshHelpersContext,\n globalDateTimeContext: DateTimeContext\n): void {\n const sources = ctx.getFieldSources();\n\n ctx.updateGlobalState(current => ({\n ...current,\n dateTimeContext: structuredClone(globalDateTimeContext)\n }));\n\n // If auto-refresh is unlinked (manual mode), don't auto-emit on global refresh\n // Linked fields like dateTime will still sync via syncLocalEntriesWithGlobal()\n if (sources.isAutoRefreshEnabled === FIELD_SOURCE_LOCAL) {\n return;\n }\n\n processRefreshEvent(ctx, { globalDateTimeContext });\n}\n\nexport function processRefreshEvent(\n ctx: RefreshHelpersContext,\n params: { globalDateTimeContext?: DateTimeContext | null }\n): RefreshResult {\n const outcome = ctx.orchestrator.processRefresh({\n globalDateTimeContext: params.globalDateTimeContext,\n generateFreshDateTime: interval => generateFreshDateTimeContext(interval)\n });\n\n applyRefreshOutcome(ctx, outcome);\n\n return outcome;\n}\n\nexport function applyRefreshOutcome(ctx: RefreshHelpersContext, outcome: RefreshResult): void {\n if (outcome.updatedLocalDateTime) {\n const next = structuredClone(outcome.updatedLocalDateTime);\n updateLocalDateTimeContext(ctx, next);\n updateFormDateTimeContext(ctx, next);\n } else if (outcome.refreshPayload) {\n const baseContext = ctx.getEffectiveConfig().dateTimeContext ?? {\n dateFrom: undefined,\n dateTo: undefined,\n interval: TIME_INTERVAL.CUSTOM\n };\n const next = structuredClone(baseContext);\n Object.assign(next, outcome.refreshPayload);\n updateFormDateTimeContext(ctx, next);\n }\n\n ctx.emitBasedOnFieldSources();\n\n if (outcome.shouldEmitRefresh) {\n ctx.emitRefresh(outcome.refreshPayload ?? null);\n }\n}\n\nexport function getShouldDisableIntervalConfig(\n ctx: RefreshHelpersContext\n): Record<string, boolean> {\n const sources = ctx.getFieldSources();\n return sources.dateTimeContext === FIELD_SOURCE_GLOBAL ? { custom: true } : {};\n}\n\nexport function deriveDisabledAggregations(\n ctx: RefreshHelpersContext\n): Partial<Record<aggregationType, boolean>> {\n const configuration = ctx.getEffectiveConfig();\n const dateTimeContext = configuration?.dateTimeContext;\n\n if (!dateTimeContext) {\n return {};\n }\n\n return calculateDisabledAggregationsFromContext(ctx, dateTimeContext);\n}\n\nexport function calculateDisabledAggregationsFromContext(\n ctx: RefreshHelpersContext,\n dateTimeContext: DateTimeContext\n): Partial<Record<aggregationType, boolean>> {\n if (hasValidDateRange(dateTimeContext)) {\n return calculateFromDateRange(ctx, dateTimeContext);\n }\n\n if (hasValidInterval(dateTimeContext)) {\n return calculateFromInterval(ctx, dateTimeContext.interval!);\n }\n\n return {};\n}\n\nfunction calculateFromDateRange(\n ctx: RefreshHelpersContext,\n dateTimeContext: DateTimeContext\n): Partial<Record<aggregationType, boolean>> {\n try {\n const dateRange = createDateRange(dateTimeContext);\n return ctx.aggregationValidationService.getDisabledAggregations(dateRange);\n } catch (error) {\n return {};\n }\n}\n\nfunction calculateFromInterval(\n ctx: RefreshHelpersContext,\n interval: TimeInterval | string\n): Partial<Record<aggregationType, boolean>> {\n const range = DateTimeContextUtil.dateRangeFromInterval(interval as TimeInterval);\n if (!range) {\n return {};\n }\n\n try {\n return ctx.aggregationValidationService.getDisabledAggregations(range);\n } catch (error) {\n return {};\n }\n}\n\nfunction hasValidInterval(dateTimeContext: DateTimeContext): boolean {\n return !!dateTimeContext.interval && dateTimeContext.interval !== TIME_INTERVAL.CUSTOM;\n}\n\nfunction createDateRange(dateTimeContext: DateTimeContext): [Date, Date] {\n return [new Date(dateTimeContext.dateFrom), new Date(dateTimeContext.dateTo)];\n}\n\nfunction hasValidDateRange(dateTimeContext: DateTimeContext | null): boolean {\n return !!dateTimeContext?.dateFrom && !!dateTimeContext?.dateTo;\n}\n\nexport function generateFreshDateTimeContext(interval: TimeInterval): DateTimeContext {\n const range = DateTimeContextUtil.dateRangeFromInterval(interval);\n if (!range) {\n const now = new Date();\n return DateTimeContextUtil.ensureIsoContext({ interval, dateFrom: now, dateTo: now });\n }\n return DateTimeContextUtil.ensureIsoContext({ interval, dateFrom: range[0], dateTo: range[1] });\n}\n\nexport function patchFormValues(\n ctx: RefreshHelpersContext,\n formUpdates: Partial<GlobalContextState>\n): void {\n const form = ctx.form();\n if (!form || !Object.keys(formUpdates).length) {\n return;\n }\n\n form.patchValue(formUpdates, { emitEvent: false });\n}\n\nexport function updateAggregationValue(\n ctx: RefreshHelpersContext,\n aggregation: aggregationType | null\n): void {\n ctx.form()?.get('aggregation')?.setValue(aggregation, { emitEvent: false });\n ctx.updateLocalState(current => ({\n ...current,\n aggregation\n }));\n}\n\nexport function applyLocalAggregationChange(\n ctx: RefreshHelpersContext,\n change: AggregationChangeInstruction\n): void {\n updateAggregationValue(ctx, change.nextAggregation ?? null);\n}\n\nfunction updateLocalDateTimeContext(ctx: RefreshHelpersContext, newContext: DateTimeContext): void {\n ctx.updateLocalState(current => ({ ...current, dateTimeContext: newContext }));\n}\n\nfunction updateFormDateTimeContext(ctx: RefreshHelpersContext, newContext: DateTimeContext): void {\n ctx.form()?.get('dateTimeContext')?.setValue(newContext, { emitEvent: false });\n}\n","import type { aggregationType } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport type { DateTimeContext } from '../../../models/date-time-context-picker.model';\nimport type { GlobalContextState } from '../../../models/global-context.model';\nimport {\n FIELD_SOURCE_GLOBAL,\n FIELD_SOURCE_LOCAL,\n type FieldSourcesMap\n} from './config-composer.util';\nimport type { AggregationChangeInstruction } from './shared-mode-orchestrator.types';\nimport type { AggregationValidationResult } from './validation.util';\n\nexport const AGGREGATION_SYNC_FAILED = gettext('Cannot sync aggregation with dashboard');\n\nexport interface AggregationAdjustmentFn {\n (params: {\n dateTimeContext: DateTimeContext | null | undefined;\n aggregation: aggregationType | null | undefined;\n }): { nextAggregation: aggregationType | null; changed: boolean };\n}\n\nexport interface ResolveAggregationChangeForFormParams {\n formValue: Partial<GlobalContextState>;\n sources: FieldSourcesMap;\n globalAggregation: aggregationType | null | undefined;\n currentAggregation: aggregationType | null | undefined;\n adjustAggregationForDateTime: AggregationAdjustmentFn;\n updateFieldSources: (updater: (current: FieldSourcesMap) => FieldSourcesMap) => void;\n}\n\nexport function resolveAggregationChangeForForm(\n params: ResolveAggregationChangeForFormParams\n): AggregationChangeInstruction | null {\n const { formValue, sources } = params;\n const dateTimeContext = formValue.dateTimeContext;\n\n if (!dateTimeContext) {\n return null;\n }\n\n if (\n sources.dateTimeContext === FIELD_SOURCE_LOCAL &&\n sources.aggregation === FIELD_SOURCE_GLOBAL\n ) {\n if (params.globalAggregation === undefined) {\n return null;\n }\n\n const adjustment = params.adjustAggregationForDateTime({\n dateTimeContext,\n aggregation: params.globalAggregation ?? null\n });\n\n if (!adjustment.changed) {\n return null;\n }\n\n params.updateFieldSources(current => ({\n ...current,\n aggregation: FIELD_SOURCE_LOCAL\n }));\n\n return {\n nextAggregation: adjustment.nextAggregation,\n alertMessage: AGGREGATION_SYNC_FAILED\n };\n }\n\n const adjustment = params.adjustAggregationForDateTime({\n dateTimeContext,\n aggregation: params.currentAggregation ?? null\n });\n\n if (!adjustment.changed) {\n return null;\n }\n\n return {\n nextAggregation: adjustment.nextAggregation\n };\n}\n\nexport interface ResolveAutoUnlinkParams {\n globalAggregation: aggregationType | null | undefined;\n localDateTimeContext: DateTimeContext | null | undefined;\n adjustAggregationForDateTime: AggregationAdjustmentFn;\n updateFieldSources: (updater: (current: FieldSourcesMap) => FieldSourcesMap) => void;\n}\n\nexport function resolveAutoUnlinkAggregationChange(\n params: ResolveAutoUnlinkParams\n): AggregationChangeInstruction | null {\n if (params.globalAggregation === undefined) {\n return null;\n }\n\n const context = params.localDateTimeContext;\n\n if (!context?.dateFrom || !context?.dateTo) {\n params.updateFieldSources(current => ({\n ...current,\n aggregation: FIELD_SOURCE_LOCAL\n }));\n\n return {\n nextAggregation: null,\n alertMessage: AGGREGATION_SYNC_FAILED\n };\n }\n\n const adjustment = params.adjustAggregationForDateTime({\n dateTimeContext: context,\n aggregation: params.globalAggregation ?? null\n });\n\n if (!adjustment.changed) {\n return null;\n }\n\n params.updateFieldSources(current => ({\n ...current,\n aggregation: FIELD_SOURCE_LOCAL\n }));\n\n return {\n nextAggregation: adjustment.nextAggregation,\n alertMessage: AGGREGATION_SYNC_FAILED\n };\n}\n\nexport interface ApplyAggregationForGlobalStateParams {\n incomingState: Partial<GlobalContextState>;\n sources: FieldSourcesMap;\n formUpdates: Partial<GlobalContextState>;\n adjustAggregationForDateTime: AggregationAdjustmentFn;\n localAggregationSnapshot: aggregationType | null;\n globalAggregationSnapshot: aggregationType | null;\n applyLocalAggregationChange: (change: AggregationChangeInstruction) => void;\n}\n\nexport function applyAggregationChangesForGlobalState(\n params: ApplyAggregationForGlobalStateParams\n): boolean {\n const { incomingState, sources, formUpdates } = params;\n const dateTimeContext = formUpdates.dateTimeContext ?? incomingState.dateTimeContext;\n\n if (!dateTimeContext) {\n return false;\n }\n\n const aggregationTarget =\n sources.aggregation === FIELD_SOURCE_LOCAL\n ? params.localAggregationSnapshot\n : (incomingState.aggregation ?? params.globalAggregationSnapshot);\n\n const adjustment = params.adjustAggregationForDateTime({\n dateTimeContext,\n aggregation: aggregationTarget ?? null\n });\n\n if (!adjustment.changed) {\n return false;\n }\n\n if (sources.aggregation === FIELD_SOURCE_LOCAL) {\n params.applyLocalAggregationChange({ nextAggregation: adjustment.nextAggregation });\n } else {\n formUpdates.aggregation = adjustment.nextAggregation;\n }\n\n return true;\n}\n\nexport interface AggregationValidationDeps {\n sources?: FieldSourcesMap;\n localDateTimeContext: DateTimeContext | null | undefined;\n globalAggregation: aggregationType | null | undefined;\n validateAggregationLink: (context: {\n globalAggregation: aggregationType | null | undefined;\n localDateTimeContext?: DateTimeContext | null;\n calculateValidAggregation: (\n range: [Date, Date],\n target: aggregationType | null\n ) => { selectedAggregation: aggregationType | null };\n }) => AggregationValidationResult;\n calculateAggregation: (\n dateTimeContext: DateTimeContext | null | undefined,\n target: aggregationType | null | undefined\n ) => aggregationType | null;\n}\n\nexport interface AggregationValidationOutcome {\n isValid: boolean;\n message?: string;\n}\n\nexport function evaluateAggregationValidation(\n deps: AggregationValidationDeps\n): AggregationValidationOutcome | null {\n const sources = deps.sources;\n\n if (!sources || sources.aggregation !== FIELD_SOURCE_LOCAL) {\n return null;\n }\n\n if (sources.dateTimeContext !== FIELD_SOURCE_LOCAL) {\n return { isValid: true };\n }\n\n const linkResult = deps.validateAggregationLink({\n globalAggregation: deps.globalAggregation,\n localDateTimeContext: deps.localDateTimeContext,\n calculateValidAggregation: (_range, target) => ({\n selectedAggregation: deps.calculateAggregation(\n deps.localDateTimeContext,\n (target ?? null) as aggregationType | null\n )\n })\n });\n\n if (linkResult.canLink) {\n return { isValid: true };\n }\n\n return {\n isValid: false,\n message: AGGREGATION_SYNC_FAILED\n };\n}\n","import { REFRESH_OPTION } from '../../../models/auto-refresh.model';\nimport type { GlobalContextState } from '../../../models/global-context.model';\nimport { TIME_INTERVAL } from '../../../models/interval-picker.model';\nimport {\n FIELD_SOURCE_GLOBAL,\n FIELD_SOURCE_LOCAL,\n type FieldSourcesMap\n} from './config-composer.util';\nimport type {\n AggregationChangeInstruction,\n ExecuteHandlerContext,\n HandleFormChangeContext,\n HandleGlobalStateChangeContext\n} from './shared-mode-orchestrator.types';\n\nexport interface FormChangeDependencies {\n resolveAggregationChangeForForm: (params: {\n formValue: Partial<GlobalContextState>;\n sources: FieldSourcesMap;\n }) => AggregationChangeInstruction | null;\n setAggregationValidationState: (isValid: boolean, message?: string | null) => void;\n computeEffectiveConfig: () => GlobalContextState;\n updateAggregationDisableReason: () => void;\n}\n\nfunction assignClonedValue<K extends keyof GlobalContextState>(\n target: Partial<GlobalContextState>,\n key: K,\n value: GlobalContextState[K]\n): void {\n target[key] = structuredClone(value);\n}\n\nexport function handleFormChange(\n context: HandleFormChangeContext,\n deps: FormChangeDependencies\n): void {\n const {\n formValue,\n getFieldSources,\n applyFormChangesToLocalState,\n shouldValidateAggregation,\n applyLocalAggregationChange,\n applyRefreshOptionChange,\n previousRefresh,\n updateGlobalStateFromForm,\n emitUpdate,\n emitRefresh\n } = context;\n\n applyFormChangesToLocalState(formValue);\n\n const sources = getFieldSources();\n let didChange = false;\n\n if (shouldValidateAggregation(formValue)) {\n const aggregationChange = deps.resolveAggregationChangeForForm({\n formValue,\n sources\n });\n\n if (aggregationChange) {\n applyLocalAggregationChange(aggregationChange);\n deps.setAggregationValidationState(\n !aggregationChange.alertMessage,\n aggregationChange.alertMessage\n );\n didChange = true;\n }\n }\n\n const nextRefresh = formValue.refreshOption ?? previousRefresh;\n applyRefreshOptionChange(previousRefresh, nextRefresh);\n\n const updatedSources = getFieldSources();\n updateGlobalStateFromForm(formValue, updatedSources);\n\n emitUpdate(deps.computeEffectiveConfig());\n\n if (didChange) {\n emitRefresh(null);\n }\n\n deps.updateAggregationDisableReason();\n}\n\nexport interface GlobalStateChangeDependencies {\n resolveAutoUnlinkAggregationChange: (\n aggregation: GlobalContextState['aggregation']\n ) => AggregationChangeInstruction | null;\n setAggregationValidationState: (isValid: boolean, message?: string | null) => void;\n updateFieldSources: (updater: (current: FieldSourcesMap) => FieldSourcesMap) => void;\n applyAggregationChangesForGlobalState: (params: {\n incomingState: Partial<GlobalContextState>;\n sources: FieldSourcesMap;\n formUpdates: Partial<GlobalContextState>;\n applyLocalAggregationChange: (change: AggregationChangeInstruction) => void;\n }) => boolean;\n updateLocalState: (\n updater: (state: Partial<GlobalContextState>) => Partial<GlobalContextState>\n ) => void;\n computeEffectiveConfig: () => GlobalContextState;\n updateAggregationDisableReason: () => void;\n}\n\nexport function handleGlobalStateChange(\n context: HandleGlobalStateChangeContext,\n deps: GlobalStateChangeDependencies\n): void {\n const {\n state,\n getFieldSources,\n previousRefresh,\n processGlobalStateChange,\n shouldValidateAggregationForUnlinkedDateTime,\n applyLocalAggregationChange,\n applyRefreshOptionChange,\n patchForm,\n emitUpdate,\n emitRefresh\n } = context;\n\n const sources = getFieldSources();\n const formUpdates = processGlobalStateChange(state, sources);\n let didAnyChange = false;\n let shouldReevaluateDisableReason = true;\n\n if (shouldValidateAggregationForUnlinkedDateTime(state, sources)) {\n const change = deps.resolveAutoUnlinkAggregationChange(state.aggregation);\n if (change) {\n delete (formUpdates as Record<string, unknown>).aggregation;\n deps.updateFieldSources(current => ({\n ...current,\n aggregation: FIELD_SOURCE_LOCAL\n }));\n deps.setAggregationValidationState(false);\n applyLocalAggregationChange(change);\n didAnyChange = true;\n shouldReevaluateDisableReason = false;\n }\n } else if (\n deps.applyAggregationChangesForGlobalState({\n incomingState: state,\n sources,\n formUpdates,\n applyLocalAggregationChange\n })\n ) {\n didAnyChange = true;\n }\n\n const nextRefresh = state.refreshOption ?? previousRefresh;\n const refreshChanged = nextRefresh !== previousRefresh;\n applyRefreshOptionChange(previousRefresh, nextRefresh);\n\n // When switching to Live mode with CUSTOM interval, always update form with normalized dateTimeContext\n if (\n refreshChanged &&\n nextRefresh === REFRESH_OPTION.LIVE &&\n state.dateTimeContext?.interval === TIME_INTERVAL.CUSTOM\n ) {\n formUpdates.dateTimeContext = state.dateTimeContext;\n }\n\n if (refreshChanged && getFieldSources().isAutoRefreshEnabled === FIELD_SOURCE_LOCAL) {\n delete formUpdates.isAutoRefreshEnabled;\n delete formUpdates.refreshInterval;\n delete formUpdates.refreshOption;\n }\n\n if (refreshChanged) {\n didAnyChange = true;\n }\n\n if (Object.keys(formUpdates).length) {\n deps.updateLocalState(current => {\n const updated = { ...current };\n (Object.keys(formUpdates) as Array<keyof GlobalContextState>).forEach(key => {\n const value = formUpdates[key];\n if (sources[key] === FIELD_SOURCE_GLOBAL && value !== undefined) {\n assignClonedValue(updated, key, value);\n }\n });\n return updated;\n });\n patchForm(formUpdates);\n didAnyChange = true;\n }\n\n emitUpdate(deps.computeEffectiveConfig());\n\n if (didAnyChange) {\n emitRefresh(null);\n }\n\n if (shouldReevaluateDisableReason) {\n deps.updateAggregationDisableReason();\n }\n}\n\nexport interface ExecuteHandlerDependencies {\n computeEffectiveConfig: () => GlobalContextState;\n}\n\nexport function executeHandler(\n context: ExecuteHandlerContext,\n deps: ExecuteHandlerDependencies\n): void {\n const {\n handler,\n configOverride,\n previousRefresh,\n applyRefreshOptionChange,\n buildWidgetState,\n applyHandlerResult,\n applyConfigOverride,\n emitBasedOnFieldSources,\n requestRefresh\n } = context;\n\n if (!handler) {\n return;\n }\n\n if (configOverride?.refreshOption !== undefined) {\n applyRefreshOptionChange(previousRefresh, configOverride.refreshOption);\n }\n\n const result = handler(buildWidgetState(configOverride));\n let shouldEmitRefresh = false;\n\n if (result) {\n shouldEmitRefresh = applyHandlerResult(result);\n }\n\n if (configOverride) {\n applyConfigOverride(configOverride);\n }\n\n emitBasedOnFieldSources(deps.computeEffectiveConfig());\n if (shouldEmitRefresh) {\n requestRefresh();\n }\n}\n","import type { DateTimeContext } from '../../../models/date-time-context-picker.model';\nimport type { GlobalContextState } from '../../../models/global-context.model';\nimport type { TimeInterval } from '../../../models/interval-picker.model';\nimport { TIME_INTERVAL } from '../../../models/interval-picker.model';\nimport { DateTimeContextUtil } from '../../../utils/date-time-context.util';\nimport {\n FIELD_SOURCE_GLOBAL,\n FIELD_SOURCE_LOCAL,\n type FieldSourcesMap\n} from './config-composer.util';\nimport type { RefreshResult } from './shared-mode-orchestrator.types';\n\nexport interface RefreshContext {\n effectiveConfig: GlobalContextState;\n fieldSources: FieldSourcesMap;\n globalDateTimeContext?: DateTimeContext | null;\n generateFreshDateTime: (interval: TimeInterval) => DateTimeContext;\n}\n\nexport interface RefreshDependencies {\n supportsAutoRefresh: (config: GlobalContextState) => boolean;\n}\n\nexport function calculateRefreshOutcome(\n context: RefreshContext,\n deps: RefreshDependencies\n): RefreshResult {\n const { fieldSources, effectiveConfig } = context;\n\n if (fieldSources.isAutoRefreshEnabled === FIELD_SOURCE_LOCAL) {\n return handleLocalAutoRefresh(context, deps);\n }\n\n if (fieldSources.dateTimeContext === FIELD_SOURCE_GLOBAL) {\n return {\n refreshPayload: context.globalDateTimeContext ?? null,\n shouldEmitRefresh: true\n };\n }\n\n if (!deps.supportsAutoRefresh(effectiveConfig)) {\n return {\n refreshPayload: null,\n shouldEmitRefresh: true\n };\n }\n\n const interval = resolveRefreshInterval(fieldSources, effectiveConfig.dateTimeContext?.interval);\n const freshContext = buildFreshContext(context, interval);\n\n return {\n refreshPayload: null,\n updatedLocalDateTime: freshContext,\n shouldEmitRefresh: true\n };\n}\n\nexport function handleLocalAutoRefresh(\n context: RefreshContext,\n deps: RefreshDependencies\n): RefreshResult {\n const { fieldSources, effectiveConfig } = context;\n const result: RefreshResult = { refreshPayload: null, shouldEmitRefresh: true };\n\n if (fieldSources.dateTimeContext === FIELD_SOURCE_GLOBAL) {\n const resolvedContext =\n context.globalDateTimeContext ?? effectiveConfig.dateTimeContext ?? null;\n\n if (resolvedContext) {\n result.refreshPayload = structuredClone(resolvedContext);\n return result;\n }\n\n if (!deps.supportsAutoRefresh(effectiveConfig)) {\n return result;\n }\n\n const interval = resolveRefreshInterval(\n fieldSources,\n effectiveConfig.dateTimeContext?.interval\n );\n result.refreshPayload = buildFreshContext(context, interval);\n return result;\n }\n\n if (!deps.supportsAutoRefresh(effectiveConfig)) {\n return result;\n }\n\n const interval = resolveRefreshInterval(fieldSources, effectiveConfig.dateTimeContext?.interval);\n result.updatedLocalDateTime = buildFreshContext(context, interval);\n return result;\n}\n\nexport function resolveRefreshInterval(\n fieldSources: FieldSourcesMap,\n configInterval: TimeInterval | undefined\n): TimeInterval {\n if (fieldSources.dateTimeContext === FIELD_SOURCE_LOCAL && configInterval) {\n return configInterval;\n }\n\n return configInterval ?? TIME_INTERVAL.CUSTOM;\n}\n\nexport function buildFreshContext(\n context: RefreshContext,\n interval: TimeInterval\n): DateTimeContext {\n if (interval === TIME_INTERVAL.CUSTOM) {\n const source = context.effectiveConfig.dateTimeContext;\n\n if (source?.dateFrom) {\n return DateTimeContextUtil.normalizeForLive(source);\n }\n\n const generated = context.generateFreshDateTime(TIME_INTERVAL.CUSTOM);\n if (generated) {\n return generated;\n }\n\n return {\n interval: TIME_INTERVAL.CUSTOM,\n dateFrom: null,\n dateTo: null\n } satisfies DateTimeContext;\n }\n\n return context.generateFreshDateTime(interval);\n}\n","import type { WritableSignal } from '@angular/core';\nimport type { RefreshOption } from '../../../models/auto-refresh.model';\nimport type { LinkStatesMap } from '../../../models/control-flow.model';\nimport type { DateTimeContext } from '../../../models/date-time-context-picker.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n type GlobalContextDisplayMode,\n type GlobalContextState,\n WIDGET_DISPLAY_MODE,\n type WidgetControls,\n type WidgetDisplayMode\n} from '../../../models/global-context.model';\nimport type { WidgetControlService } from '../../../services/domain/widget-control.service';\nimport { DateTimeContextUtil } from '../../../utils/date-time-context.util';\nimport { createDefaultGlobalContextState } from '../../../utils/global-context-defaults.util';\nimport { GLOBAL_CONTEXT_DEFAULTS } from '../../../models/global-context-defaults';\nimport {\n FIELD_SOURCE_GLOBAL,\n FIELD_SOURCE_LOCAL,\n type FieldSourcesMap\n} from './config-composer.util';\nimport type { VisibilityContext } from './shared-mode-orchestrator.types';\n\nexport function mapToContextDisplayMode(displayMode: WidgetDisplayMode): GlobalContextDisplayMode {\n switch (displayMode) {\n case WIDGET_DISPLAY_MODE.CONFIG:\n return GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG;\n case WIDGET_DISPLAY_MODE.INLINE:\n return GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n default:\n return GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n }\n}\n\nexport function resolveWidgetDisplayMode(\n initialConfig: GlobalContextState | null,\n globalState: Partial<GlobalContextState>\n): WidgetDisplayMode {\n const raw = initialConfig?.displayMode ?? globalState.displayMode;\n if (raw === GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG) return WIDGET_DISPLAY_MODE.CONFIG;\n if (raw === GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG) return WIDGET_DISPLAY_MODE.INLINE;\n return WIDGET_DISPLAY_MODE.INLINE;\n}\n\nexport function resolveVisibilityContextInternal(\n config: GlobalContextState,\n widgetControlsSignal: WritableSignal<WidgetControls | null>,\n fieldSourcesSignal: WritableSignal<FieldSourcesMap>,\n globalStateSignal: WritableSignal<Partial<GlobalContextState>>,\n widgetControlService: WidgetControlService,\n getDefaultRefreshOption: () => RefreshOption\n): VisibilityContext | null {\n const controls = widgetControlsSignal();\n if (!controls || !config.displayMode) return null;\n const refreshOption =\n (config.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD\n ? globalStateSignal().refreshOption\n : config.refreshOption) ?? getDefaultRefreshOption();\n const baseVisibility = widgetControlService.resolveInlineControlSettings(\n controls,\n config.displayMode,\n refreshOption\n ) ?? {\n settings: {},\n links: {},\n dashboardControls: {}\n };\n if (config.displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) return baseVisibility;\n let settings = baseVisibility.settings || {};\n let links = { ...(baseVisibility.links || {}) } as LinkStatesMap;\n let dashboard = baseVisibility.dashboardControls || {};\n const sources = fieldSourcesSignal() || {};\n (Object.keys(links) as Array<keyof LinkStatesMap>).forEach(key => {\n const desired =\n (sources as FieldSourcesMap)[key as keyof GlobalContextState] === FIELD_SOURCE_GLOBAL;\n if (!!links[key] === desired) return;\n const toggled = widgetControlService.toggleControlLink(key as string, settings, links);\n settings = toggled.settings;\n links = toggled.links as LinkStatesMap;\n dashboard = toggled.dashboardControls;\n });\n return { settings, links, dashboardControls: dashboard };\n}\n\nexport function syncSourcesForRefreshOption(\n displayMode: WidgetDisplayMode,\n refreshOption: RefreshOption,\n controls: WidgetControls | null,\n fieldSourcesSignal: WritableSignal<FieldSourcesMap>,\n getDefaultRefreshOption: () => RefreshOption,\n setFieldSources: (sources: FieldSourcesMap) => void\n): void {\n const sources = { ...fieldSourcesSignal() };\n if (!sources) return;\n sources.refreshOption = sources.refreshOption ?? FIELD_SOURCE_LOCAL;\n if (controls?.supports?.includes('isAutoRefreshEnabled')) {\n sources.isAutoRefreshEnabled = sources.isAutoRefreshEnabled ?? FIELD_SOURCE_LOCAL;\n sources.refreshInterval = sources.refreshInterval ?? FIELD_SOURCE_LOCAL;\n }\n if (displayMode === WIDGET_DISPLAY_MODE.CONFIG) {\n sources.refreshOption = FIELD_SOURCE_LOCAL;\n sources.isAutoRefreshEnabled = FIELD_SOURCE_LOCAL;\n sources.refreshInterval = FIELD_SOURCE_LOCAL;\n }\n if (refreshOption !== getDefaultRefreshOption())\n sources.isAutoRefreshEnabled = FIELD_SOURCE_LOCAL;\n setFieldSources(sources);\n}\n\nexport function sanitizeLocalState(\n state: Partial<GlobalContextState> | null | undefined,\n configSignal: WritableSignal<GlobalContextState>,\n ensureDateTimeContext: (\n context: GlobalContextState['dateTimeContext'] | null | undefined\n ) => DateTimeContext\n): Partial<GlobalContextState> {\n const snapshot = { ...state };\n if (snapshot.dateTimeContext === null) delete snapshot.dateTimeContext;\n else if (snapshot.dateTimeContext !== undefined)\n snapshot.dateTimeContext = ensureDateTimeContext(snapshot.dateTimeContext);\n // Always enforce the fixed 5s refresh interval\n if (snapshot.refreshInterval !== undefined) {\n snapshot.refreshInterval = GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL;\n }\n return snapshot;\n}\n\nexport function sanitizeGlobalState(\n state: Partial<GlobalContextState> | null | undefined,\n configSignal: WritableSignal<GlobalContextState>,\n normalizeRefreshOption: (option: RefreshOption | undefined) => RefreshOption,\n getDefaultRefreshOption: () => RefreshOption,\n ensureDateTimeContext: (\n context: GlobalContextState['dateTimeContext'] | null | undefined\n ) => DateTimeContext\n): Partial<GlobalContextState> {\n const snapshot = { ...state };\n if (snapshot.dateTimeContext !== undefined)\n snapshot.dateTimeContext = ensureDateTimeContext(snapshot.dateTimeContext);\n snapshot.refreshOption = normalizeRefreshOption(\n snapshot.refreshOption ?? getDefaultRefreshOption()\n );\n // Always enforce the fixed 5s refresh interval\n if (snapshot.refreshInterval !== undefined) {\n snapshot.refreshInterval = GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL;\n }\n return snapshot;\n}\n\nexport function ensureDateTimeContext(\n context: GlobalContextState['dateTimeContext'] | null | undefined,\n configSignal: WritableSignal<GlobalContextState>\n): DateTimeContext {\n const defaults =\n configSignal().dateTimeContext ?? createDefaultGlobalContextState().dateTimeContext;\n const iso = DateTimeContextUtil.ensureIsoContext(context ?? defaults);\n return {\n interval: iso.interval ?? defaults.interval,\n dateFrom: iso.dateFrom ?? defaults.dateFrom,\n dateTo: iso.dateTo ?? defaults.dateTo\n };\n}\n\nexport function syncLocalEntriesWithGlobal(\n fieldSourcesSignal: WritableSignal<FieldSourcesMap>,\n globalStateSignal: WritableSignal<Partial<GlobalContextState>>,\n localStateSignal: WritableSignal<Partial<GlobalContextState>>\n): void {\n const sources = fieldSourcesSignal();\n const globalState = globalStateSignal();\n if (!sources || !globalState) return;\n localStateSignal.update(current => {\n const working: Partial<GlobalContextState> = { ...current };\n (Object.keys(globalState) as Array<keyof GlobalContextState>).forEach(key => {\n if (sources[key] === FIELD_SOURCE_GLOBAL) {\n const value = globalState[key];\n if (value === undefined) {\n delete working[key];\n } else {\n (working as any)[key] = structuredClone(value);\n }\n }\n });\n return working;\n });\n}\n","import type { LinkStatesMap } from '../../../models/control-flow.model';\nimport type { GlobalContextState } from '../../../models/global-context.model';\nimport {\n FIELD_SOURCE_GLOBAL,\n FIELD_SOURCE_LOCAL,\n type FieldSourcesMap\n} from './config-composer.util';\nimport type { LinkToggleOutcome } from './shared-mode-orchestrator.types';\n\nexport interface LinkToggleArgs {\n key: keyof LinkStatesMap;\n isLinked: boolean;\n fieldSources: FieldSourcesMap;\n}\n\nexport interface ToggleAllArgs {\n keys: Array<keyof LinkStatesMap>;\n isLinked: boolean;\n fieldSources: FieldSourcesMap;\n}\n\nexport function computeLinkToggle(args: LinkToggleArgs): LinkToggleOutcome {\n const { key, isLinked, fieldSources } = args;\n const updatedFieldSources: FieldSourcesMap = { ...fieldSources };\n const snapshotKeys = new Set<keyof GlobalContextState>();\n const clearLocalKeys = new Set<keyof GlobalContextState>();\n const targetSource = isLinked ? FIELD_SOURCE_GLOBAL : FIELD_SOURCE_LOCAL;\n\n updatedFieldSources[key as keyof GlobalContextState] = targetSource;\n\n if (isLinked) {\n clearLocalKeys.add(key as keyof GlobalContextState);\n } else {\n snapshotKeys.add(key as keyof GlobalContextState);\n }\n\n if (key === 'dateTimeContext') {\n updatedFieldSources.refreshOption = targetSource;\n if (isLinked) {\n clearLocalKeys.add('refreshOption');\n } else {\n snapshotKeys.add('refreshOption');\n }\n }\n\n let recalcLocalAggregation = false;\n let recalcGlobalAggregation = false;\n\n if (!isLinked && key === 'aggregation' && fieldSources.dateTimeContext === FIELD_SOURCE_LOCAL) {\n recalcLocalAggregation = true;\n }\n\n if (isLinked && key === 'dateTimeContext' && fieldSources.aggregation === FIELD_SOURCE_LOCAL) {\n recalcGlobalAggregation = true;\n }\n\n let shouldEmitRefresh = false;\n\n if (key === 'isAutoRefreshEnabled') {\n updatedFieldSources.refreshInterval = targetSource;\n updatedFieldSources.refreshOption = targetSource;\n shouldEmitRefresh = !isLinked;\n\n if (isLinked) {\n clearLocalKeys.add('refreshInterval');\n clearLocalKeys.add('refreshOption');\n } else {\n snapshotKeys.add('refreshInterval');\n snapshotKeys.add('refreshOption');\n }\n }\n\n return {\n fieldSources: updatedFieldSources,\n snapshotKeys: Array.from(snapshotKeys),\n shouldEmitRefresh,\n recalcLocalAggregation,\n recalcGlobalAggregation,\n clearLocalKeys: Array.from(clearLocalKeys)\n };\n}\n\nexport function computeToggleAll(args: ToggleAllArgs): LinkToggleOutcome {\n const { keys, isLinked, fieldSources } = args;\n const updatedFieldSources: FieldSourcesMap = { ...fieldSources };\n const snapshotKeys = new Set<keyof GlobalContextState>();\n const clearLocalKeys = new Set<keyof GlobalContextState>();\n\n let shouldEmitRefresh = false;\n let recalcLocalAggregation = false;\n let recalcGlobalAggregation = false;\n\n keys.forEach(key => {\n const targetSource = isLinked ? FIELD_SOURCE_GLOBAL : FIELD_SOURCE_LOCAL;\n updatedFieldSources[key as keyof GlobalContextState] = targetSource;\n\n if (isLinked) {\n clearLocalKeys.add(key as keyof GlobalContextState);\n } else {\n snapshotKeys.add(key as keyof GlobalContextState);\n }\n\n if (key === 'dateTimeContext') {\n updatedFieldSources.refreshOption = targetSource;\n if (isLinked) {\n clearLocalKeys.add('refreshOption');\n } else {\n snapshotKeys.add('refreshOption');\n }\n }\n\n if (!isLinked && key === 'aggregation' && fieldSources.dateTimeContext === FIELD_SOURCE_LOCAL) {\n recalcLocalAggregation = true;\n }\n\n if (isLinked && key === 'dateTimeContext' && fieldSources.aggregation === FIELD_SOURCE_LOCAL) {\n recalcGlobalAggregation = true;\n }\n\n if (key === 'isAutoRefreshEnabled') {\n updatedFieldSources.refreshInterval = targetSource;\n updatedFieldSources.refreshOption = targetSource;\n shouldEmitRefresh = !isLinked;\n\n if (isLinked) {\n clearLocalKeys.add('refreshInterval');\n clearLocalKeys.add('refreshOption');\n } else {\n snapshotKeys.add('refreshInterval');\n snapshotKeys.add('refreshOption');\n }\n }\n });\n\n return {\n fieldSources: updatedFieldSources,\n snapshotKeys: Array.from(snapshotKeys),\n shouldEmitRefresh,\n recalcLocalAggregation,\n recalcGlobalAggregation,\n clearLocalKeys: Array.from(clearLocalKeys)\n };\n}\n","import { aggregationType } from '@c8y/client';\nimport type { DateTimeContext } from '../../../models/date-time-context-picker.model';\nimport type { GlobalContextState } from '../../../models/global-context.model';\n\nexport interface AggregationValidationContext {\n globalAggregation: aggregationType | null | undefined;\n localDateTimeContext?: DateTimeContext | null;\n calculateValidAggregation: (\n dateRange: [Date, Date],\n target: aggregationType | null\n ) => {\n selectedAggregation: aggregationType | null;\n };\n}\n\nexport interface AggregationValidationResult {\n canLink: boolean;\n nextAggregation: aggregationType | null;\n message?: string;\n}\n\nexport function validateAggregationLink(\n context: AggregationValidationContext\n): AggregationValidationResult {\n const { globalAggregation, localDateTimeContext } = context;\n\n if (globalAggregation === undefined) {\n return { canLink: true, nextAggregation: null };\n }\n\n if (!localDateTimeContext?.dateFrom || !localDateTimeContext?.dateTo) {\n return { canLink: true, nextAggregation: globalAggregation };\n }\n\n try {\n const dateRange: [Date, Date] = [\n new Date(localDateTimeContext.dateFrom),\n new Date(localDateTimeContext.dateTo)\n ];\n\n const result = context.calculateValidAggregation(dateRange, globalAggregation);\n\n if (result.selectedAggregation !== globalAggregation) {\n return {\n canLink: false,\n nextAggregation: result.selectedAggregation,\n message: 'Cannot sync aggregation with dashboard date range'\n };\n }\n\n return { canLink: true, nextAggregation: globalAggregation };\n } catch (error) {\n return { canLink: false, nextAggregation: null };\n }\n}\n\nexport function deriveAggregationValue(config: GlobalContextState): aggregationType | null {\n return config.dateTimeContext && config.dateTimeContext.interval === 'none'\n ? null\n : (config.aggregation ?? null);\n}\n","import { Injectable, WritableSignal, signal } from '@angular/core';\nimport { aggregationType } from '@c8y/client';\nimport { Subject } from 'rxjs';\nimport type { RefreshOption } from '../../../models/auto-refresh.model';\nimport type { LinkStatesMap } from '../../../models/control-flow.model';\nimport type { DateTimeContext } from '../../../models/date-time-context-picker.model';\nimport type {\n GlobalContextEvent,\n GlobalContextState,\n WidgetControls,\n WidgetDisplayMode\n} from '../../../models/global-context.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n WIDGET_DISPLAY_MODE\n} from '../../../models/global-context.model';\nimport type { TimeInterval } from '../../../models/interval-picker.model';\nimport { AggregationPickerService } from '../../../services/domain/aggregation-picker.service';\nimport { WidgetControlService } from '../../../services/domain/widget-control.service';\nimport { GlobalContextService } from '../../../services/state/global-context.service';\nimport { createDefaultGlobalContextState } from '../../../utils/global-context-defaults.util';\nimport { GLOBAL_CONTEXT_DEFAULTS } from '../../../models/global-context-defaults';\nimport {\n FIELD_SOURCE_GLOBAL,\n FIELD_SOURCE_LOCAL,\n composeEffectiveConfig,\n type FieldSourcesMap\n} from './config-composer.util';\nimport {\n AGGREGATION_SYNC_FAILED,\n applyAggregationChangesForGlobalState as applyAggregationChangesForGlobalStateHelper,\n evaluateAggregationValidation,\n resolveAggregationChangeForForm as resolveAggregationChangeForFormHelper,\n resolveAutoUnlinkAggregationChange as resolveAutoUnlinkAggregationChangeHelper\n} from './shared-mode-aggregation.helper';\nimport {\n executeHandler as executeHandlerHelper,\n handleFormChange as handleFormChangeHelper,\n handleGlobalStateChange as handleGlobalStateChangeHelper\n} from './shared-mode-context.helper';\nimport type {\n AggregationChangeInstruction,\n AggregationUnlinkReason,\n ExecuteHandlerContext,\n HandleFormChangeContext,\n HandleGlobalStateChangeContext,\n LinkToggleOutcome,\n ModeServices,\n RefreshResult,\n VisibilityContext\n} from './shared-mode-orchestrator.types';\nimport { calculateRefreshOutcome } from './shared-mode-refresh.helper';\nimport {\n ensureDateTimeContext as ensureDateTimeContextHelper,\n mapToContextDisplayMode as mapToContextDisplayModeHelper,\n resolveVisibilityContextInternal as resolveVisibilityContextInternalHelper,\n resolveWidgetDisplayMode as resolveWidgetDisplayModeHelper,\n sanitizeGlobalState as sanitizeGlobalStateHelper,\n sanitizeLocalState as sanitizeLocalStateHelper,\n syncLocalEntriesWithGlobal as syncLocalEntriesWithGlobalHelper,\n syncSourcesForRefreshOption as syncSourcesForRefreshOptionHelper\n} from './shared-mode-state.helper';\nimport { computeLinkToggle, computeToggleAll } from './shared-mode-toggle.helper';\nimport {\n deriveAggregationValue as deriveAggregationValueUtil,\n validateAggregationLink as validateAggregationLinkUtil,\n type AggregationValidationContext,\n type AggregationValidationResult\n} from './validation.util';\n\n@Injectable()\nexport class SharedModeOrchestrator {\n private readonly widgetControlService: WidgetControlService;\n private readonly aggregationPickerService: AggregationPickerService;\n private readonly globalContextService: GlobalContextService;\n private readonly mode: RefreshOption;\n private configSignal: WritableSignal<GlobalContextState> = signal(\n createDefaultGlobalContextState()\n );\n private widgetControlsSignal: WritableSignal<WidgetControls | null> = signal(null);\n private displayModeSignal: WritableSignal<WidgetDisplayMode> = signal(WIDGET_DISPLAY_MODE.INLINE);\n private loadingSignal: WritableSignal<boolean> = signal(false);\n private fieldSourcesSignal: WritableSignal<FieldSourcesMap> = signal({});\n private localStateSignal: WritableSignal<Partial<GlobalContextState>> = signal({});\n private globalStateSignal: WritableSignal<Partial<GlobalContextState>> = signal({});\n private linkDisableReasonsSignal: WritableSignal<\n Partial<Record<keyof GlobalContextState, string>>\n > = signal({});\n private aggregationUnlinkReason: AggregationUnlinkReason | null = null;\n private latestVisibility: VisibilityContext | null = null;\n readonly globalContextChange$ = new Subject<GlobalContextEvent>();\n readonly refresh$ = new Subject<void>();\n constructor(mode: RefreshOption, services: ModeServices) {\n this.mode = mode;\n this.widgetControlService = services.widgetControlService;\n this.aggregationPickerService = services.aggregationPickerService;\n this.globalContextService = services.globalContextService;\n }\n initConfig(config: GlobalContextState | null | undefined): void {\n const cloned = structuredClone(config ?? createDefaultGlobalContextState());\n // Always enforce the fixed 5s refresh interval\n cloned.refreshInterval = GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL;\n this.configSignal.set(cloned);\n }\n initWidgetControls(controls: WidgetControls | null | undefined): void {\n this.widgetControlsSignal.set(controls ?? null);\n }\n setDisplayMode(mode: WidgetDisplayMode | null | undefined): void {\n this.displayModeSignal.set(mode ?? WIDGET_DISPLAY_MODE.INLINE);\n }\n getDisplayMode(): WidgetDisplayMode {\n return this.displayModeSignal();\n }\n setLoading(isLoading: boolean): void {\n this.loadingSignal.set(!!isLoading);\n }\n getFieldSources(): FieldSourcesMap {\n return this.fieldSourcesSignal();\n }\n setFieldSources(value: FieldSourcesMap): void {\n this.fieldSourcesSignal.set(value ?? {});\n this.syncLocalEntriesWithGlobal();\n }\n updateFieldSources(updater: (sources: FieldSourcesMap) => FieldSourcesMap): void {\n this.fieldSourcesSignal.update(current => updater({ ...current }) ?? {});\n this.syncLocalEntriesWithGlobal();\n }\n getLocalState(): Partial<GlobalContextState> {\n return this.localStateSignal();\n }\n setLocalState(state: Partial<GlobalContextState>): void {\n const sanitized = sanitizeLocalStateHelper(state, this.configSignal, ctx =>\n this.ensureDateTimeContext(ctx)\n );\n this.localStateSignal.set(sanitized);\n }\n updateLocalState(\n updater: (state: Partial<GlobalContextState>) => Partial<GlobalContextState>\n ): void {\n this.localStateSignal.update(current =>\n sanitizeLocalStateHelper(updater({ ...current }) ?? {}, this.configSignal, ctx =>\n this.ensureDateTimeContext(ctx)\n )\n );\n }\n getGlobalState(): Partial<GlobalContextState> {\n return this.globalStateSignal();\n }\n setGlobalState(state: Partial<GlobalContextState>): void {\n this.globalStateSignal.set(\n sanitizeGlobalStateHelper(\n state,\n this.configSignal,\n opt => this.normalizeRefreshOption(opt),\n () => this.getDefaultRefreshOption(),\n ctx => this.ensureDateTimeContext(ctx)\n )\n );\n this.syncLocalEntriesWithGlobal();\n }\n updateGlobalState(\n updater: (state: Partial<GlobalContextState>) => Partial<GlobalContextState>\n ): void {\n this.globalStateSignal.update(current =>\n sanitizeGlobalStateHelper(\n updater({ ...current }) ?? {},\n this.configSignal,\n opt => this.normalizeRefreshOption(opt),\n () => this.getDefaultRefreshOption(),\n ctx => this.ensureDateTimeContext(ctx)\n )\n );\n this.syncLocalEntriesWithGlobal();\n }\n initializeStateAndSources(params: {\n initialConfig: GlobalContextState | null;\n globalState: Partial<GlobalContextState>;\n isDashboard: boolean;\n widgetControls?: WidgetControls | null;\n generateFreshDateTime: (interval: TimeInterval) => DateTimeContext;\n forcedRefreshOption?: RefreshOption;\n }): void {\n const {\n initialConfig,\n globalState,\n isDashboard,\n widgetControls,\n generateFreshDateTime,\n forcedRefreshOption\n } = params;\n const normalizedGlobalState = structuredClone(globalState ?? {});\n if (forcedRefreshOption) normalizedGlobalState.refreshOption = forcedRefreshOption;\n this.initConfig(initialConfig);\n this.setGlobalState(normalizedGlobalState);\n this.initWidgetControls(widgetControls);\n const widgetDisplayMode = resolveWidgetDisplayModeHelper(initialConfig, normalizedGlobalState);\n const controls = widgetControls ?? this.widgetControlsSignal();\n\n const localState: Partial<GlobalContextState> = initialConfig ? { ...initialConfig } : {};\n const fieldSources: FieldSourcesMap = {};\n const globalSnapshot: Partial<GlobalContextState> = structuredClone(\n normalizedGlobalState ?? {}\n );\n\n // Simple rule: Dashboard mode → ALL sources global, Non-dashboard → ALL sources local\n const defaultSource = isDashboard ? FIELD_SOURCE_GLOBAL : FIELD_SOURCE_LOCAL;\n\n (Object.keys(localState) as Array<keyof GlobalContextState>).forEach(key => {\n fieldSources[key] = defaultSource;\n });\n\n // Ensure all supported controls have field sources\n if (controls?.supports) {\n controls.supports.forEach(field => {\n if (!fieldSources[field]) {\n fieldSources[field] = defaultSource;\n }\n });\n }\n\n // Source is ALWAYS global (tracks event origin)\n fieldSources.source = FIELD_SOURCE_GLOBAL;\n\n this.applyInitialModeAdjustments({\n isDashboard,\n localState,\n fieldSources,\n generateFreshDateTime\n });\n this.setFieldSources(fieldSources);\n this.setLocalState(localState);\n this.setGlobalState(globalSnapshot);\n this.setDisplayMode(widgetDisplayMode);\n this.linkDisableReasonsSignal.set({});\n this.updateAggregationDisableReason();\n }\n getConfigSnapshot(): GlobalContextState {\n return this.configSignal();\n }\n computeEffectiveConfig(baseConfig: GlobalContextState | null | undefined): GlobalContextState {\n const localState = this.localStateSignal();\n const globalState = this.globalStateSignal();\n const fieldSources = this.fieldSourcesSignal();\n\n // Normalize baseConfig to enforce fixed 5s refresh interval\n const normalizedBaseConfig = baseConfig\n ? {\n ...baseConfig,\n refreshInterval: GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL\n }\n : baseConfig;\n\n const composed = composeEffectiveConfig({\n baseConfig: normalizedBaseConfig,\n localState,\n globalState,\n fieldSources\n });\n\n const displayMode =\n baseConfig?.displayMode ??\n this.globalStateSignal().displayMode ??\n mapToContextDisplayModeHelper(this.displayModeSignal());\n const configWithMode = { ...composed, displayMode };\n this.latestVisibility = resolveVisibilityContextInternalHelper(\n configWithMode,\n this.widgetControlsSignal,\n this.fieldSourcesSignal,\n this.globalStateSignal,\n this.widgetControlService,\n () => this.getDefaultRefreshOption()\n );\n return configWithMode;\n }\n getLatestVisibility(): VisibilityContext | null {\n return this.latestVisibility;\n }\n resolveVisibilityContext(\n config: GlobalContextState | null | undefined\n ): VisibilityContext | null {\n return config\n ? resolveVisibilityContextInternalHelper(\n config,\n this.widgetControlsSignal,\n this.fieldSourcesSignal,\n this.globalStateSignal,\n this.widgetControlService,\n () => this.getDefaultRefreshOption()\n )\n : null;\n }\n handleFormChange(context: HandleFormChangeContext): void {\n handleFormChangeHelper(context, {\n resolveAggregationChangeForForm: params => this.resolveAggregationChangeForForm(params),\n setAggregationValidationState: (isValid, message) =>\n this.setAggregationValidationState(isValid, message),\n computeEffectiveConfig: () => this.computeEffectiveConfig(this.configSignal()),\n updateAggregationDisableReason: () => this.updateAggregationDisableReason()\n });\n }\n handleGlobalStateChange(context: HandleGlobalStateChangeContext): void {\n handleGlobalStateChangeHelper(context, {\n resolveAutoUnlinkAggregationChange: aggregation =>\n this.resolveAutoUnlinkAggregationChange(aggregation),\n setAggregationValidationState: (isValid, message) =>\n this.setAggregationValidationState(isValid, message),\n updateFieldSources: updater => this.updateFieldSources(updater),\n applyAggregationChangesForGlobalState: params =>\n this.applyAggregationChangesForGlobalState(params),\n updateLocalState: updater => this.updateLocalState(updater),\n computeEffectiveConfig: () => this.computeEffectiveConfig(this.configSignal()),\n updateAggregationDisableReason: () => this.updateAggregationDisableReason()\n });\n }\n toggleLink(args: {\n key: keyof LinkStatesMap;\n isLinked: boolean;\n fieldSources?: FieldSourcesMap;\n }): LinkToggleOutcome {\n const prevGlobal = this.getGlobalState();\n const prevLocal = this.getLocalState();\n const prevEffective = this.computeEffectiveConfig(this.configSignal());\n if (args.key === 'aggregation') this.handleAggregationManualToggle(args.isLinked);\n const outcome = computeLinkToggle({\n key: args.key,\n isLinked: args.isLinked,\n fieldSources: args.fieldSources ?? this.getFieldSources()\n });\n this.setFieldSources(outcome.fieldSources);\n if (args.key === 'dateTimeContext' && !args.isLinked)\n this.promoteEffectiveDateTimeToLocal(prevEffective);\n this.syncLocalStateForLinkOutcome({\n outcome,\n previousGlobalState: prevGlobal,\n previousLocalState: prevLocal,\n previousEffectiveConfig: prevEffective\n });\n this.updateAggregationDisableReason();\n return outcome;\n }\n toggleAllLinks(args: {\n keys: Array<keyof LinkStatesMap>;\n isLinked: boolean;\n fieldSources?: FieldSourcesMap;\n }): LinkToggleOutcome {\n const prevGlobal = this.getGlobalState();\n const prevLocal = this.getLocalState();\n const prevEffective = this.computeEffectiveConfig(this.configSignal());\n if (args.keys.includes('aggregation')) this.handleAggregationManualToggle(args.isLinked);\n const outcome = computeToggleAll({\n keys: args.keys,\n isLinked: args.isLinked,\n fieldSources: args.fieldSources ?? this.getFieldSources()\n });\n this.setFieldSources(outcome.fieldSources);\n if (!args.isLinked && args.keys.includes('dateTimeContext'))\n this.promoteEffectiveDateTimeToLocal(prevEffective);\n this.syncLocalStateForLinkOutcome({\n outcome,\n previousGlobalState: prevGlobal,\n previousLocalState: prevLocal,\n previousEffectiveConfig: prevEffective\n });\n this.updateAggregationDisableReason();\n return outcome;\n }\n executeHandler(context: ExecuteHandlerContext): void {\n executeHandlerHelper(context, {\n computeEffectiveConfig: () => this.computeEffectiveConfig(this.configSignal())\n });\n }\n processRefresh(params: {\n globalDateTimeContext?: DateTimeContext | null;\n generateFreshDateTime: (interval: TimeInterval) => DateTimeContext;\n }): RefreshResult {\n const result = calculateRefreshOutcome(\n {\n effectiveConfig: this.computeEffectiveConfig(this.configSignal()),\n fieldSources: this.fieldSourcesSignal(),\n globalDateTimeContext: params.globalDateTimeContext,\n generateFreshDateTime: params.generateFreshDateTime\n },\n { supportsAutoRefresh: config => this.supportsAutoRefresh(config) }\n );\n if (result.updatedLocalDateTime)\n this.updateLocalState(current => ({\n ...current,\n dateTimeContext: structuredClone(result.updatedLocalDateTime)\n }));\n if (result.refreshPayload) {\n const merged = {\n ...(this.globalStateSignal().dateTimeContext ?? {}),\n ...result.refreshPayload\n } as DateTimeContext;\n this.updateGlobalState(state => ({ ...state, dateTimeContext: structuredClone(merged) }));\n }\n return result;\n }\n applyRefreshOptionChange(params: {\n previousRefresh?: RefreshOption;\n nextRefresh?: RefreshOption;\n }): { refreshOption?: RefreshOption; forceDisableAutoRefresh?: boolean } {\n const { previousRefresh, nextRefresh } = params;\n if (!nextRefresh || nextRefresh === previousRefresh) return {};\n const resolved = this.normalizeRefreshOption(nextRefresh);\n this.syncSourcesForRefreshOption(\n this.displayModeSignal(),\n resolved,\n this.widgetControlsSignal()\n );\n const sources = this.fieldSourcesSignal();\n if (sources.refreshOption === FIELD_SOURCE_LOCAL) {\n this.updateLocalState(current =>\n current.refreshOption === resolved ? current : { ...current, refreshOption: resolved }\n );\n } else {\n this.updateLocalState(current => {\n if (current.refreshOption === undefined) return current;\n const { refreshOption: _drop, ...rest } = current;\n return rest;\n });\n }\n if (sources.isAutoRefreshEnabled === FIELD_SOURCE_GLOBAL) {\n this.updateLocalState(current => {\n if (current.isAutoRefreshEnabled === undefined) return current;\n const { isAutoRefreshEnabled: _drop, ...rest } = current;\n return rest;\n });\n }\n this.applyModeSpecificRefreshOptionChange(resolved, sources);\n this.updateAggregationDisableReason();\n return {\n refreshOption: resolved,\n forceDisableAutoRefresh: this.shouldForceDisableAutoRefresh(resolved)\n };\n }\n updateGlobalStateFromForm(\n formValue: Partial<GlobalContextState>,\n sources: FieldSourcesMap\n ): void {\n const nextSources = structuredClone(sources ?? {});\n this.setFieldSources(nextSources);\n const next: Partial<GlobalContextState> = structuredClone(this.getGlobalState() ?? {});\n (Object.keys(formValue) as Array<keyof GlobalContextState>).forEach(key => {\n if (nextSources[key] !== FIELD_SOURCE_GLOBAL) return;\n const value = formValue[key];\n if (value !== undefined) {\n (next as any)[key] = structuredClone(value);\n }\n });\n this.setGlobalState(next);\n }\n processGlobalStateChange(\n state: Partial<GlobalContextState>,\n sources: FieldSourcesMap\n ): Partial<GlobalContextState> {\n const normalizedState = structuredClone(state ?? {});\n const nextGlobalState: Partial<GlobalContextState> = structuredClone(\n this.getGlobalState() ?? {}\n );\n const formUpdates: Partial<GlobalContextState> = {};\n (Object.keys(normalizedState) as Array<keyof GlobalContextState>).forEach(key => {\n const value = normalizedState[key];\n if (value === undefined) return;\n (nextGlobalState as any)[key] = structuredClone(value);\n if (sources[key] === FIELD_SOURCE_GLOBAL) {\n (formUpdates as any)[key] = structuredClone(value);\n }\n });\n this.setGlobalState(nextGlobalState);\n return formUpdates;\n }\n validateAggregationLink(context: AggregationValidationContext): AggregationValidationResult {\n return validateAggregationLinkUtil(context);\n }\n deriveAggregationValue(config: GlobalContextState | null | undefined): aggregationType | null {\n return config ? deriveAggregationValueUtil(config) : null;\n }\n calculateAggregation(\n dateTimeContext: DateTimeContext | null | undefined,\n currentAggregation: aggregationType | null | undefined\n ): aggregationType | null {\n if (!dateTimeContext?.dateFrom || !dateTimeContext?.dateTo) return currentAggregation ?? null;\n try {\n const range: [Date, Date] = [\n new Date(dateTimeContext.dateFrom),\n new Date(dateTimeContext.dateTo)\n ];\n const result = this.aggregationPickerService.calculateAggregation(\n range,\n currentAggregation ?? null\n );\n return result.selectedAggregation ?? null;\n } catch (_error) {\n return currentAggregation ?? null;\n }\n }\n adjustAggregationForDateTime(params: {\n dateTimeContext?: DateTimeContext | null;\n aggregation?: aggregationType | null;\n }): { nextAggregation: aggregationType | null; changed: boolean } {\n const nextAggregation = this.calculateAggregation(\n params.dateTimeContext ?? null,\n params.aggregation ?? null\n );\n return {\n nextAggregation,\n changed: params.aggregation !== undefined && nextAggregation !== params.aggregation\n };\n }\n resolveAggregationChangeForForm(params: {\n formValue: Partial<GlobalContextState>;\n sources: FieldSourcesMap;\n }): AggregationChangeInstruction | null {\n const globalAggregation =\n this.globalStateSignal().aggregation ?? this.configSignal().aggregation ?? null;\n const currentAggregation =\n this.localStateSignal().aggregation ??\n params.formValue.aggregation ??\n this.configSignal().aggregation ??\n null;\n return resolveAggregationChangeForFormHelper({\n formValue: params.formValue,\n sources: params.sources,\n globalAggregation,\n currentAggregation,\n adjustAggregationForDateTime: args => this.adjustAggregationForDateTime(args),\n updateFieldSources: updater => this.updateFieldSources(updater)\n });\n }\n shouldValidateAggregationForUnlinkedDateTime(\n state: Partial<GlobalContextState>,\n sources: FieldSourcesMap\n ): boolean {\n return (\n sources.dateTimeContext === FIELD_SOURCE_LOCAL &&\n sources.aggregation === FIELD_SOURCE_LOCAL &&\n state.dateTimeContext !== undefined\n );\n }\n getLinkDisableReasons(): Partial<Record<keyof GlobalContextState, string>> {\n return this.linkDisableReasonsSignal();\n }\n getAggregationUnlinkReason(): AggregationUnlinkReason | null {\n return this.aggregationUnlinkReason;\n }\n emitConfiguration(\n componentId: string,\n configuration: GlobalContextState | null | undefined\n ): GlobalContextState {\n const resolvedConfig = configuration ?? this.computeEffectiveConfig(this.configSignal());\n\n if (resolvedConfig.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n this.globalContextService.register(\n componentId,\n this.latestVisibility?.dashboardControls ?? {}\n );\n } else {\n this.globalContextService.unregister(componentId);\n }\n return resolvedConfig;\n }\n ngOnDestroy(): void {\n this.globalContextChange$.complete();\n this.refresh$.complete();\n }\n protected applyInitialModeAdjustments(_: {\n isDashboard: boolean;\n localState: Partial<GlobalContextState>;\n fieldSources: FieldSourcesMap;\n generateFreshDateTime: (interval: TimeInterval) => DateTimeContext;\n }): void {\n // mode-specific overrides handled by subclasses\n }\n protected normalizeRefreshOption(nextRefresh: RefreshOption): RefreshOption {\n return nextRefresh;\n }\n protected applyModeSpecificRefreshOptionChange(\n _refreshOption: RefreshOption,\n _sources: FieldSourcesMap\n ): void {\n // mode-specific overrides handled by subclasses\n }\n protected shouldForceDisableAutoRefresh(_refreshOption: RefreshOption): boolean {\n return false;\n }\n protected getDefaultRefreshOption(): RefreshOption {\n return this.mode;\n }\n protected supportsAutoRefresh(config: GlobalContextState): boolean {\n return config.refreshOption === this.getDefaultRefreshOption();\n }\n private syncSourcesForRefreshOption(\n displayMode: WidgetDisplayMode,\n refreshOption: RefreshOption,\n controls: WidgetControls | null\n ): void {\n syncSourcesForRefreshOptionHelper(\n displayMode,\n refreshOption,\n controls,\n this.fieldSourcesSignal,\n () => this.getDefaultRefreshOption(),\n sources => this.setFieldSources(sources)\n );\n }\n private setLinkDisableReason(key: keyof GlobalContextState, reason: string | undefined): void {\n this.linkDisableReasonsSignal.update(current => ({ ...current, [key]: reason }));\n }\n private handleAggregationManualToggle(isLinked: boolean): void {\n if (isLinked) {\n this.setAggregationValidationState(true);\n } else {\n this.setLinkDisableReason('aggregation', undefined);\n this.setAggregationUnlinkReason({ source: 'user', canAutoRecover: false });\n }\n }\n private setAggregationUnlinkReason(reason: AggregationUnlinkReason | null): void {\n this.aggregationUnlinkReason = reason;\n }\n private updateAggregationDisableReason(): void {\n const outcome = evaluateAggregationValidation({\n sources: this.fieldSourcesSignal(),\n localDateTimeContext:\n this.localStateSignal().dateTimeContext ?? this.configSignal().dateTimeContext ?? null,\n globalAggregation:\n this.globalStateSignal().aggregation ?? this.configSignal().aggregation ?? null,\n validateAggregationLink: context => this.validateAggregationLink(context),\n calculateAggregation: (context, target) => this.calculateAggregation(context, target)\n });\n if (!outcome) {\n this.setAggregationValidationState(true);\n return;\n }\n if (!outcome.isValid) {\n this.setAggregationValidationState(false, outcome.message ?? AGGREGATION_SYNC_FAILED);\n return;\n }\n this.setAggregationValidationState(true);\n if (this.attemptAggregationAutoRecover()) return;\n }\n private setAggregationValidationState(isValid: boolean, message?: string | null): void {\n if (isValid) {\n this.setLinkDisableReason('aggregation', undefined);\n this.setAggregationUnlinkReason(null);\n return;\n }\n const resolved = message ?? AGGREGATION_SYNC_FAILED;\n this.setLinkDisableReason('aggregation', resolved);\n this.setAggregationUnlinkReason({\n source: 'validation',\n canAutoRecover: true,\n message: resolved\n });\n }\n private resolveAutoUnlinkAggregationChange(\n globalAggregation: aggregationType | null | undefined\n ): AggregationChangeInstruction | null {\n return resolveAutoUnlinkAggregationChangeHelper({\n globalAggregation,\n localDateTimeContext: this.localStateSignal().dateTimeContext,\n adjustAggregationForDateTime: args => this.adjustAggregationForDateTime(args),\n updateFieldSources: updater => this.updateFieldSources(updater)\n });\n }\n private applyAggregationChangesForGlobalState(params: {\n incomingState: Partial<GlobalContextState>;\n sources: FieldSourcesMap;\n formUpdates: Partial<GlobalContextState>;\n applyLocalAggregationChange: (change: AggregationChangeInstruction) => void;\n }): boolean {\n return applyAggregationChangesForGlobalStateHelper({\n incomingState: params.incomingState,\n sources: params.sources,\n formUpdates: params.formUpdates,\n adjustAggregationForDateTime: args => this.adjustAggregationForDateTime(args),\n localAggregationSnapshot:\n this.localStateSignal().aggregation ?? this.configSignal().aggregation ?? null,\n globalAggregationSnapshot:\n this.globalStateSignal().aggregation ?? this.configSignal().aggregation ?? null,\n applyLocalAggregationChange: params.applyLocalAggregationChange\n });\n }\n private canAutoRecoverAggregation(): boolean {\n return (\n this.aggregationUnlinkReason?.source === 'validation' &&\n this.aggregationUnlinkReason.canAutoRecover === true\n );\n }\n private attemptAggregationAutoRecover(): boolean {\n if (!this.canAutoRecoverAggregation()) return false;\n this.setAggregationUnlinkReason(null);\n this.updateFieldSources(current => ({ ...current, aggregation: FIELD_SOURCE_GLOBAL }));\n this.updateLocalState(current => {\n if (current.aggregation === undefined) return current;\n const { aggregation: _drop, ...rest } = current;\n return rest;\n });\n return true;\n }\n private syncLocalStateForLinkOutcome(params: {\n outcome: LinkToggleOutcome;\n previousGlobalState: Partial<GlobalContextState>;\n previousLocalState: Partial<GlobalContextState>;\n previousEffectiveConfig: GlobalContextState;\n }): void {\n const { outcome, previousGlobalState, previousLocalState, previousEffectiveConfig } = params;\n if (!outcome.clearLocalKeys.length && !outcome.snapshotKeys.length) return;\n const configSnapshot = structuredClone(this.configSignal());\n this.updateLocalState(current => {\n const updated = { ...current };\n outcome.clearLocalKeys.forEach(key => delete updated[key]);\n outcome.snapshotKeys.forEach(key => {\n const typedKey = key as keyof GlobalContextState;\n let candidate = previousLocalState[typedKey] as\n | GlobalContextState[typeof typedKey]\n | null\n | undefined;\n if (candidate === undefined)\n candidate =\n previousEffectiveConfig[typedKey] ??\n previousGlobalState[typedKey] ??\n configSnapshot[typedKey];\n const resolved = this.resolveSnapshotValue(typedKey, candidate);\n if (resolved === undefined) delete updated[typedKey];\n else (updated as Record<string, unknown>)[typedKey as string] = resolved as unknown;\n });\n return updated;\n });\n }\n private resolveSnapshotValue(\n key: keyof GlobalContextState,\n candidate: GlobalContextState[keyof GlobalContextState] | null | undefined\n ): GlobalContextState[keyof GlobalContextState] | undefined {\n if (candidate !== undefined && candidate !== null) {\n if (key === 'dateTimeContext')\n return this.ensureDateTimeContext(candidate as DateTimeContext);\n if (key === 'refreshOption') return this.normalizeRefreshOption(candidate as RefreshOption);\n return structuredClone(candidate as GlobalContextState[keyof GlobalContextState]);\n }\n if (key === 'dateTimeContext') return this.ensureDateTimeContext(null);\n if (key === 'refreshOption') return this.normalizeRefreshOption(this.getDefaultRefreshOption());\n return undefined;\n }\n private promoteEffectiveDateTimeToLocal(previousEffectiveConfig: GlobalContextState): void {\n const snapshot = previousEffectiveConfig?.dateTimeContext;\n if (!snapshot) return;\n this.updateLocalState(current => ({ ...current, dateTimeContext: structuredClone(snapshot) }));\n }\n private ensureDateTimeContext(\n context: GlobalContextState['dateTimeContext'] | null | undefined\n ): DateTimeContext {\n return ensureDateTimeContextHelper(context, this.configSignal);\n }\n private syncLocalEntriesWithGlobal(): void {\n syncLocalEntriesWithGlobalHelper(\n this.fieldSourcesSignal,\n this.globalStateSignal,\n this.localStateSignal\n );\n }\n}\nexport type {\n AggregationUnlinkReason,\n LinkToggleOutcome,\n ModeServices,\n RefreshResult,\n VisibilityContext\n} from './shared-mode-orchestrator.types';\n","import { Injectable } from '@angular/core';\nimport type { RefreshOption } from '../../../models/auto-refresh.model';\nimport { REFRESH_OPTION } from '../../../models/auto-refresh.model';\nimport type { GlobalContextState } from '../../../models/global-context.model';\nimport { FieldSourcesMap } from './config-composer.util';\nimport { SharedModeOrchestrator, type ModeServices } from './shared-mode-orchestrator';\n\n@Injectable()\nexport class HistoryModeOrchestrator extends SharedModeOrchestrator {\n constructor(services: ModeServices) {\n super(REFRESH_OPTION.HISTORY, services);\n }\n\n protected override normalizeRefreshOption(_nextRefresh: RefreshOption): RefreshOption {\n return REFRESH_OPTION.HISTORY;\n }\n\n protected override applyModeSpecificRefreshOptionChange(\n refreshOption: RefreshOption,\n _sources: FieldSourcesMap\n ): void {\n if (refreshOption !== REFRESH_OPTION.HISTORY) {\n return;\n }\n\n this.updateLocalState(current => {\n if (current.isAutoRefreshEnabled === false) {\n return current;\n }\n return { ...current, isAutoRefreshEnabled: false };\n });\n }\n\n protected override shouldForceDisableAutoRefresh(refreshOption: RefreshOption): boolean {\n return refreshOption === REFRESH_OPTION.HISTORY;\n }\n\n protected override supportsAutoRefresh(_config: GlobalContextState): boolean {\n return false;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { REFRESH_OPTION } from '../../../models/auto-refresh.model';\nimport type { DateTimeContext } from '../../../models/date-time-context-picker.model';\nimport type { GlobalContextState } from '../../../models/global-context.model';\nimport type { TimeInterval } from '../../../models/interval-picker.model';\nimport { TIME_INTERVAL } from '../../../models/interval-picker.model';\nimport { DateTimeContextUtil } from '../../../utils/date-time-context.util';\nimport { FieldSourcesMap } from './config-composer.util';\nimport { SharedModeOrchestrator, type ModeServices } from './shared-mode-orchestrator';\n\n@Injectable()\nexport class LiveModeOrchestrator extends SharedModeOrchestrator {\n constructor(services: ModeServices) {\n super(REFRESH_OPTION.LIVE, services);\n }\n\n protected override applyInitialModeAdjustments(params: {\n isDashboard: boolean;\n localState: Partial<GlobalContextState>;\n fieldSources: FieldSourcesMap;\n generateFreshDateTime: (interval: TimeInterval) => DateTimeContext;\n }): void {\n const { isDashboard, localState, generateFreshDateTime } = params;\n\n // Live mode never has aggregation (business rule)\n delete localState.aggregation;\n\n const interval = localState?.dateTimeContext?.interval;\n\n if (isDashboard || localState?.refreshOption !== REFRESH_OPTION.LIVE || !interval) {\n return;\n }\n\n // For CUSTOM interval: keep dateFrom, update dateTo to now\n // For other intervals: generate fresh dateTimeContext\n if (interval === TIME_INTERVAL.CUSTOM) {\n if (localState.dateTimeContext) {\n localState.dateTimeContext = DateTimeContextUtil.normalizeForLive(\n localState.dateTimeContext\n );\n }\n } else {\n const fresh = generateFreshDateTime(interval as TimeInterval);\n localState.dateTimeContext = fresh;\n }\n }\n}\n","import { Injectable, OnDestroy, inject } from '@angular/core';\nimport { aggregationType } from '@c8y/client';\nimport { Subject, Subscription } from 'rxjs';\nimport type { RefreshOption } from '../../../models/auto-refresh.model';\nimport { REFRESH_OPTION } from '../../../models/auto-refresh.model';\nimport type { LinkStatesMap } from '../../../models/control-flow.model';\nimport type { DateTimeContext } from '../../../models/date-time-context-picker.model';\nimport type {\n GlobalContextEvent,\n GlobalContextState,\n WidgetControls,\n WidgetDisplayMode\n} from '../../../models/global-context.model';\nimport type { TimeInterval } from '../../../models/interval-picker.model';\nimport { AggregationPickerService } from '../../../services/domain/aggregation-picker.service';\nimport { WidgetControlService } from '../../../services/domain/widget-control.service';\nimport { GlobalContextService } from '../../../services/state/global-context.service';\nimport { type FieldSourcesMap } from './config-composer.util';\nimport { HistoryModeOrchestrator } from './history-mode-orchestrator';\nimport { LiveModeOrchestrator } from './live-mode-orchestrator';\nimport { SharedModeOrchestrator } from './shared-mode-orchestrator';\nimport type {\n AggregationChangeInstruction,\n AggregationUnlinkReason,\n ExecuteHandlerContext,\n HandleFormChangeContext,\n HandleGlobalStateChangeContext,\n LinkToggleOutcome,\n ModeServices,\n RefreshResult,\n VisibilityContext\n} from './shared-mode-orchestrator.types';\nimport type { AggregationValidationContext, AggregationValidationResult } from './validation.util';\n\n@Injectable()\nexport class GlobalContextInlineOrchestratorService implements OnDestroy {\n private readonly widgetControlService = inject(WidgetControlService);\n private readonly aggregationPickerService = inject(AggregationPickerService);\n private readonly globalContextService = inject(GlobalContextService);\n\n private readonly live: LiveModeOrchestrator;\n private readonly history: HistoryModeOrchestrator;\n private active: SharedModeOrchestrator;\n private activeMode: RefreshOption = REFRESH_OPTION.LIVE;\n private lastLiveAutoRefresh: boolean | undefined;\n private readonly subscriptions: Subscription[] = [];\n private initSnapshot: {\n initialConfig: GlobalContextState | null;\n widgetControls?: WidgetControls | null;\n isDashboard: boolean;\n generateFreshDateTime: (interval: TimeInterval) => DateTimeContext;\n } | null = null;\n private modeSnapshots: Record<RefreshOption, Partial<GlobalContextState>> = {\n [REFRESH_OPTION.LIVE]: {},\n [REFRESH_OPTION.HISTORY]: {}\n };\n readonly globalContextChange$ = new Subject<GlobalContextEvent>();\n readonly refresh$ = new Subject<void>();\n\n constructor() {\n const services: ModeServices = {\n widgetControlService: this.widgetControlService,\n aggregationPickerService: this.aggregationPickerService,\n globalContextService: this.globalContextService\n };\n this.live = new LiveModeOrchestrator(services);\n this.history = new HistoryModeOrchestrator(services);\n this.active = this.live;\n\n this.subscriptions.push(\n this.live.globalContextChange$.subscribe(event => this.globalContextChange$.next(event)),\n this.history.globalContextChange$.subscribe(event => this.globalContextChange$.next(event)),\n this.live.refresh$.subscribe(() => this.refresh$.next()),\n this.history.refresh$.subscribe(() => this.refresh$.next())\n );\n }\n\n initConfig(config: GlobalContextState | null | undefined): void {\n this.live.initConfig(config);\n this.history.initConfig(config);\n }\n\n initWidgetControls(controls: WidgetControls | null | undefined): void {\n this.live.initWidgetControls(controls);\n this.history.initWidgetControls(controls);\n }\n\n setDisplayMode(mode: WidgetDisplayMode | null | undefined): void {\n this.live.setDisplayMode(mode);\n this.history.setDisplayMode(mode);\n }\n\n getDisplayMode(): WidgetDisplayMode {\n return this.getActive().getDisplayMode();\n }\n\n setLoading(isLoading: boolean): void {\n this.getActive().setLoading(isLoading);\n }\n\n getFieldSources(): FieldSourcesMap {\n return this.getActive().getFieldSources();\n }\n\n setFieldSources(value: FieldSourcesMap): void {\n this.getActive().setFieldSources(value);\n }\n\n updateFieldSources(updater: (sources: FieldSourcesMap) => FieldSourcesMap): void {\n this.getActive().updateFieldSources(updater);\n }\n\n getLocalState(): Partial<GlobalContextState> {\n return this.getActive().getLocalState();\n }\n\n setLocalState(state: Partial<GlobalContextState>): void {\n this.getActive().setLocalState(state);\n }\n\n updateLocalState(\n updater: (state: Partial<GlobalContextState>) => Partial<GlobalContextState>\n ): void {\n this.getActive().updateLocalState(updater);\n }\n\n getGlobalState(): Partial<GlobalContextState> {\n return this.getActive().getGlobalState();\n }\n\n setGlobalState(state: Partial<GlobalContextState>): void {\n const targetMode = (state?.refreshOption as RefreshOption) ?? this.activeMode;\n const normalized = this.normalizeGlobalStateForMode(\n targetMode,\n state,\n this.initSnapshot?.initialConfig ?? null\n );\n\n this.updateModeSnapshot(targetMode, normalized);\n this.propagateSnapshots();\n }\n\n updateGlobalState(\n updater: (state: Partial<GlobalContextState>) => Partial<GlobalContextState>\n ): void {\n const targetMode = this.activeMode;\n const current = this.modeSnapshots[targetMode] ?? {};\n const updated = updater(structuredClone(current)) ?? {};\n const normalized = this.normalizeGlobalStateForMode(\n targetMode,\n updated,\n this.initSnapshot?.initialConfig ?? null\n );\n\n this.updateModeSnapshot(targetMode, normalized);\n this.propagateSnapshots();\n }\n\n initializeStateAndSources(params: {\n initialConfig: GlobalContextState | null;\n globalState: Partial<GlobalContextState>;\n isDashboard: boolean;\n widgetControls?: WidgetControls | null;\n generateFreshDateTime: (interval: TimeInterval) => DateTimeContext;\n forcedRefreshOption?: RefreshOption;\n }): void {\n const baseGlobalState = structuredClone(params.globalState ?? {});\n const liveState = this.normalizeGlobalStateForMode(\n REFRESH_OPTION.LIVE,\n baseGlobalState,\n params.initialConfig\n );\n const historyState = this.normalizeGlobalStateForMode(\n REFRESH_OPTION.HISTORY,\n baseGlobalState,\n params.initialConfig\n );\n\n this.updateModeSnapshot(REFRESH_OPTION.LIVE, liveState);\n this.updateModeSnapshot(REFRESH_OPTION.HISTORY, historyState);\n\n this.initSnapshot = {\n initialConfig: params.initialConfig,\n widgetControls: params.widgetControls ?? null,\n isDashboard: params.isDashboard,\n generateFreshDateTime: params.generateFreshDateTime\n };\n\n const liveParams = {\n ...params,\n globalState: structuredClone(this.modeSnapshots[REFRESH_OPTION.LIVE]),\n forcedRefreshOption: REFRESH_OPTION.LIVE\n };\n const historyParams = {\n ...params,\n globalState: structuredClone(this.modeSnapshots[REFRESH_OPTION.HISTORY]),\n forcedRefreshOption: REFRESH_OPTION.HISTORY\n };\n\n this.live.initializeStateAndSources(liveParams);\n this.history.initializeStateAndSources(historyParams);\n\n // After initialization, sync the fresh states back to snapshots\n // (applyInitialModeAdjustments may have generated fresh dates in local state)\n // Use computeEffectiveConfig to merge local+global states\n const liveEffective = this.live.computeEffectiveConfig(params.initialConfig);\n const historyEffective = this.history.computeEffectiveConfig(params.initialConfig);\n\n this.updateModeSnapshot(REFRESH_OPTION.LIVE, liveEffective);\n this.updateModeSnapshot(REFRESH_OPTION.HISTORY, historyEffective);\n\n // For standalone mode, use widget's refreshOption, not global state\n // For dashboard mode, use global state's refreshOption\n const desiredMode = params.isDashboard\n ? (params.forcedRefreshOption ??\n baseGlobalState.refreshOption ??\n params.initialConfig?.refreshOption ??\n this.activeMode)\n : (params.forcedRefreshOption ?? params.initialConfig?.refreshOption ?? this.activeMode);\n\n this.ensureMode(desiredMode);\n }\n\n handleFormChange(context: HandleFormChangeContext): void {\n const nextRefresh = context.formValue.refreshOption ?? context.previousRefresh;\n this.ensureMode(nextRefresh ?? this.activeMode);\n this.getActive().handleFormChange(context);\n }\n\n handleGlobalStateChange(context: HandleGlobalStateChangeContext): void {\n const nextRefresh = context.state.refreshOption ?? context.previousRefresh;\n this.ensureMode(nextRefresh ?? this.activeMode);\n this.getActive().handleGlobalStateChange(context);\n this.syncActiveSnapshot();\n }\n\n toggleLink(args: {\n key: keyof LinkStatesMap;\n isLinked: boolean;\n fieldSources?: FieldSourcesMap;\n }): LinkToggleOutcome {\n return this.getActive().toggleLink(args);\n }\n\n toggleAllLinks(args: {\n keys: Array<keyof LinkStatesMap>;\n isLinked: boolean;\n fieldSources?: FieldSourcesMap;\n }): LinkToggleOutcome {\n return this.getActive().toggleAllLinks(args);\n }\n\n executeHandler(context: ExecuteHandlerContext): void {\n const nextRefresh = context.configOverride?.refreshOption ?? context.previousRefresh;\n this.ensureMode(nextRefresh ?? this.activeMode);\n this.getActive().executeHandler(context);\n }\n\n processRefresh(params: {\n globalDateTimeContext?: DateTimeContext | null;\n generateFreshDateTime: (interval: TimeInterval) => DateTimeContext;\n }): RefreshResult {\n // Choose orchestrator based on mode:\n // - Dashboard mode: use global state's refreshOption\n // - Standalone mode: use effective config's refreshOption (local state)\n const isDashboard = this.initSnapshot?.isDashboard ?? false;\n const effectiveRefreshOption = isDashboard\n ? (this.getGlobalState().refreshOption ?? this.activeMode)\n : (this.getActive().computeEffectiveConfig(this.initSnapshot?.initialConfig ?? null)\n .refreshOption ?? this.activeMode);\n\n this.ensureMode(effectiveRefreshOption);\n return this.getActive().processRefresh(params);\n }\n\n applyRefreshOptionChange(params: {\n previousRefresh?: RefreshOption;\n nextRefresh?: RefreshOption;\n }): { refreshOption?: RefreshOption; forceDisableAutoRefresh?: boolean } {\n const desiredMode = params.nextRefresh ?? this.activeMode;\n this.ensureMode(desiredMode);\n\n const outcome = this.getActive().applyRefreshOptionChange(params);\n\n if (outcome.refreshOption) {\n this.ensureMode(outcome.refreshOption);\n }\n\n return outcome;\n }\n\n updateGlobalStateFromForm(\n formValue: Partial<GlobalContextState>,\n sources: FieldSourcesMap\n ): void {\n this.getActive().updateGlobalStateFromForm(formValue, sources);\n this.syncActiveSnapshot();\n }\n\n processGlobalStateChange(\n state: Partial<GlobalContextState>,\n sources: FieldSourcesMap\n ): Partial<GlobalContextState> {\n const result = this.getActive().processGlobalStateChange(state, sources);\n this.syncActiveSnapshot();\n return result;\n }\n\n validateAggregationLink(context: AggregationValidationContext): AggregationValidationResult {\n return this.getActive().validateAggregationLink(context);\n }\n\n deriveAggregationValue(config: GlobalContextState | null | undefined): aggregationType | null {\n return this.getActive().deriveAggregationValue(config);\n }\n\n calculateAggregation(\n dateTimeContext: DateTimeContext | null | undefined,\n currentAggregation: aggregationType | null | undefined\n ): aggregationType | null {\n return this.getActive().calculateAggregation(dateTimeContext, currentAggregation);\n }\n\n adjustAggregationForDateTime(params: {\n dateTimeContext: DateTimeContext;\n aggregation: aggregationType | null;\n }): { nextAggregation: aggregationType | null; changed: boolean } {\n return this.getActive().adjustAggregationForDateTime(params);\n }\n\n resolveAggregationChangeForForm(params: {\n formValue: Partial<GlobalContextState>;\n sources: FieldSourcesMap;\n }): AggregationChangeInstruction | null {\n return this.getActive().resolveAggregationChangeForForm(params);\n }\n\n shouldValidateAggregationForUnlinkedDateTime(\n state: Partial<GlobalContextState>,\n sources: FieldSourcesMap\n ): boolean {\n return this.getActive().shouldValidateAggregationForUnlinkedDateTime(state, sources);\n }\n\n getLinkDisableReasons(): Partial<Record<keyof GlobalContextState, string>> {\n return this.getActive().getLinkDisableReasons();\n }\n\n getAggregationUnlinkReason(): AggregationUnlinkReason | null {\n return this.getActive().getAggregationUnlinkReason();\n }\n\n computeEffectiveConfig(baseConfig: GlobalContextState | null | undefined): GlobalContextState {\n return this.getActive().computeEffectiveConfig(baseConfig);\n }\n\n resolveVisibilityContext(\n config: GlobalContextState | null | undefined\n ): VisibilityContext | null {\n return this.getActive().resolveVisibilityContext(config);\n }\n\n emitConfiguration(\n componentId: string,\n configuration: GlobalContextState | null | undefined\n ): GlobalContextState {\n return this.getActive().emitConfiguration(componentId, configuration);\n }\n\n getLatestVisibility(): VisibilityContext | null {\n return this.getActive().getLatestVisibility();\n }\n\n getConfigSnapshot(): GlobalContextState {\n return this.getActive().getConfigSnapshot();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach(subscription => subscription.unsubscribe());\n this.live.ngOnDestroy();\n this.history.ngOnDestroy();\n }\n\n private ensureMode(refreshOption?: RefreshOption | null): void {\n const desired =\n refreshOption === REFRESH_OPTION.HISTORY ? REFRESH_OPTION.HISTORY : REFRESH_OPTION.LIVE;\n const previous = this.activeMode;\n\n if (desired === previous) {\n return;\n }\n\n this.activeMode = desired;\n this.active = desired === REFRESH_OPTION.HISTORY ? this.history : this.live;\n this.resetActiveMode();\n }\n\n private getActive(): SharedModeOrchestrator {\n return this.active;\n }\n\n private resetActiveMode(): void {\n if (!this.initSnapshot) {\n return;\n }\n\n const isDashboard = this.initSnapshot.isDashboard;\n const snapshot = this.modeSnapshots[this.activeMode] ?? {};\n\n // For standalone mode, use the snapshot as initialConfig so fresh dates are preserved\n // For dashboard mode, use original initialConfig and snapshot goes to globalState\n const effectiveInitialConfig = isDashboard\n ? this.initSnapshot.initialConfig\n : (snapshot as GlobalContextState);\n\n const params = {\n initialConfig: effectiveInitialConfig,\n globalState: structuredClone(snapshot),\n isDashboard,\n widgetControls: this.initSnapshot.widgetControls,\n generateFreshDateTime: this.initSnapshot.generateFreshDateTime,\n forcedRefreshOption: this.activeMode\n };\n\n this.getActive().initializeStateAndSources(params);\n }\n\n private normalizeGlobalStateForMode(\n mode: RefreshOption,\n state: Partial<GlobalContextState> | null | undefined,\n initialConfig: GlobalContextState | null\n ): Partial<GlobalContextState> {\n const seed: Partial<GlobalContextState> = {\n ...(this.modeSnapshots?.[mode] ?? {}),\n ...(state ?? {})\n };\n const normalized = structuredClone(seed);\n\n normalized.refreshOption = mode;\n\n if (mode === REFRESH_OPTION.LIVE) {\n const restored =\n this.lastLiveAutoRefresh ??\n state?.isAutoRefreshEnabled ??\n initialConfig?.isAutoRefreshEnabled;\n\n if (restored !== undefined) {\n normalized.isAutoRefreshEnabled = restored;\n } else {\n delete normalized.isAutoRefreshEnabled;\n }\n\n // Live mode always has aggregation=null (business rule)\n delete normalized.aggregation;\n } else {\n if (state?.isAutoRefreshEnabled !== undefined) {\n this.lastLiveAutoRefresh = state.isAutoRefreshEnabled;\n }\n normalized.isAutoRefreshEnabled = false;\n }\n\n return normalized;\n }\n\n private syncActiveSnapshot(propagate = true): void {\n const current = this.getActive().getGlobalState() ?? {};\n this.updateModeSnapshot(this.activeMode, current);\n if (propagate) {\n this.propagateSnapshots();\n }\n }\n\n private updateModeSnapshot(mode: RefreshOption, snapshot: Partial<GlobalContextState>): void {\n this.modeSnapshots[mode] = structuredClone(snapshot ?? {});\n\n if (mode === REFRESH_OPTION.LIVE) {\n this.captureLiveAutoRefresh(this.modeSnapshots[mode]);\n }\n }\n\n private propagateSnapshots(): void {\n this.live.setGlobalState(structuredClone(this.modeSnapshots[REFRESH_OPTION.LIVE] ?? {}));\n this.history.setGlobalState(structuredClone(this.modeSnapshots[REFRESH_OPTION.HISTORY] ?? {}));\n }\n\n private captureLiveAutoRefresh(state: Partial<GlobalContextState> | null | undefined): void {\n if (!state) {\n return;\n }\n\n const refreshOption = state.refreshOption ?? REFRESH_OPTION.LIVE;\n\n if (refreshOption !== REFRESH_OPTION.LIVE) {\n return;\n }\n\n if (state.isAutoRefreshEnabled !== undefined) {\n this.lastLiveAutoRefresh = state.isAutoRefreshEnabled;\n }\n }\n}\n\nexport type {\n AggregationUnlinkReason,\n RefreshResult,\n VisibilityContext\n} from './shared-mode-orchestrator';\n","import { NgTemplateOutlet, NgClass } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n EffectRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n signal,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { aggregationType } from '@c8y/client';\nimport { C8yTranslatePipe, DashboardChildComponent, IconDirective } from '@c8y/ngx-components';\nimport { isEqual } from 'lodash-es';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { AggregationPickerComponent } from '../features/aggregation/aggregation-picker';\nimport { AutoRefreshControlComponent } from '../features/refresh/auto-refresh';\nimport { DateTimeContextPickerComponent } from '../features/time-context/time-range-picker/date-time-context-picker.component';\nimport type { RefreshOption } from '../models/auto-refresh.model';\nimport { REFRESH_OPTION } from '../models/auto-refresh.model';\nimport type {\n ControlConfigsMap,\n LinkStatesMap,\n LinkToggleEvent\n} from '../models/control-flow.model';\nimport { LINK_BTNS_CONFIG } from '../models/control-flow.model';\nimport type { DateTimeContext } from '../models/date-time-context-picker.model';\nimport type {\n GlobalContextDisplayMode,\n GlobalContextSettings,\n GlobalContextState,\n WidgetControls,\n WidgetDisplayMode,\n WidgetState,\n WidgetStateHandlerResult\n} from '../models/global-context.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GLOBAL_CONTEXT_EVENTS,\n WIDGET_DISPLAY_MODE\n} from '../models/global-context.model';\nimport { AggregationValidationService } from '../services/domain/aggregation-validation.service';\nimport { GlobalContextEventService } from '../services/state/global-context-event.service';\nimport { GlobalContextFormService } from '../services/state/global-context-form.service';\nimport { GlobalContextService } from '../services/state/global-context.service';\nimport type {\n LinkHelpersContext,\n RefreshHelpersContext\n} from './widget-inline/inline-context.models';\nimport { GlobalContextLinkControlsComponent } from './widget-inline/inline-link-controls.component';\nimport {\n applyConfigOverride as applyConfigOverrideHelper,\n applyHandlerResult as applyHandlerResultHelper,\n buildControlLinkConfig as buildControlLinkConfigHelper,\n buildWidgetState as buildWidgetStateHelper,\n handleLinkToggle as handleLinkToggleHelper,\n toggleAllLinks as toggleAllLinksHelper\n} from './widget-inline/inline-link-helpers';\nimport {\n applyLocalAggregationChange as applyLocalAggregationChangeHelper,\n calculateDisabledAggregationsFromContext as calculateDisabledAggregationsFromContextHelper,\n deriveDisabledAggregations as deriveDisabledAggregationsHelper,\n generateFreshDateTimeContext,\n getShouldDisableIntervalConfig as getShouldDisableIntervalConfigHelper,\n handleGlobalRefresh as handleGlobalRefreshHelper,\n patchFormValues as patchFormValuesHelper,\n processRefreshEvent as processRefreshEventHelper,\n recalculateAggregationForGlobalDateTime,\n recalculateAggregationForLocalDateTime,\n updateAggregationValue as updateAggregationValueHelper\n} from './widget-inline/inline-refresh-helpers';\nimport {\n FIELD_SOURCE_GLOBAL,\n FIELD_SOURCE_LOCAL,\n type FieldSourcesMap\n} from './widget-inline/orchestrator/config-composer.util';\nimport {\n GlobalContextInlineOrchestratorService,\n type RefreshResult,\n type VisibilityContext\n} from './widget-inline/orchestrator/global-context-inline-orchestrator.service';\nimport type { AggregationChangeInstruction } from './widget-inline/orchestrator/shared-mode-orchestrator.types';\nconst EMIT_EVENT_DISABLED = { emitEvent: false };\n@Component({\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ReactiveFormsModule,\n GlobalContextLinkControlsComponent,\n AggregationPickerComponent,\n AutoRefreshControlComponent,\n DateTimeContextPickerComponent,\n IconDirective,\n C8yTranslatePipe,\n TooltipModule,\n NgTemplateOutlet,\n NgClass\n ],\n selector: 'c8y-global-context-inline',\n templateUrl: './global-context-inline.component.html',\n exportAs: 'globalContextInline',\n providers: [GlobalContextInlineOrchestratorService]\n})\nexport class GlobalContextInlineComponent implements OnInit, AfterViewInit, OnDestroy {\n private readonly componentId = crypto.randomUUID();\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n readonly REFRESH_OPTION = REFRESH_OPTION;\n // --- Service Injections ---\n private readonly destroyReference = inject(DestroyRef);\n private readonly globalContextService = inject(GlobalContextService);\n private readonly globalContextEventService = inject(GlobalContextEventService);\n private readonly globalContextFormService = inject(GlobalContextFormService);\n private readonly aggregationValidationService = inject(AggregationValidationService);\n private readonly orchestrator = inject(GlobalContextInlineOrchestratorService);\n private readonly injectedDashboardChild = inject(DashboardChildComponent, { optional: true });\n // --- Inputs ---\n widgetControls = input.required<WidgetControls>();\n config = input<GlobalContextState | null>(null);\n isLoading = input(false);\n dashboardChildForLegacy = input<DashboardChildComponent>();\n // --- Outputs ---\n readonly refresh = output<Partial<DateTimeContext> | null>();\n readonly globalContextChange = output<Partial<GlobalContextState>>();\n // --- Signals for State Management ---\n private inlineOverrides = signal<Partial<GlobalContextSettings>>({});\n private dashboardOverrides = signal<Partial<GlobalContextSettings>>({});\n private viewInitCompleted = signal(false);\n // --- Derived State from Signals ---\n readonly effectiveConfig = computed(() =>\n this.orchestrator.computeEffectiveConfig(this.config())\n );\n private readonly visibilityContext = computed<VisibilityContext | null>(() =>\n this.orchestrator.resolveVisibilityContext(this.effectiveConfig())\n );\n readonly inlineSettings = computed(() => {\n const base = this.visibilityContext()?.settings ?? {};\n return { ...base, ...this.inlineOverrides() };\n });\n readonly dashboardControlSettings = computed(() => {\n const base = this.visibilityContext()?.dashboardControls ?? {};\n return { ...base, ...this.dashboardOverrides() };\n });\n readonly controlLinkStatus = computed(() => this.visibilityContext()?.links ?? {});\n readonly disabledAggregations = computed(() =>\n deriveDisabledAggregationsHelper(this.getRefreshContext())\n );\n readonly linkDisplayModel = computed(() => {\n const settings = this.inlineSettings() ?? {};\n const linkStates = this.controlLinkStatus() ?? {};\n const { controlConfig, filteredStates } = buildControlLinkConfigHelper(\n this.getLinkContext(),\n settings,\n Object.keys(linkStates).length ? linkStates : null\n );\n\n return {\n controlConfig,\n linkStates: filteredStates,\n showHeaderLinks: this.effectiveConfig().displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD\n };\n });\n // --- Other Properties ---\n form!: FormGroup;\n shouldDisableCounter = false;\n readonly controlLinksConfig: ControlConfigsMap = LINK_BTNS_CONFIG;\n @ViewChild('headerContent', { static: true, read: TemplateRef })\n private headerTemplateRef?: TemplateRef<unknown>;\n private registeredHeaderTemplate: TemplateRef<unknown> | null = null;\n private registeredDashboardChild: DashboardChildComponent | null = null;\n private headerEffectRef: EffectRef | null = null;\n private linkContextCache: LinkHelpersContext | null = null;\n constructor() {\n // Effects are set up once, initialization will set form afterwards\n this.setupEffects();\n effect(() => {\n const cfg = this.config();\n this.orchestrator.initConfig(cfg ?? {});\n this.orchestrator.setDisplayMode(this.mapToWidgetDisplayMode(cfg?.displayMode));\n this.orchestrator.initWidgetControls(this.widgetControls());\n });\n this.headerEffectRef = effect(() => {\n if (!this.viewInitCompleted()) {\n return;\n }\n const displayMode = this.effectiveConfig().displayMode;\n const dashboardChild = this.resolveDashboardChild();\n const shouldProject =\n !!dashboardChild && displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n const template = shouldProject ? (this.headerTemplateRef ?? null) : null;\n this.updateDashboardHeaderRegistration(template, dashboardChild);\n });\n }\n getDisabledAggregations(): Partial<Record<aggregationType, boolean>> {\n const dateTimeContext = this.getFormDateTimeContext();\n if (!this.hasValidDateRange(dateTimeContext)) {\n return this.disabledAggregations();\n }\n return calculateDisabledAggregationsFromContextHelper(\n this.getRefreshContext(),\n dateTimeContext as DateTimeContext\n );\n }\n shouldShowHeaderLinks(): boolean {\n return this.linkDisplayModel().showHeaderLinks;\n }\n shouldRenderHeaderInline(): boolean {\n const dashboardChild = this.resolveDashboardChild();\n return (\n !dashboardChild ||\n this.effectiveConfig().displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD\n );\n }\n getAutoRefreshSeconds(): number | null {\n if (!this.form) return null;\n const value = this.form.get('refreshInterval')?.value;\n return value == null ? null : typeof value === 'string' ? Number(value) : value;\n }\n getIntervalDisableConfig(): Record<string, boolean> {\n return this.getShouldDisableIntervalConfig();\n }\n ngOnInit(): void {\n this.initialize();\n }\n ngAfterViewInit(): void {\n this.viewInitCompleted.set(true);\n const dashboardChild = this.resolveDashboardChild();\n const displayMode = this.effectiveConfig().displayMode;\n const template =\n dashboardChild && displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD\n ? (this.headerTemplateRef ?? null)\n : null;\n this.updateDashboardHeaderRegistration(template, dashboardChild);\n }\n ngOnDestroy(): void {\n this.headerEffectRef?.destroy();\n this.cleanupRegisteredHeaderTemplate();\n this.globalContextService.unregister(this.componentId);\n this.globalContextService.unregisterLoading(this.componentId);\n }\n // --- Public API methods (ordering: public before private) ---\n handleLinkToggle(\n event: LinkToggleEvent,\n options?: {\n suppressEmit?: boolean;\n fromHandler?: boolean;\n }\n ): boolean {\n return handleLinkToggleHelper(this.getLinkContext(), event, options);\n }\n toggleAllLinks(isLinked: boolean, suppressRefresh?: boolean, suppressEmit?: boolean): void {\n const supportedLinks = Object.keys(this.controlLinkStatus() || {}) as Array<\n keyof LinkStatesMap\n >;\n if (!supportedLinks.length) {\n return;\n }\n\n // When unlinking: suppress both refresh and emit (data is already loaded)\n // When linking: allow both refresh and emit unless explicitly suppressed\n const shouldSuppressRefresh = suppressRefresh ?? !isLinked;\n const shouldSuppressEmit = suppressEmit ?? !isLinked;\n\n toggleAllLinksHelper(this.getLinkContext(), {\n keys: supportedLinks as Array<keyof LinkStatesMap>,\n isLinked,\n suppressRefresh: shouldSuppressRefresh,\n suppressEmit: shouldSuppressEmit\n });\n }\n\n updateDateTimeContext(dateTimeContext: any): void {\n this.orchestrator.updateLocalState(state => ({\n ...state,\n dateTimeContext: structuredClone(dateTimeContext)\n }));\n\n const dateTimeControl = this.form?.get('dateTimeContext');\n if (dateTimeControl) {\n dateTimeControl.setValue(structuredClone(dateTimeContext), { emitEvent: false });\n }\n }\n\n /**\n * Pause auto-refresh: sets isAutoRefreshEnabled to false and unlinks all controls.\n * This stops the auto-refresh timer and prevents the widget from receiving\n * updates from the global context.\n *\n * NOTE: Does NOT trigger any refresh or emit - data is already loaded, no updates needed.\n */\n pauseAutoRefresh(): void {\n // Step 1: Unlink all controls without any emissions (data already loaded)\n this.toggleAllLinks(\n false, // isLinked = false\n true, // suppressRefresh = true\n true // suppressEmit = true\n );\n\n // Step 2: Set isAutoRefreshEnabled to false without emitting events\n this.setAutoRefreshEnabled(false);\n }\n\n /**\n * Resume auto-refresh: sets isAutoRefreshEnabled to true and links all controls.\n * This starts the auto-refresh timer and allows the widget to receive\n * updates from the global context.\n *\n * NOTE: Triggers emissions and refresh to sync with the current global context state.\n */\n resumeAutoRefresh(): void {\n this.toggleAllLinks(true, false, false);\n this.setAutoRefreshEnabled(true);\n }\n\n triggerHandler(handlerName: string, configOverride?: GlobalContextState | null): void {\n const handler = this.widgetControls()?.stateHandlers?.[handlerName];\n const previousRefresh = this.effectiveConfig().refreshOption;\n this.orchestrator.executeHandler({\n handler,\n configOverride,\n previousRefresh,\n applyRefreshOptionChange: (prev, next) => this.applyRefreshOptionChange(prev, next),\n buildWidgetState: override => this.buildWidgetState(override ?? null),\n applyHandlerResult: result => this.applyHandlerResult(result),\n applyConfigOverride: config => {\n if (config) {\n this.applyConfigOverride(config);\n }\n },\n emitBasedOnFieldSources: config => this.emitConfiguration(config),\n requestRefresh: () => this.refresh.emit(null)\n });\n }\n onLocalRefreshTrigger(): void {\n const outcome = this.processRefreshEvent({\n globalDateTimeContext:\n this.getGlobalState().dateTimeContext ?? this.config()?.dateTimeContext ?? null\n });\n if (!outcome.shouldEmitRefresh) {\n this.refresh.emit(null);\n }\n }\n\n private setAutoRefreshEnabled(enabled: boolean): void {\n const autoRefreshControl = this.form?.get('isAutoRefreshEnabled');\n if (autoRefreshControl && autoRefreshControl.value !== enabled) {\n autoRefreshControl.setValue(enabled, { emitEvent: false });\n }\n }\n\n private mapToWidgetDisplayMode(mode?: GlobalContextDisplayMode | null): WidgetDisplayMode {\n switch (mode) {\n case GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG:\n return WIDGET_DISPLAY_MODE.CONFIG;\n case GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG:\n return WIDGET_DISPLAY_MODE.INLINE;\n case GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD:\n return WIDGET_DISPLAY_MODE.INLINE;\n case null:\n case undefined:\n return WIDGET_DISPLAY_MODE.INLINE;\n default: {\n // Exhaustive check: ensures all modes are handled at compile time\n // TypeScript can't verify template literal types match enum members perfectly\n const _exhaustive: never = mode as never;\n return WIDGET_DISPLAY_MODE.INLINE;\n }\n }\n }\n private applyConfigOverride(config: Partial<GlobalContextState>): void {\n applyConfigOverrideHelper(this.getLinkContext(), config);\n }\n private buildWidgetState(configOverride?: GlobalContextState | null): WidgetState {\n return buildWidgetStateHelper(this.getLinkContext(), configOverride);\n }\n private applyHandlerResult(result: WidgetStateHandlerResult): boolean {\n return applyHandlerResultHelper(this.getLinkContext(), result);\n }\n\n private getFormDateTimeContext(): DateTimeContext | null {\n return this.form?.get('dateTimeContext')?.value;\n }\n\n private hasValidDateRange(dateTimeContext: DateTimeContext | null): boolean {\n return !!dateTimeContext?.dateFrom && !!dateTimeContext?.dateTo;\n }\n private applyRefreshOptionChange(\n previousRefresh: RefreshOption | undefined,\n nextRefresh: RefreshOption | undefined\n ): void {\n const outcome = this.orchestrator.applyRefreshOptionChange({\n previousRefresh,\n nextRefresh\n });\n if (!outcome.refreshOption) {\n return;\n }\n this.inlineOverrides.set({});\n this.dashboardOverrides.set({});\n this.form?.patchValue({ refreshOption: outcome.refreshOption }, EMIT_EVENT_DISABLED);\n if (outcome.forceDisableAutoRefresh) {\n this.form?.patchValue({ isAutoRefreshEnabled: false }, EMIT_EVENT_DISABLED);\n }\n }\n private getFieldSources(): FieldSourcesMap {\n return this.orchestrator.getFieldSources() || {};\n }\n private getLocalState(): Partial<GlobalContextState> {\n return this.orchestrator.getLocalState();\n }\n private updateLocalState(\n updater: (state: Partial<GlobalContextState>) => Partial<GlobalContextState>\n ): void {\n this.orchestrator.updateLocalState(updater);\n }\n private getGlobalState(): Partial<GlobalContextState> {\n return this.orchestrator.getGlobalState();\n }\n private initialize(): void {\n const initialConfig = this.config() || {};\n this.inlineOverrides.set({});\n this.dashboardOverrides.set({});\n this.orchestrator.initConfig(initialConfig);\n this.orchestrator.initWidgetControls(this.widgetControls());\n this.orchestrator.setDisplayMode(this.getInitialDisplayMode(initialConfig));\n this.initializeForm(initialConfig);\n this.initializeStateAndSources(initialConfig);\n this.syncFormWithEffectiveConfig();\n this.setupSubscriptions();\n this.emitBasedOnFieldSources();\n this.setupWidgetOptions();\n }\n private getInitialDisplayMode(initialConfig: GlobalContextState | null): WidgetDisplayMode {\n const mode = initialConfig?.displayMode ?? GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n switch (mode) {\n case GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG:\n return WIDGET_DISPLAY_MODE.CONFIG;\n case GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG:\n return WIDGET_DISPLAY_MODE.INLINE;\n case GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD:\n return WIDGET_DISPLAY_MODE.INLINE;\n default: {\n // Exhaustive check: ensures all modes are handled at compile time\n // TypeScript can't verify template literal types match enum members perfectly\n const _exhaustive: never = mode as never;\n return WIDGET_DISPLAY_MODE.INLINE;\n }\n }\n }\n private initializeForm(initialConfig: GlobalContextState | null): void {\n this.form = this.globalContextFormService.buildForm(initialConfig);\n }\n private syncFormWithEffectiveConfig(): void {\n const effectiveValues = this.effectiveConfig();\n if (effectiveValues && this.form) {\n this.form.patchValue(effectiveValues, EMIT_EVENT_DISABLED);\n }\n }\n private setupWidgetOptions(): void {\n const template = this.widgetControls();\n this.shouldDisableCounter = !!template?.options?.noAutoRefreshCounter;\n }\n private setupEffects(): void {\n // Remove automatic form syncing - form should be controlled by local state changes\n // and user interactions only, not by derived effective config\n // Register loading state reactively\n effect(() => {\n const loading = this.isLoading();\n const inDashboard =\n this.effectiveConfig().displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n const autoLinked = this.getFieldSources()?.isAutoRefreshEnabled === FIELD_SOURCE_GLOBAL;\n if (inDashboard && autoLinked && loading) {\n this.globalContextService.registerLoading(this.componentId);\n } else {\n this.globalContextService.unregisterLoading(this.componentId);\n }\n });\n }\n private setupSubscriptions(): void {\n this.subscribeToFormChanges();\n if (this.isDashboardMode()) {\n this.subscribeToGlobalStateChanges();\n this.subscribeToGlobalRefreshEvents();\n }\n }\n private subscribeToFormChanges(): void {\n this.form.valueChanges\n .pipe(\n distinctUntilChanged((previous, current) => isEqual(previous, current)),\n takeUntilDestroyed(this.destroyReference)\n )\n .subscribe(formValue => {\n this.handleFormChange(formValue);\n });\n }\n private handleFormChange(formValue: Partial<GlobalContextState>): void {\n const sources = this.getFieldSources();\n const normalizedFormValue = { ...formValue };\n\n if (\n this.effectiveConfig().refreshOption === REFRESH_OPTION.HISTORY &&\n sources.refreshOption === FIELD_SOURCE_LOCAL &&\n formValue.refreshOption === REFRESH_OPTION.LIVE\n ) {\n normalizedFormValue.refreshOption = REFRESH_OPTION.HISTORY;\n this.form.patchValue({ refreshOption: REFRESH_OPTION.HISTORY }, EMIT_EVENT_DISABLED);\n }\n\n this.orchestrator.handleFormChange({\n formValue: normalizedFormValue,\n getFieldSources: () => this.getFieldSources(),\n applyFormChangesToLocalState: value => this.applyFormChangesToLocalState(value),\n shouldValidateAggregation: value => this.shouldValidateAggregation(value),\n applyLocalAggregationChange: change => this.applyLocalAggregationChange(change),\n applyRefreshOptionChange: (prev, next) => this.applyRefreshOptionChange(prev, next),\n previousRefresh: this.effectiveConfig().refreshOption,\n updateGlobalStateFromForm: (value, sources) =>\n this.orchestrator.updateGlobalStateFromForm(value, sources as FieldSourcesMap),\n emitUpdate: config => this.emitConfiguration(config),\n emitRefresh: payload => this.refresh.emit(payload ?? null)\n });\n }\n private shouldValidateAggregation(formValue: Partial<GlobalContextState>): boolean {\n return !!formValue.dateTimeContext && !!this.form.get('aggregation');\n }\n private applyFormChangesToLocalState(formValue: Partial<GlobalContextState>): void {\n this.updateLocalState(current => ({ ...current, ...formValue }));\n }\n private subscribeToGlobalStateChanges(): void {\n this.globalContextEventService\n .on(GLOBAL_CONTEXT_EVENTS.STATE_CHANGE)\n .pipe(takeUntilDestroyed(this.destroyReference))\n .subscribe(state => this.handleGlobalStateChange(state));\n }\n private handleGlobalStateChange(state: Partial<GlobalContextState> | null): void {\n if (!state) {\n return;\n }\n this.orchestrator.handleGlobalStateChange({\n state,\n getFieldSources: () => this.getFieldSources(),\n previousRefresh: this.effectiveConfig().refreshOption,\n processGlobalStateChange: (incoming, sources) =>\n this.orchestrator.processGlobalStateChange(incoming, sources as FieldSourcesMap),\n shouldValidateAggregationForUnlinkedDateTime: (incoming, sources) =>\n this.orchestrator.shouldValidateAggregationForUnlinkedDateTime(\n incoming,\n sources as FieldSourcesMap\n ),\n applyLocalAggregationChange: change => this.applyLocalAggregationChange(change),\n applyRefreshOptionChange: (prev, next) => this.applyRefreshOptionChange(prev, next),\n patchForm: updates => this.patchFormValues(updates),\n emitUpdate: config => this.emitConfiguration(config),\n emitRefresh: payload => this.refresh.emit(payload ?? null)\n });\n }\n private subscribeToGlobalRefreshEvents(): void {\n this.globalContextEventService\n .on(GLOBAL_CONTEXT_EVENTS.REFRESH)\n .pipe(takeUntilDestroyed(this.destroyReference))\n .subscribe(dateTimeContext => {\n if (dateTimeContext) {\n this.handleGlobalRefresh(dateTimeContext as DateTimeContext);\n }\n });\n }\n private isDashboardMode(config: GlobalContextState | null = null): boolean {\n if (config) {\n return config.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n }\n return this.effectiveConfig().displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n }\n private initializeStateAndSources(initialConfig: GlobalContextState | null): void {\n const isDashboard = this.isDashboardMode(initialConfig);\n const globalState =\n this.globalContextEventService.getLatestValue(GLOBAL_CONTEXT_EVENTS.STATE_CHANGE) || {};\n this.orchestrator.initializeStateAndSources({\n initialConfig,\n globalState,\n isDashboard,\n widgetControls: this.widgetControls(),\n generateFreshDateTime: interval => generateFreshDateTimeContext(interval)\n });\n }\n\n private handleGlobalRefresh(globalDateTimeContext: DateTimeContext): void {\n handleGlobalRefreshHelper(this.getRefreshContext(), globalDateTimeContext);\n }\n private processRefreshEvent(params: {\n globalDateTimeContext?: DateTimeContext | null;\n }): RefreshResult {\n return processRefreshEventHelper(this.getRefreshContext(), params);\n }\n\n private getShouldDisableIntervalConfig(): Record<string, boolean> {\n return getShouldDisableIntervalConfigHelper(this.getRefreshContext());\n }\n\n private resolveDashboardChild(): DashboardChildComponent | null {\n return this.dashboardChildForLegacy() ?? this.injectedDashboardChild ?? null;\n }\n private updateDashboardHeaderRegistration(\n template: TemplateRef<unknown> | null,\n dashboardChild: DashboardChildComponent | null\n ): void {\n // Handle early exits and cleanup in one conditional block\n const isDifferentDashboardChild =\n this.registeredDashboardChild && this.registeredDashboardChild !== dashboardChild;\n const isMissingRequiredData = !template || !dashboardChild;\n const isAlreadyRegistered =\n this.registeredHeaderTemplate === template &&\n this.registeredDashboardChild === dashboardChild;\n\n if (isDifferentDashboardChild || isMissingRequiredData) {\n this.removeHeaderFromDashboard();\n if (isMissingRequiredData) {\n return;\n }\n }\n\n if (isAlreadyRegistered) {\n return;\n }\n\n this.removeHeaderFromDashboard();\n const headers = dashboardChild.additionalHeaderTemplates;\n if (!headers.includes(template)) {\n headers.push(template);\n }\n this.registeredHeaderTemplate = template;\n this.registeredDashboardChild = dashboardChild;\n }\n private cleanupRegisteredHeaderTemplate(): void {\n this.removeHeaderFromDashboard();\n }\n private removeHeaderFromDashboard(): void {\n if (this.registeredDashboardChild && this.registeredHeaderTemplate) {\n const headers = this.registeredDashboardChild.additionalHeaderTemplates;\n const index = headers.indexOf(this.registeredHeaderTemplate);\n if (index >= 0) {\n headers.splice(index, 1);\n }\n }\n this.registeredHeaderTemplate = null;\n this.registeredDashboardChild = null;\n }\n private emitBasedOnFieldSources(): void {\n this.emitConfiguration(this.effectiveConfig());\n }\n private emitConfiguration(configuration: GlobalContextState): void {\n const safe = this.orchestrator.emitConfiguration(this.componentId, configuration);\n this.globalContextChange.emit(safe);\n }\n private patchFormValues(formUpdates: Partial<GlobalContextState>): void {\n patchFormValuesHelper(this.getRefreshContext(), formUpdates);\n }\n\n private applyLocalAggregationChange(change: AggregationChangeInstruction): void {\n applyLocalAggregationChangeHelper(this.getRefreshContext(), change);\n }\n private getRefreshContext(): RefreshHelpersContext {\n return {\n orchestrator: this.orchestrator,\n aggregationValidationService: this.aggregationValidationService,\n getFieldSources: () => this.getFieldSources(),\n getLocalState: () => this.getLocalState(),\n getGlobalState: () => this.getGlobalState(),\n updateLocalState: updater => this.updateLocalState(updater),\n updateGlobalState: updater => this.orchestrator.updateGlobalState(updater),\n getEffectiveConfig: () => this.effectiveConfig(),\n getInitialConfig: () => this.config(),\n emitBasedOnFieldSources: () => this.emitBasedOnFieldSources(),\n emitRefresh: payload => this.refresh.emit(payload ?? null),\n form: () => this.form\n };\n }\n private getLinkContext(): LinkHelpersContext {\n if (!this.linkContextCache) {\n this.linkContextCache = this.createLinkContext();\n }\n return this.linkContextCache;\n }\n\n private createLinkContext(): LinkHelpersContext {\n return {\n orchestrator: this.orchestrator,\n getFieldSources: () => this.getFieldSources(),\n getEffectiveConfig: () => this.effectiveConfig(),\n getInitialConfig: () => this.config(),\n getLocalState: () => this.getLocalState(),\n getGlobalState: () => this.getGlobalState(),\n updateLocalState: updater => this.updateLocalState(updater),\n emitBasedOnFieldSources: () => this.emitBasedOnFieldSources(),\n emitRefresh: payload => this.refresh.emit(payload ?? null),\n form: () => this.form,\n inlineOverrides: this.inlineOverrides.asReadonly(),\n setInlineOverrides: value => this.inlineOverrides.set(value),\n dashboardOverrides: this.dashboardOverrides.asReadonly(),\n setDashboardOverrides: value => this.dashboardOverrides.set(value),\n inlineSettings: () => this.inlineSettings() ?? {},\n dashboardControlSettings: () => this.dashboardControlSettings() ?? {},\n controlLinkStatus: () => this.controlLinkStatus() ?? {},\n updateAggregationValue: aggregation =>\n updateAggregationValueHelper(this.getRefreshContext(), aggregation),\n applyLocalAggregationChange: change =>\n applyLocalAggregationChangeHelper(this.getRefreshContext(), change),\n recalcLocalAggregation: () =>\n recalculateAggregationForLocalDateTime(this.getRefreshContext()),\n recalcGlobalAggregation: () =>\n recalculateAggregationForGlobalDateTime(this.getRefreshContext()),\n setShouldDisableCounter: value => {\n this.shouldDisableCounter = value;\n }\n };\n }\n}\n","<ng-template #headerContent>\n @let linkModel = linkDisplayModel();\n <ng-content select=\"#header\"></ng-content>\n\n @if (shouldShowHeaderLinks()) {\n <c8y-global-context-link-controls\n [linkStates]=\"linkModel.linkStates\"\n [controlConfigs]=\"linkModel.controlConfig\"\n (allLinksToggled)=\"toggleAllLinks($event)\"\n ></c8y-global-context-link-controls>\n }\n</ng-template>\n\n<ng-template #inlineContent>\n @let settings = inlineSettings();\n @let linkModel = linkDisplayModel();\n\n @if (form && settings) {\n <form\n class=\"d-flex gap-16 p-l-16 p-r-16 inner-scroll\"\n [ngClass]=\"{\n 'p-b-8':\n settings.showTimeContext ||\n settings.showRefresh ||\n settings.showAutoRefresh ||\n settings.showAggregation\n }\"\n [formGroup]=\"form\"\n >\n <div class=\"input-group w-auto input-group-sm\">\n @if (settings.showAggregation) {\n <c8y-aggregation-picker\n data-cy=\"global-inline-date-context--Aggregation-display\"\n [disabledAggregations]=\"getDisabledAggregations()\"\n formControlName=\"aggregation\"\n [resetToDefault]=\"true\"\n ></c8y-aggregation-picker>\n }\n\n @if (settings.showAutoRefresh) {\n <c8y-auto-refresh-control\n [isLoading]=\"isLoading()\"\n [disableCounter]=\"shouldDisableCounter\"\n formControlName=\"isAutoRefreshEnabled\"\n [autoRefreshSeconds]=\"getAutoRefreshSeconds()\"\n [isAutoRefreshConnected]=\"linkModel.linkStates.isAutoRefreshEnabled ?? false\"\n (refresh)=\"onLocalRefreshTrigger()\"\n ></c8y-auto-refresh-control>\n }\n\n @if (settings.showTimeContext) {\n @let isHistoryMode = form.get('refreshOption')?.value === REFRESH_OPTION.HISTORY;\n <c8y-date-time-context-picker\n style=\"margin-left: -1px\"\n formControlName=\"dateTimeContext\"\n [shouldDisableInterval]=\"getIntervalDisableConfig()\"\n [config]=\"\n isHistoryMode\n ? { showDateTo: true, showDateFrom: true }\n : { showDateTo: false, showDateFrom: true }\n \"\n ></c8y-date-time-context-picker>\n }\n\n @if (settings.showRefresh) {\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n container=\"body\"\n type=\"button\"\n data-cy=\"global-inline-date-context--reload-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"isLoading()\"\n (click)=\"refresh.emit(null)\"\n >\n <i\n [class.icon-spin]=\"isLoading()\"\n [c8yIcon]=\"'refresh'\"\n ></i>\n </button>\n </div>\n }\n </div>\n </form>\n }\n\n <ng-content select=\"#body\"></ng-content>\n</ng-template>\n\n@switch (effectiveConfig().displayMode) {\n @case (GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG) {\n <ng-container [ngTemplateOutlet]=\"inlineContent\"></ng-container>\n }\n @case (GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG) {\n <ng-container [ngTemplateOutlet]=\"headerContent\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"inlineContent\"></ng-container>\n }\n @default {\n @if (shouldRenderHeaderInline()) {\n <ng-container [ngTemplateOutlet]=\"headerContent\"></ng-container>\n }\n <ng-container [ngTemplateOutlet]=\"inlineContent\"></ng-container>\n }\n}\n","import { Injectable, WritableSignal, computed, inject, signal } from '@angular/core';\nimport { REFRESH_OPTION, type RefreshOption } from '../../models/auto-refresh.model';\nimport { GLOBAL_CONTEXT_DEFAULTS } from '../../models/global-context-defaults';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n type GlobalContextSettings,\n type WidgetControls,\n type GlobalContextDisplayMode,\n type GlobalContextState\n} from '../../models/global-context.model';\nimport { TIME_INTERVAL } from '../../models/interval-picker.model';\nimport { fillMissingDefaults } from '../../utils/global-context-defaults.util';\nimport { WidgetControlService } from '../domain/widget-control.service';\nimport { GlobalContextUtilsService } from '../infrastructure/global-context-utils.service';\n\n/**\n * GlobalContextConfigStoreService\n *\n * Component-scoped store that manages widget-level Global Context configuration.\n * - Holds separate Live/History modes\n * - Tracks refreshOption (tab) and displayMode\n * - Normalizes incoming configs (Live → aggregation=null; History → interval=CUSTOM)\n * - Applies targeted patches to the current mode\n * - Avoids redundant recomputation via shallow diffing\n *\n * Provided in component scope (see providers of c8y-global-context-config).\n */\n@Injectable()\nexport class GlobalContextConfigStoreService {\n /** Utility for diffing before signal writes */\n private readonly utils = inject(GlobalContextUtilsService);\n /** Widget control template used for computing visibility settings */\n private readonly widgetControlService = inject(WidgetControlService);\n\n /** Widget controls definition (what a widget supports) provided by the host component */\n private readonly _widgetControls: WritableSignal<WidgetControls | null> = signal(null);\n\n /**\n * Live mode of the widget time context state.\n * Null until the store is hydrated with the first input.\n */\n readonly liveState: WritableSignal<GlobalContextState | null> = signal(null);\n\n /**\n * History mode of the widget time context state.\n * Null until the store is hydrated with the first input.\n */\n readonly historyState: WritableSignal<GlobalContextState | null> = signal(null);\n\n /** Currently selected tab (refresh option). Defaults to LIVE. */\n readonly refreshOption: WritableSignal<RefreshOption> = signal(REFRESH_OPTION.LIVE);\n\n /** Current display mode for the widget (config or view_and_config). */\n readonly displayMode: WritableSignal<GlobalContextDisplayMode> = signal(\n GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG\n );\n\n /** Whether the store has processed the first hydrate() call. */\n readonly initialized: WritableSignal<boolean> = signal(false);\n\n /**\n * Computed visibility settings for controls, based on the current widget controls,\n * display mode, and selected refresh option. If widgetControls are not provided yet,\n * defaults to showing all controls.\n */\n readonly settings = computed<Partial<GlobalContextSettings>>(() => {\n this.activeConfig();\n const { settings } = this.widgetControlService.resolveConfigControlSettings(\n this._widgetControls(),\n this.displayMode(),\n this.refreshOption()\n );\n return settings;\n });\n\n /**\n * Inline visibility and dashboard control settings derived for the Inline component.\n * Uses default link states from the widget controls; dynamic link toggling remains\n * handled by the Inline component.\n */\n readonly inlineSettings = computed(() => {\n const res = this.widgetControlService.resolveInlineControlSettings(\n this._widgetControls(),\n this.displayMode(),\n this.refreshOption()\n );\n return res; // { settings, links, dashboardControls }\n });\n\n /**\n * Effective configuration for the currently selected tab.\n * Consumers should read this to render the UI.\n */\n readonly activeConfig = computed(() => {\n return this.refreshOption() === REFRESH_OPTION.LIVE ? this.liveState() : this.historyState();\n });\n\n /**\n * Hydrates the store from an external config input.\n * After the first call, preserves the user's tab selection.\n * @param config - Incoming widget-level global context configuration\n */\n hydrate(config: GlobalContextState): void {\n const norm = this.normalize(config);\n\n if (!this.initialized()) {\n // Initialize both modes with the same dateTimeContext for consistency\n // This ensures when user switches modes, they see the same time range initially\n const sharedDateTimeContext = norm.dateTimeContext;\n\n const baseLive = fillMissingDefaults({\n displayMode: norm.displayMode,\n refreshOption: REFRESH_OPTION.LIVE,\n isAutoRefreshEnabled: GLOBAL_CONTEXT_DEFAULTS.IS_AUTO_REFRESH_ENABLED,\n refreshInterval: GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL,\n aggregation: null,\n dateTimeContext: sharedDateTimeContext\n });\n const baseHistory = this.enforceHistory(\n fillMissingDefaults({\n displayMode: norm.displayMode,\n refreshOption: REFRESH_OPTION.HISTORY,\n isAutoRefreshEnabled: false,\n dateTimeContext: sharedDateTimeContext,\n // Preserve null aggregation from the source mode instead of using default\n aggregation: norm.aggregation\n })\n );\n\n if (norm.refreshOption === REFRESH_OPTION.LIVE) {\n this.liveState.set(norm);\n this.historyState.set(baseHistory);\n } else {\n this.liveState.set(baseLive);\n this.historyState.set(this.enforceHistory(norm));\n }\n this.refreshOption.set(norm.refreshOption);\n this.displayMode.set(norm.displayMode);\n this.initialized.set(true);\n return;\n }\n\n // Subsequent updates: update matching state only, preserve tab selection\n if (norm.refreshOption === REFRESH_OPTION.LIVE) {\n this.setIfChanged(this.liveState, norm);\n } else {\n this.setIfChanged(this.historyState, this.enforceHistory(norm));\n }\n\n // Keep display mode in sync\n if (this.displayMode() !== norm.displayMode) {\n this.setDisplayMode(norm.displayMode);\n }\n }\n\n /**\n * Sets the widget controls template. Required for computing visibility via `settings`.\n */\n setWidgetControls(controls: WidgetControls): void {\n this._widgetControls.set(controls);\n }\n\n /**\n * Sets the display mode and syncs the mode to both modes.\n * Does not change the selected tab.\n * @param mode - Display mode to set (CONFIG or VIEW_AND_CONFIG)\n */\n setDisplayMode(mode: GlobalContextDisplayMode): void {\n if (this.displayMode() === mode) {\n return;\n }\n this.displayMode.set(mode);\n\n const live = this.liveState();\n const history = this.historyState();\n if (live) {\n this.setIfChanged(this.liveState, { ...live, displayMode: mode });\n }\n if (history) {\n this.setIfChanged(this.historyState, { ...history, displayMode: mode });\n }\n }\n\n /**\n * Explicitly selects the tab (Live/History). Does not mutate stored values for either\n * refresh mode; it only switches which mode is active.\n * @param option - Target refresh option (LIVE or HISTORY)\n */\n setRefreshOption(option: RefreshOption): void {\n if (this.refreshOption() === option) {\n return;\n }\n this.refreshOption.set(option);\n }\n\n /**\n * Hydrates the snapshot for a specific refresh mode without altering the current selection.\n * Used by widget configuration to restore per-mode state across component lifecycles.\n */\n setSnapshot(option: RefreshOption, snapshot: GlobalContextState | null): void {\n if (!snapshot) {\n return;\n }\n\n if (option === REFRESH_OPTION.LIVE) {\n // Don't use fillMissingDefaults here as it can overwrite the dateTimeContext\n // The snapshot is already complete from the tab switch logic\n const normalized: GlobalContextState = {\n ...snapshot,\n refreshOption: REFRESH_OPTION.LIVE,\n aggregation: null\n };\n if (normalized.displayMode && this.displayMode() !== normalized.displayMode) {\n this.displayMode.set(normalized.displayMode);\n }\n this.setIfChanged(this.liveState, normalized);\n return;\n }\n\n // For History, enforce the interval=CUSTOM rule but don't regenerate dates\n const normalizedHistory: GlobalContextState = this.enforceHistory({\n ...snapshot,\n refreshOption: REFRESH_OPTION.HISTORY\n });\n if (normalizedHistory.displayMode && this.displayMode() !== normalizedHistory.displayMode) {\n this.displayMode.set(normalizedHistory.displayMode);\n }\n this.setIfChanged(this.historyState, normalizedHistory);\n }\n\n /**\n * Applies a partial update to the currently selected refresh mode.\n * Enforces business rules (Live: aggregation=null; History: interval=CUSTOM) before commit.\n * @param changes - Partial changes to apply to the current refresh mode\n */\n patchCurrent(changes: Partial<GlobalContextState>): void {\n const isLive = this.refreshOption() === REFRESH_OPTION.LIVE;\n const target = isLive ? this.liveState : this.historyState;\n const prev = target();\n\n if (!prev) {\n return;\n }\n\n // Filter out refreshInterval from changes - it's fixed at 5s and should not be user-modifiable\n const { refreshInterval: _, ...allowedChanges } = changes;\n\n let next: GlobalContextState = { ...prev, ...allowedChanges } as GlobalContextState;\n\n if (!isLive) {\n next = this.enforceHistory(next);\n } else {\n // Live must not carry aggregation\n next.aggregation = null;\n }\n\n // Always enforce the fixed refresh interval\n next.refreshInterval = GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL;\n\n this.setIfChanged(target, next);\n }\n\n /**\n * Resets both Live and History modes to defaults, preserving the current\n * selected tab and display mode.\n */\n resetAllModesToDefaults(): void {\n const mode = this.displayMode();\n const baseLive = fillMissingDefaults({\n displayMode: mode,\n refreshOption: REFRESH_OPTION.LIVE,\n isAutoRefreshEnabled: GLOBAL_CONTEXT_DEFAULTS.IS_AUTO_REFRESH_ENABLED,\n refreshInterval: GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL,\n aggregation: null\n });\n const baseHistory = this.enforceHistory(\n fillMissingDefaults({\n displayMode: mode,\n refreshOption: REFRESH_OPTION.HISTORY,\n isAutoRefreshEnabled: false\n })\n );\n this.liveState.set(baseLive);\n this.historyState.set(baseHistory);\n }\n\n /**\n * Resets a single mode (live/history) to defaults, preserving the current\n * display mode and selected tab.\n */\n resetModeToDefaults(target: RefreshOption): void {\n const mode = this.displayMode();\n if (target === REFRESH_OPTION.LIVE) {\n const baseLive = fillMissingDefaults({\n displayMode: mode,\n refreshOption: REFRESH_OPTION.LIVE,\n isAutoRefreshEnabled: GLOBAL_CONTEXT_DEFAULTS.IS_AUTO_REFRESH_ENABLED,\n refreshInterval: GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL,\n aggregation: null\n });\n this.liveState.set(baseLive);\n } else {\n const baseHistory = this.enforceHistory(\n fillMissingDefaults({\n displayMode: mode,\n refreshOption: REFRESH_OPTION.HISTORY,\n isAutoRefreshEnabled: false\n })\n );\n this.historyState.set(baseHistory);\n }\n }\n\n /**\n * Selects a value from the active configuration using a projector function.\n * Returns a signal that updates whenever the active configuration changes.\n */\n select<K>(project: (s: GlobalContextState) => K) {\n return computed<K | null>(() => {\n const cfg = this.activeConfig();\n return cfg ? project(cfg) : null;\n });\n }\n\n /**\n * Normalizes an incoming configuration to internal invariants.\n * @param config - Raw incoming config\n * @returns A normalized config respecting store rules\n */\n private normalize(config: GlobalContextState): GlobalContextState {\n const norm = fillMissingDefaults(config);\n if (![REFRESH_OPTION.LIVE, REFRESH_OPTION.HISTORY].includes(norm.refreshOption)) {\n norm.refreshOption = REFRESH_OPTION.LIVE;\n }\n if (\n norm.displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG &&\n norm.displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG\n ) {\n norm.displayMode = GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG;\n }\n if (norm.refreshOption === REFRESH_OPTION.LIVE) {\n norm.aggregation = null;\n }\n // Always enforce the fixed 5s refresh interval\n norm.refreshInterval = GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL;\n if (norm.refreshOption === REFRESH_OPTION.HISTORY) {\n return this.enforceHistory(norm);\n }\n return norm;\n }\n\n /**\n * Ensures state represents a valid History configuration (interval=CUSTOM).\n * @param state - State candidate to coerce to History rules\n * @returns A state object compliant with History mode rules\n */\n private enforceHistory(state: GlobalContextState): GlobalContextState {\n return {\n ...state,\n refreshOption: REFRESH_OPTION.HISTORY,\n ...(state.dateTimeContext && {\n dateTimeContext: { ...state.dateTimeContext, interval: TIME_INTERVAL.CUSTOM }\n })\n };\n }\n\n /**\n * Writes to a signal only if the next value differs from the current one.\n * Prevents unnecessary change detection and effect triggering.\n * @param target - Signal to update\n * @param next - Next value to set if changed\n */\n private setIfChanged(\n target: WritableSignal<GlobalContextState | null>,\n next: GlobalContextState\n ): void {\n const prev = target();\n if (!prev) {\n target.set(next);\n return;\n }\n const diff = this.utils.getChangedFields(prev, next);\n\n if (Object.keys(diff).length > 0) {\n target.set(next);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n untracked\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { ConfigurationControlsComponent } from '../features/configuration/configuration-controls/configuration-controls.component';\nimport { REFRESH_OPTION } from '../models/auto-refresh.model';\nimport type { GlobalContextState, WidgetControls } from '../models/global-context.model';\nimport { GlobalContextConfigStoreService } from '../services/state/global-context-store.service';\n\n/**\n * GlobalContextConfigComponent\n *\n * Presentation + state coordination for the widget's Global Context controls.\n * - Hydrates a component-scoped store from the incoming `config` input.\n * - Renders Live/History configuration controls via `ConfigurationControlsComponent`.\n * - Emits a normalized `GlobalContextState` when user changes either the tab\n * (refreshOption) or any control value within the current tab.\n * - Does not emit during initial hydrate; emissions only happen on user actions.\n */\n@Component({\n standalone: true,\n imports: [\n ReactiveFormsModule,\n TooltipModule,\n PopoverModule,\n CollapseModule,\n ConfigurationControlsComponent\n ],\n selector: 'c8y-global-context-config',\n templateUrl: './global-context-config.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [GlobalContextConfigStoreService]\n})\nexport class GlobalContextConfigComponent {\n private readonly store = inject(GlobalContextConfigStoreService);\n\n configInput = input.required<GlobalContextState>({ alias: 'config' });\n isLoading = input(false);\n widgetControls = input.required<WidgetControls>();\n liveSnapshotInput = input<GlobalContextState | null>(null, { alias: 'liveSnapshot' });\n historySnapshotInput = input<GlobalContextState | null>(null, { alias: 'historySnapshot' });\n\n readonly activeConfig = computed(() => this.store.activeConfig());\n readonly liveConfig = computed(() => this.store.liveState());\n readonly historyConfig = computed(() => this.store.historyState());\n readonly refreshOption = computed(() => this.store.refreshOption());\n readonly settings = computed(() => this.store.settings());\n readonly supportedModes = computed(\n () => this.widgetControls().supportedModes ?? [REFRESH_OPTION.LIVE, REFRESH_OPTION.HISTORY]\n );\n isExpanded = false;\n\n readonly refresh = output<void>();\n readonly globalContextChange = output<GlobalContextState>();\n\n constructor() {\n // Consolidated hydration & widget controls effect\n effect(() => {\n const config = this.configInput();\n const controls = this.widgetControls();\n\n untracked(() => {\n if (config) {\n this.store.hydrate(config);\n }\n if (controls) {\n this.store.setWidgetControls(controls);\n }\n // Touch settings once both are available to trigger hydration\n if (config && controls && this.activeConfig()) {\n this.settings();\n }\n });\n });\n\n // Consolidated snapshot setting effect\n effect(() => {\n const liveSnapshot = this.liveSnapshotInput();\n const historySnapshot = this.historySnapshotInput();\n\n untracked(() => {\n if (liveSnapshot) {\n this.store.setSnapshot(REFRESH_OPTION.LIVE, liveSnapshot);\n }\n if (historySnapshot) {\n this.store.setSnapshot(REFRESH_OPTION.HISTORY, historySnapshot);\n }\n });\n });\n }\n\n onConfigurationChanges(changes: Partial<GlobalContextState>): void {\n const current = this.activeConfig();\n if (!current) {\n return;\n }\n\n if (this.isRefreshOptionChange(changes, current)) {\n const { refreshOption } = changes;\n\n // Get the target mode's existing state to preserve its interval/preset\n const targetState =\n refreshOption === REFRESH_OPTION.LIVE ? this.store.liveState() : this.store.historyState();\n\n // Build target snapshot: inherit time range (dateFrom/dateTo) but preserve target mode's interval\n const targetSnapshot: GlobalContextState = {\n ...current,\n refreshOption,\n dateTimeContext:\n current.dateTimeContext && targetState?.dateTimeContext\n ? {\n ...structuredClone(current.dateTimeContext),\n interval: targetState.dateTimeContext.interval // Preserve target's interval\n }\n : current.dateTimeContext,\n // Reset aggregation for Live mode, preserve for History\n aggregation: refreshOption === REFRESH_OPTION.LIVE ? null : current.aggregation\n };\n\n // CRITICAL: Set snapshot BEFORE changing refreshOption to prevent race condition\n this.store.setSnapshot(refreshOption, targetSnapshot);\n this.store.setRefreshOption(refreshOption);\n\n this.emitActive();\n return;\n }\n\n // Capture state before patch to detect actual changes\n const stateBefore = this.store.activeConfig();\n this.store.patchCurrent(changes);\n const stateAfter = this.store.activeConfig();\n\n // Only emit if the state actually changed\n // The store's setIfChanged method prevents unnecessary updates,\n // so we check if the reference changed to know if an update occurred\n if (stateBefore !== stateAfter) {\n this.emitActive();\n }\n }\n\n /** Emits the current normalized active state if available */\n private emitActive(): void {\n const state = this.store.activeConfig();\n if (state) {\n this.globalContextChange.emit(state);\n }\n }\n\n private isRefreshOptionChange(\n changes: Partial<GlobalContextState>,\n current: Partial<GlobalContextState>\n ): boolean {\n return (\n Object.keys(changes).length === 1 &&\n 'refreshOption' in changes &&\n changes.refreshOption !== current.refreshOption\n );\n }\n}\n","<c8y-configuration-controls\n [settings]=\"settings()\"\n [controlsDisplayMode]=\"'horizontal'\"\n [tabsOutletName]=\"'verticalTabOutletForConfigurationModes'\"\n [activeMode]=\"refreshOption()\"\n [liveContext]=\"liveConfig()\"\n [historyContext]=\"historyConfig()\"\n [supportedModes]=\"supportedModes()\"\n (contextChange)=\"onConfigurationChanges($event)\"\n (refreshOptionChange)=\"onConfigurationChanges({ refreshOption: $event })\"\n></c8y-configuration-controls>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n forwardRef,\n inject,\n OnInit\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n ControlValueAccessor,\n FormBuilder,\n FormsModule,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule\n} from '@angular/forms';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { map } from 'rxjs/operators';\nimport type { ContextConfig } from '../../../models/context-config.model';\nimport type { GlobalContextDisplayMode } from '../../../models/global-context.model';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE } from '../../../models/global-context.model';\n\n@Component({\n selector: 'c8y-config-context-selector',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (form) {\n @let isWidgetContext = form.get('context')?.value === 'widget';\n @let helpText = 'Show controls directly in the widget view for easier access.' | translate;\n\n <form class=\"form-group m-b-8\" [formGroup]=\"form\">\n <div class=\"d-flex gap-8 a-i-center\">\n <label class=\"c8y-radio\">\n <input\n type=\"radio\"\n value=\"dashboard\"\n data-cy=\"c8y-config-context-selector--dashboard-mode\"\n formControlName=\"context\"\n />\n <span class=\"a-s-center\"></span>\n <span translate>Dashboard</span>\n </label>\n <label class=\"c8y-radio\">\n <input\n type=\"radio\"\n value=\"widget\"\n data-cy=\"c8y-config-context-selector--config-mode\"\n formControlName=\"context\"\n />\n <span class=\"a-s-center\"></span>\n <span translate>Widget</span>\n </label>\n </div>\n\n @if (isWidgetContext) {\n <div class=\"m-t-8\">\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n data-cy=\"c8y-config-context-selector--view-and-config-mode\"\n formControlName=\"showInWidget\"\n />\n <span class=\"a-s-center\"></span>\n <span translate>Show in widget</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"helpText\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n </div>\n }\n </form>\n }\n `,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ConfigContextSelectorComponent),\n multi: true\n }\n ],\n imports: [C8yTranslatePipe, FormsModule, ReactiveFormsModule, PopoverModule]\n})\nexport class ConfigContextSelectorComponent implements ControlValueAccessor, OnInit {\n private readonly fb = inject(FormBuilder);\n private readonly destroyRef = inject(DestroyRef);\n\n protected form!: ReturnType<typeof this.initForm>;\n\n protected get isWidgetContext(): boolean {\n return this.form?.get('context')?.value === 'widget';\n }\n\n ngOnInit(): void {\n this.form = this.initForm();\n this.setupValueChanges();\n }\n\n writeValue(value: GlobalContextDisplayMode): void {\n if (!value) return;\n\n const formValue: ContextConfig = {\n context: value === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD ? 'dashboard' : 'widget',\n showInWidget: value === GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG\n };\n\n this.form?.patchValue(formValue, { emitEvent: false });\n }\n\n registerOnChange(fn: (value: GlobalContextDisplayMode) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n isDisabled ? this.form?.disable() : this.form?.enable();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onChange: (value: GlobalContextDisplayMode) => void = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onTouched: () => void = () => {};\n\n private initForm() {\n return this.fb.group<ContextConfig>({\n context: 'widget',\n showInWidget: false\n });\n }\n\n private setupValueChanges(): void {\n this.form.valueChanges\n .pipe(\n map(({ context, showInWidget }: ContextConfig) =>\n context === 'dashboard'\n ? GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD\n : showInWidget\n ? GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG\n : GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG\n ),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(dateSelection => {\n this.onChange(dateSelection);\n this.onTouched();\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n inject,\n input,\n OnInit,\n output,\n signal,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { ConfigContextSelectorComponent } from '../features/configuration/config-context-selector';\nimport type { RefreshOption } from '../models/auto-refresh.model';\nimport { REFRESH_OPTION } from '../models/auto-refresh.model';\nimport type {\n GlobalContextDisplayMode,\n GlobalContextState,\n WidgetControls\n} from '../models/global-context.model';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE, GLOBAL_CONTEXT_EVENTS } from '../models/global-context.model';\nimport { GlobalContextEventService } from '../services/state/global-context-event.service';\nimport { GlobalContextConfigComponent } from './global-context-config.component';\n\n/**\n * Widget configuration component for time context settings.\n *\n * Allows widgets to either sync with dashboard-level time settings (dashboard mode)\n * or use independent time controls (widget mode). When in widget mode, displays\n * additional configuration controls for time range, aggregation, and refresh settings.\n */\n@Component({\n selector: 'c8y-global-context-widget-config',\n standalone: true,\n imports: [\n ReactiveFormsModule,\n ConfigContextSelectorComponent,\n GlobalContextConfigComponent,\n C8yTranslatePipe,\n PopoverModule\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <form [formGroup]=\"form\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Time context' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Sync with dashboard settings or set independent time controls for this widget.'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-config-context-selector formControlName=\"displayMode\"></c8y-config-context-selector>\n </fieldset>\n </form>\n\n @if (configInput()?.displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <fieldset class=\"c8y-fieldset p-l-0 p-r-0 p-t-16\">\n <legend class=\"m-l-16\">{{ 'Widget time context' | translate }}</legend>\n <c8y-global-context-config\n [config]=\"_latestConfig()\"\n [widgetControls]=\"widgetControlsInput()\"\n [isLoading]=\"isLoadingInput()\"\n [liveSnapshot]=\"liveSnapshot\"\n [historySnapshot]=\"historySnapshot\"\n (refresh)=\"refresh.emit()\"\n (globalContextChange)=\"onGlobalContextChange($event)\"\n ></c8y-global-context-config>\n </fieldset>\n }\n `\n})\nexport class GlobalContextWidgetConfigComponent implements OnInit {\n // Component inputs\n configInput = input.required<GlobalContextState | null>({ alias: 'config' });\n widgetControlsInput = input.required<WidgetControls>({ alias: 'widgetControls' });\n isLoadingInput = input(false, { alias: 'isLoading' });\n\n readonly displayModeChange = output<GlobalContextDisplayMode>();\n readonly refresh = output<void>();\n readonly globalContextChange = output<GlobalContextState>();\n\n protected form: FormGroup;\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n\n private readonly fb = inject(FormBuilder);\n private readonly destroyRef = inject(DestroyRef);\n private readonly globalContextEventService = inject(GlobalContextEventService, {\n optional: true\n });\n private readonly _latestGlobalSnapshot = signal<GlobalContextState | null>(null);\n private readonly _latestConfig = signal<GlobalContextState | null>(null);\n private lastConfigInput: GlobalContextState | null = null;\n private readonly liveSnapshotState = signal<GlobalContextState | null>(null);\n private readonly historySnapshotState = signal<GlobalContextState | null>(null);\n private readonly lastActiveMode = signal<RefreshOption>(REFRESH_OPTION.LIVE);\n\n // Current display mode state\n readonly displayModeSig = signal<GlobalContextDisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n\n constructor() {\n // Sync form control with incoming displayMode without triggering change events\n effect(() => {\n const cfg = this.configInput();\n\n // Always ensure auto-refresh is enabled in the widget config\n const next =\n (cfg?.displayMode as GlobalContextDisplayMode) ?? GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n const current = this.form?.get('displayMode')?.value as GlobalContextDisplayMode;\n if (current !== next && this.form) {\n untracked(() => {\n this.form.patchValue({ displayMode: next }, { emitEvent: false });\n this.displayModeSig.set(next);\n });\n }\n });\n\n // Keep child component config in sync with input changes\n effect(() => {\n const cfg = this.configInput();\n if (cfg && cfg !== this.lastConfigInput) {\n untracked(() => {\n this.lastConfigInput = cfg;\n const cloned = this.cloneSnapshot(cfg) as GlobalContextState;\n this._latestConfig.set(cloned);\n const mode = cloned.refreshOption ?? REFRESH_OPTION.LIVE;\n this.updateSnapshotForMode(mode, cloned);\n this.lastActiveMode.set(mode);\n });\n }\n\n if (!cfg && this.lastConfigInput) {\n untracked(() => {\n this.lastConfigInput = null;\n this._latestConfig.set(null);\n });\n }\n });\n }\n\n ngOnInit(): void {\n this.initializeForm();\n\n this.storeInitialStateChangeEvent();\n this.subscribeToGlobalContextStateChangeEvents();\n this.initializeContext();\n }\n\n onGlobalContextChange(newConfig: GlobalContextState): void {\n // Update local config first to prevent feedback loop\n const cloned = this.cloneSnapshot(newConfig) as GlobalContextState;\n this._latestConfig.set(cloned);\n this.lastConfigInput = null;\n const mode = cloned.refreshOption ?? REFRESH_OPTION.LIVE;\n this.updateSnapshotForMode(mode, cloned);\n this.lastActiveMode.set(mode);\n // Then emit to parent\n this.globalContextChange.emit(newConfig);\n }\n\n private initializeForm(): void {\n const initial =\n (this.configInput()?.displayMode as GlobalContextDisplayMode) ??\n GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n this.form = this.fb.group({\n displayMode: initial\n });\n\n // Emit display mode changes to parent\n this.form\n .get('displayMode')\n ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((mode: GlobalContextDisplayMode) => {\n if (this.displayModeSig() !== mode) {\n this.displayModeSig.set(mode);\n }\n this.displayModeChange.emit(mode);\n // Also emit a normalized globalContextChange with a suggested context update\n const result = this.buildContextUpdateForDisplayMode(mode, {\n global: this._latestGlobalSnapshot(),\n widget: this._latestConfig()\n });\n this.syncWidgetSnapshotAfterHydration(mode, result);\n this.globalContextChange.emit(result.context as GlobalContextState);\n });\n }\n\n private storeInitialStateChangeEvent(): void {\n if (this.globalContextEventService) {\n const latest = this.globalContextEventService.getLatestValue(\n GLOBAL_CONTEXT_EVENTS.STATE_CHANGE\n );\n if (latest) {\n this._latestGlobalSnapshot.set(latest);\n }\n }\n }\n\n private subscribeToGlobalContextStateChangeEvents(): void {\n this.globalContextEventService\n .on(GLOBAL_CONTEXT_EVENTS.STATE_CHANGE)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(state => this._latestGlobalSnapshot.set(state));\n }\n\n private initializeContext(): void {\n const displayMode = this.form.get('displayMode').value;\n // const configInput = this.configInput();\n\n // If already in config mode with widget config, use it directly - don't build from snapshots\n if (displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n // Just emit the widget config as-is, effect will handle the rest\n return;\n }\n\n // Otherwise build from global/widget snapshots\n const result = this.buildContextUpdateForDisplayMode(displayMode, {\n global: this._latestGlobalSnapshot(),\n widget: this._latestConfig()\n });\n\n this.syncWidgetSnapshotAfterHydration(displayMode, result);\n this.globalContextChange.emit(result.context as GlobalContextState);\n }\n\n private buildContextUpdateForDisplayMode(\n displayMode: GlobalContextDisplayMode,\n snapshots: {\n global?: Partial<GlobalContextState> | null;\n widget?: Partial<GlobalContextState> | null;\n }\n ): { context: Partial<GlobalContextState>; hydratedFromGlobal: boolean } {\n const globalSnapshot = this.cloneSnapshot(snapshots.global);\n\n if (displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n return {\n context: { ...(globalSnapshot ?? {}), displayMode },\n hydratedFromGlobal: false\n };\n }\n\n const widgetSnapshot = this.cloneSnapshot(snapshots.widget ?? this._latestConfig());\n const primaryMode = this.lastActiveMode();\n const primarySnapshot = this.cloneSnapshot(\n primaryMode === REFRESH_OPTION.HISTORY\n ? this.historySnapshotState()\n : this.liveSnapshotState()\n );\n const secondarySnapshot = this.cloneSnapshot(\n primaryMode === REFRESH_OPTION.HISTORY\n ? this.liveSnapshotState()\n : this.historySnapshotState()\n );\n\n const candidate = this.isMeaningfulState(widgetSnapshot)\n ? widgetSnapshot\n : this.isMeaningfulState(primarySnapshot)\n ? primarySnapshot\n : secondarySnapshot;\n\n if (candidate) {\n return {\n context: { ...candidate, displayMode },\n hydratedFromGlobal: false\n };\n }\n\n return {\n context: { ...(globalSnapshot ?? {}), displayMode },\n hydratedFromGlobal: true\n };\n }\n\n private cloneSnapshot(\n snapshot: Partial<GlobalContextState> | GlobalContextState | null | undefined\n ): Partial<GlobalContextState> | null {\n if (!snapshot) {\n return null;\n }\n\n return structuredClone(snapshot);\n }\n\n private isMeaningfulState(\n snapshot: Partial<GlobalContextState> | null | undefined\n ): snapshot is Partial<GlobalContextState> {\n if (!snapshot) {\n return false;\n }\n\n const { dateTimeContext, refreshOption, refreshInterval, aggregation, isAutoRefreshEnabled } =\n snapshot;\n\n return (\n !!dateTimeContext ||\n refreshOption !== undefined ||\n refreshInterval !== undefined ||\n aggregation !== undefined ||\n isAutoRefreshEnabled !== undefined\n );\n }\n\n private syncWidgetSnapshotAfterHydration(\n mode: GlobalContextDisplayMode,\n result: { context: Partial<GlobalContextState>; hydratedFromGlobal: boolean }\n ): void {\n if (mode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n return;\n }\n\n const cloned = this.cloneSnapshot(\n result.context as GlobalContextState\n ) as GlobalContextState | null;\n if (!cloned) {\n return;\n }\n\n this._latestConfig.set(cloned);\n const modeToUpdate = cloned.refreshOption ?? this.lastActiveMode();\n this.updateSnapshotForMode(modeToUpdate, cloned);\n this.lastActiveMode.set(modeToUpdate);\n }\n\n private updateSnapshotForMode(mode: RefreshOption, snapshot: GlobalContextState): void {\n const cloned = this.cloneSnapshot(snapshot) as GlobalContextState | null;\n if (!cloned) {\n return;\n }\n\n if (mode === REFRESH_OPTION.HISTORY) {\n this.historySnapshotState.set({ ...cloned, refreshOption: REFRESH_OPTION.HISTORY });\n return;\n }\n\n this.liveSnapshotState.set({\n ...cloned,\n refreshOption: REFRESH_OPTION.LIVE,\n aggregation: null\n });\n }\n\n get liveSnapshot(): GlobalContextState | null {\n return this.liveSnapshotState();\n }\n\n get historySnapshot(): GlobalContextState | null {\n return this.historySnapshotState();\n }\n}\n","// Export core components\nexport * from './global-context.component';\nexport * from './global-context-inline.component';\nexport * from './global-context-config.component';\nexport * from './global-context-widget-config.component';\nexport * from './widget-inline/inline-link-controls.component';\n","// Export components\nexport * from './time-range-picker/date-time-context-picker.component';\nexport * from './time-range-display/time-range-display.component';\nexport * from './interval-picker/interval-picker.component';\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n forwardRef,\n inject\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'c8y-realtime-control',\n templateUrl: './realtime-control.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RealtimeControlComponent),\n multi: true\n }\n ],\n standalone: true,\n imports: [TooltipModule, C8yTranslatePipe, FormsModule]\n})\nexport class RealtimeControlComponent implements ControlValueAccessor {\n readonly disableRealtimeLabel = gettext('Disable realtime');\n readonly enableRealtimeLabel = gettext('Enable realtime');\n\n isActive: boolean;\n touched = false;\n disabled = false;\n\n private cdr = inject(ChangeDetectorRef);\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onChange = _ => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onTouched = () => {};\n\n writeValue(value: boolean): void {\n this.isActive = value;\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(onTouched: any): void {\n this.onTouched = onTouched;\n }\n\n markAsTouched(): void {\n if (!this.touched) {\n this.onTouched();\n this.touched = true;\n }\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n onButtonClick(): void {\n const newValue = !this.isActive;\n this.onChange(newValue);\n }\n}\n","@let buttonLabel = (isActive ? disableRealtimeLabel : enableRealtimeLabel) | translate;\n\n<button\n class=\"btn btn-icon c8y-realtime\"\n [attr.aria-label]=\"buttonLabel\"\n [tooltip]=\"tooltipTpl\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n data-cy=\"global-context--realtime-toggle\"\n (click)=\"onButtonClick()\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"disabled\"\n>\n <span\n class=\"c8y-pulse m-0\"\n [class.active]=\"isActive\"\n [class.inactive]=\"!isActive\"\n ></span>\n</button>\n<ng-template #tooltipTpl>\n {{ buttonLabel }}\n</ng-template>\n","// Export components\nexport * from './auto-refresh/auto-refresh-control.component';\nexport * from './realtime-control/realtime-control.component';\n","// Export components\nexport * from './config-context-selector/config-context-selector.component';\nexport * from './configuration-controls/configuration-controls.component';\nexport * from './configuration-collapse/configuration-collapse.component';\nexport * from './live-mode-configuration-controls/live-mode-configuration-controls.component';\nexport * from './history-mode-configuration-controls/history-mode-configuration-controls.component';\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n Input,\n OnInit\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { BehaviorSubject, debounceTime, skip, take, tap } from 'rxjs';\n\nimport { AsyncPipe } from '@angular/common';\nimport { AggregationPickerComponent } from '../../features/aggregation/aggregation-picker';\nimport { AutoRefreshControlComponent } from '../../features/refresh/auto-refresh';\nimport { DateTimeContextPickerComponent } from '../../features/time-context/time-range-picker/date-time-context-picker.component';\nimport { REFRESH_OPTION } from '../../models/auto-refresh.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextSettings,\n GlobalContextState,\n WidgetControls\n} from '../../models/global-context.model';\nimport { WidgetControlService } from '../../services/domain/widget-control.service';\nimport { GlobalContextFormService } from '../../services/state/global-context-form.service';\n\n@Component({\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AsyncPipe,\n IconDirective,\n ReactiveFormsModule,\n DateTimeContextPickerComponent,\n AggregationPickerComponent,\n AutoRefreshControlComponent,\n TooltipModule,\n C8yTranslatePipe\n ],\n selector: 'c8y-preview-controls',\n templateUrl: './preview-controls.component.html',\n styles: [\n `\n :host {\n position: relative;\n display: block;\n cursor: not-allowed;\n }\n\n /* Block all interactions with form controls */\n :host form {\n position: relative;\n pointer-events: none;\n user-select: none;\n }\n\n /* Add subtle visual indication of non-interactive state */\n :host form::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.05);\n z-index: 1;\n pointer-events: none;\n }\n\n /* Ensure buttons and inputs look disabled */\n :host form button,\n :host form input,\n :host form select,\n :host form .dropdown-toggle,\n :host form .btn {\n cursor: not-allowed !important;\n opacity: 0.85;\n }\n\n /* Ensure all child interactive elements are non-interactive */\n :host form * {\n pointer-events: none !important;\n user-select: none !important;\n }\n `\n ]\n})\nexport class PreviewControlsComponent implements OnInit {\n // Constants\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n readonly REFRESH_OPTION = REFRESH_OPTION;\n\n // Form configuration\n form!: FormGroup;\n\n // State subjects\n private config$ = new BehaviorSubject<Partial<GlobalContextState> | null>(null);\n readonly inlineControlsSettings$ = new BehaviorSubject<Partial<GlobalContextSettings>>({});\n // UI state\n shouldDisableCustomInterval = { isDisabled: false, msg: null };\n\n // Injected dependencies\n private readonly destroyRef = inject(DestroyRef);\n private readonly globalContextFormService = inject(GlobalContextFormService);\n private readonly widgetControlService = inject(WidgetControlService);\n\n @Input() widgetControls: WidgetControls;\n\n private _currentConfig: Partial<GlobalContextState> = {};\n @Input()\n set config(value: GlobalContextState) {\n this._currentConfig = { ...this._currentConfig, ...value };\n this.config$.next(this._currentConfig);\n }\n get config(): Partial<GlobalContextState> | null {\n return this.config$.value;\n }\n\n ngOnInit(): void {\n this.initializeComponent();\n this.setupConfigChangeHandling();\n }\n\n /**\n * Returns the current inline controls settings\n */\n getInlineControlsSettings(): Partial<GlobalContextSettings> {\n return this.inlineControlsSettings$.value;\n }\n\n /**\n * Updates the inline controls settings\n */\n setInlineControlsSettings(settings: Partial<GlobalContextSettings>): void {\n this.inlineControlsSettings$.next(settings);\n }\n\n /**\n * Updates visibility of controls based on display mode and widget type\n */\n setControlsVisibility(context?: GlobalContextState): void {\n if (!this.config?.displayMode || !this.widgetControls) {\n return;\n }\n const displayMode = context?.displayMode ?? this.config.displayMode;\n\n const refreshOption =\n context?.refreshOption ?? (this.config.refreshOption || REFRESH_OPTION.LIVE);\n\n const { settings } = this.widgetControlService.resolveInlineControlSettings(\n this.widgetControls,\n displayMode,\n refreshOption\n );\n this.setInlineControlsSettings(settings);\n }\n\n /**\n * Main initialization logic for the component\n */\n private initializeComponent(): void {\n this.config$\n .pipe(\n take(1),\n tap(() => this.setupComponentState())\n )\n .subscribe();\n }\n\n /**\n * Sets up the initial component state\n */\n private setupComponentState(): void {\n this.setDefaultDisplayMode();\n this.initializeForm();\n this.setControlsVisibility(this._currentConfig);\n }\n\n /**\n * Sets up handling for config changes\n */\n private setupConfigChangeHandling(): void {\n this.config$\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n skip(1), // Skip the initial emission\n debounceTime(100),\n tap(config => {\n if (!config) {\n return;\n }\n this.setControlsVisibility(config);\n\n // Update form values with new config\n if (this.form) {\n this.form.patchValue(config, { emitEvent: false });\n }\n })\n )\n .subscribe();\n }\n\n /**\n * Builds the reactive form\n */\n private initializeForm(): void {\n if (this.form) {\n return;\n }\n this.form = this.globalContextFormService.buildForm(this.config || {});\n }\n\n /**\n * Sets default display mode if not provided\n */\n private setDefaultDisplayMode(): void {\n if (!this.config || 'displayMode' in this.config) {\n return;\n }\n this.config.displayMode = GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n }\n}\n","<!-- Main Controls -->\n@let isConfigMode = config?.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG;\n@let settings = inlineControlsSettings$ | async;\n\n@if (form && settings) {\n <form\n class=\"d-flex gap-16 p-l-16 p-r-16 p-b-8 inner-scroll\"\n [formGroup]=\"form\"\n >\n <!-- Control Group Container -->\n <div class=\"input-group w-auto\">\n <!-- Aggregation Picker -->\n @if (settings.showAggregation) {\n <c8y-aggregation-picker\n formControlName=\"aggregation\"\n [resetToDefault]=\"true\"\n ></c8y-aggregation-picker>\n }\n\n <!-- Auto Refresh Controls -->\n @if (settings.showAutoRefresh) {\n <!-- Auto Refresh Toggle -->\n <c8y-auto-refresh-control\n [isLoading]=\"isLoading\"\n [disableCounter]=\"shouldDisableCounter\"\n formControlName=\"isAutoRefreshEnabled\"\n [autoRefreshSeconds]=\"form.get('refreshInterval')?.value\"\n ></c8y-auto-refresh-control>\n }\n\n @if (settings.showTimeContext) {\n @let isHistoryMode = form.get('refreshOption')?.value === REFRESH_OPTION.HISTORY;\n @let configValue =\n isHistoryMode\n ? {\n showDateTo: true,\n showDateFrom: true\n }\n : {\n showDateTo: false,\n showDateFrom: true\n };\n <c8y-date-time-context-picker\n style=\"margin-left: -1px\"\n formControlName=\"dateTimeContext\"\n [shouldDisableInterval]=\"shouldDisableCustomInterval\"\n [config]=\"configValue\"\n ></c8y-date-time-context-picker>\n }\n\n <!-- Manual Refresh Button -->\n @if (settings.showRefresh) {\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"isLoading\"\n >\n <i\n [class.icon-spin]=\"isLoading\"\n [c8yIcon]=\"'refresh'\"\n ></i>\n </button>\n </div>\n }\n </div>\n </form>\n}\n","// Export shared components\nexport * from './context-controls/context-controls.component';\nexport * from './preview-controls/preview-controls.component';\n","import { REFRESH_OPTION } from '../../models/auto-refresh.model';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE, WidgetControls } from '../../models/global-context.model';\n\nexport const DEFAULT_WIDGET_TEMPLATE: WidgetControls = {\n supports: ['refreshOption', 'displayMode'],\n configSettings: {\n [GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD]: {\n [REFRESH_OPTION.LIVE]: {},\n [REFRESH_OPTION.HISTORY]: {}\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG]: {\n [REFRESH_OPTION.LIVE]: {\n showTimeContext: true,\n showAutoRefresh: true,\n showRefreshInterval: true\n },\n [REFRESH_OPTION.HISTORY]: { showTimeContext: true }\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG]: {\n [REFRESH_OPTION.LIVE]: {\n showTimeContext: true,\n showAutoRefresh: true,\n showRefreshInterval: true\n },\n [REFRESH_OPTION.HISTORY]: { showTimeContext: true }\n }\n },\n settings: {\n [GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD]: {\n [REFRESH_OPTION.LIVE]: {\n showAutoRefresh: false\n },\n [REFRESH_OPTION.HISTORY]: { showTimeContext: false }\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG]: {\n [REFRESH_OPTION.LIVE]: {\n showAutoRefresh: true\n },\n [REFRESH_OPTION.HISTORY]: {\n showTimeContext: true\n }\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG]: {\n [REFRESH_OPTION.LIVE]: {\n showAutoRefresh: true,\n showRefresh: true,\n showRefreshInterval: true\n },\n [REFRESH_OPTION.HISTORY]: {\n showTimeContext: true\n }\n }\n },\n defaultLinks: {\n [GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD]: {\n [REFRESH_OPTION.LIVE]: { isAutoRefreshEnabled: true, dateTimeContext: true },\n [REFRESH_OPTION.HISTORY]: { dateTimeContext: true }\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG]: {},\n [GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG]: {}\n }\n};\n","import { cloneDeep } from 'lodash-es';\nimport { REFRESH_OPTION, RefreshOption } from '../../models/auto-refresh.model';\nimport { LinkStatesMap } from '../../models/control-flow.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextSettings,\n GlobalContextState,\n GlobalContextKeys,\n WidgetControls\n} from '../../models/global-context.model';\nimport { DEFAULT_WIDGET_TEMPLATE } from './default-widget-template';\n\nexport type WidgetFeature =\n | 'liveRefresh'\n | 'refreshInterval'\n | 'timeRange'\n | 'dataAggregation'\n | 'displayMode'\n | 'refreshOption'\n // eslint-disable-next-line @typescript-eslint/ban-types\n | (string & {}); // Allows custom strings while preserving autocomplete for known values\n\n/**\n * Maps user-friendly feature names to their corresponding GlobalContextState property names.\n *\n * This allows developers to use intuitive names like 'liveRefresh' in widget control definitions\n * instead of the actual internal property names like 'isAutoRefreshEnabled'.\n *\n * @example\n * ```ts\n * defineWidgetControls({ supports: ['liveRefresh'] });\n * // Internally maps to 'isAutoRefreshEnabled'\n * ```\n */\nexport const WIDGET_FEATURE_MAP: Record<string, string> = {\n liveRefresh: 'isAutoRefreshEnabled',\n refreshInterval: 'refreshInterval',\n timeRange: 'dateTimeContext',\n dataAggregation: 'aggregation',\n displayMode: 'displayMode',\n refreshOption: 'refreshOption'\n};\n\n/**\n * Hierarchical configuration for widget control visibility and behavior across different contexts.\n *\n * This interface defines control settings organized by:\n * - Display mode (dashboard/config/viewAndConfig)\n * - Refresh option (live/history)\n * - View context (inline/configuration)\n *\n * Each level can specify which controls to show/hide and their default link states to the\n * global context. The structure mirrors how widgets are rendered in different scenarios.\n *\n * @example\n * ```ts\n * const settings: WidgetControlSettings = {\n * dashboard: {\n * live: {\n * inline: { showRefresh: true, showRefreshInterval: false }\n * }\n * },\n * defaultLinks: {\n * dashboard: {\n * live: { dateTimeContext: true, aggregation: true }\n * }\n * }\n * };\n * ```\n */\nexport interface WidgetControlSettings {\n dashboard?: {\n live?: {\n inline?: Partial<GlobalContextSettings>;\n configuration?: Partial<GlobalContextSettings>;\n };\n history?: {\n inline?: Partial<GlobalContextSettings>;\n configuration?: Partial<GlobalContextSettings>;\n };\n };\n config?: {\n live?: {\n inline?: Partial<GlobalContextSettings>;\n configuration?: Partial<GlobalContextSettings>;\n };\n history?: {\n inline?: Partial<GlobalContextSettings>;\n configuration?: Partial<GlobalContextSettings>;\n };\n };\n viewAndConfig?: {\n live?: {\n inline?: Partial<GlobalContextSettings>;\n configuration?: Partial<GlobalContextSettings>;\n };\n history?: {\n inline?: Partial<GlobalContextSettings>;\n configuration?: Partial<GlobalContextSettings>;\n };\n };\n\n /**\n * Defines which widget config properties should be linked to global context by default.\n * When a property is linked (true), changes to the global context will automatically\n * update the widget's corresponding configuration value.\n */\n defaultLinks?: {\n dashboard?: {\n live?: LinkStatesMap;\n history?: LinkStatesMap;\n };\n config?: {\n live?: LinkStatesMap;\n history?: LinkStatesMap;\n };\n viewAndConfig?: {\n live?: LinkStatesMap;\n history?: LinkStatesMap;\n };\n };\n}\n\n/**\n * Handler function for dynamic widget control behavior based on widget state.\n *\n * Allows custom logic to transform control settings and link states based on the current\n * widget configuration. Handlers receive the widget state and return modified control\n * settings that determine which controls are visible and how they behave.\n *\n * Use cases:\n * - Conditionally show/hide controls based on widget config\n * - Modify default link states based on widget data\n * - Implement widget-specific control behavior\n *\n * @example\n * ```ts\n * const handler: WidgetControlHandler = {\n * handler: ({ config }) => {\n * // Hide aggregation control if widget has no series configured\n * const showAggregation = config?.datapoints?.length > 0;\n * return {\n * inlineControlSettings: { !showAggregation },\n * dashboardControlSettings: { showAggregation },\n * links: { aggregation: showAggregation }\n * };\n * }\n * };\n * ```\n */\nexport interface WidgetControlHandler {\n handler: (state: {\n config?: GlobalContextState;\n inlineControlSettings?: Partial<GlobalContextSettings>;\n dashboardControlSettings?: Partial<GlobalContextSettings>;\n currentLinks?: LinkStatesMap;\n }) => {\n inlineControlSettings: Partial<GlobalContextSettings>;\n dashboardControlSettings: Partial<GlobalContextSettings>;\n links: Partial<LinkStatesMap>;\n options?: { noAutoRefreshCounter?: boolean };\n };\n}\n\n/**\n * Creates a comprehensive widget controls configuration for global context integration.\n *\n * This factory function generates the complete control structure that determines how a widget\n * interacts with the global context (time range, aggregation, auto-refresh). It handles:\n * - Feature support declaration\n * - Control visibility across different display modes and refresh options\n * - Default linking behavior between widget and global context\n * - Dynamic control behavior through custom handlers\n *\n * @param config - Configuration object for widget controls\n * @param config.name - Optional identifier for debugging and documentation\n * @param config.extends - Base WidgetControls to extend from (inherits all features and settings)\n * @param config.supports - Array of features this widget supports (e.g., ['timeRange', 'dataAggregation'])\n * When extending, supports are merged with base supports\n * @param config.supportedModes - Optional array of supported refresh modes (live, history).\n * Restricts which modes are available in the configuration UI. Defaults to both modes if not specified.\n * @param config.settings - Hierarchical control settings organized by display mode, refresh option, and view context\n * @param config.handlers - Named functions for dynamic control behavior based on widget state\n * @param config.options - Additional options like noAutoRefreshCounter\n *\n * @returns Complete WidgetControls object ready for use in widget definitions\n *\n * @example\n * ```ts\n * // Simple widget with time range support\n * const controls = defineWidgetControls({\n * name: 'simple-widget',\n * supports: ['timeRange'],\n * settings: {\n * dashboard: {\n * live: {\n * inline: { showRefresh: true }\n * }\n * }\n * }\n * });\n *\n * // Widget that only supports live mode\n * const liveOnlyControls = defineWidgetControls({\n * name: 'realtime-widget',\n * supports: ['timeRange', 'liveRefresh'],\n * supportedModes: [REFRESH_OPTION.LIVE],\n * settings: {\n * dashboard: {\n * live: {\n * inline: { showRefresh: true, showRefreshInterval: true }\n * }\n * }\n * }\n * });\n *\n * // Advanced widget extending default with custom handler\n * const advancedControls = defineWidgetControls({\n * name: 'chart-widget',\n * extends: DEFAULT_WIDGET_TEMPLATE,\n * supports: ['timeRange', 'dataAggregation'],\n * handlers: {\n * onConfigChange: {\n * handler: ({ config }) => ({\n * inlineControlSettings: { showAggregation: config?.series?.length > 0 },\n * dashboardControlSettings: {},\n * links: {}\n * })\n * }\n * }\n * });\n * ```\n */\nexport function defineWidgetControls(config: {\n name?: string;\n extends?: WidgetControls;\n supports?: WidgetFeature[];\n supportedModes?: RefreshOption[];\n settings?: WidgetControlSettings;\n handlers?: Record<string, WidgetControlHandler>;\n options?: { noAutoRefreshCounter?: boolean };\n}): WidgetControls {\n const baseControls = config.extends\n ? cloneDeep(config.extends)\n : cloneDeep(DEFAULT_WIDGET_TEMPLATE);\n\n let mappedSupports: GlobalContextKeys;\n\n if (config.supports) {\n // First convert to a Set to handle potential duplicates\n const supportsSet = new Set(config.supports);\n\n // If liveRefresh is included, automatically add refreshInterval\n if (supportsSet.has('liveRefresh') && !supportsSet.has('refreshInterval')) {\n supportsSet.add('refreshInterval');\n }\n\n mappedSupports = Array.from(supportsSet).map(featureName => {\n return WIDGET_FEATURE_MAP[featureName as string] || featureName;\n }) as GlobalContextKeys;\n } else {\n mappedSupports = baseControls.supports;\n }\n\n const controls: WidgetControls = {\n ...baseControls,\n // When extending, merge the supports arrays instead of replacing\n supports: config.extends\n ? [...new Set([...baseControls.supports, ...mappedSupports])]\n : mappedSupports,\n supportedModes: config.supportedModes || baseControls.supportedModes,\n options: config.options || baseControls.options,\n configSettings: cloneDeep(baseControls.configSettings),\n settings: cloneDeep(baseControls.settings),\n defaultLinks: cloneDeep(baseControls.defaultLinks || {}),\n stateHandlers: {}\n };\n\n if (config.settings) {\n applySettings(controls, config.settings);\n }\n\n if (config.handlers) {\n controls.stateHandlers = processHandlers(config.handlers);\n }\n\n return controls;\n}\n\n/**\n * Transforms and applies hierarchical settings to the widget controls structure.\n *\n * Takes the simplified WidgetControlSettings format and distributes the configuration\n * across the complete WidgetControls structure, populating both inline (settings) and\n * configuration panel (configSettings) branches for each display mode and refresh option.\n *\n * This function also processes defaultLinks and ensures they are properly distributed\n * to match the control settings hierarchy.\n *\n * @param controls - The WidgetControls object to modify (mutated in place)\n * @param settings - The simplified settings configuration to apply\n *\n */\nfunction applySettings(controls: WidgetControls, settings: WidgetControlSettings): void {\n const modeMap = {\n dashboard: GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD,\n config: GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG,\n viewAndConfig: GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG\n };\n\n for (const [settingsKey, modeValue] of Object.entries(modeMap)) {\n const modeSettings = settings[settingsKey as keyof WidgetControlSettings];\n if (!modeSettings) continue;\n\n if (modeSettings['live']) {\n if (!controls.settings[modeValue]) controls.settings[modeValue] = {};\n if (!controls.settings[modeValue][REFRESH_OPTION.LIVE]) {\n controls.settings[modeValue][REFRESH_OPTION.LIVE] = {};\n }\n if (!controls.configSettings[modeValue]) controls.configSettings[modeValue] = {};\n if (!controls.configSettings[modeValue][REFRESH_OPTION.LIVE]) {\n controls.configSettings[modeValue][REFRESH_OPTION.LIVE] = {};\n }\n\n if (modeSettings['live'].inline) {\n controls.settings[modeValue][REFRESH_OPTION.LIVE] = {\n ...modeSettings['live'].inline\n };\n }\n\n if (modeSettings['live'].configuration) {\n controls.configSettings[modeValue][REFRESH_OPTION.LIVE] = {\n ...modeSettings['live'].configuration\n };\n }\n }\n\n if (modeSettings['history']) {\n if (!controls.settings[modeValue]) controls.settings[modeValue] = {};\n if (!controls.settings[modeValue][REFRESH_OPTION.HISTORY]) {\n controls.settings[modeValue][REFRESH_OPTION.HISTORY] = {};\n }\n if (!controls.configSettings[modeValue]) controls.configSettings[modeValue] = {};\n if (!controls.configSettings[modeValue][REFRESH_OPTION.HISTORY]) {\n controls.configSettings[modeValue][REFRESH_OPTION.HISTORY] = {};\n }\n\n if (modeSettings['history'].inline) {\n controls.settings[modeValue][REFRESH_OPTION.HISTORY] = {\n ...modeSettings['history'].inline\n };\n }\n\n if (modeSettings['history'].configuration) {\n controls.configSettings[modeValue][REFRESH_OPTION.HISTORY] = {\n ...modeSettings['history'].configuration\n };\n }\n }\n }\n\n if (settings.defaultLinks) {\n if (!controls.defaultLinks) controls.defaultLinks = {};\n\n for (const [settingsKey, modeValue] of Object.entries(modeMap)) {\n const modeLinks = settings.defaultLinks[settingsKey as keyof typeof settings.defaultLinks];\n if (!modeLinks) continue;\n\n if (!controls.defaultLinks[modeValue]) controls.defaultLinks[modeValue] = {};\n\n if (modeLinks['live']) {\n controls.defaultLinks[modeValue][REFRESH_OPTION.LIVE] = {\n ...modeLinks['live']\n };\n }\n\n if (modeLinks['history']) {\n controls.defaultLinks[modeValue][REFRESH_OPTION.HISTORY] = {\n ...modeLinks['history']\n };\n }\n }\n }\n}\n\n/**\n * Wraps user-defined handlers into the stateHandlers format expected by WidgetControls.\n *\n * This function transforms the simplified WidgetControlHandler format into the internal\n * stateHandlers structure. Each handler receives the current widget state and returns\n * modified control settings and link states.\n *\n * The wrapper ensures handlers are always invoked (even without widget state) and properly\n * propagates the widget state to the handler function for decision-making.\n *\n * @param handlers - Map of handler names to WidgetControlHandler definitions\n * @returns Map of handler names to wrapped functions compatible with WidgetControls.stateHandlers\n *\n */\nfunction processHandlers(\n handlers: Record<string, WidgetControlHandler>\n): WidgetControls['stateHandlers'] {\n const stateHandlers: WidgetControls['stateHandlers'] = {};\n\n for (const [name, handler] of Object.entries(handlers)) {\n stateHandlers[name] = (widgetState = {}) => {\n if (widgetState?.config) {\n return handler.handler(widgetState);\n }\n\n return handler.handler({});\n };\n }\n\n return stateHandlers;\n}\n","import { REFRESH_OPTION } from '../../models/auto-refresh.model';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE, WidgetState } from '../../models/global-context.model';\n\n/**\n * Type alias for handler state parameter used in guards\n * Using WidgetState since GuardState is a subset of it\n */\nexport type GuardState = WidgetState;\n\n/**\n * Guard functions for widget control handlers.\n * These functions help determine conditions for when handlers should execute or return early.\n */\n\n/**\n * Check if the current display mode is dashboard\n */\nexport function isDashboard(state: GuardState): boolean {\n return state.config?.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n}\n\n/**\n * Check if the current display mode is config\n */\nexport function isConfig(state: GuardState): boolean {\n return state.config?.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG;\n}\n\n/**\n * Check if the current display mode is view and config\n */\nexport function isViewAndConfig(state: GuardState): boolean {\n return state.config?.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG;\n}\n\n/**\n * Check if the current refresh option is history\n */\nexport function isHistory(state: GuardState): boolean {\n return state.config?.refreshOption === REFRESH_OPTION.HISTORY;\n}\n\n/**\n * Check if the current refresh option is live\n */\nexport function isLive(state: GuardState): boolean {\n return state.config?.refreshOption === REFRESH_OPTION.LIVE;\n}\n\n/**\n * Check if dateTimeContext is linked\n */\nexport function isDateTimeContextLinked(state: GuardState): boolean {\n return state.currentLinks?.dateTimeContext === true;\n}\n\n/**\n * Check if dateTimeContext is unlinked\n */\nexport function isDateTimeContextUnlinked(state: GuardState): boolean {\n return state.currentLinks?.dateTimeContext === false;\n}\n\n/**\n * Check if aggregation is linked\n */\nexport function isAggregationLinked(state: GuardState): boolean {\n return state.currentLinks?.aggregation === true;\n}\n\n/**\n * Check if aggregation is unlinked\n */\nexport function isAggregationUnlinked(state: GuardState): boolean {\n return state.currentLinks?.aggregation === false;\n}\n\n/**\n * Check if auto-refresh is enabled (linked)\n */\nexport function isAutoRefreshEnabled(state: GuardState): boolean {\n return state.currentLinks?.isAutoRefreshEnabled === true;\n}\n\n/**\n * Check if auto-refresh is disabled (unlinked)\n */\nexport function isAutoRefreshDisabled(state: GuardState): boolean {\n return state.currentLinks?.isAutoRefreshEnabled === false;\n}\n\n/**\n * Namespace for all guard functions\n */\nexport const guards = {\n isDashboard,\n isConfig,\n isViewAndConfig,\n isHistory,\n isLive,\n isDateTimeContextLinked,\n isDateTimeContextUnlinked,\n isAggregationLinked,\n isAggregationUnlinked,\n isAutoRefreshEnabled,\n isAutoRefreshDisabled\n} as const;\n","import { LinkStatesMap } from '../../models/control-flow.model';\nimport {\n GlobalContextSettings,\n WidgetState,\n WidgetStateHandlerResult\n} from '../../models/global-context.model';\nimport { guards } from './guards';\n\n/**\n * Updates both inline and dashboard control settings simultaneously.\n *\n * @param state - Current widget state containing existing settings\n * @param inlineUpdates - Settings to apply to inline display mode\n * @param dashboardUpdates - Settings to apply to dashboard display mode\n * @returns Updated inline and dashboard control settings\n */\nexport function updateBothSettings(\n state: WidgetState,\n inlineUpdates: Partial<GlobalContextSettings>,\n dashboardUpdates: Partial<GlobalContextSettings>\n): Pick<WidgetStateHandlerResult, 'inlineControlSettings' | 'dashboardControlSettings'> {\n return {\n inlineControlSettings: {\n ...state.inlineControlSettings,\n ...inlineUpdates\n },\n dashboardControlSettings: {\n ...state.dashboardControlSettings,\n ...dashboardUpdates\n }\n };\n}\n\n/**\n * Creates a standardized result object for widget state handler responses.\n *\n * @param inlineSettings - Settings for inline display mode\n * @param dashboardSettings - Settings for dashboard display mode\n * @param links - Optional link state mappings for control synchronization\n * @param options - Optional configuration like noAutoRefreshCounter\n * @returns Standardized widget state handler result\n */\nexport function createResult(\n inlineSettings: Partial<GlobalContextSettings>,\n dashboardSettings: Partial<GlobalContextSettings>,\n links: Partial<LinkStatesMap> = {},\n options?: Record<string, unknown>\n): WidgetStateHandlerResult {\n return {\n inlineControlSettings: inlineSettings,\n dashboardControlSettings: dashboardSettings,\n links,\n options\n };\n}\n\n/**\n * Sets auto-refresh link state for dashboard display mode.\n *\n * @param state - Current widget state\n * @param enabled - Whether auto-refresh should be linked to global context\n * @returns Updated link states (empty object for non-dashboard modes)\n */\nexport function setAutoRefreshLinks(state: WidgetState, enabled: boolean): Partial<LinkStatesMap> {\n // Only dashboard mode supports auto-refresh linking\n if (!guards.isDashboard(state)) {\n return {};\n }\n return {\n ...state.currentLinks,\n isAutoRefreshEnabled: enabled\n };\n}\n\n/**\n * Sets auto-refresh control visibility and link state based on display mode.\n *\n * Implements inverse visibility pattern: auto-refresh is shown in dashboard mode\n * (where it can be linked) and hidden in inline mode (where widgets handle it directly).\n *\n * @param state - Current widget state\n * @param showInDashboard - Whether to show auto-refresh control in dashboard mode (inverted for inline)\n * @returns Complete widget state handler result with settings and links\n */\nexport function setAutoRefreshControlsVisibility(\n state: WidgetState,\n showInDashboard: boolean\n): WidgetStateHandlerResult {\n const settings = updateBothSettings(\n state,\n {\n showAutoRefresh: !showInDashboard\n },\n {\n showAutoRefresh: showInDashboard\n }\n );\n\n return createResult(\n settings.inlineControlSettings,\n settings.dashboardControlSettings,\n setAutoRefreshLinks(state, showInDashboard)\n );\n}\n","import { cloneDeep, merge } from 'lodash-es';\n\nimport { REFRESH_OPTION } from '../../models/auto-refresh.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n type GlobalContextKeys,\n type WidgetControls,\n type WidgetState\n} from '../../models/global-context.model';\nimport { guards } from './guards';\nimport {\n createResult,\n setAutoRefreshControlsVisibility,\n updateBothSettings\n} from './update-helpers';\n\nexport type PartialWidgetControls = Partial<WidgetControls> & { supports?: GlobalContextKeys };\n\n/**\n * Baseline control template used by most widgets. Mirrors the alarm list\n * widget behaviour and serves as the foundation for additional presets.\n *\n * @returns Partial widget controls describing the baseline template.\n */\nexport function buildBaselineControls(): PartialWidgetControls {\n return {\n supports: [\n 'refreshOption',\n 'displayMode',\n 'dateTimeContext',\n 'isAutoRefreshEnabled',\n 'refreshInterval'\n ] as GlobalContextKeys,\n settings: {\n [GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD]: {\n [REFRESH_OPTION.LIVE]: {\n showAutoRefresh: true,\n showTimeContext: true,\n showRefreshInterval: true\n },\n [REFRESH_OPTION.HISTORY]: {\n showTimeContext: true\n }\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG]: {\n [REFRESH_OPTION.LIVE]: {\n showAutoRefresh: true,\n showTimeContext: false,\n showRefreshInterval: true\n },\n [REFRESH_OPTION.HISTORY]: {\n showRefresh: true,\n showTimeContext: false\n }\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG]: {\n [REFRESH_OPTION.LIVE]: {\n showAutoRefresh: true,\n showRefreshInterval: true,\n showTimeContext: true\n },\n [REFRESH_OPTION.HISTORY]: {\n showTimeContext: true\n }\n }\n },\n configSettings: {\n [GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG]: {\n [REFRESH_OPTION.LIVE]: {\n showAutoRefresh: true,\n showRefreshInterval: true,\n showTimeContext: true\n },\n [REFRESH_OPTION.HISTORY]: {\n showTimeContext: true,\n showAggregation: false\n }\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG]: {\n [REFRESH_OPTION.LIVE]: {\n showAutoRefresh: true,\n showRefreshInterval: true,\n showTimeContext: true\n },\n [REFRESH_OPTION.HISTORY]: {\n showTimeContext: true,\n showAggregation: false\n }\n }\n },\n defaultLinks: {\n [GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD]: {\n [REFRESH_OPTION.LIVE]: {\n dateTimeContext: true,\n isAutoRefreshEnabled: true\n },\n [REFRESH_OPTION.HISTORY]: {\n dateTimeContext: true\n }\n }\n },\n stateHandlers: createAutoRefreshHandlers()\n };\n}\n\n/**\n * Adds aggregation visibility and default link behaviour on top of the\n * baseline template.\n *\n * @returns Partial widget controls that enable aggregation.\n */\nexport function buildAggregationExtensions(): PartialWidgetControls {\n return {\n supports: ['aggregation'] as GlobalContextKeys,\n settings: {\n [GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD]: {\n [REFRESH_OPTION.HISTORY]: {\n showAggregation: true\n }\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG]: {\n [REFRESH_OPTION.HISTORY]: {\n showAggregation: true\n }\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG]: {\n [REFRESH_OPTION.HISTORY]: {\n showAggregation: true\n }\n }\n },\n configSettings: {\n [GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG]: {\n [REFRESH_OPTION.HISTORY]: {\n showAggregation: true\n }\n },\n [GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG]: {\n [REFRESH_OPTION.HISTORY]: {\n showAggregation: true\n }\n }\n },\n defaultLinks: {\n [GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD]: {\n [REFRESH_OPTION.HISTORY]: {\n dateTimeContext: true,\n aggregation: true\n }\n }\n }\n };\n}\n\n/**\n * Returns a deep-merged copy of the baseline and supplied partial overrides,\n * unionising supported keys and concatenating handlers.\n *\n * @param base Source template to extend.\n * @param addition Additional partial overrides to apply.\n * @returns Combined partial controls.\n */\nexport function mergePartialControls(\n base: PartialWidgetControls,\n addition: PartialWidgetControls\n): PartialWidgetControls {\n const result: PartialWidgetControls = cloneDeep(base);\n\n if (addition.supports?.length) {\n const supports = new Set(result.supports ?? []);\n addition.supports.forEach(support => supports.add(support));\n result.supports = Array.from(supports) as GlobalContextKeys;\n }\n\n if (addition.options) {\n result.options = { ...(result.options ?? {}), ...addition.options };\n }\n\n if (addition.settings) {\n result.settings = merge({}, result.settings ?? {}, addition.settings);\n }\n\n if (addition.configSettings) {\n result.configSettings = merge({}, result.configSettings ?? {}, addition.configSettings);\n }\n\n if (addition.defaultLinks) {\n result.defaultLinks = merge({}, result.defaultLinks ?? {}, addition.defaultLinks);\n }\n\n if (addition.stateHandlers) {\n result.stateHandlers = {\n ...(result.stateHandlers ?? {}),\n ...addition.stateHandlers\n };\n }\n\n return result;\n}\n\n/**\n * Factory returning scroll-friendly auto-refresh handlers used by multiple\n * presets.\n *\n * @returns Handler map compatible with {@link WidgetControls.stateHandlers}.\n */\nexport function createAutoRefreshHandlers() {\n return {\n enableAutoRefresh: (state: WidgetState) => enableAutoRefreshHandler(state),\n disableAutoRefresh: (state: WidgetState) => disableAutoRefreshHandler(state)\n };\n}\n\nfunction enableAutoRefreshHandler(state: WidgetState) {\n if (\n guards.isDateTimeContextUnlinked(state) ||\n guards.isAutoRefreshEnabled(state) ||\n guards.isHistory(state)\n ) {\n return createResult(\n state.inlineControlSettings ?? {},\n state.dashboardControlSettings ?? {},\n state.currentLinks ?? {}\n );\n }\n\n if (guards.isConfig(state) || guards.isViewAndConfig(state)) {\n const settings = updateBothSettings(\n state,\n { showAutoRefresh: true, showRefreshInterval: false },\n { showAutoRefresh: false }\n );\n return createResult(settings.inlineControlSettings, settings.dashboardControlSettings, {});\n }\n\n return setAutoRefreshControlsVisibility(state, true);\n}\n\nfunction disableAutoRefreshHandler(state: WidgetState) {\n if (guards.isAutoRefreshDisabled(state) || guards.isHistory(state)) {\n return createResult(\n state.inlineControlSettings ?? {},\n state.dashboardControlSettings ?? {},\n state.currentLinks ?? {}\n );\n }\n\n return setAutoRefreshControlsVisibility(state, false);\n}\n","import { cloneDeep } from 'lodash-es';\n\nimport { type WidgetControls } from '../../models/global-context.model';\nimport { DEFAULT_WIDGET_TEMPLATE } from './default-widget-template';\nimport {\n buildAggregationExtensions,\n buildBaselineControls,\n createAutoRefreshHandlers,\n mergePartialControls,\n type PartialWidgetControls\n} from './widget-controls-presets.helpers';\n\n/**\n * Identifier for a built-in widget controls preset. Each preset encapsulates a\n * reusable configuration that can be composed with others.\n */\nexport type WidgetPresetName = 'default' | 'defaultWithAggregation' | 'scrollHandlers';\n\n/**\n * Union describing how presets can be selected. Consumers can provide an\n * ordered array (preserving order of application) or a flag map where truthy\n * entries are included in insertion order.\n */\nexport type WidgetPresetSelection = WidgetPresetName[] | Partial<Record<WidgetPresetName, boolean>>;\n\n/** Structure supplied when presets should be expanded into `WidgetControls`. */\nexport interface WidgetControlsPresetConfig {\n presets: WidgetPresetSelection;\n customize?: (controls: WidgetControls) => WidgetControls;\n}\n\ntype WidgetControlsPresetDefinition = {\n name: WidgetPresetName;\n exclusiveGroup?: string;\n build: () => PartialWidgetControls;\n};\n\nconst PRESET_REGISTRY: Record<WidgetPresetName, WidgetControlsPresetDefinition> = {\n default: {\n name: 'default',\n exclusiveGroup: 'baseline',\n build: () => buildBaselineControls()\n },\n defaultWithAggregation: {\n name: 'defaultWithAggregation',\n exclusiveGroup: 'baseline',\n build: () => mergePartialControls(buildBaselineControls(), buildAggregationExtensions())\n },\n scrollHandlers: {\n name: 'scrollHandlers',\n build: () => ({ stateHandlers: createAutoRefreshHandlers() })\n }\n};\n\nexport function resolveWidgetControlsInput(\n input: WidgetControls | WidgetControlsPresetConfig\n): WidgetControls {\n if (isPresetConfig(input)) {\n return buildWidgetControlsFromPresets(input);\n }\n return input;\n}\n\n/**\n * Creates a fully hydrated {@link WidgetControls} by expanding the selected\n * presets (and optional customiser) against the default template.\n *\n * @param config Preset selection descriptor optionally providing a customize hook.\n * @returns Fully merged widget controls ready for consumption.\n */\nexport function buildWidgetControlsFromPresets(config: WidgetControlsPresetConfig): WidgetControls {\n const presetNames = normalizePresetSelection(config.presets);\n const definitions = presetNames.map(resolvePreset);\n\n warnForExclusiveConflicts(definitions);\n\n let built: WidgetControls = definitions.reduce<WidgetControls>((controls, definition) => {\n return mergeWidgetControls(controls, definition.build());\n }, cloneDeep(DEFAULT_WIDGET_TEMPLATE));\n\n if (config.customize) {\n built = config.customize(built);\n }\n\n return cloneDeep(built);\n}\n\n/**\n * Merges partial control metadata into a cloned base instance, unionising the\n * supported keys array and deep-merging nested settings/link structures.\n *\n * @param base Starting widget controls template.\n * @param addition Partial controls to merge into the template.\n * @returns Combined widget controls instance.\n */\nfunction mergeWidgetControls(\n base: WidgetControls,\n addition: PartialWidgetControls\n): WidgetControls {\n // Reuse the existing mergePartialControls function to avoid code duplication\n return mergePartialControls(base as PartialWidgetControls, addition) as WidgetControls;\n}\n\n/**\n * Normalises caller input to a deduplicated, ordered preset array.\n *\n * @param selection Value supplied to the presets API.\n * @returns Ordered list of preset identifiers without duplicates.\n */\nfunction normalizePresetSelection(selection: WidgetPresetSelection): WidgetPresetName[] {\n if (Array.isArray(selection)) {\n return dedupe(selection);\n }\n\n return dedupe(\n Object.entries(selection)\n .filter(([, enabled]) => Boolean(enabled))\n .map(([name]) => name as WidgetPresetName)\n );\n}\n\n/**\n * Removes duplicate preset names while preserving the first occurrence.\n *\n * @param values Sequence of preset identifiers.\n * @returns Deduplicated preset array.\n */\nfunction dedupe(values: WidgetPresetName[]): WidgetPresetName[] {\n const seen = new Set<WidgetPresetName>();\n const ordered: WidgetPresetName[] = [];\n\n for (const value of values) {\n if (!seen.has(value)) {\n ordered.push(value);\n seen.add(value);\n }\n }\n\n return ordered;\n}\n\n/**\n * Retrieves the preset definition or throws if it does not exist.\n *\n * @param name Name of the preset to resolve.\n * @returns Preset definition from the registry.\n */\nfunction resolvePreset(name: WidgetPresetName): WidgetControlsPresetDefinition {\n const definition = PRESET_REGISTRY[name];\n\n if (!definition) {\n throw new Error(`Unknown widget controls preset: ${name}`);\n }\n\n return definition;\n}\n\n/**\n * Emits a console warning whenever multiple presets from the same\n * `exclusiveGroup` are composed, signalling that later presets override\n * earlier ones.\n *\n * @param definitions Preset definitions selected for the current build.\n */\nfunction warnForExclusiveConflicts(definitions: WidgetControlsPresetDefinition[]): void {\n const groups = new Map<string, string>();\n\n definitions.forEach(definition => {\n if (!definition.exclusiveGroup) {\n return;\n }\n\n if (groups.has(definition.exclusiveGroup)) {\n const existing = groups.get(definition.exclusiveGroup);\n console.warn(\n `Widget controls preset \"${definition.name}\" overrides preset \"${existing}\" (exclusive group: ${definition.exclusiveGroup}).`\n );\n }\n\n groups.set(definition.exclusiveGroup, definition.name);\n });\n}\n\nfunction isPresetConfig(\n input: WidgetControls | WidgetControlsPresetConfig\n): input is WidgetControlsPresetConfig {\n return typeof (input as WidgetControlsPresetConfig)?.presets !== 'undefined';\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ContentChild,\n DestroyRef,\n effect,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n TemplateRef,\n untracked,\n ViewChild,\n WritableSignal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { DashboardChildComponent } from '@c8y/ngx-components';\nimport { isEmpty, merge, pick } from 'lodash-es';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { Subject, throttleTime } from 'rxjs';\nimport { GlobalContextInlineComponent } from '../../core/global-context-inline.component';\nimport { GlobalContextWidgetConfigComponent } from '../../core/global-context-widget-config.component';\nimport { TIMING } from '../../models/constants';\nimport type { LinkStatesMap } from '../../models/control-flow.model';\nimport type {\n GlobalContextEvent,\n GlobalContextState,\n WidgetControls,\n WidgetDisplayMode\n} from '../../models/global-context.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n WIDGET_DISPLAY_MODE\n} from '../../models/global-context.model';\nimport { GlobalContextUtilsService } from '../../services/infrastructure/global-context-utils.service';\nimport { PreviewControlsComponent } from '../../shared/preview-controls';\nimport {\n formatDateTimeContextForEmission,\n isCompleteDateTimeContext\n} from '../../utils/global-context-defaults.util';\nimport { resolveWidgetControlsInput, type WidgetControlsPresetConfig } from '../widget-controls';\nimport { REFRESH_OPTION } from '../../models';\n\n@Component({\n selector: 'c8y-global-context-widget-wrapper',\n host: { class: 'sticky-top bg-component d-block min-width-0' },\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n GlobalContextInlineComponent,\n GlobalContextWidgetConfigComponent,\n NgTemplateOutlet,\n ReactiveFormsModule,\n PopoverModule,\n PreviewControlsComponent\n ],\n template: `\n @if (widgetControls()) {\n @let GLOBAL_CONTEXT_CONFIG = internalConfig();\n @let INLINE = WIDGET_DISPLAY_MODE.INLINE;\n @let CONFIG = WIDGET_DISPLAY_MODE.CONFIG;\n @let PREVIEW = WIDGET_DISPLAY_MODE.PREVIEW;\n @let DISPLAY_MODE = GLOBAL_CONTEXT_CONFIG?.displayMode;\n @let DASHBOARD = GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n\n @switch (displayMode()) {\n @case (INLINE) {\n <c8y-global-context-inline\n #globalContextInlineRef=\"globalContextInline\"\n [config]=\"GLOBAL_CONTEXT_CONFIG\"\n [widgetControls]=\"widgetControls()\"\n [isLoading]=\"isLoading()\"\n [dashboardChildForLegacy]=\"dashboardChildForLegacy()\"\n (refresh)=\"onRefresh()\"\n (globalContextChange)=\"onGlobalContextChange($event)\"\n >\n <ng-content></ng-content>\n <ng-container\n id=\"header\"\n [ngTemplateOutlet]=\"widgetHeaderRef\"\n [ngTemplateOutletInjector]=\"globalContextInlineRef.injector\"\n ></ng-container>\n <ng-container\n id=\"body\"\n [ngTemplateOutlet]=\"widgetBodyRef\"\n [ngTemplateOutletInjector]=\"globalContextInlineRef.injector\"\n ></ng-container>\n </c8y-global-context-inline>\n }\n @case (CONFIG) {\n <c8y-global-context-widget-config\n [config]=\"GLOBAL_CONTEXT_CONFIG\"\n [widgetControls]=\"widgetControls()\"\n [isLoading]=\"isLoading()\"\n (refresh)=\"onRefresh()\"\n (globalContextChange)=\"onGlobalContextChange($event)\"\n ></c8y-global-context-widget-config>\n }\n @case (PREVIEW) {\n <c8y-preview-controls\n [config]=\"GLOBAL_CONTEXT_CONFIG\"\n [widgetControls]=\"widgetControls()\"\n ></c8y-preview-controls>\n }\n }\n }\n `\n})\nexport class GlobalContextWidgetWrapperComponent implements OnInit {\n @ContentChild('widgetBody') widgetBodyRef!: TemplateRef<unknown>;\n @ContentChild('widgetHeader') widgetHeaderRef!: TemplateRef<unknown>;\n @ViewChild(GlobalContextInlineComponent)\n globalContextInlineComponent!: GlobalContextInlineComponent;\n\n // --- Services ---\n private readonly destroyRef = inject(DestroyRef);\n private readonly globalContextUtilsService = inject(GlobalContextUtilsService);\n\n // --- Inputs ---\n isLoading = input(false);\n displayMode = input<WidgetDisplayMode>(WIDGET_DISPLAY_MODE.INLINE);\n readonly widgetControlsConfig = input.required<WidgetControls | WidgetControlsPresetConfig>({\n alias: 'widgetControls'\n });\n widgetControls = computed(() => resolveWidgetControlsInput(this.widgetControlsConfig()));\n controlLinks = input<LinkStatesMap>({});\n dashboardChildForLegacy = input<DashboardChildComponent>();\n config = input<GlobalContextState>({});\n\n // --- State Management ---\n internalConfig: WritableSignal<GlobalContextState> = signal({});\n // Latest global snapshot cached for child config updates on mode change\n private widgetInitialConfig: GlobalContextState | null = null;\n // Last emitted state - used for diff calculation to avoid race conditions\n private lastEmittedState: WritableSignal<GlobalContextState> = signal({});\n\n // --- Outputs ---\n @Output() globalContextChange = new EventEmitter<GlobalContextEvent>();\n private readonly contextChangeSubject = new Subject<{\n context: GlobalContextState;\n diff: GlobalContextState;\n }>();\n\n // --- Constants for Template Binding ---\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n readonly WIDGET_DISPLAY_MODE = WIDGET_DISPLAY_MODE;\n\n constructor() {\n // Effect to reactively handle changes to the `config` input signal.\n effect(() => {\n const newConfig = this.config();\n // This effect runs whenever the `config` input changes.\n // `untracked` prevents the effect from re-running when `internalConfig` is updated inside the handler.\n untracked(() => this.handleConfigChange(newConfig));\n });\n }\n\n ngOnInit(): void {\n this.contextChangeSubject\n .pipe(throttleTime(TIMING.CONTEXT_THROTTLE), takeUntilDestroyed(this.destroyRef))\n .subscribe(({ context, diff }) => {\n this.globalContextChange.emit(structuredClone({ context, diff }));\n });\n }\n\n /**\n * Update dateTimeContext for internal widget interactions (e.g., slider drag).\n * This bypasses the config propagation logic and directly updates the inline component state.\n */\n updateDateTimeContext(dateTimeContext: any): void {\n this.globalContextInlineComponent?.updateDateTimeContext(dateTimeContext);\n }\n\n /**\n * Directly toggle all link controls to linked or unlinked state.\n * All controls are always toggled together as a unified group.\n *\n * @param isLinked - True to link all controls, false to unlink all controls\n * @param suppressRefresh - True to prevent refresh emission (data already loaded)\n * @param suppressEmit - True to prevent configuration change emission\n */\n toggleAllLinks(isLinked: boolean, suppressRefresh?: boolean, suppressEmit?: boolean): void {\n this.globalContextInlineComponent?.toggleAllLinks(isLinked, suppressRefresh, suppressEmit);\n }\n\n /**\n * Pause auto-refresh and unlink all controls from global context.\n * Useful when user is interacting with the widget (e.g., scrolling through a list)\n * and you want to prevent automatic updates.\n *\n * This does two things:\n * 1. Sets isAutoRefreshEnabled to false (stops the auto-refresh timer)\n * 2. Unlinks all controls (dateTimeContext, aggregation, isAutoRefreshEnabled)\n * from global context as they work as a unified group\n */\n pauseAutoRefresh(): void {\n this.globalContextInlineComponent?.pauseAutoRefresh();\n }\n\n /**\n * Resume auto-refresh and re-link all controls to global context.\n * Useful when user has finished interacting with the widget (e.g., scrolled back to top)\n * and you want to re-enable automatic updates.\n *\n * This does two things:\n * 1. Sets isAutoRefreshEnabled to true (starts the auto-refresh timer)\n * 2. Links all controls (dateTimeContext, aggregation, isAutoRefreshEnabled)\n * to global context as they work as a unified group\n */\n resumeAutoRefresh(): void {\n this.globalContextInlineComponent?.resumeAutoRefresh();\n }\n\n onGlobalContextChange(context: GlobalContextState): void {\n const template = this.widgetControls();\n\n // OVERRIDE CONTROLS BASED ON WIDGET MODE\n // Ensure aggregation is null in live mode BEFORE calculating diff\n // TODO: consider updating inline component to handle this logic.\n // Edge case: widget supports aggregation. In history mode, user selects aggregation different than null.\n // Then switches to live mode.\n // Second scenario: legacy widget migration where aggregation was set in config.\n const normalizedContext = { ...context };\n if (normalizedContext.refreshOption === REFRESH_OPTION.LIVE) {\n normalizedContext.aggregation = null;\n }\n\n // Use lastEmittedState instead of internalConfig to avoid race conditions\n // where handleConfigChange updates internalConfig before the inline component emits\n const previousState = this.lastEmittedState();\n const diff = this.globalContextUtilsService.getChangedFields(previousState, normalizedContext);\n\n const filteredContext = pick(normalizedContext, template.supports);\n const filteredDiff = pick(diff, template.supports);\n const formattedContext = formatDateTimeContextForEmission(filteredContext, template.supports);\n\n // Update lastEmittedState to track what we just emitted\n this.lastEmittedState.set(formattedContext);\n // Also update internalConfig to keep it in sync (for backward compatibility)\n this.internalConfig.update(cfg => ({ ...cfg, ...formattedContext }));\n this.contextChangeSubject.next({ context: formattedContext, diff: filteredDiff });\n }\n\n onRefresh(): void {\n this.onGlobalContextChange(this.internalConfig());\n }\n\n /**\n * Handles incoming config changes from the input, calculates the diff,\n * and updates the internal state.\n */\n private handleConfigChange(config: GlobalContextState): void {\n const controls = this.widgetControls();\n if (isEmpty(config) || !controls) {\n return;\n }\n\n const newState = pick(config, controls.supports);\n const diff = this.globalContextUtilsService.getChangedFields(this.internalConfig(), newState);\n\n const processedDiff = this._processConfigDiff(diff);\n if (isEmpty(processedDiff)) {\n return;\n }\n\n // Update the signal state immutably.\n this.internalConfig.update(cfg => merge({}, cfg, processedDiff));\n\n // the widget enters config mode. This provides a consistent \"reset\" point for the user.\n if (!this.widgetInitialConfig && this.displayMode() === WIDGET_DISPLAY_MODE.CONFIG) {\n this.widgetInitialConfig = structuredClone(this.internalConfig());\n }\n }\n\n /**\n * Pure helper function to process the configuration diff, applying special business\n * logic, like handling incomplete dateTimeContext.\n */\n private _processConfigDiff(diff: Partial<GlobalContextState>): Partial<GlobalContextState> {\n if (isEmpty(diff)) {\n return {};\n }\n\n // Preserves the critical business logic of preventing updates from an incomplete date-time range.\n if (!isCompleteDateTimeContext(diff)) {\n const { dateTimeContext: _dateTimeContext, ...restDiff } = diff;\n return restDiff;\n }\n\n return diff;\n }\n}\n","import { REFRESH_OPTION, RefreshOption } from '../../models/auto-refresh.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextDisplayMode,\n GlobalContextSettings\n} from '../../models/global-context.model';\n\nexport type DisplayMode = GlobalContextDisplayMode;\n\n/** Context control feature constants for type-safe access */\nexport const CONTEXT_FEATURE = {\n /** Time range selector for live mode (relative time window that moves with current time) */\n LIVE_TIME: 'liveTime',\n /** Time range selector for history mode (fixed date range for historical analysis) */\n HISTORY_TIME: 'historyTime',\n /** Data aggregation options (hourly, daily, etc.) - history mode only */\n AGGREGATION: 'aggregation',\n /** Auto-refresh toggle (fixed 5s interval) - live mode only */\n AUTO_REFRESH: 'autoRefresh',\n /** Manual refresh button */\n REFRESH: 'refresh'\n} as const;\n\nexport type ContextFeature = (typeof CONTEXT_FEATURE)[keyof typeof CONTEXT_FEATURE];\n\n/** Preset name constants for type-safe access */\nexport const PRESET_NAME = {\n DEFAULT: 'default',\n ALARM_LIST: 'alarmList',\n CHART: 'chart',\n LIVE_ONLY: 'liveOnly',\n HISTORY_ONLY: 'historyOnly',\n ALARM_LIST_CONFIG: 'alarmListConfig',\n ALARM_LIST_LEGACY: 'alarmListLegacy'\n} as const;\n\nexport type PresetName = (typeof PRESET_NAME)[keyof typeof PRESET_NAME];\n\nexport type PresetDefinition = {\n [GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD]: ContextFeature[];\n [GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG]: ContextFeature[];\n [GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG]: ContextFeature[];\n};\n\n/** Control presets for different widget types (mode constraints applied by applyModeConstraints) */\nexport const CONTROL_PRESETS: Record<PresetName, PresetDefinition> = {\n /** Full-featured preset for most widgets (supports both live and history modes) */\n [PRESET_NAME.DEFAULT]: {\n dashboard: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH\n ],\n config: [CONTEXT_FEATURE.LIVE_TIME, CONTEXT_FEATURE.HISTORY_TIME, CONTEXT_FEATURE.AUTO_REFRESH],\n view_and_config: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH,\n CONTEXT_FEATURE.AGGREGATION,\n CONTEXT_FEATURE.REFRESH\n ]\n },\n\n /** For alarm/event lists (supports both live and history modes) */\n [PRESET_NAME.ALARM_LIST]: {\n dashboard: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH\n ],\n config: [CONTEXT_FEATURE.AUTO_REFRESH],\n view_and_config: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH\n ]\n },\n\n /** For alarm/event lists in config mode (supports both live and history modes with time in config) */\n [PRESET_NAME.ALARM_LIST_CONFIG]: {\n dashboard: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH\n ],\n config: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH,\n CONTEXT_FEATURE.AGGREGATION\n ],\n view_and_config: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH\n ]\n },\n\n /** For charts with aggregation support (supports both live and history modes) */\n [PRESET_NAME.CHART]: {\n dashboard: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH\n ],\n config: [CONTEXT_FEATURE.LIVE_TIME, CONTEXT_FEATURE.HISTORY_TIME, CONTEXT_FEATURE.AUTO_REFRESH],\n view_and_config: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AGGREGATION,\n CONTEXT_FEATURE.AUTO_REFRESH,\n CONTEXT_FEATURE.REFRESH\n ]\n },\n\n /** For live-only widgets (no history mode support) */\n [PRESET_NAME.LIVE_ONLY]: {\n dashboard: [CONTEXT_FEATURE.LIVE_TIME, CONTEXT_FEATURE.AUTO_REFRESH],\n config: [CONTEXT_FEATURE.LIVE_TIME, CONTEXT_FEATURE.AUTO_REFRESH],\n view_and_config: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH,\n CONTEXT_FEATURE.REFRESH\n ]\n },\n\n /** For history-only widgets (no live mode support) */\n [PRESET_NAME.HISTORY_ONLY]: {\n dashboard: [CONTEXT_FEATURE.HISTORY_TIME],\n config: [CONTEXT_FEATURE.HISTORY_TIME, CONTEXT_FEATURE.AGGREGATION],\n view_and_config: [\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AGGREGATION,\n CONTEXT_FEATURE.REFRESH\n ]\n },\n [PRESET_NAME.ALARM_LIST_LEGACY]: {\n dashboard: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH\n ],\n config: [CONTEXT_FEATURE.AUTO_REFRESH, CONTEXT_FEATURE.REFRESH],\n view_and_config: [\n CONTEXT_FEATURE.LIVE_TIME,\n CONTEXT_FEATURE.HISTORY_TIME,\n CONTEXT_FEATURE.AUTO_REFRESH\n ]\n }\n};\n\n/**\n * Apply mode constraints (hard rules) to filter controls based on refresh option.\n *\n * @param controls - Array of control features\n * @param refreshOption - Current refresh option (REFRESH_OPTION.LIVE or REFRESH_OPTION.HISTORY)\n * @returns Filtered array with mode constraints applied\n */\nexport function applyModeConstraints(\n controls: ContextFeature[],\n refreshOption: RefreshOption\n): ContextFeature[] {\n if (refreshOption === REFRESH_OPTION.HISTORY) {\n // History mode: no auto-refresh, no live time\n return controls.filter(\n c => c !== CONTEXT_FEATURE.AUTO_REFRESH && c !== CONTEXT_FEATURE.LIVE_TIME\n );\n }\n if (refreshOption === REFRESH_OPTION.LIVE) {\n // Live mode: no aggregation, no history time\n return controls.filter(\n c => c !== CONTEXT_FEATURE.AGGREGATION && c !== CONTEXT_FEATURE.HISTORY_TIME\n );\n }\n return controls;\n}\n\n/**\n * Get supported modes from a preset definition.\n * Modes are derived from features:\n * - LIVE mode: supported if preset has AUTO_REFRESH (LIVE_TIME is optional)\n * - HISTORY mode: supported if preset has HISTORY_TIME\n *\n * @param controls - Preset name or definition\n * @param displayMode - Current display mode\n * @returns Array of supported refresh options\n */\nexport function getSupportedModes(\n controls: PresetName | PresetDefinition,\n displayMode: DisplayMode\n): RefreshOption[] {\n const presetDef = typeof controls === 'string' ? CONTROL_PRESETS[controls] : controls;\n const features = presetDef[displayMode];\n const modes: RefreshOption[] = [];\n\n // Support LIVE if has autoRefresh (with optional liveTime)\n if (features.includes(CONTEXT_FEATURE.AUTO_REFRESH)) {\n modes.push(REFRESH_OPTION.LIVE);\n }\n\n // Support HISTORY if has historyTime\n if (features.includes(CONTEXT_FEATURE.HISTORY_TIME)) {\n modes.push(REFRESH_OPTION.HISTORY);\n }\n\n // Fallback to LIVE if no mode features detected\n return modes.length > 0 ? modes : [REFRESH_OPTION.LIVE];\n}\n\n/**\n * Convert controls preset to GlobalContextSettings for registration.\n */\nexport function controlsToSettings(\n controls: PresetName | PresetDefinition,\n displayMode: DisplayMode,\n refreshOption: RefreshOption\n): Partial<GlobalContextSettings> {\n const presetDef = typeof controls === 'string' ? CONTROL_PRESETS[controls] : controls;\n const activeControls = applyModeConstraints(presetDef[displayMode], refreshOption);\n\n return {\n showTimeContext:\n activeControls.includes(CONTEXT_FEATURE.LIVE_TIME) ||\n activeControls.includes(CONTEXT_FEATURE.HISTORY_TIME),\n showAutoRefresh: activeControls.includes(CONTEXT_FEATURE.AUTO_REFRESH),\n showRefreshInterval: false,\n showAggregation: activeControls.includes(CONTEXT_FEATURE.AGGREGATION),\n showRefresh: activeControls.includes(CONTEXT_FEATURE.REFRESH)\n };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n OnInit,\n output,\n signal,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { ConfigContextSelectorComponent } from '../../features/configuration/config-context-selector';\nimport { ConfigurationControlsComponent } from '../../features/configuration/configuration-controls/configuration-controls.component';\nimport { REFRESH_OPTION, RefreshOption } from '../../models/auto-refresh.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GLOBAL_CONTEXT_EVENTS,\n GlobalContextDisplayMode,\n GlobalContextState\n} from '../../models/global-context.model';\nimport { GlobalContextUtilsService } from '../../services/infrastructure/global-context-utils.service';\nimport { GlobalContextEventService } from '../../services/state/global-context-event.service';\nimport {\n controlsToSettings,\n getSupportedModes,\n PRESET_NAME,\n PresetDefinition,\n PresetName\n} from '../presets/control-presets';\n\n@Component({\n selector: 'c8y-config-mode-controls',\n standalone: true,\n imports: [\n ReactiveFormsModule,\n ConfigContextSelectorComponent,\n ConfigurationControlsComponent,\n C8yTranslatePipe,\n PopoverModule\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <form>\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Time context' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Sync with dashboard settings or set independent time controls for this widget.'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-config-context-selector\n [formControl]=\"displayModeControl\"\n ></c8y-config-context-selector>\n </fieldset>\n </form>\n\n @if (displayMode() !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <fieldset class=\"c8y-fieldset p-l-0 p-r-0 p-t-16\">\n <legend class=\"m-l-16\">{{ 'Widget time context' | translate }}</legend>\n <c8y-configuration-controls\n [settings]=\"settings()\"\n [controlsDisplayMode]=\"'horizontal'\"\n [tabsOutletName]=\"'verticalTabOutletForConfigurationModes'\"\n [activeMode]=\"refreshOption()\"\n [liveContext]=\"liveState()\"\n [historyContext]=\"historyState()\"\n [supportedModes]=\"supportedModes()\"\n (contextChange)=\"onConfigurationChange($event)\"\n (refreshOptionChange)=\"onRefreshOptionChange($event)\"\n ></c8y-configuration-controls>\n </fieldset>\n }\n `\n})\nexport class ConfigModeControls implements OnInit {\n private readonly destroyRef = inject(DestroyRef);\n private readonly globalContextUtils = inject(GlobalContextUtilsService);\n private readonly globalContextEventService = inject(GlobalContextEventService);\n\n controls = input<PresetName | PresetDefinition>(PRESET_NAME.DEFAULT);\n config = input.required<GlobalContextState>();\n\n configChange = output<{ context: GlobalContextState; diff: GlobalContextState }>();\n\n displayModeControl = new FormControl<GlobalContextDisplayMode>(\n GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD,\n { nonNullable: true }\n );\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n\n displayMode = signal<GlobalContextDisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n refreshOption = signal<RefreshOption>(REFRESH_OPTION.LIVE);\n liveState = signal<GlobalContextState | null>(null);\n historyState = signal<GlobalContextState | null>(null);\n private lastEmittedContext = signal<GlobalContextState>({});\n\n settings = computed(() =>\n controlsToSettings(this.controls(), this.displayMode(), this.refreshOption())\n );\n\n supportedModes = computed(() => getSupportedModes(this.controls(), this.displayMode()));\n\n constructor() {\n // Sync with incoming config\n effect(() => {\n const cfg = this.config();\n if (!cfg) return;\n\n untracked(() => {\n const mode =\n (cfg.displayMode as GlobalContextDisplayMode) ?? GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n if (this.displayModeControl.value !== mode) {\n this.displayModeControl.setValue(mode, { emitEvent: false });\n this.displayMode.set(mode);\n }\n\n const refreshOpt = cfg.refreshOption ?? REFRESH_OPTION.LIVE;\n this.refreshOption.set(refreshOpt);\n\n if (refreshOpt === REFRESH_OPTION.LIVE) {\n this.liveState.set({ ...cfg });\n } else {\n this.historyState.set({ ...cfg });\n }\n\n this.lastEmittedContext.set(cfg);\n });\n });\n }\n\n ngOnInit(): void {\n this.displayModeControl.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(mode => {\n this.displayMode.set(mode);\n this.emitForDisplayMode(mode);\n });\n\n this.emitInitialState();\n }\n\n onRefreshOptionChange(option: RefreshOption): void {\n this.refreshOption.set(option);\n const snapshot = option === REFRESH_OPTION.LIVE ? this.liveState() : this.historyState();\n\n const context: GlobalContextState = {\n ...(snapshot ?? this.config()),\n refreshOption: option,\n displayMode: this.displayMode(),\n aggregation: option === REFRESH_OPTION.LIVE ? null : (snapshot ?? this.config()).aggregation\n };\n\n this.emit(context);\n }\n\n onConfigurationChange(changes: Partial<GlobalContextState>): void {\n const context: GlobalContextState = {\n ...this.config(),\n ...changes,\n refreshOption: this.refreshOption(),\n displayMode: this.displayMode()\n };\n\n // Update snapshot for current mode\n if (this.refreshOption() === REFRESH_OPTION.LIVE) {\n this.liveState.set({ ...context });\n } else {\n this.historyState.set({ ...context });\n }\n\n this.emit(context);\n }\n\n private emitInitialState(): void {\n const cfg = this.config();\n if (!cfg) return;\n\n const mode =\n (cfg.displayMode as GlobalContextDisplayMode) ?? GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n const context: GlobalContextState =\n mode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD\n ? this.getGlobalContextState(mode)\n : { ...cfg, isGlobalContextReady: true };\n\n this.lastEmittedContext.set(context);\n this.configChange.emit({ context, diff: context });\n }\n\n private emitForDisplayMode(mode: GlobalContextDisplayMode): void {\n if (mode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n this.emit(this.getGlobalContextState(mode));\n } else {\n const snapshot =\n this.refreshOption() === REFRESH_OPTION.LIVE ? this.liveState() : this.historyState();\n this.emit({ ...(snapshot ?? this.config()), displayMode: mode, isGlobalContextReady: true });\n }\n }\n\n private emit(context: GlobalContextState): void {\n const diff = this.globalContextUtils.getChangedFields(this.lastEmittedContext(), context);\n if (Object.keys(diff).length === 0) return;\n\n this.lastEmittedContext.set(context);\n this.configChange.emit({ context, diff });\n }\n\n private getGlobalContextState(mode: GlobalContextDisplayMode): GlobalContextState {\n const globalState = this.globalContextEventService.getLatestValue(\n GLOBAL_CONTEXT_EVENTS.STATE_CHANGE\n ) as GlobalContextState | undefined;\n\n return globalState\n ? {\n displayMode: mode,\n dateTimeContext: globalState.dateTimeContext,\n refreshOption: globalState.refreshOption,\n aggregation: globalState.aggregation,\n isAutoRefreshEnabled: globalState.isAutoRefreshEnabled,\n refreshInterval: globalState.refreshInterval,\n isGlobalContextReady: true\n }\n : { displayMode: mode, isGlobalContextReady: true };\n }\n}\n","import { Component, computed, effect, inject, input, output, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AggregationPickerComponent } from '../../features/aggregation/aggregation-picker/aggregation-picker.component';\nimport { AutoRefreshControlComponent } from '../../features/refresh/auto-refresh/auto-refresh-control.component';\nimport { DateTimeContextPickerComponent } from '../../features/time-context/time-range-picker/date-time-context-picker.component';\nimport { AggregationOptionStatus } from '../../models/aggregation.model';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE, GlobalContextState } from '../../models/global-context.model';\nimport { REFRESH_OPTION } from '../../models/auto-refresh.model';\nimport { GLOBAL_CONTEXT_DEFAULTS } from '../../models/global-context-defaults';\nimport { AggregationValidationService } from '../../services/domain/aggregation-validation.service';\nimport { GlobalContextUtilsService } from '../../services/infrastructure/global-context-utils.service';\nimport { DateTimeContextUtil } from '../../utils/date-time-context.util';\nimport {\n applyModeConstraints,\n CONTEXT_FEATURE,\n CONTROL_PRESETS,\n DisplayMode,\n PresetDefinition,\n PresetName,\n PRESET_NAME\n} from '../presets/control-presets';\n\n@Component({\n selector: 'c8y-context-controls',\n standalone: true,\n imports: [\n ReactiveFormsModule,\n DateTimeContextPickerComponent,\n AggregationPickerComponent,\n AutoRefreshControlComponent,\n IconDirective,\n C8yTranslatePipe,\n TooltipModule\n ],\n template: `\n <form\n class=\"d-flex gap-16 p-l-16 p-r-16 p-b-8 inner-scroll h-auto min-width-0 widget-controls\"\n [formGroup]=\"form\"\n >\n <div class=\"input-group w-auto\">\n @if (visibleControls().includes('aggregation')) {\n <c8y-aggregation-picker\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations()\"\n [resetToDefault]=\"true\"\n >\n </c8y-aggregation-picker>\n }\n\n @if (visibleControls().includes('autoRefresh')) {\n <c8y-auto-refresh-control\n formControlName=\"isAutoRefreshEnabled\"\n [autoRefreshSeconds]=\"autoRefreshSeconds()\"\n [isLoading]=\"isLoading()\"\n (refresh)=\"onRefresh()\"\n >\n </c8y-auto-refresh-control>\n }\n\n @if (visibleControls().includes('time')) {\n <c8y-date-time-context-picker\n style=\"margin-left: -1px\"\n formControlName=\"dateTimeContext\"\n [config]=\"dateTimePickerConfig()\"\n >\n </c8y-date-time-context-picker>\n }\n\n @if (visibleControls().includes('refresh')) {\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n [disabled]=\"isLoading()\"\n (click)=\"onRefresh()\"\n data-cy=\"widget-controls--refresh-button\"\n >\n <i [class.icon-spin]=\"isLoading()\" [c8yIcon]=\"'refresh'\"></i>\n </button>\n </div>\n }\n </div>\n </form>\n `\n})\nexport class ContextControlsComponent {\n private fb = inject(FormBuilder);\n private aggregationValidationService = inject(AggregationValidationService);\n private globalContextUtils = inject(GlobalContextUtilsService);\n\n controls = input<PresetName | PresetDefinition>(PRESET_NAME.DEFAULT);\n displayMode = input<DisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n config = input.required<GlobalContextState>();\n isLoading = input<boolean>(false);\n configChange = output<{ context: GlobalContextState; diff: GlobalContextState }>();\n refresh = output<void>();\n\n form: FormGroup;\n private lastEmittedState = signal<GlobalContextState>({});\n\n /**\n * Visible controls for the template.\n * LIVE_TIME and HISTORY_TIME are normalized to 'time' for template simplicity.\n */\n visibleControls = computed(() => {\n const controlsInput = this.controls();\n const presetDef =\n typeof controlsInput === 'string' ? CONTROL_PRESETS[controlsInput] : controlsInput;\n const baseControls = presetDef[this.displayMode()];\n const refreshOption = this.config().refreshOption || REFRESH_OPTION.LIVE;\n const filteredControls = applyModeConstraints(baseControls, refreshOption);\n\n // Normalize LIVE_TIME/HISTORY_TIME to 'time' for template\n return filteredControls.map(c =>\n c === CONTEXT_FEATURE.LIVE_TIME || c === CONTEXT_FEATURE.HISTORY_TIME ? 'time' : c\n );\n });\n\n disabledAggregations = computed((): AggregationOptionStatus => {\n const dateCtx = this.config().dateTimeContext;\n if (!dateCtx) return {};\n\n const [from, to] = this.parseDateRange(dateCtx);\n return this.aggregationValidationService.getDisabledAggregations([from, to]);\n });\n\n dateTimePickerConfig = computed(() => {\n const refreshOption = this.config().refreshOption;\n return refreshOption === REFRESH_OPTION.HISTORY\n ? { showDateFrom: true, showDateTo: true }\n : { showDateFrom: true, showDateTo: false };\n });\n\n autoRefreshSeconds = computed(\n () => this.config().refreshInterval || GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL\n );\n\n constructor() {\n this.form = this.fb.group({\n dateTimeContext: [null],\n aggregation: [null],\n isAutoRefreshEnabled: [false],\n refreshInterval: [GLOBAL_CONTEXT_DEFAULTS.REFRESH_INTERVAL],\n refreshOption: [GLOBAL_CONTEXT_DEFAULTS.REFRESH_OPTION]\n });\n\n this.syncConfigToForm();\n this.subscribeToFormChanges();\n }\n\n onRefresh(): void {\n const { dateTimeContext } = this.config();\n if (!dateTimeContext) {\n this.refresh.emit();\n return;\n }\n\n const context = {\n ...this.config(),\n dateTimeContext: DateTimeContextUtil.normalizeForLive(dateTimeContext)\n };\n\n if (!this.emitIfChanged(context)) {\n this.refresh.emit();\n }\n }\n\n /** Emits configChange if context differs from last emitted state. Returns true if emitted. */\n private emitIfChanged(context: GlobalContextState): boolean {\n const diff = this.globalContextUtils.getChangedFields(this.lastEmittedState(), context);\n if (Object.keys(diff).length === 0) return false;\n\n this.lastEmittedState.set(context);\n this.configChange.emit({ context, diff });\n return true;\n }\n\n private syncConfigToForm(): void {\n effect(() => {\n const cfg = this.config();\n this.form.patchValue(cfg, { emitEvent: false });\n this.lastEmittedState.set(this.form.value as GlobalContextState);\n });\n }\n\n private subscribeToFormChanges(): void {\n this.form.valueChanges.pipe(takeUntilDestroyed()).subscribe(value => {\n const context = this.clearInvalidAggregation(value as GlobalContextState);\n this.emitIfChanged(context);\n });\n }\n\n /** Clears aggregation if in LIVE mode or invalid for current time range (HISTORY mode). */\n private clearInvalidAggregation(context: GlobalContextState): GlobalContextState {\n const { aggregation, dateTimeContext, refreshOption } = context;\n if (!aggregation) return context;\n\n // LIVE mode doesn't support aggregation\n if (refreshOption === REFRESH_OPTION.LIVE) {\n this.form.patchValue({ aggregation: null }, { emitEvent: false });\n return { ...context, aggregation: null };\n }\n\n // HISTORY mode: validate aggregation for time range\n if (!dateTimeContext) return context;\n\n const [from, to] = this.parseDateRange(dateTimeContext);\n const disabledAggs = this.aggregationValidationService.getDisabledAggregations([from, to]);\n if (disabledAggs[aggregation]) {\n this.form.patchValue({ aggregation: null }, { emitEvent: false });\n return { ...context, aggregation: null };\n }\n return context;\n }\n\n private parseDateRange(dateCtx: {\n dateFrom?: string | Date;\n dateTo?: string | Date;\n }): [Date, Date] {\n const from =\n typeof dateCtx.dateFrom === 'string' ? new Date(dateCtx.dateFrom) : dateCtx.dateFrom;\n const to = typeof dateCtx.dateTo === 'string' ? new Date(dateCtx.dateTo) : dateCtx.dateTo;\n return [from as Date, to as Date];\n }\n}\n","import {\n AfterViewInit,\n Component,\n computed,\n inject,\n input,\n OnDestroy,\n output,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { C8yTranslatePipe, DashboardChildComponent, IconDirective } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE, GlobalContextState } from '../../models/global-context.model';\nimport {\n applyModeConstraints,\n CONTROL_PRESETS,\n PRESET_NAME,\n PresetDefinition,\n PresetName\n} from '../presets/control-presets';\nimport { REFRESH_OPTION } from '../../models';\n\ninterface ControlDisplay {\n key: string;\n stateKey: string;\n cssClass: string;\n icon: string;\n label: string;\n}\n\n// Map preset controls to state keys\nconst CONTROL_DISPLAY_CONFIG: Record<string, ControlDisplay> = {\n liveTime: {\n key: 'liveTime',\n stateKey: 'dateTimeContext',\n cssClass: 'time-context',\n label: gettext('date/time'),\n icon: 'calendar'\n },\n historyTime: {\n key: 'historyTime',\n stateKey: 'dateTimeContext',\n cssClass: 'time-context',\n label: gettext('date/time'),\n icon: 'calendar'\n },\n aggregation: {\n key: 'aggregation',\n stateKey: 'aggregation',\n cssClass: 'aggregation',\n label: gettext('aggregation'),\n icon: 'input'\n },\n autoRefresh: {\n key: 'autoRefresh',\n stateKey: 'isAutoRefreshEnabled',\n cssClass: 'auto-refresh',\n label: gettext('auto refresh'),\n icon: 'refresh'\n }\n};\n\n@Component({\n selector: 'c8y-link-buttons',\n standalone: true,\n imports: [IconDirective, TooltipModule, C8yTranslatePipe],\n template: `\n <ng-template #headerContent>\n <button\n class=\"btn-icon-dot-set\"\n [class.active]=\"isLinked()\"\n [attr.aria-label]=\"'Global context sync controls' | translate\"\n [tooltip]=\"masterTooltipTemplate\"\n delay=\"500\"\n container=\"body\"\n (click)=\"toggle.emit(!isLinked())\"\n data-cy=\"global-context-link--all\"\n >\n <span class=\"btn-icon-dot__item default\" [class.active]=\"isLinked()\">\n <i [c8yIcon]=\"isLinked() ? 'link' : 'unlink'\"></i>\n </span>\n @for (control of visibleControls(); track control.stateKey) {\n <span\n [class]=\"control.cssClass + ' btn-icon-dot__item'\"\n [class.active]=\"isLinked()\"\n [attr.data-cy]=\"'global-context-link--' + control.stateKey\"\n >\n <i [c8yIcon]=\"control.icon\"></i>\n </span>\n }\n </button>\n <ng-template #masterTooltipTemplate>{{ masterTooltipText() }}</ng-template>\n </ng-template>\n `\n})\nexport class LinkButtonsComponent implements AfterViewInit, OnDestroy {\n private injectedDashboardChild = inject(DashboardChildComponent, { optional: true });\n private translateService = inject(TranslateService);\n\n @ViewChild('headerContent', { static: true, read: TemplateRef })\n private headerTemplateRef?: TemplateRef<unknown>;\n\n dashboardChild = input<DashboardChildComponent>();\n isLinked = input.required<boolean>();\n controls = input<PresetName | PresetDefinition>(PRESET_NAME.DEFAULT);\n config = input<GlobalContextState>({});\n\n toggle = output<boolean>();\n\n visibleControls = computed(() => {\n const controlsInput = this.controls();\n const presetDef =\n typeof controlsInput === 'string' ? CONTROL_PRESETS[controlsInput] : controlsInput;\n const refreshOption = this.config().refreshOption || REFRESH_OPTION.LIVE;\n const dashboardControls = presetDef[GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD];\n const activeControls = applyModeConstraints(dashboardControls, refreshOption);\n\n return activeControls.map(key => CONTROL_DISPLAY_CONFIG[key]).filter(Boolean);\n });\n\n masterTooltipText = computed<string>(() => {\n const controls = this.visibleControls();\n const clickToToggleLabel = this.translateService.instant(gettext('(click to toggle)'));\n\n if (!this.isLinked()) {\n const usingWidgetCustomTimeSettingsLabel = this.translateService.instant(\n gettext('Using widget custom time settings')\n );\n return `${usingWidgetCustomTimeSettingsLabel}\\n${clickToToggleLabel}`;\n }\n\n const linkedNames = controls.map(control => this.translateService.instant(control.label));\n\n const formatter = new Intl.ListFormat(\n this.translateService.getCurrentLang()?.replace('_', '-'),\n {\n type: 'conjunction'\n }\n );\n const linkedNamesList = formatter.format(linkedNames);\n const linkedToDashboardLabel = this.translateService.instant(gettext('Synced to dashboard:'));\n return `${linkedToDashboardLabel}\\n${linkedNamesList}\\n${clickToToggleLabel}`;\n });\n\n ngAfterViewInit(): void {\n const dashChild = this.getDashboardChild();\n\n if (dashChild && this.headerTemplateRef) {\n const headers = dashChild.additionalHeaderTemplates;\n if (!headers.includes(this.headerTemplateRef)) {\n headers.push(this.headerTemplateRef);\n }\n }\n }\n\n ngOnDestroy(): void {\n const dashChild = this.getDashboardChild();\n\n if (dashChild && this.headerTemplateRef) {\n const idx = dashChild.additionalHeaderTemplates.indexOf(this.headerTemplateRef);\n if (idx >= 0) {\n dashChild.additionalHeaderTemplates.splice(idx, 1);\n }\n }\n }\n\n private getDashboardChild(): DashboardChildComponent | null {\n return this.dashboardChild() ?? this.injectedDashboardChild ?? null;\n }\n}\n","import { Component, DestroyRef, effect, inject, input, output, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DashboardChildComponent } from '@c8y/ngx-components';\nimport { EMPTY, merge, Subscription } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { REFRESH_OPTION } from '../../models/auto-refresh.model';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GLOBAL_CONTEXT_EVENTS,\n GlobalContextState\n} from '../../models/global-context.model';\nimport { GlobalContextEventService } from '../../services/state/global-context-event.service';\nimport { GlobalContextService } from '../../services/state/global-context.service';\nimport { GlobalContextUtilsService } from '../../services/infrastructure/global-context-utils.service';\nimport { DateTimeContextUtil } from '../../utils/date-time-context.util';\nimport { ContextControlsComponent } from '../context-controls/context-controls.component';\nimport { LinkButtonsComponent } from '../link-buttons/link-buttons.component';\nimport {\n controlsToSettings,\n PresetDefinition,\n PresetName,\n PRESET_NAME\n} from '../presets/control-presets';\n\n@Component({\n selector: 'c8y-global-context-connector',\n standalone: true,\n imports: [ContextControlsComponent, LinkButtonsComponent],\n template: `\n <c8y-link-buttons\n [dashboardChild]=\"dashboardChild()\"\n [isLinked]=\"isLinked()\"\n [controls]=\"controls()\"\n [config]=\"config()\"\n (toggle)=\"onLinkToggle($event)\"\n ></c8y-link-buttons>\n\n @if (!isLinked()) {\n <c8y-context-controls\n [controls]=\"controls()\"\n displayMode=\"dashboard\"\n [config]=\"config()\"\n [isLoading]=\"isLoading()\"\n (configChange)=\"onLocalChange($event)\"\n (refresh)=\"onLocalRefresh()\"\n ></c8y-context-controls>\n }\n `\n})\nexport class GlobalContextConnectorComponent {\n private eventService = inject(GlobalContextEventService);\n private globalContextService = inject(GlobalContextService);\n private globalContextUtils = inject(GlobalContextUtilsService);\n private destroyRef = inject(DestroyRef);\n private lastEmittedState = signal<GlobalContextState>({});\n\n controls = input<PresetName | PresetDefinition>(PRESET_NAME.DEFAULT);\n config = input.required<GlobalContextState>();\n isLoading = input<boolean>(false);\n dashboardChild = input.required<DashboardChildComponent>();\n linked = input<boolean | undefined>(undefined);\n\n configChange = output<{ context: GlobalContextState; diff: GlobalContextState }>();\n refresh = output<void>();\n\n isLinked = signal(true);\n\n constructor() {\n this.syncExternalLinkState();\n this.subscribeToGlobalContext();\n this.registerWithGlobalContext();\n this.trackLoadingState();\n\n this.destroyRef.onDestroy(() => {\n this.globalContextService.unregister(this.componentId);\n this.globalContextService.unregisterLoading(this.componentId);\n });\n }\n\n onLinkToggle(linked: boolean): void {\n this.isLinked.set(linked);\n if (linked) {\n const cached = this.eventService.getLatestValue(GLOBAL_CONTEXT_EVENTS.STATE_CHANGE);\n if (cached) this.emitIfChanged(cached as GlobalContextState);\n }\n }\n\n onLocalChange(event: { context: GlobalContextState; diff: GlobalContextState }): void {\n this.lastEmittedState.set(event.context);\n this.configChange.emit(event);\n }\n\n onLocalRefresh(): void {\n const { dateTimeContext } = this.config();\n if (!dateTimeContext) {\n this.refresh.emit();\n return;\n }\n\n const context = {\n ...this.config(),\n dateTimeContext: DateTimeContextUtil.normalizeForLive(dateTimeContext)\n };\n\n if (!this.emitIfChanged(context)) {\n this.refresh.emit();\n }\n }\n\n /** Emits configChange if context differs from last emitted state. Returns true if emitted. */\n private emitIfChanged(context: GlobalContextState): boolean {\n const diff = this.globalContextUtils.getChangedFields(this.lastEmittedState(), context);\n if (Object.keys(diff).length === 0) return false;\n\n this.lastEmittedState.set(context);\n this.configChange.emit({ context, diff });\n return true;\n }\n\n private get componentId(): string {\n const data = this.dashboardChild()['data'];\n return data.id;\n }\n\n private syncExternalLinkState(): void {\n effect(() => {\n const external = this.linked();\n if (external !== undefined) this.isLinked.set(external);\n });\n }\n\n private subscribeToGlobalContext(): void {\n let subscription: Subscription | null = null;\n\n effect(() => {\n subscription?.unsubscribe();\n if (!this.isLinked()) return;\n\n const cached = this.eventService.getLatestValue(GLOBAL_CONTEXT_EVENTS.STATE_CHANGE);\n if (cached) this.emitIfChanged(cached as GlobalContextState);\n\n const stateChanges$ = this.eventService.on(GLOBAL_CONTEXT_EVENTS.STATE_CHANGE);\n const refresh$ = this.eventService.on(GLOBAL_CONTEXT_EVENTS.REFRESH).pipe(\n map(\n data =>\n ({\n ...this.config(),\n dateTimeContext: {\n dateFrom: data.dateFrom,\n dateTo: data.dateTo,\n interval: data.interval\n }\n }) as GlobalContextState\n )\n );\n\n subscription = merge(stateChanges$, refresh$)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n catchError(() => EMPTY)\n )\n .subscribe(state => {\n if (state) this.emitIfChanged(state as GlobalContextState);\n });\n });\n }\n\n private registerWithGlobalContext(): void {\n effect(() => {\n if (this.isLinked()) {\n const settings = controlsToSettings(\n this.controls(),\n GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD,\n this.config().refreshOption || REFRESH_OPTION.LIVE\n );\n this.globalContextService.register(this.componentId, settings);\n } else {\n this.globalContextService.unregister(this.componentId);\n }\n });\n }\n\n private trackLoadingState(): void {\n effect(() => {\n const shouldTrack = this.isLinked() && this.isLoading();\n if (shouldTrack) {\n this.globalContextService.registerLoading(this.componentId);\n } else {\n this.globalContextService.unregisterLoading(this.componentId);\n }\n });\n }\n}\n","import { Component, input, output } from '@angular/core';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE, GlobalContextState } from '../../models/global-context.model';\nimport { ContextControlsComponent } from '../context-controls/context-controls.component';\nimport { DisplayMode, PresetDefinition, PresetName, PRESET_NAME } from '../presets/control-presets';\n\n@Component({\n selector: 'c8y-local-controls',\n standalone: true,\n imports: [ContextControlsComponent],\n host: {\n 'data-local-controls': 'true',\n '[class.disabled]': 'disabled()'\n },\n styles: [\n `\n .disabled-overlay {\n position: relative;\n cursor: not-allowed;\n }\n .disabled-overlay::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10;\n }\n `\n ],\n template: `\n <div [class.disabled-overlay]=\"disabled()\">\n <c8y-context-controls\n [controls]=\"controls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"config()\"\n [isLoading]=\"isLoading()\"\n (configChange)=\"configChange.emit($event)\"\n (refresh)=\"refresh.emit()\"\n ></c8y-context-controls>\n </div>\n `\n})\nexport class LocalControlsComponent {\n controls = input<PresetName | PresetDefinition>(PRESET_NAME.DEFAULT);\n displayMode = input<DisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG);\n config = input.required<GlobalContextState>();\n isLoading = input<boolean>(false);\n disabled = input<boolean>(false);\n\n configChange = output<{ context: GlobalContextState; diff: GlobalContextState }>();\n refresh = output<void>();\n}\n","/** @deprecated Use LocalControlsComponent or GlobalContextConnectorComponent instead */\nexport * from './widget-wrapper';\n/** @deprecated Use LocalControlsComponent or GlobalContextConnectorComponent instead */\nexport * from './widget-controls';\n\nexport * from './config-mode-controls';\nexport * from './global-context-connector';\nexport * from './link-buttons';\nexport * from './local-controls';\nexport * from './presets';\n","import { NgModule } from '@angular/core';\nimport { hookActionBar } from '@c8y/ngx-components';\nimport { GlobalContextNavigationService } from './services/infrastructure/global-context-navigation.service';\n\n@NgModule({\n declarations: [],\n imports: [],\n exports: [],\n providers: [hookActionBar(GlobalContextNavigationService)]\n})\nexport class GlobalContextModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.DateTimeContextPickerService","i1","i3","i2","FormsModule","filter","ContextControlsComponent","tap","sanitizeLocalStateHelper","sanitizeGlobalStateHelper","resolveWidgetDisplayModeHelper","mapToContextDisplayModeHelper","resolveVisibilityContextInternalHelper","handleFormChangeHelper","handleGlobalStateChangeHelper","executeHandlerHelper","validateAggregationLinkUtil","deriveAggregationValueUtil","resolveAggregationChangeForFormHelper","syncSourcesForRefreshOptionHelper","resolveAutoUnlinkAggregationChangeHelper","applyAggregationChangesForGlobalStateHelper","ensureDateTimeContextHelper","syncLocalEntriesWithGlobalHelper","deriveDisabledAggregationsHelper","buildControlLinkConfigHelper","calculateDisabledAggregationsFromContextHelper","handleLinkToggleHelper","toggleAllLinksHelper","applyConfigOverrideHelper","buildWidgetStateHelper","applyHandlerResultHelper","distinctUntilChanged","handleGlobalRefreshHelper","processRefreshEventHelper","getShouldDisableIntervalConfigHelper","patchFormValuesHelper","applyLocalAggregationChangeHelper","updateAggregationValueHelper","map","merge"],"mappings":"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"}