@thoughtspot/visual-embed-sdk 1.24.0-sage.3 → 1.24.1

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 (308) hide show
  1. package/README.md +1 -1
  2. package/cjs/package.json +10 -3
  3. package/cjs/src/auth.d.ts.map +1 -1
  4. package/cjs/src/auth.js +3 -0
  5. package/cjs/src/auth.js.map +1 -1
  6. package/cjs/src/css-variables.d.ts +38 -0
  7. package/cjs/src/css-variables.d.ts.map +1 -1
  8. package/cjs/src/embed/app.d.ts +33 -1
  9. package/cjs/src/embed/app.d.ts.map +1 -1
  10. package/cjs/src/embed/app.js +12 -8
  11. package/cjs/src/embed/app.js.map +1 -1
  12. package/cjs/src/embed/app.spec.js +46 -0
  13. package/cjs/src/embed/app.spec.js.map +1 -1
  14. package/cjs/src/embed/base.d.ts +6 -1
  15. package/cjs/src/embed/base.d.ts.map +1 -1
  16. package/cjs/src/embed/base.js +8 -3
  17. package/cjs/src/embed/base.js.map +1 -1
  18. package/cjs/src/embed/liveboard.d.ts +6 -1
  19. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  20. package/cjs/src/embed/liveboard.js +6 -2
  21. package/cjs/src/embed/liveboard.js.map +1 -1
  22. package/cjs/src/embed/liveboard.spec.js +23 -7
  23. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  24. package/cjs/src/embed/sage.d.ts +1 -0
  25. package/cjs/src/embed/sage.d.ts.map +1 -1
  26. package/cjs/src/embed/sage.js +1 -0
  27. package/cjs/src/embed/sage.js.map +1 -1
  28. package/cjs/src/embed/search-bar.d.ts +7 -0
  29. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  30. package/cjs/src/embed/search-bar.js +6 -2
  31. package/cjs/src/embed/search-bar.js.map +1 -1
  32. package/cjs/src/embed/search.d.ts +16 -2
  33. package/cjs/src/embed/search.d.ts.map +1 -1
  34. package/cjs/src/embed/search.js +9 -2
  35. package/cjs/src/embed/search.js.map +1 -1
  36. package/cjs/src/embed/search.spec.js +49 -0
  37. package/cjs/src/embed/search.spec.js.map +1 -1
  38. package/cjs/src/embed/ts-embed.d.ts +4 -1
  39. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  40. package/cjs/src/embed/ts-embed.js +31 -8
  41. package/cjs/src/embed/ts-embed.js.map +1 -1
  42. package/cjs/src/embed/ts-embed.spec.js +186 -3
  43. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  44. package/cjs/src/index.d.ts +4 -3
  45. package/cjs/src/index.d.ts.map +1 -1
  46. package/cjs/src/index.js +5 -1
  47. package/cjs/src/index.js.map +1 -1
  48. package/cjs/src/mixpanel-service.d.ts +1 -0
  49. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  50. package/cjs/src/mixpanel-service.js +12 -3
  51. package/cjs/src/mixpanel-service.js.map +1 -1
  52. package/cjs/src/mixpanel-service.spec.js +13 -3
  53. package/cjs/src/mixpanel-service.spec.js.map +1 -1
  54. package/cjs/src/react/index.d.ts +15 -15
  55. package/cjs/src/react/index.d.ts.map +1 -1
  56. package/cjs/src/react/index.js +7 -3
  57. package/cjs/src/react/index.js.map +1 -1
  58. package/cjs/src/react/index.spec.js +12 -0
  59. package/cjs/src/react/index.spec.js.map +1 -1
  60. package/cjs/src/types.d.ts +216 -21
  61. package/cjs/src/types.d.ts.map +1 -1
  62. package/cjs/src/types.js +133 -13
  63. package/cjs/src/types.js.map +1 -1
  64. package/cjs/src/utils/answerService/answerService.d.ts +34 -0
  65. package/cjs/src/utils/answerService/answerService.d.ts.map +1 -0
  66. package/cjs/src/utils/answerService/answerService.js +142 -0
  67. package/cjs/src/utils/answerService/answerService.js.map +1 -0
  68. package/cjs/src/utils/answerService/answerService.spec.d.ts +1 -0
  69. package/cjs/src/utils/answerService/answerService.spec.d.ts.map +1 -0
  70. package/cjs/src/utils/answerService/answerService.spec.js +1 -0
  71. package/cjs/src/utils/answerService/answerService.spec.js.map +1 -0
  72. package/cjs/src/utils/answerService/graphql-queries.d.ts +6 -0
  73. package/cjs/src/utils/answerService/graphql-queries.d.ts.map +1 -0
  74. package/cjs/src/utils/answerService/graphql-queries.js +123 -0
  75. package/cjs/src/utils/answerService/graphql-queries.js.map +1 -0
  76. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  77. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  78. package/cjs/src/utils/graphql/answerService/answer-queries.js +80 -0
  79. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -0
  80. package/cjs/src/utils/graphql/answerService/answerService.d.ts +61 -0
  81. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  82. package/cjs/src/utils/graphql/answerService/answerService.js +182 -0
  83. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -0
  84. package/cjs/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  85. package/cjs/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  86. package/cjs/src/utils/graphql/answerService/answerService.spec.js +201 -0
  87. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -0
  88. package/cjs/src/utils/graphql/answerService/graphql-queries.d.ts +5 -0
  89. package/cjs/src/utils/graphql/answerService/graphql-queries.d.ts.map +1 -0
  90. package/cjs/src/utils/graphql/answerService/graphql-queries.js +80 -0
  91. package/cjs/src/utils/graphql/answerService/graphql-queries.js.map +1 -0
  92. package/cjs/src/utils/graphql/graphql-request.d.ts +15 -0
  93. package/cjs/src/utils/graphql/graphql-request.d.ts.map +1 -0
  94. package/cjs/src/utils/graphql/graphql-request.js +40 -0
  95. package/cjs/src/utils/graphql/graphql-request.js.map +1 -0
  96. package/cjs/src/utils/graphql/sourceService.d.ts +8 -0
  97. package/cjs/src/utils/graphql/sourceService.d.ts.map +1 -0
  98. package/cjs/src/utils/graphql/sourceService.js +69 -0
  99. package/cjs/src/utils/graphql/sourceService.js.map +1 -0
  100. package/cjs/src/utils/graphql/sourceService.spec.d.ts +2 -0
  101. package/cjs/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  102. package/cjs/src/utils/graphql/sourceService.spec.js +12 -0
  103. package/cjs/src/utils/graphql/sourceService.spec.js.map +1 -0
  104. package/cjs/src/utils/processData.d.ts.map +1 -1
  105. package/cjs/src/utils/processData.js +7 -11
  106. package/cjs/src/utils/processData.js.map +1 -1
  107. package/cjs/src/utils/processData.spec.js +13 -17
  108. package/cjs/src/utils/processData.spec.js.map +1 -1
  109. package/cjs/src/utils.d.ts +13 -1
  110. package/cjs/src/utils.d.ts.map +1 -1
  111. package/cjs/src/utils.js +45 -1
  112. package/cjs/src/utils.js.map +1 -1
  113. package/cjs/src/utils.spec.js +24 -0
  114. package/cjs/src/utils.spec.js.map +1 -1
  115. package/dist/src/auth.d.ts.map +1 -1
  116. package/dist/src/css-variables.d.ts +38 -0
  117. package/dist/src/css-variables.d.ts.map +1 -1
  118. package/dist/src/embed/app.d.ts +33 -1
  119. package/dist/src/embed/app.d.ts.map +1 -1
  120. package/dist/src/embed/base.d.ts +6 -1
  121. package/dist/src/embed/base.d.ts.map +1 -1
  122. package/dist/src/embed/liveboard.d.ts +6 -1
  123. package/dist/src/embed/liveboard.d.ts.map +1 -1
  124. package/dist/src/embed/sage.d.ts +1 -0
  125. package/dist/src/embed/sage.d.ts.map +1 -1
  126. package/dist/src/embed/search-bar.d.ts +7 -0
  127. package/dist/src/embed/search-bar.d.ts.map +1 -1
  128. package/dist/src/embed/search.d.ts +16 -2
  129. package/dist/src/embed/search.d.ts.map +1 -1
  130. package/dist/src/embed/ts-embed.d.ts +4 -1
  131. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  132. package/dist/src/index.d.ts +4 -3
  133. package/dist/src/index.d.ts.map +1 -1
  134. package/dist/src/mixpanel-service.d.ts +1 -0
  135. package/dist/src/mixpanel-service.d.ts.map +1 -1
  136. package/dist/src/react/index.d.ts +15 -15
  137. package/dist/src/react/index.d.ts.map +1 -1
  138. package/dist/src/types.d.ts +216 -21
  139. package/dist/src/types.d.ts.map +1 -1
  140. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  141. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  142. package/dist/src/utils/graphql/answerService/answerService.d.ts +61 -0
  143. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  144. package/dist/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  145. package/dist/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  146. package/dist/src/utils/graphql/graphql-request.d.ts +15 -0
  147. package/dist/src/utils/graphql/graphql-request.d.ts.map +1 -0
  148. package/dist/src/utils/graphql/sourceService.d.ts +8 -0
  149. package/dist/src/utils/graphql/sourceService.d.ts.map +1 -0
  150. package/dist/src/utils/graphql/sourceService.spec.d.ts +2 -0
  151. package/dist/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  152. package/dist/src/utils/processData.d.ts.map +1 -1
  153. package/dist/src/utils.d.ts +13 -1
  154. package/dist/src/utils.d.ts.map +1 -1
  155. package/dist/tsembed-react.es.js +603 -96
  156. package/dist/tsembed-react.js +596 -95
  157. package/dist/tsembed.es.js +655 -100
  158. package/dist/tsembed.js +649 -99
  159. package/dist/visual-embed-sdk-react-full.d.ts +615 -260
  160. package/dist/visual-embed-sdk-react.d.ts +617 -262
  161. package/dist/visual-embed-sdk.d.ts +380 -26
  162. package/lib/package.json +10 -3
  163. package/lib/src/.index.d.ts.swp +0 -0
  164. package/lib/src/auth.d.ts.map +1 -1
  165. package/lib/src/auth.js +3 -0
  166. package/lib/src/auth.js.map +1 -1
  167. package/lib/src/css-variables.d.ts +38 -0
  168. package/lib/src/css-variables.d.ts.map +1 -1
  169. package/lib/src/embed/app.d.ts +33 -1
  170. package/lib/src/embed/app.d.ts.map +1 -1
  171. package/lib/src/embed/app.js +12 -8
  172. package/lib/src/embed/app.js.map +1 -1
  173. package/lib/src/embed/app.spec.js +46 -0
  174. package/lib/src/embed/app.spec.js.map +1 -1
  175. package/lib/src/embed/base.d.ts +6 -1
  176. package/lib/src/embed/base.d.ts.map +1 -1
  177. package/lib/src/embed/base.js +8 -3
  178. package/lib/src/embed/base.js.map +1 -1
  179. package/lib/src/embed/liveboard.d.ts +6 -1
  180. package/lib/src/embed/liveboard.d.ts.map +1 -1
  181. package/lib/src/embed/liveboard.js +7 -3
  182. package/lib/src/embed/liveboard.js.map +1 -1
  183. package/lib/src/embed/liveboard.spec.js +23 -7
  184. package/lib/src/embed/liveboard.spec.js.map +1 -1
  185. package/lib/src/embed/sage.d.ts +1 -0
  186. package/lib/src/embed/sage.d.ts.map +1 -1
  187. package/lib/src/embed/sage.js +1 -0
  188. package/lib/src/embed/sage.js.map +1 -1
  189. package/lib/src/embed/search-bar.d.ts +7 -0
  190. package/lib/src/embed/search-bar.d.ts.map +1 -1
  191. package/lib/src/embed/search-bar.js +7 -3
  192. package/lib/src/embed/search-bar.js.map +1 -1
  193. package/lib/src/embed/search.d.ts +16 -2
  194. package/lib/src/embed/search.d.ts.map +1 -1
  195. package/lib/src/embed/search.js +10 -3
  196. package/lib/src/embed/search.js.map +1 -1
  197. package/lib/src/embed/search.spec.js +49 -0
  198. package/lib/src/embed/search.spec.js.map +1 -1
  199. package/lib/src/embed/ts-embed.d.ts +4 -1
  200. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  201. package/lib/src/embed/ts-embed.js +32 -9
  202. package/lib/src/embed/ts-embed.js.map +1 -1
  203. package/lib/src/embed/ts-embed.spec.js +187 -4
  204. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  205. package/lib/src/index.d.ts +4 -3
  206. package/lib/src/index.d.ts.map +1 -1
  207. package/lib/src/index.js +4 -3
  208. package/lib/src/index.js.map +1 -1
  209. package/lib/src/mixpanel-service.d.ts +1 -0
  210. package/lib/src/mixpanel-service.d.ts.map +1 -1
  211. package/lib/src/mixpanel-service.js +12 -3
  212. package/lib/src/mixpanel-service.js.map +1 -1
  213. package/lib/src/mixpanel-service.spec.js +13 -3
  214. package/lib/src/mixpanel-service.spec.js.map +1 -1
  215. package/lib/src/react/index.d.ts +15 -15
  216. package/lib/src/react/index.d.ts.map +1 -1
  217. package/lib/src/react/index.js +5 -3
  218. package/lib/src/react/index.js.map +1 -1
  219. package/lib/src/react/index.spec.js +13 -1
  220. package/lib/src/react/index.spec.js.map +1 -1
  221. package/lib/src/types.d.ts +216 -21
  222. package/lib/src/types.d.ts.map +1 -1
  223. package/lib/src/types.js +132 -12
  224. package/lib/src/types.js.map +1 -1
  225. package/lib/src/utils/answerService/answerService.d.ts +34 -0
  226. package/lib/src/utils/answerService/answerService.d.ts.map +1 -0
  227. package/lib/src/utils/answerService/answerService.js +137 -0
  228. package/lib/src/utils/answerService/answerService.js.map +1 -0
  229. package/lib/src/utils/answerService/answerService.spec.d.ts +1 -0
  230. package/lib/src/utils/answerService/answerService.spec.d.ts.map +1 -0
  231. package/lib/src/utils/answerService/answerService.spec.js +1 -0
  232. package/lib/src/utils/answerService/answerService.spec.js.map +1 -0
  233. package/lib/src/utils/answerService/graphql-queries.d.ts +6 -0
  234. package/lib/src/utils/answerService/graphql-queries.d.ts.map +1 -0
  235. package/lib/src/utils/answerService/graphql-queries.js +120 -0
  236. package/lib/src/utils/answerService/graphql-queries.js.map +1 -0
  237. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  238. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  239. package/lib/src/utils/graphql/answerService/answer-queries.js +77 -0
  240. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -0
  241. package/lib/src/utils/graphql/answerService/answerService.d.ts +61 -0
  242. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  243. package/lib/src/utils/graphql/answerService/answerService.js +177 -0
  244. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -0
  245. package/lib/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  246. package/lib/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  247. package/lib/src/utils/graphql/answerService/answerService.spec.js +199 -0
  248. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -0
  249. package/lib/src/utils/graphql/answerService/graphql-queries.d.ts +5 -0
  250. package/lib/src/utils/graphql/answerService/graphql-queries.d.ts.map +1 -0
  251. package/lib/src/utils/graphql/answerService/graphql-queries.js +77 -0
  252. package/lib/src/utils/graphql/answerService/graphql-queries.js.map +1 -0
  253. package/lib/src/utils/graphql/graphql-request.d.ts +15 -0
  254. package/lib/src/utils/graphql/graphql-request.d.ts.map +1 -0
  255. package/lib/src/utils/graphql/graphql-request.js +36 -0
  256. package/lib/src/utils/graphql/graphql-request.js.map +1 -0
  257. package/lib/src/utils/graphql/sourceService.d.ts +8 -0
  258. package/lib/src/utils/graphql/sourceService.d.ts.map +1 -0
  259. package/lib/src/utils/graphql/sourceService.js +65 -0
  260. package/lib/src/utils/graphql/sourceService.js.map +1 -0
  261. package/lib/src/utils/graphql/sourceService.spec.d.ts +2 -0
  262. package/lib/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  263. package/lib/src/utils/graphql/sourceService.spec.js +10 -0
  264. package/lib/src/utils/graphql/sourceService.spec.js.map +1 -0
  265. package/lib/src/utils/processData.d.ts.map +1 -1
  266. package/lib/src/utils/processData.js +8 -12
  267. package/lib/src/utils/processData.js.map +1 -1
  268. package/lib/src/utils/processData.spec.js +14 -18
  269. package/lib/src/utils/processData.spec.js.map +1 -1
  270. package/lib/src/utils.d.ts +13 -1
  271. package/lib/src/utils.d.ts.map +1 -1
  272. package/lib/src/utils.js +41 -0
  273. package/lib/src/utils.js.map +1 -1
  274. package/lib/src/utils.spec.js +25 -1
  275. package/lib/src/utils.spec.js.map +1 -1
  276. package/lib/src/visual-embed-sdk.d.ts +389 -30
  277. package/package.json +10 -3
  278. package/src/auth.ts +6 -3
  279. package/src/css-variables.ts +47 -0
  280. package/src/embed/app.spec.ts +63 -0
  281. package/src/embed/app.ts +52 -15
  282. package/src/embed/base.ts +11 -6
  283. package/src/embed/liveboard.spec.ts +29 -10
  284. package/src/embed/liveboard.ts +13 -2
  285. package/src/embed/sage.ts +2 -0
  286. package/src/embed/search-bar.tsx +21 -6
  287. package/src/embed/search.spec.ts +61 -0
  288. package/src/embed/search.ts +36 -3
  289. package/src/embed/ts-embed.spec.ts +211 -8
  290. package/src/embed/ts-embed.ts +34 -9
  291. package/src/index.ts +9 -0
  292. package/src/mixpanel-service.spec.ts +13 -3
  293. package/src/mixpanel-service.ts +11 -3
  294. package/src/react/index.spec.tsx +33 -2
  295. package/src/react/index.tsx +37 -26
  296. package/src/types.ts +305 -103
  297. package/src/utils/graphql/answerService/answer-queries.ts +80 -0
  298. package/src/utils/graphql/answerService/answerService.spec.ts +231 -0
  299. package/src/utils/graphql/answerService/answerService.ts +234 -0
  300. package/src/utils/graphql/graphql-request.ts +45 -0
  301. package/src/utils/graphql/sourceService.spec.ts +10 -0
  302. package/src/utils/graphql/sourceService.ts +71 -0
  303. package/src/utils/processData.spec.ts +15 -25
  304. package/src/utils/processData.ts +13 -15
  305. package/src/utils.spec.ts +31 -0
  306. package/src/utils.ts +47 -0
  307. package/src/utils/answerService.spec.ts +0 -41
  308. package/src/utils/answerService.ts +0 -63
