@grafana/scenes 6.27.2 → 6.27.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ # v6.27.3 (Wed Jul 23 2025)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - AdHocFiltersCombobox: Update z-index [#1166](https://github.com/grafana/scenes/pull/1166) ([@ashharrison90](https://github.com/ashharrison90))
6
+ - AdHocFilters: Refactor original values to take origin in key as well [#1185](https://github.com/grafana/scenes/pull/1185) ([@mdvictor](https://github.com/mdvictor))
7
+ - Time zone selection: When selecting Default in time zone picker, interpolate timezone from user profile setting [#1186](https://github.com/grafana/scenes/pull/1186) ([@harisrozajac](https://github.com/harisrozajac))
8
+
9
+ #### Authors: 3
10
+
11
+ - Ashley Harrison ([@ashharrison90](https://github.com/ashharrison90))
12
+ - Haris Rozajac ([@harisrozajac](https://github.com/harisrozajac))
13
+ - Victor Marin ([@mdvictor](https://github.com/mdvictor))
14
+
15
+ ---
16
+
1
17
  # v6.27.2 (Wed Jul 09 2025)
2
18
 
3
19
  #### 🐛 Bug Fix
@@ -9,6 +9,7 @@ import { RefreshEvent, config, locationService } from '@grafana/runtime';
9
9
  import { isValid } from '../utils/date.js';
10
10
  import { getQueryController } from './sceneGraph/getQueryController.js';
11
11
  import { writeSceneLog } from '../utils/writeSceneLog.js';
12
+ import { isEmpty } from 'lodash';
12
13
 
13
14
  class SceneTimeRange extends SceneObjectBase {
14
15
  constructor(state = {}) {
@@ -225,9 +226,12 @@ function getTimeWindow(time, timeWindow) {
225
226
  };
226
227
  }
227
228
  function getValidTimeZone(timeZone) {
228
- if (timeZone === void 0 || timeZone === "") {
229
+ if (timeZone === void 0) {
229
230
  return void 0;
230
231
  }
232
+ if (isEmpty(timeZone)) {
233
+ return config.bootData.user.timezone;
234
+ }
231
235
  if (timeZone === defaultTimeZone) {
232
236
  return timeZone;
233
237
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SceneTimeRange.js","sources":["../../../src/core/SceneTimeRange.tsx"],"sourcesContent":["import { getTimeZone, getZone, rangeUtil, setWeekStart, TimeRange, toUtc } from '@grafana/data';\nimport { defaultTimeZone, TimeZone } from '@grafana/schema';\n\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nimport { SceneObjectBase } from './SceneObjectBase';\nimport { SceneTimeRangeLike, SceneTimeRangeState, SceneObjectUrlValues } from './types';\nimport { getClosest } from './sceneGraph/utils';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { evaluateTimeRange } from '../utils/evaluateTimeRange';\nimport { config, locationService, RefreshEvent } from '@grafana/runtime';\nimport { isValid } from '../utils/date';\nimport { getQueryController } from './sceneGraph/getQueryController';\nimport { writeSceneLog } from '../utils/writeSceneLog';\n\nexport class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implements SceneTimeRangeLike {\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['from', 'to', 'timezone', 'time', 'time.window'] });\n\n public constructor(state: Partial<SceneTimeRangeState> = {}) {\n const from = state.from && isValid(state.from) ? state.from : 'now-6h';\n const to = state.to && isValid(state.to) ? state.to : 'now';\n const timeZone = getValidTimeZone(state.timeZone);\n const value = evaluateTimeRange(\n from,\n to,\n timeZone || getTimeZone(),\n state.fiscalYearStartMonth,\n state.UNSAFE_nowDelay,\n state.weekStart\n );\n const refreshOnActivate = state.refreshOnActivate ?? { percent: 10 };\n super({ from, to, timeZone, value, refreshOnActivate, ...state });\n\n this.addActivationHandler(this._onActivate.bind(this));\n }\n\n private _onActivate() {\n // When SceneTimeRange has no time zone provided, find closest source of time zone and subscribe to it\n if (!this.state.timeZone) {\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this) {\n this._subs.add(\n timeZoneSource.subscribeToState((n, p) => {\n if (n.timeZone !== undefined && n.timeZone !== p.timeZone) {\n this.refreshRange(0);\n }\n })\n );\n }\n }\n\n if (rangeUtil.isRelativeTimeRange(this.state.value.raw)) {\n this.refreshIfStale();\n }\n\n return () => {\n if (this.state.weekStart) {\n setWeekStart(config.bootData.user.weekStart);\n }\n };\n }\n\n private refreshIfStale() {\n let ms;\n if (this.state?.refreshOnActivate?.percent !== undefined) {\n ms = this.calculatePercentOfInterval(this.state.refreshOnActivate.percent);\n }\n if (this.state?.refreshOnActivate?.afterMs !== undefined) {\n ms = Math.min(this.state.refreshOnActivate.afterMs, ms ?? Infinity);\n }\n if (ms !== undefined) {\n this.refreshRange(ms);\n }\n }\n\n /**\n * Will traverse up the scene graph to find the closest SceneTimeRangeLike with time zone set\n */\n private getTimeZoneSource() {\n if (!this.parent || !this.parent.parent) {\n return this;\n }\n // Find the closest source of time zone\n const source = getClosest<SceneTimeRangeLike>(this.parent.parent, (o) => {\n if (o.state.$timeRange && o.state.$timeRange.state.timeZone) {\n return o.state.$timeRange;\n }\n return undefined;\n });\n\n if (!source) {\n return this;\n }\n\n return source;\n }\n\n /**\n * Refreshes time range if it is older than the invalidation interval\n * @param refreshAfterMs invalidation interval (milliseconds)\n * @private\n */\n private refreshRange(refreshAfterMs: number) {\n const value = evaluateTimeRange(\n this.state.from,\n this.state.to,\n this.state.timeZone ?? getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n const diff = value.to.diff(this.state.value.to, 'milliseconds');\n if (diff >= refreshAfterMs) {\n this.setState({ value });\n }\n }\n\n private calculatePercentOfInterval(percent: number): number {\n const intervalMs = this.state.value.to.diff(this.state.value.from, 'milliseconds');\n return Math.ceil((intervalMs / 100) * percent);\n }\n\n public getTimeZone(): TimeZone {\n // Return local time zone if provided\n if (this.state.timeZone && getValidTimeZone(this.state.timeZone)) {\n return this.state.timeZone;\n }\n\n // Resolve higher level time zone source\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this && getValidTimeZone(timeZoneSource.state.timeZone)) {\n return timeZoneSource.state.timeZone!;\n }\n\n // Return default time zone\n return getTimeZone();\n }\n\n public onTimeRangeChange = (timeRange: TimeRange) => {\n const update: Partial<SceneTimeRangeState> = {};\n\n if (typeof timeRange.raw.from === 'string') {\n update.from = timeRange.raw.from;\n } else {\n update.from = timeRange.raw.from.toISOString();\n }\n\n if (typeof timeRange.raw.to === 'string') {\n update.to = timeRange.raw.to;\n } else {\n update.to = timeRange.raw.to.toISOString();\n }\n\n update.value = evaluateTimeRange(\n update.from,\n update.to,\n this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n // Only update if time range actually changed\n if (update.from !== this.state.from || update.to !== this.state.to) {\n const queryController = getQueryController(this);\n queryController?.startProfile('SceneTimeRange');\n this._urlSync.performBrowserHistoryAction(() => {\n this.setState(update);\n });\n }\n };\n\n public onTimeZoneChange = (timeZone: TimeZone) => {\n this._urlSync.performBrowserHistoryAction(() => {\n const validTimeZone = getValidTimeZone(timeZone) ?? defaultTimeZone;\n const updatedValue = evaluateTimeRange(\n this.state.from,\n this.state.to,\n validTimeZone,\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n this.setState({ timeZone: validTimeZone, value: updatedValue });\n });\n };\n\n public onRefresh = () => {\n this.refreshRange(0);\n this.publishEvent(new RefreshEvent(), true);\n };\n\n public getUrlState() {\n const params = locationService.getSearchObject();\n const urlValues: SceneObjectUrlValues = { from: this.state.from, to: this.state.to, timezone: this.getTimeZone() };\n\n // Clear time and time.window once they are converted to from and to\n if (params.time && params['time.window']) {\n urlValues.time = null;\n urlValues['time.window'] = null;\n }\n\n return urlValues;\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const update: Partial<SceneTimeRangeState> = {};\n\n let from = parseUrlParam(values.from);\n let to = parseUrlParam(values.to);\n\n if (values.time && values['time.window']) {\n const time = Array.isArray(values.time) ? values.time[0] : values.time;\n const timeWindow = Array.isArray(values['time.window']) ? values['time.window'][0] : values['time.window'];\n const timeRange = getTimeWindow(time, timeWindow);\n if (timeRange.from && isValid(timeRange.from)) {\n from = timeRange.from;\n }\n\n if (timeRange.to && isValid(timeRange.to)) {\n to = timeRange.to;\n }\n }\n\n if (from && isValid(from)) {\n update.from = from;\n }\n\n if (to && isValid(to)) {\n update.to = to;\n }\n\n if (typeof values.timezone === 'string') {\n update.timeZone = values.timezone !== '' ? values.timezone : undefined;\n }\n\n if (Object.keys(update).length === 0) {\n return;\n }\n\n update.value = evaluateTimeRange(\n update.from ?? this.state.from,\n update.to ?? this.state.to,\n update.timeZone ?? this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n return this.setState(update);\n }\n}\n\n/**\n * Calculates the duration of the time range from time-time.window/2 to time+time.window/2. Both be specified in ms. For example ?time=1500000000000&time.window=10000 results in a 10-second time range from 1499999995000 to 1500000005000`.\n * @param time - time in ms\n * @param timeWindow - time window in ms or interval string\n */\nfunction getTimeWindow(time: string, timeWindow: string) {\n // Parse the time, assuming it could be an ISO string or a number in milliseconds\n const valueTime = isNaN(Date.parse(time)) ? parseInt(time, 10) : Date.parse(time);\n\n let timeWindowMs;\n\n if (timeWindow.match(/^\\d+$/) && parseInt(timeWindow, 10)) {\n // when time window is specified in ms\n timeWindowMs = parseInt(timeWindow, 10);\n } else {\n timeWindowMs = rangeUtil.intervalToMs(timeWindow);\n }\n\n return {\n from: toUtc(valueTime - timeWindowMs / 2).toISOString(),\n to: toUtc(valueTime + timeWindowMs / 2).toISOString(),\n };\n}\n\n/**\n * Validates and returns a valid time zone string or undefined.\n * @param {string} [timeZone] - The time zone to validate. Can be a valid IANA time zone string, the string \"browser\", or undefined.\n * @returns {string | undefined} - Returns the input time zone if it is valid, or undefined if the input is invalid or not provided.\n */\nfunction getValidTimeZone(timeZone?: string): string | undefined {\n if (timeZone === undefined || timeZone === '') {\n return undefined;\n }\n if (timeZone === defaultTimeZone) {\n return timeZone;\n }\n if (getZone(timeZone)) {\n return timeZone;\n }\n writeSceneLog('SceneTimeRange', `Invalid timeZone \"${timeZone}\" provided.`);\n return;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SceneTimeRange.js","sources":["../../../src/core/SceneTimeRange.tsx"],"sourcesContent":["import { getTimeZone, getZone, rangeUtil, setWeekStart, TimeRange, toUtc } from '@grafana/data';\nimport { defaultTimeZone, TimeZone } from '@grafana/schema';\n\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nimport { SceneObjectBase } from './SceneObjectBase';\nimport { SceneTimeRangeLike, SceneTimeRangeState, SceneObjectUrlValues } from './types';\nimport { getClosest } from './sceneGraph/utils';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { evaluateTimeRange } from '../utils/evaluateTimeRange';\nimport { config, locationService, RefreshEvent } from '@grafana/runtime';\nimport { isValid } from '../utils/date';\nimport { getQueryController } from './sceneGraph/getQueryController';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { isEmpty } from 'lodash';\n\nexport class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implements SceneTimeRangeLike {\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['from', 'to', 'timezone', 'time', 'time.window'] });\n\n public constructor(state: Partial<SceneTimeRangeState> = {}) {\n const from = state.from && isValid(state.from) ? state.from : 'now-6h';\n const to = state.to && isValid(state.to) ? state.to : 'now';\n const timeZone = getValidTimeZone(state.timeZone);\n const value = evaluateTimeRange(\n from,\n to,\n timeZone || getTimeZone(),\n state.fiscalYearStartMonth,\n state.UNSAFE_nowDelay,\n state.weekStart\n );\n const refreshOnActivate = state.refreshOnActivate ?? { percent: 10 };\n super({ from, to, timeZone, value, refreshOnActivate, ...state });\n\n this.addActivationHandler(this._onActivate.bind(this));\n }\n\n private _onActivate() {\n // When SceneTimeRange has no time zone provided, find closest source of time zone and subscribe to it\n if (!this.state.timeZone) {\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this) {\n this._subs.add(\n timeZoneSource.subscribeToState((n, p) => {\n if (n.timeZone !== undefined && n.timeZone !== p.timeZone) {\n this.refreshRange(0);\n }\n })\n );\n }\n }\n\n if (rangeUtil.isRelativeTimeRange(this.state.value.raw)) {\n this.refreshIfStale();\n }\n\n return () => {\n if (this.state.weekStart) {\n setWeekStart(config.bootData.user.weekStart);\n }\n };\n }\n\n private refreshIfStale() {\n let ms;\n if (this.state?.refreshOnActivate?.percent !== undefined) {\n ms = this.calculatePercentOfInterval(this.state.refreshOnActivate.percent);\n }\n if (this.state?.refreshOnActivate?.afterMs !== undefined) {\n ms = Math.min(this.state.refreshOnActivate.afterMs, ms ?? Infinity);\n }\n if (ms !== undefined) {\n this.refreshRange(ms);\n }\n }\n\n /**\n * Will traverse up the scene graph to find the closest SceneTimeRangeLike with time zone set\n */\n private getTimeZoneSource() {\n if (!this.parent || !this.parent.parent) {\n return this;\n }\n // Find the closest source of time zone\n const source = getClosest<SceneTimeRangeLike>(this.parent.parent, (o) => {\n if (o.state.$timeRange && o.state.$timeRange.state.timeZone) {\n return o.state.$timeRange;\n }\n return undefined;\n });\n\n if (!source) {\n return this;\n }\n\n return source;\n }\n\n /**\n * Refreshes time range if it is older than the invalidation interval\n * @param refreshAfterMs invalidation interval (milliseconds)\n * @private\n */\n private refreshRange(refreshAfterMs: number) {\n const value = evaluateTimeRange(\n this.state.from,\n this.state.to,\n this.state.timeZone ?? getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n const diff = value.to.diff(this.state.value.to, 'milliseconds');\n if (diff >= refreshAfterMs) {\n this.setState({ value });\n }\n }\n\n private calculatePercentOfInterval(percent: number): number {\n const intervalMs = this.state.value.to.diff(this.state.value.from, 'milliseconds');\n return Math.ceil((intervalMs / 100) * percent);\n }\n\n public getTimeZone(): TimeZone {\n // Return local time zone if provided\n if (this.state.timeZone && getValidTimeZone(this.state.timeZone)) {\n return this.state.timeZone;\n }\n\n // Resolve higher level time zone source\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this && getValidTimeZone(timeZoneSource.state.timeZone)) {\n return timeZoneSource.state.timeZone!;\n }\n\n // Return default time zone\n return getTimeZone();\n }\n\n public onTimeRangeChange = (timeRange: TimeRange) => {\n const update: Partial<SceneTimeRangeState> = {};\n\n if (typeof timeRange.raw.from === 'string') {\n update.from = timeRange.raw.from;\n } else {\n update.from = timeRange.raw.from.toISOString();\n }\n\n if (typeof timeRange.raw.to === 'string') {\n update.to = timeRange.raw.to;\n } else {\n update.to = timeRange.raw.to.toISOString();\n }\n\n update.value = evaluateTimeRange(\n update.from,\n update.to,\n this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n // Only update if time range actually changed\n if (update.from !== this.state.from || update.to !== this.state.to) {\n const queryController = getQueryController(this);\n queryController?.startProfile('SceneTimeRange');\n this._urlSync.performBrowserHistoryAction(() => {\n this.setState(update);\n });\n }\n };\n\n public onTimeZoneChange = (timeZone: TimeZone) => {\n this._urlSync.performBrowserHistoryAction(() => {\n const validTimeZone = getValidTimeZone(timeZone) ?? defaultTimeZone;\n const updatedValue = evaluateTimeRange(\n this.state.from,\n this.state.to,\n validTimeZone,\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n this.setState({ timeZone: validTimeZone, value: updatedValue });\n });\n };\n\n public onRefresh = () => {\n this.refreshRange(0);\n this.publishEvent(new RefreshEvent(), true);\n };\n\n public getUrlState() {\n const params = locationService.getSearchObject();\n const urlValues: SceneObjectUrlValues = { from: this.state.from, to: this.state.to, timezone: this.getTimeZone() };\n\n // Clear time and time.window once they are converted to from and to\n if (params.time && params['time.window']) {\n urlValues.time = null;\n urlValues['time.window'] = null;\n }\n\n return urlValues;\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const update: Partial<SceneTimeRangeState> = {};\n\n let from = parseUrlParam(values.from);\n let to = parseUrlParam(values.to);\n\n if (values.time && values['time.window']) {\n const time = Array.isArray(values.time) ? values.time[0] : values.time;\n const timeWindow = Array.isArray(values['time.window']) ? values['time.window'][0] : values['time.window'];\n const timeRange = getTimeWindow(time, timeWindow);\n if (timeRange.from && isValid(timeRange.from)) {\n from = timeRange.from;\n }\n\n if (timeRange.to && isValid(timeRange.to)) {\n to = timeRange.to;\n }\n }\n\n if (from && isValid(from)) {\n update.from = from;\n }\n\n if (to && isValid(to)) {\n update.to = to;\n }\n\n if (typeof values.timezone === 'string') {\n update.timeZone = values.timezone !== '' ? values.timezone : undefined;\n }\n\n if (Object.keys(update).length === 0) {\n return;\n }\n\n update.value = evaluateTimeRange(\n update.from ?? this.state.from,\n update.to ?? this.state.to,\n update.timeZone ?? this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n return this.setState(update);\n }\n}\n\n/**\n * Calculates the duration of the time range from time-time.window/2 to time+time.window/2. Both be specified in ms. For example ?time=1500000000000&time.window=10000 results in a 10-second time range from 1499999995000 to 1500000005000`.\n * @param time - time in ms\n * @param timeWindow - time window in ms or interval string\n */\nfunction getTimeWindow(time: string, timeWindow: string) {\n // Parse the time, assuming it could be an ISO string or a number in milliseconds\n const valueTime = isNaN(Date.parse(time)) ? parseInt(time, 10) : Date.parse(time);\n\n let timeWindowMs;\n\n if (timeWindow.match(/^\\d+$/) && parseInt(timeWindow, 10)) {\n // when time window is specified in ms\n timeWindowMs = parseInt(timeWindow, 10);\n } else {\n timeWindowMs = rangeUtil.intervalToMs(timeWindow);\n }\n\n return {\n from: toUtc(valueTime - timeWindowMs / 2).toISOString(),\n to: toUtc(valueTime + timeWindowMs / 2).toISOString(),\n };\n}\n\n/**\n * Validates and returns a valid time zone string or undefined.\n * @param {string} [timeZone] - The time zone to validate. Can be a valid IANA time zone string, the string \"browser\", or undefined.\n * @returns {string | undefined} - Returns the input time zone if it is valid, or undefined if the input is invalid or not provided.\n */\nfunction getValidTimeZone(timeZone?: string): string | undefined {\n if (timeZone === undefined) {\n return undefined;\n }\n\n if (isEmpty(timeZone)) {\n return config.bootData.user.timezone;\n }\n\n if (timeZone === defaultTimeZone) {\n return timeZone;\n }\n\n if (getZone(timeZone)) {\n return timeZone;\n }\n\n writeSceneLog('SceneTimeRange', `Invalid timeZone \"${timeZone}\" provided.`);\n return;\n}\n"],"names":[],"mappings":"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"}
@@ -634,7 +634,7 @@ const getStyles = (theme) => ({
634
634
  color: theme.colors.text.primary,
635
635
  boxShadow: theme.shadows.z2,
636
636
  overflowY: "auto",
637
- zIndex: theme.zIndex.dropdown
637
+ zIndex: theme.zIndex.portal
638
638
  }),
639
639
  inputStyle: css({
640
640
  paddingBlock: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFiltersCombobox.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.tsx"],"sourcesContent":["import { t } from '@grafana/i18n';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FloatingFocusManager, FloatingPortal, UseFloatingOptions } from '@floating-ui/react';\nimport { Spinner, Text, useStyles2 } from '@grafana/ui';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable, isMultiValueOperator } from '../AdHocFiltersVariable';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n DropdownItem,\n LoadingOptionsPlaceholder,\n MultiValueApplyButton,\n NoOptionsPlaceholder,\n OptionsErrorPlaceholder,\n} from './DropdownItem';\nimport {\n ERROR_STATE_DROPDOWN_WIDTH,\n flattenOptionGroups,\n generateFilterUpdatePayload,\n generatePlaceholder,\n populateInputValueOnInputTypeSwitch,\n setupDropdownAccessibility,\n switchInputType,\n switchToNextInputType,\n VIRTUAL_LIST_ITEM_HEIGHT,\n VIRTUAL_LIST_ITEM_HEIGHT_WITH_DESCRIPTION,\n VIRTUAL_LIST_OVERSCAN,\n} from './utils';\nimport { handleOptionGroups } from '../../utils';\nimport { useFloatingInteractions, MAX_MENU_HEIGHT } from './useFloatingInteractions';\nimport { MultiValuePill } from './MultiValuePill';\nimport { getAdhocOptionSearcher } from '../getAdhocOptionSearcher';\n\ninterface AdHocComboboxProps {\n filter?: AdHocFilterWithLabels;\n isAlwaysWip?: boolean;\n model: AdHocFiltersVariable;\n handleChangeViewMode?: (event?: React.MouseEvent, shouldFocusOnPillWrapperOverride?: boolean) => void;\n focusOnWipInputRef?: () => void;\n populateInputOnEdit?: boolean;\n}\n\nexport type AdHocInputType = 'key' | 'operator' | 'value';\n\nexport const AdHocCombobox = forwardRef(function AdHocCombobox(\n { filter, model, isAlwaysWip, handleChangeViewMode, focusOnWipInputRef, populateInputOnEdit }: AdHocComboboxProps,\n parentRef\n) {\n const [open, setOpen] = useState(false);\n const [options, setOptions] = useState<Array<SelectableValue<string>>>([]);\n const [optionsLoading, setOptionsLoading] = useState<boolean>(false);\n const [optionsError, setOptionsError] = useState<boolean>(false);\n const [inputValue, setInputValue] = useState('');\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [filterInputType, setInputType] = useState<AdHocInputType>(!isAlwaysWip ? 'value' : 'key');\n const [preventFiltering, setPreventFiltering] = useState<boolean>(!isAlwaysWip && filterInputType === 'value');\n const styles = useStyles2(getStyles);\n // control multi values with local state in order to commit all values at once and avoid _wip reset mid creation\n const [filterMultiValues, setFilterMultiValues] = useState<Array<SelectableValue<string>>>([]);\n const [_, setForceRefresh] = useState({});\n const allowCustomValue = model.state.allowCustomValue ?? true;\n\n const multiValuePillWrapperRef = useRef<HTMLDivElement>(null);\n\n const hasMultiValueOperator = isMultiValueOperator(filter?.operator || '');\n const isMultiValueEdit = hasMultiValueOperator && filterInputType === 'value';\n\n // used to identify operator element and prevent dismiss because it registers as outside click\n const operatorIdentifier = useId();\n\n const listRef = useRef<Array<HTMLElement | null>>([]);\n const disabledIndicesRef = useRef<number[]>([]);\n const filterInputTypeRef = useRef<AdHocInputType>(!isAlwaysWip ? 'value' : 'key');\n\n const optionsSearcher = useMemo(() => getAdhocOptionSearcher(options), [options]);\n\n const isLastFilter = useMemo(() => {\n if (isAlwaysWip) {\n return false;\n }\n\n if (model.state.filters.at(-1) === filter) {\n return true;\n }\n return false;\n }, [filter, isAlwaysWip, model.state.filters]);\n\n // reset wip filter. Used when navigating away with incomplete wip filer or when selecting wip filter value\n const handleResetWip = useCallback(() => {\n if (isAlwaysWip) {\n model._addWip();\n setInputType('key');\n setInputValue('');\n }\n }, [model, isAlwaysWip]);\n\n const handleMultiValueFilterCommit = useCallback(\n (\n model: AdHocFiltersVariable,\n filter: AdHocFilterWithLabels,\n filterMultiValues: Array<SelectableValue<string>>,\n preventFocus?: boolean\n ) => {\n if (!filterMultiValues.length && filter.origin) {\n model.updateToMatchAll(filter);\n }\n\n if (filterMultiValues.length) {\n const valueLabels: string[] = [];\n const values: string[] = [];\n filterMultiValues.forEach((item) => {\n valueLabels.push(item.label ?? item.value!);\n values.push(item.value!);\n });\n\n model._updateFilter(filter!, { valueLabels, values, value: values[0] });\n setFilterMultiValues([]);\n }\n\n if (!preventFocus) {\n setTimeout(() => refs.domReference.current?.focus());\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const handleLocalMultiValueChange = useCallback((selectedItem: SelectableValue<string>) => {\n setFilterMultiValues((items) => {\n if (items.some((item) => item.value === selectedItem.value)) {\n return items.filter((item) => item.value !== selectedItem.value);\n }\n return [...items, selectedItem];\n });\n }, []);\n\n const onOpenChange = useCallback<NonNullable<UseFloatingOptions['onOpenChange']>>(\n (nextOpen, _, reason) => {\n setOpen(nextOpen);\n // change from filter edit mode to filter view mode when clicked\n // outside input or dropdown\n\n if (reason && ['outside-press', 'escape-key'].includes(reason)) {\n if (isMultiValueEdit) {\n // commit multi value filter values on escape and click-away\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n }\n handleResetWip();\n handleChangeViewMode?.();\n }\n },\n [\n filter,\n filterMultiValues,\n handleChangeViewMode,\n handleMultiValueFilterCommit,\n handleResetWip,\n isMultiValueEdit,\n model,\n ]\n );\n\n // generate ids from multi values in order to prevent outside click based on those ids\n const outsidePressIdsToIgnore = useMemo(() => {\n return [\n operatorIdentifier,\n ...filterMultiValues.reduce<string[]>(\n (acc, item, i) => [...acc, `${item.value}-${i}`, `${item.value}-${i}-close-icon`],\n []\n ),\n ];\n }, [operatorIdentifier, filterMultiValues]);\n\n const { refs, floatingStyles, context, getReferenceProps, getFloatingProps, getItemProps } = useFloatingInteractions({\n open,\n onOpenChange,\n activeIndex,\n setActiveIndex,\n outsidePressIdsToIgnore,\n listRef,\n disabledIndicesRef,\n });\n\n // pass ability to focus on input element back to parent\n // parentRef is coming from AdHocFiltersComboboxRenderer\n useImperativeHandle(parentRef, () => () => refs.domReference.current?.focus(), [refs.domReference]);\n\n function onChange(event: React.ChangeEvent<HTMLInputElement>) {\n const value = event.target.value;\n setInputValue(value);\n setActiveIndex(0);\n if (preventFiltering) {\n setPreventFiltering(false);\n }\n }\n\n const handleRemoveMultiValue = useCallback(\n (item: SelectableValue<string>) => {\n setFilterMultiValues((selected) => selected.filter((option) => option.value !== item.value));\n setTimeout(() => refs.domReference.current?.focus());\n },\n [refs.domReference]\n );\n\n // operation order on fetched options:\n // fuzzy search -> extract into groups -> flatten group labels and options\n const filteredDropDownItems = flattenOptionGroups(\n handleOptionGroups(optionsSearcher(preventFiltering ? '' : inputValue))\n );\n\n // adding custom option this way so that virtualiser is aware of it and can scroll to\n if (allowCustomValue && filterInputType !== 'operator' && inputValue) {\n filteredDropDownItems.push({\n value: inputValue.trim(),\n label: inputValue.trim(),\n isCustom: true,\n });\n }\n\n // Get the optional onAddCustomValue method from the AdHocFiltersVariable if defined\n const onAddCustomValue = model.state.onAddCustomValue;\n\n // calculate width and populate listRef and disabledIndicesRef for arrow key navigation\n const maxOptionWidth = setupDropdownAccessibility(filteredDropDownItems, listRef, disabledIndicesRef);\n\n const handleFetchOptions = useCallback(\n async (inputType: AdHocInputType) => {\n setOptionsError(false);\n setOptionsLoading(true);\n setOptions([]);\n let options: Array<SelectableValue<string>> = [];\n\n try {\n if (inputType === 'key') {\n options = await model._getKeys(null);\n } else if (inputType === 'operator') {\n options = model._getOperators();\n } else if (inputType === 'value') {\n options = await model._getValuesFor(filter!);\n }\n\n // if input type changed before fetch completed then abort updating options\n // this can cause race condition and return incorrect options when input type changed\n if (filterInputTypeRef.current !== inputType) {\n return;\n }\n setOptions(options);\n if (options[0]?.group) {\n setActiveIndex(1);\n } else {\n setActiveIndex(0);\n }\n } catch (e) {\n setOptionsError(true);\n }\n setOptionsLoading(false);\n },\n [filter, model]\n );\n\n const rowVirtualizer = useVirtualizer({\n count: filteredDropDownItems.length,\n getScrollElement: () => refs.floating.current,\n estimateSize: (index) =>\n filteredDropDownItems[index].description ? VIRTUAL_LIST_ITEM_HEIGHT_WITH_DESCRIPTION : VIRTUAL_LIST_ITEM_HEIGHT,\n overscan: VIRTUAL_LIST_OVERSCAN,\n });\n\n //\n // Keyboard interactions\n //\n\n const handleBackspaceInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit: boolean) => {\n if (event.key === 'Backspace' && !inputValue) {\n if (filterInputType === 'value') {\n if (multiValueEdit) {\n if (filterMultiValues.length) {\n setFilterMultiValues((items) => {\n const updated = [...items];\n updated.splice(-1, 1);\n\n return updated;\n });\n return;\n }\n }\n if (filter?.origin) {\n return;\n }\n\n setInputType('operator');\n return;\n }\n\n // focus back on alway wip input when you delete filter with backspace\n focusOnWipInputRef?.();\n\n model._handleComboboxBackspace(filter!);\n\n if (isAlwaysWip) {\n handleResetWip();\n }\n }\n },\n [\n inputValue,\n filterInputType,\n model,\n filter,\n isAlwaysWip,\n filterMultiValues.length,\n handleResetWip,\n focusOnWipInputRef,\n ]\n );\n\n const handleTabInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n // change filter to view mode when navigating away with Tab key\n // this is needed because useDismiss only reacts to mousedown\n if (event.key === 'Tab' && !event.shiftKey) {\n if (multiValueEdit) {\n // commit multi value filter values on tab away\n event.preventDefault();\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n refs.domReference.current?.focus();\n }\n\n handleChangeViewMode?.();\n handleResetWip();\n }\n },\n [\n filter,\n filterMultiValues,\n handleChangeViewMode,\n handleMultiValueFilterCommit,\n handleResetWip,\n model,\n refs.domReference,\n ]\n );\n\n const handleShiftTabInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n if (event.key === 'Tab' && event.shiftKey) {\n if (multiValueEdit) {\n // commit multi value filter values on shift tab away\n event.preventDefault();\n handleMultiValueFilterCommit(model, filter!, filterMultiValues, true);\n }\n handleChangeViewMode?.();\n handleResetWip();\n }\n },\n [filter, filterMultiValues, handleChangeViewMode, handleMultiValueFilterCommit, handleResetWip, model]\n );\n\n const handleEnterInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n if (event.key === 'Enter' && activeIndex != null) {\n // safeguard for non existing items\n // note: custom item is added to filteredDropDownItems if allowed\n if (!filteredDropDownItems[activeIndex]) {\n return;\n }\n const selectedItem = filteredDropDownItems[activeIndex];\n\n if (multiValueEdit) {\n handleLocalMultiValueChange(selectedItem);\n setInputValue('');\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item: selectedItem,\n filter: filter!,\n setFilterMultiValues,\n onAddCustomValue,\n })\n );\n\n populateInputValueOnInputTypeSwitch({\n populateInputOnEdit,\n item: selectedItem,\n filterInputType,\n setInputValue,\n filter,\n });\n\n switchToNextInputType(\n filterInputType,\n setInputType,\n handleChangeViewMode,\n refs.domReference.current,\n // preventing focus on filter pill only when last filter for better backspace experience\n isLastFilter ? false : undefined\n );\n setActiveIndex(null);\n if (isLastFilter) {\n focusOnWipInputRef?.();\n }\n }\n }\n },\n [\n activeIndex,\n filteredDropDownItems,\n handleLocalMultiValueChange,\n model,\n filter,\n filterInputType,\n populateInputOnEdit,\n handleChangeViewMode,\n refs.domReference,\n isLastFilter,\n focusOnWipInputRef,\n onAddCustomValue,\n ]\n );\n\n const handleEditMultiValuePill = useCallback(\n (value: SelectableValue<string>) => {\n const valueLabel = value.label || value.value!;\n setFilterMultiValues((prev) => prev.filter((item) => item.value !== value.value));\n setPreventFiltering(true);\n setInputValue(valueLabel);\n refs.domReference.current?.focus();\n setTimeout(() => {\n refs.domReference.current?.select();\n });\n },\n [refs.domReference]\n );\n\n //\n // Effects\n //\n\n useEffect(() => {\n // fetch options when dropdown is opened.\n if (open) {\n handleFetchOptions(filterInputType);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, filterInputType]);\n\n // when not in wip mode this is the point of switching from view to edit mode\n // and in this case we default to 'value' input type and focus input\n useEffect(() => {\n if (!isAlwaysWip) {\n if (hasMultiValueOperator && filter?.values?.length) {\n const multiValueOptions = (filter.values as string[]).reduce<Array<SelectableValue<string>>>(\n (acc, value, i) => [\n ...acc,\n {\n label: filter.valueLabels?.[i] || value,\n value: value,\n },\n ],\n []\n );\n // populate filter multi values to local state on pill edit enter\n setFilterMultiValues(multiValueOptions);\n }\n\n // populate input when selecting pill for edit\n // this avoids populating input during delete with backspace\n if (!hasMultiValueOperator && populateInputOnEdit) {\n setInputValue(filter?.valueLabels?.[0] ?? (filter?.value || ''));\n setTimeout(() => {\n refs.domReference.current?.select();\n });\n }\n\n refs.domReference.current?.focus();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // this is required only with multi value select in order to update position\n // of the multi value apply button\n useEffect(() => {\n if (isMultiValueEdit && filterMultiValues) {\n setTimeout(() => setForceRefresh({}));\n }\n }, [filterMultiValues, isMultiValueEdit]);\n\n // synch filterInputTypeRef with filterInputType state\n useLayoutEffect(() => {\n if (filterInputTypeRef.current) {\n filterInputTypeRef.current = filterInputType;\n }\n }, [filterInputType]);\n\n useLayoutEffect(() => {\n // this is needed to scroll virtual list to the position of currently selected\n // dropdown item when navigating with arrow up/down keys to end/start of list\n if (\n activeIndex !== null &&\n rowVirtualizer.range &&\n (activeIndex > rowVirtualizer.range?.endIndex || activeIndex < rowVirtualizer.range?.startIndex)\n ) {\n rowVirtualizer.scrollToIndex(activeIndex);\n }\n }, [activeIndex, rowVirtualizer]);\n\n const keyLabel = filter?.keyLabel ?? filter?.key;\n\n return (\n <div className={styles.comboboxWrapper}>\n {filter ? (\n <div className={styles.pillWrapper}>\n {/* Filter key pill render */}\n {filter?.key ? <div className={cx(styles.basePill, styles.keyPill)}>{keyLabel}</div> : null}\n {/* Filter operator pill render */}\n {filter?.key && filter?.operator && filterInputType !== 'operator' ? (\n <div\n id={operatorIdentifier}\n className={cx(\n styles.basePill,\n !filter.origin && styles.operatorPill,\n filter.origin && styles.keyPill,\n operatorIdentifier\n )}\n aria-label={t(\n 'grafana-scenes.variables.ad-hoc-combobox.aria-label-edit-filter-operator',\n 'Edit filter operator'\n )}\n tabIndex={filter.origin ? -1 : 0}\n onClick={(event) => {\n if (filter.origin) {\n handleChangeViewMode?.();\n return;\n }\n\n event.stopPropagation();\n setInputValue('');\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }}\n onKeyDown={(event) => {\n if (filter.origin) {\n return;\n }\n\n handleShiftTabInput(event, hasMultiValueOperator);\n if (event.key === 'Enter') {\n setInputValue('');\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }\n }}\n {...(!filter.origin && { role: 'button' })}\n >\n {filter.operator}\n </div>\n ) : null}\n\n <div ref={multiValuePillWrapperRef}></div>\n {isMultiValueEdit\n ? filterMultiValues.map((item, i) => (\n <MultiValuePill\n key={`${item.value}-${i}`}\n item={item}\n index={i}\n handleRemoveMultiValue={handleRemoveMultiValue}\n handleEditMultiValuePill={handleEditMultiValuePill}\n />\n ))\n : null}\n </div>\n ) : null}\n\n <input\n {...getReferenceProps({\n ref: refs.setReference,\n onChange,\n value: inputValue,\n // dynamic placeholder to display operator and/or value in filter edit mode\n placeholder: generatePlaceholder(filter!, filterInputType, isMultiValueEdit, isAlwaysWip),\n 'aria-autocomplete': 'list',\n onKeyDown(event) {\n if (!open) {\n setOpen(true);\n return;\n }\n\n if (filterInputType === 'operator') {\n handleShiftTabInput(event);\n }\n handleBackspaceInput(event, isMultiValueEdit);\n handleTabInput(event, isMultiValueEdit);\n handleEnterInput(event, isMultiValueEdit);\n },\n })}\n className={cx(styles.inputStyle, { [styles.loadingInputPadding]: !optionsLoading })}\n onClick={(event) => {\n event.stopPropagation();\n setOpen(true);\n }}\n onFocus={() => {\n setOpen(true);\n }}\n />\n {optionsLoading ? <Spinner className={styles.loadingIndicator} inline={true} /> : null}\n <FloatingPortal>\n {open && (\n <FloatingFocusManager context={context} initialFocus={-1} visuallyHiddenDismiss modal={false}>\n <>\n <div\n style={{\n ...floatingStyles,\n width: `${optionsError ? ERROR_STATE_DROPDOWN_WIDTH : maxOptionWidth}px`,\n transform: isMultiValueEdit\n ? `translate(${multiValuePillWrapperRef.current?.getBoundingClientRect().left || 0}px, ${\n (refs.domReference.current?.getBoundingClientRect().bottom || 0) + 10\n }px )`\n : floatingStyles.transform,\n }}\n ref={refs.setFloating}\n className={styles.dropdownWrapper}\n tabIndex={-1}\n >\n <div\n style={{\n height: `${rowVirtualizer.getTotalSize() || VIRTUAL_LIST_ITEM_HEIGHT}px`, // fallback to 38px for loading/error/no options placeholders\n }}\n {...getFloatingProps()}\n tabIndex={-1}\n >\n {optionsLoading ? (\n <LoadingOptionsPlaceholder />\n ) : optionsError ? (\n <OptionsErrorPlaceholder handleFetchOptions={() => handleFetchOptions(filterInputType)} />\n ) : !filteredDropDownItems.length &&\n (!allowCustomValue || filterInputType === 'operator' || !inputValue) ? (\n <NoOptionsPlaceholder />\n ) : (\n rowVirtualizer.getVirtualItems().map((virtualItem) => {\n const item = filteredDropDownItems[virtualItem.index];\n const index = virtualItem.index;\n\n // render group label\n if (item.options) {\n return (\n <div\n key={`${item.label}+${index}`}\n className={cx(styles.optionGroupLabel, styles.groupTopBorder)}\n style={{\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n <Text weight=\"bold\" variant=\"bodySmall\" color=\"secondary\">\n {item.label!}\n </Text>\n </div>\n );\n }\n\n const nextItem: SelectableValue<string> | undefined =\n filteredDropDownItems[virtualItem.index + 1];\n const shouldAddBottomBorder = nextItem && !nextItem.group && !nextItem.options && item.group;\n\n const itemLabel = item.label ?? item.value;\n\n return (\n // key is included in getItemProps()\n // eslint-disable-next-line react/jsx-key\n <DropdownItem\n {...getItemProps({\n key: `${item.value!}-${index}`,\n ref(node) {\n listRef.current[index] = node;\n },\n onClick(event) {\n if (filterInputType !== 'value') {\n event.stopPropagation();\n }\n if (isMultiValueEdit) {\n event.preventDefault();\n event.stopPropagation();\n handleLocalMultiValueChange(item);\n setInputValue('');\n refs.domReference.current?.focus();\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item,\n filter: filter!,\n setFilterMultiValues,\n onAddCustomValue,\n })\n );\n\n populateInputValueOnInputTypeSwitch({\n populateInputOnEdit,\n item,\n filterInputType,\n setInputValue,\n filter,\n });\n\n switchToNextInputType(\n filterInputType,\n setInputType,\n handleChangeViewMode,\n refs.domReference.current,\n // explicitly preventing focus on filter pill due to a11y error\n false\n );\n }\n },\n })}\n active={activeIndex === index}\n addGroupBottomBorder={shouldAddBottomBorder}\n // virtual item positioning and accessibility\n style={{\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n aria-setsize={filteredDropDownItems.length}\n aria-posinset={virtualItem.index + 1}\n isMultiValueEdit={isMultiValueEdit}\n checked={filterMultiValues.some((val) => val.value === item.value)}\n >\n <span>\n {item.isCustom\n ? t(\n 'grafana-scenes.components.adhoc-filters-combobox.use-custom-value',\n 'Use custom value: {{itemLabel}}',\n { itemLabel }\n )\n : itemLabel}\n </span>\n {item.description ? <div className={styles.descriptionText}>{item.description}</div> : null}\n </DropdownItem>\n );\n })\n )}\n </div>\n </div>\n {isMultiValueEdit && !optionsLoading && !optionsError && filteredDropDownItems.length ? (\n <MultiValueApplyButton\n onApply={() => {\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n }}\n floatingElement={refs.floating.current}\n maxOptionWidth={maxOptionWidth}\n menuHeight={Math.min(rowVirtualizer.getTotalSize(), MAX_MENU_HEIGHT)}\n />\n ) : null}\n </>\n </FloatingFocusManager>\n )}\n </FloatingPortal>\n </div>\n );\n});\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n comboboxWrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n }),\n pillWrapper: css({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }),\n basePill: css({\n display: 'flex',\n alignItems: 'center',\n background: theme.colors.action.disabledBackground,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.125, 1, 0.125, 1),\n color: theme.colors.text.primary,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n minHeight: theme.spacing(2.75),\n ...theme.typography.bodySmall,\n cursor: 'pointer',\n }),\n keyPill: css({\n fontWeight: theme.typography.fontWeightBold,\n cursor: 'default',\n }),\n operatorPill: css({\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n dropdownWrapper: css({\n backgroundColor: theme.colors.background.primary,\n color: theme.colors.text.primary,\n boxShadow: theme.shadows.z2,\n overflowY: 'auto',\n zIndex: theme.zIndex.dropdown,\n }),\n inputStyle: css({\n paddingBlock: 0,\n '&:focus': {\n outline: 'none',\n },\n }),\n loadingIndicator: css({\n color: theme.colors.text.secondary,\n marginLeft: theme.spacing(0.5),\n }),\n loadingInputPadding: css({\n paddingRight: theme.spacing(2.5),\n }),\n optionGroupLabel: css({\n padding: theme.spacing(1),\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n }),\n groupTopBorder: css({\n '&:not(:first-child)': {\n borderTop: `1px solid ${theme.colors.border.weak}`,\n },\n }),\n descriptionText: css({\n ...theme.typography.bodySmall,\n color: theme.colors.text.secondary,\n paddingTop: theme.spacing(0.5),\n }),\n});\n"],"names":["AdHocCombobox","model","filter","filterMultiValues","_a","_","options","_b","_c","_d"],"mappings":"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"}
1
+ {"version":3,"file":"AdHocFiltersCombobox.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.tsx"],"sourcesContent":["import { t } from '@grafana/i18n';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FloatingFocusManager, FloatingPortal, UseFloatingOptions } from '@floating-ui/react';\nimport { Spinner, Text, useStyles2 } from '@grafana/ui';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable, isMultiValueOperator } from '../AdHocFiltersVariable';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n DropdownItem,\n LoadingOptionsPlaceholder,\n MultiValueApplyButton,\n NoOptionsPlaceholder,\n OptionsErrorPlaceholder,\n} from './DropdownItem';\nimport {\n ERROR_STATE_DROPDOWN_WIDTH,\n flattenOptionGroups,\n generateFilterUpdatePayload,\n generatePlaceholder,\n populateInputValueOnInputTypeSwitch,\n setupDropdownAccessibility,\n switchInputType,\n switchToNextInputType,\n VIRTUAL_LIST_ITEM_HEIGHT,\n VIRTUAL_LIST_ITEM_HEIGHT_WITH_DESCRIPTION,\n VIRTUAL_LIST_OVERSCAN,\n} from './utils';\nimport { handleOptionGroups } from '../../utils';\nimport { useFloatingInteractions, MAX_MENU_HEIGHT } from './useFloatingInteractions';\nimport { MultiValuePill } from './MultiValuePill';\nimport { getAdhocOptionSearcher } from '../getAdhocOptionSearcher';\n\ninterface AdHocComboboxProps {\n filter?: AdHocFilterWithLabels;\n isAlwaysWip?: boolean;\n model: AdHocFiltersVariable;\n handleChangeViewMode?: (event?: React.MouseEvent, shouldFocusOnPillWrapperOverride?: boolean) => void;\n focusOnWipInputRef?: () => void;\n populateInputOnEdit?: boolean;\n}\n\nexport type AdHocInputType = 'key' | 'operator' | 'value';\n\nexport const AdHocCombobox = forwardRef(function AdHocCombobox(\n { filter, model, isAlwaysWip, handleChangeViewMode, focusOnWipInputRef, populateInputOnEdit }: AdHocComboboxProps,\n parentRef\n) {\n const [open, setOpen] = useState(false);\n const [options, setOptions] = useState<Array<SelectableValue<string>>>([]);\n const [optionsLoading, setOptionsLoading] = useState<boolean>(false);\n const [optionsError, setOptionsError] = useState<boolean>(false);\n const [inputValue, setInputValue] = useState('');\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [filterInputType, setInputType] = useState<AdHocInputType>(!isAlwaysWip ? 'value' : 'key');\n const [preventFiltering, setPreventFiltering] = useState<boolean>(!isAlwaysWip && filterInputType === 'value');\n const styles = useStyles2(getStyles);\n // control multi values with local state in order to commit all values at once and avoid _wip reset mid creation\n const [filterMultiValues, setFilterMultiValues] = useState<Array<SelectableValue<string>>>([]);\n const [_, setForceRefresh] = useState({});\n const allowCustomValue = model.state.allowCustomValue ?? true;\n\n const multiValuePillWrapperRef = useRef<HTMLDivElement>(null);\n\n const hasMultiValueOperator = isMultiValueOperator(filter?.operator || '');\n const isMultiValueEdit = hasMultiValueOperator && filterInputType === 'value';\n\n // used to identify operator element and prevent dismiss because it registers as outside click\n const operatorIdentifier = useId();\n\n const listRef = useRef<Array<HTMLElement | null>>([]);\n const disabledIndicesRef = useRef<number[]>([]);\n const filterInputTypeRef = useRef<AdHocInputType>(!isAlwaysWip ? 'value' : 'key');\n\n const optionsSearcher = useMemo(() => getAdhocOptionSearcher(options), [options]);\n\n const isLastFilter = useMemo(() => {\n if (isAlwaysWip) {\n return false;\n }\n\n if (model.state.filters.at(-1) === filter) {\n return true;\n }\n return false;\n }, [filter, isAlwaysWip, model.state.filters]);\n\n // reset wip filter. Used when navigating away with incomplete wip filer or when selecting wip filter value\n const handleResetWip = useCallback(() => {\n if (isAlwaysWip) {\n model._addWip();\n setInputType('key');\n setInputValue('');\n }\n }, [model, isAlwaysWip]);\n\n const handleMultiValueFilterCommit = useCallback(\n (\n model: AdHocFiltersVariable,\n filter: AdHocFilterWithLabels,\n filterMultiValues: Array<SelectableValue<string>>,\n preventFocus?: boolean\n ) => {\n if (!filterMultiValues.length && filter.origin) {\n model.updateToMatchAll(filter);\n }\n\n if (filterMultiValues.length) {\n const valueLabels: string[] = [];\n const values: string[] = [];\n filterMultiValues.forEach((item) => {\n valueLabels.push(item.label ?? item.value!);\n values.push(item.value!);\n });\n\n model._updateFilter(filter!, { valueLabels, values, value: values[0] });\n setFilterMultiValues([]);\n }\n\n if (!preventFocus) {\n setTimeout(() => refs.domReference.current?.focus());\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const handleLocalMultiValueChange = useCallback((selectedItem: SelectableValue<string>) => {\n setFilterMultiValues((items) => {\n if (items.some((item) => item.value === selectedItem.value)) {\n return items.filter((item) => item.value !== selectedItem.value);\n }\n return [...items, selectedItem];\n });\n }, []);\n\n const onOpenChange = useCallback<NonNullable<UseFloatingOptions['onOpenChange']>>(\n (nextOpen, _, reason) => {\n setOpen(nextOpen);\n // change from filter edit mode to filter view mode when clicked\n // outside input or dropdown\n\n if (reason && ['outside-press', 'escape-key'].includes(reason)) {\n if (isMultiValueEdit) {\n // commit multi value filter values on escape and click-away\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n }\n handleResetWip();\n handleChangeViewMode?.();\n }\n },\n [\n filter,\n filterMultiValues,\n handleChangeViewMode,\n handleMultiValueFilterCommit,\n handleResetWip,\n isMultiValueEdit,\n model,\n ]\n );\n\n // generate ids from multi values in order to prevent outside click based on those ids\n const outsidePressIdsToIgnore = useMemo(() => {\n return [\n operatorIdentifier,\n ...filterMultiValues.reduce<string[]>(\n (acc, item, i) => [...acc, `${item.value}-${i}`, `${item.value}-${i}-close-icon`],\n []\n ),\n ];\n }, [operatorIdentifier, filterMultiValues]);\n\n const { refs, floatingStyles, context, getReferenceProps, getFloatingProps, getItemProps } = useFloatingInteractions({\n open,\n onOpenChange,\n activeIndex,\n setActiveIndex,\n outsidePressIdsToIgnore,\n listRef,\n disabledIndicesRef,\n });\n\n // pass ability to focus on input element back to parent\n // parentRef is coming from AdHocFiltersComboboxRenderer\n useImperativeHandle(parentRef, () => () => refs.domReference.current?.focus(), [refs.domReference]);\n\n function onChange(event: React.ChangeEvent<HTMLInputElement>) {\n const value = event.target.value;\n setInputValue(value);\n setActiveIndex(0);\n if (preventFiltering) {\n setPreventFiltering(false);\n }\n }\n\n const handleRemoveMultiValue = useCallback(\n (item: SelectableValue<string>) => {\n setFilterMultiValues((selected) => selected.filter((option) => option.value !== item.value));\n setTimeout(() => refs.domReference.current?.focus());\n },\n [refs.domReference]\n );\n\n // operation order on fetched options:\n // fuzzy search -> extract into groups -> flatten group labels and options\n const filteredDropDownItems = flattenOptionGroups(\n handleOptionGroups(optionsSearcher(preventFiltering ? '' : inputValue))\n );\n\n // adding custom option this way so that virtualiser is aware of it and can scroll to\n if (allowCustomValue && filterInputType !== 'operator' && inputValue) {\n filteredDropDownItems.push({\n value: inputValue.trim(),\n label: inputValue.trim(),\n isCustom: true,\n });\n }\n\n // Get the optional onAddCustomValue method from the AdHocFiltersVariable if defined\n const onAddCustomValue = model.state.onAddCustomValue;\n\n // calculate width and populate listRef and disabledIndicesRef for arrow key navigation\n const maxOptionWidth = setupDropdownAccessibility(filteredDropDownItems, listRef, disabledIndicesRef);\n\n const handleFetchOptions = useCallback(\n async (inputType: AdHocInputType) => {\n setOptionsError(false);\n setOptionsLoading(true);\n setOptions([]);\n let options: Array<SelectableValue<string>> = [];\n\n try {\n if (inputType === 'key') {\n options = await model._getKeys(null);\n } else if (inputType === 'operator') {\n options = model._getOperators();\n } else if (inputType === 'value') {\n options = await model._getValuesFor(filter!);\n }\n\n // if input type changed before fetch completed then abort updating options\n // this can cause race condition and return incorrect options when input type changed\n if (filterInputTypeRef.current !== inputType) {\n return;\n }\n setOptions(options);\n if (options[0]?.group) {\n setActiveIndex(1);\n } else {\n setActiveIndex(0);\n }\n } catch (e) {\n setOptionsError(true);\n }\n setOptionsLoading(false);\n },\n [filter, model]\n );\n\n const rowVirtualizer = useVirtualizer({\n count: filteredDropDownItems.length,\n getScrollElement: () => refs.floating.current,\n estimateSize: (index) =>\n filteredDropDownItems[index].description ? VIRTUAL_LIST_ITEM_HEIGHT_WITH_DESCRIPTION : VIRTUAL_LIST_ITEM_HEIGHT,\n overscan: VIRTUAL_LIST_OVERSCAN,\n });\n\n //\n // Keyboard interactions\n //\n\n const handleBackspaceInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit: boolean) => {\n if (event.key === 'Backspace' && !inputValue) {\n if (filterInputType === 'value') {\n if (multiValueEdit) {\n if (filterMultiValues.length) {\n setFilterMultiValues((items) => {\n const updated = [...items];\n updated.splice(-1, 1);\n\n return updated;\n });\n return;\n }\n }\n if (filter?.origin) {\n return;\n }\n\n setInputType('operator');\n return;\n }\n\n // focus back on alway wip input when you delete filter with backspace\n focusOnWipInputRef?.();\n\n model._handleComboboxBackspace(filter!);\n\n if (isAlwaysWip) {\n handleResetWip();\n }\n }\n },\n [\n inputValue,\n filterInputType,\n model,\n filter,\n isAlwaysWip,\n filterMultiValues.length,\n handleResetWip,\n focusOnWipInputRef,\n ]\n );\n\n const handleTabInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n // change filter to view mode when navigating away with Tab key\n // this is needed because useDismiss only reacts to mousedown\n if (event.key === 'Tab' && !event.shiftKey) {\n if (multiValueEdit) {\n // commit multi value filter values on tab away\n event.preventDefault();\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n refs.domReference.current?.focus();\n }\n\n handleChangeViewMode?.();\n handleResetWip();\n }\n },\n [\n filter,\n filterMultiValues,\n handleChangeViewMode,\n handleMultiValueFilterCommit,\n handleResetWip,\n model,\n refs.domReference,\n ]\n );\n\n const handleShiftTabInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n if (event.key === 'Tab' && event.shiftKey) {\n if (multiValueEdit) {\n // commit multi value filter values on shift tab away\n event.preventDefault();\n handleMultiValueFilterCommit(model, filter!, filterMultiValues, true);\n }\n handleChangeViewMode?.();\n handleResetWip();\n }\n },\n [filter, filterMultiValues, handleChangeViewMode, handleMultiValueFilterCommit, handleResetWip, model]\n );\n\n const handleEnterInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n if (event.key === 'Enter' && activeIndex != null) {\n // safeguard for non existing items\n // note: custom item is added to filteredDropDownItems if allowed\n if (!filteredDropDownItems[activeIndex]) {\n return;\n }\n const selectedItem = filteredDropDownItems[activeIndex];\n\n if (multiValueEdit) {\n handleLocalMultiValueChange(selectedItem);\n setInputValue('');\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item: selectedItem,\n filter: filter!,\n setFilterMultiValues,\n onAddCustomValue,\n })\n );\n\n populateInputValueOnInputTypeSwitch({\n populateInputOnEdit,\n item: selectedItem,\n filterInputType,\n setInputValue,\n filter,\n });\n\n switchToNextInputType(\n filterInputType,\n setInputType,\n handleChangeViewMode,\n refs.domReference.current,\n // preventing focus on filter pill only when last filter for better backspace experience\n isLastFilter ? false : undefined\n );\n setActiveIndex(null);\n if (isLastFilter) {\n focusOnWipInputRef?.();\n }\n }\n }\n },\n [\n activeIndex,\n filteredDropDownItems,\n handleLocalMultiValueChange,\n model,\n filter,\n filterInputType,\n populateInputOnEdit,\n handleChangeViewMode,\n refs.domReference,\n isLastFilter,\n focusOnWipInputRef,\n onAddCustomValue,\n ]\n );\n\n const handleEditMultiValuePill = useCallback(\n (value: SelectableValue<string>) => {\n const valueLabel = value.label || value.value!;\n setFilterMultiValues((prev) => prev.filter((item) => item.value !== value.value));\n setPreventFiltering(true);\n setInputValue(valueLabel);\n refs.domReference.current?.focus();\n setTimeout(() => {\n refs.domReference.current?.select();\n });\n },\n [refs.domReference]\n );\n\n //\n // Effects\n //\n\n useEffect(() => {\n // fetch options when dropdown is opened.\n if (open) {\n handleFetchOptions(filterInputType);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, filterInputType]);\n\n // when not in wip mode this is the point of switching from view to edit mode\n // and in this case we default to 'value' input type and focus input\n useEffect(() => {\n if (!isAlwaysWip) {\n if (hasMultiValueOperator && filter?.values?.length) {\n const multiValueOptions = (filter.values as string[]).reduce<Array<SelectableValue<string>>>(\n (acc, value, i) => [\n ...acc,\n {\n label: filter.valueLabels?.[i] || value,\n value: value,\n },\n ],\n []\n );\n // populate filter multi values to local state on pill edit enter\n setFilterMultiValues(multiValueOptions);\n }\n\n // populate input when selecting pill for edit\n // this avoids populating input during delete with backspace\n if (!hasMultiValueOperator && populateInputOnEdit) {\n setInputValue(filter?.valueLabels?.[0] ?? (filter?.value || ''));\n setTimeout(() => {\n refs.domReference.current?.select();\n });\n }\n\n refs.domReference.current?.focus();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // this is required only with multi value select in order to update position\n // of the multi value apply button\n useEffect(() => {\n if (isMultiValueEdit && filterMultiValues) {\n setTimeout(() => setForceRefresh({}));\n }\n }, [filterMultiValues, isMultiValueEdit]);\n\n // synch filterInputTypeRef with filterInputType state\n useLayoutEffect(() => {\n if (filterInputTypeRef.current) {\n filterInputTypeRef.current = filterInputType;\n }\n }, [filterInputType]);\n\n useLayoutEffect(() => {\n // this is needed to scroll virtual list to the position of currently selected\n // dropdown item when navigating with arrow up/down keys to end/start of list\n if (\n activeIndex !== null &&\n rowVirtualizer.range &&\n (activeIndex > rowVirtualizer.range?.endIndex || activeIndex < rowVirtualizer.range?.startIndex)\n ) {\n rowVirtualizer.scrollToIndex(activeIndex);\n }\n }, [activeIndex, rowVirtualizer]);\n\n const keyLabel = filter?.keyLabel ?? filter?.key;\n\n return (\n <div className={styles.comboboxWrapper}>\n {filter ? (\n <div className={styles.pillWrapper}>\n {/* Filter key pill render */}\n {filter?.key ? <div className={cx(styles.basePill, styles.keyPill)}>{keyLabel}</div> : null}\n {/* Filter operator pill render */}\n {filter?.key && filter?.operator && filterInputType !== 'operator' ? (\n <div\n id={operatorIdentifier}\n className={cx(\n styles.basePill,\n !filter.origin && styles.operatorPill,\n filter.origin && styles.keyPill,\n operatorIdentifier\n )}\n aria-label={t(\n 'grafana-scenes.variables.ad-hoc-combobox.aria-label-edit-filter-operator',\n 'Edit filter operator'\n )}\n tabIndex={filter.origin ? -1 : 0}\n onClick={(event) => {\n if (filter.origin) {\n handleChangeViewMode?.();\n return;\n }\n\n event.stopPropagation();\n setInputValue('');\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }}\n onKeyDown={(event) => {\n if (filter.origin) {\n return;\n }\n\n handleShiftTabInput(event, hasMultiValueOperator);\n if (event.key === 'Enter') {\n setInputValue('');\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }\n }}\n {...(!filter.origin && { role: 'button' })}\n >\n {filter.operator}\n </div>\n ) : null}\n\n <div ref={multiValuePillWrapperRef}></div>\n {isMultiValueEdit\n ? filterMultiValues.map((item, i) => (\n <MultiValuePill\n key={`${item.value}-${i}`}\n item={item}\n index={i}\n handleRemoveMultiValue={handleRemoveMultiValue}\n handleEditMultiValuePill={handleEditMultiValuePill}\n />\n ))\n : null}\n </div>\n ) : null}\n\n <input\n {...getReferenceProps({\n ref: refs.setReference,\n onChange,\n value: inputValue,\n // dynamic placeholder to display operator and/or value in filter edit mode\n placeholder: generatePlaceholder(filter!, filterInputType, isMultiValueEdit, isAlwaysWip),\n 'aria-autocomplete': 'list',\n onKeyDown(event) {\n if (!open) {\n setOpen(true);\n return;\n }\n\n if (filterInputType === 'operator') {\n handleShiftTabInput(event);\n }\n handleBackspaceInput(event, isMultiValueEdit);\n handleTabInput(event, isMultiValueEdit);\n handleEnterInput(event, isMultiValueEdit);\n },\n })}\n className={cx(styles.inputStyle, { [styles.loadingInputPadding]: !optionsLoading })}\n onClick={(event) => {\n event.stopPropagation();\n setOpen(true);\n }}\n onFocus={() => {\n setOpen(true);\n }}\n />\n {optionsLoading ? <Spinner className={styles.loadingIndicator} inline={true} /> : null}\n <FloatingPortal>\n {open && (\n <FloatingFocusManager context={context} initialFocus={-1} visuallyHiddenDismiss modal={false}>\n <>\n <div\n style={{\n ...floatingStyles,\n width: `${optionsError ? ERROR_STATE_DROPDOWN_WIDTH : maxOptionWidth}px`,\n transform: isMultiValueEdit\n ? `translate(${multiValuePillWrapperRef.current?.getBoundingClientRect().left || 0}px, ${\n (refs.domReference.current?.getBoundingClientRect().bottom || 0) + 10\n }px )`\n : floatingStyles.transform,\n }}\n ref={refs.setFloating}\n className={styles.dropdownWrapper}\n tabIndex={-1}\n >\n <div\n style={{\n height: `${rowVirtualizer.getTotalSize() || VIRTUAL_LIST_ITEM_HEIGHT}px`, // fallback to 38px for loading/error/no options placeholders\n }}\n {...getFloatingProps()}\n tabIndex={-1}\n >\n {optionsLoading ? (\n <LoadingOptionsPlaceholder />\n ) : optionsError ? (\n <OptionsErrorPlaceholder handleFetchOptions={() => handleFetchOptions(filterInputType)} />\n ) : !filteredDropDownItems.length &&\n (!allowCustomValue || filterInputType === 'operator' || !inputValue) ? (\n <NoOptionsPlaceholder />\n ) : (\n rowVirtualizer.getVirtualItems().map((virtualItem) => {\n const item = filteredDropDownItems[virtualItem.index];\n const index = virtualItem.index;\n\n // render group label\n if (item.options) {\n return (\n <div\n key={`${item.label}+${index}`}\n className={cx(styles.optionGroupLabel, styles.groupTopBorder)}\n style={{\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n <Text weight=\"bold\" variant=\"bodySmall\" color=\"secondary\">\n {item.label!}\n </Text>\n </div>\n );\n }\n\n const nextItem: SelectableValue<string> | undefined =\n filteredDropDownItems[virtualItem.index + 1];\n const shouldAddBottomBorder = nextItem && !nextItem.group && !nextItem.options && item.group;\n\n const itemLabel = item.label ?? item.value;\n\n return (\n // key is included in getItemProps()\n // eslint-disable-next-line react/jsx-key\n <DropdownItem\n {...getItemProps({\n key: `${item.value!}-${index}`,\n ref(node) {\n listRef.current[index] = node;\n },\n onClick(event) {\n if (filterInputType !== 'value') {\n event.stopPropagation();\n }\n if (isMultiValueEdit) {\n event.preventDefault();\n event.stopPropagation();\n handleLocalMultiValueChange(item);\n setInputValue('');\n refs.domReference.current?.focus();\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item,\n filter: filter!,\n setFilterMultiValues,\n onAddCustomValue,\n })\n );\n\n populateInputValueOnInputTypeSwitch({\n populateInputOnEdit,\n item,\n filterInputType,\n setInputValue,\n filter,\n });\n\n switchToNextInputType(\n filterInputType,\n setInputType,\n handleChangeViewMode,\n refs.domReference.current,\n // explicitly preventing focus on filter pill due to a11y error\n false\n );\n }\n },\n })}\n active={activeIndex === index}\n addGroupBottomBorder={shouldAddBottomBorder}\n // virtual item positioning and accessibility\n style={{\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n aria-setsize={filteredDropDownItems.length}\n aria-posinset={virtualItem.index + 1}\n isMultiValueEdit={isMultiValueEdit}\n checked={filterMultiValues.some((val) => val.value === item.value)}\n >\n <span>\n {item.isCustom\n ? t(\n 'grafana-scenes.components.adhoc-filters-combobox.use-custom-value',\n 'Use custom value: {{itemLabel}}',\n { itemLabel }\n )\n : itemLabel}\n </span>\n {item.description ? <div className={styles.descriptionText}>{item.description}</div> : null}\n </DropdownItem>\n );\n })\n )}\n </div>\n </div>\n {isMultiValueEdit && !optionsLoading && !optionsError && filteredDropDownItems.length ? (\n <MultiValueApplyButton\n onApply={() => {\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n }}\n floatingElement={refs.floating.current}\n maxOptionWidth={maxOptionWidth}\n menuHeight={Math.min(rowVirtualizer.getTotalSize(), MAX_MENU_HEIGHT)}\n />\n ) : null}\n </>\n </FloatingFocusManager>\n )}\n </FloatingPortal>\n </div>\n );\n});\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n comboboxWrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n }),\n pillWrapper: css({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }),\n basePill: css({\n display: 'flex',\n alignItems: 'center',\n background: theme.colors.action.disabledBackground,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.125, 1, 0.125, 1),\n color: theme.colors.text.primary,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n minHeight: theme.spacing(2.75),\n ...theme.typography.bodySmall,\n cursor: 'pointer',\n }),\n keyPill: css({\n fontWeight: theme.typography.fontWeightBold,\n cursor: 'default',\n }),\n operatorPill: css({\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n dropdownWrapper: css({\n backgroundColor: theme.colors.background.primary,\n color: theme.colors.text.primary,\n boxShadow: theme.shadows.z2,\n overflowY: 'auto',\n zIndex: theme.zIndex.portal,\n }),\n inputStyle: css({\n paddingBlock: 0,\n '&:focus': {\n outline: 'none',\n },\n }),\n loadingIndicator: css({\n color: theme.colors.text.secondary,\n marginLeft: theme.spacing(0.5),\n }),\n loadingInputPadding: css({\n paddingRight: theme.spacing(2.5),\n }),\n optionGroupLabel: css({\n padding: theme.spacing(1),\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n }),\n groupTopBorder: css({\n '&:not(:first-child)': {\n borderTop: `1px solid ${theme.colors.border.weak}`,\n },\n }),\n descriptionText: css({\n ...theme.typography.bodySmall,\n color: theme.colors.text.secondary,\n paddingTop: theme.spacing(0.5),\n }),\n});\n"],"names":["AdHocCombobox","model","filter","filterMultiValues","_a","_","options","_b","_c","_d"],"mappings":"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"}
@@ -96,7 +96,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
96
96
  }
97
97
  (_e = this.state.originFilters) == null ? void 0 : _e.forEach((filter) => {
98
98
  var _a2;
99
- this._originalValues.set(filter.key, {
99
+ this._originalValues.set(`${filter.key}-${filter.origin}`, {
100
100
  operator: filter.operator,
101
101
  value: (_a2 = filter.values) != null ? _a2 : [filter.value]
102
102
  });
@@ -121,7 +121,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
121
121
  const remainingFilters = [];
122
122
  finalFilters.forEach((scopeFilter) => {
123
123
  var _a2;
124
- this._originalValues.set(scopeFilter.key, {
124
+ this._originalValues.set(`${scopeFilter.key}-${scopeFilter.origin}`, {
125
125
  value: (_a2 = scopeFilter.values) != null ? _a2 : [scopeFilter.value],
126
126
  operator: scopeFilter.operator
127
127
  });
@@ -192,7 +192,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
192
192
  restorable: false
193
193
  };
194
194
  if (filter.restorable) {
195
- const originalFilter = this._originalValues.get(filter.key);
195
+ const originalFilter = this._originalValues.get(`${filter.key}-${filter.origin}`);
196
196
  if (!originalFilter) {
197
197
  return;
198
198
  }
@@ -211,7 +211,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
211
211
  var _a;
212
212
  const { originFilters, filters, _wip } = this.state;
213
213
  if (filter.origin) {
214
- const originalValues = this._originalValues.get(filter.key);
214
+ const originalValues = this._originalValues.get(`${filter.key}-${filter.origin}`);
215
215
  const updateValues = update.values || (update.value ? [update.value] : void 0);
216
216
  if (updateValues && !isEqual(updateValues, originalValues == null ? void 0 : originalValues.value) || update.operator && update.operator !== (originalValues == null ? void 0 : originalValues.operator)) {
217
217
  update.restorable = true;
@@ -341,7 +341,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
341
341
  if (!f.matchAllFilter) {
342
342
  f.nonApplicable = true;
343
343
  }
344
- const originalValue = this._originalValues.get(f.key);
344
+ const originalValue = this._originalValues.get(`${f.key}-${f.origin}`);
345
345
  if (originalValue) {
346
346
  originalValue.nonApplicable = true;
347
347
  }