@grafana/scenes 6.17.0--canary.1136.15305220090.0 → 6.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +2 -2
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js.map +1 -1
- package/dist/esm/variables/variants/ScopesVariable.js +1 -2
- package/dist/esm/variables/variants/ScopesVariable.js.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
# v6.17.0 (Thu May 29 2025)
|
2
|
+
|
3
|
+
#### 🚀 Enhancement
|
4
|
+
|
5
|
+
- AdHocFiltersVariableUrlSyncHandler: fix url state containing `#` char [#1139](https://github.com/grafana/scenes/pull/1139) ([@gtk-grafana](https://github.com/gtk-grafana))
|
6
|
+
|
7
|
+
#### 🐛 Bug Fix
|
8
|
+
|
9
|
+
- SceneFlexItem: respect `wrap` property [#1111](https://github.com/grafana/scenes/pull/1111) ([@domasx2](https://github.com/domasx2))
|
10
|
+
|
11
|
+
#### Authors: 2
|
12
|
+
|
13
|
+
- Domas ([@domasx2](https://github.com/domasx2))
|
14
|
+
- Galen Kistler ([@gtk-grafana](https://github.com/gtk-grafana))
|
15
|
+
|
16
|
+
---
|
17
|
+
|
1
18
|
# v6.16.0 (Wed May 28 2025)
|
2
19
|
|
3
20
|
#### 🚀 Enhancement
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { isFilterComplete, isMatchAllFilter, isMultiValueOperator } from './AdHocFiltersVariable.js';
|
2
|
-
import {
|
2
|
+
import { escapeInjectedFilterUrlDelimiters, toUrlCommaDelimitedString, unescapeUrlDelimiters } from '../utils.js';
|
3
3
|
|
4
4
|
class AdHocFiltersVariableUrlSyncHandler {
|
5
5
|
constructor(_variable) {
|
@@ -20,7 +20,7 @@ class AdHocFiltersVariableUrlSyncHandler {
|
|
20
20
|
}
|
21
21
|
if (filters.length) {
|
22
22
|
value.push(
|
23
|
-
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(
|
23
|
+
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|"))
|
24
24
|
);
|
25
25
|
}
|
26
26
|
if (baseFilters == null ? void 0 : baseFilters.length) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"AdHocFiltersVariableUrlSyncHandler.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.ts"],"sourcesContent":["import { SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues } from '../../core/types';\nimport {\n AdHocFiltersVariable,\n AdHocFilterWithLabels,\n FilterOrigin,\n isFilterComplete,\n isMatchAllFilter,\n isMultiValueOperator,\n} from './AdHocFiltersVariable';\nimport {\n escapeInjectedFilterUrlDelimiters,\n escapeUrlPipeDelimiters,\n toUrlCommaDelimitedString,\n unescapeUrlDelimiters,\n} from '../utils';\n\nexport class AdHocFiltersVariableUrlSyncHandler implements SceneObjectUrlSyncHandler {\n public constructor(private _variable: AdHocFiltersVariable) {}\n\n private getKey(): string {\n return `var-${this._variable.state.name}`;\n }\n\n public getKeys(): string[] {\n return [this.getKey()];\n }\n\n public getUrlState(): SceneObjectUrlValues {\n const filters = this._variable.state.filters;\n const baseFilters = this._variable.state.baseFilters;\n\n let value = [];\n\n if (filters.length === 0 && baseFilters?.length === 0) {\n return { [this.getKey()]: [''] };\n }\n\n if (filters.length) {\n value.push(\n ...filters\n .filter(isFilterComplete)\n .filter((filter) => !filter.hidden)\n .map((filter) => toArray(filter).map(escapeUrlPipeDelimiters).join('|'))\n );\n }\n\n if (baseFilters?.length) {\n // injected filters stored in the following format: normal|adhoc|values#filterOrigin#restorable\n value.push(\n ...baseFilters\n ?.filter(isFilterComplete)\n .filter((filter) => !filter.hidden && filter.origin && filter.restorable)\n .map((filter) =>\n toArray(filter).map(escapeInjectedFilterUrlDelimiters).join('|').concat(`#${filter.origin}#restorable`)\n )\n );\n }\n\n return {\n [this.getKey()]: value.length ? value : [''],\n };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n const urlValue = values[this.getKey()];\n\n if (urlValue == null) {\n return;\n }\n\n const filters = deserializeUrlToFilters(urlValue);\n const baseFilters = [...(this._variable.state.baseFilters || [])];\n\n for (let i = 0; i < filters.length; i++) {\n const foundBaseFilterIndex = baseFilters.findIndex((f) => f.key === filters[i].key);\n\n // if we find a match we update baseFilter with what's in the URL.\n // If there is a normal filter without an origin that matches keys with\n // some dashboard lvl filter we maintain it as dashboard lvl filter in the\n // new dashboard\n if (foundBaseFilterIndex > -1) {\n if (!filters[i].origin && baseFilters[foundBaseFilterIndex].origin === 'dashboard') {\n filters[i].origin = 'dashboard';\n filters[i].restorable = true;\n }\n\n if (isMatchAllFilter(filters[i])) {\n filters[i].matchAllFilter = true;\n }\n\n baseFilters[foundBaseFilterIndex] = filters[i];\n } else if (filters[i].origin === 'dashboard') {\n // if it was originating from a dashoard but has no match in the new dashboard\n // remove it's origin, turn it into a normal filter to be set below\n delete filters[i].origin;\n delete filters[i].restorable;\n } else if (foundBaseFilterIndex === -1 && filters[i].origin === 'scope' && filters[i].restorable) {\n // scopes are being set sometimes (when the observable emits actual filters) after urlSync\n // so we maintain all modified scopes in the adhoc\n // and leave the scopes update to reconciliate on what filters will actually show up\n baseFilters.push(filters[i]);\n }\n }\n\n this._variable.setState({\n filters: filters.filter((f) => !f.origin),\n baseFilters,\n });\n }\n}\n\nfunction deserializeUrlToFilters(value: SceneObjectUrlValue): AdHocFilterWithLabels[] {\n if (Array.isArray(value)) {\n const values = value;\n return values.map(toFilter).filter(isFilter);\n }\n\n const filter = toFilter(value);\n return filter === null ? [] : [filter];\n}\n\nfunction toArray(filter: AdHocFilterWithLabels): string[] {\n const result = [toUrlCommaDelimitedString(filter.key, filter.keyLabel), filter.operator];\n if (isMultiValueOperator(filter.operator)) {\n // TODO remove expect-error when we're on the latest version of @grafana/data\n // @ts-expect-error\n filter.values.forEach((value, index) => {\n result.push(toUrlCommaDelimitedString(value, filter.valueLabels?.[index]));\n });\n } else {\n result.push(toUrlCommaDelimitedString(filter.value, filter.valueLabels?.[0]));\n }\n return result;\n}\n\nfunction toFilter(urlValue: string | number | boolean | undefined | null): AdHocFilterWithLabels | null {\n if (typeof urlValue !== 'string' || urlValue.length === 0) {\n return null;\n }\n\n const [filter, origin, restorable] = urlValue.split('#');\n const [key, keyLabel, operator, _operatorLabel, ...values] = filter\n .split('|')\n .reduce<string[]>((acc, v) => {\n const [key, label] = v.split(',');\n\n acc.push(key, label ?? key);\n\n return acc;\n }, [])\n .map(unescapeUrlDelimiters);\n\n return {\n key,\n keyLabel,\n operator,\n value: values[0],\n values: isMultiValueOperator(operator) ? values.filter((_, index) => index % 2 === 0) : undefined,\n valueLabels: values.filter((_, index) => index % 2 === 1),\n condition: '',\n ...(isFilterOrigin(origin) && { origin }),\n ...(!!restorable && { restorable: true }),\n };\n}\n\nfunction isFilterOrigin(value: string): value is FilterOrigin {\n return value === 'scope' || value === 'dashboard';\n}\n\nfunction isFilter(filter: AdHocFilterWithLabels | null): filter is AdHocFilterWithLabels {\n return filter !== null && typeof filter.key === 'string' && typeof filter.value === 'string';\n}\n"],"names":["_a","key"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"AdHocFiltersVariableUrlSyncHandler.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.ts"],"sourcesContent":["import { SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues } from '../../core/types';\nimport {\n AdHocFiltersVariable,\n AdHocFilterWithLabels,\n FilterOrigin,\n isFilterComplete,\n isMatchAllFilter,\n isMultiValueOperator,\n} from './AdHocFiltersVariable';\nimport { escapeInjectedFilterUrlDelimiters, toUrlCommaDelimitedString, unescapeUrlDelimiters } from '../utils';\n\nexport class AdHocFiltersVariableUrlSyncHandler implements SceneObjectUrlSyncHandler {\n public constructor(private _variable: AdHocFiltersVariable) {}\n\n private getKey(): string {\n return `var-${this._variable.state.name}`;\n }\n\n public getKeys(): string[] {\n return [this.getKey()];\n }\n\n public getUrlState(): SceneObjectUrlValues {\n const filters = this._variable.state.filters;\n const baseFilters = this._variable.state.baseFilters;\n\n let value = [];\n\n if (filters.length === 0 && baseFilters?.length === 0) {\n return { [this.getKey()]: [''] };\n }\n\n if (filters.length) {\n value.push(\n ...filters\n .filter(isFilterComplete)\n .filter((filter) => !filter.hidden)\n .map((filter) => toArray(filter).map(escapeInjectedFilterUrlDelimiters).join('|'))\n );\n }\n\n if (baseFilters?.length) {\n // injected filters stored in the following format: normal|adhoc|values#filterOrigin#restorable\n value.push(\n ...baseFilters\n ?.filter(isFilterComplete)\n .filter((filter) => !filter.hidden && filter.origin && filter.restorable)\n .map((filter) =>\n toArray(filter).map(escapeInjectedFilterUrlDelimiters).join('|').concat(`#${filter.origin}#restorable`)\n )\n );\n }\n\n return {\n [this.getKey()]: value.length ? value : [''],\n };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n const urlValue = values[this.getKey()];\n\n if (urlValue == null) {\n return;\n }\n\n const filters = deserializeUrlToFilters(urlValue);\n const baseFilters = [...(this._variable.state.baseFilters || [])];\n\n for (let i = 0; i < filters.length; i++) {\n const foundBaseFilterIndex = baseFilters.findIndex((f) => f.key === filters[i].key);\n\n // if we find a match we update baseFilter with what's in the URL.\n // If there is a normal filter without an origin that matches keys with\n // some dashboard lvl filter we maintain it as dashboard lvl filter in the\n // new dashboard\n if (foundBaseFilterIndex > -1) {\n if (!filters[i].origin && baseFilters[foundBaseFilterIndex].origin === 'dashboard') {\n filters[i].origin = 'dashboard';\n filters[i].restorable = true;\n }\n\n if (isMatchAllFilter(filters[i])) {\n filters[i].matchAllFilter = true;\n }\n\n baseFilters[foundBaseFilterIndex] = filters[i];\n } else if (filters[i].origin === 'dashboard') {\n // if it was originating from a dashoard but has no match in the new dashboard\n // remove it's origin, turn it into a normal filter to be set below\n delete filters[i].origin;\n delete filters[i].restorable;\n } else if (foundBaseFilterIndex === -1 && filters[i].origin === 'scope' && filters[i].restorable) {\n // scopes are being set sometimes (when the observable emits actual filters) after urlSync\n // so we maintain all modified scopes in the adhoc\n // and leave the scopes update to reconciliate on what filters will actually show up\n baseFilters.push(filters[i]);\n }\n }\n\n this._variable.setState({\n filters: filters.filter((f) => !f.origin),\n baseFilters,\n });\n }\n}\n\nfunction deserializeUrlToFilters(value: SceneObjectUrlValue): AdHocFilterWithLabels[] {\n if (Array.isArray(value)) {\n const values = value;\n return values.map(toFilter).filter(isFilter);\n }\n\n const filter = toFilter(value);\n return filter === null ? [] : [filter];\n}\n\nfunction toArray(filter: AdHocFilterWithLabels): string[] {\n const result = [toUrlCommaDelimitedString(filter.key, filter.keyLabel), filter.operator];\n if (isMultiValueOperator(filter.operator)) {\n // TODO remove expect-error when we're on the latest version of @grafana/data\n // @ts-expect-error\n filter.values.forEach((value, index) => {\n result.push(toUrlCommaDelimitedString(value, filter.valueLabels?.[index]));\n });\n } else {\n result.push(toUrlCommaDelimitedString(filter.value, filter.valueLabels?.[0]));\n }\n return result;\n}\n\nfunction toFilter(urlValue: string | number | boolean | undefined | null): AdHocFilterWithLabels | null {\n if (typeof urlValue !== 'string' || urlValue.length === 0) {\n return null;\n }\n\n const [filter, origin, restorable] = urlValue.split('#');\n const [key, keyLabel, operator, _operatorLabel, ...values] = filter\n .split('|')\n .reduce<string[]>((acc, v) => {\n const [key, label] = v.split(',');\n\n acc.push(key, label ?? key);\n\n return acc;\n }, [])\n .map(unescapeUrlDelimiters);\n\n return {\n key,\n keyLabel,\n operator,\n value: values[0],\n values: isMultiValueOperator(operator) ? values.filter((_, index) => index % 2 === 0) : undefined,\n valueLabels: values.filter((_, index) => index % 2 === 1),\n condition: '',\n ...(isFilterOrigin(origin) && { origin }),\n ...(!!restorable && { restorable: true }),\n };\n}\n\nfunction isFilterOrigin(value: string): value is FilterOrigin {\n return value === 'scope' || value === 'dashboard';\n}\n\nfunction isFilter(filter: AdHocFilterWithLabels | null): filter is AdHocFilterWithLabels {\n return filter !== null && typeof filter.key === 'string' && typeof filter.value === 'string';\n}\n"],"names":["_a","key"],"mappings":"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"}
|
@@ -60,8 +60,7 @@ class ScopesVariable extends SceneObjectBase {
|
|
60
60
|
const loading = state.value.length === 0 ? false : state.loading;
|
61
61
|
const oldScopes = this.state.scopes.map((scope) => scope.metadata.name);
|
62
62
|
const newScopes = state.value.map((scope) => scope.metadata.name);
|
63
|
-
|
64
|
-
if (!loading && (scopesHaveChanged || newScopes.length === 0)) {
|
63
|
+
if (!loading && !isEqual(oldScopes, newScopes)) {
|
65
64
|
this.setState({ scopes: state.value, loading });
|
66
65
|
this.publishEvent(new SceneVariableValueChangedEvent(this), true);
|
67
66
|
} else {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ScopesVariable.js","sources":["../../../../src/variables/variants/ScopesVariable.tsx"],"sourcesContent":["import { SceneObjectBase } from '../../core/SceneObjectBase';\nimport {\n CustomVariableValue,\n SceneVariable,\n SceneVariableState,\n SceneVariableValueChangedEvent,\n VariableValue,\n} from '../types';\nimport { Scope } from '@grafana/data';\nimport { SceneComponentProps } from '../../core/types';\nimport { ScopesContext, ScopesContextValue } from '@grafana/runtime';\nimport { useContext, useEffect } from 'react';\nimport { VariableFormatID, VariableHide } from '@grafana/schema';\nimport { SCOPES_VARIABLE_NAME } from '../constants';\nimport { isEqual } from 'lodash';\n\nexport interface ScopesVariableState extends SceneVariableState {\n /**\n * Last captured state from ScopesContext\n */\n scopes: Scope[];\n /**\n * Set to true if you want to the variable to enable / disable scopes when activated / deactivated\n */\n enable?: boolean;\n}\n\nexport class ScopesVariable extends SceneObjectBase<ScopesVariableState> implements SceneVariable<ScopesVariableState> {\n protected _renderBeforeActivation = true;\n protected _context: ScopesContextValue | undefined;\n\n // Special options that enables variables to be hidden but still render to access react contexts\n public UNSAFE_renderAsHidden = true;\n public static Component = ScopesVariableRenderer;\n\n public constructor(state: Partial<ScopesVariableState>) {\n super({\n skipUrlSync: true,\n loading: true,\n scopes: [],\n ...state,\n type: 'system',\n name: SCOPES_VARIABLE_NAME,\n hide: VariableHide.hideVariable,\n });\n }\n\n /**\n * Temporary simple implementation to stringify the scopes.\n */\n public getValue(): VariableValue {\n const scopes = this.state.scopes ?? [];\n return new ScopesVariableFormatter(scopes.map((scope) => scope.metadata.name));\n }\n\n public getScopes(): Scope[] | undefined {\n return this.state.scopes;\n }\n\n /**\n * This method is used to keep the context up to date with the scopes context received from React\n * 1) Subscribes to ScopesContext state changes and synchronizes it with the variable state\n * 2) Handles enable / disabling of scopes based on variable enable option.\n */\n public setContext(context: ScopesContextValue | undefined) {\n if (!context) {\n return;\n }\n\n this._context = context;\n\n const oldState = context.state;\n\n // Update scopes enable state if state.enable is defined\n if (this.state.enable != null) {\n context.setEnabled(this.state.enable);\n }\n\n // Subscribe to context state changes\n const sub = context.stateObservable.subscribe((state) => {\n this.updateStateFromContext(state);\n });\n\n return () => {\n sub.unsubscribe();\n\n if (this.state.enable != null) {\n context.setEnabled(oldState.enabled);\n }\n };\n }\n\n public updateStateFromContext(state: { loading: boolean; value: Scope[] }) {\n // There was logic in SceneQueryRunner that said if there are no scopes then loading state should not block query execution\n const loading = state.value.length === 0 ? false : state.loading;\n const oldScopes = this.state.scopes.map((scope) => scope.metadata.name);\n const newScopes = state.value.map((scope) => scope.metadata.name);\n
|
1
|
+
{"version":3,"file":"ScopesVariable.js","sources":["../../../../src/variables/variants/ScopesVariable.tsx"],"sourcesContent":["import { SceneObjectBase } from '../../core/SceneObjectBase';\nimport {\n CustomVariableValue,\n SceneVariable,\n SceneVariableState,\n SceneVariableValueChangedEvent,\n VariableValue,\n} from '../types';\nimport { Scope } from '@grafana/data';\nimport { SceneComponentProps } from '../../core/types';\nimport { ScopesContext, ScopesContextValue } from '@grafana/runtime';\nimport { useContext, useEffect } from 'react';\nimport { VariableFormatID, VariableHide } from '@grafana/schema';\nimport { SCOPES_VARIABLE_NAME } from '../constants';\nimport { isEqual } from 'lodash';\n\nexport interface ScopesVariableState extends SceneVariableState {\n /**\n * Last captured state from ScopesContext\n */\n scopes: Scope[];\n /**\n * Set to true if you want to the variable to enable / disable scopes when activated / deactivated\n */\n enable?: boolean;\n}\n\nexport class ScopesVariable extends SceneObjectBase<ScopesVariableState> implements SceneVariable<ScopesVariableState> {\n protected _renderBeforeActivation = true;\n protected _context: ScopesContextValue | undefined;\n\n // Special options that enables variables to be hidden but still render to access react contexts\n public UNSAFE_renderAsHidden = true;\n public static Component = ScopesVariableRenderer;\n\n public constructor(state: Partial<ScopesVariableState>) {\n super({\n skipUrlSync: true,\n loading: true,\n scopes: [],\n ...state,\n type: 'system',\n name: SCOPES_VARIABLE_NAME,\n hide: VariableHide.hideVariable,\n });\n }\n\n /**\n * Temporary simple implementation to stringify the scopes.\n */\n public getValue(): VariableValue {\n const scopes = this.state.scopes ?? [];\n return new ScopesVariableFormatter(scopes.map((scope) => scope.metadata.name));\n }\n\n public getScopes(): Scope[] | undefined {\n return this.state.scopes;\n }\n\n /**\n * This method is used to keep the context up to date with the scopes context received from React\n * 1) Subscribes to ScopesContext state changes and synchronizes it with the variable state\n * 2) Handles enable / disabling of scopes based on variable enable option.\n */\n public setContext(context: ScopesContextValue | undefined) {\n if (!context) {\n return;\n }\n\n this._context = context;\n\n const oldState = context.state;\n\n // Update scopes enable state if state.enable is defined\n if (this.state.enable != null) {\n context.setEnabled(this.state.enable);\n }\n\n // Subscribe to context state changes\n const sub = context.stateObservable.subscribe((state) => {\n this.updateStateFromContext(state);\n });\n\n return () => {\n sub.unsubscribe();\n\n if (this.state.enable != null) {\n context.setEnabled(oldState.enabled);\n }\n };\n }\n\n public updateStateFromContext(state: { loading: boolean; value: Scope[] }) {\n // There was logic in SceneQueryRunner that said if there are no scopes then loading state should not block query execution\n const loading = state.value.length === 0 ? false : state.loading;\n const oldScopes = this.state.scopes.map((scope) => scope.metadata.name);\n const newScopes = state.value.map((scope) => scope.metadata.name);\n\n // Only update scopes value state when loading is false and the scopes have changed\n if (!loading && !isEqual(oldScopes, newScopes)) {\n this.setState({ scopes: state.value, loading });\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n } else {\n this.setState({ loading });\n }\n }\n}\n\nfunction ScopesVariableRenderer({ model }: SceneComponentProps<ScopesVariable>) {\n const context = useContext(ScopesContext);\n\n useEffect(() => {\n return model.setContext(context);\n }, [context, model]);\n\n return null;\n}\n\nexport class ScopesVariableFormatter implements CustomVariableValue {\n public constructor(private _value: string[]) {}\n\n public formatter(formatNameOrFn?: string): string {\n if (formatNameOrFn === VariableFormatID.QueryParam) {\n return this._value.map((scope) => `scope=${encodeURIComponent(scope)}`).join('&');\n }\n\n return this._value.join(', ');\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
@@ -3945,7 +3945,7 @@ class AdHocFiltersVariableUrlSyncHandler {
|
|
3945
3945
|
}
|
3946
3946
|
if (filters.length) {
|
3947
3947
|
value.push(
|
3948
|
-
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(
|
3948
|
+
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|"))
|
3949
3949
|
);
|
3950
3950
|
}
|
3951
3951
|
if (baseFilters == null ? void 0 : baseFilters.length) {
|
@@ -7291,8 +7291,7 @@ class ScopesVariable extends SceneObjectBase {
|
|
7291
7291
|
const loading = state.value.length === 0 ? false : state.loading;
|
7292
7292
|
const oldScopes = this.state.scopes.map((scope) => scope.metadata.name);
|
7293
7293
|
const newScopes = state.value.map((scope) => scope.metadata.name);
|
7294
|
-
|
7295
|
-
if (!loading && (scopesHaveChanged || newScopes.length === 0)) {
|
7294
|
+
if (!loading && !lodash.isEqual(oldScopes, newScopes)) {
|
7296
7295
|
this.setState({ scopes: state.value, loading });
|
7297
7296
|
this.publishEvent(new SceneVariableValueChangedEvent(this), true);
|
7298
7297
|
} else {
|