@@ -14,8 +14,14 @@ import {
14
14
  Action,
15
15
  ViewConfig,
16
16
  RuntimeFilter,
17
+ RuntimeParameter,
17
18
  } from '../types';
18
- import { getQueryParamString, checkReleaseVersionInBeta, getFilterQuery } from '../utils';
19
+ import {
20
+ getQueryParamString,
21
+ checkReleaseVersionInBeta,
22
+ getFilterQuery,
23
+ getRuntimeParameters,
24
+ } from '../utils';
19
25
  import { TsEmbed } from './ts-embed';
20
26
  import { version } from '../../package.json';
21
27
  import { ERROR_MESSAGE } from '../errors';
@@ -60,6 +66,10 @@ export interface SearchViewConfig extends ViewConfig {
60
66
  * using raw answer data.
61
67
  */
62
68
  hideResults?: boolean;
69
+ /**
70
+ * If set to true, expands all the data sources panel.
71
+ */
72
+ expandAllDataSource?: boolean;
63
73
  /**
64
74
  * If set to true, the Search Assist feature is enabled.
65
75
  *
@@ -110,9 +120,18 @@ export interface SearchViewConfig extends ViewConfig {
110
120
  *
111
121
  * @default false
112
122
  * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
113
- * @hidden
114
123
  */
115
124
  dataPanelV2?: boolean;
125
+ /**
126
+ * Flag to set if last selected dataSource should be used
127
+ *
128
+ * @version: SDK: 1.24.0
129
+ */
130
+ useLastSelectedSources?: boolean;
131
+ /**
132
+ * The list of parameter override to apply to a search answer.
133
+ */
134
+ runtimeParameters?: RuntimeParameter[];
116
135
  }
