@thoughtspot/visual-embed-sdk 1.52.2-beta.1 → 1.53.0

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 (237) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/css-variables.d.ts +373 -5
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts +14 -0
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +6 -3
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +28 -0
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/auto-frame-renderer.d.ts.map +1 -1
  11. package/cjs/src/embed/auto-frame-renderer.js +244 -4
  12. package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
  13. package/cjs/src/embed/auto-frame-renderer.spec.js +389 -0
  14. package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
  15. package/cjs/src/embed/bodyless-conversation.js +1 -1
  16. package/cjs/src/embed/bodyless-conversation.js.map +1 -1
  17. package/cjs/src/embed/conversation.d.ts +15 -0
  18. package/cjs/src/embed/conversation.d.ts.map +1 -1
  19. package/cjs/src/embed/conversation.js +7 -3
  20. package/cjs/src/embed/conversation.js.map +1 -1
  21. package/cjs/src/embed/conversation.spec.js +66 -0
  22. package/cjs/src/embed/conversation.spec.js.map +1 -1
  23. package/cjs/src/embed/liveboard-override-utils.d.ts +59 -0
  24. package/cjs/src/embed/liveboard-override-utils.d.ts.map +1 -0
  25. package/cjs/src/embed/liveboard-override-utils.js +19 -0
  26. package/cjs/src/embed/liveboard-override-utils.js.map +1 -0
  27. package/cjs/src/embed/liveboard-override-utils.spec.d.ts +2 -0
  28. package/cjs/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
  29. package/cjs/src/embed/liveboard-override-utils.spec.js +34 -0
  30. package/cjs/src/embed/liveboard-override-utils.spec.js.map +1 -0
  31. package/cjs/src/embed/liveboard.d.ts +43 -1
  32. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  33. package/cjs/src/embed/liveboard.js +11 -18
  34. package/cjs/src/embed/liveboard.js.map +1 -1
  35. package/cjs/src/embed/liveboard.spec.js +104 -54
  36. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  37. package/cjs/src/embed/search-bar.js +1 -1
  38. package/cjs/src/embed/search-bar.js.map +1 -1
  39. package/cjs/src/embed/search.js +1 -1
  40. package/cjs/src/embed/search.js.map +1 -1
  41. package/cjs/src/embed/search.spec.js +20 -0
  42. package/cjs/src/embed/search.spec.js.map +1 -1
  43. package/cjs/src/embed/spotter-utils.d.ts +11 -0
  44. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  45. package/cjs/src/embed/spotter-utils.js +13 -1
  46. package/cjs/src/embed/spotter-utils.js.map +1 -1
  47. package/cjs/src/embed/spotter-viz-utils.d.ts +15 -0
  48. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  49. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  50. package/cjs/src/embed/spotter-viz-utils.spec.js +11 -0
  51. package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -1
  52. package/cjs/src/embed/ts-embed.d.ts +27 -34
  53. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  54. package/cjs/src/embed/ts-embed.js +224 -102
  55. package/cjs/src/embed/ts-embed.js.map +1 -1
  56. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  57. package/cjs/src/embed/ts-embed.spec.js +543 -171
  58. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  59. package/cjs/src/index.d.ts +4 -2
  60. package/cjs/src/index.d.ts.map +1 -1
  61. package/cjs/src/index.js +4 -2
  62. package/cjs/src/index.js.map +1 -1
  63. package/cjs/src/mixpanel-service.d.ts +1 -0
  64. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  65. package/cjs/src/mixpanel-service.js +1 -0
  66. package/cjs/src/mixpanel-service.js.map +1 -1
  67. package/cjs/src/react/all-types-export.d.ts +1 -1
  68. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  69. package/cjs/src/react/all-types-export.js +2 -1
  70. package/cjs/src/react/all-types-export.js.map +1 -1
  71. package/cjs/src/types.d.ts +182 -2
  72. package/cjs/src/types.d.ts.map +1 -1
  73. package/cjs/src/types.js +109 -0
  74. package/cjs/src/types.js.map +1 -1
  75. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  76. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  77. package/cjs/src/utils/graphql/answerService/answer-queries.js +8 -1
  78. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  79. package/cjs/src/utils/graphql/answerService/answerService.d.ts +28 -4
  80. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  81. package/cjs/src/utils/graphql/answerService/answerService.js +39 -4
  82. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  83. package/cjs/src/utils/graphql/answerService/answerService.spec.js +124 -0
  84. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  85. package/dist/{index-Bt56pC82.js → index-CyDR8j_0.js} +1 -1
  86. package/dist/src/css-variables.d.ts +373 -5
  87. package/dist/src/css-variables.d.ts.map +1 -1
  88. package/dist/src/embed/app.d.ts +14 -0
  89. package/dist/src/embed/app.d.ts.map +1 -1
  90. package/dist/src/embed/auto-frame-renderer.d.ts.map +1 -1
  91. package/dist/src/embed/conversation.d.ts +15 -0
  92. package/dist/src/embed/conversation.d.ts.map +1 -1
  93. package/dist/src/embed/liveboard-override-utils.d.ts +59 -0
  94. package/dist/src/embed/liveboard-override-utils.d.ts.map +1 -0
  95. package/dist/src/embed/liveboard-override-utils.spec.d.ts +2 -0
  96. package/dist/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
  97. package/dist/src/embed/liveboard.d.ts +43 -1
  98. package/dist/src/embed/liveboard.d.ts.map +1 -1
  99. package/dist/src/embed/spotter-utils.d.ts +11 -0
  100. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  101. package/dist/src/embed/spotter-viz-utils.d.ts +15 -0
  102. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  103. package/dist/src/embed/ts-embed.d.ts +27 -34
  104. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  105. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  106. package/dist/src/index.d.ts +4 -2
  107. package/dist/src/index.d.ts.map +1 -1
  108. package/dist/src/mixpanel-service.d.ts +1 -0
  109. package/dist/src/mixpanel-service.d.ts.map +1 -1
  110. package/dist/src/react/all-types-export.d.ts +1 -1
  111. package/dist/src/react/all-types-export.d.ts.map +1 -1
  112. package/dist/src/types.d.ts +182 -2
  113. package/dist/src/types.d.ts.map +1 -1
  114. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  115. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  116. package/dist/src/utils/graphql/answerService/answerService.d.ts +28 -4
  117. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  118. package/dist/tsembed-react.es.js +437 -175
  119. package/dist/tsembed-react.js +436 -174
  120. package/dist/tsembed.es.js +680 -180
  121. package/dist/tsembed.js +678 -178
  122. package/dist/visual-embed-sdk-react-full.d.ts +702 -44
  123. package/dist/visual-embed-sdk-react.d.ts +697 -44
  124. package/dist/visual-embed-sdk.d.ts +729 -45
  125. package/lib/package.json +1 -1
  126. package/lib/src/css-variables.d.ts +373 -5
  127. package/lib/src/css-variables.d.ts.map +1 -1
  128. package/lib/src/embed/app.d.ts +14 -0
  129. package/lib/src/embed/app.d.ts.map +1 -1
  130. package/lib/src/embed/app.js +7 -4
  131. package/lib/src/embed/app.js.map +1 -1
  132. package/lib/src/embed/app.spec.js +28 -0
  133. package/lib/src/embed/app.spec.js.map +1 -1
  134. package/lib/src/embed/auto-frame-renderer.d.ts.map +1 -1
  135. package/lib/src/embed/auto-frame-renderer.js +244 -4
  136. package/lib/src/embed/auto-frame-renderer.js.map +1 -1
  137. package/lib/src/embed/auto-frame-renderer.spec.js +389 -0
  138. package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
  139. package/lib/src/embed/bodyless-conversation.js +1 -1
  140. package/lib/src/embed/bodyless-conversation.js.map +1 -1
  141. package/lib/src/embed/conversation.d.ts +15 -0
  142. package/lib/src/embed/conversation.d.ts.map +1 -1
  143. package/lib/src/embed/conversation.js +8 -4
  144. package/lib/src/embed/conversation.js.map +1 -1
  145. package/lib/src/embed/conversation.spec.js +67 -1
  146. package/lib/src/embed/conversation.spec.js.map +1 -1
  147. package/lib/src/embed/liveboard-override-utils.d.ts +59 -0
  148. package/lib/src/embed/liveboard-override-utils.d.ts.map +1 -0
  149. package/lib/src/embed/liveboard-override-utils.js +15 -0
  150. package/lib/src/embed/liveboard-override-utils.js.map +1 -0
  151. package/lib/src/embed/liveboard-override-utils.spec.d.ts +2 -0
  152. package/lib/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
  153. package/lib/src/embed/liveboard-override-utils.spec.js +32 -0
  154. package/lib/src/embed/liveboard-override-utils.spec.js.map +1 -0
  155. package/lib/src/embed/liveboard.d.ts +43 -1
  156. package/lib/src/embed/liveboard.d.ts.map +1 -1
  157. package/lib/src/embed/liveboard.js +11 -17
  158. package/lib/src/embed/liveboard.js.map +1 -1
  159. package/lib/src/embed/liveboard.spec.js +104 -54
  160. package/lib/src/embed/liveboard.spec.js.map +1 -1
  161. package/lib/src/embed/search-bar.js +1 -1
  162. package/lib/src/embed/search-bar.js.map +1 -1
  163. package/lib/src/embed/search.js +1 -1
  164. package/lib/src/embed/search.js.map +1 -1
  165. package/lib/src/embed/search.spec.js +20 -0
  166. package/lib/src/embed/search.spec.js.map +1 -1
  167. package/lib/src/embed/spotter-utils.d.ts +11 -0
  168. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  169. package/lib/src/embed/spotter-utils.js +12 -0
  170. package/lib/src/embed/spotter-utils.js.map +1 -1
  171. package/lib/src/embed/spotter-viz-utils.d.ts +15 -0
  172. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  173. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  174. package/lib/src/embed/spotter-viz-utils.spec.js +11 -0
  175. package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -1
  176. package/lib/src/embed/ts-embed.d.ts +27 -34
  177. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  178. package/lib/src/embed/ts-embed.js +224 -102
  179. package/lib/src/embed/ts-embed.js.map +1 -1
  180. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  181. package/lib/src/embed/ts-embed.spec.js +544 -172
  182. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  183. package/lib/src/index.d.ts +4 -2
  184. package/lib/src/index.d.ts.map +1 -1
  185. package/lib/src/index.js +3 -2
  186. package/lib/src/index.js.map +1 -1
  187. package/lib/src/mixpanel-service.d.ts +1 -0
  188. package/lib/src/mixpanel-service.d.ts.map +1 -1
  189. package/lib/src/mixpanel-service.js +1 -0
  190. package/lib/src/mixpanel-service.js.map +1 -1
  191. package/lib/src/react/all-types-export.d.ts +1 -1
  192. package/lib/src/react/all-types-export.d.ts.map +1 -1
  193. package/lib/src/react/all-types-export.js +1 -1
  194. package/lib/src/react/all-types-export.js.map +1 -1
  195. package/lib/src/types.d.ts +182 -2
  196. package/lib/src/types.d.ts.map +1 -1
  197. package/lib/src/types.js +109 -0
  198. package/lib/src/types.js.map +1 -1
  199. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  200. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  201. package/lib/src/utils/graphql/answerService/answer-queries.js +7 -0
  202. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  203. package/lib/src/utils/graphql/answerService/answerService.d.ts +28 -4
  204. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  205. package/lib/src/utils/graphql/answerService/answerService.js +39 -4
  206. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  207. package/lib/src/utils/graphql/answerService/answerService.spec.js +125 -1
  208. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  209. package/lib/src/visual-embed-sdk.d.ts +729 -45
  210. package/package.json +1 -1
  211. package/src/css-variables.ts +475 -26
  212. package/src/embed/app.spec.ts +32 -0
  213. package/src/embed/app.ts +28 -4
  214. package/src/embed/auto-frame-renderer.spec.ts +464 -0
  215. package/src/embed/auto-frame-renderer.ts +305 -6
  216. package/src/embed/bodyless-conversation.ts +1 -1
  217. package/src/embed/conversation.spec.ts +94 -1
  218. package/src/embed/conversation.ts +28 -3
  219. package/src/embed/liveboard-override-utils.spec.ts +38 -0
  220. package/src/embed/liveboard-override-utils.ts +71 -0
  221. package/src/embed/liveboard.spec.ts +119 -62
  222. package/src/embed/liveboard.ts +56 -21
  223. package/src/embed/search-bar.tsx +1 -1
  224. package/src/embed/search.spec.ts +23 -0
  225. package/src/embed/search.ts +1 -1
  226. package/src/embed/spotter-utils.ts +12 -0
  227. package/src/embed/spotter-viz-utils.spec.ts +11 -0
  228. package/src/embed/spotter-viz-utils.ts +15 -0
  229. package/src/embed/ts-embed.spec.ts +684 -213
  230. package/src/embed/ts-embed.ts +227 -97
  231. package/src/index.ts +16 -1
  232. package/src/mixpanel-service.ts +1 -0
  233. package/src/react/all-types-export.ts +6 -0
  234. package/src/types.ts +186 -5
  235. package/src/utils/graphql/answerService/answer-queries.ts +8 -0
  236. package/src/utils/graphql/answerService/answerService.spec.ts +145 -1
  237. package/src/utils/graphql/answerService/answerService.ts +65 -3
