@thoughtspot/visual-embed-sdk 1.24.0-dev → 1.24.0-preRender.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 (239) hide show
  1. package/cjs/package.json +2 -3
  2. package/cjs/src/embed/TsEmbed.d.ts +302 -0
  3. package/cjs/src/embed/TsEmbed.d.ts.map +1 -0
  4. package/cjs/src/embed/TsEmbed.js +851 -0
  5. package/cjs/src/embed/TsEmbed.js.map +1 -0
  6. package/cjs/src/embed/app.d.ts +4 -1
  7. package/cjs/src/embed/app.d.ts.map +1 -1
  8. package/cjs/src/embed/app.js +9 -2
  9. package/cjs/src/embed/app.js.map +1 -1
  10. package/cjs/src/embed/base.d.ts +2 -0
  11. package/cjs/src/embed/base.d.ts.map +1 -1
  12. package/cjs/src/embed/base.js +2 -0
  13. package/cjs/src/embed/base.js.map +1 -1
  14. package/cjs/src/embed/liveboard.d.ts +3 -2
  15. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  16. package/cjs/src/embed/liveboard.js +6 -5
  17. package/cjs/src/embed/liveboard.js.map +1 -1
  18. package/cjs/src/embed/sage.d.ts +4 -1
  19. package/cjs/src/embed/sage.d.ts.map +1 -1
  20. package/cjs/src/embed/sage.js +9 -2
  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 +1 -0
  25. package/cjs/src/embed/search-bar.js.map +1 -1
  26. package/cjs/src/embed/search.d.ts +5 -1
  27. package/cjs/src/embed/search.d.ts.map +1 -1
  28. package/cjs/src/embed/search.js +10 -2
  29. package/cjs/src/embed/search.js.map +1 -1
  30. package/cjs/src/embed/ts-embed.d.ts +14 -7
  31. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  32. package/cjs/src/embed/ts-embed.js +94 -63
  33. package/cjs/src/embed/ts-embed.js.map +1 -1
  34. package/cjs/src/embed/ts-embed.spec.js +47 -0
  35. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  36. package/cjs/src/index.d.ts +3 -2
  37. package/cjs/src/index.d.ts.map +1 -1
  38. package/cjs/src/index.js +3 -1
  39. package/cjs/src/index.js.map +1 -1
  40. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  41. package/cjs/src/mixpanel-service.js +2 -0
  42. package/cjs/src/mixpanel-service.js.map +1 -1
  43. package/cjs/src/mixpanel-service.spec.js +1 -0
  44. package/cjs/src/mixpanel-service.spec.js.map +1 -1
  45. package/cjs/src/react/index.d.ts +5 -1
  46. package/cjs/src/react/index.d.ts.map +1 -1
  47. package/cjs/src/react/index.js +8 -8
  48. package/cjs/src/react/index.js.map +1 -1
  49. package/cjs/src/types.d.ts +60 -19
  50. package/cjs/src/types.d.ts.map +1 -1
  51. package/cjs/src/types.js +7 -13
  52. package/cjs/src/types.js.map +1 -1
  53. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  54. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  55. package/cjs/src/utils/graphql/answerService/answer-queries.js +80 -0
  56. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -0
  57. package/cjs/src/utils/graphql/answerService/answerService.d.ts +61 -0
  58. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  59. package/cjs/src/utils/graphql/answerService/answerService.js +182 -0
  60. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -0
  61. package/cjs/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  62. package/cjs/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  63. package/cjs/src/utils/graphql/answerService/answerService.spec.js +201 -0
  64. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -0
  65. package/cjs/src/utils/graphql/graphql-request.d.ts +15 -0
  66. package/cjs/src/utils/graphql/graphql-request.d.ts.map +1 -0
  67. package/cjs/src/utils/graphql/graphql-request.js +40 -0
  68. package/cjs/src/utils/graphql/graphql-request.js.map +1 -0
  69. package/cjs/src/utils/graphql/sourceService.d.ts +8 -0
  70. package/cjs/src/utils/graphql/sourceService.d.ts.map +1 -0
  71. package/cjs/src/utils/graphql/sourceService.js +69 -0
  72. package/cjs/src/utils/graphql/sourceService.js.map +1 -0
  73. package/cjs/src/utils/graphql/sourceService.spec.d.ts +2 -0
  74. package/cjs/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  75. package/cjs/src/utils/graphql/sourceService.spec.js +12 -0
  76. package/cjs/src/utils/graphql/sourceService.spec.js.map +1 -0
  77. package/cjs/src/utils/processData.d.ts.map +1 -1
  78. package/cjs/src/utils/processData.js +7 -11
  79. package/cjs/src/utils/processData.js.map +1 -1
  80. package/cjs/src/utils/processData.spec.js +13 -17
  81. package/cjs/src/utils/processData.spec.js.map +1 -1
  82. package/cjs/src/utils.d.ts +6 -0
  83. package/cjs/src/utils.d.ts.map +1 -1
  84. package/cjs/src/utils.js +26 -1
  85. package/cjs/src/utils.js.map +1 -1
  86. package/dist/src/embed/app.d.ts +4 -1
  87. package/dist/src/embed/app.d.ts.map +1 -1
  88. package/dist/src/embed/base.d.ts +2 -0
  89. package/dist/src/embed/base.d.ts.map +1 -1
  90. package/dist/src/embed/liveboard.d.ts +3 -2
  91. package/dist/src/embed/liveboard.d.ts.map +1 -1
  92. package/dist/src/embed/sage.d.ts +4 -1
  93. package/dist/src/embed/sage.d.ts.map +1 -1
  94. package/dist/src/embed/search-bar.d.ts +1 -0
  95. package/dist/src/embed/search-bar.d.ts.map +1 -1
  96. package/dist/src/embed/search.d.ts +5 -1
  97. package/dist/src/embed/search.d.ts.map +1 -1
  98. package/dist/src/embed/ts-embed.d.ts +14 -7
  99. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  100. package/dist/src/index.d.ts +3 -2
  101. package/dist/src/index.d.ts.map +1 -1
  102. package/dist/src/mixpanel-service.d.ts.map +1 -1
  103. package/dist/src/react/index.d.ts +5 -1
  104. package/dist/src/react/index.d.ts.map +1 -1
  105. package/dist/src/types.d.ts +60 -19
  106. package/dist/src/types.d.ts.map +1 -1
  107. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  108. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  109. package/dist/src/utils/graphql/answerService/answerService.d.ts +61 -0
  110. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  111. package/dist/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  112. package/dist/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  113. package/dist/src/utils/graphql/graphql-request.d.ts +15 -0
  114. package/dist/src/utils/graphql/graphql-request.d.ts.map +1 -0
  115. package/dist/src/utils/graphql/sourceService.d.ts +8 -0
  116. package/dist/src/utils/graphql/sourceService.d.ts.map +1 -0
  117. package/dist/src/utils/graphql/sourceService.spec.d.ts +2 -0
  118. package/dist/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  119. package/dist/src/utils/processData.d.ts.map +1 -1
  120. package/dist/src/utils.d.ts +6 -0
  121. package/dist/src/utils.d.ts.map +1 -1
  122. package/dist/tsembed-react.es.js +513 -150
  123. package/dist/tsembed-react.js +516 -149
  124. package/dist/tsembed.es.js +556 -146
  125. package/dist/tsembed.js +556 -145
  126. package/dist/visual-embed-sdk-react-full.d.ts +152 -33
  127. package/dist/visual-embed-sdk-react.d.ts +152 -33
  128. package/dist/visual-embed-sdk.d.ts +147 -32
  129. package/lib/package.json +2 -3
  130. package/lib/src/embed/TsEmbed.d.ts +302 -0
  131. package/lib/src/embed/TsEmbed.d.ts.map +1 -0
  132. package/lib/src/embed/TsEmbed.js +847 -0
  133. package/lib/src/embed/TsEmbed.js.map +1 -0
  134. package/lib/src/embed/app.d.ts +4 -1
  135. package/lib/src/embed/app.d.ts.map +1 -1
  136. package/lib/src/embed/app.js +9 -2
  137. package/lib/src/embed/app.js.map +1 -1
  138. package/lib/src/embed/base.d.ts +2 -0
  139. package/lib/src/embed/base.d.ts.map +1 -1
  140. package/lib/src/embed/base.js +2 -0
  141. package/lib/src/embed/base.js.map +1 -1
  142. package/lib/src/embed/liveboard.d.ts +3 -2
  143. package/lib/src/embed/liveboard.d.ts.map +1 -1
  144. package/lib/src/embed/liveboard.js +6 -5
  145. package/lib/src/embed/liveboard.js.map +1 -1
  146. package/lib/src/embed/sage.d.ts +4 -1
  147. package/lib/src/embed/sage.d.ts.map +1 -1
  148. package/lib/src/embed/sage.js +9 -2
  149. package/lib/src/embed/sage.js.map +1 -1
  150. package/lib/src/embed/search-bar.d.ts +1 -0
  151. package/lib/src/embed/search-bar.d.ts.map +1 -1
  152. package/lib/src/embed/search-bar.js +1 -0
  153. package/lib/src/embed/search-bar.js.map +1 -1
  154. package/lib/src/embed/search.d.ts +5 -1
  155. package/lib/src/embed/search.d.ts.map +1 -1
  156. package/lib/src/embed/search.js +10 -2
  157. package/lib/src/embed/search.js.map +1 -1
  158. package/lib/src/embed/ts-embed.d.ts +14 -7
  159. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  160. package/lib/src/embed/ts-embed.js +94 -63
  161. package/lib/src/embed/ts-embed.js.map +1 -1
  162. package/lib/src/embed/ts-embed.spec.js +47 -0
  163. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  164. package/lib/src/index.d.ts +3 -2
  165. package/lib/src/index.d.ts.map +1 -1
  166. package/lib/src/index.js +2 -1
  167. package/lib/src/index.js.map +1 -1
  168. package/lib/src/mixpanel-service.d.ts.map +1 -1
  169. package/lib/src/mixpanel-service.js +2 -0
  170. package/lib/src/mixpanel-service.js.map +1 -1
  171. package/lib/src/mixpanel-service.spec.js +1 -0
  172. package/lib/src/mixpanel-service.spec.js.map +1 -1
  173. package/lib/src/react/index.d.ts +5 -1
  174. package/lib/src/react/index.d.ts.map +1 -1
  175. package/lib/src/react/index.js +7 -7
  176. package/lib/src/react/index.js.map +1 -1
  177. package/lib/src/types.d.ts +60 -19
  178. package/lib/src/types.d.ts.map +1 -1
  179. package/lib/src/types.js +6 -12
  180. package/lib/src/types.js.map +1 -1
  181. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  182. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  183. package/lib/src/utils/graphql/answerService/answer-queries.js +77 -0
  184. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -0
  185. package/lib/src/utils/graphql/answerService/answerService.d.ts +61 -0
  186. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  187. package/lib/src/utils/graphql/answerService/answerService.js +177 -0
  188. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -0
  189. package/lib/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  190. package/lib/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  191. package/lib/src/utils/graphql/answerService/answerService.spec.js +199 -0
  192. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -0
  193. package/lib/src/utils/graphql/graphql-request.d.ts +15 -0
  194. package/lib/src/utils/graphql/graphql-request.d.ts.map +1 -0
  195. package/lib/src/utils/graphql/graphql-request.js +36 -0
  196. package/lib/src/utils/graphql/graphql-request.js.map +1 -0
  197. package/lib/src/utils/graphql/sourceService.d.ts +8 -0
  198. package/lib/src/utils/graphql/sourceService.d.ts.map +1 -0
  199. package/lib/src/utils/graphql/sourceService.js +65 -0
  200. package/lib/src/utils/graphql/sourceService.js.map +1 -0
  201. package/lib/src/utils/graphql/sourceService.spec.d.ts +2 -0
  202. package/lib/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  203. package/lib/src/utils/graphql/sourceService.spec.js +10 -0
  204. package/lib/src/utils/graphql/sourceService.spec.js.map +1 -0
  205. package/lib/src/utils/processData.d.ts.map +1 -1
  206. package/lib/src/utils/processData.js +8 -12
  207. package/lib/src/utils/processData.js.map +1 -1
  208. package/lib/src/utils/processData.spec.js +14 -18
  209. package/lib/src/utils/processData.spec.js.map +1 -1
  210. package/lib/src/utils.d.ts +6 -0
  211. package/lib/src/utils.d.ts.map +1 -1
  212. package/lib/src/utils.js +23 -0
  213. package/lib/src/utils.js.map +1 -1
  214. package/lib/src/visual-embed-sdk.d.ts +153 -33
  215. package/package.json +2 -3
  216. package/src/embed/app.ts +13 -6
  217. package/src/embed/base.ts +2 -0
  218. package/src/embed/liveboard.ts +7 -5
  219. package/src/embed/sage.ts +13 -2
  220. package/src/embed/search-bar.tsx +2 -0
  221. package/src/embed/search.ts +14 -2
  222. package/src/embed/ts-embed.spec.ts +49 -0
  223. package/src/embed/ts-embed.ts +116 -64
  224. package/src/index.ts +5 -0
  225. package/src/mixpanel-service.spec.ts +1 -0
  226. package/src/mixpanel-service.ts +1 -0
  227. package/src/react/index.tsx +50 -45
  228. package/src/types.ts +64 -21
  229. package/src/utils/graphql/answerService/answer-queries.ts +80 -0
  230. package/src/utils/graphql/answerService/answerService.spec.ts +231 -0
  231. package/src/utils/graphql/answerService/answerService.ts +234 -0
  232. package/src/utils/graphql/graphql-request.ts +45 -0
  233. package/src/utils/graphql/sourceService.spec.ts +10 -0
  234. package/src/utils/graphql/sourceService.ts +71 -0
  235. package/src/utils/processData.spec.ts +15 -25
  236. package/src/utils/processData.ts +13 -15
  237. package/src/utils.ts +24 -0
  238. package/src/utils/answerService.spec.ts +0 -41
  239. package/src/utils/answerService.ts +0 -63
