@thoughtspot/visual-embed-sdk 1.36.3 → 1.36.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.
Files changed (185) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/css-variables.d.ts +1 -1
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts.map +1 -1
  5. package/cjs/src/embed/app.js +1 -1
  6. package/cjs/src/embed/app.js.map +1 -1
  7. package/cjs/src/embed/base.d.ts +4 -0
  8. package/cjs/src/embed/base.d.ts.map +1 -1
  9. package/cjs/src/embed/base.js +27 -1
  10. package/cjs/src/embed/base.js.map +1 -1
  11. package/cjs/src/embed/bodyless-conversation.d.ts.map +1 -1
  12. package/cjs/src/embed/bodyless-conversation.js +1 -1
  13. package/cjs/src/embed/bodyless-conversation.js.map +1 -1
  14. package/cjs/src/embed/conversation.d.ts.map +1 -1
  15. package/cjs/src/embed/conversation.js +1 -1
  16. package/cjs/src/embed/conversation.js.map +1 -1
  17. package/cjs/src/embed/embedConfig.d.ts.map +1 -1
  18. package/cjs/src/embed/embedConfig.js.map +1 -1
  19. package/cjs/src/embed/liveboard.d.ts +2 -2
  20. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  21. package/cjs/src/embed/liveboard.js +4 -5
  22. package/cjs/src/embed/liveboard.js.map +1 -1
  23. package/cjs/src/embed/liveboard.spec.js +11 -11
  24. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  25. package/cjs/src/embed/sage.d.ts.map +1 -1
  26. package/cjs/src/embed/sage.js +1 -1
  27. package/cjs/src/embed/sage.js.map +1 -1
  28. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  29. package/cjs/src/embed/search-bar.js +1 -1
  30. package/cjs/src/embed/search-bar.js.map +1 -1
  31. package/cjs/src/embed/search.d.ts.map +1 -1
  32. package/cjs/src/embed/search.js +1 -1
  33. package/cjs/src/embed/search.js.map +1 -1
  34. package/cjs/src/embed/ts-embed.d.ts +4 -3
  35. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  36. package/cjs/src/embed/ts-embed.js +25 -16
  37. package/cjs/src/embed/ts-embed.js.map +1 -1
  38. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  39. package/cjs/src/embed/ts-embed.spec.js +71 -5
  40. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  41. package/cjs/src/errors.d.ts +1 -0
  42. package/cjs/src/errors.d.ts.map +1 -1
  43. package/cjs/src/errors.js +1 -0
  44. package/cjs/src/errors.js.map +1 -1
  45. package/cjs/src/react/all-types-export.d.ts +1 -1
  46. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  47. package/cjs/src/react/all-types-export.js +2 -1
  48. package/cjs/src/react/all-types-export.js.map +1 -1
  49. package/cjs/src/react/index.d.ts +16 -0
  50. package/cjs/src/react/index.d.ts.map +1 -1
  51. package/cjs/src/react/index.js +25 -2
  52. package/cjs/src/react/index.js.map +1 -1
  53. package/cjs/src/types.d.ts +43 -19
  54. package/cjs/src/types.d.ts.map +1 -1
  55. package/cjs/src/types.js +43 -19
  56. package/cjs/src/types.js.map +1 -1
  57. package/cjs/src/utils/with-resolvers-polyfill.d.ts +1 -0
  58. package/cjs/src/utils/with-resolvers-polyfill.d.ts.map +1 -0
  59. package/cjs/src/utils/with-resolvers-polyfill.js +12 -0
  60. package/cjs/src/utils/with-resolvers-polyfill.js.map +1 -0
  61. package/cjs/src/utils.d.ts +17 -2
  62. package/cjs/src/utils.d.ts.map +1 -1
  63. package/cjs/src/utils.js +27 -3
  64. package/cjs/src/utils.js.map +1 -1
  65. package/dist/{index-BJx3m5_V.js → index-Cyvfex-A.js} +1 -1
  66. package/dist/src/css-variables.d.ts +1 -1
  67. package/dist/src/css-variables.d.ts.map +1 -1
  68. package/dist/src/embed/app.d.ts.map +1 -1
  69. package/dist/src/embed/base.d.ts +4 -0
  70. package/dist/src/embed/base.d.ts.map +1 -1
  71. package/dist/src/embed/bodyless-conversation.d.ts.map +1 -1
  72. package/dist/src/embed/conversation.d.ts.map +1 -1
  73. package/dist/src/embed/embedConfig.d.ts.map +1 -1
  74. package/dist/src/embed/liveboard.d.ts +2 -2
  75. package/dist/src/embed/liveboard.d.ts.map +1 -1
  76. package/dist/src/embed/sage.d.ts.map +1 -1
  77. package/dist/src/embed/search-bar.d.ts.map +1 -1
  78. package/dist/src/embed/search.d.ts.map +1 -1
  79. package/dist/src/embed/ts-embed.d.ts +4 -3
  80. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  81. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  82. package/dist/src/errors.d.ts +1 -0
  83. package/dist/src/errors.d.ts.map +1 -1
  84. package/dist/src/react/all-types-export.d.ts +1 -1
  85. package/dist/src/react/all-types-export.d.ts.map +1 -1
  86. package/dist/src/react/index.d.ts +16 -0
  87. package/dist/src/react/index.d.ts.map +1 -1
  88. package/dist/src/types.d.ts +43 -19
  89. package/dist/src/types.d.ts.map +1 -1
  90. package/dist/src/utils/with-resolvers-polyfill.d.ts +1 -0
  91. package/dist/src/utils/with-resolvers-polyfill.d.ts.map +1 -0
  92. package/dist/src/utils.d.ts +17 -2
  93. package/dist/src/utils.d.ts.map +1 -1
  94. package/dist/tsembed-react.es.js +392 -64
  95. package/dist/tsembed-react.js +390 -61
  96. package/dist/tsembed.es.js +128 -51
  97. package/dist/tsembed.js +127 -50
  98. package/dist/visual-embed-sdk-react-full.d.ts +1277 -1234
  99. package/dist/visual-embed-sdk-react.d.ts +711 -668
  100. package/dist/visual-embed-sdk.d.ts +53 -24
  101. package/lib/package.json +1 -1
  102. package/lib/src/css-variables.d.ts +1 -1
  103. package/lib/src/css-variables.d.ts.map +1 -1
  104. package/lib/src/embed/app.d.ts.map +1 -1
  105. package/lib/src/embed/app.js +1 -1
  106. package/lib/src/embed/app.js.map +1 -1
  107. package/lib/src/embed/base.d.ts +4 -0
  108. package/lib/src/embed/base.d.ts.map +1 -1
  109. package/lib/src/embed/base.js +24 -1
  110. package/lib/src/embed/base.js.map +1 -1
  111. package/lib/src/embed/bodyless-conversation.d.ts.map +1 -1
  112. package/lib/src/embed/bodyless-conversation.js +1 -1
  113. package/lib/src/embed/bodyless-conversation.js.map +1 -1
  114. package/lib/src/embed/conversation.d.ts.map +1 -1
  115. package/lib/src/embed/conversation.js +1 -1
  116. package/lib/src/embed/conversation.js.map +1 -1
  117. package/lib/src/embed/embedConfig.d.ts.map +1 -1
  118. package/lib/src/embed/embedConfig.js.map +1 -1
  119. package/lib/src/embed/liveboard.d.ts +2 -2
  120. package/lib/src/embed/liveboard.d.ts.map +1 -1
  121. package/lib/src/embed/liveboard.js +4 -5
  122. package/lib/src/embed/liveboard.js.map +1 -1
  123. package/lib/src/embed/liveboard.spec.js +11 -11
  124. package/lib/src/embed/liveboard.spec.js.map +1 -1
  125. package/lib/src/embed/sage.d.ts.map +1 -1
  126. package/lib/src/embed/sage.js +1 -1
  127. package/lib/src/embed/sage.js.map +1 -1
  128. package/lib/src/embed/search-bar.d.ts.map +1 -1
  129. package/lib/src/embed/search-bar.js +1 -1
  130. package/lib/src/embed/search-bar.js.map +1 -1
  131. package/lib/src/embed/search.d.ts.map +1 -1
  132. package/lib/src/embed/search.js +1 -1
  133. package/lib/src/embed/search.js.map +1 -1
  134. package/lib/src/embed/ts-embed.d.ts +4 -3
  135. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  136. package/lib/src/embed/ts-embed.js +26 -17
  137. package/lib/src/embed/ts-embed.js.map +1 -1
  138. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  139. package/lib/src/embed/ts-embed.spec.js +71 -5
  140. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  141. package/lib/src/errors.d.ts +1 -0
  142. package/lib/src/errors.d.ts.map +1 -1
  143. package/lib/src/errors.js +1 -0
  144. package/lib/src/errors.js.map +1 -1
  145. package/lib/src/react/all-types-export.d.ts +1 -1
  146. package/lib/src/react/all-types-export.d.ts.map +1 -1
  147. package/lib/src/react/all-types-export.js +1 -1
  148. package/lib/src/react/all-types-export.js.map +1 -1
  149. package/lib/src/react/index.d.ts +16 -0
  150. package/lib/src/react/index.d.ts.map +1 -1
  151. package/lib/src/react/index.js +23 -1
  152. package/lib/src/react/index.js.map +1 -1
  153. package/lib/src/types.d.ts +43 -19
  154. package/lib/src/types.d.ts.map +1 -1
  155. package/lib/src/types.js +43 -19
  156. package/lib/src/types.js.map +1 -1
  157. package/lib/src/utils/with-resolvers-polyfill.d.ts +1 -0
  158. package/lib/src/utils/with-resolvers-polyfill.d.ts.map +1 -0
  159. package/lib/src/utils/with-resolvers-polyfill.js +12 -0
  160. package/lib/src/utils/with-resolvers-polyfill.js.map +1 -0
  161. package/lib/src/utils.d.ts +17 -2
  162. package/lib/src/utils.d.ts.map +1 -1
  163. package/lib/src/utils.js +25 -2
  164. package/lib/src/utils.js.map +1 -1
  165. package/lib/src/visual-embed-sdk.d.ts +54 -25
  166. package/package.json +1 -1
  167. package/src/css-variables.ts +1 -1
  168. package/src/embed/app.ts +2 -1
  169. package/src/embed/base.ts +41 -1
  170. package/src/embed/bodyless-conversation.ts +2 -1
  171. package/src/embed/conversation.ts +2 -1
  172. package/src/embed/embedConfig.ts +1 -1
  173. package/src/embed/liveboard.spec.ts +11 -11
  174. package/src/embed/liveboard.ts +5 -6
  175. package/src/embed/sage.ts +1 -2
  176. package/src/embed/search-bar.tsx +1 -2
  177. package/src/embed/search.ts +1 -2
  178. package/src/embed/ts-embed.spec.ts +83 -5
  179. package/src/embed/ts-embed.ts +33 -17
  180. package/src/errors.ts +1 -0
  181. package/src/react/all-types-export.ts +1 -0
  182. package/src/react/index.tsx +27 -2
  183. package/src/types.ts +43 -19
  184. package/src/utils/with-resolvers-polyfill.ts +11 -0
  185. package/src/utils.ts +35 -4
