@thoughtspot/visual-embed-sdk 1.50.0 → 1.51.0-test

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 (285) 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 +122 -0
  7. package/cjs/src/css-variables.d.ts.map +1 -1
  8. package/cjs/src/embed/app.d.ts +176 -24
  9. package/cjs/src/embed/app.d.ts.map +1 -1
  10. package/cjs/src/embed/app.js +86 -38
  11. package/cjs/src/embed/app.js.map +1 -1
  12. package/cjs/src/embed/app.spec.js +672 -150
  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 +401 -2
  17. package/cjs/src/embed/conversation.d.ts.map +1 -1
  18. package/cjs/src/embed/conversation.js +32 -16
  19. package/cjs/src/embed/conversation.js.map +1 -1
  20. package/cjs/src/embed/conversation.spec.js +346 -17
  21. package/cjs/src/embed/conversation.spec.js.map +1 -1
  22. package/cjs/src/embed/events.spec.js +638 -0
  23. package/cjs/src/embed/events.spec.js.map +1 -1
  24. package/cjs/src/embed/host-events.spec.js +187 -0
  25. package/cjs/src/embed/host-events.spec.js.map +1 -1
  26. package/cjs/src/embed/hostEventClient/contracts.d.ts +51 -14
  27. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  28. package/cjs/src/embed/hostEventClient/contracts.js +11 -1
  29. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  30. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +2 -1
  31. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  32. package/cjs/src/embed/hostEventClient/host-event-client.js +9 -0
  33. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  34. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +236 -0
  35. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  36. package/cjs/src/embed/hostEventClient/utils.d.ts +2 -0
  37. package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
  38. package/cjs/src/embed/hostEventClient/utils.js +32 -2
  39. package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
  40. package/cjs/src/embed/hostEventClient/utils.spec.js +178 -0
  41. package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -1
  42. package/cjs/src/embed/liveboard.d.ts +81 -13
  43. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  44. package/cjs/src/embed/liveboard.js +50 -9
  45. package/cjs/src/embed/liveboard.js.map +1 -1
  46. package/cjs/src/embed/liveboard.spec.js +432 -4
  47. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  48. package/cjs/src/embed/spotter-utils.d.ts +15 -1
  49. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  50. package/cjs/src/embed/spotter-utils.js +28 -1
  51. package/cjs/src/embed/spotter-utils.js.map +1 -1
  52. package/cjs/src/embed/spotter-utils.spec.js +129 -0
  53. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  54. package/cjs/src/embed/spotter-viz-utils.d.ts +37 -4
  55. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  56. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  57. package/cjs/src/embed/spotter-viz-utils.spec.js +17 -0
  58. package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -1
  59. package/cjs/src/embed/ts-embed.d.ts +16 -8
  60. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  61. package/cjs/src/embed/ts-embed.js +96 -37
  62. package/cjs/src/embed/ts-embed.js.map +1 -1
  63. package/cjs/src/embed/ts-embed.spec.js +683 -3
  64. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  65. package/cjs/src/errors.d.ts +1 -0
  66. package/cjs/src/errors.d.ts.map +1 -1
  67. package/cjs/src/errors.js +1 -0
  68. package/cjs/src/errors.js.map +1 -1
  69. package/cjs/src/index.d.ts +3 -3
  70. package/cjs/src/index.d.ts.map +1 -1
  71. package/cjs/src/index.js +4 -2
  72. package/cjs/src/index.js.map +1 -1
  73. package/cjs/src/mixpanel-service.d.ts +4 -0
  74. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  75. package/cjs/src/mixpanel-service.js +4 -0
  76. package/cjs/src/mixpanel-service.js.map +1 -1
  77. package/cjs/src/react/all-types-export.d.ts +1 -1
  78. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  79. package/cjs/src/react/all-types-export.js +2 -1
  80. package/cjs/src/react/all-types-export.js.map +1 -1
  81. package/cjs/src/react/all-types-export.parity.spec.d.ts +2 -0
  82. package/cjs/src/react/all-types-export.parity.spec.d.ts.map +1 -0
  83. package/cjs/src/react/all-types-export.parity.spec.js +194 -0
  84. package/cjs/src/react/all-types-export.parity.spec.js.map +1 -0
  85. package/cjs/src/react/index.d.ts +66 -32
  86. package/cjs/src/react/index.d.ts.map +1 -1
  87. package/cjs/src/react/index.js +5 -3
  88. package/cjs/src/react/index.js.map +1 -1
  89. package/cjs/src/react/index.spec.js +101 -0
  90. package/cjs/src/react/index.spec.js.map +1 -1
  91. package/cjs/src/react/util.spec.js +251 -0
  92. package/cjs/src/react/util.spec.js.map +1 -1
  93. package/cjs/src/types.d.ts +902 -28
  94. package/cjs/src/types.d.ts.map +1 -1
  95. package/cjs/src/types.js +701 -14
  96. package/cjs/src/types.js.map +1 -1
  97. package/cjs/src/utils/processData.spec.js +93 -0
  98. package/cjs/src/utils/processData.spec.js.map +1 -1
  99. package/cjs/src/utils/processTrigger.spec.js +61 -0
  100. package/cjs/src/utils/processTrigger.spec.js.map +1 -1
  101. package/cjs/src/utils.spec.js +4 -0
  102. package/cjs/src/utils.spec.js.map +1 -1
  103. package/dist/{index-B5xoN6Cp.js → index-Bivg-mDx.js} +1 -1
  104. package/dist/src/config.d.ts +1 -0
  105. package/dist/src/config.d.ts.map +1 -1
  106. package/dist/src/css-variables.d.ts +122 -0
  107. package/dist/src/css-variables.d.ts.map +1 -1
  108. package/dist/src/embed/app.d.ts +176 -24
  109. package/dist/src/embed/app.d.ts.map +1 -1
  110. package/dist/src/embed/base.d.ts +1 -1
  111. package/dist/src/embed/conversation.d.ts +401 -2
  112. package/dist/src/embed/conversation.d.ts.map +1 -1
  113. package/dist/src/embed/hostEventClient/contracts.d.ts +51 -14
  114. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  115. package/dist/src/embed/hostEventClient/host-event-client.d.ts +2 -1
  116. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  117. package/dist/src/embed/hostEventClient/utils.d.ts +2 -0
  118. package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
  119. package/dist/src/embed/liveboard.d.ts +81 -13
  120. package/dist/src/embed/liveboard.d.ts.map +1 -1
  121. package/dist/src/embed/spotter-utils.d.ts +15 -1
  122. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  123. package/dist/src/embed/spotter-viz-utils.d.ts +37 -4
  124. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  125. package/dist/src/embed/ts-embed.d.ts +16 -8
  126. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  127. package/dist/src/errors.d.ts +1 -0
  128. package/dist/src/errors.d.ts.map +1 -1
  129. package/dist/src/index.d.ts +3 -3
  130. package/dist/src/index.d.ts.map +1 -1
  131. package/dist/src/mixpanel-service.d.ts +4 -0
  132. package/dist/src/mixpanel-service.d.ts.map +1 -1
  133. package/dist/src/react/all-types-export.d.ts +1 -1
  134. package/dist/src/react/all-types-export.d.ts.map +1 -1
  135. package/dist/src/react/all-types-export.parity.spec.d.ts +2 -0
  136. package/dist/src/react/all-types-export.parity.spec.d.ts.map +1 -0
  137. package/dist/src/react/index.d.ts +66 -32
  138. package/dist/src/react/index.d.ts.map +1 -1
  139. package/dist/src/types.d.ts +902 -28
  140. package/dist/src/types.d.ts.map +1 -1
  141. package/dist/tsembed-react.es.js +1269 -206
  142. package/dist/tsembed-react.js +1268 -205
  143. package/dist/tsembed.es.js +1364 -304
  144. package/dist/tsembed.js +1362 -302
  145. package/dist/visual-embed-sdk-react-full.d.ts +1867 -157
  146. package/dist/visual-embed-sdk-react.d.ts +1872 -161
  147. package/dist/visual-embed-sdk.d.ts +1815 -127
  148. package/lib/package.json +1 -1
  149. package/lib/src/config.d.ts +1 -0
  150. package/lib/src/config.d.ts.map +1 -1
  151. package/lib/src/config.js +1 -0
  152. package/lib/src/config.js.map +1 -1
  153. package/lib/src/css-variables.d.ts +122 -0
  154. package/lib/src/css-variables.d.ts.map +1 -1
  155. package/lib/src/embed/app.d.ts +176 -24
  156. package/lib/src/embed/app.d.ts.map +1 -1
  157. package/lib/src/embed/app.js +87 -39
  158. package/lib/src/embed/app.js.map +1 -1
  159. package/lib/src/embed/app.spec.js +673 -151
  160. package/lib/src/embed/app.spec.js.map +1 -1
  161. package/lib/src/embed/base.d.ts +1 -1
  162. package/lib/src/embed/base.js +1 -1
  163. package/lib/src/embed/conversation.d.ts +401 -2
  164. package/lib/src/embed/conversation.d.ts.map +1 -1
  165. package/lib/src/embed/conversation.js +33 -17
  166. package/lib/src/embed/conversation.js.map +1 -1
  167. package/lib/src/embed/conversation.spec.js +347 -18
  168. package/lib/src/embed/conversation.spec.js.map +1 -1
  169. package/lib/src/embed/events.spec.js +638 -0
  170. package/lib/src/embed/events.spec.js.map +1 -1
  171. package/lib/src/embed/host-events.spec.js +188 -1
  172. package/lib/src/embed/host-events.spec.js.map +1 -1
  173. package/lib/src/embed/hostEventClient/contracts.d.ts +51 -14
  174. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  175. package/lib/src/embed/hostEventClient/contracts.js +10 -0
  176. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  177. package/lib/src/embed/hostEventClient/host-event-client.d.ts +2 -1
  178. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  179. package/lib/src/embed/hostEventClient/host-event-client.js +10 -1
  180. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  181. package/lib/src/embed/hostEventClient/host-event-client.spec.js +236 -0
  182. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  183. package/lib/src/embed/hostEventClient/utils.d.ts +2 -0
  184. package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
  185. package/lib/src/embed/hostEventClient/utils.js +28 -1
  186. package/lib/src/embed/hostEventClient/utils.js.map +1 -1
  187. package/lib/src/embed/hostEventClient/utils.spec.js +179 -1
  188. package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -1
  189. package/lib/src/embed/liveboard.d.ts +81 -13
  190. package/lib/src/embed/liveboard.d.ts.map +1 -1
  191. package/lib/src/embed/liveboard.js +50 -9
  192. package/lib/src/embed/liveboard.js.map +1 -1
  193. package/lib/src/embed/liveboard.spec.js +432 -4
  194. package/lib/src/embed/liveboard.spec.js.map +1 -1
  195. package/lib/src/embed/spotter-utils.d.ts +15 -1
  196. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  197. package/lib/src/embed/spotter-utils.js +25 -0
  198. package/lib/src/embed/spotter-utils.js.map +1 -1
  199. package/lib/src/embed/spotter-utils.spec.js +130 -1
  200. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  201. package/lib/src/embed/spotter-viz-utils.d.ts +37 -4
  202. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  203. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  204. package/lib/src/embed/spotter-viz-utils.spec.js +17 -0
  205. package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -1
  206. package/lib/src/embed/ts-embed.d.ts +16 -8
  207. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  208. package/lib/src/embed/ts-embed.js +96 -37
  209. package/lib/src/embed/ts-embed.js.map +1 -1
  210. package/lib/src/embed/ts-embed.spec.js +683 -3
  211. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  212. package/lib/src/errors.d.ts +1 -0
  213. package/lib/src/errors.d.ts.map +1 -1
  214. package/lib/src/errors.js +1 -0
  215. package/lib/src/errors.js.map +1 -1
  216. package/lib/src/index.d.ts +3 -3
  217. package/lib/src/index.d.ts.map +1 -1
  218. package/lib/src/index.js +3 -3
  219. package/lib/src/index.js.map +1 -1
  220. package/lib/src/mixpanel-service.d.ts +4 -0
  221. package/lib/src/mixpanel-service.d.ts.map +1 -1
  222. package/lib/src/mixpanel-service.js +4 -0
  223. package/lib/src/mixpanel-service.js.map +1 -1
  224. package/lib/src/react/all-types-export.d.ts +1 -1
  225. package/lib/src/react/all-types-export.d.ts.map +1 -1
  226. package/lib/src/react/all-types-export.js +1 -1
  227. package/lib/src/react/all-types-export.js.map +1 -1
  228. package/lib/src/react/all-types-export.parity.spec.d.ts +2 -0
  229. package/lib/src/react/all-types-export.parity.spec.d.ts.map +1 -0
  230. package/lib/src/react/all-types-export.parity.spec.js +191 -0
  231. package/lib/src/react/all-types-export.parity.spec.js.map +1 -0
  232. package/lib/src/react/index.d.ts +66 -32
  233. package/lib/src/react/index.d.ts.map +1 -1
  234. package/lib/src/react/index.js +5 -3
  235. package/lib/src/react/index.js.map +1 -1
  236. package/lib/src/react/index.spec.js +102 -1
  237. package/lib/src/react/index.spec.js.map +1 -1
  238. package/lib/src/react/util.spec.js +251 -0
  239. package/lib/src/react/util.spec.js.map +1 -1
  240. package/lib/src/types.d.ts +902 -28
  241. package/lib/src/types.d.ts.map +1 -1
  242. package/lib/src/types.js +701 -14
  243. package/lib/src/types.js.map +1 -1
  244. package/lib/src/utils/processData.spec.js +93 -0
  245. package/lib/src/utils/processData.spec.js.map +1 -1
  246. package/lib/src/utils/processTrigger.spec.js +61 -0
  247. package/lib/src/utils/processTrigger.spec.js.map +1 -1
  248. package/lib/src/utils.spec.js +4 -0
  249. package/lib/src/utils.spec.js.map +1 -1
  250. package/lib/src/visual-embed-sdk.d.ts +1815 -127
  251. package/package.json +1 -1
  252. package/src/config.ts +1 -0
  253. package/src/css-variables.ts +150 -0
  254. package/src/embed/app.spec.ts +877 -196
  255. package/src/embed/app.ts +276 -75
  256. package/src/embed/base.ts +1 -1
  257. package/src/embed/conversation.spec.ts +411 -21
  258. package/src/embed/conversation.ts +441 -18
  259. package/src/embed/events.spec.ts +761 -1
  260. package/src/embed/host-events.spec.ts +242 -0
  261. package/src/embed/hostEventClient/contracts.ts +57 -14
  262. package/src/embed/hostEventClient/host-event-client.spec.ts +372 -0
  263. package/src/embed/hostEventClient/host-event-client.ts +18 -2
  264. package/src/embed/hostEventClient/utils.spec.ts +204 -0
  265. package/src/embed/hostEventClient/utils.ts +37 -10
  266. package/src/embed/liveboard.spec.ts +565 -4
  267. package/src/embed/liveboard.ts +155 -28
  268. package/src/embed/spotter-utils.spec.ts +140 -1
  269. package/src/embed/spotter-utils.ts +36 -1
  270. package/src/embed/spotter-viz-utils.spec.ts +17 -0
  271. package/src/embed/spotter-viz-utils.ts +37 -4
  272. package/src/embed/ts-embed.spec.ts +885 -3
  273. package/src/embed/ts-embed.ts +111 -39
  274. package/src/errors.ts +1 -0
  275. package/src/index.ts +45 -2
  276. package/src/mixpanel-service.ts +4 -0
  277. package/src/react/all-types-export.parity.spec.ts +208 -0
  278. package/src/react/all-types-export.ts +22 -0
  279. package/src/react/index.spec.tsx +158 -0
  280. package/src/react/index.tsx +70 -33
  281. package/src/react/util.spec.tsx +255 -0
  282. package/src/types.ts +904 -24
  283. package/src/utils/processData.spec.ts +97 -0
  284. package/src/utils/processTrigger.spec.ts +91 -0
  285. package/src/utils.spec.ts +5 -0
