@thoughtspot/visual-embed-sdk 1.27.9 → 1.27.11

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 (221) hide show
  1. package/cjs/package.json +2 -2
  2. package/cjs/src/embed/app.d.ts +144 -7
  3. package/cjs/src/embed/app.d.ts.map +1 -1
  4. package/cjs/src/embed/app.js +5 -5
  5. package/cjs/src/embed/app.js.map +1 -1
  6. package/cjs/src/embed/app.spec.js +19 -1
  7. package/cjs/src/embed/app.spec.js.map +1 -1
  8. package/cjs/src/embed/base.d.ts.map +1 -1
  9. package/cjs/src/embed/base.js +0 -3
  10. package/cjs/src/embed/base.js.map +1 -1
  11. package/cjs/src/embed/embed.spec.js +0 -15
  12. package/cjs/src/embed/embed.spec.js.map +1 -1
  13. package/cjs/src/embed/liveboard.d.ts +113 -4
  14. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  15. package/cjs/src/embed/liveboard.js +2 -2
  16. package/cjs/src/embed/liveboard.js.map +1 -1
  17. package/cjs/src/embed/liveboard.spec.js +20 -1
  18. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  19. package/cjs/src/embed/pinboard.spec.js +20 -1
  20. package/cjs/src/embed/pinboard.spec.js.map +1 -1
  21. package/cjs/src/embed/sage.d.ts +1 -1
  22. package/cjs/src/embed/sage.d.ts.map +1 -1
  23. package/cjs/src/embed/sage.js +2 -2
  24. package/cjs/src/embed/sage.js.map +1 -1
  25. package/cjs/src/embed/search-bar.d.ts +37 -6
  26. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  27. package/cjs/src/embed/search-bar.js +2 -2
  28. package/cjs/src/embed/search-bar.js.map +1 -1
  29. package/cjs/src/embed/search.d.ts +80 -1
  30. package/cjs/src/embed/search.d.ts.map +1 -1
  31. package/cjs/src/embed/search.js +3 -3
  32. package/cjs/src/embed/search.js.map +1 -1
  33. package/cjs/src/embed/search.spec.js +25 -1
  34. package/cjs/src/embed/search.spec.js.map +1 -1
  35. package/cjs/src/embed/ts-embed-trigger.spec.d.ts +2 -0
  36. package/cjs/src/embed/ts-embed-trigger.spec.d.ts.map +1 -0
  37. package/cjs/src/embed/ts-embed-trigger.spec.js +34 -0
  38. package/cjs/src/embed/ts-embed-trigger.spec.js.map +1 -0
  39. package/cjs/src/embed/ts-embed.d.ts +1 -1
  40. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  41. package/cjs/src/embed/ts-embed.js +14 -11
  42. package/cjs/src/embed/ts-embed.js.map +1 -1
  43. package/cjs/src/embed/ts-embed.spec.js +50 -17
  44. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  45. package/cjs/src/index.d.ts +5 -3
  46. package/cjs/src/index.d.ts.map +1 -1
  47. package/cjs/src/index.js +6 -1
  48. package/cjs/src/index.js.map +1 -1
  49. package/cjs/src/mixpanel-service.d.ts +1 -0
  50. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  51. package/cjs/src/mixpanel-service.js +1 -0
  52. package/cjs/src/mixpanel-service.js.map +1 -1
  53. package/cjs/src/react/all-types-export.d.ts +1 -1
  54. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  55. package/cjs/src/react/all-types-export.js +2 -1
  56. package/cjs/src/react/all-types-export.js.map +1 -1
  57. package/cjs/src/react/index.spec.js +1 -1
  58. package/cjs/src/react/index.spec.js.map +1 -1
  59. package/cjs/src/test/test-utils.d.ts +1 -0
  60. package/cjs/src/test/test-utils.d.ts.map +1 -1
  61. package/cjs/src/test/test-utils.js +10 -1
  62. package/cjs/src/test/test-utils.js.map +1 -1
  63. package/cjs/src/tokenizedFetch.d.ts +9 -0
  64. package/cjs/src/tokenizedFetch.d.ts.map +1 -1
  65. package/cjs/src/tokenizedFetch.js +9 -0
  66. package/cjs/src/tokenizedFetch.js.map +1 -1
  67. package/cjs/src/types.d.ts +295 -44
  68. package/cjs/src/types.d.ts.map +1 -1
  69. package/cjs/src/types.js +119 -21
  70. package/cjs/src/types.js.map +1 -1
  71. package/cjs/src/utils/authService/authService.d.ts.map +1 -1
  72. package/cjs/src/utils/authService/authService.js +8 -2
  73. package/cjs/src/utils/authService/authService.js.map +1 -1
  74. package/cjs/src/utils/authService/authService.spec.js +22 -0
  75. package/cjs/src/utils/authService/authService.spec.js.map +1 -1
  76. package/cjs/src/utils/graphql/answerService/answerService.d.ts +56 -2
  77. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  78. package/cjs/src/utils/graphql/answerService/answerService.js +55 -0
  79. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  80. package/dist/src/embed/app.d.ts +144 -7
  81. package/dist/src/embed/app.d.ts.map +1 -1
  82. package/dist/src/embed/base.d.ts.map +1 -1
  83. package/dist/src/embed/liveboard.d.ts +113 -4
  84. package/dist/src/embed/liveboard.d.ts.map +1 -1
  85. package/dist/src/embed/sage.d.ts +1 -1
  86. package/dist/src/embed/sage.d.ts.map +1 -1
  87. package/dist/src/embed/search-bar.d.ts +37 -6
  88. package/dist/src/embed/search-bar.d.ts.map +1 -1
  89. package/dist/src/embed/search.d.ts +80 -1
  90. package/dist/src/embed/search.d.ts.map +1 -1
  91. package/dist/src/embed/ts-embed-trigger.spec.d.ts +2 -0
  92. package/dist/src/embed/ts-embed-trigger.spec.d.ts.map +1 -0
  93. package/dist/src/embed/ts-embed.d.ts +1 -1
  94. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  95. package/dist/src/index.d.ts +5 -3
  96. package/dist/src/index.d.ts.map +1 -1
  97. package/dist/src/mixpanel-service.d.ts +1 -0
  98. package/dist/src/mixpanel-service.d.ts.map +1 -1
  99. package/dist/src/react/all-types-export.d.ts +1 -1
  100. package/dist/src/react/all-types-export.d.ts.map +1 -1
  101. package/dist/src/test/test-utils.d.ts +1 -0
  102. package/dist/src/test/test-utils.d.ts.map +1 -1
  103. package/dist/src/tokenizedFetch.d.ts +9 -0
  104. package/dist/src/tokenizedFetch.d.ts.map +1 -1
  105. package/dist/src/types.d.ts +295 -44
  106. package/dist/src/types.d.ts.map +1 -1
  107. package/dist/src/utils/authService/authService.d.ts.map +1 -1
  108. package/dist/src/utils/graphql/answerService/answerService.d.ts +56 -2
  109. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  110. package/dist/tsembed-react.es.js +219 -47
  111. package/dist/tsembed-react.js +212 -47
  112. package/dist/tsembed.es.js +336 -167
  113. package/dist/tsembed.js +15335 -15170
  114. package/dist/visual-embed-sdk-react-full.d.ts +769 -66
  115. package/dist/visual-embed-sdk-react.d.ts +769 -66
  116. package/dist/visual-embed-sdk.d.ts +769 -66
  117. package/lib/package.json +2 -2
  118. package/lib/src/embed/app.d.ts +144 -7
  119. package/lib/src/embed/app.d.ts.map +1 -1
  120. package/lib/src/embed/app.js +5 -5
  121. package/lib/src/embed/app.js.map +1 -1
  122. package/lib/src/embed/app.spec.js +19 -1
  123. package/lib/src/embed/app.spec.js.map +1 -1
  124. package/lib/src/embed/base.d.ts.map +1 -1
  125. package/lib/src/embed/base.js +0 -3
  126. package/lib/src/embed/base.js.map +1 -1
  127. package/lib/src/embed/embed.spec.js +2 -17
  128. package/lib/src/embed/embed.spec.js.map +1 -1
  129. package/lib/src/embed/liveboard.d.ts +113 -4
  130. package/lib/src/embed/liveboard.d.ts.map +1 -1
  131. package/lib/src/embed/liveboard.js +3 -3
  132. package/lib/src/embed/liveboard.js.map +1 -1
  133. package/lib/src/embed/liveboard.spec.js +20 -1
  134. package/lib/src/embed/liveboard.spec.js.map +1 -1
  135. package/lib/src/embed/pinboard.spec.js +20 -1
  136. package/lib/src/embed/pinboard.spec.js.map +1 -1
  137. package/lib/src/embed/sage.d.ts +1 -1
  138. package/lib/src/embed/sage.d.ts.map +1 -1
  139. package/lib/src/embed/sage.js +2 -2
  140. package/lib/src/embed/sage.js.map +1 -1
  141. package/lib/src/embed/search-bar.d.ts +37 -6
  142. package/lib/src/embed/search-bar.d.ts.map +1 -1
  143. package/lib/src/embed/search-bar.js +2 -2
  144. package/lib/src/embed/search-bar.js.map +1 -1
  145. package/lib/src/embed/search.d.ts +80 -1
  146. package/lib/src/embed/search.d.ts.map +1 -1
  147. package/lib/src/embed/search.js +3 -3
  148. package/lib/src/embed/search.js.map +1 -1
  149. package/lib/src/embed/search.spec.js +25 -1
  150. package/lib/src/embed/search.spec.js.map +1 -1
  151. package/lib/src/embed/ts-embed-trigger.spec.d.ts +2 -0
  152. package/lib/src/embed/ts-embed-trigger.spec.d.ts.map +1 -0
  153. package/lib/src/embed/ts-embed-trigger.spec.js +32 -0
  154. package/lib/src/embed/ts-embed-trigger.spec.js.map +1 -0
  155. package/lib/src/embed/ts-embed.d.ts +1 -1
  156. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  157. package/lib/src/embed/ts-embed.js +14 -11
  158. package/lib/src/embed/ts-embed.js.map +1 -1
  159. package/lib/src/embed/ts-embed.spec.js +44 -11
  160. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  161. package/lib/src/index.d.ts +5 -3
  162. package/lib/src/index.d.ts.map +1 -1
  163. package/lib/src/index.js +3 -3
  164. package/lib/src/index.js.map +1 -1
  165. package/lib/src/mixpanel-service.d.ts +1 -0
  166. package/lib/src/mixpanel-service.d.ts.map +1 -1
  167. package/lib/src/mixpanel-service.js +1 -0
  168. package/lib/src/mixpanel-service.js.map +1 -1
  169. package/lib/src/react/all-types-export.d.ts +1 -1
  170. package/lib/src/react/all-types-export.d.ts.map +1 -1
  171. package/lib/src/react/all-types-export.js +1 -1
  172. package/lib/src/react/all-types-export.js.map +1 -1
  173. package/lib/src/react/index.spec.js +1 -1
  174. package/lib/src/react/index.spec.js.map +1 -1
  175. package/lib/src/test/test-utils.d.ts +1 -0
  176. package/lib/src/test/test-utils.d.ts.map +1 -1
  177. package/lib/src/test/test-utils.js +8 -0
  178. package/lib/src/test/test-utils.js.map +1 -1
  179. package/lib/src/tokenizedFetch.d.ts +9 -0
  180. package/lib/src/tokenizedFetch.d.ts.map +1 -1
  181. package/lib/src/tokenizedFetch.js +9 -0
  182. package/lib/src/tokenizedFetch.js.map +1 -1
  183. package/lib/src/types.d.ts +295 -44
  184. package/lib/src/types.d.ts.map +1 -1
  185. package/lib/src/types.js +119 -21
  186. package/lib/src/types.js.map +1 -1
  187. package/lib/src/utils/authService/authService.d.ts.map +1 -1
  188. package/lib/src/utils/authService/authService.js +8 -2
  189. package/lib/src/utils/authService/authService.js.map +1 -1
  190. package/lib/src/utils/authService/authService.spec.js +22 -0
  191. package/lib/src/utils/authService/authService.spec.js.map +1 -1
  192. package/lib/src/utils/graphql/answerService/answerService.d.ts +56 -2
  193. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  194. package/lib/src/utils/graphql/answerService/answerService.js +55 -0
  195. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  196. package/lib/src/visual-embed-sdk.d.ts +778 -69
  197. package/package.json +2 -2
  198. package/src/embed/app.spec.ts +24 -1
  199. package/src/embed/app.ts +148 -13
  200. package/src/embed/base.ts +1 -5
  201. package/src/embed/embed.spec.ts +0 -18
  202. package/src/embed/liveboard.spec.ts +24 -1
  203. package/src/embed/liveboard.ts +121 -15
  204. package/src/embed/pinboard.spec.ts +24 -1
  205. package/src/embed/sage.ts +2 -2
  206. package/src/embed/search-bar.tsx +38 -7
  207. package/src/embed/search.spec.ts +29 -1
  208. package/src/embed/search.ts +82 -3
  209. package/src/embed/ts-embed-trigger.spec.ts +39 -0
  210. package/src/embed/ts-embed.spec.ts +46 -11
  211. package/src/embed/ts-embed.ts +18 -14
  212. package/src/index.ts +12 -1
  213. package/src/mixpanel-service.ts +1 -0
  214. package/src/react/all-types-export.ts +1 -0
  215. package/src/react/index.spec.tsx +1 -0
  216. package/src/test/test-utils.ts +9 -0
  217. package/src/tokenizedFetch.ts +9 -0
  218. package/src/types.ts +296 -42
  219. package/src/utils/authService/authService.spec.ts +27 -0
  220. package/src/utils/authService/authService.ts +13 -12
  221. package/src/utils/graphql/answerService/answerService.ts +56 -1
