@thoughtspot/visual-embed-sdk 1.41.1 → 1.42.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/cjs/package.json +8 -8
- package/cjs/src/css-variables.d.ts +52 -14
- package/cjs/src/css-variables.d.ts.map +1 -1
- package/cjs/src/embed/bodyless-conversation.d.ts +1 -0
- package/cjs/src/embed/bodyless-conversation.d.ts.map +1 -1
- package/cjs/src/embed/bodyless-conversation.js +7 -3
- package/cjs/src/embed/bodyless-conversation.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +1 -0
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +7 -2
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +1 -0
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +6 -1
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +13 -0
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/sage.d.ts +1 -0
- package/cjs/src/embed/sage.d.ts.map +1 -1
- package/cjs/src/embed/sage.js +10 -6
- package/cjs/src/embed/sage.js.map +1 -1
- package/cjs/src/embed/search-bar.d.ts +1 -0
- package/cjs/src/embed/search-bar.d.ts.map +1 -1
- package/cjs/src/embed/search-bar.js +11 -7
- package/cjs/src/embed/search-bar.js.map +1 -1
- package/cjs/src/embed/search.d.ts +1 -0
- package/cjs/src/embed/search.d.ts.map +1 -1
- package/cjs/src/embed/search.js +7 -8
- package/cjs/src/embed/search.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +6 -4
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +21 -8
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/react/all-types-export.spec.js +1 -1
- package/cjs/src/react/all-types-export.spec.js.map +1 -1
- package/cjs/src/react/util.js.map +1 -1
- package/cjs/src/react/util.spec.d.ts +2 -0
- package/cjs/src/react/util.spec.d.ts.map +1 -0
- package/cjs/src/react/util.spec.js +78 -0
- package/cjs/src/react/util.spec.js.map +1 -0
- package/cjs/src/types.d.ts +35 -4
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +34 -3
- package/cjs/src/types.js.map +1 -1
- package/dist/{index-DQueHwfQ.js → index-BpSohedu.js} +1 -1
- package/dist/src/css-variables.d.ts +52 -14
- package/dist/src/css-variables.d.ts.map +1 -1
- package/dist/src/embed/bodyless-conversation.d.ts +1 -0
- package/dist/src/embed/bodyless-conversation.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +1 -0
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +1 -0
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/sage.d.ts +1 -0
- package/dist/src/embed/sage.d.ts.map +1 -1
- package/dist/src/embed/search-bar.d.ts +1 -0
- package/dist/src/embed/search-bar.d.ts.map +1 -1
- package/dist/src/embed/search.d.ts +1 -0
- package/dist/src/embed/search.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +6 -4
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/react/util.spec.d.ts +2 -0
- package/dist/src/react/util.spec.d.ts.map +1 -0
- package/dist/src/types.d.ts +35 -4
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +107 -42
- package/dist/tsembed-react.js +106 -41
- package/dist/tsembed.es.js +107 -42
- package/dist/tsembed.js +106 -41
- package/dist/visual-embed-sdk-react-full.d.ts +9312 -9916
- package/dist/visual-embed-sdk-react.d.ts +9184 -9922
- package/dist/visual-embed-sdk.d.ts +9351 -9533
- package/lib/package.json +8 -8
- package/lib/src/css-variables.d.ts +52 -14
- package/lib/src/css-variables.d.ts.map +1 -1
- package/lib/src/embed/bodyless-conversation.d.ts +1 -0
- package/lib/src/embed/bodyless-conversation.d.ts.map +1 -1
- package/lib/src/embed/bodyless-conversation.js +7 -3
- package/lib/src/embed/bodyless-conversation.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +1 -0
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +7 -2
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +1 -0
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +6 -1
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +13 -0
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/sage.d.ts +1 -0
- package/lib/src/embed/sage.d.ts.map +1 -1
- package/lib/src/embed/sage.js +10 -6
- package/lib/src/embed/sage.js.map +1 -1
- package/lib/src/embed/search-bar.d.ts +1 -0
- package/lib/src/embed/search-bar.d.ts.map +1 -1
- package/lib/src/embed/search-bar.js +11 -7
- package/lib/src/embed/search-bar.js.map +1 -1
- package/lib/src/embed/search.d.ts +1 -0
- package/lib/src/embed/search.d.ts.map +1 -1
- package/lib/src/embed/search.js +7 -8
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +6 -4
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +21 -8
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/react/all-types-export.spec.js +1 -1
- package/lib/src/react/all-types-export.spec.js.map +1 -1
- package/lib/src/react/util.js.map +1 -1
- package/lib/src/react/util.spec.d.ts +2 -0
- package/lib/src/react/util.spec.d.ts.map +1 -0
- package/lib/src/react/util.spec.js +76 -0
- package/lib/src/react/util.spec.js.map +1 -0
- package/lib/src/types.d.ts +35 -4
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +34 -3
- package/lib/src/types.js.map +1 -1
- package/package.json +8 -8
- package/src/css-variables.ts +53 -16
- package/src/embed/bodyless-conversation.ts +8 -3
- package/src/embed/conversation.ts +17 -2
- package/src/embed/liveboard.spec.ts +14 -0
- package/src/embed/liveboard.ts +7 -1
- package/src/embed/sage.ts +14 -9
- package/src/embed/search-bar.tsx +14 -7
- package/src/embed/search.ts +18 -7
- package/src/embed/ts-embed.spec.ts +1 -1
- package/src/embed/ts-embed.ts +28 -12
- package/src/react/all-types-export.spec.ts +1 -1
- package/src/react/util.spec.tsx +88 -0
- package/src/react/util.ts +3 -3
- package/src/types.ts +98 -66
- package/lib/src/visual-embed-sdk.d.ts +0 -9779
package/src/embed/liveboard.ts
CHANGED
|
@@ -440,6 +440,12 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
440
440
|
* embedded Liveboard or visualization.
|
|
441
441
|
*/
|
|
442
442
|
protected getEmbedParams() {
|
|
443
|
+
const params = this.getEmbedParamsObject();
|
|
444
|
+
const queryParams = getQueryParamString(params, true);
|
|
445
|
+
return queryParams;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
protected getEmbedParamsObject() {
|
|
443
449
|
let params: any = {};
|
|
444
450
|
params = this.getBaseQueryParams(params);
|
|
445
451
|
const {
|
|
@@ -557,7 +563,7 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
557
563
|
params[Param.LiveboardXLSXCSVDownload] = !!liveboardXLSXCSVDownload;
|
|
558
564
|
const queryParams = getQueryParamString(params, true);
|
|
559
565
|
|
|
560
|
-
return
|
|
566
|
+
return params;
|
|
561
567
|
}
|
|
562
568
|
|
|
563
569
|
private getIframeSuffixSrc(liveboardId: string, vizId: string, activeTabId: string) {
|
package/src/embed/sage.ts
CHANGED
|
@@ -153,12 +153,7 @@ export class SageEmbed extends V1Embed {
|
|
|
153
153
|
super(domSelector, viewConfig);
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
|
|
157
|
-
* Constructs a map of parameters to be passed on to the
|
|
158
|
-
* embedded Eureka or Sage search page.
|
|
159
|
-
* @returns {string} query string
|
|
160
|
-
*/
|
|
161
|
-
protected getEmbedParams(): string {
|
|
156
|
+
protected getEmbedParamsObject() {
|
|
162
157
|
const {
|
|
163
158
|
disableWorksheetChange,
|
|
164
159
|
hideWorksheetSelector,
|
|
@@ -184,6 +179,16 @@ export class SageEmbed extends V1Embed {
|
|
|
184
179
|
params[Param.IsProductTour] = !!isProductTour;
|
|
185
180
|
params[Param.HideSageAnswerHeader] = !!hideSageAnswerHeader;
|
|
186
181
|
|
|
182
|
+
return params;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Constructs a map of parameters to be passed on to the
|
|
187
|
+
* embedded Eureka or Sage search page.
|
|
188
|
+
* @returns {string} query string
|
|
189
|
+
*/
|
|
190
|
+
protected getEmbedParams(): string {
|
|
191
|
+
const params = this.getEmbedParamsObject();
|
|
187
192
|
return getQueryParamString(params, true);
|
|
188
193
|
}
|
|
189
194
|
|
|
@@ -194,15 +199,15 @@ export class SageEmbed extends V1Embed {
|
|
|
194
199
|
*/
|
|
195
200
|
public getIFrameSrc(): string {
|
|
196
201
|
const path = 'eureka';
|
|
197
|
-
const postHashObj = {};
|
|
202
|
+
const postHashObj: Record<string, any> = {};
|
|
198
203
|
const tsPostHashParams = this.getThoughtSpotPostUrlParams();
|
|
199
204
|
const {
|
|
200
205
|
dataSource, searchOptions,
|
|
201
206
|
} = this.viewConfig;
|
|
202
207
|
|
|
203
|
-
if (dataSource) postHashObj[Param.WorksheetId] = dataSource;
|
|
208
|
+
if (dataSource) (postHashObj as any)[Param.WorksheetId] = dataSource;
|
|
204
209
|
if (searchOptions?.searchQuery && searchOptions.executeSearch) {
|
|
205
|
-
postHashObj[Param.executeSearch] = true;
|
|
210
|
+
(postHashObj as any)[Param.executeSearch] = true;
|
|
206
211
|
}
|
|
207
212
|
|
|
208
213
|
let sagePostHashParams = new URLSearchParams(postHashObj).toString();
|
package/src/embed/search-bar.tsx
CHANGED
|
@@ -118,12 +118,7 @@ export class SearchBarEmbed extends TsEmbed {
|
|
|
118
118
|
this.viewConfig = viewConfig;
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
* Construct the URL of the embedded ThoughtSpot search to be
|
|
123
|
-
* loaded in the iframe
|
|
124
|
-
* @param dataSources A list of data source GUIDs
|
|
125
|
-
*/
|
|
126
|
-
private getIFrameSrc() {
|
|
121
|
+
protected getEmbedParamsObject() {
|
|
127
122
|
const {
|
|
128
123
|
searchOptions,
|
|
129
124
|
dataSource,
|
|
@@ -131,7 +126,6 @@ export class SearchBarEmbed extends TsEmbed {
|
|
|
131
126
|
useLastSelectedSources = false,
|
|
132
127
|
excludeSearchTokenStringFromURL,
|
|
133
128
|
} = this.viewConfig;
|
|
134
|
-
const path = 'search-bar-embed';
|
|
135
129
|
const queryParams = this.getBaseQueryParams();
|
|
136
130
|
|
|
137
131
|
queryParams[Param.HideActions] = [...(queryParams[Param.HideActions] ?? [])];
|
|
@@ -159,6 +153,19 @@ export class SearchBarEmbed extends TsEmbed {
|
|
|
159
153
|
queryParams[Param.UseLastSelectedDataSource] = false;
|
|
160
154
|
}
|
|
161
155
|
queryParams[Param.searchEmbed] = true;
|
|
156
|
+
|
|
157
|
+
return queryParams;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Construct the URL of the embedded ThoughtSpot search to be
|
|
162
|
+
* loaded in the iframe
|
|
163
|
+
* @param dataSources A list of data source GUIDs
|
|
164
|
+
*/
|
|
165
|
+
private getIFrameSrc() {
|
|
166
|
+
const queryParams = this.getEmbedParamsObject();
|
|
167
|
+
const path = 'search-bar-embed';
|
|
168
|
+
|
|
162
169
|
let query = '';
|
|
163
170
|
const queryParamsString = getQueryParamString(queryParams, true);
|
|
164
171
|
if (queryParamsString) {
|
package/src/embed/search.ts
CHANGED
|
@@ -331,7 +331,7 @@ export const HiddenActionItemByDefaultForSearchEmbed = [
|
|
|
331
331
|
];
|
|
332
332
|
|
|
333
333
|
export interface SearchAppInitData extends DefaultAppInitData {
|
|
334
|
-
|
|
334
|
+
searchOptions?: SearchOptions;
|
|
335
335
|
}
|
|
336
336
|
|
|
337
337
|
/**
|
|
@@ -381,7 +381,7 @@ export class SearchEmbed extends TsEmbed {
|
|
|
381
381
|
return { ...defaultAppInitData, ...this.getSearchInitData() };
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
-
protected
|
|
384
|
+
protected getEmbedParamsObject() {
|
|
385
385
|
const {
|
|
386
386
|
hideResults,
|
|
387
387
|
enableSearchAssist,
|
|
@@ -398,7 +398,7 @@ export class SearchEmbed extends TsEmbed {
|
|
|
398
398
|
collapseSearchBarInitially = false,
|
|
399
399
|
enableCustomColumnGroups = false,
|
|
400
400
|
isOnBeforeGetVizDataInterceptEnabled = false,
|
|
401
|
-
|
|
401
|
+
|
|
402
402
|
dataPanelCustomGroupsAccordionInitialState = DataPanelCustomColumnGroupsAccordionState.EXPAND_ALL,
|
|
403
403
|
focusSearchBarOnRender = true,
|
|
404
404
|
excludeRuntimeParametersfromURL,
|
|
@@ -443,7 +443,7 @@ export class SearchEmbed extends TsEmbed {
|
|
|
443
443
|
}
|
|
444
444
|
|
|
445
445
|
if (isOnBeforeGetVizDataInterceptEnabled) {
|
|
446
|
-
|
|
446
|
+
|
|
447
447
|
queryParams[Param.IsOnBeforeGetVizDataInterceptEnabled] = isOnBeforeGetVizDataInterceptEnabled;
|
|
448
448
|
}
|
|
449
449
|
|
|
@@ -460,7 +460,7 @@ export class SearchEmbed extends TsEmbed {
|
|
|
460
460
|
}
|
|
461
461
|
|
|
462
462
|
queryParams[Param.searchEmbed] = true;
|
|
463
|
-
|
|
463
|
+
|
|
464
464
|
queryParams[Param.CollapseSearchBarInitially] = collapseSearchBarInitially || collapseSearchBar;
|
|
465
465
|
queryParams[Param.EnableCustomColumnGroups] = enableCustomColumnGroups;
|
|
466
466
|
if (dataPanelCustomGroupsAccordionInitialState
|
|
@@ -468,12 +468,23 @@ export class SearchEmbed extends TsEmbed {
|
|
|
468
468
|
|| dataPanelCustomGroupsAccordionInitialState
|
|
469
469
|
=== DataPanelCustomColumnGroupsAccordionState.EXPAND_FIRST
|
|
470
470
|
) {
|
|
471
|
-
|
|
471
|
+
|
|
472
472
|
queryParams[Param.DataPanelCustomGroupsAccordionInitialState] = dataPanelCustomGroupsAccordionInitialState;
|
|
473
473
|
} else {
|
|
474
|
-
|
|
474
|
+
|
|
475
475
|
queryParams[Param.DataPanelCustomGroupsAccordionInitialState] = DataPanelCustomColumnGroupsAccordionState.EXPAND_ALL;
|
|
476
476
|
}
|
|
477
|
+
return queryParams;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
protected getEmbedParams() {
|
|
481
|
+
const {
|
|
482
|
+
runtimeParameters,
|
|
483
|
+
runtimeFilters,
|
|
484
|
+
excludeRuntimeParametersfromURL,
|
|
485
|
+
excludeRuntimeFiltersfromURL,
|
|
486
|
+
} = this.viewConfig;
|
|
487
|
+
const queryParams = this.getEmbedParamsObject();
|
|
477
488
|
let query = '';
|
|
478
489
|
const queryParamsString = getQueryParamString(queryParams, true);
|
|
479
490
|
if (queryParamsString) {
|
package/src/embed/ts-embed.ts
CHANGED
|
@@ -199,11 +199,11 @@ export class TsEmbed {
|
|
|
199
199
|
uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
|
|
200
200
|
...viewConfig,
|
|
201
201
|
});
|
|
202
|
+
const embedConfig = getEmbedConfig();
|
|
203
|
+
this.embedConfig = embedConfig;
|
|
204
|
+
|
|
202
205
|
this.hostEventClient = new HostEventClient(this.iFrame);
|
|
203
|
-
|
|
204
206
|
this.isReadyForRenderPromise = getInitPromise().then(async () => {
|
|
205
|
-
const embedConfig = getEmbedConfig();
|
|
206
|
-
this.embedConfig = embedConfig;
|
|
207
207
|
if (!embedConfig.authTriggerContainer && !embedConfig.useEventForSAMLPopup) {
|
|
208
208
|
this.embedConfig.authTriggerContainer = domSelector;
|
|
209
209
|
}
|
|
@@ -494,10 +494,10 @@ export class TsEmbed {
|
|
|
494
494
|
this.on(EmbedEvent.APP_INIT, this.appInitCb, { start: false }, true);
|
|
495
495
|
this.on(EmbedEvent.AuthExpire, this.updateAuthToken, { start: false }, true);
|
|
496
496
|
this.on(EmbedEvent.IdleSessionTimeout, this.idleSessionTimeout, { start: false }, true);
|
|
497
|
-
|
|
498
|
-
const embedListenerReadyHandler = this.createEmbedContainerHandler(EmbedEvent.EmbedListenerReady);
|
|
497
|
+
|
|
498
|
+
const embedListenerReadyHandler = this.createEmbedContainerHandler(EmbedEvent.EmbedListenerReady);
|
|
499
499
|
this.on(EmbedEvent.EmbedListenerReady, embedListenerReadyHandler, { start: false }, true);
|
|
500
|
-
|
|
500
|
+
|
|
501
501
|
const authInitHandler = this.createEmbedContainerHandler(EmbedEvent.AuthInit);
|
|
502
502
|
this.on(EmbedEvent.AuthInit, authInitHandler, { start: false }, true);
|
|
503
503
|
};
|
|
@@ -520,6 +520,12 @@ export class TsEmbed {
|
|
|
520
520
|
return `${basePath}#`;
|
|
521
521
|
}
|
|
522
522
|
|
|
523
|
+
protected getUpdateEmbedParamsObject() {
|
|
524
|
+
let queryParams = this.getEmbedParamsObject();
|
|
525
|
+
queryParams = { ...this.viewConfig, ...queryParams };
|
|
526
|
+
return queryParams;
|
|
527
|
+
}
|
|
528
|
+
|
|
523
529
|
/**
|
|
524
530
|
* Common query params set for all the embed modes.
|
|
525
531
|
* @param queryParams
|
|
@@ -702,10 +708,15 @@ export class TsEmbed {
|
|
|
702
708
|
}
|
|
703
709
|
|
|
704
710
|
protected getEmbedParams() {
|
|
705
|
-
const queryParams = this.
|
|
711
|
+
const queryParams = this.getEmbedParamsObject();
|
|
706
712
|
return getQueryParamString(queryParams);
|
|
707
713
|
}
|
|
708
714
|
|
|
715
|
+
protected getEmbedParamsObject() {
|
|
716
|
+
const params = this.getBaseQueryParams();
|
|
717
|
+
return params;
|
|
718
|
+
}
|
|
719
|
+
|
|
709
720
|
protected getRootIframeSrc() {
|
|
710
721
|
const query = this.getEmbedParams();
|
|
711
722
|
return this.getEmbedBasePath(query);
|
|
@@ -1140,12 +1151,12 @@ export class TsEmbed {
|
|
|
1140
1151
|
}
|
|
1141
1152
|
}
|
|
1142
1153
|
|
|
1143
|
-
|
|
1154
|
+
/**
|
|
1144
1155
|
* @hidden
|
|
1145
1156
|
* Internal state to track if the embed container is loaded.
|
|
1146
1157
|
* This is used to trigger events after the embed container is loaded.
|
|
1147
1158
|
*/
|
|
1148
|
-
|
|
1159
|
+
public isEmbedContainerLoaded = false;
|
|
1149
1160
|
|
|
1150
1161
|
/**
|
|
1151
1162
|
* @hidden
|
|
@@ -1191,7 +1202,7 @@ export class TsEmbed {
|
|
|
1191
1202
|
} else {
|
|
1192
1203
|
logger.debug('pushing callback to embedContainerReadyCallbacks', callback);
|
|
1193
1204
|
this.embedContainerReadyCallbacks.push(callback);
|
|
1194
|
-
|
|
1205
|
+
}
|
|
1195
1206
|
}
|
|
1196
1207
|
|
|
1197
1208
|
protected createEmbedContainerHandler = (source: EmbedEvent.AuthInit | EmbedEvent.EmbedListenerReady) => () => {
|
|
@@ -1279,6 +1290,7 @@ export class TsEmbed {
|
|
|
1279
1290
|
* Creates the preRender shell
|
|
1280
1291
|
* @param showPreRenderByDefault - Show the preRender after render, hidden by default
|
|
1281
1292
|
*/
|
|
1293
|
+
|
|
1282
1294
|
public async preRender(showPreRenderByDefault = false, replaceExistingPreRender = false): Promise<TsEmbed> {
|
|
1283
1295
|
if (!this.viewConfig.preRenderId) {
|
|
1284
1296
|
logger.error(ERROR_MESSAGE.PRERENDER_ID_MISSING);
|
|
@@ -1413,8 +1425,14 @@ export class TsEmbed {
|
|
|
1413
1425
|
return this.preRender(true);
|
|
1414
1426
|
}
|
|
1415
1427
|
this.validatePreRenderViewConfig(this.viewConfig);
|
|
1428
|
+
logger.debug('triggering UpdateEmbedParams', this.viewConfig);
|
|
1429
|
+
this.executeAfterEmbedContainerLoaded(() => {
|
|
1430
|
+
this.trigger(HostEvent.UpdateEmbedParams, this.getUpdateEmbedParamsObject());
|
|
1431
|
+
});
|
|
1416
1432
|
}
|
|
1417
1433
|
|
|
1434
|
+
this.beforePrerenderVisible();
|
|
1435
|
+
|
|
1418
1436
|
if (this.el) {
|
|
1419
1437
|
this.syncPreRenderStyle();
|
|
1420
1438
|
if (!this.viewConfig.doNotTrackPreRenderSize) {
|
|
@@ -1432,8 +1450,6 @@ export class TsEmbed {
|
|
|
1432
1450
|
}
|
|
1433
1451
|
}
|
|
1434
1452
|
|
|
1435
|
-
this.beforePrerenderVisible();
|
|
1436
|
-
|
|
1437
1453
|
removeStyleProperties(this.preRenderWrapper, ['z-index', 'opacity', 'pointer-events']);
|
|
1438
1454
|
|
|
1439
1455
|
this.subscribeToEvents();
|
|
@@ -6,6 +6,6 @@ describe('Exports', () => {
|
|
|
6
6
|
});
|
|
7
7
|
|
|
8
8
|
it('should not have undefined exports', () => {
|
|
9
|
-
Object.
|
|
9
|
+
Object.entries(Exports).forEach(([, exportValue]) => {expect(Boolean(exportValue)).toBe(true);});
|
|
10
10
|
});
|
|
11
11
|
});
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { getViewPropsAndListeners } from './util';
|
|
2
|
+
import { EmbedEvent, MessageCallback } from '../types';
|
|
3
|
+
|
|
4
|
+
describe('React util functions', () => {
|
|
5
|
+
describe('getViewPropsAndListeners', () => {
|
|
6
|
+
test('should return empty viewConfig and listeners for empty props', () => {
|
|
7
|
+
const props = {};
|
|
8
|
+
const result = getViewPropsAndListeners(props);
|
|
9
|
+
|
|
10
|
+
expect(result.viewConfig).toEqual({});
|
|
11
|
+
expect(result.listeners).toEqual({});
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test('should separate view config properties from props', () => {
|
|
15
|
+
const props = {
|
|
16
|
+
frameParams: { width: 100, height: 200 },
|
|
17
|
+
showLiveboardTitle: true,
|
|
18
|
+
liveboardId: 'test-liveboard-id',
|
|
19
|
+
vizId: 'test-viz-id',
|
|
20
|
+
className: 'test-class',
|
|
21
|
+
style: { color: 'red' },
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const result = getViewPropsAndListeners(props);
|
|
25
|
+
|
|
26
|
+
expect(result.viewConfig).toEqual({
|
|
27
|
+
frameParams: { width: 100, height: 200 },
|
|
28
|
+
showLiveboardTitle: true,
|
|
29
|
+
liveboardId: 'test-liveboard-id',
|
|
30
|
+
vizId: 'test-viz-id',
|
|
31
|
+
className: 'test-class',
|
|
32
|
+
style: { color: 'red' },
|
|
33
|
+
});
|
|
34
|
+
expect(result.listeners).toEqual({});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('should separate event handlers from props', () => {
|
|
38
|
+
const onInit: MessageCallback = jest.fn();
|
|
39
|
+
const onLoad: MessageCallback = jest.fn();
|
|
40
|
+
const onData: MessageCallback = jest.fn();
|
|
41
|
+
|
|
42
|
+
const props = {
|
|
43
|
+
onInit,
|
|
44
|
+
onLoad,
|
|
45
|
+
onData,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const result = getViewPropsAndListeners(props);
|
|
49
|
+
|
|
50
|
+
expect(result.viewConfig).toEqual({});
|
|
51
|
+
expect(result.listeners).toEqual({
|
|
52
|
+
[EmbedEvent.Init]: onInit,
|
|
53
|
+
[EmbedEvent.Load]: onLoad,
|
|
54
|
+
[EmbedEvent.Data]: onData,
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('should handle both view config and event handlers', () => {
|
|
59
|
+
const onInit: MessageCallback = jest.fn();
|
|
60
|
+
const onAuthInit: MessageCallback = jest.fn();
|
|
61
|
+
const onQueryChanged: MessageCallback = jest.fn();
|
|
62
|
+
|
|
63
|
+
const props = {
|
|
64
|
+
liveboardId: 'test-liveboard-id',
|
|
65
|
+
showLiveboardTitle: false,
|
|
66
|
+
frameParams: { height: 500 },
|
|
67
|
+
onInit,
|
|
68
|
+
onAuthInit,
|
|
69
|
+
onQueryChanged,
|
|
70
|
+
className: 'embed-container',
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const result = getViewPropsAndListeners(props);
|
|
74
|
+
|
|
75
|
+
expect(result.viewConfig).toEqual({
|
|
76
|
+
liveboardId: 'test-liveboard-id',
|
|
77
|
+
showLiveboardTitle: false,
|
|
78
|
+
frameParams: { height: 500 },
|
|
79
|
+
className: 'embed-container',
|
|
80
|
+
});
|
|
81
|
+
expect(result.listeners).toEqual({
|
|
82
|
+
[EmbedEvent.Init]: onInit,
|
|
83
|
+
[EmbedEvent.AuthInit]: onAuthInit,
|
|
84
|
+
[EmbedEvent.QueryChanged]: onQueryChanged,
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
});
|
package/src/react/util.ts
CHANGED
|
@@ -24,10 +24,10 @@ export function getViewPropsAndListeners<
|
|
|
24
24
|
return Object.keys(props).reduce(
|
|
25
25
|
(accu, key) => {
|
|
26
26
|
if (key.startsWith('on')) {
|
|
27
|
-
const eventName = key.substr(2);
|
|
28
|
-
accu.listeners[EmbedEvent[eventName]] = props[key];
|
|
27
|
+
const eventName = key.substr(2) as any;
|
|
28
|
+
(accu.listeners as any)[EmbedEvent[eventName as keyof typeof EmbedEvent] as any] = props[key as keyof T];
|
|
29
29
|
} else {
|
|
30
|
-
accu.viewConfig[key] = props[key];
|
|
30
|
+
(accu.viewConfig as any)[key] = props[key as keyof T];
|
|
31
31
|
}
|
|
32
32
|
return accu;
|
|
33
33
|
},
|
package/src/types.ts
CHANGED
|
@@ -231,12 +231,12 @@ export type DOMSelector = string | HTMLElement;
|
|
|
231
231
|
* Use {@link CustomCssVariables} or css rules.
|
|
232
232
|
*/
|
|
233
233
|
export interface customCssInterface {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
234
|
+
/**
|
|
235
|
+
* The custom css variables, which can be set.
|
|
236
|
+
* The variables are available in the {@link CustomCssVariables}
|
|
237
|
+
* interface. For more information, see
|
|
238
|
+
* link:https://developers.thoughtspot.com/docs/css-variables-reference[CSS variable reference].
|
|
239
|
+
*/
|
|
240
240
|
variables?: CustomCssVariables;
|
|
241
241
|
/**
|
|
242
242
|
* Can be used to define a custom font face
|
|
@@ -648,7 +648,7 @@ export interface EmbedConfig {
|
|
|
648
648
|
* ```
|
|
649
649
|
* @version SDK 1.37.0 | ThoughtSpot: 10.8.0.cl
|
|
650
650
|
*/
|
|
651
|
-
customVariablesForThirdPartyTools?: Record<
|
|
651
|
+
customVariablesForThirdPartyTools?: Record<string, any>;
|
|
652
652
|
|
|
653
653
|
disablePreauthCache?: boolean;
|
|
654
654
|
|
|
@@ -695,7 +695,7 @@ export interface EmbedConfig {
|
|
|
695
695
|
}
|
|
696
696
|
|
|
697
697
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
698
|
-
export interface LayoutConfig {}
|
|
698
|
+
export interface LayoutConfig { }
|
|
699
699
|
|
|
700
700
|
/**
|
|
701
701
|
* Embedded iframe configuration
|
|
@@ -1481,21 +1481,21 @@ export interface LiveboardAppEmbedViewConfig {
|
|
|
1481
1481
|
* ```
|
|
1482
1482
|
*/
|
|
1483
1483
|
enableAskSage?: boolean;
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1484
|
+
/**
|
|
1485
|
+
* This flag is used to show or hide checkboxes for including or excluding
|
|
1486
|
+
* the cover and filters pages in the Liveboard PDF.
|
|
1487
|
+
*
|
|
1488
|
+
* Supported embed types: `AppEmbed`, `LiveboardEmbed`
|
|
1489
|
+
* @version SDK: 1.40.0 | ThoughtSpot:10.8.0.cl
|
|
1490
|
+
* @example
|
|
1491
|
+
* ```js
|
|
1492
|
+
* // Replace <EmbedComponent> with embed component name. For example, AppEmbed or LiveboardEmbed
|
|
1493
|
+
* const embed = new <EmbedComponent>('#tsEmbed', {
|
|
1494
|
+
* ... // other embed view config
|
|
1495
|
+
* coverAndFilterOptionInPDF: false,
|
|
1496
|
+
* })
|
|
1497
|
+
* ```
|
|
1498
|
+
*/
|
|
1499
1499
|
coverAndFilterOptionInPDF?: boolean;
|
|
1500
1500
|
/**
|
|
1501
1501
|
* This flag is used to enable or disable the XLSX/CSV download option for Liveboards.
|
|
@@ -1515,7 +1515,7 @@ export interface LiveboardAppEmbedViewConfig {
|
|
|
1515
1515
|
|
|
1516
1516
|
}
|
|
1517
1517
|
|
|
1518
|
-
export interface AllEmbedViewConfig extends BaseViewConfig, SearchLiveboardCommonViewConfig, HomePageConfig, LiveboardAppEmbedViewConfig {}
|
|
1518
|
+
export interface AllEmbedViewConfig extends BaseViewConfig, SearchLiveboardCommonViewConfig, HomePageConfig, LiveboardAppEmbedViewConfig { }
|
|
1519
1519
|
|
|
1520
1520
|
/**
|
|
1521
1521
|
* MessagePayload: Embed event payload: message type, data and status (start/end)
|
|
@@ -2774,25 +2774,25 @@ export enum EmbedEvent {
|
|
|
2774
2774
|
* ```
|
|
2775
2775
|
* @version SDK: 1.37.0 | ThoughtSpot: 10.8.0.cl
|
|
2776
2776
|
*/
|
|
2777
|
-
|
|
2778
|
-
|
|
2779
|
-
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2786
|
-
|
|
2787
|
-
|
|
2788
|
-
|
|
2789
|
-
|
|
2777
|
+
TableVizRendered = 'TableVizRendered',
|
|
2778
|
+
/**
|
|
2779
|
+
* Emitted when the liveboard is created from pin modal or Liveboard list page.
|
|
2780
|
+
* You can use this event as a hook to trigger
|
|
2781
|
+
* other events on liveboard creation.
|
|
2782
|
+
*
|
|
2783
|
+
* ```js
|
|
2784
|
+
* liveboardEmbed.on(EmbedEvent.CreateLiveboard, (payload) => {
|
|
2785
|
+
* console.log('payload', payload);
|
|
2786
|
+
* })
|
|
2787
|
+
*```
|
|
2788
|
+
* @version SDK : 1.37.0 | ThoughtSpot: 10.8.0.cl
|
|
2789
|
+
*/
|
|
2790
2790
|
CreateLiveboard = 'createLiveboard',
|
|
2791
2791
|
/**
|
|
2792
2792
|
* Emitted when a user creates a Model.
|
|
2793
2793
|
* @version SDK : 1.37.0 | ThoughtSpot: 10.8.0.cl
|
|
2794
2794
|
*/
|
|
2795
|
-
|
|
2795
|
+
CreateModel = 'createModel',
|
|
2796
2796
|
/**
|
|
2797
2797
|
* @hidden
|
|
2798
2798
|
* Emitted when a user exits present mode.
|
|
@@ -3670,24 +3670,45 @@ export enum HostEvent {
|
|
|
3670
3670
|
* @version SDK: 1.19.0 | ThoughtSpot: 9.0.0.cl, 9.0.1.sw
|
|
3671
3671
|
*/
|
|
3672
3672
|
Share = 'share',
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3676
|
-
|
|
3677
|
-
|
|
3678
|
-
|
|
3679
|
-
|
|
3680
|
-
|
|
3681
|
-
|
|
3682
|
-
|
|
3683
|
-
|
|
3684
|
-
|
|
3685
|
-
|
|
3686
|
-
|
|
3687
|
-
|
|
3688
|
-
|
|
3689
|
-
|
|
3690
|
-
|
|
3673
|
+
/**
|
|
3674
|
+
* Trigger the **Save** action on a Liveboard, Answer, or Spotter.
|
|
3675
|
+
* Saves the changes.
|
|
3676
|
+
*
|
|
3677
|
+
* @param - `vizId` refers to the Spotter Visualization Id used in Spotter embed.
|
|
3678
|
+
* It is required and can be retrieved from the data embed event.
|
|
3679
|
+
*
|
|
3680
|
+
* @example
|
|
3681
|
+
* ```js
|
|
3682
|
+
* // Save changes in a Liveboard
|
|
3683
|
+
* liveboardEmbed.trigger(HostEvent.Save)
|
|
3684
|
+
* ```
|
|
3685
|
+
*
|
|
3686
|
+
* ```js
|
|
3687
|
+
* // Save the current Answer in Search embed
|
|
3688
|
+
* searchEmbed.trigger(HostEvent.Save)
|
|
3689
|
+
* ```
|
|
3690
|
+
*
|
|
3691
|
+
* ```js
|
|
3692
|
+
* // Save an Answer in Spotter (requires vizId)
|
|
3693
|
+
* spotterEmbed.trigger(HostEvent.Save, {
|
|
3694
|
+
* vizId: "730496d6-6903-4601-937e-2c691821af3c"
|
|
3695
|
+
* })
|
|
3696
|
+
* ```
|
|
3697
|
+
*
|
|
3698
|
+
* ```js
|
|
3699
|
+
* // How to get the vizId in Spotter?
|
|
3700
|
+
*
|
|
3701
|
+
* // You can use the Data event dispatched on each answer creation to get the vizId.
|
|
3702
|
+
* let latestSpotterVizId = '';
|
|
3703
|
+
* spotterEmbed.on(EmbedEvent.Data, (payload) => {
|
|
3704
|
+
* latestSpotterVizId = payload.data.id;
|
|
3705
|
+
* });
|
|
3706
|
+
*
|
|
3707
|
+
* spotterEmbed.trigger(HostEvent.Save, { vizId: latestSpotterVizId });
|
|
3708
|
+
* ```
|
|
3709
|
+
*
|
|
3710
|
+
* @version SDK: 1.19.0 | ThoughtSpot: 9.0.0.cl, 9.0.1.sw
|
|
3711
|
+
*/
|
|
3691
3712
|
Save = 'save',
|
|
3692
3713
|
/**
|
|
3693
3714
|
* Trigger the **Sync to Sheets** action on an embedded visualization or Answer
|
|
@@ -4015,7 +4036,7 @@ export enum HostEvent {
|
|
|
4015
4036
|
*```
|
|
4016
4037
|
* @version SDK: 1.36.0 | ThoughtSpot: 10.6.0.cl
|
|
4017
4038
|
*/
|
|
4018
|
-
|
|
4039
|
+
InfoSuccess = 'InfoSuccess',
|
|
4019
4040
|
/**
|
|
4020
4041
|
* Trigger the save action for an Answer.
|
|
4021
4042
|
* To programmatically save an answer without opening the
|
|
@@ -4169,6 +4190,17 @@ export enum HostEvent {
|
|
|
4169
4190
|
* @version SDK: 1.41.0 | ThoughtSpot: 10.12.0.cl
|
|
4170
4191
|
*/
|
|
4171
4192
|
AskSpotter = 'AskSpotter',
|
|
4193
|
+
|
|
4194
|
+
/**
|
|
4195
|
+
* @hidden
|
|
4196
|
+
* Triggers the update of the embed params.
|
|
4197
|
+
*
|
|
4198
|
+
* @example
|
|
4199
|
+
* ```js
|
|
4200
|
+
* liveboardEmbed.trigger(HostEvent.UpdateEmbedParams, viewConfig);
|
|
4201
|
+
* ```
|
|
4202
|
+
*/
|
|
4203
|
+
UpdateEmbedParams = 'updateEmbedParams',
|
|
4172
4204
|
}
|
|
4173
4205
|
|
|
4174
4206
|
/**
|
|
@@ -5671,15 +5703,15 @@ export interface ColumnValue {
|
|
|
5671
5703
|
[key: string]: any;
|
|
5672
5704
|
};
|
|
5673
5705
|
value:
|
|
5674
|
-
|
|
5675
|
-
|
|
5676
|
-
|
|
5677
|
-
|
|
5678
|
-
|
|
5679
|
-
|
|
5680
|
-
|
|
5681
|
-
|
|
5682
|
-
|
|
5706
|
+
| string
|
|
5707
|
+
| number
|
|
5708
|
+
| boolean
|
|
5709
|
+
| {
|
|
5710
|
+
v: {
|
|
5711
|
+
s: number;
|
|
5712
|
+
e: number;
|
|
5713
|
+
};
|
|
5714
|
+
};
|
|
5683
5715
|
}
|
|
5684
5716
|
|
|
5685
5717
|
export interface VizPoint {
|