@thoughtspot/visual-embed-sdk 1.52.1 → 1.52.2-beta

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 (241) hide show
  1. package/cjs/package.json +11 -4
  2. package/cjs/src/contracts/host-event-contracts.d.ts +49 -11
  3. package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts +4 -3
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +1 -1
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +10 -0
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/auto-frame-renderer.js +1 -1
  11. package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
  12. package/cjs/src/embed/auto-frame-renderer.spec.js +24 -13
  13. package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
  14. package/cjs/src/embed/bodyless-conversation.js +1 -1
  15. package/cjs/src/embed/bodyless-conversation.js.map +1 -1
  16. package/cjs/src/embed/conversation.d.ts +1 -0
  17. package/cjs/src/embed/conversation.d.ts.map +1 -1
  18. package/cjs/src/embed/conversation.js +4 -4
  19. package/cjs/src/embed/conversation.js.map +1 -1
  20. package/cjs/src/embed/conversation.spec.js +35 -24
  21. package/cjs/src/embed/conversation.spec.js.map +1 -1
  22. package/cjs/src/embed/embedConfig.spec.js +2 -1
  23. package/cjs/src/embed/embedConfig.spec.js.map +1 -1
  24. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +2 -2
  25. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  26. package/cjs/src/embed/hostEventClient/host-event-client.js +16 -10
  27. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  28. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +14 -8
  29. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  30. package/cjs/src/embed/hostEventClient/utils.d.ts +9 -0
  31. package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
  32. package/cjs/src/embed/hostEventClient/utils.js +49 -3
  33. package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
  34. package/cjs/src/embed/hostEventClient/utils.spec.js +151 -0
  35. package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -1
  36. package/cjs/src/embed/liveboard.d.ts +4 -3
  37. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  38. package/cjs/src/embed/liveboard.js +18 -13
  39. package/cjs/src/embed/liveboard.js.map +1 -1
  40. package/cjs/src/embed/liveboard.spec.js +2 -1
  41. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  42. package/cjs/src/embed/search-bar.js +1 -1
  43. package/cjs/src/embed/search-bar.js.map +1 -1
  44. package/cjs/src/embed/search.js +1 -1
  45. package/cjs/src/embed/search.js.map +1 -1
  46. package/cjs/src/embed/search.spec.js +20 -0
  47. package/cjs/src/embed/search.spec.js.map +1 -1
  48. package/cjs/src/embed/spotter-utils.d.ts +8 -1
  49. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  50. package/cjs/src/embed/spotter-utils.js +14 -1
  51. package/cjs/src/embed/spotter-utils.js.map +1 -1
  52. package/cjs/src/embed/spotter-utils.spec.js +26 -0
  53. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  54. package/cjs/src/embed/ts-embed.d.ts +3 -0
  55. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  56. package/cjs/src/embed/ts-embed.js +108 -29
  57. package/cjs/src/embed/ts-embed.js.map +1 -1
  58. package/cjs/src/embed/ts-embed.spec.js +163 -23
  59. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  60. package/cjs/src/errors.js +1 -1
  61. package/cjs/src/errors.js.map +1 -1
  62. package/cjs/src/index.d.ts +2 -1
  63. package/cjs/src/index.d.ts.map +1 -1
  64. package/cjs/src/index.js +3 -1
  65. package/cjs/src/index.js.map +1 -1
  66. package/cjs/src/react/all-types-export.d.ts +1 -1
  67. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  68. package/cjs/src/react/all-types-export.js +2 -1
  69. package/cjs/src/react/all-types-export.js.map +1 -1
  70. package/cjs/src/types.d.ts +45 -22
  71. package/cjs/src/types.d.ts.map +1 -1
  72. package/cjs/src/types.js +44 -21
  73. package/cjs/src/types.js.map +1 -1
  74. package/cjs/src/utils/authService/tokenizedAuthService.spec.js +2 -1
  75. package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  76. package/cjs/src/utils/custom-actions.spec.js +4 -2
  77. package/cjs/src/utils/custom-actions.spec.js.map +1 -1
  78. package/cjs/src/utils/filterConverter.d.ts +106 -0
  79. package/cjs/src/utils/filterConverter.d.ts.map +1 -0
  80. package/cjs/src/utils/filterConverter.js +215 -0
  81. package/cjs/src/utils/filterConverter.js.map +1 -0
  82. package/cjs/src/utils/filterConverter.spec.d.ts +2 -0
  83. package/cjs/src/utils/filterConverter.spec.d.ts.map +1 -0
  84. package/cjs/src/utils/filterConverter.spec.js +709 -0
  85. package/cjs/src/utils/filterConverter.spec.js.map +1 -0
  86. package/cjs/src/utils/processData.spec.js +2 -1
  87. package/cjs/src/utils/processData.spec.js.map +1 -1
  88. package/dist/{index-C1pmYb5H.js → index-CcBYlGo9.js} +1 -1
  89. package/dist/src/contracts/host-event-contracts.d.ts +49 -11
  90. package/dist/src/contracts/host-event-contracts.d.ts.map +1 -1
  91. package/dist/src/embed/app.d.ts +4 -3
  92. package/dist/src/embed/app.d.ts.map +1 -1
  93. package/dist/src/embed/conversation.d.ts +1 -0
  94. package/dist/src/embed/conversation.d.ts.map +1 -1
  95. package/dist/src/embed/hostEventClient/host-event-client.d.ts +2 -2
  96. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  97. package/dist/src/embed/hostEventClient/utils.d.ts +9 -0
  98. package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
  99. package/dist/src/embed/liveboard.d.ts +4 -3
  100. package/dist/src/embed/liveboard.d.ts.map +1 -1
  101. package/dist/src/embed/spotter-utils.d.ts +8 -1
  102. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  103. package/dist/src/embed/ts-embed.d.ts +3 -0
  104. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  105. package/dist/src/index.d.ts +2 -1
  106. package/dist/src/index.d.ts.map +1 -1
  107. package/dist/src/react/all-types-export.d.ts +1 -1
  108. package/dist/src/react/all-types-export.d.ts.map +1 -1
  109. package/dist/src/types.d.ts +45 -22
  110. package/dist/src/types.d.ts.map +1 -1
  111. package/dist/src/utils/filterConverter.d.ts +106 -0
  112. package/dist/src/utils/filterConverter.d.ts.map +1 -0
  113. package/dist/src/utils/filterConverter.spec.d.ts +2 -0
  114. package/dist/src/utils/filterConverter.spec.d.ts.map +1 -0
  115. package/dist/tsembed-react.es.js +257 -87
  116. package/dist/tsembed-react.js +256 -86
  117. package/dist/tsembed.es.js +466 -89
  118. package/dist/tsembed.js +465 -87
  119. package/dist/visual-embed-sdk-react-full.d.ts +202 -40
  120. package/dist/visual-embed-sdk-react.d.ts +108 -40
  121. package/dist/visual-embed-sdk.d.ts +202 -40
  122. package/lib/package.json +11 -4
  123. package/lib/src/contracts/host-event-contracts.d.ts +49 -11
  124. package/lib/src/contracts/host-event-contracts.d.ts.map +1 -1
  125. package/lib/src/embed/app.d.ts +4 -3
  126. package/lib/src/embed/app.d.ts.map +1 -1
  127. package/lib/src/embed/app.js +1 -1
  128. package/lib/src/embed/app.js.map +1 -1
  129. package/lib/src/embed/app.spec.js +10 -0
  130. package/lib/src/embed/app.spec.js.map +1 -1
  131. package/lib/src/embed/auto-frame-renderer.js +1 -1
  132. package/lib/src/embed/auto-frame-renderer.js.map +1 -1
  133. package/lib/src/embed/auto-frame-renderer.spec.js +24 -13
  134. package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
  135. package/lib/src/embed/bodyless-conversation.js +1 -1
  136. package/lib/src/embed/bodyless-conversation.js.map +1 -1
  137. package/lib/src/embed/conversation.d.ts +1 -0
  138. package/lib/src/embed/conversation.d.ts.map +1 -1
  139. package/lib/src/embed/conversation.js +5 -5
  140. package/lib/src/embed/conversation.js.map +1 -1
  141. package/lib/src/embed/conversation.spec.js +35 -24
  142. package/lib/src/embed/conversation.spec.js.map +1 -1
  143. package/lib/src/embed/embedConfig.spec.js +2 -1
  144. package/lib/src/embed/embedConfig.spec.js.map +1 -1
  145. package/lib/src/embed/hostEventClient/host-event-client.d.ts +2 -2
  146. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  147. package/lib/src/embed/hostEventClient/host-event-client.js +17 -11
  148. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  149. package/lib/src/embed/hostEventClient/host-event-client.spec.js +14 -8
  150. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  151. package/lib/src/embed/hostEventClient/utils.d.ts +9 -0
  152. package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
  153. package/lib/src/embed/hostEventClient/utils.js +47 -2
  154. package/lib/src/embed/hostEventClient/utils.js.map +1 -1
  155. package/lib/src/embed/hostEventClient/utils.spec.js +152 -1
  156. package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -1
  157. package/lib/src/embed/liveboard.d.ts +4 -3
  158. package/lib/src/embed/liveboard.d.ts.map +1 -1
  159. package/lib/src/embed/liveboard.js +18 -13
  160. package/lib/src/embed/liveboard.js.map +1 -1
  161. package/lib/src/embed/liveboard.spec.js +2 -1
  162. package/lib/src/embed/liveboard.spec.js.map +1 -1
  163. package/lib/src/embed/search-bar.js +1 -1
  164. package/lib/src/embed/search-bar.js.map +1 -1
  165. package/lib/src/embed/search.js +1 -1
  166. package/lib/src/embed/search.js.map +1 -1
  167. package/lib/src/embed/search.spec.js +20 -0
  168. package/lib/src/embed/search.spec.js.map +1 -1
  169. package/lib/src/embed/spotter-utils.d.ts +8 -1
  170. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  171. package/lib/src/embed/spotter-utils.js +12 -0
  172. package/lib/src/embed/spotter-utils.js.map +1 -1
  173. package/lib/src/embed/spotter-utils.spec.js +27 -1
  174. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  175. package/lib/src/embed/ts-embed.d.ts +3 -0
  176. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  177. package/lib/src/embed/ts-embed.js +108 -29
  178. package/lib/src/embed/ts-embed.js.map +1 -1
  179. package/lib/src/embed/ts-embed.spec.js +164 -24
  180. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  181. package/lib/src/errors.js +1 -1
  182. package/lib/src/errors.js.map +1 -1
  183. package/lib/src/index.d.ts +2 -1
  184. package/lib/src/index.d.ts.map +1 -1
  185. package/lib/src/index.js +2 -1
  186. package/lib/src/index.js.map +1 -1
  187. package/lib/src/react/all-types-export.d.ts +1 -1
  188. package/lib/src/react/all-types-export.d.ts.map +1 -1
  189. package/lib/src/react/all-types-export.js +1 -1
  190. package/lib/src/react/all-types-export.js.map +1 -1
  191. package/lib/src/types.d.ts +45 -22
  192. package/lib/src/types.d.ts.map +1 -1
  193. package/lib/src/types.js +44 -21
  194. package/lib/src/types.js.map +1 -1
  195. package/lib/src/utils/authService/tokenizedAuthService.spec.js +2 -1
  196. package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  197. package/lib/src/utils/custom-actions.spec.js +4 -2
  198. package/lib/src/utils/custom-actions.spec.js.map +1 -1
  199. package/lib/src/utils/filterConverter.d.ts +106 -0
  200. package/lib/src/utils/filterConverter.d.ts.map +1 -0
  201. package/lib/src/utils/filterConverter.js +210 -0
  202. package/lib/src/utils/filterConverter.js.map +1 -0
  203. package/lib/src/utils/filterConverter.spec.d.ts +2 -0
  204. package/lib/src/utils/filterConverter.spec.d.ts.map +1 -0
  205. package/lib/src/utils/filterConverter.spec.js +707 -0
  206. package/lib/src/utils/filterConverter.spec.js.map +1 -0
  207. package/lib/src/utils/processData.spec.js +2 -1
  208. package/lib/src/utils/processData.spec.js.map +1 -1
  209. package/lib/src/visual-embed-sdk.d.ts +202 -40
  210. package/package.json +11 -4
  211. package/src/contracts/host-event-contracts.ts +55 -11
  212. package/src/embed/app.spec.ts +15 -0
  213. package/src/embed/app.ts +5 -4
  214. package/src/embed/auto-frame-renderer.spec.ts +24 -13
  215. package/src/embed/auto-frame-renderer.ts +1 -1
  216. package/src/embed/bodyless-conversation.ts +1 -1
  217. package/src/embed/conversation.spec.ts +38 -27
  218. package/src/embed/conversation.ts +5 -5
  219. package/src/embed/embedConfig.spec.ts +2 -1
  220. package/src/embed/hostEventClient/host-event-client.spec.ts +14 -8
  221. package/src/embed/hostEventClient/host-event-client.ts +18 -10
  222. package/src/embed/hostEventClient/utils.spec.ts +176 -1
  223. package/src/embed/hostEventClient/utils.ts +51 -2
  224. package/src/embed/liveboard.spec.ts +4 -3
  225. package/src/embed/liveboard.ts +22 -16
  226. package/src/embed/search-bar.tsx +1 -1
  227. package/src/embed/search.spec.ts +23 -0
  228. package/src/embed/search.ts +1 -1
  229. package/src/embed/spotter-utils.spec.ts +29 -0
  230. package/src/embed/spotter-utils.ts +16 -0
  231. package/src/embed/ts-embed.spec.ts +204 -23
  232. package/src/embed/ts-embed.ts +114 -28
  233. package/src/errors.ts +1 -1
  234. package/src/index.ts +10 -0
  235. package/src/react/all-types-export.ts +4 -0
  236. package/src/types.ts +44 -21
  237. package/src/utils/authService/tokenizedAuthService.spec.ts +2 -1
  238. package/src/utils/custom-actions.spec.ts +4 -2
  239. package/src/utils/filterConverter.spec.ts +801 -0
  240. package/src/utils/filterConverter.ts +304 -0
  241. package/src/utils/processData.spec.ts +2 -1