@@ -66,6 +66,8 @@ import { processTrigger } from '../utils/processTrigger';
66
66
  import pkgInfo from '../../package.json';
67
67
  import {
68
68
  getAuthPromise, renderInQueue, handleAuth, notifyAuthFailure,
69
+ getInitPromise,
70
+ getIsInitCalled,
69
71
  } from './base';
70
72
  import { AuthFailureType } from '../auth';
71
73
  import { getEmbedConfig } from './embedConfig';
@@ -180,15 +182,10 @@ export class TsEmbed {
180
182
 
181
183
  protected hostEventClient: HostEventClient;
182
184
 
185
+ protected isReadyForRenderPromise;
186
+
183
187
  constructor(domSelector: DOMSelector, viewConfig?: ViewConfig) {
184
188
  this.el = getDOMNode(domSelector);
185
- // TODO: handle error
186
- this.embedConfig = getEmbedConfig();
187
- if (!this.embedConfig.authTriggerContainer && !this.embedConfig.useEventForSAMLPopup) {
188
- this.embedConfig.authTriggerContainer = domSelector;
189
- }
190
- this.thoughtSpotHost = getThoughtSpotHost(this.embedConfig);
191
- this.thoughtSpotV2Base = getV2BasePath(this.embedConfig);
192
189
  this.eventHandlerMap = new Map();
193
190
  this.isError = false;
194
191
  this.viewConfig = {
@@ -196,12 +193,22 @@ export class TsEmbed {
196
193
  excludeRuntimeParametersfromURL: false,
197
194
  ...viewConfig,
198
195
  };
199
- this.shouldEncodeUrlQueryParams = this.embedConfig.shouldEncodeUrlQueryParams;
200
196
  this.registerAppInit();
201
197
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
202
198
  ...viewConfig,
203
199
  });
204
200
  this.hostEventClient = new HostEventClient(this.iFrame);
201
+
202
+ this.isReadyForRenderPromise = getInitPromise().then(async () => {
203
+ const embedConfig = getEmbedConfig();
204
+ this.embedConfig = embedConfig;
205
+ if (!embedConfig.authTriggerContainer && !embedConfig.useEventForSAMLPopup) {
206
+ this.embedConfig.authTriggerContainer = domSelector;
207
+ }
208
+ this.thoughtSpotHost = getThoughtSpotHost(embedConfig);
209
+ this.thoughtSpotV2Base = getV2BasePath(embedConfig);
210
+ this.shouldEncodeUrlQueryParams = embedConfig.shouldEncodeUrlQueryParams;
211
+ });
205
212
  }