117
136
 
118
137
  export const HiddenActionItemByDefaultForSearchEmbed = [
@@ -134,6 +153,8 @@ export class SearchEmbed extends TsEmbed {
134
153
  */
135
154
  protected viewConfig: SearchViewConfig;
136
155
 
156
+ protected embedComponentType = 'SearchEmbed';
157
+
137
158
  constructor(domSelector: DOMSelector, viewConfig: SearchViewConfig) {
138
159
  super(domSelector);
139
160
  this.viewConfig = viewConfig;
@@ -158,6 +179,7 @@ export class SearchEmbed extends TsEmbed {
158
179
  protected getEmbedParams(): string {
159
180
  const {
160
181
  hideResults,
182
+ expandAllDataSource,
161
183
  enableSearchAssist,
162
184
  forceTable,
163
185
  searchOptions,
@@ -166,6 +188,8 @@ export class SearchEmbed extends TsEmbed {
166
188
  dataSources,
167
189
  excludeRuntimeFiltersfromURL,
168
190
  dataPanelV2 = false,
191
+ useLastSelectedSources = false,
192
+ runtimeParameters,
169
193
  } = this.viewConfig;
170
194
  const queryParams = this.getBaseQueryParams();
171
195
 
@@ -201,13 +225,22 @@ export class SearchEmbed extends TsEmbed {
201
225
 
202
226
  queryParams[Param.DataPanelV2Enabled] = dataPanelV2;
203
227
  queryParams[Param.DataSourceMode] = this.getDataSourceMode();
204
- queryParams[Param.UseLastSelectedDataSource] = false;
228
+
229
+ queryParams[Param.UseLastSelectedDataSource] = useLastSelectedSources;
230
+ if (dataSource || dataSources) {
231
+ queryParams[Param.UseLastSelectedDataSource] = false;
232
+ }
233
+
205
234
  queryParams[Param.searchEmbed] = true;
206
235
  let query = '';
207
236
  const queryParamsString = getQueryParamString(queryParams, true);
208
237
  if (queryParamsString) {
209
238
  query = `?${queryParamsString}`;
210
239
  }
240
+
241
+ const parameterQuery = getRuntimeParameters(runtimeParameters || []);
242
+ if (parameterQuery) query += `&${parameterQuery}`;
243
+
211
244
  const filterQuery = getFilterQuery(runtimeFilters || []);
212
245
  if (filterQuery && !excludeRuntimeFiltersfromURL) {
213
246
  query += `&${filterQuery}`;
@@ -9,7 +9,13 @@ import {
9
9
  AppEmbed,
10
10
  LiveboardEmbed,
11
11
  } from '../index';
12
- import { Action, RuntimeFilter, RuntimeFilterOp } from '../types';
12
+ import {
13
+ Action,
14
+ HomeLeftNavItem,
15
+ RuntimeFilter,
16
+ RuntimeFilterOp,
17
+ HomepageModule,
18
+ } from '../types';
13
19
  import {
14
20
  executeAfterWait,
15
21
  getDocumentBody,
@@ -101,7 +107,15 @@ describe('Unit test case for ts embed', () => {
101
107
  });
102
108
  expect(mockPort.postMessage).toHaveBeenCalledWith({
103
109
  type: EmbedEvent.APP_INIT,
104
- data: { customisations, authToken: '', runtimeFilterParams: null },
110
+ data: {
111
+ customisations,
112
+ authToken: '',
113
+ runtimeFilterParams: null,
114
+ hiddenHomeLeftNavItems: [],
115
+ hiddenHomepageModules: [],
116
+ hostConfig: undefined,
117
+ reorderedHomepageModules: [],
118
+ },
105
119
  });
106
120
  });
107
121
 
@@ -128,6 +142,10 @@ describe('Unit test case for ts embed', () => {
128
142
  customisations: customisationsView,
129
143
  authToken: '',
130
144
  runtimeFilterParams: null,
145
+ hiddenHomeLeftNavItems: [],
146
+ hiddenHomepageModules: [],
147
+ hostConfig: undefined,
148
+ reorderedHomepageModules: [],
131
149
  },
132
150
  });
133
151
  expect(getIFrameSrc()).toContain(
@@ -135,7 +153,81 @@ describe('Unit test case for ts embed', () => {
135
153
  );
136
154
  });
137
155
 
138
- test('Runtime filters from view Config should be part of app_init payload', async () => {
156
+ test('hide home page modules from view Config should be part of app_init payload', async () => {
157
+ const mockEmbedEventPayload = {
158
+ type: EmbedEvent.APP_INIT,
159
+ data: {},
160
+ };
161
+ const mockedHiddenHomepageModules: HomepageModule[] = [
162
+ HomepageModule.MyLibrary,
163
+ HomepageModule.Learning,
164
+ ];
165
+
166
+ const searchEmbed = new SearchEmbed(getRootEl(), {
167
+ ...defaultViewConfig,
168
+ hiddenHomepageModules: mockedHiddenHomepageModules,
169
+ });
170
+ searchEmbed.render();
171
+ const mockPort: any = {
172
+ postMessage: jest.fn(),
173
+ };
174
+ await executeAfterWait(() => {
175
+ const iframe = getIFrameEl();
176
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
177
+ });
178
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
179
+ type: EmbedEvent.APP_INIT,
180
+ data: {
181
+ customisations,
182
+ authToken: '',
183
+ hostConfig: undefined,
184
+ runtimeFilterParams: null,
185
+ hiddenHomeLeftNavItems: [],
186
+ hiddenHomepageModules: [HomepageModule.MyLibrary,
187
+ HomepageModule.Learning],
188
+ reorderedHomepageModules: [],
189
+ },
190
+ });
191
+ });
192
+
193
+ test('Reordering the home page modules from view Config should be part of app_init payload', async () => {
194
+ const mockEmbedEventPayload = {
195
+ type: EmbedEvent.APP_INIT,
196
+ data: {},
197
+ };
198
+ const mockedReorderedHomepageModules: HomepageModule[] = [
199
+ HomepageModule.MyLibrary,
200
+ HomepageModule.Watchlist,
201
+ ];
202
+
203
+ const searchEmbed = new SearchEmbed(getRootEl(), {
204
+ ...defaultViewConfig,
205
+ reorderedHomepageModules: mockedReorderedHomepageModules,
206
+ });
207
+ searchEmbed.render();
208
+ const mockPort: any = {
209
+ postMessage: jest.fn(),
210
+ };
211
+ await executeAfterWait(() => {
212
+ const iframe = getIFrameEl();
213
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
214
+ });
215
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
216
+ type: EmbedEvent.APP_INIT,
217
+ data: {
218
+ customisations,
219
+ authToken: '',
220
+ hostConfig: undefined,
221
+ runtimeFilterParams: null,
222
+ hiddenHomeLeftNavItems: [],
223
+ hiddenHomepageModules: [],
224
+ reorderedHomepageModules: [HomepageModule.MyLibrary,
225
+ HomepageModule.Watchlist],
226
+ },
227
+ });
228
+ });
229
+
230
+ test('Runtime filters from view Config should be part of app_init payload when excludeRuntimeFiltersfromURL is true', async () => {
139
231
  const mockEmbedEventPayload = {
140
232
  type: EmbedEvent.APP_INIT,
141
233
  data: {},
@@ -150,6 +242,7 @@ describe('Unit test case for ts embed', () => {
150
242
 
151
243
  const searchEmbed = new SearchEmbed(getRootEl(), {
152
244
  ...defaultViewConfig,
245
+ excludeRuntimeFiltersfromURL: true,
153
246
  runtimeFilters: mockRuntimeFilters,
154
247
  });
155
248
  searchEmbed.render();
@@ -166,6 +259,87 @@ describe('Unit test case for ts embed', () => {
166
259
  customisations,
167
260
  authToken: '',
168
261
  runtimeFilterParams: 'col1=color&op1=EQ&val1=blue',
262
+ hiddenHomeLeftNavItems: [],
263
+ hiddenHomepageModules: [],
264
+ hostConfig: undefined,
265
+ reorderedHomepageModules: [],
266
+ },
267
+ });
268
+ });
269
+
270
+ test('Runtime filters from view Config should not be part of app_init payload when excludeRuntimeFiltersfromURL is false', async () => {
271
+ const mockEmbedEventPayload = {
272
+ type: EmbedEvent.APP_INIT,
273
+ data: {},
274
+ };
275
+ const mockRuntimeFilters: RuntimeFilter[] = [
276
+ {
277
+ columnName: 'color',
278
+ operator: RuntimeFilterOp.EQ,
279
+ values: ['blue'],
280
+ },
281
+ ];
282
+
283
+ const searchEmbed = new SearchEmbed(getRootEl(), {
284
+ ...defaultViewConfig,
285
+ excludeRuntimeFiltersfromURL: false,
286
+ runtimeFilters: mockRuntimeFilters,
287
+ });
288
+ searchEmbed.render();
289
+ const mockPort: any = {
290
+ postMessage: jest.fn(),
291
+ };
292
+ await executeAfterWait(() => {
293
+ const iframe = getIFrameEl();
294
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
295
+ });
296
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
297
+ type: EmbedEvent.APP_INIT,
298
+ data: {
299
+ customisations,
300
+ authToken: '',
301
+ runtimeFilterParams: null,
302
+ hiddenHomeLeftNavItems: [],
303
+ hiddenHomepageModules: [],
304
+ hostConfig: undefined,
305
+ reorderedHomepageModules: [],
306
+ },
307
+ });
308
+ });
309
+
310
+ test('homeLeftNav from view Config should be part of app_init payload', async () => {
311
+ const mockEmbedEventPayload = {
312
+ type: EmbedEvent.APP_INIT,
313
+ data: {},
314
+ };
315
+ const mockedHiddenHomeLeftNavItems: HomeLeftNavItem[] = [
316
+ HomeLeftNavItem.Home,
317
+ HomeLeftNavItem.Documentation,
318
+ ];
319
+
320
+ const searchEmbed = new SearchEmbed(getRootEl(), {
321
+ ...defaultViewConfig,
322
+ hiddenHomeLeftNavItems: mockedHiddenHomeLeftNavItems,
323
+ });
324
+ searchEmbed.render();
325
+ const mockPort: any = {
326
+ postMessage: jest.fn(),
327
+ };
328
+ await executeAfterWait(() => {
329
+ const iframe = getIFrameEl();
330
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
331
+ });
332
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
333
+ type: EmbedEvent.APP_INIT,
334
+ data: {
335
+ customisations,
336
+ authToken: '',
337
+ hostConfig: undefined,
338
+ runtimeFilterParams: null,
339
+ hiddenHomeLeftNavItems: [HomeLeftNavItem.Home,
340
+ HomeLeftNavItem.Documentation],
341
+ hiddenHomepageModules: [],
342
+ reorderedHomepageModules: [],
169
343
  },
170
344
  });
171
345
  });
@@ -319,6 +493,10 @@ describe('Unit test case for ts embed', () => {
319
493
  customisations,
320
494
  authToken: 'test_auth_token1',
321
495
  runtimeFilterParams: null,
496
+ hiddenHomeLeftNavItems: [],
497
+ hiddenHomepageModules: [],
498
+ hostConfig: undefined,
499
+ reorderedHomepageModules: [],
322
500
  },
323
501
  });
324
502
  });
