@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.
Files changed (134) hide show
  1. package/cjs/package.json +8 -8
  2. package/cjs/src/css-variables.d.ts +52 -14
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/bodyless-conversation.d.ts +1 -0
  5. package/cjs/src/embed/bodyless-conversation.d.ts.map +1 -1
  6. package/cjs/src/embed/bodyless-conversation.js +7 -3
  7. package/cjs/src/embed/bodyless-conversation.js.map +1 -1
  8. package/cjs/src/embed/conversation.d.ts +1 -0
  9. package/cjs/src/embed/conversation.d.ts.map +1 -1
  10. package/cjs/src/embed/conversation.js +7 -2
  11. package/cjs/src/embed/conversation.js.map +1 -1
  12. package/cjs/src/embed/liveboard.d.ts +1 -0
  13. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  14. package/cjs/src/embed/liveboard.js +6 -1
  15. package/cjs/src/embed/liveboard.js.map +1 -1
  16. package/cjs/src/embed/liveboard.spec.js +13 -0
  17. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  18. package/cjs/src/embed/sage.d.ts +1 -0
  19. package/cjs/src/embed/sage.d.ts.map +1 -1
  20. package/cjs/src/embed/sage.js +10 -6
  21. package/cjs/src/embed/sage.js.map +1 -1
  22. package/cjs/src/embed/search-bar.d.ts +1 -0
  23. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  24. package/cjs/src/embed/search-bar.js +11 -7
  25. package/cjs/src/embed/search-bar.js.map +1 -1
  26. package/cjs/src/embed/search.d.ts +1 -0
  27. package/cjs/src/embed/search.d.ts.map +1 -1
  28. package/cjs/src/embed/search.js +7 -8
  29. package/cjs/src/embed/search.js.map +1 -1
  30. package/cjs/src/embed/ts-embed.d.ts +6 -4
  31. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  32. package/cjs/src/embed/ts-embed.js +21 -8
  33. package/cjs/src/embed/ts-embed.js.map +1 -1
  34. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  35. package/cjs/src/react/all-types-export.spec.js +1 -1
  36. package/cjs/src/react/all-types-export.spec.js.map +1 -1
  37. package/cjs/src/react/util.js.map +1 -1
  38. package/cjs/src/react/util.spec.d.ts +2 -0
  39. package/cjs/src/react/util.spec.d.ts.map +1 -0
  40. package/cjs/src/react/util.spec.js +78 -0
  41. package/cjs/src/react/util.spec.js.map +1 -0
  42. package/cjs/src/types.d.ts +35 -4
  43. package/cjs/src/types.d.ts.map +1 -1
  44. package/cjs/src/types.js +34 -3
  45. package/cjs/src/types.js.map +1 -1
  46. package/dist/{index-DQueHwfQ.js → index-BpSohedu.js} +1 -1
  47. package/dist/src/css-variables.d.ts +52 -14
  48. package/dist/src/css-variables.d.ts.map +1 -1
  49. package/dist/src/embed/bodyless-conversation.d.ts +1 -0
  50. package/dist/src/embed/bodyless-conversation.d.ts.map +1 -1
  51. package/dist/src/embed/conversation.d.ts +1 -0
  52. package/dist/src/embed/conversation.d.ts.map +1 -1
  53. package/dist/src/embed/liveboard.d.ts +1 -0
  54. package/dist/src/embed/liveboard.d.ts.map +1 -1
  55. package/dist/src/embed/sage.d.ts +1 -0
  56. package/dist/src/embed/sage.d.ts.map +1 -1
  57. package/dist/src/embed/search-bar.d.ts +1 -0
  58. package/dist/src/embed/search-bar.d.ts.map +1 -1
  59. package/dist/src/embed/search.d.ts +1 -0
  60. package/dist/src/embed/search.d.ts.map +1 -1
  61. package/dist/src/embed/ts-embed.d.ts +6 -4
  62. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  63. package/dist/src/react/util.spec.d.ts +2 -0
  64. package/dist/src/react/util.spec.d.ts.map +1 -0
  65. package/dist/src/types.d.ts +35 -4
  66. package/dist/src/types.d.ts.map +1 -1
  67. package/dist/tsembed-react.es.js +107 -42
  68. package/dist/tsembed-react.js +106 -41
  69. package/dist/tsembed.es.js +107 -42
  70. package/dist/tsembed.js +106 -41
  71. package/dist/visual-embed-sdk-react-full.d.ts +9312 -9916
  72. package/dist/visual-embed-sdk-react.d.ts +9184 -9922
  73. package/dist/visual-embed-sdk.d.ts +9351 -9533
  74. package/lib/package.json +8 -8
  75. package/lib/src/css-variables.d.ts +52 -14
  76. package/lib/src/css-variables.d.ts.map +1 -1
  77. package/lib/src/embed/bodyless-conversation.d.ts +1 -0
  78. package/lib/src/embed/bodyless-conversation.d.ts.map +1 -1
  79. package/lib/src/embed/bodyless-conversation.js +7 -3
  80. package/lib/src/embed/bodyless-conversation.js.map +1 -1
  81. package/lib/src/embed/conversation.d.ts +1 -0
  82. package/lib/src/embed/conversation.d.ts.map +1 -1
  83. package/lib/src/embed/conversation.js +7 -2
  84. package/lib/src/embed/conversation.js.map +1 -1
  85. package/lib/src/embed/liveboard.d.ts +1 -0
  86. package/lib/src/embed/liveboard.d.ts.map +1 -1
  87. package/lib/src/embed/liveboard.js +6 -1
  88. package/lib/src/embed/liveboard.js.map +1 -1
  89. package/lib/src/embed/liveboard.spec.js +13 -0
  90. package/lib/src/embed/liveboard.spec.js.map +1 -1
  91. package/lib/src/embed/sage.d.ts +1 -0
  92. package/lib/src/embed/sage.d.ts.map +1 -1
  93. package/lib/src/embed/sage.js +10 -6
  94. package/lib/src/embed/sage.js.map +1 -1
  95. package/lib/src/embed/search-bar.d.ts +1 -0
  96. package/lib/src/embed/search-bar.d.ts.map +1 -1
  97. package/lib/src/embed/search-bar.js +11 -7
  98. package/lib/src/embed/search-bar.js.map +1 -1
  99. package/lib/src/embed/search.d.ts +1 -0
  100. package/lib/src/embed/search.d.ts.map +1 -1
  101. package/lib/src/embed/search.js +7 -8
  102. package/lib/src/embed/search.js.map +1 -1
  103. package/lib/src/embed/ts-embed.d.ts +6 -4
  104. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  105. package/lib/src/embed/ts-embed.js +21 -8
  106. package/lib/src/embed/ts-embed.js.map +1 -1
  107. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  108. package/lib/src/react/all-types-export.spec.js +1 -1
  109. package/lib/src/react/all-types-export.spec.js.map +1 -1
  110. package/lib/src/react/util.js.map +1 -1
  111. package/lib/src/react/util.spec.d.ts +2 -0
  112. package/lib/src/react/util.spec.d.ts.map +1 -0
  113. package/lib/src/react/util.spec.js +76 -0
  114. package/lib/src/react/util.spec.js.map +1 -0
  115. package/lib/src/types.d.ts +35 -4
  116. package/lib/src/types.d.ts.map +1 -1
  117. package/lib/src/types.js +34 -3
  118. package/lib/src/types.js.map +1 -1
  119. package/package.json +8 -8
  120. package/src/css-variables.ts +53 -16
  121. package/src/embed/bodyless-conversation.ts +8 -3
  122. package/src/embed/conversation.ts +17 -2
  123. package/src/embed/liveboard.spec.ts +14 -0
  124. package/src/embed/liveboard.ts +7 -1
  125. package/src/embed/sage.ts +14 -9
  126. package/src/embed/search-bar.tsx +14 -7
  127. package/src/embed/search.ts +18 -7
  128. package/src/embed/ts-embed.spec.ts +1 -1
  129. package/src/embed/ts-embed.ts +28 -12
  130. package/src/react/all-types-export.spec.ts +1 -1
  131. package/src/react/util.spec.tsx +88 -0
  132. package/src/react/util.ts +3 -3
  133. package/src/types.ts +98 -66
  134. package/lib/src/visual-embed-sdk.d.ts +0 -9779
