@thoughtspot/visual-embed-sdk 1.28.0-alpha.2 → 1.28.0-alpha.5
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/cjs/package.json +1 -1
- package/cjs/src/auth.d.ts +16 -1
- package/cjs/src/auth.d.ts.map +1 -1
- package/cjs/src/auth.js +5 -1
- package/cjs/src/auth.js.map +1 -1
- package/cjs/src/auth.spec.d.ts.map +1 -1
- package/cjs/src/auth.spec.js +9 -0
- package/cjs/src/auth.spec.js.map +1 -1
- package/cjs/src/authToken.d.ts +6 -0
- package/cjs/src/authToken.d.ts.map +1 -1
- package/cjs/src/authToken.js +6 -0
- package/cjs/src/authToken.js.map +1 -1
- package/cjs/src/embed/app.d.ts +156 -6
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +3 -3
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +19 -1
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/base.d.ts.map +1 -1
- package/cjs/src/embed/base.js +2 -3
- package/cjs/src/embed/base.js.map +1 -1
- package/cjs/src/embed/embed.spec.js +0 -15
- package/cjs/src/embed/embed.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +121 -6
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +2 -2
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +20 -1
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/pinboard.spec.js +20 -1
- package/cjs/src/embed/pinboard.spec.js.map +1 -1
- package/cjs/src/embed/sage.d.ts +6 -6
- package/cjs/src/embed/sage.d.ts.map +1 -1
- package/cjs/src/embed/sage.js +18 -3
- package/cjs/src/embed/sage.js.map +1 -1
- package/cjs/src/embed/sage.spec.js +11 -11
- package/cjs/src/embed/sage.spec.js.map +1 -1
- package/cjs/src/embed/search-bar.d.ts +37 -6
- package/cjs/src/embed/search-bar.d.ts.map +1 -1
- package/cjs/src/embed/search-bar.js +2 -2
- package/cjs/src/embed/search-bar.js.map +1 -1
- package/cjs/src/embed/search.d.ts +90 -1
- package/cjs/src/embed/search.d.ts.map +1 -1
- package/cjs/src/embed/search.js +3 -3
- package/cjs/src/embed/search.js.map +1 -1
- package/cjs/src/embed/search.spec.js +25 -1
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed-trigger.spec.d.ts +2 -0
- package/cjs/src/embed/ts-embed-trigger.spec.d.ts.map +1 -0
- package/cjs/src/embed/ts-embed-trigger.spec.js +34 -0
- package/cjs/src/embed/ts-embed-trigger.spec.js.map +1 -0
- package/cjs/src/embed/ts-embed.d.ts +1 -1
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +14 -11
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +47 -17
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/index.d.ts +3 -1
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +5 -1
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/react/index.spec.js +1 -1
- package/cjs/src/react/index.spec.js.map +1 -1
- package/cjs/src/test/test-utils.d.ts +1 -0
- package/cjs/src/test/test-utils.d.ts.map +1 -1
- package/cjs/src/test/test-utils.js +10 -1
- package/cjs/src/test/test-utils.js.map +1 -1
- package/cjs/src/tokenizedFetch.d.ts +9 -0
- package/cjs/src/tokenizedFetch.d.ts.map +1 -1
- package/cjs/src/tokenizedFetch.js +9 -0
- package/cjs/src/tokenizedFetch.js.map +1 -1
- package/cjs/src/types.d.ts +299 -43
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +110 -19
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/authService/authService.d.ts.map +1 -1
- package/cjs/src/utils/authService/authService.js +9 -3
- package/cjs/src/utils/authService/authService.js.map +1 -1
- package/cjs/src/utils/authService/authService.spec.js +22 -0
- package/cjs/src/utils/authService/authService.spec.js.map +1 -1
- package/dist/src/auth.d.ts +16 -1
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/auth.spec.d.ts.map +1 -1
- package/dist/src/authToken.d.ts +6 -0
- package/dist/src/authToken.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +156 -6
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +121 -6
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/sage.d.ts +6 -6
- package/dist/src/embed/sage.d.ts.map +1 -1
- package/dist/src/embed/search-bar.d.ts +37 -6
- package/dist/src/embed/search-bar.d.ts.map +1 -1
- package/dist/src/embed/search.d.ts +90 -1
- package/dist/src/embed/search.d.ts.map +1 -1
- package/dist/src/embed/ts-embed-trigger.spec.d.ts +2 -0
- package/dist/src/embed/ts-embed-trigger.spec.d.ts.map +1 -0
- package/dist/src/embed/ts-embed.d.ts +1 -1
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/test/test-utils.d.ts +1 -0
- package/dist/src/test/test-utils.d.ts.map +1 -1
- package/dist/src/tokenizedFetch.d.ts +9 -0
- package/dist/src/tokenizedFetch.d.ts.map +1 -1
- package/dist/src/types.d.ts +299 -43
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/authService/authService.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +180 -47
- package/dist/tsembed-react.js +180 -47
- package/dist/tsembed.es.js +182 -51
- package/dist/tsembed.js +183 -50
- package/dist/visual-embed-sdk-react-full.d.ts +746 -70
- package/dist/visual-embed-sdk-react.d.ts +746 -70
- package/dist/visual-embed-sdk.d.ts +746 -70
- package/lib/package.json +1 -1
- package/lib/src/auth.d.ts +16 -1
- package/lib/src/auth.d.ts.map +1 -1
- package/lib/src/auth.js +5 -1
- package/lib/src/auth.js.map +1 -1
- package/lib/src/auth.spec.d.ts.map +1 -1
- package/lib/src/auth.spec.js +9 -0
- package/lib/src/auth.spec.js.map +1 -1
- package/lib/src/authToken.d.ts +6 -0
- package/lib/src/authToken.d.ts.map +1 -1
- package/lib/src/authToken.js +6 -0
- package/lib/src/authToken.js.map +1 -1
- package/lib/src/embed/app.d.ts +156 -6
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +3 -3
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +19 -1
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts.map +1 -1
- package/lib/src/embed/base.js +2 -3
- package/lib/src/embed/base.js.map +1 -1
- package/lib/src/embed/embed.spec.js +2 -17
- package/lib/src/embed/embed.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +121 -6
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +2 -2
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +20 -1
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/pinboard.spec.js +20 -1
- package/lib/src/embed/pinboard.spec.js.map +1 -1
- package/lib/src/embed/sage.d.ts +6 -6
- package/lib/src/embed/sage.d.ts.map +1 -1
- package/lib/src/embed/sage.js +18 -3
- package/lib/src/embed/sage.js.map +1 -1
- package/lib/src/embed/sage.spec.js +11 -11
- package/lib/src/embed/sage.spec.js.map +1 -1
- package/lib/src/embed/search-bar.d.ts +37 -6
- package/lib/src/embed/search-bar.d.ts.map +1 -1
- package/lib/src/embed/search-bar.js +2 -2
- package/lib/src/embed/search-bar.js.map +1 -1
- package/lib/src/embed/search.d.ts +90 -1
- package/lib/src/embed/search.d.ts.map +1 -1
- package/lib/src/embed/search.js +3 -3
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/search.spec.js +25 -1
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/ts-embed-trigger.spec.d.ts +2 -0
- package/lib/src/embed/ts-embed-trigger.spec.d.ts.map +1 -0
- package/lib/src/embed/ts-embed-trigger.spec.js +32 -0
- package/lib/src/embed/ts-embed-trigger.spec.js.map +1 -0
- package/lib/src/embed/ts-embed.d.ts +1 -1
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +14 -11
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +41 -11
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/index.d.ts +3 -1
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +3 -1
- package/lib/src/index.js.map +1 -1
- package/lib/src/react/index.spec.js +1 -1
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/test/test-utils.d.ts +1 -0
- package/lib/src/test/test-utils.d.ts.map +1 -1
- package/lib/src/test/test-utils.js +8 -0
- package/lib/src/test/test-utils.js.map +1 -1
- package/lib/src/tokenizedFetch.d.ts +9 -0
- package/lib/src/tokenizedFetch.d.ts.map +1 -1
- package/lib/src/tokenizedFetch.js +9 -0
- package/lib/src/tokenizedFetch.js.map +1 -1
- package/lib/src/types.d.ts +299 -43
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +110 -19
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/authService/authService.d.ts.map +1 -1
- package/lib/src/utils/authService/authService.js +9 -3
- package/lib/src/utils/authService/authService.js.map +1 -1
- package/lib/src/utils/authService/authService.spec.js +22 -0
- package/lib/src/utils/authService/authService.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +754 -71
- package/package.json +1 -1
- package/src/auth.spec.ts +10 -0
- package/src/auth.ts +21 -2
- package/src/authToken.ts +6 -0
- package/src/embed/app.spec.ts +24 -1
- package/src/embed/app.ts +164 -11
- package/src/embed/base.ts +3 -5
- package/src/embed/embed.spec.ts +0 -18
- package/src/embed/liveboard.spec.ts +24 -1
- package/src/embed/liveboard.ts +128 -9
- package/src/embed/pinboard.spec.ts +24 -1
- package/src/embed/sage.spec.ts +11 -11
- package/src/embed/sage.ts +19 -6
- package/src/embed/search-bar.tsx +38 -7
- package/src/embed/search.spec.ts +29 -1
- package/src/embed/search.ts +98 -5
- package/src/embed/ts-embed-trigger.spec.ts +39 -0
- package/src/embed/ts-embed.spec.ts +49 -16
- package/src/embed/ts-embed.ts +21 -16
- package/src/index.ts +4 -0
- package/src/react/index.spec.tsx +1 -0
- package/src/test/test-utils.ts +9 -0
- package/src/tokenizedFetch.ts +9 -0
- package/src/types.ts +310 -50
- package/src/utils/authService/authService.spec.ts +27 -0
- package/src/utils/authService/authService.ts +14 -13
package/src/embed/search.ts
CHANGED
|
@@ -8,7 +8,11 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import {
|
|
11
|
-
DataSourceVisualMode,
|
|
11
|
+
DataSourceVisualMode,
|
|
12
|
+
DOMSelector,
|
|
13
|
+
Param,
|
|
14
|
+
Action,
|
|
15
|
+
ViewConfig,
|
|
12
16
|
} from '../types';
|
|
13
17
|
import {
|
|
14
18
|
getQueryParamString,
|
|
@@ -57,27 +61,74 @@ export interface SearchViewConfig
|
|
|
57
61
|
/**
|
|
58
62
|
* If set to true, the data sources panel is collapsed on load,
|
|
59
63
|
* but can be expanded manually.
|
|
64
|
+
*
|
|
65
|
+
* @version: SDK: 1.1.0 | ThoughtSpot: 8.1.0.sw
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```js
|
|
69
|
+
* const embed = new SearchEmbed('#tsEmbed', {
|
|
70
|
+
* ... // other options
|
|
71
|
+
* collapseDataSources:true,
|
|
72
|
+
* })
|
|
73
|
+
* ```
|
|
60
74
|
*/
|
|
61
75
|
collapseDataSources?: boolean;
|
|
62
76
|
/**
|
|
63
77
|
* Show or hide the data sources panel.
|
|
78
|
+
*
|
|
79
|
+
* @version: SDK: 1.2.0 | ThoughtSpot: 9.1.0.sw
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```js
|
|
83
|
+
* const embed = new SearchEmbed('#tsEmbed', {
|
|
84
|
+
* ... // other options
|
|
85
|
+
* hideDataSources:true,
|
|
86
|
+
* })
|
|
87
|
+
* ```
|
|
64
88
|
*/
|
|
65
89
|
hideDataSources?: boolean;
|
|
66
90
|
/**
|
|
67
91
|
* Show or hide the charts and tables in search answers.
|
|
68
92
|
* This attribute can be used to create a custom visualization
|
|
69
93
|
* using raw answer data.
|
|
94
|
+
*
|
|
95
|
+
* @version: SDK: 1.2.0 | ThoughtSpot: 9.1.0.sw
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```js
|
|
99
|
+
* const embed = new SearchEmbed('#tsEmbed', {
|
|
100
|
+
* ... // other options
|
|
101
|
+
* hideResults:true,
|
|
102
|
+
* })
|
|
103
|
+
* ```
|
|
70
104
|
*/
|
|
71
105
|
hideResults?: boolean;
|
|
72
106
|
/**
|
|
73
107
|
* If set to true, the Search Assist feature is enabled.
|
|
74
108
|
*
|
|
75
109
|
* @version SDK: 1.13.0 | ThoughtSpot: 8.5.0.cl, 8.8.1-sw
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```js
|
|
113
|
+
* const embed = new SearchEmbed('#tsEmbed', {
|
|
114
|
+
* ... // other options
|
|
115
|
+
* enableSearchAssist:true,
|
|
116
|
+
* })
|
|
117
|
+
* ```
|
|
76
118
|
*/
|
|
77
119
|
enableSearchAssist?: boolean;
|
|
78
120
|
/**
|
|
79
121
|
* If set to true, the tabular view is set as the default
|
|
80
122
|
* format for presenting search data.
|
|
123
|
+
*
|
|
124
|
+
* @version: SDK: 1.1.0 | ThoughtSpot: 8.1.0.sw
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```js
|
|
128
|
+
* const embed = new SearchEmbed('#tsEmbed', {
|
|
129
|
+
* ... // other options
|
|
130
|
+
* forceTable:true,
|
|
131
|
+
* })
|
|
81
132
|
*/
|
|
82
133
|
forceTable?: boolean;
|
|
83
134
|
/**
|
|
@@ -85,12 +136,28 @@ export interface SearchViewConfig
|
|
|
85
136
|
* Only a single data source is supported currently.
|
|
86
137
|
*
|
|
87
138
|
* @deprecated Use `dataSource` instead.
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```js
|
|
142
|
+
* const embed = new SearchEmbed('#tsEmbed', {
|
|
143
|
+
* ... // other options
|
|
144
|
+
* dataSources:['id-234','id-456'],
|
|
145
|
+
* })
|
|
146
|
+
* ```
|
|
88
147
|
*/
|
|
89
148
|
dataSources?: string[];
|
|
90
149
|
/**
|
|
91
150
|
* The array of data source GUIDs to set on load.
|
|
92
151
|
*
|
|
93
152
|
* @version: SDK: 1.19.0
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```js
|
|
156
|
+
* const embed = new SearchEmbed('#tsEmbed', {
|
|
157
|
+
* ... // other options
|
|
158
|
+
* dataSource:'id-234',
|
|
159
|
+
* })
|
|
160
|
+
* ```
|
|
94
161
|
*/
|
|
95
162
|
dataSource?: string;
|
|
96
163
|
/**
|
|
@@ -123,6 +190,16 @@ export interface SearchViewConfig
|
|
|
123
190
|
searchOptions?: SearchOptions;
|
|
124
191
|
/**
|
|
125
192
|
* The GUID of a saved answer to load initially.
|
|
193
|
+
*
|
|
194
|
+
* @version: SDK: 1.1.0 | ThoughtSpot: 8.1.0.sw
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* ```js
|
|
198
|
+
* const embed = new SearchEmbed('#tsEmbed', {
|
|
199
|
+
* ... // other options
|
|
200
|
+
* answerId:'sed-1234',
|
|
201
|
+
* })
|
|
202
|
+
* ```
|
|
126
203
|
*/
|
|
127
204
|
answerId?: string;
|
|
128
205
|
/**
|
|
@@ -130,6 +207,14 @@ export interface SearchViewConfig
|
|
|
130
207
|
* The chart/table should still be visible.
|
|
131
208
|
*
|
|
132
209
|
* @version SDK: 1.21.0 | ThoughtSpot: 9.2.0.cl, 9.5.0.sw
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* ```js
|
|
213
|
+
* const embed = new SearchEmbed('#tsEmbed', {
|
|
214
|
+
* ... // other options
|
|
215
|
+
* hideSearchBar:true,
|
|
216
|
+
* })
|
|
217
|
+
* ```
|
|
133
218
|
*/
|
|
134
219
|
hideSearchBar?: boolean;
|
|
135
220
|
/**
|
|
@@ -137,6 +222,14 @@ export interface SearchViewConfig
|
|
|
137
222
|
*
|
|
138
223
|
* @default false
|
|
139
224
|
* @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
|
|
225
|
+
*
|
|
226
|
+
* @example
|
|
227
|
+
* ```js
|
|
228
|
+
* const embed = new SearchEmbed('#tsEmbed', {
|
|
229
|
+
* ... // other options
|
|
230
|
+
* dataPanelV2:false,
|
|
231
|
+
* })
|
|
232
|
+
* ```
|
|
140
233
|
*/
|
|
141
234
|
dataPanelV2?: boolean;
|
|
142
235
|
/**
|
|
@@ -196,7 +289,7 @@ export class SearchEmbed extends TsEmbed {
|
|
|
196
289
|
runtimeFilters,
|
|
197
290
|
dataSource,
|
|
198
291
|
dataSources,
|
|
199
|
-
excludeRuntimeFiltersfromURL,
|
|
292
|
+
excludeRuntimeFiltersfromURL = true,
|
|
200
293
|
hideSearchBar,
|
|
201
294
|
dataPanelV2 = false,
|
|
202
295
|
useLastSelectedSources = false,
|
|
@@ -281,18 +374,18 @@ export class SearchEmbed extends TsEmbed {
|
|
|
281
374
|
/**
|
|
282
375
|
* Render the embedded ThoughtSpot search
|
|
283
376
|
*/
|
|
284
|
-
public render(): SearchEmbed {
|
|
377
|
+
public async render(): Promise<SearchEmbed> {
|
|
285
378
|
super.render();
|
|
286
379
|
const { answerId } = this.viewConfig;
|
|
287
380
|
|
|
288
381
|
const src = this.getIFrameSrc();
|
|
289
|
-
this.renderIFrame(src);
|
|
382
|
+
await this.renderIFrame(src);
|
|
290
383
|
getAuthPromise().then(() => {
|
|
291
384
|
if (
|
|
292
385
|
checkReleaseVersionInBeta(
|
|
293
386
|
getReleaseVersion(),
|
|
294
387
|
getEmbedConfig().suppressSearchEmbedBetaWarning
|
|
295
|
-
|
|
388
|
+
|| getEmbedConfig().suppressErrorAlerts,
|
|
296
389
|
)
|
|
297
390
|
) {
|
|
298
391
|
alert(ERROR_MESSAGE.SEARCHEMBED_BETA_WRANING_MESSAGE);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {
|
|
2
|
+
init, AuthType, LiveboardEmbed, HostEvent,
|
|
3
|
+
} from '../index';
|
|
4
|
+
import {
|
|
5
|
+
executeAfterWait,
|
|
6
|
+
getDocumentBody,
|
|
7
|
+
getIFrameEl,
|
|
8
|
+
getRootEl,
|
|
9
|
+
} from '../test/test-utils';
|
|
10
|
+
|
|
11
|
+
describe('Trigger', () => {
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
document.body.innerHTML = getDocumentBody();
|
|
14
|
+
});
|
|
15
|
+
test('should trigger the event', async (done) => {
|
|
16
|
+
init({
|
|
17
|
+
thoughtSpotHost: 'https://tshost',
|
|
18
|
+
authType: AuthType.None,
|
|
19
|
+
});
|
|
20
|
+
const lb = new LiveboardEmbed(getRootEl(), {
|
|
21
|
+
frameParams: {
|
|
22
|
+
width: '100%',
|
|
23
|
+
height: '100%',
|
|
24
|
+
},
|
|
25
|
+
liveboardId: '123',
|
|
26
|
+
});
|
|
27
|
+
const val = await lb.render();
|
|
28
|
+
const iframe = getIFrameEl();
|
|
29
|
+
jest.spyOn(iframe.contentWindow, 'postMessage');
|
|
30
|
+
executeAfterWait(() => {
|
|
31
|
+
lb.trigger(HostEvent.DownloadAsCsv, { vizId: 'testId' });
|
|
32
|
+
expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(expect.objectContaining({
|
|
33
|
+
type: HostEvent.DownloadAsCsv,
|
|
34
|
+
data: { vizId: 'testId' },
|
|
35
|
+
}), 'https://tshost', expect.anything());
|
|
36
|
+
done();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
LiveboardEmbed,
|
|
12
12
|
} from '../index';
|
|
13
13
|
import {
|
|
14
|
-
Action, HomeLeftNavItem, RuntimeFilter, RuntimeFilterOp, HomepageModule,
|
|
14
|
+
Action, HomeLeftNavItem, RuntimeFilter, RuntimeFilterOp, HomepageModule, HostEvent,
|
|
15
15
|
} from '../types';
|
|
16
16
|
import {
|
|
17
17
|
executeAfterWait,
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
waitFor,
|
|
25
25
|
expectUrlMatchesWithParams,
|
|
26
26
|
mockMessageChannel,
|
|
27
|
+
createRootEleForEmbed,
|
|
27
28
|
} from '../test/test-utils';
|
|
28
29
|
import * as config from '../config';
|
|
29
30
|
import * as tsEmbedInstance from './ts-embed';
|
|
@@ -47,15 +48,6 @@ const tabId2 = 'eca215d4-0d2c-4a55-90e3-d81ef6848ae0';
|
|
|
47
48
|
const thoughtSpotHost = 'tshost';
|
|
48
49
|
const defaultParamsPost = '';
|
|
49
50
|
|
|
50
|
-
const createRootEleForEmbed = () => {
|
|
51
|
-
const rootEle = document.createElement('div');
|
|
52
|
-
rootEle.id = 'myRoot';
|
|
53
|
-
const tsEmbedDiv = document.createElement('div');
|
|
54
|
-
tsEmbedDiv.id = 'tsEmbedDiv';
|
|
55
|
-
rootEle.appendChild(tsEmbedDiv);
|
|
56
|
-
document.body.appendChild(rootEle);
|
|
57
|
-
};
|
|
58
|
-
|
|
59
51
|
beforeAll(() => {
|
|
60
52
|
spyOn(window, 'alert');
|
|
61
53
|
});
|
|
@@ -317,6 +309,46 @@ describe('Unit test case for ts embed', () => {
|
|
|
317
309
|
});
|
|
318
310
|
});
|
|
319
311
|
|
|
312
|
+
test('Runtime filters from view Config should be part of app_init payload when excludeRuntimeFiltersfromURL is undefined', async () => {
|
|
313
|
+
const mockEmbedEventPayload = {
|
|
314
|
+
type: EmbedEvent.APP_INIT,
|
|
315
|
+
data: {},
|
|
316
|
+
};
|
|
317
|
+
const mockRuntimeFilters: RuntimeFilter[] = [
|
|
318
|
+
{
|
|
319
|
+
columnName: 'color',
|
|
320
|
+
operator: RuntimeFilterOp.EQ,
|
|
321
|
+
values: ['blue'],
|
|
322
|
+
},
|
|
323
|
+
];
|
|
324
|
+
|
|
325
|
+
const searchEmbed = new SearchEmbed(getRootEl(), {
|
|
326
|
+
...defaultViewConfig,
|
|
327
|
+
excludeRuntimeFiltersfromURL: true,
|
|
328
|
+
runtimeFilters: mockRuntimeFilters,
|
|
329
|
+
});
|
|
330
|
+
searchEmbed.render();
|
|
331
|
+
const mockPort: any = {
|
|
332
|
+
postMessage: jest.fn(),
|
|
333
|
+
};
|
|
334
|
+
await executeAfterWait(() => {
|
|
335
|
+
const iframe = getIFrameEl();
|
|
336
|
+
postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
|
|
337
|
+
});
|
|
338
|
+
expect(mockPort.postMessage).toHaveBeenCalledWith({
|
|
339
|
+
type: EmbedEvent.APP_INIT,
|
|
340
|
+
data: {
|
|
341
|
+
customisations,
|
|
342
|
+
authToken: '',
|
|
343
|
+
runtimeFilterParams: 'col1=color&op1=EQ&val1=blue',
|
|
344
|
+
hiddenHomeLeftNavItems: [],
|
|
345
|
+
hiddenHomepageModules: [],
|
|
346
|
+
hostConfig: undefined,
|
|
347
|
+
reorderedHomepageModules: [],
|
|
348
|
+
},
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
|
|
320
352
|
test('Runtime filters from view Config should not be part of app_init payload when excludeRuntimeFiltersfromURL is false', async () => {
|
|
321
353
|
const mockEmbedEventPayload = {
|
|
322
354
|
type: EmbedEvent.APP_INIT,
|
|
@@ -364,7 +396,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
364
396
|
};
|
|
365
397
|
const mockedHiddenHomeLeftNavItems: HomeLeftNavItem[] = [
|
|
366
398
|
HomeLeftNavItem.Home,
|
|
367
|
-
HomeLeftNavItem.
|
|
399
|
+
HomeLeftNavItem.MonitorSubscription,
|
|
368
400
|
];
|
|
369
401
|
|
|
370
402
|
const searchEmbed = new AppEmbed(getRootEl(), {
|
|
@@ -386,7 +418,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
386
418
|
authToken: '',
|
|
387
419
|
hostConfig: undefined,
|
|
388
420
|
runtimeFilterParams: null,
|
|
389
|
-
hiddenHomeLeftNavItems:
|
|
421
|
+
hiddenHomeLeftNavItems:
|
|
422
|
+
[HomeLeftNavItem.Home, HomeLeftNavItem.MonitorSubscription],
|
|
390
423
|
hiddenHomepageModules: [],
|
|
391
424
|
reorderedHomepageModules: [],
|
|
392
425
|
},
|
|
@@ -1176,7 +1209,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1176
1209
|
expectUrlMatchesWithParams(
|
|
1177
1210
|
getIFrameSrc(),
|
|
1178
1211
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
|
|
1179
|
-
|
|
1212
|
+
+ `&foo=bar&baz=1&bool=true${defaultParamsPost}#/home`,
|
|
1180
1213
|
);
|
|
1181
1214
|
});
|
|
1182
1215
|
|
|
@@ -1192,7 +1225,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1192
1225
|
expectUrlMatchesWithParams(
|
|
1193
1226
|
getIFrameSrc(),
|
|
1194
1227
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
|
|
1195
|
-
|
|
1228
|
+
+ `&showAlerts=true${defaultParamsPost}#/home`,
|
|
1196
1229
|
);
|
|
1197
1230
|
});
|
|
1198
1231
|
it('Sets the locale param', async () => {
|
|
@@ -1207,7 +1240,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1207
1240
|
expectUrlMatchesWithParams(
|
|
1208
1241
|
getIFrameSrc(),
|
|
1209
1242
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
|
|
1210
|
-
|
|
1243
|
+
+ `&locale=ja-JP${defaultParamsPost}#/home`,
|
|
1211
1244
|
);
|
|
1212
1245
|
});
|
|
1213
1246
|
it('Sets the iconSprite url', async () => {
|
|
@@ -1224,7 +1257,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1224
1257
|
expectUrlMatchesWithParams(
|
|
1225
1258
|
getIFrameSrc(),
|
|
1226
1259
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
|
|
1227
|
-
|
|
1260
|
+
+ `&iconSprite=iconSprite.com${defaultParamsPost}#/home`,
|
|
1228
1261
|
);
|
|
1229
1262
|
});
|
|
1230
1263
|
|
package/src/embed/ts-embed.ts
CHANGED
|
@@ -170,7 +170,7 @@ export class TsEmbed {
|
|
|
170
170
|
this.thoughtSpotV2Base = getV2BasePath(this.embedConfig);
|
|
171
171
|
this.eventHandlerMap = new Map();
|
|
172
172
|
this.isError = false;
|
|
173
|
-
this.viewConfig = viewConfig;
|
|
173
|
+
this.viewConfig = { excludeRuntimeFiltersfromURL: true, ...viewConfig };
|
|
174
174
|
this.shouldEncodeUrlQueryParams = this.embedConfig.shouldEncodeUrlQueryParams;
|
|
175
175
|
this.registerAppInit();
|
|
176
176
|
uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
|
|
@@ -518,10 +518,7 @@ export class TsEmbed {
|
|
|
518
518
|
const queryParams = this.shouldEncodeUrlQueryParams
|
|
519
519
|
? `?base64UrlEncodedFlags=${getEncodedQueryParamsString(queryString)}`
|
|
520
520
|
: `?${queryString}`;
|
|
521
|
-
|
|
522
|
-
if (!isUndefined(this.embedConfig.enableReactShell)) {
|
|
523
|
-
host = this.embedConfig.enableReactShell as boolean ? '/v2' : '/v1';
|
|
524
|
-
}
|
|
521
|
+
const host = this.thoughtSpotHost;
|
|
525
522
|
const path = `${host}/${queryParams}#`;
|
|
526
523
|
return path;
|
|
527
524
|
}
|
|
@@ -968,6 +965,16 @@ export class TsEmbed {
|
|
|
968
965
|
*/
|
|
969
966
|
public trigger(messageType: HostEvent, data: any = {}): Promise<any> {
|
|
970
967
|
uploadMixpanelEvent(`${MIXPANEL_EVENT.VISUAL_SDK_TRIGGER}-${messageType}`);
|
|
968
|
+
|
|
969
|
+
if (!this.isRendered) {
|
|
970
|
+
this.handleError('Please call render before triggering events');
|
|
971
|
+
return null;
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
if (!messageType) {
|
|
975
|
+
this.handleError('Host event type is undefined');
|
|
976
|
+
return null;
|
|
977
|
+
}
|
|
971
978
|
return processTrigger(this.iFrame, messageType, this.thoughtSpotHost, data);
|
|
972
979
|
}
|
|
973
980
|
|
|
@@ -978,7 +985,7 @@ export class TsEmbed {
|
|
|
978
985
|
*
|
|
979
986
|
* @param args
|
|
980
987
|
*/
|
|
981
|
-
public render(): TsEmbed {
|
|
988
|
+
public async render(): Promise<TsEmbed> {
|
|
982
989
|
this.isRendered = true;
|
|
983
990
|
|
|
984
991
|
return this;
|
|
@@ -1090,11 +1097,11 @@ export class TsEmbed {
|
|
|
1090
1097
|
) {
|
|
1091
1098
|
logger.warn(
|
|
1092
1099
|
`${viewConfig.embedComponentType || 'Component'} was pre-rendered with `
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1100
|
+
+ `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
|
|
1101
|
+
+ `but a different value "${JSON.stringify(viewConfig[key])}" `
|
|
1102
|
+
+ 'was passed to the Embed component. '
|
|
1103
|
+
+ 'The new value provided is ignored, the value provided during '
|
|
1104
|
+
+ 'preRender is used.',
|
|
1098
1105
|
);
|
|
1099
1106
|
}
|
|
1100
1107
|
});
|
|
@@ -1164,8 +1171,8 @@ export class TsEmbed {
|
|
|
1164
1171
|
const elBoundingClient = this.el.getBoundingClientRect();
|
|
1165
1172
|
|
|
1166
1173
|
setStyleProperties(this.preRenderWrapper, {
|
|
1167
|
-
top: `${elBoundingClient.y}px`,
|
|
1168
|
-
left: `${elBoundingClient.x}px`,
|
|
1174
|
+
top: `${elBoundingClient.y + window.scrollY}px`,
|
|
1175
|
+
left: `${elBoundingClient.x + window.scrollX}px`,
|
|
1169
1176
|
width: `${elBoundingClient.width}px`,
|
|
1170
1177
|
height: `${elBoundingClient.height}px`,
|
|
1171
1178
|
});
|
|
@@ -1186,8 +1193,6 @@ export class TsEmbed {
|
|
|
1186
1193
|
pointerEvents: 'none',
|
|
1187
1194
|
zIndex: '-1000',
|
|
1188
1195
|
position: 'absolute ',
|
|
1189
|
-
top: '0',
|
|
1190
|
-
left: '0',
|
|
1191
1196
|
};
|
|
1192
1197
|
setStyleProperties(this.preRenderWrapper, preRenderHideStyles);
|
|
1193
1198
|
|
|
@@ -1238,7 +1243,7 @@ export class V1Embed extends TsEmbed {
|
|
|
1238
1243
|
|
|
1239
1244
|
constructor(domSelector: DOMSelector, viewConfig: ViewConfig) {
|
|
1240
1245
|
super(domSelector, viewConfig);
|
|
1241
|
-
this.viewConfig = viewConfig;
|
|
1246
|
+
this.viewConfig = { excludeRuntimeFiltersfromURL: true, ...viewConfig };
|
|
1242
1247
|
}
|
|
1243
1248
|
|
|
1244
1249
|
/**
|
package/src/index.ts
CHANGED
|
@@ -54,6 +54,7 @@ import { SageEmbed, SageViewConfig } from './embed/sage';
|
|
|
54
54
|
import { AnswerService, SessionInterface, UnderlyingDataPoint } from './utils/graphql/answerService/answerService';
|
|
55
55
|
import { getEmbedConfig } from './embed/embedConfig';
|
|
56
56
|
import { uploadMixpanelEvent, MIXPANEL_EVENT } from './mixpanel-service';
|
|
57
|
+
import { tokenizedFetch } from './tokenizedFetch';
|
|
57
58
|
|
|
58
59
|
export {
|
|
59
60
|
init,
|
|
@@ -65,6 +66,7 @@ export {
|
|
|
65
66
|
exportTMLInput,
|
|
66
67
|
getEmbedConfig as getInitConfig,
|
|
67
68
|
getSessionInfo,
|
|
69
|
+
tokenizedFetch,
|
|
68
70
|
SearchEmbed,
|
|
69
71
|
SearchBarEmbed,
|
|
70
72
|
PinboardEmbed,
|
|
@@ -113,3 +115,5 @@ export {
|
|
|
113
115
|
VizPoint,
|
|
114
116
|
CustomActionPayload,
|
|
115
117
|
};
|
|
118
|
+
|
|
119
|
+
export { resetCachedAuthToken } from './authToken';
|
package/src/react/index.spec.tsx
CHANGED
package/src/test/test-utils.ts
CHANGED
|
@@ -116,3 +116,12 @@ export const expectUrlMatch = (source: string, target: string) => {
|
|
|
116
116
|
const targetUrl = new URL(target);
|
|
117
117
|
expect(sourceUrl.hash).toBe(targetUrl.hash);
|
|
118
118
|
};
|
|
119
|
+
|
|
120
|
+
export const createRootEleForEmbed = () => {
|
|
121
|
+
const rootEle = document.createElement('div');
|
|
122
|
+
rootEle.id = 'myRoot';
|
|
123
|
+
const tsEmbedDiv = document.createElement('div');
|
|
124
|
+
tsEmbedDiv.id = 'tsEmbedDiv';
|
|
125
|
+
rootEle.appendChild(tsEmbedDiv);
|
|
126
|
+
document.body.appendChild(rootEle);
|
|
127
|
+
};
|
package/src/tokenizedFetch.ts
CHANGED
|
@@ -3,6 +3,15 @@ import { getEmbedConfig } from './embed/embedConfig';
|
|
|
3
3
|
|
|
4
4
|
import { AuthType } from './types';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Fetch wrapper that adds the authentication token to the request.
|
|
8
|
+
* Use this to call the ThoughtSpot APIs when using the visual embed sdk.
|
|
9
|
+
*
|
|
10
|
+
* @param input
|
|
11
|
+
* @param init
|
|
12
|
+
* @version SDK: 1.28.0
|
|
13
|
+
* @group Global methods
|
|
14
|
+
*/
|
|
6
15
|
export const tokenizedFetch: typeof fetch = async (input, init): Promise<Response> => {
|
|
7
16
|
const embedConfig = getEmbedConfig();
|
|
8
17
|
if (embedConfig.authType !== AuthType.TrustedAuthTokenCookieless) {
|