@thoughtspot/visual-embed-sdk 1.46.1 → 1.46.3

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 (257) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/auth.d.ts +29 -4
  3. package/cjs/src/auth.d.ts.map +1 -1
  4. package/cjs/src/auth.js +29 -7
  5. package/cjs/src/auth.js.map +1 -1
  6. package/cjs/src/auth.spec.js +1 -3
  7. package/cjs/src/auth.spec.js.map +1 -1
  8. package/cjs/src/authToken.js +0 -1
  9. package/cjs/src/authToken.js.map +1 -1
  10. package/cjs/src/authToken.spec.js +2 -1
  11. package/cjs/src/authToken.spec.js.map +1 -1
  12. package/cjs/src/css-variables.d.ts +17 -17
  13. package/cjs/src/embed/app.d.ts +62 -33
  14. package/cjs/src/embed/app.d.ts.map +1 -1
  15. package/cjs/src/embed/app.js +10 -3
  16. package/cjs/src/embed/app.js.map +1 -1
  17. package/cjs/src/embed/app.spec.js +34 -1
  18. package/cjs/src/embed/app.spec.js.map +1 -1
  19. package/cjs/src/embed/auto-frame-renderer.d.ts +41 -0
  20. package/cjs/src/embed/auto-frame-renderer.d.ts.map +1 -0
  21. package/cjs/src/embed/auto-frame-renderer.js +145 -0
  22. package/cjs/src/embed/auto-frame-renderer.js.map +1 -0
  23. package/cjs/src/embed/auto-frame-renderer.spec.d.ts +2 -0
  24. package/cjs/src/embed/auto-frame-renderer.spec.d.ts.map +1 -0
  25. package/cjs/src/embed/auto-frame-renderer.spec.js +195 -0
  26. package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -0
  27. package/cjs/src/embed/base.d.ts +2 -2
  28. package/cjs/src/embed/base.d.ts.map +1 -1
  29. package/cjs/src/embed/base.js +6 -9
  30. package/cjs/src/embed/base.js.map +1 -1
  31. package/cjs/src/embed/bodyless-conversation.d.ts +5 -5
  32. package/cjs/src/embed/bodyless-conversation.js +4 -4
  33. package/cjs/src/embed/conversation.d.ts +43 -30
  34. package/cjs/src/embed/conversation.d.ts.map +1 -1
  35. package/cjs/src/embed/conversation.js +10 -11
  36. package/cjs/src/embed/conversation.js.map +1 -1
  37. package/cjs/src/embed/conversation.spec.js +27 -0
  38. package/cjs/src/embed/conversation.spec.js.map +1 -1
  39. package/cjs/src/embed/hostEventClient/host-event-client.js +0 -2
  40. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  41. package/cjs/src/embed/liveboard.d.ts +42 -35
  42. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  43. package/cjs/src/embed/liveboard.js +6 -4
  44. package/cjs/src/embed/liveboard.js.map +1 -1
  45. package/cjs/src/embed/liveboard.spec.js +5 -3
  46. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  47. package/cjs/src/embed/sage.d.ts +5 -5
  48. package/cjs/src/embed/sage.js +1 -2
  49. package/cjs/src/embed/sage.js.map +1 -1
  50. package/cjs/src/embed/search-bar.d.ts +7 -7
  51. package/cjs/src/embed/search-bar.js +1 -1
  52. package/cjs/src/embed/search.d.ts +13 -12
  53. package/cjs/src/embed/search.d.ts.map +1 -1
  54. package/cjs/src/embed/search.js.map +1 -1
  55. package/cjs/src/embed/search.spec.js +0 -2
  56. package/cjs/src/embed/search.spec.js.map +1 -1
  57. package/cjs/src/embed/ts-embed.d.ts +3 -3
  58. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  59. package/cjs/src/embed/ts-embed.js +15 -9
  60. package/cjs/src/embed/ts-embed.js.map +1 -1
  61. package/cjs/src/embed/ts-embed.spec.js +37 -1
  62. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  63. package/cjs/src/index.d.ts +3 -2
  64. package/cjs/src/index.d.ts.map +1 -1
  65. package/cjs/src/index.js +3 -1
  66. package/cjs/src/index.js.map +1 -1
  67. package/cjs/src/react/index.d.ts +15 -15
  68. package/cjs/src/react/index.js +12 -13
  69. package/cjs/src/react/index.js.map +1 -1
  70. package/cjs/src/react/index.spec.js +6 -3
  71. package/cjs/src/react/index.spec.js.map +1 -1
  72. package/cjs/src/tokenizedFetch.d.ts +1 -1
  73. package/cjs/src/tokenizedFetch.js +1 -1
  74. package/cjs/src/types.d.ts +350 -287
  75. package/cjs/src/types.d.ts.map +1 -1
  76. package/cjs/src/types.js +240 -218
  77. package/cjs/src/types.js.map +1 -1
  78. package/cjs/src/utils/graphql/answerService/answerService.d.ts +9 -6
  79. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  80. package/cjs/src/utils/graphql/answerService/answerService.js +13 -15
  81. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  82. package/cjs/src/utils/graphql/answerService/answerService.spec.js +55 -0
  83. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  84. package/cjs/src/utils/graphql/preview-service.js +0 -1
  85. package/cjs/src/utils/graphql/preview-service.js.map +1 -1
  86. package/cjs/src/utils/processData.js +0 -5
  87. package/cjs/src/utils/processData.js.map +1 -1
  88. package/cjs/src/utils.d.ts +9 -0
  89. package/cjs/src/utils.d.ts.map +1 -1
  90. package/cjs/src/utils.js +10 -1
  91. package/cjs/src/utils.js.map +1 -1
  92. package/dist/{index-Vyh6Ha5f.js → index-DyX-x6uN.js} +1 -1
  93. package/dist/src/auth.d.ts +29 -4
  94. package/dist/src/auth.d.ts.map +1 -1
  95. package/dist/src/css-variables.d.ts +17 -17
  96. package/dist/src/embed/app.d.ts +62 -33
  97. package/dist/src/embed/app.d.ts.map +1 -1
  98. package/dist/src/embed/auto-frame-renderer.d.ts +41 -0
  99. package/dist/src/embed/auto-frame-renderer.d.ts.map +1 -0
  100. package/dist/src/embed/auto-frame-renderer.spec.d.ts +2 -0
  101. package/dist/src/embed/auto-frame-renderer.spec.d.ts.map +1 -0
  102. package/dist/src/embed/base.d.ts +2 -2
  103. package/dist/src/embed/base.d.ts.map +1 -1
  104. package/dist/src/embed/bodyless-conversation.d.ts +5 -5
  105. package/dist/src/embed/conversation.d.ts +43 -30
  106. package/dist/src/embed/conversation.d.ts.map +1 -1
  107. package/dist/src/embed/liveboard.d.ts +42 -35
  108. package/dist/src/embed/liveboard.d.ts.map +1 -1
  109. package/dist/src/embed/sage.d.ts +5 -5
  110. package/dist/src/embed/search-bar.d.ts +7 -7
  111. package/dist/src/embed/search.d.ts +13 -12
  112. package/dist/src/embed/search.d.ts.map +1 -1
  113. package/dist/src/embed/ts-embed.d.ts +3 -3
  114. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  115. package/dist/src/index.d.ts +3 -2
  116. package/dist/src/index.d.ts.map +1 -1
  117. package/dist/src/react/index.d.ts +15 -15
  118. package/dist/src/tokenizedFetch.d.ts +1 -1
  119. package/dist/src/types.d.ts +350 -287
  120. package/dist/src/types.d.ts.map +1 -1
  121. package/dist/src/utils/graphql/answerService/answerService.d.ts +9 -6
  122. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  123. package/dist/src/utils.d.ts +9 -0
  124. package/dist/src/utils.d.ts.map +1 -1
  125. package/dist/tsembed-react.es.js +359 -329
  126. package/dist/tsembed-react.js +358 -328
  127. package/dist/tsembed.es.js +490 -321
  128. package/dist/tsembed.js +489 -319
  129. package/dist/visual-embed-sdk-react-full.d.ts +574 -442
  130. package/dist/visual-embed-sdk-react.d.ts +572 -440
  131. package/dist/visual-embed-sdk.d.ts +622 -446
  132. package/lib/package.json +1 -1
  133. package/lib/src/auth.d.ts +29 -4
  134. package/lib/src/auth.d.ts.map +1 -1
  135. package/lib/src/auth.js +29 -7
  136. package/lib/src/auth.js.map +1 -1
  137. package/lib/src/auth.spec.js +1 -3
  138. package/lib/src/auth.spec.js.map +1 -1
  139. package/lib/src/authToken.js +0 -1
  140. package/lib/src/authToken.js.map +1 -1
  141. package/lib/src/authToken.spec.js +2 -1
  142. package/lib/src/authToken.spec.js.map +1 -1
  143. package/lib/src/css-variables.d.ts +17 -17
  144. package/lib/src/embed/app.d.ts +62 -33
  145. package/lib/src/embed/app.d.ts.map +1 -1
  146. package/lib/src/embed/app.js +11 -4
  147. package/lib/src/embed/app.js.map +1 -1
  148. package/lib/src/embed/app.spec.js +34 -1
  149. package/lib/src/embed/app.spec.js.map +1 -1
  150. package/lib/src/embed/auto-frame-renderer.d.ts +41 -0
  151. package/lib/src/embed/auto-frame-renderer.d.ts.map +1 -0
  152. package/lib/src/embed/auto-frame-renderer.js +141 -0
  153. package/lib/src/embed/auto-frame-renderer.js.map +1 -0
  154. package/lib/src/embed/auto-frame-renderer.spec.d.ts +2 -0
  155. package/lib/src/embed/auto-frame-renderer.spec.d.ts.map +1 -0
  156. package/lib/src/embed/auto-frame-renderer.spec.js +192 -0
  157. package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -0
  158. package/lib/src/embed/base.d.ts +2 -2
  159. package/lib/src/embed/base.d.ts.map +1 -1
  160. package/lib/src/embed/base.js +6 -9
  161. package/lib/src/embed/base.js.map +1 -1
  162. package/lib/src/embed/bodyless-conversation.d.ts +5 -5
  163. package/lib/src/embed/bodyless-conversation.js +4 -4
  164. package/lib/src/embed/conversation.d.ts +43 -30
  165. package/lib/src/embed/conversation.d.ts.map +1 -1
  166. package/lib/src/embed/conversation.js +11 -11
  167. package/lib/src/embed/conversation.js.map +1 -1
  168. package/lib/src/embed/conversation.spec.js +27 -0
  169. package/lib/src/embed/conversation.spec.js.map +1 -1
  170. package/lib/src/embed/hostEventClient/host-event-client.js +0 -2
  171. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  172. package/lib/src/embed/liveboard.d.ts +42 -35
  173. package/lib/src/embed/liveboard.d.ts.map +1 -1
  174. package/lib/src/embed/liveboard.js +6 -4
  175. package/lib/src/embed/liveboard.js.map +1 -1
  176. package/lib/src/embed/liveboard.spec.js +5 -3
  177. package/lib/src/embed/liveboard.spec.js.map +1 -1
  178. package/lib/src/embed/sage.d.ts +5 -5
  179. package/lib/src/embed/sage.js +1 -2
  180. package/lib/src/embed/sage.js.map +1 -1
  181. package/lib/src/embed/search-bar.d.ts +7 -7
  182. package/lib/src/embed/search-bar.js +1 -1
  183. package/lib/src/embed/search.d.ts +13 -12
  184. package/lib/src/embed/search.d.ts.map +1 -1
  185. package/lib/src/embed/search.js.map +1 -1
  186. package/lib/src/embed/search.spec.js +0 -2
  187. package/lib/src/embed/search.spec.js.map +1 -1
  188. package/lib/src/embed/ts-embed.d.ts +3 -3
  189. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  190. package/lib/src/embed/ts-embed.js +15 -9
  191. package/lib/src/embed/ts-embed.js.map +1 -1
  192. package/lib/src/embed/ts-embed.spec.js +37 -1
  193. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  194. package/lib/src/index.d.ts +3 -2
  195. package/lib/src/index.d.ts.map +1 -1
  196. package/lib/src/index.js +1 -0
  197. package/lib/src/index.js.map +1 -1
  198. package/lib/src/react/index.d.ts +15 -15
  199. package/lib/src/react/index.js +12 -13
  200. package/lib/src/react/index.js.map +1 -1
  201. package/lib/src/react/index.spec.js +6 -3
  202. package/lib/src/react/index.spec.js.map +1 -1
  203. package/lib/src/tokenizedFetch.d.ts +1 -1
  204. package/lib/src/tokenizedFetch.js +1 -1
  205. package/lib/src/types.d.ts +350 -287
  206. package/lib/src/types.d.ts.map +1 -1
  207. package/lib/src/types.js +240 -218
  208. package/lib/src/types.js.map +1 -1
  209. package/lib/src/utils/graphql/answerService/answerService.d.ts +9 -6
  210. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  211. package/lib/src/utils/graphql/answerService/answerService.js +12 -14
  212. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  213. package/lib/src/utils/graphql/answerService/answerService.spec.js +55 -0
  214. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  215. package/lib/src/utils/graphql/preview-service.js +0 -1
  216. package/lib/src/utils/graphql/preview-service.js.map +1 -1
  217. package/lib/src/utils/processData.js +0 -5
  218. package/lib/src/utils/processData.js.map +1 -1
  219. package/lib/src/utils.d.ts +9 -0
  220. package/lib/src/utils.d.ts.map +1 -1
  221. package/lib/src/utils.js +8 -0
  222. package/lib/src/utils.js.map +1 -1
  223. package/lib/src/visual-embed-sdk.d.ts +11466 -0
  224. package/package.json +1 -1
  225. package/src/auth.spec.ts +1 -1
  226. package/src/auth.ts +32 -7
  227. package/src/authToken.spec.ts +2 -1
  228. package/src/authToken.ts +1 -1
  229. package/src/css-variables.ts +17 -17
  230. package/src/embed/app.spec.ts +46 -1
  231. package/src/embed/app.ts +74 -36
  232. package/src/embed/auto-frame-renderer.spec.ts +266 -0
  233. package/src/embed/auto-frame-renderer.ts +152 -0
  234. package/src/embed/base.spec.ts +1 -1
  235. package/src/embed/base.ts +9 -10
  236. package/src/embed/bodyless-conversation.ts +5 -5
  237. package/src/embed/conversation.spec.ts +37 -0
  238. package/src/embed/conversation.ts +55 -38
  239. package/src/embed/hostEventClient/host-event-client.ts +2 -2
  240. package/src/embed/liveboard.spec.ts +5 -3
  241. package/src/embed/liveboard.ts +47 -38
  242. package/src/embed/sage.ts +6 -6
  243. package/src/embed/search-bar.tsx +7 -7
  244. package/src/embed/search.spec.ts +2 -2
  245. package/src/embed/search.ts +13 -12
  246. package/src/embed/ts-embed.spec.ts +44 -1
  247. package/src/embed/ts-embed.ts +14 -9
  248. package/src/index.ts +3 -0
  249. package/src/react/index.spec.tsx +6 -3
  250. package/src/react/index.tsx +16 -16
  251. package/src/tokenizedFetch.ts +1 -1
  252. package/src/types.ts +350 -286
  253. package/src/utils/graphql/answerService/answerService.spec.ts +62 -0
  254. package/src/utils/graphql/answerService/answerService.ts +14 -10
  255. package/src/utils/graphql/preview-service.ts +1 -1
  256. package/src/utils/processData.ts +5 -5
  257. package/src/utils.ts +14 -0
