@thoughtspot/visual-embed-sdk 1.28.0-alpha.2 → 1.28.0-alpha.5

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 (223) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/auth.d.ts +16 -1
  3. package/cjs/src/auth.d.ts.map +1 -1
  4. package/cjs/src/auth.js +5 -1
  5. package/cjs/src/auth.js.map +1 -1
  6. package/cjs/src/auth.spec.d.ts.map +1 -1
  7. package/cjs/src/auth.spec.js +9 -0
  8. package/cjs/src/auth.spec.js.map +1 -1
  9. package/cjs/src/authToken.d.ts +6 -0
  10. package/cjs/src/authToken.d.ts.map +1 -1
  11. package/cjs/src/authToken.js +6 -0
  12. package/cjs/src/authToken.js.map +1 -1
  13. package/cjs/src/embed/app.d.ts +156 -6
  14. package/cjs/src/embed/app.d.ts.map +1 -1
  15. package/cjs/src/embed/app.js +3 -3
  16. package/cjs/src/embed/app.js.map +1 -1
  17. package/cjs/src/embed/app.spec.js +19 -1
  18. package/cjs/src/embed/app.spec.js.map +1 -1
  19. package/cjs/src/embed/base.d.ts.map +1 -1
  20. package/cjs/src/embed/base.js +2 -3
  21. package/cjs/src/embed/base.js.map +1 -1
  22. package/cjs/src/embed/embed.spec.js +0 -15
  23. package/cjs/src/embed/embed.spec.js.map +1 -1
  24. package/cjs/src/embed/liveboard.d.ts +121 -6
  25. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  26. package/cjs/src/embed/liveboard.js +2 -2
  27. package/cjs/src/embed/liveboard.js.map +1 -1
  28. package/cjs/src/embed/liveboard.spec.js +20 -1
  29. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  30. package/cjs/src/embed/pinboard.spec.js +20 -1
  31. package/cjs/src/embed/pinboard.spec.js.map +1 -1
  32. package/cjs/src/embed/sage.d.ts +6 -6
  33. package/cjs/src/embed/sage.d.ts.map +1 -1
  34. package/cjs/src/embed/sage.js +18 -3
  35. package/cjs/src/embed/sage.js.map +1 -1
  36. package/cjs/src/embed/sage.spec.js +11 -11
  37. package/cjs/src/embed/sage.spec.js.map +1 -1
  38. package/cjs/src/embed/search-bar.d.ts +37 -6
  39. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  40. package/cjs/src/embed/search-bar.js +2 -2
  41. package/cjs/src/embed/search-bar.js.map +1 -1
  42. package/cjs/src/embed/search.d.ts +90 -1
  43. package/cjs/src/embed/search.d.ts.map +1 -1
  44. package/cjs/src/embed/search.js +3 -3
  45. package/cjs/src/embed/search.js.map +1 -1
  46. package/cjs/src/embed/search.spec.js +25 -1
  47. package/cjs/src/embed/search.spec.js.map +1 -1
  48. package/cjs/src/embed/ts-embed-trigger.spec.d.ts +2 -0
  49. package/cjs/src/embed/ts-embed-trigger.spec.d.ts.map +1 -0
  50. package/cjs/src/embed/ts-embed-trigger.spec.js +34 -0
  51. package/cjs/src/embed/ts-embed-trigger.spec.js.map +1 -0
  52. package/cjs/src/embed/ts-embed.d.ts +1 -1
  53. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  54. package/cjs/src/embed/ts-embed.js +14 -11
  55. package/cjs/src/embed/ts-embed.js.map +1 -1
  56. package/cjs/src/embed/ts-embed.spec.js +47 -17
  57. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  58. package/cjs/src/index.d.ts +3 -1
  59. package/cjs/src/index.d.ts.map +1 -1
  60. package/cjs/src/index.js +5 -1
  61. package/cjs/src/index.js.map +1 -1
  62. package/cjs/src/react/index.spec.js +1 -1
  63. package/cjs/src/react/index.spec.js.map +1 -1
  64. package/cjs/src/test/test-utils.d.ts +1 -0
  65. package/cjs/src/test/test-utils.d.ts.map +1 -1
  66. package/cjs/src/test/test-utils.js +10 -1
  67. package/cjs/src/test/test-utils.js.map +1 -1
  68. package/cjs/src/tokenizedFetch.d.ts +9 -0
  69. package/cjs/src/tokenizedFetch.d.ts.map +1 -1
  70. package/cjs/src/tokenizedFetch.js +9 -0
  71. package/cjs/src/tokenizedFetch.js.map +1 -1
  72. package/cjs/src/types.d.ts +299 -43
  73. package/cjs/src/types.d.ts.map +1 -1
  74. package/cjs/src/types.js +110 -19
  75. package/cjs/src/types.js.map +1 -1
  76. package/cjs/src/utils/authService/authService.d.ts.map +1 -1
  77. package/cjs/src/utils/authService/authService.js +9 -3
  78. package/cjs/src/utils/authService/authService.js.map +1 -1
  79. package/cjs/src/utils/authService/authService.spec.js +22 -0
  80. package/cjs/src/utils/authService/authService.spec.js.map +1 -1
  81. package/dist/src/auth.d.ts +16 -1
  82. package/dist/src/auth.d.ts.map +1 -1
  83. package/dist/src/auth.spec.d.ts.map +1 -1
  84. package/dist/src/authToken.d.ts +6 -0
  85. package/dist/src/authToken.d.ts.map +1 -1
  86. package/dist/src/embed/app.d.ts +156 -6
  87. package/dist/src/embed/app.d.ts.map +1 -1
  88. package/dist/src/embed/base.d.ts.map +1 -1
  89. package/dist/src/embed/liveboard.d.ts +121 -6
  90. package/dist/src/embed/liveboard.d.ts.map +1 -1
  91. package/dist/src/embed/sage.d.ts +6 -6
  92. package/dist/src/embed/sage.d.ts.map +1 -1
  93. package/dist/src/embed/search-bar.d.ts +37 -6
  94. package/dist/src/embed/search-bar.d.ts.map +1 -1
  95. package/dist/src/embed/search.d.ts +90 -1
  96. package/dist/src/embed/search.d.ts.map +1 -1
  97. package/dist/src/embed/ts-embed-trigger.spec.d.ts +2 -0
  98. package/dist/src/embed/ts-embed-trigger.spec.d.ts.map +1 -0
  99. package/dist/src/embed/ts-embed.d.ts +1 -1
  100. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  101. package/dist/src/index.d.ts +3 -1
  102. package/dist/src/index.d.ts.map +1 -1
  103. package/dist/src/test/test-utils.d.ts +1 -0
  104. package/dist/src/test/test-utils.d.ts.map +1 -1
  105. package/dist/src/tokenizedFetch.d.ts +9 -0
  106. package/dist/src/tokenizedFetch.d.ts.map +1 -1
  107. package/dist/src/types.d.ts +299 -43
  108. package/dist/src/types.d.ts.map +1 -1
  109. package/dist/src/utils/authService/authService.d.ts.map +1 -1
  110. package/dist/tsembed-react.es.js +180 -47
  111. package/dist/tsembed-react.js +180 -47
  112. package/dist/tsembed.es.js +182 -51
  113. package/dist/tsembed.js +183 -50
  114. package/dist/visual-embed-sdk-react-full.d.ts +746 -70
  115. package/dist/visual-embed-sdk-react.d.ts +746 -70
  116. package/dist/visual-embed-sdk.d.ts +746 -70
  117. package/lib/package.json +1 -1
  118. package/lib/src/auth.d.ts +16 -1
  119. package/lib/src/auth.d.ts.map +1 -1
  120. package/lib/src/auth.js +5 -1
  121. package/lib/src/auth.js.map +1 -1
  122. package/lib/src/auth.spec.d.ts.map +1 -1
  123. package/lib/src/auth.spec.js +9 -0
  124. package/lib/src/auth.spec.js.map +1 -1
  125. package/lib/src/authToken.d.ts +6 -0
  126. package/lib/src/authToken.d.ts.map +1 -1
  127. package/lib/src/authToken.js +6 -0
  128. package/lib/src/authToken.js.map +1 -1
  129. package/lib/src/embed/app.d.ts +156 -6
  130. package/lib/src/embed/app.d.ts.map +1 -1
  131. package/lib/src/embed/app.js +3 -3
  132. package/lib/src/embed/app.js.map +1 -1
  133. package/lib/src/embed/app.spec.js +19 -1
  134. package/lib/src/embed/app.spec.js.map +1 -1
  135. package/lib/src/embed/base.d.ts.map +1 -1
  136. package/lib/src/embed/base.js +2 -3
  137. package/lib/src/embed/base.js.map +1 -1
  138. package/lib/src/embed/embed.spec.js +2 -17
  139. package/lib/src/embed/embed.spec.js.map +1 -1
  140. package/lib/src/embed/liveboard.d.ts +121 -6
  141. package/lib/src/embed/liveboard.d.ts.map +1 -1
  142. package/lib/src/embed/liveboard.js +2 -2
  143. package/lib/src/embed/liveboard.js.map +1 -1
  144. package/lib/src/embed/liveboard.spec.js +20 -1
  145. package/lib/src/embed/liveboard.spec.js.map +1 -1
  146. package/lib/src/embed/pinboard.spec.js +20 -1
  147. package/lib/src/embed/pinboard.spec.js.map +1 -1
  148. package/lib/src/embed/sage.d.ts +6 -6
  149. package/lib/src/embed/sage.d.ts.map +1 -1
  150. package/lib/src/embed/sage.js +18 -3
  151. package/lib/src/embed/sage.js.map +1 -1
  152. package/lib/src/embed/sage.spec.js +11 -11
  153. package/lib/src/embed/sage.spec.js.map +1 -1
  154. package/lib/src/embed/search-bar.d.ts +37 -6
  155. package/lib/src/embed/search-bar.d.ts.map +1 -1
  156. package/lib/src/embed/search-bar.js +2 -2
  157. package/lib/src/embed/search-bar.js.map +1 -1
  158. package/lib/src/embed/search.d.ts +90 -1
  159. package/lib/src/embed/search.d.ts.map +1 -1
  160. package/lib/src/embed/search.js +3 -3
  161. package/lib/src/embed/search.js.map +1 -1
  162. package/lib/src/embed/search.spec.js +25 -1
  163. package/lib/src/embed/search.spec.js.map +1 -1
  164. package/lib/src/embed/ts-embed-trigger.spec.d.ts +2 -0
  165. package/lib/src/embed/ts-embed-trigger.spec.d.ts.map +1 -0
  166. package/lib/src/embed/ts-embed-trigger.spec.js +32 -0
  167. package/lib/src/embed/ts-embed-trigger.spec.js.map +1 -0
  168. package/lib/src/embed/ts-embed.d.ts +1 -1
  169. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  170. package/lib/src/embed/ts-embed.js +14 -11
  171. package/lib/src/embed/ts-embed.js.map +1 -1
  172. package/lib/src/embed/ts-embed.spec.js +41 -11
  173. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  174. package/lib/src/index.d.ts +3 -1
  175. package/lib/src/index.d.ts.map +1 -1
  176. package/lib/src/index.js +3 -1
  177. package/lib/src/index.js.map +1 -1
  178. package/lib/src/react/index.spec.js +1 -1
  179. package/lib/src/react/index.spec.js.map +1 -1
  180. package/lib/src/test/test-utils.d.ts +1 -0
  181. package/lib/src/test/test-utils.d.ts.map +1 -1
  182. package/lib/src/test/test-utils.js +8 -0
  183. package/lib/src/test/test-utils.js.map +1 -1
  184. package/lib/src/tokenizedFetch.d.ts +9 -0
  185. package/lib/src/tokenizedFetch.d.ts.map +1 -1
  186. package/lib/src/tokenizedFetch.js +9 -0
  187. package/lib/src/tokenizedFetch.js.map +1 -1
  188. package/lib/src/types.d.ts +299 -43
  189. package/lib/src/types.d.ts.map +1 -1
  190. package/lib/src/types.js +110 -19
  191. package/lib/src/types.js.map +1 -1
  192. package/lib/src/utils/authService/authService.d.ts.map +1 -1
  193. package/lib/src/utils/authService/authService.js +9 -3
  194. package/lib/src/utils/authService/authService.js.map +1 -1
  195. package/lib/src/utils/authService/authService.spec.js +22 -0
  196. package/lib/src/utils/authService/authService.spec.js.map +1 -1
  197. package/lib/src/visual-embed-sdk.d.ts +754 -71
  198. package/package.json +1 -1
  199. package/src/auth.spec.ts +10 -0
  200. package/src/auth.ts +21 -2
  201. package/src/authToken.ts +6 -0
  202. package/src/embed/app.spec.ts +24 -1
  203. package/src/embed/app.ts +164 -11
  204. package/src/embed/base.ts +3 -5
  205. package/src/embed/embed.spec.ts +0 -18
  206. package/src/embed/liveboard.spec.ts +24 -1
  207. package/src/embed/liveboard.ts +128 -9
  208. package/src/embed/pinboard.spec.ts +24 -1
  209. package/src/embed/sage.spec.ts +11 -11
  210. package/src/embed/sage.ts +19 -6
  211. package/src/embed/search-bar.tsx +38 -7
  212. package/src/embed/search.spec.ts +29 -1
  213. package/src/embed/search.ts +98 -5
  214. package/src/embed/ts-embed-trigger.spec.ts +39 -0
  215. package/src/embed/ts-embed.spec.ts +49 -16
  216. package/src/embed/ts-embed.ts +21 -16
  217. package/src/index.ts +4 -0
  218. package/src/react/index.spec.tsx +1 -0
  219. package/src/test/test-utils.ts +9 -0
  220. package/src/tokenizedFetch.ts +9 -0
  221. package/src/types.ts +310 -50
  222. package/src/utils/authService/authService.spec.ts +27 -0
  223. package/src/utils/authService/authService.ts +14 -13
