@grafana/scenes 5.20.5--canary.942.11520639649.0 → 5.21.0

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ # v5.21.0 (Tue Oct 29 2024)
2
+
3
+ #### 🚀 Enhancement
4
+
5
+ - SceneObject: Improve cloning logic [#944](https://github.com/grafana/scenes/pull/944) ([@torkelo](https://github.com/torkelo))
6
+
7
+ #### Authors: 1
8
+
9
+ - Torkel Ödegaard ([@torkelo](https://github.com/torkelo))
10
+
11
+ ---
12
+
1
13
  # v5.20.4 (Wed Oct 23 2024)
2
14
 
3
15
  #### 🐛 Bug Fix
@@ -23,13 +23,15 @@ function cloneSceneObject(sceneObject, withState) {
23
23
  }
24
24
  function cloneSceneObjectState(sceneState, withState) {
25
25
  const clonedState = __spreadValues({}, sceneState);
26
+ Object.assign(clonedState, withState);
26
27
  for (const key in clonedState) {
27
28
  const propValue = clonedState[key];
28
29
  if (propValue instanceof SceneObjectBase) {
29
30
  clonedState[key] = propValue.clone();
30
31
  }
31
32
  if (propValue instanceof SceneObjectRef) {
32
- throw new Error("Cannot clone a SceneObject with a SceneObjectRef in state");
33
+ console.warn("Cloning object with SceneObjectRef");
34
+ continue;
33
35
  }
34
36
  if (Array.isArray(propValue)) {
35
37
  const newArray = [];
@@ -43,7 +45,6 @@ function cloneSceneObjectState(sceneState, withState) {
43
45
  clonedState[key] = newArray;
44
46
  }
45
47
  }
46
- Object.assign(clonedState, withState);
47
48
  return clonedState;
48
49
  }
49
50
  function getClosest(sceneObject, extract) {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/core/sceneGraph/utils.ts"],"sourcesContent":["import { SceneObject, SceneObjectState } from '../types';\n\nimport { SceneObjectBase } from '../SceneObjectBase';\nimport { SceneObjectRef } from '../SceneObjectRef';\n\n/**\n * Will create new SceneItem with shalled cloned state, but all states items of type SceneObject are deep cloned\n */\nexport function cloneSceneObject<T extends SceneObjectBase<TState>, TState extends SceneObjectState>(\n sceneObject: SceneObjectBase<TState>,\n withState?: Partial<TState>\n): T {\n const clonedState = cloneSceneObjectState(sceneObject.state, withState);\n return new (sceneObject.constructor as any)(clonedState);\n}\n\nexport function cloneSceneObjectState<TState extends SceneObjectState>(\n sceneState: TState,\n withState?: Partial<TState>\n): TState {\n const clonedState = { ...sceneState };\n\n // Clone any SceneItems in state\n for (const key in clonedState) {\n const propValue = clonedState[key];\n if (propValue instanceof SceneObjectBase) {\n clonedState[key] = propValue.clone();\n }\n\n if (propValue instanceof SceneObjectRef) {\n throw new Error('Cannot clone a SceneObject with a SceneObjectRef in state');\n }\n\n // Clone scene objects in arrays\n if (Array.isArray(propValue)) {\n const newArray: any = [];\n for (const child of propValue) {\n if (child instanceof SceneObjectBase) {\n newArray.push(child.clone());\n } else {\n newArray.push(child);\n }\n }\n clonedState[key] = newArray;\n }\n }\n\n Object.assign(clonedState, withState);\n\n return clonedState;\n}\n\n/** Walks up the scene graph, returning the first non-undefined result of `extract` */\nexport function getClosest<T>(sceneObject: SceneObject, extract: (s: SceneObject) => T | undefined): T | undefined {\n let curSceneObject: SceneObject | undefined = sceneObject;\n let extracted: T | undefined = undefined;\n\n while (curSceneObject && !extracted) {\n extracted = extract(curSceneObject);\n curSceneObject = curSceneObject.parent;\n }\n\n return extracted;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAQgB,SAAA,gBAAA,CACd,aACA,SACG,EAAA;AACH,EAAA,MAAM,WAAc,GAAA,qBAAA,CAAsB,WAAY,CAAA,KAAA,EAAO,SAAS,CAAA,CAAA;AACtE,EAAO,OAAA,IAAK,WAAY,CAAA,WAAA,CAAoB,WAAW,CAAA,CAAA;AACzD,CAAA;AAEgB,SAAA,qBAAA,CACd,YACA,SACQ,EAAA;AACR,EAAA,MAAM,cAAc,cAAK,CAAA,EAAA,EAAA,UAAA,CAAA,CAAA;AAGzB,EAAA,KAAA,MAAW,OAAO,WAAa,EAAA;AAC7B,IAAA,MAAM,YAAY,WAAY,CAAA,GAAA,CAAA,CAAA;AAC9B,IAAA,IAAI,qBAAqB,eAAiB,EAAA;AACxC,MAAY,WAAA,CAAA,GAAA,CAAA,GAAO,UAAU,KAAM,EAAA,CAAA;AAAA,KACrC;AAEA,IAAA,IAAI,qBAAqB,cAAgB,EAAA;AACvC,MAAM,MAAA,IAAI,MAAM,2DAA2D,CAAA,CAAA;AAAA,KAC7E;AAGA,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,SAAS,CAAG,EAAA;AAC5B,MAAA,MAAM,WAAgB,EAAC,CAAA;AACvB,MAAA,KAAA,MAAW,SAAS,SAAW,EAAA;AAC7B,QAAA,IAAI,iBAAiB,eAAiB,EAAA;AACpC,UAAS,QAAA,CAAA,IAAA,CAAK,KAAM,CAAA,KAAA,EAAO,CAAA,CAAA;AAAA,SACtB,MAAA;AACL,UAAA,QAAA,CAAS,KAAK,KAAK,CAAA,CAAA;AAAA,SACrB;AAAA,OACF;AACA,MAAA,WAAA,CAAY,GAAO,CAAA,GAAA,QAAA,CAAA;AAAA,KACrB;AAAA,GACF;AAEA,EAAO,MAAA,CAAA,MAAA,CAAO,aAAa,SAAS,CAAA,CAAA;AAEpC,EAAO,OAAA,WAAA,CAAA;AACT,CAAA;AAGgB,SAAA,UAAA,CAAc,aAA0B,OAA2D,EAAA;AACjH,EAAA,IAAI,cAA0C,GAAA,WAAA,CAAA;AAC9C,EAAA,IAAI,SAA2B,GAAA,KAAA,CAAA,CAAA;AAE/B,EAAO,OAAA,cAAA,IAAkB,CAAC,SAAW,EAAA;AACnC,IAAA,SAAA,GAAY,QAAQ,cAAc,CAAA,CAAA;AAClC,IAAA,cAAA,GAAiB,cAAe,CAAA,MAAA,CAAA;AAAA,GAClC;AAEA,EAAO,OAAA,SAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/core/sceneGraph/utils.ts"],"sourcesContent":["import { SceneObject, SceneObjectState } from '../types';\n\nimport { SceneObjectBase } from '../SceneObjectBase';\nimport { SceneObjectRef } from '../SceneObjectRef';\n\n/**\n * Will create new SceneItem with shalled cloned state, but all states items of type SceneObject are deep cloned\n */\nexport function cloneSceneObject<T extends SceneObjectBase<TState>, TState extends SceneObjectState>(\n sceneObject: SceneObjectBase<TState>,\n withState?: Partial<TState>\n): T {\n const clonedState = cloneSceneObjectState(sceneObject.state, withState);\n return new (sceneObject.constructor as any)(clonedState);\n}\n\nexport function cloneSceneObjectState<TState extends SceneObjectState>(\n sceneState: TState,\n withState?: Partial<TState>\n): TState {\n const clonedState = { ...sceneState };\n\n Object.assign(clonedState, withState);\n\n // Clone any SceneItems in state\n for (const key in clonedState) {\n const propValue = clonedState[key];\n if (propValue instanceof SceneObjectBase) {\n clonedState[key] = propValue.clone();\n }\n\n if (propValue instanceof SceneObjectRef) {\n console.warn('Cloning object with SceneObjectRef');\n continue;\n }\n\n // Clone scene objects in arrays\n if (Array.isArray(propValue)) {\n const newArray: any = [];\n for (const child of propValue) {\n if (child instanceof SceneObjectBase) {\n newArray.push(child.clone());\n } else {\n newArray.push(child);\n }\n }\n clonedState[key] = newArray;\n }\n }\n\n return clonedState;\n}\n\n/** Walks up the scene graph, returning the first non-undefined result of `extract` */\nexport function getClosest<T>(sceneObject: SceneObject, extract: (s: SceneObject) => T | undefined): T | undefined {\n let curSceneObject: SceneObject | undefined = sceneObject;\n let extracted: T | undefined = undefined;\n\n while (curSceneObject && !extracted) {\n extracted = extract(curSceneObject);\n curSceneObject = curSceneObject.parent;\n }\n\n return extracted;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAQgB,SAAA,gBAAA,CACd,aACA,SACG,EAAA;AACH,EAAA,MAAM,WAAc,GAAA,qBAAA,CAAsB,WAAY,CAAA,KAAA,EAAO,SAAS,CAAA,CAAA;AACtE,EAAO,OAAA,IAAK,WAAY,CAAA,WAAA,CAAoB,WAAW,CAAA,CAAA;AACzD,CAAA;AAEgB,SAAA,qBAAA,CACd,YACA,SACQ,EAAA;AACR,EAAA,MAAM,cAAc,cAAK,CAAA,EAAA,EAAA,UAAA,CAAA,CAAA;AAEzB,EAAO,MAAA,CAAA,MAAA,CAAO,aAAa,SAAS,CAAA,CAAA;AAGpC,EAAA,KAAA,MAAW,OAAO,WAAa,EAAA;AAC7B,IAAA,MAAM,YAAY,WAAY,CAAA,GAAA,CAAA,CAAA;AAC9B,IAAA,IAAI,qBAAqB,eAAiB,EAAA;AACxC,MAAY,WAAA,CAAA,GAAA,CAAA,GAAO,UAAU,KAAM,EAAA,CAAA;AAAA,KACrC;AAEA,IAAA,IAAI,qBAAqB,cAAgB,EAAA;AACvC,MAAA,OAAA,CAAQ,KAAK,oCAAoC,CAAA,CAAA;AACjD,MAAA,SAAA;AAAA,KACF;AAGA,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,SAAS,CAAG,EAAA;AAC5B,MAAA,MAAM,WAAgB,EAAC,CAAA;AACvB,MAAA,KAAA,MAAW,SAAS,SAAW,EAAA;AAC7B,QAAA,IAAI,iBAAiB,eAAiB,EAAA;AACpC,UAAS,QAAA,CAAA,IAAA,CAAK,KAAM,CAAA,KAAA,EAAO,CAAA,CAAA;AAAA,SACtB,MAAA;AACL,UAAA,QAAA,CAAS,KAAK,KAAK,CAAA,CAAA;AAAA,SACrB;AAAA,OACF;AACA,MAAA,WAAA,CAAY,GAAO,CAAA,GAAA,QAAA,CAAA;AAAA,KACrB;AAAA,GACF;AAEA,EAAO,OAAA,WAAA,CAAA;AACT,CAAA;AAGgB,SAAA,UAAA,CAAc,aAA0B,OAA2D,EAAA;AACjH,EAAA,IAAI,cAA0C,GAAA,WAAA,CAAA;AAC9C,EAAA,IAAI,SAA2B,GAAA,KAAA,CAAA,CAAA;AAE/B,EAAO,OAAA,cAAA,IAAkB,CAAC,SAAW,EAAA;AACnC,IAAA,SAAA,GAAY,QAAQ,cAAc,CAAA,CAAA;AAClC,IAAA,cAAA,GAAiB,cAAe,CAAA,MAAA,CAAA;AAAA,GAClC;AAEA,EAAO,OAAA,SAAA,CAAA;AACT;;;;"}
@@ -22,7 +22,7 @@ var __spreadValues = (a, b) => {
22
22
  return a;
23
23
  };
24
24
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
- function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
25
+ function AdHocFilterPill({ filter, model, readOnly, focusOnInputRef }) {
26
26
  var _a, _b, _c;
27
27
  const styles = useStyles2(getStyles);
28
28
  const [viewMode, setViewMode] = useState(true);
@@ -48,12 +48,6 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
48
48
  setShouldFocus(false);
49
49
  }
50
50
  }, [shouldFocus]);
51
- useEffect(() => {
52
- if (filter.forceEdit && viewMode) {
53
- setViewMode(false);
54
- model._updateFilter(filter, { forceEdit: void 0 });
55
- }
56
- }, [filter, model, viewMode]);
57
51
  if (viewMode) {
58
52
  const pillText = /* @__PURE__ */ React.createElement("span", {
59
53
  className: styles.pillText
@@ -79,14 +73,14 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
79
73
  onClick: (e) => {
80
74
  e.stopPropagation();
81
75
  model._removeFilter(filter);
82
- setTimeout(() => focusOnWipInputRef == null ? void 0 : focusOnWipInputRef());
76
+ setTimeout(() => focusOnInputRef == null ? void 0 : focusOnInputRef());
83
77
  },
84
78
  onKeyDownCapture: (e) => {
85
79
  if (e.key === "Enter") {
86
80
  e.preventDefault();
87
81
  e.stopPropagation();
88
82
  model._removeFilter(filter);
89
- setTimeout(() => focusOnWipInputRef == null ? void 0 : focusOnWipInputRef());
83
+ setTimeout(() => focusOnInputRef == null ? void 0 : focusOnInputRef());
90
84
  }
91
85
  },
92
86
  name: "times",
@@ -98,8 +92,7 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
98
92
  return /* @__PURE__ */ React.createElement(AdHocCombobox, {
99
93
  filter,
100
94
  model,
101
- handleChangeViewMode,
102
- focusOnWipInputRef
95
+ handleChangeViewMode
103
96
  });
104
97
  }
105
98
  const getStyles = (theme) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFilterPill.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, IconButton, Tooltip } from '@grafana/ui';\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { AdHocCombobox } from './AdHocFiltersCombobox';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable } from '../AdHocFiltersVariable';\n\ninterface Props {\n filter: AdHocFilterWithLabels;\n model: AdHocFiltersVariable;\n readOnly?: boolean;\n focusOnWipInputRef?: () => void;\n}\n\nexport function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }: Props) {\n const styles = useStyles2(getStyles);\n const [viewMode, setViewMode] = useState(true);\n const [shouldFocus, setShouldFocus] = useState(false);\n const pillWrapperRef = useRef<HTMLDivElement>(null);\n\n const keyLabel = filter.keyLabel ?? filter.key;\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n const valueLabel = filter.valueLabels?.join(', ') || filter.values?.join(', ') || filter.value;\n\n const handleChangeViewMode = useCallback(\n (event?: React.MouseEvent) => {\n event?.stopPropagation();\n if (readOnly) {\n return;\n }\n\n setShouldFocus(!viewMode);\n setViewMode(!viewMode);\n },\n [readOnly, viewMode]\n );\n\n useEffect(() => {\n if (shouldFocus) {\n pillWrapperRef.current?.focus();\n setShouldFocus(false);\n }\n }, [shouldFocus]);\n\n // set viewMode to false when filter.forceEdit is defined\n useEffect(() => {\n if (filter.forceEdit && viewMode) {\n setViewMode(false);\n // immediately set forceEdit back to undefined as a clean up\n model._updateFilter(filter, { forceEdit: undefined });\n }\n }, [filter, model, viewMode]);\n\n if (viewMode) {\n const pillText = (\n <span className={styles.pillText}>\n {keyLabel} {filter.operator} {valueLabel}\n </span>\n );\n return (\n <div\n className={cx(styles.combinedFilterPill, { [styles.readOnlyCombinedFilter]: readOnly })}\n onClick={handleChangeViewMode}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleChangeViewMode();\n }\n }}\n role=\"button\"\n aria-label={`Edit filter with key ${keyLabel}`}\n tabIndex={0}\n ref={pillWrapperRef}\n >\n {valueLabel.length < 20 ? (\n pillText\n ) : (\n <Tooltip content={<div className={styles.tooltipText}>{valueLabel}</div>} placement=\"top\">\n {pillText}\n </Tooltip>\n )}\n\n {!readOnly ? (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n model._removeFilter(filter);\n setTimeout(() => focusOnWipInputRef?.());\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n model._removeFilter(filter);\n setTimeout(() => focusOnWipInputRef?.());\n }\n }}\n name=\"times\"\n size=\"md\"\n className={styles.removeButton}\n tooltip={`Remove filter with key ${keyLabel}`}\n />\n ) : null}\n </div>\n );\n }\n\n return (\n <AdHocCombobox\n filter={filter}\n model={model}\n handleChangeViewMode={handleChangeViewMode}\n focusOnWipInputRef={focusOnWipInputRef}\n />\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n combinedFilterPill: css({\n display: 'flex',\n alignItems: 'center',\n background: theme.colors.action.selected,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.125, 0, 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 fontWeight: theme.typography.fontWeightBold,\n cursor: 'pointer',\n\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n readOnlyCombinedFilter: css({\n paddingRight: theme.spacing(1),\n cursor: 'text',\n '&:hover': {\n background: theme.colors.action.selected,\n },\n }),\n removeButton: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n pillText: css({\n maxWidth: '200px',\n width: '100%',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }),\n tooltipText: css({\n textAlign: 'center',\n }),\n});\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"AdHocFilterPill.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, IconButton, Tooltip } from '@grafana/ui';\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { AdHocCombobox } from './AdHocFiltersCombobox';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable } from '../AdHocFiltersVariable';\n\ninterface Props {\n filter: AdHocFilterWithLabels;\n model: AdHocFiltersVariable;\n readOnly?: boolean;\n focusOnInputRef?: () => void;\n}\n\nexport function AdHocFilterPill({ filter, model, readOnly, focusOnInputRef }: Props) {\n const styles = useStyles2(getStyles);\n const [viewMode, setViewMode] = useState(true);\n const [shouldFocus, setShouldFocus] = useState(false);\n const pillWrapperRef = useRef<HTMLDivElement>(null);\n\n const keyLabel = filter.keyLabel ?? filter.key;\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n const valueLabel = filter.valueLabels?.join(', ') || filter.values?.join(', ') || filter.value;\n\n const handleChangeViewMode = useCallback(\n (event?: React.MouseEvent) => {\n event?.stopPropagation();\n if (readOnly) {\n return;\n }\n\n setShouldFocus(!viewMode);\n setViewMode(!viewMode);\n },\n [readOnly, viewMode]\n );\n\n useEffect(() => {\n if (shouldFocus) {\n pillWrapperRef.current?.focus();\n setShouldFocus(false);\n }\n }, [shouldFocus]);\n\n if (viewMode) {\n const pillText = (\n <span className={styles.pillText}>\n {keyLabel} {filter.operator} {valueLabel}\n </span>\n );\n return (\n <div\n className={cx(styles.combinedFilterPill, { [styles.readOnlyCombinedFilter]: readOnly })}\n onClick={handleChangeViewMode}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleChangeViewMode();\n }\n }}\n role=\"button\"\n aria-label={`Edit filter with key ${keyLabel}`}\n tabIndex={0}\n ref={pillWrapperRef}\n >\n {valueLabel.length < 20 ? (\n pillText\n ) : (\n <Tooltip content={<div className={styles.tooltipText}>{valueLabel}</div>} placement=\"top\">\n {pillText}\n </Tooltip>\n )}\n\n {!readOnly ? (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n model._removeFilter(filter);\n setTimeout(() => focusOnInputRef?.());\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n model._removeFilter(filter);\n setTimeout(() => focusOnInputRef?.());\n }\n }}\n name=\"times\"\n size=\"md\"\n className={styles.removeButton}\n tooltip={`Remove filter with key ${keyLabel}`}\n />\n ) : null}\n </div>\n );\n }\n\n return <AdHocCombobox filter={filter} model={model} handleChangeViewMode={handleChangeViewMode} />;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n combinedFilterPill: css({\n display: 'flex',\n alignItems: 'center',\n background: theme.colors.action.selected,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.125, 0, 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 fontWeight: theme.typography.fontWeightBold,\n cursor: 'pointer',\n\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n readOnlyCombinedFilter: css({\n paddingRight: theme.spacing(1),\n cursor: 'text',\n '&:hover': {\n background: theme.colors.action.selected,\n },\n }),\n removeButton: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n pillText: css({\n maxWidth: '200px',\n width: '100%',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }),\n tooltipText: css({\n textAlign: 'center',\n }),\n});\n"],"names":["_a"],"mappings":"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"}
@@ -28,7 +28,7 @@ var __spreadValues = (a, b) => {
28
28
  return a;
29
29
  };
30
30
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
31
- const AdHocCombobox = forwardRef(function AdHocCombobox2({ filter, model, isAlwaysWip, handleChangeViewMode, focusOnWipInputRef }, parentRef) {
31
+ const AdHocCombobox = forwardRef(function AdHocCombobox2({ filter, model, isAlwaysWip, handleChangeViewMode }, parentRef) {
32
32
  var _a, _b, _c;
33
33
  const [open, setOpen] = useState(false);
34
34
  const [options, setOptions] = useState([]);
@@ -180,39 +180,19 @@ const AdHocCombobox = forwardRef(function AdHocCombobox2({ filter, model, isAlwa
180
180
  const handleBackspaceInput = useCallback(
181
181
  (event, multiValueEdit) => {
182
182
  if (event.key === "Backspace" && !inputValue) {
183
- if (filterInputType === "value") {
184
- if (multiValueEdit) {
185
- if (filterMultiValues.length) {
186
- setFilterMultiValues((items) => {
187
- const updated = [...items];
188
- updated.splice(-1, 1);
189
- return updated;
190
- });
191
- return;
192
- }
193
- }
194
- setInputType("operator");
195
- return;
196
- }
197
- if (model.state.filters[0] === filter) {
198
- focusOnWipInputRef == null ? void 0 : focusOnWipInputRef();
199
- }
200
- model._handleComboboxBackspace(filter);
201
- if (isAlwaysWip) {
202
- handleResetWip();
183
+ if (multiValueEdit) {
184
+ setFilterMultiValues((items) => {
185
+ const updated = [...items];
186
+ updated.splice(-1, 1);
187
+ return updated;
188
+ });
189
+ } else if (filterInputType === "key") {
190
+ model._removeLastFilter();
191
+ handleFetchOptions(filterInputType);
203
192
  }
204
193
  }
205
194
  },
206
- [
207
- inputValue,
208
- filterInputType,
209
- model,
210
- filter,
211
- isAlwaysWip,
212
- filterMultiValues.length,
213
- handleResetWip,
214
- focusOnWipInputRef
215
- ]
195
+ [inputValue, filterInputType, model, handleFetchOptions]
216
196
  );
217
197
  const handleTabInput = useCallback(
218
198
  (event, multiValueEdit) => {
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFiltersCombobox.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.tsx"],"sourcesContent":["import 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 { Button, Icon, 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 fuzzySearchOptions,\n generateFilterUpdatePayload,\n generatePlaceholder,\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';\n\ninterface AdHocComboboxProps {\n filter?: AdHocFilterWithLabels;\n isAlwaysWip?: boolean;\n model: AdHocFiltersVariable;\n handleChangeViewMode?: () => void;\n focusOnWipInputRef?: () => void;\n}\n\nexport type AdHocInputType = 'key' | 'operator' | 'value';\n\nexport const AdHocCombobox = forwardRef(function AdHocCombobox(\n { filter, model, isAlwaysWip, handleChangeViewMode, focusOnWipInputRef }: 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 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\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\n const optionsSearcher = useMemo(() => fuzzySearchOptions(options), [options]);\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) {\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 // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n model._updateFilter(filter!, { valueLabels, values, value: values[0] });\n setFilterMultiValues([]);\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 [operatorIdentifier, ...filterMultiValues.map((item, i) => `${item.value}-${i}`)];\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 // part of POC for seamless filter parser\n // filterAutoParser({ event, filterInputType, options, model, filter, setInputValue, setInputType, refs });\n\n const value = event.target.value;\n setInputValue(value);\n setActiveIndex(0);\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(handleOptionGroups(optionsSearcher(inputValue, filterInputType)));\n\n // adding custom option this way so that virtualiser is aware of it and can scroll to\n if (filterInputType !== 'operator' && inputValue) {\n filteredDropDownItems.push({\n value: inputValue.trim(),\n label: inputValue.trim(),\n isCustom: true,\n });\n }\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 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 setOptions(options);\n if (options[0]?.group) {\n setActiveIndex(1);\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 setInputType('operator');\n return;\n }\n\n // focus back on alway wip input when you delete first filter with backspace\n if (model.state.filters[0] === filter) {\n focusOnWipInputRef?.();\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 if (!filteredDropDownItems[activeIndex]) {\n return;\n }\n const selectedItem = filteredDropDownItems[activeIndex];\n\n if (multiValueEdit) {\n handleLocalMultiValueChange(selectedItem);\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item: selectedItem,\n filter: filter!,\n setFilterMultiValues,\n })\n );\n\n switchToNextInputType(filterInputType, setInputType, handleChangeViewMode, refs.domReference.current);\n setActiveIndex(0);\n }\n\n setInputValue('');\n }\n },\n [\n activeIndex,\n filter,\n filterInputType,\n filteredDropDownItems,\n handleLocalMultiValueChange,\n handleChangeViewMode,\n model,\n refs.domReference,\n ]\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 setInputType('value');\n setInputValue('');\n\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n if (hasMultiValueOperator && filter?.values?.length) {\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\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 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 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(styles.basePill, styles.operatorPill, operatorIdentifier)}\n role=\"button\"\n aria-label=\"Edit filter operator\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation();\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }}\n onKeyDown={(event) => {\n handleShiftTabInput(event, hasMultiValueOperator);\n if (event.key === 'Enter') {\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }\n }}\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 />\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 setActiveIndex(0);\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 && (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 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 refs.domReference.current?.focus();\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item,\n filter: filter!,\n setFilterMultiValues,\n })\n );\n setInputValue('');\n\n switchToNextInputType(\n filterInputType,\n setInputType,\n handleChangeViewMode,\n refs.domReference.current\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 ? 'Use custom value: ' : ''} {item.label ?? item.value}\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\ninterface MultiValuePillProps {\n item: SelectableValue<string>;\n handleRemoveMultiValue: (item: SelectableValue<string>) => void;\n index: number;\n}\nconst MultiValuePill = ({ item, handleRemoveMultiValue, index }: MultiValuePillProps) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={cx(styles.basePill, styles.valuePill)}>\n <span> {item.label ?? item.value}</span>\n <Button\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleRemoveMultiValue(item);\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n handleRemoveMultiValue(item);\n }\n }}\n fill=\"text\"\n size=\"sm\"\n variant=\"secondary\"\n className={styles.removeButton}\n tooltip={`Remove filter value - ${item.label ?? item.value}`}\n >\n <Icon name=\"times\" size=\"md\" id={`${item.value}-${index}`} />\n </Button>\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 valuePill: css({\n background: theme.colors.action.selected,\n padding: theme.spacing(0.125, 0, 0.125, 1),\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 removeButton: css({\n marginInline: theme.spacing(0.5),\n height: '100%',\n padding: 0,\n cursor: 'pointer',\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n descriptionText: css({\n ...theme.typography.bodySmall,\n color: theme.colors.text.secondary,\n paddingTop: theme.spacing(0.5),\n }),\n multiValueApply: css({\n position: 'absolute',\n top: 0,\n left: 0,\n display: 'flex',\n }),\n});\n"],"names":["AdHocCombobox","model","filter","filterMultiValues","_a","_","options","_b"],"mappings":"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"}
1
+ {"version":3,"file":"AdHocFiltersCombobox.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.tsx"],"sourcesContent":["import 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 { Button, Icon, 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 fuzzySearchOptions,\n generateFilterUpdatePayload,\n generatePlaceholder,\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';\n\ninterface AdHocComboboxProps {\n filter?: AdHocFilterWithLabels;\n isAlwaysWip?: boolean;\n model: AdHocFiltersVariable;\n handleChangeViewMode?: () => void;\n}\n\nexport type AdHocInputType = 'key' | 'operator' | 'value';\n\nexport const AdHocCombobox = forwardRef(function AdHocCombobox(\n { filter, model, isAlwaysWip, handleChangeViewMode }: 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 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\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\n const optionsSearcher = useMemo(() => fuzzySearchOptions(options), [options]);\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) {\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 // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n model._updateFilter(filter!, { valueLabels, values, value: values[0] });\n setFilterMultiValues([]);\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 [operatorIdentifier, ...filterMultiValues.map((item, i) => `${item.value}-${i}`)];\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 // part of POC for seamless filter parser\n // filterAutoParser({ event, filterInputType, options, model, filter, setInputValue, setInputType, refs });\n\n const value = event.target.value;\n setInputValue(value);\n setActiveIndex(0);\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(handleOptionGroups(optionsSearcher(inputValue, filterInputType)));\n\n // adding custom option this way so that virtualiser is aware of it and can scroll to\n if (filterInputType !== 'operator' && inputValue) {\n filteredDropDownItems.push({\n value: inputValue.trim(),\n label: inputValue.trim(),\n isCustom: true,\n });\n }\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 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 setOptions(options);\n if (options[0]?.group) {\n setActiveIndex(1);\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 (multiValueEdit) {\n setFilterMultiValues((items) => {\n const updated = [...items];\n updated.splice(-1, 1);\n\n return updated;\n });\n } else if (filterInputType === 'key') {\n model._removeLastFilter();\n handleFetchOptions(filterInputType);\n }\n }\n },\n [inputValue, filterInputType, model, handleFetchOptions]\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 if (!filteredDropDownItems[activeIndex]) {\n return;\n }\n const selectedItem = filteredDropDownItems[activeIndex];\n\n if (multiValueEdit) {\n handleLocalMultiValueChange(selectedItem);\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item: selectedItem,\n filter: filter!,\n setFilterMultiValues,\n })\n );\n\n switchToNextInputType(filterInputType, setInputType, handleChangeViewMode, refs.domReference.current);\n setActiveIndex(0);\n }\n\n setInputValue('');\n }\n },\n [\n activeIndex,\n filter,\n filterInputType,\n filteredDropDownItems,\n handleLocalMultiValueChange,\n handleChangeViewMode,\n model,\n refs.domReference,\n ]\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 setInputType('value');\n setInputValue('');\n\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n if (hasMultiValueOperator && filter?.values?.length) {\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\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 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 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(styles.basePill, styles.operatorPill, operatorIdentifier)}\n role=\"button\"\n aria-label=\"Edit filter operator\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation();\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }}\n onKeyDown={(event) => {\n handleShiftTabInput(event, hasMultiValueOperator);\n if (event.key === 'Enter') {\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }\n }}\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 />\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 setActiveIndex(0);\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 && (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 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 refs.domReference.current?.focus();\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item,\n filter: filter!,\n setFilterMultiValues,\n })\n );\n setInputValue('');\n\n switchToNextInputType(\n filterInputType,\n setInputType,\n handleChangeViewMode,\n refs.domReference.current\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 ? 'Use custom value: ' : ''} {item.label ?? item.value}\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\ninterface MultiValuePillProps {\n item: SelectableValue<string>;\n handleRemoveMultiValue: (item: SelectableValue<string>) => void;\n index: number;\n}\nconst MultiValuePill = ({ item, handleRemoveMultiValue, index }: MultiValuePillProps) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={cx(styles.basePill, styles.valuePill)}>\n <span> {item.label ?? item.value}</span>\n <Button\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleRemoveMultiValue(item);\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n handleRemoveMultiValue(item);\n }\n }}\n fill=\"text\"\n size=\"sm\"\n variant=\"secondary\"\n className={styles.removeButton}\n tooltip={`Remove filter value - ${item.label ?? item.value}`}\n >\n <Icon name=\"times\" size=\"md\" id={`${item.value}-${index}`} />\n </Button>\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 valuePill: css({\n background: theme.colors.action.selected,\n padding: theme.spacing(0.125, 0, 0.125, 1),\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 removeButton: css({\n marginInline: theme.spacing(0.5),\n height: '100%',\n padding: 0,\n cursor: 'pointer',\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n descriptionText: css({\n ...theme.typography.bodySmall,\n color: theme.colors.text.secondary,\n paddingTop: theme.spacing(0.5),\n }),\n multiValueApply: css({\n position: 'absolute',\n top: 0,\n left: 0,\n display: 'flex',\n }),\n});\n"],"names":["AdHocCombobox","model","filter","filterMultiValues","_a","_","options","_b"],"mappings":"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"}
@@ -7,26 +7,26 @@ import { AdHocFiltersAlwaysWipCombobox } from './AdHocFiltersAlwaysWipCombobox.j
7
7
  const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer2({ model }) {
8
8
  const { filters, readOnly } = model.useState();
9
9
  const styles = useStyles2(getStyles);
10
- const focusOnWipInputRef = useRef();
10
+ const focusOnInputRef = useRef();
11
11
  return /* @__PURE__ */ React.createElement("div", {
12
12
  className: cx(styles.comboboxWrapper, { [styles.comboboxFocusOutline]: !readOnly }),
13
13
  onClick: () => {
14
14
  var _a;
15
- (_a = focusOnWipInputRef.current) == null ? void 0 : _a.call(focusOnWipInputRef);
15
+ (_a = focusOnInputRef.current) == null ? void 0 : _a.call(focusOnInputRef);
16
16
  }
17
17
  }, /* @__PURE__ */ React.createElement(Icon, {
18
18
  name: "filter",
19
19
  className: styles.filterIcon,
20
20
  size: "lg"
21
21
  }), filters.map((filter, index) => /* @__PURE__ */ React.createElement(AdHocFilterPill, {
22
- key: `${index}-${filter.key}`,
22
+ key: index,
23
23
  filter,
24
24
  model,
25
25
  readOnly,
26
- focusOnWipInputRef: focusOnWipInputRef.current
26
+ focusOnInputRef: focusOnInputRef.current
27
27
  })), !readOnly ? /* @__PURE__ */ React.createElement(AdHocFiltersAlwaysWipCombobox, {
28
28
  model,
29
- ref: focusOnWipInputRef
29
+ ref: focusOnInputRef
30
30
  }) : null);
31
31
  });
32
32
  const getStyles = (theme) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFiltersComboboxRenderer.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\nimport React, { memo, useRef } from 'react';\nimport { AdHocFiltersVariable } from '../AdHocFiltersVariable';\nimport { AdHocFilterPill } from './AdHocFilterPill';\nimport { AdHocFiltersAlwaysWipCombobox } from './AdHocFiltersAlwaysWipCombobox';\n\ninterface Props {\n model: AdHocFiltersVariable;\n}\n\nexport const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer({ model }: Props) {\n const { filters, readOnly } = model.useState();\n const styles = useStyles2(getStyles);\n\n // ref that focuses on the always wip filter input\n // defined in the combobox component via useImperativeHandle\n const focusOnWipInputRef = useRef<() => void>();\n\n return (\n <div\n className={cx(styles.comboboxWrapper, { [styles.comboboxFocusOutline]: !readOnly })}\n onClick={() => {\n focusOnWipInputRef.current?.();\n }}\n >\n <Icon name=\"filter\" className={styles.filterIcon} size=\"lg\" />\n\n {filters.map((filter, index) => (\n <AdHocFilterPill\n key={`${index}-${filter.key}`}\n filter={filter}\n model={model}\n readOnly={readOnly}\n focusOnWipInputRef={focusOnWipInputRef.current}\n />\n ))}\n\n {!readOnly ? <AdHocFiltersAlwaysWipCombobox model={model} ref={focusOnWipInputRef} /> : null}\n </div>\n );\n});\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n comboboxWrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n columnGap: theme.spacing(1),\n rowGap: theme.spacing(0.5),\n minHeight: theme.spacing(4),\n backgroundColor: theme.components.input.background,\n border: `1px solid ${theme.colors.border.strong}`,\n borderRadius: theme.shape.radius.default,\n paddingInline: theme.spacing(1),\n paddingBlock: theme.spacing(0.5),\n flexGrow: 1,\n }),\n comboboxFocusOutline: css({\n '&:focus-within': {\n outline: '2px dotted transparent',\n outlineOffset: '2px',\n boxShadow: `0 0 0 2px ${theme.colors.background.canvas}, 0 0 0px 4px ${theme.colors.primary.main}`,\n transitionTimingFunction: `cubic-bezier(0.19, 1, 0.22, 1)`,\n transitionDuration: '0.2s',\n transitionProperty: 'outline, outline-offset, box-shadow',\n zIndex: 2,\n },\n }),\n filterIcon: css({\n color: theme.colors.text.secondary,\n alignSelf: 'center',\n }),\n});\n"],"names":["AdHocFiltersComboboxRenderer"],"mappings":"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"}
1
+ {"version":3,"file":"AdHocFiltersComboboxRenderer.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\nimport React, { memo, useRef } from 'react';\nimport { AdHocFiltersVariable } from '../AdHocFiltersVariable';\nimport { AdHocFilterPill } from './AdHocFilterPill';\nimport { AdHocFiltersAlwaysWipCombobox } from './AdHocFiltersAlwaysWipCombobox';\n\ninterface Props {\n model: AdHocFiltersVariable;\n}\n\nexport const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer({ model }: Props) {\n const { filters, readOnly } = model.useState();\n const styles = useStyles2(getStyles);\n const focusOnInputRef = useRef<() => void>();\n\n return (\n <div\n className={cx(styles.comboboxWrapper, { [styles.comboboxFocusOutline]: !readOnly })}\n onClick={() => {\n focusOnInputRef.current?.();\n }}\n >\n <Icon name=\"filter\" className={styles.filterIcon} size=\"lg\" />\n\n {filters.map((filter, index) => (\n <AdHocFilterPill\n key={index}\n filter={filter}\n model={model}\n readOnly={readOnly}\n focusOnInputRef={focusOnInputRef.current}\n />\n ))}\n\n {!readOnly ? <AdHocFiltersAlwaysWipCombobox model={model} ref={focusOnInputRef} /> : null}\n </div>\n );\n});\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n comboboxWrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n columnGap: theme.spacing(1),\n rowGap: theme.spacing(0.5),\n minHeight: theme.spacing(4),\n backgroundColor: theme.components.input.background,\n border: `1px solid ${theme.colors.border.strong}`,\n borderRadius: theme.shape.radius.default,\n paddingInline: theme.spacing(1),\n paddingBlock: theme.spacing(0.5),\n flexGrow: 1,\n }),\n comboboxFocusOutline: css({\n '&:focus-within': {\n outline: '2px dotted transparent',\n outlineOffset: '2px',\n boxShadow: `0 0 0 2px ${theme.colors.background.canvas}, 0 0 0px 4px ${theme.colors.primary.main}`,\n transitionTimingFunction: `cubic-bezier(0.19, 1, 0.22, 1)`,\n transitionDuration: '0.2s',\n transitionProperty: 'outline, outline-offset, box-shadow',\n zIndex: 2,\n },\n }),\n filterIcon: css({\n color: theme.colors.text.secondary,\n alignSelf: 'center',\n }),\n});\n"],"names":["AdHocFiltersComboboxRenderer"],"mappings":"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"}
@@ -15,8 +15,6 @@ import { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFilter
15
15
  import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
16
16
 
17
17
  var __defProp = Object.defineProperty;
18
- var __defProps = Object.defineProperties;
19
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
20
18
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
21
19
  var __hasOwnProp = Object.prototype.hasOwnProperty;
22
20
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -32,7 +30,6 @@ var __spreadValues = (a, b) => {
32
30
  }
33
31
  return a;
34
32
  };
35
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
36
33
  const OPERATORS = [
37
34
  {
38
35
  value: "=",
@@ -129,31 +126,6 @@ class AdHocFiltersVariable extends SceneObjectBase {
129
126
  this._removeFilter(filterToRemove);
130
127
  }
131
128
  }
132
- _handleComboboxBackspace(filter) {
133
- if (this.state.filters.length) {
134
- let filterToForceIndex = this.state.filters.length - 1;
135
- if (filter !== this.state._wip) {
136
- const filterIndex = this.state.filters.findIndex((f) => f === filter);
137
- filterToForceIndex = filterIndex - 1;
138
- }
139
- this.setState({
140
- filters: this.state.filters.reduce((acc, f, index) => {
141
- if (index === filterToForceIndex) {
142
- return [
143
- ...acc,
144
- __spreadProps(__spreadValues({}, f), {
145
- forceEdit: true
146
- })
147
- ];
148
- }
149
- if (f === filter) {
150
- return acc;
151
- }
152
- return [...acc, f];
153
- }, [])
154
- });
155
- }
156
- }
157
129
  async _getKeys(currentKey) {
158
130
  var _a, _b, _c;
159
131
  const override = await ((_b = (_a = this.state).getTagKeysProvider) == null ? void 0 : _b.call(_a, this, currentKey));