@@ -12,7 +12,7 @@ import { isMessageFromIframe } from '../utils/transport/iframe-transport';
12
12
  import { logger } from '../utils/logger';
13
13
  import { getAuthenticationToken } from '../authToken';
14
14
  import { AnswerService } from '../utils/graphql/answerService/answerService';
15
- import { getEncodedQueryParamsString, getCssDimension, embedEventStatus, setAttributes, getCustomisations, getRuntimeFilters, getDOMNode, querySelectorAcrossShadowRoot, getFilterQuery, getQueryParamString, getRuntimeParameters, setStyleProperties, removeStyleProperties, getHostEventsConfig, deserializeParam, getScrollableAncestors, } from '../utils';
15
+ import { getEncodedQueryParamsString, getCssDimension, embedEventStatus, setAttributes, getCustomisations, getRuntimeFilters, getDOMNode, querySelectorAcrossShadowRoot, getFilterQuery, getQueryParamString, getRuntimeParameters, setStyleProperties, removeStyleProperties, getHostEventsConfig, deserializeParam, setParamIfDefined, } from '../utils';
16
16
  import { getCustomActions } from '../utils/custom-actions';
17
17
  import { getThoughtSpotHost, URL_MAX_LENGTH, DEFAULT_EMBED_WIDTH, DEFAULT_EMBED_HEIGHT, getV2BasePath, } from '../config';
