@grafana/scenes 6.9.1--canary.1104.14589006500.0 → 6.10.0--canary.1095.14616202286.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.9.1 (Wed Apr 23 2025)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - Variables: Notify scene objects in depth order [#1104](https://github.com/grafana/scenes/pull/1104) ([@torkelo](https://github.com/torkelo))
6
+
7
+ #### Authors: 1
8
+
9
+ - Torkel Ödegaard ([@torkelo](https://github.com/torkelo))
10
+
11
+ ---
12
+
1
13
  # v6.9.0 (Thu Apr 17 2025)
2
14
 
3
15
  #### 🚀 Enhancement
package/dist/esm/index.js CHANGED
@@ -40,7 +40,7 @@ export { TextBoxVariable } from './variables/variants/TextBoxVariable.js';
40
40
  export { MultiValueVariable } from './variables/variants/MultiValueVariable.js';
41
41
  export { LocalValueVariable } from './variables/variants/LocalValueVariable.js';
42
42
  export { IntervalVariable } from './variables/variants/IntervalVariable.js';
43
- export { AdHocFiltersVariable, FilterOrigin } from './variables/adhoc/AdHocFiltersVariable.js';
43
+ export { AdHocFiltersVariable } from './variables/adhoc/AdHocFiltersVariable.js';
44
44
  export { GroupByVariable } from './variables/groupby/GroupByVariable.js';
45
45
  export { NewSceneObjectAddedEvent, UrlSyncManager } from './services/UrlSyncManager.js';
46
46
  export { useUrlSync } from './services/useUrlSync.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { getUrlWithAppState } from './components/SceneApp/utils';\nimport { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntimePanelPlugin';\nimport { cloneSceneObjectState } from './core/sceneGraph/utils';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\n\nimport { registerVariableMacro } from './variables/macros';\nimport {\n escapeLabelValueInExactSelector,\n escapeLabelValueInRegexSelector,\n escapeURLDelimiters,\n renderPrometheusLabelFilters,\n} from './variables/utils';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\n isGroupByVariable,\n} from './variables/variants/guards';\n\nexport * from './core/types';\nexport * from './core/events';\nexport { sceneGraph } from './core/sceneGraph';\nexport * as behaviors from './behaviors';\nexport * as dataLayers from './querying/layers';\n\nexport { SceneObjectBase, useSceneObjectState } from './core/SceneObjectBase';\nexport { SceneDataNode } from './core/SceneDataNode';\nexport { SceneTimeRange } from './core/SceneTimeRange';\nexport { SceneTimeZoneOverride } from './core/SceneTimeZoneOverride';\n\nexport { SceneQueryRunner, type QueryRunnerState } from './querying/SceneQueryRunner';\nexport { DataProviderProxy } from './querying/DataProviderProxy';\nexport {\n type ExtraQueryDescriptor,\n type ExtraQueryProvider,\n type ExtraQueryDataProcessor,\n} from './querying/ExtraQueryProvider';\nexport { SceneDataLayerSet, SceneDataLayerSetBase } from './querying/SceneDataLayerSet';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer, type SceneDataTransformerState } from './querying/SceneDataTransformer';\nexport { registerQueryWithController } from './querying/registerQueryWithController';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\nexport type {\n SceneQueryControllerLike,\n SceneQueryControllerEntryType,\n SceneQueryControllerEntry,\n SceneInteractionProfileEvent,\n} from './behaviors/types';\n\nexport * from './variables/types';\nexport { VariableDependencyConfig } from './variables/VariableDependencyConfig';\nexport { formatRegistry, type FormatVariable } from './variables/interpolation/formatRegistry';\nexport { VariableValueSelectors } from './variables/components/VariableValueSelectors';\nexport { VariableValueControl } from './variables/components/VariableValueControl';\nexport { SceneVariableSet } from './variables/sets/SceneVariableSet';\nexport { ConstantVariable } from './variables/variants/ConstantVariable';\nexport { CustomVariable } from './variables/variants/CustomVariable';\nexport { DataSourceVariable } from './variables/variants/DataSourceVariable';\nexport { QueryVariable } from './variables/variants/query/QueryVariable';\nexport { TestVariable } from './variables/variants/TestVariable';\nexport { TextBoxVariable } from './variables/variants/TextBoxVariable';\nexport {\n MultiValueVariable,\n type MultiValueVariableState,\n type VariableGetOptionsArgs,\n} from './variables/variants/MultiValueVariable';\nexport { LocalValueVariable } from './variables/variants/LocalValueVariable';\nexport { IntervalVariable } from './variables/variants/IntervalVariable';\nexport { AdHocFiltersVariable, FilterOrigin } from './variables/adhoc/AdHocFiltersVariable';\nexport type { AdHocFilterWithLabels } from './variables/adhoc/AdHocFiltersVariable';\nexport { GroupByVariable } from './variables/groupby/GroupByVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\n\nexport { type UrlSyncManagerLike, UrlSyncManager, NewSceneObjectAddedEvent } from './services/UrlSyncManager';\nexport { useUrlSync } from './services/useUrlSync';\nexport { UrlSyncContextProvider } from './services/UrlSyncContextProvider';\nexport { SceneObjectUrlSyncConfig } from './services/SceneObjectUrlSyncConfig';\n\nexport { EmbeddedScene, type EmbeddedSceneState } from './components/EmbeddedScene';\nexport { VizPanel, type VizPanelState } from './components/VizPanel/VizPanel';\nexport { VizPanelMenu } from './components/VizPanel/VizPanelMenu';\nexport { VizPanelExploreButton } from './components/VizPanel/VizPanelExploreButton';\nexport { NestedScene } from './components/NestedScene';\nexport { SceneCanvasText } from './components/SceneCanvasText';\nexport { SceneToolbarButton, SceneToolbarInput } from './components/SceneToolbarButton';\nexport { SceneTimePicker } from './components/SceneTimePicker';\nexport { SceneRefreshPicker, type SceneRefreshPickerState } from './components/SceneRefreshPicker';\nexport { SceneTimeRangeTransformerBase } from './core/SceneTimeRangeTransformerBase';\nexport { SceneTimeRangeCompare } from './components/SceneTimeRangeCompare';\nexport { SceneByFrameRepeater } from './components/SceneByFrameRepeater';\nexport { SceneByVariableRepeater } from './components/SceneByVariableRepeater';\nexport { SceneControlsSpacer } from './components/SceneControlsSpacer';\nexport {\n SceneFlexLayout,\n SceneFlexItem,\n type SceneFlexItemState,\n type SceneFlexItemLike,\n} from './components/layout/SceneFlexLayout';\nexport { SceneCSSGridLayout, SceneCSSGridItem } from './components/layout/CSSGrid/SceneCSSGridLayout';\nexport { SceneGridLayout } from './components/layout/grid/SceneGridLayout';\nexport { SceneGridLayoutDragStartEvent } from './components/layout/grid/types';\nexport { SceneGridItem } from './components/layout/grid/SceneGridItem';\nexport { SceneGridRow } from './components/layout/grid/SceneGridRow';\nexport { type SceneGridItemStateLike, type SceneGridItemLike } from './components/layout/grid/types';\nexport { SplitLayout } from './components/layout/split/SplitLayout';\nexport { LazyLoader } from './components/layout/LazyLoader';\nexport {\n type SceneAppPageLike,\n type SceneRouteMatch,\n type SceneAppPageState,\n type SceneAppDrilldownView,\n type SceneAppRoute,\n} from './components/SceneApp/types';\nexport { SceneApp, useSceneApp } from './components/SceneApp/SceneApp';\nexport { SceneAppPage } from './components/SceneApp/SceneAppPage';\nexport { SceneReactObject } from './components/SceneReactObject';\nexport { SceneObjectRef } from './core/SceneObjectRef';\nexport {\n PanelBuilders,\n PanelOptionsBuilders,\n FieldConfigBuilders,\n FieldConfigOverridesBuilder,\n} from './core/PanelBuilders';\nexport { FieldConfigBuilder } from './core/PanelBuilders/FieldConfigBuilder';\nexport { VizPanelBuilder } from './core/PanelBuilders/VizPanelBuilder';\nexport { SceneDebugger } from './components/SceneDebugger/SceneDebugger';\nexport { VariableValueSelectWrapper } from './variables/components/VariableValueSelectors';\nexport { ControlsLabel } from './utils/ControlsLabel';\nexport { MultiOrSingleValueSelect } from './variables/components/VariableValueSelect';\nexport { VizConfigBuilder } from './core/PanelBuilders/VizConfigBuilder';\nexport { VizConfigBuilders } from './core/PanelBuilders/VizConfigBuilders';\nexport { type VizConfig } from './core/PanelBuilders/types';\nexport { SceneScopesBridge } from './core/SceneScopesBridge';\n\nexport const sceneUtils = {\n getUrlWithAppState,\n registerRuntimePanelPlugin,\n registerRuntimeDataSource,\n registerVariableMacro,\n cloneSceneObjectState,\n syncStateFromSearchParams,\n getUrlState,\n renderPrometheusLabelFilters,\n escapeLabelValueInRegexSelector,\n escapeLabelValueInExactSelector,\n escapeURLDelimiters,\n\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n isGroupByVariable,\n};\n\nexport { SafeSerializableSceneObject } from './utils/SafeSerializableSceneObject';\nexport { getExploreURL } from './utils/explore';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4IO,MAAM,UAAa,GAAA;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,WAAA;AAAA,EACA,4BAAA;AAAA,EACA,+BAAA;AAAA,EACA,+BAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { getUrlWithAppState } from './components/SceneApp/utils';\nimport { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntimePanelPlugin';\nimport { cloneSceneObjectState } from './core/sceneGraph/utils';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\n\nimport { registerVariableMacro } from './variables/macros';\nimport {\n escapeLabelValueInExactSelector,\n escapeLabelValueInRegexSelector,\n escapeURLDelimiters,\n renderPrometheusLabelFilters,\n} from './variables/utils';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\n isGroupByVariable,\n} from './variables/variants/guards';\n\nexport * from './core/types';\nexport * from './core/events';\nexport { sceneGraph } from './core/sceneGraph';\nexport * as behaviors from './behaviors';\nexport * as dataLayers from './querying/layers';\n\nexport { SceneObjectBase, useSceneObjectState } from './core/SceneObjectBase';\nexport { SceneDataNode } from './core/SceneDataNode';\nexport { SceneTimeRange } from './core/SceneTimeRange';\nexport { SceneTimeZoneOverride } from './core/SceneTimeZoneOverride';\n\nexport { SceneQueryRunner, type QueryRunnerState } from './querying/SceneQueryRunner';\nexport { DataProviderProxy } from './querying/DataProviderProxy';\nexport {\n type ExtraQueryDescriptor,\n type ExtraQueryProvider,\n type ExtraQueryDataProcessor,\n} from './querying/ExtraQueryProvider';\nexport { SceneDataLayerSet, SceneDataLayerSetBase } from './querying/SceneDataLayerSet';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer, type SceneDataTransformerState } from './querying/SceneDataTransformer';\nexport { registerQueryWithController } from './querying/registerQueryWithController';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\nexport type {\n SceneQueryControllerLike,\n SceneQueryControllerEntryType,\n SceneQueryControllerEntry,\n SceneInteractionProfileEvent,\n} from './behaviors/types';\n\nexport * from './variables/types';\nexport { VariableDependencyConfig } from './variables/VariableDependencyConfig';\nexport { formatRegistry, type FormatVariable } from './variables/interpolation/formatRegistry';\nexport { VariableValueSelectors } from './variables/components/VariableValueSelectors';\nexport { VariableValueControl } from './variables/components/VariableValueControl';\nexport { SceneVariableSet } from './variables/sets/SceneVariableSet';\nexport { ConstantVariable } from './variables/variants/ConstantVariable';\nexport { CustomVariable } from './variables/variants/CustomVariable';\nexport { DataSourceVariable } from './variables/variants/DataSourceVariable';\nexport { QueryVariable } from './variables/variants/query/QueryVariable';\nexport { TestVariable } from './variables/variants/TestVariable';\nexport { TextBoxVariable } from './variables/variants/TextBoxVariable';\nexport {\n MultiValueVariable,\n type MultiValueVariableState,\n type VariableGetOptionsArgs,\n} from './variables/variants/MultiValueVariable';\nexport { LocalValueVariable } from './variables/variants/LocalValueVariable';\nexport { IntervalVariable } from './variables/variants/IntervalVariable';\nexport { AdHocFiltersVariable } from './variables/adhoc/AdHocFiltersVariable';\nexport type { AdHocFilterWithLabels } from './variables/adhoc/AdHocFiltersVariable';\nexport { GroupByVariable } from './variables/groupby/GroupByVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\n\nexport { type UrlSyncManagerLike, UrlSyncManager, NewSceneObjectAddedEvent } from './services/UrlSyncManager';\nexport { useUrlSync } from './services/useUrlSync';\nexport { UrlSyncContextProvider } from './services/UrlSyncContextProvider';\nexport { SceneObjectUrlSyncConfig } from './services/SceneObjectUrlSyncConfig';\n\nexport { EmbeddedScene, type EmbeddedSceneState } from './components/EmbeddedScene';\nexport { VizPanel, type VizPanelState } from './components/VizPanel/VizPanel';\nexport { VizPanelMenu } from './components/VizPanel/VizPanelMenu';\nexport { VizPanelExploreButton } from './components/VizPanel/VizPanelExploreButton';\nexport { NestedScene } from './components/NestedScene';\nexport { SceneCanvasText } from './components/SceneCanvasText';\nexport { SceneToolbarButton, SceneToolbarInput } from './components/SceneToolbarButton';\nexport { SceneTimePicker } from './components/SceneTimePicker';\nexport { SceneRefreshPicker, type SceneRefreshPickerState } from './components/SceneRefreshPicker';\nexport { SceneTimeRangeTransformerBase } from './core/SceneTimeRangeTransformerBase';\nexport { SceneTimeRangeCompare } from './components/SceneTimeRangeCompare';\nexport { SceneByFrameRepeater } from './components/SceneByFrameRepeater';\nexport { SceneByVariableRepeater } from './components/SceneByVariableRepeater';\nexport { SceneControlsSpacer } from './components/SceneControlsSpacer';\nexport {\n SceneFlexLayout,\n SceneFlexItem,\n type SceneFlexItemState,\n type SceneFlexItemLike,\n} from './components/layout/SceneFlexLayout';\nexport { SceneCSSGridLayout, SceneCSSGridItem } from './components/layout/CSSGrid/SceneCSSGridLayout';\nexport { SceneGridLayout } from './components/layout/grid/SceneGridLayout';\nexport { SceneGridLayoutDragStartEvent } from './components/layout/grid/types';\nexport { SceneGridItem } from './components/layout/grid/SceneGridItem';\nexport { SceneGridRow } from './components/layout/grid/SceneGridRow';\nexport { type SceneGridItemStateLike, type SceneGridItemLike } from './components/layout/grid/types';\nexport { SplitLayout } from './components/layout/split/SplitLayout';\nexport { LazyLoader } from './components/layout/LazyLoader';\nexport {\n type SceneAppPageLike,\n type SceneRouteMatch,\n type SceneAppPageState,\n type SceneAppDrilldownView,\n type SceneAppRoute,\n} from './components/SceneApp/types';\nexport { SceneApp, useSceneApp } from './components/SceneApp/SceneApp';\nexport { SceneAppPage } from './components/SceneApp/SceneAppPage';\nexport { SceneReactObject } from './components/SceneReactObject';\nexport { SceneObjectRef } from './core/SceneObjectRef';\nexport {\n PanelBuilders,\n PanelOptionsBuilders,\n FieldConfigBuilders,\n FieldConfigOverridesBuilder,\n} from './core/PanelBuilders';\nexport { FieldConfigBuilder } from './core/PanelBuilders/FieldConfigBuilder';\nexport { VizPanelBuilder } from './core/PanelBuilders/VizPanelBuilder';\nexport { SceneDebugger } from './components/SceneDebugger/SceneDebugger';\nexport { VariableValueSelectWrapper } from './variables/components/VariableValueSelectors';\nexport { ControlsLabel } from './utils/ControlsLabel';\nexport { MultiOrSingleValueSelect } from './variables/components/VariableValueSelect';\nexport { VizConfigBuilder } from './core/PanelBuilders/VizConfigBuilder';\nexport { VizConfigBuilders } from './core/PanelBuilders/VizConfigBuilders';\nexport { type VizConfig } from './core/PanelBuilders/types';\nexport { SceneScopesBridge } from './core/SceneScopesBridge';\n\nexport const sceneUtils = {\n getUrlWithAppState,\n registerRuntimePanelPlugin,\n registerRuntimeDataSource,\n registerVariableMacro,\n cloneSceneObjectState,\n syncStateFromSearchParams,\n getUrlState,\n renderPrometheusLabelFilters,\n escapeLabelValueInRegexSelector,\n escapeLabelValueInExactSelector,\n escapeURLDelimiters,\n\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n isGroupByVariable,\n};\n\nexport { SafeSerializableSceneObject } from './utils/SafeSerializableSceneObject';\nexport { getExploreURL } from './utils/explore';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4IO,MAAM,UAAa,GAAA;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,WAAA;AAAA,EACA,4BAAA;AAAA,EACA,+BAAA;AAAA,EACA,+BAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF;;;;"}
