@thoughtspot/visual-embed-sdk 1.45.1 → 1.45.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/authToken.d.ts +1 -1
  3. package/cjs/src/authToken.d.ts.map +1 -1
  4. package/cjs/src/authToken.js +2 -2
  5. package/cjs/src/authToken.js.map +1 -1
  6. package/cjs/src/authToken.spec.js +71 -0
  7. package/cjs/src/authToken.spec.js.map +1 -1
  8. package/cjs/src/css-variables.d.ts +48 -0
  9. package/cjs/src/css-variables.d.ts.map +1 -1
  10. package/cjs/src/embed/app.d.ts +37 -0
  11. package/cjs/src/embed/app.d.ts.map +1 -1
  12. package/cjs/src/embed/app.js +37 -1
  13. package/cjs/src/embed/app.js.map +1 -1
  14. package/cjs/src/embed/app.spec.js +24 -0
  15. package/cjs/src/embed/app.spec.js.map +1 -1
  16. package/cjs/src/embed/conversation.d.ts +127 -9
  17. package/cjs/src/embed/conversation.d.ts.map +1 -1
  18. package/cjs/src/embed/conversation.js +41 -18
  19. package/cjs/src/embed/conversation.js.map +1 -1
  20. package/cjs/src/embed/conversation.spec.js +96 -3
  21. package/cjs/src/embed/conversation.spec.js.map +1 -1
  22. package/cjs/src/embed/hostEventClient/contracts.d.ts +3 -3
  23. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  24. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  25. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +8 -8
  26. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  27. package/cjs/src/embed/hostEventClient/host-event-client.js +18 -18
  28. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  29. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +7 -7
  30. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  31. package/cjs/src/embed/liveboard.d.ts +40 -3
  32. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  33. package/cjs/src/embed/liveboard.js +40 -12
  34. package/cjs/src/embed/liveboard.js.map +1 -1
  35. package/cjs/src/embed/liveboard.spec.js +180 -8
  36. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  37. package/cjs/src/embed/ts-embed.d.ts +23 -2
  38. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  39. package/cjs/src/embed/ts-embed.js +64 -22
  40. package/cjs/src/embed/ts-embed.js.map +1 -1
  41. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  42. package/cjs/src/embed/ts-embed.spec.js +138 -19
  43. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  44. package/cjs/src/errors.d.ts +1 -0
  45. package/cjs/src/errors.d.ts.map +1 -1
  46. package/cjs/src/errors.js +1 -0
  47. package/cjs/src/errors.js.map +1 -1
  48. package/cjs/src/index.d.ts +3 -3
  49. package/cjs/src/index.d.ts.map +1 -1
  50. package/cjs/src/index.js +3 -2
  51. package/cjs/src/index.js.map +1 -1
  52. package/cjs/src/types.d.ts +356 -42
  53. package/cjs/src/types.d.ts.map +1 -1
  54. package/cjs/src/types.js +227 -20
  55. package/cjs/src/types.js.map +1 -1
  56. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  57. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  58. package/cjs/src/utils/graphql/answerService/answer-queries.js +23 -1
  59. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  60. package/cjs/src/utils/graphql/answerService/answerService.d.ts +2 -1
  61. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  62. package/cjs/src/utils/graphql/answerService/answerService.js +9 -1
  63. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  64. package/cjs/src/utils/graphql/answerService/answerService.spec.js +73 -0
  65. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  66. package/cjs/src/utils/processTrigger.d.ts +3 -2
  67. package/cjs/src/utils/processTrigger.d.ts.map +1 -1
  68. package/cjs/src/utils/processTrigger.js +4 -2
  69. package/cjs/src/utils/processTrigger.js.map +1 -1
  70. package/cjs/src/utils.d.ts +20 -1
  71. package/cjs/src/utils.d.ts.map +1 -1
  72. package/cjs/src/utils.js +40 -1
  73. package/cjs/src/utils.js.map +1 -1
  74. package/cjs/src/utils.spec.js +49 -0
  75. package/cjs/src/utils.spec.js.map +1 -1
  76. package/dist/{index-Dgzjq7qH.js → index-BuwECGdm.js} +1 -1
  77. package/dist/src/authToken.d.ts +1 -1
  78. package/dist/src/authToken.d.ts.map +1 -1
  79. package/dist/src/css-variables.d.ts +48 -0
  80. package/dist/src/css-variables.d.ts.map +1 -1
  81. package/dist/src/embed/app.d.ts +37 -0
  82. package/dist/src/embed/app.d.ts.map +1 -1
  83. package/dist/src/embed/conversation.d.ts +127 -9
  84. package/dist/src/embed/conversation.d.ts.map +1 -1
  85. package/dist/src/embed/hostEventClient/contracts.d.ts +3 -3
  86. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  87. package/dist/src/embed/hostEventClient/host-event-client.d.ts +8 -8
  88. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  89. package/dist/src/embed/liveboard.d.ts +40 -3
  90. package/dist/src/embed/liveboard.d.ts.map +1 -1
  91. package/dist/src/embed/ts-embed.d.ts +23 -2
  92. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  93. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  94. package/dist/src/errors.d.ts +1 -0
  95. package/dist/src/errors.d.ts.map +1 -1
  96. package/dist/src/index.d.ts +3 -3
  97. package/dist/src/index.d.ts.map +1 -1
  98. package/dist/src/types.d.ts +356 -42
  99. package/dist/src/types.d.ts.map +1 -1
  100. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  101. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  102. package/dist/src/utils/graphql/answerService/answerService.d.ts +2 -1
  103. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  104. package/dist/src/utils/processTrigger.d.ts +3 -2
  105. package/dist/src/utils/processTrigger.d.ts.map +1 -1
  106. package/dist/src/utils.d.ts +20 -1
  107. package/dist/src/utils.d.ts.map +1 -1
  108. package/dist/tsembed-react.es.js +501 -98
  109. package/dist/tsembed-react.js +500 -97
  110. package/dist/tsembed.es.js +516 -113
  111. package/dist/tsembed.js +29956 -29553
  112. package/dist/visual-embed-sdk-react-full.d.ts +819 -282
  113. package/dist/visual-embed-sdk-react.d.ts +818 -281
  114. package/dist/visual-embed-sdk.d.ts +882 -321
  115. package/lib/package.json +1 -1
  116. package/lib/src/authToken.d.ts +1 -1
  117. package/lib/src/authToken.d.ts.map +1 -1
  118. package/lib/src/authToken.js +2 -2
  119. package/lib/src/authToken.js.map +1 -1
  120. package/lib/src/authToken.spec.js +72 -1
  121. package/lib/src/authToken.spec.js.map +1 -1
  122. package/lib/src/css-variables.d.ts +48 -0
  123. package/lib/src/css-variables.d.ts.map +1 -1
  124. package/lib/src/embed/app.d.ts +37 -0
  125. package/lib/src/embed/app.d.ts.map +1 -1
  126. package/lib/src/embed/app.js +39 -3
  127. package/lib/src/embed/app.js.map +1 -1
  128. package/lib/src/embed/app.spec.js +24 -0
  129. package/lib/src/embed/app.spec.js.map +1 -1
  130. package/lib/src/embed/conversation.d.ts +127 -9
  131. package/lib/src/embed/conversation.d.ts.map +1 -1
  132. package/lib/src/embed/conversation.js +42 -19
  133. package/lib/src/embed/conversation.js.map +1 -1
  134. package/lib/src/embed/conversation.spec.js +96 -3
  135. package/lib/src/embed/conversation.spec.js.map +1 -1
  136. package/lib/src/embed/hostEventClient/contracts.d.ts +3 -3
  137. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  138. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  139. package/lib/src/embed/hostEventClient/host-event-client.d.ts +8 -8
  140. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  141. package/lib/src/embed/hostEventClient/host-event-client.js +18 -18
  142. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  143. package/lib/src/embed/hostEventClient/host-event-client.spec.js +7 -7
  144. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  145. package/lib/src/embed/liveboard.d.ts +40 -3
  146. package/lib/src/embed/liveboard.d.ts.map +1 -1
  147. package/lib/src/embed/liveboard.js +41 -13
  148. package/lib/src/embed/liveboard.js.map +1 -1
  149. package/lib/src/embed/liveboard.spec.js +180 -8
  150. package/lib/src/embed/liveboard.spec.js.map +1 -1
  151. package/lib/src/embed/ts-embed.d.ts +23 -2
  152. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  153. package/lib/src/embed/ts-embed.js +64 -22
  154. package/lib/src/embed/ts-embed.js.map +1 -1
  155. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  156. package/lib/src/embed/ts-embed.spec.js +139 -20
  157. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  158. package/lib/src/errors.d.ts +1 -0
  159. package/lib/src/errors.d.ts.map +1 -1
  160. package/lib/src/errors.js +1 -0
  161. package/lib/src/errors.js.map +1 -1
  162. package/lib/src/index.d.ts +3 -3
  163. package/lib/src/index.d.ts.map +1 -1
  164. package/lib/src/index.js +2 -2
  165. package/lib/src/index.js.map +1 -1
  166. package/lib/src/types.d.ts +356 -42
  167. package/lib/src/types.d.ts.map +1 -1
  168. package/lib/src/types.js +226 -19
  169. package/lib/src/types.js.map +1 -1
  170. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  171. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  172. package/lib/src/utils/graphql/answerService/answer-queries.js +22 -0
  173. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  174. package/lib/src/utils/graphql/answerService/answerService.d.ts +2 -1
  175. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  176. package/lib/src/utils/graphql/answerService/answerService.js +9 -1
  177. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  178. package/lib/src/utils/graphql/answerService/answerService.spec.js +73 -0
  179. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  180. package/lib/src/utils/processTrigger.d.ts +3 -2
  181. package/lib/src/utils/processTrigger.d.ts.map +1 -1
  182. package/lib/src/utils/processTrigger.js +4 -2
  183. package/lib/src/utils/processTrigger.js.map +1 -1
  184. package/lib/src/utils.d.ts +20 -1
  185. package/lib/src/utils.d.ts.map +1 -1
  186. package/lib/src/utils.js +36 -0
  187. package/lib/src/utils.js.map +1 -1
  188. package/lib/src/utils.spec.js +50 -1
  189. package/lib/src/utils.spec.js.map +1 -1
  190. package/package.json +1 -1
  191. package/src/authToken.spec.ts +91 -2
  192. package/src/authToken.ts +2 -2
  193. package/src/css-variables.ts +60 -0
  194. package/src/embed/app.spec.ts +32 -0
  195. package/src/embed/app.ts +97 -1
  196. package/src/embed/conversation.spec.ts +117 -3
  197. package/src/embed/conversation.ts +188 -29
  198. package/src/embed/hostEventClient/contracts.ts +4 -4
  199. package/src/embed/hostEventClient/host-event-client.spec.ts +7 -1
  200. package/src/embed/hostEventClient/host-event-client.ts +22 -11
  201. package/src/embed/liveboard.spec.ts +264 -10
  202. package/src/embed/liveboard.ts +105 -14
  203. package/src/embed/ts-embed.spec.ts +184 -8
  204. package/src/embed/ts-embed.ts +81 -24
  205. package/src/errors.ts +1 -0
  206. package/src/index.ts +7 -1
  207. package/src/types.ts +364 -40
  208. package/src/utils/graphql/answerService/answer-queries.ts +23 -0
  209. package/src/utils/graphql/answerService/answerService.spec.ts +87 -0
  210. package/src/utils/graphql/answerService/answerService.ts +13 -1
  211. package/src/utils/processTrigger.ts +6 -3
  212. package/src/utils.spec.ts +56 -0
  213. package/src/utils.ts +44 -0