@@ -7,6 +7,7 @@ import {
7
7
  init,
8
8
  AuthType,
9
9
  LiveboardEmbed,
10
+ AppEmbed,
10
11
  HostEvent,
11
12
  EmbedErrorCodes,
12
13
  } from '../index';
@@ -148,6 +149,85 @@ describe('HostEvent.OpenFilter', () => {
148
149
  });
149
150
  });
150
151
 
152
+ // ---------------------------------------------------------------------------
153
+ // 10b – OpenParameter
154
+ // ---------------------------------------------------------------------------
155
+ describe('HostEvent.OpenParameter', () => {
156
+ test('postMessage type is openParameter (camelCase)', async () => {
157
+ mockMessageChannel();
158
+ const { lb, iframe } = await renderLiveboard();
159
+ await executeAfterWait(() => {
160
+ lb.trigger(HostEvent.OpenParameter, { parameter: { parameterId: 'p1' } } as any);
161
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
162
+ expect.objectContaining({ type: 'openParameter' }),
163
+ thoughtSpotHost,
164
+ expect.anything(),
165
+ );
166
+ });
167
+ });
168
+
169
+ test('accepts a payload with only parameterName', async () => {
170
+ mockMessageChannel();
171
+ const { lb, iframe } = await renderLiveboard();
172
+ await executeAfterWait(() => {
173
+ lb.trigger(HostEvent.OpenParameter, { parameter: { parameterName: 'Param 1' } } as any);
174
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
175
+ expect.objectContaining({ type: 'openParameter' }),
176
+ thoughtSpotHost,
177
+ expect.anything(),
178
+ );
179
+ });
180
+ });
181
+ });
182
+
183
+ // ---------------------------------------------------------------------------
184
+ // 10c – OpenAddFilterModal
185
+ // ---------------------------------------------------------------------------
186
+ describe('HostEvent.OpenAddFilterModal', () => {
187
+ test('postMessage type is openAddFilterModal (camelCase, no payload)', async () => {
188
+ mockMessageChannel();
189
+ const { lb, iframe } = await renderLiveboard();
190
+ await executeAfterWait(() => {
191
+ lb.trigger(HostEvent.OpenAddFilterModal);
192
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
193
+ expect.objectContaining({ type: 'openAddFilterModal' }),
194
+ thoughtSpotHost,
195
+ expect.anything(),
196
+ );
197
+ });
198
+ });
199
+
200
+ test('returns null when !isRendered', async () => {
201
+ const lb = unrenderedLiveboard();
202
+ const result = await lb.trigger(HostEvent.OpenAddFilterModal);
203
+ expect(result).toBeNull();
204
+ });
205
+ });
206
+
207
+ // ---------------------------------------------------------------------------
208
+ // 10d – OpenAddParameterModal
209
+ // ---------------------------------------------------------------------------
210
+ describe('HostEvent.OpenAddParameterModal', () => {
211
+ test('postMessage type is openAddParameterModal (camelCase, no payload)', async () => {
212
+ mockMessageChannel();
213
+ const { lb, iframe } = await renderLiveboard();
214
+ await executeAfterWait(() => {
215
+ lb.trigger(HostEvent.OpenAddParameterModal);
216
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
217
+ expect.objectContaining({ type: 'openAddParameterModal' }),
218
+ thoughtSpotHost,
219
+ expect.anything(),
220
+ );
221
+ });
222
+ });
223
+
224
+ test('returns null when !isRendered', async () => {
225
+ const lb = unrenderedLiveboard();
226
+ const result = await lb.trigger(HostEvent.OpenAddParameterModal);
227
+ expect(result).toBeNull();
228
+ });
229
+ });
230
+
151
231
  // ---------------------------------------------------------------------------
