diff --git a/packages/extension-sdk/src/connect/types.ts b/packages/extension-sdk/src/connect/types.ts index 6e09029bb..b658a71ca 100644 --- a/packages/extension-sdk/src/connect/types.ts +++ b/packages/extension-sdk/src/connect/types.ts @@ -127,6 +127,10 @@ export enum ExtensionRequestType { * Visualization configuration data */ VIS_DEFAULT_CONFIG = 'VIS_DEFAULT_CONFIG', + /** + * Change visualization configuration after intial load + */ + VIS_CONFIG_UPDATE = 'VIS_CONFIG_UPDATE', /** * Tile add error messages */ diff --git a/packages/extension-sdk/src/connect/visualization/visualization_sdk.spec.ts b/packages/extension-sdk/src/connect/visualization/visualization_sdk.spec.ts index 3d3617f45..c113634bd 100644 --- a/packages/extension-sdk/src/connect/visualization/visualization_sdk.spec.ts +++ b/packages/extension-sdk/src/connect/visualization/visualization_sdk.spec.ts @@ -152,4 +152,56 @@ describe('VisualizationSDK', () => { sdk.updateVisData(visualizationData) expect(sdk.visualizationData).toBeUndefined() }) + + it('updates visConfig remotely and queryResponse locally when provided', () => { + const sdk = new VisualizationSDKImpl(api) + expect(sdk.visualizationData).toBeUndefined() + const visConfig: RawVisConfig = { + query_fields: { + measures: [{ a: 'a' }], + dimensions: [{ a: 'b' }], + table_calculations: [{ a: 'c' }], + pivots: [{ a: 'd' }], + }, + } + const queryResponse: RawVisQueryResponse = { + data: [{ abc: { value: 'xyz' } }], + fields: { + measures: [{ a: 'a' }], + dimensions: [{ a: 'b' }], + table_calculations: [{ a: 'c' }], + pivots: [{ a: 'd' }], + measure_like: [{ a: 'e' }], + dimension_like: [{ a: 'f' }], + }, + pivots: [], + } + const visualizationData: RawVisualizationData = { + visConfig, + queryResponse, + } + sdk.updateVisData(visualizationData) + expect(sdk.visualizationData).toEqual(visualizationData) + expect(sdk.visConfig.visConfig).toEqual(visConfig) + expect(api.send).toHaveBeenCalledWith('VIS_CONFIG_UPDATE', { + updatedConfig: visConfig, + }) + + const updatedVisConfig = { + ...visConfig, + background_color: 'blue', + } as RawVisConfig + const updatedVisualizationData: RawVisualizationData = { + visConfig: updatedVisConfig, + queryResponse, + } + + sdk.updateVisData(updatedVisualizationData) + expect(sdk.visualizationData).toEqual(updatedVisualizationData) + expect(sdk.visConfig.visConfig).toEqual(updatedVisConfig) + expect(api.send).toHaveBeenCalledWith('VIS_CONFIG_UPDATE', { + updatedConfig: updatedVisConfig, + }) + expect(sdk.visualizationData).toEqual(updatedVisualizationData) + }) }) diff --git a/packages/extension-sdk/src/connect/visualization/visualization_sdk.ts b/packages/extension-sdk/src/connect/visualization/visualization_sdk.ts index 29662e0e1..4c5d8f155 100644 --- a/packages/extension-sdk/src/connect/visualization/visualization_sdk.ts +++ b/packages/extension-sdk/src/connect/visualization/visualization_sdk.ts @@ -92,6 +92,10 @@ class VisualizationConfigImpl implements VisualizationConfig { this._visConfig = visConfig } + get visConfig(): RawVisConfig | undefined { + return this._visConfig + } + get queryFieldMeasures(): Measure[] { return this._visConfig?.query_fields?.measures || [] } @@ -124,10 +128,13 @@ export class VisualizationSDKImpl implements VisualizationSDK { // Should never happen. if (this.hostApi.isDashboardMountSupported) { this.visualizationData = visualizationData - if (this._visConfig) { + if (this.visConfig && this._visConfig) { this._visConfig.update(this.visualizationData.visConfig) + this.hostApi.send(ExtensionRequestType.VIS_CONFIG_UPDATE, { + updatedConfig: this.visualizationData.visConfig, + }) } - if (this._queryResponse) { + if (this.queryResponse && this._queryResponse) { this._queryResponse.update(this.visualizationData.queryResponse) } }