18
18
  import { AuthType, HostEvent, EmbedEvent, Action, Param, ContextMenuTriggerOptions, EmbedErrorSeverity, ErrorDetailsTypes, EmbedErrorCodes, } from '../types';
@@ -39,9 +39,6 @@ const TS_EMBED_ID = '_thoughtspot-embed';
39
39
  */
40
40
  const PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY = 'tsEmbedOriginalPosition';
41
41
  const PRERENDER_WRAPPER_ID_PREFIX = 'tsEmbed-pre-render-wrapper-';
42
- const PRERENDER_PARKED_TRANSFORM = 'translateY(-100%)';
43
- /** The height createPreRenderWrapper() seeds before anything is measured. */
44
- const UNMEASURED_WRAPPER_HEIGHT = '100vh';
45
42
  // The container applies UpdateEmbedParams through React state, so a delivered
46
43
  // post is not the same as the params being in effect.
47
44
  const UPDATE_EMBED_PARAMS_SETTLE_MS = 200;
@@ -49,6 +46,97 @@ const UPDATE_EMBED_PARAMS_SETTLE_MS = 200;
49
46
  // truthy, so null or '' leaves the previous embed's values in place. '&' is
50
47
  // truthy and parses to {}.
51
48
  const NO_RUNTIME_PARAMS = '&';