152
232
  // 11 – AddColumns
153
233
  // ---------------------------------------------------------------------------
@@ -1633,3 +1713,165 @@ describe('context parameter forwarded in postMessage payload', () => {
1633
1713
  });
1634
1714
  });
1635
1715
  });
1716
+
1717
+ // ---------------------------------------------------------------------------
1718
+ // SetVisibleVizs — array vizId injection (NOT in the parametrized arrayEvents)
1719
+ // ---------------------------------------------------------------------------
1720
+ describe('HostEvent.SetVisibleVizs — array payload vizId injection', () => {
1721
+ test('vizId is added as a non-indexed property on the array — array.length unchanged', async () => {
1722
+ mockMessageChannel();
1723
+ const { lb, iframe } = await renderLiveboard({ vizId });
1724
+ const arrayPayload = ['viz1', 'viz2'];
1725
+ await executeAfterWait(() => {
1726
+ lb.trigger(HostEvent.SetVisibleVizs, arrayPayload as any);
1727
+ const call = (iframe.contentWindow.postMessage as jest.Mock).mock.calls[0];
1728
+ const sentData = call[0].data;
1729
+ expect((sentData as any).vizId).toBe(vizId);
1730
+ expect(sentData.length).toBe(2);
1731
+ });
1732
+ });
1733
+
1734
+ test('without viewConfig.vizId — array payload is sent as-is (no vizId property)', async () => {
1735
+ mockMessageChannel();
1736
+ const { lb, iframe } = await renderLiveboard(); // no vizId
1737
+ const arrayPayload = ['viz1'];
1738
+ await executeAfterWait(() => {
1739
+ lb.trigger(HostEvent.SetVisibleVizs, arrayPayload as any);
1740
+ const call = (iframe.contentWindow.postMessage as jest.Mock).mock.calls[0];
1741
+ const sentData = call[0].data;
1742
+ expect((sentData as any).vizId).toBeUndefined();
1743
+ });
1744
+ });
1745
+
1746
+ test('returns null and calls handleError when !isRendered', async () => {
1747
+ const lb = unrenderedLiveboard();
1748
+ const result = await lb.trigger(HostEvent.SetVisibleVizs, ['viz1'] as any);
1749
+ expect(result).toBeNull();
1750
+ expect((lb as any).handleError).toHaveBeenCalledWith(
1751
+ expect.objectContaining({ code: EmbedErrorCodes.RENDER_NOT_CALLED }),
1752
+ );
1753
+ });
1754
+ });
1755
+
1756
+ // ---------------------------------------------------------------------------
1757
+ // UpdateRuntimeFilters — AppEmbed path (no vizId injection)
1758
+ // ---------------------------------------------------------------------------
1759
+ describe('HostEvent.UpdateRuntimeFilters — AppEmbed path', () => {
1760
+ async function renderApp() {
1761
+ const app = new AppEmbed(getRootEl(), {
1762
+ frameParams: { width: '100%', height: '100%' },
1763
+ });
1764
+ await app.render();
1765
+ const iframe = getIFrameEl();
1766
+ jest.spyOn(iframe.contentWindow, 'postMessage');
1767
+ return { app, iframe };
1768
+ }
1769
+
1770
+ test('AppEmbed sends payload directly without vizId injection', async () => {
1771
+ mockMessageChannel();
1772
+ const { app, iframe } = await renderApp();
1773
+ const filters = [{ columnName: 'col', operator: 'EQ', values: ['v1'] }];
1774
+ await executeAfterWait(() => {
1775
+ app.trigger(HostEvent.UpdateRuntimeFilters, filters as any);
1776
+ const call = (iframe.contentWindow.postMessage as jest.Mock).mock.calls[0];
1777
+ const sentData = call[0].data;
1778
+ // Array payload with no vizId property injected
1779
+ expect((sentData as any).vizId).toBeUndefined();
1780
+ expect(sentData).toEqual(filters);
1781
+ });
1782
+ });
1783
+ });
1784
+
1785
+ // ---------------------------------------------------------------------------
1786
+ // Present — vizId injection on LiveboardEmbed
1787
+ // ---------------------------------------------------------------------------
1788
+ describe('HostEvent.Present — vizId injection on LiveboardEmbed', () => {
1789
+ test('viewConfig.vizId is injected into the Present payload', async () => {
1790
+ mockMessageChannel();
1791
+ const { lb, iframe } = await renderLiveboard({ vizId });
1792
+ await executeAfterWait(() => {
1793
+ lb.trigger(HostEvent.Present, {} as any);
1794
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
1795
+ expect.objectContaining({
1796
+ data: expect.objectContaining({ vizId }),
1797
+ }),
1798
+ thoughtSpotHost,
1799
+ expect.anything(),
1800
+ );
1801
+ });
1802
+ });
1803
+ });
1804
+
1805
+ // ---------------------------------------------------------------------------
1806
+ // DownloadAsCsv — additional cases
1807
+ // ---------------------------------------------------------------------------
1808
+ describe('HostEvent.DownloadAsCsv — additional cases', () => {
1809
+ test('viewConfig.vizId overwrites an explicit payload vizId', async () => {
1810
+ mockMessageChannel();
1811
+ const { lb, iframe } = await renderLiveboard({ vizId });
1812
+ await executeAfterWait(() => {
1813
+ lb.trigger(HostEvent.DownloadAsCsv, { vizId: 'explicit-id' } as any);
1814
+ const call = (iframe.contentWindow.postMessage as jest.Mock).mock.calls[0];
1815
+ const sentData = call[0].data;
1816
+ expect(sentData.vizId).toBe(vizId); // viewConfig.vizId wins
1817
+ });
1818
+ });
1819
+
1820
+ test('returns null and calls handleError when !isRendered', async () => {
1821
+ const lb = unrenderedLiveboard();
1822
+ const result = await lb.trigger(HostEvent.DownloadAsCsv, {} as any);
1823
+ expect(result).toBeNull();
1824
+ expect((lb as any).handleError).toHaveBeenCalledWith(
1825
+ expect.objectContaining({ code: EmbedErrorCodes.RENDER_NOT_CALLED }),
1826
+ );
1827
+ });
1828
+
1829
+ test('returns null and logs debug when !iFrame', async () => {
1830
+ const lb = new LiveboardEmbed(getRootEl(), {
1831
+ frameParams: { width: '100%', height: '100%' },
1832
+ liveboardId,
1833
+ });
1834
+ (lb as any).isRendered = true;
1835
+ const result = await lb.trigger(HostEvent.DownloadAsCsv, {} as any);
1836
+ expect(result).toBeNull();
1837
+ });
1838
+ });
1839
+
1840
+ // ---------------------------------------------------------------------------
1841
+ // Spotter share-conversation HostEvents
1842
+ // ---------------------------------------------------------------------------
1843
+ describe('Spotter share-conversation HostEvents', () => {
1844
+ const shareEvents: Array<[string, HostEvent, string, any]> = [
1845
+ ['ShareSpotterConversation', HostEvent.ShareSpotterConversation, 'ShareSpotterConversation', { conversationId: 'abc' }],
1846
+ ['CloseSpotterShareConversation', HostEvent.CloseSpotterShareConversation, 'CloseSpotterShareConversation', {}],
1847
+ ['ExitSpotterSharedConversation', HostEvent.ExitSpotterSharedConversation, 'ExitSpotterSharedConversation', {}],
1848
+ ];
1849
+
1850
+ test.each(shareEvents)(
1851
+ '%s: postMessage type is the matching string value',
1852
+ async (name, event, typeString, payload) => {
1853
+ mockMessageChannel();
1854
+ const { lb, iframe } = await renderLiveboard();
1855
+ await executeAfterWait(() => {
1856
+ lb.trigger(event, payload as any);
1857
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
1858
+ expect.objectContaining({ type: typeString }),
1859
+ thoughtSpotHost,
1860
+ expect.anything(),
1861
+ );
1862
+ });
1863
+ },
1864
+ );
1865
+
1866
+ test.each(shareEvents)(
1867
+ '%s: returns null and calls handleError when !isRendered',
1868
+ async (name, event, typeString, payload) => {
1869
+ const lb = unrenderedLiveboard();
1870
+ const result = await lb.trigger(event, payload as any);
1871
+ expect(result).toBeNull();
1872
+ expect((lb as any).handleError).toHaveBeenCalledWith(
1873
+ expect.objectContaining({ code: EmbedErrorCodes.RENDER_NOT_CALLED }),
1874
+ );
1875
+ },
1876
+ );
1877
+ });
@@ -7,6 +7,49 @@ export interface LiveboardTab {
7
7
  [key: string]: any;
8
8
  }
