@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
@@ -7,7 +7,7 @@
7
7
  * @author Ayon Ghosh <ayon.ghosh@thoughtspot.com>
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.V1Embed = exports.TsEmbed = exports.THOUGHTSPOT_PARAM_PREFIX = void 0;
10
+ exports.V1Embed = exports.TsEmbed = exports.BOOTSTRAP_URL_PARAMS = exports.THOUGHTSPOT_PARAM_PREFIX = void 0;
11
11
  const tslib_1 = require("tslib");
12
12
  const isEmpty_1 = tslib_1.__importDefault(require("lodash/isEmpty"));
13
13
  const isObject_1 = tslib_1.__importDefault(require("lodash/isObject"));
@@ -43,9 +43,6 @@ const TS_EMBED_ID = '_thoughtspot-embed';
43
43
  */
44
44
  const PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY = 'tsEmbedOriginalPosition';
45
45
  const PRERENDER_WRAPPER_ID_PREFIX = 'tsEmbed-pre-render-wrapper-';
46
- const PRERENDER_PARKED_TRANSFORM = 'translateY(-100%)';
47
- /** The height createPreRenderWrapper() seeds before anything is measured. */
48
- const UNMEASURED_WRAPPER_HEIGHT = '100vh';
49
46
  // The container applies UpdateEmbedParams through React state, so a delivered
50
47
  // post is not the same as the params being in effect.
51
48
  const UPDATE_EMBED_PARAMS_SETTLE_MS = 200;
@@ -53,6 +50,97 @@ const UPDATE_EMBED_PARAMS_SETTLE_MS = 200;
53
50
  // truthy, so null or '' leaves the previous embed's values in place. '&' is
54
51
  // truthy and parses to {}.
55
52
  const NO_RUNTIME_PARAMS = '&';