49
+ /**
50
+ * Params kept on the iframe `src` when `excludeConfigFromURL` is set. The rest
51
+ * are sent in the APP_INIT payload.
52
+ * @internal
53
+ */
54
+ export const BOOTSTRAP_URL_PARAMS = new Set([
55
+ // Marks the app as embedded.
56
+ Param.EmbedApp,
57
+ // The host page URL, used to validate the postMessage origin.
58
+ Param.HostAppUrl,
59
+ // The SDK version.
60
+ Param.Version,
61
+ // The authentication type set in init.
62
+ Param.AuthType,
63
+ // Whether the app signs the user in automatically.
64
+ Param.AutoLogin,
65
+ // Stops the app from redirecting to its login page.
66
+ Param.DisableLoginRedirect,
67
+ // Forces the SAML redirect for EmbeddedSSO.
68
+ Param.ForceSAMLAutoRedirect,
69
+ // Set for cookieless trusted authentication.
70
+ Param.cookieless,
71
+ // Lets the app use the pre-fetched auth info.
72
+ Param.preAuthCache,
73
+ // Blocks access to the full app outside the embed.
74
+ Param.blockNonEmbedFullAppAccess,
75
+ // The org to load, which the auth info depends on.
76
+ Param.OverrideOrgId,
77
+ // The host window height when the iframe loads.
78
+ Param.ViewPortHeight,
79
+ // The host window width when the iframe loads.
80
+ Param.ViewPortWidth,
81
+ // The app's client log level.
82
+ Param.ClientLogLevel,
83
+ // Lets the app override the native console.
84
+ Param.OverrideNativeConsole,
85
+ // An extra Pendo tracking key.
86
+ Param.PendoTrackingKey,
87
+ // The locale for number formatting.
88
+ Param.NumberFormatLocale,
89
+ // The locale for date formatting.
90
+ Param.DateFormatLocale,
91
+ // The currency format.
92
+ Param.CurrencyFormat,
93
+ // The UI language.
94
+ Param.Locale,
95
+ // Turns on dark mode.
96
+ Param.IsDarkMode,
97
+ // Turns on the radiant theme that dark mode needs.
98
+ Param.RadiantThemeEnabled,
99
+ // Marks a SearchEmbed or SearchBarEmbed.
100
+ Param.searchEmbed,
101
+ // Marks a LiveboardEmbed.
102
+ Param.livedBoardEmbed,
103
+ // Marks a SpotterAgentEmbed.
104
+ Param.isSpotterAgentEmbed,
105
+ // Marks a SpotterEmbed.
106
+ Param.SpotterEnabled,
107
+ // Marks an AppEmbed.
108
+ Param.IsFullAppEmbed,
109
+ // Legacy flag for the onBeforeGetVizData API intercept.
110
+ Param.IsOnBeforeGetVizDataInterceptEnabled,
111
+ // Lets the host override links in the app.
112
+ Param.LinkOverride,
113
+ // Turns on version 2 of the link overrides.
114
+ Param.EnableLinkOverridesV2,
115
+ // Stops links from opening in a new tab.
116
+ Param.DisableRedirectionLinksInNewTab,
117
+ // Uses replaceState instead of pushState for app navigation.
118
+ Param.OverrideHistoryState,
119
+ // Shows search results as a table.
120
+ Param.ForceTable,
121
+ // The URL of the custom string IDs file.
122
+ Param.StringIDsUrl,
123
+ // The data sources that search opens with.
124
+ Param.DataSources,
125
+ // Exposes translation IDs in the app.
126
+ Param.ExposeTranslationIDs,
127
+ // The URL of the custom icon sprite.
128
+ Param.IconSpriteUrl,
129
+ // The tag that filters the metadata lists in an AppEmbed.
130
+ Param.Tag,
131
+ // Set when a Liveboard embed shows a single visualization (vizId).
132
+ Param.vizEmbed,
133
+ // Whether search opens with the last-selected data sources.
134
+ Param.UseLastSelectedDataSource,
135
+ // The query mode Spotter opens in.
136
+ Param.DefaultQueryMode,
137
+ // The initial search query. Omitted with excludeSearchTokenStringFromURL.
138
+ Param.searchTokenString,
139
+ ]);
52
140
  /**
53
141
  * The event id map from v2 event names to v1 event id
54
142
  * v1 events are the classic embed events implemented in Blink v1
@@ -77,6 +165,7 @@ export class TsEmbed {
77
165
  this.embedNodeKey = '__tsEmbed';
78
166
  this.embedContainerLoadedKey = '__tsEmbedContainerLoaded';
79
167
  this.isAppInitialized = false;
168
+ this.initDataParams = {};
80
169
  /**
81
170
  * Should we encode URL Query Params using base64 encoding which ThoughtSpot
82
171
  * will generate for embedding. This provides additional security to
@@ -86,6 +175,7 @@ export class TsEmbed {
86
175
  this.shouldEncodeUrlQueryParams = false;
87
176
  this.defaultHiddenActions = [Action.ReportError];
88
177
  this.preRenderContainerEl = document.body;
178
+ this.containerScrollListener = null;
89
179
  /**
90
180
  * Handler for fullscreen change events
91
181
  */
