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