@@ -169,6 +169,7 @@ describe('Pinboard/viz embed tests', () => {
169
169
  values: [1000],
170
170
  },
171
171
  ],
172
+ excludeRuntimeFiltersfromURL: false,
172
173
  } as LiveboardViewConfig);
173
174
  pinboardEmbed.render();
174
175
  await executeAfterWait(() => {
@@ -179,7 +180,7 @@ describe('Pinboard/viz embed tests', () => {
179
180
  });
180
181
  });
181
182
 
182
- test('should not apply runtime filters if excludeRuntimeFiltersfromURL is true', async () => {
183
+ test('should not append runtime filters in URL if excludeRuntimeFiltersfromURL is true', async () => {
183
184
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
184
185
  ...defaultViewConfig,
185
186
  pinboardId,
@@ -202,6 +203,28 @@ describe('Pinboard/viz embed tests', () => {
202
203
  });
203
204
  });
204
205
 
206
+ test('should not append runtime filters in URL if excludeRuntimeFiltersfromURL is undefined', async () => {
207
+ const liveboardEmbed = new PinboardEmbed(getRootEl(), {
208
+ ...defaultViewConfig,
209
+ pinboardId,
210
+ vizId,
211
+ runtimeFilters: [
212
+ {
213
+ columnName: 'sales',
214
+ operator: RuntimeFilterOp.EQ,
215
+ values: [1000],
216
+ },
217
+ ],
218
+ } as LiveboardViewConfig);
219
+ liveboardEmbed.render();
220
+ await executeAfterWait(() => {
221
+ expectUrlMatchesWithParams(
222
+ getIFrameSrc(),
223
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}${prefixParamsVizEmbed}#/embed/viz/${pinboardId}/${vizId}`,
224
+ );
225
+ });
226
+ });
227
+
205
228
  test('should register event handler to adjust iframe height', async () => {
206
229
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
207
230
  ...defaultViewConfig,
package/src/embed/sage.ts CHANGED
@@ -237,11 +237,11 @@ export class SageEmbed extends V1Embed {
237
237
  *
238
238
  * @returns {SageEmbed} Eureka/Sage embed
239
239
  */
240
- public render(): SageEmbed {
240
+ public async render(): Promise<SageEmbed> {
241
241
  super.render();
242
242
 
243
243
  const src = this.getIFrameSrc();
244
- this.renderV1Embed(src);
244
+ await this.renderV1Embed(src);
245
245
 
246
246
  return this;
247
247
  }
@@ -23,18 +23,44 @@ export interface SearchBarViewConfig
23
23
  * Only a single data source is supported currently.
24
24
  *
25
25
  * @deprecated Use `dataSource` instead
26
+ *
27
+ * @version: SDK: 1.1.0 | ThoughtSpot: 8.1.1-sw
28
+ *
29
+ * @example
30
+ * ```js
31
+ * const embed = new SearchBarEmbed('#tsEmbed', {
32
+ * ... // other options
33
+ * dataSources:['id-2345','id-2345'],
34
+ * })
35
+ * ```
26
36
  */
27
37
  dataSources?: string[];
28
38
  /**
29
- * The array of data source GUIDs to set on load.
39
+ * Pass the ID of the source to be selected.
30
40
  *
31
41
  * @version: SDK: 1.19.0, ThoughtSpot 9.0.0.cl, 9.0.1.sw
42
+ *
43
+ * @example
44
+ * ```js
45
+ * const embed = new SearchBarEmbed('#tsEmbed', {
46
+ * ... // other options
47
+ * dataSource:'id-2345',
48
+ * })
49
+ * ```
32
50
  */
33
51
  dataSource?: string;
34
52
  /**
35
53
  * Boolean to define if the last selected data source should be used
36
54
  *
37
55
  * @version: SDK: 1.24.0, ThoughtSpot 9.5.0.cl, 9.5.0.sw
56
+ *
57
+ * @example
58
+ * ```js
59
+ * const embed = new SearchBarEmbed('#tsEmbed', {
60
+ * ... // other options
61
+ * useLastSelectedSources:false,
62
+ * })
63
+ * ```
38
64
  */
39
65
  useLastSelectedSources?: boolean;
40
66
  /**
@@ -48,12 +74,17 @@ export interface SearchBarViewConfig
48
74
  * If it’s not executed, the focus is placed at the end of
49
75
  * the token string in the search bar.
50
76
  *
77
+ * @version: SDK: 1.2.0 | ThoughtSpot: 9.4.0.sw
78
+ *
51
79
  * @example
52
80
  * ```js
53
- * searchOptions: {
54
- * searchTokenString: '[quantity purchased] [region]',
55
- * executeSearch: true,
56
- * }
81
+ * const embed = new SearchBarEmbed('#tsEmbed', {
82
+ * ... // other options
83
+ * searchOptions: {
84
+ * searchTokenString: '[quantity purchased] [region]',
85
+ * executeSearch: true,
86
+ * }
87
+ * })
57
88
  * ```
58
89
  */
59
90
  searchOptions?: SearchOptions;
@@ -130,11 +161,11 @@ export class SearchBarEmbed extends TsEmbed {
130
161
  /**
131
162
  * Render the embedded ThoughtSpot search
132
163
  */
133
- public render(): SearchBarEmbed {
164
+ public async render(): Promise<SearchBarEmbed> {
134
165
  super.render();
135
166
 
136
167
  const src = this.getIFrameSrc();
137
- this.renderIFrame(src);
168
+ await this.renderIFrame(src);
138
169
  return this;
139
170
  }
140
171
  }
@@ -178,6 +178,7 @@ describe('Search embed tests', () => {
178
178
  values: ['berkeley'],
179
179
  },
180
180
  ],
181
+ excludeRuntimeFiltersfromURL: false,
181
182
  });
182
183
  searchEmbed.render();
183
184
  await executeAfterWait(() => {
@@ -188,7 +189,7 @@ describe('Search embed tests', () => {
188
189
  });
189
190
  });
190
191
 
191
- test('should not add runtime filters if excludeRuntimeFiltersfromURL is true', async () => {
192
+ test('should not append runtime filters in URL if excludeRuntimeFiltersfromURL is true', async () => {
192
193
  const dataSources = ['data-source-1'];
193
194
  const searchOptions = {
194
195
  searchTokenString: '[commit date][revenue]',
@@ -216,6 +217,33 @@ describe('Search embed tests', () => {
216
217
  });
217
218
  });
218
219
 
220
+ test('should not append runtime filters in URL if excludeRuntimeFiltersfromURL is undefined', async () => {
221
+ const dataSources = ['data-source-1'];
222
+ const searchOptions = {
223
+ searchTokenString: '[commit date][revenue]',
224
+ };
225
+ const searchEmbed = new SearchEmbed(getRootEl(), {
226
+ ...defaultViewConfig,
227
+ hideDataSources: true,
228
+ dataSources,
229
+ searchOptions,
230
+ runtimeFilters: [
231
+ {
232
+ columnName: 'city',
233
+ operator: RuntimeFilterOp.EQ,
234
+ values: ['berkeley'],
235
+ },
236
+ ],
237
+ });
238
+ searchEmbed.render();
239
+ await executeAfterWait(() => {
240
+ expectUrlMatchesWithParams(
241
+ getIFrameSrc(),
242
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSources=[%22data-source-1%22]&searchTokenString=%5Bcommit%20date%5D%5Brevenue%5D&dataSourceMode=hide&useLastSelectedSources=false${prefixParams}#/embed/answer`,
243
+ );
244
+ });
245
+ });
246
+
219
247
  test('Should add dataSource', async () => {
220
248
  const dataSource = 'data-source-1';
221
249
  const searchOptions = {
@@ -57,16 +57,43 @@ export interface SearchViewConfig
57
57
  /**
58
58
  * If set to true, the data sources panel is collapsed on load,
59
59
  * but can be expanded manually.
60
+ *
61
+ * @version: SDK: 1.1.0 | ThoughtSpot: 8.1.0.sw
62
+ * @example
63
+ * ```js
64
+ * const embed = new SearchEmbed('#tsEmbed', {
65
+ * ... // other options
66
+ * collapseDataSources:true,
67
+ * })
68
+ * ```
60
69
  */
61
70
  collapseDataSources?: boolean;
62
71
  /**
63
72
  * Show or hide the data sources panel.
73
+ *
74
+ * @version: SDK: 1.2.0 | ThoughtSpot: 9.1.0.sw
75
+ * @example
76
+ * ```js
77
+ * const embed = new SearchEmbed('#tsEmbed', {
78
+ * ... // other options
79
+ * hideDataSources:true,
80
+ * })
81
+ * ```
64
82
  */
65
83
  hideDataSources?: boolean;
66
84
  /**
67
85
  * Show or hide the charts and tables in search answers.
68
86
  * This attribute can be used to create a custom visualization
69
87
  * using raw answer data.
88
+ *
89
+ * @version: SDK: 1.2.0 | ThoughtSpot: 9.1.0.sw
90
+ * @example
91
+ * ```js
92
+ * const embed = new SearchEmbed('#tsEmbed', {
93
+ * ... // other options
94
+ * hideResults:true,
95
+ * })
96
+ * ```
70
97
  */
71
98
  hideResults?: boolean;
72
99
  /**
@@ -77,11 +104,26 @@ export interface SearchViewConfig
77
104
  * If set to true, the Search Assist feature is enabled.
78
105
  *
79
106
  * @version SDK: 1.13.0 | ThoughtSpot: 8.5.0.cl, 8.8.1-sw
107
+ * @example
108
+ * ```js
109
+ * const embed = new SearchEmbed('#tsEmbed', {
110
+ * ... // other options
111
+ * enableSearchAssist:true,
112
+ * })
113
+ * ```
80
114
  */
81
115
  enableSearchAssist?: boolean;
82
116
  /**
83
117
  * If set to true, the tabular view is set as the default
84
118
  * format for presenting search data.
119
+ *
120
+ * @version: SDK: 1.1.0 | ThoughtSpot: 8.1.0.sw
121
+ * @example
122
+ * ```js
123
+ * const embed = new SearchEmbed('#tsEmbed', {
124
+ * ... // other options
125
+ * forceTable:true,
126
+ * })
85
127
  */
86
128
  forceTable?: boolean;
87
129
  /**
@@ -89,12 +131,26 @@ export interface SearchViewConfig
89
131
  * Only a single data source is supported currently.
90
132
  *
91
133
  * @deprecated Use `dataSource` instead.
134
+ * @example
135
+ * ```js
136
+ * const embed = new SearchEmbed('#tsEmbed', {
137
+ * ... // other options
138
+ * dataSources:['id-234','id-456'],
139
+ * })
140
+ * ```
92
141
  */
93
142
  dataSources?: string[];
94
143
  /**
95
144
  * The array of data source GUIDs to set on load.
96
145
  *
97
146
  * @version: SDK: 1.19.0
147
+ * @example
148
+ * ```js
149
+ * const embed = new SearchEmbed('#tsEmbed', {
150
+ * ... // other options
151
+ * dataSource:'id-234',
152
+ * })
153
+ * ```
98
154
  */
99
155
  dataSource?: string;
100
156
  /**
@@ -127,6 +183,15 @@ export interface SearchViewConfig
127
183
  searchOptions?: SearchOptions;
128
184
  /**
129
185
  * The GUID of a saved answer to load initially.
186
+ *
187
+ * @version: SDK: 1.1.0 | ThoughtSpot: 8.1.0.sw
188
+ * @example
189
+ * ```js
190
+ * const embed = new SearchEmbed('#tsEmbed', {
191
+ * ... // other options
192
+ * answerId:'sed-1234',
193
+ * })
194
+ * ```
130
195
  */
131
196
  answerId?: string;
132
197
  /**
@@ -134,6 +199,13 @@ export interface SearchViewConfig
134
199
  * The chart/table should still be visible.
135
200
  *
136
201
  * @version SDK: 1.21.0 | ThoughtSpot: 9.2.0.cl, 9.5.0.sw
202
+ * @example
203
+ * ```js
204
+ * const embed = new SearchEmbed('#tsEmbed', {
205
+ * ... // other options
206
+ * hideSearchBar:true,
207
+ * })
208
+ * ```
137
209
  */
138
210
  hideSearchBar?: boolean;
139
211
  /**
@@ -141,6 +213,13 @@ export interface SearchViewConfig
141
213
  *
142
214
  * @default false
143
215
  * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
216
+ * @example
217
+ * ```js
218
+ * const embed = new SearchEmbed('#tsEmbed', {
219
+ * ... // other options
220
+ * dataPanelV2:false,
221
+ * })
222
+ * ```
144
223
  */
145
224
  dataPanelV2?: boolean;
146
225
  /**
@@ -201,7 +280,7 @@ export class SearchEmbed extends TsEmbed {
201
280
  runtimeFilters,
202
281
  dataSource,
203
282
  dataSources,
204
- excludeRuntimeFiltersfromURL,
283
+ excludeRuntimeFiltersfromURL = true,
205
284
  hideSearchBar,
206
285
  dataPanelV2 = false,
207
286
  useLastSelectedSources = false,
@@ -286,12 +365,12 @@ export class SearchEmbed extends TsEmbed {
286
365
  /**
287
366
  * Render the embedded ThoughtSpot search
288
367
  */
289
- public render(): SearchEmbed {
368
+ public async render(): Promise<SearchEmbed> {
290
369
  super.render();
291
370
  const { answerId } = this.viewConfig;
292
371
 
293
372
  const src = this.getIFrameSrc();
294
- this.renderIFrame(src);
373
+ await this.renderIFrame(src);
295
374
  getAuthPromise().then(() => {
296
375
  if (
297
376
  checkReleaseVersionInBeta(
@@ -0,0 +1,39 @@
1
+ import {
2
+ init, AuthType, LiveboardEmbed, HostEvent,
3
+ } from '../index';
4
+ import {
5
+ executeAfterWait,
6
+ getDocumentBody,
7
+ getIFrameEl,
8
+ getRootEl,
9
+ } from '../test/test-utils';
10
+
11
+ describe('Trigger', () => {
12
+ beforeEach(() => {
13
+ document.body.innerHTML = getDocumentBody();
14
+ });
15
+ test('should trigger the event', async (done) => {
16
+ init({
17
+ thoughtSpotHost: 'https://tshost',
18
+ authType: AuthType.None,
19
+ });
20
+ const lb = new LiveboardEmbed(getRootEl(), {
21
+ frameParams: {
22
+ width: '100%',
23
+ height: '100%',
24
+ },
25
+ liveboardId: '123',
26
+ });
27
+ const val = await lb.render();
28
+ const iframe = getIFrameEl();
29
+ jest.spyOn(iframe.contentWindow, 'postMessage');
30
+ executeAfterWait(() => {
31
+ lb.trigger(HostEvent.DownloadAsCsv, { vizId: 'testId' });
32
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(expect.objectContaining({
33
+ type: HostEvent.DownloadAsCsv,
34
+ data: { vizId: 'testId' },
35
+ }), 'https://tshost', expect.anything());
36
+ done();
37
+ });
38
+ });
39
+ });
@@ -15,6 +15,7 @@ import {
15
15
  import * as mixpanelInstance from '../mixpanel-service';
16
16
  import { MIXPANEL_EVENT } from '../mixpanel-service';
17
17
  import {
18
+ createRootEleForEmbed,
18
19
  defaultParamsForPinboardEmbed,
19
20
  executeAfterWait,
20
21
  expectUrlMatchesWithParams,
@@ -47,15 +48,6 @@ const tabId2 = 'eca215d4-0d2c-4a55-90e3-d81ef6848ae0';
47
48
  const thoughtSpotHost = 'tshost';
48
49
  const defaultParamsPost = '';
49
50
 
50
- const createRootEleForEmbed = () => {
51
- const rootEle = document.createElement('div');
52
- rootEle.id = 'myRoot';
53
- const tsEmbedDiv = document.createElement('div');
54
- tsEmbedDiv.id = 'tsEmbedDiv';
55
- rootEle.appendChild(tsEmbedDiv);
56
- document.body.appendChild(rootEle);
57
- };
58
-
59
51
  beforeAll(() => {
60
52
  spyOn(window, 'alert');
61
53
  });
@@ -317,6 +309,46 @@ describe('Unit test case for ts embed', () => {
317
309
  });
318
310
  });
319
311
 
312
+ test('Runtime filters from view Config should be part of app_init payload when excludeRuntimeFiltersfromURL is undefined', async () => {
313
+ const mockEmbedEventPayload = {
314
+ type: EmbedEvent.APP_INIT,
315
+ data: {},
316
+ };
317
+ const mockRuntimeFilters: RuntimeFilter[] = [
318
+ {
319
+ columnName: 'color',
320
+ operator: RuntimeFilterOp.EQ,
321
+ values: ['blue'],
322
+ },
323
+ ];
324
+
325
+ const searchEmbed = new SearchEmbed(getRootEl(), {
326
+ ...defaultViewConfig,
327
+ excludeRuntimeFiltersfromURL: true,
328
+ runtimeFilters: mockRuntimeFilters,
329
+ });
330
+ searchEmbed.render();
331
+ const mockPort: any = {
332
+ postMessage: jest.fn(),
333
+ };
334
+ await executeAfterWait(() => {
335
+ const iframe = getIFrameEl();
336
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
337
+ });
338
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
339
+ type: EmbedEvent.APP_INIT,
340
+ data: {
341
+ customisations,
342
+ authToken: '',
343
+ runtimeFilterParams: 'col1=color&op1=EQ&val1=blue',
344
+ hiddenHomeLeftNavItems: [],
345
+ hiddenHomepageModules: [],
346
+ hostConfig: undefined,
347
+ reorderedHomepageModules: [],
348
+ },
349
+ });
350
+ });
351
+
320
352
  test('Runtime filters from view Config should not be part of app_init payload when excludeRuntimeFiltersfromURL is false', async () => {
321
353
  const mockEmbedEventPayload = {
322
354
  type: EmbedEvent.APP_INIT,
@@ -364,7 +396,7 @@ describe('Unit test case for ts embed', () => {
364
396
  };
365
397
  const mockedHiddenHomeLeftNavItems: HomeLeftNavItem[] = [
366
398
  HomeLeftNavItem.Home,
367
- HomeLeftNavItem.Documentation,
399
+ HomeLeftNavItem.MonitorSubscription,
368
400
  ];
369
401
 
370
402
  const searchEmbed = new AppEmbed(getRootEl(), {
@@ -386,7 +418,10 @@ describe('Unit test case for ts embed', () => {
386
418
  authToken: '',
387
419
  hostConfig: undefined,
388
420
  runtimeFilterParams: null,
389
- hiddenHomeLeftNavItems: [HomeLeftNavItem.Home, HomeLeftNavItem.Documentation],
421
+ hiddenHomeLeftNavItems: [
422
+ HomeLeftNavItem.Home,
423
+ HomeLeftNavItem.MonitorSubscription,
424
+ ],
390
425
  hiddenHomepageModules: [],
391
426
  reorderedHomepageModules: [],
392
427
  },
@@ -167,7 +167,7 @@ export class TsEmbed {
167
167
  this.thoughtSpotV2Base = getV2BasePath(this.embedConfig);
168
168
  this.eventHandlerMap = new Map();
169
169
  this.isError = false;
170
- this.viewConfig = viewConfig;
170
+ this.viewConfig = { excludeRuntimeFiltersfromURL: true, ...viewConfig };
171
171
  this.shouldEncodeUrlQueryParams = this.embedConfig.shouldEncodeUrlQueryParams;
172
172
  this.registerAppInit();
173
173
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
@@ -515,10 +515,7 @@ export class TsEmbed {
515
515
  const queryParams = this.shouldEncodeUrlQueryParams
516
516
  ? `?base64UrlEncodedFlags=${getEncodedQueryParamsString(queryString)}`
517
517
  : `?${queryString}`;
518
- let host = this.thoughtSpotHost;
519
- if (!isUndefined(this.embedConfig.enableReactShell)) {
520
- host = (this.embedConfig.enableReactShell as boolean) ? '/v2' : '/v1';
521
- }
518
+ const host = this.thoughtSpotHost;
522
519
  const path = `${host}/${queryParams}#`;
523
520
  return path;
524
521
  }
@@ -556,8 +553,7 @@ export class TsEmbed {
556
553
 
557
554
  const {
558
555
  height: frameHeight,
559
- width: frameWidth,
560
- ...restParams
556
+ width: frameWidth, ...restParams
561
557
  } = this.viewConfig.frameParams || {};
562
558
  const width = getCssDimension(frameWidth || DEFAULT_EMBED_WIDTH);
563
559
  const height = getCssDimension(frameHeight || DEFAULT_EMBED_HEIGHT);
@@ -679,7 +675,7 @@ export class TsEmbed {
679
675
  protected connectPreRendered(): boolean {
680
676
  const preRenderIds = this.getPreRenderIds();
681
677
  this.preRenderWrapper = this.preRenderWrapper
682
- || document.getElementById(preRenderIds.wrapper);
678
+ || document.getElementById(preRenderIds.wrapper);
683
679
 
684
680
  this.preRenderChild = this.preRenderChild || document.getElementById(preRenderIds.child);
685
681
 
@@ -965,6 +961,16 @@ export class TsEmbed {
965
961
  */
966
962
  public trigger(messageType: HostEvent, data: any = {}): Promise<any> {
967
963
  uploadMixpanelEvent(`${MIXPANEL_EVENT.VISUAL_SDK_TRIGGER}-${messageType}`);
964
+
965
+ if (!this.isRendered) {
966
+ this.handleError('Please call render before triggering events');
967
+ return null;
968
+ }
969
+
970
+ if (!messageType) {
971
+ this.handleError('Host event type is undefined');
972
+ return null;
973
+ }
968
974
  return processTrigger(this.iFrame, messageType, this.thoughtSpotHost, data);
969
975
  }
970
976
 
@@ -975,7 +981,7 @@ export class TsEmbed {
975
981
  *
976
982
  * @param args
977
983
  */
978
- public render(): TsEmbed {
984
+ public async render(): Promise<TsEmbed> {
979
985
  this.isRendered = true;
980
986
 
981
987
  return this;
@@ -1161,8 +1167,8 @@ export class TsEmbed {
1161
1167
  const elBoundingClient = this.el.getBoundingClientRect();
1162
1168
 
1163
1169
  setStyleProperties(this.preRenderWrapper, {
1164
- top: `${elBoundingClient.y}px`,
1165
- left: `${elBoundingClient.x}px`,
1170
+ top: `${elBoundingClient.y + window.scrollY}px`,
1171
+ left: `${elBoundingClient.x + window.scrollX}px`,
1166
1172
  width: `${elBoundingClient.width}px`,
1167
1173
  height: `${elBoundingClient.height}px`,
1168
1174
  });
@@ -1183,8 +1189,6 @@ export class TsEmbed {
1183
1189
  pointerEvents: 'none',
1184
1190
  zIndex: '-1000',
1185
1191
  position: 'absolute ',
1186
- top: '0',
1187
- left: '0',
1188
1192
  };
1189
1193
  setStyleProperties(this.preRenderWrapper, preRenderHideStyles);
1190
1194
 
@@ -1235,7 +1239,7 @@ export class V1Embed extends TsEmbed {
1235
1239
 
1236
1240
  constructor(domSelector: DOMSelector, viewConfig: ViewConfig) {
1237
1241
  super(domSelector, viewConfig);
1238
- this.viewConfig = viewConfig;
1242
+ this.viewConfig = { excludeRuntimeFiltersfromURL: true, ...viewConfig };
1239
1243
  }
1240
1244
 
1241
1245
  /**
package/src/index.ts CHANGED
@@ -46,11 +46,15 @@ import {
46
46
  ContextMenuTriggerOptions,
47
47
  RuntimeParameter,
48
48
  LogLevel,
49
+ VizPoint,
50
+ CustomActionPayload,
49
51
  } from './types';
50
52
  import { CustomCssVariables } from './css-variables';
51
53
  import { SageEmbed, SageViewConfig } from './embed/sage';
52
- import { AnswerService } from './utils/graphql/answerService/answerService';
54
+ import { AnswerService, SessionInterface, UnderlyingDataPoint } from './utils/graphql/answerService/answerService';
53
55
  import { getEmbedConfig } from './embed/embedConfig';
56
+ import { uploadMixpanelEvent, MIXPANEL_EVENT } from './mixpanel-service';
57
+ import { tokenizedFetch } from './tokenizedFetch';
54
58
 
55
59
  export {
56
60
  init,
@@ -62,6 +66,7 @@ export {
62
66
  exportTMLInput,
63
67
  getEmbedConfig as getInitConfig,
64
68
  getSessionInfo,
69
+ tokenizedFetch,
65
70
  SearchEmbed,
66
71
  SearchBarEmbed,
67
72
  PinboardEmbed,
@@ -74,6 +79,8 @@ export {
74
79
  AuthEventEmitter,
75
80
  AnswerService,
76
81
  // types
82
+ SessionInterface,
83
+ UnderlyingDataPoint,
77
84
  Page,
78
85
  AuthType,
79
86
  RuntimeFilter,
@@ -103,4 +110,8 @@ export {
103
110
  CustomCssVariables,
104
111
  RuntimeParameter,
105
112
  LogLevel,
113
+ uploadMixpanelEvent,
114
+ MIXPANEL_EVENT,
115
+ VizPoint,
116
+ CustomActionPayload,
106
117
  };
@@ -18,6 +18,7 @@ export const MIXPANEL_EVENT = {
18
18
  VISUAL_SDK_ON: 'visual-sdk-on',
19
19
  VISUAL_SDK_IFRAME_LOAD_PERFORMANCE: 'visual-sdk-iframe-load-performance',
20
20
  VISUAL_SDK_EMBED_CREATE: 'visual-sdk-embed-create',
21
+ VERCEL_INTEGRATION_COMPLETED: 'vercel-integration-completed',
21
22
  };
22
23
 
23
24
  let isMixpanelInitialized = false;
@@ -18,6 +18,7 @@ export {
18
18
  prefetch,
19
19
  getInitConfig,
20
20
  getSessionInfo,
21
+ uploadMixpanelEvent,
21
22
  PinboardEmbed,
22
23
  AuthFailureType,
23
24
  AuthStatus,
@@ -135,6 +135,7 @@ describe('React Components', () => {
135
135
  values: [100],
136
136
  },
137
137
  ]}
138
+ excludeRuntimeFiltersfromURL={false}
138
139
  />,
139
140
  );
140
141
 
@@ -116,3 +116,12 @@ export const expectUrlMatch = (source: string, target: string) => {
116
116
  const targetUrl = new URL(target);
117
117
  expect(sourceUrl.hash).toBe(targetUrl.hash);
118
118
  };
119
+
120
+ export const createRootEleForEmbed = () => {
121
+ const rootEle = document.createElement('div');
122
+ rootEle.id = 'myRoot';
123
+ const tsEmbedDiv = document.createElement('div');
124
+ tsEmbedDiv.id = 'tsEmbedDiv';
125
+ rootEle.appendChild(tsEmbedDiv);
126
+ document.body.appendChild(rootEle);
127
+ };
@@ -3,6 +3,15 @@ import { getEmbedConfig } from './embed/embedConfig';
3
3
 
4
4
  import { AuthType } from './types';
5
5
 
6
+ /**
7
+ * Fetch wrapper that adds the authentication token to the request.
8
+ * Use this to call the ThoughtSpot APIs when using the visual embed sdk.
9
+ *
10
+ * @param input
11
+ * @param init
12
+ * @version SDK: 1.28.0
13
+ * @group Global methods
14
+ */
6
15
  export const tokenizedFetch: typeof fetch = async (input, init): Promise<Response> => {
7
16
  const embedConfig = getEmbedConfig();
8
17
  if (embedConfig.authType !== AuthType.TrustedAuthTokenCookieless) {