From c6428dfc7463250f786a9089c46a2fac910333cb Mon Sep 17 00:00:00 2001 From: Victor Marin <36818606+mdvictor@users.noreply.github.com> Date: Tue, 13 May 2025 09:29:02 +0300 Subject: [PATCH] Bump scenes and fix types (#105167) * bump scenes and fix types * bump scenes * refactor * refactor + test * naming --- package.json | 4 +- .../sceneVariablesSetToVariables.test.ts | 126 ++++++++++++++++++ .../sceneVariablesSetToVariables.ts | 33 ++++- yarn.lock | 22 +-- 4 files changed, 167 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index cf9ae50a9ef..a5234fb0f5a 100644 --- a/package.json +++ b/package.json @@ -282,8 +282,8 @@ "@grafana/plugin-ui": "0.10.5", "@grafana/prometheus": "workspace:*", "@grafana/runtime": "workspace:*", - "@grafana/scenes": "6.10.2", - "@grafana/scenes-react": "6.10.2", + "@grafana/scenes": "6.10.4", + "@grafana/scenes-react": "6.10.4", "@grafana/schema": "workspace:*", "@grafana/sql": "workspace:*", "@grafana/ui": "workspace:*", diff --git a/public/app/features/dashboard-scene/serialization/sceneVariablesSetToVariables.test.ts b/public/app/features/dashboard-scene/serialization/sceneVariablesSetToVariables.test.ts index d7514139230..5be471f6617 100644 --- a/public/app/features/dashboard-scene/serialization/sceneVariablesSetToVariables.test.ts +++ b/public/app/features/dashboard-scene/serialization/sceneVariablesSetToVariables.test.ts @@ -552,6 +552,132 @@ describe('sceneVariablesSetToVariables', () => { `); }); + describe('should adapt AdHocFiltersVariable filters', () => { + it('should remove origin from filter if its not dashboard or scope', () => { + const variable = new AdHocFiltersVariable({ + name: 'test', + allowCustomValue: true, + label: 'test-label', + description: 'test-desc', + datasource: { uid: 'fake-std', type: 'fake-std' }, + filters: [ + { + key: 'filterTest', + operator: '=', + value: 'test', + origin: 'asserts', + }, + ], + baseFilters: [ + { + key: 'baseFilterTest', + operator: '=', + value: 'test', + origin: 'asserts', + }, + ], + }); + const set = new SceneVariableSet({ + variables: [variable], + }); + + const result = sceneVariablesSetToVariables(set); + + expect(result).toHaveLength(1); + expect(result[0]).toMatchInlineSnapshot(` + { + "allowCustomValue": true, + "baseFilters": [ + { + "key": "baseFilterTest", + "operator": "=", + "value": "test", + }, + ], + "datasource": { + "type": "fake-std", + "uid": "fake-std", + }, + "defaultKeys": undefined, + "description": "test-desc", + "filters": [ + { + "key": "filterTest", + "operator": "=", + "value": "test", + }, + ], + "label": "test-label", + "name": "test", + "type": "adhoc", + } + `); + }); + + it('should maintain dashboard or scope origin', () => { + const variable = new AdHocFiltersVariable({ + name: 'test', + allowCustomValue: true, + label: 'test-label', + description: 'test-desc', + datasource: { uid: 'fake-std', type: 'fake-std' }, + filters: [ + { + key: 'filterTest', + operator: '=', + value: 'test', + origin: 'dashboard', + }, + ], + baseFilters: [ + { + key: 'baseFilterTest', + operator: '=', + value: 'test', + origin: 'scope', + }, + ], + }); + const set = new SceneVariableSet({ + variables: [variable], + }); + + const result = sceneVariablesSetToVariables(set); + + expect(result).toHaveLength(1); + expect(result[0]).toMatchInlineSnapshot(` + { + "allowCustomValue": true, + "baseFilters": [ + { + "key": "baseFilterTest", + "operator": "=", + "origin": "scope", + "value": "test", + }, + ], + "datasource": { + "type": "fake-std", + "uid": "fake-std", + }, + "defaultKeys": undefined, + "description": "test-desc", + "filters": [ + { + "key": "filterTest", + "operator": "=", + "origin": "dashboard", + "value": "test", + }, + ], + "label": "test-label", + "name": "test", + "type": "adhoc", + } + `); + }); + }); + it('should handle AdHocFiltersVariable with defaultKeys', () => { const variable = new AdHocFiltersVariable({ name: 'test', diff --git a/public/app/features/dashboard-scene/serialization/sceneVariablesSetToVariables.ts b/public/app/features/dashboard-scene/serialization/sceneVariablesSetToVariables.ts index 827ea2b9b05..be9370dac31 100644 --- a/public/app/features/dashboard-scene/serialization/sceneVariablesSetToVariables.ts +++ b/public/app/features/dashboard-scene/serialization/sceneVariablesSetToVariables.ts @@ -1,5 +1,10 @@ import { config } from '@grafana/runtime'; -import { MultiValueVariable, SceneVariables, sceneUtils } from '@grafana/scenes'; +import { + AdHocFilterWithLabels as SceneAdHocFilterWithLabels, + MultiValueVariable, + SceneVariables, + sceneUtils, +} from '@grafana/scenes'; import { VariableModel, VariableRefresh as OldVariableRefresh, @@ -18,6 +23,7 @@ import { GroupByVariableKind, defaultVariableHide, VariableOption, + AdHocFilterWithLabels, } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha1/types.spec.gen'; import { getIntervalsQueryFromNewIntervalModel } from '../utils/utils'; @@ -181,8 +187,8 @@ export function sceneVariablesSetToVariables(set: SceneVariables, keepQueryOptio datasource: variable.state.datasource, allowCustomValue: variable.state.allowCustomValue, // @ts-expect-error - baseFilters: variable.state.baseFilters, - filters: variable.state.filters, + baseFilters: validateFiltersOrigin(variable.state.baseFilters), + filters: validateFiltersOrigin(variable.state.filters), defaultKeys: variable.state.defaultKeys, }); } else { @@ -423,8 +429,8 @@ export function sceneVariablesSetToSchemaV2Variables( ...commonProperties, name: variable.state.name, datasource: variable.state.datasource || {}, //FIXME what is the default value? - baseFilters: variable.state.baseFilters || [], - filters: variable.state.filters, + baseFilters: validateFiltersOrigin(variable.state.baseFilters), + filters: validateFiltersOrigin(variable.state.filters), defaultKeys: variable.state.defaultKeys || [], //FIXME what is the default value? }, }; @@ -436,3 +442,20 @@ export function sceneVariablesSetToSchemaV2Variables( return variables; } + +function validateFiltersOrigin(filters?: SceneAdHocFilterWithLabels[]): AdHocFilterWithLabels[] { + return ( + filters?.map((filter) => { + const { origin: initialOrigin, ...restOfFilter } = filter; + + if (initialOrigin === 'dashboard' || initialOrigin === 'scope') { + return { + ...restOfFilter, + origin: initialOrigin, + }; + } + + return restOfFilter; + }) || [] + ); +} diff --git a/yarn.lock b/yarn.lock index ce0bae795ef..a637797d1d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3469,11 +3469,11 @@ __metadata: languageName: unknown linkType: soft -"@grafana/scenes-react@npm:6.10.2": - version: 6.10.2 - resolution: "@grafana/scenes-react@npm:6.10.2" +"@grafana/scenes-react@npm:6.10.4": + version: 6.10.4 + resolution: "@grafana/scenes-react@npm:6.10.4" dependencies: - "@grafana/scenes": "npm:6.10.2" + "@grafana/scenes": "npm:6.10.4" lru-cache: "npm:^10.2.2" react-use: "npm:^17.4.0" peerDependencies: @@ -3485,13 +3485,13 @@ __metadata: react: ^18.0.0 react-dom: ^18.0.0 react-router-dom: ^6.28.0 - checksum: 10/f87d51654becdbb9c703b04d60532413ccb3d963e6addb6577d4fe4b96a99d52e792cd12c6fed102b2a01c07266cac29061d1f38cb43e5929ea892c6093ea671 + checksum: 10/73aee4eca47a27e1fbb7a8f09ddf6a365b121cb361b01c7daabf698677f192c188de0dd64a424db4195139f625660f40371619abbb95a999e14c94e313e25755 languageName: node linkType: hard -"@grafana/scenes@npm:6.10.2": - version: 6.10.2 - resolution: "@grafana/scenes@npm:6.10.2" +"@grafana/scenes@npm:6.10.4": + version: 6.10.4 + resolution: "@grafana/scenes@npm:6.10.4" dependencies: "@floating-ui/react": "npm:^0.26.16" "@leeoniya/ufuzzy": "npm:^1.0.16" @@ -3509,7 +3509,7 @@ __metadata: react: ^18.0.0 react-dom: ^18.0.0 react-router-dom: ^6.28.0 - checksum: 10/4a6acc3e3f2ceb3316fcdb8cba79d54b3fca0130f05d480349bfc726ca6624cba6acf2333d96a292cc1a573f578274b1e85b7ba7c0096deda3fb02feb0179e3d + checksum: 10/ffd51ad71fe3b89c3cd16bfaa0f11e003bf11e4a4fb7513c5c55fdc5e569f51dcf9fb70cb125e63b5b2269d68e86a961769e07a8078cad70163de2c2ed779ef7 languageName: node linkType: hard @@ -17700,8 +17700,8 @@ __metadata: "@grafana/plugin-ui": "npm:0.10.5" "@grafana/prometheus": "workspace:*" "@grafana/runtime": "workspace:*" - "@grafana/scenes": "npm:6.10.2" - "@grafana/scenes-react": "npm:6.10.2" + "@grafana/scenes": "npm:6.10.4" + "@grafana/scenes-react": "npm:6.10.4" "@grafana/schema": "workspace:*" "@grafana/sql": "workspace:*" "@grafana/tsconfig": "npm:^2.0.0"