@@ -8,7 +8,11 @@
8
8
  */
9
9
 
10
10
  import {
11
- DataSourceVisualMode, DOMSelector, Param, Action, ViewConfig,
11
+ DataSourceVisualMode,
12
+ DOMSelector,
13
+ Param,
14
+ Action,
15
+ ViewConfig,
12
16
  } from '../types';
13
17
  import {
14
18
  getQueryParamString,
@@ -57,27 +61,74 @@ export interface SearchViewConfig
57
61
  /**
58
62
  * If set to true, the data sources panel is collapsed on load,
59
63
  * but can be expanded manually.
64
+ *
65
+ * @version: SDK: 1.1.0 | ThoughtSpot: 8.1.0.sw
66
+ *
67
+ * @example
68
+ * ```js
69
+ * const embed = new SearchEmbed('#tsEmbed', {
70
+ * ... // other options
71
+ * collapseDataSources:true,
72
+ * })
73
+ * ```
60
74
  */
61
75
  collapseDataSources?: boolean;
62
76
  /**
63
77
  * Show or hide the data sources panel.
78
+ *
79
+ * @version: SDK: 1.2.0 | ThoughtSpot: 9.1.0.sw
80
+ *
81
+ * @example
82
+ * ```js
83
+ * const embed = new SearchEmbed('#tsEmbed', {
84
+ * ... // other options
85
+ * hideDataSources:true,
86
+ * })
87
+ * ```
64
88
  */
65
89
  hideDataSources?: boolean;
66
90
  /**
67
91
  * Show or hide the charts and tables in search answers.
68
92
  * This attribute can be used to create a custom visualization
69
93
  * using raw answer data.
94
+ *
95
+ * @version: SDK: 1.2.0 | ThoughtSpot: 9.1.0.sw
96
+ *
97
+ * @example
98
+ * ```js
99
+ * const embed = new SearchEmbed('#tsEmbed', {
100
+ * ... // other options
101
+ * hideResults:true,
102
+ * })
103
+ * ```
70
104
  */
71
105
  hideResults?: boolean;
72
106
  /**
73
107
  * If set to true, the Search Assist feature is enabled.
74
108
  *
75
109
  * @version SDK: 1.13.0 | ThoughtSpot: 8.5.0.cl, 8.8.1-sw
110
+ *
111
+ * @example
112
+ * ```js
113
+ * const embed = new SearchEmbed('#tsEmbed', {
114
+ * ... // other options
115
+ * enableSearchAssist:true,
116
+ * })
117
+ * ```
76
118
  */
77
119
  enableSearchAssist?: boolean;
78
120
  /**
79
121
  * If set to true, the tabular view is set as the default
80
122
  * format for presenting search data.
123
+ *
124
+ * @version: SDK: 1.1.0 | ThoughtSpot: 8.1.0.sw
125
+ *
126
+ * @example
127
+ * ```js
128
+ * const embed = new SearchEmbed('#tsEmbed', {
129
+ * ... // other options
130
+ * forceTable:true,
131
+ * })
81
132
  */
82
133
  forceTable?: boolean;
83
134
  /**
@@ -85,12 +136,28 @@ export interface SearchViewConfig
85
136
  * Only a single data source is supported currently.
86
137
  *
87
138
  * @deprecated Use `dataSource` instead.
139
+ *
140
+ * @example
141
+ * ```js
142
+ * const embed = new SearchEmbed('#tsEmbed', {
143
+ * ... // other options
144
+ * dataSources:['id-234','id-456'],
145
+ * })
146
+ * ```
88
147
  */
89
148
  dataSources?: string[];
90
149
  /**
91
150
  * The array of data source GUIDs to set on load.
92
151
  *
93
152
  * @version: SDK: 1.19.0
153
+ *
154
+ * @example
155
+ * ```js
156
+ * const embed = new SearchEmbed('#tsEmbed', {
157
+ * ... // other options
158
+ * dataSource:'id-234',
159
+ * })
160
+ * ```
94
161
  */
95
162
  dataSource?: string;
96
163
  /**
@@ -123,6 +190,16 @@ export interface SearchViewConfig
123
190
  searchOptions?: SearchOptions;
124
191
  /**
125
192
  * The GUID of a saved answer to load initially.
193
+ *
194
+ * @version: SDK: 1.1.0 | ThoughtSpot: 8.1.0.sw
195
+ *
196
+ * @example
197
+ * ```js
198
+ * const embed = new SearchEmbed('#tsEmbed', {
199
+ * ... // other options
200
+ * answerId:'sed-1234',
201
+ * })
202
+ * ```
126
203
  */
127
204
  answerId?: string;
128
205
  /**
@@ -130,6 +207,14 @@ export interface SearchViewConfig
130
207
  * The chart/table should still be visible.
131
208
  *
132
209
  * @version SDK: 1.21.0 | ThoughtSpot: 9.2.0.cl, 9.5.0.sw
210
+ *
211
+ * @example
212
+ * ```js
213
+ * const embed = new SearchEmbed('#tsEmbed', {
214
+ * ... // other options
215
+ * hideSearchBar:true,
216
+ * })
217
+ * ```
133
218
  */
134
219
  hideSearchBar?: boolean;
135
220
  /**
@@ -137,6 +222,14 @@ export interface SearchViewConfig
137
222
  *
138
223
  * @default false
139
224
  * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
225
+ *
226
+ * @example
227
+ * ```js
228
+ * const embed = new SearchEmbed('#tsEmbed', {
229
+ * ... // other options
230
+ * dataPanelV2:false,
231
+ * })
232
+ * ```
140
233
  */
141
234
  dataPanelV2?: boolean;
142
235
  /**
@@ -196,7 +289,7 @@ export class SearchEmbed extends TsEmbed {
196
289
  runtimeFilters,
197
290
  dataSource,
198
291
  dataSources,
199
- excludeRuntimeFiltersfromURL,
292
+ excludeRuntimeFiltersfromURL = true,
200
293
  hideSearchBar,
201
294
  dataPanelV2 = false,
202
295
  useLastSelectedSources = false,
@@ -281,18 +374,18 @@ export class SearchEmbed extends TsEmbed {
281
374
  /**
282
375
  * Render the embedded ThoughtSpot search
283
376
  */
284
- public render(): SearchEmbed {
377
+ public async render(): Promise<SearchEmbed> {
285
378
  super.render();
286
379
  const { answerId } = this.viewConfig;
287
380
 
288
381
  const src = this.getIFrameSrc();
289
- this.renderIFrame(src);
382
+ await this.renderIFrame(src);
290
383
  getAuthPromise().then(() => {
291
384
  if (
292
385
  checkReleaseVersionInBeta(
293
386
  getReleaseVersion(),
294
387
  getEmbedConfig().suppressSearchEmbedBetaWarning
295
- || getEmbedConfig().suppressErrorAlerts,
388
+ || getEmbedConfig().suppressErrorAlerts,
296
389
  )
297
390
  ) {
298
391
  alert(ERROR_MESSAGE.SEARCHEMBED_BETA_WRANING_MESSAGE);
@@ -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
+ });
@@ -11,7 +11,7 @@ import {
11
11
  LiveboardEmbed,
12
12
  } from '../index';
13
13
  import {
14
- Action, HomeLeftNavItem, RuntimeFilter, RuntimeFilterOp, HomepageModule,
14
+ Action, HomeLeftNavItem, RuntimeFilter, RuntimeFilterOp, HomepageModule, HostEvent,
15
15
  } from '../types';
16
16
  import {
17
17
  executeAfterWait,
@@ -24,6 +24,7 @@ import {
24
24
  waitFor,
25
25
  expectUrlMatchesWithParams,
26
26
  mockMessageChannel,
27
+ createRootEleForEmbed,
27
28
  } from '../test/test-utils';
28
29
  import * as config from '../config';
29
30
  import * as tsEmbedInstance from './ts-embed';
@@ -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,8 @@ 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, HomeLeftNavItem.MonitorSubscription],
390
423
  hiddenHomepageModules: [],
391
424
  reorderedHomepageModules: [],
392
425
  },
@@ -1176,7 +1209,7 @@ describe('Unit test case for ts embed', () => {
1176
1209
  expectUrlMatchesWithParams(
1177
1210
  getIFrameSrc(),
1178
1211
  `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
1179
- + `&foo=bar&baz=1&bool=true${defaultParamsPost}#/home`,
1212
+ + `&foo=bar&baz=1&bool=true${defaultParamsPost}#/home`,
1180
1213
  );
1181
1214
  });
1182
1215
 
@@ -1192,7 +1225,7 @@ describe('Unit test case for ts embed', () => {
1192
1225
  expectUrlMatchesWithParams(
1193
1226
  getIFrameSrc(),
1194
1227
  `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
1195
- + `&showAlerts=true${defaultParamsPost}#/home`,
1228
+ + `&showAlerts=true${defaultParamsPost}#/home`,
1196
1229
  );
1197
1230
  });
1198
1231
  it('Sets the locale param', async () => {
@@ -1207,7 +1240,7 @@ describe('Unit test case for ts embed', () => {
1207
1240
  expectUrlMatchesWithParams(
1208
1241
  getIFrameSrc(),
1209
1242
  `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
1210
- + `&locale=ja-JP${defaultParamsPost}#/home`,
1243
+ + `&locale=ja-JP${defaultParamsPost}#/home`,
1211
1244
  );
1212
1245
  });
1213
1246
  it('Sets the iconSprite url', async () => {
@@ -1224,7 +1257,7 @@ describe('Unit test case for ts embed', () => {
1224
1257
  expectUrlMatchesWithParams(
1225
1258
  getIFrameSrc(),
1226
1259
  `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}`
1227
- + `&iconSprite=iconSprite.com${defaultParamsPost}#/home`,
1260
+ + `&iconSprite=iconSprite.com${defaultParamsPost}#/home`,
1228
1261
  );
1229
1262
  });
1230
1263
 
@@ -170,7 +170,7 @@ export class TsEmbed {
170
170
  this.thoughtSpotV2Base = getV2BasePath(this.embedConfig);
171
171
  this.eventHandlerMap = new Map();
172
172
  this.isError = false;
173
- this.viewConfig = viewConfig;
173
+ this.viewConfig = { excludeRuntimeFiltersfromURL: true, ...viewConfig };
174
174
  this.shouldEncodeUrlQueryParams = this.embedConfig.shouldEncodeUrlQueryParams;
175
175
  this.registerAppInit();
176
176
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
@@ -518,10 +518,7 @@ export class TsEmbed {
518
518
  const queryParams = this.shouldEncodeUrlQueryParams
519
519
  ? `?base64UrlEncodedFlags=${getEncodedQueryParamsString(queryString)}`
520
520
  : `?${queryString}`;
521
- let host = this.thoughtSpotHost;
522
- if (!isUndefined(this.embedConfig.enableReactShell)) {
523
- host = this.embedConfig.enableReactShell as boolean ? '/v2' : '/v1';
524
- }
521
+ const host = this.thoughtSpotHost;
525
522
  const path = `${host}/${queryParams}#`;
526
523
  return path;
527
524
  }
@@ -968,6 +965,16 @@ export class TsEmbed {
968
965
  */
969
966
  public trigger(messageType: HostEvent, data: any = {}): Promise<any> {
970
967
  uploadMixpanelEvent(`${MIXPANEL_EVENT.VISUAL_SDK_TRIGGER}-${messageType}`);
968
+
969
+ if (!this.isRendered) {
970
+ this.handleError('Please call render before triggering events');
971
+ return null;
972
+ }
973
+
974
+ if (!messageType) {
975
+ this.handleError('Host event type is undefined');
976
+ return null;
977
+ }
971
978
  return processTrigger(this.iFrame, messageType, this.thoughtSpotHost, data);
972
979
  }
973
980
 
@@ -978,7 +985,7 @@ export class TsEmbed {
978
985
  *
979
986
  * @param args
980
987
  */
981
- public render(): TsEmbed {
988
+ public async render(): Promise<TsEmbed> {
982
989
  this.isRendered = true;
983
990
 
984
991
  return this;
@@ -1090,11 +1097,11 @@ export class TsEmbed {
1090
1097
  ) {
1091
1098
  logger.warn(
1092
1099
  `${viewConfig.embedComponentType || 'Component'} was pre-rendered with `
1093
- + `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
1094
- + `but a different value "${JSON.stringify(viewConfig[key])}" `
1095
- + 'was passed to the Embed component. '
1096
- + 'The new value provided is ignored, the value provided during '
1097
- + 'preRender is used.',
1100
+ + `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
1101
+ + `but a different value "${JSON.stringify(viewConfig[key])}" `
1102
+ + 'was passed to the Embed component. '
1103
+ + 'The new value provided is ignored, the value provided during '
1104
+ + 'preRender is used.',
1098
1105
  );
1099
1106
  }
1100
1107
  });
@@ -1164,8 +1171,8 @@ export class TsEmbed {
1164
1171
  const elBoundingClient = this.el.getBoundingClientRect();
1165
1172
 
1166
1173
  setStyleProperties(this.preRenderWrapper, {
1167
- top: `${elBoundingClient.y}px`,
1168
- left: `${elBoundingClient.x}px`,
1174
+ top: `${elBoundingClient.y + window.scrollY}px`,
1175
+ left: `${elBoundingClient.x + window.scrollX}px`,
1169
1176
  width: `${elBoundingClient.width}px`,
1170
1177
  height: `${elBoundingClient.height}px`,
1171
1178
  });
@@ -1186,8 +1193,6 @@ export class TsEmbed {
1186
1193
  pointerEvents: 'none',
1187
1194
  zIndex: '-1000',
1188
1195
  position: 'absolute ',
1189
- top: '0',
1190
- left: '0',
1191
1196
  };
1192
1197
  setStyleProperties(this.preRenderWrapper, preRenderHideStyles);
1193
1198
 
@@ -1238,7 +1243,7 @@ export class V1Embed extends TsEmbed {
1238
1243
 
1239
1244
  constructor(domSelector: DOMSelector, viewConfig: ViewConfig) {
1240
1245
  super(domSelector, viewConfig);
1241
- this.viewConfig = viewConfig;
1246
+ this.viewConfig = { excludeRuntimeFiltersfromURL: true, ...viewConfig };
1242
1247
  }
1243
1248
 
1244
1249
  /**
package/src/index.ts CHANGED
@@ -54,6 +54,7 @@ import { SageEmbed, SageViewConfig } from './embed/sage';
54
54
  import { AnswerService, SessionInterface, UnderlyingDataPoint } from './utils/graphql/answerService/answerService';
55
55
  import { getEmbedConfig } from './embed/embedConfig';
56
56
  import { uploadMixpanelEvent, MIXPANEL_EVENT } from './mixpanel-service';
57
+ import { tokenizedFetch } from './tokenizedFetch';
57
58
 
58
59
  export {
59
60
  init,
@@ -65,6 +66,7 @@ export {
65
66
  exportTMLInput,
66
67
  getEmbedConfig as getInitConfig,
67
68
  getSessionInfo,
69
+ tokenizedFetch,
68
70
  SearchEmbed,
69
71
  SearchBarEmbed,
70
72
  PinboardEmbed,
@@ -113,3 +115,5 @@ export {
113
115
  VizPoint,
114
116
  CustomActionPayload,
115
117
  };
118
+
119
+ export { resetCachedAuthToken } from './authToken';
@@ -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) {