@grafana/scenes 6.50.0--canary.1315.20233534152.0 → 6.50.0--canary.1312.20242044820.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.
Files changed (26) hide show
  1. package/dist/esm/packages/scenes/src/index.js +1 -1
  2. package/dist/esm/packages/scenes/src/index.js.map +1 -1
  3. package/dist/esm/packages/scenes/src/locales/en-US/grafana-scenes.json.js +7 -0
  4. package/dist/esm/packages/scenes/src/locales/en-US/grafana-scenes.json.js.map +1 -1
  5. package/dist/esm/packages/scenes/src/variables/DrilldownDependenciesManager.js.map +1 -1
  6. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +2 -1
  7. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js.map +1 -1
  8. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersRecommendations.js +174 -0
  9. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersRecommendations.js.map +1 -0
  10. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersVariable.js +28 -4
  11. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
  12. package/dist/esm/packages/scenes/src/variables/adhoc/controller/AdHocFiltersVariableController.js +6 -1
  13. package/dist/esm/packages/scenes/src/variables/adhoc/controller/AdHocFiltersVariableController.js.map +1 -1
  14. package/dist/esm/packages/scenes/src/variables/components/DrilldownRecommendations.js +102 -0
  15. package/dist/esm/packages/scenes/src/variables/components/DrilldownRecommendations.js.map +1 -0
  16. package/dist/esm/packages/scenes/src/variables/groupby/GroupByRecommendations.js +192 -0
  17. package/dist/esm/packages/scenes/src/variables/groupby/GroupByRecommendations.js.map +1 -0
  18. package/dist/esm/packages/scenes/src/variables/groupby/GroupByVariable.js +61 -8
  19. package/dist/esm/packages/scenes/src/variables/groupby/GroupByVariable.js.map +1 -1
  20. package/dist/esm/packages/scenes/src/variables/types.js.map +1 -1
  21. package/dist/{grafana-scenes-D5iZGLtK.js → grafana-scenes-C9F_2hih.js} +8 -1
  22. package/dist/{grafana-scenes-D5iZGLtK.js.map → grafana-scenes-C9F_2hih.js.map} +1 -1
  23. package/dist/index.d.ts +130 -9
  24. package/dist/index.js +5187 -4681
  25. package/dist/index.js.map +1 -1
  26. package/package.json +2 -2
@@ -9,7 +9,7 @@ export { PATH_ID_SEPARATOR } from './utils/pathId.js';
9
9
  import { isRepeatCloneOrChildOf } from './utils/utils.js';
10
10
  import { registerVariableMacro } from './variables/macros/index.js';
11
11
  import { escapeURLDelimiters, escapeLabelValueInExactSelector, escapeLabelValueInRegexSelector, renderPrometheusLabelFilters } from './variables/utils.js';
12
- export { escapeUrlPipeDelimiters } from './variables/utils.js';
12
+ export { escapeUrlPipeDelimiters, getQueriesForVariables } from './variables/utils.js';
13
13
  import { isSwitchVariable, isGroupByVariable, isTextBoxVariable, isQueryVariable, isIntervalVariable, isDataSourceVariable, isCustomVariable, isConstantVariable, isAdHocVariable } from './variables/variants/guards.js';
14
14
  export { isDataLayer, isDataRequestEnricher, isFiltersRequestEnricher, isSceneObject } from './core/types.js';
15
15
  export { SceneObjectStateChangedEvent, UserActionEvent } from './core/events.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/cloneSceneObject';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\nimport { buildPathIdFor } from './utils/pathId';\nimport { isRepeatCloneOrChildOf } from './utils/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 isSwitchVariable,\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 performanceUtils from './performance';\nexport { writePerformanceLog } from './utils/writePerformanceLog';\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} 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 { SwitchVariable } from './variables/variants/SwitchVariable';\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 { ScopesVariable } from './variables/variants/ScopesVariable';\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 type {\n AdHocFiltersController,\n AdHocFiltersControllerState,\n} from './variables/adhoc/controller/AdHocFiltersController';\nexport { AdHocFiltersVariableController } from './variables/adhoc/controller/AdHocFiltersVariableController';\nexport { AdHocFiltersComboboxRenderer } from './variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nexport { GroupByVariable } from './variables/groupby/GroupByVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\nexport { escapeUrlPipeDelimiters } from './variables/utils';\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';\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 isSwitchVariable,\n isRepeatCloneOrChildOf,\n buildPathIdFor,\n};\n\nexport { SafeSerializableSceneObject } from './utils/SafeSerializableSceneObject';\nexport { getExploreURL } from './utils/explore';\nexport { loadResources } from './utils/loadResources';\nexport { PATH_ID_SEPARATOR } from './utils/pathId';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwJO,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,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,sBAAA;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/cloneSceneObject';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\nimport { buildPathIdFor } from './utils/pathId';\nimport { isRepeatCloneOrChildOf } from './utils/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 isSwitchVariable,\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 performanceUtils from './performance';\nexport { writePerformanceLog } from './utils/writePerformanceLog';\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} 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 { SwitchVariable } from './variables/variants/SwitchVariable';\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 { ScopesVariable } from './variables/variants/ScopesVariable';\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 type {\n AdHocFiltersController,\n AdHocFiltersControllerState,\n} from './variables/adhoc/controller/AdHocFiltersController';\nexport { AdHocFiltersVariableController } from './variables/adhoc/controller/AdHocFiltersVariableController';\nexport { AdHocFiltersComboboxRenderer } from './variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nexport { GroupByVariable } from './variables/groupby/GroupByVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\nexport { escapeUrlPipeDelimiters, getQueriesForVariables } from './variables/utils';\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';\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 isSwitchVariable,\n isRepeatCloneOrChildOf,\n buildPathIdFor,\n};\n\nexport { SafeSerializableSceneObject } from './utils/SafeSerializableSceneObject';\nexport { getExploreURL } from './utils/explore';\nexport { loadResources } from './utils/loadResources';\nexport { PATH_ID_SEPARATOR } from './utils/pathId';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwJO,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,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF;;;;"}
