@thoughtspot/visual-embed-sdk 1.51.0 → 1.51.2

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 (228) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/config.d.ts +1 -0
  3. package/cjs/src/config.d.ts.map +1 -1
  4. package/cjs/src/config.js +2 -1
  5. package/cjs/src/config.js.map +1 -1
  6. package/cjs/src/css-variables.d.ts +27 -0
  7. package/cjs/src/css-variables.d.ts.map +1 -1
  8. package/cjs/src/embed/app.d.ts +43 -12
  9. package/cjs/src/embed/app.d.ts.map +1 -1
  10. package/cjs/src/embed/app.js +29 -3
  11. package/cjs/src/embed/app.js.map +1 -1
  12. package/cjs/src/embed/app.spec.js +253 -1
  13. package/cjs/src/embed/app.spec.js.map +1 -1
  14. package/cjs/src/embed/base.d.ts +1 -1
  15. package/cjs/src/embed/base.js +1 -1
  16. package/cjs/src/embed/conversation.d.ts +171 -1
  17. package/cjs/src/embed/conversation.d.ts.map +1 -1
  18. package/cjs/src/embed/conversation.js +4 -2
  19. package/cjs/src/embed/conversation.js.map +1 -1
  20. package/cjs/src/embed/conversation.spec.js +125 -0
  21. package/cjs/src/embed/conversation.spec.js.map +1 -1
  22. package/cjs/src/embed/events.spec.js +3 -0
  23. package/cjs/src/embed/events.spec.js.map +1 -1
  24. package/cjs/src/embed/host-events.spec.js +36 -0
  25. package/cjs/src/embed/host-events.spec.js.map +1 -1
  26. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +1 -1
  27. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  28. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +18 -0
  29. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  30. package/cjs/src/embed/liveboard.d.ts +40 -13
  31. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  32. package/cjs/src/embed/liveboard.js +25 -4
  33. package/cjs/src/embed/liveboard.js.map +1 -1
  34. package/cjs/src/embed/liveboard.spec.js +349 -2
  35. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  36. package/cjs/src/embed/search.spec.js +28 -0
  37. package/cjs/src/embed/search.spec.js.map +1 -1
  38. package/cjs/src/embed/spotter-utils.d.ts +8 -1
  39. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  40. package/cjs/src/embed/spotter-utils.js +15 -1
  41. package/cjs/src/embed/spotter-utils.js.map +1 -1
  42. package/cjs/src/embed/spotter-utils.spec.js +68 -0
  43. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  44. package/cjs/src/embed/spotter-viz-utils.d.ts +9 -10
  45. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  46. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  47. package/cjs/src/embed/ts-embed.d.ts +97 -9
  48. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  49. package/cjs/src/embed/ts-embed.js +76 -35
  50. package/cjs/src/embed/ts-embed.js.map +1 -1
  51. package/cjs/src/embed/ts-embed.spec.js +537 -3
  52. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  53. package/cjs/src/index.d.ts +3 -3
  54. package/cjs/src/index.d.ts.map +1 -1
  55. package/cjs/src/index.js +3 -2
  56. package/cjs/src/index.js.map +1 -1
  57. package/cjs/src/react/all-types-export.d.ts +1 -1
  58. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  59. package/cjs/src/react/all-types-export.js +2 -1
  60. package/cjs/src/react/all-types-export.js.map +1 -1
  61. package/cjs/src/react/all-types-export.parity.spec.d.ts +2 -0
  62. package/cjs/src/react/all-types-export.parity.spec.d.ts.map +1 -0
  63. package/cjs/src/react/all-types-export.parity.spec.js +194 -0
  64. package/cjs/src/react/all-types-export.parity.spec.js.map +1 -0
  65. package/cjs/src/react/index.d.ts +66 -32
  66. package/cjs/src/react/index.d.ts.map +1 -1
  67. package/cjs/src/react/index.js +5 -3
  68. package/cjs/src/react/index.js.map +1 -1
  69. package/cjs/src/react/index.spec.js +101 -0
  70. package/cjs/src/react/index.spec.js.map +1 -1
  71. package/cjs/src/types.d.ts +330 -18
  72. package/cjs/src/types.d.ts.map +1 -1
  73. package/cjs/src/types.js +182 -12
  74. package/cjs/src/types.js.map +1 -1
  75. package/cjs/src/utils.d.ts +5 -0
  76. package/cjs/src/utils.d.ts.map +1 -1
  77. package/cjs/src/utils.js +19 -1
  78. package/cjs/src/utils.js.map +1 -1
  79. package/cjs/src/utils.spec.js +37 -0
  80. package/cjs/src/utils.spec.js.map +1 -1
  81. package/dist/{index-aBzH5ZwF.js → index-D8_Zs-Nr.js} +1 -1
  82. package/dist/src/config.d.ts +1 -0
  83. package/dist/src/config.d.ts.map +1 -1
  84. package/dist/src/css-variables.d.ts +27 -0
  85. package/dist/src/css-variables.d.ts.map +1 -1
  86. package/dist/src/embed/app.d.ts +43 -12
  87. package/dist/src/embed/app.d.ts.map +1 -1
  88. package/dist/src/embed/base.d.ts +1 -1
  89. package/dist/src/embed/conversation.d.ts +171 -1
  90. package/dist/src/embed/conversation.d.ts.map +1 -1
  91. package/dist/src/embed/hostEventClient/host-event-client.d.ts +1 -1
  92. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  93. package/dist/src/embed/liveboard.d.ts +40 -13
  94. package/dist/src/embed/liveboard.d.ts.map +1 -1
  95. package/dist/src/embed/spotter-utils.d.ts +8 -1
  96. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  97. package/dist/src/embed/spotter-viz-utils.d.ts +9 -10
  98. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  99. package/dist/src/embed/ts-embed.d.ts +97 -9
  100. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  101. package/dist/src/index.d.ts +3 -3
  102. package/dist/src/index.d.ts.map +1 -1
  103. package/dist/src/react/all-types-export.d.ts +1 -1
  104. package/dist/src/react/all-types-export.d.ts.map +1 -1
  105. package/dist/src/react/all-types-export.parity.spec.d.ts +2 -0
  106. package/dist/src/react/all-types-export.parity.spec.d.ts.map +1 -0
  107. package/dist/src/react/index.d.ts +66 -32
  108. package/dist/src/react/index.d.ts.map +1 -1
  109. package/dist/src/types.d.ts +330 -18
  110. package/dist/src/types.d.ts.map +1 -1
  111. package/dist/src/utils.d.ts +5 -0
  112. package/dist/src/utils.d.ts.map +1 -1
  113. package/dist/tsembed-react.es.js +354 -64
  114. package/dist/tsembed-react.js +353 -63
  115. package/dist/tsembed.es.js +414 -126
  116. package/dist/tsembed.js +416 -128
  117. package/dist/visual-embed-sdk-react-full.d.ts +777 -90
  118. package/dist/visual-embed-sdk-react.d.ts +773 -89
  119. package/dist/visual-embed-sdk.d.ts +713 -60
  120. package/lib/package.json +1 -1
  121. package/lib/src/config.d.ts +1 -0
  122. package/lib/src/config.d.ts.map +1 -1
  123. package/lib/src/config.js +1 -0
  124. package/lib/src/config.js.map +1 -1
  125. package/lib/src/css-variables.d.ts +27 -0
  126. package/lib/src/css-variables.d.ts.map +1 -1
  127. package/lib/src/embed/app.d.ts +43 -12
  128. package/lib/src/embed/app.d.ts.map +1 -1
  129. package/lib/src/embed/app.js +30 -4
  130. package/lib/src/embed/app.js.map +1 -1
  131. package/lib/src/embed/app.spec.js +253 -1
  132. package/lib/src/embed/app.spec.js.map +1 -1
  133. package/lib/src/embed/base.d.ts +1 -1
  134. package/lib/src/embed/base.js +1 -1
  135. package/lib/src/embed/conversation.d.ts +171 -1
  136. package/lib/src/embed/conversation.d.ts.map +1 -1
  137. package/lib/src/embed/conversation.js +5 -3
  138. package/lib/src/embed/conversation.js.map +1 -1
  139. package/lib/src/embed/conversation.spec.js +125 -0
  140. package/lib/src/embed/conversation.spec.js.map +1 -1
  141. package/lib/src/embed/events.spec.js +3 -0
  142. package/lib/src/embed/events.spec.js.map +1 -1
  143. package/lib/src/embed/host-events.spec.js +36 -0
  144. package/lib/src/embed/host-events.spec.js.map +1 -1
  145. package/lib/src/embed/hostEventClient/host-event-client.d.ts +1 -1
  146. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  147. package/lib/src/embed/hostEventClient/host-event-client.spec.js +18 -0
  148. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  149. package/lib/src/embed/liveboard.d.ts +40 -13
  150. package/lib/src/embed/liveboard.d.ts.map +1 -1
  151. package/lib/src/embed/liveboard.js +25 -4
  152. package/lib/src/embed/liveboard.js.map +1 -1
  153. package/lib/src/embed/liveboard.spec.js +349 -2
  154. package/lib/src/embed/liveboard.spec.js.map +1 -1
  155. package/lib/src/embed/search.spec.js +28 -0
  156. package/lib/src/embed/search.spec.js.map +1 -1
  157. package/lib/src/embed/spotter-utils.d.ts +8 -1
  158. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  159. package/lib/src/embed/spotter-utils.js +13 -0
  160. package/lib/src/embed/spotter-utils.js.map +1 -1
  161. package/lib/src/embed/spotter-utils.spec.js +69 -1
  162. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  163. package/lib/src/embed/spotter-viz-utils.d.ts +9 -10
  164. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  165. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  166. package/lib/src/embed/ts-embed.d.ts +97 -9
  167. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  168. package/lib/src/embed/ts-embed.js +77 -36
  169. package/lib/src/embed/ts-embed.js.map +1 -1
  170. package/lib/src/embed/ts-embed.spec.js +537 -3
  171. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  172. package/lib/src/index.d.ts +3 -3
  173. package/lib/src/index.d.ts.map +1 -1
  174. package/lib/src/index.js +2 -2
  175. package/lib/src/index.js.map +1 -1
  176. package/lib/src/react/all-types-export.d.ts +1 -1
  177. package/lib/src/react/all-types-export.d.ts.map +1 -1
  178. package/lib/src/react/all-types-export.js +1 -1
  179. package/lib/src/react/all-types-export.js.map +1 -1
  180. package/lib/src/react/all-types-export.parity.spec.d.ts +2 -0
  181. package/lib/src/react/all-types-export.parity.spec.d.ts.map +1 -0
  182. package/lib/src/react/all-types-export.parity.spec.js +191 -0
  183. package/lib/src/react/all-types-export.parity.spec.js.map +1 -0
  184. package/lib/src/react/index.d.ts +66 -32
  185. package/lib/src/react/index.d.ts.map +1 -1
  186. package/lib/src/react/index.js +5 -3
  187. package/lib/src/react/index.js.map +1 -1
  188. package/lib/src/react/index.spec.js +102 -1
  189. package/lib/src/react/index.spec.js.map +1 -1
  190. package/lib/src/types.d.ts +330 -18
  191. package/lib/src/types.d.ts.map +1 -1
  192. package/lib/src/types.js +182 -12
  193. package/lib/src/types.js.map +1 -1
  194. package/lib/src/utils.d.ts +5 -0
  195. package/lib/src/utils.d.ts.map +1 -1
  196. package/lib/src/utils.js +17 -0
  197. package/lib/src/utils.js.map +1 -1
  198. package/lib/src/utils.spec.js +38 -1
  199. package/lib/src/utils.spec.js.map +1 -1
  200. package/lib/src/visual-embed-sdk.d.ts +713 -60
  201. package/package.json +1 -1
  202. package/src/config.ts +1 -0
  203. package/src/css-variables.ts +32 -0
  204. package/src/embed/app.spec.ts +335 -1
  205. package/src/embed/app.ts +71 -13
  206. package/src/embed/base.ts +1 -1
  207. package/src/embed/conversation.spec.ts +136 -0
  208. package/src/embed/conversation.ts +181 -3
  209. package/src/embed/events.spec.ts +4 -0
  210. package/src/embed/host-events.spec.ts +48 -0
  211. package/src/embed/hostEventClient/host-event-client.spec.ts +34 -0
  212. package/src/embed/hostEventClient/host-event-client.ts +2 -2
  213. package/src/embed/liveboard.spec.ts +457 -2
  214. package/src/embed/liveboard.ts +74 -15
  215. package/src/embed/search.spec.ts +31 -0
  216. package/src/embed/spotter-utils.spec.ts +72 -0
  217. package/src/embed/spotter-utils.ts +21 -1
  218. package/src/embed/spotter-viz-utils.ts +9 -10
  219. package/src/embed/ts-embed.spec.ts +699 -3
  220. package/src/embed/ts-embed.ts +91 -41
  221. package/src/index.ts +43 -2
  222. package/src/react/all-types-export.parity.spec.ts +208 -0
  223. package/src/react/all-types-export.ts +22 -0
  224. package/src/react/index.spec.tsx +158 -0
  225. package/src/react/index.tsx +70 -33
  226. package/src/types.ts +329 -16
  227. package/src/utils.spec.ts +49 -0
  228. package/src/utils.ts +16 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thoughtspot/visual-embed-sdk",
