@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
@@ -155,6 +155,7 @@ describe('App embed tests', () => {
155
155
  [app_1.Page.SpotIQ]: 'insights/results',
156
156
  [app_1.Page.Monitor]: 'insights/monitor-alerts',
157
157
  [app_1.Page.Collections]: 'collections',
158
+ [app_1.Page.LiveboardSchedules]: 'home/liveboard-schedules',
158
159
  };
159
160
  const pageIds = Object.keys(pageRouteMap);
160
161
  for (let i = 0; i < pageIds.length; i++) {
@@ -182,6 +183,7 @@ describe('App embed tests', () => {
182
183
  [app_1.Page.SpotIQ]: 'home/spotiq-analysis',
183
184
  [app_1.Page.Monitor]: 'home/monitor-alerts',
184
185
  [app_1.Page.Collections]: 'collections',
186
+ [app_1.Page.LiveboardSchedules]: 'home/liveboard-schedules',
185
187
  };
186
188
  const pageIdsForModularHomes = Object.keys(pageRouteMapForModularHome);
187
189
  for (let i = 0; i < pageIdsForModularHomes.length; i++) {
@@ -289,6 +291,16 @@ describe('App embed tests', () => {
289
291
  (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&enable2ColumnLayout=true&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`);
290
292
  });
291
293
  });
294
+ test('should set isLiveboardAlwaysOn12ColLayout to true in url', async () => {
295
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
296
+ ...defaultViewConfig,
297
+ isLiveboardAlwaysOn12ColLayout: true,
298
+ });
299
+ appEmbed.render();
300
+ await (0, test_utils_1.executeAfterWait)(() => {
301
+ (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&isLiveboardAlwaysOn12ColLayout=true&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`);
302
+ });
303
+ });
292
304
  test('should set coverAndFilterOptionInPDF to false in url', async () => {
293
305
  const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
294
306
  ...defaultViewConfig,
@@ -309,6 +321,16 @@ describe('App embed tests', () => {
309
321
  (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&isLiveboardStylingAndGroupingEnabled=true&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`);
310
322
  });
311
323
  });
324
+ test('should set liveboardGutter in url', async () => {
325
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
326
+ ...defaultViewConfig,
327
+ liveboardGutter: 8,
328
+ });
329
+ appEmbed.render();
330
+ await (0, test_utils_1.executeAfterWait)(() => {
331
+ (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&liveboardGutter=8&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`);
332
+ });
333
+ });
312
334
  test('should set isThisPeriodInDateFiltersEnabled to true in url', async () => {
313
335
  const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
314
336
  ...defaultViewConfig,
@@ -549,6 +571,33 @@ describe('App embed tests', () => {
549
571
  });
550
572
  });
551
573
  });
