@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
@@ -7,6 +7,8 @@ import * as processTriggerInstance from '../utils/processTrigger';
7
7
  import * as auth from '../auth';
8
8
  import * as previewService from '../utils/graphql/preview-service';
9
9
  import * as SessionInfoService from '../utils/sessionInfoService';
10
+ import { logger } from '../utils/logger';
11
+ import { DEFAULT_LAZY_LOADING_MARGIN } from '../config';
10
12
  const defaultViewConfig = {
11
13
  frameParams: {
12
14
  width: 1280,
@@ -106,6 +108,22 @@ describe('Liveboard/viz embed tests', () => {
106
108
  expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true&${defaultParamsWithoutHiddenActions}&hideAction=[%22${Action.ReportError}%22,%22${Action.DownloadAsCsv}%22,%22${Action.DownloadAsPdf}%22,%22${Action.DownloadAsXlsx}%22]${prefixParams}#/embed/viz/${liveboardId}`);
107
109
  });
108
110
  });
111
+ test('should hide and disable the Spotter button on the Liveboard header', async () => {
112
+ expect(Action.SpotterOnLiveboard).toBe('spotterOnLiveboard');
113
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
114
+ hiddenActions: [Action.SpotterOnLiveboard],
115
+ disabledActions: [Action.SpotterOnLiveboard],
116
+ ...defaultViewConfig,
117
+ liveboardId,
118
+ });
119
+ liveboardEmbed.render();
120
+ await executeAfterWait(() => {
121
+ expectUrlToHaveParamsWithValues(getIFrameSrc(), {
122
+ hideAction: JSON.stringify([Action.ReportError, Action.SpotterOnLiveboard]),
123
+ disableAction: JSON.stringify([Action.SpotterOnLiveboard]),
124
+ });
125
+ });
126
+ });
109
127
  test('should set visible actions', async () => {
110
128
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
111
129
  visibleActions: [Action.DownloadAsCsv, Action.DownloadAsPdf, Action.DownloadAsXlsx],
@@ -141,6 +159,17 @@ describe('Liveboard/viz embed tests', () => {
141
159
  expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&enable2ColumnLayout=true${prefixParams}#/embed/viz/${liveboardId}`);
142
160
  });
143
161
  });
162
+ test('should set isLiveboardAlwaysOn12ColLayout to true in url', async () => {
163
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
164
+ isLiveboardAlwaysOn12ColLayout: true,
165
+ ...defaultViewConfig,
166
+ liveboardId,
167
+ });
168
+ liveboardEmbed.render();
169
+ await executeAfterWait(() => {
170
+ expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&isLiveboardAlwaysOn12ColLayout=true${prefixParams}#/embed/viz/${liveboardId}`);
171
+ });
172
+ });
144
173
  test('should set isLiveboardStylingAndGroupingEnabled to true in url (deprecated, use isLiveboardMasterpiecesEnabled)', async () => {
145
174
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
146
175
  isLiveboardStylingAndGroupingEnabled: true,
@@ -152,6 +181,28 @@ describe('Liveboard/viz embed tests', () => {
152
181
  expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&isLiveboardStylingAndGroupingEnabled=true${prefixParams}#/embed/viz/${liveboardId}`);
153
182
  });
154
183
  });
184
+ test('should set liveboardGutter in url', async () => {
185
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
186
+ ...defaultViewConfig,
187
+ liveboardId,
188
+ liveboardGutter: 8,
189
+ });
190
+ liveboardEmbed.render();
191
+ await executeAfterWait(() => {
192
+ expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&liveboardGutter=8${prefixParams}#/embed/viz/${liveboardId}`);
193
+ });
194
+ });
195
+ test('should set liveboardGutter to 0 in url', async () => {
196
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
197
+ ...defaultViewConfig,
198
+ liveboardId,
199
+ liveboardGutter: 0,
200
+ });
201
+ liveboardEmbed.render();
202
+ await executeAfterWait(() => {
203
+ expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&liveboardGutter=0${prefixParams}#/embed/viz/${liveboardId}`);
204
+ });
205
+ });
155
206
  test('should set isThisPeriodInDateFiltersEnabled to true in url', async () => {
156
207
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
157
208
  ...defaultViewConfig,
@@ -969,6 +1020,37 @@ describe('Liveboard/viz embed tests', () => {
969
1020
  expect(onSpy).toHaveBeenCalledWith(HostEvent.Navigate, 'embed/viz/lb1/viz1');
970
1021
  }, 1002);
971
1022
  });
