@thoughtspot/visual-embed-sdk 1.23.1 → 1.23.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 (141) hide show
  1. package/README.md +1 -1
  2. package/cjs/package.json +8 -7
  3. package/cjs/src/auth.d.ts.map +1 -1
  4. package/cjs/src/auth.js +4 -3
  5. package/cjs/src/auth.js.map +1 -1
  6. package/cjs/src/embed/app.d.ts +8 -0
  7. package/cjs/src/embed/app.d.ts.map +1 -1
  8. package/cjs/src/embed/app.js +2 -1
  9. package/cjs/src/embed/app.js.map +1 -1
  10. package/cjs/src/embed/app.spec.js +10 -0
  11. package/cjs/src/embed/app.spec.js.map +1 -1
  12. package/cjs/src/embed/base.d.ts +2 -0
  13. package/cjs/src/embed/base.d.ts.map +1 -1
  14. package/cjs/src/embed/base.js +4 -2
  15. package/cjs/src/embed/base.js.map +1 -1
  16. package/cjs/src/embed/sage.d.ts +25 -2
  17. package/cjs/src/embed/sage.d.ts.map +1 -1
  18. package/cjs/src/embed/sage.js +10 -5
  19. package/cjs/src/embed/sage.js.map +1 -1
  20. package/cjs/src/embed/sage.spec.js +26 -0
  21. package/cjs/src/embed/sage.spec.js.map +1 -1
  22. package/cjs/src/embed/search-bar.d.ts +1 -1
  23. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  24. package/cjs/src/embed/search.d.ts +8 -0
  25. package/cjs/src/embed/search.d.ts.map +1 -1
  26. package/cjs/src/embed/search.js +2 -1
  27. package/cjs/src/embed/search.js.map +1 -1
  28. package/cjs/src/embed/search.spec.js +11 -1
  29. package/cjs/src/embed/search.spec.js.map +1 -1
  30. package/cjs/src/embed/ts-embed.d.ts +3 -1
  31. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  32. package/cjs/src/embed/ts-embed.js +11 -4
  33. package/cjs/src/embed/ts-embed.js.map +1 -1
  34. package/cjs/src/mixpanel-service.d.ts +1 -0
  35. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  36. package/cjs/src/mixpanel-service.js +10 -3
  37. package/cjs/src/mixpanel-service.js.map +1 -1
  38. package/cjs/src/mixpanel-service.spec.js +12 -3
  39. package/cjs/src/mixpanel-service.spec.js.map +1 -1
  40. package/cjs/src/react/index.d.ts +14 -14
  41. package/cjs/src/react/index.d.ts.map +1 -1
  42. package/cjs/src/react/index.js +4 -2
  43. package/cjs/src/react/index.js.map +1 -1
  44. package/cjs/src/react/index.spec.js +1 -1
  45. package/cjs/src/react/index.spec.js.map +1 -1
  46. package/cjs/src/types.d.ts +18 -3
  47. package/cjs/src/types.d.ts.map +1 -1
  48. package/cjs/src/types.js +17 -2
  49. package/cjs/src/types.js.map +1 -1
  50. package/dist/src/auth.d.ts.map +1 -1
  51. package/dist/src/embed/app.d.ts +8 -0
  52. package/dist/src/embed/app.d.ts.map +1 -1
  53. package/dist/src/embed/base.d.ts +2 -0
  54. package/dist/src/embed/base.d.ts.map +1 -1
  55. package/dist/src/embed/sage.d.ts +25 -2
  56. package/dist/src/embed/sage.d.ts.map +1 -1
  57. package/dist/src/embed/search-bar.d.ts +1 -1
  58. package/dist/src/embed/search-bar.d.ts.map +1 -1
  59. package/dist/src/embed/search.d.ts +8 -0
  60. package/dist/src/embed/search.d.ts.map +1 -1
  61. package/dist/src/embed/ts-embed.d.ts +3 -1
  62. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  63. package/dist/src/mixpanel-service.d.ts +1 -0
  64. package/dist/src/mixpanel-service.d.ts.map +1 -1
  65. package/dist/src/react/index.d.ts +14 -14
  66. package/dist/src/react/index.d.ts.map +1 -1
  67. package/dist/src/types.d.ts +18 -3
  68. package/dist/src/types.d.ts.map +1 -1
  69. package/dist/tsembed-react.es.js +143 -17301
  70. package/dist/tsembed-react.js +143 -17301
  71. package/dist/tsembed.es.js +156 -17314
  72. package/dist/tsembed.js +156 -17314
  73. package/dist/visual-embed-sdk-react-full.d.ts +300 -241
  74. package/dist/visual-embed-sdk-react.d.ts +300 -241
  75. package/dist/visual-embed-sdk.d.ts +65 -7
  76. package/lib/package.json +8 -7
  77. package/lib/src/.index.d.ts.swp +0 -0
  78. package/lib/src/auth.d.ts.map +1 -1
  79. package/lib/src/auth.js +4 -2
  80. package/lib/src/auth.js.map +1 -1
  81. package/lib/src/embed/app.d.ts +8 -0
  82. package/lib/src/embed/app.d.ts.map +1 -1
  83. package/lib/src/embed/app.js +2 -1
  84. package/lib/src/embed/app.js.map +1 -1
  85. package/lib/src/embed/app.spec.js +10 -0
  86. package/lib/src/embed/app.spec.js.map +1 -1
  87. package/lib/src/embed/base.d.ts +2 -0
  88. package/lib/src/embed/base.d.ts.map +1 -1
  89. package/lib/src/embed/base.js +4 -2
  90. package/lib/src/embed/base.js.map +1 -1
  91. package/lib/src/embed/sage.d.ts +25 -2
  92. package/lib/src/embed/sage.d.ts.map +1 -1
  93. package/lib/src/embed/sage.js +10 -5
  94. package/lib/src/embed/sage.js.map +1 -1
  95. package/lib/src/embed/sage.spec.js +26 -0
  96. package/lib/src/embed/sage.spec.js.map +1 -1
  97. package/lib/src/embed/search-bar.d.ts +1 -1
  98. package/lib/src/embed/search-bar.d.ts.map +1 -1
  99. package/lib/src/embed/search.d.ts +8 -0
  100. package/lib/src/embed/search.d.ts.map +1 -1
  101. package/lib/src/embed/search.js +2 -1
  102. package/lib/src/embed/search.js.map +1 -1
  103. package/lib/src/embed/search.spec.js +11 -1
  104. package/lib/src/embed/search.spec.js.map +1 -1
  105. package/lib/src/embed/ts-embed.d.ts +3 -1
  106. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  107. package/lib/src/embed/ts-embed.js +11 -4
  108. package/lib/src/embed/ts-embed.js.map +1 -1
  109. package/lib/src/mixpanel-service.d.ts +1 -0
  110. package/lib/src/mixpanel-service.d.ts.map +1 -1
  111. package/lib/src/mixpanel-service.js +10 -3
  112. package/lib/src/mixpanel-service.js.map +1 -1
  113. package/lib/src/mixpanel-service.spec.js +12 -3
  114. package/lib/src/mixpanel-service.spec.js.map +1 -1
  115. package/lib/src/react/index.d.ts +14 -14
  116. package/lib/src/react/index.d.ts.map +1 -1
  117. package/lib/src/react/index.js +4 -2
  118. package/lib/src/react/index.js.map +1 -1
  119. package/lib/src/react/index.spec.js +2 -2
  120. package/lib/src/react/index.spec.js.map +1 -1
  121. package/lib/src/types.d.ts +18 -3
  122. package/lib/src/types.d.ts.map +1 -1
  123. package/lib/src/types.js +17 -2
  124. package/lib/src/types.js.map +1 -1
  125. package/lib/src/visual-embed-sdk.d.ts +65 -7
  126. package/package.json +8 -7
  127. package/src/auth.ts +7 -5
  128. package/src/embed/app.spec.ts +15 -0
  129. package/src/embed/app.ts +10 -0
  130. package/src/embed/base.ts +7 -5
  131. package/src/embed/sage.spec.ts +32 -0
  132. package/src/embed/sage.ts +38 -5
  133. package/src/embed/search-bar.tsx +1 -1
  134. package/src/embed/search.spec.ts +15 -1
  135. package/src/embed/search.ts +10 -0
  136. package/src/embed/ts-embed.ts +15 -3
  137. package/src/mixpanel-service.spec.ts +12 -3
  138. package/src/mixpanel-service.ts +10 -3
  139. package/src/react/index.spec.tsx +5 -3
  140. package/src/react/index.tsx +35 -26
  141. package/src/types.ts +17 -2
