@thoughtspot/visual-embed-sdk 1.24.0-dev → 1.24.0-preRender.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 (231) hide show
  1. package/cjs/package.json +2 -3
  2. package/cjs/src/embed/app.d.ts +3 -1
  3. package/cjs/src/embed/app.d.ts.map +1 -1
  4. package/cjs/src/embed/app.js +8 -2
  5. package/cjs/src/embed/app.js.map +1 -1
  6. package/cjs/src/embed/base.d.ts +2 -0
  7. package/cjs/src/embed/base.d.ts.map +1 -1
  8. package/cjs/src/embed/base.js +2 -0
  9. package/cjs/src/embed/base.js.map +1 -1
  10. package/cjs/src/embed/liveboard.d.ts +3 -2
  11. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  12. package/cjs/src/embed/liveboard.js +6 -5
  13. package/cjs/src/embed/liveboard.js.map +1 -1
  14. package/cjs/src/embed/sage.d.ts +4 -1
  15. package/cjs/src/embed/sage.d.ts.map +1 -1
  16. package/cjs/src/embed/sage.js +9 -2
  17. package/cjs/src/embed/sage.js.map +1 -1
  18. package/cjs/src/embed/search-bar.d.ts +1 -0
  19. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  20. package/cjs/src/embed/search-bar.js +1 -0
  21. package/cjs/src/embed/search-bar.js.map +1 -1
  22. package/cjs/src/embed/search.d.ts +5 -1
  23. package/cjs/src/embed/search.d.ts.map +1 -1
  24. package/cjs/src/embed/search.js +10 -2
  25. package/cjs/src/embed/search.js.map +1 -1
  26. package/cjs/src/embed/ts-embed.d.ts +9 -3
  27. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  28. package/cjs/src/embed/ts-embed.js +50 -20
  29. package/cjs/src/embed/ts-embed.js.map +1 -1
  30. package/cjs/src/embed/ts-embed.spec.js +47 -0
  31. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  32. package/cjs/src/index.d.ts +3 -2
  33. package/cjs/src/index.d.ts.map +1 -1
  34. package/cjs/src/index.js +3 -1
  35. package/cjs/src/index.js.map +1 -1
  36. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  37. package/cjs/src/mixpanel-service.js +2 -0
  38. package/cjs/src/mixpanel-service.js.map +1 -1
  39. package/cjs/src/mixpanel-service.spec.js +1 -0
  40. package/cjs/src/mixpanel-service.spec.js.map +1 -1
  41. package/cjs/src/react/index.d.ts +5 -1
  42. package/cjs/src/react/index.d.ts.map +1 -1
  43. package/cjs/src/react/index.js +8 -8
  44. package/cjs/src/react/index.js.map +1 -1
  45. package/cjs/src/types.d.ts +46 -18
  46. package/cjs/src/types.d.ts.map +1 -1
  47. package/cjs/src/types.js +7 -13
  48. package/cjs/src/types.js.map +1 -1
  49. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  50. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  51. package/cjs/src/utils/graphql/answerService/answer-queries.js +80 -0
  52. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -0
  53. package/cjs/src/utils/graphql/answerService/answerService.d.ts +61 -0
  54. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  55. package/cjs/src/utils/graphql/answerService/answerService.js +182 -0
  56. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -0
  57. package/cjs/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  58. package/cjs/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  59. package/cjs/src/utils/graphql/answerService/answerService.spec.js +201 -0
  60. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -0
  61. package/cjs/src/utils/graphql/graphql-request.d.ts +15 -0
  62. package/cjs/src/utils/graphql/graphql-request.d.ts.map +1 -0
  63. package/cjs/src/utils/graphql/graphql-request.js +40 -0
  64. package/cjs/src/utils/graphql/graphql-request.js.map +1 -0
  65. package/cjs/src/utils/graphql/sourceService.d.ts +8 -0
  66. package/cjs/src/utils/graphql/sourceService.d.ts.map +1 -0
  67. package/cjs/src/utils/graphql/sourceService.js +69 -0
  68. package/cjs/src/utils/graphql/sourceService.js.map +1 -0
  69. package/cjs/src/utils/graphql/sourceService.spec.d.ts +2 -0
  70. package/cjs/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  71. package/cjs/src/utils/graphql/sourceService.spec.js +12 -0
  72. package/cjs/src/utils/graphql/sourceService.spec.js.map +1 -0
  73. package/cjs/src/utils/processData.d.ts.map +1 -1
  74. package/cjs/src/utils/processData.js +7 -11
  75. package/cjs/src/utils/processData.js.map +1 -1
  76. package/cjs/src/utils/processData.spec.js +13 -17
  77. package/cjs/src/utils/processData.spec.js.map +1 -1
  78. package/cjs/src/utils.d.ts +6 -0
  79. package/cjs/src/utils.d.ts.map +1 -1
  80. package/cjs/src/utils.js +26 -1
  81. package/cjs/src/utils.js.map +1 -1
  82. package/dist/src/embed/app.d.ts +3 -1
  83. package/dist/src/embed/app.d.ts.map +1 -1
  84. package/dist/src/embed/base.d.ts +2 -0
  85. package/dist/src/embed/base.d.ts.map +1 -1
  86. package/dist/src/embed/liveboard.d.ts +3 -2
  87. package/dist/src/embed/liveboard.d.ts.map +1 -1
  88. package/dist/src/embed/sage.d.ts +4 -1
  89. package/dist/src/embed/sage.d.ts.map +1 -1
  90. package/dist/src/embed/search-bar.d.ts +1 -0
  91. package/dist/src/embed/search-bar.d.ts.map +1 -1
  92. package/dist/src/embed/search.d.ts +5 -1
  93. package/dist/src/embed/search.d.ts.map +1 -1
  94. package/dist/src/embed/ts-embed.d.ts +9 -3
  95. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  96. package/dist/src/index.d.ts +3 -2
  97. package/dist/src/index.d.ts.map +1 -1
  98. package/dist/src/mixpanel-service.d.ts.map +1 -1
  99. package/dist/src/react/index.d.ts +5 -1
  100. package/dist/src/react/index.d.ts.map +1 -1
  101. package/dist/src/types.d.ts +46 -18
  102. package/dist/src/types.d.ts.map +1 -1
  103. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  104. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  105. package/dist/src/utils/graphql/answerService/answerService.d.ts +61 -0
  106. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  107. package/dist/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  108. package/dist/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  109. package/dist/src/utils/graphql/graphql-request.d.ts +15 -0
  110. package/dist/src/utils/graphql/graphql-request.d.ts.map +1 -0
  111. package/dist/src/utils/graphql/sourceService.d.ts +8 -0
  112. package/dist/src/utils/graphql/sourceService.d.ts.map +1 -0
  113. package/dist/src/utils/graphql/sourceService.spec.d.ts +2 -0
  114. package/dist/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  115. package/dist/src/utils/processData.d.ts.map +1 -1
  116. package/dist/src/utils.d.ts +6 -0
  117. package/dist/src/utils.d.ts.map +1 -1
  118. package/dist/tsembed-react.es.js +468 -107
  119. package/dist/tsembed-react.js +471 -106
  120. package/dist/tsembed.es.js +511 -103
  121. package/dist/tsembed.js +511 -102
  122. package/dist/visual-embed-sdk-react-full.d.ts +132 -28
  123. package/dist/visual-embed-sdk-react.d.ts +132 -28
  124. package/dist/visual-embed-sdk.d.ts +127 -27
  125. package/lib/package.json +2 -3
  126. package/lib/src/embed/app.d.ts +3 -1
  127. package/lib/src/embed/app.d.ts.map +1 -1
  128. package/lib/src/embed/app.js +8 -2
  129. package/lib/src/embed/app.js.map +1 -1
  130. package/lib/src/embed/base.d.ts +2 -0
  131. package/lib/src/embed/base.d.ts.map +1 -1
  132. package/lib/src/embed/base.js +2 -0
  133. package/lib/src/embed/base.js.map +1 -1
  134. package/lib/src/embed/liveboard.d.ts +3 -2
  135. package/lib/src/embed/liveboard.d.ts.map +1 -1
  136. package/lib/src/embed/liveboard.js +6 -5
  137. package/lib/src/embed/liveboard.js.map +1 -1
  138. package/lib/src/embed/sage.d.ts +4 -1
  139. package/lib/src/embed/sage.d.ts.map +1 -1
  140. package/lib/src/embed/sage.js +9 -2
  141. package/lib/src/embed/sage.js.map +1 -1
  142. package/lib/src/embed/search-bar.d.ts +1 -0
  143. package/lib/src/embed/search-bar.d.ts.map +1 -1
  144. package/lib/src/embed/search-bar.js +1 -0
  145. package/lib/src/embed/search-bar.js.map +1 -1
  146. package/lib/src/embed/search.d.ts +5 -1
  147. package/lib/src/embed/search.d.ts.map +1 -1
  148. package/lib/src/embed/search.js +10 -2
  149. package/lib/src/embed/search.js.map +1 -1
  150. package/lib/src/embed/ts-embed.d.ts +9 -3
  151. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  152. package/lib/src/embed/ts-embed.js +50 -20
  153. package/lib/src/embed/ts-embed.js.map +1 -1
  154. package/lib/src/embed/ts-embed.spec.js +47 -0
  155. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  156. package/lib/src/index.d.ts +3 -2
  157. package/lib/src/index.d.ts.map +1 -1
  158. package/lib/src/index.js +2 -1
  159. package/lib/src/index.js.map +1 -1
  160. package/lib/src/mixpanel-service.d.ts.map +1 -1
  161. package/lib/src/mixpanel-service.js +2 -0
  162. package/lib/src/mixpanel-service.js.map +1 -1
  163. package/lib/src/mixpanel-service.spec.js +1 -0
  164. package/lib/src/mixpanel-service.spec.js.map +1 -1
  165. package/lib/src/react/index.d.ts +5 -1
  166. package/lib/src/react/index.d.ts.map +1 -1
  167. package/lib/src/react/index.js +7 -7
  168. package/lib/src/react/index.js.map +1 -1
  169. package/lib/src/types.d.ts +46 -18
  170. package/lib/src/types.d.ts.map +1 -1
  171. package/lib/src/types.js +6 -12
  172. package/lib/src/types.js.map +1 -1
  173. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  174. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  175. package/lib/src/utils/graphql/answerService/answer-queries.js +77 -0
  176. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -0
  177. package/lib/src/utils/graphql/answerService/answerService.d.ts +61 -0
  178. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  179. package/lib/src/utils/graphql/answerService/answerService.js +177 -0
  180. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -0
  181. package/lib/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  182. package/lib/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  183. package/lib/src/utils/graphql/answerService/answerService.spec.js +199 -0
  184. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -0
  185. package/lib/src/utils/graphql/graphql-request.d.ts +15 -0
  186. package/lib/src/utils/graphql/graphql-request.d.ts.map +1 -0
  187. package/lib/src/utils/graphql/graphql-request.js +36 -0
  188. package/lib/src/utils/graphql/graphql-request.js.map +1 -0
  189. package/lib/src/utils/graphql/sourceService.d.ts +8 -0
  190. package/lib/src/utils/graphql/sourceService.d.ts.map +1 -0
  191. package/lib/src/utils/graphql/sourceService.js +65 -0
  192. package/lib/src/utils/graphql/sourceService.js.map +1 -0
  193. package/lib/src/utils/graphql/sourceService.spec.d.ts +2 -0
  194. package/lib/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  195. package/lib/src/utils/graphql/sourceService.spec.js +10 -0
  196. package/lib/src/utils/graphql/sourceService.spec.js.map +1 -0
  197. package/lib/src/utils/processData.d.ts.map +1 -1
  198. package/lib/src/utils/processData.js +8 -12
  199. package/lib/src/utils/processData.js.map +1 -1
  200. package/lib/src/utils/processData.spec.js +14 -18
  201. package/lib/src/utils/processData.spec.js.map +1 -1
  202. package/lib/src/utils.d.ts +6 -0
  203. package/lib/src/utils.d.ts.map +1 -1
  204. package/lib/src/utils.js +23 -0
  205. package/lib/src/utils.js.map +1 -1
  206. package/lib/src/visual-embed-sdk.d.ts +133 -28
  207. package/package.json +2 -3
  208. package/src/embed/app.ts +12 -2
  209. package/src/embed/base.ts +2 -0
  210. package/src/embed/liveboard.ts +7 -5
  211. package/src/embed/sage.ts +13 -2
  212. package/src/embed/search-bar.tsx +2 -0
  213. package/src/embed/search.ts +14 -2
  214. package/src/embed/ts-embed.spec.ts +49 -0
  215. package/src/embed/ts-embed.ts +61 -22
  216. package/src/index.ts +5 -0
  217. package/src/mixpanel-service.spec.ts +1 -0
  218. package/src/mixpanel-service.ts +1 -0
  219. package/src/react/index.tsx +40 -37
  220. package/src/types.ts +50 -19
  221. package/src/utils/graphql/answerService/answer-queries.ts +80 -0
  222. package/src/utils/graphql/answerService/answerService.spec.ts +231 -0
  223. package/src/utils/graphql/answerService/answerService.ts +234 -0
  224. package/src/utils/graphql/graphql-request.ts +45 -0
  225. package/src/utils/graphql/sourceService.spec.ts +10 -0
  226. package/src/utils/graphql/sourceService.ts +71 -0
  227. package/src/utils/processData.spec.ts +15 -25
  228. package/src/utils/processData.ts +13 -15
  229. package/src/utils.ts +25 -0
  230. package/src/utils/answerService.spec.ts +0 -41
  231. package/src/utils/answerService.ts +0 -63