206
213
 
207
214
  /**
@@ -723,6 +730,7 @@ export class TsEmbed {
723
730
  });
724
731
 
725
732
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
733
+
726
734
  return getAuthPromise()
727
735
  ?.then((isLoggedIn: boolean) => {
728
736
  if (!isLoggedIn) {
@@ -1119,8 +1127,11 @@ export class TsEmbed {
1119
1127
  * @param args
1120
1128
  */
1121
1129
  public async render(): Promise<TsEmbed> {
1130
+ if (!getIsInitCalled()) {
1131
+ logger.error(ERROR_MESSAGE.RENDER_CALLED_BEFORE_INIT);
1132
+ }
1133
+ await this.isReadyForRenderPromise;
1122
1134
  this.isRendered = true;
1123
-
1124
1135
  return this;
1125
1136
  }
1126
1137
 
@@ -1129,22 +1140,21 @@ export class TsEmbed {
1129
1140
  }
1130
1141
 
1131
1142
  protected handleRenderForPrerender() {
1132
- this.render();
1143
+ return this.render();
1133
1144
  }
1134
1145
 
1135
1146
  /**
1136
1147
  * Creates the preRender shell
1137
1148
  * @param showPreRenderByDefault - Show the preRender after render, hidden by default
1138
1149
  */