@@ -2,7 +2,7 @@ import isUndefined from 'lodash/isUndefined';
2
2
  import { ERROR_MESSAGE } from '../errors';
3
3
  import { Param, BaseViewConfig, RuntimeFilter, RuntimeParameter, ErrorDetailsTypes, EmbedErrorCodes } from '../types';
4
4
  import { TsEmbed } from './ts-embed';
5
- import { getQueryParamString, getFilterQuery, getRuntimeParameters } from '../utils';
5
+ import { getQueryParamString, getFilterQuery, getRuntimeParameters, validateHttpUrl, setParamIfDefined } from '../utils';
6
6
 
7
7
  /**
8
8
  * Configuration for search options
@@ -14,6 +14,106 @@ export interface SearchOptions {
14
14
  searchQuery: string;
15
15
  }
16
16
 
17
+ /**
18
+ * Configuration for the Spotter sidebar.
19
+ * Can be used in SpotterEmbed and AppEmbed.
20
+ * @group Embed components
21
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
22
+ */
23
+ export interface SpotterSidebarViewConfig {
24
+ /**
25
+ * Controls the visibility of the past conversations sidebar.
26
+ * @default false
27
+ * @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
28
+ */
29
+ enablePastConversationsSidebar?: boolean;
30
+ /**
31
+ * Custom title text for the sidebar header.
32
+ * Defaults to translated "Spotter" text.
33
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
34
+ */
35
+ spotterSidebarTitle?: string;
36
+ /**
37
+ * Boolean to set the default expanded state of the sidebar.
38
+ * @default false
39
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
40
+ */
41
+ spotterSidebarDefaultExpanded?: boolean;
42
+ /**
43
+ * Custom label text for the rename action in the conversation edit menu.
44
+ * Defaults to translated "Rename" text.
45
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
46
+ */
47
+ spotterChatRenameLabel?: string;
48
+ /**
49
+ * Custom label text for the delete action in the conversation edit menu.
50
+ * Defaults to translated "DELETE" text.
51
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
52
+ */
53
+ spotterChatDeleteLabel?: string;
54
+ /**
55
+ * Custom title text for the delete conversation confirmation modal.
56
+ * Defaults to translated "Delete chat" text.
57
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
58
+ */
59
+ spotterDeleteConversationModalTitle?: string;
60
+ /**
61
+ * Custom message text for the past conversation banner alert.
62
+ * Defaults to translated alert message.
63
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
64
+ */
65
+ spotterPastConversationAlertMessage?: string;
66
+ /**
67
+ * Custom URL for the documentation/best practices link.
68
+ * Defaults to ThoughtSpot docs URL based on release version.
69
+ * Note: URL must include the protocol (e.g., `https://www.example.com`).
70
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
71
+ */
72
+ spotterDocumentationUrl?: string;
73
+ /**
74
+ * Custom label text for the best practices button in the footer.
75
+ * Defaults to translated "Best Practices" text.
76
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
77
+ */
78
+ spotterBestPracticesLabel?: string;
79
+ /**
80
+ * Number of conversations to fetch per batch when loading conversation history.
81
+ * @default 30
82
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
83
+ */
84
+ spotterConversationsBatchSize?: number;
85
+ /**
86
+ * Custom title text for the "New Chat" button in the sidebar.
87
+ * Defaults to translated "New Chat" text.
88
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
89
+ */
90
+ spotterNewChatButtonTitle?: string;
91
+ }
92
+
93
+ /**
94
+ * Configuration for customizing Spotter chat UI branding.
95
+ * @group Embed components
96
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.4.0.cl
97
+ */
98
+ export interface SpotterChatViewConfig {
99
+ /**
100
+ * Hides the ThoughtSpot logo/icon in tool response
101
+ * cards. The branding label prefix is controlled
102
+ * separately via `toolResponseCardBrandingLabel`.
103
+ * External MCP tool branding is not affected.
104
+ * @default false
105
+ */
106
+ hideToolResponseCardBranding?: boolean;
107
+ /**
108
+ * Custom label to replace the "ThoughtSpot" prefix
109
+ * in tool response cards. Set to an empty string
110
+ * `''` to hide the prefix entirely. Works
111
+ * independently of `hideToolResponseCardBranding`.
112
+ * External MCP tool branding is not affected.
113
+ */
114
+ toolResponseCardBrandingLabel?: string;
115
+ }
116
+
17
117
  /**
18
118
  * The configuration for the embedded spotterEmbed options.
19
119
  * @group Embed components
@@ -169,8 +269,7 @@ export interface SpotterEmbedViewConfig extends Omit<BaseViewConfig, 'primaryAct
169
269
  */