53
+ /**
54
+ * Params kept on the iframe `src` when `excludeConfigFromURL` is set. The rest
55
+ * are sent in the APP_INIT payload.
56
+ * @internal
57
+ */
58
+ exports.BOOTSTRAP_URL_PARAMS = new Set([
59
+ // Marks the app as embedded.
60
+ types_1.Param.EmbedApp,
61
+ // The host page URL, used to validate the postMessage origin.
62
+ types_1.Param.HostAppUrl,
63
+ // The SDK version.
64
+ types_1.Param.Version,
65
+ // The authentication type set in init.
66
+ types_1.Param.AuthType,
67
+ // Whether the app signs the user in automatically.
68
+ types_1.Param.AutoLogin,
69
+ // Stops the app from redirecting to its login page.
70
+ types_1.Param.DisableLoginRedirect,
71
+ // Forces the SAML redirect for EmbeddedSSO.
72
+ types_1.Param.ForceSAMLAutoRedirect,
73
+ // Set for cookieless trusted authentication.
74
+ types_1.Param.cookieless,
75
+ // Lets the app use the pre-fetched auth info.
76
+ types_1.Param.preAuthCache,
77
+ // Blocks access to the full app outside the embed.
78
+ types_1.Param.blockNonEmbedFullAppAccess,
79
+ // The org to load, which the auth info depends on.
80
+ types_1.Param.OverrideOrgId,
81
+ // The host window height when the iframe loads.
82
+ types_1.Param.ViewPortHeight,
83
+ // The host window width when the iframe loads.
84
+ types_1.Param.ViewPortWidth,
85
+ // The app's client log level.
86
+ types_1.Param.ClientLogLevel,
87
+ // Lets the app override the native console.
88
+ types_1.Param.OverrideNativeConsole,
89
+ // An extra Pendo tracking key.
90
+ types_1.Param.PendoTrackingKey,
91
+ // The locale for number formatting.
92
+ types_1.Param.NumberFormatLocale,
93
+ // The locale for date formatting.
94
+ types_1.Param.DateFormatLocale,
95
+ // The currency format.
96
+ types_1.Param.CurrencyFormat,
97
+ // The UI language.
98
+ types_1.Param.Locale,
99
+ // Turns on dark mode.
100
+ types_1.Param.IsDarkMode,
101
+ // Turns on the radiant theme that dark mode needs.
102
+ types_1.Param.RadiantThemeEnabled,
103
+ // Marks a SearchEmbed or SearchBarEmbed.
104
+ types_1.Param.searchEmbed,
105
+ // Marks a LiveboardEmbed.
106
+ types_1.Param.livedBoardEmbed,
107
+ // Marks a SpotterAgentEmbed.
108
+ types_1.Param.isSpotterAgentEmbed,
109
+ // Marks a SpotterEmbed.
110
+ types_1.Param.SpotterEnabled,
111
+ // Marks an AppEmbed.
112
+ types_1.Param.IsFullAppEmbed,
113
+ // Legacy flag for the onBeforeGetVizData API intercept.
114
+ types_1.Param.IsOnBeforeGetVizDataInterceptEnabled,
115
+ // Lets the host override links in the app.
116
+ types_1.Param.LinkOverride,
117
+ // Turns on version 2 of the link overrides.
118
+ types_1.Param.EnableLinkOverridesV2,
119
+ // Stops links from opening in a new tab.
120
+ types_1.Param.DisableRedirectionLinksInNewTab,
121
+ // Uses replaceState instead of pushState for app navigation.
122
+ types_1.Param.OverrideHistoryState,
123
+ // Shows search results as a table.
124
+ types_1.Param.ForceTable,
125
+ // The URL of the custom string IDs file.
126
+ types_1.Param.StringIDsUrl,
127
+ // The data sources that search opens with.
128
+ types_1.Param.DataSources,
129
+ // Exposes translation IDs in the app.
130
+ types_1.Param.ExposeTranslationIDs,
131
+ // The URL of the custom icon sprite.
132
+ types_1.Param.IconSpriteUrl,
133
+ // The tag that filters the metadata lists in an AppEmbed.
134
+ types_1.Param.Tag,
135
+ // Set when a Liveboard embed shows a single visualization (vizId).
136
+ types_1.Param.vizEmbed,
137
+ // Whether search opens with the last-selected data sources.
138
+ types_1.Param.UseLastSelectedDataSource,
139
+ // The query mode Spotter opens in.
140
+ types_1.Param.DefaultQueryMode,
141
+ // The initial search query. Omitted with excludeSearchTokenStringFromURL.
142
+ types_1.Param.searchTokenString,
143
+ ]);
56
144
  /**
57
145
  * The event id map from v2 event names to v1 event id
58
146
  * v1 events are the classic embed events implemented in Blink v1
@@ -81,6 +169,7 @@ class TsEmbed {
81
169
  this.embedNodeKey = '__tsEmbed';
82
170
  this.embedContainerLoadedKey = '__tsEmbedContainerLoaded';
83
171
  this.isAppInitialized = false;
172
+ this.initDataParams = {};
84
173
  /**
85
174
  * Should we encode URL Query Params using base64 encoding which ThoughtSpot
86
175
  * will generate for embedding. This provides additional security to
@@ -90,6 +179,7 @@ class TsEmbed {
90
179
  this.shouldEncodeUrlQueryParams = false;
91
180
  this.defaultHiddenActions = [types_1.Action.ReportError];
92
181
  this.preRenderContainerEl = document.body;
182
+ this.containerScrollListener = null;
93
183
  /**
94
184
  * Handler for fullscreen change events
95
185
  */