1023
+ test('navigateToLiveboard should call preRender when preRenderConfig.preRenderId is set', () => {
1024
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1025
+ ...defaultViewConfig,
1026
+ liveboardId,
1027
+ preRenderConfig: {
1028
+ preRenderId: 'config-pre-render-id',
1029
+ },
1030
+ });
1031
+ const preRenderSpy = jest
1032
+ .spyOn(liveboardEmbed, 'preRender')
1033
+ .mockResolvedValue(liveboardEmbed);
1034
+ liveboardEmbed.navigateToLiveboard('lb1');
1035
+ expect(preRenderSpy).toHaveBeenCalledTimes(1);
1036
+ expect(preRenderSpy).toHaveBeenCalledWith(true);
1037
+ });
1038
+ test('navigateToLiveboard should prefer preRenderConfig.preRenderId over top-level preRenderId', () => {
1039
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1040
+ ...defaultViewConfig,
1041
+ liveboardId,
1042
+ preRenderId: 'top-level-id',
1043
+ preRenderConfig: {
1044
+ preRenderId: 'config-level-id',
1045
+ },
1046
+ });
1047
+ const preRenderSpy = jest
1048
+ .spyOn(liveboardEmbed, 'preRender')
1049
+ .mockResolvedValue(liveboardEmbed);
1050
+ liveboardEmbed.navigateToLiveboard('lb1');
1051
+ expect(preRenderSpy).toHaveBeenCalledTimes(1);
1052
+ expect(preRenderSpy).toHaveBeenCalledWith(true);
1053
+ });
972
1054
  test('should set runtime parametere values in url params', async () => {
973
1055
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
974
1056
  ...defaultViewConfig,
@@ -1019,6 +1101,43 @@ describe('Liveboard/viz embed tests', () => {
1019
1101
  expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}${prefixParams}&enableStarterPrompts=true#/embed/viz/${liveboardId}`);
1020
1102
  });
1021
1103
  });
1104
+ test('should set openSpotterOnLiveboardByDefault parameter in url params', async () => {
1105
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1106
+ ...defaultViewConfig,
1107
+ liveboardId,
1108
+ spotterChatConfig: { openSpotterOnLiveboardByDefault: true },
1109
+ });
1110
+ await liveboardEmbed.render();
1111
+ await executeAfterWait(() => {
1112
+ expectUrlToHaveParamsWithValues(getIFrameSrc(), {
1113
+ openSpotterOnLiveboardByDefault: 'true',
1114
+ });
1115
+ });
1116
+ });
1117
+ test('should set openSpotterOnLiveboardByDefault to false when explicitly disabled', async () => {
1118
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1119
+ ...defaultViewConfig,
1120
+ liveboardId,
1121
+ spotterChatConfig: { openSpotterOnLiveboardByDefault: false },
1122
+ });
1123
+ await liveboardEmbed.render();
1124
+ await executeAfterWait(() => {
1125
+ expectUrlToHaveParamsWithValues(getIFrameSrc(), {
1126
+ openSpotterOnLiveboardByDefault: 'false',
1127
+ });
1128
+ });
1129
+ });
1130
+ test('should not set openSpotterOnLiveboardByDefault when it is not configured', async () => {
1131
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1132
+ ...defaultViewConfig,
1133
+ liveboardId,
1134
+ spotterChatConfig: { enableStarterPrompts: true },
1135
+ });
1136
+ await liveboardEmbed.render();
1137
+ await executeAfterWait(() => {
1138
+ expect(getIFrameSrc()).not.toContain('openSpotterOnLiveboardByDefault');
1139
+ });
1140
+ });
1022
1141
  test('should set spotterFileUploadFileTypes parameter in url params', async () => {
1023
1142
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1024
1143
  ...defaultViewConfig,
@@ -1136,6 +1255,34 @@ describe('Liveboard/viz embed tests', () => {
1136
1255
  });
1137
1256
  });
1138
1257
  });