170
270
  excludeRuntimeParametersfromURL?: boolean;
171
271
  /**
172
- * enablePastConversationsSidebar : Controls the visibility of the past conversations
173
- * sidebar.
272
+ * updatedSpotterChatPrompt : Controls the updated spotter chat prompt.
174
273
  *
175
274
  * Supported embed types: `SpotterEmbed`
176
275
  * @default false
@@ -178,28 +277,48 @@ export interface SpotterEmbedViewConfig extends Omit<BaseViewConfig, 'primaryAct
178
277
  * ```js
179
278
  * const embed = new SpotterEmbed('#tsEmbed', {
180
279
  * ... //other embed view config
181
- * enablePastConversationsSidebar : true,
280
+ * updatedSpotterChatPrompt : true,
182
281
  * })
183
282
  * ```
184
283
  * @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
185
284
  */
186
- enablePastConversationsSidebar?: boolean;
187
-
285
+ updatedSpotterChatPrompt?: boolean;
188
286
  /**
189
- * updatedSpotterChatPrompt : Controls the updated spotter chat prompt.
287
+ * Configuration for the Spotter sidebar UI customization.
288
+ *
289
+ * Supported embed types: `SpotterEmbed`, `AppEmbed`
290
+ * @example
291
+ * ```js
292
+ * const embed = new SpotterEmbed('#tsEmbed', {
293
+ * ... //other embed view config
294
+ * spotterSidebarConfig: {
295
+ * enablePastConversationsSidebar: true,
296
+ * spotterSidebarTitle: 'My Conversations',
297
+ * spotterSidebarDefaultExpanded: true,
298
+ * },
299
+ * })
300
+ * ```
301
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
302
+ */
303
+ spotterSidebarConfig?: SpotterSidebarViewConfig;
304
+ /**
305
+ * Configuration for customizing Spotter chat UI
306
+ * branding in tool response cards.
190
307
  *
191
308
  * Supported embed types: `SpotterEmbed`
192
- * @default false
193
309
  * @example
194
310
  * ```js
195
311
  * const embed = new SpotterEmbed('#tsEmbed', {
196
312
  * ... //other embed view config
197
- * updatedSpotterChatPrompt : true,
313
+ * spotterChatConfig: {
314
+ * hideToolResponseCardBranding: true,
315
+ * toolResponseCardBrandingLabel: 'MyBrand',
316
+ * },
198
317
  * })
199
318
  * ```
200
- * @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
319
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.4.0.cl
201
320
  */