@@ -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 queryParams;
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();
@@ -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) {
@@ -331,7 +331,7 @@ export const HiddenActionItemByDefaultForSearchEmbed = [
331
331
  ];
332
332
 
333
333
  export interface SearchAppInitData extends DefaultAppInitData {
334
- searchOptions?: SearchOptions;
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 getEmbedParams(): string {
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
- /* eslint-disable-next-line max-len */
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
- /* eslint-disable-next-line max-len */
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
- /* eslint-disable-next-line max-len */
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
- /* eslint-disable-next-line max-len */
471
+
472
472
  queryParams[Param.DataPanelCustomGroupsAccordionInitialState] = dataPanelCustomGroupsAccordionInitialState;
473
473
  } else {
474
- /* eslint-disable-next-line max-len */
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) {
@@ -2488,7 +2488,7 @@ describe('Unit test case for ts embed', () => {
2488
2488
  });
2489
2489
 
2490
2490
  afterAll((): void => {
2491
- window.location = location;
2491
+ window.location = location as any;
2492
2492
  });
2493
2493
 
2494
2494
  it('get url params for TS', () => {
@@ -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.getBaseQueryParams();
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
- public isEmbedContainerLoaded = false;
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.keys(Exports).forEach((exportKey) => expect(Boolean(Exports[exportKey])).toBe(true));
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
- * 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
- */
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< string, any >;
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
- * 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
- */
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
- 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
- */
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
- CreateModel = 'createModel',
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
- * Trigger the **Save** action on a Liveboard or Answer.
3675
- * Saves the changes.
3676
- * @param - `vizId` refers to the Answer ID in Spotter embed and is required in Spotter embed.
3677
- * @example
3678
- * ```js
3679
- * liveboardEmbed.trigger(HostEvent.Save)
3680
- * ```
3681
- * ```js
3682
- * searchEmbed.trigger(HostEvent.Save)
3683
- * ```
3684
- * ```js
3685
- * spotterEmbed.trigger(HostEvent.Save, {
3686
- * vizId:"730496d6-6903-4601-937e-2c691821af3c"
3687
- * })
3688
- * ```
3689
- * @version SDK: 1.19.0 | ThoughtSpot: 9.0.0.cl, 9.0.1.sw
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
- InfoSuccess = 'InfoSuccess',
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
- | string
5675
- | number
5676
- | boolean
5677
- | {
5678
- v: {
5679
- s: number;
5680
- e: number;
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 {