@@ -115,7 +205,7 @@ class TsEmbed {
115
205
  */
116
206
  this.appInitCb = async (_, responder) => {
117
207
  try {
118
- const appInitData = await this.getAppInitData();
208
+ const appInitData = this.withInitDataParams(await this.getAppInitData());
119
209
  this.isAppInitialized = true;
120
210
  responder({
121
211
  type: types_1.EmbedEvent.APP_INIT,
@@ -543,6 +633,18 @@ class TsEmbed {
543
633
  async getAppInitData() {
544
634
  return this.getDefaultAppInitData();
545
635
  }
636
+ withInitDataParams(appInitData) {
637
+ if ((0, isEmpty_1.default)(this.initDataParams)) {
638
+ return appInitData;
639
+ }
640
+ return {
641
+ ...appInitData,
642
+ embedParams: {
643
+ ...this.initDataParams,
644
+ ...(appInitData.embedParams || {}),
645
+ },
646
+ };
647
+ }
546
648
  /**
547
649
  * Helper method to refresh/update auth token for TrustedAuthTokenCookieless auth type
548
650
  * @param responder - Function to send response back
@@ -602,7 +704,7 @@ class TsEmbed {
602
704
  * @returns queryParams
603
705
  */
604
706
  getBaseQueryParams(queryParams = {}) {
605
- var _a, _b, _c, _d;
707
+ var _a, _b, _c, _d, _e;
606
708
  let hostAppUrl = ((_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.host) || '';
607
709
  // The below check is needed because TS Cloud firewall, blocks
608
710
  // localhost/127.0.0.1 in any url param.
@@ -639,6 +741,15 @@ class TsEmbed {
639
741
  if (this.embedConfig.currencyFormat) {
640
742
  queryParams[types_1.Param.CurrencyFormat] = this.embedConfig.currencyFormat;
641
743
  }
744
+ // The view config wins over init, so an embed can opt out of a dark
745
+ // mode set in `init`. `??` and not `||`, so that an explicit `false`
746
+ // overrides an init-level `true`.
747
+ const isDarkMode = (_c = this.viewConfig.isDarkMode) !== null && _c !== void 0 ? _c : this.embedConfig.isDarkMode;
748
+ (0, utils_1.setParamIfDefined)(queryParams, types_1.Param.IsDarkMode, isDarkMode, true);
749
+ // The app's dark mode lives in its radiant theme, so turn that on too.
750
+ if (isDarkMode) {
751
+ queryParams[types_1.Param.RadiantThemeEnabled] = true;
752
+ }
642
753
  const { disabledActions, disabledActionReason, hiddenActions, visibleActions, hiddenTabs, visibleTabs, showAlerts, additionalFlags: additionalFlagsFromView, locale, customizations, contextMenuTrigger, linkOverride, enableLinkOverridesV2, insertInToSlide, disableRedirectionLinksInNewTab, overrideOrgId, overrideHistoryState, exposeTranslationIDs, primaryAction, } = this.viewConfig;
643
754
  const { additionalFlags: additionalFlagsFromInit } = this.embedConfig;
644
755
  const additionalFlags = {
@@ -704,7 +815,7 @@ class TsEmbed {
704
815
  if (spriteUrl) {
705
816
  queryParams[types_1.Param.IconSpriteUrl] = spriteUrl.replace('https://', '');
706
817
  }
707
- 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);
818
+ 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);
708
819
  if (stringIDsUrl) {
709
820
  queryParams[types_1.Param.StringIDsUrl] = stringIDsUrl;
710
821
  }
@@ -758,13 +869,32 @@ class TsEmbed {
758
869
  return path;
759
870
  }
760
871
  getEmbedParams() {
761
- const queryParams = this.getEmbedParamsObject();
872
+ const queryParams = this.getUrlQueryParamsObject();
762
873
  return (0, utils_1.getQueryParamString)(queryParams);
763
874
  }
764
875
  getEmbedParamsObject() {
765
876
  const params = this.getBaseQueryParams();
766
877
  return params;
767
878
  }
879
+ getUrlQueryParamsObject() {
880
+ const queryParams = this.getEmbedParamsObject();
881
+ if (!this.isConfigExcludedFromUrl()) {
882
+ this.initDataParams = {};
883
+ return queryParams;
884
+ }
885
+ const urlParams = {};
886
+ const excludedParams = {};
887
+ Object.entries(queryParams).forEach(([key, value]) => {
888
+ if (exports.BOOTSTRAP_URL_PARAMS.has(key)) {
889
+ urlParams[key] = value;
890
+ }
891
+ else {
892
+ excludedParams[key] = (0, utils_1.deserializeParam)(value);
893
+ }
894
+ });
895
+ this.initDataParams = excludedParams;
896
+ return urlParams;
897
+ }
768
898
  getRootIframeSrc() {
769
899
  const query = this.getEmbedParams();
770
900
  return this.getEmbedBasePath(query);
@@ -937,7 +1067,7 @@ class TsEmbed {
937
1067
  top: '0',
938
1068
  left: '0',
939
1069
  width: '100vw',
940
- height: UNMEASURED_WRAPPER_HEIGHT,
1070
+ height: '100vh',
941
1071
  };
942
1072
  (0, utils_1.setStyleProperties)(preRenderWrapper, initialPreRenderWrapperStyle);
943
1073
  return preRenderWrapper;
@@ -1005,26 +1135,10 @@ class TsEmbed {
1005
1135
  return placeholder;
1006
1136
  }
1007
1137
  /**
1008
- * Resolves the configured preRenderContainer to a live element. A string
1009
- * selector is re-queried on every call so a remounted container (E.g.: React
1010
- * replacing the node) resolves to the fresh element; an element passed
1011
- * directly cannot be re-resolved.
1012
- *
1013
- * With nothing configured the frame goes into the host element's nearest
1014
- * scrolling ancestor, falling back to `document.body`.
1015
- *
1016
- * The wrapper is absolutely positioned, so it follows the page for free —
1017
- * but only while it sits inside whatever scrolls. `document.body` is right
1018
- * only when the document itself is the scroller; an app that scrolls an
1019
- * inner element instead left the frame pinned to the viewport while the page
1020
- * moved under it (SCAL-338563). Being inside the scroller also lets wheel
1021
- * events chain out of the frame into it, which they cannot do from
1022
- * `document.body`.
1023
- *
1024
- * A scrolling ancestor is layout chrome rather than route content, so it
1025
- * outlives the embed in practice; and if it does go, the host element goes
1026
- * with it and this instance is remounting anyway.
1027
- * `reconcilePreRenderContainer` re-runs this on a detached container.
1138
+ * Resolves the configured preRenderContainer to a live element, falling
1139
+ * back to `document.body`. A string selector is re-queried on every call so
1140
+ * a remounted container (E.g.: React replacing the node) resolves to the
1141
+ * fresh element; an element passed directly cannot be re-resolved.
1028
1142
  */
1029
1143
  resolvePreRenderContainerTarget() {
1030
1144
  var _a;
@@ -1044,13 +1158,7 @@ class TsEmbed {
1044
1158
  else if (containerConfig) {
1045
1159
  container = containerConfig;
1046
1160
  }
1047
- if (container) {
1048
- return container;
1049
- }
1050
- if (!this.hostElement) {
1051
- return document.body;
1052
- }
1053
- return (_a = (0, utils_1.getScrollableAncestors)(this.hostElement)[0]) !== null && _a !== void 0 ? _a : document.body;
1161
+ return (_a = container) !== null && _a !== void 0 ? _a : document.body;
1054
1162
  }
1055
1163
  inheritPreRenderContainer() {
1056
1164
  var _a;
@@ -1095,9 +1203,8 @@ class TsEmbed {
1095
1203
  * Re-attaches the wrapper to a live container when the previously resolved
1096
1204
  * one has been detached or no longer holds the wrapper — e.g. the host app
1097
1205
  * remounted a custom preRenderContainer, which would otherwise leave a stale
1098
- * reference and collapse the wrapper. Selectors and the auto-resolved
1099
- * scrolling ancestor are both re-resolved; a container passed as an element
1100
- * is left untouched, as there is nothing to re-query.
1206
+ * reference and collapse the wrapper. Only string selectors can be
1207
+ * re-resolved; a container passed as an element is left untouched.
1101
1208
  */
1102
1209
  reconcilePreRenderContainer() {
1103
1210
  const wrapper = this.preRenderWrapper;
@@ -1116,6 +1223,14 @@ class TsEmbed {
1116
1223
  if (resolved === stored && stored.contains(wrapper)) {
1117
1224
  return;
1118
1225
  }
1226
+ if (this.containerScrollListener && stored !== resolved) {
1227
+ if (stored !== document.body) {
1228
+ stored.removeEventListener('scroll', this.containerScrollListener);
1229
+ }
1230
+ if (resolved !== document.body) {
1231
+ resolved.addEventListener('scroll', this.containerScrollListener);
1232
+ }
1233
+ }
1119
1234
  this.preRenderContainerEl = resolved;
1120
1235
  this.applyPreRenderContainerPositioning();
1121
1236
  if (wrapper.parentNode !== resolved) {
@@ -1177,12 +1292,11 @@ class TsEmbed {
1177
1292
  */
1178
1293
  setIFrameHeight(height) {
1179
1294
  if (this.isPreRendered) {
1180
- const next = (0, utils_1.getCssDimension)(height);
1181
1295
  if (this.insertedDomEl) {
1182
- this.insertedDomEl.style.height = next;
1296
+ this.insertedDomEl.style.height = (0, utils_1.getCssDimension)(height);
1183
1297
  }
1184
1298
  else if (this.preRenderWrapper) {
1185
- this.preRenderWrapper.style.height = next;
1299
+ this.preRenderWrapper.style.height = (0, utils_1.getCssDimension)(height);
1186
1300
  }
1187
1301
  }
1188
1302
  else {
@@ -1466,9 +1580,16 @@ class TsEmbed {
1466
1580
  * @param args
1467
1581
  */
1468
1582
  async render() {
1583
+ var _a, _b, _c;
1469
1584
  (0, mixpanel_service_1.uploadMixpanelEvent)(mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_RENDER_CALLED, {
1470
1585
  embedComponentType: this.viewConfig.embedComponentType,
1471
1586
  });
1587
+ (0, mixpanel_service_1.uploadMixpanelEvent)(mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_INIT_ACTIONS, {
1588
+ embedComponentType: this.viewConfig.embedComponentType,
1589
+ hiddenActions: (_a = this.viewConfig.hiddenActions) !== null && _a !== void 0 ? _a : [],
1590
+ visibleActions: (_b = this.viewConfig.visibleActions) !== null && _b !== void 0 ? _b : [],
1591
+ disabledActions: (_c = this.viewConfig.disabledActions) !== null && _c !== void 0 ? _c : [],
1592
+ });
1472
1593
  if (!(0, base_1.getIsInitCalled)()) {
1473
1594
  logger_1.logger.error(errors_1.ERROR_MESSAGE.RENDER_CALLED_BEFORE_INIT);
1474
1595
  }
@@ -1617,47 +1738,34 @@ class TsEmbed {
1617
1738
  delete container.dataset[PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY];
1618
1739
  }
1619
1740
  /**
1620
- * Re-sizes the wrapper when its placeholder changes size.
1621
- *
1622
- * Position deliberately has no equivalent. An absolutely positioned wrapper
1623
- * follows its containing block for free, so a correctly placed frame is the
1624
- * browser's job and costs nothing; repositioning it on scroll would mean a
1625
- * layout read and a style write per frame to compensate for placing it in
1626
- * the wrong box. Size is the one thing the browser will not do for us: the
1627
- * placeholder grows when the embedded app reports a new height, and the
1628
- * wrapper has to be told.
1741
+ * Detaches and clears the container scroll listener, if one is attached.
1629
1742
  */
1630
- observePreRenderSize() {
1631
- var _a;
1632
- if (this.getPreRenderConfig().doNotTrackSize || typeof ResizeObserver === 'undefined') {
1743
+ removeContainerScrollListener() {
1744
+ if (!this.containerScrollListener) {
1633
1745
  return;
1634
1746
  }
1635
- const placeholder = this.getPreRenderPlaceHolderElement();
1636
- if (!placeholder) {
1637
- return;
1638
- }
1639
- (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
1640
- this.resizeObserver = new ResizeObserver(() => this.syncPreRenderStyle());
1641
- this.resizeObserver.observe(placeholder);
1747
+ const customContainer = this.getCustomPreRenderContainer();
1748
+ customContainer === null || customContainer === void 0 ? void 0 : customContainer.removeEventListener('scroll', this.containerScrollListener);
1749
+ this.containerScrollListener = null;
1642
1750
  }
1643
1751
  /**
1644
1752
  * Destroys the ThoughtSpot embed, and remove any nodes from the DOM.
1645
1753
  * @version SDK: 1.19.1 | ThoughtSpot: *
1646
1754
  */
1647
1755
  destroy() {
1648
- var _a, _b, _c, _d;
1756
+ var _a, _b, _c;
1649
1757
  try {
1650
1758
  this.removeFullscreenChangeHandler();
1651
- (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
1759
+ this.removeContainerScrollListener();
1652
1760
  this.unsubscribeToEvents();
1653
- (_b = this.preRenderWrapper) === null || _b === void 0 ? void 0 : _b.remove();
1761
+ (_a = this.preRenderWrapper) === null || _a === void 0 ? void 0 : _a.remove();
1654
1762
  this.restorePreRenderContainerPosition();
1655
1763
  if (!this.isRendered) {
1656
1764
  return;
1657
1765
  }
1658
1766
  if (!(0, embedConfig_1.getEmbedConfig)().waitForCleanupOnDestroy) {
1659
1767
  this.trigger(types_1.HostEvent.DestroyEmbed);
1660
- (_d = (_c = this.insertedDomEl) === null || _c === void 0 ? void 0 : _c.parentNode) === null || _d === void 0 ? void 0 : _d.removeChild(this.insertedDomEl);
1768
+ (_c = (_b = this.insertedDomEl) === null || _b === void 0 ? void 0 : _b.parentNode) === null || _c === void 0 ? void 0 : _c.removeChild(this.insertedDomEl);
1661
1769
  }
1662
1770
  else {
1663
1771
  const cleanupTimeout = (0, embedConfig_1.getEmbedConfig)().cleanupTimeout;
@@ -1703,6 +1811,26 @@ class TsEmbed {
1703
1811
  this.isRendered = true;
1704
1812
  return this.renderIFrame(prerenderFrameSrc);
1705
1813
  }
1814
+ isConfigExcludedFromUrl() {
1815
+ var _a, _b, _c;
1816
+ 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;
1817
+ return flag === true || flag === 'true';
1818
+ }
1819
+ async triggerUpdateEmbedParams() {
1820
+ try {
1821
+ const params = await this.getUpdateEmbedParamsObject();
1822
+ this.trigger(types_1.HostEvent.UpdateEmbedParams, params);
1823
+ }
1824
+ catch (error) {
1825
+ logger_1.logger.error(errors_1.ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
1826
+ this.handleError({
1827
+ errorType: types_1.ErrorDetailsTypes.API,
1828
+ message: (error === null || error === void 0 ? void 0 : error.message) || errors_1.ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
1829
+ code: types_1.EmbedErrorCodes.UPDATE_PARAMS_FAILED,
1830
+ error: (error === null || error === void 0 ? void 0 : error.message) || error,
1831
+ });
1832
+ }
1833
+ }
1706
1834
  beforePrerenderVisible() {
1707
1835
  // We can ignore this as its a bit expensive and the newer customers
1708
1836
  // have moved on to UpdateEmbedParams supported clusters
@@ -1713,17 +1841,7 @@ class TsEmbed {
1713
1841
  this.preRenderParamsApplied = new Promise((resolve) => {
1714
1842
  this.executeAfterEmbedContainerLoaded(async () => {
1715
1843
  try {
1716
- const params = await this.getUpdateEmbedParamsObject();
1717
- this.trigger(types_1.HostEvent.UpdateEmbedParams, params);
1718
- }
1719
- catch (error) {
1720
- logger_1.logger.error(errors_1.ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
1721
- this.handleError({
1722
- errorType: types_1.ErrorDetailsTypes.API,
1723
- message: (error === null || error === void 0 ? void 0 : error.message) || errors_1.ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
1724
- code: types_1.EmbedErrorCodes.UPDATE_PARAMS_FAILED,
1725
- error: (error === null || error === void 0 ? void 0 : error.message) || error,
1726
- });
1844
+ await this.triggerUpdateEmbedParams();
1727
1845
  }
1728
1846
  finally {
1729
1847
  setTimeout(resolve, UPDATE_EMBED_PARAMS_SETTLE_MS);
@@ -1738,7 +1856,7 @@ class TsEmbed {
1738
1856
  * wrapper to overlay it.
1739
1857
  */
1740
1858
  async showPreRender() {
1741
- var _a;
1859
+ var _a, _b;
1742
1860
  (0, mixpanel_service_1.uploadMixpanelEvent)(mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_SHOW_PRE_RENDER, {
1743
1861
  preRenderId: this.getPreRenderConfig().id,
1744
1862
  embedComponentType: this.viewConfig.embedComponentType,
@@ -1757,16 +1875,14 @@ class TsEmbed {
1757
1875
  this.beforePrerenderVisible();
1758
1876
  if (this.hostElement) {
1759
1877
  this.insertedDomEl = this.createPreRenderPlaceholder();
1760
- // Carry a height fullHeight has already measured onto the fresh
1761
- // placeholder, so a re-show does not flash at frameParams height.
1762
- // UNMEASURED_WRAPPER_HEIGHT is what createPreRenderWrapper() seeds
1763
- // before anything has been measured; treating that as a measurement
1764
- // is what made a first reveal overshoot to a full viewport.
1765
- const wrapperHeight = this.preRenderWrapper.style.height;
1766
- if (this.viewConfig.fullHeight
1767
- && wrapperHeight
1768
- && wrapperHeight !== UNMEASURED_WRAPPER_HEIGHT) {
1769
- this.insertedDomEl.style.height = wrapperHeight;
1878
+ if (this.viewConfig.fullHeight) {
1879
+ // If fullHeight has already sized the wrapper, seed the
1880
+ // placeholder with the same height so syncPreRenderStyle gets
1881
+ // an accurate rect.
1882
+ const existingHeight = this.preRenderWrapper.style.height;
1883
+ if (existingHeight) {
1884
+ this.insertedDomEl.style.height = existingHeight;
1885
+ }
1770
1886
  }
1771
1887
  const placeHolderId = this.getPreRenderIds().placeHolder;
1772
1888
  // Remove any stale placeholder from a previous cycle. It is located
@@ -1780,19 +1896,29 @@ class TsEmbed {
1780
1896
  (_a = this.hostElement.querySelector(`#${placeHolderId}`)) === null || _a === void 0 ? void 0 : _a.remove();
1781
1897
  this.hostElement.appendChild(this.insertedDomEl);
1782
1898
  this.syncPreRenderStyle();
1783
- this.observePreRenderSize();
1899
+ const customContainer = this.getCustomPreRenderContainer();
1900
+ if (customContainer && !this.containerScrollListener) {
1901
+ this.containerScrollListener = () => this.syncPreRenderStyle();
1902
+ customContainer.addEventListener('scroll', this.containerScrollListener);
1903
+ }
1904
+ if (!this.getPreRenderConfig().doNotTrackSize) {
1905
+ const observeTarget = (_b = this.insertedDomEl) !== null && _b !== void 0 ? _b : this.hostElement;
1906
+ this.resizeObserver = new ResizeObserver((entries) => {
1907
+ entries.forEach((entry) => {
1908
+ if (entry.target === observeTarget) {
1909
+ this.syncPreRenderStyle();
1910
+ }
1911
+ });
1912
+ });
1913
+ this.resizeObserver.observe(observeTarget);
1914
+ }
1784
1915
  }
1785
1916
  (0, utils_1.removeStyleProperties)(this.preRenderWrapper, [
1786
1917
  'z-index',
1787
1918
  'opacity',
1919
+ 'pointer-events',
1788
1920
  'overflow',
1789
- 'transform',
1790
1921
  ]);
1791
- // Set rather than removed: a container that carries `pointer-events:
1792
- // none` — the usual styling for a parking root that must not swallow
1793
- // clicks — passes it down, and dropping the property here would leave
1794
- // the inherited `none` in force and the frame dead to input.
1795
- (0, utils_1.setStyleProperties)(this.preRenderWrapper, { pointerEvents: 'auto' });
1796
1922
  this.subscribeToEvents();
1797
1923
  // Setup fullscreen change handler for prerendered components
1798
1924
  if (this.iFrame) {
@@ -1845,7 +1971,6 @@ class TsEmbed {
1845
1971
  * If the component is not preRendered, it issues a warning.
1846
1972
  */
1847
1973
  hidePreRender() {
1848
- var _a;
1849
1974
  (0, mixpanel_service_1.uploadMixpanelEvent)(mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_HIDE_PRE_RENDER, {
1850
1975
  preRenderId: this.getPreRenderConfig().id,
1851
1976
  embedComponentType: this.viewConfig.embedComponentType,
@@ -1865,15 +1990,12 @@ class TsEmbed {
1865
1990
  top: '0',
1866
1991
  left: '0',
1867
1992
  overflow: 'hidden',
1868
- // Keeps the measured size — so the next show needs no resize, which
1869
- // is the point of pre-rendering — while lifting the box out of
1870
- // the container's scrollable area. Overflow only extends
1871
- // downwards, so a hidden frame parked above the top edge adds
1872
- // none, where one left at full height shows as blank scroll space.
1873
- transform: PRERENDER_PARKED_TRANSFORM,
1874
1993
  };
1875
1994
  (0, utils_1.setStyleProperties)(this.preRenderWrapper, preRenderHideStyles);
1876
- (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
1995
+ this.removeContainerScrollListener();
1996
+ if (this.resizeObserver) {
1997
+ this.resizeObserver.disconnect();
1998
+ }
1877
1999
  const placeHolderEle = this.getPreRenderPlaceHolderElement();
1878
2000
  if (placeHolderEle) {
1879
2001
  placeHolderEle.parentElement.removeChild(placeHolderEle);