202
- updatedSpotterChatPrompt?: boolean;
321
+ spotterChatConfig?: SpotterChatViewConfig;
203
322
  }
204
323
 
205
324
  /**
@@ -246,14 +365,30 @@ export class SpotterEmbed extends TsEmbed {
246
365
  dataPanelV2,
247
366
  showSpotterLimitations,
248
367
  hideSampleQuestions,
249
- enablePastConversationsSidebar,
250
368
  runtimeFilters,
251
369
  excludeRuntimeFiltersfromURL,
252
370
  runtimeParameters,
253
371
  excludeRuntimeParametersfromURL,
254
372
  updatedSpotterChatPrompt,
373
+ spotterSidebarConfig,
374
+ spotterChatConfig,
255
375
  } = this.viewConfig;
256
376
 
377
+ // Extract sidebar config properties
378
+ const {
379
+ enablePastConversationsSidebar,
380
+ spotterSidebarTitle,
381
+ spotterSidebarDefaultExpanded,
382
+ spotterChatRenameLabel,
383
+ spotterChatDeleteLabel,
384
+ spotterDeleteConversationModalTitle,
385
+ spotterPastConversationAlertMessage,
386
+ spotterDocumentationUrl,
387
+ spotterBestPracticesLabel,
388
+ spotterConversationsBatchSize,
389
+ spotterNewChatButtonTitle,
390
+ } = spotterSidebarConfig || {};
391
+
257
392
  if (!worksheetId) {
258
393
  this.handleError({
259
394
  errorType: ErrorDetailsTypes.VALIDATION_ERROR,
@@ -264,27 +399,50 @@ export class SpotterEmbed extends TsEmbed {
264
399
  }
265
400
  const queryParams = this.getBaseQueryParams();
266
401
  queryParams[Param.SpotterEnabled] = true;
267
- if (!isUndefined(disableSourceSelection)) {
268
- queryParams[Param.DisableSourceSelection] = !!disableSourceSelection;
269
- }
270
- if (!isUndefined(hideSourceSelection)) {
271
- queryParams[Param.HideSourceSelection] = !!hideSourceSelection;
272
- }
273
402
 
274
- if (!isUndefined(dataPanelV2)) {
275
- queryParams[Param.DataPanelV2Enabled] = !!dataPanelV2;
276
- }
403
+ // Boolean params
404
+ setParamIfDefined(queryParams, Param.DisableSourceSelection, disableSourceSelection, true);
405
+ setParamIfDefined(queryParams, Param.HideSourceSelection, hideSourceSelection, true);
406
+ setParamIfDefined(queryParams, Param.DataPanelV2Enabled, dataPanelV2, true);
407
+ setParamIfDefined(queryParams, Param.ShowSpotterLimitations, showSpotterLimitations, true);
408
+ setParamIfDefined(queryParams, Param.HideSampleQuestions, hideSampleQuestions, true);
409
+ setParamIfDefined(queryParams, Param.UpdatedSpotterChatPrompt, updatedSpotterChatPrompt, true);
410
+ setParamIfDefined(queryParams, Param.SpotterSidebarDefaultExpanded, spotterSidebarDefaultExpanded, true);
277
411
 
278
- if (!isUndefined(showSpotterLimitations)) {
279
- queryParams[Param.ShowSpotterLimitations] = !!showSpotterLimitations;
280
- }
412
+ // String params
413
+ setParamIfDefined(queryParams, Param.SpotterSidebarTitle, spotterSidebarTitle);
414
+ setParamIfDefined(queryParams, Param.SpotterChatRenameLabel, spotterChatRenameLabel);
415
+ setParamIfDefined(queryParams, Param.SpotterChatDeleteLabel, spotterChatDeleteLabel);
416
+ setParamIfDefined(queryParams, Param.SpotterDeleteConversationModalTitle, spotterDeleteConversationModalTitle);
417
+ setParamIfDefined(queryParams, Param.SpotterPastConversationAlertMessage, spotterPastConversationAlertMessage);
418
+ setParamIfDefined(queryParams, Param.SpotterBestPracticesLabel, spotterBestPracticesLabel);
419
+ setParamIfDefined(queryParams, Param.SpotterConversationsBatchSize, spotterConversationsBatchSize);
420
+ setParamIfDefined(queryParams, Param.SpotterNewChatButtonTitle, spotterNewChatButtonTitle);
281
421
 
282
- if (!isUndefined(hideSampleQuestions)) {
283
- queryParams[Param.HideSampleQuestions] = !!hideSampleQuestions;
422
+ // URL param with validation
423
+ if (spotterDocumentationUrl !== undefined) {
424
+ const [isValid, validationError] = validateHttpUrl(spotterDocumentationUrl);
425
+ if (isValid) {
426
+ queryParams[Param.SpotterDocumentationUrl] = spotterDocumentationUrl;
427
+ } else {
428
+ this.handleError({
429
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
430
+ message: ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
431
+ code: EmbedErrorCodes.INVALID_URL,
432
+ error: validationError?.message || ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
433
+ });
434
+ }
284
435
  }
285
436
 
286
- if (!isUndefined(updatedSpotterChatPrompt)) {
287
- queryParams[Param.UpdatedSpotterChatPrompt] = !!updatedSpotterChatPrompt;
437
+ // Handle spotterChatConfig params
438
+ if (spotterChatConfig) {
439
+ const {
440
+ hideToolResponseCardBranding,
441
+ toolResponseCardBrandingLabel,
442
+ } = spotterChatConfig;
443
+
444
+ setParamIfDefined(queryParams, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
445
+ setParamIfDefined(queryParams, Param.ToolResponseCardBrandingLabel, toolResponseCardBrandingLabel);
288
446
  }
289
447
 
290
448
  return queryParams;
@@ -298,11 +456,12 @@ export class SpotterEmbed extends TsEmbed {
298
456
  excludeRuntimeFiltersfromURL,
299
457
  runtimeParameters,
300
458
  excludeRuntimeParametersfromURL,
301
- enablePastConversationsSidebar,
459
+ spotterSidebarConfig,
302
460
  } = this.viewConfig;
303
461
  const path = 'insights/conv-assist';
304
462
  const queryParams = this.getEmbedParamsObject();
305
463
 
464
+ const enablePastConversationsSidebar = spotterSidebarConfig?.enablePastConversationsSidebar;
306
465
  if (!isUndefined(enablePastConversationsSidebar)) {
307
466
  queryParams[Param.EnablePastConversationsSidebar] = !!enablePastConversationsSidebar;
308
467
  }
@@ -1,4 +1,4 @@
1
- import { HostEvent } from '../../types';
1
+ import { ContextType, HostEvent } from '../../types';
2
2
 
3
3
  export enum UIPassthroughEvent {
4
4
  PinAnswerToLiveboard = 'addVizToPinboard',
@@ -103,7 +103,7 @@ export type HostEventRequest<HostEventT extends HostEvent> =
103
103
  ? UIPassthroughRequest<EmbedApiHostEventMapping[HostEventT]>
104
104
  : any;
105
105
 
106
- export type HostEventResponse<HostEventT extends HostEvent> =
106
+ export type HostEventResponse<HostEventT extends HostEvent, ContextT extends ContextType> =
107
107
  HostEventT extends keyof EmbedApiHostEventMapping
108
108
  ? UIPassthroughResponse<EmbedApiHostEventMapping[HostEventT]>
109
109
  : any;
@@ -111,5 +111,5 @@ export type HostEventResponse<HostEventT extends HostEvent> =
111
111
  // trigger response and request
112
112
  export type TriggerPayload<PayloadT, HostEventT extends HostEvent> =
113
113
  PayloadT | HostEventRequest<HostEventT>;
114
- export type TriggerResponse<PayloadT, HostEventT extends HostEvent> =
115
- PayloadT extends HostEventRequest<HostEventT> ? HostEventResponse<HostEventT> : any;
114
+ export type TriggerResponse<PayloadT, HostEventT extends HostEvent, ContextT extends ContextType> =
115
+ PayloadT extends HostEventRequest<HostEventT> ? HostEventResponse<HostEventT, ContextT> : any;
@@ -54,6 +54,7 @@ describe('HostEventClient', () => {
54
54
  type: apiName,
55
55
  parameters,
56
56
  },
57
+ undefined,
57
58
  );
58
59
  expect(result).toEqual(await triggerResponse);
59
60
  });
@@ -148,6 +149,7 @@ describe('HostEventClient', () => {
148
149
  HostEvent.UIPassthrough,
149
150
  'http://localhost',
150
151
  { parameters: payload, type: UIPassthroughEvent.PinAnswerToLiveboard },
152
+ undefined,
151
153
  );
152
154
  expect(result).toEqual(mockResponse.value);
153
155
  });
@@ -185,6 +187,7 @@ describe('HostEventClient', () => {
185
187
  parameters: payload,
186
188
  type: 'saveAnswer',
187
189
  },
190
+ undefined,
188
191
  );
189
192
  expect(result).toEqual({ answerId: 'newAnswer', ...mockResponse[0].value });
190
193
  });
@@ -198,7 +201,7 @@ describe('HostEventClient', () => {
198
201
 
199
202
  const result = await client.triggerHostEvent(hostEvent, payload);
200
203
 
201
- expect(client.hostEventFallback).toHaveBeenCalledWith(hostEvent, payload);
204
+ expect(client.hostEventFallback).toHaveBeenCalledWith(hostEvent, payload, undefined);
202
205
  expect(result).toEqual(mockResponse);
203
206
  });
204
207
 
@@ -223,6 +226,7 @@ describe('HostEventClient', () => {
223
226
  HostEvent.Pin,
224
227
  mockThoughtSpotHost,
225
228
  {},
229
+ undefined,
226
230
  );
227
231
  expect(result).toEqual([mockResponse]);
228
232
  });
@@ -248,6 +252,7 @@ describe('HostEventClient', () => {
248
252
  HostEvent.Save,
249
253
  mockThoughtSpotHost,
250
254
  {},
255
+ undefined,
251
256
  );
252
257
  expect(result).toEqual([mockResponse]);
253
258
  });
@@ -303,6 +308,7 @@ describe('HostEventClient', () => {
303
308
  parameters: { ...payload, pinboardId: 'test', newPinboardName: 'testLiveboard' },
304
309
  type: 'addVizToPinboard',
305
310
  },
311
+ undefined,
306
312
  );
307
313
  expect(result).toEqual({
308
314
  pinboardId: 'testLiveboard',
@@ -1,4 +1,4 @@
1
- import { HostEvent } from '../../types';
1
+ import { ContextType, HostEvent } from '../../types';
2
2
  import { processTrigger as processTriggerService } from '../../utils/processTrigger';
3
3
  import { getEmbedConfig } from '../embedConfig';
4
4
  import {
@@ -23,7 +23,7 @@ export class HostEventClient {
23
23
  * @param {any} data Data to send with the host event
24
24
  * @returns {Promise<any>} - the response from the process trigger
25
25
  */