@@ -41,4 +41,36 @@ describe('Sage embed tests', () => {
41
41
  );
42
42
  });
43
43
  });
44
+ test('embed url include pre-seed dataSource and query', async () => {
45
+ const sageEmbed = new SageEmbed(getRootEl(), {
46
+ ...defaultConfig,
47
+ dataSource: 'worksheet-id',
48
+ searchOptions: {
49
+ searchQuery: 'test-query',
50
+ },
51
+ });
52
+ sageEmbed.render();
53
+ await executeAfterWait(() => {
54
+ expectUrlMatch(
55
+ getIFrameSrc(),
56
+ `http://${thoughtSpotHost}/?embedApp=true&hideEurekaResults=false&isSageEmbed=true&disableWorksheetChange=false&hideWorksheetSelector=true&hideEurekaSuggestions=true&hideAction=%5B"reportError","save","pin","editACopy","saveAsView","updateTSL","editTSL","onDeleteAnswer","share"%5D#/embed/eureka?worksheet=worksheet-id&query=test-query`,
57
+ );
58
+ });
59
+ });
60
+ test('embed url include pre-seed execute flag with query', async () => {
61
+ const sageEmbed = new SageEmbed(getRootEl(), {
62
+ ...defaultConfig,
63
+ searchOptions: {
64
+ searchQuery: 'test-query',
65
+ executeSearch: true,
66
+ },
67
+ });
68
+ sageEmbed.render();
69
+ await executeAfterWait(() => {
70
+ expectUrlMatch(
71
+ getIFrameSrc(),
72
+ `http://${thoughtSpotHost}/?embedApp=true&hideEurekaResults=false&isSageEmbed=true&disableWorksheetChange=false&hideWorksheetSelector=true&hideEurekaSuggestions=true&hideAction=%5B"reportError","save","pin","editACopy","saveAsView","updateTSL","editTSL","onDeleteAnswer","share"%5D#/embed/eureka?query=test-query&executeSearch=true`,
73
+ );
74
+ });
75
+ });
44
76
  });