@@ -120,10 +120,62 @@ const PRERENDER_WRAPPER_ID_PREFIX = 'tsEmbed-pre-render-wrapper-';
120
120
  // post is not the same as the params being in effect.
121
121
  const UPDATE_EMBED_PARAMS_SETTLE_MS = 200;
122
122
 
123
- // The container ignores runtimeFilterParams/runtimeParameterParams unless truthy, so
124
- // null or '' leaves the previous embed's values in place. '&' is truthy and parses to {}.
123
+ // The container ignores runtimeFilterParams/runtimeParameterParams unless
124
+ // truthy, so null or '' leaves the previous embed's values in place. '&' is
125
+ // truthy and parses to {}.
125
126
  const NO_RUNTIME_PARAMS = '&';
126
127
 
128
+ /**
129
+ * Query parameters that stay on the iframe `src` while config is excluded from
130
+ * the URL, which is the default unless the embed sets the
131
+ * `excludeConfigFromURL` additional flag to `false`. These are the parameters the
132
+ * application shell needs before it can receive a postMessage at all: the
133
+ * embed marker, the host application URL used to validate the message origin,
134
+ * the SDK version, the flags that pick the authentication flow, and the
135
+ * boot-time settings that would otherwise be applied a frame late (viewport,
136
+ * log level, locale, formatting and org). Everything else is delivered over
137
+ * `HostEvent.UpdateEmbedParams`.
138
+ * @internal
139
+ */
140
+ const BOOTSTRAP_URL_PARAMS: ReadonlySet<string> = new Set<string>([
141
+ Param.EmbedApp,
142
+ Param.HostAppUrl,
143
+ Param.Version,
144
+ Param.AuthType,
145
+ Param.AutoLogin,
146
+ Param.DisableLoginRedirect,
147
+ Param.ForceSAMLAutoRedirect,
148
+ Param.cookieless,
149
+ Param.preAuthCache,
150
+ Param.blockNonEmbedFullAppAccess,
151
+ Param.OverrideOrgId,
152
+ Param.ViewPortHeight,
153
+ Param.ViewPortWidth,
154
+ Param.ClientLogLevel,
155
+ Param.OverrideNativeConsole,
156
+ Param.PendoTrackingKey,
157
+ Param.NumberFormatLocale,
158
+ Param.DateFormatLocale,
159
+ Param.CurrencyFormat,
160
+ Param.Locale,
161
+ Param.searchEmbed,
162
+ Param.livedBoardEmbed,
163
+ Param.isSpotterAgentEmbed,
164
+ Param.SpotterEnabled,
165
+ Param.IsFullAppEmbed,
166
+ Param.IsOnBeforeGetVizDataInterceptEnabled,
167
+ Param.LinkOverride,
168
+ Param.EnableLinkOverridesV2,
169
+ Param.DisableRedirectionLinksInNewTab,
170
+ Param.OverrideHistoryState,
171
+ Param.ForceTable,
172
+ Param.StringIDsUrl,
173
+ Param.DataSources,
174
+ Param.ExposeTranslationIDs,
175
+ Param.IconSpriteUrl,
176
+ Param.Tag,
177
+ ]);
178
+
127
179
  /**
128
180
  * The event id map from v2 event names to v1 event id
129
181
  * v1 events are the classic embed events implemented in Blink v1
@@ -740,8 +792,9 @@ export class TsEmbed {
740
792
  ...this.viewConfig,
741
793
  ...queryParams,
742
794
  ...appInitData,
743
- // A show cycle has no URL to carry these, so the payload always states them
744
- // — including "none", which is the case that leaks the previous filters.
795
+ // A show cycle has no URL to carry these, so the payload always
796
+ // states them — including "none", which is the case that leaks the
797
+ // previous filters.
745
798
  runtimeFilterParams:
746
799
  getFilterQuery(this.viewConfig.runtimeFilters ?? []) || NO_RUNTIME_PARAMS,
747
800
  runtimeParameterParams:
@@ -948,7 +1001,7 @@ export class TsEmbed {
948
1001
  }
949
1002
 
950
1003
  protected getEmbedParams() {
951
- const queryParams = this.getEmbedParamsObject();
1004
+ const queryParams = this.getUrlQueryParamsObject();
952
1005
  return getQueryParamString(queryParams);
953
1006
  }
954
1007
 
@@ -957,6 +1010,16 @@ export class TsEmbed {
957
1010
  return params;
958
1011
  }
959
1012
 
1013
+ protected getUrlQueryParamsObject(): Record<any, any> {
1014
+ const queryParams = this.getEmbedParamsObject();
1015
+ if (!this.isConfigExcludedFromUrl()) {
1016
+ return queryParams;
1017
+ }
1018
+ return Object.fromEntries(
1019
+ Object.entries(queryParams).filter(([key]) => BOOTSTRAP_URL_PARAMS.has(key)),
1020
+ );
1021
+ }
1022
+
960
1023
  protected getRootIframeSrc() {
961
1024
  const query = this.getEmbedParams();
962
1025
  return this.getEmbedBasePath(query);
@@ -1615,8 +1678,9 @@ export class TsEmbed {
1615
1678
  (this.preRenderWrapper as any)[this.embedNodeKey] = this;
1616
1679
  }
1617
1680
 
1618
- // The flag lives on the wrapper because it describes the iframe: an instance
1619
- // hidden when the container announced itself would otherwise report false forever.
1681
+ // The flag lives on the wrapper because it describes the iframe: an
1682
+ // instance hidden when the container announced itself would otherwise
1683
+ // report false forever.
1620
1684
  private markEmbedContainerLoaded() {
1621
1685
  this.isEmbedContainerLoaded = true;
1622
1686
  if (this.preRenderWrapper) {
@@ -1672,10 +1736,14 @@ export class TsEmbed {
1672
1736
  const AUTH_INIT_FALLBACK_DELAY = 1000;
1673
1737
  // Wait for 1 second to ensure the embed container is loaded
1674
1738
  // This is a workaround to ensure the embed container is loaded
1675
- // this is needed until all clusters have EmbedListenerReady event
1739
+ // this is needed until all clusters have EmbedListenerReady
1740
+ // event
1676
1741
  setTimeout(processEmbedContainerReady, AUTH_INIT_FALLBACK_DELAY);
1677
1742
  } else if (source === EmbedEvent.EmbedListenerReady) {
1678
1743
  processEmbedContainerReady();
1744
+ if (this.isConfigExcludedFromUrl()) {
1745
+ this.triggerUpdateEmbedParams();
1746
+ }
1679
1747
  }
1680
1748
  };
1681
1749
 
@@ -2040,9 +2108,33 @@ export class TsEmbed {
2040
2108
  }
2041
2109
 
2042
2110
  // Subclasses that navigate the pre-render on show must await this before
2043
- // triggering Navigate. Resolves even on failure, so navigation is never blocked.
2111
+ // triggering Navigate. Resolves even on failure, so navigation is never
2112
+ // blocked.
2044
2113
  protected preRenderParamsApplied: Promise<void> = Promise.resolve();
2045
2114
 
2115
+ protected isConfigExcludedFromUrl(): boolean {
2116
+ const flag =
2117
+ this.viewConfig.additionalFlags?.excludeConfigFromURL ??
2118
+ this.embedConfig.additionalFlags?.excludeConfigFromURL;
2119
+ // Enabled by default; only an explicit false opts out.
2120
+ return flag !== false && flag !== 'false';
2121
+ }
2122
+
2123
+ protected async triggerUpdateEmbedParams(): Promise<void> {
2124
+ try {
2125
+ const params = await this.getUpdateEmbedParamsObject();
2126
+ this.trigger(HostEvent.UpdateEmbedParams, params);
2127
+ } catch (error) {
2128
+ logger.error(ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
2129
+ this.handleError({
2130
+ errorType: ErrorDetailsTypes.API,
2131
+ message: error?.message || ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
2132
+ code: EmbedErrorCodes.UPDATE_PARAMS_FAILED,
2133
+ error: error?.message || error,
2134
+ });
2135
+ }
2136
+ }
2137
+
2046
2138
  protected beforePrerenderVisible(): void {
2047
2139
  // We can ignore this as its a bit expensive and the newer customers
2048
2140
  // have moved on to UpdateEmbedParams supported clusters
@@ -2053,16 +2145,7 @@ export class TsEmbed {
2053
2145
  this.preRenderParamsApplied = new Promise<void>((resolve) => {
2054
2146
  this.executeAfterEmbedContainerLoaded(async () => {
2055
2147
  try {
2056
- const params = await this.getUpdateEmbedParamsObject();
2057
- this.trigger(HostEvent.UpdateEmbedParams, params);
2058
- } catch (error) {
2059
- logger.error(ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
2060
- this.handleError({
2061
- errorType: ErrorDetailsTypes.API,
2062
- message: error?.message || ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
2063
- code: EmbedErrorCodes.UPDATE_PARAMS_FAILED,
2064
- error: error?.message || error,
2065
- });
2148
+ await this.triggerUpdateEmbedParams();
2066
2149
  } finally {
2067
2150
  setTimeout(resolve, UPDATE_EMBED_PARAMS_SETTLE_MS);
2068
2151
  }
@@ -2099,8 +2182,9 @@ export class TsEmbed {
2099
2182
  if (this.hostElement) {
2100
2183
  this.insertedDomEl = this.createPreRenderPlaceholder();
2101
2184
  if ((this.viewConfig as { fullHeight: boolean }).fullHeight) {
2102
- // If fullHeight has already sized the wrapper, seed the placeholder
2103
- // with the same height so syncPreRenderStyle gets an accurate rect.
2185
+ // If fullHeight has already sized the wrapper, seed the
2186
+ // placeholder with the same height so syncPreRenderStyle gets
2187
+ // an accurate rect.
2104
2188
  const existingHeight = this.preRenderWrapper.style.height;
2105
2189
  if (existingHeight) {
2106
2190
  (this.insertedDomEl as HTMLDivElement).style.height = existingHeight;
@@ -2109,12 +2193,13 @@ export class TsEmbed {
2109
2193
 
2110
2194
  const placeHolderId = this.getPreRenderIds().placeHolder;
2111
2195
  // Remove any stale placeholder from a previous cycle. It is located
2112
- // via a subtree-wide querySelector, so it may be nested deeper than a
2113
- // direct child (E.g.: with fullHeight the host app can wrap it). Use
2114
- // Element.remove() — which detaches from whatever the real parent is —
2115
- // rather than hostElement.removeChild(), which throws NotFoundError
2116
- // when the match is not a direct child. Mirrors the wrapper/child
2117
- // cleanup in createPreRenderWrapper()/createPreRenderChild().
2196
+ // via a subtree-wide querySelector, so it may be nested deeper
2197
+ // than a direct child (E.g.: with fullHeight the host app can wrap
2198
+ // it). Use Element.remove() — which detaches from whatever the real
2199
+ // parent is — rather than hostElement.removeChild(), which throws
2200
+ // NotFoundError when the match is not a direct child. Mirrors the
2201
+ // wrapper/child cleanup in
2202
+ // createPreRenderWrapper()/createPreRenderChild().
2118
2203
  this.hostElement.querySelector(`#${placeHolderId}`)?.remove();
2119
2204
 
2120
2205
  this.hostElement.appendChild(this.insertedDomEl);
@@ -2153,7 +2238,8 @@ export class TsEmbed {
2153
2238
  this.setupFullscreenChangeHandler();
2154
2239
  }
2155
2240
 
2156
- // Last, so everything above still sees the instance being taken over from.
2241
+ // Last, so everything above still sees the instance being taken over
2242
+ // from.
2157
2243
  this.takeOverPreRender();
2158
2244
 
2159
2245
  return this;
package/src/errors.ts CHANGED
@@ -29,7 +29,7 @@ export const ERROR_MESSAGE = {
29
29
  SSR_ENVIRONMENT_ERROR: 'SSR environment detected. This function cannot be called in SSR environment.',
30
30
  UPDATE_PARAMS_FAILED: 'Failed to update embed parameters',
31
31
  INVALID_SPOTTER_DOCUMENTATION_URL: 'Invalid spotterDocumentationUrl. Please provide a valid http or https URL.',
32
- UPDATEFILTERS_INVALID_PAYLOAD: 'UpdateFilters requires a valid filter or filters array. Expected: { filter: { column, oper, values } } or { filters: [{ column, oper, values }, ...] }',
32
+ UPDATEFILTERS_INVALID_PAYLOAD: 'UpdateFilters requires a valid filter or filters array. Expected: { filter: { columnName, operator, values } } or { filters: [{ columnName, operator, values }, ...] }',
33
33
  DRILLDOWN_INVALID_PAYLOAD: 'DrillDown requires a valid points object. Expected: { points: { clickedPoint?, selectedPoints? }, autoDrillDown?, vizId? }',
34
34
  UPDATEPARAMETERS_INVALID_PAYLOAD: 'UpdateParameters received an invalid applicability. Expected: { level: LIVEBOARD | TAB | GROUP, targetId } where targetId is required for TAB and GROUP levels',
35
35
  };
package/src/index.ts CHANGED
@@ -151,6 +151,12 @@ import {
151
151
  NavigateRequest,
152
152
  SetActiveTabRequest,
153
153
  } from './contracts/host-event-contracts';
154
+ import {
155
+ convertFilterChangedToUpdateFiltersPayload,
156
+ FilterChangedPayload,
157
+ UpdateFiltersFilterParam,
158
+ UpdateFiltersPayload,
159
+ } from './utils/filterConverter';
154
160
 
155
161
  export {
156
162
  init,
@@ -318,6 +324,10 @@ export {
318
324
  DataLabelFilterOperator,
319
325
  TableTheme,
320
326
  TableContentDensity,
327
+ convertFilterChangedToUpdateFiltersPayload,
328
+ FilterChangedPayload,
329
+ UpdateFiltersFilterParam,
330
+ UpdateFiltersPayload,
321
331
  };
322
332
 
323
333
  export { resetCachedAuthToken } from './authToken';
@@ -128,4 +128,8 @@ export {
128
128
  StarterPromptCategory,
129
129
  StarterPreviewDataCategory,
130
130
  StarterPromptQuestion,
131
+ convertFilterChangedToUpdateFiltersPayload,
132
+ FilterChangedPayload,
133
+ UpdateFiltersFilterParam,
134
+ UpdateFiltersPayload,
131
135
  } from '../index';
package/src/types.ts CHANGED
@@ -5918,6 +5918,12 @@ export enum HostEvent {
5918
5918
  * ```js
5919
5919
  * const data = await liveboardEmbed.trigger(HostEvent.GetFilters);
5920
5920
  * console.log('data', data);
5921
+ * // {
5922
+ * // liveboardFilters: [ ... ],
5923
+ * // runtimeFilters: [
5924
+ * // { columnName: "Region", operator: "IN", values: ["West"] }
5925
+ * // ]
5926
+ * // }
5921
5927
  * ```
5922
5928
  * @example
5923
5929
  * ```js
@@ -5942,9 +5948,9 @@ export enum HostEvent {
5942
5948
  *
5943
5949
  * Each filter object must include the following attributes:
5944
5950
  *
5945
- * `column` - Name of the column to filter on.
5951
+ * `columnName` - Name of the column to filter on.
5946
5952
  *
5947
- * `oper` - Filter operator, for example, EQ, IN, CONTAINS.
5953
+ * `operator` - Filter operator, for example, EQ, IN, CONTAINS.
5948
5954
  * For information about the supported filter operators,
5949
5955
  * see link:https://developers.thoughtspot.com/docs/runtime-filters#rtOperator[Developer Documentation].
5950
5956
  *
@@ -5971,8 +5977,8 @@ export enum HostEvent {
5971
5977
  *
5972
5978
  * liveboardEmbed.trigger(HostEvent.UpdateFilters, {
5973
5979
  * filter: {
5974
- * column: "item type",
5975
- * oper: "IN",
5980
+ * columnName: "item type",
5981
+ * operator: "IN",
5976
5982
  * values: ["bags","shirts"]
5977
5983
  * }
5978
5984
  * });
@@ -5982,8 +5988,8 @@ export enum HostEvent {
5982
5988
  *
5983
5989
  * liveboardEmbed.trigger(HostEvent.UpdateFilters, {
5984
5990
  * filter: {
5985
- * column: "date",
5986
- * oper: "EQ",
5991
+ * columnName: "date",
5992
+ * operator: "EQ",
5987
5993
  * values: ["JULY","2023"],
5988
5994
  * type: "MONTH_YEAR"
5989
5995
  * }
@@ -5994,18 +6000,18 @@ export enum HostEvent {
5994
6000
  * ```js
5995
6001
  * liveboardEmbed.trigger(HostEvent.UpdateFilters, {
5996
6002
  * filters: [{
5997
- * column: "Item Type",
5998
- * oper: 'IN',
6003
+ * columnName: "Item Type",
6004
+ * operator: 'IN',
5999
6005
  * values: ["bags","shirts"]
6000
6006
  * },
6001
6007
  * {
6002
- * column: "Region",
6003
- * oper: 'IN',
6008
+ * columnName: "Region",
6009
+ * operator: 'IN',
6004
6010
  * values: ["West","Midwest"]
6005
6011
  * },
6006
6012
  * {
6007
- * column: "Date",
6008
- * oper: 'EQ',
6013
+ * columnName: "Date",
6014
+ * operator: 'EQ',
6009
6015
  * values: ["2023-07-31"],
6010
6016
  * type: "EXACT_DATE"
6011
6017
  * }]
@@ -6019,13 +6025,13 @@ export enum HostEvent {
6019
6025
  * ```js
6020
6026
  * liveboardEmbed.trigger(HostEvent.UpdateFilters, {
6021
6027
  * filters: [{
6022
- * column: "(Sample) Retail - Apparel::city",
6023
- * oper: 'IN',
6028
+ * columnName: "(Sample) Retail - Apparel::city",
6029
+ * operator: 'IN',
6024
6030
  * values: ["atlanta"]
6025
6031
  * },
6026
6032
  * {
6027
- * column: "(Sample) Retail - Apparel::Region",
6028
- * oper: 'IN',
6033
+ * columnName: "(Sample) Retail - Apparel::Region",
6034
+ * operator: 'IN',
6029
6035
  * values: ["West","Midwest"]
6030
6036
  * }]
6031
6037
  * });
@@ -6036,8 +6042,8 @@ export enum HostEvent {
6036
6042
  * import { ContextType } from '@thoughtspot/visual-embed-sdk';
6037
6043
  * liveboardEmbed.trigger(HostEvent.UpdateFilters, {
6038
6044
  * filter: {
6039
- * column: "item type",
6040
- * oper: "IN",
6045
+ * columnName: "item type",
6046
+ * operator: "IN",
6041
6047
  * values: ["shoes", "boots"]
6042
6048
  * }
6043
6049
  * }, ContextType.Liveboard);
@@ -6047,8 +6053,8 @@ export enum HostEvent {
6047
6053
  * // Scope the filter to a specific Liveboard tab
6048
6054
  * liveboardEmbed.trigger(HostEvent.UpdateFilters, {
6049
6055
  * filter: {
6050
- * column: "item type",
6051
- * oper: "IN",
6056
+ * columnName: "item type",
6057
+ * operator: "IN",
6052
6058
  * values: ["bags", "shirts"],
6053
6059
  * applicability: {
6054
6060
  * level: "TAB",
@@ -6057,6 +6063,12 @@ export enum HostEvent {
6057
6063
  * }
6058
6064
  * });
6059
6065
  * ```
6066
+ * Use `columnName` and `operator` - the same spelling as
6067
+ * {@link RuntimeFilter}. The older `column` and `oper` spellings are
6068
+ * deprecated; they are still accepted, but pass only one spelling of each
6069
+ * field, never both. To reapply the filter state captured from
6070
+ * {@link EmbedEvent.FilterChanged}, use `convertFilterChangedToUpdateFiltersPayload`
6071
+ * to convert its payload into the shape expected here.
6060
6072
  * @version SDK: 1.23.0 | ThoughtSpot: 9.4.0.cl
6061
6073
  */
