@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.
- package/README.md +1 -1
- package/cjs/package.json +8 -7
- package/cjs/src/auth.d.ts.map +1 -1
- package/cjs/src/auth.js +4 -3
- package/cjs/src/auth.js.map +1 -1
- package/cjs/src/embed/app.d.ts +8 -0
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +2 -1
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +10 -0
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/base.d.ts +2 -0
- package/cjs/src/embed/base.d.ts.map +1 -1
- package/cjs/src/embed/base.js +4 -2
- package/cjs/src/embed/base.js.map +1 -1
- package/cjs/src/embed/sage.d.ts +25 -2
- package/cjs/src/embed/sage.d.ts.map +1 -1
- package/cjs/src/embed/sage.js +10 -5
- package/cjs/src/embed/sage.js.map +1 -1
- package/cjs/src/embed/sage.spec.js +26 -0
- package/cjs/src/embed/sage.spec.js.map +1 -1
- package/cjs/src/embed/search-bar.d.ts +1 -1
- package/cjs/src/embed/search-bar.d.ts.map +1 -1
- package/cjs/src/embed/search.d.ts +8 -0
- package/cjs/src/embed/search.d.ts.map +1 -1
- package/cjs/src/embed/search.js +2 -1
- package/cjs/src/embed/search.js.map +1 -1
- package/cjs/src/embed/search.spec.js +11 -1
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +3 -1
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +11 -4
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/mixpanel-service.d.ts +1 -0
- package/cjs/src/mixpanel-service.d.ts.map +1 -1
- package/cjs/src/mixpanel-service.js +10 -3
- package/cjs/src/mixpanel-service.js.map +1 -1
- package/cjs/src/mixpanel-service.spec.js +12 -3
- package/cjs/src/mixpanel-service.spec.js.map +1 -1
- package/cjs/src/react/index.d.ts +14 -14
- package/cjs/src/react/index.d.ts.map +1 -1
- package/cjs/src/react/index.js +4 -2
- package/cjs/src/react/index.js.map +1 -1
- package/cjs/src/react/index.spec.js +1 -1
- package/cjs/src/react/index.spec.js.map +1 -1
- package/cjs/src/types.d.ts +18 -3
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +17 -2
- package/cjs/src/types.js.map +1 -1
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +8 -0
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts +2 -0
- package/dist/src/embed/base.d.ts.map +1 -1
- package/dist/src/embed/sage.d.ts +25 -2
- package/dist/src/embed/sage.d.ts.map +1 -1
- package/dist/src/embed/search-bar.d.ts +1 -1
- package/dist/src/embed/search-bar.d.ts.map +1 -1
- package/dist/src/embed/search.d.ts +8 -0
- package/dist/src/embed/search.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +3 -1
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/mixpanel-service.d.ts +1 -0
- package/dist/src/mixpanel-service.d.ts.map +1 -1
- package/dist/src/react/index.d.ts +14 -14
- package/dist/src/react/index.d.ts.map +1 -1
- package/dist/src/types.d.ts +18 -3
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +143 -17301
- package/dist/tsembed-react.js +143 -17301
- package/dist/tsembed.es.js +156 -17314
- package/dist/tsembed.js +156 -17314
- package/dist/visual-embed-sdk-react-full.d.ts +300 -241
- package/dist/visual-embed-sdk-react.d.ts +300 -241
- package/dist/visual-embed-sdk.d.ts +65 -7
- package/lib/package.json +8 -7
- package/lib/src/.index.d.ts.swp +0 -0
- package/lib/src/auth.d.ts.map +1 -1
- package/lib/src/auth.js +4 -2
- package/lib/src/auth.js.map +1 -1
- package/lib/src/embed/app.d.ts +8 -0
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +2 -1
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +10 -0
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts +2 -0
- package/lib/src/embed/base.d.ts.map +1 -1
- package/lib/src/embed/base.js +4 -2
- package/lib/src/embed/base.js.map +1 -1
- package/lib/src/embed/sage.d.ts +25 -2
- package/lib/src/embed/sage.d.ts.map +1 -1
- package/lib/src/embed/sage.js +10 -5
- package/lib/src/embed/sage.js.map +1 -1
- package/lib/src/embed/sage.spec.js +26 -0
- package/lib/src/embed/sage.spec.js.map +1 -1
- package/lib/src/embed/search-bar.d.ts +1 -1
- package/lib/src/embed/search-bar.d.ts.map +1 -1
- package/lib/src/embed/search.d.ts +8 -0
- package/lib/src/embed/search.d.ts.map +1 -1
- package/lib/src/embed/search.js +2 -1
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/search.spec.js +11 -1
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +3 -1
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +11 -4
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/mixpanel-service.d.ts +1 -0
- package/lib/src/mixpanel-service.d.ts.map +1 -1
- package/lib/src/mixpanel-service.js +10 -3
- package/lib/src/mixpanel-service.js.map +1 -1
- package/lib/src/mixpanel-service.spec.js +12 -3
- package/lib/src/mixpanel-service.spec.js.map +1 -1
- package/lib/src/react/index.d.ts +14 -14
- package/lib/src/react/index.d.ts.map +1 -1
- package/lib/src/react/index.js +4 -2
- package/lib/src/react/index.js.map +1 -1
- package/lib/src/react/index.spec.js +2 -2
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/types.d.ts +18 -3
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +17 -2
- package/lib/src/types.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +65 -7
- package/package.json +8 -7
- package/src/auth.ts +7 -5
- package/src/embed/app.spec.ts +15 -0
- package/src/embed/app.ts +10 -0
- package/src/embed/base.ts +7 -5
- package/src/embed/sage.spec.ts +32 -0
- package/src/embed/sage.ts +38 -5
- package/src/embed/search-bar.tsx +1 -1
- package/src/embed/search.spec.ts +15 -1
- package/src/embed/search.ts +10 -0
- package/src/embed/ts-embed.ts +15 -3
- package/src/mixpanel-service.spec.ts +12 -3
- package/src/mixpanel-service.ts +10 -3
- package/src/react/index.spec.tsx +5 -3
- package/src/react/index.tsx +35 -26
- package/src/types.ts +17 -2
package/src/embed/sage.spec.ts
CHANGED
|
@@ -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,
|
|
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
|
|
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] =
|
|
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 (
|
|
126
|
-
if (
|
|
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
|
|
package/src/embed/search-bar.tsx
CHANGED
|
@@ -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.
|
package/src/embed/search.spec.ts
CHANGED
|
@@ -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
|
});
|
package/src/embed/search.ts
CHANGED
|
@@ -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;
|
package/src/embed/ts-embed.ts
CHANGED
|
@@ -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(
|
|
303
|
-
|
|
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
|
|
package/src/mixpanel-service.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/react/index.spec.tsx
CHANGED
|
@@ -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 {
|
|
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
|
};
|
package/src/react/index.tsx
CHANGED
|
@@ -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<
|
|
17
|
-
(props: U, forwardedRef: React.MutableRefObject<
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
Omit<U, 'className'>,
|
|
22
|
+
V
|
|
23
|
+
>(embedProps);
|
|
24
24
|
useDeepCompareEffect(() => {
|
|
25
25
|
const tsEmbed = new EmbedConstructor(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
},
|
|
26
|
+
ref!.current,
|
|
27
|
+
deepMerge(
|
|
28
|
+
{
|
|
29
|
+
insertAsSibling: viewConfig.insertAsSibling,
|
|
30
|
+
frameParams: {
|
|
31
|
+
class: viewConfig.insertAsSibling
|
|
32
|
+
? className || ''
|
|
33
|
+
: '',
|
|
35
34
|
},
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
},
|
|
36
|
+
viewConfig,
|
|
37
|
+
),
|
|
38
|
+
) as InstanceType<T>;
|
|
39
39
|
Object.keys(listeners).forEach((eventName) => {
|
|
40
40
|
tsEmbed.on(
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
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 = '
|
|
2127
|
-
Query = 'query
|
|
2141
|
+
WorksheetId = 'worksheet',
|
|
2142
|
+
Query = 'query'
|
|
2128
2143
|
}
|
|
2129
2144
|
|
|
2130
2145
|
/**
|