1258
+ test('should include starterPrompts in APP_INIT embedParams', async () => {
1259
+ const starterPrompts = {
1260
+ enable: true,
1261
+ quick: {
1262
+ label: 'Quick',
1263
+ questions: [
1264
+ { label: 'Q1', prompt: 'P1' },
1265
+ { label: 'Q2', prompt: 'P2' },
1266
+ ],
1267
+ },
1268
+ research: { label: 'Research' },
1269
+ };
1270
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1271
+ ...defaultViewConfig,
1272
+ liveboardId,
1273
+ spotterChatConfig: { starterPrompts },
1274
+ });
1275
+ mockMessageChannel();
1276
+ await liveboardEmbed.render();
1277
+ const mockPort = { postMessage: jest.fn() };
1278
+ await executeAfterWait(() => {
1279
+ postMessageToParent(getIFrameEl().contentWindow, { type: EmbedEvent.APP_INIT, data: {} }, mockPort);
1280
+ });
1281
+ await executeAfterWait(() => {
1282
+ expect(mockPort.postMessage.mock.calls[0][0].data.embedParams.starterPrompts)
1283
+ .toEqual(starterPrompts);
1284
+ });
1285
+ });
1139
1286
  test('should pass brandHeadline through spotterVizConfig in APP_INIT', async () => {
1140
1287
  const spotterViz = { brandName: 'MyBrand', brandHeadline: "Hi, there! I'm" };
1141
1288
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
@@ -1458,6 +1605,188 @@ describe('Liveboard/viz embed tests', () => {
1458
1605
  expect(iframeSrc).toContain('isFullHeightPinboard=true');
1459
1606
  }, 100);
1460
1607
  });