@@ -117,6 +117,8 @@ export class TsEmbed {
117
117
  */
118
118
  protected thoughtSpotV2Base: string;
119
119
 
120
+ protected embedComponentType = 'TsEmbed';
121
+
120
122
  /**
121
123
  * A map of event handlers for particular message types triggered
122
124
  * by the embedded app; multiple event handlers can be registered
@@ -161,6 +163,7 @@ export class TsEmbed {
161
163
  this.registerAppInit();
162
164
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
163
165
  ...viewConfig,
166
+ embedComponentType: this.embedComponentType,
164
167
  });
165
168
  }
166
169
 
@@ -227,6 +230,8 @@ export class TsEmbed {
227
230
  return eventData;
228
231
  }
229
232
 
233
+ private subscribedListeners = {};
234
+
230
235
  /**
231
236
  * Adds a global event listener to window for "message" events.
232
237
  * ThoughtSpot detects if a particular event is targeted to this
@@ -234,7 +239,8 @@ export class TsEmbed {
234
239
  * and executes the registered callbacks accordingly.
235
240
  */
236
241
  private subscribeToEvents() {
237
- window.addEventListener('message', (event) => {
242
+ this.unsubscribeToEvents();
243
+ const messageEventListener = (event: MessageEvent<any>) => {
238
244
  const eventType = this.getEventType(event);
239
245
  const eventPort = this.getEventPort(event);
240
246
  const eventData = this.formatEventData(event, eventType);
@@ -245,16 +251,33 @@ export class TsEmbed {
245
251
  eventPort,
246
252
  );
247
253
  }
248
- });
249
- window.addEventListener('online', (e) => {
254
+ };
255
+ window.addEventListener('message', messageEventListener);
256
+
257
+ const onlineEventListener = (e: Event) => {
250
258
  this.trigger(HostEvent.Reload);
251
- });
252
- window.addEventListener('offline', (e) => {
259
+ };
260
+ window.addEventListener('online', onlineEventListener);
261
+
262
+ const offlineEventListener = (e: Event) => {
253
263
  const offlineWarning = 'Network not Detected. Embed is offline. Please reconnect and refresh';
254
264
  this.executeCallbacks(EmbedEvent.Error, {
255
265
  offlineWarning,
256
266
  });
257
267
  console.warn(offlineWarning);
268
+ };
269
+ window.addEventListener('offline', offlineEventListener);
270
+
271
+ this.subscribedListeners = {
272
+ message: messageEventListener,
273
+ online: onlineEventListener,
274
+ offline: offlineEventListener,
275
+ };
276
+ }
277
+
278
+ private unsubscribeToEvents() {
279
+ Object.keys(this.subscribedListeners).forEach((key) => {
280
+ window.removeEventListener(key, this.subscribedListeners[key]);
258
281
  });
259
282
  }
260
283
 
@@ -279,6 +302,7 @@ export class TsEmbed {
279
302
  ? getRuntimeFilters(this.viewConfig.runtimeFilters)
280
303
  : null,
281
304
  hiddenHomepageModules: this.viewConfig.hiddenHomepageModules || [],
305
+ reorderedHomepageModules: this.viewConfig.reorderedHomepageModules || [],
282
306
  hostConfig: this.embedConfig.hostConfig,
283
307
  hiddenHomeLeftNavItems: this.viewConfig?.hiddenHomeLeftNavItems
284
308
  ? this.viewConfig?.hiddenHomeLeftNavItems
@@ -525,14 +549,24 @@ export class TsEmbed {
525
549
  return iFrame;
526
550
  }
527
551
 
552
+ protected handleInsertionIntoDOM(child: string | Node, showPreRenderByDefault = false): void {
553
+ if (this.isPreRendered) {
554
+ this.insertIntoDOMForPreRender(
555
+ this.embedConfig.loginFailedMessage, showPreRenderByDefault,
556
+ );
557
+ } else {
558
+ this.insertIntoDOM(this.embedConfig.loginFailedMessage);
559
+ }
560
+ }
561
+
528
562
  /**
529
563
  * Renders the embedded ThoughtSpot app in an iframe and sets up
530
564
  * event listeners.
531
565
  *
532
- * @param url
533
- * @param frameOptions
566
+ * @param url - The URL of the embedded ThoughtSpot app.
567
+ * @param showPreRenderByDefault - The flag to show the preRender by default.
534
568
  */
535
- protected async renderIFrame(url: string): Promise<any> {
569
+ protected async renderIFrame(url: string, showPreRenderByDefault = false): Promise<any> {
536
570
  if (this.isError) {
537
571
  return null;
538
572
  }
@@ -557,11 +591,9 @@ export class TsEmbed {
557
591
  return getAuthPromise()
558
592
  ?.then((isLoggedIn: boolean) => {
559
593
  if (!isLoggedIn) {
560
- if (this.isPreRendered) {
561
- this.insertIntoDOMForPreRender(this.embedConfig.loginFailedMessage);
562
- } else {
563
- this.insertIntoDOM(this.embedConfig.loginFailedMessage);
564
- }
594
+ this.handleInsertionIntoDOM(
595
+ this.embedConfig.loginFailedMessage, showPreRenderByDefault,
596
+ );
565
597
  return;
566
598
  }
567
599
 
@@ -584,11 +616,9 @@ export class TsEmbed {
584
616
  this.iFrame.addEventListener('error', () => {
585
617
  nextInQueue();
586
618
  });
587
- if (this.isPreRendered) {
588
- this.insertIntoDOMForPreRender(this.iFrame);
589
- } else {
590
- this.insertIntoDOM(this.iFrame);
591
- }
619
+ this.handleInsertionIntoDOM(
620
+ this.iFrame, showPreRenderByDefault,
621
+ );
592
622
  const prefetchIframe = document.querySelectorAll('.prefetchIframe');
593
623
  if (prefetchIframe.length) {
594
624
  prefetchIframe.forEach((el) => {
@@ -602,11 +632,7 @@ export class TsEmbed {
602
632
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_RENDER_FAILED, {
603
633
  error: JSON.stringify(error),
604
634
  });
605
- if (this.isPreRendered) {
606
- this.insertIntoDOMForPreRender(this.embedConfig.loginFailedMessage);
607
- } else {
608
- this.insertIntoDOM(this.embedConfig.loginFailedMessage);
609
- }
635
+ this.handleInsertionIntoDOM(this.embedConfig.loginFailedMessage);
610
636
  this.handleError(error);
611
637
  });
612
638
  });
@@ -622,32 +648,32 @@ export class TsEmbed {
622
648
 
623
649
  protected createPreRenderWrapper(child: HTMLElement): HTMLDivElement {
624
650
  if (!this.viewConfig.preRenderId) {
625
- throw new Error('Pre render id is required');
651
+ throw new Error('PreRender id is required');
626
652
  }
627
653
 
628
654
  const preRenderIds = this.getPreRenderIds();
629
655
 
630
- const stalePreRenderWrapper = document.getElementById(preRenderIds.wrapper);
631
- if (stalePreRenderWrapper) {
632
- console.log('Found stale wrapper , removing');
633
- stalePreRenderWrapper.remove();
634
- }
656
+ [preRenderIds.wrapper, preRenderIds.shield, preRenderIds.child]
657
+ .map((id) => document.getElementById(id))
658
+ .filter((element) => element)
659
+ .forEach((existingElement) => existingElement.remove());
635
660
 
636
661
  const preRenderWrapper = document.createElement('div');
637
662
  preRenderWrapper.id = preRenderIds.wrapper;
638
663
  setStyleProperties(preRenderWrapper, { position: 'absolute', width: '100vw', height: '100vh' });
639
664
 
640
- const preRenderShield = document.createElement('div');
641
- preRenderShield.id = preRenderIds.shield;
642
- setStyleProperties(preRenderShield, { position: 'absolute', width: '100%', height: '100%' });
665
+ // const preRenderShield = document.createElement('div');
666
+ // preRenderShield.id = preRenderIds.shield;
667
+ // setStyleProperties(preRenderShield, { position: 'absolute',
668
+ // width: '100%', height: '100%' });
643
669
 
644
670
  child.id = preRenderIds.child;
645
671
 
646
672
  preRenderWrapper.appendChild(child);
647
- preRenderWrapper.appendChild(preRenderShield);
673
+ // preRenderWrapper.appendChild(preRenderShield);
648
674
 
649
675
  this.preRenderWrapper = preRenderWrapper;
650
- this.preRenderShield = preRenderShield;
676
+ // this.preRenderShield = preRenderShield;
651
677
  this.preRenderChild = child;
652
678
 
653
679
  return preRenderWrapper;
@@ -655,24 +681,35 @@ export class TsEmbed {
655
681
 
656
682
  protected preRenderWrapper: HTMLElement;
657
683
 
658
- protected preRenderShield: HTMLElement;
684
+ // protected preRenderShield: HTMLElement;
659
685
 
660
686
  protected preRenderChild: HTMLElement;
661
687
 
662
- protected isPreRenderAvailable(): boolean {
688
+ protected connectPreRendered(): boolean {
663
689
  const preRenderIds = this.getPreRenderIds();
664
690
  this.preRenderWrapper = this.preRenderWrapper
665
691
  || document.getElementById(preRenderIds.wrapper);
666
- this.preRenderShield = this.preRenderShield
667
- || document.getElementById(preRenderIds.shield);
692
+ // this.preRenderShield = this.preRenderShield
693
+ // || document.getElementById(preRenderIds.shield);
668
694
  this.preRenderChild = this.preRenderChild
669
695
  || document.getElementById(preRenderIds.child);
670
696
 
671
- return !!this.preRenderWrapper && !!this.preRenderShield
672
- && !!this.preRenderChild;
697
+ if (this.preRenderWrapper && this.preRenderChild) {
698
+ this.isPreRendered = true;
699
+ this.iFrame = this.preRenderChild as HTMLIFrameElement;
700
+ }
701
+
702
+ return this.isPreRenderAvailable();
703
+ }
704
+
705
+ protected isPreRenderAvailable(): boolean {
706
+ return this.isPreRendered;
673
707
  }
674
708
 
675
- protected insertIntoDOMForPreRender(child: string | HTMLElement): void {
709
+ protected insertIntoDOMForPreRender(
710
+ child: string | HTMLElement,
711
+ showPreRenderByDefault = false,
712
+ ): void {
676
713
  let childNode: HTMLElement;
677
714
  if (typeof child === 'string') {
678
715
  const divChildNode = document.createElement('div');
@@ -684,9 +721,13 @@ export class TsEmbed {
684
721
 
685
722
  const preRenderWrapper = this.createPreRenderWrapper(childNode);
686
723
 
687
- document.body.appendChild(preRenderWrapper);
724
+ if (showPreRenderByDefault) {
725
+ this.showPreRender();
726
+ } else {
727
+ this.hidePreRender();
728
+ }
688
729
 
689
- this.hidePreRender();
730
+ document.body.appendChild(preRenderWrapper);
690
731
  }
691
732
 
692
733
  public hidePreRender(): void {
@@ -707,35 +748,42 @@ export class TsEmbed {
707
748
 
708
749
  const childBoundingRect = this.preRenderChild.getBoundingClientRect();
709
750
 
710
- setStyleProperties(this.preRenderShield, {
711
- opacity: '0',
712
- pointerEvents: 'none',
713
- zIndex: '1',
714
- width: `${childBoundingRect.width}px`,
715
- height: `${childBoundingRect.height}px`,
716
- position: 'absolute',
717
- top: '0',
718
- left: '0',
719
- });
751
+ // setStyleProperties(this.preRenderShield, {
752
+ // opacity: '0',
753
+ // pointerEvents: 'none',
754
+ // zIndex: '1',
755
+ // width: `${childBoundingRect.width}px`,
756
+ // height: `${childBoundingRect.height}px`,
757
+ // position: 'absolute',
758
+ // top: '0',
759
+ // left: '0',
760
+ // });
761
+
762
+ this.unsubscribeToEvents();
720
763
  }
721
764
 
722
- public showPreRender() {
765
+ public showPreRender(): void {
723
766
  if (!this.isPreRenderAvailable()) {
724
- // if the Embed component is nor preRendered , Render it now and
725
- // show it (hide is defalt behaviour)
726
- console.log('No preRender found, creating new ');
727
- this.render();
728
- return;
767
+ const isAvailable = this.connectPreRendered();
768
+ if (!isAvailable) {
769
+ // if the Embed component is nor preRendered , Render it now and
770
+ // show it (hide is defalt behaviour)
771
+ console.log('No preRender found, creating new ');
772
+ this.preRender(true);
773
+ return;
774
+ }
729
775
  }
730
776
 
731
777
  this.syncPreRenderStyle();
732
778
 
733
779
  removeStyleProperties(this.preRenderWrapper, ['z-index', 'opacity', 'pointer-events']);
734
780
 
735
- setStyleProperties(this.preRenderShield, { zIndex: '-1' });
781
+ // setStyleProperties(this.preRenderShield, { zIndex: '-1' });
782
+
783
+ this.subscribeToEvents();
736
784
  }
737
785
 
738
- public syncPreRenderStyle() {
786
+ public syncPreRenderStyle(): void {
739
787
  if (!this.el) {
740
788
  throw new Error('Embed element is not defined');
741
789
  }
@@ -981,8 +1029,10 @@ export class TsEmbed {
981
1029
 
982
1030
  /**
983
1031
  * Creates the preRender shell
1032
+ *
1033
+ * @param showPreRenderByDefault
984
1034
  */
985
- public preRender(): TsEmbed {
1035
+ public preRender(showPreRenderByDefault = false): TsEmbed {
986
1036
  this.isPreRendered = true;
987
1037
  return this;
988
1038
  }
@@ -1025,6 +1075,7 @@ export class TsEmbed {
1025
1075
  public destroy(): void {
1026
1076
  try {
1027
1077
  this.insertedDomEl?.parentNode.removeChild(this.insertedDomEl);
1078
+ this.unsubscribeToEvents();
1028
1079
  } catch (e) {
1029
1080
  console.log('Error destroying TS Embed', e);
1030
1081
  }
@@ -1067,9 +1118,10 @@ export class V1Embed extends TsEmbed {
1067
1118
  * Render the app in an iframe and set up event handlers
1068
1119
  *
1069
1120
  * @param iframeSrc
1121
+ * @param showPreRenderByDefault - if true the preRender will be shown by default
1070
1122
  */
1071
- protected renderV1Embed(iframeSrc: string): any {
1072
- return this.renderIFrame(iframeSrc);
1123
+ protected renderV1Embed(iframeSrc: string, showPreRenderByDefault = false): any {
1124
+ return this.renderIFrame(iframeSrc, showPreRenderByDefault);
1073
1125
  }
1074
1126
 
1075
1127
  protected getRootIframeSrc(): string {
package/src/index.ts CHANGED
@@ -10,6 +10,7 @@
10
10
  import { AppEmbed, Page, AppViewConfig } from './embed/app';
11
11
  import {
12
12
  init, prefetch, logout, getEmbedConfig, executeTML, exportTML,
13
+ executeTMLInput, exportTMLInput,
13
14
  } from './embed/base';
14
15
  import { PinboardEmbed, LiveboardViewConfig, LiveboardEmbed } from './embed/liveboard';
15
16
  import { SearchEmbed, SearchViewConfig } from './embed/search';
@@ -41,6 +42,7 @@ import {
41
42
  } from './types';
42
43
  import { CustomCssVariables } from './css-variables';
43
44
  import { SageEmbed, SageViewConfig } from './embed/sage';
45
+ import { AnswerService } from './utils/graphql/answerService/answerService';
44
46
 
45
47
  export {
46
48
  init,
@@ -48,6 +50,8 @@ export {
48
50
  prefetch,
49
51
  executeTML,
50
52
  exportTML,
53
+ executeTMLInput,
54
+ exportTMLInput,
51
55
  getEmbedConfig as getInitConfig,
52
56
  getSessionInfo,
53
57
  SearchEmbed,
@@ -60,6 +64,7 @@ export {
60
64
  AuthStatus,
61
65
  AuthEvent,
62
66
  AuthEventEmitter,
67
+ AnswerService,
63
68
  // types
64
69
  Page,
65
70
  AuthType,
@@ -57,6 +57,7 @@ describe('Unit test for mixpanel', () => {
57
57
  clusterId: sessionInfo.clusterId,
58
58
  clusterName: sessionInfo.clusterName,
59
59
  releaseVersion: sessionInfo.releaseVersion,
60
+ hostAppUrl: 'localhost',
60
61
  });
61
62
  expect(mixpanel.identify).not.toHaveBeenCalledWith(sessionInfo.userGUID);
62
63
  });
@@ -71,6 +71,7 @@ export function initMixpanel(sessionInfo: any): void {
71
71
  clusterId: sessionInfo.clusterId,
72
72
  clusterName: sessionInfo.clusterName,
73
73
  releaseVersion: sessionInfo.releaseVersion,
74
+ hostAppUrl: window?.location?.host || '',
74
75
  });
75
76
  isMixpanelInitialized = true;
76
77
  emptyQueue();
@@ -18,32 +18,25 @@ const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V exte
18
18
  (props: U, forwardedRef: React.MutableRefObject<InstanceType<T>>) => {
19
19
  const ref = React.useRef<HTMLDivElement>(null);
20
20
  const { className, ...embedProps } = props;
21
- const { viewConfig, listeners } = getViewPropsAndListeners<
22
- Omit<U, 'className'>,
23
- V
24
- >(embedProps);
21
+ const { viewConfig, listeners } = getViewPropsAndListeners<Omit<U, 'className'>, V>(
22
+ embedProps,
23
+ );
25
24
  useDeepCompareEffect(() => {
26
25
  const tsEmbed = new EmbedConstructor(
27
- ref!.current,
28
- deepMerge(
29
- {
30
- insertAsSibling: viewConfig.insertAsSibling,
31
- frameParams: {
32
- class: viewConfig.insertAsSibling
33
- ? className || ''
34
- : '',
26
+ ref!.current,
27
+ deepMerge(
28
+ {
29
+ insertAsSibling: viewConfig.insertAsSibling,
30
+ frameParams: {
31
+ class: viewConfig.insertAsSibling ? className || '' : '',
32
+ },
35
33
  },
36
- },
37
- viewConfig,
38
- ),
34
+ viewConfig,
35
+ ),
39
36
  ) as InstanceType<T>;
40
37
  Object.keys(listeners).forEach((eventName) => {
41
- tsEmbed.on(
42
- eventName as EmbedEvent,
43
- listeners[eventName as EmbedEvent],
44
- );
38
+ tsEmbed.on(eventName as EmbedEvent, listeners[eventName as EmbedEvent]);
45
39
  });
46
-
47
40
  if (isPreRenderedComponent) {
48
41
  tsEmbed.preRender();
49
42
  } else if (props.preRenderId) {
@@ -64,23 +57,15 @@ const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V exte
64
57
  };
65
58
  }, [viewConfig, listeners]);
66
59
 
67
- return (
68
- (viewConfig.insertAsSibling)
69
- ? <span
70
- data-testid="tsEmbed"
71
- ref={ref}
72
- style={{ position: 'absolute' }}
73
- ></span>
74
- : <div
75
- data-testid="tsEmbed"
76
- ref={ref}
77
- className={className}>
78
- </div>
60
+ return viewConfig.insertAsSibling ? (
61
+ <span data-testid="tsEmbed" ref={ref} style={{ position: 'absolute' }}></span>
62
+ ) : (
63
+ <div data-testid="tsEmbed" ref={ref} className={className}></div>
79
64
  );
80
65
  },
81
66
  );
82
67
 
83
- interface SearchProps extends EmbedProps, SearchViewConfig { }
68
+ interface SearchProps extends EmbedProps, SearchViewConfig {}
84
69
 
85
70
  /**
86
71
  * React component for Search Embed.
@@ -99,7 +84,7 @@ export const SearchEmbed = componentFactory<typeof _SearchEmbed, SearchProps, Se
99
84
  _SearchEmbed,
100
85
  );
101
86
 
102
- interface AppProps extends EmbedProps, AppViewConfig { }
87
+ interface AppProps extends EmbedProps, AppViewConfig {}
103
88
 
104
89
  /**
105
90
  * React component for Full app Embed.
@@ -117,7 +102,12 @@ interface AppProps extends EmbedProps, AppViewConfig { }
117
102
  */
118
103
  export const AppEmbed = componentFactory<typeof _AppEmbed, AppProps, AppViewConfig>(_AppEmbed);
119
104
 
120
- interface LiveboardProps extends EmbedProps, LiveboardViewConfig { }
105
+ export const PreRenderedAppEmbed = componentFactory<typeof _AppEmbed, AppProps, AppViewConfig>(
106
+ _AppEmbed,
107
+ true,
108
+ );
109
+
110
+ interface LiveboardProps extends EmbedProps, LiveboardViewConfig {}
121
111
 
122
112
  /**
123
113
  * React component for Liveboard embed.
@@ -142,7 +132,15 @@ export const LiveboardEmbed = componentFactory<
142
132
 
143
133
  export const PinboardEmbed = LiveboardEmbed;
144
134
 
145
- interface SearchBarEmbedProps extends EmbedProps, SearchBarViewConfig { }
135
+ export const PreRenderedLiveboardEmbed = componentFactory<
136
+ typeof _LiveboardEmbed,
137
+ LiveboardProps,
138
+ LiveboardViewConfig
139
+ >(_LiveboardEmbed, true);
140
+
141
+ export const PreRenderedPinboardEmbed = PreRenderedLiveboardEmbed;
142
+
143
+ interface SearchBarEmbedProps extends EmbedProps, SearchBarViewConfig {}
146
144
 
147
145
  /**
148
146
  * React component for Search bar embed.
@@ -163,7 +161,13 @@ export const SearchBarEmbed = componentFactory<
163
161
  SearchBarViewConfig
164
162
  >(_SearchBarEmbed);
165
163
 
166
- interface SageEmbedProps extends EmbedProps, SageViewConfig { }
164
+ export const PreRenderedSearchBarEmbed = componentFactory<
165
+ typeof _SearchBarEmbed,
166
+ SearchBarEmbedProps,
167
+ SearchBarViewConfig
168
+ >(_SearchBarEmbed, true);
169
+
170
+ interface SageEmbedProps extends EmbedProps, SageViewConfig {}
167
171
 
168
172
  /**
169
173
  * React component for LLM based search Sage embed.
@@ -182,6 +186,12 @@ export const SageEmbed = componentFactory<typeof _SageEmbed, SageEmbedProps, Sag
182
186
  _SageEmbed,
183
187
  );
184
188
 
189
+ export const PreRenderedSageEmbed = componentFactory<
190
+ typeof _SageEmbed,
191
+ SageEmbedProps,
192
+ SageViewConfig
193
+ >(_SageEmbed, true);
194
+
185
195
  type EmbedComponent =
186
196
  | typeof SearchEmbed
187
197
  | typeof AppEmbed
@@ -206,17 +216,12 @@ type EmbedComponent =
206
216
  * ```
207
217
  * @returns {React.MutableRefObject<T extends TsEmbed>} ref
208
218
  */
209
- export function useEmbedRef<T extends EmbedComponent>():
210
- React.MutableRefObject<React.ComponentRef<T>> {
219
+ export function useEmbedRef<T extends EmbedComponent>(): React.MutableRefObject<
220
+ React.ComponentRef<T>
221
+ > {
211
222
  return React.useRef<React.ComponentRef<T>>(null);
212
223
  }
213
224
 
214
- export const PreRenderedLiveboardEmbed = componentFactory<
215
- typeof _LiveboardEmbed,
216
- LiveboardProps,
217
- LiveboardViewConfig
218
- >(_LiveboardEmbed, true);
219
-
220
225
  export {
221
226
  LiveboardViewConfig,
222
227
  SearchViewConfig,