@thoughtspot/visual-embed-sdk 1.42.3 → 1.43.1

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 (178) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/api-intercept.d.ts +51 -0
  3. package/cjs/src/api-intercept.d.ts.map +1 -0
  4. package/cjs/src/api-intercept.js +180 -0
  5. package/cjs/src/api-intercept.js.map +1 -0
  6. package/cjs/src/api-intercept.spec.d.ts +2 -0
  7. package/cjs/src/api-intercept.spec.d.ts.map +1 -0
  8. package/cjs/src/api-intercept.spec.js +672 -0
  9. package/cjs/src/api-intercept.spec.js.map +1 -0
  10. package/cjs/src/css-variables.d.ts +4 -0
  11. package/cjs/src/css-variables.d.ts.map +1 -1
  12. package/cjs/src/embed/app.d.ts +0 -5
  13. package/cjs/src/embed/app.d.ts.map +1 -1
  14. package/cjs/src/embed/app.js +4 -5
  15. package/cjs/src/embed/app.js.map +1 -1
  16. package/cjs/src/embed/app.spec.js +10 -0
  17. package/cjs/src/embed/app.spec.js.map +1 -1
  18. package/cjs/src/embed/conversation.d.ts +2 -2
  19. package/cjs/src/embed/conversation.js +1 -1
  20. package/cjs/src/embed/conversation.js.map +1 -1
  21. package/cjs/src/embed/conversation.spec.js +17 -0
  22. package/cjs/src/embed/conversation.spec.js.map +1 -1
  23. package/cjs/src/embed/hostEventClient/contracts.d.ts +11 -1
  24. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  25. package/cjs/src/embed/hostEventClient/contracts.js +1 -0
  26. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  27. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  28. package/cjs/src/embed/liveboard.js +4 -2
  29. package/cjs/src/embed/liveboard.js.map +1 -1
  30. package/cjs/src/embed/liveboard.spec.js +11 -0
  31. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  32. package/cjs/src/embed/search.d.ts +0 -7
  33. package/cjs/src/embed/search.d.ts.map +1 -1
  34. package/cjs/src/embed/search.js +1 -4
  35. package/cjs/src/embed/search.js.map +1 -1
  36. package/cjs/src/embed/ts-embed.d.ts +10 -0
  37. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  38. package/cjs/src/embed/ts-embed.js +56 -15
  39. package/cjs/src/embed/ts-embed.js.map +1 -1
  40. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  41. package/cjs/src/embed/ts-embed.spec.js +412 -238
  42. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  43. package/cjs/src/index.d.ts +2 -2
  44. package/cjs/src/index.d.ts.map +1 -1
  45. package/cjs/src/index.js +2 -1
  46. package/cjs/src/index.js.map +1 -1
  47. package/cjs/src/react/all-types-export.d.ts +1 -1
  48. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  49. package/cjs/src/react/all-types-export.js +2 -1
  50. package/cjs/src/react/all-types-export.js.map +1 -1
  51. package/cjs/src/types.d.ts +328 -103
  52. package/cjs/src/types.d.ts.map +1 -1
  53. package/cjs/src/types.js +265 -85
  54. package/cjs/src/types.js.map +1 -1
  55. package/cjs/src/utils/logger.d.ts.map +1 -1
  56. package/cjs/src/utils/logger.js +1 -2
  57. package/cjs/src/utils/logger.js.map +1 -1
  58. package/cjs/src/utils/processData.d.ts +1 -1
  59. package/cjs/src/utils/processData.d.ts.map +1 -1
  60. package/cjs/src/utils/processData.js +8 -8
  61. package/cjs/src/utils/processData.js.map +1 -1
  62. package/cjs/src/utils/processData.spec.js.map +1 -1
  63. package/dist/{index-SVcLgSqi.js → index-CpkMygsc.js} +1 -1
  64. package/dist/src/api-intercept.d.ts +51 -0
  65. package/dist/src/api-intercept.d.ts.map +1 -0
  66. package/dist/src/api-intercept.spec.d.ts +2 -0
  67. package/dist/src/api-intercept.spec.d.ts.map +1 -0
  68. package/dist/src/css-variables.d.ts +4 -0
  69. package/dist/src/css-variables.d.ts.map +1 -1
  70. package/dist/src/embed/app.d.ts +0 -5
  71. package/dist/src/embed/app.d.ts.map +1 -1
  72. package/dist/src/embed/conversation.d.ts +2 -2
  73. package/dist/src/embed/hostEventClient/contracts.d.ts +11 -1
  74. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  75. package/dist/src/embed/liveboard.d.ts.map +1 -1
  76. package/dist/src/embed/search.d.ts +0 -7
  77. package/dist/src/embed/search.d.ts.map +1 -1
  78. package/dist/src/embed/ts-embed.d.ts +10 -0
  79. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  80. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  81. package/dist/src/index.d.ts +2 -2
  82. package/dist/src/index.d.ts.map +1 -1
  83. package/dist/src/react/all-types-export.d.ts +1 -1
  84. package/dist/src/react/all-types-export.d.ts.map +1 -1
  85. package/dist/src/types.d.ts +328 -103
  86. package/dist/src/types.d.ts.map +1 -1
  87. package/dist/src/utils/logger.d.ts.map +1 -1
  88. package/dist/src/utils/processData.d.ts +1 -1
  89. package/dist/src/utils/processData.d.ts.map +1 -1
  90. package/dist/tsembed-react.es.js +519 -133
  91. package/dist/tsembed-react.js +518 -132
  92. package/dist/tsembed.es.js +2642 -2256
  93. package/dist/tsembed.js +2640 -2254
  94. package/dist/visual-embed-sdk-react-full.d.ts +355 -118
  95. package/dist/visual-embed-sdk-react.d.ts +352 -118
  96. package/dist/visual-embed-sdk.d.ts +355 -118
  97. package/lib/package.json +1 -1
  98. package/lib/src/api-intercept.d.ts +51 -0
  99. package/lib/src/api-intercept.d.ts.map +1 -0
  100. package/lib/src/api-intercept.js +173 -0
  101. package/lib/src/api-intercept.js.map +1 -0
  102. package/lib/src/api-intercept.spec.d.ts +2 -0
  103. package/lib/src/api-intercept.spec.d.ts.map +1 -0
  104. package/lib/src/api-intercept.spec.js +669 -0
  105. package/lib/src/api-intercept.spec.js.map +1 -0
  106. package/lib/src/css-variables.d.ts +4 -0
  107. package/lib/src/css-variables.d.ts.map +1 -1
  108. package/lib/src/embed/app.d.ts +0 -5
  109. package/lib/src/embed/app.d.ts.map +1 -1
  110. package/lib/src/embed/app.js +4 -5
  111. package/lib/src/embed/app.js.map +1 -1
  112. package/lib/src/embed/app.spec.js +10 -0
  113. package/lib/src/embed/app.spec.js.map +1 -1
  114. package/lib/src/embed/conversation.d.ts +2 -2
  115. package/lib/src/embed/conversation.js +1 -1
  116. package/lib/src/embed/conversation.js.map +1 -1
  117. package/lib/src/embed/conversation.spec.js +17 -0
  118. package/lib/src/embed/conversation.spec.js.map +1 -1
  119. package/lib/src/embed/hostEventClient/contracts.d.ts +11 -1
  120. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  121. package/lib/src/embed/hostEventClient/contracts.js +1 -0
  122. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  123. package/lib/src/embed/liveboard.d.ts.map +1 -1
  124. package/lib/src/embed/liveboard.js +4 -2
  125. package/lib/src/embed/liveboard.js.map +1 -1
  126. package/lib/src/embed/liveboard.spec.js +11 -0
  127. package/lib/src/embed/liveboard.spec.js.map +1 -1
  128. package/lib/src/embed/search.d.ts +0 -7
  129. package/lib/src/embed/search.d.ts.map +1 -1
  130. package/lib/src/embed/search.js +1 -4
  131. package/lib/src/embed/search.js.map +1 -1
  132. package/lib/src/embed/ts-embed.d.ts +10 -0
  133. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  134. package/lib/src/embed/ts-embed.js +56 -15
  135. package/lib/src/embed/ts-embed.js.map +1 -1
  136. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  137. package/lib/src/embed/ts-embed.spec.js +412 -238
  138. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  139. package/lib/src/index.d.ts +2 -2
  140. package/lib/src/index.d.ts.map +1 -1
  141. package/lib/src/index.js +2 -2
  142. package/lib/src/index.js.map +1 -1
  143. package/lib/src/react/all-types-export.d.ts +1 -1
  144. package/lib/src/react/all-types-export.d.ts.map +1 -1
  145. package/lib/src/react/all-types-export.js +1 -1
  146. package/lib/src/react/all-types-export.js.map +1 -1
  147. package/lib/src/types.d.ts +328 -103
  148. package/lib/src/types.d.ts.map +1 -1
  149. package/lib/src/types.js +264 -84
  150. package/lib/src/types.js.map +1 -1
  151. package/lib/src/utils/logger.d.ts.map +1 -1
  152. package/lib/src/utils/logger.js +1 -2
  153. package/lib/src/utils/logger.js.map +1 -1
  154. package/lib/src/utils/processData.d.ts +1 -1
  155. package/lib/src/utils/processData.d.ts.map +1 -1
  156. package/lib/src/utils/processData.js +8 -8
  157. package/lib/src/utils/processData.js.map +1 -1
  158. package/lib/src/utils/processData.spec.js.map +1 -1
  159. package/package.json +1 -1
  160. package/src/api-intercept.spec.ts +856 -0
  161. package/src/api-intercept.ts +204 -0
  162. package/src/css-variables.ts +5 -0
  163. package/src/embed/app.spec.ts +11 -0
  164. package/src/embed/app.ts +5 -16
  165. package/src/embed/conversation.spec.ts +22 -0
  166. package/src/embed/conversation.ts +3 -3
  167. package/src/embed/hostEventClient/contracts.ts +10 -0
  168. package/src/embed/liveboard.spec.ts +12 -0
  169. package/src/embed/liveboard.ts +6 -2
  170. package/src/embed/search.ts +1 -14
  171. package/src/embed/ts-embed.spec.ts +498 -250
  172. package/src/embed/ts-embed.ts +80 -32
  173. package/src/index.ts +2 -0
  174. package/src/react/all-types-export.ts +1 -0
  175. package/src/types.ts +410 -179
  176. package/src/utils/logger.ts +1 -2
  177. package/src/utils/processData.spec.ts +0 -1
  178. package/src/utils/processData.ts +10 -11