1608
+ test('should default lazy loading flags to true when fullHeight is enabled', async () => {
1609
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1610
+ ...defaultViewConfig,
1611
+ liveboardId,
1612
+ fullHeight: true,
1613
+ });
1614
+ expect(liveboardEmbed.viewConfig.lazyLoadingForFullHeight).toBe(true);
1615
+ expect(liveboardEmbed.viewConfig.enableScrollableContainerLazyLoading).toBe(true);
1616
+ expect(liveboardEmbed.viewConfig.lazyLoadingMargin).toBe('500px 0px');
1617
+ await liveboardEmbed.render();
1618
+ await executeAfterWait(() => {
1619
+ const iframeSrc = getIFrameSrc();
1620
+ expect(iframeSrc).toContain('isLazyLoadingForEmbedEnabled=true');
1621
+ expect(iframeSrc).toContain('isFullHeightPinboard=true');
1622
+ expect(iframeSrc).toContain('rootMarginForLazyLoad=500px%200px');
1623
+ }, 100);
1624
+ });
1625
+ test('should not default lazy loading flags when fullHeight is not enabled', async () => {
1626
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1627
+ ...defaultViewConfig,
1628
+ liveboardId,
1629
+ });
1630
+ expect(liveboardEmbed.viewConfig.lazyLoadingForFullHeight).toBeUndefined();
1631
+ expect(liveboardEmbed.viewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
1632
+ expect(liveboardEmbed.viewConfig.lazyLoadingMargin).toBeUndefined();
1633
+ });
1634
+ test('should not write the defaults back onto the caller view config', async () => {
1635
+ const callerViewConfig = {
1636
+ ...defaultViewConfig,
1637
+ liveboardId,
1638
+ fullHeight: true,
1639
+ };
1640
+ new LiveboardEmbed(getRootEl(), callerViewConfig);
1641
+ expect(callerViewConfig.lazyLoadingForFullHeight).toBeUndefined();
1642
+ expect(callerViewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
1643
+ expect(callerViewConfig.lazyLoadingMargin).toBeUndefined();
1644
+ });
1645
+ test('should not default lazy loading flags when fullHeight is explicitly false', async () => {
1646
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1647
+ ...defaultViewConfig,
1648
+ liveboardId,
1649
+ fullHeight: false,
1650
+ });
1651
+ expect(liveboardEmbed.viewConfig.lazyLoadingForFullHeight).toBeUndefined();
1652
+ expect(liveboardEmbed.viewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
1653
+ expect(liveboardEmbed.viewConfig.lazyLoadingMargin).toBeUndefined();
1654
+ });
1655
+ test('should default lazyLoadingMargin when lazyLoadingForFullHeight is set explicitly', async () => {
1656
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1657
+ ...defaultViewConfig,
1658
+ liveboardId,
1659
+ fullHeight: true,
1660
+ lazyLoadingForFullHeight: true,
1661
+ });
1662
+ expect(liveboardEmbed.viewConfig.lazyLoadingMargin).toBe(DEFAULT_LAZY_LOADING_MARGIN);
1663
+ await liveboardEmbed.render();
1664
+ await executeAfterWait(() => {
1665
+ expect(getIFrameSrc()).toContain('rootMarginForLazyLoad=500px%200px');
1666
+ }, 100);
1667
+ });
1668
+ test('should let an explicit lazyLoadingMargin win over the default', async () => {
1669
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1670
+ ...defaultViewConfig,
1671
+ liveboardId,
1672
+ fullHeight: true,
1673
+ lazyLoadingMargin: '250px',
1674
+ });
1675
+ await liveboardEmbed.render();
1676
+ await executeAfterWait(() => {
1677
+ const iframeSrc = getIFrameSrc();
1678
+ expect(iframeSrc).toContain('rootMarginForLazyLoad=250px');
1679
+ expect(iframeSrc).not.toContain('rootMarginForLazyLoad=500px%200px');
1680
+ }, 100);
1681
+ });
1682
+ test('should drop an invalid lazyLoadingMargin and log an error', async () => {
1683
+ const loggerErrorSpy = jest.spyOn(logger, 'error').mockImplementation(() => undefined);
1684
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1685
+ ...defaultViewConfig,
1686
+ liveboardId,
1687
+ fullHeight: true,
1688
+ lazyLoadingMargin: 'not-a-margin',
1689
+ });
1690
+ await liveboardEmbed.render();
1691
+ await executeAfterWait(() => {
1692
+ const iframeSrc = getIFrameSrc();
1693
+ expect(iframeSrc).toContain('isLazyLoadingForEmbedEnabled=true');
1694
+ expect(iframeSrc).not.toContain('rootMarginForLazyLoad');
1695
+ expect(loggerErrorSpy).toHaveBeenCalledWith('Please provide a valid lazyLoadingMargin value (e.g., "10px")');
1696
+ }, 100);
1697
+ });
1698
+ test('should track scrollable ancestors by default when only fullHeight is set', async () => {
1699
+ const scrollContainer = getRootEl();
1700
+ scrollContainer.style.overflow = 'auto';
1701
+ const scrollContainerSpy = jest.spyOn(scrollContainer, 'addEventListener');
1702
+ const resizeObserveSpy = jest.fn();
1703
+ const resizeDisconnectSpy = jest.fn();
1704
+ const originalResizeObserver = window.ResizeObserver;
1705
+ window.ResizeObserver = jest.fn().mockImplementation(() => ({
1706
+ observe: resizeObserveSpy,
1707
+ disconnect: resizeDisconnectSpy,
1708
+ }));
1709
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1710
+ ...defaultViewConfig,
1711
+ liveboardId,
1712
+ fullHeight: true,
1713
+ });
1714
+ await liveboardEmbed.render();
1715
+ await executeAfterWait(() => {
1716
+ expect(scrollContainerSpy).toHaveBeenCalledWith('scroll', expect.any(Function));
1717
+ expect(resizeObserveSpy).toHaveBeenCalledWith(scrollContainer);
1718
+ }, 100);
1719
+ liveboardEmbed.destroy();
1720
+ expect(resizeDisconnectSpy).toHaveBeenCalled();
1721
+ scrollContainer.style.overflow = '';
1722
+ window.ResizeObserver = originalResizeObserver;
1723
+ });
1724
+ test('should skip ancestor tracking when enableScrollableContainerLazyLoading is false', async () => {
1725
+ const scrollContainer = getRootEl();
1726
+ scrollContainer.style.overflow = 'auto';
1727
+ const scrollContainerSpy = jest.spyOn(scrollContainer, 'addEventListener');
1728
+ const windowSpy = jest.spyOn(window, 'addEventListener');
1729
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1730
+ ...defaultViewConfig,
1731
+ liveboardId,
1732
+ fullHeight: true,
1733
+ enableScrollableContainerLazyLoading: false,
1734
+ });
1735
+ await liveboardEmbed.render();
1736
+ await executeAfterWait(() => {
1737
+ expect(windowSpy).toHaveBeenCalledWith('scroll', expect.anything(), true);
1738
+ expect(scrollContainerSpy).not.toHaveBeenCalledWith('scroll', expect.any(Function));
1739
+ }, 100);
1740
+ liveboardEmbed.destroy();
1741
+ scrollContainer.style.overflow = '';
1742
+ });
1743
+ test('should wire the window scroll listener to the coordinates sender by default', async () => {
1744
+ const addEventListenerSpy = jest.spyOn(window, 'addEventListener');
1745
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1746
+ ...defaultViewConfig,
1747
+ liveboardId,
1748
+ fullHeight: true,
1749
+ });
1750
+ const mockTrigger = jest
1751
+ .spyOn(liveboardEmbed, 'trigger')
1752
+ .mockImplementation(() => Promise.resolve(undefined));
1753
+ await liveboardEmbed.render();
1754
+ await executeAfterWait(() => {
1755
+ const scrollCall = addEventListenerSpy.mock.calls.find(([eventName, , capture]) => eventName === 'scroll' && capture === true);
1756
+ expect(scrollCall).toBeDefined();
1757
+ // Call the handler the way a real scroll event would.
1758
+ scrollCall[1]();
1759
+ expect(mockTrigger).toHaveBeenCalledWith(HostEvent.VisibleEmbedCoordinates, expect.objectContaining({ top: expect.any(Number) }));
1760
+ }, 100);
1761
+ liveboardEmbed.destroy();
1762
+ addEventListenerSpy.mockRestore();
1763
+ });
1764
+ test('should remove listeners on destroy when the flags come from defaults', async () => {
1765
+ const removeEventListenerSpy = jest.spyOn(window, 'removeEventListener');
1766
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1767
+ ...defaultViewConfig,
1768
+ liveboardId,
1769
+ fullHeight: true,
1770
+ });
1771
+ await liveboardEmbed.render();
1772
+ liveboardEmbed.destroy();
1773
+ expect(removeEventListenerSpy).toHaveBeenCalledWith('resize', expect.anything());
1774
+ expect(removeEventListenerSpy).toHaveBeenCalledWith('scroll', expect.anything(), true);
1775
+ removeEventListenerSpy.mockRestore();
1776
+ });
1777
+ test('should keep an explicit false for the lazy loading flags', async () => {
1778
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1779
+ ...defaultViewConfig,
1780
+ liveboardId,
1781
+ fullHeight: true,
1782
+ lazyLoadingForFullHeight: false,
1783
+ enableScrollableContainerLazyLoading: false,
1784
+ lazyLoadingMargin: '0px',
1785
+ });
1786
+ expect(liveboardEmbed.viewConfig.lazyLoadingForFullHeight).toBe(false);
1787
+ expect(liveboardEmbed.viewConfig.enableScrollableContainerLazyLoading).toBe(false);
1788
+ expect(liveboardEmbed.viewConfig.lazyLoadingMargin).toBe('0px');
1789
+ });
1461
1790
  test('should not set lazyLoadingForEmbed when lazyLoadingForFullHeight is enabled but fullHeight is false', async () => {
1462
1791
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1463
1792
  ...defaultViewConfig,
@@ -1522,7 +1851,7 @@ describe('Liveboard/viz embed tests', () => {
1522
1851
  width: 650,
1523
1852
  });
1524
1853
  });
