@grafana/scenes 6.50.0--canary.1315.20127970450.0 → 6.50.0--canary.1312.20166599404.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 (21) 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/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +21 -1
  6. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js.map +1 -1
  7. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersVariable.js +32 -4
  8. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
  9. package/dist/esm/packages/scenes/src/variables/adhoc/controller/AdHocFiltersVariableController.js +7 -1
  10. package/dist/esm/packages/scenes/src/variables/adhoc/controller/AdHocFiltersVariableController.js.map +1 -1
  11. package/dist/esm/packages/scenes/src/variables/components/DrilldownRecommendations.js +102 -0
  12. package/dist/esm/packages/scenes/src/variables/components/DrilldownRecommendations.js.map +1 -0
  13. package/dist/esm/packages/scenes/src/variables/groupby/GroupByVariable.js +105 -6
  14. package/dist/esm/packages/scenes/src/variables/groupby/GroupByVariable.js.map +1 -1
  15. package/dist/esm/packages/scenes/src/variables/types.js.map +1 -1
  16. package/dist/{grafana-scenes-D5iZGLtK.js → grafana-scenes-UNv1YXap.js} +8 -1
  17. package/dist/{grafana-scenes-D5iZGLtK.js.map → grafana-scenes-UNv1YXap.js.map} +1 -1
  18. package/dist/index.d.ts +53 -2
  19. package/dist/index.js +4821 -4578
  20. package/dist/index.js.map +1 -1
  21. package/package.json +2 -2
@@ -0,0 +1,102 @@
1
+ import { useStyles2, ClickOutsideWrapper, Stack, Text, IconButton, Popover } from '@grafana/ui';
2
+ import React, { useState, useRef } from 'react';
3
+ import { css, cx } from '@emotion/css';
4
+ import { Trans, t } from '@grafana/i18n';
5
+
6
+ function DrilldownRecommendations({ recentDrilldowns, recommendedDrilldowns }) {
7
+ const styles = useStyles2(getStyles);
8
+ const [isPopoverVisible, setPopoverVisible] = useState(false);
9
+ const ref = useRef(null);
10
+ const openPopover = () => {
11
+ setPopoverVisible(true);
12
+ };
13
+ const onClickAction = (action) => {
14
+ action();
15
+ setPopoverVisible(false);
16
+ };
17
+ const content = /* @__PURE__ */ React.createElement(ClickOutsideWrapper, { onClick: () => setPopoverVisible(false), useCapture: true }, /* @__PURE__ */ React.createElement("div", { className: styles.menuContainer, onClick: (ev) => ev.stopPropagation() }, /* @__PURE__ */ React.createElement(Stack, { direction: "column" }, /* @__PURE__ */ React.createElement(Text, { weight: "bold", variant: "bodySmall", color: "secondary" }, /* @__PURE__ */ React.createElement(Trans, { i18nKey: "grafana-scenes.components.drilldown-recommendations.recent" }, "Recent")), recentDrilldowns && recentDrilldowns.length > 0 ? recentDrilldowns.map((drilldown) => /* @__PURE__ */ React.createElement(
18
+ "div",
19
+ {
20
+ key: drilldown.label,
21
+ className: cx(styles.combinedFilterPill),
22
+ onClick: () => onClickAction(drilldown.onClick)
23
+ },
24
+ drilldown.label
25
+ )) : /* @__PURE__ */ React.createElement("div", { className: styles.emptyMessage }, /* @__PURE__ */ React.createElement(Trans, { i18nKey: "grafana-scenes.components.drilldown-recommendations.recent-empty" }, "No recent values")), /* @__PURE__ */ React.createElement(Text, { weight: "bold", variant: "bodySmall", color: "secondary" }, /* @__PURE__ */ React.createElement(Trans, { i18nKey: "grafana-scenes.components.drilldown-recommendations.recommended" }, "Recommended")), recommendedDrilldowns && recommendedDrilldowns.length > 0 ? recommendedDrilldowns.map((drilldown) => /* @__PURE__ */ React.createElement(
26
+ "div",
27
+ {
28
+ key: drilldown.label,
29
+ className: cx(styles.combinedFilterPill),
30
+ onClick: () => onClickAction(drilldown.onClick)
31
+ },
32
+ drilldown.label
33
+ )) : /* @__PURE__ */ React.createElement("div", { className: styles.emptyMessage }, /* @__PURE__ */ React.createElement(Trans, { i18nKey: "grafana-scenes.components.drilldown-recommendations.recommended-empty" }, "No reccomended values")))));
34
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
35
+ IconButton,
36
+ {
37
+ name: "plus",
38
+ tooltip: t("grafana-scenes.components.drilldown-recommendations.tooltip", "Show recommendations"),
39
+ ref,
40
+ className: cx(isPopoverVisible && styles.iconActive),
41
+ onClick: (ev) => {
42
+ openPopover();
43
+ ev.stopPropagation();
44
+ }
45
+ }
46
+ ), isPopoverVisible && ref.current && /* @__PURE__ */ React.createElement(
47
+ Popover,
48
+ {
49
+ content,
50
+ onKeyDown: (event) => {
51
+ if (event.key === " ") {
52
+ event.stopPropagation();
53
+ }
54
+ },
55
+ placement: "bottom-start",
56
+ referenceElement: ref.current,
57
+ show: true
58
+ }
59
+ ));
60
+ }
61
+ const getStyles = (theme) => ({
62
+ menuContainer: css({
63
+ display: "flex",
64
+ flexDirection: "column",
65
+ background: theme.colors.background.elevated,
66
+ border: `1px solid ${theme.colors.border.weak}`,
67
+ borderRadius: theme.shape.radius.default,
68
+ boxShadow: theme.shadows.z3,
69
+ padding: theme.spacing(2)
70
+ }),
71
+ combinedFilterPill: css({
72
+ alignItems: "center",
73
+ background: theme.colors.action.selected,
74
+ borderRadius: theme.shape.radius.default,
75
+ border: `1px solid ${theme.colors.border.weak}`,
76
+ padding: theme.spacing(0.2, 1),
77
+ color: theme.colors.text.primary,
78
+ overflow: "hidden",
79
+ whiteSpace: "nowrap",
80
+ minHeight: theme.spacing(2.75),
81
+ ...theme.typography.bodySmall,
82
+ fontWeight: theme.typography.fontWeightBold,
83
+ cursor: "pointer",
84
+ "&:hover": {
85
+ background: theme.colors.action.hover
86
+ }
87
+ }),
88
+ iconActive: css({
89
+ "&:before": {
90
+ backgroundColor: theme.colors.action.hover,
91
+ opacity: 1
92
+ }
93
+ }),
94
+ emptyMessage: css({
95
+ padding: theme.spacing(2),
96
+ textAlign: "center",
97
+ color: theme.colors.text.secondary
98
+ })
99
+ });
100
+
101
+ export { DrilldownRecommendations };
102
+ //# sourceMappingURL=DrilldownRecommendations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrilldownRecommendations.js","sources":["../../../../../../../src/variables/components/DrilldownRecommendations.tsx"],"sourcesContent":["import { ClickOutsideWrapper, IconButton, Popover, Stack, Text, useStyles2 } from '@grafana/ui';\nimport React, { useRef, useState } from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { Trans, t } from '@grafana/i18n';\n\nexport interface DrilldownPill {\n label: string;\n onClick: () => void;\n}\n\ninterface Props {\n recentDrilldowns?: DrilldownPill[];\n recommendedDrilldowns?: DrilldownPill[];\n}\n\nexport function DrilldownRecommendations({ recentDrilldowns, recommendedDrilldowns }: Props) {\n const styles = useStyles2(getStyles);\n\n const [isPopoverVisible, setPopoverVisible] = useState<boolean>(false);\n const ref = useRef<HTMLButtonElement>(null);\n\n const openPopover = () => {\n setPopoverVisible(true);\n };\n\n const onClickAction = (action: () => void) => {\n action();\n setPopoverVisible(false);\n };\n\n const content = (\n <ClickOutsideWrapper onClick={() => setPopoverVisible(false)} useCapture={true}>\n <div className={styles.menuContainer} onClick={(ev) => ev.stopPropagation()}>\n <Stack direction=\"column\">\n <Text weight=\"bold\" variant=\"bodySmall\" color=\"secondary\">\n <Trans i18nKey=\"grafana-scenes.components.drilldown-recommendations.recent\">Recent</Trans>\n </Text>\n {recentDrilldowns && recentDrilldowns.length > 0 ? (\n recentDrilldowns.map((drilldown) => (\n <div\n key={drilldown.label}\n className={cx(styles.combinedFilterPill)}\n onClick={() => onClickAction(drilldown.onClick)}\n >\n {drilldown.label}\n </div>\n ))\n ) : (\n <div className={styles.emptyMessage}>\n <Trans i18nKey=\"grafana-scenes.components.drilldown-recommendations.recent-empty\">No recent values</Trans>\n </div>\n )}\n <Text weight=\"bold\" variant=\"bodySmall\" color=\"secondary\">\n <Trans i18nKey=\"grafana-scenes.components.drilldown-recommendations.recommended\">Recommended</Trans>\n </Text>\n {recommendedDrilldowns && recommendedDrilldowns.length > 0 ? (\n recommendedDrilldowns.map((drilldown) => (\n <div\n key={drilldown.label}\n className={cx(styles.combinedFilterPill)}\n onClick={() => onClickAction(drilldown.onClick)}\n >\n {drilldown.label}\n </div>\n ))\n ) : (\n <div className={styles.emptyMessage}>\n <Trans i18nKey=\"grafana-scenes.components.drilldown-recommendations.recommended-empty\">\n No reccomended values\n </Trans>\n </div>\n )}\n </Stack>\n </div>\n </ClickOutsideWrapper>\n );\n\n return (\n <>\n <IconButton\n name=\"plus\"\n tooltip={t('grafana-scenes.components.drilldown-recommendations.tooltip', 'Show recommendations')}\n ref={ref}\n className={cx(isPopoverVisible && styles.iconActive)}\n onClick={(ev) => {\n openPopover();\n ev.stopPropagation();\n }}\n />\n\n {isPopoverVisible && ref.current && (\n <Popover\n content={content}\n onKeyDown={(event) => {\n if (event.key === ' ') {\n event.stopPropagation();\n }\n }}\n placement=\"bottom-start\"\n referenceElement={ref.current}\n show\n />\n )}\n </>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n menuContainer: css({\n display: 'flex',\n flexDirection: 'column',\n background: theme.colors.background.elevated,\n border: `1px solid ${theme.colors.border.weak}`,\n borderRadius: theme.shape.radius.default,\n boxShadow: theme.shadows.z3,\n padding: theme.spacing(2),\n }),\n combinedFilterPill: css({\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.2, 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 iconActive: css({\n '&:before': {\n backgroundColor: theme.colors.action.hover,\n opacity: 1,\n },\n }),\n emptyMessage: css({\n padding: theme.spacing(2),\n textAlign: 'center',\n color: theme.colors.text.secondary,\n }),\n});\n"],"names":[],"mappings":"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"}
@@ -1,14 +1,15 @@
1
1
  import { t } from '@grafana/i18n';