package/src/embed/app.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  */
10
10
 
11
11
  import { logger } from '../utils/logger';
12
- import { calculateVisibleElementData, getQueryParamString, isUndefined, isValidCssMargin, setParamIfDefined, validateHttpUrl } from '../utils';
12
+ import { calculateVisibleElementData, getQueryParamString, isUndefined, isValidCssMargin, setParamIfDefined, validateHttpUrl, resolveEnablePastConversationsSidebar } from '../utils';
13
13
  import {
14
14
  Param,
15
15
  DOMSelector,
@@ -140,7 +140,7 @@ export enum ListPage {
140
140
  */
141
141
  export interface DiscoveryExperience {
142
142
  /**
143
- * primaryNavbarVersion determines the version of the navigation version.
143
+ * primaryNavbarVersion determines the version of the primary navigation bar.
144
144
  */
145
145
  primaryNavbarVersion?: PrimaryNavbarVersion;
146
146
  /**
@@ -164,8 +164,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
164
164
  * This flag also controls the homepage left navigation bar.
165
165
  *
166
166
  * Supported embed types: `AppEmbed`
167
- * @default true
168
167
  * @version SDK: 1.2.0 | ThoughtSpot: 8.4.0.cl
168
+ * @default true
169
169
  * @example
170
170
  * ```js
171
171
  * const embed = new AppEmbed('#tsEmbed', {
@@ -186,8 +186,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
186
186
  * **Note**: This attribute is not supported in the classic (V1) experience.
187
187
  *
188
188
  * Supported embed types: `AppEmbed`
189
- * @default false
190
189
  * @version SDK: 1.28.0 | ThoughtSpot: 9.12.5.cl
190
+ * @default false
191
191
  * @example
192
192
  * ```js
193
193
  * const embed = new AppEmbed('#tsEmbed', {
@@ -204,8 +204,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
204
204
  * navigation bar is not hidden via `showPrimaryNavbar`.
205
205
  *
206
206
  * Supported embed types: `AppEmbed`
207
- * @default false
208
207
  * @version SDK: 1.2.0 | ThoughtSpot: 8.4.0.cl
208
+ * @default false
209
209
  * @example
210
210
  * ```js
211
211
  * const embed = new AppEmbed('#tsEmbed', {
@@ -216,12 +216,12 @@ export interface AppViewConfig extends AllEmbedViewConfig {
216
216
  */
217
217
  disableProfileAndHelp?: boolean;
218
218
  /**
219
- * @version SDK: 1.36.3 | ThoughtSpot: 10.1.0.cl
220
- * @default true
221
219
  * Whether the help menu in the top navigation bar should be served
222
220
  * from Pendo or ThoughtSpot's internal help items.
223
221
  *
224
222
  * Supported embed types: `AppEmbed`
223
+ * @version SDK: 1.36.3 | ThoughtSpot: 10.1.0.cl
224
+ * @default true
225
225
  * @example
226
226
  * ```js
227
227
  * const embed = new AppEmbed('#tsEmbed', {
@@ -236,8 +236,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
236
236
  * the top navigation bar in the V3 navigation experience.
237
237
  *
238
238
  * Supported embed types: `AppEmbed`
239
- * @default false
240
239
  * @version SDK: 1.40.0 | ThoughtSpot: 10.11.0.cl
240
+ * @default false
241
241
  * @example
242
242
  * ```js
243
243
  * const embed = new AppEmbed('#tsEmbed', {
@@ -256,8 +256,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
256
256
  * in the classic (V1) experience.
257
257
  *
258
258
  * Supported embed types: `AppEmbed`
259
- * @default true
260
259
  * @version SDK: 1.40.0 | ThoughtSpot: 10.11.0.cl
260
+ * @default true
261
261
  * @example
262
262
  * ```js
263
263
  * const embed = new AppEmbed('#tsEmbed', {
@@ -275,8 +275,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
275
275
  * in the classic (V1) and V2 experience modes.
276
276
  *
277
277
  * Supported embed types: `AppEmbed`
278
- * @default true
279
278
  * @version SDK: 1.40.0 | ThoughtSpot: 10.11.0.cl
279
+ * @default true
280
280
  * @example
281
281
  * ```js
282
282
  * const embed = new AppEmbed('#tsEmbed', {
@@ -292,7 +292,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
292
292
  * In the V3 experience, it shows or hides application selection
293
293
  * icons on the left navigation panel.
294
294
  * By default, the application selection menu and icons are
295
- * shown in the UI
295
+ * shown in the UI.
296
296
  *
297
297
  * **Note**: This attribute is not supported in the classic (V1) experience.
298
298
  *
@@ -332,7 +332,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
332
332
  * takes precedence. This is the path post the `#/` in the URL of the standalone
333
333
  * ThoughtSpot app. Use this to open the embedded view to a specific path.
334
334
  *
335
- * For eg, if you want the component to open to a specific Liveboard
335
+ * For example, if you want the component to open to a specific Liveboard
336
336
  * you could set the path to `pinboard/<liveboardId>/tab/<tabId>`.
337
337
  *
338
338
  * Supported embed types: `AppEmbed`
@@ -350,7 +350,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
350
350
  * The application page to set as the start page
351
351
  * in the embedded view.
352
352
  *
353
- * Use this to open to particular page in the app. To open to a specific
353
+ * Use this to open to a particular page in the app. To open to a specific
354
354
  * path within the app, use the `path` attribute which is more flexible.
355
355
  *
356
356
  * Supported embed types: `AppEmbed`
@@ -430,8 +430,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
430
430
  * If set to true, the Search Assist feature is enabled.
431
431
  *
432
432
  * Supported embed types: `AppEmbed`
433
- * @default true
434
433
  * @version SDK: 1.13.0 | ThoughtSpot: 8.5.0.cl, 8.8.1-sw
434
+ * @default true
435
435
  * @example
436
436
  * ```js
437
437
  * const embed = new AppEmbed('#tsEmbed', {
@@ -469,8 +469,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
469
469
  * For more information,
470
470
  * see link:https://developers.thoughtspot.com/docs/full-app-customize[full app embed documentation].
471
471
  * Supported embed types: `AppEmbed`
472
- * @default false
473
472
  * @version SDK: 1.28.0 | ThoughtSpot: 9.12.5.cl
473
+ * @default false
474
474
  * @example
475
475
  * ```js
476
476
  * const embed = new AppEmbed('#tsEmbed', {
@@ -485,8 +485,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
485
485
  * For more information, see
486
486
  * link:https://developers.thoughtspot.com/docs/full-app-customize[full app embed documentation].
487
487
  * Supported embed types: `AppEmbed`
488
- * @default false
489
488
  * @version SDK: 1.40.0 | ThoughtSpot: 10.11.0.cl
489
+ * @default false
490
490
  * @example
491
491
  * ```js
492
492
  * const embed = new AppEmbed('#tsEmbed', {
@@ -501,10 +501,10 @@ export interface AppViewConfig extends AllEmbedViewConfig {
501
501
  */
502
502
  discoveryExperience?: DiscoveryExperience;
503
503
  /**
504
- * To set the initial state of the search bar in case of saved-answers.
504
+ * To set the initial state of the search bar in case of saved-answers. Use {@link collapseSearchBar} instead.
505
505
  * @version SDK: 1.32.0 | ThoughtSpot: 10.0.0.cl
506
+ * @deprecated This flag is deprecated.
506
507
  * @default false
507
- * @deprecated Use {@link collapseSearchBar} instead
508
508
  */
509
509
  collapseSearchBarInitially?: boolean;
510
510
  /**
@@ -532,14 +532,14 @@ export interface AppViewConfig extends AllEmbedViewConfig {
532
532
  * Flag to use home page search bar mode
533
533
  *
534
534
  * Supported embed types: `AppEmbed`
535
- * @version SDK : 1.33.0 | ThoughtSpot: 10.3.0.cl
535
+ * @version SDK: 1.33.0 | ThoughtSpot: 10.3.0.cl
536
536
  */
537
537
  homePageSearchBarMode?: HomePageSearchBarMode;
538
538
  /**
539
539
  * This flag is used to enable unified search experience for full app embed.
540
540
  *
541
541
  * Supported embed types: `AppEmbed`
542
- * @version SDK: 1.34.0 | ThoughtSpot:10.5.0.cl
542
+ * @version SDK: 1.34.0 | ThoughtSpot: 10.5.0.cl
543
543
  * @default true
544
544
  * @example
545
545
  * ```js
@@ -552,7 +552,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
552
552
  isUnifiedSearchExperienceEnabled?: boolean;
553
553
 
554
554
  /**
555
- * This flag is used to enable/disable the styling and grouping in a Liveboard
555
+ * This flag is used to enable/disable the styling and grouping in a Liveboard. Use {@link isLiveboardMasterpiecesEnabled} instead.
556
+ * @deprecated This flag is deprecated.
556
557
  *
557
558
  * Supported embed types: `AppEmbed`, `LiveboardEmbed`
558
559
  * @type {boolean}
@@ -569,7 +570,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
569
570
  isLiveboardStylingAndGroupingEnabled?: boolean;
570
571
 
571
572
  /**
572
- * This flag is used to enable/disable the png embedding of liveboard in scheduled mails
573
+ * This flag is used to enable/disable the png embedding of liveboard in scheduled
574
+ * mails
573
575
  *
574
576
  * Supported embed types: `AppEmbed`, `LiveboardEmbed`
575
577
  * @type {boolean}
@@ -622,6 +624,9 @@ export interface AppViewConfig extends AllEmbedViewConfig {
622
624
  /**
623
625
  * This flag is used to enable the full height lazy load data.
624
626
  *
627
+ * @type {boolean}
628
+ * @version SDK: 1.40.0 | ThoughtSpot: 10.12.0.cl
629
+ * @default false
625
630
  * @example
626
631
  * ```js
627
632
  * const embed = new AppEmbed('#embed-container', {
@@ -630,10 +635,6 @@ export interface AppViewConfig extends AllEmbedViewConfig {
630
635
  * lazyLoadingForFullHeight: true,
631
636
  * })
632
637
  * ```
633
- *
634
- * @type {boolean}
635
- * @default false
636
- * @version SDK: 1.40.0 | ThoughtSpot:10.12.0.cl
637
638
  */
638
639
  lazyLoadingForFullHeight?: boolean;
639
640
 
@@ -641,23 +642,23 @@ export interface AppViewConfig extends AllEmbedViewConfig {
641
642
  * The margin to be used for lazy loading.
642
643
  *
643
644
  * For example, if the margin is set to '10px',
644
- * the visualization will be loaded 10px before the its top edge is visible in the
645
+ * the visualization will be loaded 10px before its top edge is visible in the
645
646
  * viewport.
646
647
  *
647
648
  * The format is similar to CSS margin.
648
649
  *
650
+ * @type {string}
651
+ * @version SDK: 1.40.0 | ThoughtSpot: 10.12.0.cl
649
652
  * @example
650
653
  * ```js
651
654
  * const embed = new AppEmbed('#embed-container', {
652
655
  * // ...other options
653
656
  * fullHeight: true,
654
657
  * lazyLoadingForFullHeight: true,
655
- * // Using 0px, the visualization will be only loaded when its visible in the viewport.
658
+ * // Using 0px, the visualization will be only loaded when it's visible in the viewport.
656
659
  * lazyLoadingMargin: '0px',
657
660
  * })
658
661
  * ```
659
- * @type {string}
660
- * @version SDK: 1.40.0 | ThoughtSpot:10.12.0.cl
661
662
  */
662
663
  lazyLoadingMargin?: string;
663
664
 
@@ -665,6 +666,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
665
666
  * updatedSpotterChatPrompt : Controls the updated spotter chat prompt.
666
667
  *
667
668
  * Supported embed types: `AppEmbed`
669
+ * @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
668
670
  * @default false
669
671
  * @example
670
672
  * ```js
@@ -673,25 +675,36 @@ export interface AppViewConfig extends AllEmbedViewConfig {
673
675
  * updatedSpotterChatPrompt : true,
674
676
  * })
675
677
  * ```
676
- * @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
677
678
  */
678
679
  updatedSpotterChatPrompt?: boolean;
680
+ /**
681
+ * Controls the visibility of the past conversations sidebar.
682
+ *
683
+ * Supported embed types: `AppEmbed`
684
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
685
+ * @deprecated from SDK: 1.47.0 | ThoughtSpot: 26.4.0.cl
686
+ * Use `spotterSidebarConfig.enablePastConversationsSidebar`.
687
+ * @default false
688
+ */
689
+ enablePastConversationsSidebar?: boolean;
679
690
  /**
680
691
  * Configuration for the Spotter sidebar UI customization.
681
692
  * Only applicable when navigating to Spotter within the app.
682
693
  *
683
694
  * Supported embed types: `AppEmbed`
695
+ * @version SDK: 1.47.0 | ThoughtSpot: 26.4.0.cl
684
696
  * @example
685
697
  * ```js
686
698
  * const embed = new AppEmbed('#tsEmbed', {
687
- * ... //other embed view config
699
+ * // Deprecated standalone flag (backward compatibility)
700
+ * enablePastConversationsSidebar: false,
701
+ * // Recommended config; this value takes precedence
688
702
  * spotterSidebarConfig: {
689
703
  * enablePastConversationsSidebar: true,
690
704
  * spotterSidebarTitle: 'My Conversations',
691
705
  * },
692
706
  * })
693
707
  * ```
694
- * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
695
708
  */
696
709
  spotterSidebarConfig?: SpotterSidebarViewConfig;
697
710
  /**
@@ -699,6 +712,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
699
712
  * branding in tool response cards.
700
713
  *
701
714
  * Supported embed types: `AppEmbed`
715
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.4.0.cl
702
716
  * @example
703
717
  * ```js
704
718
  * const embed = new AppEmbed('#tsEmbed', {
@@ -709,7 +723,6 @@ export interface AppViewConfig extends AllEmbedViewConfig {
709
723
  * },
710
724
  * })
711
725
  * ```
712
- * @version SDK: 1.46.0 | ThoughtSpot: 26.4.0.cl
713
726
  */
714
727
  spotterChatConfig?: SpotterChatViewConfig;
715
728
  /**
@@ -729,6 +742,22 @@ export interface AppViewConfig extends AllEmbedViewConfig {
729
742
  * ```
730
743
  */
731
744
  minimumHeight?: number;
745
+ /**
746
+ * To enable the homepage announcement banner.
747
+ * Controls the visibility of the announcement section
748
+ * on the homepage.
749
+ *
750
+ * Supported embed types: `AppEmbed`
751
+ * @example
752
+ * ```js
753
+ * const embed = new AppEmbed('#tsEmbed', {
754
+ * ... // other embed view config
755
+ * enableHomepageAnnouncement: true,
756
+ * })
757
+ * ```
758
+ * @version SDK: 1.48.0 | ThoughtSpot: 26.5.0.cl
759
+ */
760
+ enableHomepageAnnouncement?: boolean;
732
761
  }
733
762
 
734
763
  /**
@@ -809,6 +838,7 @@ export class AppEmbed extends V1Embed {
809
838
  spotterChatConfig,
810
839
  minimumHeight,
811
840
  isThisPeriodInDateFiltersEnabled,
841
+ enableHomepageAnnouncement,
812
842
  } = this.viewConfig;
813
843
 
814
844
  let params: any = {};
@@ -837,10 +867,15 @@ export class AppEmbed extends V1Embed {
837
867
  params[Param.UpdatedSpotterChatPrompt] = !!updatedSpotterChatPrompt;
838
868
  }
839
869
 
870
+ const resolvedEnablePastConversationsSidebar = resolveEnablePastConversationsSidebar({
871
+ spotterSidebarConfigValue: spotterSidebarConfig?.enablePastConversationsSidebar,
872
+ standaloneValue: this.viewConfig.enablePastConversationsSidebar,
873
+ });
874
+ setParamIfDefined(params, Param.EnablePastConversationsSidebar, resolvedEnablePastConversationsSidebar, true);
875
+
840
876
  // Handle spotterSidebarConfig params
841
877
  if (spotterSidebarConfig) {
842
878
  const {
843
- enablePastConversationsSidebar,
844
879
  spotterSidebarTitle,
845
880
  spotterSidebarDefaultExpanded,
846
881
  spotterChatRenameLabel,
@@ -853,7 +888,6 @@ export class AppEmbed extends V1Embed {
853
888
  spotterNewChatButtonTitle,
854
889
  } = spotterSidebarConfig;
855
890
 
856
- setParamIfDefined(params, Param.EnablePastConversationsSidebar, enablePastConversationsSidebar, true);
857
891
  setParamIfDefined(params, Param.SpotterSidebarDefaultExpanded, spotterSidebarDefaultExpanded, true);
858
892
  setParamIfDefined(params, Param.SpotterSidebarTitle, spotterSidebarTitle);
859
893
  setParamIfDefined(params, Param.SpotterChatRenameLabel, spotterChatRenameLabel);
@@ -979,6 +1013,10 @@ export class AppEmbed extends V1Embed {
979
1013
  params[Param.IsThisPeriodInDateFiltersEnabled] = isThisPeriodInDateFiltersEnabled;
980
1014
  }
981
1015
 
1016
+ if (enableHomepageAnnouncement !== undefined) {
1017
+ params[Param.EnableHomepageAnnouncement] = enableHomepageAnnouncement;
1018
+ }
1019
+
982
1020
  this.defaultHeight = minimumHeight || this.defaultHeight;
983
1021
 
984
1022
  params[Param.DataPanelV2Enabled] = dataPanelV2;
@@ -0,0 +1,266 @@
1
+ import { startAutoMCPFrameRenderer } from './auto-frame-renderer';
2
+ import { Param, AuthType } from '../types';
3
+ import { init } from '../index';
4
+ import * as authInstance from '../auth';
5
+ import { TsEmbed } from './ts-embed';
6
+ import {
7
+ getDocumentBody,
8
+ } from '../test/test-utils';
9
+
10
+ const thoughtSpotHost = 'tshost';
11
+
12
+ describe('startAutoMCPFrameRenderer', () => {
13
+ let renderIFrameSpy: jest.SpyInstance;
14
+ let getEmbedBasePathSpy: jest.SpyInstance;
15
+
16
+ beforeAll(() => {
17
+ init({
18
+ thoughtSpotHost,
19
+ authType: AuthType.None,
20
+ });
21
+ jest.spyOn(authInstance, 'postLoginService').mockImplementation(() => Promise.resolve(undefined));
22
+ jest.spyOn(window, 'alert').mockImplementation(() => undefined);
23
+ });
24
+
25
+ beforeEach(() => {
26
+ document.body.innerHTML = getDocumentBody();
27
+ getEmbedBasePathSpy = jest.spyOn(
28
+ TsEmbed.prototype as any,
29
+ 'getEmbedBasePath',
30
+ ).mockImplementation(function (this: any, query: string) {
31
+ return `http://${thoughtSpotHost}/?${query}#`;
32
+ });
33
+ renderIFrameSpy = jest.spyOn(
34
+ TsEmbed.prototype as any,
35
+ 'renderIFrame',
36
+ ).mockResolvedValue(undefined);
37
+ });
38
+
39
+ afterEach(() => {
40
+ renderIFrameSpy.mockRestore();
41
+ getEmbedBasePathSpy.mockRestore();
42
+ });
43
+
44
+ describe('MutationObserver setup', () => {
45
+ test('should return a MutationObserver', () => {
46
+ const observer = startAutoMCPFrameRenderer();
47
+ expect(observer).toBeInstanceOf(MutationObserver);
48
+ observer.disconnect();
49
+ });
50
+
51
+ test('should observe document.body with childList and subtree', () => {
52
+ const observeSpy = jest.spyOn(MutationObserver.prototype, 'observe');
53
+ const observer = startAutoMCPFrameRenderer();
54
+ expect(observeSpy).toHaveBeenCalledWith(document.body, {
55
+ childList: true,
56
+ subtree: true,
57
+ });
58
+ observer.disconnect();
59
+ observeSpy.mockRestore();
60
+ });
61
+ });
62
+
63
+ describe('iframe detection via tsmcp param', () => {
64
+ test('should process directly-added iframes with tsmcp=true', async () => {
65
+ const observer = startAutoMCPFrameRenderer();
66
+
67
+ const iframe = document.createElement('iframe');
68
+ iframe.src = `https://${thoughtSpotHost}/v2/?${Param.Tsmcp}=true#/embed/viz/lb1/tab1`;
69
+ document.body.appendChild(iframe);
70
+
71
+ await new Promise((r) => setTimeout(r, 50));
72
+
73
+ expect(renderIFrameSpy).toHaveBeenCalled();
74
+ observer.disconnect();
75
+ });
76
+
77
+ test('should not process iframes without tsmcp param', async () => {
78
+ const observer = startAutoMCPFrameRenderer();
79
+
80
+ const iframe = document.createElement('iframe');
81
+ iframe.src = `https://${thoughtSpotHost}/v2/?embedApp=true#/embed/viz/lb1`;
82
+ document.body.appendChild(iframe);
83
+
84
+ await new Promise((r) => setTimeout(r, 50));
85
+
86
+ expect(renderIFrameSpy).not.toHaveBeenCalled();
87
+ observer.disconnect();
88
+ });
89
+
90
+ test('should process tsmcp iframes nested inside added elements', async () => {
91
+ const observer = startAutoMCPFrameRenderer();
92
+
93
+ const wrapper = document.createElement('div');
94
+ const iframe = document.createElement('iframe');
95
+ iframe.src = `https://${thoughtSpotHost}/?${Param.Tsmcp}=true`;
96
+ wrapper.appendChild(iframe);
97
+ document.body.appendChild(wrapper);
98
+
99
+ await new Promise((r) => setTimeout(r, 50));
100
+
101
+ expect(renderIFrameSpy).toHaveBeenCalled();
102
+ observer.disconnect();
103
+ });
104
+
105
+ test('should not process nested iframes without tsmcp param', async () => {
106
+ const observer = startAutoMCPFrameRenderer();
107
+
108
+ const wrapper = document.createElement('div');
109
+ const iframe = document.createElement('iframe');
110
+ iframe.src = `https://${thoughtSpotHost}/?embedApp=true`;
111
+ wrapper.appendChild(iframe);
112
+ document.body.appendChild(wrapper);
113
+
114
+ await new Promise((r) => setTimeout(r, 50));
115
+
116
+ expect(renderIFrameSpy).not.toHaveBeenCalled();
117
+ observer.disconnect();
118
+ });
119
+
120
+ test('should ignore non-iframe element nodes', async () => {
121
+ const observer = startAutoMCPFrameRenderer();
122
+
123
+ const div = document.createElement('div');
124
+ div.textContent = `${Param.Tsmcp}=true`;
125
+ document.body.appendChild(div);
126
+
127
+ await new Promise((r) => setTimeout(r, 50));
128
+
129
+ expect(renderIFrameSpy).not.toHaveBeenCalled();
130
+ observer.disconnect();
131
+ });
132
+
133
+ test('should ignore text nodes', async () => {
134
+ const observer = startAutoMCPFrameRenderer();
135
+
136
+ const text = document.createTextNode('tsmcp=true');
137
+ document.body.appendChild(text);
138
+
139
+ await new Promise((r) => setTimeout(r, 50));
140
+
141
+ expect(renderIFrameSpy).not.toHaveBeenCalled();
142
+ observer.disconnect();
143
+ });
144
+
145
+ test('should process multiple tsmcp iframes in one mutation', async () => {
146
+ const observer = startAutoMCPFrameRenderer();
147
+
148
+ const wrapper = document.createElement('div');
149
+ const iframe1 = document.createElement('iframe');
150
+ iframe1.src = `https://${thoughtSpotHost}/?${Param.Tsmcp}=true&id=1`;
151
+ const iframe2 = document.createElement('iframe');
152
+ iframe2.src = `https://${thoughtSpotHost}/?${Param.Tsmcp}=true&id=2`;
153
+ wrapper.appendChild(iframe1);
154
+ wrapper.appendChild(iframe2);
155
+ document.body.appendChild(wrapper);
156
+
157
+ await new Promise((r) => setTimeout(r, 50));
158
+
159
+ expect(renderIFrameSpy).toHaveBeenCalledTimes(2);
160
+ observer.disconnect();
161
+ });
162
+
163
+ test('should ignore iframes with invalid src URLs', async () => {
164
+ const observer = startAutoMCPFrameRenderer();
165
+
166
+ const iframe = document.createElement('iframe');
167
+ iframe.src = 'about:blank';
168
+ document.body.appendChild(iframe);
169
+
170
+ await new Promise((r) => setTimeout(r, 50));
171
+
172
+ expect(renderIFrameSpy).not.toHaveBeenCalled();
173
+ observer.disconnect();
174
+ });
175
+ });
176
+
177
+ describe('handleInsertionIntoDOM override', () => {
178
+ test('should replace the original iframe when renderIFrame inserts DOM', async () => {
179
+ renderIFrameSpy.mockRestore();
180
+
181
+ const replaceSpy = jest.fn();
182
+
183
+ renderIFrameSpy = jest.spyOn(
184
+ TsEmbed.prototype as any,
185
+ 'renderIFrame',
186
+ ).mockImplementation(async function (this: any) {
187
+ const newIframe = document.createElement('iframe');
188
+ newIframe.src = 'https://replaced.example.com';
189
+ this.frameToReplace.replaceWith = replaceSpy;
190
+ this.handleInsertionIntoDOM(newIframe);
191
+ });
192
+
193
+ const observer = startAutoMCPFrameRenderer();
194
+
195
+ const iframe = document.createElement('iframe');
196
+ iframe.src = `https://${thoughtSpotHost}/?${Param.Tsmcp}=true`;
197
+ document.body.appendChild(iframe);
198
+
199
+ await new Promise((r) => setTimeout(r, 50));
200
+
201
+ expect(replaceSpy).toHaveBeenCalled();
202
+ observer.disconnect();
203
+ });
204
+ });
205
+
206
+ describe('viewConfig forwarding', () => {
207
+ test('should accept empty viewConfig', () => {
208
+ const observer = startAutoMCPFrameRenderer({});
209
+ expect(observer).toBeInstanceOf(MutationObserver);
210
+ observer.disconnect();
211
+ });
212
+
213
+ test('should accept no arguments (default empty config)', () => {
214
+ const observer = startAutoMCPFrameRenderer();
215
+ expect(observer).toBeInstanceOf(MutationObserver);
216
+ observer.disconnect();
217
+ });
218
+ });
219
+
220
+ describe('getMCPIframeSrc URL construction', () => {
221
+ test('should strip tsmcp param and merge embed params into rendered src', async () => {
222
+ let capturedSrc = '';
223
+ renderIFrameSpy.mockRestore();
224
+ renderIFrameSpy = jest.spyOn(
225
+ TsEmbed.prototype as any,
226
+ 'renderIFrame',
227
+ ).mockImplementation(async function (this: any, src: string) {
228
+ capturedSrc = src;
229
+ });
230
+
231
+ const observer = startAutoMCPFrameRenderer();
232
+
233
+ const iframe = document.createElement('iframe');
234
+ iframe.src = `https://${thoughtSpotHost}/v2/?${Param.Tsmcp}=true&customParam=hello#/embed/viz`;
235
+ document.body.appendChild(iframe);
236
+
237
+ await new Promise((r) => setTimeout(r, 50));
238
+
239
+ expect(capturedSrc).not.toContain(`${Param.Tsmcp}=true`);
240
+ expect(capturedSrc).toContain('customParam=hello');
241
+ observer.disconnect();
242
+ });
243
+
244
+ test('should preserve hash from original iframe src', async () => {
245
+ let capturedSrc = '';
246
+ renderIFrameSpy.mockRestore();
247
+ renderIFrameSpy = jest.spyOn(
248
+ TsEmbed.prototype as any,
249
+ 'renderIFrame',
250
+ ).mockImplementation(async function (this: any, src: string) {
251
+ capturedSrc = src;
252
+ });
253
+
254
+ const observer = startAutoMCPFrameRenderer();
255
+
256
+ const iframe = document.createElement('iframe');
257
+ iframe.src = `https://${thoughtSpotHost}/v2/?${Param.Tsmcp}=true#/embed/viz/lb123`;
258
+ document.body.appendChild(iframe);
259
+
260
+ await new Promise((r) => setTimeout(r, 50));
261
+
262
+ expect(capturedSrc).toContain('/embed/viz/lb123');
263
+ observer.disconnect();
264
+ });
265
+ });
266
+ });