@thoughtspot/visual-embed-sdk 1.44.1 → 1.44.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/cjs/package.json +6 -5
- package/cjs/src/api-intercept.d.ts.map +1 -1
- package/cjs/src/api-intercept.js +8 -3
- package/cjs/src/api-intercept.js.map +1 -1
- package/cjs/src/api-intercept.spec.js +19 -3
- package/cjs/src/api-intercept.spec.js.map +1 -1
- package/cjs/src/auth.spec.js +43 -42
- package/cjs/src/auth.spec.js.map +1 -1
- package/cjs/src/authToken.spec.js +3 -3
- package/cjs/src/authToken.spec.js.map +1 -1
- package/cjs/src/embed/app.d.ts +17 -0
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +9 -5
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +96 -6
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/base.d.ts +1 -1
- package/cjs/src/embed/base.d.ts.map +1 -1
- package/cjs/src/embed/base.js +4 -0
- package/cjs/src/embed/base.js.map +1 -1
- package/cjs/src/embed/base.spec.js +71 -15
- package/cjs/src/embed/base.spec.js.map +1 -1
- package/cjs/src/embed/bodyless-conversation.spec.js +2 -2
- package/cjs/src/embed/bodyless-conversation.spec.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +6 -1
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +8 -3
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/embed.spec.js +101 -2
- package/cjs/src/embed/embed.spec.js.map +1 -1
- package/cjs/src/embed/events.spec.js +2 -2
- package/cjs/src/embed/events.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +18 -0
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +13 -6
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +114 -26
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/pinboard.spec.js +1 -1
- package/cjs/src/embed/pinboard.spec.js.map +1 -1
- package/cjs/src/embed/sage.spec.js +2 -2
- package/cjs/src/embed/sage.spec.js.map +1 -1
- package/cjs/src/embed/search.spec.js +118 -2
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed-trigger.spec.js +2 -3
- package/cjs/src/embed/ts-embed-trigger.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +3 -2
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +51 -17
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +335 -71
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/errors.d.ts +8 -0
- package/cjs/src/errors.d.ts.map +1 -1
- package/cjs/src/errors.js +8 -0
- package/cjs/src/errors.js.map +1 -1
- package/cjs/src/mixpanel-service.spec.js +1 -1
- package/cjs/src/mixpanel-service.spec.js.map +1 -1
- package/cjs/src/react/index.spec.js +3 -4
- package/cjs/src/react/index.spec.js.map +1 -1
- package/cjs/src/test/test-utils.js +1 -1
- package/cjs/src/test/test-utils.js.map +1 -1
- package/cjs/src/types.d.ts +194 -1
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +94 -2
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/authService/authService.spec.js +8 -8
- package/cjs/src/utils/authService/authService.spec.js.map +1 -1
- package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.spec.js +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/cjs/src/utils/graphql/graphql-request.spec.js +1 -1
- package/cjs/src/utils/graphql/graphql-request.spec.js.map +1 -1
- package/cjs/src/utils/graphql/sourceService.spec.js +1 -1
- package/cjs/src/utils/graphql/sourceService.spec.js.map +1 -1
- package/cjs/src/utils/logger.spec.d.ts +5 -20
- package/cjs/src/utils/logger.spec.d.ts.map +1 -1
- package/cjs/src/utils/processData.spec.js +17 -17
- package/cjs/src/utils/processData.spec.js.map +1 -1
- package/cjs/src/utils/processTrigger.spec.js +8 -8
- package/cjs/src/utils/processTrigger.spec.js.map +1 -1
- package/cjs/src/utils.d.ts +16 -3
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +60 -5
- package/cjs/src/utils.js.map +1 -1
- package/cjs/src/utils.spec.js +72 -10
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-BE9gGzRX.js → index-D0n5LIka.js} +1 -1
- package/dist/src/api-intercept.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +17 -0
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts +1 -1
- package/dist/src/embed/base.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +18 -0
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +3 -2
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/dist/src/errors.d.ts +8 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/types.d.ts +194 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/logger.spec.d.ts +5 -20
- package/dist/src/utils/logger.spec.d.ts.map +1 -1
- package/dist/src/utils.d.ts +16 -3
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +282 -74
- package/dist/tsembed-react.js +281 -73
- package/dist/tsembed.es.js +282 -74
- package/dist/tsembed.js +281 -73
- package/dist/visual-embed-sdk-react-full.d.ts +185 -3
- package/dist/visual-embed-sdk-react.d.ts +184 -2
- package/dist/visual-embed-sdk.d.ts +185 -3
- package/lib/package.json +6 -5
- package/lib/src/api-intercept.d.ts.map +1 -1
- package/lib/src/api-intercept.js +9 -4
- package/lib/src/api-intercept.js.map +1 -1
- package/lib/src/api-intercept.spec.js +20 -4
- package/lib/src/api-intercept.spec.js.map +1 -1
- package/lib/src/auth.spec.js +43 -42
- package/lib/src/auth.spec.js.map +1 -1
- package/lib/src/authToken.spec.js +3 -3
- package/lib/src/authToken.spec.js.map +1 -1
- package/lib/src/embed/app.d.ts +17 -0
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +10 -6
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +96 -6
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts +1 -1
- package/lib/src/embed/base.d.ts.map +1 -1
- package/lib/src/embed/base.js +5 -1
- package/lib/src/embed/base.js.map +1 -1
- package/lib/src/embed/base.spec.js +72 -16
- package/lib/src/embed/base.spec.js.map +1 -1
- package/lib/src/embed/bodyless-conversation.spec.js +2 -2
- package/lib/src/embed/bodyless-conversation.spec.js.map +1 -1
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +7 -2
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +9 -4
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/embed.spec.js +103 -4
- package/lib/src/embed/embed.spec.js.map +1 -1
- package/lib/src/embed/events.spec.js +2 -2
- package/lib/src/embed/events.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +2 -2
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +18 -0
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +15 -8
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +114 -26
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/pinboard.spec.js +1 -1
- package/lib/src/embed/pinboard.spec.js.map +1 -1
- package/lib/src/embed/sage.spec.js +2 -2
- package/lib/src/embed/sage.spec.js.map +1 -1
- package/lib/src/embed/search.spec.js +118 -2
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/ts-embed-trigger.spec.js +2 -3
- package/lib/src/embed/ts-embed-trigger.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +3 -2
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +52 -18
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +336 -72
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/errors.d.ts +8 -0
- package/lib/src/errors.d.ts.map +1 -1
- package/lib/src/errors.js +8 -0
- package/lib/src/errors.js.map +1 -1
- package/lib/src/mixpanel-service.spec.js +1 -1
- package/lib/src/mixpanel-service.spec.js.map +1 -1
- package/lib/src/react/index.spec.js +3 -4
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/test/test-utils.js +1 -1
- package/lib/src/test/test-utils.js.map +1 -1
- package/lib/src/types.d.ts +194 -1
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +93 -1
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/authService/authService.spec.js +8 -8
- package/lib/src/utils/authService/authService.spec.js.map +1 -1
- package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.spec.js +1 -1
- package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/lib/src/utils/graphql/graphql-request.spec.js +1 -1
- package/lib/src/utils/graphql/graphql-request.spec.js.map +1 -1
- package/lib/src/utils/graphql/sourceService.spec.js +1 -1
- package/lib/src/utils/graphql/sourceService.spec.js.map +1 -1
- package/lib/src/utils/logger.spec.d.ts +5 -20
- package/lib/src/utils/logger.spec.d.ts.map +1 -1
- package/lib/src/utils/processData.spec.js +17 -17
- package/lib/src/utils/processData.spec.js.map +1 -1
- package/lib/src/utils/processTrigger.spec.js +8 -8
- package/lib/src/utils/processTrigger.spec.js.map +1 -1
- package/lib/src/utils.d.ts +16 -3
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +57 -4
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js +73 -11
- package/lib/src/utils.spec.js.map +1 -1
- package/package.json +6 -5
- package/src/api-intercept.spec.ts +23 -10
- package/src/api-intercept.ts +9 -4
- package/src/auth.spec.ts +53 -51
- package/src/authToken.spec.ts +3 -3
- package/src/embed/app.spec.ts +128 -7
- package/src/embed/app.ts +30 -4
- package/src/embed/base.spec.ts +95 -21
- package/src/embed/base.ts +5 -2
- package/src/embed/bodyless-conversation.spec.ts +2 -2
- package/src/embed/conversation.spec.ts +9 -4
- package/src/embed/conversation.ts +7 -2
- package/src/embed/embed.spec.ts +122 -2
- package/src/embed/events.spec.ts +2 -2
- package/src/embed/hostEventClient/host-event-client.spec.ts +2 -2
- package/src/embed/liveboard.spec.ts +137 -29
- package/src/embed/liveboard.ts +36 -6
- package/src/embed/pinboard.spec.ts +1 -1
- package/src/embed/sage.spec.ts +2 -2
- package/src/embed/search.spec.ts +133 -2
- package/src/embed/ts-embed-trigger.spec.ts +2 -3
- package/src/embed/ts-embed.spec.ts +424 -91
- package/src/embed/ts-embed.ts +56 -19
- package/src/errors.ts +8 -0
- package/src/mixpanel-service.spec.ts +1 -1
- package/src/react/index.spec.tsx +4 -5
- package/src/test/test-utils.ts +2 -2
- package/src/types.ts +206 -1
- package/src/utils/authService/authService.spec.ts +17 -17
- package/src/utils/authService/tokenizedAuthService.spec.ts +4 -4
- package/src/utils/graphql/answerService/answerService.spec.ts +3 -3
- package/src/utils/graphql/graphql-request.spec.ts +2 -2
- package/src/utils/graphql/sourceService.spec.ts +1 -1
- package/src/utils/processData.spec.ts +26 -26
- package/src/utils/processTrigger.spec.ts +8 -8
- package/src/utils.spec.ts +100 -11
- package/src/utils.ts +59 -7
package/src/embed/app.spec.ts
CHANGED
|
@@ -43,7 +43,7 @@ beforeAll(() => {
|
|
|
43
43
|
thoughtSpotHost,
|
|
44
44
|
authType: AuthType.None,
|
|
45
45
|
});
|
|
46
|
-
jest.spyOn(auth, 'postLoginService').mockImplementation(() => Promise.resolve(
|
|
46
|
+
jest.spyOn(auth, 'postLoginService').mockImplementation(() => Promise.resolve(undefined));
|
|
47
47
|
(window as any).ResizeObserver =
|
|
48
48
|
window.ResizeObserver ||
|
|
49
49
|
jest.fn().mockImplementation(() => ({
|
|
@@ -542,6 +542,100 @@ describe('App embed tests', () => {
|
|
|
542
542
|
});
|
|
543
543
|
});
|
|
544
544
|
|
|
545
|
+
test('Should add showMaskedFilterChip true to the iframe src', async () => {
|
|
546
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
547
|
+
...defaultViewConfig,
|
|
548
|
+
showPrimaryNavbar: false,
|
|
549
|
+
showMaskedFilterChip: true,
|
|
550
|
+
} as AppViewConfig);
|
|
551
|
+
|
|
552
|
+
appEmbed.render();
|
|
553
|
+
await executeAfterWait(() => {
|
|
554
|
+
expectUrlMatchesWithParams(
|
|
555
|
+
getIFrameSrc(),
|
|
556
|
+
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&showMaskedFilterChip=true${defaultParams}${defaultParamsPost}#/home`,
|
|
557
|
+
);
|
|
558
|
+
});
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
test('Should add showMaskedFilterChip false to the iframe src', async () => {
|
|
562
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
563
|
+
...defaultViewConfig,
|
|
564
|
+
showPrimaryNavbar: false,
|
|
565
|
+
showMaskedFilterChip: false,
|
|
566
|
+
} as AppViewConfig);
|
|
567
|
+
|
|
568
|
+
appEmbed.render();
|
|
569
|
+
await executeAfterWait(() => {
|
|
570
|
+
expectUrlMatchesWithParams(
|
|
571
|
+
getIFrameSrc(),
|
|
572
|
+
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&showMaskedFilterChip=false${defaultParams}${defaultParamsPost}#/home`,
|
|
573
|
+
);
|
|
574
|
+
});
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
test('Should add default showMaskedFilterChip false when not specified', async () => {
|
|
578
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
579
|
+
...defaultViewConfig,
|
|
580
|
+
showPrimaryNavbar: false,
|
|
581
|
+
} as AppViewConfig);
|
|
582
|
+
|
|
583
|
+
appEmbed.render();
|
|
584
|
+
await executeAfterWait(() => {
|
|
585
|
+
expectUrlMatchesWithParams(
|
|
586
|
+
getIFrameSrc(),
|
|
587
|
+
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&showMaskedFilterChip=false${defaultParams}${defaultParamsPost}#/home`,
|
|
588
|
+
);
|
|
589
|
+
});
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
test('Should add isLiveboardMasterpiecesEnabled true to the iframe src', async () => {
|
|
593
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
594
|
+
...defaultViewConfig,
|
|
595
|
+
showPrimaryNavbar: false,
|
|
596
|
+
isLiveboardMasterpiecesEnabled: true,
|
|
597
|
+
} as AppViewConfig);
|
|
598
|
+
|
|
599
|
+
appEmbed.render();
|
|
600
|
+
await executeAfterWait(() => {
|
|
601
|
+
expectUrlMatchesWithParams(
|
|
602
|
+
getIFrameSrc(),
|
|
603
|
+
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&isLiveboardMasterpiecesEnabled=true${defaultParams}${defaultParamsPost}#/home`,
|
|
604
|
+
);
|
|
605
|
+
});
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
test('Should add isLiveboardMasterpiecesEnabled false to the iframe src', async () => {
|
|
609
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
610
|
+
...defaultViewConfig,
|
|
611
|
+
showPrimaryNavbar: false,
|
|
612
|
+
isLiveboardMasterpiecesEnabled: false,
|
|
613
|
+
} as AppViewConfig);
|
|
614
|
+
|
|
615
|
+
appEmbed.render();
|
|
616
|
+
await executeAfterWait(() => {
|
|
617
|
+
expectUrlMatchesWithParams(
|
|
618
|
+
getIFrameSrc(),
|
|
619
|
+
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&isLiveboardMasterpiecesEnabled=false${defaultParams}${defaultParamsPost}#/home`,
|
|
620
|
+
);
|
|
621
|
+
});
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
test('Should add default isLiveboardMasterpiecesEnabled false when not specified', async () => {
|
|
625
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
626
|
+
...defaultViewConfig,
|
|
627
|
+
showPrimaryNavbar: false,
|
|
628
|
+
} as AppViewConfig);
|
|
629
|
+
|
|
630
|
+
appEmbed.render();
|
|
631
|
+
await executeAfterWait(() => {
|
|
632
|
+
expectUrlMatchesWithParams(
|
|
633
|
+
getIFrameSrc(),
|
|
634
|
+
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&isLiveboardMasterpiecesEnabled=false${defaultParams}${defaultParamsPost}#/home`,
|
|
635
|
+
);
|
|
636
|
+
});
|
|
637
|
+
});
|
|
638
|
+
|
|
545
639
|
test('Should add enableSearchAssist flagto the iframe src', async () => {
|
|
546
640
|
const appEmbed = new AppEmbed(getRootEl(), {
|
|
547
641
|
...defaultViewConfig,
|
|
@@ -1036,13 +1130,13 @@ describe('App embed tests', () => {
|
|
|
1036
1130
|
let embedHeightCallback: any = () => { };
|
|
1037
1131
|
const onSpy = jest.spyOn(AppEmbed.prototype, 'on').mockImplementation((event, callback) => {
|
|
1038
1132
|
if (event === EmbedEvent.RouteChange) {
|
|
1039
|
-
callback({ data: { currentPath: '/answers' } }, jest.fn());
|
|
1133
|
+
callback({ type: EmbedEvent.RouteChange, data: { currentPath: '/answers' } } as any, jest.fn());
|
|
1040
1134
|
}
|
|
1041
1135
|
if (event === EmbedEvent.EmbedHeight) {
|
|
1042
1136
|
embedHeightCallback = callback;
|
|
1043
1137
|
}
|
|
1044
1138
|
if (event === EmbedEvent.EmbedIframeCenter) {
|
|
1045
|
-
callback({}, jest.fn());
|
|
1139
|
+
callback({ type: EmbedEvent.EmbedIframeCenter, data: {} } as any, jest.fn());
|
|
1046
1140
|
}
|
|
1047
1141
|
return null;
|
|
1048
1142
|
});
|
|
@@ -1052,6 +1146,7 @@ describe('App embed tests', () => {
|
|
|
1052
1146
|
...defaultViewConfig,
|
|
1053
1147
|
fullHeight: true,
|
|
1054
1148
|
lazyLoadingForFullHeight: true,
|
|
1149
|
+
lazyLoadingMargin: '10px',
|
|
1055
1150
|
} as AppViewConfig);
|
|
1056
1151
|
|
|
1057
1152
|
// Set the iframe before render
|
|
@@ -1133,7 +1228,7 @@ describe('App embed tests', () => {
|
|
|
1133
1228
|
},
|
|
1134
1229
|
});
|
|
1135
1230
|
await appEmbed.render();
|
|
1136
|
-
spyOn(logger, 'warn');
|
|
1231
|
+
jest.spyOn(logger, 'warn').mockImplementation(() => {});
|
|
1137
1232
|
appEmbed.navigateToPage(-1);
|
|
1138
1233
|
expect(logger.warn).toHaveBeenCalledWith(
|
|
1139
1234
|
'Path can only by a string when triggered without noReload',
|
|
@@ -1141,7 +1236,7 @@ describe('App embed tests', () => {
|
|
|
1141
1236
|
});
|
|
1142
1237
|
|
|
1143
1238
|
test('navigateToPage function use before render', async () => {
|
|
1144
|
-
spyOn(logger, 'log');
|
|
1239
|
+
jest.spyOn(logger, 'log').mockImplementation(() => {});
|
|
1145
1240
|
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1146
1241
|
frameParams: {
|
|
1147
1242
|
width: '100%',
|
|
@@ -1223,6 +1318,7 @@ describe('App embed tests', () => {
|
|
|
1223
1318
|
...defaultViewConfig,
|
|
1224
1319
|
fullHeight: true,
|
|
1225
1320
|
lazyLoadingForFullHeight: true,
|
|
1321
|
+
lazyLoadingMargin: '10px',
|
|
1226
1322
|
} as AppViewConfig);
|
|
1227
1323
|
|
|
1228
1324
|
// Set the iframe before render
|
|
@@ -1299,6 +1395,7 @@ describe('App embed tests', () => {
|
|
|
1299
1395
|
...defaultViewConfig,
|
|
1300
1396
|
fullHeight: true,
|
|
1301
1397
|
lazyLoadingForFullHeight: true,
|
|
1398
|
+
lazyLoadingMargin: '10px',
|
|
1302
1399
|
} as AppViewConfig);
|
|
1303
1400
|
|
|
1304
1401
|
const mockTrigger = jest.spyOn(appEmbed, 'trigger');
|
|
@@ -1331,6 +1428,7 @@ describe('App embed tests', () => {
|
|
|
1331
1428
|
...defaultViewConfig,
|
|
1332
1429
|
fullHeight: true,
|
|
1333
1430
|
lazyLoadingForFullHeight: true,
|
|
1431
|
+
lazyLoadingMargin: '10px',
|
|
1334
1432
|
} as AppViewConfig);
|
|
1335
1433
|
|
|
1336
1434
|
const mockTrigger = jest.spyOn(appEmbed, 'trigger');
|
|
@@ -1355,6 +1453,7 @@ describe('App embed tests', () => {
|
|
|
1355
1453
|
...defaultViewConfig,
|
|
1356
1454
|
fullHeight: true,
|
|
1357
1455
|
lazyLoadingForFullHeight: true,
|
|
1456
|
+
lazyLoadingMargin: '10px',
|
|
1358
1457
|
} as AppViewConfig);
|
|
1359
1458
|
|
|
1360
1459
|
await appEmbed.render();
|
|
@@ -1375,6 +1474,7 @@ describe('App embed tests', () => {
|
|
|
1375
1474
|
...defaultViewConfig,
|
|
1376
1475
|
fullHeight: true,
|
|
1377
1476
|
lazyLoadingForFullHeight: true,
|
|
1477
|
+
lazyLoadingMargin: '10px',
|
|
1378
1478
|
} as AppViewConfig);
|
|
1379
1479
|
|
|
1380
1480
|
await appEmbed.render();
|
|
@@ -1402,6 +1502,7 @@ describe('App embed tests', () => {
|
|
|
1402
1502
|
...defaultViewConfig,
|
|
1403
1503
|
fullHeight: true,
|
|
1404
1504
|
lazyLoadingForFullHeight: true,
|
|
1505
|
+
lazyLoadingMargin: '10px',
|
|
1405
1506
|
} as AppViewConfig);
|
|
1406
1507
|
|
|
1407
1508
|
// Set the iframe before render
|
|
@@ -1527,13 +1628,33 @@ describe('App embed tests', () => {
|
|
|
1527
1628
|
|
|
1528
1629
|
await appEmbed.render();
|
|
1529
1630
|
const mockEvent = {
|
|
1530
|
-
data: 0, // This will make it use the
|
|
1631
|
+
data: 0, // This will make it use the default height
|
|
1531
1632
|
type: EmbedEvent.EmbedHeight,
|
|
1532
1633
|
};
|
|
1533
1634
|
appEmbed.updateIFrameHeight(mockEvent);
|
|
1534
1635
|
|
|
1535
|
-
// Should use the
|
|
1636
|
+
// Should use the default height
|
|
1536
1637
|
expect(mockIFrame.style.height).toBe('500px');
|
|
1537
1638
|
});
|
|
1538
1639
|
});
|
|
1539
1640
|
});
|
|
1641
|
+
|
|
1642
|
+
describe('App Embed Default Height and Minimum Height Handling', () => {
|
|
1643
|
+
test('should set default height to 500 when neither default height nor minimum height is provided', async () => {
|
|
1644
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1645
|
+
...defaultViewConfig,
|
|
1646
|
+
fullHeight: true,
|
|
1647
|
+
} as AppViewConfig);
|
|
1648
|
+
await appEmbed.render();
|
|
1649
|
+
expect(appEmbed['defaultHeight']).toBe(500);
|
|
1650
|
+
});
|
|
1651
|
+
test('should set default height to 700 when default height is provided', async () => {
|
|
1652
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1653
|
+
...defaultViewConfig,
|
|
1654
|
+
fullHeight: true,
|
|
1655
|
+
minimumHeight: 700,
|
|
1656
|
+
} as AppViewConfig);
|
|
1657
|
+
await appEmbed.render();
|
|
1658
|
+
expect(appEmbed['defaultHeight']).toBe(700);
|
|
1659
|
+
});
|
|
1660
|
+
});
|
package/src/embed/app.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { logger } from '../utils/logger';
|
|
12
|
-
import { calculateVisibleElementData, getQueryParamString, isUndefined } from '../utils';
|
|
12
|
+
import { calculateVisibleElementData, getQueryParamString, isUndefined, isValidCssMargin } from '../utils';
|
|
13
13
|
import {
|
|
14
14
|
Param,
|
|
15
15
|
DOMSelector,
|
|
@@ -626,6 +626,23 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
626
626
|
* @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
|
|
627
627
|
*/
|
|
628
628
|
updatedSpotterChatPrompt?: boolean;
|
|
629
|
+
/**
|
|
630
|
+
* This is the minimum height (in pixels) for a full-height App.
|
|
631
|
+
* Setting this height helps resolve issues with empty Apps and
|
|
632
|
+
* other screens navigable from an App.
|
|
633
|
+
*
|
|
634
|
+
* @version SDK: 1.44.2 | ThoughtSpot: 26.0.2.cl
|
|
635
|
+
* @default 500
|
|
636
|
+
* @example
|
|
637
|
+
* ```js
|
|
638
|
+
* const embed = new AppEmbed('#embed', {
|
|
639
|
+
* ... // other app view config
|
|
640
|
+
* fullHeight: true,
|
|
641
|
+
* minimumHeight: 600,
|
|
642
|
+
* });
|
|
643
|
+
* ```
|
|
644
|
+
*/
|
|
645
|
+
minimumHeight?: number;
|
|
629
646
|
}
|
|
630
647
|
|
|
631
648
|
/**
|
|
@@ -635,7 +652,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
635
652
|
export class AppEmbed extends V1Embed {
|
|
636
653
|
protected viewConfig: AppViewConfig;
|
|
637
654
|
|
|
638
|
-
private defaultHeight =
|
|
655
|
+
private defaultHeight = 500;
|
|
639
656
|
|
|
640
657
|
|
|
641
658
|
constructor(domSelector: DOMSelector, viewConfig: AppViewConfig) {
|
|
@@ -672,6 +689,8 @@ export class AppEmbed extends V1Embed {
|
|
|
672
689
|
hideLiveboardHeader = false,
|
|
673
690
|
showLiveboardTitle = true,
|
|
674
691
|
showLiveboardDescription = true,
|
|
692
|
+
showMaskedFilterChip = false,
|
|
693
|
+
isLiveboardMasterpiecesEnabled = false,
|
|
675
694
|
hideHomepageLeftNav = false,
|
|
676
695
|
modularHomeExperience = false,
|
|
677
696
|
isLiveboardHeaderSticky = true,
|
|
@@ -697,6 +716,7 @@ export class AppEmbed extends V1Embed {
|
|
|
697
716
|
isCentralizedLiveboardFilterUXEnabled = false,
|
|
698
717
|
isLinkParametersEnabled,
|
|
699
718
|
updatedSpotterChatPrompt,
|
|
719
|
+
minimumHeight,
|
|
700
720
|
} = this.viewConfig;
|
|
701
721
|
|
|
702
722
|
let params: any = {};
|
|
@@ -707,6 +727,8 @@ export class AppEmbed extends V1Embed {
|
|
|
707
727
|
params[Param.HideLiveboardHeader] = hideLiveboardHeader;
|
|
708
728
|
params[Param.ShowLiveboardTitle] = showLiveboardTitle;
|
|
709
729
|
params[Param.ShowLiveboardDescription] = !!showLiveboardDescription;
|
|
730
|
+
params[Param.ShowMaskedFilterChip] = showMaskedFilterChip;
|
|
731
|
+
params[Param.IsLiveboardMasterpiecesEnabled] = isLiveboardMasterpiecesEnabled;
|
|
710
732
|
params[Param.LiveboardHeaderSticky] = isLiveboardHeaderSticky;
|
|
711
733
|
params[Param.IsFullAppEmbed] = true;
|
|
712
734
|
params[Param.LiveboardHeaderV2] = isLiveboardCompactHeaderEnabled;
|
|
@@ -739,7 +761,9 @@ export class AppEmbed extends V1Embed {
|
|
|
739
761
|
params[Param.fullHeight] = true;
|
|
740
762
|
if (this.viewConfig.lazyLoadingForFullHeight) {
|
|
741
763
|
params[Param.IsLazyLoadingForEmbedEnabled] = true;
|
|
742
|
-
|
|
764
|
+
if (isValidCssMargin(this.viewConfig.lazyLoadingMargin)) {
|
|
765
|
+
params[Param.RootMarginForLazyLoad] = this.viewConfig.lazyLoadingMargin;
|
|
766
|
+
}
|
|
743
767
|
}
|
|
744
768
|
}
|
|
745
769
|
|
|
@@ -799,6 +823,8 @@ export class AppEmbed extends V1Embed {
|
|
|
799
823
|
] = isCentralizedLiveboardFilterUXEnabled;
|
|
800
824
|
}
|
|
801
825
|
|
|
826
|
+
this.defaultHeight = minimumHeight || this.defaultHeight;
|
|
827
|
+
|
|
802
828
|
params[Param.DataPanelV2Enabled] = dataPanelV2;
|
|
803
829
|
params[Param.HideHomepageLeftNav] = hideHomepageLeftNav;
|
|
804
830
|
params[Param.ModularHomeExperienceEnabled] = modularHomeExperience;
|
|
@@ -900,7 +926,7 @@ export class AppEmbed extends V1Embed {
|
|
|
900
926
|
* @param data The event payload
|
|
901
927
|
*/
|
|
902
928
|
protected updateIFrameHeight = (data: MessagePayload) => {
|
|
903
|
-
this.setIFrameHeight(Math.max(data.data, this.
|
|
929
|
+
this.setIFrameHeight(Math.max(data.data, this.defaultHeight));
|
|
904
930
|
this.sendFullHeightLazyLoadData();
|
|
905
931
|
};
|
|
906
932
|
|
package/src/embed/base.spec.ts
CHANGED
|
@@ -11,7 +11,7 @@ import * as base from './base';
|
|
|
11
11
|
import * as embedConfigInstance from './embedConfig';
|
|
12
12
|
import * as resetService from '../utils/resetServices';
|
|
13
13
|
import * as processTrigger from '../utils/processTrigger';
|
|
14
|
-
import { reloadIframe } from './base';
|
|
14
|
+
import { createAndSetInitPromise, getInitPromise, getIsInitCalled, reloadIframe } from './base';
|
|
15
15
|
|
|
16
16
|
import {
|
|
17
17
|
executeAfterWait,
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
} from '../test/test-utils';
|
|
23
23
|
import * as tokenizedFetchInstance from '../tokenizedFetch';
|
|
24
24
|
import { logger } from '../utils/logger';
|
|
25
|
+
import { ERROR_MESSAGE } from '../errors';
|
|
25
26
|
|
|
26
27
|
const thoughtSpotHost = 'tshost';
|
|
27
28
|
let authEE: EventEmitter;
|
|
@@ -32,14 +33,14 @@ describe('Base TS Embed', () => {
|
|
|
32
33
|
thoughtSpotHost,
|
|
33
34
|
authType: index.AuthType.None,
|
|
34
35
|
}) as EventEmitter;
|
|
35
|
-
jest.spyOn(auth, 'postLoginService').mockImplementation(() => Promise.resolve(
|
|
36
|
+
jest.spyOn(auth, 'postLoginService').mockImplementation(() => Promise.resolve(undefined));
|
|
36
37
|
});
|
|
37
38
|
|
|
38
39
|
beforeEach(() => {
|
|
39
40
|
document.body.innerHTML = getDocumentBody();
|
|
40
41
|
});
|
|
41
42
|
|
|
42
|
-
test('Should show an alert when third party cookie access is blocked', (
|
|
43
|
+
test('Should show an alert when third party cookie access is blocked', () => {
|
|
43
44
|
const tsEmbed = new index.SearchEmbed(getRootEl(), {});
|
|
44
45
|
const iFrame: any = document.createElement('div');
|
|
45
46
|
iFrame.contentWindow = null;
|
|
@@ -59,18 +60,17 @@ describe('Base TS Embed', () => {
|
|
|
59
60
|
jest.spyOn(window, 'alert').mockImplementation(() => undefined);
|
|
60
61
|
authEE.on(auth.AuthStatus.FAILURE, (reason) => {
|
|
61
62
|
expect(reason).toEqual(auth.AuthFailureType.NO_COOKIE_ACCESS);
|
|
62
|
-
expect(window.alert).
|
|
63
|
+
expect(window.alert).toHaveBeenCalledWith(
|
|
63
64
|
'Third-party cookie access is blocked on this browser. Please allow third-party cookies for this to work properly. \nYou can use `suppressNoCookieAccessAlert` to suppress this message.',
|
|
64
65
|
);
|
|
65
|
-
done();
|
|
66
66
|
});
|
|
67
67
|
});
|
|
68
68
|
|
|
69
|
-
test('Should ignore cookie blocked alert if ignoreNoCookieAccess is true', async (
|
|
69
|
+
test('Should ignore cookie blocked alert if ignoreNoCookieAccess is true', async () => {
|
|
70
70
|
jest.spyOn(window, 'fetch').mockResolvedValue({
|
|
71
71
|
ok: true,
|
|
72
72
|
json: jest.fn().mockResolvedValue({}),
|
|
73
|
-
});
|
|
73
|
+
} as any);
|
|
74
74
|
const authEE = index.init({
|
|
75
75
|
thoughtSpotHost,
|
|
76
76
|
authType: index.AuthType.None,
|
|
@@ -96,7 +96,6 @@ describe('Base TS Embed', () => {
|
|
|
96
96
|
authEE.on(auth.AuthStatus.FAILURE, (reason) => {
|
|
97
97
|
expect(reason).toEqual(auth.AuthFailureType.NO_COOKIE_ACCESS);
|
|
98
98
|
expect(window.alert).not.toHaveBeenCalled();
|
|
99
|
-
done();
|
|
100
99
|
});
|
|
101
100
|
});
|
|
102
101
|
|
|
@@ -104,7 +103,7 @@ describe('Base TS Embed', () => {
|
|
|
104
103
|
jest.spyOn(window, 'fetch').mockResolvedValue({
|
|
105
104
|
ok: true,
|
|
106
105
|
json: jest.fn().mockResolvedValue({}),
|
|
107
|
-
});
|
|
106
|
+
} as any);
|
|
108
107
|
index.init({
|
|
109
108
|
thoughtSpotHost,
|
|
110
109
|
authType: index.AuthType.None,
|
|
@@ -161,7 +160,7 @@ describe('Base TS Embed', () => {
|
|
|
161
160
|
jest.spyOn(tokenizedFetchInstance, 'tokenizedFetch').mockResolvedValueOnce({
|
|
162
161
|
ok: true,
|
|
163
162
|
json: jest.fn().mockResolvedValue({}),
|
|
164
|
-
});
|
|
163
|
+
} as any);
|
|
165
164
|
index.init({
|
|
166
165
|
thoughtSpotHost,
|
|
167
166
|
authType: index.AuthType.TrustedAuthTokenCookieless,
|
|
@@ -229,7 +228,7 @@ describe('Base TS Embed', () => {
|
|
|
229
228
|
jest.spyOn(tokenizedFetchInstance, 'tokenizedFetch').mockResolvedValueOnce({
|
|
230
229
|
ok: true,
|
|
231
230
|
json: jest.fn().mockResolvedValue({}),
|
|
232
|
-
});
|
|
231
|
+
} as any);
|
|
233
232
|
index.init({
|
|
234
233
|
thoughtSpotHost,
|
|
235
234
|
authType: index.AuthType.None,
|
|
@@ -388,7 +387,7 @@ describe('Base TS Embed', () => {
|
|
|
388
387
|
});
|
|
389
388
|
});
|
|
390
389
|
|
|
391
|
-
test('handleAuth notifies for SDK auth failure', (
|
|
390
|
+
test('handleAuth notifies for SDK auth failure', () => {
|
|
392
391
|
jest.spyOn(auth, 'authenticate').mockResolvedValue(false);
|
|
393
392
|
const authEmitter = index.init({
|
|
394
393
|
thoughtSpotHost,
|
|
@@ -398,11 +397,10 @@ describe('Base TS Embed', () => {
|
|
|
398
397
|
});
|
|
399
398
|
authEmitter.on(auth.AuthStatus.FAILURE, (reason) => {
|
|
400
399
|
expect(reason).toBe(auth.AuthFailureType.SDK);
|
|
401
|
-
done();
|
|
402
400
|
});
|
|
403
401
|
});
|
|
404
402
|
|
|
405
|
-
test('handleAuth notifies for SDK auth success', (
|
|
403
|
+
test('handleAuth notifies for SDK auth success', () => {
|
|
406
404
|
jest.spyOn(auth, 'authenticate').mockResolvedValue(true);
|
|
407
405
|
const failureCallback = jest.fn();
|
|
408
406
|
const authEmitter = index.init({
|
|
@@ -414,16 +412,15 @@ describe('Base TS Embed', () => {
|
|
|
414
412
|
|
|
415
413
|
authEmitter.on(auth.AuthStatus.FAILURE, failureCallback);
|
|
416
414
|
authEmitter.on(auth.AuthStatus.SDK_SUCCESS, (...args) => {
|
|
417
|
-
expect(failureCallback).not.
|
|
415
|
+
expect(failureCallback).not.toHaveBeenCalled();
|
|
418
416
|
expect(args.length).toBe(0);
|
|
419
|
-
done();
|
|
420
417
|
});
|
|
421
418
|
});
|
|
422
419
|
|
|
423
420
|
test('Logout method should disable autoLogin', () => {
|
|
424
421
|
jest.spyOn(window, 'fetch').mockResolvedValueOnce({
|
|
425
422
|
type: 'opaque',
|
|
426
|
-
});
|
|
423
|
+
} as any);
|
|
427
424
|
index.init({
|
|
428
425
|
thoughtSpotHost,
|
|
429
426
|
authType: index.AuthType.None,
|
|
@@ -461,7 +458,7 @@ describe('Base TS Embed', () => {
|
|
|
461
458
|
index.init({
|
|
462
459
|
authType: index.AuthType.None,
|
|
463
460
|
} as EmbedConfig);
|
|
464
|
-
}).
|
|
461
|
+
}).toThrow();
|
|
465
462
|
});
|
|
466
463
|
|
|
467
464
|
test('config sanity, no username in trusted auth', () => {
|
|
@@ -470,7 +467,7 @@ describe('Base TS Embed', () => {
|
|
|
470
467
|
authType: index.AuthType.TrustedAuthToken,
|
|
471
468
|
thoughtSpotHost,
|
|
472
469
|
} as EmbedConfig);
|
|
473
|
-
}).
|
|
470
|
+
}).toThrow();
|
|
474
471
|
});
|
|
475
472
|
|
|
476
473
|
test('config sanity, no authEndpoint and getAuthToken', () => {
|
|
@@ -480,7 +477,7 @@ describe('Base TS Embed', () => {
|
|
|
480
477
|
thoughtSpotHost,
|
|
481
478
|
username: 'test',
|
|
482
479
|
});
|
|
483
|
-
}).
|
|
480
|
+
}).toThrow();
|
|
484
481
|
});
|
|
485
482
|
test('config backward compat, should assign inPopup when noRedirect is set', () => {
|
|
486
483
|
index.init({
|
|
@@ -532,6 +529,83 @@ describe('Init tests', () => {
|
|
|
532
529
|
thoughtSpotHost,
|
|
533
530
|
authType: index.AuthType.None,
|
|
534
531
|
});
|
|
535
|
-
expect(resetService.resetAllCachedServices).
|
|
532
|
+
expect(resetService.resetAllCachedServices).toHaveBeenCalled();
|
|
536
533
|
});
|
|
537
534
|
});
|
|
535
|
+
|
|
536
|
+
describe('Init Promise Functions', () => {
|
|
537
|
+
describe('SSR environment handling', () => {
|
|
538
|
+
let originalWindow: typeof globalThis.window;
|
|
539
|
+
|
|
540
|
+
beforeEach(() => {
|
|
541
|
+
originalWindow = global.window;
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
afterEach(() => {
|
|
545
|
+
global.window = originalWindow;
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
test('createAndSetInitPromise should log error in SSR environment', () => {
|
|
549
|
+
delete global.window;
|
|
550
|
+
|
|
551
|
+
createAndSetInitPromise();
|
|
552
|
+
|
|
553
|
+
expect(logger.error).toHaveBeenCalledWith(
|
|
554
|
+
ERROR_MESSAGE.SSR_ENVIRONMENT_ERROR
|
|
555
|
+
);
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
test('init should log error and return null in SSR environment', () => {
|
|
559
|
+
delete global.window;
|
|
560
|
+
|
|
561
|
+
const result = base.init({
|
|
562
|
+
thoughtSpotHost: 'tshost',
|
|
563
|
+
authType: index.AuthType.None,
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
expect(logger.error).toHaveBeenCalledWith(
|
|
567
|
+
ERROR_MESSAGE.SSR_ENVIRONMENT_ERROR
|
|
568
|
+
);
|
|
569
|
+
expect(result).toBeNull();
|
|
570
|
+
});
|
|
571
|
+
});
|
|
572
|
+
beforeEach(() => {
|
|
573
|
+
base.reset();
|
|
574
|
+
(window as any)._tsEmbedSDK = {};
|
|
575
|
+
createAndSetInitPromise();
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
test('getIsInitCalled should return false before init is called', () => {
|
|
579
|
+
expect(getIsInitCalled()).toBe(false);
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
test('getIsInitCalled should return true after init is called', () => {
|
|
583
|
+
base.init({
|
|
584
|
+
thoughtSpotHost: 'tshost',
|
|
585
|
+
authType: index.AuthType.None,
|
|
586
|
+
});
|
|
587
|
+
expect(getIsInitCalled()).toBe(true);
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
test('getInitPromise should return a promise', () => {
|
|
591
|
+
const promise = getInitPromise();
|
|
592
|
+
expect(promise).toBeInstanceOf(Promise);
|
|
593
|
+
});
|
|
594
|
+
|
|
595
|
+
test('getInitPromise should resolve with authEE after init is called', async () => {
|
|
596
|
+
const initPromise = getInitPromise();
|
|
597
|
+
const authEE = base.init({
|
|
598
|
+
thoughtSpotHost: 'tshost',
|
|
599
|
+
authType: index.AuthType.None,
|
|
600
|
+
});
|
|
601
|
+
const resolvedValue = await initPromise;
|
|
602
|
+
expect(resolvedValue).toBe(authEE);
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
test('createAndSetInitPromise should not override existing promise if ignoreIfAlreadyExists', () => {
|
|
606
|
+
const firstPromise = getInitPromise();
|
|
607
|
+
createAndSetInitPromise();
|
|
608
|
+
const secondPromise = getInitPromise();
|
|
609
|
+
expect(firstPromise).toBe(secondPromise);
|
|
610
|
+
});
|
|
611
|
+
});
|
package/src/embed/base.ts
CHANGED
|
@@ -33,9 +33,10 @@ import {
|
|
|
33
33
|
import '../utils/with-resolvers-polyfill';
|
|
34
34
|
import { uploadMixpanelEvent, MIXPANEL_EVENT } from '../mixpanel-service';
|
|
35
35
|
import { getEmbedConfig, setEmbedConfig } from './embedConfig';
|
|
36
|
-
import { getQueryParamString, getValueFromWindow, storeValueInWindow } from '../utils';
|
|
36
|
+
import { getQueryParamString, getValueFromWindow, isWindowUndefined, storeValueInWindow } from '../utils';
|
|
37
37
|
import { resetAllCachedServices } from '../utils/resetServices';
|
|
38
38
|
import { reload } from '../utils/processTrigger';
|
|
39
|
+
import { ERROR_MESSAGE } from '../errors';
|
|
39
40
|
|
|
40
41
|
const CONFIG_DEFAULTS: Partial<EmbedConfig> = {
|
|
41
42
|
loginFailedMessage: 'Not logged in',
|
|
@@ -192,6 +193,7 @@ type InitFlagStore = {
|
|
|
192
193
|
const initFlagKey = 'initFlagKey';
|
|
193
194
|
|
|
194
195
|
export const createAndSetInitPromise = (): void => {
|
|
196
|
+
if (isWindowUndefined()) return;
|
|
195
197
|
const {
|
|
196
198
|
promise: initPromise,
|
|
197
199
|
resolve: initPromiseResolve,
|
|
@@ -238,7 +240,8 @@ export const getIsInitCalled = (): boolean => !!getValueFromWindow(initFlagKey)?
|
|
|
238
240
|
* @version SDK: 1.0.0 | ThoughtSpot ts7.april.cl, 7.2.1
|
|
239
241
|
* @group Authentication / Init
|
|
240
242
|
*/
|
|
241
|
-
export const init = (embedConfig: EmbedConfig): AuthEventEmitter => {
|
|
243
|
+
export const init = (embedConfig: EmbedConfig): AuthEventEmitter | null => {
|
|
244
|
+
if (isWindowUndefined()) return null;
|
|
242
245
|
sanity(embedConfig);
|
|
243
246
|
resetAllCachedServices();
|
|
244
247
|
embedConfig = setEmbedConfig(
|
|
@@ -22,8 +22,8 @@ describe('SpotterAgentEmbed', () => {
|
|
|
22
22
|
thoughtSpotHost,
|
|
23
23
|
authType: AuthType.None,
|
|
24
24
|
});
|
|
25
|
-
jest.spyOn(authInstance, 'postLoginService').mockImplementation(() => Promise.resolve(
|
|
26
|
-
spyOn(window, 'alert');
|
|
25
|
+
jest.spyOn(authInstance, 'postLoginService').mockImplementation(() => Promise.resolve(undefined));
|
|
26
|
+
jest.spyOn(window, 'alert').mockImplementation(() => undefined);
|
|
27
27
|
document.body.innerHTML = getDocumentBody();
|
|
28
28
|
});
|
|
29
29
|
|
|
@@ -2,7 +2,7 @@ import { SpotterEmbed, SpotterEmbedViewConfig, ConversationEmbed } from './conve
|
|
|
2
2
|
import { TsEmbed } from './ts-embed';
|
|
3
3
|
import * as authInstance from '../auth';
|
|
4
4
|
import { Action, init } from '../index';
|
|
5
|
-
import { AuthType, Param, RuntimeFilterOp } from '../types';
|
|
5
|
+
import { AuthType, Param, RuntimeFilterOp, ErrorDetailsTypes, EmbedErrorCodes } from '../types';
|
|
6
6
|
import {
|
|
7
7
|
getDocumentBody,
|
|
8
8
|
getIFrameSrc,
|
|
@@ -19,8 +19,8 @@ beforeAll(() => {
|
|
|
19
19
|
thoughtSpotHost,
|
|
20
20
|
authType: AuthType.None,
|
|
21
21
|
});
|
|
22
|
-
jest.spyOn(authInstance, 'postLoginService').mockImplementation(() => Promise.resolve(
|
|
23
|
-
spyOn(window, 'alert');
|
|
22
|
+
jest.spyOn(authInstance, 'postLoginService').mockImplementation(() => Promise.resolve(undefined));
|
|
23
|
+
jest.spyOn(window, 'alert');
|
|
24
24
|
document.body.innerHTML = getDocumentBody();
|
|
25
25
|
});
|
|
26
26
|
|
|
@@ -120,7 +120,12 @@ describe('ConversationEmbed', () => {
|
|
|
120
120
|
(conversationEmbed as any).handleError = jest.fn();
|
|
121
121
|
await conversationEmbed.render();
|
|
122
122
|
expect((conversationEmbed as any).handleError).toHaveBeenCalledWith(
|
|
123
|
-
|
|
123
|
+
{
|
|
124
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
125
|
+
message: ERROR_MESSAGE.SPOTTER_EMBED_WORKSHEED_ID_NOT_FOUND,
|
|
126
|
+
code: EmbedErrorCodes.WORKSHEET_ID_NOT_FOUND,
|
|
127
|
+
error: ERROR_MESSAGE.SPOTTER_EMBED_WORKSHEED_ID_NOT_FOUND,
|
|
128
|
+
},
|
|
124
129
|
);
|
|
125
130
|
});
|
|
126
131
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import isUndefined from 'lodash/isUndefined';
|
|
2
2
|
import { ERROR_MESSAGE } from '../errors';
|
|
3
|
-
import { Param, BaseViewConfig, RuntimeFilter, RuntimeParameter } from '../types';
|
|
3
|
+
import { Param, BaseViewConfig, RuntimeFilter, RuntimeParameter, ErrorDetailsTypes, EmbedErrorCodes } from '../types';
|
|
4
4
|
import { TsEmbed } from './ts-embed';
|
|
5
5
|
import { getQueryParamString, getFilterQuery, getRuntimeParameters } from '../utils';
|
|
6
6
|
|
|
@@ -246,7 +246,12 @@ export class SpotterEmbed extends TsEmbed {
|
|
|
246
246
|
} = this.viewConfig;
|
|
247
247
|
|
|
248
248
|
if (!worksheetId) {
|
|
249
|
-
this.handleError(
|
|
249
|
+
this.handleError({
|
|
250
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
251
|
+
message: ERROR_MESSAGE.SPOTTER_EMBED_WORKSHEED_ID_NOT_FOUND,
|
|
252
|
+
code: EmbedErrorCodes.WORKSHEET_ID_NOT_FOUND,
|
|
253
|
+
error: ERROR_MESSAGE.SPOTTER_EMBED_WORKSHEED_ID_NOT_FOUND,
|
|
254
|
+
});
|
|
250
255
|
}
|
|
251
256
|
const queryParams = this.getBaseQueryParams();
|
|
252
257
|
queryParams[Param.SpotterEnabled] = true;
|