@grafana/scenes 6.10.3--canary.1118.14843484904.0 → 6.10.3--canary.1115.14859551545.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.
@@ -142,7 +142,7 @@ class SceneTimeRange extends SceneObjectBase {
142
142
  }
143
143
  calculatePercentOfInterval(percent) {
144
144
  const intervalMs = this.state.value.to.diff(this.state.value.from, "milliseconds");
145
- return Math.ceil(intervalMs / percent);
145
+ return Math.ceil(intervalMs / 100 * percent);
146
146
  }
147
147
  getTimeZone() {
148
148
  if (this.state.timeZone && getValidTimeZone(this.state.timeZone)) {
@@ -1 +1 @@
1
- {"version":3,"file":"SceneTimeRange.js","sources":["../../../src/core/SceneTimeRange.tsx"],"sourcesContent":["import { getTimeZone, getZone, rangeUtil, setWeekStart, TimeRange, toUtc } from '@grafana/data';\nimport { defaultTimeZone, TimeZone } from '@grafana/schema';\n\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nimport { SceneObjectBase } from './SceneObjectBase';\nimport { SceneTimeRangeLike, SceneTimeRangeState, SceneObjectUrlValues } from './types';\nimport { getClosest } from './sceneGraph/utils';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { evaluateTimeRange } from '../utils/evaluateTimeRange';\nimport { config, locationService, RefreshEvent } from '@grafana/runtime';\nimport { isValid } from '../utils/date';\nimport { getQueryController } from './sceneGraph/getQueryController';\nimport { writeSceneLog } from '../utils/writeSceneLog';\n\nexport class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implements SceneTimeRangeLike {\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['from', 'to', 'timezone', 'time', 'time.window'] });\n\n public constructor(state: Partial<SceneTimeRangeState> = {}) {\n const from = state.from && isValid(state.from) ? state.from : 'now-6h';\n const to = state.to && isValid(state.to) ? state.to : 'now';\n const timeZone = getValidTimeZone(state.timeZone);\n const value = evaluateTimeRange(\n from,\n to,\n timeZone || getTimeZone(),\n state.fiscalYearStartMonth,\n state.UNSAFE_nowDelay,\n state.weekStart\n );\n const refreshOnActivate = state.refreshOnActivate ?? { percent: 10 };\n super({ from, to, timeZone, value, refreshOnActivate, ...state });\n\n this.addActivationHandler(this._onActivate.bind(this));\n }\n\n private _onActivate() {\n // When SceneTimeRange has no time zone provided, find closest source of time zone and subscribe to it\n if (!this.state.timeZone) {\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this) {\n this._subs.add(\n timeZoneSource.subscribeToState((n, p) => {\n if (n.timeZone !== undefined && n.timeZone !== p.timeZone) {\n this.refreshRange(0);\n }\n })\n );\n }\n }\n\n if (rangeUtil.isRelativeTimeRange(this.state.value.raw)) {\n this.refreshIfStale();\n }\n\n return () => {\n if (this.state.weekStart) {\n setWeekStart(config.bootData.user.weekStart);\n }\n };\n }\n\n private refreshIfStale() {\n let ms;\n if (this.state?.refreshOnActivate?.percent !== undefined) {\n ms = this.calculatePercentOfInterval(this.state.refreshOnActivate.percent);\n }\n if (this.state?.refreshOnActivate?.afterMs !== undefined) {\n ms = Math.min(this.state.refreshOnActivate.afterMs, ms ?? Infinity);\n }\n if (ms !== undefined) {\n this.refreshRange(ms);\n }\n }\n\n /**\n * Will traverse up the scene graph to find the closest SceneTimeRangeLike with time zone set\n */\n private getTimeZoneSource() {\n if (!this.parent || !this.parent.parent) {\n return this;\n }\n // Find the closest source of time zone\n const source = getClosest<SceneTimeRangeLike>(this.parent.parent, (o) => {\n if (o.state.$timeRange && o.state.$timeRange.state.timeZone) {\n return o.state.$timeRange;\n }\n return undefined;\n });\n\n if (!source) {\n return this;\n }\n\n return source;\n }\n\n /**\n * Refreshes time range if it is older than the invalidation interval\n * @param refreshAfterMs invalidation interval (milliseconds)\n * @private\n */\n private refreshRange(refreshAfterMs: number) {\n const value = evaluateTimeRange(\n this.state.from,\n this.state.to,\n this.state.timeZone ?? getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n const diff = value.to.diff(this.state.value.to, 'milliseconds');\n if (diff >= refreshAfterMs) {\n this.setState({ value });\n }\n }\n\n private calculatePercentOfInterval(percent: number): number {\n const intervalMs = this.state.value.to.diff(this.state.value.from, 'milliseconds');\n return Math.ceil(intervalMs / percent);\n }\n\n public getTimeZone(): TimeZone {\n // Return local time zone if provided\n if (this.state.timeZone && getValidTimeZone(this.state.timeZone)) {\n return this.state.timeZone;\n }\n\n // Resolve higher level time zone source\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this && getValidTimeZone(timeZoneSource.state.timeZone)) {\n return timeZoneSource.state.timeZone!;\n }\n\n // Return default time zone\n return getTimeZone();\n }\n\n public onTimeRangeChange = (timeRange: TimeRange) => {\n const update: Partial<SceneTimeRangeState> = {};\n\n if (typeof timeRange.raw.from === 'string') {\n update.from = timeRange.raw.from;\n } else {\n update.from = timeRange.raw.from.toISOString();\n }\n\n if (typeof timeRange.raw.to === 'string') {\n update.to = timeRange.raw.to;\n } else {\n update.to = timeRange.raw.to.toISOString();\n }\n\n update.value = evaluateTimeRange(\n update.from,\n update.to,\n this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n // Only update if time range actually changed\n if (update.from !== this.state.from || update.to !== this.state.to) {\n const queryController = getQueryController(this);\n queryController?.startProfile('SceneTimeRange');\n this._urlSync.performBrowserHistoryAction(() => {\n this.setState(update);\n });\n }\n };\n\n public onTimeZoneChange = (timeZone: TimeZone) => {\n this._urlSync.performBrowserHistoryAction(() => {\n this.setState({ timeZone: getValidTimeZone(timeZone) ?? defaultTimeZone });\n });\n };\n\n public onRefresh = () => {\n this.refreshRange(0);\n this.publishEvent(new RefreshEvent(), true);\n };\n\n public getUrlState() {\n const params = locationService.getSearchObject();\n const urlValues: SceneObjectUrlValues = { from: this.state.from, to: this.state.to, timezone: this.getTimeZone() };\n\n // Clear time and time.window once they are converted to from and to\n if (params.time && params['time.window']) {\n urlValues.time = null;\n urlValues['time.window'] = null;\n }\n\n return urlValues;\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const update: Partial<SceneTimeRangeState> = {};\n\n let from = parseUrlParam(values.from);\n let to = parseUrlParam(values.to);\n\n if (values.time && values['time.window']) {\n const time = Array.isArray(values.time) ? values.time[0] : values.time;\n const timeWindow = Array.isArray(values['time.window']) ? values['time.window'][0] : values['time.window'];\n const timeRange = getTimeWindow(time, timeWindow);\n if (timeRange.from && isValid(timeRange.from)) {\n from = timeRange.from;\n }\n\n if (timeRange.to && isValid(timeRange.to)) {\n to = timeRange.to;\n }\n }\n\n if (from && isValid(from)) {\n update.from = from;\n }\n\n if (to && isValid(to)) {\n update.to = to;\n }\n\n if (typeof values.timezone === 'string') {\n update.timeZone = values.timezone !== '' ? values.timezone : undefined;\n }\n\n if (Object.keys(update).length === 0) {\n return;\n }\n\n update.value = evaluateTimeRange(\n update.from ?? this.state.from,\n update.to ?? this.state.to,\n update.timeZone ?? this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n return this.setState(update);\n }\n}\n\n/**\n * Calculates the duration of the time range from time-time.window/2 to time+time.window/2. Both be specified in ms. For example ?time=1500000000000&time.window=10000 results in a 10-second time range from 1499999995000 to 1500000005000`.\n * @param time - time in ms\n * @param timeWindow - time window in ms or interval string\n */\nfunction getTimeWindow(time: string, timeWindow: string) {\n // Parse the time, assuming it could be an ISO string or a number in milliseconds\n const valueTime = isNaN(Date.parse(time)) ? parseInt(time, 10) : Date.parse(time);\n\n let timeWindowMs;\n\n if (timeWindow.match(/^\\d+$/) && parseInt(timeWindow, 10)) {\n // when time window is specified in ms\n timeWindowMs = parseInt(timeWindow, 10);\n } else {\n timeWindowMs = rangeUtil.intervalToMs(timeWindow);\n }\n\n return {\n from: toUtc(valueTime - timeWindowMs / 2).toISOString(),\n to: toUtc(valueTime + timeWindowMs / 2).toISOString(),\n };\n}\n\n/**\n * Validates and returns a valid time zone string or undefined.\n * @param {string} [timeZone] - The time zone to validate. Can be a valid IANA time zone string, the string \"browser\", or undefined.\n * @returns {string | undefined} - Returns the input time zone if it is valid, or undefined if the input is invalid or not provided.\n */\nfunction getValidTimeZone(timeZone?: string): string | undefined {\n if (timeZone === undefined || timeZone === '') {\n return undefined;\n }\n if (timeZone === defaultTimeZone) {\n return timeZone;\n }\n if (getZone(timeZone)) {\n return timeZone;\n }\n writeSceneLog('SceneTimeRange', `Invalid timeZone \"${timeZone}\" provided.`);\n return;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SceneTimeRange.js","sources":["../../../src/core/SceneTimeRange.tsx"],"sourcesContent":["import { getTimeZone, getZone, rangeUtil, setWeekStart, TimeRange, toUtc } from '@grafana/data';\nimport { defaultTimeZone, TimeZone } from '@grafana/schema';\n\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nimport { SceneObjectBase } from './SceneObjectBase';\nimport { SceneTimeRangeLike, SceneTimeRangeState, SceneObjectUrlValues } from './types';\nimport { getClosest } from './sceneGraph/utils';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { evaluateTimeRange } from '../utils/evaluateTimeRange';\nimport { config, locationService, RefreshEvent } from '@grafana/runtime';\nimport { isValid } from '../utils/date';\nimport { getQueryController } from './sceneGraph/getQueryController';\nimport { writeSceneLog } from '../utils/writeSceneLog';\n\nexport class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implements SceneTimeRangeLike {\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['from', 'to', 'timezone', 'time', 'time.window'] });\n\n public constructor(state: Partial<SceneTimeRangeState> = {}) {\n const from = state.from && isValid(state.from) ? state.from : 'now-6h';\n const to = state.to && isValid(state.to) ? state.to : 'now';\n const timeZone = getValidTimeZone(state.timeZone);\n const value = evaluateTimeRange(\n from,\n to,\n timeZone || getTimeZone(),\n state.fiscalYearStartMonth,\n state.UNSAFE_nowDelay,\n state.weekStart\n );\n const refreshOnActivate = state.refreshOnActivate ?? { percent: 10 };\n super({ from, to, timeZone, value, refreshOnActivate, ...state });\n\n this.addActivationHandler(this._onActivate.bind(this));\n }\n\n private _onActivate() {\n // When SceneTimeRange has no time zone provided, find closest source of time zone and subscribe to it\n if (!this.state.timeZone) {\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this) {\n this._subs.add(\n timeZoneSource.subscribeToState((n, p) => {\n if (n.timeZone !== undefined && n.timeZone !== p.timeZone) {\n this.refreshRange(0);\n }\n })\n );\n }\n }\n\n if (rangeUtil.isRelativeTimeRange(this.state.value.raw)) {\n this.refreshIfStale();\n }\n\n return () => {\n if (this.state.weekStart) {\n setWeekStart(config.bootData.user.weekStart);\n }\n };\n }\n\n private refreshIfStale() {\n let ms;\n if (this.state?.refreshOnActivate?.percent !== undefined) {\n ms = this.calculatePercentOfInterval(this.state.refreshOnActivate.percent);\n }\n if (this.state?.refreshOnActivate?.afterMs !== undefined) {\n ms = Math.min(this.state.refreshOnActivate.afterMs, ms ?? Infinity);\n }\n if (ms !== undefined) {\n this.refreshRange(ms);\n }\n }\n\n /**\n * Will traverse up the scene graph to find the closest SceneTimeRangeLike with time zone set\n */\n private getTimeZoneSource() {\n if (!this.parent || !this.parent.parent) {\n return this;\n }\n // Find the closest source of time zone\n const source = getClosest<SceneTimeRangeLike>(this.parent.parent, (o) => {\n if (o.state.$timeRange && o.state.$timeRange.state.timeZone) {\n return o.state.$timeRange;\n }\n return undefined;\n });\n\n if (!source) {\n return this;\n }\n\n return source;\n }\n\n /**\n * Refreshes time range if it is older than the invalidation interval\n * @param refreshAfterMs invalidation interval (milliseconds)\n * @private\n */\n private refreshRange(refreshAfterMs: number) {\n const value = evaluateTimeRange(\n this.state.from,\n this.state.to,\n this.state.timeZone ?? getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n const diff = value.to.diff(this.state.value.to, 'milliseconds');\n if (diff >= refreshAfterMs) {\n this.setState({ value });\n }\n }\n\n private calculatePercentOfInterval(percent: number): number {\n const intervalMs = this.state.value.to.diff(this.state.value.from, 'milliseconds');\n return Math.ceil((intervalMs / 100) * percent);\n }\n\n public getTimeZone(): TimeZone {\n // Return local time zone if provided\n if (this.state.timeZone && getValidTimeZone(this.state.timeZone)) {\n return this.state.timeZone;\n }\n\n // Resolve higher level time zone source\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this && getValidTimeZone(timeZoneSource.state.timeZone)) {\n return timeZoneSource.state.timeZone!;\n }\n\n // Return default time zone\n return getTimeZone();\n }\n\n public onTimeRangeChange = (timeRange: TimeRange) => {\n const update: Partial<SceneTimeRangeState> = {};\n\n if (typeof timeRange.raw.from === 'string') {\n update.from = timeRange.raw.from;\n } else {\n update.from = timeRange.raw.from.toISOString();\n }\n\n if (typeof timeRange.raw.to === 'string') {\n update.to = timeRange.raw.to;\n } else {\n update.to = timeRange.raw.to.toISOString();\n }\n\n update.value = evaluateTimeRange(\n update.from,\n update.to,\n this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n // Only update if time range actually changed\n if (update.from !== this.state.from || update.to !== this.state.to) {\n const queryController = getQueryController(this);\n queryController?.startProfile('SceneTimeRange');\n this._urlSync.performBrowserHistoryAction(() => {\n this.setState(update);\n });\n }\n };\n\n public onTimeZoneChange = (timeZone: TimeZone) => {\n this._urlSync.performBrowserHistoryAction(() => {\n this.setState({ timeZone: getValidTimeZone(timeZone) ?? defaultTimeZone });\n });\n };\n\n public onRefresh = () => {\n this.refreshRange(0);\n this.publishEvent(new RefreshEvent(), true);\n };\n\n public getUrlState() {\n const params = locationService.getSearchObject();\n const urlValues: SceneObjectUrlValues = { from: this.state.from, to: this.state.to, timezone: this.getTimeZone() };\n\n // Clear time and time.window once they are converted to from and to\n if (params.time && params['time.window']) {\n urlValues.time = null;\n urlValues['time.window'] = null;\n }\n\n return urlValues;\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const update: Partial<SceneTimeRangeState> = {};\n\n let from = parseUrlParam(values.from);\n let to = parseUrlParam(values.to);\n\n if (values.time && values['time.window']) {\n const time = Array.isArray(values.time) ? values.time[0] : values.time;\n const timeWindow = Array.isArray(values['time.window']) ? values['time.window'][0] : values['time.window'];\n const timeRange = getTimeWindow(time, timeWindow);\n if (timeRange.from && isValid(timeRange.from)) {\n from = timeRange.from;\n }\n\n if (timeRange.to && isValid(timeRange.to)) {\n to = timeRange.to;\n }\n }\n\n if (from && isValid(from)) {\n update.from = from;\n }\n\n if (to && isValid(to)) {\n update.to = to;\n }\n\n if (typeof values.timezone === 'string') {\n update.timeZone = values.timezone !== '' ? values.timezone : undefined;\n }\n\n if (Object.keys(update).length === 0) {\n return;\n }\n\n update.value = evaluateTimeRange(\n update.from ?? this.state.from,\n update.to ?? this.state.to,\n update.timeZone ?? this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay,\n this.state.weekStart\n );\n\n return this.setState(update);\n }\n}\n\n/**\n * Calculates the duration of the time range from time-time.window/2 to time+time.window/2. Both be specified in ms. For example ?time=1500000000000&time.window=10000 results in a 10-second time range from 1499999995000 to 1500000005000`.\n * @param time - time in ms\n * @param timeWindow - time window in ms or interval string\n */\nfunction getTimeWindow(time: string, timeWindow: string) {\n // Parse the time, assuming it could be an ISO string or a number in milliseconds\n const valueTime = isNaN(Date.parse(time)) ? parseInt(time, 10) : Date.parse(time);\n\n let timeWindowMs;\n\n if (timeWindow.match(/^\\d+$/) && parseInt(timeWindow, 10)) {\n // when time window is specified in ms\n timeWindowMs = parseInt(timeWindow, 10);\n } else {\n timeWindowMs = rangeUtil.intervalToMs(timeWindow);\n }\n\n return {\n from: toUtc(valueTime - timeWindowMs / 2).toISOString(),\n to: toUtc(valueTime + timeWindowMs / 2).toISOString(),\n };\n}\n\n/**\n * Validates and returns a valid time zone string or undefined.\n * @param {string} [timeZone] - The time zone to validate. Can be a valid IANA time zone string, the string \"browser\", or undefined.\n * @returns {string | undefined} - Returns the input time zone if it is valid, or undefined if the input is invalid or not provided.\n */\nfunction getValidTimeZone(timeZone?: string): string | undefined {\n if (timeZone === undefined || timeZone === '') {\n return undefined;\n }\n if (timeZone === defaultTimeZone) {\n return timeZone;\n }\n if (getZone(timeZone)) {\n return timeZone;\n }\n writeSceneLog('SceneTimeRange', `Invalid timeZone \"${timeZone}\" provided.`);\n return;\n}\n"],"names":[],"mappings":"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"}
@@ -44,23 +44,16 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
44
44
  }
45
45
  }, [viewMode]);
