@thoughtspot/visual-embed-sdk 1.47.3 → 1.49.0
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 +1 -1
- package/cjs/src/auth.d.ts.map +1 -1
- package/cjs/src/auth.js +11 -1
- package/cjs/src/auth.js.map +1 -1
- package/cjs/src/auth.spec.js +38 -0
- package/cjs/src/auth.spec.js.map +1 -1
- package/cjs/src/authToken.d.ts +2 -0
- package/cjs/src/authToken.d.ts.map +1 -1
- package/cjs/src/authToken.js +7 -5
- package/cjs/src/authToken.js.map +1 -1
- package/cjs/src/css-variables.d.ts +140 -0
- package/cjs/src/css-variables.d.ts.map +1 -1
- package/cjs/src/embed/app.d.ts +63 -2
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +57 -6
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +200 -1
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.js +7 -2
- package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.spec.js +385 -6
- package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
- package/cjs/src/embed/base.d.ts +1 -0
- package/cjs/src/embed/base.d.ts.map +1 -1
- package/cjs/src/embed/base.js +13 -1
- package/cjs/src/embed/base.js.map +1 -1
- package/cjs/src/embed/base.spec.js +21 -0
- package/cjs/src/embed/base.spec.js.map +1 -1
- package/cjs/src/embed/bodyless-conversation.spec.js +86 -0
- package/cjs/src/embed/bodyless-conversation.spec.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +16 -1
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +5 -1
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +26 -0
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +48 -2
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +48 -7
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +139 -1
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.d.ts +85 -0
- package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -0
- package/cjs/src/embed/spotter-viz-utils.js +17 -0
- package/cjs/src/embed/spotter-viz-utils.js.map +1 -0
- package/cjs/src/embed/spotter-viz-utils.spec.d.ts +2 -0
- package/cjs/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
- package/cjs/src/embed/spotter-viz-utils.spec.js +31 -0
- package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -0
- package/cjs/src/embed/ts-embed.d.ts +58 -38
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +247 -151
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +397 -122
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/index.d.ts +2 -1
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/react/index.d.ts.map +1 -1
- package/cjs/src/react/index.js +3 -0
- package/cjs/src/react/index.js.map +1 -1
- package/cjs/src/tokenizedFetch.d.ts.map +1 -1
- package/cjs/src/tokenizedFetch.js +12 -9
- package/cjs/src/tokenizedFetch.js.map +1 -1
- package/cjs/src/tokenizedFetch.spec.d.ts +2 -0
- package/cjs/src/tokenizedFetch.spec.d.ts.map +1 -0
- package/cjs/src/tokenizedFetch.spec.js +68 -0
- package/cjs/src/tokenizedFetch.spec.js.map +1 -0
- package/cjs/src/types.d.ts +309 -40
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +251 -23
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/authService/tokenizedAuthService.spec.js +6 -7
- package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/cjs/src/utils/logger.js +2 -1
- package/cjs/src/utils/logger.js.map +1 -1
- package/cjs/src/utils/logger.spec.d.ts +1 -0
- package/cjs/src/utils/logger.spec.d.ts.map +1 -1
- package/cjs/src/utils/logger.spec.js +10 -9
- package/cjs/src/utils/logger.spec.js.map +1 -1
- package/cjs/src/utils.d.ts +4 -1
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +107 -10
- package/cjs/src/utils.js.map +1 -1
- package/cjs/src/utils.spec.js +163 -4
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-DZq20cR6.js → index-_UGCSSDR.js} +1 -1
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/authToken.d.ts +2 -0
- package/dist/src/authToken.d.ts.map +1 -1
- package/dist/src/css-variables.d.ts +140 -0
- package/dist/src/css-variables.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +63 -2
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts +1 -0
- package/dist/src/embed/base.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +16 -1
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +48 -2
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/spotter-viz-utils.d.ts +85 -0
- package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -0
- package/dist/src/embed/spotter-viz-utils.spec.d.ts +2 -0
- package/dist/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
- package/dist/src/embed/ts-embed.d.ts +58 -38
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/react/index.d.ts.map +1 -1
- package/dist/src/tokenizedFetch.d.ts.map +1 -1
- package/dist/src/tokenizedFetch.spec.d.ts +2 -0
- package/dist/src/tokenizedFetch.spec.d.ts.map +1 -0
- package/dist/src/types.d.ts +309 -40
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/logger.spec.d.ts +1 -0
- package/dist/src/utils/logger.spec.d.ts.map +1 -1
- package/dist/src/utils.d.ts +4 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +3418 -2899
- package/dist/tsembed-react.js +3420 -2901
- package/dist/tsembed.es.js +3426 -2905
- package/dist/tsembed.js +3419 -2898
- package/dist/visual-embed-sdk-react-full.d.ts +687 -78
- package/dist/visual-embed-sdk-react.d.ts +687 -78
- package/dist/visual-embed-sdk.d.ts +702 -80
- package/lib/package.json +1 -1
- package/lib/src/auth.d.ts.map +1 -1
- package/lib/src/auth.js +12 -2
- package/lib/src/auth.js.map +1 -1
- package/lib/src/auth.spec.js +38 -0
- package/lib/src/auth.spec.js.map +1 -1
- package/lib/src/authToken.d.ts +2 -0
- package/lib/src/authToken.d.ts.map +1 -1
- package/lib/src/authToken.js +2 -2
- package/lib/src/authToken.js.map +1 -1
- package/lib/src/css-variables.d.ts +140 -0
- package/lib/src/css-variables.d.ts.map +1 -1
- package/lib/src/embed/app.d.ts +63 -2
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +58 -7
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +201 -2
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.js +7 -2
- package/lib/src/embed/auto-frame-renderer.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.spec.js +387 -8
- package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts +1 -0
- package/lib/src/embed/base.d.ts.map +1 -1
- package/lib/src/embed/base.js +11 -0
- package/lib/src/embed/base.js.map +1 -1
- package/lib/src/embed/base.spec.js +22 -1
- package/lib/src/embed/base.spec.js.map +1 -1
- package/lib/src/embed/bodyless-conversation.spec.js +86 -0
- package/lib/src/embed/bodyless-conversation.spec.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +16 -1
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +5 -1
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +27 -1
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +48 -2
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +49 -8
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +139 -1
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/spotter-viz-utils.d.ts +85 -0
- package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -0
- package/lib/src/embed/spotter-viz-utils.js +13 -0
- package/lib/src/embed/spotter-viz-utils.js.map +1 -0
- package/lib/src/embed/spotter-viz-utils.spec.d.ts +2 -0
- package/lib/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
- package/lib/src/embed/spotter-viz-utils.spec.js +29 -0
- package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -0
- package/lib/src/embed/ts-embed.d.ts +58 -38
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +250 -154
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +397 -122
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/index.d.ts +2 -1
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js.map +1 -1
- package/lib/src/react/index.d.ts.map +1 -1
- package/lib/src/react/index.js +3 -0
- package/lib/src/react/index.js.map +1 -1
- package/lib/src/tokenizedFetch.d.ts.map +1 -1
- package/lib/src/tokenizedFetch.js +13 -10
- package/lib/src/tokenizedFetch.js.map +1 -1
- package/lib/src/tokenizedFetch.spec.d.ts +2 -0
- package/lib/src/tokenizedFetch.spec.d.ts.map +1 -0
- package/lib/src/tokenizedFetch.spec.js +65 -0
- package/lib/src/tokenizedFetch.spec.js.map +1 -0
- package/lib/src/types.d.ts +309 -40
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +251 -23
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/authService/tokenizedAuthService.spec.js +6 -7
- package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/lib/src/utils/logger.js +2 -1
- package/lib/src/utils/logger.js.map +1 -1
- package/lib/src/utils/logger.spec.d.ts +1 -0
- package/lib/src/utils/logger.spec.d.ts.map +1 -1
- package/lib/src/utils/logger.spec.js +10 -9
- package/lib/src/utils/logger.spec.js.map +1 -1
- package/lib/src/utils.d.ts +4 -1
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +103 -9
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js +164 -5
- package/lib/src/utils.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +702 -80
- package/package.json +1 -1
- package/src/auth.spec.ts +55 -1
- package/src/auth.ts +11 -2
- package/src/authToken.ts +2 -2
- package/src/css-variables.ts +175 -1
- package/src/embed/app.spec.ts +260 -3
- package/src/embed/app.ts +127 -7
- package/src/embed/auto-frame-renderer.spec.ts +457 -58
- package/src/embed/auto-frame-renderer.ts +7 -2
- package/src/embed/base.spec.ts +25 -1
- package/src/embed/base.ts +19 -5
- package/src/embed/bodyless-conversation.spec.ts +93 -0
- package/src/embed/conversation.spec.ts +34 -0
- package/src/embed/conversation.ts +22 -1
- package/src/embed/liveboard.spec.ts +163 -1
- package/src/embed/liveboard.ts +106 -10
- package/src/embed/spotter-viz-utils.spec.ts +30 -0
- package/src/embed/spotter-viz-utils.ts +94 -0
- package/src/embed/ts-embed.spec.ts +564 -231
- package/src/embed/ts-embed.ts +384 -258
- package/src/index.ts +3 -0
- package/src/react/index.tsx +3 -0
- package/src/tokenizedFetch.spec.ts +81 -0
- package/src/tokenizedFetch.ts +14 -11
- package/src/types.ts +326 -36
- package/src/utils/authService/tokenizedAuthService.spec.ts +6 -6
- package/src/utils/logger.spec.ts +11 -9
- package/src/utils/logger.ts +2 -2
- package/src/utils.spec.ts +200 -4
- package/src/utils.ts +128 -9
package/src/embed/liveboard.ts
CHANGED
|
@@ -23,14 +23,26 @@ import {
|
|
|
23
23
|
ErrorDetailsTypes,
|
|
24
24
|
EmbedErrorCodes,
|
|
25
25
|
ContextType,
|
|
26
|
+
DefaultAppInitData,
|
|
26
27
|
} from '../types';
|
|
27
|
-
import { calculateVisibleElementData, getQueryParamString, isUndefined, isValidCssMargin, setParamIfDefined } from '../utils';
|
|
28
|
+
import { calculateVisibleElementData, getEffectiveClippingAncestors, getQueryParamString, getScrollableAncestors, isUndefined, isValidCssMargin, setParamIfDefined } from '../utils';
|
|
28
29
|
import { getAuthPromise } from './base';
|
|
29
30
|
import { TsEmbed, V1Embed } from './ts-embed';
|
|
30
31
|
import { addPreviewStylesIfNotPresent } from '../utils/global-styles';
|
|
31
32
|
import { TriggerPayload, TriggerResponse } from './hostEventClient/contracts';
|
|
32
33
|
import { logger } from '../utils/logger';
|
|
33
34
|
import { SpotterChatViewConfig } from './conversation';
|
|
35
|
+
import { SpotterVizConfig, buildSpotterVizAppInitData } from './spotter-viz-utils';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* APP_INIT data shape for LiveboardEmbed.
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
export interface LiveboardEmbedAppInitData extends DefaultAppInitData {
|
|
42
|
+
embedParams?: {
|
|
43
|
+
spotterVizConfig?: SpotterVizConfig;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
34
46
|
|
|
35
47
|
|
|
36
48
|
/**
|
|
@@ -388,9 +400,9 @@ export interface LiveboardViewConfig extends BaseViewConfig, LiveboardOtherViewC
|
|
|
388
400
|
*/
|
|
389
401
|
isPNGInScheduledEmailsEnabled?: boolean;
|
|
390
402
|
/**
|
|
391
|
-
* Enables the 'what you see is what you get' PDF export for Liveboards. Each tab is rendered on a single page
|
|
392
|
-
* following the exact UI layout, instead of splitting visualizations across multiple A4 pages.
|
|
393
|
-
* This feature is GA from version 26.5.0.cl
|
|
403
|
+
* Enables the 'what you see is what you get' PDF export for Liveboards. Each tab is rendered on a single page
|
|
404
|
+
* following the exact UI layout, instead of splitting visualizations across multiple A4 pages.
|
|
405
|
+
* This feature is GA from version 26.5.0.cl. It is disabled by default in embed deployments.
|
|
394
406
|
*
|
|
395
407
|
* Supported embed types: `AppEmbed`, `LiveboardEmbed`
|
|
396
408
|
* @type {boolean}
|
|
@@ -453,6 +465,16 @@ export interface LiveboardViewConfig extends BaseViewConfig, LiveboardOtherViewC
|
|
|
453
465
|
* ```
|
|
454
466
|
*/
|
|
455
467
|
lazyLoadingForFullHeight?: boolean;
|
|
468
|
+
/**
|
|
469
|
+
* This flag is used to enable container-aware full height lazy loading.
|
|
470
|
+
*
|
|
471
|
+
* Use this when the embed is rendered inside a scrollable or clipping
|
|
472
|
+
* container instead of relying on the browser window as the only viewport.
|
|
473
|
+
*
|
|
474
|
+
* @type {boolean}
|
|
475
|
+
* @default false
|
|
476
|
+
*/
|
|
477
|
+
enableScrollableContainerLazyLoading?: boolean;
|
|
456
478
|
/**
|
|
457
479
|
* The margin to be used for lazy loading.
|
|
458
480
|
*
|
|
@@ -534,6 +556,29 @@ export interface LiveboardViewConfig extends BaseViewConfig, LiveboardOtherViewC
|
|
|
534
556
|
* ```
|
|
535
557
|
*/
|
|
536
558
|
spotterChatConfig?: SpotterChatViewConfig;
|
|
559
|
+
/**
|
|
560
|
+
* Configuration for the SpotterViz interface shown on the Liveboard.
|
|
561
|
+
* Customize the brand name, description, chat input placeholder,
|
|
562
|
+
* starter prompts, and visibility of starter prompts in the SpotterViz panel.
|
|
563
|
+
*
|
|
564
|
+
* Supported embed types: `AppEmbed`, `LiveboardEmbed`
|
|
565
|
+
* @version SDK: 1.50.0 | ThoughtSpot Cloud: 26.7.0.cl
|
|
566
|
+
* @example
|
|
567
|
+
* ```js
|
|
568
|
+
* const embed = new LiveboardEmbed('#embed-container', {
|
|
569
|
+
* ... // other options
|
|
570
|
+
* spotterViz: {
|
|
571
|
+
* brandName: 'MyBrand',
|
|
572
|
+
* brandHeadline: 'Hi, there! I\'m',
|
|
573
|
+
* description: 'Ask questions about your data',
|
|
574
|
+
* inputChatPlaceholder: 'Ask a question...',
|
|
575
|
+
* hideStarterPrompts: false,
|
|
576
|
+
* customStarterPrompts: [{ id: '1', displayText: 'Top products', fullPrompt: 'What are the top products by revenue?' }],
|
|
577
|
+
* },
|
|
578
|
+
* })
|
|
579
|
+
* ```
|
|
580
|
+
*/
|
|
581
|
+
spotterViz?: SpotterVizConfig;
|
|
537
582
|
/**
|
|
538
583
|
* If set to true, enables visualization data caching on the Liveboard.
|
|
539
584
|
* @type {boolean}
|
|
@@ -569,6 +614,10 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
569
614
|
|
|
570
615
|
private defaultHeight = 500;
|
|
571
616
|
|
|
617
|
+
private lazyLoadScrollContainers: HTMLElement[] = [];
|
|
618
|
+
|
|
619
|
+
private lazyLoadResizeObserver: ResizeObserver | undefined;
|
|
620
|
+
|
|
572
621
|
|
|
573
622
|
constructor(domSelector: DOMSelector, viewConfig: LiveboardViewConfig) {
|
|
574
623
|
viewConfig.embedComponentType = 'LiveboardEmbed';
|
|
@@ -586,6 +635,11 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
586
635
|
}
|
|
587
636
|
}
|
|
588
637
|
|
|
638
|
+
protected async getAppInitData(): Promise<LiveboardEmbedAppInitData> {
|
|
639
|
+
const defaultAppInitData = await super.getAppInitData();
|
|
640
|
+
return buildSpotterVizAppInitData(defaultAppInitData, this.viewConfig);
|
|
641
|
+
}
|
|
642
|
+
|
|
589
643
|
/**
|
|
590
644
|
* Construct a map of params to be passed on to the
|
|
591
645
|
* embedded Liveboard or visualization.
|
|
@@ -640,7 +694,7 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
640
694
|
enableStopAnswerGenerationEmbed,
|
|
641
695
|
spotterChatConfig,
|
|
642
696
|
isThisPeriodInDateFiltersEnabled,
|
|
643
|
-
isContinuousLiveboardPDFEnabled,
|
|
697
|
+
isContinuousLiveboardPDFEnabled = false,
|
|
644
698
|
enableLiveboardDataCache,
|
|
645
699
|
} = this.viewConfig;
|
|
646
700
|
|
|
@@ -735,10 +789,18 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
735
789
|
const {
|
|
736
790
|
hideToolResponseCardBranding,
|
|
737
791
|
toolResponseCardBrandingLabel,
|
|
792
|
+
spotterFileUploadEnabled,
|
|
793
|
+
spotterFileUploadFileTypes,
|
|
738
794
|
} = spotterChatConfig;
|
|
739
795
|
|
|
740
796
|
setParamIfDefined(params, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
|
|
741
797
|
setParamIfDefined(params, Param.ToolResponseCardBrandingLabel, toolResponseCardBrandingLabel);
|
|
798
|
+
if (spotterFileUploadEnabled !== undefined) {
|
|
799
|
+
params[Param.SpotterFileUploadEnabled] = spotterFileUploadEnabled;
|
|
800
|
+
}
|
|
801
|
+
if (spotterFileUploadFileTypes !== undefined) {
|
|
802
|
+
params[Param.SpotterFileUploadFileTypes] = JSON.stringify(spotterFileUploadFileTypes);
|
|
803
|
+
}
|
|
742
804
|
}
|
|
743
805
|
|
|
744
806
|
if (isLinkParametersEnabled !== undefined) {
|
|
@@ -825,7 +887,10 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
825
887
|
}
|
|
826
888
|
|
|
827
889
|
private sendFullHeightLazyLoadData = () => {
|
|
828
|
-
const data = calculateVisibleElementData(
|
|
890
|
+
const data = calculateVisibleElementData(
|
|
891
|
+
this.iFrame,
|
|
892
|
+
this.viewConfig.enableScrollableContainerLazyLoading,
|
|
893
|
+
);
|
|
829
894
|
// this should be fired only if the lazyLoadingForFullHeight and fullHeight are true
|
|
830
895
|
if(this.viewConfig.lazyLoadingForFullHeight && this.viewConfig.fullHeight){
|
|
831
896
|
this.trigger(HostEvent.VisibleEmbedCoordinates, data);
|
|
@@ -840,7 +905,10 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
840
905
|
*/
|
|
841
906
|
private requestVisibleEmbedCoordinatesHandler = (data: MessagePayload, responder: any) => {
|
|
842
907
|
logger.info('Sending RequestVisibleEmbedCoordinates', data);
|
|
843
|
-
const visibleCoordinatesData = calculateVisibleElementData(
|
|
908
|
+
const visibleCoordinatesData = calculateVisibleElementData(
|
|
909
|
+
this.iFrame,
|
|
910
|
+
this.viewConfig.enableScrollableContainerLazyLoading,
|
|
911
|
+
);
|
|
844
912
|
responder({ type: EmbedEvent.RequestVisibleEmbedCoordinates, data: visibleCoordinatesData });
|
|
845
913
|
}
|
|
846
914
|
|
|
@@ -938,8 +1006,8 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
938
1006
|
</div>
|
|
939
1007
|
`;
|
|
940
1008
|
const previewDiv = div.firstElementChild as HTMLElement;
|
|
941
|
-
this.
|
|
942
|
-
this.
|
|
1009
|
+
this.hostElement.appendChild(previewDiv);
|
|
1010
|
+
this.hostElement.style.position = 'relative';
|
|
943
1011
|
this.on(EmbedEvent.Data, () => {
|
|
944
1012
|
previewDiv.remove();
|
|
945
1013
|
});
|
|
@@ -961,6 +1029,7 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
961
1029
|
};
|
|
962
1030
|
|
|
963
1031
|
protected beforePrerenderVisible(): void {
|
|
1032
|
+
super.beforePrerenderVisible();
|
|
964
1033
|
const embedObj = this.getPreRenderObj<LiveboardEmbed>();
|
|
965
1034
|
|
|
966
1035
|
this.executeAfterEmbedContainerLoaded(() => {
|
|
@@ -1023,17 +1092,44 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
1023
1092
|
}
|
|
1024
1093
|
|
|
1025
1094
|
private registerLazyLoadEvents() {
|
|
1095
|
+
if(!this.iFrame) {
|
|
1096
|
+
return;
|
|
1097
|
+
}
|
|
1026
1098
|
if (this.viewConfig.fullHeight && this.viewConfig.lazyLoadingForFullHeight) {
|
|
1099
|
+
this.unregisterLazyLoadEvents();
|
|
1027
1100
|
// TODO: Use passive: true, install modernizr to check for passive
|
|
1028
1101
|
window.addEventListener('resize', this.sendFullHeightLazyLoadData);
|
|
1029
1102
|
window.addEventListener('scroll', this.sendFullHeightLazyLoadData, true);
|
|
1103
|
+
if (!this.viewConfig.enableScrollableContainerLazyLoading) {
|
|
1104
|
+
return;
|
|
1105
|
+
}
|
|
1106
|
+
this.lazyLoadScrollContainers = getScrollableAncestors(this.iFrame);
|
|
1107
|
+
this.lazyLoadScrollContainers.forEach((scrollContainer) => {
|
|
1108
|
+
scrollContainer.addEventListener('scroll', this.sendFullHeightLazyLoadData);
|
|
1109
|
+
});
|
|
1110
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
1111
|
+
const resizeTargets = new Set([
|
|
1112
|
+
this.iFrame.parentElement,
|
|
1113
|
+
...getEffectiveClippingAncestors(this.iFrame),
|
|
1114
|
+
].filter(Boolean) as HTMLElement[]);
|
|
1115
|
+
this.lazyLoadResizeObserver = new ResizeObserver(this.sendFullHeightLazyLoadData);
|
|
1116
|
+
resizeTargets.forEach((resizeTarget) => {
|
|
1117
|
+
this.lazyLoadResizeObserver.observe(resizeTarget);
|
|
1118
|
+
});
|
|
1119
|
+
}
|
|
1030
1120
|
}
|
|
1031
1121
|
}
|
|
1032
1122
|
|
|
1033
1123
|
private unregisterLazyLoadEvents() {
|
|
1034
1124
|
if (this.viewConfig.fullHeight && this.viewConfig.lazyLoadingForFullHeight) {
|
|
1035
1125
|
window.removeEventListener('resize', this.sendFullHeightLazyLoadData);
|
|
1036
|
-
window.removeEventListener('scroll', this.sendFullHeightLazyLoadData);
|
|
1126
|
+
window.removeEventListener('scroll', this.sendFullHeightLazyLoadData, true);
|
|
1127
|
+
this.lazyLoadResizeObserver?.disconnect();
|
|
1128
|
+
this.lazyLoadResizeObserver = undefined;
|
|
1129
|
+
this.lazyLoadScrollContainers.forEach((scrollContainer) => {
|
|
1130
|
+
scrollContainer.removeEventListener('scroll', this.sendFullHeightLazyLoadData);
|
|
1131
|
+
});
|
|
1132
|
+
this.lazyLoadScrollContainers = [];
|
|
1037
1133
|
}
|
|
1038
1134
|
}
|
|
1039
1135
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { buildSpotterVizAppInitData } from './spotter-viz-utils';
|
|
2
|
+
|
|
3
|
+
describe('buildSpotterVizAppInitData', () => {
|
|
4
|
+
const base = { type: 'APP_INIT' } as any;
|
|
5
|
+
|
|
6
|
+
it('returns initData unchanged when spotterViz is not provided', () => {
|
|
7
|
+
const result = buildSpotterVizAppInitData(base, {});
|
|
8
|
+
expect(result).toBe(base);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('nests spotterViz under embedParams.spotterVizConfig', () => {
|
|
12
|
+
const spotterViz = { brandName: 'MyBrand', description: 'Desc', inputChatPlaceholder: 'Ask...' };
|
|
13
|
+
const result = buildSpotterVizAppInitData(base, { spotterViz });
|
|
14
|
+
expect(result.embedParams?.spotterVizConfig).toEqual(spotterViz);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('passes brandHeadline through spotterVizConfig', () => {
|
|
18
|
+
const spotterViz = { brandName: 'MyBrand', brandHeadline: "Hi, there! I'm" };
|
|
19
|
+
const result = buildSpotterVizAppInitData(base, { spotterViz });
|
|
20
|
+
expect(result.embedParams?.spotterVizConfig?.brandHeadline).toBe("Hi, there! I'm");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('preserves existing embedParams when adding spotterVizConfig', () => {
|
|
24
|
+
const existing = { ...base, embedParams: { spotterSidebarConfig: { enablePastConversationsSidebar: true } } };
|
|
25
|
+
const spotterViz = { brandName: 'MyBrand' };
|
|
26
|
+
const result = buildSpotterVizAppInitData(existing, { spotterViz });
|
|
27
|
+
expect(result.embedParams?.spotterVizConfig).toEqual(spotterViz);
|
|
28
|
+
expect(result.embedParams?.spotterSidebarConfig?.enablePastConversationsSidebar).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { DefaultAppInitData } from '../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Defines starter prompts displayed in the SpotterViz interface.
|
|
5
|
+
* @version SDK: 1.50.0 | ThoughtSpot Cloud: 26.7.0.cl
|
|
6
|
+
* @group Embed components
|
|
7
|
+
*/
|
|
8
|
+
export interface SpotterVizStarterPrompt {
|
|
9
|
+
/** Identifier for the prompt. */
|
|
10
|
+
id: string;
|
|
11
|
+
/** Short label shown to the user as a clickable suggestion. */
|
|
12
|
+
displayText: string;
|
|
13
|
+
/** Full prompt text sent to Spotter when the user clicks the suggestion. */
|
|
14
|
+
fullPrompt: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for the SpotterViz interface shown on the Liveboard.
|
|
19
|
+
* Supported embed types: `AppEmbed`, `LiveboardEmbed`
|
|
20
|
+
* @version SDK: 1.50.0 | ThoughtSpot Cloud: 26.7.0.cl
|
|
21
|
+
* @group Embed components
|
|
22
|
+
* @example
|
|
23
|
+
* ```js
|
|
24
|
+
* const embed = new AppEmbed('#embed-container', {
|
|
25
|
+
* ... // other options,
|
|
26
|
+
* spotterViz: {
|
|
27
|
+
* brandName: 'MyBrand',
|
|
28
|
+
* brandHeadline: 'Hi, there! I\'m',
|
|
29
|
+
* description: 'Ask questions about your data',
|
|
30
|
+
* inputChatPlaceholder: 'Ask a question...',
|
|
31
|
+
* hideStarterPrompts: false,
|
|
32
|
+
* customStarterPrompts: [
|
|
33
|
+
* { id: '1', displayText: 'Top products', fullPrompt: 'What are the top products by revenue?' }
|
|
34
|
+
* ],
|
|
35
|
+
* },
|
|
36
|
+
* })
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export interface SpotterVizConfig {
|
|
40
|
+
/**
|
|
41
|
+
* Rename the default "SpotterViz" label shown in the SpotterViz interface with a custom brand name.
|
|
42
|
+
* @version SDK: 1.50.0 | ThoughtSpot Cloud: 26.7.0.cl
|
|
43
|
+
* @default ''
|
|
44
|
+
*/
|
|
45
|
+
brandName?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Custom headline text shown before the brand name in the SpotterViz interface.
|
|
48
|
+
* Replaces the default greeting prefix (e.g. "Hi, there! I'm").
|
|
49
|
+
* @version SDK: 1.50.0 | ThoughtSpot Cloud: 26.7.0.cl
|
|
50
|
+
* @default ''
|
|
51
|
+
*/
|
|
52
|
+
brandHeadline?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Hides the starter prompts section entirely in the SpotterViz interface.
|
|
55
|
+
* When set to `true`, the starter prompts are not displayed.
|
|
56
|
+
* @version SDK: 1.50.0 | ThoughtSpot Cloud: 26.7.0.cl
|
|
57
|
+
* @default false
|
|
58
|
+
*/
|
|
59
|
+
hideStarterPrompts?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Overrides the starter prompts with a custom list.
|
|
62
|
+
* Each entry must match the {@link SpotterVizStarterPrompt} shape.
|
|
63
|
+
* Has no effect when `hideStarterPrompts` is `true`.
|
|
64
|
+
* @version SDK: 1.50.0 | ThoughtSpot Cloud: 26.7.0.cl
|
|
65
|
+
*/
|
|
66
|
+
customStarterPrompts?: SpotterVizStarterPrompt[];
|
|
67
|
+
/**
|
|
68
|
+
* Custom description text shown in the SpotterViz interface.
|
|
69
|
+
* Replaces the default SpotterViz description.
|
|
70
|
+
* @version SDK: 1.50.0 | ThoughtSpot Cloud: 26.7.0.cl
|
|
71
|
+
*/
|
|
72
|
+
description?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Custom placeholder text for the chat input in the SpotterViz interface.
|
|
75
|
+
* Replaces the default chat input placeholder text.
|
|
76
|
+
* @version SDK: 1.50.0 | ThoughtSpot Cloud: 26.7.0.cl
|
|
77
|
+
*/
|
|
78
|
+
inputChatPlaceholder?: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function buildSpotterVizAppInitData<T extends DefaultAppInitData>(
|
|
82
|
+
initData: T,
|
|
83
|
+
viewConfig: { spotterViz?: SpotterVizConfig },
|
|
84
|
+
): T & { embedParams?: { spotterVizConfig?: SpotterVizConfig } } {
|
|
85
|
+
const { spotterViz } = viewConfig;
|
|
86
|
+
if (!spotterViz) return initData;
|
|
87
|
+
return {
|
|
88
|
+
...initData,
|
|
89
|
+
embedParams: {
|
|
90
|
+
...((initData as T & { embedParams?: Record<string, unknown> }).embedParams || {}),
|
|
91
|
+
spotterVizConfig: spotterViz,
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|