@@ -463,7 +641,13 @@ describe('Unit test case for ts embed', () => {
463
641
  test('mixpanel should call with VISUAL_SDK_RENDER_COMPLETE', async () => {
464
642
  await setup(true);
465
643
  expect(mockMixPanelEvent).toBeCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
466
- expect(mockMixPanelEvent).toBeCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_COMPLETE);
644
+ expect(mockMixPanelEvent).toBeCalledWith(
645
+ MIXPANEL_EVENT.VISUAL_SDK_RENDER_COMPLETE,
646
+ expect.objectContaining({
647
+ elWidth: 0,
648
+ elHeight: 0,
649
+ }),
650
+ );
467
651
  });
468
652
 
469
653
  test('Should remove prefetch iframe', async () => {
@@ -840,7 +1024,7 @@ describe('Unit test case for ts embed', () => {
840
1024
  expectUrlMatchesWithParams(
841
1025
  getIFrameSrc(),
842
1026
  `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
843
- + `&foo=bar&baz=1&bool=true${defaultParamsPost}#/home`,
1027
+ + `&foo=bar&baz=1&bool=true${defaultParamsPost}#/home`,
844
1028
  );
845
1029
  });
846
1030
 
@@ -856,7 +1040,7 @@ describe('Unit test case for ts embed', () => {
856
1040
  expectUrlMatchesWithParams(
857
1041
  getIFrameSrc(),
858
1042
  `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
859
- + `&showAlerts=true${defaultParamsPost}#/home`,
1043
+ + `&showAlerts=true${defaultParamsPost}#/home`,
860
1044
  );
861
1045
  });
862
1046
  it('Sets the locale param', async () => {
@@ -871,7 +1055,7 @@ describe('Unit test case for ts embed', () => {
871
1055
  expectUrlMatchesWithParams(
872
1056
  getIFrameSrc(),
873
1057
  `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
874
- + `&locale=ja-JP${defaultParamsPost}#/home`,
1058
+ + `&locale=ja-JP${defaultParamsPost}#/home`,
875
1059
  );
876
1060
  });
877
1061
  it('Sets the iconSprite url', async () => {
@@ -888,7 +1072,7 @@ describe('Unit test case for ts embed', () => {
888
1072
  expectUrlMatchesWithParams(
889
1073
  getIFrameSrc(),
890
1074
  `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
891
- + `&iconSprite=iconSprite.com${defaultParamsPost}#/home`,
1075
+ + `&iconSprite=iconSprite.com${defaultParamsPost}#/home`,
892
1076
  );
893
1077
  });
894
1078
 
@@ -916,6 +1100,25 @@ describe('Unit test case for ts embed', () => {
916
1100
  await appEmbed.render();
917
1101
  expect(getRootEl().nextSibling.nextSibling).not.toBe(getIFrameEl());
918
1102
  });
1103
+ it('Should set the pendo tracking key when specified', async () => {
1104
+ jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValue(true);
1105
+ init({
1106
+ thoughtSpotHost: 'tshost',
1107
+ authType: AuthType.None,
1108
+ pendoTrackingKey: '1234',
1109
+ });
1110
+ const appEmbed = new AppEmbed(getRootEl(), {
1111
+ frameParams: {
1112
+ width: '100%',
1113
+ height: '100%',
1114
+ },
1115
+ });
1116
+ await appEmbed.render();
1117
+ expectUrlMatchesWithParams(
1118
+ getIFrameSrc(),
1119
+ `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&additionalPendoKey=1234${defaultParamsPost}#/home`,
1120
+ );
1121
+ });
919
1122
  xit('Sets the forceSAMLAutoRedirect param', async (done) => {
920
1123
  jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValue(true);
921
1124
  init({
@@ -18,6 +18,7 @@ import {
18
18
  getDOMNode,
19
19
  getFilterQuery,
20
20
  getQueryParamString,
21
+ getRuntimeParameters,
21
22
  } from '../utils';
22
23
  import {
23
24
  getThoughtSpotHost,
@@ -114,6 +115,8 @@ export class TsEmbed {
114
115
  */
115
116
  protected thoughtSpotV2Base: string;
116
117
 
118
+ protected embedComponentType = 'TsEmbed';
119
+
117
120
  /**
118
121
  * A map of event handlers for particular message types triggered
119
122
  * by the embedded app; multiple event handlers can be registered
@@ -156,6 +159,10 @@ export class TsEmbed {
156
159
  this.viewConfig = viewConfig;
157
160
  this.shouldEncodeUrlQueryParams = this.embedConfig.shouldEncodeUrlQueryParams;
158
161
  this.registerAppInit();
162
+ uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
163
+ ...viewConfig,
164
+ embedComponentType: this.embedComponentType,
165
+ });
159
166
  }
160
167
 
161
168
  /**
@@ -269,8 +276,15 @@ export class TsEmbed {
269
276
  data: {
270
277
  customisations: getCustomisations(this.embedConfig, this.viewConfig),
271
278
  authToken,
272
- runtimeFilterParams: getRuntimeFilters(this.viewConfig.runtimeFilters),
279
+ runtimeFilterParams: this.viewConfig.excludeRuntimeFiltersfromURL
280
+ ? getRuntimeFilters(this.viewConfig.runtimeFilters)
281
+ : null,
282
+ hiddenHomepageModules: this.viewConfig.hiddenHomepageModules || [],
283
+ reorderedHomepageModules: this.viewConfig.reorderedHomepageModules || [],
273
284
  hostConfig: this.embedConfig.hostConfig,
285
+ hiddenHomeLeftNavItems: this.viewConfig?.hiddenHomeLeftNavItems
286
+ ? this.viewConfig?.hiddenHomeLeftNavItems
287
+ : [],
274
288
  },
275
289
  });
276
290
  };
@@ -299,8 +313,8 @@ export class TsEmbed {
299
313
  * Register APP_INIT event and sendback init payload
300
314
  */
301
315
  private registerAppInit = () => {
302
- this.on(EmbedEvent.APP_INIT, this.appInitCb);
303
- this.on(EmbedEvent.AuthExpire, this.updateAuthToken);
316
+ this.on(EmbedEvent.APP_INIT, this.appInitCb, { start: false }, true);
317
+ this.on(EmbedEvent.AuthExpire, this.updateAuthToken, { start: false }, true);
304
318
  };
305
319
 
306
320
  /**
@@ -352,6 +366,9 @@ export class TsEmbed {
352
366
  if (this.embedConfig.authType === AuthType.TrustedAuthTokenCookieless) {
353
367
  queryParams[Param.cookieless] = true;
354
368
  }
369
+ if (this.embedConfig.pendoTrackingKey) {
370
+ queryParams[Param.PendoTrackingKey] = this.embedConfig.pendoTrackingKey;
371
+ }
355
372
 
356
373
  const {
357
374
  disabledActions,
@@ -497,8 +514,7 @@ export class TsEmbed {
497
514
  iFrame.allow = 'clipboard-read; clipboard-write';
498
515
 
499
516
  const {
500
- height: frameHeight,
501
- width: frameWidth, ...restParams
517
+ height: frameHeight, width: frameWidth, ...restParams
502
518
  } = this.viewConfig.frameParams || {};
503
519
  const width = getCssDimension(frameWidth || DEFAULT_EMBED_WIDTH);
504
520
  const height = getCssDimension(frameHeight || DEFAULT_EMBED_HEIGHT);
@@ -547,7 +563,6 @@ export class TsEmbed {
547
563
  return;
548
564
  }
549
565
 
550
- uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_RENDER_COMPLETE);
551
566
  this.iFrame = this.iFrame || this.createIframeEl(url);
552
567
  this.iFrame.addEventListener('load', () => {
553
568
  nextInQueue();
@@ -558,7 +573,9 @@ export class TsEmbed {
558
573
  },
559
574
  type: EmbedEvent.Load,
560
575
  });
561
- uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_IFRAME_LOAD_PERFORMANCE, {
576
+ uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_RENDER_COMPLETE, {
577
+ elWidth: this.iFrame.clientWidth,
578
+ elHeight: this.iFrame.clientHeight,
562
579
  timeTookToLoad: loadTimestamp - initTimestamp,
563
580
  });
564
581
  });
@@ -711,6 +728,8 @@ export class TsEmbed {
711
728
  * @param messageType The message type
712
729
  * @param callback A callback as a function
713
730
  * @param options The message options
731
+ * @param isSelf
732
+ * @param isRegisteredBySDK
714
733
  * @example
715
734
  * ```js
716
735
  * tsEmbed.on(EmbedEvent.Error, (data) => {
@@ -730,7 +749,11 @@ export class TsEmbed {
730
749
  messageType: EmbedEvent,
731
750
  callback: MessageCallback,
732
751
  options: MessageOptions = { start: false },
752
+ isRegisteredBySDK = false,
733
753
  ): typeof TsEmbed.prototype {
754
+ uploadMixpanelEvent(`${MIXPANEL_EVENT.VISUAL_SDK_ON}-${messageType}`, {
755
+ isRegisteredBySDK,
756
+ });
734
757
  if (this.isRendered) {
735
758
  this.handleError('Please register event handlers before calling render');
736
759
  }
@@ -900,8 +923,11 @@ export class V1Embed extends TsEmbed {
900
923
  let queryString = queryParams;
901
924
  if (!this.viewConfig.excludeRuntimeFiltersfromURL) {
902
925
  const runtimeFilters = this.viewConfig.runtimeFilters;
926
+ const runtimeParameters = this.viewConfig.runtimeParameters;
927
+
928
+ const parameterQuery = getRuntimeParameters(runtimeParameters || []);
903
929
  const filterQuery = getFilterQuery(runtimeFilters || []);
904
- queryString = [filterQuery, queryParams].filter(Boolean).join('&');
930
+ queryString = [parameterQuery, filterQuery, queryParams].filter(Boolean).join('&');
905
931
  }
906
932
  return this.getV1EmbedBasePath(queryString);
907
933
  }
@@ -929,7 +955,6 @@ export class V1Embed extends TsEmbed {
929
955
  options: MessageOptions = { start: false },
930
956
  ): typeof TsEmbed.prototype {
931
957
  const eventType = this.getCompatibleEventType(messageType);
932
- uploadMixpanelEvent(`${MIXPANEL_EVENT.VISUAL_SDK_ON}-${messageType}`);
933
958
  return super.on(eventType, callback, options);
934
959
  }
935
960
  }
package/src/index.ts CHANGED
@@ -10,6 +10,7 @@
10
10
  import { AppEmbed, Page, AppViewConfig } from './embed/app';
11
11
  import {
12
12
  init, prefetch, logout, getEmbedConfig, executeTML, exportTML,
13
+ executeTMLInput, exportTMLInput,
13
14
  } from './embed/base';
14
15
  import { PinboardEmbed, LiveboardViewConfig, LiveboardEmbed } from './embed/liveboard';
15
16
  import { SearchEmbed, SearchViewConfig } from './embed/search';
@@ -29,6 +30,8 @@ import {
29
30
  PrefetchFeatures,
30
31
  FrameParams,
31
32
  DOMSelector,
33
+ HomeLeftNavItem,
34
+ HomepageModule,
32
35
  MessageOptions,
33
36
  MessageCallback,
34
37
  MessagePayload,
@@ -39,6 +42,7 @@ import {
39
42
  } from './types';
40
43
  import { CustomCssVariables } from './css-variables';
41
44
  import { SageEmbed, SageViewConfig } from './embed/sage';
45
+ import { AnswerService } from './utils/graphql/answerService/answerService';
42
46
 
43
47
  export {
44
48
  init,
@@ -46,6 +50,8 @@ export {
46
50
  prefetch,
47
51
  executeTML,
48
52
  exportTML,
53
+ executeTMLInput,
54
+ exportTMLInput,
49
55
  getEmbedConfig as getInitConfig,
50
56
  getSessionInfo,
51
57
  SearchEmbed,
@@ -58,6 +64,7 @@ export {
58
64
  AuthStatus,
59
65
  AuthEvent,
60
66
  AuthEventEmitter,
67
+ AnswerService,
61
68
  // types
62
69
  Page,
63
70
  AuthType,
@@ -76,6 +83,8 @@ export {
76
83
  AppViewConfig,
77
84
  PrefetchFeatures,
78
85
  FrameParams,
86
+ HomeLeftNavItem,
87
+ HomepageModule,
79
88
  DOMSelector,
80
89
  MessageOptions,
81
90
  MessageCallback,
@@ -14,9 +14,10 @@ const config = {
14
14
 
15
15
  jest.mock('mixpanel-browser', () => ({
16
16
  __esModule: true,
17
- init: jest.fn(),
17
+ init: jest.fn().mockReturnThis(),
18
18
  identify: jest.fn(),
19
19
  track: jest.fn(),
20
+ register_once: jest.fn(),
20
21
  }));
21
22
 
22
23
  describe('Unit test for mixpanel', () => {
@@ -30,7 +31,7 @@ describe('Unit test for mixpanel', () => {
30
31
  isPublicUser: false,
31
32
  };
32
33
  initMixpanel(sessionInfo);
33
- expect(mixpanel.init).toHaveBeenCalledWith(sessionInfo.mixpanelToken);
34
+ expect(mixpanel.init).toHaveBeenCalledWith(sessionInfo.mixpanelToken, undefined, 'tsEmbed');
34
35
  expect(mixpanel.identify).toHaveBeenCalledWith(sessionInfo.userGUID);
35
36
 
36
37
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_CALLED_INIT, {
@@ -45,10 +46,19 @@ describe('Unit test for mixpanel', () => {
45
46
  mixpanelToken: 'newToken',
46
47
  isPublicUser: true,
47
48
  userGUID: 'newUser',
49
+ clusterId: 'newClusterId',
50
+ clusterName: 'newClusterName',
51
+ releaseVersion: 'newReleaseVersion',
48
52
  };
49
53
  initMixpanel(sessionInfo);
50
54
 
51
- expect(mixpanel.init).toHaveBeenCalledWith(sessionInfo.mixpanelToken);
55
+ expect(mixpanel.init).toHaveBeenCalledWith(sessionInfo.mixpanelToken, undefined, 'tsEmbed');
56
+ expect(mixpanel.register_once).toHaveBeenCalledWith({
57
+ clusterId: sessionInfo.clusterId,
58
+ clusterName: sessionInfo.clusterName,
59
+ releaseVersion: sessionInfo.releaseVersion,
60
+ hostAppUrl: 'localhost',
61
+ });
52
62
  expect(mixpanel.identify).not.toHaveBeenCalledWith(sessionInfo.userGUID);
53
63
  });
54
64
 
@@ -6,6 +6,7 @@ export const EndPoints = {
6
6
 
7
7
  // Needed to avoid error in CJS builds on some bundlers.
8
8
  const mixpanelLib = mixpanel.default || mixpanel;
9
+ let mixpanelInstance: mixpanel.Mixpanel;
9
10
 
10
11
  export const MIXPANEL_EVENT = {
11
12
  VISUAL_SDK_RENDER_START: 'visual-sdk-render-start',
@@ -15,6 +16,7 @@ export const MIXPANEL_EVENT = {
15
16
  VISUAL_SDK_TRIGGER: 'visual-sdk-trigger',
16
17
  VISUAL_SDK_ON: 'visual-sdk-on',
17
18
  VISUAL_SDK_IFRAME_LOAD_PERFORMANCE: 'visual-sdk-iframe-load-performance',
19
+ VISUAL_SDK_EMBED_CREATE: 'visual-sdk-embed-create',
18
20
  };
19
21
 
20
22
  let isMixpanelInitialized = false;
@@ -31,7 +33,7 @@ export function uploadMixpanelEvent(eventId: string, eventProps = {}): void {
31
33
  eventQueue.push({ eventId, eventProps });
32
34
  return;
33
35
  }
34
- mixpanelLib.track(eventId, eventProps);
36
+ mixpanelInstance.track(eventId, eventProps);
35
37
  }
36
38
 
37
39
  /**
@@ -61,10 +63,16 @@ export function initMixpanel(sessionInfo: any): void {
61
63
  const token = sessionInfo.mixpanelToken;
62
64
  try {
63
65
  if (token) {
64
- mixpanelLib.init(token);
66
+ mixpanelInstance = mixpanelLib.init(token, undefined, 'tsEmbed');
65
67
  if (!isPublicCluster) {
66
- mixpanelLib.identify(sessionInfo.userGUID);
68
+ mixpanelInstance.identify(sessionInfo.userGUID);
67
69
  }
70
+ mixpanelInstance.register_once({
71
+ clusterId: sessionInfo.clusterId,
72
+ clusterName: sessionInfo.clusterName,
73
+ releaseVersion: sessionInfo.releaseVersion,
74
+ hostAppUrl: window?.location?.host || '',
75
+ });
68
76
  isMixpanelInitialized = true;
69
77
  emptyQueue();
70
78
  }