@@ -45,6 +45,8 @@ export class SearchBarEmbed extends TsEmbed {
45
45
  */
46
46
  protected viewConfig: SearchBarViewConfig;
47
47
 
48
+ protected embedComponentType = 'SearchBarEmbed';
49
+
48
50
  constructor(domSelector: string, viewConfig: SearchBarViewConfig) {
49
51
  super(domSelector);
50
52
  this.viewConfig = viewConfig;
@@ -149,6 +149,8 @@ export class SearchEmbed extends TsEmbed {
149
149
  */
150
150
  protected viewConfig: SearchViewConfig;
151
151
 
152
+ protected embedComponentType = 'SearchEmbed';
153
+
152
154
  constructor(domSelector: DOMSelector, viewConfig: SearchViewConfig) {
153
155
  super(domSelector);
154
156
  this.viewConfig = viewConfig;
@@ -257,13 +259,15 @@ export class SearchEmbed extends TsEmbed {
257
259
 
258
260
  /**
259
261
  * Render the embedded ThoughtSpot search
262
+ *
263
+ * @param showPreRenderByDefault
260
264
  */
261
- public render(): SearchEmbed {
265
+ public render(showPreRenderByDefault = false): SearchEmbed {
262
266
  super.render();
263
267
  const { answerId } = this.viewConfig;
264
268
 
265
269
  const src = this.getIFrameSrc(answerId);
266
- this.renderIFrame(src);
270
+ this.renderIFrame(src, showPreRenderByDefault);
267
271
  getAuthPromise().then(() => {
268
272
  if (
269
273
  checkReleaseVersionInBeta(
@@ -276,4 +280,12 @@ export class SearchEmbed extends TsEmbed {
276
280
  });
277
281
  return this;
278
282
  }
283
+
284
+ public preRender(showPreRenderByDefault = false): SearchEmbed {
285
+ super.preRender(showPreRenderByDefault);
286
+
287
+ this.render(showPreRenderByDefault);
288
+
289
+ return this;
290
+ }
279
291
  }
@@ -113,6 +113,8 @@ describe('Unit test case for ts embed', () => {
113
113
  runtimeFilterParams: null,
114
114
  hiddenHomeLeftNavItems: [],
115
115
  hiddenHomepageModules: [],
116
+ hostConfig: undefined,
117
+ reorderedHomepageModules: [],
116
118
  },
117
119
  });
118
120
  });
@@ -142,6 +144,8 @@ describe('Unit test case for ts embed', () => {
142
144
  runtimeFilterParams: null,
143
145
  hiddenHomeLeftNavItems: [],
144
146
  hiddenHomepageModules: [],
147
+ hostConfig: undefined,
148
+ reorderedHomepageModules: [],
145
149
  },
146
150
  });
147
151
  expect(getIFrameSrc()).toContain(
@@ -181,6 +185,44 @@ describe('Unit test case for ts embed', () => {
181
185
  hiddenHomeLeftNavItems: [],
182
186
  hiddenHomepageModules: [HomepageModule.MyLibrary,
183
187
  HomepageModule.Learning],
188
+ reorderedHomepageModules: [],
189
+ },
190
+ });
191
+ });
192
+
193
+ test('Reordering the home page modules from view Config should be part of app_init payload', async () => {
194
+ const mockEmbedEventPayload = {
195
+ type: EmbedEvent.APP_INIT,
196
+ data: {},
197
+ };
198
+ const mockedReorderedHomepageModules: HomepageModule[] = [
199
+ HomepageModule.MyLibrary,
200
+ HomepageModule.Watchlist,
201
+ ];
202
+
203
+ const searchEmbed = new SearchEmbed(getRootEl(), {
204
+ ...defaultViewConfig,
205
+ reorderedHomepageModules: mockedReorderedHomepageModules,
206
+ });
207
+ searchEmbed.render();
208
+ const mockPort: any = {
209
+ postMessage: jest.fn(),
210
+ };
211
+ await executeAfterWait(() => {
212
+ const iframe = getIFrameEl();
213
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
214
+ });
215
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
216
+ type: EmbedEvent.APP_INIT,
217
+ data: {
218
+ customisations,
219
+ authToken: '',
220
+ hostConfig: undefined,
221
+ runtimeFilterParams: null,
222
+ hiddenHomeLeftNavItems: [],
223
+ hiddenHomepageModules: [],
224
+ reorderedHomepageModules: [HomepageModule.MyLibrary,
225
+ HomepageModule.Watchlist],
184
226
  },
185
227
  });
186
228
  });