@@ -71,6 +71,7 @@ import { getEmbedConfig } from './embedConfig';
71
71
  import { ERROR_MESSAGE } from '../errors';
72
72
  import { getPreauthInfo } from '../utils/sessionInfoService';
73
73
  import { HostEventClient } from './hostEventClient/host-event-client';
74
+ import { getInterceptInitData, handleInterceptEvent, processApiInterceptResponse, processLegacyInterceptResponse } from '../api-intercept';
74
75
 
75
76
  const { version } = pkgInfo;
76
77
 
@@ -201,7 +202,7 @@ export class TsEmbed {
201
202
  });
202
203
  const embedConfig = getEmbedConfig();
203
204
  this.embedConfig = embedConfig;
204
-
205
+
205
206
  this.hostEventClient = new HostEventClient(this.iFrame);
206
207
  this.isReadyForRenderPromise = getInitPromise().then(async () => {
207
208
  if (!embedConfig.authTriggerContainer && !embedConfig.useEventForSAMLPopup) {
@@ -336,33 +337,53 @@ export class TsEmbed {
336
337
  this.subscribedListeners.offline = offlineEventListener;
337
338
  }
338
339
 
340
+ private handleApiInterceptEvent({ eventData, eventPort }: { eventData: any, eventPort: MessagePort | void }) {
341
+ const executeEvent = (_eventType: EmbedEvent, data: any) => {
342
+ this.executeCallbacks(_eventType, data, eventPort);
343
+ }
344
+ const getUnsavedAnswerTml = async (props: { sessionId?: string, vizId?: string }) => {
345
+ const response = await this.triggerUIPassThrough(UIPassthroughEvent.GetUnsavedAnswerTML, props);
346
+ return response.filter((item) => item.value)?.[0]?.value;
347
+ }
348
+ handleInterceptEvent({ eventData, executeEvent, viewConfig: this.viewConfig, getUnsavedAnswerTml });
349
+ }
350
+
351
+ private messageEventListener = (event: MessageEvent<any>) => {
352
+ const eventType = this.getEventType(event);
353
+ const eventPort = this.getEventPort(event);
354
+ const eventData = this.formatEventData(event, eventType);
355
+ if (event.source === this.iFrame.contentWindow) {
356
+ const processedEventData = processEventData(
357
+ eventType,
358
+ eventData,
359
+ this.thoughtSpotHost,
360
+ this.isPreRendered ? this.preRenderWrapper : this.el,
361
+ );
362
+
363
+ if (eventType === EmbedEvent.ApiIntercept) {
364
+ this.handleApiInterceptEvent({ eventData, eventPort });
365
+ return;
366
+ }
367
+
368
+ this.executeCallbacks(
369
+ eventType,
370
+ processedEventData,
371
+ eventPort,
372
+ );
373
+ }
374
+ };
339
375
  /**
340
376
  * Subscribe to message events that depend on successful iframe setup
341
377
  */
342
378
  private subscribeToMessageEvents() {
343
379
  this.unsubscribeToMessageEvents();
344
380
 
345
- const messageEventListener = (event: MessageEvent<any>) => {
346
- const eventType = this.getEventType(event);
347
- const eventPort = this.getEventPort(event);
348
- const eventData = this.formatEventData(event, eventType);
349
- if (event.source === this.iFrame.contentWindow) {
350
- this.executeCallbacks(
351
- eventType,
352
- processEventData(
353
- eventType,
354
- eventData,
355
- this.thoughtSpotHost,
356
- this.isPreRendered ? this.preRenderWrapper : this.el,
357
- ),
358
- eventPort,
359
- );
360
- }
361
- };
362
- window.addEventListener('message', messageEventListener);
381
+ window.addEventListener('message', this.messageEventListener);
363
382
 
364
- this.subscribedListeners.message = messageEventListener;
383
+ this.subscribedListeners.message = this.messageEventListener;
365
384
  }
385
+
386
+
366
387
  /**
367
388
  * Adds event listeners for both network and message events.
368
389
  * This maintains backward compatibility with the existing method.
@@ -376,6 +397,7 @@ export class TsEmbed {
376
397
  this.subscribeToMessageEvents();
377
398
  }
378
399
 
400
+
379
401
  private unsubscribeToNetworkEvents() {
380
402
  if (this.subscribedListeners.online) {
381
403
  window.removeEventListener('online', this.subscribedListeners.online);
@@ -426,7 +448,7 @@ export class TsEmbed {
426
448
  message: customActionsResult.errors,
427
449
  });
428
450
  }
429
- return {
451
+ const baseInitData = {
430
452
  customisations: getCustomisations(this.embedConfig, this.viewConfig),
431
453
  authToken,
432
454
  runtimeFilterParams: this.viewConfig.excludeRuntimeFiltersfromURL
@@ -445,7 +467,10 @@ export class TsEmbed {
445
467
  this.embedConfig.customVariablesForThirdPartyTools || {},
446
468
  hiddenListColumns: this.viewConfig.hiddenListColumns || [],
447
469
  customActions: customActionsResult.actions,
470
+ ...getInterceptInitData(this.viewConfig),
448
471
  };
472
+
473
+ return baseInitData;
449
474
  }
450
475
 
451
476
  protected async getAppInitData() {
@@ -557,7 +582,7 @@ export class TsEmbed {
557
582
 
558
583
  protected getUpdateEmbedParamsObject() {
559
584
  let queryParams = this.getEmbedParamsObject();
560
- queryParams = { ...this.viewConfig, ...queryParams };
585
+ queryParams = { ...this.viewConfig, ...queryParams, ...this.getAppInitData() };
561
586
  return queryParams;
562
587
  }
563
588
 
@@ -1023,6 +1048,30 @@ export class TsEmbed {
1023
1048
  this.iFrame.style.height = getCssDimension(height);
1024
1049
  }
1025
1050
 
1051
+ /**
1052
+ * We can process the customer given payload before sending it to the embed port
1053
+ * Embed event handler -> responder -> createEmbedEventResponder -> send response
1054
+ * @param eventPort The event port for a specific MessageChannel
1055
+ * @param eventType The event type
1056
+ * @returns
1057
+ */
1058
+ protected createEmbedEventResponder = (eventPort: MessagePort | void, eventType: EmbedEvent) => {
1059
+
1060
+ const getPayloadToSend = (payload: any) => {
1061
+ if (eventType === EmbedEvent.OnBeforeGetVizDataIntercept) {
1062
+ return processLegacyInterceptResponse(payload);
1063
+ }
1064
+ if (eventType === EmbedEvent.ApiIntercept) {
1065
+ return processApiInterceptResponse(payload);
1066
+ }
1067
+ return payload;
1068
+ }
1069
+ return (payload: any) => {
1070
+ const payloadToSend = getPayloadToSend(payload);
1071
+ this.triggerEventOnPort(eventPort, payloadToSend);
1072
+ }
1073
+ }
1074
+
1026
1075
  /**
1027
1076
  * Executes all registered event handlers for a particular event type
1028
1077
  * @param eventType The event type
@@ -1047,9 +1096,8 @@ export class TsEmbed {
1047
1096
  // payload
1048
1097
  || (!callbackObj.options.start && dataStatus === embedEventStatus.END)
1049
1098
  ) {
1050
- callbackObj.callback(data, (payload) => {
1051
- this.triggerEventOnPort(eventPort, payload);
1052
- });
1099
+ const responder = this.createEmbedEventResponder(eventPort, eventType);
1100
+ callbackObj.callback(data, responder);
1053
1101
  }
1054
1102
  });
1055
1103
  }
@@ -1191,12 +1239,12 @@ export class TsEmbed {
1191
1239
  }
1192
1240
  }
1193
1241
 
1194
- /**
1195
- * @hidden
1196
- * Internal state to track if the embed container is loaded.
1197
- * This is used to trigger events after the embed container is loaded.
1198
- */
1199
- public isEmbedContainerLoaded = false;
1242
+ /**
1243
+ * @hidden
1244
+ * Internal state to track if the embed container is loaded.
1245
+ * This is used to trigger events after the embed container is loaded.
1246
+ */
1247
+ public isEmbedContainerLoaded = false;
1200
1248
 
1201
1249
  /**
1202
1250
  * @hidden
@@ -1348,7 +1396,7 @@ export class TsEmbed {
1348
1396
  }
1349
1397
  this.isPreRendered = true;
1350
1398
  this.showPreRenderByDefault = showPreRenderByDefault;
1351
-
1399
+
1352
1400
  const isAlreadyRendered = this.connectPreRendered();
1353
1401
  if (isAlreadyRendered && !replaceExistingPreRender) {
1354
1402
  return this;
package/src/index.ts CHANGED
@@ -64,6 +64,7 @@ import {
64
64
  ListPageColumns,
65
65
  CustomActionsPosition,
66
66
  CustomActionTarget,
67
+ InterceptedApiType,
67
68
  } from './types';
68
69
  import { CustomCssVariables } from './css-variables';
69
70
  import { SageEmbed, SageViewConfig } from './embed/sage';
@@ -152,6 +153,7 @@ export {
152
153
  DataPanelCustomColumnGroupsAccordionState,
153
154
  CustomActionsPosition,
154
155
  CustomActionTarget,
156
+ InterceptedApiType,
155
157
  };
156
158
 
157
159
  export { resetCachedAuthToken } from './authToken';
@@ -59,6 +59,7 @@ export {
59
59
  resetCachedAuthToken,
60
60
  UIPassthroughEvent,
61
61
  DataPanelCustomColumnGroupsAccordionState,
62
+ InterceptedApiType,
62
63
  CustomActionsPosition,
63
64
  CustomActionTarget,
64
65
  } from '../index';