@grafana/scenes 6.29.0 → 6.29.2--canary.1202.16723575264.0

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,15 @@
1
+ # v6.29.1 (Mon Aug 04 2025)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - AdHocFilters: Removing value from an origin filter will turn it into a matchAll filter [#1201](https://github.com/grafana/scenes/pull/1201) ([@mdvictor](https://github.com/mdvictor))
6
+
7
+ #### Authors: 1
8
+
9
+ - Victor Marin ([@mdvictor](https://github.com/mdvictor))
10
+
11
+ ---
12
+
1
13
  # v6.29.0 (Fri Aug 01 2025)
2
14
 
3
15
  #### 🚀 Enhancement
@@ -100,6 +100,10 @@ const AdHocCombobox = forwardRef(function AdHocCombobox2({ filter, model, isAlwa
100
100
  if (reason && ["outside-press", "escape-key"].includes(reason)) {
101
101
  if (isMultiValueEdit) {
102
102
  handleMultiValueFilterCommit(model, filter, filterMultiValues);
103
+ } else {
104
+ if (filter && filter.origin && inputValue === "") {
105
+ model.updateToMatchAll(filter);
106
+ }
103
107
  }
104
108
  handleResetWip();
105
109
  handleChangeViewMode == null ? void 0 : handleChangeViewMode();
@@ -111,6 +115,7 @@ const AdHocCombobox = forwardRef(function AdHocCombobox2({ filter, model, isAlwa
111
115
  handleChangeViewMode,
112
116
  handleMultiValueFilterCommit,
113
117
  handleResetWip,
118
+ inputValue,
114
119
  isMultiValueEdit,
115
120
  model
116
121
  ]
@@ -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 {\n AdHocFilterWithLabels,\n AdHocFiltersVariable,\n isFilterComplete,\n isMultiValueOperator,\n} 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';\nimport { getQueryController } from '../../../core/sceneGraph/getQueryController';\nimport { FILTER_REMOVED_INTERACTION, FILTER_CHANGED_INTERACTION } from '../../../behaviors/SceneRenderProfiler';\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 // Only update if values have changed\n let shouldUpdate = true;\n if (Array.isArray(filter.values) && filter.values.length === values.length) {\n shouldUpdate = !filter.values.every((v, i) => v === values[i]);\n }\n\n if (shouldUpdate) {\n const queryController = getQueryController(model);\n queryController?.startProfile(FILTER_CHANGED_INTERACTION);\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 if (isFilterComplete(filter!)) {\n const queryController = getQueryController(model);\n queryController?.startProfile(FILTER_REMOVED_INTERACTION);\n }\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 const payload = generateFilterUpdatePayload({\n filterInputType,\n item: selectedItem,\n filter: filter!,\n setFilterMultiValues,\n onAddCustomValue,\n });\n\n // Only start profile if value has changed\n if (filterInputType === 'value' && payload.value !== filter?.value) {\n const queryController = getQueryController(model);\n queryController?.startProfile(FILTER_CHANGED_INTERACTION);\n }\n\n model._updateFilter(filter!, payload);\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\n if (isMultiValueEdit) {\n event.preventDefault();\n event.stopPropagation();\n handleLocalMultiValueChange(item);\n setInputValue('');\n refs.domReference.current?.focus();\n } else {\n const payload = generateFilterUpdatePayload({\n filterInputType,\n item,\n filter: filter!,\n setFilterMultiValues,\n onAddCustomValue,\n });\n\n if (filterInputType === 'value' && payload.value !== filter?.value) {\n const queryController = getQueryController(model);\n queryController?.startProfile(FILTER_CHANGED_INTERACTION);\n }\n model._updateFilter(filter!, payload);\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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"}
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 {\n AdHocFilterWithLabels,\n AdHocFiltersVariable,\n isFilterComplete,\n isMultiValueOperator,\n} 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';\nimport { getQueryController } from '../../../core/sceneGraph/getQueryController';\nimport { FILTER_REMOVED_INTERACTION, FILTER_CHANGED_INTERACTION } from '../../../behaviors/SceneRenderProfiler';\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 // Only update if values have changed\n let shouldUpdate = true;\n if (Array.isArray(filter.values) && filter.values.length === values.length) {\n shouldUpdate = !filter.values.every((v, i) => v === values[i]);\n }\n\n if (shouldUpdate) {\n const queryController = getQueryController(model);\n queryController?.startProfile(FILTER_CHANGED_INTERACTION);\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 } else {\n if (filter && filter.origin && inputValue === '') {\n model.updateToMatchAll(filter);\n }\n }\n\n handleResetWip();\n handleChangeViewMode?.();\n }\n },\n [\n filter,\n filterMultiValues,\n handleChangeViewMode,\n handleMultiValueFilterCommit,\n handleResetWip,\n inputValue,\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 if (isFilterComplete(filter!)) {\n const queryController = getQueryController(model);\n queryController?.startProfile(FILTER_REMOVED_INTERACTION);\n }\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 const payload = generateFilterUpdatePayload({\n filterInputType,\n item: selectedItem,\n filter: filter!,\n setFilterMultiValues,\n onAddCustomValue,\n });\n\n // Only start profile if value has changed\n if (filterInputType === 'value' && payload.value !== filter?.value) {\n const queryController = getQueryController(model);\n queryController?.startProfile(FILTER_CHANGED_INTERACTION);\n }\n\n model._updateFilter(filter!, payload);\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\n if (isMultiValueEdit) {\n event.preventDefault();\n event.stopPropagation();\n handleLocalMultiValueChange(item);\n setInputValue('');\n refs.domReference.current?.focus();\n } else {\n const payload = generateFilterUpdatePayload({\n filterInputType,\n item,\n filter: filter!,\n setFilterMultiValues,\n onAddCustomValue,\n });\n\n if (filterInputType === 'value' && payload.value !== filter?.value) {\n const queryController = getQueryController(model);\n queryController?.startProfile(FILTER_CHANGED_INTERACTION);\n }\n model._updateFilter(filter!, payload);\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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"}
@@ -7,6 +7,10 @@ function isEqualityOrMultiOperator(value) {
7
7
  const operators = /* @__PURE__ */ new Set(["equals", "not-equals", "one-of", "not-one-of"]);
8
8
  return operators.has(value);
9
9
  }
10
+ function isRegexOperator(value) {
11
+ const operators = /* @__PURE__ */ new Set(["regex-match", "regex-not-match"]);
12
+ return operators.has(value);
13
+ }
10
14
  function getAdHocFiltersFromScopes(scopes) {
11
15
  const formattedFilters = /* @__PURE__ */ new Map();
12
16
  const duplicatedFilters = [];
@@ -22,8 +26,11 @@ function processFilter(formattedFilters, duplicatedFilters, filter) {
22
26
  return;
23
27
  }
24
28
  const existingFilter = formattedFilters.get(filter.key);
25
- if (existingFilter && canValueBeMerged(existingFilter.operator, filter.operator)) {
29
+ if (existingFilter && isEqualityValue(existingFilter.operator, filter.operator)) {
26
30
  mergeFilterValues(existingFilter, filter);
31
+ } else if (existingFilter && isRegexValue(existingFilter.operator, filter.operator)) {
32
+ existingFilter.value += `|${filter.value}`;
33
+ existingFilter.values = [existingFilter.value];
27
34
  } else if (!existingFilter) {
28
35
  formattedFilters.set(filter.key, {
29
36
  key: filter.key,
@@ -59,16 +66,26 @@ function mergeFilterValues(adHocFilter, filter) {
59
66
  adHocFilter.operator = reverseScopeFilterOperatorMap["not-one-of"];
60
67
  }
61
68
  }
62
- function canValueBeMerged(adHocFilterOperator, filterOperator) {
69
+ function isRegexValue(adHocFilterOperator, filterOperator) {
70
+ const scopeConvertedOperator = scopeFilterOperatorMap[adHocFilterOperator];
71
+ if (!isRegexOperator(scopeConvertedOperator) || !isRegexOperator(filterOperator)) {
72
+ return false;
73
+ }
74
+ return hasSameOperators(scopeConvertedOperator, filterOperator);
75
+ }
76
+ function isEqualityValue(adHocFilterOperator, filterOperator) {
63
77
  const scopeConvertedOperator = scopeFilterOperatorMap[adHocFilterOperator];
64
78
  if (!isEqualityOrMultiOperator(scopeConvertedOperator) || !isEqualityOrMultiOperator(filterOperator)) {
65
79
  return false;
66
80
  }
81
+ return hasSameOperators(scopeConvertedOperator, filterOperator);
82
+ }
83
+ function hasSameOperators(scopeConvertedOperator, filterOperator) {
67
84
  if (scopeConvertedOperator.includes("not") && !filterOperator.includes("not") || !scopeConvertedOperator.includes("not") && filterOperator.includes("not")) {
68
85
  return false;
69
86
  }
70
87
  return true;
71
88
  }
72
89
 
73
- export { getAdHocFiltersFromScopes, isEqualityOrMultiOperator, reverseScopeFilterOperatorMap };
90
+ export { getAdHocFiltersFromScopes, isEqualityOrMultiOperator, isRegexOperator, reverseScopeFilterOperatorMap };
74
91
  //# sourceMappingURL=getAdHocFiltersFromScopes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getAdHocFiltersFromScopes.js","sources":["../../../../src/variables/adhoc/getAdHocFiltersFromScopes.ts"],"sourcesContent":["import { Scope, ScopeFilterOperator, ScopeSpecFilter, scopeFilterOperatorMap } from '@grafana/data';\nimport { AdHocFilterWithLabels } from './AdHocFiltersVariable';\n\nexport type EqualityOrMultiOperator = Extract<ScopeFilterOperator, 'equals' | 'not-equals' | 'one-of' | 'not-one-of'>;\n\nexport const reverseScopeFilterOperatorMap: Record<ScopeFilterOperator, string> = Object.fromEntries(\n Object.entries(scopeFilterOperatorMap).map(([symbol, operator]) => [operator, symbol])\n) as Record<ScopeFilterOperator, string>;\n\nexport function isEqualityOrMultiOperator(value: string): value is EqualityOrMultiOperator {\n const operators = new Set(['equals', 'not-equals', 'one-of', 'not-one-of']);\n return operators.has(value);\n}\n\n// this function returns processed adhoc filters after parsing and processing\n// all scope filters from a scope list. The reason we need to process these filters is\n// because scopes can have multiple filter values with the same key. For example:\n// we have selected ScopeA which has a filter with a key1, operator one-of, a value1,\n// and a ScopeB which has a filter with key1, operator one-of, and value2. After processing,\n// the result will be just one adhoc filter with both values. This is held in formattedFilters.\n// DuplicatedFilters will containg unprocessable filters: if scopeA has instead of the one-of op\n// an equal op, then the result will be 2 adhoc filters with the same key, but diferent operator\n// and value. We return them this way and let the adhoc interface deal with this.\nexport function getAdHocFiltersFromScopes(scopes: Scope[]): AdHocFilterWithLabels[] {\n const formattedFilters: Map<string, AdHocFilterWithLabels> = new Map();\n // duplicated filters that could not be processed in any way are just appended to the list\n const duplicatedFilters: AdHocFilterWithLabels[] = [];\n const allFilters = scopes.flatMap((scope) => scope.spec.filters);\n\n for (const filter of allFilters) {\n processFilter(formattedFilters, duplicatedFilters, filter);\n }\n\n return [...formattedFilters.values(), ...duplicatedFilters];\n}\n\nfunction processFilter(\n formattedFilters: Map<string, AdHocFilterWithLabels>,\n duplicatedFilters: AdHocFilterWithLabels[],\n filter: ScopeSpecFilter\n) {\n if (!filter) {\n return;\n }\n\n const existingFilter = formattedFilters.get(filter.key);\n\n if (existingFilter && canValueBeMerged(existingFilter.operator, filter.operator)) {\n mergeFilterValues(existingFilter, filter);\n } else if (!existingFilter) {\n // Add filter to map either only if it is new.\n // Otherwise it is an existing filter that cannot be converted to multi-value\n // and thus will be moved to the duplicatedFilters list\n formattedFilters.set(filter.key, {\n key: filter.key,\n operator: reverseScopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values ?? [filter.value],\n origin: 'scope',\n });\n } else {\n duplicatedFilters.push({\n key: filter.key,\n operator: reverseScopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values ?? [filter.value],\n origin: 'scope',\n });\n }\n}\n\nfunction mergeFilterValues(adHocFilter: AdHocFilterWithLabels, filter: ScopeSpecFilter) {\n const values = filter.values ?? [filter.value];\n\n for (const value of values) {\n if (!adHocFilter.values?.includes(value)) {\n adHocFilter.values?.push(value);\n }\n }\n\n // If there's only one value, there's no need to update the\n // operator to its multi-value equivalent\n if (adHocFilter.values?.length === 1) {\n return;\n }\n\n // Otherwise update it to the equivalent multi-value operator\n if (filter.operator === 'equals' && adHocFilter.operator === reverseScopeFilterOperatorMap['equals']) {\n adHocFilter.operator = reverseScopeFilterOperatorMap['one-of'];\n } else if (filter.operator === 'not-equals' && adHocFilter.operator === reverseScopeFilterOperatorMap['not-equals']) {\n adHocFilter.operator = reverseScopeFilterOperatorMap['not-one-of'];\n }\n}\n\nfunction canValueBeMerged(adHocFilterOperator: string, filterOperator: string) {\n const scopeConvertedOperator = scopeFilterOperatorMap[adHocFilterOperator];\n\n if (!isEqualityOrMultiOperator(scopeConvertedOperator) || !isEqualityOrMultiOperator(filterOperator)) {\n return false;\n }\n\n if (\n (scopeConvertedOperator.includes('not') && !filterOperator.includes('not')) ||\n (!scopeConvertedOperator.includes('not') && filterOperator.includes('not'))\n ) {\n return false;\n }\n\n return true;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getAdHocFiltersFromScopes.js","sources":["../../../../src/variables/adhoc/getAdHocFiltersFromScopes.ts"],"sourcesContent":["import { Scope, ScopeFilterOperator, ScopeSpecFilter, scopeFilterOperatorMap } from '@grafana/data';\nimport { AdHocFilterWithLabels } from './AdHocFiltersVariable';\n\nexport type EqualityOrMultiOperator = Extract<ScopeFilterOperator, 'equals' | 'not-equals' | 'one-of' | 'not-one-of'>;\nexport type RegexOperator = Extract<ScopeFilterOperator, 'regex-match' | 'regex-not-match'>;\n\nexport const reverseScopeFilterOperatorMap: Record<ScopeFilterOperator, string> = Object.fromEntries(\n Object.entries(scopeFilterOperatorMap).map(([symbol, operator]) => [operator, symbol])\n) as Record<ScopeFilterOperator, string>;\n\nexport function isEqualityOrMultiOperator(value: string): value is EqualityOrMultiOperator {\n const operators = new Set(['equals', 'not-equals', 'one-of', 'not-one-of']);\n return operators.has(value);\n}\n\nexport function isRegexOperator(value: string): value is RegexOperator {\n const operators = new Set(['regex-match', 'regex-not-match']);\n return operators.has(value);\n}\n\n// this function returns processed adhoc filters after parsing and processing\n// all scope filters from a scope list. The reason we need to process these filters is\n// because scopes can have multiple filter values with the same key. For example:\n// we have selected ScopeA which has a filter with a key1, operator one-of, a value1,\n// and a ScopeB which has a filter with key1, operator one-of, and value2. After processing,\n// the result will be just one adhoc filter with both values. This is held in formattedFilters.\n// DuplicatedFilters will containg unprocessable filters: if scopeA has instead of the one-of op\n// an equal op, then the result will be 2 adhoc filters with the same key, but diferent operator\n// and value. We return them this way and let the adhoc interface deal with this.\nexport function getAdHocFiltersFromScopes(scopes: Scope[]): AdHocFilterWithLabels[] {\n const formattedFilters: Map<string, AdHocFilterWithLabels> = new Map();\n // duplicated filters that could not be processed in any way are just appended to the list\n const duplicatedFilters: AdHocFilterWithLabels[] = [];\n const allFilters = scopes.flatMap((scope) => scope.spec.filters);\n\n for (const filter of allFilters) {\n processFilter(formattedFilters, duplicatedFilters, filter);\n }\n\n return [...formattedFilters.values(), ...duplicatedFilters];\n}\n\nfunction processFilter(\n formattedFilters: Map<string, AdHocFilterWithLabels>,\n duplicatedFilters: AdHocFilterWithLabels[],\n filter: ScopeSpecFilter\n) {\n if (!filter) {\n return;\n }\n\n const existingFilter = formattedFilters.get(filter.key);\n\n if (existingFilter && isEqualityValue(existingFilter.operator, filter.operator)) {\n mergeFilterValues(existingFilter, filter);\n } else if (existingFilter && isRegexValue(existingFilter.operator, filter.operator)) {\n existingFilter.value += `|${filter.value}`;\n existingFilter.values = [existingFilter.value];\n } else if (!existingFilter) {\n // Add filter to map either only if it is new.\n // Otherwise it is an existing filter that cannot be converted to multi-value\n // and thus will be moved to the duplicatedFilters list\n formattedFilters.set(filter.key, {\n key: filter.key,\n operator: reverseScopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values ?? [filter.value],\n origin: 'scope',\n });\n } else {\n duplicatedFilters.push({\n key: filter.key,\n operator: reverseScopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values ?? [filter.value],\n origin: 'scope',\n });\n }\n}\n\nfunction mergeFilterValues(adHocFilter: AdHocFilterWithLabels, filter: ScopeSpecFilter) {\n const values = filter.values ?? [filter.value];\n\n for (const value of values) {\n if (!adHocFilter.values?.includes(value)) {\n adHocFilter.values?.push(value);\n }\n }\n\n // If there's only one value, there's no need to update the\n // operator to its multi-value equivalent\n if (adHocFilter.values?.length === 1) {\n return;\n }\n\n // Otherwise update it to the equivalent multi-value operator\n if (filter.operator === 'equals' && adHocFilter.operator === reverseScopeFilterOperatorMap['equals']) {\n adHocFilter.operator = reverseScopeFilterOperatorMap['one-of'];\n } else if (filter.operator === 'not-equals' && adHocFilter.operator === reverseScopeFilterOperatorMap['not-equals']) {\n adHocFilter.operator = reverseScopeFilterOperatorMap['not-one-of'];\n }\n}\n\nfunction isRegexValue(adHocFilterOperator: string, filterOperator: string) {\n const scopeConvertedOperator = scopeFilterOperatorMap[adHocFilterOperator];\n\n if (!isRegexOperator(scopeConvertedOperator) || !isRegexOperator(filterOperator)) {\n return false;\n }\n\n return hasSameOperators(scopeConvertedOperator, filterOperator);\n}\n\nfunction isEqualityValue(adHocFilterOperator: string, filterOperator: string) {\n const scopeConvertedOperator = scopeFilterOperatorMap[adHocFilterOperator];\n\n if (!isEqualityOrMultiOperator(scopeConvertedOperator) || !isEqualityOrMultiOperator(filterOperator)) {\n return false;\n }\n\n return hasSameOperators(scopeConvertedOperator, filterOperator);\n}\n\nfunction hasSameOperators(scopeConvertedOperator: string, filterOperator: string) {\n if (\n (scopeConvertedOperator.includes('not') && !filterOperator.includes('not')) ||\n (!scopeConvertedOperator.includes('not') && filterOperator.includes('not'))\n ) {\n return false;\n }\n\n return true;\n}\n"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4690,6 +4690,10 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4690
4690
  if (reason && ["outside-press", "escape-key"].includes(reason)) {
4691
4691
  if (isMultiValueEdit) {
4692
4692
  handleMultiValueFilterCommit(model, filter, filterMultiValues);
4693
+ } else {
4694
+ if (filter && filter.origin && inputValue === "") {
4695
+ model.updateToMatchAll(filter);
4696
+ }
4693
4697
  }
4694
4698
  handleResetWip();
4695
4699
  handleChangeViewMode == null ? void 0 : handleChangeViewMode();
@@ -4701,6 +4705,7 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4701
4705
  handleChangeViewMode,
4702
4706
  handleMultiValueFilterCommit,
4703
4707
  handleResetWip,
4708
+ inputValue,
4704
4709
  isMultiValueEdit,
4705
4710
  model
4706
4711
  ]
@@ -5626,6 +5631,10 @@ function isEqualityOrMultiOperator(value) {
5626
5631
  const operators = /* @__PURE__ */ new Set(["equals", "not-equals", "one-of", "not-one-of"]);
5627
5632
  return operators.has(value);
5628
5633
  }
5634
+ function isRegexOperator(value) {
5635
+ const operators = /* @__PURE__ */ new Set(["regex-match", "regex-not-match"]);
5636
+ return operators.has(value);
5637
+ }
5629
5638
  function getAdHocFiltersFromScopes(scopes) {
5630
5639
  const formattedFilters = /* @__PURE__ */ new Map();
5631
5640
  const duplicatedFilters = [];
@@ -5641,8 +5650,11 @@ function processFilter(formattedFilters, duplicatedFilters, filter) {
5641
5650
  return;
5642
5651
  }
5643
5652
  const existingFilter = formattedFilters.get(filter.key);
5644
- if (existingFilter && canValueBeMerged(existingFilter.operator, filter.operator)) {
5653
+ if (existingFilter && isEqualityValue(existingFilter.operator, filter.operator)) {
5645
5654
  mergeFilterValues(existingFilter, filter);
5655
+ } else if (existingFilter && isRegexValue(existingFilter.operator, filter.operator)) {
5656
+ existingFilter.value += `|${filter.value}`;
5657
+ existingFilter.values = [existingFilter.value];
5646
5658
  } else if (!existingFilter) {
5647
5659
  formattedFilters.set(filter.key, {
5648
5660
  key: filter.key,
@@ -5678,11 +5690,21 @@ function mergeFilterValues(adHocFilter, filter) {
5678
5690
  adHocFilter.operator = reverseScopeFilterOperatorMap["not-one-of"];
5679
5691
  }
5680
5692
  }
5681
- function canValueBeMerged(adHocFilterOperator, filterOperator) {
5693
+ function isRegexValue(adHocFilterOperator, filterOperator) {
5694
+ const scopeConvertedOperator = data.scopeFilterOperatorMap[adHocFilterOperator];
5695
+ if (!isRegexOperator(scopeConvertedOperator) || !isRegexOperator(filterOperator)) {
5696
+ return false;
5697
+ }
5698
+ return hasSameOperators(scopeConvertedOperator, filterOperator);
5699
+ }
5700
+ function isEqualityValue(adHocFilterOperator, filterOperator) {
5682
5701
  const scopeConvertedOperator = data.scopeFilterOperatorMap[adHocFilterOperator];
5683
5702
  if (!isEqualityOrMultiOperator(scopeConvertedOperator) || !isEqualityOrMultiOperator(filterOperator)) {
5684
5703
  return false;
5685
5704
  }
5705
+ return hasSameOperators(scopeConvertedOperator, filterOperator);
5706
+ }
5707
+ function hasSameOperators(scopeConvertedOperator, filterOperator) {
5686
5708
  if (scopeConvertedOperator.includes("not") && !filterOperator.includes("not") || !scopeConvertedOperator.includes("not") && filterOperator.includes("not")) {
5687
5709
  return false;
5688
5710
  }