@@ -219,6 +261,8 @@ describe('Unit test case for ts embed', () => {
219
261
  runtimeFilterParams: 'col1=color&op1=EQ&val1=blue',
220
262
  hiddenHomeLeftNavItems: [],
221
263
  hiddenHomepageModules: [],
264
+ hostConfig: undefined,
265
+ reorderedHomepageModules: [],
222
266
  },
223
267
  });
224
268
  });
@@ -257,6 +301,8 @@ describe('Unit test case for ts embed', () => {
257
301
  runtimeFilterParams: null,
258
302
  hiddenHomeLeftNavItems: [],
259
303
  hiddenHomepageModules: [],
304
+ hostConfig: undefined,
305
+ reorderedHomepageModules: [],
260
306
  },
261
307
  });
262
308
  });
@@ -293,6 +339,7 @@ describe('Unit test case for ts embed', () => {
293
339
  hiddenHomeLeftNavItems: [HomeLeftNavItem.Home,
294
340
  HomeLeftNavItem.Documentation],
295
341
  hiddenHomepageModules: [],
342
+ reorderedHomepageModules: [],
296
343
  },
297
344
  });
298
345
  });
@@ -448,6 +495,8 @@ describe('Unit test case for ts embed', () => {
448
495
  runtimeFilterParams: null,
449
496
  hiddenHomeLeftNavItems: [],
450
497
  hiddenHomepageModules: [],
498
+ hostConfig: undefined,
499
+ reorderedHomepageModules: [],
451
500
  },
452
501
  });