6062
6074
  UpdateFilters = 'updateFilters',
@@ -7053,7 +7065,6 @@ export enum Param {
7053
7065
  IsStarterPromptsEnabled = 'enableStarterPrompts',
7054
7066
  UpdatedSpotterExperience = 'updatedSpotterExperience',
7055
7067
  SpotterDataSources = 'spotterDataSources',
7056
- AnalystId = 'analystId',
7057
7068
  OpenSpotterOnLiveboardByDefault = 'openSpotterOnLiveboardByDefault',
7058
7069
  ShowAnswerEditPanel = 'showAnswerEditPanel',
7059
7070
  }
@@ -9311,6 +9322,18 @@ export enum Action {
9311
9322
  * ```
9312
9323
  */
9313
9324
  DeleteCollection = 'deleteCollection',
9325
+ /**
9326
+ * Controls the visibility of the "Customize homepage" button on the
9327
+ * embedded home page.
9328
+ * @version SDK: 1.55.0 | ThoughtSpot Cloud: 26.12.0.cl
9329
+ * @example
9330
+ * ```js
9331
+ * {
9332
+ * hiddenActions: [Action.CustomizeHomepage],
9333
+ * }
9334
+ * ```
9335
+ */
9336
+ CustomizeHomepage = 'customizeHomepage',
9314
9337
  }
9315
9338
  export interface AnswerServiceType {
9316
9339
  getAnswer?: (offset: number, batchSize: number) => any;
@@ -79,7 +79,8 @@ describe('fetchPreauthInfoService', () => {
79
79
  });
80
80
  it('fetchPreauthInfoService if fetch fails', async () => {
81
81
  const mockFetch = jest.spyOn(tokenizedFetchModule, 'tokenizedFetch');
82
- // Prevent logger.error from reaching console.error (which throws in test env)
82
+ // Prevent logger.error from reaching console.error (which throws in
83
+ // test env)
83
84
  jest.spyOn(logger, 'error').mockImplementation(() => {});
84
85
 
85
86
  mockFetch.mockResolvedValueOnce({
@@ -439,7 +439,8 @@ describe('getCustomActions function', () => {
439
439
  metadataIds: { liveboardIds: ['lb-1'] },
440
440
  } as any;
441
441
  const result = getCustomActions([action]);
442
- // Expect an error containing 'none' for unsupported metadataIds on SPOTTER
442
+ // Expect an error containing 'none' for unsupported metadataIds on
443
+ // SPOTTER
443
444
  expect(result.errors.some((e) => e.includes('none'))).toBe(true);
444
445
  });
445
446
 
@@ -452,7 +453,8 @@ describe('getCustomActions function', () => {
452
453
  dataModelIds: { modelIds: ['model-1'] },
453
454
  } as any;
454
455
  const result = getCustomActions([action]);
455
- // Expect an error containing 'none' for unsupported dataModelIds on LIVEBOARD
456
+ // Expect an error containing 'none' for unsupported dataModelIds
457
+ // on LIVEBOARD
456
458
  expect(result.errors.some((e) => e.includes('none'))).toBe(true);
457
459
  });
458
460
  });