1525
- test('should send correct visible data when RequestVisibleEmbedCoordinates is triggered', async () => {
1854
+ test('should send visible data when fullHeight is enabled and lazyLoadingForFullHeight is omitted', async () => {
1526
1855
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1527
1856
  ...defaultViewConfig,
1528
1857
  liveboardId,
@@ -1533,7 +1862,7 @@ describe('Liveboard/viz embed tests', () => {
1533
1862
  await liveboardEmbed.render();
1534
1863
  // Trigger the lazy load data calculation
1535
1864
  liveboardEmbed.sendFullHeightLazyLoadData();
1536
- expect(mockTrigger).not.toHaveBeenCalledWith(HostEvent.VisibleEmbedCoordinates, {
1865
+ expect(mockTrigger).toHaveBeenCalledWith(HostEvent.VisibleEmbedCoordinates, {
1537
1866
  top: 0,
1538
1867
  height: 500,
1539
1868
  left: 0,
@@ -1864,5 +2193,23 @@ describe('LiveboardEmbed updatedSpotterExperience tests', () => {
1864
2193
  expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}${prefixParams}&updatedSpotterExperience=false#/embed/viz/${liveboardId}`);
1865
2194
  });
1866
2195
  });
2196
+ describe('trigger typing contracts (compile-time)', () => {
2197
+ it('infers typed response for no-payload calls through the LiveboardEmbed override', () => {
2198
+ const embed = new LiveboardEmbed(getRootEl(), {
2199
+ liveboardId: 'test-liveboard-id',
2200
+ });
2201
+ const getTabs = () => embed.trigger(HostEvent.GetTabs);
2202
+ const tabsIsTyped = false;
2203
+ const tabsHasContractFields = true;
2204
+ const probeUnknownField = (r) =>
2205
+ // @ts-expect-error — field not on the GetTabs contract (was silent when `any`)
2206
+ r.tabCount;
2207
+ void probeUnknownField;
2208
+ const reload = () => embed.trigger(HostEvent.Reload);
2209
+ const reloadStaysAny = true;
2210
+ expect([tabsIsTyped, tabsHasContractFields, reloadStaysAny])
2211
+ .toEqual([false, true, true]);
2212
+ });
2213
+ });
1867
2214
  });
1868
2215
  //# sourceMappingURL=liveboard.spec.js.map