@@ -11,6 +11,13 @@ var grafanaScenes = {
11
11
  "remove-filter-value": "Remove filter value - {{itemLabel}}",
12
12
  "use-custom-value": "Use custom value: {{itemLabel}}"
13
13
  },
14
+ "drilldown-recommendations": {
15
+ recent: "Recent",
16
+ "recent-empty": "No recent values",
17
+ recommended: "Recommended",
18
+ "recommended-empty": "No recommended values",
19
+ tooltip: "Show recommendations"
20
+ },
14
21
  "fallback-page": {
15
22
  content: "If you found your way here using a link then there might be a bug in this application.",
16
23
  subTitle: "The url did not match any page",
@@ -1 +1 @@
1
- {"version":3,"file":"grafana-scenes.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"grafana-scenes.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DrilldownDependenciesManager.js","sources":["../../../../../../src/variables/DrilldownDependenciesManager.ts"],"sourcesContent":["import { findActiveAdHocFilterVariableByUid } from '../variables/adhoc/patchGetAdhocFilters';\nimport { findActiveGroupByVariablesByUid } from '../variables/groupby/findActiveGroupByVariablesByUid';\nimport { GroupByVariable } from '../variables/groupby/GroupByVariable';\nimport {\n AdHocFilterWithLabels,\n AdHocFiltersVariable,\n isFilterApplicable,\n isFilterComplete,\n} from '../variables/adhoc/AdHocFiltersVariable';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneObjectState } from '../core/types';\n\n/**\n * Manages ad-hoc filters and group-by variables for data providers\n */\nexport class DrilldownDependenciesManager<TState extends SceneObjectState> {\n private _adhocFiltersVar?: AdHocFiltersVariable;\n private _groupByVar?: GroupByVariable;\n private _variableDependency: VariableDependencyConfig<TState>;\n\n public constructor(variableDependency: VariableDependencyConfig<TState>) {\n this._variableDependency = variableDependency;\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n public findAndSubscribeToDrilldowns(interpolatedUid: string | undefined) {\n const filtersVar = findActiveAdHocFilterVariableByUid(interpolatedUid);\n const groupByVar = findActiveGroupByVariablesByUid(interpolatedUid);\n\n let hasChanges = false;\n\n if (this._adhocFiltersVar !== filtersVar) {\n this._adhocFiltersVar = filtersVar;\n hasChanges = true;\n }\n\n if (this._groupByVar !== groupByVar) {\n this._groupByVar = groupByVar;\n hasChanges = true;\n }\n\n if (hasChanges) {\n this._updateExplicitDrilldownVariableDependencies();\n }\n }\n\n private _updateExplicitDrilldownVariableDependencies(): void {\n const explicitDependencies: string[] = [];\n\n if (this._adhocFiltersVar) {\n explicitDependencies.push(this._adhocFiltersVar.state.name);\n }\n\n if (this._groupByVar) {\n explicitDependencies.push(this._groupByVar.state.name);\n }\n\n this._variableDependency.setVariableNames(explicitDependencies);\n }\n\n public get adHocFiltersVar(): AdHocFiltersVariable | undefined {\n return this._adhocFiltersVar;\n }\n\n public get groupByVar(): GroupByVariable | undefined {\n return this._groupByVar;\n }\n\n public getFilters(): AdHocFilterWithLabels[] | undefined {\n return this._adhocFiltersVar\n ? [...(this._adhocFiltersVar.state.originFilters ?? []), ...this._adhocFiltersVar.state.filters].filter(\n (f) => isFilterComplete(f) && isFilterApplicable(f)\n )\n : undefined;\n }\n\n public getGroupByKeys(): string[] | undefined {\n return this._groupByVar ? (this._groupByVar.getApplicableKeys() as string[]) : undefined;\n }\n\n public cleanup(): void {\n this._adhocFiltersVar = undefined;\n this._groupByVar = undefined;\n }\n}\n"],"names":[],"mappings":";;;;AAeO,MAAM,4BAA8D,CAAA;AAAA,EAKlE,YAAY,kBAAsD,EAAA;AACvE,IAAA,IAAA,CAAK,mBAAsB,GAAA,kBAAA;AAAA;AAC7B;AAAA;AAAA;AAAA,EAKO,6BAA6B,eAAqC,EAAA;AACvE,IAAM,MAAA,UAAA,GAAa,mCAAmC,eAAe,CAAA;AACrE,IAAM,MAAA,UAAA,GAAa,gCAAgC,eAAe,CAAA;AAElE,IAAA,IAAI,UAAa,GAAA,KAAA;AAEjB,IAAI,IAAA,IAAA,CAAK,qBAAqB,UAAY,EAAA;AACxC,MAAA,IAAA,CAAK,gBAAmB,GAAA,UAAA;AACxB,MAAa,UAAA,GAAA,IAAA;AAAA;AAGf,IAAI,IAAA,IAAA,CAAK,gBAAgB,UAAY,EAAA;AACnC,MAAA,IAAA,CAAK,WAAc,GAAA,UAAA;AACnB,MAAa,UAAA,GAAA,IAAA;AAAA;AAGf,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,IAAA,CAAK,4CAA6C,EAAA;AAAA;AACpD;AACF,EAEQ,4CAAqD,GAAA;AAC3D,IAAA,MAAM,uBAAiC,EAAC;AAExC,IAAA,IAAI,KAAK,gBAAkB,EAAA;AACzB,MAAA,oBAAA,CAAqB,IAAK,CAAA,IAAA,CAAK,gBAAiB,CAAA,KAAA,CAAM,IAAI,CAAA;AAAA;AAG5D,IAAA,IAAI,KAAK,WAAa,EAAA;AACpB,MAAA,oBAAA,CAAqB,IAAK,CAAA,IAAA,CAAK,WAAY,CAAA,KAAA,CAAM,IAAI,CAAA;AAAA;AAGvD,IAAK,IAAA,CAAA,mBAAA,CAAoB,iBAAiB,oBAAoB,CAAA;AAAA;AAChE,EAEA,IAAW,eAAoD,GAAA;AAC7D,IAAA,OAAO,IAAK,CAAA,gBAAA;AAAA;AACd,EAEA,IAAW,UAA0C,GAAA;AACnD,IAAA,OAAO,IAAK,CAAA,WAAA;AAAA;AACd,EAEO,UAAkD,GAAA;AAtE3D,IAAA,IAAA,EAAA;AAuEI,IAAA,OAAO,KAAK,gBACR,GAAA,CAAC,GAAI,CAAA,EAAA,GAAA,IAAA,CAAK,iBAAiB,KAAM,CAAA,aAAA,KAA5B,IAA6C,GAAA,EAAA,GAAA,IAAK,GAAG,IAAA,CAAK,gBAAiB,CAAA,KAAA,CAAM,OAAO,CAAE,CAAA,MAAA;AAAA,MAC7F,CAAC,CAAM,KAAA,gBAAA,CAAiB,CAAC,CAAA,IAAK,mBAAmB,CAAC;AAAA,KAEpD,GAAA,MAAA;AAAA;AACN,EAEO,cAAuC,GAAA;AAC5C,IAAA,OAAO,IAAK,CAAA,WAAA,GAAe,IAAK,CAAA,WAAA,CAAY,mBAAmC,GAAA,MAAA;AAAA;AACjF,EAEO,OAAgB,GAAA;AACrB,IAAA,IAAA,CAAK,gBAAmB,GAAA,MAAA;AACxB,IAAA,IAAA,CAAK,WAAc,GAAA,MAAA;AAAA;AAEvB;;;;"}
1
+ {"version":3,"file":"DrilldownDependenciesManager.js","sources":["../../../../../../src/variables/DrilldownDependenciesManager.ts"],"sourcesContent":["import { findActiveAdHocFilterVariableByUid } from '../variables/adhoc/patchGetAdhocFilters';\nimport { findActiveGroupByVariablesByUid } from '../variables/groupby/findActiveGroupByVariablesByUid';\nimport { GroupByVariable } from '../variables/groupby/GroupByVariable';\nimport {\n AdHocFilterWithLabels,\n AdHocFiltersVariable,\n isFilterApplicable,\n isFilterComplete,\n} from '../variables/adhoc/AdHocFiltersVariable';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneObjectState } from '../core/types';\n\n/**\n * Manages ad-hoc filters and group-by variables for data providers\n */\nexport class DrilldownDependenciesManager<TState extends SceneObjectState> {\n private _adhocFiltersVar?: AdHocFiltersVariable;\n private _groupByVar?: GroupByVariable;\n private _variableDependency: VariableDependencyConfig<TState>;\n\n public constructor(variableDependency: VariableDependencyConfig<TState>) {\n this._variableDependency = variableDependency;\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n public findAndSubscribeToDrilldowns(interpolatedUid: string | undefined) {\n const filtersVar = findActiveAdHocFilterVariableByUid(interpolatedUid);\n const groupByVar = findActiveGroupByVariablesByUid(interpolatedUid);\n\n let hasChanges = false;\n\n if (this._adhocFiltersVar !== filtersVar) {\n this._adhocFiltersVar = filtersVar;\n hasChanges = true;\n }\n\n if (this._groupByVar !== groupByVar) {\n this._groupByVar = groupByVar;\n hasChanges = true;\n }\n\n if (hasChanges) {\n this._updateExplicitDrilldownVariableDependencies();\n }\n }\n\n private _updateExplicitDrilldownVariableDependencies(): void {\n const explicitDependencies: string[] = [];\n\n if (this._adhocFiltersVar) {\n explicitDependencies.push(this._adhocFiltersVar.state.name);\n }\n\n if (this._groupByVar) {\n explicitDependencies.push(this._groupByVar.state.name);\n }\n\n this._variableDependency.setVariableNames(explicitDependencies);\n }\n\n public get adHocFiltersVar(): AdHocFiltersVariable | undefined {\n return this._adhocFiltersVar;\n }\n\n public get groupByVar(): GroupByVariable | undefined {\n return this._groupByVar;\n }\n\n public getFilters(): AdHocFilterWithLabels[] | undefined {\n return this._adhocFiltersVar\n ? [...(this._adhocFiltersVar.state.originFilters ?? []), ...this._adhocFiltersVar.state.filters].filter(\n (f) => isFilterComplete(f) && isFilterApplicable(f)\n )\n : undefined;\n }\n\n public getGroupByKeys(): string[] | undefined {\n return this._groupByVar ? this._groupByVar.getApplicableKeys() : undefined;\n }\n\n public cleanup(): void {\n this._adhocFiltersVar = undefined;\n this._groupByVar = undefined;\n }\n}\n"],"names":[],"mappings":";;;;AAeO,MAAM,4BAA8D,CAAA;AAAA,EAKlE,YAAY,kBAAsD,EAAA;AACvE,IAAA,IAAA,CAAK,mBAAsB,GAAA,kBAAA;AAAA;AAC7B;AAAA;AAAA;AAAA,EAKO,6BAA6B,eAAqC,EAAA;AACvE,IAAM,MAAA,UAAA,GAAa,mCAAmC,eAAe,CAAA;AACrE,IAAM,MAAA,UAAA,GAAa,gCAAgC,eAAe,CAAA;AAElE,IAAA,IAAI,UAAa,GAAA,KAAA;AAEjB,IAAI,IAAA,IAAA,CAAK,qBAAqB,UAAY,EAAA;AACxC,MAAA,IAAA,CAAK,gBAAmB,GAAA,UAAA;AACxB,MAAa,UAAA,GAAA,IAAA;AAAA;AAGf,IAAI,IAAA,IAAA,CAAK,gBAAgB,UAAY,EAAA;AACnC,MAAA,IAAA,CAAK,WAAc,GAAA,UAAA;AACnB,MAAa,UAAA,GAAA,IAAA;AAAA;AAGf,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,IAAA,CAAK,4CAA6C,EAAA;AAAA;AACpD;AACF,EAEQ,4CAAqD,GAAA;AAC3D,IAAA,MAAM,uBAAiC,EAAC;AAExC,IAAA,IAAI,KAAK,gBAAkB,EAAA;AACzB,MAAA,oBAAA,CAAqB,IAAK,CAAA,IAAA,CAAK,gBAAiB,CAAA,KAAA,CAAM,IAAI,CAAA;AAAA;AAG5D,IAAA,IAAI,KAAK,WAAa,EAAA;AACpB,MAAA,oBAAA,CAAqB,IAAK,CAAA,IAAA,CAAK,WAAY,CAAA,KAAA,CAAM,IAAI,CAAA;AAAA;AAGvD,IAAK,IAAA,CAAA,mBAAA,CAAoB,iBAAiB,oBAAoB,CAAA;AAAA;AAChE,EAEA,IAAW,eAAoD,GAAA;AAC7D,IAAA,OAAO,IAAK,CAAA,gBAAA;AAAA;AACd,EAEA,IAAW,UAA0C,GAAA;AACnD,IAAA,OAAO,IAAK,CAAA,WAAA;AAAA;AACd,EAEO,UAAkD,GAAA;AAtE3D,IAAA,IAAA,EAAA;AAuEI,IAAA,OAAO,KAAK,gBACR,GAAA,CAAC,GAAI,CAAA,EAAA,GAAA,IAAA,CAAK,iBAAiB,KAAM,CAAA,aAAA,KAA5B,IAA6C,GAAA,EAAA,GAAA,IAAK,GAAG,IAAA,CAAK,gBAAiB,CAAA,KAAA,CAAM,OAAO,CAAE,CAAA,MAAA;AAAA,MAC7F,CAAC,CAAM,KAAA,gBAAA,CAAiB,CAAC,CAAA,IAAK,mBAAmB,CAAC;AAAA,KAEpD,GAAA,MAAA;AAAA;AACN,EAEO,cAAuC,GAAA;AAC5C,IAAA,OAAO,IAAK,CAAA,WAAA,GAAc,IAAK,CAAA,WAAA,CAAY,mBAAsB,GAAA,MAAA;AAAA;AACnE,EAEO,OAAgB,GAAA;AACrB,IAAA,IAAA,CAAK,gBAAmB,GAAA,MAAA;AACxB,IAAA,IAAA,CAAK,WAAc,GAAA,MAAA;AAAA;AAEvB;;;;"}
@@ -5,7 +5,7 @@ import { AdHocFilterPill } from './AdHocFilterPill.js';
5
5
  import { AdHocFiltersAlwaysWipCombobox } from './AdHocFiltersAlwaysWipCombobox.js';
6
6
 
7
7
  const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer2({ controller }) {
8
- const { originFilters, filters, readOnly } = controller.useState();
8
+ const { originFilters, filters, readOnly, valueRecommendations, drilldownRecommendationsEnabled } = controller.useState();
9
9
  const styles = useStyles2(getStyles);
10
10
  const focusOnWipInputRef = useRef();
11
11
  return /* @__PURE__ */ React.createElement(
@@ -18,6 +18,7 @@ const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer2
18
18
  }
19
19
  },
20
20
  /* @__PURE__ */ React.createElement(Icon, { name: "filter", className: styles.filterIcon, size: "lg" }),
21
+ drilldownRecommendationsEnabled && valueRecommendations && /* @__PURE__ */ React.createElement(valueRecommendations.Component, { model: valueRecommendations }),
21
22
  originFilters == null ? void 0 : originFilters.map(
22
23
  (filter, index) => filter.origin ? /* @__PURE__ */ React.createElement(
23
24
  AdHocFilterPill,
@@ -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 { AdHocFiltersController } from '../controller/AdHocFiltersController';\nimport { AdHocFilterPill } from './AdHocFilterPill';\nimport { AdHocFiltersAlwaysWipCombobox } from './AdHocFiltersAlwaysWipCombobox';\n\ninterface Props {\n controller: AdHocFiltersController;\n}\n\nexport const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer({ controller }: Props) {\n const { originFilters, filters, readOnly } = controller.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 {originFilters?.map((filter, index) =>\n filter.origin ? (\n <AdHocFilterPill\n key={`${index}-${filter.key}`}\n filter={filter}\n controller={controller}\n focusOnWipInputRef={focusOnWipInputRef.current}\n />\n ) : null\n )}\n\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <AdHocFilterPill\n key={`${index}-${filter.key}`}\n filter={filter}\n controller={controller}\n readOnly={readOnly || filter.readOnly}\n focusOnWipInputRef={focusOnWipInputRef.current}\n />\n ))}\n\n {!readOnly ? <AdHocFiltersAlwaysWipCombobox controller={controller} 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":";;;;;;AAYO,MAAM,+BAA+B,IAAK,CAAA,SAASA,6BAA6B,CAAA,EAAE,YAAqB,EAAA;AAC5G,EAAA,MAAM,EAAE,aAAe,EAAA,OAAA,EAAS,QAAS,EAAA,GAAI,WAAW,QAAS,EAAA;AACjE,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA;AAInC,EAAA,MAAM,qBAAqB,MAAmB,EAAA;AAE9C,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAG,CAAA,MAAA,CAAO,eAAiB,EAAA,EAAE,CAAC,MAAA,CAAO,oBAAoB,GAAG,CAAC,QAAA,EAAU,CAAA;AAAA,MAClF,SAAS,MAAM;AAvBrB,QAAA,IAAA,EAAA;AAwBQ,QAAA,CAAA,EAAA,GAAA,kBAAA,CAAmB,OAAnB,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,kBAAA,CAAA;AAAA;AACF,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAK,EAAA,QAAA,EAAS,WAAW,MAAO,CAAA,UAAA,EAAY,MAAK,IAAK,EAAA,CAAA;AAAA,IAE3D,aAAe,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAA,GAAA;AAAA,MAAI,CAAC,MAAA,EAAQ,KAC3B,KAAA,MAAA,CAAO,MACL,mBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,GAAK,EAAA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,GAAG,CAAA,CAAA;AAAA,UAC3B,MAAA;AAAA,UACA,UAAA;AAAA,UACA,oBAAoB,kBAAmB,CAAA;AAAA;AAAA,OAEvC,GAAA;AAAA,KAAA;AAAA,IAGL,OAAA,CACE,MAAO,CAAA,CAAC,MAAW,KAAA,CAAC,MAAO,CAAA,MAAM,CACjC,CAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,KACZ,qBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,GAAK,EAAA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,GAAG,CAAA,CAAA;AAAA,QAC3B,MAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA,EAAU,YAAY,MAAO,CAAA,QAAA;AAAA,QAC7B,oBAAoB,kBAAmB,CAAA;AAAA;AAAA,KAE1C,CAAA;AAAA,IAEF,CAAC,QAAW,mBAAA,KAAA,CAAA,aAAA,CAAC,iCAA8B,UAAwB,EAAA,GAAA,EAAK,oBAAoB,CAAK,GAAA;AAAA,GACpG;AAEJ,CAAC;AAED,MAAM,SAAA,GAAY,CAAC,KAA0B,MAAA;AAAA,EAC3C,iBAAiB,GAAI,CAAA;AAAA,IACnB,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,MAAA;AAAA,IACV,UAAY,EAAA,QAAA;AAAA,IACZ,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1B,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IACzB,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1B,eAAA,EAAiB,KAAM,CAAA,UAAA,CAAW,KAAM,CAAA,UAAA;AAAA,IACxC,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,MAAA,CAAO,OAAO,MAAM,CAAA,CAAA;AAAA,IAC/C,YAAA,EAAc,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA;AAAA,IACjC,aAAA,EAAe,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC9B,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC/B,QAAU,EAAA;AAAA,GACX,CAAA;AAAA,EACD,sBAAsB,GAAI,CAAA;AAAA,IACxB,gBAAkB,EAAA;AAAA,MAChB,OAAS,EAAA,wBAAA;AAAA,MACT,aAAe,EAAA,KAAA;AAAA,MACf,SAAA,EAAW,CAAa,UAAA,EAAA,KAAA,CAAM,MAAO,CAAA,UAAA,CAAW,MAAM,CAAiB,cAAA,EAAA,KAAA,CAAM,MAAO,CAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,MAChG,wBAA0B,EAAA,CAAA,8BAAA,CAAA;AAAA,MAC1B,kBAAoB,EAAA,MAAA;AAAA,MACpB,kBAAoB,EAAA,qCAAA;AAAA,MACpB,MAAQ,EAAA;AAAA;AACV,GACD,CAAA;AAAA,EACD,YAAY,GAAI,CAAA;AAAA,IACd,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,SAAA;AAAA,IACzB,SAAW,EAAA;AAAA,GACZ;AACH,CAAA,CAAA;;;;"}
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 { AdHocFiltersController } from '../controller/AdHocFiltersController';\nimport { AdHocFilterPill } from './AdHocFilterPill';\nimport { AdHocFiltersAlwaysWipCombobox } from './AdHocFiltersAlwaysWipCombobox';\n\ninterface Props {\n controller: AdHocFiltersController;\n}\n\nexport const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer({ controller }: Props) {\n const { originFilters, filters, readOnly, valueRecommendations, drilldownRecommendationsEnabled } =\n controller.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 {drilldownRecommendationsEnabled && valueRecommendations && (\n <valueRecommendations.Component model={valueRecommendations} />\n )}\n\n {originFilters?.map((filter, index) =>\n filter.origin ? (\n <AdHocFilterPill\n key={`${index}-${filter.key}`}\n filter={filter}\n controller={controller}\n focusOnWipInputRef={focusOnWipInputRef.current}\n />\n ) : null\n )}\n\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <AdHocFilterPill\n key={`${index}-${filter.key}`}\n filter={filter}\n controller={controller}\n readOnly={readOnly || filter.readOnly}\n focusOnWipInputRef={focusOnWipInputRef.current}\n />\n ))}\n\n {!readOnly ? <AdHocFiltersAlwaysWipCombobox controller={controller} 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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"}
@@ -0,0 +1,174 @@
1
+ import React from 'react';
2
+ import { config } from '@grafana/runtime';
3
+ import { store } from '@grafana/data';
4
+ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
5
+ import { sceneGraph } from '../../core/sceneGraph/index.js';
6
+ import { getEnrichedDataRequest } from '../../querying/getEnrichedDataRequest.js';
7
+ import { getQueriesForVariables } from '../utils.js';
8
+ import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
9
+ import { getDataSource } from '../../utils/getDataSource.js';
10
+ import { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest.js';
11
+ import { DrilldownRecommendations } from '../components/DrilldownRecommendations.js';
12
+ import { ScopesVariable } from '../variants/ScopesVariable.js';
13
+ import { SCOPES_VARIABLE_NAME } from '../constants.js';
14
+ import { getRecentFiltersKey } from './AdHocFiltersVariable.js';
15
+
16
+ class AdHocFiltersRecommendations extends SceneObjectBase {
17
+ constructor(parent) {
18
+ super({});
19
+ this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
20
+ this._activationHandler = () => {
21
+ const json = store.get(this._getStorageKey());
22
+ const storedFilters = json ? JSON.parse(json) : [];
23
+ if (storedFilters.length > 0) {
24
+ this._verifyRecentFiltersApplicability(storedFilters);
25
+ } else {
26
+ this.setState({ recentFilters: [] });
27
+ }
28
+ this._fetchRecommendedDrilldowns();
29
+ const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this);
30
+ let scopesSubscription;
31
+ if (scopesVariable instanceof ScopesVariable) {
32
+ scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {
33
+ if (newState.scopes !== prevState.scopes) {
34
+ const json2 = store.get(this._getStorageKey());
35
+ const storedFilters2 = json2 ? JSON.parse(json2) : [];
36
+ if (storedFilters2.length > 0) {
37
+ this._verifyRecentFiltersApplicability(storedFilters2);
38
+ }
39
+ }
40
+ });
41
+ }
42
+ return () => {
43
+ scopesSubscription == null ? void 0 : scopesSubscription.unsubscribe();
44
+ };
45
+ };
46
+ this._parentVariable = parent;
47
+ this.addActivationHandler(this._activationHandler);
48
+ }
49
+ /**
50
+ * Get the parent variable
51
+ */
52
+ get parent() {
53
+ return this._parentVariable;
54
+ }
55
+ _getStorageKey() {
56
+ var _a;
57
+ return getRecentFiltersKey((_a = this._parentVariable.state.datasource) == null ? void 0 : _a.uid);
58
+ }
59
+ async _fetchRecommendedDrilldowns() {
60
+ var _a;
61
+ const parent = this._parentVariable;
62
+ const ds = await getDataSource(parent.state.datasource, this._scopedVars);
63
+ if (!ds || !ds.getRecommendedDrilldowns) {
64
+ return;
65
+ }
66
+ const queries = parent.state.useQueriesAsFilterForOptions ? getQueriesForVariables(parent) : void 0;
67
+ const timeRange = sceneGraph.getTimeRange(this).state.value;
68
+ const scopes = sceneGraph.getScopes(this);
69
+ const filters = [...(_a = parent.state.originFilters) != null ? _a : [], ...parent.state.filters];
70
+ const enrichedRequest = getEnrichedDataRequest(this);
71
+ const dashboardUid = enrichedRequest == null ? void 0 : enrichedRequest.dashboardUID;
72
+ try {
73
+ const recommendedDrilldowns = await ds.getRecommendedDrilldowns({
74
+ timeRange,
75
+ dashboardUid,
76
+ queries: queries != null ? queries : [],
77
+ filters,
78
+ scopes,
79
+ userId: config.bootData.user.id
80
+ });
81
+ if (recommendedDrilldowns == null ? void 0 : recommendedDrilldowns.filters) {
82
+ this.setState({ recommendedFilters: recommendedDrilldowns.filters });
83
+ }
84
+ } catch (error) {
85
+ console.error("Failed to fetch recommended drilldowns:", error);
86
+ }
87
+ }
88
+ async _verifyRecentFiltersApplicability(storedFilters) {
89
+ const parent = this._parentVariable;
90
+ const queries = parent.state.useQueriesAsFilterForOptions ? getQueriesForVariables(parent) : void 0;
91
+ const response = await this._getFiltersApplicabilityForQueries(storedFilters, queries != null ? queries : []);
92
+ if (!response) {
93
+ this.setState({ recentFilters: storedFilters.slice(-3) });
94
+ return;
95
+ }
96
+ const applicabilityMap = /* @__PURE__ */ new Map();
97
+ response.forEach((item) => {
98
+ applicabilityMap.set(item.key, item.applicable !== false);
99
+ });
100
+ const applicableFilters = storedFilters.filter((f) => {
101
+ const isApplicable = applicabilityMap.get(f.key);
102
+ return isApplicable === void 0 || isApplicable === true;
103
+ }).slice(-3);
104
+ this.setState({ recentFilters: applicableFilters });
105
+ }
106
+ async _getFiltersApplicabilityForQueries(filters, queries) {
107
+ const parent = this._parentVariable;
108
+ const ds = await getDataSource(parent.state.datasource, this._scopedVars);
109
+ if (!ds || !ds.getDrilldownsApplicability) {
110
+ return;
111
+ }
112
+ const timeRange = sceneGraph.getTimeRange(this).state.value;
113
+ return await ds.getDrilldownsApplicability({
114
+ filters,
115
+ queries,
116
+ timeRange,
117
+ scopes: sceneGraph.getScopes(this),
118
+ ...getEnrichedFiltersRequest(this)
119
+ });
120
+ }
121
+ /**
122
+ * Stores a recent filter in localStorage and updates state.
123
+ * Should be called by the parent variable when a filter is added/updated.
124
+ */
125
+ storeRecentFilter(filter) {
126
+ const key = this._getStorageKey();
127
+ const storedFilters = store.get(key);
128
+ const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];
129
+ const updatedStoredFilters = [...allRecentFilters, filter].slice(-10);
130
+ store.set(key, JSON.stringify(updatedStoredFilters));
131
+ const parent = this._parentVariable;
132
+ const existingFilter = parent.state.filters.find((f) => f.key === filter.key && !Boolean(f.nonApplicable));
133
+ if (existingFilter && !Boolean(existingFilter.nonApplicable)) {
134
+ this.setState({ recentFilters: updatedStoredFilters.slice(-3) });
135
+ }
136
+ }
137
+ /**
138
+ * Get the current filters from the parent variable
139
+ */
140
+ getParentFilters() {
141
+ return this._parentVariable.state.filters;
142
+ }
143
+ /**
144
+ * Add a filter to the parent variable
145
+ */
146
+ addFilterToParent(filter) {
147
+ const parent = this._parentVariable;
148
+ parent.updateFilters([...parent.state.filters, filter]);
149
+ }
150
+ }
151
+ AdHocFiltersRecommendations.Component = AdHocFiltersRecommendationsRenderer;
152
+ function AdHocFiltersRecommendationsRenderer({ model }) {
153
+ const { recentFilters, recommendedFilters } = model.useState();
154
+ const { filters } = model.parent.useState();
155
+ const recentDrilldowns = recentFilters == null ? void 0 : recentFilters.map((filter) => ({
156
+ label: `${filter.key} ${filter.operator} ${filter.value}`,
157
+ onClick: () => {
158
+ model.addFilterToParent(filter);
159
+ }
160
+ }));
161
+ const recommendedDrilldowns = recommendedFilters == null ? void 0 : recommendedFilters.map((filter) => ({
162
+ label: `${filter.key} ${filter.operator} ${filter.value}`,
163
+ onClick: () => {
164
+ const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
165
+ if (!exists) {
166
+ model.addFilterToParent(filter);
167
+ }
168
+ }
169
+ }));
170
+ return /* @__PURE__ */ React.createElement(DrilldownRecommendations, { recentDrilldowns, recommendedDrilldowns });
171
+ }
172
+
173
+ export { AdHocFiltersRecommendations };
174
+ //# sourceMappingURL=AdHocFiltersRecommendations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdHocFiltersRecommendations.js","sources":["../../../../../../../src/variables/adhoc/AdHocFiltersRecommendations.tsx"],"sourcesContent":["import React from 'react';\nimport { config } from '@grafana/runtime';\nimport {\n // @ts-expect-error (temporary till we update grafana/data)\n DrilldownsApplicability,\n store,\n} from '@grafana/data';\nimport { Unsubscribable } from 'rxjs';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneComponentProps, SceneDataQuery, SceneObjectState } from '../../core/types';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { getEnrichedDataRequest } from '../../querying/getEnrichedDataRequest';\nimport { getQueriesForVariables } from '../utils';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { getDataSource } from '../../utils/getDataSource';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { DrilldownRecommendations, DrilldownPill } from '../components/DrilldownRecommendations';\nimport { ScopesVariable } from '../variants/ScopesVariable';\nimport { SCOPES_VARIABLE_NAME } from '../constants';\nimport {\n AdHocFilterWithLabels,\n AdHocFiltersVariable,\n getRecentFiltersKey,\n MAX_RECENT_DRILLDOWNS,\n MAX_STORED_RECENT_DRILLDOWNS,\n} from './AdHocFiltersVariable';\n\nexport interface AdHocFiltersRecommendationsState extends SceneObjectState {\n /** Recent filters */\n recentFilters?: AdHocFilterWithLabels[];\n /** Recommended filters */\n recommendedFilters?: AdHocFilterWithLabels[];\n}\n\n/**\n * Scene object component that manages recommendations for AdHocFiltersVariable.\n * It handles fetching recommended drilldowns, verifying applicability of recent filters,\n * and storing/displaying recent filters.\n */\nexport class AdHocFiltersRecommendations extends SceneObjectBase<AdHocFiltersRecommendationsState> {\n static Component = AdHocFiltersRecommendationsRenderer;\n\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n\n // Store parent as a class property, not in state, to avoid circular parent references\n private _parentVariable: AdHocFiltersVariable;\n\n public constructor(parent: AdHocFiltersVariable) {\n super({});\n this._parentVariable = parent;\n this.addActivationHandler(this._activationHandler);\n }\n\n /**\n * Get the parent variable\n */\n public get parent(): AdHocFiltersVariable {\n return this._parentVariable;\n }\n\n private _activationHandler = () => {\n const json = store.get(this._getStorageKey());\n const storedFilters = json ? JSON.parse(json) : [];\n\n // Verify applicability of stored recent filters\n if (storedFilters.length > 0) {\n this._verifyRecentFiltersApplicability(storedFilters);\n } else {\n this.setState({ recentFilters: [] });\n }\n\n this._fetchRecommendedDrilldowns();\n\n // Subscribe to scopes variable changes\n const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this);\n let scopesSubscription: Unsubscribable | undefined;\n\n if (scopesVariable instanceof ScopesVariable) {\n scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {\n // Check if scopes have changed\n if (newState.scopes !== prevState.scopes) {\n const json = store.get(this._getStorageKey());\n const storedFilters = json ? JSON.parse(json) : [];\n\n if (storedFilters.length > 0) {\n this._verifyRecentFiltersApplicability(storedFilters);\n }\n }\n });\n }\n\n return () => {\n scopesSubscription?.unsubscribe();\n };\n };\n\n private _getStorageKey(): string {\n return getRecentFiltersKey(this._parentVariable.state.datasource?.uid);\n }\n\n private async _fetchRecommendedDrilldowns() {\n const parent = this._parentVariable;\n const ds = await getDataSource(parent.state.datasource, this._scopedVars);\n\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getRecommendedDrilldowns) {\n return;\n }\n\n const queries = parent.state.useQueriesAsFilterForOptions ? getQueriesForVariables(parent) : undefined;\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const scopes = sceneGraph.getScopes(this);\n const filters = [...(parent.state.originFilters ?? []), ...parent.state.filters];\n\n const enrichedRequest = getEnrichedDataRequest(this);\n const dashboardUid = enrichedRequest?.dashboardUID;\n\n try {\n // @ts-expect-error (temporary till we update grafana/data)\n const recommendedDrilldowns = await ds.getRecommendedDrilldowns({\n timeRange,\n dashboardUid,\n queries: queries ?? [],\n filters,\n scopes,\n userId: config.bootData.user.id,\n });\n\n if (recommendedDrilldowns?.filters) {\n this.setState({ recommendedFilters: recommendedDrilldowns.filters });\n }\n } catch (error) {\n console.error('Failed to fetch recommended drilldowns:', error);\n }\n }\n\n private async _verifyRecentFiltersApplicability(storedFilters: AdHocFilterWithLabels[]) {\n const parent = this._parentVariable;\n const queries = parent.state.useQueriesAsFilterForOptions ? getQueriesForVariables(parent) : undefined;\n const response = await this._getFiltersApplicabilityForQueries(storedFilters, queries ?? []);\n\n if (!response) {\n this.setState({ recentFilters: storedFilters.slice(-MAX_RECENT_DRILLDOWNS) });\n return;\n }\n\n const applicabilityMap = new Map<string, boolean>();\n response.forEach((item: DrilldownsApplicability) => {\n applicabilityMap.set(item.key, item.applicable !== false);\n });\n\n const applicableFilters = storedFilters\n .filter((f) => {\n const isApplicable = applicabilityMap.get(f.key);\n return isApplicable === undefined || isApplicable === true;\n })\n .slice(-MAX_RECENT_DRILLDOWNS);\n\n this.setState({ recentFilters: applicableFilters });\n }\n\n private async _getFiltersApplicabilityForQueries(\n filters: AdHocFilterWithLabels[],\n queries: SceneDataQuery[]\n ): Promise<DrilldownsApplicability[] | undefined> {\n const parent = this._parentVariable;\n const ds = await getDataSource(parent.state.datasource, this._scopedVars);\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getDrilldownsApplicability) {\n return;\n }\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n\n // @ts-expect-error (temporary till we update grafana/data)\n return await ds.getDrilldownsApplicability({\n filters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n }\n\n /**\n * Stores a recent filter in localStorage and updates state.\n * Should be called by the parent variable when a filter is added/updated.\n */\n public storeRecentFilter(filter: AdHocFilterWithLabels) {\n const key = this._getStorageKey();\n const storedFilters = store.get(key);\n const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];\n\n const updatedStoredFilters = [...allRecentFilters, filter].slice(-MAX_STORED_RECENT_DRILLDOWNS);\n store.set(key, JSON.stringify(updatedStoredFilters));\n\n const parent = this._parentVariable;\n const existingFilter = parent.state.filters.find((f) => f.key === filter.key && !Boolean(f.nonApplicable));\n if (existingFilter && !Boolean(existingFilter.nonApplicable)) {\n this.setState({ recentFilters: updatedStoredFilters.slice(-MAX_RECENT_DRILLDOWNS) });\n }\n }\n\n /**\n * Get the current filters from the parent variable\n */\n public getParentFilters(): AdHocFilterWithLabels[] {\n return this._parentVariable.state.filters;\n }\n\n /**\n * Add a filter to the parent variable\n */\n public addFilterToParent(filter: AdHocFilterWithLabels) {\n const parent = this._parentVariable;\n parent.updateFilters([...parent.state.filters, filter]);\n }\n}\n\nfunction AdHocFiltersRecommendationsRenderer({ model }: SceneComponentProps<AdHocFiltersRecommendations>) {\n const { recentFilters, recommendedFilters } = model.useState();\n const { filters } = model.parent.useState();\n\n const recentDrilldowns: DrilldownPill[] | undefined = recentFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\n model.addFilterToParent(filter);\n },\n }));\n\n const recommendedDrilldowns: DrilldownPill[] | undefined = recommendedFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\n // Check if filter already exists\n const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);\n if (!exists) {\n model.addFilterToParent(filter);\n }\n },\n }));\n\n return <DrilldownRecommendations recentDrilldowns={recentDrilldowns} recommendedDrilldowns={recommendedDrilldowns} />;\n}\n"],"names":["json","storedFilters"],"mappings":"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"}
@@ -19,8 +19,10 @@ import { VariableDependencyConfig } from '../VariableDependencyConfig.js';
19
19
  import { getQueryController } from '../../core/sceneGraph/getQueryController.js';