9
9
 
10
+ export interface LiveboardGroup {
11
+ id: string;
12
+ name: string;
13
+ [key: string]: any;
14
+ }
15
+
16
+ /**
17
+ * Levels at which a filter or parameter can be applied.
18
+ */
19
+ export enum ApplicabilityLevel {
20
+ Liveboard = 'LIVEBOARD',
21
+ Tab = 'TAB',
22
+ Group = 'GROUP',
23
+ }
24
+
25
+ /**
26
+ * Scopes a filter or parameter to a specific target.
27
+ * At `LIVEBOARD` level the filter applies to the whole Liveboard, so `targetId`
28
+ * is not required.
29
+ */
30
+ export interface Applicability {
31
+ level: ApplicabilityLevel;
32
+ targetId?: string;
33
+ }
34
+
35
+ export interface FilterUpdate {
36
+ column: string;
37
+ oper: string;
38
+ values: string[];
39
+ type?: string;
40
+ applicability?: Applicability;
41
+ }
42
+
43
+ export interface LiveboardFilter {
44
+ applicability?: Applicability;
45
+ [key: string]: any;
46
+ }
47
+
48
+ export interface LiveboardParameter {
49
+ applicability?: Applicability;
50
+ [key: string]: any;
51
+ }
52
+
10
53
  export enum UIPassthroughEvent {
11
54
  PinAnswerToLiveboard = 'addVizToPinboard',
12
55
  SaveAnswer = 'saveAnswer',
@@ -23,6 +66,7 @@ export enum UIPassthroughEvent {
23
66
  GetParameters = 'getParameters',
24
67
  GetTML = 'getTML',
25
68
  GetTabs = 'getTabs',
69
+ GetGroups = 'getGroups',
26
70
  GetExportRequestForCurrentPinboard = 'getExportRequestForCurrentPinboard',
27
71
  }
28
72
 
@@ -103,7 +147,7 @@ export type UIPassthroughContractBase = {
103
147
  vizId?: string;
104
148
  };
105
149
  response: {
106
- liveboardFilters: Record<string, any>[];
150
+ liveboardFilters: LiveboardFilter[];
107
151
  runtimeFilters: RuntimeFilter[];
108
152
  };
109
153
  };