46
46
  if (viewMode) {
47
- const pillText = /* @__PURE__ */ React.createElement("span", { className: styles.pillText }, keyLabel, " ", filter.operator, " ", valueLabel);
48
- let injectedInfoText = "";
49
- let injectedRestoreText = "";
50
- if (filter.origin === "dashboard") {
51
- injectedInfoText = "Applied by default in this dashboard. If edited, it carries over to other dashboards.";
52
- injectedRestoreText = "Restore the value defined by this dashboard.";
53
- } else if (filter.origin === "scope") {
54
- injectedInfoText = "Applied automatically from your selected scope.";
55
- injectedRestoreText = "Restore the value set by your selected scope";
56
- }
47
+ const pillTextContent = `${keyLabel} ${filter.operator} ${valueLabel}`;
48
+ const pillText = /* @__PURE__ */ React.createElement("span", { className: styles.pillText }, pillTextContent);
57
49
  return /* @__PURE__ */ React.createElement(
58
50
  "div",
59
51
  {
60
52
  className: cx(
61
53
  styles.combinedFilterPill,
62
54
  readOnly && styles.readOnlyCombinedFilter,
63
- isMatchAllFilter(filter) && styles.matchAllPill
55
+ isMatchAllFilter(filter) && styles.matchAllPill,
56
+ filter.readOnly && styles.filterReadOnly
64
57
  ),
65
58
  onClick: (e) => {
66
59
  e.stopPropagation();
@@ -78,7 +71,7 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
78
71
  tabIndex: 0,
79
72
  ref: pillWrapperRef
80
73
  },
81
- valueLabel.length < LABEL_MAX_VISIBLE_LENGTH ? pillText : /* @__PURE__ */ React.createElement(Tooltip, { content: /* @__PURE__ */ React.createElement("div", { className: styles.tooltipText }, valueLabel), placement: "top" }, pillText),
74
+ pillTextContent.length < LABEL_MAX_VISIBLE_LENGTH ? pillText : /* @__PURE__ */ React.createElement(Tooltip, { content: /* @__PURE__ */ React.createElement("div", { className: styles.tooltipText }, pillTextContent), placement: "top" }, pillText),
82
75
  !readOnly && !filter.matchAllFilter && (!filter.origin || filter.origin === "dashboard") ? /* @__PURE__ */ React.createElement(
83
76
  IconButton,
84
77
  {
@@ -109,8 +102,9 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
109
102
  tooltip: `Remove filter with key ${keyLabel}`
110
103
  }
111
104
  ) : null,
112
- filter.origin && !filter.restorable && /* @__PURE__ */ React.createElement(Tooltip, { content: injectedInfoText, placement: "bottom" }, /* @__PURE__ */ React.createElement(Icon, { name: "info-circle", size: "md", className: styles.infoPillIcon })),
113
- filter.origin && filter.restorable && /* @__PURE__ */ React.createElement(
105
+ filter.origin && filter.readOnly && /* @__PURE__ */ React.createElement(Tooltip, { content: `${filter.origin} managed filter`, placement: "bottom" }, /* @__PURE__ */ React.createElement(Icon, { name: "lock", size: "md", className: styles.readOnlyPillIcon })),
106
+ filter.origin && !filter.restorable && !filter.readOnly && /* @__PURE__ */ React.createElement(Tooltip, { content: `This is a ${filter.origin} injected filter`, placement: "bottom" }, /* @__PURE__ */ React.createElement(Icon, { name: "info-circle", size: "md", className: styles.infoPillIcon })),
107
+ filter.origin && filter.restorable && !filter.readOnly && /* @__PURE__ */ React.createElement(
114
108
  IconButton,
115
109
  {
116
110
  onClick: (e) => {
@@ -127,7 +121,7 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
127
121
  name: "history",
128
122
  size: "md",
129
123
  className: isMatchAllFilter(filter) ? styles.matchAllPillIcon : styles.pillIcon,
130
- tooltip: injectedRestoreText
124
+ tooltip: `Restore filter to its original value`
131
125
  }
132
126
  )
133
127
  );
@@ -169,6 +163,13 @@ const getStyles = (theme) => ({
169
163
  background: theme.colors.action.selected
170
164
  }
171
165
  }),
166
+ filterReadOnly: css({
167
+ background: theme.colors.background.canvas,
168
+ cursor: "text",
169
+ "&:hover": {
170
+ background: theme.colors.background.canvas
171
+ }
172
+ }),
172
173
  pillIcon: css({
173
174
  marginInline: theme.spacing(0.5),
174
175
  cursor: "pointer",
@@ -189,6 +190,9 @@ const getStyles = (theme) => ({
189
190
  marginInline: theme.spacing(0.5),
190
191
  cursor: "pointer"
191
192
  }),
193
+ readOnlyPillIcon: css({
194
+ marginInline: theme.spacing(0.5)
195
+ }),
192
196
  matchAllPillIcon: css({
193
197
  marginInline: theme.spacing(0.5),
194
198
  cursor: "pointer",
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFilterPill.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, IconButton, Tooltip, Icon } from '@grafana/ui';\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { AdHocCombobox } from './AdHocFiltersCombobox';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable, isMatchAllFilter } from '../AdHocFiltersVariable';\n\nconst LABEL_MAX_VISIBLE_LENGTH = 20;\n\ninterface Props {\n filter: AdHocFilterWithLabels;\n model: AdHocFiltersVariable;\n readOnly?: boolean;\n focusOnWipInputRef?: () => void;\n}\n\nexport function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }: Props) {\n const styles = useStyles2(getStyles);\n const [viewMode, setViewMode] = useState(true);\n const [shouldFocusOnPillWrapper, setShouldFocusOnPillWrapper] = useState(false);\n const pillWrapperRef = useRef<HTMLDivElement>(null);\n const [populateInputOnEdit, setPopulateInputOnEdit] = useState(false);\n\n const keyLabel = filter.keyLabel ?? filter.key;\n const valueLabel = filter.valueLabels?.join(', ') || filter.values?.join(', ') || filter.value;\n\n const handleChangeViewMode = useCallback(\n (event?: React.MouseEvent, shouldFocusOnPillWrapperOverride?: boolean) => {\n event?.stopPropagation();\n if (readOnly) {\n return;\n }\n\n setShouldFocusOnPillWrapper(shouldFocusOnPillWrapperOverride ?? !viewMode);\n setViewMode(!viewMode);\n },\n [readOnly, viewMode]\n );\n\n useEffect(() => {\n if (shouldFocusOnPillWrapper) {\n pillWrapperRef.current?.focus();\n setShouldFocusOnPillWrapper(false);\n }\n }, [shouldFocusOnPillWrapper]);\n\n // set viewMode to false when filter.forceEdit is defined\n useEffect(() => {\n if (filter.forceEdit && viewMode) {\n setViewMode(false);\n // immediately set forceEdit back to undefined as a clean up\n model._updateFilter(filter, { forceEdit: undefined });\n }\n }, [filter, model, viewMode]);\n\n // reset populateInputOnEdit when pill goes into view mode\n useEffect(() => {\n if (viewMode) {\n setPopulateInputOnEdit((prevValue) => (prevValue ? false : prevValue));\n }\n }, [viewMode]);\n\n if (viewMode) {\n const pillText = (\n <span className={styles.pillText}>\n {keyLabel} {filter.operator} {valueLabel}\n </span>\n );\n\n let injectedInfoText = '';\n let injectedRestoreText = '';\n if (filter.origin === 'dashboard') {\n injectedInfoText = 'Applied by default in this dashboard. If edited, it carries over to other dashboards.';\n injectedRestoreText = 'Restore the value defined by this dashboard.';\n } else if (filter.origin === 'scope') {\n injectedInfoText = 'Applied automatically from your selected scope.';\n injectedRestoreText = 'Restore the value set by your selected scope';\n }\n\n return (\n <div\n className={cx(\n styles.combinedFilterPill,\n readOnly && styles.readOnlyCombinedFilter,\n isMatchAllFilter(filter) && styles.matchAllPill\n )}\n onClick={(e) => {\n e.stopPropagation();\n setPopulateInputOnEdit(true);\n handleChangeViewMode();\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n setPopulateInputOnEdit(true);\n handleChangeViewMode();\n }\n }}\n role=\"button\"\n aria-label={`Edit filter with key ${keyLabel}`}\n tabIndex={0}\n ref={pillWrapperRef}\n >\n {valueLabel.length < LABEL_MAX_VISIBLE_LENGTH ? (\n pillText\n ) : (\n <Tooltip content={<div className={styles.tooltipText}>{valueLabel}</div>} placement=\"top\">\n {pillText}\n </Tooltip>\n )}\n\n {!readOnly && !filter.matchAllFilter && (!filter.origin || filter.origin === 'dashboard') ? (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n if (filter.origin && filter.origin === 'dashboard') {\n model.updateToMatchAll(filter);\n } else {\n model._removeFilter(filter);\n }\n\n setTimeout(() => focusOnWipInputRef?.());\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n if (filter.origin && filter.origin === 'dashboard') {\n model.updateToMatchAll(filter);\n } else {\n model._removeFilter(filter);\n }\n setTimeout(() => focusOnWipInputRef?.());\n }\n }}\n name=\"times\"\n size=\"md\"\n className={styles.pillIcon}\n tooltip={`Remove filter with key ${keyLabel}`}\n />\n ) : null}\n\n {filter.origin && !filter.restorable && (\n <Tooltip content={injectedInfoText} placement={'bottom'}>\n <Icon name=\"info-circle\" size=\"md\" className={styles.infoPillIcon} />\n </Tooltip>\n )}\n\n {filter.origin && filter.restorable && (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n model.restoreOriginalFilter(filter);\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n model.restoreOriginalFilter(filter);\n }\n }}\n name=\"history\"\n size=\"md\"\n className={isMatchAllFilter(filter) ? styles.matchAllPillIcon : styles.pillIcon}\n tooltip={injectedRestoreText}\n />\n )}\n </div>\n );\n }\n\n return (\n <AdHocCombobox\n filter={filter}\n model={model}\n handleChangeViewMode={handleChangeViewMode}\n focusOnWipInputRef={focusOnWipInputRef}\n populateInputOnEdit={populateInputOnEdit}\n />\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n combinedFilterPill: css({\n display: 'flex',\n alignItems: 'center',\n background: theme.colors.action.selected,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.125, 0, 0.125, 1),\n color: theme.colors.text.primary,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n minHeight: theme.spacing(2.75),\n ...theme.typography.bodySmall,\n fontWeight: theme.typography.fontWeightBold,\n cursor: 'pointer',\n\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n readOnlyCombinedFilter: css({\n paddingRight: theme.spacing(1),\n cursor: 'text',\n '&:hover': {\n background: theme.colors.action.selected,\n },\n }),\n pillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n pillText: css({\n maxWidth: '200px',\n width: '100%',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }),\n tooltipText: css({\n textAlign: 'center',\n }),\n infoPillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n }),\n matchAllPillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n color: theme.colors.text.disabled,\n }),\n matchAllPill: css({\n background: theme.colors.action.selected,\n color: theme.colors.text.disabled,\n border: 0,\n '&:hover': {\n background: theme.colors.action.selected,\n },\n }),\n});\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"AdHocFilterPill.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, IconButton, Tooltip, Icon } from '@grafana/ui';\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { AdHocCombobox } from './AdHocFiltersCombobox';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable, isMatchAllFilter } from '../AdHocFiltersVariable';\n\nconst LABEL_MAX_VISIBLE_LENGTH = 20;\n\ninterface Props {\n filter: AdHocFilterWithLabels;\n model: AdHocFiltersVariable;\n readOnly?: boolean;\n focusOnWipInputRef?: () => void;\n}\n\nexport function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }: Props) {\n const styles = useStyles2(getStyles);\n const [viewMode, setViewMode] = useState(true);\n const [shouldFocusOnPillWrapper, setShouldFocusOnPillWrapper] = useState(false);\n const pillWrapperRef = useRef<HTMLDivElement>(null);\n const [populateInputOnEdit, setPopulateInputOnEdit] = useState(false);\n\n const keyLabel = filter.keyLabel ?? filter.key;\n const valueLabel = filter.valueLabels?.join(', ') || filter.values?.join(', ') || filter.value;\n\n const handleChangeViewMode = useCallback(\n (event?: React.MouseEvent, shouldFocusOnPillWrapperOverride?: boolean) => {\n event?.stopPropagation();\n if (readOnly) {\n return;\n }\n\n setShouldFocusOnPillWrapper(shouldFocusOnPillWrapperOverride ?? !viewMode);\n setViewMode(!viewMode);\n },\n [readOnly, viewMode]\n );\n\n useEffect(() => {\n if (shouldFocusOnPillWrapper) {\n pillWrapperRef.current?.focus();\n setShouldFocusOnPillWrapper(false);\n }\n }, [shouldFocusOnPillWrapper]);\n\n // set viewMode to false when filter.forceEdit is defined\n useEffect(() => {\n if (filter.forceEdit && viewMode) {\n setViewMode(false);\n // immediately set forceEdit back to undefined as a clean up\n model._updateFilter(filter, { forceEdit: undefined });\n }\n }, [filter, model, viewMode]);\n\n // reset populateInputOnEdit when pill goes into view mode\n useEffect(() => {\n if (viewMode) {\n setPopulateInputOnEdit((prevValue) => (prevValue ? false : prevValue));\n }\n }, [viewMode]);\n\n if (viewMode) {\n const pillTextContent = `${keyLabel} ${filter.operator} ${valueLabel}`;\n const pillText = <span className={styles.pillText}>{pillTextContent}</span>;\n\n return (\n <div\n className={cx(\n styles.combinedFilterPill,\n readOnly && styles.readOnlyCombinedFilter,\n isMatchAllFilter(filter) && styles.matchAllPill,\n filter.readOnly && styles.filterReadOnly\n )}\n onClick={(e) => {\n e.stopPropagation();\n setPopulateInputOnEdit(true);\n handleChangeViewMode();\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n setPopulateInputOnEdit(true);\n handleChangeViewMode();\n }\n }}\n role=\"button\"\n aria-label={`Edit filter with key ${keyLabel}`}\n tabIndex={0}\n ref={pillWrapperRef}\n >\n {pillTextContent.length < LABEL_MAX_VISIBLE_LENGTH ? (\n pillText\n ) : (\n <Tooltip content={<div className={styles.tooltipText}>{pillTextContent}</div>} placement=\"top\">\n {pillText}\n </Tooltip>\n )}\n\n {!readOnly && !filter.matchAllFilter && (!filter.origin || filter.origin === 'dashboard') ? (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n if (filter.origin && filter.origin === 'dashboard') {\n model.updateToMatchAll(filter);\n } else {\n model._removeFilter(filter);\n }\n\n setTimeout(() => focusOnWipInputRef?.());\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n if (filter.origin && filter.origin === 'dashboard') {\n model.updateToMatchAll(filter);\n } else {\n model._removeFilter(filter);\n }\n setTimeout(() => focusOnWipInputRef?.());\n }\n }}\n name=\"times\"\n size=\"md\"\n className={styles.pillIcon}\n tooltip={`Remove filter with key ${keyLabel}`}\n />\n ) : null}\n\n {filter.origin && filter.readOnly && (\n <Tooltip content={`${filter.origin} managed filter`} placement={'bottom'}>\n <Icon name=\"lock\" size=\"md\" className={styles.readOnlyPillIcon} />\n </Tooltip>\n )}\n\n {filter.origin && !filter.restorable && !filter.readOnly && (\n <Tooltip content={`This is a ${filter.origin} injected filter`} placement={'bottom'}>\n <Icon name=\"info-circle\" size=\"md\" className={styles.infoPillIcon} />\n </Tooltip>\n )}\n\n {filter.origin && filter.restorable && !filter.readOnly && (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n model.restoreOriginalFilter(filter);\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n model.restoreOriginalFilter(filter);\n }\n }}\n name=\"history\"\n size=\"md\"\n className={isMatchAllFilter(filter) ? styles.matchAllPillIcon : styles.pillIcon}\n tooltip={`Restore filter to its original value`}\n />\n )}\n </div>\n );\n }\n\n return (\n <AdHocCombobox\n filter={filter}\n model={model}\n handleChangeViewMode={handleChangeViewMode}\n focusOnWipInputRef={focusOnWipInputRef}\n populateInputOnEdit={populateInputOnEdit}\n />\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n combinedFilterPill: css({\n display: 'flex',\n alignItems: 'center',\n background: theme.colors.action.selected,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.125, 0, 0.125, 1),\n color: theme.colors.text.primary,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n minHeight: theme.spacing(2.75),\n ...theme.typography.bodySmall,\n fontWeight: theme.typography.fontWeightBold,\n cursor: 'pointer',\n\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n readOnlyCombinedFilter: css({\n paddingRight: theme.spacing(1),\n cursor: 'text',\n '&:hover': {\n background: theme.colors.action.selected,\n },\n }),\n filterReadOnly: css({\n background: theme.colors.background.canvas,\n cursor: 'text',\n '&:hover': {\n background: theme.colors.background.canvas,\n },\n }),\n pillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n pillText: css({\n maxWidth: '200px',\n width: '100%',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }),\n tooltipText: css({\n textAlign: 'center',\n }),\n infoPillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n }),\n readOnlyPillIcon: css({\n marginInline: theme.spacing(0.5),\n }),\n matchAllPillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n color: theme.colors.text.disabled,\n }),\n matchAllPill: css({\n background: theme.colors.action.selected,\n color: theme.colors.text.disabled,\n border: 0,\n '&:hover': {\n background: theme.colors.action.selected,\n },\n }),\n});\n"],"names":["_a"],"mappings":";;;;;;AAOA,MAAM,wBAA2B,GAAA,EAAA;AAS1B,SAAS,gBAAgB,EAAE,MAAA,EAAQ,KAAO,EAAA,QAAA,EAAU,oBAA6B,EAAA;AAhBxF,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiBE,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9E,EAAM,MAAA,cAAA,GAAiB,OAAuB,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,KAAK,CAAA;AAEpE,EAAA,MAAM,QAAW,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,QAAP,KAAA,IAAA,GAAA,EAAA,GAAmB,MAAO,CAAA,GAAA;AAC3C,EAAM,MAAA,UAAA,GAAA,CAAA,CAAa,EAAO,GAAA,MAAA,CAAA,WAAA,KAAP,IAAoB,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAK,IAAS,CAAA,MAAA,CAAA,EAAA,GAAA,MAAA,CAAO,MAAP,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,IAAK,CAAA,IAAA,CAAA,CAAA,IAAS,MAAO,CAAA,KAAA;AAEzF,EAAA,MAAM,oBAAuB,GAAA,WAAA;AAAA,IAC3B,CAAC,OAA0B,gCAA+C,KAAA;AACxE,MAAO,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,eAAA,EAAA;AACP,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA;AAAA;AAGF,MAA4B,2BAAA,CAAA,gCAAA,IAAA,IAAA,GAAA,gCAAA,GAAoC,CAAC,QAAQ,CAAA;AACzE,MAAA,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,KACvB;AAAA,IACA,CAAC,UAAU,QAAQ;AAAA,GACrB;AAEA,EAAA,SAAA,CAAU,MAAM;AAvClB,IAAAA,IAAAA,GAAAA;AAwCI,IAAA,IAAI,wBAA0B,EAAA;AAC5B,MAAA,CAAAA,GAAA,GAAA,cAAA,CAAe,OAAf,KAAA,IAAA,GAAA,MAAA,GAAAA,GAAwB,CAAA,KAAA,EAAA;AACxB,MAAA,2BAAA,CAA4B,KAAK,CAAA;AAAA;AACnC,GACF,EAAG,CAAC,wBAAwB,CAAC,CAAA;AAG7B,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,MAAA,CAAO,aAAa,QAAU,EAAA;AAChC,MAAA,WAAA,CAAY,KAAK,CAAA;AAEjB,MAAA,KAAA,CAAM,aAAc,CAAA,MAAA,EAAQ,EAAE,SAAA,EAAW,QAAW,CAAA;AAAA;AACtD,GACC,EAAA,CAAC,MAAQ,EAAA,KAAA,EAAO,QAAQ,CAAC,CAAA;AAG5B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,sBAAA,CAAuB,CAAC,SAAA,KAAe,SAAY,GAAA,KAAA,GAAQ,SAAU,CAAA;AAAA;AACvE,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,IAAI,QAAU,EAAA;AACZ,IAAA,MAAM,kBAAkB,CAAG,EAAA,QAAQ,IAAI,MAAO,CAAA,QAAQ,IAAI,UAAU,CAAA,CAAA;AACpE,IAAA,MAAM,2BAAY,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,MAAA,CAAO,YAAW,eAAgB,CAAA;AAEpE,IACE,uBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,EAAA;AAAA,UACT,MAAO,CAAA,kBAAA;AAAA,UACP,YAAY,MAAO,CAAA,sBAAA;AAAA,UACnB,gBAAA,CAAiB,MAAM,CAAA,IAAK,MAAO,CAAA,YAAA;AAAA,UACnC,MAAA,CAAO,YAAY,MAAO,CAAA;AAAA,SAC5B;AAAA,QACA,OAAA,EAAS,CAAC,CAAM,KAAA;AACd,UAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,UAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,UAAqB,oBAAA,EAAA;AAAA,SACvB;AAAA,QACA,SAAA,EAAW,CAAC,CAAM,KAAA;AAChB,UAAI,IAAA,CAAA,CAAE,QAAQ,OAAS,EAAA;AACrB,YAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,YAAqB,oBAAA,EAAA;AAAA;AACvB,SACF;AAAA,QACA,IAAK,EAAA,QAAA;AAAA,QACL,YAAA,EAAY,wBAAwB,QAAQ,CAAA,CAAA;AAAA,QAC5C,QAAU,EAAA,CAAA;AAAA,QACV,GAAK,EAAA;AAAA,OAAA;AAAA,MAEJ,gBAAgB,MAAS,GAAA,wBAAA,GACxB,QAEA,mBAAA,KAAA,CAAA,aAAA,CAAC,WAAQ,OAAS,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,OAAO,WAAc,EAAA,EAAA,eAAgB,CAAQ,EAAA,SAAA,EAAU,SACtF,QACH,CAAA;AAAA,MAGD,CAAC,QAAY,IAAA,CAAC,MAAO,CAAA,cAAA,KAAmB,CAAC,MAAO,CAAA,MAAA,IAAU,MAAO,CAAA,MAAA,KAAW,WAC3E,CAAA,mBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAM,KAAA;AACd,YAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,YAAA,IAAI,MAAO,CAAA,MAAA,IAAU,MAAO,CAAA,MAAA,KAAW,WAAa,EAAA;AAClD,cAAA,KAAA,CAAM,iBAAiB,MAAM,CAAA;AAAA,aACxB,MAAA;AACL,cAAA,KAAA,CAAM,cAAc,MAAM,CAAA;AAAA;AAG5B,YAAA,UAAA,CAAW,MAAM,kBAAsB,IAAA,IAAA,GAAA,MAAA,GAAA,kBAAA,EAAA,CAAA;AAAA,WACzC;AAAA,UACA,gBAAA,EAAkB,CAAC,CAAM,KAAA;AACvB,YAAI,IAAA,CAAA,CAAE,QAAQ,OAAS,EAAA;AACrB,cAAA,CAAA,CAAE,cAAe,EAAA;AACjB,cAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,cAAA,IAAI,MAAO,CAAA,MAAA,IAAU,MAAO,CAAA,MAAA,KAAW,WAAa,EAAA;AAClD,gBAAA,KAAA,CAAM,iBAAiB,MAAM,CAAA;AAAA,eACxB,MAAA;AACL,gBAAA,KAAA,CAAM,cAAc,MAAM,CAAA;AAAA;AAE5B,cAAA,UAAA,CAAW,MAAM,kBAAsB,IAAA,IAAA,GAAA,MAAA,GAAA,kBAAA,EAAA,CAAA;AAAA;AACzC,WACF;AAAA,UACA,IAAK,EAAA,OAAA;AAAA,UACL,IAAK,EAAA,IAAA;AAAA,UACL,WAAW,MAAO,CAAA,QAAA;AAAA,UAClB,OAAA,EAAS,0BAA0B,QAAQ,CAAA;AAAA;AAAA,OAE3C,GAAA,IAAA;AAAA,MAEH,MAAA,CAAO,UAAU,MAAO,CAAA,QAAA,wCACtB,OAAQ,EAAA,EAAA,OAAA,EAAS,CAAG,EAAA,MAAA,CAAO,MAAM,CAAA,eAAA,CAAA,EAAmB,WAAW,QAC9D,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAK,EAAA,MAAA,EAAO,MAAK,IAAK,EAAA,SAAA,EAAW,MAAO,CAAA,gBAAA,EAAkB,CAClE,CAAA;AAAA,MAGD,MAAA,CAAO,MAAU,IAAA,CAAC,MAAO,CAAA,UAAA,IAAc,CAAC,MAAA,CAAO,QAC9C,oBAAA,KAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,OAAA,EAAS,CAAa,UAAA,EAAA,MAAA,CAAO,MAAM,CAAoB,gBAAA,CAAA,EAAA,SAAA,EAAW,QACzE,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAK,aAAc,EAAA,IAAA,EAAK,IAAK,EAAA,SAAA,EAAW,MAAO,CAAA,YAAA,EAAc,CACrE,CAAA;AAAA,MAGD,OAAO,MAAU,IAAA,MAAA,CAAO,UAAc,IAAA,CAAC,OAAO,QAC7C,oBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAM,KAAA;AACd,YAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,YAAA,KAAA,CAAM,sBAAsB,MAAM,CAAA;AAAA,WACpC;AAAA,UACA,gBAAA,EAAkB,CAAC,CAAM,KAAA;AACvB,YAAI,IAAA,CAAA,CAAE,QAAQ,OAAS,EAAA;AACrB,cAAA,CAAA,CAAE,cAAe,EAAA;AACjB,cAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,cAAA,KAAA,CAAM,sBAAsB,MAAM,CAAA;AAAA;AACpC,WACF;AAAA,UACA,IAAK,EAAA,SAAA;AAAA,UACL,IAAK,EAAA,IAAA;AAAA,UACL,WAAW,gBAAiB,CAAA,MAAM,CAAI,GAAA,MAAA,CAAO,mBAAmB,MAAO,CAAA,QAAA;AAAA,UACvE,OAAS,EAAA,CAAA,oCAAA;AAAA;AAAA;AACX,KAEJ;AAAA;AAIJ,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,KAAA;AAAA,MACA,oBAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAEA,MAAM,SAAA,GAAY,CAAC,KAA0B,MAAA;AAAA,EAC3C,oBAAoB,GAAI,CAAA;AAAA,IACtB,OAAS,EAAA,MAAA;AAAA,IACT,UAAY,EAAA,QAAA;AAAA,IACZ,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA,QAAA;AAAA,IAChC,YAAA,EAAc,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA;AAAA,IACjC,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,MAAA,CAAO,OAAO,IAAI,CAAA,CAAA;AAAA,IAC7C,SAAS,KAAM,CAAA,OAAA,CAAQ,KAAO,EAAA,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,IACzC,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,OAAA;AAAA,IACzB,QAAU,EAAA,QAAA;AAAA,IACV,UAAY,EAAA,QAAA;AAAA,IACZ,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC7B,GAAG,MAAM,UAAW,CAAA,SAAA;AAAA,IACpB,UAAA,EAAY,MAAM,UAAW,CAAA,cAAA;AAAA,IAC7B,MAAQ,EAAA,SAAA;AAAA,IAER,SAAW,EAAA;AAAA,MACT,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA;AAAA;AAClC,GACD,CAAA;AAAA,EACD,wBAAwB,GAAI,CAAA;AAAA,IAC1B,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC7B,MAAQ,EAAA,MAAA;AAAA,IACR,SAAW,EAAA;AAAA,MACT,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA;AAAA;AAClC,GACD,CAAA;AAAA,EACD,gBAAgB,GAAI,CAAA;AAAA,IAClB,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,UAAW,CAAA,MAAA;AAAA,IACpC,MAAQ,EAAA,MAAA;AAAA,IACR,SAAW,EAAA;AAAA,MACT,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,UAAW,CAAA;AAAA;AACtC,GACD,CAAA;AAAA,EACD,UAAU,GAAI,CAAA;AAAA,IACZ,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC/B,MAAQ,EAAA,SAAA;AAAA,IACR,SAAW,EAAA;AAAA,MACT,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA;AAAA;AAC3B,GACD,CAAA;AAAA,EACD,UAAU,GAAI,CAAA;AAAA,IACZ,QAAU,EAAA,OAAA;AAAA,IACV,KAAO,EAAA,MAAA;AAAA,IACP,YAAc,EAAA,UAAA;AAAA,IACd,QAAU,EAAA;AAAA,GACX,CAAA;AAAA,EACD,aAAa,GAAI,CAAA;AAAA,IACf,SAAW,EAAA;AAAA,GACZ,CAAA;AAAA,EACD,cAAc,GAAI,CAAA;AAAA,IAChB,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC/B,MAAQ,EAAA;AAAA,GACT,CAAA;AAAA,EACD,kBAAkB,GAAI,CAAA;AAAA,IACpB,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG;AAAA,GAChC,CAAA;AAAA,EACD,kBAAkB,GAAI,CAAA;AAAA,IACpB,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC/B,MAAQ,EAAA,SAAA;AAAA,IACR,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA;AAAA,GAC1B,CAAA;AAAA,EACD,cAAc,GAAI,CAAA;AAAA,IAChB,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA,QAAA;AAAA,IAChC,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,QAAA;AAAA,IACzB,MAAQ,EAAA,CAAA;AAAA,IACR,SAAW,EAAA;AAAA,MACT,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA;AAAA;AAClC,GACD;AACH,CAAA,CAAA;;;;"}
@@ -274,7 +274,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
274
274
  }
275
275
  this.setState({
276
276
  filters: this.state.filters.reduce((acc, f, index) => {
277
- if (index === filterToForceIndex) {
277
+ if (index === filterToForceIndex && !f.readOnly) {
278
278
  return [
279
279
  ...acc,
280
280
  {
@@ -296,7 +296,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
296
296
  }
297
297
  this.setState({
298
298
  baseFilters: this.state.baseFilters.reduce((acc, f, index) => {
299
- if (index === filterToForceIndex) {
299
+ if (index === filterToForceIndex && !f.readOnly) {
300
300
  return [
301
301
  ...acc,
302
302
  {
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport {\n AdHocVariableFilter,\n GetTagResponse,\n GrafanaTheme2,\n MetricFindValue,\n Scope,\n SelectableValue,\n} from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent, VariableValue } from '../types';\nimport { ControlsLayout, SceneComponentProps } from '../../core/types';\nimport { DataSourceRef } from '@grafana/schema';\nimport { dataFromResponse, getQueriesForVariables, renderPrometheusLabelFilters, responseHasError } from '../utils';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { useStyles2 } from '@grafana/ui';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { css } from '@emotion/css';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { SceneScopesBridge } from '../../core/SceneScopesBridge';\nimport { isEqual } from 'lodash';\nimport { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes';\n\nexport interface AdHocFilterWithLabels<M extends Record<string, any> = {}> extends AdHocVariableFilter {\n keyLabel?: string;\n valueLabels?: string[];\n // this is used to externally trigger edit mode in combobox filter UI\n forceEdit?: boolean;\n // hide the filter from AdHocFiltersVariableRenderer and the URL\n hidden?: boolean;\n meta?: M;\n // filter origin, it can be either scopes, dashboards or undefined,\n // which means it won't appear in the UI\n origin?: FilterOrigin;\n // whether this is basically a cancelled filter through filter-key =~ .*\n matchAllFilter?: boolean;\n // whether this specific filter is read-only and cannot be edited\n readOnly?: boolean;\n // whether this specific filter is restorable to some value from _originalValues\n restorable?: boolean;\n}\n\nexport type AdHocControlsLayout = ControlsLayout | 'combobox';\n\nexport type FilterOrigin = 'dashboard' | 'scope';\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /** Optional text to display on the 'add filter' button */\n addFilterButtonText?: string;\n /** The visible filters */\n filters: AdHocFilterWithLabels[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocFilterWithLabels[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n */\n layout?: AdHocControlsLayout;\n /**\n * Defaults to automatic which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode you either have to use the filters programmatically or as a variable inside query expressions.\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 * Extension hook for customizing the value 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 getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * Optionally provide an array of static keys that override getTagKeys\n */\n defaultKeys?: MetricFindValue[];\n\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label filter expression\n */\n filterExpression?: string;\n\n /**\n * The default builder creates a Prometheus/Loki compatible filter expression,\n * this can be overridden to create a different expression based on the current filters.\n */\n expressionBuilder?: AdHocVariableExpressionBuilderFn;\n\n /**\n * Whether the filter supports new multi-value operators like =| and !=|\n */\n supportsMultiValueOperators?: boolean;\n\n /**\n * When querying the datasource for label names and values to determine keys and values\n * for this ad hoc filter, consider the queries in the scene and use them as a filter.\n * This queries filter can be used to ensure that only ad hoc filter options that would\n * impact the current queries are presented to the user.\n */\n useQueriesAsFilterForOptions?: boolean;\n\n /**\n * Flag that decides whether custom values can be added to the filter\n */\n allowCustomValue?: boolean;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocFilterWithLabels;\n\n /**\n * Allows custom formatting of a value before saving to filter state\n */\n onAddCustomValue?: OnAddCustomValueFn;\n}\n\nexport type AdHocVariableExpressionBuilderFn = (filters: AdHocFilterWithLabels[]) => string;\nexport type OnAddCustomValueFn = (\n item: SelectableValue<string> & { isCustom?: boolean },\n filter: AdHocFilterWithLabels\n) => { value: string | undefined; valueLabels: string[] };\n\nexport type getTagKeysProvider = (\n variable: AdHocFiltersVariable,\n currentKey: string | null,\n operators?: OperatorDefinition[]\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n variable: AdHocFiltersVariable,\n filter: AdHocFilterWithLabels\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type AdHocFiltersVariableCreateHelperArgs = AdHocFiltersVariableState;\n\nexport type OperatorDefinition = {\n value: string;\n description?: string;\n isMulti?: Boolean;\n isRegex?: Boolean;\n};\n\nexport const OPERATORS: OperatorDefinition[] = [\n {\n value: '=',\n description: 'Equals',\n },\n {\n value: '!=',\n description: 'Not equal',\n },\n {\n value: '=|',\n description: 'One of. Use to filter on multiple values.',\n isMulti: true,\n },\n {\n value: '!=|',\n description: 'Not one of. Use to exclude multiple values.',\n isMulti: true,\n },\n {\n value: '=~',\n description: 'Matches regex',\n isRegex: true,\n },\n {\n value: '!~',\n description: 'Does not match regex',\n isRegex: true,\n },\n {\n value: '<',\n description: 'Less than',\n },\n {\n value: '>',\n description: 'Greater than',\n },\n];\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n static Component = AdHocFiltersVariableRenderer;\n\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _dataSourceSrv = getDataSourceSrv();\n private _scopesBridge: SceneScopesBridge | undefined;\n // holds the originalValues of all baseFilters in a map. The values\n // are set on construct and used to restore a baseFilter with an origin\n // to its original value if edited at some point\n private _originalValues: Map<string, { value: string[]; operator: string }> = new Map();\n\n protected _urlSync = new AdHocFiltersVariableUrlSyncHandler(this);\n\n public constructor(state: Partial<AdHocFiltersVariableState>) {\n super({\n type: 'adhoc',\n name: state.name ?? 'Filters',\n filters: [],\n datasource: null,\n applyMode: 'auto',\n filterExpression:\n state.filterExpression ??\n renderExpression(state.expressionBuilder, [\n ...(state.baseFilters?.filter((filter) => filter.origin) ?? []),\n ...(state.filters ?? []),\n ]),\n ...state,\n });\n\n if (this.state.applyMode === 'auto') {\n patchGetAdhocFilters(this);\n }\n\n // set dashboard lvl original values in constructor, since we have them from schema\n this.state.baseFilters?.forEach((baseFilter) => {\n if (baseFilter.origin === 'dashboard') {\n this._originalValues.set(baseFilter.key, {\n operator: baseFilter.operator,\n value: baseFilter.values ?? [baseFilter.value],\n });\n }\n });\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._scopesBridge = sceneGraph.getScopesBridge(this);\n\n const scopes = this._scopesBridge?.getValue();\n\n if (scopes) {\n this._updateScopesFilters(scopes);\n }\n\n const sub = this._scopesBridge?.subscribeToValue((n, _) => {\n this._updateScopesFilters(n);\n });\n\n return () => {\n sub?.unsubscribe();\n\n // we clear both scopes and dashboard level filters before leaving a dashboard to maintain accuracy for both\n // when/if we return to the same dashboard\n // e.g.: we edit a scope filter and go to another dashboard, it gets carried over, but then on that dashboard\n // we reset the value, and then come back to the initial dashboard, that dashboard still has the edited scope\n // because the URL will not hold any value, since on reset we clear the url, but the initial dashboard still\n // has the changed value in the schema, unless we reset it here\n if (this.state.baseFilters?.length) {\n this.setState({\n baseFilters: [...this.state.baseFilters.filter((filter) => filter.origin !== 'scope')],\n });\n // same for dashboard level filters if we edit one and go to another dashboard, reset to whatever initial value is there\n // and come back to the initial one it will use the last modified value it has, since URL is empty from the reset done\n // before\n this.state.baseFilters?.forEach((filter) => {\n if (filter.origin === 'dashboard' && filter.restorable) {\n this.restoreOriginalFilter(filter);\n }\n });\n }\n };\n };\n\n private _updateScopesFilters(scopes: Scope[]) {\n if (!scopes.length) {\n this.setState({\n baseFilters: this.state.baseFilters?.filter((filter) => filter.origin !== 'scope'),\n });\n return;\n }\n\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\n\n if (!scopeFilters.length) {\n return;\n }\n\n let finalFilters = scopeFilters;\n const scopeInjectedFilters: AdHocFilterWithLabels[] = [];\n const remainingFilters: AdHocFilterWithLabels[] = [];\n\n // set original values for scope filters as well\n finalFilters.forEach((scopeFilter) => {\n this._originalValues.set(scopeFilter.key, {\n value: scopeFilter.values ?? [scopeFilter.value],\n operator: scopeFilter.operator,\n });\n });\n\n this.state.baseFilters?.forEach((filter) => {\n if (filter.origin === 'scope') {\n scopeInjectedFilters.push(filter);\n } else {\n remainingFilters.push(filter);\n }\n });\n\n const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);\n const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);\n const scopeFilterKeys = scopeFilters.map((filter) => filter.key);\n\n // if the scope filters contain the key of an edited scope filter, we replace\n // with the edited filter. We also add the remaining unedited scope filters\n // when not overwriting\n finalFilters = [\n ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),\n ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key)),\n ];\n\n // maintain other baseFilters in the array, only update scopes ones\n this.setState({ baseFilters: [...finalFilters, ...remainingFilters] });\n }\n\n public setState(update: Partial<AdHocFiltersVariableState>): void {\n let filterExpressionChanged = false;\n\n if (\n ((update.filters && update.filters !== this.state.filters) ||\n (update.baseFilters && update.baseFilters !== this.state.baseFilters)) &&\n !update.filterExpression\n ) {\n const filters = update.filters ?? this.state.filters;\n const baseFilters = update.baseFilters ?? this.state.baseFilters;\n\n update.filterExpression = renderExpression(this.state.expressionBuilder, [\n ...(baseFilters?.filter((filter) => filter.origin) ?? []),\n ...(filters ?? []),\n ]);\n filterExpressionChanged = update.filterExpression !== this.state.filterExpression;\n }\n\n super.setState(update);\n\n if (filterExpressionChanged) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n /**\n * Updates the variable's `filters` and `filterExpression` state.\n * If `skipPublish` option is true, this will not emit the `SceneVariableValueChangedEvent`,\n * allowing consumers to update the filters without triggering dependent data providers.\n */\n public updateFilters(\n filters: AdHocFilterWithLabels[],\n options?: {\n skipPublish?: boolean;\n forcePublish?: boolean;\n }\n ): void {\n let filterExpressionChanged = false;\n let filterExpression: string | undefined = undefined;\n\n if (filters && filters !== this.state.filters) {\n filterExpression = renderExpression(this.state.expressionBuilder, [\n ...(this.state.baseFilters?.filter((filter) => filter.origin) ?? []),\n ...filters,\n ]);\n filterExpressionChanged = filterExpression !== this.state.filterExpression;\n }\n\n super.setState({\n filters,\n filterExpression,\n });\n\n if ((filterExpressionChanged && options?.skipPublish !== true) || options?.forcePublish) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n public restoreOriginalFilter(filter: AdHocFilterWithLabels) {\n const original: Partial<AdHocFilterWithLabels> = {\n matchAllFilter: false,\n restorable: false,\n };\n\n if (filter.restorable) {\n const originalFilter = this._originalValues.get(filter.key);\n\n original.value = originalFilter?.value[0];\n original.values = originalFilter?.value;\n // we don't care much about the labels in this injected filters scenario\n // but this is needed to rerender the filter with the proper values\n // in the UI. E.g.: in a multi-value on hover, it shows the correct values\n original.valueLabels = originalFilter?.value;\n original.operator = originalFilter?.operator;\n }\n\n this._updateFilter(filter, original);\n }\n\n public getValue(): VariableValue | undefined {\n return this.state.filterExpression;\n }\n\n public _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>) {\n const { baseFilters, filters, _wip } = this.state;\n\n if (filter.origin) {\n const originalValues = this._originalValues.get(filter.key);\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n\n // if we don't have the restorable prop set but values differ we set it true\n // this happens when editing the value of an injected filter\n // we also make sure to set restorable false if values are the same as original\n // e.g.: if we edit the value of a filter to whatever the original was, manually\n // 'restoring' the filter\n const isRestorableOverride = update.hasOwnProperty('restorable');\n if (\n !isRestorableOverride &&\n ((updateValues && !isEqual(updateValues, originalValues?.value)) ||\n (update.operator && update.operator !== originalValues?.operator))\n ) {\n update.restorable = true;\n } else if (updateValues && isEqual(updateValues, originalValues?.value)) {\n update.restorable = false;\n }\n\n const updatedBaseFilters =\n baseFilters?.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n }) ?? [];\n this.setState({ baseFilters: updatedBaseFilters });\n\n return;\n }\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n this.setState({ filters: [...filters, { ..._wip, ...update }], _wip: undefined });\n } else {\n this.setState({ _wip: { ...filter, ...update } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n });\n\n this.setState({ filters: updatedFilters });\n }\n\n public updateToMatchAll(filter: AdHocFilterWithLabels) {\n this._updateFilter(filter, {\n operator: '=~',\n value: '.*',\n values: ['.*'],\n valueLabels: ['All'],\n matchAllFilter: true,\n restorable: true,\n });\n }\n\n public _removeFilter(filter: AdHocFilterWithLabels) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n this.setState({ filters: this.state.filters.filter((f) => f !== filter) });\n }\n\n public _removeLastFilter() {\n const filterToRemove = this.state.filters.at(-1);\n\n if (filterToRemove) {\n this._removeFilter(filterToRemove);\n }\n }\n\n public _handleComboboxBackspace(filter: AdHocFilterWithLabels) {\n if (this.state.filters.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.filters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n filters: this.state.filters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n } else if (this.state.baseFilters?.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.baseFilters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n baseFilters: this.state.baseFilters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n }\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n if (this.state.defaultKeys) {\n return this.state.defaultKeys.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const otherFilters = this.state.filters.filter((f) => f.key !== currentKey).concat(this.state.baseFilters ?? []);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n scopes: this._scopesBridge?.getValue(),\n ...getEnrichedFiltersRequest(this),\n });\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.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocFilterWithLabels): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n const filteredBaseFilters = this.state.baseFilters?.filter((f) => f.origin && f.key !== filter.key) ?? [];\n // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(filteredBaseFilters);\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n let scopes = this._scopesBridge?.getValue();\n\n // if current filter is a scope injected one we need to filter out\n // filters with same key in scopes prop, similar to how we do in adhocFilters prop\n if (filter.origin === 'scope') {\n scopes = scopes?.map((scope) => {\n return {\n ...scope,\n spec: {\n ...scope.spec,\n filters: scope.spec.filters.filter((f) => f.key !== filter.key),\n },\n };\n });\n }\n\n const response = await ds.getTagValues({\n key: filter.key,\n filters: otherFilters,\n timeRange,\n queries,\n scopes,\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let values = dataFromResponse(response);\n if (override) {\n values = values.concat(dataFromResponse(override.values));\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({\n _wip: { key: '', value: '', operator: '=', condition: '' },\n });\n }\n\n public _getOperators() {\n const { supportsMultiValueOperators, allowCustomValue = true } = this.state;\n\n return OPERATORS.filter(({ isMulti, isRegex }) => {\n if (!supportsMultiValueOperators && isMulti) {\n return false;\n }\n if (!allowCustomValue && isRegex) {\n return false;\n }\n return true;\n }).map<SelectableValue<string>>(({ value, description }) => ({\n label: value,\n value,\n description,\n }));\n }\n}\n\nfunction renderExpression(\n builder: AdHocVariableExpressionBuilderFn | undefined,\n filters: AdHocFilterWithLabels[] | undefined\n) {\n return (builder ?? renderPrometheusLabelFilters)(filters ?? []);\n}\n\nexport function AdHocFiltersVariableRenderer({ model }: SceneComponentProps<AdHocFiltersVariable>) {\n const { filters, readOnly, addFilterButtonText } = model.useState();\n const styles = useStyles2(getStyles);\n\n if (model.state.layout === 'combobox') {\n return <AdHocFiltersComboboxRenderer model={model} />;\n }\n\n return (\n <div className={styles.wrapper}>\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" addFilterButtonText={addFilterButtonText} />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-end',\n columnGap: theme.spacing(2),\n rowGap: theme.spacing(1),\n }),\n});\n\nexport function toSelectableValue(input: MetricFindValue): SelectableValue<string> {\n const { text, value } = input;\n const result: SelectableValue<string> = {\n // converting text to string due to some edge cases where it can be a number\n // TODO: remove once https://github.com/grafana/grafana/issues/99021 is closed\n label: String(text),\n value: String(value ?? text),\n };\n\n if ('group' in input) {\n result.group = input.group;\n }\n\n if ('meta' in input) {\n result.meta = input.meta;\n }\n\n return result;\n}\n\nexport function isMatchAllFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === '=~' && filter.value === '.*';\n}\n\nexport function isFilterComplete(filter: AdHocFilterWithLabels): boolean {\n return filter.key !== '' && filter.operator !== '' && filter.value !== '';\n}\n\nexport function isMultiValueOperator(operatorValue: string): boolean {\n const operator = OPERATORS.find((o) => o.value === operatorValue);\n if (!operator) {\n // default to false if operator is not found\n return false;\n }\n return Boolean(operator.isMulti);\n}\n"],"names":["_a","_b"],"mappings":"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"}
1
+ {"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport {\n AdHocVariableFilter,\n GetTagResponse,\n GrafanaTheme2,\n MetricFindValue,\n Scope,\n SelectableValue,\n} from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent, VariableValue } from '../types';\nimport { ControlsLayout, SceneComponentProps } from '../../core/types';\nimport { DataSourceRef } from '@grafana/schema';\nimport { dataFromResponse, getQueriesForVariables, renderPrometheusLabelFilters, responseHasError } from '../utils';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { useStyles2 } from '@grafana/ui';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { css } from '@emotion/css';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { SceneScopesBridge } from '../../core/SceneScopesBridge';\nimport { isEqual } from 'lodash';\nimport { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes';\n\nexport interface AdHocFilterWithLabels<M extends Record<string, any> = {}> extends AdHocVariableFilter {\n keyLabel?: string;\n valueLabels?: string[];\n // this is used to externally trigger edit mode in combobox filter UI\n forceEdit?: boolean;\n // hide the filter from AdHocFiltersVariableRenderer and the URL\n hidden?: boolean;\n meta?: M;\n // filter origin, it can be either scopes, dashboards or undefined,\n // which means it won't appear in the UI\n origin?: FilterOrigin;\n // whether this is basically a cancelled filter through filter-key =~ .*\n matchAllFilter?: boolean;\n // whether this specific filter is read-only and cannot be edited\n readOnly?: boolean;\n // whether this specific filter is restorable to some value from _originalValues\n restorable?: boolean;\n}\n\nexport type AdHocControlsLayout = ControlsLayout | 'combobox';\n\nexport type FilterOrigin = 'dashboard' | 'scope' | string;\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /** Optional text to display on the 'add filter' button */\n addFilterButtonText?: string;\n /** The visible filters */\n filters: AdHocFilterWithLabels[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocFilterWithLabels[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n */\n layout?: AdHocControlsLayout;\n /**\n * Defaults to automatic which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode you either have to use the filters programmatically or as a variable inside query expressions.\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 * Extension hook for customizing the value 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 getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * Optionally provide an array of static keys that override getTagKeys\n */\n defaultKeys?: MetricFindValue[];\n\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label filter expression\n */\n filterExpression?: string;\n\n /**\n * The default builder creates a Prometheus/Loki compatible filter expression,\n * this can be overridden to create a different expression based on the current filters.\n */\n expressionBuilder?: AdHocVariableExpressionBuilderFn;\n\n /**\n * Whether the filter supports new multi-value operators like =| and !=|\n */\n supportsMultiValueOperators?: boolean;\n\n /**\n * When querying the datasource for label names and values to determine keys and values\n * for this ad hoc filter, consider the queries in the scene and use them as a filter.\n * This queries filter can be used to ensure that only ad hoc filter options that would\n * impact the current queries are presented to the user.\n */\n useQueriesAsFilterForOptions?: boolean;\n\n /**\n * Flag that decides whether custom values can be added to the filter\n */\n allowCustomValue?: boolean;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocFilterWithLabels;\n\n /**\n * Allows custom formatting of a value before saving to filter state\n */\n onAddCustomValue?: OnAddCustomValueFn;\n}\n\nexport type AdHocVariableExpressionBuilderFn = (filters: AdHocFilterWithLabels[]) => string;\nexport type OnAddCustomValueFn = (\n item: SelectableValue<string> & { isCustom?: boolean },\n filter: AdHocFilterWithLabels\n) => { value: string | undefined; valueLabels: string[] };\n\nexport type getTagKeysProvider = (\n variable: AdHocFiltersVariable,\n currentKey: string | null,\n operators?: OperatorDefinition[]\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n variable: AdHocFiltersVariable,\n filter: AdHocFilterWithLabels\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type AdHocFiltersVariableCreateHelperArgs = AdHocFiltersVariableState;\n\nexport type OperatorDefinition = {\n value: string;\n description?: string;\n isMulti?: Boolean;\n isRegex?: Boolean;\n};\n\nexport const OPERATORS: OperatorDefinition[] = [\n {\n value: '=',\n description: 'Equals',\n },\n {\n value: '!=',\n description: 'Not equal',\n },\n {\n value: '=|',\n description: 'One of. Use to filter on multiple values.',\n isMulti: true,\n },\n {\n value: '!=|',\n description: 'Not one of. Use to exclude multiple values.',\n isMulti: true,\n },\n {\n value: '=~',\n description: 'Matches regex',\n isRegex: true,\n },\n {\n value: '!~',\n description: 'Does not match regex',\n isRegex: true,\n },\n {\n value: '<',\n description: 'Less than',\n },\n {\n value: '>',\n description: 'Greater than',\n },\n];\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n static Component = AdHocFiltersVariableRenderer;\n\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _dataSourceSrv = getDataSourceSrv();\n private _scopesBridge: SceneScopesBridge | undefined;\n // holds the originalValues of all baseFilters in a map. The values\n // are set on construct and used to restore a baseFilter with an origin\n // to its original value if edited at some point\n private _originalValues: Map<string, { value: string[]; operator: string }> = new Map();\n\n protected _urlSync = new AdHocFiltersVariableUrlSyncHandler(this);\n\n public constructor(state: Partial<AdHocFiltersVariableState>) {\n super({\n type: 'adhoc',\n name: state.name ?? 'Filters',\n filters: [],\n datasource: null,\n applyMode: 'auto',\n filterExpression:\n state.filterExpression ??\n renderExpression(state.expressionBuilder, [\n ...(state.baseFilters?.filter((filter) => filter.origin) ?? []),\n ...(state.filters ?? []),\n ]),\n ...state,\n });\n\n if (this.state.applyMode === 'auto') {\n patchGetAdhocFilters(this);\n }\n\n // set dashboard lvl original values in constructor, since we have them from schema\n this.state.baseFilters?.forEach((baseFilter) => {\n if (baseFilter.origin === 'dashboard') {\n this._originalValues.set(baseFilter.key, {\n operator: baseFilter.operator,\n value: baseFilter.values ?? [baseFilter.value],\n });\n }\n });\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._scopesBridge = sceneGraph.getScopesBridge(this);\n\n const scopes = this._scopesBridge?.getValue();\n\n if (scopes) {\n this._updateScopesFilters(scopes);\n }\n\n const sub = this._scopesBridge?.subscribeToValue((n, _) => {\n this._updateScopesFilters(n);\n });\n\n return () => {\n sub?.unsubscribe();\n\n // we clear both scopes and dashboard level filters before leaving a dashboard to maintain accuracy for both\n // when/if we return to the same dashboard\n // e.g.: we edit a scope filter and go to another dashboard, it gets carried over, but then on that dashboard\n // we reset the value, and then come back to the initial dashboard, that dashboard still has the edited scope\n // because the URL will not hold any value, since on reset we clear the url, but the initial dashboard still\n // has the changed value in the schema, unless we reset it here\n if (this.state.baseFilters?.length) {\n this.setState({\n baseFilters: [...this.state.baseFilters.filter((filter) => filter.origin !== 'scope')],\n });\n // same for dashboard level filters if we edit one and go to another dashboard, reset to whatever initial value is there\n // and come back to the initial one it will use the last modified value it has, since URL is empty from the reset done\n // before\n this.state.baseFilters?.forEach((filter) => {\n if (filter.origin === 'dashboard' && filter.restorable) {\n this.restoreOriginalFilter(filter);\n }\n });\n }\n };\n };\n\n private _updateScopesFilters(scopes: Scope[]) {\n if (!scopes.length) {\n this.setState({\n baseFilters: this.state.baseFilters?.filter((filter) => filter.origin !== 'scope'),\n });\n return;\n }\n\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\n\n if (!scopeFilters.length) {\n return;\n }\n\n let finalFilters = scopeFilters;\n const scopeInjectedFilters: AdHocFilterWithLabels[] = [];\n const remainingFilters: AdHocFilterWithLabels[] = [];\n\n // set original values for scope filters as well\n finalFilters.forEach((scopeFilter) => {\n this._originalValues.set(scopeFilter.key, {\n value: scopeFilter.values ?? [scopeFilter.value],\n operator: scopeFilter.operator,\n });\n });\n\n this.state.baseFilters?.forEach((filter) => {\n if (filter.origin === 'scope') {\n scopeInjectedFilters.push(filter);\n } else {\n remainingFilters.push(filter);\n }\n });\n\n const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);\n const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);\n const scopeFilterKeys = scopeFilters.map((filter) => filter.key);\n\n // if the scope filters contain the key of an edited scope filter, we replace\n // with the edited filter. We also add the remaining unedited scope filters\n // when not overwriting\n finalFilters = [\n ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),\n ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key)),\n ];\n\n // maintain other baseFilters in the array, only update scopes ones\n this.setState({ baseFilters: [...finalFilters, ...remainingFilters] });\n }\n\n public setState(update: Partial<AdHocFiltersVariableState>): void {\n let filterExpressionChanged = false;\n\n if (\n ((update.filters && update.filters !== this.state.filters) ||\n (update.baseFilters && update.baseFilters !== this.state.baseFilters)) &&\n !update.filterExpression\n ) {\n const filters = update.filters ?? this.state.filters;\n const baseFilters = update.baseFilters ?? this.state.baseFilters;\n\n update.filterExpression = renderExpression(this.state.expressionBuilder, [\n ...(baseFilters?.filter((filter) => filter.origin) ?? []),\n ...(filters ?? []),\n ]);\n filterExpressionChanged = update.filterExpression !== this.state.filterExpression;\n }\n\n super.setState(update);\n\n if (filterExpressionChanged) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n /**\n * Updates the variable's `filters` and `filterExpression` state.\n * If `skipPublish` option is true, this will not emit the `SceneVariableValueChangedEvent`,\n * allowing consumers to update the filters without triggering dependent data providers.\n */\n public updateFilters(\n filters: AdHocFilterWithLabels[],\n options?: {\n skipPublish?: boolean;\n forcePublish?: boolean;\n }\n ): void {\n let filterExpressionChanged = false;\n let filterExpression: string | undefined = undefined;\n\n if (filters && filters !== this.state.filters) {\n filterExpression = renderExpression(this.state.expressionBuilder, [\n ...(this.state.baseFilters?.filter((filter) => filter.origin) ?? []),\n ...filters,\n ]);\n filterExpressionChanged = filterExpression !== this.state.filterExpression;\n }\n\n super.setState({\n filters,\n filterExpression,\n });\n\n if ((filterExpressionChanged && options?.skipPublish !== true) || options?.forcePublish) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n public restoreOriginalFilter(filter: AdHocFilterWithLabels) {\n const original: Partial<AdHocFilterWithLabels> = {\n matchAllFilter: false,\n restorable: false,\n };\n\n if (filter.restorable) {\n const originalFilter = this._originalValues.get(filter.key);\n\n original.value = originalFilter?.value[0];\n original.values = originalFilter?.value;\n // we don't care much about the labels in this injected filters scenario\n // but this is needed to rerender the filter with the proper values\n // in the UI. E.g.: in a multi-value on hover, it shows the correct values\n original.valueLabels = originalFilter?.value;\n original.operator = originalFilter?.operator;\n }\n\n this._updateFilter(filter, original);\n }\n\n public getValue(): VariableValue | undefined {\n return this.state.filterExpression;\n }\n\n public _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>) {\n const { baseFilters, filters, _wip } = this.state;\n\n if (filter.origin) {\n const originalValues = this._originalValues.get(filter.key);\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n\n // if we don't have the restorable prop set but values differ we set it true\n // this happens when editing the value of an injected filter\n // we also make sure to set restorable false if values are the same as original\n // e.g.: if we edit the value of a filter to whatever the original was, manually\n // 'restoring' the filter\n const isRestorableOverride = update.hasOwnProperty('restorable');\n if (\n !isRestorableOverride &&\n ((updateValues && !isEqual(updateValues, originalValues?.value)) ||\n (update.operator && update.operator !== originalValues?.operator))\n ) {\n update.restorable = true;\n } else if (updateValues && isEqual(updateValues, originalValues?.value)) {\n update.restorable = false;\n }\n\n const updatedBaseFilters =\n baseFilters?.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n }) ?? [];\n this.setState({ baseFilters: updatedBaseFilters });\n\n return;\n }\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n this.setState({ filters: [...filters, { ..._wip, ...update }], _wip: undefined });\n } else {\n this.setState({ _wip: { ...filter, ...update } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n });\n\n this.setState({ filters: updatedFilters });\n }\n\n public updateToMatchAll(filter: AdHocFilterWithLabels) {\n this._updateFilter(filter, {\n operator: '=~',\n value: '.*',\n values: ['.*'],\n valueLabels: ['All'],\n matchAllFilter: true,\n restorable: true,\n });\n }\n\n public _removeFilter(filter: AdHocFilterWithLabels) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n this.setState({ filters: this.state.filters.filter((f) => f !== filter) });\n }\n\n public _removeLastFilter() {\n const filterToRemove = this.state.filters.at(-1);\n\n if (filterToRemove) {\n this._removeFilter(filterToRemove);\n }\n }\n\n public _handleComboboxBackspace(filter: AdHocFilterWithLabels) {\n if (this.state.filters.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.filters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n filters: this.state.filters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter if not readOnly\n if (index === filterToForceIndex && !f.readOnly) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n } else if (this.state.baseFilters?.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.baseFilters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n baseFilters: this.state.baseFilters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex && !f.readOnly) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n }\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n if (this.state.defaultKeys) {\n return this.state.defaultKeys.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const otherFilters = this.state.filters.filter((f) => f.key !== currentKey).concat(this.state.baseFilters ?? []);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n scopes: this._scopesBridge?.getValue(),\n ...getEnrichedFiltersRequest(this),\n });\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.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocFilterWithLabels): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n const filteredBaseFilters = this.state.baseFilters?.filter((f) => f.origin && f.key !== filter.key) ?? [];\n // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(filteredBaseFilters);\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n let scopes = this._scopesBridge?.getValue();\n\n // if current filter is a scope injected one we need to filter out\n // filters with same key in scopes prop, similar to how we do in adhocFilters prop\n if (filter.origin === 'scope') {\n scopes = scopes?.map((scope) => {\n return {\n ...scope,\n spec: {\n ...scope.spec,\n filters: scope.spec.filters.filter((f) => f.key !== filter.key),\n },\n };\n });\n }\n\n const response = await ds.getTagValues({\n key: filter.key,\n filters: otherFilters,\n timeRange,\n queries,\n scopes,\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let values = dataFromResponse(response);\n if (override) {\n values = values.concat(dataFromResponse(override.values));\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({\n _wip: { key: '', value: '', operator: '=', condition: '' },\n });\n }\n\n public _getOperators() {\n const { supportsMultiValueOperators, allowCustomValue = true } = this.state;\n\n return OPERATORS.filter(({ isMulti, isRegex }) => {\n if (!supportsMultiValueOperators && isMulti) {\n return false;\n }\n if (!allowCustomValue && isRegex) {\n return false;\n }\n return true;\n }).map<SelectableValue<string>>(({ value, description }) => ({\n label: value,\n value,\n description,\n }));\n }\n}\n\nfunction renderExpression(\n builder: AdHocVariableExpressionBuilderFn | undefined,\n filters: AdHocFilterWithLabels[] | undefined\n) {\n return (builder ?? renderPrometheusLabelFilters)(filters ?? []);\n}\n\nexport function AdHocFiltersVariableRenderer({ model }: SceneComponentProps<AdHocFiltersVariable>) {\n const { filters, readOnly, addFilterButtonText } = model.useState();\n const styles = useStyles2(getStyles);\n\n if (model.state.layout === 'combobox') {\n return <AdHocFiltersComboboxRenderer model={model} />;\n }\n\n return (\n <div className={styles.wrapper}>\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" addFilterButtonText={addFilterButtonText} />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-end',\n columnGap: theme.spacing(2),\n rowGap: theme.spacing(1),\n }),\n});\n\nexport function toSelectableValue(input: MetricFindValue): SelectableValue<string> {\n const { text, value } = input;\n const result: SelectableValue<string> = {\n // converting text to string due to some edge cases where it can be a number\n // TODO: remove once https://github.com/grafana/grafana/issues/99021 is closed\n label: String(text),\n value: String(value ?? text),\n };\n\n if ('group' in input) {\n result.group = input.group;\n }\n\n if ('meta' in input) {\n result.meta = input.meta;\n }\n\n return result;\n}\n\nexport function isMatchAllFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === '=~' && filter.value === '.*';\n}\n\nexport function isFilterComplete(filter: AdHocFilterWithLabels): boolean {\n return filter.key !== '' && filter.operator !== '' && filter.value !== '';\n}\n\nexport function isMultiValueOperator(operatorValue: string): boolean {\n const operator = OPERATORS.find((o) => o.value === operatorValue);\n if (!operator) {\n // default to false if operator is not found\n return false;\n }\n return Boolean(operator.isMulti);\n}\n"],"names":["_a","_b"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -864,7 +864,7 @@ interface AdHocFilterWithLabels<M extends Record<string, any> = {}> extends AdHo
864
864
  restorable?: boolean;
865
865
  }
866
866
  type AdHocControlsLayout = ControlsLayout | 'combobox';
867
- type FilterOrigin = 'dashboard' | 'scope';
867
+ type FilterOrigin = 'dashboard' | 'scope' | string;
868
868
  interface AdHocFiltersVariableState extends SceneVariableState {
869
869
  /** Optional text to display on the 'add filter' button */
870
870
  addFilterButtonText?: string;
package/dist/index.js CHANGED
@@ -1117,7 +1117,7 @@ class SceneTimeRange extends SceneObjectBase {
1117
1117
  }
1118
1118
  calculatePercentOfInterval(percent) {
1119
1119
  const intervalMs = this.state.value.to.diff(this.state.value.from, "milliseconds");
1120
- return Math.ceil(intervalMs / percent);
1120
+ return Math.ceil(intervalMs / 100 * percent);
1121
1121
  }
1122
1122
  getTimeZone() {
1123
1123
  if (this.state.timeZone && getValidTimeZone(this.state.timeZone)) {
@@ -4960,23 +4960,16 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
4960
4960
  }
4961
4961
  }, [viewMode]);
4962
4962
  if (viewMode) {
4963
- const pillText = /* @__PURE__ */ React__default.default.createElement("span", { className: styles.pillText }, keyLabel, " ", filter.operator, " ", valueLabel);
4964
- let injectedInfoText = "";
4965
- let injectedRestoreText = "";
4966
- if (filter.origin === "dashboard") {
4967
- injectedInfoText = "Applied by default in this dashboard. If edited, it carries over to other dashboards.";
4968
- injectedRestoreText = "Restore the value defined by this dashboard.";
4969
- } else if (filter.origin === "scope") {
4970
- injectedInfoText = "Applied automatically from your selected scope.";
4971
- injectedRestoreText = "Restore the value set by your selected scope";
4972
- }
4963
+ const pillTextContent = `${keyLabel} ${filter.operator} ${valueLabel}`;
4964
+ const pillText = /* @__PURE__ */ React__default.default.createElement("span", { className: styles.pillText }, pillTextContent);
4973
4965
  return /* @__PURE__ */ React__default.default.createElement(
4974
4966
  "div",
4975
4967
  {
4976
4968
  className: css.cx(
4977
4969
  styles.combinedFilterPill,
4978
4970
  readOnly && styles.readOnlyCombinedFilter,
4979
- isMatchAllFilter(filter) && styles.matchAllPill
4971
+ isMatchAllFilter(filter) && styles.matchAllPill,
4972
+ filter.readOnly && styles.filterReadOnly
4980
4973
  ),
4981
4974
  onClick: (e) => {
4982
4975
  e.stopPropagation();
@@ -4994,7 +4987,7 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
4994
4987
  tabIndex: 0,
4995
4988
  ref: pillWrapperRef
4996
4989
  },
4997
- valueLabel.length < LABEL_MAX_VISIBLE_LENGTH ? pillText : /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: /* @__PURE__ */ React__default.default.createElement("div", { className: styles.tooltipText }, valueLabel), placement: "top" }, pillText),
4990
+ pillTextContent.length < LABEL_MAX_VISIBLE_LENGTH ? pillText : /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: /* @__PURE__ */ React__default.default.createElement("div", { className: styles.tooltipText }, pillTextContent), placement: "top" }, pillText),
4998
4991
  !readOnly && !filter.matchAllFilter && (!filter.origin || filter.origin === "dashboard") ? /* @__PURE__ */ React__default.default.createElement(
4999
4992
  ui.IconButton,
5000
4993
  {
@@ -5025,8 +5018,9 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5025
5018
  tooltip: `Remove filter with key ${keyLabel}`
5026
5019
  }
5027
5020
  ) : null,
5028
- filter.origin && !filter.restorable && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: injectedInfoText, placement: "bottom" }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "md", className: styles.infoPillIcon })),
5029
- filter.origin && filter.restorable && /* @__PURE__ */ React__default.default.createElement(
5021
+ filter.origin && filter.readOnly && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `${filter.origin} managed filter`, placement: "bottom" }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "lock", size: "md", className: styles.readOnlyPillIcon })),
5022
+ filter.origin && !filter.restorable && !filter.readOnly && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `This is a ${filter.origin} injected filter`, placement: "bottom" }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "md", className: styles.infoPillIcon })),
5023
+ filter.origin && filter.restorable && !filter.readOnly && /* @__PURE__ */ React__default.default.createElement(
5030
5024
  ui.IconButton,
5031
5025
  {
5032
5026
  onClick: (e) => {
@@ -5043,7 +5037,7 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5043
5037
  name: "history",
5044
5038
  size: "md",
5045
5039
  className: isMatchAllFilter(filter) ? styles.matchAllPillIcon : styles.pillIcon,
5046
- tooltip: injectedRestoreText
5040
+ tooltip: `Restore filter to its original value`
5047
5041
  }
5048
5042
  )
5049
5043
  );
@@ -5085,6 +5079,13 @@ const getStyles$b = (theme) => ({
5085
5079
  background: theme.colors.action.selected
5086
5080
  }
5087
5081
  }),
5082
+ filterReadOnly: css.css({
5083
+ background: theme.colors.background.canvas,
5084
+ cursor: "text",
5085
+ "&:hover": {
5086
+ background: theme.colors.background.canvas
5087
+ }
5088
+ }),
5088
5089
  pillIcon: css.css({
5089
5090
  marginInline: theme.spacing(0.5),
5090
5091
  cursor: "pointer",
@@ -5105,6 +5106,9 @@ const getStyles$b = (theme) => ({
5105
5106
  marginInline: theme.spacing(0.5),
5106
5107
  cursor: "pointer"
5107
5108
  }),
5109
+ readOnlyPillIcon: css.css({
5110
+ marginInline: theme.spacing(0.5)
5111
+ }),
5108
5112
  matchAllPillIcon: css.css({
5109
5113
  marginInline: theme.spacing(0.5),
5110
5114
  cursor: "pointer",
@@ -5526,7 +5530,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
5526
5530
  }
5527
5531
  this.setState({
5528
5532
  filters: this.state.filters.reduce((acc, f, index) => {
5529
- if (index === filterToForceIndex) {
5533
+ if (index === filterToForceIndex && !f.readOnly) {
5530
5534
  return [
5531
5535
  ...acc,
5532
5536
  {
@@ -5548,7 +5552,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
5548
5552
  }
5549
5553
  this.setState({
5550
5554
  baseFilters: this.state.baseFilters.reduce((acc, f, index) => {
5551
- if (index === filterToForceIndex) {
5555
+ if (index === filterToForceIndex && !f.readOnly) {
5552
5556
  return [
5553
5557
  ...acc,
5554
5558
  {