@@ -1,7 +1,8 @@
1
1
  import { css, cx } from '@emotion/css';
2
- import { useStyles2, Tooltip, IconButton } from '@grafana/ui';
2
+ import { useStyles2, Tooltip, IconButton, Icon } from '@grafana/ui';
3
3
  import React, { useState, useRef, useCallback, useEffect } from 'react';
4
4
  import { AdHocCombobox } from './AdHocFiltersCombobox.js';
5
+ import { isMatchAllFilter } from '../AdHocFiltersVariable.js';
5
6
 
6
7
  const LABEL_MAX_VISIBLE_LENGTH = 20;
7
8
  function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
@@ -47,7 +48,11 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
47
48
  return /* @__PURE__ */ React.createElement(
48
49
  "div",
49
50
  {
50
- className: cx(styles.combinedFilterPill, readOnly && styles.readOnlyCombinedFilter),
51
+ className: cx(
52
+ styles.combinedFilterPill,
53
+ readOnly && styles.readOnlyCombinedFilter,
54
+ isMatchAllFilter(filter) && styles.matchAllPill
55
+ ),
51
56
  onClick: (e) => {
52
57
  e.stopPropagation();
53
58
  setPopulateInputOnEdit(true);
@@ -65,19 +70,27 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
65
70
  ref: pillWrapperRef
66
71
  },
67
72
  valueLabel.length < LABEL_MAX_VISIBLE_LENGTH ? pillText : /* @__PURE__ */ React.createElement(Tooltip, { content: /* @__PURE__ */ React.createElement("div", { className: styles.tooltipText }, valueLabel), placement: "top" }, pillText),
68
- !readOnly && !filter.origin ? /* @__PURE__ */ React.createElement(
73
+ !readOnly && !filter.matchAllFilter && (!filter.origin || filter.origin === "dashboard") ? /* @__PURE__ */ React.createElement(
69
74
  IconButton,
70
75
  {
71
76
  onClick: (e) => {
72
77
  e.stopPropagation();
73
- model._removeFilter(filter);
78
+ if (filter.origin && filter.origin === "dashboard") {
79
+ model.updateToMatchAll(filter);
80
+ } else {
81
+ model._removeFilter(filter);
82
+ }
74
83
  setTimeout(() => focusOnWipInputRef == null ? void 0 : focusOnWipInputRef());
75
84
  },
76
85
  onKeyDownCapture: (e) => {
77
86
  if (e.key === "Enter") {
78
87
  e.preventDefault();
79
88
  e.stopPropagation();
80
- model._removeFilter(filter);
89
+ if (filter.origin && filter.origin === "dashboard") {
90
+ model.updateToMatchAll(filter);
91
+ } else {
92
+ model._removeFilter(filter);
93
+ }
81
94
  setTimeout(() => focusOnWipInputRef == null ? void 0 : focusOnWipInputRef());
82
95
  }
83
96
  },
@@ -87,16 +100,8 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
87
100
  tooltip: `Remove filter with key ${keyLabel}`
88
101
  }
89
102
  ) : null,
90
- filter.origin && !filter.originalValue && /* @__PURE__ */ React.createElement(
91
- IconButton,
92
- {
93
- name: "info-circle",
94
- size: "md",
95
- className: styles.pillIcon,
96
- tooltip: `This is a ${filter.origin} injected filter`
97
- }
98
- ),
99
- filter.origin && filter.originalValue && /* @__PURE__ */ React.createElement(
103
+ filter.origin && !filter.restorable && /* @__PURE__ */ React.createElement(Tooltip, { content: `This is a ${filter.origin} injected filter`, placement: "bottom" }, /* @__PURE__ */ React.createElement(Icon, { name: "info-circle", size: "md", className: styles.infoPillIcon })),
104
+ filter.origin && filter.restorable && /* @__PURE__ */ React.createElement(
100
105
  IconButton,
101
106
  {
102
107
  onClick: (e) => {
@@ -112,7 +117,7 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
112
117
  },
113
118
  name: "history",
114
119
  size: "md",
115
- className: styles.pillIcon,
120
+ className: isMatchAllFilter(filter) ? styles.matchAllPillIcon : styles.pillIcon,
116
121
  tooltip: `Restore filter to its original value`
117
122
  }
118
123
  )
@@ -170,6 +175,23 @@ const getStyles = (theme) => ({
170
175
  }),
171
176
  tooltipText: css({
172
177
  textAlign: "center"
178
+ }),
179
+ infoPillIcon: css({
180
+ marginInline: theme.spacing(0.5),
181
+ cursor: "pointer"
182
+ }),
183
+ matchAllPillIcon: css({
184
+ marginInline: theme.spacing(0.5),
185
+ cursor: "pointer",
186
+ color: theme.colors.text.disabled
187
+ }),
188
+ matchAllPill: css({
189
+ background: theme.colors.action.selected,
190
+ color: theme.colors.text.disabled,
191
+ border: 0,
192
+ "&:hover": {
193
+ background: theme.colors.action.selected
194
+ }
173
195
  })
174
196
  });
175
197
 
@@ -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\nconst LABEL_MAX_VISIBLE_LENGTH = 20;\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 [shouldFocusOnPillWrapper, setShouldFocusOnPillWrapper] = useState(false);\n const pillWrapperRef = useRef<HTMLDivElement>(null);\n const [populateInputOnEdit, setPopulateInputOnEdit] = useState(false);\n\n const keyLabel = filter.keyLabel ?? filter.key;\n const valueLabel = filter.valueLabels?.join(', ') || filter.values?.join(', ') || filter.value;\n\n const handleChangeViewMode = useCallback(\n (event?: React.MouseEvent, shouldFocusOnPillWrapperOverride?: boolean) => {\n event?.stopPropagation();\n if (readOnly) {\n return;\n }\n\n setShouldFocusOnPillWrapper(shouldFocusOnPillWrapperOverride ?? !viewMode);\n setViewMode(!viewMode);\n },\n [readOnly, viewMode]\n );\n\n useEffect(() => {\n if (shouldFocusOnPillWrapper) {\n pillWrapperRef.current?.focus();\n setShouldFocusOnPillWrapper(false);\n }\n }, [shouldFocusOnPillWrapper]);\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 // reset populateInputOnEdit when pill goes into view mode\n useEffect(() => {\n if (viewMode) {\n setPopulateInputOnEdit((prevValue) => (prevValue ? false : prevValue));\n }\n }, [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, readOnly && styles.readOnlyCombinedFilter)}\n onClick={(e) => {\n e.stopPropagation();\n setPopulateInputOnEdit(true);\n handleChangeViewMode();\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n setPopulateInputOnEdit(true);\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 < LABEL_MAX_VISIBLE_LENGTH ? (\n pillText\n ) : (\n <Tooltip content={<div className={styles.tooltipText}>{valueLabel}</div>} placement=\"top\">\n {pillText}\n </Tooltip>\n )}\n\n {!readOnly && !filter.origin ? (\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.pillIcon}\n tooltip={`Remove filter with key ${keyLabel}`}\n />\n ) : null}\n\n {filter.origin && !filter.originalValue && (\n <IconButton\n name=\"info-circle\"\n size=\"md\"\n className={styles.pillIcon}\n tooltip={`This is a ${filter.origin} injected filter`}\n />\n )}\n\n {filter.origin && filter.originalValue && (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n model.restoreOriginalFilter(filter);\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n model.restoreOriginalFilter(filter);\n }\n }}\n name=\"history\"\n size=\"md\"\n className={styles.pillIcon}\n tooltip={`Restore filter to its original value`}\n />\n )}\n </div>\n );\n }\n\n return (\n <AdHocCombobox\n filter={filter}\n model={model}\n handleChangeViewMode={handleChangeViewMode}\n focusOnWipInputRef={focusOnWipInputRef}\n populateInputOnEdit={populateInputOnEdit}\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 pillIcon: 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, Icon } from '@grafana/ui';\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { AdHocCombobox } from './AdHocFiltersCombobox';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable, isMatchAllFilter } from '../AdHocFiltersVariable';\n\nconst LABEL_MAX_VISIBLE_LENGTH = 20;\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 [shouldFocusOnPillWrapper, setShouldFocusOnPillWrapper] = useState(false);\n const pillWrapperRef = useRef<HTMLDivElement>(null);\n const [populateInputOnEdit, setPopulateInputOnEdit] = useState(false);\n\n const keyLabel = filter.keyLabel ?? filter.key;\n const valueLabel = filter.valueLabels?.join(', ') || filter.values?.join(', ') || filter.value;\n\n const handleChangeViewMode = useCallback(\n (event?: React.MouseEvent, shouldFocusOnPillWrapperOverride?: boolean) => {\n event?.stopPropagation();\n if (readOnly) {\n return;\n }\n\n setShouldFocusOnPillWrapper(shouldFocusOnPillWrapperOverride ?? !viewMode);\n setViewMode(!viewMode);\n },\n [readOnly, viewMode]\n );\n\n useEffect(() => {\n if (shouldFocusOnPillWrapper) {\n pillWrapperRef.current?.focus();\n setShouldFocusOnPillWrapper(false);\n }\n }, [shouldFocusOnPillWrapper]);\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 // reset populateInputOnEdit when pill goes into view mode\n useEffect(() => {\n if (viewMode) {\n setPopulateInputOnEdit((prevValue) => (prevValue ? false : prevValue));\n }\n }, [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(\n styles.combinedFilterPill,\n readOnly && styles.readOnlyCombinedFilter,\n isMatchAllFilter(filter) && styles.matchAllPill\n )}\n onClick={(e) => {\n e.stopPropagation();\n setPopulateInputOnEdit(true);\n handleChangeViewMode();\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n setPopulateInputOnEdit(true);\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 < LABEL_MAX_VISIBLE_LENGTH ? (\n pillText\n ) : (\n <Tooltip content={<div className={styles.tooltipText}>{valueLabel}</div>} placement=\"top\">\n {pillText}\n </Tooltip>\n )}\n\n {!readOnly && !filter.matchAllFilter && (!filter.origin || filter.origin === 'dashboard') ? (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n if (filter.origin && filter.origin === 'dashboard') {\n model.updateToMatchAll(filter);\n } else {\n model._removeFilter(filter);\n }\n\n setTimeout(() => focusOnWipInputRef?.());\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n if (filter.origin && filter.origin === 'dashboard') {\n model.updateToMatchAll(filter);\n } else {\n model._removeFilter(filter);\n }\n setTimeout(() => focusOnWipInputRef?.());\n }\n }}\n name=\"times\"\n size=\"md\"\n className={styles.pillIcon}\n tooltip={`Remove filter with key ${keyLabel}`}\n />\n ) : null}\n\n {filter.origin && !filter.restorable && (\n <Tooltip content={`This is a ${filter.origin} injected filter`} placement={'bottom'}>\n <Icon name=\"info-circle\" size=\"md\" className={styles.infoPillIcon} />\n </Tooltip>\n )}\n\n {filter.origin && filter.restorable && (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n model.restoreOriginalFilter(filter);\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n model.restoreOriginalFilter(filter);\n }\n }}\n name=\"history\"\n size=\"md\"\n className={isMatchAllFilter(filter) ? styles.matchAllPillIcon : styles.pillIcon}\n tooltip={`Restore filter to its original value`}\n />\n )}\n </div>\n );\n }\n\n return (\n <AdHocCombobox\n filter={filter}\n model={model}\n handleChangeViewMode={handleChangeViewMode}\n focusOnWipInputRef={focusOnWipInputRef}\n populateInputOnEdit={populateInputOnEdit}\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 pillIcon: 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 infoPillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n }),\n matchAllPillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n color: theme.colors.text.disabled,\n }),\n matchAllPill: css({\n background: theme.colors.action.selected,\n color: theme.colors.text.disabled,\n border: 0,\n '&:hover': {\n background: theme.colors.action.selected,\n },\n }),\n});\n"],"names":["_a"],"mappings":";;;;;;AAOA,MAAM,wBAA2B,GAAA,EAAA;AAS1B,SAAS,gBAAgB,EAAE,MAAA,EAAQ,KAAO,EAAA,QAAA,EAAU,oBAA6B,EAAA;AAhBxF,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiBE,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9E,EAAM,MAAA,cAAA,GAAiB,OAAuB,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,KAAK,CAAA;AAEpE,EAAA,MAAM,QAAW,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,QAAP,KAAA,IAAA,GAAA,EAAA,GAAmB,MAAO,CAAA,GAAA;AAC3C,EAAM,MAAA,UAAA,GAAA,CAAA,CAAa,EAAO,GAAA,MAAA,CAAA,WAAA,KAAP,IAAoB,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAK,IAAS,CAAA,MAAA,CAAA,EAAA,GAAA,MAAA,CAAO,MAAP,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,IAAK,CAAA,IAAA,CAAA,CAAA,IAAS,MAAO,CAAA,KAAA;AAEzF,EAAA,MAAM,oBAAuB,GAAA,WAAA;AAAA,IAC3B,CAAC,OAA0B,gCAA+C,KAAA;AACxE,MAAO,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,eAAA,EAAA;AACP,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA;AAAA;AAGF,MAA4B,2BAAA,CAAA,gCAAA,IAAA,IAAA,GAAA,gCAAA,GAAoC,CAAC,QAAQ,CAAA;AACzE,MAAA,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,KACvB;AAAA,IACA,CAAC,UAAU,QAAQ;AAAA,GACrB;AAEA,EAAA,SAAA,CAAU,MAAM;AAvClB,IAAAA,IAAAA,GAAAA;AAwCI,IAAA,IAAI,wBAA0B,EAAA;AAC5B,MAAA,CAAAA,GAAA,GAAA,cAAA,CAAe,OAAf,KAAA,IAAA,GAAA,MAAA,GAAAA,GAAwB,CAAA,KAAA,EAAA;AACxB,MAAA,2BAAA,CAA4B,KAAK,CAAA;AAAA;AACnC,GACF,EAAG,CAAC,wBAAwB,CAAC,CAAA;AAG7B,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,MAAA,CAAO,aAAa,QAAU,EAAA;AAChC,MAAA,WAAA,CAAY,KAAK,CAAA;AAEjB,MAAA,KAAA,CAAM,aAAc,CAAA,MAAA,EAAQ,EAAE,SAAA,EAAW,QAAW,CAAA;AAAA;AACtD,GACC,EAAA,CAAC,MAAQ,EAAA,KAAA,EAAO,QAAQ,CAAC,CAAA;AAG5B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,sBAAA,CAAuB,CAAC,SAAA,KAAe,SAAY,GAAA,KAAA,GAAQ,SAAU,CAAA;AAAA;AACvE,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,IAAI,QAAU,EAAA;AACZ,IAAM,MAAA,QAAA,mBACH,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,MAAA,CAAO,QACrB,EAAA,EAAA,QAAA,EAAS,GAAE,EAAA,MAAA,CAAO,QAAS,EAAA,GAAA,EAAE,UAChC,CAAA;AAEF,IACE,uBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,EAAA;AAAA,UACT,MAAO,CAAA,kBAAA;AAAA,UACP,YAAY,MAAO,CAAA,sBAAA;AAAA,UACnB,gBAAA,CAAiB,MAAM,CAAA,IAAK,MAAO,CAAA;AAAA,SACrC;AAAA,QACA,OAAA,EAAS,CAAC,CAAM,KAAA;AACd,UAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,UAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,UAAqB,oBAAA,EAAA;AAAA,SACvB;AAAA,QACA,SAAA,EAAW,CAAC,CAAM,KAAA;AAChB,UAAI,IAAA,CAAA,CAAE,QAAQ,OAAS,EAAA;AACrB,YAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,YAAqB,oBAAA,EAAA;AAAA;AACvB,SACF;AAAA,QACA,IAAK,EAAA,QAAA;AAAA,QACL,YAAA,EAAY,wBAAwB,QAAQ,CAAA,CAAA;AAAA,QAC5C,QAAU,EAAA,CAAA;AAAA,QACV,GAAK,EAAA;AAAA,OAAA;AAAA,MAEJ,WAAW,MAAS,GAAA,wBAAA,GACnB,QAEA,mBAAA,KAAA,CAAA,aAAA,CAAC,WAAQ,OAAS,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,OAAO,WAAc,EAAA,EAAA,UAAW,CAAQ,EAAA,SAAA,EAAU,SACjF,QACH,CAAA;AAAA,MAGD,CAAC,QAAY,IAAA,CAAC,MAAO,CAAA,cAAA,KAAmB,CAAC,MAAO,CAAA,MAAA,IAAU,MAAO,CAAA,MAAA,KAAW,WAC3E,CAAA,mBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAM,KAAA;AACd,YAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,YAAA,IAAI,MAAO,CAAA,MAAA,IAAU,MAAO,CAAA,MAAA,KAAW,WAAa,EAAA;AAClD,cAAA,KAAA,CAAM,iBAAiB,MAAM,CAAA;AAAA,aACxB,MAAA;AACL,cAAA,KAAA,CAAM,cAAc,MAAM,CAAA;AAAA;AAG5B,YAAA,UAAA,CAAW,MAAM,kBAAsB,IAAA,IAAA,GAAA,MAAA,GAAA,kBAAA,EAAA,CAAA;AAAA,WACzC;AAAA,UACA,gBAAA,EAAkB,CAAC,CAAM,KAAA;AACvB,YAAI,IAAA,CAAA,CAAE,QAAQ,OAAS,EAAA;AACrB,cAAA,CAAA,CAAE,cAAe,EAAA;AACjB,cAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,cAAA,IAAI,MAAO,CAAA,MAAA,IAAU,MAAO,CAAA,MAAA,KAAW,WAAa,EAAA;AAClD,gBAAA,KAAA,CAAM,iBAAiB,MAAM,CAAA;AAAA,eACxB,MAAA;AACL,gBAAA,KAAA,CAAM,cAAc,MAAM,CAAA;AAAA;AAE5B,cAAA,UAAA,CAAW,MAAM,kBAAsB,IAAA,IAAA,GAAA,MAAA,GAAA,kBAAA,EAAA,CAAA;AAAA;AACzC,WACF;AAAA,UACA,IAAK,EAAA,OAAA;AAAA,UACL,IAAK,EAAA,IAAA;AAAA,UACL,WAAW,MAAO,CAAA,QAAA;AAAA,UAClB,OAAA,EAAS,0BAA0B,QAAQ,CAAA;AAAA;AAAA,OAE3C,GAAA,IAAA;AAAA,MAEH,MAAA,CAAO,UAAU,CAAC,MAAA,CAAO,8BACvB,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAQ,OAAS,EAAA,CAAA,UAAA,EAAa,MAAO,CAAA,MAAM,oBAAoB,SAAW,EAAA,QAAA,EAAA,kBACxE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAK,EAAA,aAAA,EAAc,MAAK,IAAK,EAAA,SAAA,EAAW,MAAO,CAAA,YAAA,EAAc,CACrE,CAAA;AAAA,MAGD,MAAA,CAAO,MAAU,IAAA,MAAA,CAAO,UACvB,oBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAM,KAAA;AACd,YAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,YAAA,KAAA,CAAM,sBAAsB,MAAM,CAAA;AAAA,WACpC;AAAA,UACA,gBAAA,EAAkB,CAAC,CAAM,KAAA;AACvB,YAAI,IAAA,CAAA,CAAE,QAAQ,OAAS,EAAA;AACrB,cAAA,CAAA,CAAE,cAAe,EAAA;AACjB,cAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,cAAA,KAAA,CAAM,sBAAsB,MAAM,CAAA;AAAA;AACpC,WACF;AAAA,UACA,IAAK,EAAA,SAAA;AAAA,UACL,IAAK,EAAA,IAAA;AAAA,UACL,WAAW,gBAAiB,CAAA,MAAM,CAAI,GAAA,MAAA,CAAO,mBAAmB,MAAO,CAAA,QAAA;AAAA,UACvE,OAAS,EAAA,CAAA,oCAAA;AAAA;AAAA;AACX,KAEJ;AAAA;AAIJ,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,KAAA;AAAA,MACA,oBAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAEA,MAAM,SAAA,GAAY,CAAC,KAA0B,MAAA;AAAA,EAC3C,oBAAoB,GAAI,CAAA;AAAA,IACtB,OAAS,EAAA,MAAA;AAAA,IACT,UAAY,EAAA,QAAA;AAAA,IACZ,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA,QAAA;AAAA,IAChC,YAAA,EAAc,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA;AAAA,IACjC,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,MAAA,CAAO,OAAO,IAAI,CAAA,CAAA;AAAA,IAC7C,SAAS,KAAM,CAAA,OAAA,CAAQ,KAAO,EAAA,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,IACzC,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,OAAA;AAAA,IACzB,QAAU,EAAA,QAAA;AAAA,IACV,UAAY,EAAA,QAAA;AAAA,IACZ,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC7B,GAAG,MAAM,UAAW,CAAA,SAAA;AAAA,IACpB,UAAA,EAAY,MAAM,UAAW,CAAA,cAAA;AAAA,IAC7B,MAAQ,EAAA,SAAA;AAAA,IAER,SAAW,EAAA;AAAA,MACT,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA;AAAA;AAClC,GACD,CAAA;AAAA,EACD,wBAAwB,GAAI,CAAA;AAAA,IAC1B,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC7B,MAAQ,EAAA,MAAA;AAAA,IACR,SAAW,EAAA;AAAA,MACT,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA;AAAA;AAClC,GACD,CAAA;AAAA,EACD,UAAU,GAAI,CAAA;AAAA,IACZ,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC/B,MAAQ,EAAA,SAAA;AAAA,IACR,SAAW,EAAA;AAAA,MACT,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA;AAAA;AAC3B,GACD,CAAA;AAAA,EACD,UAAU,GAAI,CAAA;AAAA,IACZ,QAAU,EAAA,OAAA;AAAA,IACV,KAAO,EAAA,MAAA;AAAA,IACP,YAAc,EAAA,UAAA;AAAA,IACd,QAAU,EAAA;AAAA,GACX,CAAA;AAAA,EACD,aAAa,GAAI,CAAA;AAAA,IACf,SAAW,EAAA;AAAA,GACZ,CAAA;AAAA,EACD,cAAc,GAAI,CAAA;AAAA,IAChB,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC/B,MAAQ,EAAA;AAAA,GACT,CAAA;AAAA,EACD,kBAAkB,GAAI,CAAA;AAAA,IACpB,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC/B,MAAQ,EAAA,SAAA;AAAA,IACR,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA;AAAA,GAC1B,CAAA;AAAA,EACD,cAAc,GAAI,CAAA;AAAA,IAChB,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA,QAAA;AAAA,IAChC,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,QAAA;AAAA,IACzB,MAAQ,EAAA,CAAA;AAAA,IACR,SAAW,EAAA;AAAA,MACT,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA;AAAA;AAClC,GACD;AACH,CAAA,CAAA;;;;"}
@@ -16,11 +16,6 @@ import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSeriali
16
16
  import { isEqual } from 'lodash';
17
17
  import { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes.js';
18
18
 
19
- var FilterOrigin = /* @__PURE__ */ ((FilterOrigin2) => {
20
- FilterOrigin2["Scopes"] = "scopes";
21
- FilterOrigin2["Dashboards"] = "dashboards";
22
- return FilterOrigin2;
23
- })(FilterOrigin || {});
24
19
  const OPERATORS = [
25
20
  {
26
21
  value: "=",
@@ -61,7 +56,7 @@ const OPERATORS = [
61
56
  ];
62
57
  class AdHocFiltersVariable extends SceneObjectBase {
63
58
  constructor(state) {
64
- var _a, _b, _c, _d, _e;
59
+ var _a, _b, _c, _d, _e, _f;
65
60
  super({
66
61
  type: "adhoc",
67
62
  name: (_a = state.name) != null ? _a : "Filters",
@@ -76,6 +71,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
76
71
  });
77
72
  this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
78
73
  this._dataSourceSrv = getDataSourceSrv();
74
+ // holds the originalValues of all baseFilters in a map. The values
75
+ // are set on construct and used to restore a baseFilter with an origin
76
+ // to its original value if edited at some point
77
+ this._originalValues = /* @__PURE__ */ new Map();
79
78
  this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
80
79
  this._activationHandler = () => {
81
80
  var _a, _b;
@@ -85,52 +84,75 @@ class AdHocFiltersVariable extends SceneObjectBase {
85
84
  this._updateScopesFilters(scopes);
86
85
  }
87
86
  const sub = (_b = this._scopesBridge) == null ? void 0 : _b.subscribeToValue((n, _) => {
88
- var _a2;
89
- this._updateScopesFilters(n, (_a2 = this._scopesBridge) == null ? void 0 : _a2.isLoading());
87
+ this._updateScopesFilters(n);
90
88
  });
91
89
  return () => {
90
+ var _a2, _b2;
92
91
  sub == null ? void 0 : sub.unsubscribe();
93
- };
94
- };
95
- this._updateScopesFilters = (scopes, areScopesLoading) => {
96
- var _a, _b;
97
- if (!scopes.length) {
98
- this.setState({
99
- baseFilters: (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scopes" /* Scopes */)
100
- });
101
- return;
102
- }
103
- const scopeFilters = getAdHocFiltersFromScopes(scopes);
104
- let finalFilters = scopeFilters;
105
- const scopeInjectedFilters = [];
106
- const remainingFilters = [];
107
- (_b = this.state.baseFilters) == null ? void 0 : _b.forEach((filter) => {
108
- if (filter.origin === "scopes" /* Scopes */) {
109
- scopeInjectedFilters.push(filter);
110
- } else {
111
- remainingFilters.push(filter);
92
+ if ((_a2 = this.state.baseFilters) == null ? void 0 : _a2.length) {
93
+ this.setState({
94
+ baseFilters: [...this.state.baseFilters.filter((filter) => filter.origin !== "scope")]
95
+ });
96
+ (_b2 = this.state.baseFilters) == null ? void 0 : _b2.forEach((filter) => {
97
+ if (filter.origin === "dashboard" && filter.restorable) {
98
+ this.restoreOriginalFilter(filter);
99
+ }
100
+ });
112
101
  }
113
- });
114
- if (!scopeFilters.length) {
115
- return;
116
- }
117
- const editedScopeFilters = scopeInjectedFilters.filter((filter) => {
118
- var _a2;
119
- return (_a2 = filter.originalValue) == null ? void 0 : _a2.length;
120
- });
121
- const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
122
- const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
123
- finalFilters = [
124
- ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
125
- ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
126
- ];
127
- this.setState({ baseFilters: [...remainingFilters, ...finalFilters] });
102
+ };
128
103
  };
129
104
  if (this.state.applyMode === "auto") {
130
105
  patchGetAdhocFilters(this);
131
106
  }
107
+ (_f = this.state.baseFilters) == null ? void 0 : _f.forEach((baseFilter) => {
108
+ var _a2;
109
+ if (baseFilter.origin === "dashboard") {
110
+ this._originalValues.set(baseFilter.key, {
111
+ operator: baseFilter.operator,
112
+ value: (_a2 = baseFilter.values) != null ? _a2 : [baseFilter.value]
113
+ });
114
+ }
115
+ });
132
116
  this.addActivationHandler(this._activationHandler);
133
117
  }
118
+ _updateScopesFilters(scopes) {
119
+ var _a, _b;
120
+ if (!scopes.length) {
121
+ this.setState({
122
+ baseFilters: (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scope")
123
+ });
124
+ return;
125
+ }
126
+ const scopeFilters = getAdHocFiltersFromScopes(scopes);
127
+ if (!scopeFilters.length) {
128
+ return;
129
+ }
130
+ let finalFilters = scopeFilters;
131
+ const scopeInjectedFilters = [];
132
+ const remainingFilters = [];
133
+ finalFilters.forEach((scopeFilter) => {
134
+ var _a2;
135
+ this._originalValues.set(scopeFilter.key, {
136
+ value: (_a2 = scopeFilter.values) != null ? _a2 : [scopeFilter.value],
137
+ operator: scopeFilter.operator
138
+ });
139
+ });
140
+ (_b = this.state.baseFilters) == null ? void 0 : _b.forEach((filter) => {
141
+ if (filter.origin === "scope") {
142
+ scopeInjectedFilters.push(filter);
143
+ } else {
144
+ remainingFilters.push(filter);
145
+ }
146
+ });
147
+ const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);
148
+ const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
149
+ const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
150
+ finalFilters = [
151
+ ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
152
+ ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
153
+ ];
154
+ this.setState({ baseFilters: [...finalFilters, ...remainingFilters] });
155
+ }
134
156
  setState(update) {
135
157
  var _a, _b, _c;
136
158
  let filterExpressionChanged = false;
@@ -173,14 +195,16 @@ class AdHocFiltersVariable extends SceneObjectBase {
173
195
  }
174
196
  }
175
197
  restoreOriginalFilter(filter) {
176
- var _a;
177
198
  const original = {
178
- originalValue: void 0
199
+ matchAllFilter: false,
200
+ restorable: false
179
201
  };
180
- if ((_a = filter.originalValue) == null ? void 0 : _a.length) {
181
- original.value = filter.originalValue[0];
182
- original.values = filter.originalValue;
183
- original.valueLabels = filter.originalValue;
202
+ if (filter.restorable) {
203
+ const originalFilter = this._originalValues.get(filter.key);
204
+ original.value = originalFilter == null ? void 0 : originalFilter.value[0];
205
+ original.values = originalFilter == null ? void 0 : originalFilter.value;
206
+ original.valueLabels = originalFilter == null ? void 0 : originalFilter.value;
207
+ original.operator = originalFilter == null ? void 0 : originalFilter.operator;
184
208
  }
185
209
  this._updateFilter(filter, original);
186
210
  }
@@ -191,14 +215,13 @@ class AdHocFiltersVariable extends SceneObjectBase {
191
215
  var _a;
192
216
  const { baseFilters, filters, _wip } = this.state;
193
217
  if (filter.origin) {
194
- const currentValues = filter.values ? filter.values : [filter.value];
218
+ const originalValues = this._originalValues.get(filter.key);
195
219
  const updateValues = update.values || (update.value ? [update.value] : void 0);
196
- const originalValueOverride = update.hasOwnProperty("originalValue");
197
- if (!originalValueOverride && updateValues && !filter.originalValue && !isEqual(currentValues, updateValues)) {
198
- update.originalValue = currentValues;
199
- }
200
- if (!originalValueOverride && isEqual(updateValues, filter.originalValue)) {
201
- update.originalValue = void 0;
220
+ const isRestorableOverride = update.hasOwnProperty("restorable");
221
+ if (!isRestorableOverride && (updateValues && !isEqual(updateValues, originalValues == null ? void 0 : originalValues.value) || update.operator && update.operator !== (originalValues == null ? void 0 : originalValues.operator))) {
222
+ update.restorable = true;
223
+ } else if (updateValues && isEqual(updateValues, originalValues == null ? void 0 : originalValues.value)) {
224
+ update.restorable = false;
202
225
  }
203
226
  const updatedBaseFilters = (_a = baseFilters == null ? void 0 : baseFilters.map((f) => {
204
227
  return f === filter ? { ...f, ...update } : f;
@@ -219,6 +242,16 @@ class AdHocFiltersVariable extends SceneObjectBase {
219
242
  });
220
243
  this.setState({ filters: updatedFilters });
221
244
  }
245
+ updateToMatchAll(filter) {
246
+ this._updateFilter(filter, {
247
+ operator: "=~",
248
+ value: ".*",
249
+ values: [".*"],
250
+ valueLabels: ["All"],
251
+ matchAllFilter: true,
252
+ restorable: true
253
+ });
254
+ }
222
255
  _removeFilter(filter) {
223
256
  if (filter === this.state._wip) {
224
257
  this.setState({ _wip: void 0 });
@@ -337,7 +370,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
337
370
  const timeRange = sceneGraph.getTimeRange(this).state.value;
338
371
  const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
339
372
  let scopes = (_e = this._scopesBridge) == null ? void 0 : _e.getValue();
340
- if (filter.origin === "scopes" /* Scopes */) {
373
+ if (filter.origin === "scope") {
341
374
  scopes = scopes == null ? void 0 : scopes.map((scope) => {
342
375
  return {
343
376
  ...scope,
@@ -424,6 +457,9 @@ function toSelectableValue(input) {
424
457
  }
425
458
  return result;
426
459
  }
460
+ function isMatchAllFilter(filter) {
461
+ return filter.operator === "=~" && filter.value === ".*";
462
+ }
427
463
  function isFilterComplete(filter) {
428
464
  return filter.key !== "" && filter.operator !== "" && filter.value !== "";
429
465
  }
@@ -435,5 +471,5 @@ function isMultiValueOperator(operatorValue) {
435
471
  return Boolean(operator.isMulti);
436
472
  }
437
473
 
438
- export { AdHocFiltersVariable, AdHocFiltersVariableRenderer, FilterOrigin, OPERATORS, isFilterComplete, isMultiValueOperator, toSelectableValue };
474
+ export { AdHocFiltersVariable, AdHocFiltersVariableRenderer, OPERATORS, isFilterComplete, isMatchAllFilter, isMultiValueOperator, toSelectableValue };
439
475
  //# sourceMappingURL=AdHocFiltersVariable.js.map