453
502
  });
@@ -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,7 @@ export class TsEmbed {
234
239
  * and executes the registered callbacks accordingly.
235
240
  */
236
241
  private subscribeToEvents() {
237
- window.addEventListener('message', (event) => {
242
+ const messageEventListener = (event: MessageEvent<any>) => {
238
243
  const eventType = this.getEventType(event);
239
244
  const eventPort = this.getEventPort(event);
240
245
  const eventData = this.formatEventData(event, eventType);
@@ -245,16 +250,33 @@ export class TsEmbed {
245
250
  eventPort,
246
251
  );
247
252
  }
248
- });
249
- window.addEventListener('online', (e) => {
253
+ };
254
+ window.addEventListener('message', messageEventListener);
255
+
256
+ const onlineEventListener = (e: Event) => {
250
257
  this.trigger(HostEvent.Reload);
251
- });
252
- window.addEventListener('offline', (e) => {
258
+ };
259
+ window.addEventListener('online', onlineEventListener);
260
+
261
+ const offlineEventListener = (e: Event) => {
253
262
  const offlineWarning = 'Network not Detected. Embed is offline. Please reconnect and refresh';
254
263
  this.executeCallbacks(EmbedEvent.Error, {
255
264
  offlineWarning,
256
265
  });
257
266
  console.warn(offlineWarning);
267
+ };
268
+ window.addEventListener('offline', offlineEventListener);
269
+
270
+ this.subscribedListeners = {
271
+ message: messageEventListener,
272
+ online: onlineEventListener,
273
+ offline: offlineEventListener,
274
+ };
275
+ }
276
+
277
+ private unsubscribeToEvents() {
278
+ Object.keys(this.subscribedListeners).forEach((key) => {
279
+ window.removeEventListener(key, this.subscribedListeners[key]);
258
280
  });
259
281
  }
260
282
 
@@ -279,6 +301,7 @@ export class TsEmbed {
279
301
  ? getRuntimeFilters(this.viewConfig.runtimeFilters)
280
302
  : null,
281
303
  hiddenHomepageModules: this.viewConfig.hiddenHomepageModules || [],
304
+ reorderedHomepageModules: this.viewConfig.reorderedHomepageModules || [],
282
305
  hostConfig: this.embedConfig.hostConfig,
283
306
  hiddenHomeLeftNavItems: this.viewConfig?.hiddenHomeLeftNavItems
284
307
  ? this.viewConfig?.hiddenHomeLeftNavItems
@@ -525,14 +548,17 @@ export class TsEmbed {
525
548
  return iFrame;
526
549
  }
527
550
 
551
+
528
552
  /**
529
553
  * Renders the embedded ThoughtSpot app in an iframe and sets up
530
554
  * event listeners.
531
555
  *
532
556
  * @param url
533
557
  * @param frameOptions
558
+ * @param showPreRender
559
+ * @param showPreRenderByDefault
534
560
  */
535
- protected async renderIFrame(url: string): Promise<any> {
561
+ protected async renderIFrame(url: string, showPreRenderByDefault = false): Promise<any> {
536
562
  if (this.isError) {
537
563
  return null;
538
564
  }
@@ -586,6 +612,9 @@ export class TsEmbed {
586
612
  });
587
613
  if (this.isPreRendered) {
588
614
  this.insertIntoDOMForPreRender(this.iFrame);
615
+ if (showPreRenderByDefault) {
616
+ this.showPreRender();
617
+ }
589
618
  } else {
590
619
  this.insertIntoDOM(this.iFrame);
591
620
  }
@@ -627,11 +656,10 @@ export class TsEmbed {
627
656
 
628
657
  const preRenderIds = this.getPreRenderIds();
629
658
 
630
- const stalePreRenderWrapper = document.getElementById(preRenderIds.wrapper);
631
- if (stalePreRenderWrapper) {
632
- console.log('Found stale wrapper , removing');
633
- stalePreRenderWrapper.remove();
634
- }
659
+ [preRenderIds.wrapper, preRenderIds.shield, preRenderIds.child]
660
+ .map((id) => document.getElementById(id))
661
+ .filter((element) => element)
662
+ .forEach((existingElement) => existingElement.remove());
635
663
 
636
664
  const preRenderWrapper = document.createElement('div');
637
665
  preRenderWrapper.id = preRenderIds.wrapper;
@@ -659,7 +687,7 @@ export class TsEmbed {
659
687
 
660
688
  protected preRenderChild: HTMLElement;
661
689
 
662
- protected isPreRenderAvailable(): boolean {
690
+ protected connectPreRendered(): boolean {
663
691
  const preRenderIds = this.getPreRenderIds();
664
692
  this.preRenderWrapper = this.preRenderWrapper
665
693
  || document.getElementById(preRenderIds.wrapper);
@@ -667,7 +695,11 @@ export class TsEmbed {
667
695
  || document.getElementById(preRenderIds.shield);
668
696
  this.preRenderChild = this.preRenderChild
669
697
  || document.getElementById(preRenderIds.child);
698
+ this.iFrame = this.preRenderChild as HTMLIFrameElement;
699
+ return this.isPreRenderAvailable();
700
+ }
670
701
 
702
+ protected isPreRenderAvailable(): boolean {
671
703
  return !!this.preRenderWrapper && !!this.preRenderShield
672
704
  && !!this.preRenderChild;
673
705
  }
@@ -717,15 +749,20 @@ export class TsEmbed {
717
749
  top: '0',
718
750
  left: '0',
719
751
  });
752
+
753
+ this.unsubscribeToEvents();
720
754
  }
721
755
 
722
- public showPreRender() {
756
+ public showPreRender(): void {
723
757
  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;
758
+ const isAvailable = this.connectPreRendered();
759
+ if (!isAvailable) {
760
+ // if the Embed component is nor preRendered , Render it now and
761
+ // show it (hide is defalt behaviour)
762
+ console.log('No preRender found, creating new ');
763
+ this.preRender(true);
764
+ return;
765
+ }
729
766
  }
730
767
 
731
768
  this.syncPreRenderStyle();
@@ -733,9 +770,11 @@ export class TsEmbed {
733
770
  removeStyleProperties(this.preRenderWrapper, ['z-index', 'opacity', 'pointer-events']);
734
771
 
735
772
  setStyleProperties(this.preRenderShield, { zIndex: '-1' });
773
+
774
+ this.subscribeToEvents();
736
775
  }
737
776
 
738
- public syncPreRenderStyle() {
777
+ public syncPreRenderStyle(): void {
739
778
  if (!this.el) {
740
779
  throw new Error('Embed element is not defined');
741
780
  }
@@ -982,7 +1021,7 @@ export class TsEmbed {
982
1021
  /**
983
1022
  * Creates the preRender shell
984
1023
  */
985
- public preRender(): TsEmbed {
1024
+ public preRender(showPreRenderByDefault = false): TsEmbed {
986
1025
  this.isPreRendered = true;
987
1026
  return this;
988
1027
  }
@@ -1068,8 +1107,8 @@ export class V1Embed extends TsEmbed {
1068
1107
  *
1069
1108
  * @param iframeSrc
1070
1109
  */
1071
- protected renderV1Embed(iframeSrc: string): any {
1072
- return this.renderIFrame(iframeSrc);
1110
+ protected renderV1Embed(iframeSrc: string, showPreRenderByDefault = false): any {
1111
+ return this.renderIFrame(iframeSrc, showPreRenderByDefault);
1073
1112
  }
1074
1113
 
1075
1114
  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,10 +18,9 @@ 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
26
  ref!.current,
@@ -29,19 +28,14 @@ const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V exte
29
28
  {
30
29
  insertAsSibling: viewConfig.insertAsSibling,
31
30
  frameParams: {
32
- class: viewConfig.insertAsSibling
33
- ? className || ''
34
- : '',
31
+ class: viewConfig.insertAsSibling ? className || '' : '',
35
32
  },
36
33
  },
37
34
  viewConfig,
38
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
40
 
47
41
  if (isPreRenderedComponent) {
@@ -64,23 +58,15 @@ const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V exte
64
58
  };
65
59
  }, [viewConfig, listeners]);
66
60
 
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>
61
+ return viewConfig.insertAsSibling ? (
62
+ <span data-testid="tsEmbed" ref={ref} style={{ position: 'absolute' }}></span>
63
+ ) : (
64
+ <div data-testid="tsEmbed" ref={ref} className={className}></div>
79
65
  );
80
66
  },
81
67
  );
82
68
 
83
- interface SearchProps extends EmbedProps, SearchViewConfig { }
69
+ interface SearchProps extends EmbedProps, SearchViewConfig {}
84
70
 
85
71
  /**
86
72
  * React component for Search Embed.
@@ -99,7 +85,7 @@ export const SearchEmbed = componentFactory<typeof _SearchEmbed, SearchProps, Se
99
85
  _SearchEmbed,
100
86
  );
101
87
 
102
- interface AppProps extends EmbedProps, AppViewConfig { }
88
+ interface AppProps extends EmbedProps, AppViewConfig {}
103
89
 
104
90
  /**
105
91
  * React component for Full app Embed.
@@ -116,8 +102,12 @@ interface AppProps extends EmbedProps, AppViewConfig { }
116
102
  * ```
117
103
  */
118
104
  export const AppEmbed = componentFactory<typeof _AppEmbed, AppProps, AppViewConfig>(_AppEmbed);
105
+ export const PreRenderedAppEmbed = componentFactory<typeof _AppEmbed, AppProps, AppViewConfig>(
106
+ _AppEmbed,
107
+ true,
108
+ );
119
109
 
120
- interface LiveboardProps extends EmbedProps, LiveboardViewConfig { }
110
+ interface LiveboardProps extends EmbedProps, LiveboardViewConfig {}
121
111
 
122
112
  /**
123
113
  * React component for Liveboard embed.
@@ -139,10 +129,17 @@ export const LiveboardEmbed = componentFactory<
139
129
  LiveboardProps,
140
130
  LiveboardViewConfig
141
131
  >(_LiveboardEmbed);
142
-
143
132
  export const PinboardEmbed = LiveboardEmbed;
144
133
 
145
- interface SearchBarEmbedProps extends EmbedProps, SearchBarViewConfig { }
134
+ export const PreRenderedLiveboardEmbed = componentFactory<
135
+ typeof _LiveboardEmbed,
136
+ LiveboardProps,
137
+ LiveboardViewConfig
138
+ >(_LiveboardEmbed, true);
139
+
140
+ export const PreRenderedPinboardEmbed = PreRenderedLiveboardEmbed;
141
+
142
+ interface SearchBarEmbedProps extends EmbedProps, SearchBarViewConfig {}
146
143
 
147
144
  /**
148
145
  * React component for Search bar embed.
@@ -163,7 +160,13 @@ export const SearchBarEmbed = componentFactory<
163
160
  SearchBarViewConfig
164
161
  >(_SearchBarEmbed);
165
162
 
166
- interface SageEmbedProps extends EmbedProps, SageViewConfig { }
163
+ export const PreRenderedSearchBarEmbed = componentFactory<
164
+ typeof _SearchBarEmbed,
165
+ SearchBarEmbedProps,
166
+ SearchBarViewConfig
167
+ >(_SearchBarEmbed, true);
168
+
169
+ interface SageEmbedProps extends EmbedProps, SageViewConfig {}
167
170
 
168
171
  /**
169
172
  * React component for LLM based search Sage embed.
@@ -181,6 +184,11 @@ interface SageEmbedProps extends EmbedProps, SageViewConfig { }
181
184
  export const SageEmbed = componentFactory<typeof _SageEmbed, SageEmbedProps, SageViewConfig>(
182
185
  _SageEmbed,
183
186
  );
187
+ export const PreRenderedSageEmbed = componentFactory<
188
+ typeof _SageEmbed,
189
+ SageEmbedProps,
190
+ SageViewConfig
191
+ >(_SageEmbed, true);
184
192
 
185
193
  type EmbedComponent =
186
194
  | typeof SearchEmbed
@@ -206,17 +214,12 @@ type EmbedComponent =
206
214
  * ```
207
215
  * @returns {React.MutableRefObject<T extends TsEmbed>} ref
208
216
  */
209
- export function useEmbedRef<T extends EmbedComponent>():
210
- React.MutableRefObject<React.ComponentRef<T>> {
217
+ export function useEmbedRef<T extends EmbedComponent>(): React.MutableRefObject<
218
+ React.ComponentRef<T>
219
+ > {
211
220
  return React.useRef<React.ComponentRef<T>>(null);
212
221
  }
213
222
 
214
- export const PreRenderedLiveboardEmbed = componentFactory<
215
- typeof _LiveboardEmbed,
216
- LiveboardProps,
217
- LiveboardViewConfig
218
- >(_LiveboardEmbed, true);
219
-
220
223
  export {
221
224
  LiveboardViewConfig,
222
225
  SearchViewConfig,
package/src/types.ts CHANGED
@@ -8,6 +8,7 @@
8
8
  */
9
9
 
10
10
  import { CustomCssVariables } from './css-variables';
11
+ import type { SessionInterface } from './utils/graphql/answerService/answerService';
11
12
 
12
13
  /**
13
14
  * The authentication mechanism for allowing access to the
@@ -532,7 +533,7 @@ export interface EmbedConfig {
532
533
  }
533
534
 
534
535
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
535
- export interface LayoutConfig {}
536
+ export interface LayoutConfig { }
536
537
 
537
538
  /**
538
539
  * Embedded iFrame configuration
@@ -756,6 +757,12 @@ export interface ViewConfig {
756
757
  * @version SDK: 1.27.0 | Thoughtspot: 9.8.0.cl
757
758
  */
758
759
  hiddenHomepageModules?: HomepageModule[];
760
+ /**
761
+ * reordering the home page modules
762
+ * eg: reorderedHomepageModules = [HomepageModule.MyLibrary, HomepageModule.Watchlist]
763
+ * @version SDK: 1.28.0 | Thoughtspot: 9.9.0.cl
764
+ */
765
+ reorderedHomepageModules?: HomepageModule[];
759
766
  /**
760
767
  * The list of tab IDs to show in the embedded.
761
768
  * Only this Tabs will be shown in their respective LBs.
@@ -921,27 +928,27 @@ export enum HomepageModule {
921
928
  /**
922
929
  * Search bar
923
930
  */
924
- Search = 'search',
931
+ Search = 'SEARCH',
925
932
  /**
926
933
  * kPI watchlist module
927
934
  */
928
- Watchlist = 'watchlist',
935
+ Watchlist = 'WATCHLIST',
929
936
  /**
930
937
  * favorite objects
931
938
  */
932
- Favorite = 'favorite',
939
+ Favorite = 'FAVORITE',
933
940
  /**
934
941
  * List of answers and liveboards
935
942
  */
936
- MyLibrary = 'mylibrary',
943
+ MyLibrary = 'MY_LIBRARY',
937
944
  /**
938
945
  * Trending list
939
946
  */
940
- Trending = 'trending',
947
+ Trending = 'TRENDING',
941
948
  /**
942
949
  * Learning videos
943
950
  */
944
- Learning = 'learning',
951
+ Learning = 'LEARNING',
945
952
  }
946
953
 
947
954
  /**
@@ -3126,18 +3133,6 @@ export enum Action {
3126
3133
  PersonalisedViewsDropdown = 'personalisedViewsDropdown',
3127
3134
  }
3128
3135
 
3129
- export interface SessionInterface {
3130
- sessionId: string;
3131
- genNo: number;
3132
- acSession: { sessionId: string; genNo: number };
3133
- }
3134
-
3135
- // eslint-disable-next-line no-shadow
3136
- export enum OperationType {
3137
- GetChartWithData = 'GetChartWithData',
3138
- GetTableWithHeadlineData = 'GetTableWithHeadlineData',
3139
- }
3140
-
3141
3136
  export interface AnswerServiceType {
3142
3137
  getAnswer?: (offset: number, batchSize: number) => any;
3143
3138
  }
@@ -3156,3 +3151,39 @@ export enum ContextMenuTriggerOptions {
3156
3151
  LEFT_CLICK = 'left-click',
3157
3152
  RIGHT_CLICK = 'right-click',
3158
3153
  }
3154
+
3155
+ export interface ColumnValue {
3156
+ column: {
3157
+ id: string,
3158
+ name: string,
3159
+ dataType: string,
3160
+ [key: string]: any
3161
+ },
3162
+ value: string | number | boolean;
3163
+ }
3164
+
3165
+ export interface VizPoint {
3166
+ selectedAttributes: ColumnValue[],
3167
+ selectedMeasures: ColumnValue[]
3168
+ }
3169
+
3170
+ export interface CustomActionPayload {
3171
+ contextMenuPoints?: {
3172
+ clickedPoint: VizPoint
3173
+ selectedPoints: VizPoint[]
3174
+ };
3175
+ embedAnswerData: {
3176
+ name: string,
3177
+ id: string,
3178
+ sources: {
3179
+ header: {
3180
+ guid: string
3181
+ }
3182
+ },
3183
+ columns: any[],
3184
+ data: any[],
3185
+ [key: string]: any
3186
+ };
3187
+ session: SessionInterface;
3188
+ vizId?: string;
3189
+ }