Skip to content

Commit 3ea3cfc

Browse files
authored
feat: Allow for setting vis config in extensions (#1394)
2 parents 2656f68 + 3fbe8fd commit 3ea3cfc

File tree

6 files changed

+61
-18
lines changed

6 files changed

+61
-18
lines changed

packages/extension-sdk/src/connect/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ export enum ExtensionRequestType {
124124
*/
125125
RENDERED = 'RENDERED',
126126
/**
127-
* Visualization configuration data
127+
* Set up the visConfig options that should be present in an explore
128128
*/
129129
VIS_DEFAULT_CONFIG = 'VIS_DEFAULT_CONFIG',
130130
/**

packages/extension-sdk/src/connect/visualization/types.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,38 @@ export interface VisualizationSDK {
119119
visConfig: VisualizationConfig
120120
queryResponse: QueryResponse
121121
updateVisData: (rawVisData: RawVisualizationData) => void
122-
configureVisualization: (options: RawVisConfig) => void
122+
configureVisualization: (options: VisOptions) => void
123+
setVisConfig: (config: RawVisConfig) => void
124+
}
125+
126+
export interface VisOptionValue {
127+
[label: string]: string
128+
}
129+
130+
export interface VisOption {
131+
type: string
132+
values?: VisOptionValue[]
133+
display?: string
134+
default?: any
135+
label?: string
136+
section?: string
137+
placeholder?: string
138+
display_size?: 'half' | 'third' | 'normal'
139+
order?: number
140+
hidden?: (setOptions: RawVisConfig) => boolean
141+
disabledReason?: (
142+
setOptions: RawVisConfig,
143+
queryResponse: QueryResponse
144+
) => string | null
145+
min?: number
146+
max?: number
147+
required?: boolean
148+
words?: VisOptionValue[]
149+
supports?: string[]
150+
color_application?: string
151+
sublabel?: string
152+
}
153+
154+
export interface VisOptions {
155+
[optionName: string]: VisOption
123156
}

packages/extension-sdk/src/connect/visualization/visualization_sdk.spec.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ describe('VisualizationSDK', () => {
153153
expect(sdk.visualizationData).toBeUndefined()
154154
})
155155

156-
it('updates visConfig remotely and queryResponse locally when provided', () => {
156+
it('updates visConfig and queryResponse locally when provided', () => {
157157
const sdk = new VisualizationSDKImpl(api)
158158
expect(sdk.visualizationData).toBeUndefined()
159159
const visConfig: RawVisConfig = {
@@ -183,9 +183,6 @@ describe('VisualizationSDK', () => {
183183
sdk.updateVisData(visualizationData)
184184
expect(sdk.visualizationData).toEqual(visualizationData)
185185
expect(sdk.visConfig.visConfig).toEqual(visConfig)
186-
expect(api.send).toHaveBeenCalledWith('VIS_CONFIG_UPDATE', {
187-
updatedConfig: visConfig,
188-
})
189186

190187
const updatedVisConfig = {
191188
...visConfig,
@@ -199,9 +196,5 @@ describe('VisualizationSDK', () => {
199196
sdk.updateVisData(updatedVisualizationData)
200197
expect(sdk.visualizationData).toEqual(updatedVisualizationData)
201198
expect(sdk.visConfig.visConfig).toEqual(updatedVisConfig)
202-
expect(api.send).toHaveBeenCalledWith('VIS_CONFIG_UPDATE', {
203-
updatedConfig: updatedVisConfig,
204-
})
205-
expect(sdk.visualizationData).toEqual(updatedVisualizationData)
206199
})
207200
})

packages/extension-sdk/src/connect/visualization/visualization_sdk.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import type {
3939
TableCalculation,
4040
PivotConfig,
4141
RawVisQueryResponse,
42+
VisOptions,
4243
} from './types'
4344

4445
class QueryResponseImpl implements QueryResponse {
@@ -130,24 +131,31 @@ export class VisualizationSDKImpl implements VisualizationSDK {
130131
this.visualizationData = visualizationData
131132
if (this.visConfig && this._visConfig) {
132133
this._visConfig.update(this.visualizationData.visConfig)
133-
this.hostApi.send(ExtensionRequestType.VIS_CONFIG_UPDATE, {
134-
updatedConfig: this.visualizationData.visConfig,
135-
})
136134
}
137135
if (this.queryResponse && this._queryResponse) {
138136
this._queryResponse.update(this.visualizationData.queryResponse)
139137
}
140138
}
141139
}
142140

143-
configureVisualization(options: RawVisConfig): void {
141+
configureVisualization(options: VisOptions): void {
144142
if (this.hostApi.isDashboardMountSupported) {
145143
this.hostApi.send(ExtensionRequestType.VIS_DEFAULT_CONFIG, { options })
146144
} else {
147145
throw NOT_DASHBOARD_MOUNT_NOT_SUPPORTED_ERROR
148146
}
149147
}
150148

149+
setVisConfig(config: RawVisConfig) {
150+
if (this.hostApi.isDashboardMountSupported) {
151+
this.hostApi.send(ExtensionRequestType.VIS_CONFIG_UPDATE, {
152+
updatedConfig: config,
153+
})
154+
} else {
155+
throw NOT_DASHBOARD_MOUNT_NOT_SUPPORTED_ERROR
156+
}
157+
}
158+
151159
get visConfig(): VisualizationConfig {
152160
if (!this._visConfig) {
153161
this._visConfig = new VisualizationConfigImpl(

packages/extension-tile-playground/src/components/VisualizationTile/VisualizationTile.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@
2424
2525
*/
2626
import React, { useContext, useEffect, useCallback, useMemo } from 'react'
27-
import { SpaceVertical, Text } from '@looker/components'
27+
import { SpaceVertical, Text, Button } from '@looker/components'
2828
import { More } from '@looker/icons'
2929
import { ExtensionContext40 } from '@looker/extension-sdk-react'
3030
import { useWindowSize } from '../../hooks/use_window_size'
3131
import { LiquidFillGaugeViz } from '../LiquidFillGaugeViz'
3232
import { Layout } from '../Layout'
3333
import { NavigateButton } from '../NavigateButton'
34-
import { liquidFillDefaultConfig, getValueAndFormat } from './util/liquid_fill'
34+
import { liquidFillVisOptions, getValueAndFormat } from './util/liquid_fill'
3535

3636
export const VisualizationTile: React.FC = () => {
3737
const { height, width } = useWindowSize()
@@ -48,10 +48,18 @@ export const VisualizationTile: React.FC = () => {
4848

4949
useEffect(() => {
5050
if (visualizationSDK) {
51-
visualizationSDK.configureVisualization(liquidFillDefaultConfig)
51+
visualizationSDK.configureVisualization(liquidFillVisOptions)
5252
}
5353
}, [visualizationSDK])
5454

55+
const toggleBackgroundColor = () => {
56+
if (visualizationData?.visConfig?.circleColor === 'red') {
57+
visualizationSDK.setVisConfig({ circleColor: 'blue' })
58+
} else {
59+
visualizationSDK.setVisConfig({ circleColor: 'red' })
60+
}
61+
}
62+
5563
const renderComplete = useCallback(() => {
5664
if (visualizationData) {
5765
extensionSDK.rendered()
@@ -64,6 +72,7 @@ export const VisualizationTile: React.FC = () => {
6472
<Text p="xxxxxlarge" fontSize="xxxxxlarge">
6573
Visualization Tile
6674
</Text>
75+
<Button onClick={toggleBackgroundColor}>Change background color</Button>
6776
{value && (
6877
<LiquidFillGaugeViz
6978
width={vizSize}

packages/extension-tile-playground/src/components/VisualizationTile/util/liquid_fill.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export const getValueAndFormat = (
6161
return { value, valueFormat }
6262
}
6363

64-
export const liquidFillDefaultConfig = {
64+
export const liquidFillVisOptions = {
6565
showComparison: {
6666
label: 'Use field comparison',
6767
default: false,

0 commit comments

Comments
 (0)