@@ -116,7 +160,7 @@ export type UIPassthroughContractBase = {
116
160
  [UIPassthroughEvent.GetParameters]: {
117
161
  request: Record<string, never>;
118
162
  response: {
119
- parameters: Record<string, any>[];
163
+ parameters: LiveboardParameter[];
120
164
  };
121
165
  };
122
166
  [UIPassthroughEvent.GetTML]: {
@@ -134,6 +178,14 @@ export type UIPassthroughContractBase = {
134
178
  Tabs: LiveboardTab[];
135
179
  };
136
180
  };
181
+ [UIPassthroughEvent.GetGroups]: {
182
+ request: Record<string, never>;
183
+ response: {
184
+ orderedGroupIds: string[];
185
+ numberOfGroups: number;
186
+ Groups: LiveboardGroup[];
187
+ };
188
+ };
137
189
  [UIPassthroughEvent.GetExportRequestForCurrentPinboard]: {
138
190
  request: Record<string, never>;
139
191
  response: {
@@ -143,18 +195,8 @@ export type UIPassthroughContractBase = {
143
195
  };
144
196
  [UIPassthroughEvent.UpdateFilters]: {
145
197
  request: {
146
- filter?: {
147
- column: string;
148
- oper: string;
149
- values: string[];
150
- type?: string;
151
- };
152
- filters?: {
153
- column: string;
154
- oper: string;
155
- values: string[];
156
- type?: string;
157
- }[];
198
+ filter?: FilterUpdate;
199
+ filters?: FilterUpdate[];
158
200
  };
159
201
  response: unknown;
160
202
  };
@@ -198,6 +240,7 @@ export type EmbedApiHostEventMapping = {
198
240
  [HostEvent.GetParameters]: UIPassthroughEvent.GetParameters;
199
241
  [HostEvent.GetTML]: UIPassthroughEvent.GetTML;
200
242
  [HostEvent.GetTabs]: UIPassthroughEvent.GetTabs;
243
+ [HostEvent.GetGroups]: UIPassthroughEvent.GetGroups;
201
244
  [HostEvent.getExportRequestForCurrentPinboard]: UIPassthroughEvent.GetExportRequestForCurrentPinboard;
202
245
  }
203
246