2
2
  import React, { useMemo, useState, useEffect } from 'react';
3
+ import { store } from '@grafana/data';
3
4
  import { allActiveGroupByVariables } from './findActiveGroupByVariablesByUid.js';
4
5
  import { sceneGraph } from '../../core/sceneGraph/index.js';
5
6
  import { SceneVariableValueChangedEvent } from '../types.js';
6
7
  import { MultiValueVariable } from '../variants/MultiValueVariable.js';
7
- import { lastValueFrom, map, of, from, mergeMap, tap, take } from 'rxjs';
8
+ import { map, of, from, mergeMap, tap, take, lastValueFrom } from 'rxjs';
8
9
  import { getDataSource } from '../../utils/getDataSource.js';
9
- import { MultiSelect, Select } from '@grafana/ui';
10
+ import { useStyles2, MultiSelect, Select } from '@grafana/ui';
10
11
  import { isArray, isEqual } from 'lodash';
11
- import { handleOptionGroups, dataFromResponse, getQueriesForVariables, responseHasError } from '../utils.js';
12
+ import { dataFromResponse, getQueriesForVariables, responseHasError, handleOptionGroups } from '../utils.js';
12
13
  import { OptionWithCheckbox } from '../components/VariableValueSelect.js';
13
14
  import { GroupByVariableUrlSyncHandler } from './GroupByVariableUrlSyncHandler.js';
14
15
  import { getOptionSearcher } from '../components/getOptionSearcher.js';
@@ -18,8 +19,12 @@ import { DefaultGroupByCustomIndicatorContainer } from './DefaultGroupByCustomIn
18
19
  import { GroupByValueContainer } from './GroupByValueContainer.js';
19
20
  import { getInteractionTracker } from '../../core/sceneGraph/getInteractionTracker.js';
20
21
  import { GROUPBY_DIMENSIONS_INTERACTION } from '../../performance/interactionConstants.js';
22
+ import '../adhoc/AdHocFiltersVariable.js';
23
+ import { DrilldownRecommendations } from '../components/DrilldownRecommendations.js';
24
+ import { css, cx } from '@emotion/css';
21
25
  import { c as components } from '../../../../../node_modules/react-select/dist/index-641ee5b8.esm.js';
22
26
 