20
20
  import { FILTER_RESTORED_INTERACTION, FILTER_REMOVED_INTERACTION } from '../../performance/interactionConstants.js';
21
21
  import { AdHocFiltersVariableController } from './controller/AdHocFiltersVariableController.js';
22
+ import { AdHocFiltersRecommendations } from './AdHocFiltersRecommendations.js';
22
23
 
23
24
  const ORIGIN_FILTERS_KEY = "originFilters";
25
+ const getRecentFiltersKey = (datasourceUid) => `grafana.filters.recent.${datasourceUid != null ? datasourceUid : "default"}`;
24
26
  const OPERATORS = [
25
27
  {
26
28
  value: "=",
@@ -95,6 +97,11 @@ class AdHocFiltersVariable extends SceneObjectBase {
95
97
  this._debouncedVerifyApplicability = debounce(this._verifyApplicability, 100);
96
98
  this._activationHandler = () => {
97
99
  this._debouncedVerifyApplicability();
100
+ if (this.state.drilldownRecommendationsEnabled && !this.state._valueRecommendations) {
101
+ const valueRecommendations = new AdHocFiltersRecommendations(this);
102
+ this.setState({ _valueRecommendations: valueRecommendations });
103
+ valueRecommendations.activate();
104
+ }
98
105
  return () => {
99
106
  var _a;
100
107
  (_a = this.state.originFilters) == null ? void 0 : _a.forEach((filter) => {
@@ -164,6 +171,13 @@ class AdHocFiltersVariable extends SceneObjectBase {
164
171
  this._prevScopes = scopes;
165
172
  this._debouncedVerifyApplicability();
166
173
  }
174
+ async verifyApplicabilityAndStoreRecentFilter(update) {
175
+ await this._verifyApplicability();
176
+ if (!this.state.drilldownRecommendationsEnabled || !this.state._valueRecommendations) {
177
+ return;
178
+ }
179
+ this.state._valueRecommendations.storeRecentFilter(update);
180
+ }
167
181
  setState(update) {
168
182
  var _a, _b;
169
183
  let filterExpressionChanged = false;
@@ -255,8 +269,11 @@ class AdHocFiltersVariable extends SceneObjectBase {
255
269
  }
256
270
  if (filter === _wip) {
257
271
  if ("value" in update && update["value"] !== "") {
258
- this.setState({ filters: [...filters, { ..._wip, ...update }], _wip: void 0 });
259
- this._debouncedVerifyApplicability();
272
+ this.setState({
273
+ filters: [...filters, { ..._wip, ...update }],
274
+ _wip: void 0
275
+ });
276
+ this.verifyApplicabilityAndStoreRecentFilter({ ..._wip, ...update });
260
277
  } else {
261
278
  this.setState({ _wip: { ...filter, ...update } });
262
279
  }
@@ -266,6 +283,12 @@ class AdHocFiltersVariable extends SceneObjectBase {
266
283
  return f === filter ? { ...f, ...update } : f;
267
284
  });
268
285
  this.setState({ filters: updatedFilters });
286
+ if (this.state.drilldownRecommendationsEnabled && this.state._valueRecommendations) {
287
+ this.state._valueRecommendations.storeRecentFilter({
288
+ ...filter,
289
+ ...update
290
+ });
291
+ }
269
292
  }
270
293
  updateToMatchAll(filter) {
271
294
  this._updateFilter(filter, {
@@ -456,11 +479,12 @@ class AdHocFiltersVariable extends SceneObjectBase {
456
479
  let scopes = sceneGraph.getScopes(this);
457
480
  if (filter.origin === "scope") {
458
481
  scopes = scopes == null ? void 0 : scopes.map((scope) => {
482
+ var _a2;
459
483
  return {
460
484
  ...scope,
461
485
  spec: {
462
486
  ...scope.spec,
463
- filters: scope.spec.filters.filter((f) => f.key !== filter.key)
487
+ filters: (_a2 = scope.spec.filters) == null ? void 0 : _a2.filter((f) => f.key !== filter.key)
464
488
  }
465
489
  };
466
490
  });
@@ -563,5 +587,5 @@ function isMultiValueOperator(operatorValue) {
563
587
  return Boolean(operator.isMulti);
564
588
  }
565
589
 
566
- export { AdHocFiltersVariable, AdHocFiltersVariableRenderer, OPERATORS, isFilterApplicable, isFilterComplete, isMatchAllFilter, isMultiValueOperator, toSelectableValue };
590
+ export { AdHocFiltersVariable, AdHocFiltersVariableRenderer, OPERATORS, getRecentFiltersKey, isFilterApplicable, isFilterComplete, isMatchAllFilter, isMultiValueOperator, toSelectableValue };
567
591
  //# sourceMappingURL=AdHocFiltersVariable.js.map