package/src/embed/sage.ts CHANGED
@@ -13,6 +13,23 @@ import {
13
13
  import { getQueryParamString } from '../utils';
14
14
  import { V1Embed } from './ts-embed';
15
15
 
16
+ /**
17
+ * Configuration for search options
18
+ */
19
+ export interface SearchOptions {
20
+ /**
21
+ * The tml string to load the answer
22
+ */
23
+ searchQuery: string;
24
+ /**
25
+ * Boolean to determine if the search should be executed or not.
26
+ * if it is executed, put the focus on the results.
27
+ * if it’s not executed, put the focus in the search bar - at the end of
28
+ * the tokens
29
+ */
30
+ executeSearch?: boolean;
31
+ }
32
+
16
33
  /**
17
34
  * The configuration attributes for the embedded Natural language search view. Based on
18
35
  * GPT and LLM.
@@ -22,7 +39,9 @@ import { V1Embed } from './ts-embed';
22
39
  */
23
40
  export interface SageViewConfig extends ViewConfig {
24
41
  /**
25
- * If set to true, object results are shown.
42
+ * If set to true, a list of liveboard and answers related
43
+ * to the natural language search will be shown below the
44
+ * AI generated answer.
26
45
  */
27
46
  showObjectResults?: boolean;
28
47
  /**
@@ -34,7 +53,8 @@ export interface SageViewConfig extends ViewConfig {
34
53
  */
35
54
  hideWorksheetSelector?: boolean,
36
55
  /**
37
- * If set to true, the object search suggestions are not shown
56
+ * If set to true, the search suggestions will contain existing
57
+ * liveboards and answers in addition with the autocomplete
38
58
  *
39
59
  */
40
60
  showObjectSuggestions?: boolean;
@@ -51,6 +71,11 @@ export interface SageViewConfig extends ViewConfig {
51
71
  * The data source GUID to set on load.
52
72
  */
53
73
  dataSource?: string;
74
+ /**
75
+ * Configuration for search options
76
+ */
77
+ searchOptions?: SearchOptions;
78
+
54
79
  }
55
80
  export const HiddenActionItemByDefaultForSageEmbed = [
56
81
  Action.Save,
@@ -102,7 +127,7 @@ export class SageEmbed extends V1Embed {
102
127
  params[Param.DisableWorksheetChange] = !!disableWorksheetChange;
103
128
  params[Param.HideWorksheetSelector] = !!hideWorksheetSelector;
104
129
  params[Param.HideEurekaSuggestions] = !showObjectSuggestions;
105
- params[Param.HideSampleQuestions] = !hideSampleQuestions;
130
+ params[Param.HideSampleQuestions] = !!hideSampleQuestions;
106
131
  params[Param.HideActions] = [
107
132
  ...(params[Param.HideActions] ?? []),
108
133
  ...HiddenActionItemByDefaultForSageEmbed,
@@ -121,9 +146,17 @@ export class SageEmbed extends V1Embed {
121
146
  const path = 'eureka';
122
147
  const postHashObj = {};
123
148
  const tsPostHashParams = this.getThoughtSpotPostUrlParams();
149
+ const {
150
+ dataSource, searchOptions,
151
+ } = this.viewConfig;
124
152
 
125
- if (this.viewConfig.searchQuery) postHashObj[Param.Query] = this.viewConfig.searchQuery;
126
- if (this.viewConfig.dataSource) postHashObj[Param.WorksheetId] = this.viewConfig.dataSource;
153
+ if (dataSource) postHashObj[Param.WorksheetId] = dataSource;
154
+ if (searchOptions?.searchQuery) {
155
+ postHashObj[Param.Query] = searchOptions?.searchQuery;
156
+ if (searchOptions.executeSearch) {
157
+ postHashObj[Param.executeSearch] = true;
158
+ }
159
+ }
127
160
  let sagePostHashParams = new URLSearchParams(postHashObj).toString();
128
161
  if (sagePostHashParams) sagePostHashParams = `${tsPostHashParams ? '&' : '?'}${sagePostHashParams}`;
129
162
 
@@ -8,7 +8,7 @@ import { SearchOptions } from './search';
8
8
  /**
9
9
  * @group Embed components
10
10
  */
11
- export interface SearchBarViewConfig extends Omit<ViewConfig, 'runtimeFilters' | 'showAlerts'> {
11
+ export interface SearchBarViewConfig extends Omit<ViewConfig, 'runtimeFilters' | 'showAlerts' | 'dataPanelV2'> {
12
12
  /**
13
13
  * The array of data source GUIDs to set on load.
14
14
  * Only a single dataSource supported currently.
@@ -47,7 +47,7 @@ describe('Search embed tests', () => {
47
47
  await executeAfterWait(() => {
48
48
  expectUrlMatchesWithParams(
49
49
  getIFrameSrc(),
50
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&useLastSelectedSources=false${prefixParams}#/embed/answer`,
50
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&enableDataPanelV2=false&dataSourceMode=expand&useLastSelectedSources=false${prefixParams}#/embed/answer`,
51
51
  );
52
52
  });
53
53
  });
@@ -336,4 +336,18 @@ describe('Search embed tests', () => {
336
336
  );
337
337
  });
338
338
  });
339
+
340
+ test('should set enableDataPanelV2 to true if data panel v2 flag is true', async () => {
341
+ const searchEmbed = new SearchEmbed(getRootEl(), {
342
+ ...defaultViewConfig,
343
+ dataPanelV2: true,
344
+ });
345
+ searchEmbed.render();
346
+ await executeAfterWait(() => {
347
+ expectUrlMatchesWithParams(
348
+ getIFrameSrc(),
349
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=true&useLastSelectedSources=false${prefixParams}#/embed/saved-answer/${answerId}`,
350
+ );
351
+ });
352
+ });
339
353
  });
@@ -109,6 +109,14 @@ export interface SearchViewConfig extends ViewConfig {
109
109
  * @version SDK: 1.21.0 | ThoughtSpot: 9.2.0.cl
110
110
  */
111
111
  hideSearchBar?: boolean;
112
+ /**
113
+ * Flag to control Data panel experience
114
+ *
115
+ * @default false
116
+ * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
117
+ * @hidden
118
+ */
119
+ dataPanelV2?: boolean;
112
120
  }
113
121
 
114
122
  export const HiddenActionItemByDefaultForSearchEmbed = [
@@ -162,6 +170,7 @@ export class SearchEmbed extends TsEmbed {
162
170
  dataSource,
163
171
  dataSources,
164
172
  excludeRuntimeFiltersfromURL,
173
+ dataPanelV2 = false,
165
174
  } = this.viewConfig;
166
175
  const queryParams = this.getBaseQueryParams();
167
176
 
@@ -195,6 +204,7 @@ export class SearchEmbed extends TsEmbed {
195
204
  queryParams[Param.ForceTable] = true;
196
205
  }
197
206
 
207
+ queryParams[Param.DataPanelV2Enabled] = dataPanelV2;
198
208
  queryParams[Param.DataSourceMode] = this.getDataSourceMode();
199
209
  queryParams[Param.UseLastSelectedDataSource] = false;
200
210
  queryParams[Param.searchEmbed] = true;
@@ -156,6 +156,9 @@ export class TsEmbed {
156
156
  this.viewConfig = viewConfig;
157
157
  this.shouldEncodeUrlQueryParams = this.embedConfig.shouldEncodeUrlQueryParams;
158
158
  this.registerAppInit();
159
+ uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
160
+ ...viewConfig,
161
+ });
159
162
  }
160
163
 
161
164
  /**
@@ -299,8 +302,12 @@ export class TsEmbed {
299
302
  * Register APP_INIT event and sendback init payload
300
303
  */
301
304
  private registerAppInit = () => {
302
- this.on(EmbedEvent.APP_INIT, this.appInitCb);
303
- this.on(EmbedEvent.AuthExpire, this.updateAuthToken);
305
+ this.on(
306
+ EmbedEvent.APP_INIT, this.appInitCb, { start: false }, true,
307
+ );
308
+ this.on(
309
+ EmbedEvent.AuthExpire, this.updateAuthToken, { start: false }, true,
310
+ );
304
311
  };
305
312
 
306
313
  /**
@@ -711,6 +718,8 @@ export class TsEmbed {
711
718
  * @param messageType The message type
712
719
  * @param callback A callback as a function
713
720
  * @param options The message options
721
+ * @param isSelf
722
+ * @param isRegisteredBySDK
714
723
  * @example
715
724
  * ```js
716
725
  * tsEmbed.on(EmbedEvent.Error, (data) => {
@@ -730,7 +739,11 @@ export class TsEmbed {
730
739
  messageType: EmbedEvent,
731
740
  callback: MessageCallback,
732
741
  options: MessageOptions = { start: false },
742
+ isRegisteredBySDK = false,
733
743
  ): typeof TsEmbed.prototype {
744
+ uploadMixpanelEvent(`${MIXPANEL_EVENT.VISUAL_SDK_ON}-${messageType}`, {
745
+ isRegisteredBySDK,
746
+ });
734
747
  if (this.isRendered) {
735
748
  this.handleError('Please register event handlers before calling render');
736
749
  }
@@ -929,7 +942,6 @@ export class V1Embed extends TsEmbed {
929
942
  options: MessageOptions = { start: false },
930
943
  ): typeof TsEmbed.prototype {
931
944
  const eventType = this.getCompatibleEventType(messageType);
932
- uploadMixpanelEvent(`${MIXPANEL_EVENT.VISUAL_SDK_ON}-${messageType}`);
933
945
  return super.on(eventType, callback, options);
934
946
  }
935
947
  }
@@ -14,9 +14,10 @@ const config = {
14
14
 
15
15
  jest.mock('mixpanel-browser', () => ({
16
16
  __esModule: true,
17
- init: jest.fn(),
17
+ init: jest.fn().mockReturnThis(),
18
18
  identify: jest.fn(),
19
19
  track: jest.fn(),
20
+ register_once: jest.fn(),
20
21
  }));
21
22
 
22
23
  describe('Unit test for mixpanel', () => {
@@ -30,7 +31,7 @@ describe('Unit test for mixpanel', () => {
30
31
  isPublicUser: false,
31
32
  };
32
33
  initMixpanel(sessionInfo);
33
- expect(mixpanel.init).toHaveBeenCalledWith(sessionInfo.mixpanelToken);
34
+ expect(mixpanel.init).toHaveBeenCalledWith(sessionInfo.mixpanelToken, undefined, 'tsEmbed');
34
35
  expect(mixpanel.identify).toHaveBeenCalledWith(sessionInfo.userGUID);
35
36
 
36
37
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_CALLED_INIT, {
@@ -45,10 +46,18 @@ describe('Unit test for mixpanel', () => {
45
46
  mixpanelToken: 'newToken',
46
47
  isPublicUser: true,
47
48
  userGUID: 'newUser',
49
+ clusterId: 'newClusterId',
50
+ clusterName: 'newClusterName',
51
+ releaseVersion: 'newReleaseVersion',
48
52
  };
49
53
  initMixpanel(sessionInfo);
50
54
 
51
- expect(mixpanel.init).toHaveBeenCalledWith(sessionInfo.mixpanelToken);
55
+ expect(mixpanel.init).toHaveBeenCalledWith(sessionInfo.mixpanelToken, undefined, 'tsEmbed');
56
+ expect(mixpanel.register_once).toHaveBeenCalledWith({
57
+ clusterId: sessionInfo.clusterId,
58
+ clusterName: sessionInfo.clusterName,
59
+ releaseVersion: sessionInfo.releaseVersion,
60
+ });
52
61
  expect(mixpanel.identify).not.toHaveBeenCalledWith(sessionInfo.userGUID);
53
62
  });
54
63
 
@@ -6,6 +6,7 @@ export const EndPoints = {
6
6
 
7
7
  // Needed to avoid error in CJS builds on some bundlers.
8
8
  const mixpanelLib = mixpanel.default || mixpanel;
9
+ let mixpanelInstance: mixpanel.Mixpanel;
9
10
 
10
11
  export const MIXPANEL_EVENT = {
11
12
  VISUAL_SDK_RENDER_START: 'visual-sdk-render-start',
@@ -15,6 +16,7 @@ export const MIXPANEL_EVENT = {
15
16
  VISUAL_SDK_TRIGGER: 'visual-sdk-trigger',
16
17
  VISUAL_SDK_ON: 'visual-sdk-on',
17
18
  VISUAL_SDK_IFRAME_LOAD_PERFORMANCE: 'visual-sdk-iframe-load-performance',
19
+ VISUAL_SDK_EMBED_CREATE: 'visual-sdk-embed-create',
18
20
  };
19
21
 
20
22
  let isMixpanelInitialized = false;
@@ -31,7 +33,7 @@ export function uploadMixpanelEvent(eventId: string, eventProps = {}): void {
31
33
  eventQueue.push({ eventId, eventProps });
32
34
  return;
33
35
  }
34
- mixpanelLib.track(eventId, eventProps);
36
+ mixpanelInstance.track(eventId, eventProps);
35
37
  }
36
38
 
37
39
  /**
@@ -61,10 +63,15 @@ export function initMixpanel(sessionInfo: any): void {
61
63
  const token = sessionInfo.mixpanelToken;
62
64
  try {
63
65
  if (token) {
64
- mixpanelLib.init(token);
66
+ mixpanelInstance = mixpanelLib.init(token, undefined, 'tsEmbed');
65
67
  if (!isPublicCluster) {
66
- mixpanelLib.identify(sessionInfo.userGUID);
68
+ mixpanelInstance.identify(sessionInfo.userGUID);
67
69
  }
70
+ mixpanelInstance.register_once({
71
+ clusterId: sessionInfo.clusterId,
72
+ clusterName: sessionInfo.clusterName,
73
+ releaseVersion: sessionInfo.releaseVersion,
74
+ });
68
75
  isMixpanelInitialized = true;
69
76
  emptyQueue();
70
77
  }
@@ -18,7 +18,9 @@ import {
18
18
  SearchEmbed, AppEmbed, LiveboardEmbed, useEmbedRef, SearchBarEmbed,
19
19
  } from './index';
20
20
  import * as allExports from './index';
21
- import { AuthType, init } from '../index';
21
+ import {
22
+ AuthType, init,
23
+ } from '../index';
22
24
 
23
25
  import { version } from '../../package.json';
24
26
 
@@ -47,7 +49,7 @@ describe('React Components', () => {
47
49
  ),
48
50
  ).toBe(true);
49
51
  expect(getIFrameSrc(container)).toBe(
50
- `http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22,%22editACopy%22,%22saveAsView%22,%22updateTSL%22,%22editTSL%22,%22onDeleteAnswer%22]&dataSourceMode=hide&useLastSelectedSources=false&isSearchEmbed=true#/embed/answer`,
52
+ `http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22,%22editACopy%22,%22saveAsView%22,%22updateTSL%22,%22editTSL%22,%22onDeleteAnswer%22]&enableDataPanelV2=false&dataSourceMode=hide&useLastSelectedSources=false&isSearchEmbed=true#/embed/answer`,
51
53
  );
52
54
  });
53
55
 
@@ -85,7 +87,7 @@ describe('React Components', () => {
85
87
  it('Should be able to trigger events on the embed using refs', async () => {
86
88
  mockMessageChannel();
87
89
  const TestComponent = () => {
88
- const embedRef = useEmbedRef();
90
+ const embedRef = useEmbedRef<typeof LiveboardEmbed>();
89
91
  const onLiveboardRendered = () => {
90
92
  embedRef.current.trigger(HostEvent.SetVisibleVizs, ['viz1', 'viz2']);
91
93
  };
@@ -13,33 +13,33 @@ import { EmbedProps, getViewPropsAndListeners } from './util';
13
13
 
14
14
  const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V extends ViewConfig>(
15
15
  EmbedConstructor: T,
16
- ) => React.forwardRef<TsEmbed, U>(
17
- (props: U, forwardedRef: React.MutableRefObject<TsEmbed>) => {
16
+ ) => React.forwardRef<InstanceType<T>, U>(
17
+ (props: U, forwardedRef: React.MutableRefObject<InstanceType<T>>) => {
18
18
  const ref = React.useRef<HTMLDivElement>(null);
19
19
  const { className, ...embedProps } = props;
20
20
  const { viewConfig, listeners } = getViewPropsAndListeners<
21
- Omit<U, 'className'>,
22
- V
23
- >(embedProps);
21
+ Omit<U, 'className'>,
22
+ V
23
+ >(embedProps);
24
24
  useDeepCompareEffect(() => {
25
25
  const tsEmbed = new EmbedConstructor(
26
- ref!.current,
27
- deepMerge(
28
- {
29
- insertAsSibling: viewConfig.insertAsSibling,
30
- frameParams: {
31
- class: viewConfig.insertAsSibling
32
- ? className || ''
33
- : '',
34
- },
26
+ ref!.current,
27
+ deepMerge(
28
+ {
29
+ insertAsSibling: viewConfig.insertAsSibling,
30
+ frameParams: {
31
+ class: viewConfig.insertAsSibling
32
+ ? className || ''
33
+ : '',
35
34
  },
36
- viewConfig,
37
- ),
38
- );
35
+ },
36
+ viewConfig,
37
+ ),
38
+ ) as InstanceType<T>;
39
39
  Object.keys(listeners).forEach((eventName) => {
40
40
  tsEmbed.on(
41
- eventName as EmbedEvent,
42
- listeners[eventName as EmbedEvent],
41
+ eventName as EmbedEvent,
42
+ listeners[eventName as EmbedEvent],
43
43
  );
44
44
  });
45
45
  tsEmbed.render();
@@ -68,7 +68,7 @@ const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V exte
68
68
  },
69
69
  );
70
70
 
71
- interface SearchProps extends EmbedProps, SearchViewConfig {}
71
+ interface SearchProps extends EmbedProps, SearchViewConfig { }
72
72
 
73
73
  /**
74
74
  * React component for Search Embed.
@@ -87,7 +87,7 @@ export const SearchEmbed = componentFactory<typeof _SearchEmbed, SearchProps, Se
87
87
  _SearchEmbed,
88
88
  );
89
89
 
90
- interface AppProps extends EmbedProps, AppViewConfig {}
90
+ interface AppProps extends EmbedProps, AppViewConfig { }
91
91
 
92
92
  /**
93
93
  * React component for Full app Embed.
@@ -105,7 +105,7 @@ interface AppProps extends EmbedProps, AppViewConfig {}
105
105
  */
106
106
  export const AppEmbed = componentFactory<typeof _AppEmbed, AppProps, AppViewConfig>(_AppEmbed);
107
107
 
108
- interface LiveboardProps extends EmbedProps, LiveboardViewConfig {}
108
+ interface LiveboardProps extends EmbedProps, LiveboardViewConfig { }
109
109
 
110
110
  /**
111
111
  * React component for Liveboard embed.
@@ -130,7 +130,7 @@ export const LiveboardEmbed = componentFactory<
130
130
 
131
131
  export const PinboardEmbed = LiveboardEmbed;
132
132
 
133
- interface SearchBarEmbedProps extends EmbedProps, SearchBarViewConfig {}
133
+ interface SearchBarEmbedProps extends EmbedProps, SearchBarViewConfig { }
134
134
 
135
135
  /**
136
136
  * React component for Search bar embed.
@@ -151,7 +151,7 @@ export const SearchBarEmbed = componentFactory<
151
151
  SearchBarViewConfig
152
152
  >(_SearchBarEmbed);
153
153
 
154
- interface SageEmbedProps extends EmbedProps, SageViewConfig {}
154
+ interface SageEmbedProps extends EmbedProps, SageViewConfig { }
155
155
 
156
156
  /**
157
157
  * React component for LLM based search Sage embed.
@@ -172,6 +172,12 @@ export const SageEmbed = componentFactory<
172
172
  SageViewConfig
173
173
  >(_SageEmbed);
174
174
 
175
+ type EmbedComponent = typeof SearchEmbed
176
+ | typeof AppEmbed
177
+ | typeof LiveboardEmbed
178
+ | typeof SearchBarEmbed
179
+ | typeof SageEmbed;
180
+
175
181
  /**
176
182
  * Get a reference to the embed component to trigger events on the component.
177
183
  *
@@ -187,9 +193,12 @@ export const SageEmbed = componentFactory<
187
193
  * return <LiveboardEmbed ref={ref} liveboardId={<id>} />
188
194
  * }
189
195
  * ```
190
- * @returns {React.MutableRefObject<TsEmbed>} ref
196
+ * @returns {React.MutableRefObject<T extends TsEmbed>} ref
191
197
  */
192
- export const useEmbedRef = (): React.MutableRefObject<TsEmbed> => React.useRef<TsEmbed>(null);
198
+ export function useEmbedRef<T extends EmbedComponent>():
199
+ React.MutableRefObject<React.ComponentRef<T>> {
200
+ return React.useRef<React.ComponentRef<T>>(null);
201
+ }
193
202
 
194
203
  export {
195
204
  LiveboardViewConfig,
package/src/types.ts CHANGED
@@ -2037,6 +2037,20 @@ export enum HostEvent {
2037
2037
  * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
2038
2038
  */
2039
2039
  SetHiddenTabs = 'SetPinboardHiddenTabs',
2040
+ /**
2041
+ * Updates the search query for sage embed.
2042
+ *
2043
+ * @param - searchOptions: an object queryString and option to execute the query.
2044
+ * @example
2045
+ * ```js
2046
+ * sageEmbed.trigger(HostEvent.UpdateSageQuery, {
2047
+ * queryString: 'revenue per year',
2048
+ * executeSearch: true,
2049
+ * })
2050
+ * ```
2051
+ * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
2052
+ */
2053
+ UpdateSageQuery = 'updateSageQuery',
2040
2054
  }
2041
2055
 
2042
2056
  /**
@@ -2095,6 +2109,7 @@ export enum Param {
2095
2109
  DisableLoginRedirect = 'disableLoginRedirect',
2096
2110
  visibleVizs = 'pinboardVisibleVizs',
2097
2111
  LiveboardV2Enabled = 'isPinboardV2Enabled',
2112
+ DataPanelV2Enabled ='enableDataPanelV2',
2098
2113
  ShowAlerts = 'showAlerts',
2099
2114
  Locale = 'locale',
2100
2115
  CustomStyle = 'customStyle',
@@ -2123,8 +2138,8 @@ export enum Param {
2123
2138
  VisibleTabs = 'visibleTabs',
2124
2139
  HideTabPanel = 'hideTabPanel',
2125
2140
  HideSampleQuestions = 'hideSampleQuestions',
2126
- WorksheetId = 'worksheetId',
2127
- Query = 'query,'
2141
+ WorksheetId = 'worksheet',
2142
+ Query = 'query'
2128
2143
  }
2129
2144
 
2130
2145
  /**