26
- protected async processTrigger(message: HostEvent, data: any): Promise<any> {
26
+ protected async processTrigger(message: HostEvent, data: any, context?: ContextType): Promise<any> {
27
27
  if (!this.iFrame) {
28
28
  throw new Error('Iframe element is not set');
29
29
  }
@@ -34,14 +34,16 @@ export class HostEventClient {
34
34
  message,
35
35
  thoughtspotHost,
36
36
  data,
37
+ context,
37
38
  );
38
39
  }
39
40
 
40
41
  public async handleHostEventWithParam<UIPassthroughEventT extends UIPassthroughEvent>(
41
42
  apiName: UIPassthroughEventT,
42
43
  parameters: UIPassthroughRequest<UIPassthroughEventT>,
44
+ context?: ContextType,
43
45
  ): Promise<UIPassthroughResponse<UIPassthroughEventT>> {
44
- const response = (await this.triggerUIPassthroughApi(apiName, parameters))
46
+ const response = (await this.triggerUIPassthroughApi(apiName, parameters, context))
45
47
  ?.filter?.((r) => r.error || r.value)[0];
46
48
 
47
49
  if (!response) {
@@ -65,8 +67,9 @@ export class HostEventClient {
65
67
  public async hostEventFallback(
66
68
  hostEvent: HostEvent,
67
69
  data: any,
70
+ context?: ContextType,
68
71
  ): Promise<any> {
69
- return this.processTrigger(hostEvent, data);
72
+ return this.processTrigger(hostEvent, data, context);
70
73
  }
71
74
 
72
75
  /**
@@ -80,20 +83,22 @@ export class HostEventClient {
80
83
  public async triggerUIPassthroughApi<UIPassthroughEventT extends UIPassthroughEvent>(
81
84
  apiName: UIPassthroughEventT,
82
85
  parameters: UIPassthroughRequest<UIPassthroughEventT>,
86
+ context?: ContextType,
83
87
  ): Promise<UIPassthroughArrayResponse<UIPassthroughEventT>> {
84
88
  const res = await this.processTrigger(HostEvent.UIPassthrough, {
85
89
  type: apiName,
86
90
  parameters,
87
- });
91
+ }, context);
88
92
 
89
93
  return res;
90
94
  }
91
95
 
92
96
  protected async handlePinEvent(
93
97
  payload: HostEventRequest<HostEvent.Pin>,
94
- ): Promise<HostEventResponse<HostEvent.Pin>> {
98
+ context?: ContextType,
99
+ ): Promise<HostEventResponse<HostEvent.Pin, ContextType>> {
95
100
  if (!payload || !('newVizName' in payload)) {
96
- return this.hostEventFallback(HostEvent.Pin, payload);
101
+ return this.hostEventFallback(HostEvent.Pin, payload, context);
97
102
  }
98
103
 
99
104
  const formattedPayload = {
@@ -104,6 +109,7 @@ export class HostEventClient {
104
109
 
105
110
  const data = await this.handleHostEventWithParam(
106
111
  UIPassthroughEvent.PinAnswerToLiveboard, formattedPayload,
112
+ context as ContextType,
107
113
  );
108
114
 
109
115
  return {
@@ -114,14 +120,16 @@ export class HostEventClient {
114
120
 
115
121
  protected async handleSaveAnswerEvent(
116
122
  payload: HostEventRequest<HostEvent.SaveAnswer>,
123
+ context?: ContextType,
117
124
  ): Promise<any> {
118
125
  if (!payload || !('name' in payload) || !('description' in payload)) {
119
126
  // Save is the fallback for SaveAnswer
120
- return this.hostEventFallback(HostEvent.Save, payload);
127
+ return this.hostEventFallback(HostEvent.Save, payload, context);
121
128
  }
122
129
 
123
130
  const data = await this.handleHostEventWithParam(
124
131
  UIPassthroughEvent.SaveAnswer, payload,
132
+ context as ContextType,
125
133
  );
126
134
  return {
127
135
  ...data,
@@ -132,19 +140,22 @@ export class HostEventClient {
132
140
  public async triggerHostEvent<
133
141
  HostEventT extends HostEvent,
134
142
  PayloadT,
143
+ ContextT extends ContextType,
135
144
  >(
136
145
  hostEvent: HostEventT,
137
146
  payload?: TriggerPayload<PayloadT, HostEventT>,
138
- ): Promise<TriggerResponse<PayloadT, HostEventT>> {
147
+ context?: ContextT,
148
+ ): Promise<TriggerResponse<PayloadT, HostEventT, ContextType>> {
139
149
  switch (hostEvent) {
140
150
  case HostEvent.Pin:
141
- return this.handlePinEvent(payload as HostEventRequest<HostEvent.Pin>) as any;
151
+ return this.handlePinEvent(payload as HostEventRequest<HostEvent.Pin>, context as ContextType) as any;
142
152
  case HostEvent.SaveAnswer:
143
153
  return this.handleSaveAnswerEvent(
144
154
  payload as HostEventRequest<HostEvent.SaveAnswer>,
155
+ context as ContextType,
145
156
  ) as any;
146
157
  default:
147
- return this.hostEventFallback(hostEvent, payload);
158
+ return this.hostEventFallback(hostEvent, payload, context);
148
159
  }
149
160
  }
150
161
  }