574
+ test('should include starterPrompts in APP_INIT embedParams', async () => {
575
+ const starterPrompts = {
576
+ enable: true,
577
+ quick: {
578
+ label: 'Quick',
579
+ questions: [
580
+ { label: 'Q1', prompt: 'P1' },
581
+ { label: 'Q2', prompt: 'P2' },
582
+ ],
583
+ },
584
+ research: { label: 'Research' },
585
+ };
586
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
587
+ ...defaultViewConfig,
588
+ spotterChatConfig: { starterPrompts },
589
+ });
590
+ (0, test_utils_1.mockMessageChannel)();
591
+ appEmbed.render();
592
+ const mockPort = { postMessage: jest.fn() };
593
+ await (0, test_utils_1.executeAfterWait)(() => {
594
+ (0, test_utils_1.postMessageToParent)((0, test_utils_1.getIFrameEl)().contentWindow, { type: types_1.EmbedEvent.APP_INIT, data: {} }, mockPort);
595
+ });
596
+ await (0, test_utils_1.executeAfterWait)(() => {
597
+ expect(mockPort.postMessage.mock.calls[0][0].data.embedParams.starterPrompts)
598
+ .toEqual(starterPrompts);
599
+ });
600
+ });
552
601
  test('should pass brandHeadline through spotterVizConfig in APP_INIT', async () => {
553
602
  const spotterViz = { brandName: 'MyBrand', brandHeadline: "Hi, there! I'm" };
554
603
  const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
@@ -725,7 +774,41 @@ describe('App embed tests', () => {
725
774
  });
726
775
  appEmbed.render();
727
776
  await (0, test_utils_1.executeAfterWait)(() => {
728
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&enableStarterPrompts=true${defaultParamsPost}#/home`);
777
+ (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&enableStarterPrompts=true&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`);
778
+ });
779
+ });
780
+ test('should set openSpotterOnLiveboardByDefault to true in url', async () => {
781
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
782
+ ...defaultViewConfig,
783
+ spotterChatConfig: { openSpotterOnLiveboardByDefault: true },
784
+ });
785
+ appEmbed.render();
786
+ await (0, test_utils_1.executeAfterWait)(() => {
787
+ (0, test_utils_1.expectUrlToHaveParamsWithValues)((0, test_utils_1.getIFrameSrc)(), {
788
+ openSpotterOnLiveboardByDefault: 'true',
789
+ });
790
+ });
791
+ });
792
+ test('should set openSpotterOnLiveboardByDefault to false when explicitly disabled', async () => {
793
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
794
+ ...defaultViewConfig,
795
+ spotterChatConfig: { openSpotterOnLiveboardByDefault: false },
796
+ });
797
+ appEmbed.render();
798
+ await (0, test_utils_1.executeAfterWait)(() => {
799
+ (0, test_utils_1.expectUrlToHaveParamsWithValues)((0, test_utils_1.getIFrameSrc)(), {
800
+ openSpotterOnLiveboardByDefault: 'false',
801
+ });
802
+ });
803
+ });
804
+ test('should not set openSpotterOnLiveboardByDefault when it is not configured', async () => {
805
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
806
+ ...defaultViewConfig,
807
+ spotterChatConfig: { enableStarterPrompts: true },
808
+ });
809
+ appEmbed.render();
810
+ await (0, test_utils_1.executeAfterWait)(() => {
811
+ expect((0, test_utils_1.getIFrameSrc)()).not.toContain('openSpotterOnLiveboardByDefault');
729
812
  });
730
813
  });
731
814
  test('should set spotterFileUploadFileTypes in url', async () => {
@@ -1502,6 +1585,175 @@ describe('App embed tests', () => {
1502
1585
  expect(iframeSrc).toContain('isFullHeightPinboard=true');
1503
1586
  }, 100);
1504
1587
  });
1588
+ test('should default lazy loading flags to true when fullHeight is enabled', async () => {
1589
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1590
+ ...defaultViewConfig,
1591
+ fullHeight: true,
1592
+ });
1593
+ expect(appEmbed.viewConfig.lazyLoadingForFullHeight).toBe(true);
1594
+ expect(appEmbed.viewConfig.enableScrollableContainerLazyLoading).toBe(true);
1595
+ expect(appEmbed.viewConfig.lazyLoadingMargin).toBe('500px 0px');
1596
+ await appEmbed.render();
1597
+ await (0, test_utils_1.executeAfterWait)(() => {
1598
+ const iframeSrc = (0, test_utils_1.getIFrameSrc)();
1599
+ expect(iframeSrc).toContain('isLazyLoadingForEmbedEnabled=true');
1600
+ expect(iframeSrc).toContain('isFullHeightPinboard=true');
1601
+ expect(iframeSrc).toContain('rootMarginForLazyLoad=500px%200px');
1602
+ }, 100);
1603
+ });
1604
+ test('should not default lazy loading flags when fullHeight is not enabled', async () => {
1605
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1606
+ ...defaultViewConfig,
1607
+ });
1608
+ expect(appEmbed.viewConfig.lazyLoadingForFullHeight).toBeUndefined();
1609
+ expect(appEmbed.viewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
1610
+ expect(appEmbed.viewConfig.lazyLoadingMargin).toBeUndefined();
1611
+ });
1612
+ test('should not write the defaults back onto the caller view config', async () => {
1613
+ const callerViewConfig = {
1614
+ ...defaultViewConfig,
1615
+ fullHeight: true,
1616
+ };
1617
+ new app_1.AppEmbed((0, test_utils_1.getRootEl)(), callerViewConfig);
1618
+ expect(callerViewConfig.lazyLoadingForFullHeight).toBeUndefined();
1619
+ expect(callerViewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
1620
+ expect(callerViewConfig.lazyLoadingMargin).toBeUndefined();
1621
+ });
1622
+ test('should not default lazy loading flags when fullHeight is explicitly false', async () => {
1623
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1624
+ ...defaultViewConfig,
1625
+ fullHeight: false,
1626
+ });
1627
+ expect(appEmbed.viewConfig.lazyLoadingForFullHeight).toBeUndefined();
1628
+ expect(appEmbed.viewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
1629
+ expect(appEmbed.viewConfig.lazyLoadingMargin).toBeUndefined();
1630
+ });
1631
+ test('should default lazyLoadingMargin when lazyLoadingForFullHeight is set explicitly', async () => {
1632
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1633
+ ...defaultViewConfig,
1634
+ fullHeight: true,
1635
+ lazyLoadingForFullHeight: true,
1636
+ });
1637
+ expect(appEmbed.viewConfig.lazyLoadingMargin).toBe(config.DEFAULT_LAZY_LOADING_MARGIN);
1638
+ await appEmbed.render();
1639
+ await (0, test_utils_1.executeAfterWait)(() => {
1640
+ expect((0, test_utils_1.getIFrameSrc)()).toContain('rootMarginForLazyLoad=500px%200px');
1641
+ }, 100);
1642
+ });
1643
+ test('should let an explicit lazyLoadingMargin win over the default', async () => {
1644
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1645
+ ...defaultViewConfig,
1646
+ fullHeight: true,
1647
+ lazyLoadingMargin: '250px',
1648
+ });
1649
+ await appEmbed.render();
1650
+ await (0, test_utils_1.executeAfterWait)(() => {
1651
+ const iframeSrc = (0, test_utils_1.getIFrameSrc)();
1652
+ expect(iframeSrc).toContain('rootMarginForLazyLoad=250px');
1653
+ expect(iframeSrc).not.toContain('rootMarginForLazyLoad=500px%200px');
1654
+ }, 100);
1655
+ });
1656
+ test('should drop an invalid lazyLoadingMargin and log an error', async () => {
1657
+ const loggerErrorSpy = jest.spyOn(logger_1.logger, 'error').mockImplementation(() => undefined);
1658
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1659
+ ...defaultViewConfig,
1660
+ fullHeight: true,
1661
+ lazyLoadingMargin: 'not-a-margin',
1662
+ });
1663
+ await appEmbed.render();
1664
+ await (0, test_utils_1.executeAfterWait)(() => {
1665
+ const iframeSrc = (0, test_utils_1.getIFrameSrc)();
1666
+ expect(iframeSrc).toContain('isLazyLoadingForEmbedEnabled=true');
1667
+ expect(iframeSrc).not.toContain('rootMarginForLazyLoad');
1668
+ expect(loggerErrorSpy).toHaveBeenCalledWith('Please provide a valid lazyLoadingMargin value (e.g., "10px")');
1669
+ }, 100);
1670
+ });
1671
+ test('should track scrollable ancestors by default when only fullHeight is set', async () => {
1672
+ const scrollContainer = (0, test_utils_1.getRootEl)();
1673
+ scrollContainer.style.overflow = 'auto';
1674
+ const scrollContainerSpy = jest.spyOn(scrollContainer, 'addEventListener');
1675
+ const resizeObserveSpy = jest.fn();
1676
+ const resizeDisconnectSpy = jest.fn();
1677
+ window.ResizeObserver = jest.fn().mockImplementation(() => ({
1678
+ observe: resizeObserveSpy,
1679
+ disconnect: resizeDisconnectSpy,
1680
+ }));
1681
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1682
+ ...defaultViewConfig,
1683
+ fullHeight: true,
1684
+ });
1685
+ await appEmbed.render();
1686
+ await (0, test_utils_1.executeAfterWait)(() => {
1687
+ expect(scrollContainerSpy).toHaveBeenCalledWith('scroll', expect.any(Function));
1688
+ expect(resizeObserveSpy).toHaveBeenCalledWith(scrollContainer);
1689
+ }, 100);
1690
+ appEmbed.destroy();
1691
+ expect(resizeDisconnectSpy).toHaveBeenCalled();
1692
+ scrollContainer.style.overflow = '';
1693
+ window.ResizeObserver = originalResizeObserver;
1694
+ });
1695
+ test('should skip ancestor tracking when enableScrollableContainerLazyLoading is false', async () => {
1696
+ const scrollContainer = (0, test_utils_1.getRootEl)();
1697
+ scrollContainer.style.overflow = 'auto';
1698
+ const scrollContainerSpy = jest.spyOn(scrollContainer, 'addEventListener');
1699
+ const windowSpy = jest.spyOn(window, 'addEventListener');
1700
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1701
+ ...defaultViewConfig,
1702
+ fullHeight: true,
1703
+ enableScrollableContainerLazyLoading: false,
1704
+ });
1705
+ await appEmbed.render();
1706
+ await (0, test_utils_1.executeAfterWait)(() => {
1707
+ expect(windowSpy).toHaveBeenCalledWith('scroll', expect.anything(), true);
1708
+ expect(scrollContainerSpy).not.toHaveBeenCalledWith('scroll', expect.any(Function));
1709
+ }, 100);
1710
+ appEmbed.destroy();
1711
+ scrollContainer.style.overflow = '';
1712
+ });
1713
+ test('should wire the window scroll listener to the coordinates sender by default', async () => {
1714
+ const addEventListenerSpy = jest.spyOn(window, 'addEventListener');
1715
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1716
+ ...defaultViewConfig,
1717
+ fullHeight: true,
1718
+ });
1719
+ const mockTrigger = jest
1720
+ .spyOn(appEmbed, 'trigger')
1721
+ .mockImplementation(() => Promise.resolve(undefined));
1722
+ await appEmbed.render();
1723
+ await (0, test_utils_1.executeAfterWait)(() => {
1724
+ const scrollCall = addEventListenerSpy.mock.calls.find(([eventName, , capture]) => eventName === 'scroll' && capture === true);
1725
+ expect(scrollCall).toBeDefined();
1726
+ // Call the handler the way a real scroll event would.
1727
+ scrollCall[1]();
1728
+ expect(mockTrigger).toHaveBeenCalledWith(types_1.HostEvent.VisibleEmbedCoordinates, expect.objectContaining({ top: expect.any(Number) }));
1729
+ }, 100);
1730
+ appEmbed.destroy();
1731
+ addEventListenerSpy.mockRestore();
1732
+ });
1733
+ test('should remove listeners on destroy when the flags come from defaults', async () => {
1734
+ const removeEventListenerSpy = jest.spyOn(window, 'removeEventListener');
1735
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1736
+ ...defaultViewConfig,
1737
+ fullHeight: true,
1738
+ });
1739
+ await appEmbed.render();
1740
+ appEmbed.destroy();
1741
+ expect(removeEventListenerSpy).toHaveBeenCalledWith('resize', expect.anything());
1742
+ expect(removeEventListenerSpy).toHaveBeenCalledWith('scroll', expect.anything(), true);
1743
+ removeEventListenerSpy.mockRestore();
1744
+ });
1745
+ test('should keep an explicit false for the lazy loading flags', async () => {
1746
+ const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1747
+ ...defaultViewConfig,
1748
+ fullHeight: true,
1749
+ lazyLoadingForFullHeight: false,
1750
+ enableScrollableContainerLazyLoading: false,
1751
+ lazyLoadingMargin: '0px',
1752
+ });
1753
+ expect(appEmbed.viewConfig.lazyLoadingForFullHeight).toBe(false);
1754
+ expect(appEmbed.viewConfig.enableScrollableContainerLazyLoading).toBe(false);
1755
+ expect(appEmbed.viewConfig.lazyLoadingMargin).toBe('0px');
1756
+ });
1505
1757
  test('should not set lazyLoadingForEmbed when lazyLoadingForFullHeight is enabled but fullHeight is false', async () => {
1506
1758
  const appEmbed = new app_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1507
1759
  ...defaultViewConfig,