@@ -111,7 +201,7 @@ export class TsEmbed {
111
201
  */
112
202
  this.appInitCb = async (_, responder) => {
113
203
  try {
114
- const appInitData = await this.getAppInitData();
204
+ const appInitData = this.withInitDataParams(await this.getAppInitData());
115
205
  this.isAppInitialized = true;
116
206
  responder({
117
207
  type: EmbedEvent.APP_INIT,
@@ -539,6 +629,18 @@ export class TsEmbed {
539
629
  async getAppInitData() {
540
630
  return this.getDefaultAppInitData();
541
631
  }
632
+ withInitDataParams(appInitData) {
633
+ if (isEmpty(this.initDataParams)) {
634
+ return appInitData;
635
+ }
636
+ return {
637
+ ...appInitData,
638
+ embedParams: {
639
+ ...this.initDataParams,
640
+ ...(appInitData.embedParams || {}),
641
+ },
642
+ };
643
+ }
542
644
  /**
543
645
  * Helper method to refresh/update auth token for TrustedAuthTokenCookieless auth type
544
646
  * @param responder - Function to send response back
@@ -598,7 +700,7 @@ export class TsEmbed {
598
700
  * @returns queryParams
599
701
  */
600
702
  getBaseQueryParams(queryParams = {}) {
601
- var _a, _b, _c, _d;
703
+ var _a, _b, _c, _d, _e;
602
704
  let hostAppUrl = ((_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.host) || '';
603
705
  // The below check is needed because TS Cloud firewall, blocks
604
706
  // localhost/127.0.0.1 in any url param.
@@ -635,6 +737,15 @@ export class TsEmbed {
635
737
  if (this.embedConfig.currencyFormat) {
636
738
  queryParams[Param.CurrencyFormat] = this.embedConfig.currencyFormat;
637
739
  }
740
+ // The view config wins over init, so an embed can opt out of a dark
741
+ // mode set in `init`. `??` and not `||`, so that an explicit `false`
742
+ // overrides an init-level `true`.
743
+ const isDarkMode = (_c = this.viewConfig.isDarkMode) !== null && _c !== void 0 ? _c : this.embedConfig.isDarkMode;
744
+ setParamIfDefined(queryParams, Param.IsDarkMode, isDarkMode, true);
745
+ // The app's dark mode lives in its radiant theme, so turn that on too.
746
+ if (isDarkMode) {
747
+ queryParams[Param.RadiantThemeEnabled] = true;
748
+ }
638
749
  const { disabledActions, disabledActionReason, hiddenActions, visibleActions, hiddenTabs, visibleTabs, showAlerts, additionalFlags: additionalFlagsFromView, locale, customizations, contextMenuTrigger, linkOverride, enableLinkOverridesV2, insertInToSlide, disableRedirectionLinksInNewTab, overrideOrgId, overrideHistoryState, exposeTranslationIDs, primaryAction, } = this.viewConfig;
639
750
  const { additionalFlags: additionalFlagsFromInit } = this.embedConfig;
640
751
  const additionalFlags = {
@@ -700,7 +811,7 @@ export class TsEmbed {
700
811
  if (spriteUrl) {
701
812
  queryParams[Param.IconSpriteUrl] = spriteUrl.replace('https://', '');
702
813
  }
703
- const stringIDsUrl = ((_c = customizations === null || customizations === void 0 ? void 0 : customizations.content) === null || _c === void 0 ? void 0 : _c.stringIDsUrl) || ((_d = embedCustomizations === null || embedCustomizations === void 0 ? void 0 : embedCustomizations.content) === null || _d === void 0 ? void 0 : _d.stringIDsUrl);
814
+ const stringIDsUrl = ((_d = customizations === null || customizations === void 0 ? void 0 : customizations.content) === null || _d === void 0 ? void 0 : _d.stringIDsUrl) || ((_e = embedCustomizations === null || embedCustomizations === void 0 ? void 0 : embedCustomizations.content) === null || _e === void 0 ? void 0 : _e.stringIDsUrl);
704
815
  if (stringIDsUrl) {
705
816
  queryParams[Param.StringIDsUrl] = stringIDsUrl;
706
817
  }
@@ -754,13 +865,32 @@ export class TsEmbed {
754
865
  return path;
755
866
  }
756
867
  getEmbedParams() {
757
- const queryParams = this.getEmbedParamsObject();
868
+ const queryParams = this.getUrlQueryParamsObject();
758
869
  return getQueryParamString(queryParams);
759
870
  }
760
871
  getEmbedParamsObject() {
761
872
  const params = this.getBaseQueryParams();
762
873
  return params;
763
874
  }
875
+ getUrlQueryParamsObject() {
876
+ const queryParams = this.getEmbedParamsObject();
877
+ if (!this.isConfigExcludedFromUrl()) {
878
+ this.initDataParams = {};
879
+ return queryParams;
880
+ }
881
+ const urlParams = {};
882
+ const excludedParams = {};
883
+ Object.entries(queryParams).forEach(([key, value]) => {
884
+ if (BOOTSTRAP_URL_PARAMS.has(key)) {
885
+ urlParams[key] = value;
886
+ }
887
+ else {
888
+ excludedParams[key] = deserializeParam(value);
889
+ }
890
+ });
891
+ this.initDataParams = excludedParams;
892
+ return urlParams;
893
+ }
764
894
  getRootIframeSrc() {
765
895
  const query = this.getEmbedParams();
766
896
  return this.getEmbedBasePath(query);
@@ -933,7 +1063,7 @@ export class TsEmbed {
933
1063
  top: '0',
934
1064
  left: '0',
935
1065
  width: '100vw',
936
- height: UNMEASURED_WRAPPER_HEIGHT,
1066
+ height: '100vh',
937
1067
  };
938
1068
  setStyleProperties(preRenderWrapper, initialPreRenderWrapperStyle);
939
1069
  return preRenderWrapper;
@@ -1001,26 +1131,10 @@ export class TsEmbed {
1001
1131
  return placeholder;
1002
1132
  }
1003
1133
  /**
1004
- * Resolves the configured preRenderContainer to a live element. A string
1005
- * selector is re-queried on every call so a remounted container (E.g.: React
1006
- * replacing the node) resolves to the fresh element; an element passed
1007
- * directly cannot be re-resolved.
1008
- *
1009
- * With nothing configured the frame goes into the host element's nearest
1010
- * scrolling ancestor, falling back to `document.body`.
1011
- *
1012
- * The wrapper is absolutely positioned, so it follows the page for free —
1013
- * but only while it sits inside whatever scrolls. `document.body` is right
1014
- * only when the document itself is the scroller; an app that scrolls an
1015
- * inner element instead left the frame pinned to the viewport while the page
1016
- * moved under it (SCAL-338563). Being inside the scroller also lets wheel
1017
- * events chain out of the frame into it, which they cannot do from
1018
- * `document.body`.
1019
- *
1020
- * A scrolling ancestor is layout chrome rather than route content, so it
1021
- * outlives the embed in practice; and if it does go, the host element goes
1022
- * with it and this instance is remounting anyway.
1023
- * `reconcilePreRenderContainer` re-runs this on a detached container.
1134
+ * Resolves the configured preRenderContainer to a live element, falling
1135
+ * back to `document.body`. A string selector is re-queried on every call so
1136
+ * a remounted container (E.g.: React replacing the node) resolves to the
1137
+ * fresh element; an element passed directly cannot be re-resolved.
1024
1138
  */
1025
1139
  resolvePreRenderContainerTarget() {
1026
1140
  var _a;
@@ -1040,13 +1154,7 @@ export class TsEmbed {
1040
1154
  else if (containerConfig) {
1041
1155
  container = containerConfig;
1042
1156
  }
1043
- if (container) {
1044
- return container;
1045
- }
1046
- if (!this.hostElement) {
1047
- return document.body;
1048
- }
1049
- return (_a = getScrollableAncestors(this.hostElement)[0]) !== null && _a !== void 0 ? _a : document.body;
1157
+ return (_a = container) !== null && _a !== void 0 ? _a : document.body;
1050
1158
  }
1051
1159
  inheritPreRenderContainer() {
1052
1160
  var _a;
@@ -1091,9 +1199,8 @@ export class TsEmbed {
1091
1199
  * Re-attaches the wrapper to a live container when the previously resolved
1092
1200
  * one has been detached or no longer holds the wrapper — e.g. the host app
1093
1201
  * remounted a custom preRenderContainer, which would otherwise leave a stale
1094
- * reference and collapse the wrapper. Selectors and the auto-resolved
1095
- * scrolling ancestor are both re-resolved; a container passed as an element
1096
- * is left untouched, as there is nothing to re-query.
1202
+ * reference and collapse the wrapper. Only string selectors can be
1203
+ * re-resolved; a container passed as an element is left untouched.
1097
1204
  */
1098
1205
  reconcilePreRenderContainer() {
1099
1206
  const wrapper = this.preRenderWrapper;
@@ -1112,6 +1219,14 @@ export class TsEmbed {
1112
1219
  if (resolved === stored && stored.contains(wrapper)) {
1113
1220
  return;
1114
1221
  }
1222
+ if (this.containerScrollListener && stored !== resolved) {
1223
+ if (stored !== document.body) {
1224
+ stored.removeEventListener('scroll', this.containerScrollListener);
1225
+ }
1226
+ if (resolved !== document.body) {
1227
+ resolved.addEventListener('scroll', this.containerScrollListener);
1228
+ }
1229
+ }
1115
1230
  this.preRenderContainerEl = resolved;
1116
1231
  this.applyPreRenderContainerPositioning();
1117
1232
  if (wrapper.parentNode !== resolved) {
@@ -1173,12 +1288,11 @@ export class TsEmbed {
1173
1288
  */
1174
1289
  setIFrameHeight(height) {
1175
1290
  if (this.isPreRendered) {
1176
- const next = getCssDimension(height);
1177
1291
  if (this.insertedDomEl) {
1178
- this.insertedDomEl.style.height = next;
1292
+ this.insertedDomEl.style.height = getCssDimension(height);
1179
1293
  }
1180
1294
  else if (this.preRenderWrapper) {
1181
- this.preRenderWrapper.style.height = next;
1295
+ this.preRenderWrapper.style.height = getCssDimension(height);
1182
1296
  }
1183
1297
  }
1184
1298
  else {
@@ -1462,9 +1576,16 @@ export class TsEmbed {
1462
1576
  * @param args
1463
1577
  */
1464
1578
  async render() {
1579
+ var _a, _b, _c;
1465
1580
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_RENDER_CALLED, {
1466
1581
  embedComponentType: this.viewConfig.embedComponentType,
1467
1582
  });
1583
+ uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_INIT_ACTIONS, {
1584
+ embedComponentType: this.viewConfig.embedComponentType,
1585
+ hiddenActions: (_a = this.viewConfig.hiddenActions) !== null && _a !== void 0 ? _a : [],
1586
+ visibleActions: (_b = this.viewConfig.visibleActions) !== null && _b !== void 0 ? _b : [],
1587
+ disabledActions: (_c = this.viewConfig.disabledActions) !== null && _c !== void 0 ? _c : [],
1588
+ });
1468
1589
  if (!getIsInitCalled()) {
1469
1590
  logger.error(ERROR_MESSAGE.RENDER_CALLED_BEFORE_INIT);
1470
1591
  }
@@ -1613,47 +1734,34 @@ export class TsEmbed {
1613
1734
  delete container.dataset[PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY];
1614
1735
  }
1615
1736
  /**
1616
- * Re-sizes the wrapper when its placeholder changes size.
1617
- *
1618
- * Position deliberately has no equivalent. An absolutely positioned wrapper
1619
- * follows its containing block for free, so a correctly placed frame is the
1620
- * browser's job and costs nothing; repositioning it on scroll would mean a
1621
- * layout read and a style write per frame to compensate for placing it in
1622
- * the wrong box. Size is the one thing the browser will not do for us: the
1623
- * placeholder grows when the embedded app reports a new height, and the
1624
- * wrapper has to be told.
1737
+ * Detaches and clears the container scroll listener, if one is attached.
1625
1738
  */
1626
- observePreRenderSize() {
1627
- var _a;
1628
- if (this.getPreRenderConfig().doNotTrackSize || typeof ResizeObserver === 'undefined') {
1739
+ removeContainerScrollListener() {
1740
+ if (!this.containerScrollListener) {
1629
1741
  return;
1630
1742
  }
1631
- const placeholder = this.getPreRenderPlaceHolderElement();
1632
- if (!placeholder) {
1633
- return;
1634
- }
1635
- (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
1636
- this.resizeObserver = new ResizeObserver(() => this.syncPreRenderStyle());
1637
- this.resizeObserver.observe(placeholder);
1743
+ const customContainer = this.getCustomPreRenderContainer();
1744
+ customContainer === null || customContainer === void 0 ? void 0 : customContainer.removeEventListener('scroll', this.containerScrollListener);
1745
+ this.containerScrollListener = null;
1638
1746
  }
1639
1747
  /**
1640
1748
  * Destroys the ThoughtSpot embed, and remove any nodes from the DOM.
1641
1749
  * @version SDK: 1.19.1 | ThoughtSpot: *
1642
1750
  */
1643
1751
  destroy() {
1644
- var _a, _b, _c, _d;
1752
+ var _a, _b, _c;
1645
1753
  try {
1646
1754
  this.removeFullscreenChangeHandler();
1647
- (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
1755
+ this.removeContainerScrollListener();
1648
1756
  this.unsubscribeToEvents();
1649
- (_b = this.preRenderWrapper) === null || _b === void 0 ? void 0 : _b.remove();
1757
+ (_a = this.preRenderWrapper) === null || _a === void 0 ? void 0 : _a.remove();
1650
1758
  this.restorePreRenderContainerPosition();
1651
1759
  if (!this.isRendered) {
1652
1760
  return;
1653
1761
  }
1654
1762
  if (!getEmbedConfig().waitForCleanupOnDestroy) {
1655
1763
  this.trigger(HostEvent.DestroyEmbed);
1656
- (_d = (_c = this.insertedDomEl) === null || _c === void 0 ? void 0 : _c.parentNode) === null || _d === void 0 ? void 0 : _d.removeChild(this.insertedDomEl);
1764
+ (_c = (_b = this.insertedDomEl) === null || _b === void 0 ? void 0 : _b.parentNode) === null || _c === void 0 ? void 0 : _c.removeChild(this.insertedDomEl);
1657
1765
  }
1658
1766
  else {
1659
1767
  const cleanupTimeout = getEmbedConfig().cleanupTimeout;
@@ -1699,6 +1807,26 @@ export class TsEmbed {
1699
1807
  this.isRendered = true;
1700
1808
  return this.renderIFrame(prerenderFrameSrc);
1701
1809
  }
1810
+ isConfigExcludedFromUrl() {
1811
+ var _a, _b, _c;
1812
+ const flag = (_b = (_a = this.viewConfig.additionalFlags) === null || _a === void 0 ? void 0 : _a.excludeConfigFromURL) !== null && _b !== void 0 ? _b : (_c = this.embedConfig.additionalFlags) === null || _c === void 0 ? void 0 : _c.excludeConfigFromURL;
1813
+ return flag === true || flag === 'true';
1814
+ }
1815
+ async triggerUpdateEmbedParams() {
1816
+ try {
1817
+ const params = await this.getUpdateEmbedParamsObject();
1818
+ this.trigger(HostEvent.UpdateEmbedParams, params);
1819
+ }
1820
+ catch (error) {
1821
+ logger.error(ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
1822
+ this.handleError({
1823
+ errorType: ErrorDetailsTypes.API,
1824
+ message: (error === null || error === void 0 ? void 0 : error.message) || ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
1825
+ code: EmbedErrorCodes.UPDATE_PARAMS_FAILED,
1826
+ error: (error === null || error === void 0 ? void 0 : error.message) || error,
1827
+ });
1828
+ }
1829
+ }
1702
1830
  beforePrerenderVisible() {
1703
1831
  // We can ignore this as its a bit expensive and the newer customers
1704
1832
  // have moved on to UpdateEmbedParams supported clusters
@@ -1709,17 +1837,7 @@ export class TsEmbed {
1709
1837
  this.preRenderParamsApplied = new Promise((resolve) => {
1710
1838
  this.executeAfterEmbedContainerLoaded(async () => {
1711
1839
  try {
1712
- const params = await this.getUpdateEmbedParamsObject();
1713
- this.trigger(HostEvent.UpdateEmbedParams, params);
1714
- }
1715
- catch (error) {
1716
- logger.error(ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
1717
- this.handleError({
1718
- errorType: ErrorDetailsTypes.API,
1719
- message: (error === null || error === void 0 ? void 0 : error.message) || ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
1720
- code: EmbedErrorCodes.UPDATE_PARAMS_FAILED,
1721
- error: (error === null || error === void 0 ? void 0 : error.message) || error,
1722
- });
1840
+ await this.triggerUpdateEmbedParams();
1723
1841
  }
1724
1842
  finally {
1725
1843
  setTimeout(resolve, UPDATE_EMBED_PARAMS_SETTLE_MS);
@@ -1734,7 +1852,7 @@ export class TsEmbed {
1734
1852
  * wrapper to overlay it.
1735
1853
  */
1736
1854
  async showPreRender() {
1737
- var _a;
1855
+ var _a, _b;
1738
1856
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_SHOW_PRE_RENDER, {
1739
1857
  preRenderId: this.getPreRenderConfig().id,
1740
1858
  embedComponentType: this.viewConfig.embedComponentType,
@@ -1753,16 +1871,14 @@ export class TsEmbed {
1753
1871
  this.beforePrerenderVisible();
1754
1872
  if (this.hostElement) {
1755
1873
  this.insertedDomEl = this.createPreRenderPlaceholder();
1756
- // Carry a height fullHeight has already measured onto the fresh
1757
- // placeholder, so a re-show does not flash at frameParams height.
1758
- // UNMEASURED_WRAPPER_HEIGHT is what createPreRenderWrapper() seeds
1759
- // before anything has been measured; treating that as a measurement
1760
- // is what made a first reveal overshoot to a full viewport.
1761
- const wrapperHeight = this.preRenderWrapper.style.height;
1762
- if (this.viewConfig.fullHeight
1763
- && wrapperHeight
1764
- && wrapperHeight !== UNMEASURED_WRAPPER_HEIGHT) {
1765
- this.insertedDomEl.style.height = wrapperHeight;
1874
+ if (this.viewConfig.fullHeight) {
1875
+ // If fullHeight has already sized the wrapper, seed the
1876
+ // placeholder with the same height so syncPreRenderStyle gets
1877
+ // an accurate rect.
1878
+ const existingHeight = this.preRenderWrapper.style.height;
1879
+ if (existingHeight) {
1880
+ this.insertedDomEl.style.height = existingHeight;
1881
+ }
1766
1882
  }
1767
1883
  const placeHolderId = this.getPreRenderIds().placeHolder;
1768
1884
  // Remove any stale placeholder from a previous cycle. It is located
@@ -1776,19 +1892,29 @@ export class TsEmbed {
1776
1892
  (_a = this.hostElement.querySelector(`#${placeHolderId}`)) === null || _a === void 0 ? void 0 : _a.remove();
1777
1893
  this.hostElement.appendChild(this.insertedDomEl);
1778
1894
  this.syncPreRenderStyle();
1779
- this.observePreRenderSize();
1895
+ const customContainer = this.getCustomPreRenderContainer();
1896
+ if (customContainer && !this.containerScrollListener) {
1897
+ this.containerScrollListener = () => this.syncPreRenderStyle();
1898
+ customContainer.addEventListener('scroll', this.containerScrollListener);
1899
+ }
1900
+ if (!this.getPreRenderConfig().doNotTrackSize) {
1901
+ const observeTarget = (_b = this.insertedDomEl) !== null && _b !== void 0 ? _b : this.hostElement;
1902
+ this.resizeObserver = new ResizeObserver((entries) => {
1903
+ entries.forEach((entry) => {
1904
+ if (entry.target === observeTarget) {
1905
+ this.syncPreRenderStyle();
1906
+ }
1907
+ });
1908
+ });
1909
+ this.resizeObserver.observe(observeTarget);
1910
+ }
1780
1911
  }
1781
1912
  removeStyleProperties(this.preRenderWrapper, [
1782
1913
  'z-index',
1783
1914
  'opacity',
1915
+ 'pointer-events',
1784
1916
  'overflow',
1785
- 'transform',
1786
1917
  ]);
1787
- // Set rather than removed: a container that carries `pointer-events:
1788
- // none` — the usual styling for a parking root that must not swallow
1789
- // clicks — passes it down, and dropping the property here would leave
1790
- // the inherited `none` in force and the frame dead to input.
1791
- setStyleProperties(this.preRenderWrapper, { pointerEvents: 'auto' });
1792
1918
  this.subscribeToEvents();
1793
1919
  // Setup fullscreen change handler for prerendered components
1794
1920
  if (this.iFrame) {
@@ -1841,7 +1967,6 @@ export class TsEmbed {
1841
1967
  * If the component is not preRendered, it issues a warning.
1842
1968
  */
1843
1969
  hidePreRender() {
1844
- var _a;
1845
1970
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_HIDE_PRE_RENDER, {
1846
1971
  preRenderId: this.getPreRenderConfig().id,
1847
1972
  embedComponentType: this.viewConfig.embedComponentType,
@@ -1861,15 +1986,12 @@ export class TsEmbed {
1861
1986
  top: '0',
1862
1987
  left: '0',
1863
1988
  overflow: 'hidden',
1864
- // Keeps the measured size — so the next show needs no resize, which
1865
- // is the point of pre-rendering — while lifting the box out of
1866
- // the container's scrollable area. Overflow only extends
1867
- // downwards, so a hidden frame parked above the top edge adds
1868
- // none, where one left at full height shows as blank scroll space.
1869
- transform: PRERENDER_PARKED_TRANSFORM,
1870
1989
  };
1871
1990
  setStyleProperties(this.preRenderWrapper, preRenderHideStyles);
1872
- (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
1991
+ this.removeContainerScrollListener();
1992
+ if (this.resizeObserver) {
1993
+ this.resizeObserver.disconnect();
1994
+ }
1873
1995
  const placeHolderEle = this.getPreRenderPlaceHolderElement();
1874
1996
  if (placeHolderEle) {
1875
1997
  placeHolderEle.parentElement.removeChild(placeHolderEle);