3
- "version": "1.51.0",
3
+ "version": "1.51.2",
4
4
  "description": "ThoughtSpot Embed SDK",
5
5
  "module": "lib/src/index.js",
6
6
  "main": "dist/tsembed.js",
package/src/config.ts CHANGED
@@ -76,3 +76,4 @@ export const URL_MAX_LENGTH = 2000;
76
76
  */
77
77
  export const DEFAULT_EMBED_WIDTH = '100%';
78
78
  export const DEFAULT_EMBED_HEIGHT = '100%';
79
+ export const DEFAULT_LAZY_LOADING_MARGIN = '500px 0px';
@@ -534,6 +534,14 @@ export interface CustomCssVariables {
534
534
  */
535
535
  '--ts-var-liveboard-header-font-color'?: string;
536
536
 
537
+ /**
538
+ * Left and right margin of the header and the tab/filter section of an
539
+ * embedded Liveboard. Use alongside the `liveboardGutter` view config to
540
+ * keep the header aligned with a custom tile-grid gutter.
541
+ * @version SDK: 1.53.0 | ThoughtSpot Cloud: 26.10.0.cl
542
+ */
543
+ '--ts-var-liveboard-header-horizontal-margin'?: string;
544
+
537
545
  /**
538
546
  * Border color of the tiles in the Liveboard.
539
547
  */
@@ -554,6 +562,21 @@ export interface CustomCssVariables {
554
562
  */
555
563
  '--ts-var-liveboard-insight-tile-background'?: string;
556
564
 
565
+ /**
566
+ * Icon color of the insight tiles in the Liveboard.
567
+ */
568
+ '--ts-var-liveboard-insight-tile-icon-color'?: string;
569
+
570
+ /**
571
+ * Font color of the success text in the insight tiles in the Liveboard.
572
+ */
573
+ '--ts-var-liveboard-insight-tile-success-color'?: string;
574
+
575
+ /**
576
+ * Font color of the failure text in the insight tiles in the Liveboard.
577
+ */
578
+ '--ts-var-liveboard-insight-tile-failure-color'?: string;
579
+
557
580
  /**
558
581
  * Border radius of the tiles in the Liveboard.
559
582
  */
@@ -812,6 +835,15 @@ export interface CustomCssVariables {
812
835
  */
813
836
  '--ts-var-parameter-chip-active-text-color'?: string;
814
837
 
838
+ /**
839
+ * Color of the dot indicator shown on a filter or parameter chip in the
840
+ * centralized filter modal on a Liveboard. The dot appears when the
841
+ * filter or parameter value has been modified but the changes are not
842
+ * yet applied to the Liveboard.
843
+ * @version SDK: 1.52.0 | ThoughtSpot: 26.10.0.cl
844
+ */
845
+ '--ts-var-unsaved-filter-indicator-color'?: string;
846
+
815
847
  /**
816
848
  * Background color of the action button in the Liveboard header.
817
849
  */
@@ -211,6 +211,7 @@ describe('App embed tests', () => {
211
211
  [Page.SpotIQ]: 'insights/results',
212
212
  [Page.Monitor]: 'insights/monitor-alerts',
213
213
  [Page.Collections]: 'collections',
214
+ [Page.LiveboardSchedules]: 'home/liveboard-schedules',
214
215
  };
215
216
 
216
217
  const pageIds = Object.keys(pageRouteMap);
@@ -245,6 +246,7 @@ describe('App embed tests', () => {
245
246
  [Page.SpotIQ]: 'home/spotiq-analysis',
246
247
  [Page.Monitor]: 'home/monitor-alerts',
247
248
  [Page.Collections]: 'collections',
249
+ [Page.LiveboardSchedules]: 'home/liveboard-schedules',
248
250
  };
249
251
 
250
252
  const pageIdsForModularHomes = Object.keys(pageRouteMapForModularHome);
@@ -388,6 +390,21 @@ describe('App embed tests', () => {
388
390
  });
389
391
  });
390
392
 
393
+ test('should set isLiveboardAlwaysOn12ColLayout to true in url', async () => {
394
+ const appEmbed = new AppEmbed(getRootEl(), {
395
+ ...defaultViewConfig,
396
+ isLiveboardAlwaysOn12ColLayout: true,
397
+ } as AppViewConfig);
398
+
399
+ appEmbed.render();
400
+ await executeAfterWait(() => {
401
+ expectUrlMatchesWithParams(
402
+ getIFrameSrc(),
403
+ `http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&isLiveboardAlwaysOn12ColLayout=true&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`,
404
+ );
405
+ });
406
+ });
407
+
391
408
  test('should set coverAndFilterOptionInPDF to false in url', async () => {
392
409
  const appEmbed = new AppEmbed(getRootEl(), {
393
410
  ...defaultViewConfig,
@@ -416,6 +433,20 @@ describe('App embed tests', () => {
416
433
  });
417
434
  });
418
435
 
436
+ test('should set liveboardGutter in url', async () => {
437
+ const appEmbed = new AppEmbed(getRootEl(), {
438
+ ...defaultViewConfig,
439
+ liveboardGutter: 8,
440
+ } as AppViewConfig);
441
+ appEmbed.render();
442
+ await executeAfterWait(() => {
443
+ expectUrlMatchesWithParams(
444
+ getIFrameSrc(),
445
+ `http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&liveboardGutter=8&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`,
446
+ );
447
+ });
448
+ });
449
+
419
450
  test('should set isThisPeriodInDateFiltersEnabled to true in url', async () => {
420
451
  const appEmbed = new AppEmbed(getRootEl(), {
421
452
  ...defaultViewConfig,
@@ -741,6 +772,40 @@ describe('App embed tests', () => {
741
772
  });
742
773
  });
743
774
 
775
+ test('should include starterPrompts in APP_INIT embedParams', async () => {
776
+ const starterPrompts = {
777
+ enable: true,
778
+ quick: {
779
+ label: 'Quick',
780
+ questions: [
781
+ { label: 'Q1', prompt: 'P1' },
782
+ { label: 'Q2', prompt: 'P2' },
783
+ ],
784
+ },
785
+ research: { label: 'Research' },
786
+ };
787
+ const appEmbed = new AppEmbed(getRootEl(), {
788
+ ...defaultViewConfig,
789
+ spotterChatConfig: { starterPrompts },
790
+ } as AppViewConfig);
791
+
792
+ mockMessageChannel();
793
+ appEmbed.render();
794
+
795
+ const mockPort: any = { postMessage: jest.fn() };
796
+ await executeAfterWait(() => {
797
+ postMessageToParent(
798
+ getIFrameEl().contentWindow,
799
+ { type: EmbedEvent.APP_INIT, data: {} },
800
+ mockPort,
801
+ );
802
+ });
803
+ await executeAfterWait(() => {
804
+ expect(mockPort.postMessage.mock.calls[0][0].data.embedParams.starterPrompts)
805
+ .toEqual(starterPrompts);
806
+ });
807
+ });
808
+
744
809
  test('should pass brandHeadline through spotterVizConfig in APP_INIT', async () => {
745
810
  const spotterViz = { brandName: 'MyBrand', brandHeadline: "Hi, there! I'm" };
746
811
  const appEmbed = new AppEmbed(getRootEl(), {
@@ -969,11 +1034,48 @@ describe('App embed tests', () => {
969
1034
  await executeAfterWait(() => {
970
1035
  expectUrlMatchesWithParams(
971
1036
  getIFrameSrc(),
972
- `http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&enableStarterPrompts=true${defaultParamsPost}#/home`,
1037
+ `http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&enableStarterPrompts=true&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`,
973
1038
  );
974
1039
  });
975
1040
  });
976
1041
 
1042
+ test('should set openSpotterOnLiveboardByDefault to true in url', async () => {
1043
+ const appEmbed = new AppEmbed(getRootEl(), {
1044
+ ...defaultViewConfig,
1045
+ spotterChatConfig: { openSpotterOnLiveboardByDefault: true },
1046
+ } as AppViewConfig);
1047
+ appEmbed.render();
1048
+ await executeAfterWait(() => {
1049
+ expectUrlToHaveParamsWithValues(getIFrameSrc(), {
1050
+ openSpotterOnLiveboardByDefault: 'true',
1051
+ });
1052
+ });
1053
+ });
1054
+
1055
+ test('should set openSpotterOnLiveboardByDefault to false when explicitly disabled', async () => {
1056
+ const appEmbed = new AppEmbed(getRootEl(), {
1057
+ ...defaultViewConfig,
1058
+ spotterChatConfig: { openSpotterOnLiveboardByDefault: false },
1059
+ } as AppViewConfig);
1060
+ appEmbed.render();
1061
+ await executeAfterWait(() => {
1062
+ expectUrlToHaveParamsWithValues(getIFrameSrc(), {
1063
+ openSpotterOnLiveboardByDefault: 'false',
1064
+ });
1065
+ });
1066
+ });
1067
+
1068
+ test('should not set openSpotterOnLiveboardByDefault when it is not configured', async () => {
1069
+ const appEmbed = new AppEmbed(getRootEl(), {
1070
+ ...defaultViewConfig,
1071
+ spotterChatConfig: { enableStarterPrompts: true },
1072
+ } as AppViewConfig);
1073
+ appEmbed.render();
1074
+ await executeAfterWait(() => {
1075
+ expect(getIFrameSrc()).not.toContain('openSpotterOnLiveboardByDefault');
1076
+ });
1077
+ });
1078
+
977
1079
  test('should set spotterFileUploadFileTypes in url', async () => {
978
1080
  const appEmbed = new AppEmbed(getRootEl(), {
979
1081
  ...defaultViewConfig,
@@ -2057,6 +2159,238 @@ describe('App embed tests', () => {
2057
2159
  }, 100);
2058
2160
  });
2059
2161
 
2162
+ test('should default lazy loading flags to true when fullHeight is enabled', async () => {
2163
+ const appEmbed = new AppEmbed(getRootEl(), {
2164
+ ...defaultViewConfig,
2165
+ fullHeight: true,
2166
+ } as AppViewConfig);
2167
+
2168
+ expect((appEmbed as any).viewConfig.lazyLoadingForFullHeight).toBe(true);
2169
+ expect((appEmbed as any).viewConfig.enableScrollableContainerLazyLoading).toBe(true);
2170
+ expect((appEmbed as any).viewConfig.lazyLoadingMargin).toBe('500px 0px');
2171
+
2172
+ await appEmbed.render();
2173
+
2174
+ await executeAfterWait(() => {
2175
+ const iframeSrc = getIFrameSrc();
2176
+ expect(iframeSrc).toContain('isLazyLoadingForEmbedEnabled=true');
2177
+ expect(iframeSrc).toContain('isFullHeightPinboard=true');
2178
+ expect(iframeSrc).toContain('rootMarginForLazyLoad=500px%200px');
2179
+ }, 100);
2180
+ });
2181
+
2182
+ test('should not default lazy loading flags when fullHeight is not enabled', async () => {
2183
+ const appEmbed = new AppEmbed(getRootEl(), {
2184
+ ...defaultViewConfig,
2185
+ } as AppViewConfig);
2186
+
2187
+ expect((appEmbed as any).viewConfig.lazyLoadingForFullHeight).toBeUndefined();
2188
+ expect(
2189
+ (appEmbed as any).viewConfig.enableScrollableContainerLazyLoading,
2190
+ ).toBeUndefined();
2191
+ expect((appEmbed as any).viewConfig.lazyLoadingMargin).toBeUndefined();
2192
+ });
2193
+
2194
+ test('should not write the defaults back onto the caller view config', async () => {
2195
+ const callerViewConfig = {
2196
+ ...defaultViewConfig,
2197
+ fullHeight: true,
2198
+ } as AppViewConfig;
2199
+
2200
+ new AppEmbed(getRootEl(), callerViewConfig);
2201
+
2202
+ expect(callerViewConfig.lazyLoadingForFullHeight).toBeUndefined();
2203
+ expect(callerViewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
2204
+ expect(callerViewConfig.lazyLoadingMargin).toBeUndefined();
2205
+ });
2206
+
2207
+ test('should not default lazy loading flags when fullHeight is explicitly false', async () => {
2208
+ const appEmbed = new AppEmbed(getRootEl(), {
2209
+ ...defaultViewConfig,
2210
+ fullHeight: false,
2211
+ } as AppViewConfig);
2212
+
2213
+ expect((appEmbed as any).viewConfig.lazyLoadingForFullHeight).toBeUndefined();
2214
+ expect(
2215
+ (appEmbed as any).viewConfig.enableScrollableContainerLazyLoading,
2216
+ ).toBeUndefined();
2217
+ expect((appEmbed as any).viewConfig.lazyLoadingMargin).toBeUndefined();
2218
+ });
2219
+
2220
+ test('should default lazyLoadingMargin when lazyLoadingForFullHeight is set explicitly', async () => {
2221
+ const appEmbed = new AppEmbed(getRootEl(), {
2222
+ ...defaultViewConfig,
2223
+ fullHeight: true,
2224
+ lazyLoadingForFullHeight: true,
2225
+ } as AppViewConfig);
2226
+
2227
+ expect((appEmbed as any).viewConfig.lazyLoadingMargin).toBe(
2228
+ config.DEFAULT_LAZY_LOADING_MARGIN,
2229
+ );
2230
+
2231
+ await appEmbed.render();
2232
+
2233
+ await executeAfterWait(() => {
2234
+ expect(getIFrameSrc()).toContain('rootMarginForLazyLoad=500px%200px');
2235
+ }, 100);
2236
+ });
2237
+
2238
+ test('should let an explicit lazyLoadingMargin win over the default', async () => {
2239
+ const appEmbed = new AppEmbed(getRootEl(), {
2240
+ ...defaultViewConfig,
2241
+ fullHeight: true,
2242
+ lazyLoadingMargin: '250px',
2243
+ } as AppViewConfig);
2244
+
2245
+ await appEmbed.render();
2246
+
2247
+ await executeAfterWait(() => {
2248
+ const iframeSrc = getIFrameSrc();
2249
+ expect(iframeSrc).toContain('rootMarginForLazyLoad=250px');
2250
+ expect(iframeSrc).not.toContain('rootMarginForLazyLoad=500px%200px');
2251
+ }, 100);
2252
+ });
2253
+
2254
+ test('should drop an invalid lazyLoadingMargin and log an error', async () => {
2255
+ const loggerErrorSpy = jest.spyOn(logger, 'error').mockImplementation(() => undefined);
2256
+
2257
+ const appEmbed = new AppEmbed(getRootEl(), {
2258
+ ...defaultViewConfig,
2259
+ fullHeight: true,
2260
+ lazyLoadingMargin: 'not-a-margin',
2261
+ } as AppViewConfig);
2262
+
2263
+ await appEmbed.render();
2264
+
2265
+ await executeAfterWait(() => {
2266
+ const iframeSrc = getIFrameSrc();
2267
+ expect(iframeSrc).toContain('isLazyLoadingForEmbedEnabled=true');
2268
+ expect(iframeSrc).not.toContain('rootMarginForLazyLoad');
2269
+ expect(loggerErrorSpy).toHaveBeenCalledWith(
2270
+ 'Please provide a valid lazyLoadingMargin value (e.g., "10px")',
2271
+ );
2272
+ }, 100);
2273
+ });
2274
+
2275
+ test('should track scrollable ancestors by default when only fullHeight is set', async () => {
2276
+ const scrollContainer = getRootEl();
2277
+ scrollContainer.style.overflow = 'auto';
2278
+
2279
+ const scrollContainerSpy = jest.spyOn(scrollContainer, 'addEventListener');
2280
+ const resizeObserveSpy = jest.fn();
2281
+ const resizeDisconnectSpy = jest.fn();
2282
+ (window as any).ResizeObserver = jest.fn().mockImplementation(() => ({
2283
+ observe: resizeObserveSpy,
2284
+ disconnect: resizeDisconnectSpy,
2285
+ }));
2286
+
2287
+ const appEmbed = new AppEmbed(getRootEl(), {
2288
+ ...defaultViewConfig,
2289
+ fullHeight: true,
2290
+ } as AppViewConfig);
2291
+
2292
+ await appEmbed.render();
2293
+
2294
+ await executeAfterWait(() => {
2295
+ expect(scrollContainerSpy).toHaveBeenCalledWith('scroll', expect.any(Function));
2296
+ expect(resizeObserveSpy).toHaveBeenCalledWith(scrollContainer);
2297
+ }, 100);
2298
+
2299
+ appEmbed.destroy();
2300
+ expect(resizeDisconnectSpy).toHaveBeenCalled();
2301
+
2302
+ scrollContainer.style.overflow = '';
2303
+ (window as any).ResizeObserver = originalResizeObserver;
2304
+ });
2305
+
2306
+ test('should skip ancestor tracking when enableScrollableContainerLazyLoading is false', async () => {
2307
+ const scrollContainer = getRootEl();
2308
+ scrollContainer.style.overflow = 'auto';
2309
+
2310
+ const scrollContainerSpy = jest.spyOn(scrollContainer, 'addEventListener');
2311
+ const windowSpy = jest.spyOn(window, 'addEventListener');
2312
+
2313
+ const appEmbed = new AppEmbed(getRootEl(), {
2314
+ ...defaultViewConfig,
2315
+ fullHeight: true,
2316
+ enableScrollableContainerLazyLoading: false,
2317
+ } as AppViewConfig);
2318
+
2319
+ await appEmbed.render();
2320
+
2321
+ await executeAfterWait(() => {
2322
+ expect(windowSpy).toHaveBeenCalledWith('scroll', expect.anything(), true);
2323
+ expect(scrollContainerSpy).not.toHaveBeenCalledWith('scroll', expect.any(Function));
2324
+ }, 100);
2325
+
2326
+ appEmbed.destroy();
2327
+ scrollContainer.style.overflow = '';
2328
+ });
2329
+
2330
+ test('should wire the window scroll listener to the coordinates sender by default', async () => {
2331
+ const addEventListenerSpy = jest.spyOn(window, 'addEventListener');
2332
+
2333
+ const appEmbed = new AppEmbed(getRootEl(), {
2334
+ ...defaultViewConfig,
2335
+ fullHeight: true,
2336
+ } as AppViewConfig);
2337
+
2338
+ const mockTrigger = jest
2339
+ .spyOn(appEmbed, 'trigger')
2340
+ .mockImplementation(() => Promise.resolve(undefined as any));
2341
+
2342
+ await appEmbed.render();
2343
+
2344
+ await executeAfterWait(() => {
2345
+ const scrollCall = addEventListenerSpy.mock.calls.find(
2346
+ ([eventName, , capture]) => eventName === 'scroll' && capture === true,
2347
+ );
2348
+ expect(scrollCall).toBeDefined();
2349
+
2350
+ // Call the handler the way a real scroll event would.
2351
+ (scrollCall as any)[1]();
2352
+
2353
+ expect(mockTrigger).toHaveBeenCalledWith(
2354
+ HostEvent.VisibleEmbedCoordinates,
2355
+ expect.objectContaining({ top: expect.any(Number) }),
2356
+ );
2357
+ }, 100);
2358
+
2359
+ appEmbed.destroy();
2360
+ addEventListenerSpy.mockRestore();
2361
+ });
2362
+
2363
+ test('should remove listeners on destroy when the flags come from defaults', async () => {
2364
+ const removeEventListenerSpy = jest.spyOn(window, 'removeEventListener');
2365
+
2366
+ const appEmbed = new AppEmbed(getRootEl(), {
2367
+ ...defaultViewConfig,
2368
+ fullHeight: true,
2369
+ } as AppViewConfig);
2370
+
2371
+ await appEmbed.render();
2372
+ appEmbed.destroy();
2373
+
2374
+ expect(removeEventListenerSpy).toHaveBeenCalledWith('resize', expect.anything());
2375
+ expect(removeEventListenerSpy).toHaveBeenCalledWith('scroll', expect.anything(), true);
2376
+
2377
+ removeEventListenerSpy.mockRestore();
2378
+ });
2379
+
2380
+ test('should keep an explicit false for the lazy loading flags', async () => {
2381
+ const appEmbed = new AppEmbed(getRootEl(), {
2382
+ ...defaultViewConfig,
2383
+ fullHeight: true,
2384
+ lazyLoadingForFullHeight: false,
2385
+ enableScrollableContainerLazyLoading: false,
2386
+ lazyLoadingMargin: '0px',
2387
+ } as AppViewConfig);
2388
+
2389
+ expect((appEmbed as any).viewConfig.lazyLoadingForFullHeight).toBe(false);
2390
+ expect((appEmbed as any).viewConfig.enableScrollableContainerLazyLoading).toBe(false);
2391
+ expect((appEmbed as any).viewConfig.lazyLoadingMargin).toBe('0px');
2392
+ });
2393
+
2060
2394
  test('should not set lazyLoadingForEmbed when lazyLoadingForFullHeight is enabled but fullHeight is false', async () => {
2061
2395
  const appEmbed = new AppEmbed(getRootEl(), {
2062
2396
  ...defaultViewConfig,
package/src/embed/app.ts CHANGED
@@ -10,6 +10,7 @@
10
10
 
11
11
  import { logger } from '../utils/logger';
12
12
  import { calculateVisibleElementData, getEffectiveClippingAncestors, getQueryParamString, getScrollableAncestors, isUndefined, isValidCssMargin, setParamIfDefined } from '../utils';
13
+ import { DEFAULT_LAZY_LOADING_MARGIN } from '../config';
13
14
  import {
14
15
  Param,
15
16
  DOMSelector,
@@ -22,8 +23,8 @@ import {
22
23
  SpotterFileUploadFileTypes,
23
24
  } from '../types';
24
25
  import { V1Embed } from './ts-embed';
25
- import { SpotterChatViewConfig, SpotterSidebarViewConfig, SpotterQueryMode, SpotterShareConversationConfig } from './conversation';
26
- import { buildSpotterSidebarAppInitData, buildSpotterShareConversationAppInitData } from './spotter-utils';
26
+ import { SpotterChatViewConfig, SpotterSidebarViewConfig, SpotterQueryMode, SpotterShareConversationConfig, StarterPromptsConfig } from './conversation';
27
+ import { buildSpotterSidebarAppInitData, buildSpotterShareConversationAppInitData, buildStarterPromptsAppInitData } from './spotter-utils';
27
28
  import { SpotterVizConfig, buildSpotterVizAppInitData } from './spotter-viz-utils';
28
29
 
29
30
  /**
@@ -67,6 +68,10 @@ export enum Page {
67
68
  * Collections listing page
68
69
  */
69
70
  Collections = 'collections',
71
+ /**
72
+ * Liveboard schedules listing page
73
+ */
74
+ LiveboardSchedules = 'liveboard-schedules',
70
75
  }
71
76
 
72
77
  /**
@@ -471,6 +476,11 @@ export interface AppViewConfig extends AllEmbedViewConfig {
471
476
  * `false` fetches visualizations incrementally as
472
477
  * users scroll the page to view the charts and tables.
473
478
  *
479
+ * From SDK 1.52.0, enabling `fullHeight` also turns on
480
+ * {@link lazyLoadingForFullHeight} and
481
+ * {@link enableScrollableContainerLazyLoading}, so visualizations load as
482
+ * they scroll into view. Set either flag to `false` to opt out.
483
+ *
474
484
  * Supported embed types: `AppEmbed`
475
485
  * @version SDK: 1.21.0 | ThoughtSpot: 9.4.0.cl, 9.4.0-sw
476
486
  * @example
@@ -684,11 +694,17 @@ export interface AppViewConfig extends AllEmbedViewConfig {
684
694
  isGranularXLSXCSVSchedulesEnabled?: boolean;
685
695
 
686
696
  /**
687
- * This flag is used to enable the full height lazy load data.
697
+ * Loads visualizations only as they scroll into the viewport, instead of
698
+ * loading the whole full-height Liveboard at once.
699
+ *
700
+ * From SDK 1.52.0 this is enabled automatically whenever `fullHeight` is
701
+ * `true`. On SDK 1.51.0 and earlier it defaulted to `false` and had to be
702
+ * set explicitly. Set it to `false` to load every visualization upfront.
703
+ * The flag has no effect unless `fullHeight` is enabled.
688
704
  *
689
705
  * @type {boolean}
690
706
  * @version SDK: 1.40.0 | ThoughtSpot: 10.12.0.cl
691
- * @default false
707
+ * @default true when `fullHeight` is enabled, from SDK 1.52.0
692
708
  * @example
693
709
  * ```js
694
710
  * const embed = new AppEmbed('#embed-container', {
@@ -700,28 +716,44 @@ export interface AppViewConfig extends AllEmbedViewConfig {
700
716
  */
701
717
  lazyLoadingForFullHeight?: boolean;
702
718
  /**
703
- * This flag is used to enable container-aware full height lazy loading.
719
+ * Computes the visible region of the embed against its scrollable and
720
+ * clipping ancestors, instead of treating the browser window as the only
721
+ * viewport, and tracks scroll and resize on those ancestors.
704
722
  *
705
- * Use this when the embed is rendered inside a scrollable or clipping
706
- * container instead of relying on the browser window as the only viewport.
723
+ * From SDK 1.52.0 this is enabled automatically whenever `fullHeight` is
724
+ * `true`. On SDK 1.51.0 and earlier it defaulted to `false` and had to be
725
+ * set explicitly. Set it to `false` when the page scrolls with the window
726
+ * and the embed has no clipping ancestor, to skip the extra ancestor
727
+ * tracking.
707
728
  *
708
729
  * @type {boolean}
709
- * @default false
730
+ * @default true when `fullHeight` is enabled, from SDK 1.52.0
710
731
  * @hidden
711
732
  */
712
733
  enableScrollableContainerLazyLoading?: boolean;
713
734
 
714
735
  /**
715
- * The margin to be used for lazy loading.
736
+ * How far outside the viewport a visualization starts loading, when
737
+ * {@link lazyLoadingForFullHeight} is enabled.
716
738
  *
717
739
  * For example, if the margin is set to '10px',
718
740
  * the visualization will be loaded 10px before its top edge is visible in the
719
741
  * viewport.
720
742
  *
721
- * The format is similar to CSS margin.
743
+ * The format is similar to CSS margin, so `'500px 0px'` extends the
744
+ * prefetch 500px above and below the viewport and not sideways. Accepted
745
+ * units are `px`, `em`, `rem`, `%`, `vh` and `vw`, plus bare `0` and
746
+ * `auto`; an invalid value is logged and ignored.
747
+ *
748
+ * From SDK 1.52.0 this defaults to `'500px 0px'` — roughly one
749
+ * visualization ahead of the scroll position, so a chart has usually
750
+ * finished loading by the time it scrolls into view. Use a smaller margin
751
+ * to cut warehouse queries further, or `'0px'` to load a visualization
752
+ * only once it is actually visible.
722
753
  *
723
754
  * @type {string}
724
755
  * @version SDK: 1.40.0 | ThoughtSpot: 10.12.0.cl
756
+ * @default '500px 0px' when `fullHeight` is enabled, from SDK 1.52.0
725
757
  * @example
726
758
  * ```js
727
759
  * const embed = new AppEmbed('#embed-container', {
@@ -897,13 +929,12 @@ export interface AppViewConfig extends AllEmbedViewConfig {
897
929
  * inputChatPlaceholder: 'Ask a question...',
898
930
  * hideStarterPrompts: false,
899
931
  * customStarterPrompts: [{ id: '1', displayText: 'Top products', fullPrompt: 'What are the top products by revenue?' }],
900
- * // loaderHeadline and loaderTips require SDK: 1.51.0 | ThoughtSpot Cloud: 26.8.0.cl
932
+ * // The options below require SDK: 1.51.0
901
933
  * loaderHeadline: 'Crunching the numbers...',
902
934
  * loaderTips: [
903
935
  * { label: 'Tip', text: 'try asking about revenue by region' },
904
936
  * { label: 'Tip', text: 'use natural language' },
905
937
  * ],
906
- * // liveboardBrandName, spotterBrandName, insightTileBrandName, insightTileViewPlanLabel and insightTileLoaderText require SDK: 1.52.0 | ThoughtSpot Cloud: 26.9.0.cl
907
938
  * liveboardBrandName: 'Reports',
908
939
  * spotterBrandName: 'Analyst',
909
940
  * insightTileBrandName: 'Insight card',
@@ -1002,6 +1033,7 @@ export interface AppEmbedAppInitData extends DefaultAppInitData {
1002
1033
  spotterSidebarConfig?: SpotterSidebarViewConfig;
1003
1034
  spotterVizConfig?: SpotterVizConfig;
1004
1035
  spotterShareConversationConfig?: SpotterShareConversationConfig;
1036
+ starterPrompts?: StarterPromptsConfig;
1005
1037
  };
1006
1038
  }
1007
1039
 
@@ -1022,6 +1054,16 @@ export class AppEmbed extends V1Embed {
1022
1054
  viewConfig.embedComponentType = 'AppEmbed';
1023
1055
  super(domSelector, viewConfig);
1024
1056
  if (this.viewConfig.fullHeight === true) {
1057
+ if (this.viewConfig.lazyLoadingForFullHeight === undefined) {
1058
+ this.viewConfig.lazyLoadingForFullHeight = true;
1059
+ }
1060
+ if (this.viewConfig.enableScrollableContainerLazyLoading === undefined) {
1061
+ this.viewConfig.enableScrollableContainerLazyLoading = true;
1062
+ }
1063
+ if (this.viewConfig.lazyLoadingMargin === undefined) {
1064
+ this.viewConfig.lazyLoadingMargin = DEFAULT_LAZY_LOADING_MARGIN;
1065
+ }
1066
+
1025
1067
  this.on(EmbedEvent.RouteChange, this.setIframeHeightForNonEmbedLiveboard);
1026
1068
  this.on(EmbedEvent.EmbedHeight, this.updateIFrameHeight);
1027
1069
  this.on(EmbedEvent.EmbedIframeCenter, this.embedIframeCenter);
@@ -1052,7 +1094,8 @@ export class AppEmbed extends V1Embed {
1052
1094
  this.handleError.bind(this),
1053
1095
  );
1054
1096
  const vizInitData = buildSpotterVizAppInitData(sidebarInitData, this.viewConfig);
1055
- return buildSpotterShareConversationAppInitData(vizInitData, this.viewConfig);
1097
+ const shareInitData = buildSpotterShareConversationAppInitData(vizInitData, this.viewConfig);
1098
+ return buildStarterPromptsAppInitData(shareInitData, this.viewConfig);
1056
1099
  }
1057
1100
 
1058
1101
  /**
@@ -1094,6 +1137,7 @@ export class AppEmbed extends V1Embed {
1094
1137
  enableAskSage,
1095
1138
  collapseSearchBarInitially = false,
1096
1139
  enable2ColumnLayout,
1140
+ isLiveboardAlwaysOn12ColLayout,
1097
1141
  enableCustomColumnGroups = false,
1098
1142
  dataPanelCustomGroupsAccordionInitialState = DataPanelCustomColumnGroupsAccordionState.EXPAND_ALL,
1099
1143
  collapseSearchBar = true,
@@ -1108,6 +1152,7 @@ export class AppEmbed extends V1Embed {
1108
1152
  discoveryExperience,
1109
1153
  coverAndFilterOptionInPDF,
1110
1154
  isLiveboardStylingAndGroupingEnabled,
1155
+ liveboardGutter,
1111
1156
  isPNGInScheduledEmailsEnabled = false,
1112
1157
  isLiveboardXLSXCSVDownloadEnabled,
1113
1158
  isGranularXLSXCSVSchedulesEnabled,
@@ -1190,6 +1235,7 @@ export class AppEmbed extends V1Embed {
1190
1235
  spotterFileUploadEnabled,
1191
1236
  spotterFileUploadFileTypes,
1192
1237
  enableStarterPrompts,
1238
+ openSpotterOnLiveboardByDefault,
1193
1239
  } = spotterChatConfig;
1194
1240
 
1195
1241
  setParamIfDefined(params, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
@@ -1200,6 +1246,9 @@ export class AppEmbed extends V1Embed {
1200
1246
  if (enableStarterPrompts !== undefined) {
1201
1247
  params[Param.IsStarterPromptsEnabled] = enableStarterPrompts;
1202
1248
  }
1249
+ if (openSpotterOnLiveboardByDefault !== undefined) {
1250
+ params[Param.OpenSpotterOnLiveboardByDefault] = openSpotterOnLiveboardByDefault;
1251
+ }
1203
1252
  if (spotterFileUploadFileTypes !== undefined) {
1204
1253
  params[Param.SpotterFileUploadFileTypes] = JSON.stringify(spotterFileUploadFileTypes);
1205
1254
  }
@@ -1252,6 +1301,9 @@ export class AppEmbed extends V1Embed {
1252
1301
  if (enable2ColumnLayout !== undefined) {
1253
1302
  params[Param.Enable2ColumnLayout] = enable2ColumnLayout;
1254
1303
  }
1304
+ if (isLiveboardAlwaysOn12ColLayout !== undefined) {
1305
+ params[Param.IsLiveboardAlwaysOn12ColLayout] = isLiveboardAlwaysOn12ColLayout;
1306
+ }
1255
1307
 
1256
1308
  if (enableAskSage) {
1257
1309
  params[Param.enableAskSage] = enableAskSage;
@@ -1271,6 +1323,10 @@ export class AppEmbed extends V1Embed {
1271
1323
  ] = isLiveboardStylingAndGroupingEnabled;
1272
1324
  }
1273
1325
 
1326
+ if (liveboardGutter !== undefined) {
1327
+ params[Param.LiveboardGutter] = liveboardGutter;
1328
+ }
1329
+
1274
1330
  if (isPNGInScheduledEmailsEnabled !== undefined) {
1275
1331
  params[Param.isPNGInScheduledEmailsEnabled] = isPNGInScheduledEmailsEnabled;
1276
1332
  }
@@ -1474,6 +1530,8 @@ export class AppEmbed extends V1Embed {
1474
1530
  return modularHomeExperience ? 'home/monitor-alerts' : 'insights/monitor-alerts';
1475
1531
  case Page.Collections:
1476
1532
  return 'collections';
1533
+ case Page.LiveboardSchedules:
1534
+ return 'home/liveboard-schedules';
1477
1535
  case Page.Home:
1478
1536
  default:
1479
1537
  return 'home';