1139
- public preRender(showPreRenderByDefault = false): TsEmbed {
1150
+ public async preRender(showPreRenderByDefault = false): Promise<TsEmbed> {
1140
1151
  if (!this.viewConfig.preRenderId) {
1141
1152
  logger.error(ERROR_MESSAGE.PRERENDER_ID_MISSING);
1142
1153
  return this;
1143
1154
  }
1144
1155
  this.isPreRendered = true;
1145
1156
  this.showPreRenderByDefault = showPreRenderByDefault;
1146
- this.handleRenderForPrerender();
1147
- return this;
1157
+ return this.handleRenderForPrerender();
1148
1158
  }
1149
1159
 
1150
1160
  /**
@@ -1204,6 +1214,11 @@ export class TsEmbed {
1204
1214
  * @returns
1205
1215
  */
1206
1216
  public async prerenderGeneric(): Promise<any> {
1217
+ if (!getIsInitCalled()) {
1218
+ logger.error(ERROR_MESSAGE.RENDER_CALLED_BEFORE_INIT);
1219
+ }
1220
+ await this.isReadyForRenderPromise;
1221
+
1207
1222
  const prerenderFrameSrc = this.getRootIframeSrc();
1208
1223
  this.isRendered = true;
1209
1224
  return this.renderIFrame(prerenderFrameSrc);
@@ -1246,18 +1261,17 @@ export class TsEmbed {
1246
1261
  * Also, synchronizes the style of the PreRender component with the embedding
1247
1262
  * element.
1248
1263
  */
1249
- public showPreRender(): void {
1264
+ public async showPreRender(): Promise<TsEmbed> {
1250
1265
  if (!this.viewConfig.preRenderId) {
1251
1266
  logger.error(ERROR_MESSAGE.PRERENDER_ID_MISSING);
1252
- return;
1267
+ return this;
1253
1268
  }
1254
1269
  if (!this.isPreRenderAvailable()) {
1255
1270
  const isAvailable = this.connectPreRendered();
1256
1271
 
1257
1272
  if (!isAvailable) {
1258
1273
  // if the Embed component is not preRendered , Render it now and
1259
- this.preRender(true);
1260
- return;
1274
+ return this.preRender(true);
1261
1275
  }
1262
1276
  this.validatePreRenderViewConfig(this.viewConfig);
1263
1277
  }
@@ -1284,6 +1298,8 @@ export class TsEmbed {
1284
1298
  removeStyleProperties(this.preRenderWrapper, ['z-index', 'opacity', 'pointer-events']);
1285
1299
 
1286
1300
  this.subscribeToEvents();
1301
+
1302
+ return this;
1287
1303
  }
1288
1304
 
1289
1305
  /**
package/src/errors.ts CHANGED
@@ -16,4 +16,5 @@ export const ERROR_MESSAGE = {
16
16
  CSP_VIOLATION_ALERT: 'CSP violation detected. Please check the console errors for more details.',
17
17
  CSP_FRAME_HOST_VIOLATION_LOG_MESSAGE: 'Please set up CSP correctly for the application to start working. For more information, see https://developers.thoughtspot.com/docs/security-settings#csp-viz-embed-hosts. \n If the issue persists, refer to https://developers.thoughtspot.com/docs/security-settings#csp-viz-embed-hosts',
18
18
  MISSING_REPORTING_OBSERVER: 'ReportingObserver not supported',
19
+ RENDER_CALLED_BEFORE_INIT: 'Looks like render was called before calling init, the render won\'t start until init is called.\nFor more info check\n1. https://developers.thoughtspot.com/docs/Function_init#_init\n2.https://developers.thoughtspot.com/docs/getting-started#initSdk',
19
20
  };
@@ -12,6 +12,7 @@ export {
12
12
  ConversationEmbed,
13
13
  PreRenderedConversationEmbed,
14
14
  useEmbedRef,
15
+ useInit,
15
16
  } from './index';
16
17
 
17
18
  export {
@@ -1,5 +1,6 @@
1
- import React from 'react';
1
+ import React, { useRef } from 'react';
2
2
  import useDeepCompareEffect from 'use-deep-compare-effect';
3
+ import { AuthEventEmitter } from '../auth';
3
4
  import { deepMerge } from '../utils';
4
5
  import { SearchBarEmbed as _SearchBarEmbed, SearchBarViewConfig } from '../embed/search-bar';
5
6
  import { SageEmbed as _SageEmbed, SageViewConfig } from '../embed/sage';
@@ -8,9 +9,10 @@ import { AppEmbed as _AppEmbed, AppViewConfig } from '../embed/app';
8
9
  import { LiveboardEmbed as _LiveboardEmbed, LiveboardViewConfig } from '../embed/liveboard';
9
10
  import { TsEmbed } from '../embed/ts-embed';
10
11
 
11
- import { EmbedEvent, ViewConfig } from '../types';
12
+ import { EmbedConfig, EmbedEvent, ViewConfig } from '../types';
12
13
  import { EmbedProps, getViewPropsAndListeners } from './util';
13
14
  import { ConversationEmbed as _ConversationEmbed, ConversationViewConfig } from '../embed/conversation';
15
+ import { init } from '../embed/base';
14
16
 
15
17
  const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V extends ViewConfig>(
16
18
  EmbedConstructor: T,
@@ -404,6 +406,29 @@ export function useEmbedRef<T extends EmbedComponent>():
404
406
  return React.useRef<React.ComponentRef<T>>(null);
405
407
  }
406
408
 
409
+ /**
410
+ *
411
+ * @param config - EmbedConfig
412
+ * @returns AuthEventEmitter
413
+ * @example
414
+ * ```
415
+ * function Component() {
416
+ * const authEE = useInit({ ...initConfig });
417
+ * return <LiveboardEmbed ref={ref} liveboardId={<id>} />
418
+ * }
419
+ * ```
420
+ * @version SDK: 1.36.2 | ThoughtSpot: *
421
+ */
422
+ export function useInit(config: EmbedConfig) {
423
+ const ref = useRef<AuthEventEmitter | null>(null);
424
+ useDeepCompareEffect(() => {
425
+ const authEE = init(config);
426
+ ref.current = authEE;
427
+ }, [config]);
428
+
429
+ return ref;
430
+ }
431
+
407
432
  export {
408
433
  LiveboardViewConfig,
409
434
  SearchViewConfig,
package/src/types.ts CHANGED
@@ -1402,8 +1402,9 @@ export enum EmbedEvent {
1402
1402
  */
1403
1403
  Load = 'load',
1404
1404
  /**
1405
- * Data pertaining to an Answer or Liveboard is received
1406
- * @return data - The Answer or Liveboard data
1405
+ * Data pertaining to an Answer or Liveboard is received.
1406
+ * The event payload includes the raw data of the object.
1407
+ * @return data - Answer of Liveboard data
1407
1408
  * @version SDK: 1.1.0 | ThoughtSpot: ts7.may.cl, 8.4.1.sw
1408
1409
  * @example
1409
1410
  *```js
@@ -2309,17 +2310,39 @@ export enum EmbedEvent {
2309
2310
  */
2310
2311
  ParameterChanged = 'parameterChanged',
2311
2312
  /**
2312
- * Emitted when the table viz renders.
2313
- * You can use this event as a hook to trigger
2314
- * other events on the rendered table viz data.
2313
+ * Emits when a table visualization is rendered in
2314
+ * the ThoughtSpot embedded app.
2315
+ * You can also use this event as a hook to trigger host events
2316
+ * such as `HostEvent.TransformTableVizData` on the table visualization.
2317
+ * The event payload contains the data used in the rendered table.
2318
+ * You can extract the relevant data from the payload
2319
+ * stored in `payload.data.data.columnDataLite`.
2320
+ * `columnDataLite` is a multidimensional array that contains
2321
+ * data values for each column, which was used in the query to
2322
+ * generate the table visualization. To find and modify specific cell data,
2323
+ * you can either loop through the array or directly access a cell if
2324
+ * you know its position and data index.
2325
+ * In the following code sample, the first cell in the first column
2326
+ * (`columnDataLite[0].dataValue[0]`) is set to `new fob`.
2327
+ * Note that any changes made to the data in the payload will only update the
2328
+ * visual presentation and do not affect the underlying data.
2329
+ * To persist data value modifications after a reload or during chart
2330
+ * interactions such as drill down, ensure that the modified
2331
+ * payload in the `columnDataLite` is passed on to
2332
+ * `HostEvent.TransformTableVizData` and trigger an update to
2333
+ * the table visualization.
2334
+ * If the Row-Level Security (RLS) rules are applied on the
2335
+ * Worksheet or Model, exercise caution when changing column
2336
+ * or table cell values to maintain data security.
2337
+ *
2315
2338
  * @example
2316
2339
  * ```js
2317
2340
  * searchEmbed.on(EmbedEvent.TableVizRendered, (payload) => {
2318
- * console.log(payload);
2319
- * const columnDataLite = payload.data.data.columnDataLite;
2320
- * columnDataLite[0].dataValue[0]="new fob";
2321
- * console.log('>>> new Data', columnDataLite);
2322
- * searchEmbed.trigger(HostEvent.TransformTableVizData, columnDataLite);
2341
+ * console.log(payload);
2342
+ * const columnDataLite = payload.data.data.columnDataLite;
2343
+ * columnDataLite[0].dataValue[0]="new fob";
2344
+ * console.log('>>> new Data', columnDataLite);
2345
+ * searchEmbed.trigger(HostEvent.TransformTableVizData, columnDataLite);
2323
2346
  * })
2324
2347
  * ```
2325
2348
  * @version SDK: 1.35.12 | ThoughtSpot: 10.7.0.cl
@@ -3358,19 +3381,20 @@ export enum HostEvent {
3358
3381
  */
3359
3382
  UIPassthrough = 'UiPassthrough',
3360
3383
  /**
3361
- * Triggers the table viz rerender with the updated data.
3384
+ * Triggers the table visualization re-render with the updated data.
3362
3385
  * Includes the following properties:
3363
- * @param - columnDataLite - an array of object containing data
3364
- * transformed from data picked from TableVizRendered event.
3365
- * For example, { columnDataLite: []}
3386
+ * @param - `columnDataLite` - an array of object containing the
3387
+ * data value modifications retrieved from the `EmbedEvent.TableVizRendered`
3388
+ * payload.For example, { columnDataLite: []}`.
3389
+ *
3366
3390
  * @example
3367
3391
  * ```js
3368
3392
  * searchEmbed.on(EmbedEvent.TableVizRendered, (payload) => {
3369
- * console.log(payload);
3370
- * const columnDataLite = payload.data.data.columnDataLite;
3371
- * columnDataLite[0].dataValue[0]="new fob";
3372
- * console.log('>>> new Data', columnDataLite);
3373
- * searchEmbed.trigger(HostEvent.TransformTableVizData, columnDataLite);
3393
+ * console.log(payload);
3394
+ * const columnDataLite = payload.data.data.columnDataLite;
3395
+ * columnDataLite[0].dataValue[0]="new fob";
3396
+ * console.log('>>> new Data', columnDataLite);
3397
+ * searchEmbed.trigger(HostEvent.TransformTableVizData, columnDataLite);
3374
3398
  * })
3375
3399
  * ```
3376
3400
  * @version SDK: 1.35.12 | ThoughtSpot: 10.7.0.cl
@@ -0,0 +1,11 @@
1
+ if (typeof (Promise as any).withResolvers === 'undefined') {
2
+ (Promise as any).withResolvers = () => {
3
+ let resolve;
4
+ let reject;
5
+ const promise = new Promise((res, rej) => {
6
+ resolve = res;
7
+ reject = rej;
8
+ });
9
+ return { promise, resolve, reject };
10
+ };
11
+ }
package/src/utils.ts CHANGED
@@ -342,17 +342,48 @@ const sdkWindowKey = '_tsEmbedSDK' as any;
342
342
  * Stores a value in the global `window` object under the `_tsEmbedSDK` namespace.
343
343
  * @param key - The key under which the value will be stored.
344
344
  * @param value - The value to store.
345
+ * @param options - Additional options.
346
+ * @param options.ignoreIfAlreadyExists - Does not set if value for key is set.
347
+ *
348
+ * @returns The stored value.
349
+ *
350
+ * @version SDK: 1.36.2 | ThoughtSpot: *
345
351
  */
346
- export const storeValueInWindow = (key: string, value: any) => {
352
+ export function storeValueInWindow<T>(
353
+ key: string,
354
+ value: T,
355
+ options: { ignoreIfAlreadyExists?: boolean } = {},
356
+ ): T {
347
357
  if (!window[sdkWindowKey]) {
348
358
  (window as any)[sdkWindowKey] = {};
349
359
  }
350
- window[sdkWindowKey][key as any] = value;
351
- };
360
+
361
+ if (options.ignoreIfAlreadyExists && key in (window as any)[sdkWindowKey]) {
362
+ return (window as any)[sdkWindowKey][key];
363
+ }
364
+
365
+ (window as any)[sdkWindowKey][key] = value;
366
+ return value;
367
+ }
352
368
 
353
369
  /**
354
370
  * Retrieves a stored value from the global `window` object under the `_tsEmbedSDK` namespace.
355
371
  * @param key - The key whose value needs to be retrieved.
356
372
  * @returns The stored value or `undefined` if the key is not found.
357
373
  */
358
- export const getValueFromWindow = (key: string): any => window?.[sdkWindowKey]?.[key as any];
374
+ export const getValueFromWindow = <T = any>
375
+ (key: string): T => (window as any)?.[sdkWindowKey]?.[key];
376
+
377
+ /**
378
+ * Resets the key if it exists in the `window` object under the `_tsEmbedSDK` key.
379
+ * Returns true if the key was reset, false otherwise.
380
+ * @param key - Key to reset
381
+ * @returns - boolean indicating if the key was reset
382
+ */
383
+ export function resetValueFromWindow(key: string): boolean {
384
+ if (key in window[sdkWindowKey]) {
385
+ delete (window as any)[sdkWindowKey][key];
386
+ return true;
387
+ }
388
+ return false;
389
+ }