27
+ const RECENT_GROUPING_KEY = "grafana.grouping.recent";
23
28
  class GroupByVariable extends MultiValueVariable {
24
29
  constructor(initialState) {
25
30
  super({
@@ -37,6 +42,7 @@ class GroupByVariable extends MultiValueVariable {
37
42
  noValueOnClear: true
38
43
  });
39
44
  this.isLazy = true;
45
+ this._store = store;
40
46
  this._urlSync = new GroupByVariableUrlSyncHandler(this);
41
47
  this._activationHandler = () => {
42
48
  this._verifyApplicability();
@@ -93,6 +99,12 @@ class GroupByVariable extends MultiValueVariable {
93
99
  if (this.state.defaultValue) {
94
100
  this.changeValueTo(this.state.defaultValue.value, this.state.defaultValue.text, false);
95
101
  }
102
+ if (this.state.drilldownRecommendationsEnabled) {
103
+ const json = this._store.get(RECENT_GROUPING_KEY);
104
+ this.setState({
105
+ _recentGrouping: json ? JSON.parse(json) : []
106
+ });
107
+ }
96
108
  if (this.state.applyMode === "auto") {
97
109
  this.addActivationHandler(() => {
98
110
  allActiveGroupByVariables.add(this);
@@ -219,6 +231,22 @@ class GroupByVariable extends MultiValueVariable {
219
231
  }
220
232
  this.changeValueTo(this.state.defaultValue.value, this.state.defaultValue.text, true);
221
233
  }
234
+ prepareRecentGrouping(value) {
235
+ var _a;
236
+ if (!this.state.drilldownRecommendationsEnabled) {
237
+ return [];
238
+ }
239
+ const recentGrouping = [...(_a = this.state._recentGrouping) != null ? _a : [], { value: value.value, text: value.label }].slice(
240
+ -3
241
+ );
242
+ this._store.set(RECENT_GROUPING_KEY, JSON.stringify(recentGrouping));
243
+ return recentGrouping;
244
+ }
245
+ setRecommendedGrouping(recommendedGrouping) {
246
+ this.setState({
247
+ _recommendedGrouping: recommendedGrouping.map((key) => ({ value: key, text: key }))
248
+ });
249
+ }
222
250
  /**
223
251
  * Allows clearing the value of the variable to an empty value. Overrides default behavior of a MultiValueVariable
224
252
  */
@@ -239,8 +267,12 @@ function GroupByVariableRenderer({ model }) {
239
267
  includeAll,
240
268
  allowCustomValue = true,
241
269
  defaultValue,
242
- keysApplicability
270
+ keysApplicability,
271
+ _recentGrouping,
272
+ _recommendedGrouping,
273
+ drilldownRecommendationsEnabled
243
274
  } = model.useState();
275
+ const styles = useStyles2(getStyles);
244
276
  const values = useMemo(() => {
245
277
  const arrayValue = isArray(value) ? value : [value];
246
278
  const arrayText = isArray(text) ? text : [text];
@@ -279,7 +311,7 @@ function GroupByVariableRenderer({ model }) {
279
311
  () => handleOptionGroups(optionSearcher(inputValue).map(toSelectableValue)),
280
312
  [optionSearcher, inputValue]
281
313
  );
282
- return isMulti ? /* @__PURE__ */ React.createElement(
314
+ const select = isMulti ? /* @__PURE__ */ React.createElement(
283
315
  MultiSelect,
284
316
  {
285
317
  "aria-label": t(
@@ -293,6 +325,7 @@ function GroupByVariableRenderer({ model }) {
293
325
  "Group by label"
294
326
  ),
295
327
  width: "auto",
328
+ className: cx(drilldownRecommendationsEnabled && styles.seelctStylesInWrapper),
296
329
  allowCustomValue,
297
330
  inputValue,
298
331
  value: uncommittedValue,
@@ -332,6 +365,11 @@ function GroupByVariableRenderer({ model }) {
332
365
  if (action.action === "clear" && noValueOnClear) {
333
366
  model.changeValueTo([], void 0, true);
334
367
  }
368
+ if (action.action === "select-option" && action.option) {
369
+ model.setState({
370
+ _recentGrouping: model.prepareRecentGrouping(action.option)
371
+ });
372
+ }
335
373
  setUncommittedValue(newValue);
336
374
  setInputValue("");
337
375
  },
@@ -362,6 +400,7 @@ function GroupByVariableRenderer({ model }) {
362
400
  "Group by label"
363
401
  ),
364
402
  width: "auto",
403
+ className: cx(drilldownRecommendationsEnabled && styles.seelctStylesInWrapper),
365
404
  inputValue,
366
405
  value: uncommittedValue && uncommittedValue.length > 0 ? uncommittedValue : null,
367
406
  allowCustomValue,
@@ -390,6 +429,9 @@ function GroupByVariableRenderer({ model }) {
390
429
  if (newValue == null ? void 0 : newValue.value) {
391
430
  setUncommittedValue([newValue]);
392
431
  model.changeValueTo([newValue.value], newValue.label ? [newValue.label] : void 0);
432
+ model.setState({
433
+ _recentGrouping: model.prepareRecentGrouping(newValue)
434
+ });
393
435
  }
394
436
  },
395
437
  onOpenMenu: async () => {
@@ -406,6 +448,38 @@ function GroupByVariableRenderer({ model }) {
406
448
  }
407
449
  }
408
450
  );
451
+ if (!drilldownRecommendationsEnabled) {
452
+ return select;
453
+ }
454
+ const recentDrilldowns = _recentGrouping == null ? void 0 : _recentGrouping.map((groupBy) => ({
455
+ label: `${groupBy.value}`,
456
+ onClick: () => {
457
+ var _a;
458
+ if (values.map((x) => x.value).includes(groupBy.value)) {
459
+ return;
460
+ }
461
+ model.changeValueTo(
462
+ [...values.map((x) => x.value), groupBy.value],
463
+ [...values.map((x) => x.label), (_a = groupBy.text) != null ? _a : groupBy.value],
464
+ true
465
+ );
466
+ }
467
+ }));
468
+ const recommendedDrilldowns = _recommendedGrouping == null ? void 0 : _recommendedGrouping.map((groupBy) => ({
469
+ label: `${groupBy.value}`,
470
+ onClick: () => {
471
+ var _a;
472
+ if (values.map((x) => x.value).includes(groupBy.value)) {
473
+ return;
474
+ }
475
+ model.changeValueTo(
476
+ [...values.map((x) => x.value), groupBy.value],
477
+ [...values.map((x) => x.label), (_a = groupBy.text) != null ? _a : groupBy.value],
478
+ true
479
+ );
480
+ }
481
+ }));
482
+ return /* @__PURE__ */ React.createElement("div", { className: styles.wrapper }, /* @__PURE__ */ React.createElement("div", { className: styles.recommendations }, /* @__PURE__ */ React.createElement(DrilldownRecommendations, { recentDrilldowns, recommendedDrilldowns })), select);
409
483
  }
410
484
  const filterNoOp = () => true;
411
485
  function WideMenu(props) {
@@ -422,6 +496,31 @@ function toSelectableValue(input) {
422
496
  }
423
497
  return result;
424
498
  }
499
+ const getStyles = (theme) => ({
500
+ wrapper: css({
501
+ display: "flex"
502
+ }),
503
+ seelctStylesInWrapper: css({
504
+ borderTopLeftRadius: 0,
505
+ borderBottomLeftRadius: 0,
506
+ border: `1px solid ${theme.colors.border.strong}`,
507
+ borderLeft: "none"
508
+ }),
509
+ recommendations: css({
510
+ display: "flex",
511
+ alignItems: "center",
512
+ paddingInline: theme.spacing(0.5),
513
+ borderTop: `1px solid ${theme.colors.border.strong}`,
514
+ borderBottom: `1px solid ${theme.colors.border.strong}`,
515
+ backgroundColor: theme.components.input.background,
516
+ "& button": {
517
+ borderRadius: 0,
518
+ height: "100%",
519
+ margin: 0,
520
+ paddingInline: theme.spacing(0.5)
521
+ }
522
+ })
523
+ });
425
524
 
426
- export { GroupByVariable, GroupByVariableRenderer };
525
+ export { GroupByVariable, GroupByVariableRenderer, RECENT_GROUPING_KEY };
427
526
  //# sourceMappingURL=GroupByVariable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupByVariable.js","sources":["../../../../../../../src/variables/groupby/GroupByVariable.tsx"],"sourcesContent":["import { t } from '@grafana/i18n';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n AdHocVariableFilter,\n DataSourceApi,\n // @ts-expect-error (temporary till we update grafana/data)\n DrilldownsApplicability,\n GetTagResponse,\n MetricFindValue,\n SelectableValue,\n} from '@grafana/data';\nimport { allActiveGroupByVariables } from './findActiveGroupByVariablesByUid';\nimport { DataSourceRef, VariableType } from '@grafana/schema';\nimport { SceneComponentProps, ControlsLayout, SceneObjectUrlSyncHandler, SceneDataQuery } from '../../core/types';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport {\n SceneVariableValueChangedEvent,\n ValidateAndUpdateResult,\n VariableValue,\n VariableValueOption,\n VariableValueSingle,\n} from '../types';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../variants/MultiValueVariable';\nimport { from, lastValueFrom, map, mergeMap, Observable, of, take, tap } from 'rxjs';\nimport { getDataSource } from '../../utils/getDataSource';\nimport { InputActionMeta, MultiSelect, Select } from '@grafana/ui';\nimport { components, GroupBase, MenuProps } from 'react-select';\nimport { isArray, isEqual } from 'lodash';\nimport { dataFromResponse, getQueriesForVariables, handleOptionGroups, responseHasError } from '../utils';\nimport { OptionWithCheckbox } from '../components/VariableValueSelect';\nimport { GroupByVariableUrlSyncHandler } from './GroupByVariableUrlSyncHandler';\nimport { getOptionSearcher } from '../components/getOptionSearcher';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { DefaultGroupByCustomIndicatorContainer } from './DefaultGroupByCustomIndicatorContainer';\nimport { GroupByValueContainer, GroupByContainerProps } from './GroupByValueContainer';\nimport { getInteractionTracker } from '../../core/sceneGraph/getInteractionTracker';\nimport { GROUPBY_DIMENSIONS_INTERACTION } from '../../performance/interactionConstants';\n\nexport interface GroupByVariableState extends MultiValueVariableState {\n /** Defaults to \"Group\" */\n name: string;\n /** The visible keys to group on */\n // TODO review this type and name (naming is hard)\n defaultOptions?: MetricFindValue[];\n /** Base filters to always apply when looking up keys */\n baseFilters?: AdHocVariableFilter[];\n /** Datasource to use for getTagKeys and also controls which scene queries the group by should apply to */\n datasource: DataSourceRef | null;\n /** Default value set for this groupBy. When this field is set, changing value will allow the user to restore back to this default value */\n defaultValue?: { text: VariableValue; value: VariableValue };\n /** Needed for url sync when passing flag to another dashboard */\n restorable?: boolean;\n /** Controls if the group by can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n * Vertical layout does not yet support operator selector.\n */\n layout?: ControlsLayout;\n /**\n * Defaults to same-datasource which means group by will automatically be applied to all queries with the same data source as this GroupBySet.\n * In manual mode no queries are re-run on changes, and you have to manually apply the filter to whatever queries you want.\n */\n applyMode?: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Holds the applicability for each of the selected keys\n */\n keysApplicability?: DrilldownsApplicability[];\n /**\n * state for checking whether drilldown applicability is enabled\n */\n applicabilityEnabled?: boolean;\n}\n\nexport type getTagKeysProvider = (\n set: GroupByVariable,\n currentKey: string | null\n) => Promise<{ replace?: boolean; values: MetricFindValue[] | GetTagResponse }>;\n\nexport class GroupByVariable extends MultiValueVariable<GroupByVariableState> {\n static Component = GroupByVariableRenderer;\n isLazy = true;\n\n protected _urlSync: SceneObjectUrlSyncHandler = new GroupByVariableUrlSyncHandler(this);\n\n public validateAndUpdate(): Observable<ValidateAndUpdateResult> {\n return this.getValueOptions({}).pipe(\n map((options) => {\n this._updateValueGivenNewOptions(options);\n return {};\n })\n );\n }\n\n private _updateValueGivenNewOptions(options: VariableValueOption[]) {\n const { value: currentValue, text: currentText } = this.state;\n\n const stateUpdate: Partial<MultiValueVariableState> = {\n options,\n loading: false,\n value: currentValue ?? [],\n text: currentText ?? [],\n };\n\n this.setState(stateUpdate);\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n // When default dimensions are provided, return the static list\n if (this.state.defaultOptions) {\n return of(\n this.state.defaultOptions.map((o) => ({\n label: o.text,\n value: String(o.value),\n group: o.group,\n }))\n );\n }\n\n this.setState({ loading: true, error: null });\n\n return from(\n getDataSource(this.state.datasource, {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n })\n ).pipe(\n mergeMap((ds) => {\n return from(this._getKeys(ds)).pipe(\n tap((response) => {\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n }),\n map((response) => dataFromResponse(response)),\n take(1),\n mergeMap((data) => {\n const a: VariableValueOption[] = data.map((i) => {\n return {\n label: i.text,\n value: i.value ? String(i.value) : i.text,\n group: i.group,\n };\n });\n return of(a);\n })\n );\n })\n );\n }\n\n public constructor(initialState: Partial<GroupByVariableState>) {\n super({\n isMulti: true,\n name: '',\n value: [],\n text: [],\n options: [],\n datasource: null,\n baseFilters: [],\n applyMode: 'auto',\n layout: 'horizontal',\n type: 'groupby' as VariableType,\n ...initialState,\n noValueOnClear: true,\n });\n\n if (this.state.defaultValue) {\n this.changeValueTo(this.state.defaultValue.value, this.state.defaultValue.text, false);\n }\n\n if (this.state.applyMode === 'auto') {\n this.addActivationHandler(() => {\n allActiveGroupByVariables.add(this);\n\n return () => allActiveGroupByVariables.delete(this);\n });\n }\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._verifyApplicability();\n\n if (this.state.defaultValue) {\n if (this.checkIfRestorable(this.state.value)) {\n this.setState({ restorable: true });\n }\n }\n\n return () => {\n if (this.state.defaultValue) {\n this.restoreDefaultValues();\n }\n\n this.setState({ applicabilityEnabled: false });\n };\n };\n\n public getApplicableKeys(): VariableValue {\n const { value, keysApplicability } = this.state;\n\n const valueArray = isArray(value) ? value : value ? [value] : [];\n\n if (!keysApplicability || keysApplicability.length === 0) {\n return valueArray;\n }\n\n const applicableValues = valueArray.filter((val) => {\n const applicability = keysApplicability.find((item) => item.key === val);\n return !applicability || applicability.applicable !== false;\n });\n\n return applicableValues;\n }\n\n public async getGroupByApplicabilityForQueries(\n value: VariableValue,\n queries: SceneDataQuery[]\n ): Promise<DrilldownsApplicability[] | undefined> {\n const ds = await getDataSource(this.state.datasource, {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n });\n\n // @ts-expect-error (temporary till we update grafana/data)\n if (!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 groupByKeys: Array.isArray(value) ? value.map((v) => String(v)) : value ? [String(value)] : [],\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n }\n\n public async _verifyApplicability() {\n const queries = getQueriesForVariables(this);\n const value = this.state.value;\n\n const response = await this.getGroupByApplicabilityForQueries(value, queries);\n\n if (!response) {\n return;\n }\n\n if (!isEqual(response, this.state.keysApplicability)) {\n this.setState({ keysApplicability: response ?? undefined, applicabilityEnabled: true });\n\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n } else {\n this.setState({ applicabilityEnabled: true });\n }\n }\n\n // This method is related to the defaultValue property. We check if the current value\n // is different from the default value. If it is, the groupBy will show a button\n // allowing the user to restore the default values.\n public checkIfRestorable(values: VariableValue) {\n const originalValues = isArray(this.state.defaultValue?.value)\n ? this.state.defaultValue?.value\n : this.state.defaultValue?.value\n ? [this.state.defaultValue?.value]\n : [];\n const vals = isArray(values) ? values : [values];\n\n if (vals.length !== originalValues.length) {\n return true;\n }\n\n return !isEqual(vals, originalValues);\n }\n\n public restoreDefaultValues() {\n this.setState({ restorable: false });\n\n if (!this.state.defaultValue) {\n return;\n }\n\n this.changeValueTo(this.state.defaultValue.value, this.state.defaultValue.text, true);\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public _getKeys = async (ds: DataSourceApi) => {\n // TODO: provide current dimensions?\n const override = await this.state.getTagKeysProvider?.(this, null);\n\n if (override && override.replace) {\n return override.values;\n }\n\n if (this.state.defaultOptions) {\n return this.state.defaultOptions.concat(dataFromResponse(override?.values ?? []));\n }\n\n if (!ds.getTagKeys) {\n return [];\n }\n\n const queries = getQueriesForVariables(this);\n\n const otherFilters = this.state.baseFilters || [];\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys;\n };\n\n /**\n * Allows clearing the value of the variable to an empty value. Overrides default behavior of a MultiValueVariable\n */\n public getDefaultMultiState(options: VariableValueOption[]) {\n return { value: [], text: [] };\n }\n}\n\nexport function GroupByVariableRenderer({ model }: SceneComponentProps<GroupByVariable>) {\n const {\n value,\n text,\n key,\n isMulti = true,\n maxVisibleValues,\n noValueOnClear,\n options,\n includeAll,\n allowCustomValue = true,\n defaultValue,\n keysApplicability,\n } = model.useState();\n\n const values = useMemo<Array<SelectableValue<VariableValueSingle>>>(() => {\n const arrayValue = isArray(value) ? value : [value];\n const arrayText = isArray(text) ? text : [text];\n\n return arrayValue.map((value, idx) => ({\n value,\n label: String(arrayText[idx] ?? value),\n }));\n }, [value, text]);\n\n const [isFetchingOptions, setIsFetchingOptions] = useState(false);\n const [isOptionsOpen, setIsOptionsOpen] = useState(false);\n const [inputValue, setInputValue] = useState('');\n\n // To not trigger queries on every selection we store this state locally here and only update the variable onBlur\n const [uncommittedValue, setUncommittedValue] = useState(values);\n\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n const hasDefaultValue = defaultValue !== undefined;\n\n // Detect value changes outside\n useEffect(() => {\n setUncommittedValue(values);\n }, [values]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n if (action === 'input-blur') {\n setInputValue('');\n return '';\n }\n\n return inputValue;\n };\n\n const filteredOptions = useMemo(\n () => handleOptionGroups(optionSearcher(inputValue).map(toSelectableValue)),\n [optionSearcher, inputValue]\n );\n\n return isMulti ? (\n <MultiSelect<VariableValueSingle>\n aria-label={t(\n 'grafana-scenes.variables.group-by-variable-renderer.aria-label-group-by-selector',\n 'Group by selector'\n )}\n data-testid={`GroupBySelect-${key}`}\n id={key}\n placeholder={t(\n 'grafana-scenes.variables.group-by-variable-renderer.placeholder-group-by-label',\n 'Group by label'\n )}\n width=\"auto\"\n allowCustomValue={allowCustomValue}\n inputValue={inputValue}\n value={uncommittedValue}\n noMultiValueWrap={true}\n maxVisibleValues={maxVisibleValues ?? 5}\n tabSelectsValue={false}\n virtualized\n options={filteredOptions}\n filterOption={filterNoOp}\n closeMenuOnSelect={false}\n isOpen={isOptionsOpen}\n isClearable={true}\n hideSelectedOptions={false}\n isLoading={isFetchingOptions}\n components={{\n Option: OptionWithCheckbox,\n Menu: WideMenu,\n ...(hasDefaultValue\n ? {\n IndicatorsContainer: () => <DefaultGroupByCustomIndicatorContainer model={model} />,\n }\n : {}),\n MultiValueContainer: ({ innerProps, children }: React.PropsWithChildren<GroupByContainerProps>) => (\n <GroupByValueContainer innerProps={innerProps} keysApplicability={keysApplicability}>\n {children}\n </GroupByValueContainer>\n ),\n }}\n onInputChange={onInputChange}\n onBlur={() => {\n model.changeValueTo(\n uncommittedValue.map((x) => x.value!),\n uncommittedValue.map((x) => x.label!),\n true\n );\n\n const restorable = model.checkIfRestorable(uncommittedValue.map((v) => v.value!));\n\n if (restorable !== model.state.restorable) {\n model.setState({ restorable: restorable });\n }\n\n model._verifyApplicability();\n }}\n onChange={(newValue, action) => {\n if (action.action === 'clear' && noValueOnClear) {\n model.changeValueTo([], undefined, true);\n }\n\n setUncommittedValue(newValue);\n setInputValue('');\n }}\n onOpenMenu={async () => {\n const profiler = getInteractionTracker(model);\n profiler?.startInteraction(GROUPBY_DIMENSIONS_INTERACTION);\n\n setIsFetchingOptions(true);\n await lastValueFrom(model.validateAndUpdate());\n setIsFetchingOptions(false);\n setIsOptionsOpen(true);\n\n profiler?.stopInteraction();\n }}\n onCloseMenu={() => {\n setIsOptionsOpen(false);\n }}\n />\n ) : (\n <Select\n aria-label={t(\n 'grafana-scenes.variables.group-by-variable-renderer.aria-label-group-by-selector',\n 'Group by selector'\n )}\n data-testid={`GroupBySelect-${key}`}\n id={key}\n placeholder={t(\n 'grafana-scenes.variables.group-by-variable-renderer.placeholder-group-by-label',\n 'Group by label'\n )}\n width=\"auto\"\n inputValue={inputValue}\n value={uncommittedValue && uncommittedValue.length > 0 ? uncommittedValue : null}\n allowCustomValue={allowCustomValue}\n noMultiValueWrap={true}\n maxVisibleValues={maxVisibleValues ?? 5}\n tabSelectsValue={false}\n virtualized\n options={filteredOptions}\n filterOption={filterNoOp}\n closeMenuOnSelect={true}\n isOpen={isOptionsOpen}\n isClearable={true}\n hideSelectedOptions={false}\n noValueOnClear={true}\n isLoading={isFetchingOptions}\n components={{ Menu: WideMenu }}\n onInputChange={onInputChange}\n onChange={(newValue, action) => {\n if (action.action === 'clear') {\n setUncommittedValue([]);\n if (noValueOnClear) {\n model.changeValueTo([]);\n }\n return;\n }\n if (newValue?.value) {\n setUncommittedValue([newValue]);\n model.changeValueTo([newValue.value], newValue.label ? [newValue.label] : undefined);\n }\n }}\n onOpenMenu={async () => {\n const profiler = getInteractionTracker(model);\n profiler?.startInteraction(GROUPBY_DIMENSIONS_INTERACTION);\n\n setIsFetchingOptions(true);\n await lastValueFrom(model.validateAndUpdate());\n setIsFetchingOptions(false);\n setIsOptionsOpen(true);\n\n profiler?.stopInteraction();\n }}\n onCloseMenu={() => {\n setIsOptionsOpen(false);\n }}\n />\n );\n}\n\nconst filterNoOp = () => true;\n\n// custom minWidth menu component to fit custom value message\nfunction WideMenu<Option, IsMulti extends boolean, Group extends GroupBase<Option>>(\n props: MenuProps<Option, IsMulti, Group>\n) {\n return (\n <components.Menu {...props}>\n <div style={{ minWidth: '220px' }}>{props.children}</div>\n </components.Menu>\n );\n}\n\nfunction toSelectableValue(input: VariableValueOption): SelectableValue<VariableValueSingle> {\n const { label, value, group } = input;\n const result: SelectableValue<VariableValueSingle> = {\n label,\n value,\n };\n\n if (group) {\n result.group = group;\n }\n\n return result;\n}\n"],"names":["value"],"mappings":"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"}
1
+ {"version":3,"file":"GroupByVariable.js","sources":["../../../../../../../src/variables/groupby/GroupByVariable.tsx"],"sourcesContent":["import { t } from '@grafana/i18n';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n AdHocVariableFilter,\n DataSourceApi,\n // @ts-expect-error (temporary till we update grafana/data)\n DrilldownsApplicability,\n GetTagResponse,\n GrafanaTheme2,\n MetricFindValue,\n SelectableValue,\n store,\n} from '@grafana/data';\nimport { allActiveGroupByVariables } from './findActiveGroupByVariablesByUid';\nimport { DataSourceRef, VariableType } from '@grafana/schema';\nimport { SceneComponentProps, ControlsLayout, SceneObjectUrlSyncHandler, SceneDataQuery } from '../../core/types';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport {\n SceneVariableValueChangedEvent,\n ValidateAndUpdateResult,\n VariableValue,\n VariableValueOption,\n VariableValueSingle,\n} from '../types';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../variants/MultiValueVariable';\nimport { from, lastValueFrom, map, mergeMap, Observable, of, take, tap } from 'rxjs';\nimport { getDataSource } from '../../utils/getDataSource';\nimport { InputActionMeta, MultiSelect, Select, useStyles2 } from '@grafana/ui';\nimport { components, GroupBase, MenuProps } from 'react-select';\nimport { isArray, isEqual } from 'lodash';\nimport { dataFromResponse, getQueriesForVariables, handleOptionGroups, responseHasError } from '../utils';\nimport { OptionWithCheckbox } from '../components/VariableValueSelect';\nimport { GroupByVariableUrlSyncHandler } from './GroupByVariableUrlSyncHandler';\nimport { getOptionSearcher } from '../components/getOptionSearcher';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { DefaultGroupByCustomIndicatorContainer } from './DefaultGroupByCustomIndicatorContainer';\nimport { GroupByValueContainer, GroupByContainerProps } from './GroupByValueContainer';\nimport { getInteractionTracker } from '../../core/sceneGraph/getInteractionTracker';\nimport { GROUPBY_DIMENSIONS_INTERACTION } from '../../performance/interactionConstants';\nimport { MAX_RECENT_DRILLDOWNS } from '../adhoc/AdHocFiltersVariable';\nimport { DrilldownRecommendations } from '../components/DrilldownRecommendations';\nimport { css, cx } from '@emotion/css';\n\nexport const RECENT_GROUPING_KEY = 'grafana.grouping.recent';\n\nexport interface GroupByVariableState extends MultiValueVariableState {\n /** Defaults to \"Group\" */\n name: string;\n /** The visible keys to group on */\n // TODO review this type and name (naming is hard)\n defaultOptions?: MetricFindValue[];\n /** Base filters to always apply when looking up keys */\n baseFilters?: AdHocVariableFilter[];\n /** Datasource to use for getTagKeys and also controls which scene queries the group by should apply to */\n datasource: DataSourceRef | null;\n /** Default value set for this groupBy. When this field is set, changing value will allow the user to restore back to this default value */\n defaultValue?: { text: VariableValue; value: VariableValue };\n /** Needed for url sync when passing flag to another dashboard */\n restorable?: boolean;\n /** Controls if the group by can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n * Vertical layout does not yet support operator selector.\n */\n layout?: ControlsLayout;\n /**\n * Defaults to same-datasource which means group by will automatically be applied to all queries with the same data source as this GroupBySet.\n * In manual mode no queries are re-run on changes, and you have to manually apply the filter to whatever queries you want.\n */\n applyMode?: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Holds the applicability for each of the selected keys\n */\n keysApplicability?: DrilldownsApplicability[];\n /**\n * state for checking whether drilldown applicability is enabled\n */\n applicabilityEnabled?: boolean;\n\n /**\n * contains stored recent keys\n */\n _recentGrouping?: Array<SelectableValue<VariableValueSingle>>;\n\n /**\n * contains recommended keys\n */\n _recommendedGrouping?: Array<SelectableValue<VariableValueSingle>>;\n\n /**\n * enables drilldown recommendations\n */\n drilldownRecommendationsEnabled?: boolean;\n}\n\nexport type getTagKeysProvider = (\n set: GroupByVariable,\n currentKey: string | null\n) => Promise<{ replace?: boolean; values: MetricFindValue[] | GetTagResponse }>;\n\nexport class GroupByVariable extends MultiValueVariable<GroupByVariableState> {\n static Component = GroupByVariableRenderer;\n isLazy = true;\n\n private _store = store;\n\n protected _urlSync: SceneObjectUrlSyncHandler = new GroupByVariableUrlSyncHandler(this);\n\n public validateAndUpdate(): Observable<ValidateAndUpdateResult> {\n return this.getValueOptions({}).pipe(\n map((options) => {\n this._updateValueGivenNewOptions(options);\n return {};\n })\n );\n }\n\n private _updateValueGivenNewOptions(options: VariableValueOption[]) {\n const { value: currentValue, text: currentText } = this.state;\n\n const stateUpdate: Partial<MultiValueVariableState> = {\n options,\n loading: false,\n value: currentValue ?? [],\n text: currentText ?? [],\n };\n\n this.setState(stateUpdate);\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n // When default dimensions are provided, return the static list\n if (this.state.defaultOptions) {\n return of(\n this.state.defaultOptions.map((o) => ({\n label: o.text,\n value: String(o.value),\n group: o.group,\n }))\n );\n }\n\n this.setState({ loading: true, error: null });\n\n return from(\n getDataSource(this.state.datasource, {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n })\n ).pipe(\n mergeMap((ds) => {\n return from(this._getKeys(ds)).pipe(\n tap((response) => {\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n }),\n map((response) => dataFromResponse(response)),\n take(1),\n mergeMap((data) => {\n const a: VariableValueOption[] = data.map((i) => {\n return {\n label: i.text,\n value: i.value ? String(i.value) : i.text,\n group: i.group,\n };\n });\n return of(a);\n })\n );\n })\n );\n }\n\n public constructor(initialState: Partial<GroupByVariableState>) {\n super({\n isMulti: true,\n name: '',\n value: [],\n text: [],\n options: [],\n datasource: null,\n baseFilters: [],\n applyMode: 'auto',\n layout: 'horizontal',\n type: 'groupby' as VariableType,\n ...initialState,\n noValueOnClear: true,\n });\n\n if (this.state.defaultValue) {\n this.changeValueTo(this.state.defaultValue.value, this.state.defaultValue.text, false);\n }\n\n if (this.state.drilldownRecommendationsEnabled) {\n const json = this._store.get(RECENT_GROUPING_KEY);\n this.setState({\n _recentGrouping: json ? JSON.parse(json) : [],\n });\n }\n\n if (this.state.applyMode === 'auto') {\n this.addActivationHandler(() => {\n allActiveGroupByVariables.add(this);\n\n return () => allActiveGroupByVariables.delete(this);\n });\n }\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._verifyApplicability();\n\n if (this.state.defaultValue) {\n if (this.checkIfRestorable(this.state.value)) {\n this.setState({ restorable: true });\n }\n }\n\n return () => {\n if (this.state.defaultValue) {\n this.restoreDefaultValues();\n }\n\n this.setState({ applicabilityEnabled: false });\n };\n };\n\n public getApplicableKeys(): VariableValue {\n const { value, keysApplicability } = this.state;\n\n const valueArray = isArray(value) ? value : value ? [value] : [];\n\n if (!keysApplicability || keysApplicability.length === 0) {\n return valueArray;\n }\n\n const applicableValues = valueArray.filter((val) => {\n const applicability = keysApplicability.find((item) => item.key === val);\n return !applicability || applicability.applicable !== false;\n });\n\n return applicableValues;\n }\n\n public async getGroupByApplicabilityForQueries(\n value: VariableValue,\n queries: SceneDataQuery[]\n ): Promise<DrilldownsApplicability[] | undefined> {\n const ds = await getDataSource(this.state.datasource, {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n });\n\n // @ts-expect-error (temporary till we update grafana/data)\n if (!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 groupByKeys: Array.isArray(value) ? value.map((v) => String(v)) : value ? [String(value)] : [],\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n }\n\n public async _verifyApplicability() {\n const queries = getQueriesForVariables(this);\n const value = this.state.value;\n\n const response = await this.getGroupByApplicabilityForQueries(value, queries);\n\n if (!response) {\n return;\n }\n\n if (!isEqual(response, this.state.keysApplicability)) {\n this.setState({ keysApplicability: response ?? undefined, applicabilityEnabled: true });\n\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n } else {\n this.setState({ applicabilityEnabled: true });\n }\n }\n\n // This method is related to the defaultValue property. We check if the current value\n // is different from the default value. If it is, the groupBy will show a button\n // allowing the user to restore the default values.\n public checkIfRestorable(values: VariableValue) {\n const originalValues = isArray(this.state.defaultValue?.value)\n ? this.state.defaultValue?.value\n : this.state.defaultValue?.value\n ? [this.state.defaultValue?.value]\n : [];\n const vals = isArray(values) ? values : [values];\n\n if (vals.length !== originalValues.length) {\n return true;\n }\n\n return !isEqual(vals, originalValues);\n }\n\n public restoreDefaultValues() {\n this.setState({ restorable: false });\n\n if (!this.state.defaultValue) {\n return;\n }\n\n this.changeValueTo(this.state.defaultValue.value, this.state.defaultValue.text, true);\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public _getKeys = async (ds: DataSourceApi) => {\n // TODO: provide current dimensions?\n const override = await this.state.getTagKeysProvider?.(this, null);\n\n if (override && override.replace) {\n return override.values;\n }\n\n if (this.state.defaultOptions) {\n return this.state.defaultOptions.concat(dataFromResponse(override?.values ?? []));\n }\n\n if (!ds.getTagKeys) {\n return [];\n }\n\n const queries = getQueriesForVariables(this);\n\n const otherFilters = this.state.baseFilters || [];\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys;\n };\n\n public prepareRecentGrouping(value: SelectableValue<VariableValueSingle>) {\n if (!this.state.drilldownRecommendationsEnabled) {\n return [];\n }\n\n const recentGrouping = [...(this.state._recentGrouping ?? []), { value: value.value, text: value.label }].slice(\n -MAX_RECENT_DRILLDOWNS\n );\n this._store.set(RECENT_GROUPING_KEY, JSON.stringify(recentGrouping));\n\n return recentGrouping;\n }\n\n public setRecommendedGrouping(recommendedGrouping: string[]) {\n this.setState({\n _recommendedGrouping: recommendedGrouping.map((key) => ({ value: key, text: key })),\n });\n }\n\n /**\n * Allows clearing the value of the variable to an empty value. Overrides default behavior of a MultiValueVariable\n */\n public getDefaultMultiState(options: VariableValueOption[]) {\n return { value: [], text: [] };\n }\n}\n\nexport function GroupByVariableRenderer({ model }: SceneComponentProps<GroupByVariable>) {\n const {\n value,\n text,\n key,\n isMulti = true,\n maxVisibleValues,\n noValueOnClear,\n options,\n includeAll,\n allowCustomValue = true,\n defaultValue,\n keysApplicability,\n _recentGrouping,\n _recommendedGrouping,\n drilldownRecommendationsEnabled,\n } = model.useState();\n\n const styles = useStyles2(getStyles);\n\n const values = useMemo<Array<SelectableValue<VariableValueSingle>>>(() => {\n const arrayValue = isArray(value) ? value : [value];\n const arrayText = isArray(text) ? text : [text];\n\n return arrayValue.map((value, idx) => ({\n value,\n label: String(arrayText[idx] ?? value),\n }));\n }, [value, text]);\n\n const [isFetchingOptions, setIsFetchingOptions] = useState(false);\n const [isOptionsOpen, setIsOptionsOpen] = useState(false);\n const [inputValue, setInputValue] = useState('');\n\n // To not trigger queries on every selection we store this state locally here and only update the variable onBlur\n const [uncommittedValue, setUncommittedValue] = useState(values);\n\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n const hasDefaultValue = defaultValue !== undefined;\n\n // Detect value changes outside\n useEffect(() => {\n setUncommittedValue(values);\n }, [values]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n if (action === 'input-blur') {\n setInputValue('');\n return '';\n }\n\n return inputValue;\n };\n\n const filteredOptions = useMemo(\n () => handleOptionGroups(optionSearcher(inputValue).map(toSelectableValue)),\n [optionSearcher, inputValue]\n );\n\n const select = isMulti ? (\n <MultiSelect<VariableValueSingle>\n aria-label={t(\n 'grafana-scenes.variables.group-by-variable-renderer.aria-label-group-by-selector',\n 'Group by selector'\n )}\n data-testid={`GroupBySelect-${key}`}\n id={key}\n placeholder={t(\n 'grafana-scenes.variables.group-by-variable-renderer.placeholder-group-by-label',\n 'Group by label'\n )}\n width=\"auto\"\n className={cx(drilldownRecommendationsEnabled && styles.seelctStylesInWrapper)}\n allowCustomValue={allowCustomValue}\n inputValue={inputValue}\n value={uncommittedValue}\n noMultiValueWrap={true}\n maxVisibleValues={maxVisibleValues ?? 5}\n tabSelectsValue={false}\n virtualized\n options={filteredOptions}\n filterOption={filterNoOp}\n closeMenuOnSelect={false}\n isOpen={isOptionsOpen}\n isClearable={true}\n hideSelectedOptions={false}\n isLoading={isFetchingOptions}\n components={{\n Option: OptionWithCheckbox,\n Menu: WideMenu,\n ...(hasDefaultValue\n ? {\n IndicatorsContainer: () => <DefaultGroupByCustomIndicatorContainer model={model} />,\n }\n : {}),\n MultiValueContainer: ({ innerProps, children }: React.PropsWithChildren<GroupByContainerProps>) => (\n <GroupByValueContainer innerProps={innerProps} keysApplicability={keysApplicability}>\n {children}\n </GroupByValueContainer>\n ),\n }}\n onInputChange={onInputChange}\n onBlur={() => {\n model.changeValueTo(\n uncommittedValue.map((x) => x.value!),\n uncommittedValue.map((x) => x.label!),\n true\n );\n\n const restorable = model.checkIfRestorable(uncommittedValue.map((v) => v.value!));\n\n if (restorable !== model.state.restorable) {\n model.setState({ restorable: restorable });\n }\n\n model._verifyApplicability();\n }}\n onChange={(newValue, action) => {\n if (action.action === 'clear' && noValueOnClear) {\n model.changeValueTo([], undefined, true);\n }\n\n if (action.action === 'select-option' && action.option) {\n model.setState({\n _recentGrouping: model.prepareRecentGrouping(action.option),\n });\n }\n\n setUncommittedValue(newValue);\n setInputValue('');\n }}\n onOpenMenu={async () => {\n const profiler = getInteractionTracker(model);\n profiler?.startInteraction(GROUPBY_DIMENSIONS_INTERACTION);\n\n setIsFetchingOptions(true);\n await lastValueFrom(model.validateAndUpdate());\n setIsFetchingOptions(false);\n setIsOptionsOpen(true);\n\n profiler?.stopInteraction();\n }}\n onCloseMenu={() => {\n setIsOptionsOpen(false);\n }}\n />\n ) : (\n <Select\n aria-label={t(\n 'grafana-scenes.variables.group-by-variable-renderer.aria-label-group-by-selector',\n 'Group by selector'\n )}\n data-testid={`GroupBySelect-${key}`}\n id={key}\n placeholder={t(\n 'grafana-scenes.variables.group-by-variable-renderer.placeholder-group-by-label',\n 'Group by label'\n )}\n width=\"auto\"\n className={cx(drilldownRecommendationsEnabled && styles.seelctStylesInWrapper)}\n inputValue={inputValue}\n value={uncommittedValue && uncommittedValue.length > 0 ? uncommittedValue : null}\n allowCustomValue={allowCustomValue}\n noMultiValueWrap={true}\n maxVisibleValues={maxVisibleValues ?? 5}\n tabSelectsValue={false}\n virtualized\n options={filteredOptions}\n filterOption={filterNoOp}\n closeMenuOnSelect={true}\n isOpen={isOptionsOpen}\n isClearable={true}\n hideSelectedOptions={false}\n noValueOnClear={true}\n isLoading={isFetchingOptions}\n components={{ Menu: WideMenu }}\n onInputChange={onInputChange}\n onChange={(newValue, action) => {\n if (action.action === 'clear') {\n setUncommittedValue([]);\n if (noValueOnClear) {\n model.changeValueTo([]);\n }\n return;\n }\n if (newValue?.value) {\n setUncommittedValue([newValue]);\n model.changeValueTo([newValue.value], newValue.label ? [newValue.label] : undefined);\n model.setState({\n _recentGrouping: model.prepareRecentGrouping(newValue),\n });\n }\n }}\n onOpenMenu={async () => {\n const profiler = getInteractionTracker(model);\n profiler?.startInteraction(GROUPBY_DIMENSIONS_INTERACTION);\n\n setIsFetchingOptions(true);\n await lastValueFrom(model.validateAndUpdate());\n setIsFetchingOptions(false);\n setIsOptionsOpen(true);\n\n profiler?.stopInteraction();\n }}\n onCloseMenu={() => {\n setIsOptionsOpen(false);\n }}\n />\n );\n\n if (!drilldownRecommendationsEnabled) {\n return select;\n }\n\n const recentDrilldowns = _recentGrouping?.map((groupBy) => ({\n label: `${groupBy.value}`,\n onClick: () => {\n if (values.map((x) => x.value).includes(groupBy.value)) {\n return;\n }\n\n model.changeValueTo(\n [...values.map((x) => x.value!), groupBy.value!],\n [...values.map((x) => x.label), groupBy.text ?? groupBy.value],\n true\n );\n },\n }));\n\n const recommendedDrilldowns = _recommendedGrouping?.map((groupBy) => ({\n label: `${groupBy.value}`,\n onClick: () => {\n if (values.map((x) => x.value).includes(groupBy.value)) {\n return;\n }\n\n model.changeValueTo(\n [...values.map((x) => x.value!), groupBy.value!],\n [...values.map((x) => x.label), groupBy.text ?? groupBy.value],\n true\n );\n },\n }));\n\n return (\n <div className={styles.wrapper}>\n <div className={styles.recommendations}>\n <DrilldownRecommendations recentDrilldowns={recentDrilldowns} recommendedDrilldowns={recommendedDrilldowns} />\n </div>\n\n {select}\n </div>\n );\n}\n\nconst filterNoOp = () => true;\n\n// custom minWidth menu component to fit custom value message\nfunction WideMenu<Option, IsMulti extends boolean, Group extends GroupBase<Option>>(\n props: MenuProps<Option, IsMulti, Group>\n) {\n return (\n <components.Menu {...props}>\n <div style={{ minWidth: '220px' }}>{props.children}</div>\n </components.Menu>\n );\n}\n\nfunction toSelectableValue(input: VariableValueOption): SelectableValue<VariableValueSingle> {\n const { label, value, group } = input;\n const result: SelectableValue<VariableValueSingle> = {\n label,\n value,\n };\n\n if (group) {\n result.group = group;\n }\n\n return result;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n }),\n seelctStylesInWrapper: css({\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n border: `1px solid ${theme.colors.border.strong}`,\n borderLeft: 'none',\n }),\n recommendations: css({\n display: 'flex',\n alignItems: 'center',\n paddingInline: theme.spacing(0.5),\n borderTop: `1px solid ${theme.colors.border.strong}`,\n borderBottom: `1px solid ${theme.colors.border.strong}`,\n backgroundColor: theme.components.input.background,\n '& button': {\n borderRadius: 0,\n height: '100%',\n margin: 0,\n paddingInline: theme.spacing(0.5),\n },\n }),\n});\n"],"names":["value"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../../../../src/variables/types.ts"],"sourcesContent":["import { Observable } from 'rxjs';\n\nimport { BusEventWithPayload } from '@grafana/data';\nimport { VariableType, VariableHide } from '@grafana/schema';\n\nimport { SceneObject, SceneObjectState } from '../core/types';\n\nexport interface SceneVariableState extends SceneObjectState {\n type: VariableType;\n name: string;\n label?: string;\n hide?: VariableHide;\n skipUrlSync?: boolean;\n loading?: boolean;\n error?: any | null;\n description?: string | null;\n // A default variable is something that is not coming from the JSON definition, but usually registered by datasources.\n // It also doesn't get persisted back to the dashboard JSON.\n isDefault?: boolean;\n}\n\nexport interface SceneVariable<TState extends SceneVariableState = SceneVariableState> extends SceneObject<TState> {\n /**\n * This function is called on activation or when a dependency changes.\n */\n validateAndUpdate?(): Observable<ValidateAndUpdateResult>;\n\n /**\n * Should return the value for the given field path\n */\n getValue(fieldPath?: string): VariableValue | undefined | null;\n\n /**\n * Should return the value display text, used by the \"text\" formatter\n * Example: ${podId:text}\n * Useful for variables that have non user friendly values but friendly display text names.\n */\n getValueText?(fieldPath?: string): string;\n\n /**\n * For special edge case senarios. For example local function that locally scoped variables can implement.\n **/\n isAncestorLoading?(): boolean;\n\n /**\n * Allows cancelling variable execution.\n */\n onCancel?(): void;\n\n /**\n * Edge case for variables that are hidden but wants to be render to access react contexts (ScopesVariable)\n */\n UNSAFE_renderAsHidden?: boolean;\n\n /**\n * @experimental\n * Indicates that a variable loads values lazily when user interacts with the variable dropdown.\n */\n isLazy?: boolean;\n}\n\nexport type VariableValue = VariableValueSingle | VariableValueSingle[];\n\nexport type VariableValueSingle = string | boolean | number | CustomVariableValue;\n\n/**\n * This is for edge case values like the custom \"allValue\" that should not be escaped/formatted like other values\n * The custom all value usually contain wildcards that should not be escaped.\n */\nexport interface CustomVariableValue {\n /**\n * The format name or function used in the expression\n */\n formatter(formatNameOrFn?: string | VariableCustomFormatterFn): string;\n}\n\nexport interface ValidateAndUpdateResult {}\nexport type VariableValueOptionProperties = Record<string, any>;\nexport interface VariableValueOption {\n label: string;\n value: VariableValueSingle;\n group?: string;\n properties?: VariableValueOptionProperties;\n}\n\nexport interface SceneVariableSetState extends SceneObjectState {\n variables: SceneVariable[];\n}\n\nexport interface SceneVariables extends SceneObject<SceneVariableSetState> {\n /**\n * Will look for and return variable matching name\n */\n getByName(name: string): SceneVariable | undefined;\n /**\n * Will return true if the variable is loading or waiting for an update to complete.\n */\n isVariableLoadingOrWaitingToUpdate(variable: SceneVariable): boolean;\n}\n\nexport class SceneVariableValueChangedEvent extends BusEventWithPayload<SceneVariable> {\n public static type = 'scene-variable-changed-value';\n}\n\nexport interface SceneVariableDependencyConfigLike {\n /** Return all variable names this object depend on */\n getNames(): Set<string>;\n\n /** Used to check for dependency on a specific variable */\n hasDependencyOn(name: string): boolean;\n\n /**\n * Will be called when the VariableSet have completed an update process or when a variable has changed value.\n **/\n variableUpdateCompleted(variable: SceneVariable, hasChanged: boolean): void;\n}\n\n/**\n * Used in CustomFormatterFn\n */\nexport interface CustomFormatterVariable {\n name: string;\n type: VariableType;\n multi?: boolean;\n includeAll?: boolean;\n}\n\nexport type VariableCustomFormatterFn = (\n value: unknown,\n legacyVariableModel: Partial<CustomFormatterVariable>,\n legacyDefaultFormatter?: VariableCustomFormatterFn\n) => string;\n\nexport type InterpolationFormatParameter = string | VariableCustomFormatterFn | undefined;\n\nexport function isCustomVariableValue(value: VariableValue): value is CustomVariableValue {\n return typeof value === 'object' && 'formatter' in value;\n}\n"],"names":[],"mappings":";;AAoGO,MAAM,uCAAuC,mBAAmC,CAAA;AAEvF;AAFa,8BAAA,CACG,IAAO,GAAA,8BAAA;AAkChB,SAAS,sBAAsB,KAAoD,EAAA;AACxF,EAAO,OAAA,OAAO,KAAU,KAAA,QAAA,IAAY,WAAe,IAAA,KAAA;AACrD;;;;"}
1
+ {"version":3,"file":"types.js","sources":["../../../../../../src/variables/types.ts"],"sourcesContent":["import { Observable } from 'rxjs';\n\nimport { BusEventWithPayload } from '@grafana/data';\nimport { VariableType, VariableHide } from '@grafana/schema';\n\nimport { SceneObject, SceneObjectState } from '../core/types';\n\nexport interface SceneVariableState extends SceneObjectState {\n type: VariableType;\n name: string;\n label?: string;\n hide?: VariableHide;\n skipUrlSync?: boolean;\n loading?: boolean;\n error?: any | null;\n description?: string | null;\n}\n\nexport interface SceneVariable<TState extends SceneVariableState = SceneVariableState> extends SceneObject<TState> {\n /**\n * This function is called on activation or when a dependency changes.\n */\n validateAndUpdate?(): Observable<ValidateAndUpdateResult>;\n\n /**\n * Should return the value for the given field path\n */\n getValue(fieldPath?: string): VariableValue | undefined | null;\n\n /**\n * Should return the value display text, used by the \"text\" formatter\n * Example: ${podId:text}\n * Useful for variables that have non user friendly values but friendly display text names.\n */\n getValueText?(fieldPath?: string): string;\n\n /**\n * For special edge case senarios. For example local function that locally scoped variables can implement.\n **/\n isAncestorLoading?(): boolean;\n\n /**\n * Allows cancelling variable execution.\n */\n onCancel?(): void;\n\n /**\n * Edge case for variables that are hidden but wants to be render to access react contexts (ScopesVariable)\n */\n UNSAFE_renderAsHidden?: boolean;\n\n /**\n * @experimental\n * Indicates that a variable loads values lazily when user interacts with the variable dropdown.\n */\n isLazy?: boolean;\n}\n\nexport type VariableValue = VariableValueSingle | VariableValueSingle[];\n\nexport type VariableValueSingle = string | boolean | number | CustomVariableValue;\n\n/**\n * This is for edge case values like the custom \"allValue\" that should not be escaped/formatted like other values\n * The custom all value usually contain wildcards that should not be escaped.\n */\nexport interface CustomVariableValue {\n /**\n * The format name or function used in the expression\n */\n formatter(formatNameOrFn?: string | VariableCustomFormatterFn): string;\n}\n\nexport interface ValidateAndUpdateResult {}\nexport type VariableValueOptionProperties = Record<string, any>;\nexport interface VariableValueOption {\n label: string;\n value: VariableValueSingle;\n group?: string;\n properties?: VariableValueOptionProperties;\n}\n\nexport interface SceneVariableSetState extends SceneObjectState {\n variables: SceneVariable[];\n}\n\nexport interface SceneVariables extends SceneObject<SceneVariableSetState> {\n /**\n * Will look for and return variable matching name\n */\n getByName(name: string): SceneVariable | undefined;\n /**\n * Will return true if the variable is loading or waiting for an update to complete.\n */\n isVariableLoadingOrWaitingToUpdate(variable: SceneVariable): boolean;\n}\n\nexport class SceneVariableValueChangedEvent extends BusEventWithPayload<SceneVariable> {\n public static type = 'scene-variable-changed-value';\n}\n\nexport interface SceneVariableDependencyConfigLike {\n /** Return all variable names this object depend on */\n getNames(): Set<string>;\n\n /** Used to check for dependency on a specific variable */\n hasDependencyOn(name: string): boolean;\n\n /**\n * Will be called when the VariableSet have completed an update process or when a variable has changed value.\n **/\n variableUpdateCompleted(variable: SceneVariable, hasChanged: boolean): void;\n}\n\n/**\n * Used in CustomFormatterFn\n */\nexport interface CustomFormatterVariable {\n name: string;\n type: VariableType;\n multi?: boolean;\n includeAll?: boolean;\n}\n\nexport type VariableCustomFormatterFn = (\n value: unknown,\n legacyVariableModel: Partial<CustomFormatterVariable>,\n legacyDefaultFormatter?: VariableCustomFormatterFn\n) => string;\n\nexport type InterpolationFormatParameter = string | VariableCustomFormatterFn | undefined;\n\nexport function isCustomVariableValue(value: VariableValue): value is CustomVariableValue {\n return typeof value === 'object' && 'formatter' in value;\n}\n"],"names":[],"mappings":";;AAiGO,MAAM,uCAAuC,mBAAmC,CAAA;AAEvF;AAFa,8BAAA,CACG,IAAO,GAAA,8BAAA;AAkChB,SAAS,sBAAsB,KAAoD,EAAA;AACxF,EAAO,OAAA,OAAO,KAAU,KAAA,QAAA,IAAY,WAAe,IAAA,KAAA;AACrD;;;;"}
@@ -13,6 +13,13 @@ var grafanaScenes = {
13
13
  "remove-filter-value": "Remove filter value - {{itemLabel}}",
14
14
  "use-custom-value": "Use custom value: {{itemLabel}}"
15
15
  },
16
+ "drilldown-recommendations": {
17
+ recent: "Recent",
18
+ "recent-empty": "No recent values",
19
+ recommended: "Recommended",
20
+ "recommended-empty": "No reccomended values",
21
+ tooltip: "Show recommendations"
22
+ },
16
23
  "fallback-page": {
17
24
  content: "If you found your way here using a link then there might be a bug in this application.",
18
25
  subTitle: "The url did not match any page",
@@ -164,4 +171,4 @@ var grafanaScenes = {
164
171
  };
165
172
 
166
173
  exports.default = grafanaScenes;
167
- //# sourceMappingURL=grafana-scenes-D5iZGLtK.js.map
174
+ //# sourceMappingURL=grafana-scenes-UNv1YXap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grafana-scenes-D5iZGLtK.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"grafana-scenes-UNv1YXap.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}