@thoughtspot/visual-embed-sdk 1.51.0 → 1.51.2
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/config.d.ts +1 -0
- package/cjs/src/config.d.ts.map +1 -1
- package/cjs/src/config.js +2 -1
- package/cjs/src/config.js.map +1 -1
- package/cjs/src/css-variables.d.ts +27 -0
- package/cjs/src/css-variables.d.ts.map +1 -1
- package/cjs/src/embed/app.d.ts +43 -12
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +29 -3
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +253 -1
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/base.d.ts +1 -1
- package/cjs/src/embed/base.js +1 -1
- package/cjs/src/embed/conversation.d.ts +171 -1
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +4 -2
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +125 -0
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/events.spec.js +3 -0
- package/cjs/src/embed/events.spec.js.map +1 -1
- package/cjs/src/embed/host-events.spec.js +36 -0
- package/cjs/src/embed/host-events.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +18 -0
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +40 -13
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +25 -4
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +349 -2
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/search.spec.js +28 -0
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/spotter-utils.d.ts +8 -1
- package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
- package/cjs/src/embed/spotter-utils.js +15 -1
- package/cjs/src/embed/spotter-utils.js.map +1 -1
- package/cjs/src/embed/spotter-utils.spec.js +68 -0
- package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.d.ts +9 -10
- package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +97 -9
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +76 -35
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +537 -3
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/index.d.ts +3 -3
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +3 -2
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/react/all-types-export.d.ts +1 -1
- package/cjs/src/react/all-types-export.d.ts.map +1 -1
- package/cjs/src/react/all-types-export.js +2 -1
- package/cjs/src/react/all-types-export.js.map +1 -1
- package/cjs/src/react/all-types-export.parity.spec.d.ts +2 -0
- package/cjs/src/react/all-types-export.parity.spec.d.ts.map +1 -0
- package/cjs/src/react/all-types-export.parity.spec.js +194 -0
- package/cjs/src/react/all-types-export.parity.spec.js.map +1 -0
- package/cjs/src/react/index.d.ts +66 -32
- package/cjs/src/react/index.d.ts.map +1 -1
- package/cjs/src/react/index.js +5 -3
- package/cjs/src/react/index.js.map +1 -1
- package/cjs/src/react/index.spec.js +101 -0
- package/cjs/src/react/index.spec.js.map +1 -1
- package/cjs/src/types.d.ts +330 -18
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +182 -12
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils.d.ts +5 -0
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +19 -1
- package/cjs/src/utils.js.map +1 -1
- package/cjs/src/utils.spec.js +37 -0
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-aBzH5ZwF.js → index-D8_Zs-Nr.js} +1 -1
- package/dist/src/config.d.ts +1 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/css-variables.d.ts +27 -0
- package/dist/src/css-variables.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +43 -12
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts +1 -1
- package/dist/src/embed/conversation.d.ts +171 -1
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +40 -13
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/spotter-utils.d.ts +8 -1
- package/dist/src/embed/spotter-utils.d.ts.map +1 -1
- package/dist/src/embed/spotter-viz-utils.d.ts +9 -10
- package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +97 -9
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/react/all-types-export.d.ts +1 -1
- package/dist/src/react/all-types-export.d.ts.map +1 -1
- package/dist/src/react/all-types-export.parity.spec.d.ts +2 -0
- package/dist/src/react/all-types-export.parity.spec.d.ts.map +1 -0
- package/dist/src/react/index.d.ts +66 -32
- package/dist/src/react/index.d.ts.map +1 -1
- package/dist/src/types.d.ts +330 -18
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils.d.ts +5 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +354 -64
- package/dist/tsembed-react.js +353 -63
- package/dist/tsembed.es.js +414 -126
- package/dist/tsembed.js +416 -128
- package/dist/visual-embed-sdk-react-full.d.ts +777 -90
- package/dist/visual-embed-sdk-react.d.ts +773 -89
- package/dist/visual-embed-sdk.d.ts +713 -60
- package/lib/package.json +1 -1
- package/lib/src/config.d.ts +1 -0
- package/lib/src/config.d.ts.map +1 -1
- package/lib/src/config.js +1 -0
- package/lib/src/config.js.map +1 -1
- package/lib/src/css-variables.d.ts +27 -0
- package/lib/src/css-variables.d.ts.map +1 -1
- package/lib/src/embed/app.d.ts +43 -12
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +30 -4
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +253 -1
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts +1 -1
- package/lib/src/embed/base.js +1 -1
- package/lib/src/embed/conversation.d.ts +171 -1
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +5 -3
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +125 -0
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/events.spec.js +3 -0
- package/lib/src/embed/events.spec.js.map +1 -1
- package/lib/src/embed/host-events.spec.js +36 -0
- package/lib/src/embed/host-events.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +18 -0
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +40 -13
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +25 -4
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +349 -2
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/search.spec.js +28 -0
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/spotter-utils.d.ts +8 -1
- package/lib/src/embed/spotter-utils.d.ts.map +1 -1
- package/lib/src/embed/spotter-utils.js +13 -0
- package/lib/src/embed/spotter-utils.js.map +1 -1
- package/lib/src/embed/spotter-utils.spec.js +69 -1
- package/lib/src/embed/spotter-utils.spec.js.map +1 -1
- package/lib/src/embed/spotter-viz-utils.d.ts +9 -10
- package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/lib/src/embed/spotter-viz-utils.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +97 -9
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +77 -36
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +537 -3
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/index.d.ts +3 -3
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +2 -2
- package/lib/src/index.js.map +1 -1
- package/lib/src/react/all-types-export.d.ts +1 -1
- package/lib/src/react/all-types-export.d.ts.map +1 -1
- package/lib/src/react/all-types-export.js +1 -1
- package/lib/src/react/all-types-export.js.map +1 -1
- package/lib/src/react/all-types-export.parity.spec.d.ts +2 -0
- package/lib/src/react/all-types-export.parity.spec.d.ts.map +1 -0
- package/lib/src/react/all-types-export.parity.spec.js +191 -0
- package/lib/src/react/all-types-export.parity.spec.js.map +1 -0
- package/lib/src/react/index.d.ts +66 -32
- package/lib/src/react/index.d.ts.map +1 -1
- package/lib/src/react/index.js +5 -3
- package/lib/src/react/index.js.map +1 -1
- package/lib/src/react/index.spec.js +102 -1
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/types.d.ts +330 -18
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +182 -12
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils.d.ts +5 -0
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +17 -0
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js +38 -1
- package/lib/src/utils.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +713 -60
- package/package.json +1 -1
- package/src/config.ts +1 -0
- package/src/css-variables.ts +32 -0
- package/src/embed/app.spec.ts +335 -1
- package/src/embed/app.ts +71 -13
- package/src/embed/base.ts +1 -1
- package/src/embed/conversation.spec.ts +136 -0
- package/src/embed/conversation.ts +181 -3
- package/src/embed/events.spec.ts +4 -0
- package/src/embed/host-events.spec.ts +48 -0
- package/src/embed/hostEventClient/host-event-client.spec.ts +34 -0
- package/src/embed/hostEventClient/host-event-client.ts +2 -2
- package/src/embed/liveboard.spec.ts +457 -2
- package/src/embed/liveboard.ts +74 -15
- package/src/embed/search.spec.ts +31 -0
- package/src/embed/spotter-utils.spec.ts +72 -0
- package/src/embed/spotter-utils.ts +21 -1
- package/src/embed/spotter-viz-utils.ts +9 -10
- package/src/embed/ts-embed.spec.ts +699 -3
- package/src/embed/ts-embed.ts +91 -41
- package/src/index.ts +43 -2
- package/src/react/all-types-export.parity.spec.ts +208 -0
- package/src/react/all-types-export.ts +22 -0
- package/src/react/index.spec.tsx +158 -0
- package/src/react/index.tsx +70 -33
- package/src/types.ts +329 -16
- package/src/utils.spec.ts +49 -0
- package/src/utils.ts +16 -0
package/package.json
CHANGED
package/src/config.ts
CHANGED
package/src/css-variables.ts
CHANGED
|
@@ -534,6 +534,14 @@ export interface CustomCssVariables {
|
|
|
534
534
|
*/
|
|
535
535
|
'--ts-var-liveboard-header-font-color'?: string;
|
|
536
536
|
|
|
537
|
+
/**
|
|
538
|
+
* Left and right margin of the header and the tab/filter section of an
|
|
539
|
+
* embedded Liveboard. Use alongside the `liveboardGutter` view config to
|
|
540
|
+
* keep the header aligned with a custom tile-grid gutter.
|
|
541
|
+
* @version SDK: 1.53.0 | ThoughtSpot Cloud: 26.10.0.cl
|
|
542
|
+
*/
|
|
543
|
+
'--ts-var-liveboard-header-horizontal-margin'?: string;
|
|
544
|
+
|
|
537
545
|
/**
|
|
538
546
|
* Border color of the tiles in the Liveboard.
|
|
539
547
|
*/
|
|
@@ -554,6 +562,21 @@ export interface CustomCssVariables {
|
|
|
554
562
|
*/
|
|
555
563
|
'--ts-var-liveboard-insight-tile-background'?: string;
|
|
556
564
|
|
|
565
|
+
/**
|
|
566
|
+
* Icon color of the insight tiles in the Liveboard.
|
|
567
|
+
*/
|
|
568
|
+
'--ts-var-liveboard-insight-tile-icon-color'?: string;
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Font color of the success text in the insight tiles in the Liveboard.
|
|
572
|
+
*/
|
|
573
|
+
'--ts-var-liveboard-insight-tile-success-color'?: string;
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* Font color of the failure text in the insight tiles in the Liveboard.
|
|
577
|
+
*/
|
|
578
|
+
'--ts-var-liveboard-insight-tile-failure-color'?: string;
|
|
579
|
+
|
|
557
580
|
/**
|
|
558
581
|
* Border radius of the tiles in the Liveboard.
|
|
559
582
|
*/
|
|
@@ -812,6 +835,15 @@ export interface CustomCssVariables {
|
|
|
812
835
|
*/
|
|
813
836
|
'--ts-var-parameter-chip-active-text-color'?: string;
|
|
814
837
|
|
|
838
|
+
/**
|
|
839
|
+
* Color of the dot indicator shown on a filter or parameter chip in the
|
|
840
|
+
* centralized filter modal on a Liveboard. The dot appears when the
|
|
841
|
+
* filter or parameter value has been modified but the changes are not
|
|
842
|
+
* yet applied to the Liveboard.
|
|
843
|
+
* @version SDK: 1.52.0 | ThoughtSpot: 26.10.0.cl
|
|
844
|
+
*/
|
|
845
|
+
'--ts-var-unsaved-filter-indicator-color'?: string;
|
|
846
|
+
|
|
815
847
|
/**
|
|
816
848
|
* Background color of the action button in the Liveboard header.
|
|
817
849
|
*/
|
package/src/embed/app.spec.ts
CHANGED
|
@@ -211,6 +211,7 @@ describe('App embed tests', () => {
|
|
|
211
211
|
[Page.SpotIQ]: 'insights/results',
|
|
212
212
|
[Page.Monitor]: 'insights/monitor-alerts',
|
|
213
213
|
[Page.Collections]: 'collections',
|
|
214
|
+
[Page.LiveboardSchedules]: 'home/liveboard-schedules',
|
|
214
215
|
};
|
|
215
216
|
|
|
216
217
|
const pageIds = Object.keys(pageRouteMap);
|
|
@@ -245,6 +246,7 @@ describe('App embed tests', () => {
|
|
|
245
246
|
[Page.SpotIQ]: 'home/spotiq-analysis',
|
|
246
247
|
[Page.Monitor]: 'home/monitor-alerts',
|
|
247
248
|
[Page.Collections]: 'collections',
|
|
249
|
+
[Page.LiveboardSchedules]: 'home/liveboard-schedules',
|
|
248
250
|
};
|
|
249
251
|
|
|
250
252
|
const pageIdsForModularHomes = Object.keys(pageRouteMapForModularHome);
|
|
@@ -388,6 +390,21 @@ describe('App embed tests', () => {
|
|
|
388
390
|
});
|
|
389
391
|
});
|
|
390
392
|
|
|
393
|
+
test('should set isLiveboardAlwaysOn12ColLayout to true in url', async () => {
|
|
394
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
395
|
+
...defaultViewConfig,
|
|
396
|
+
isLiveboardAlwaysOn12ColLayout: true,
|
|
397
|
+
} as AppViewConfig);
|
|
398
|
+
|
|
399
|
+
appEmbed.render();
|
|
400
|
+
await executeAfterWait(() => {
|
|
401
|
+
expectUrlMatchesWithParams(
|
|
402
|
+
getIFrameSrc(),
|
|
403
|
+
`http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&isLiveboardAlwaysOn12ColLayout=true&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`,
|
|
404
|
+
);
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
|
|
391
408
|
test('should set coverAndFilterOptionInPDF to false in url', async () => {
|
|
392
409
|
const appEmbed = new AppEmbed(getRootEl(), {
|
|
393
410
|
...defaultViewConfig,
|
|
@@ -416,6 +433,20 @@ describe('App embed tests', () => {
|
|
|
416
433
|
});
|
|
417
434
|
});
|
|
418
435
|
|
|
436
|
+
test('should set liveboardGutter in url', async () => {
|
|
437
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
438
|
+
...defaultViewConfig,
|
|
439
|
+
liveboardGutter: 8,
|
|
440
|
+
} as AppViewConfig);
|
|
441
|
+
appEmbed.render();
|
|
442
|
+
await executeAfterWait(() => {
|
|
443
|
+
expectUrlMatchesWithParams(
|
|
444
|
+
getIFrameSrc(),
|
|
445
|
+
`http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&liveboardGutter=8&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`,
|
|
446
|
+
);
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
|
|
419
450
|
test('should set isThisPeriodInDateFiltersEnabled to true in url', async () => {
|
|
420
451
|
const appEmbed = new AppEmbed(getRootEl(), {
|
|
421
452
|
...defaultViewConfig,
|
|
@@ -741,6 +772,40 @@ describe('App embed tests', () => {
|
|
|
741
772
|
});
|
|
742
773
|
});
|
|
743
774
|
|
|
775
|
+
test('should include starterPrompts in APP_INIT embedParams', async () => {
|
|
776
|
+
const starterPrompts = {
|
|
777
|
+
enable: true,
|
|
778
|
+
quick: {
|
|
779
|
+
label: 'Quick',
|
|
780
|
+
questions: [
|
|
781
|
+
{ label: 'Q1', prompt: 'P1' },
|
|
782
|
+
{ label: 'Q2', prompt: 'P2' },
|
|
783
|
+
],
|
|
784
|
+
},
|
|
785
|
+
research: { label: 'Research' },
|
|
786
|
+
};
|
|
787
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
788
|
+
...defaultViewConfig,
|
|
789
|
+
spotterChatConfig: { starterPrompts },
|
|
790
|
+
} as AppViewConfig);
|
|
791
|
+
|
|
792
|
+
mockMessageChannel();
|
|
793
|
+
appEmbed.render();
|
|
794
|
+
|
|
795
|
+
const mockPort: any = { postMessage: jest.fn() };
|
|
796
|
+
await executeAfterWait(() => {
|
|
797
|
+
postMessageToParent(
|
|
798
|
+
getIFrameEl().contentWindow,
|
|
799
|
+
{ type: EmbedEvent.APP_INIT, data: {} },
|
|
800
|
+
mockPort,
|
|
801
|
+
);
|
|
802
|
+
});
|
|
803
|
+
await executeAfterWait(() => {
|
|
804
|
+
expect(mockPort.postMessage.mock.calls[0][0].data.embedParams.starterPrompts)
|
|
805
|
+
.toEqual(starterPrompts);
|
|
806
|
+
});
|
|
807
|
+
});
|
|
808
|
+
|
|
744
809
|
test('should pass brandHeadline through spotterVizConfig in APP_INIT', async () => {
|
|
745
810
|
const spotterViz = { brandName: 'MyBrand', brandHeadline: "Hi, there! I'm" };
|
|
746
811
|
const appEmbed = new AppEmbed(getRootEl(), {
|
|
@@ -969,11 +1034,48 @@ describe('App embed tests', () => {
|
|
|
969
1034
|
await executeAfterWait(() => {
|
|
970
1035
|
expectUrlMatchesWithParams(
|
|
971
1036
|
getIFrameSrc(),
|
|
972
|
-
`http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&enableStarterPrompts=true${defaultParamsPost}#/home`,
|
|
1037
|
+
`http://${thoughtSpotHost}/?embedApp=true&profileAndHelpInNavBarHidden=false&enableStarterPrompts=true&navigationVersion=v3&homepageVersion=v3${defaultParamsPost}#/home`,
|
|
973
1038
|
);
|
|
974
1039
|
});
|
|
975
1040
|
});
|
|
976
1041
|
|
|
1042
|
+
test('should set openSpotterOnLiveboardByDefault to true in url', async () => {
|
|
1043
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1044
|
+
...defaultViewConfig,
|
|
1045
|
+
spotterChatConfig: { openSpotterOnLiveboardByDefault: true },
|
|
1046
|
+
} as AppViewConfig);
|
|
1047
|
+
appEmbed.render();
|
|
1048
|
+
await executeAfterWait(() => {
|
|
1049
|
+
expectUrlToHaveParamsWithValues(getIFrameSrc(), {
|
|
1050
|
+
openSpotterOnLiveboardByDefault: 'true',
|
|
1051
|
+
});
|
|
1052
|
+
});
|
|
1053
|
+
});
|
|
1054
|
+
|
|
1055
|
+
test('should set openSpotterOnLiveboardByDefault to false when explicitly disabled', async () => {
|
|
1056
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1057
|
+
...defaultViewConfig,
|
|
1058
|
+
spotterChatConfig: { openSpotterOnLiveboardByDefault: false },
|
|
1059
|
+
} as AppViewConfig);
|
|
1060
|
+
appEmbed.render();
|
|
1061
|
+
await executeAfterWait(() => {
|
|
1062
|
+
expectUrlToHaveParamsWithValues(getIFrameSrc(), {
|
|
1063
|
+
openSpotterOnLiveboardByDefault: 'false',
|
|
1064
|
+
});
|
|
1065
|
+
});
|
|
1066
|
+
});
|
|
1067
|
+
|
|
1068
|
+
test('should not set openSpotterOnLiveboardByDefault when it is not configured', async () => {
|
|
1069
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1070
|
+
...defaultViewConfig,
|
|
1071
|
+
spotterChatConfig: { enableStarterPrompts: true },
|
|
1072
|
+
} as AppViewConfig);
|
|
1073
|
+
appEmbed.render();
|
|
1074
|
+
await executeAfterWait(() => {
|
|
1075
|
+
expect(getIFrameSrc()).not.toContain('openSpotterOnLiveboardByDefault');
|
|
1076
|
+
});
|
|
1077
|
+
});
|
|
1078
|
+
|
|
977
1079
|
test('should set spotterFileUploadFileTypes in url', async () => {
|
|
978
1080
|
const appEmbed = new AppEmbed(getRootEl(), {
|
|
979
1081
|
...defaultViewConfig,
|
|
@@ -2057,6 +2159,238 @@ describe('App embed tests', () => {
|
|
|
2057
2159
|
}, 100);
|
|
2058
2160
|
});
|
|
2059
2161
|
|
|
2162
|
+
test('should default lazy loading flags to true when fullHeight is enabled', async () => {
|
|
2163
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2164
|
+
...defaultViewConfig,
|
|
2165
|
+
fullHeight: true,
|
|
2166
|
+
} as AppViewConfig);
|
|
2167
|
+
|
|
2168
|
+
expect((appEmbed as any).viewConfig.lazyLoadingForFullHeight).toBe(true);
|
|
2169
|
+
expect((appEmbed as any).viewConfig.enableScrollableContainerLazyLoading).toBe(true);
|
|
2170
|
+
expect((appEmbed as any).viewConfig.lazyLoadingMargin).toBe('500px 0px');
|
|
2171
|
+
|
|
2172
|
+
await appEmbed.render();
|
|
2173
|
+
|
|
2174
|
+
await executeAfterWait(() => {
|
|
2175
|
+
const iframeSrc = getIFrameSrc();
|
|
2176
|
+
expect(iframeSrc).toContain('isLazyLoadingForEmbedEnabled=true');
|
|
2177
|
+
expect(iframeSrc).toContain('isFullHeightPinboard=true');
|
|
2178
|
+
expect(iframeSrc).toContain('rootMarginForLazyLoad=500px%200px');
|
|
2179
|
+
}, 100);
|
|
2180
|
+
});
|
|
2181
|
+
|
|
2182
|
+
test('should not default lazy loading flags when fullHeight is not enabled', async () => {
|
|
2183
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2184
|
+
...defaultViewConfig,
|
|
2185
|
+
} as AppViewConfig);
|
|
2186
|
+
|
|
2187
|
+
expect((appEmbed as any).viewConfig.lazyLoadingForFullHeight).toBeUndefined();
|
|
2188
|
+
expect(
|
|
2189
|
+
(appEmbed as any).viewConfig.enableScrollableContainerLazyLoading,
|
|
2190
|
+
).toBeUndefined();
|
|
2191
|
+
expect((appEmbed as any).viewConfig.lazyLoadingMargin).toBeUndefined();
|
|
2192
|
+
});
|
|
2193
|
+
|
|
2194
|
+
test('should not write the defaults back onto the caller view config', async () => {
|
|
2195
|
+
const callerViewConfig = {
|
|
2196
|
+
...defaultViewConfig,
|
|
2197
|
+
fullHeight: true,
|
|
2198
|
+
} as AppViewConfig;
|
|
2199
|
+
|
|
2200
|
+
new AppEmbed(getRootEl(), callerViewConfig);
|
|
2201
|
+
|
|
2202
|
+
expect(callerViewConfig.lazyLoadingForFullHeight).toBeUndefined();
|
|
2203
|
+
expect(callerViewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
|
|
2204
|
+
expect(callerViewConfig.lazyLoadingMargin).toBeUndefined();
|
|
2205
|
+
});
|
|
2206
|
+
|
|
2207
|
+
test('should not default lazy loading flags when fullHeight is explicitly false', async () => {
|
|
2208
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2209
|
+
...defaultViewConfig,
|
|
2210
|
+
fullHeight: false,
|
|
2211
|
+
} as AppViewConfig);
|
|
2212
|
+
|
|
2213
|
+
expect((appEmbed as any).viewConfig.lazyLoadingForFullHeight).toBeUndefined();
|
|
2214
|
+
expect(
|
|
2215
|
+
(appEmbed as any).viewConfig.enableScrollableContainerLazyLoading,
|
|
2216
|
+
).toBeUndefined();
|
|
2217
|
+
expect((appEmbed as any).viewConfig.lazyLoadingMargin).toBeUndefined();
|
|
2218
|
+
});
|
|
2219
|
+
|
|
2220
|
+
test('should default lazyLoadingMargin when lazyLoadingForFullHeight is set explicitly', async () => {
|
|
2221
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2222
|
+
...defaultViewConfig,
|
|
2223
|
+
fullHeight: true,
|
|
2224
|
+
lazyLoadingForFullHeight: true,
|
|
2225
|
+
} as AppViewConfig);
|
|
2226
|
+
|
|
2227
|
+
expect((appEmbed as any).viewConfig.lazyLoadingMargin).toBe(
|
|
2228
|
+
config.DEFAULT_LAZY_LOADING_MARGIN,
|
|
2229
|
+
);
|
|
2230
|
+
|
|
2231
|
+
await appEmbed.render();
|
|
2232
|
+
|
|
2233
|
+
await executeAfterWait(() => {
|
|
2234
|
+
expect(getIFrameSrc()).toContain('rootMarginForLazyLoad=500px%200px');
|
|
2235
|
+
}, 100);
|
|
2236
|
+
});
|
|
2237
|
+
|
|
2238
|
+
test('should let an explicit lazyLoadingMargin win over the default', async () => {
|
|
2239
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2240
|
+
...defaultViewConfig,
|
|
2241
|
+
fullHeight: true,
|
|
2242
|
+
lazyLoadingMargin: '250px',
|
|
2243
|
+
} as AppViewConfig);
|
|
2244
|
+
|
|
2245
|
+
await appEmbed.render();
|
|
2246
|
+
|
|
2247
|
+
await executeAfterWait(() => {
|
|
2248
|
+
const iframeSrc = getIFrameSrc();
|
|
2249
|
+
expect(iframeSrc).toContain('rootMarginForLazyLoad=250px');
|
|
2250
|
+
expect(iframeSrc).not.toContain('rootMarginForLazyLoad=500px%200px');
|
|
2251
|
+
}, 100);
|
|
2252
|
+
});
|
|
2253
|
+
|
|
2254
|
+
test('should drop an invalid lazyLoadingMargin and log an error', async () => {
|
|
2255
|
+
const loggerErrorSpy = jest.spyOn(logger, 'error').mockImplementation(() => undefined);
|
|
2256
|
+
|
|
2257
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2258
|
+
...defaultViewConfig,
|
|
2259
|
+
fullHeight: true,
|
|
2260
|
+
lazyLoadingMargin: 'not-a-margin',
|
|
2261
|
+
} as AppViewConfig);
|
|
2262
|
+
|
|
2263
|
+
await appEmbed.render();
|
|
2264
|
+
|
|
2265
|
+
await executeAfterWait(() => {
|
|
2266
|
+
const iframeSrc = getIFrameSrc();
|
|
2267
|
+
expect(iframeSrc).toContain('isLazyLoadingForEmbedEnabled=true');
|
|
2268
|
+
expect(iframeSrc).not.toContain('rootMarginForLazyLoad');
|
|
2269
|
+
expect(loggerErrorSpy).toHaveBeenCalledWith(
|
|
2270
|
+
'Please provide a valid lazyLoadingMargin value (e.g., "10px")',
|
|
2271
|
+
);
|
|
2272
|
+
}, 100);
|
|
2273
|
+
});
|
|
2274
|
+
|
|
2275
|
+
test('should track scrollable ancestors by default when only fullHeight is set', async () => {
|
|
2276
|
+
const scrollContainer = getRootEl();
|
|
2277
|
+
scrollContainer.style.overflow = 'auto';
|
|
2278
|
+
|
|
2279
|
+
const scrollContainerSpy = jest.spyOn(scrollContainer, 'addEventListener');
|
|
2280
|
+
const resizeObserveSpy = jest.fn();
|
|
2281
|
+
const resizeDisconnectSpy = jest.fn();
|
|
2282
|
+
(window as any).ResizeObserver = jest.fn().mockImplementation(() => ({
|
|
2283
|
+
observe: resizeObserveSpy,
|
|
2284
|
+
disconnect: resizeDisconnectSpy,
|
|
2285
|
+
}));
|
|
2286
|
+
|
|
2287
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2288
|
+
...defaultViewConfig,
|
|
2289
|
+
fullHeight: true,
|
|
2290
|
+
} as AppViewConfig);
|
|
2291
|
+
|
|
2292
|
+
await appEmbed.render();
|
|
2293
|
+
|
|
2294
|
+
await executeAfterWait(() => {
|
|
2295
|
+
expect(scrollContainerSpy).toHaveBeenCalledWith('scroll', expect.any(Function));
|
|
2296
|
+
expect(resizeObserveSpy).toHaveBeenCalledWith(scrollContainer);
|
|
2297
|
+
}, 100);
|
|
2298
|
+
|
|
2299
|
+
appEmbed.destroy();
|
|
2300
|
+
expect(resizeDisconnectSpy).toHaveBeenCalled();
|
|
2301
|
+
|
|
2302
|
+
scrollContainer.style.overflow = '';
|
|
2303
|
+
(window as any).ResizeObserver = originalResizeObserver;
|
|
2304
|
+
});
|
|
2305
|
+
|
|
2306
|
+
test('should skip ancestor tracking when enableScrollableContainerLazyLoading is false', async () => {
|
|
2307
|
+
const scrollContainer = getRootEl();
|
|
2308
|
+
scrollContainer.style.overflow = 'auto';
|
|
2309
|
+
|
|
2310
|
+
const scrollContainerSpy = jest.spyOn(scrollContainer, 'addEventListener');
|
|
2311
|
+
const windowSpy = jest.spyOn(window, 'addEventListener');
|
|
2312
|
+
|
|
2313
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2314
|
+
...defaultViewConfig,
|
|
2315
|
+
fullHeight: true,
|
|
2316
|
+
enableScrollableContainerLazyLoading: false,
|
|
2317
|
+
} as AppViewConfig);
|
|
2318
|
+
|
|
2319
|
+
await appEmbed.render();
|
|
2320
|
+
|
|
2321
|
+
await executeAfterWait(() => {
|
|
2322
|
+
expect(windowSpy).toHaveBeenCalledWith('scroll', expect.anything(), true);
|
|
2323
|
+
expect(scrollContainerSpy).not.toHaveBeenCalledWith('scroll', expect.any(Function));
|
|
2324
|
+
}, 100);
|
|
2325
|
+
|
|
2326
|
+
appEmbed.destroy();
|
|
2327
|
+
scrollContainer.style.overflow = '';
|
|
2328
|
+
});
|
|
2329
|
+
|
|
2330
|
+
test('should wire the window scroll listener to the coordinates sender by default', async () => {
|
|
2331
|
+
const addEventListenerSpy = jest.spyOn(window, 'addEventListener');
|
|
2332
|
+
|
|
2333
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2334
|
+
...defaultViewConfig,
|
|
2335
|
+
fullHeight: true,
|
|
2336
|
+
} as AppViewConfig);
|
|
2337
|
+
|
|
2338
|
+
const mockTrigger = jest
|
|
2339
|
+
.spyOn(appEmbed, 'trigger')
|
|
2340
|
+
.mockImplementation(() => Promise.resolve(undefined as any));
|
|
2341
|
+
|
|
2342
|
+
await appEmbed.render();
|
|
2343
|
+
|
|
2344
|
+
await executeAfterWait(() => {
|
|
2345
|
+
const scrollCall = addEventListenerSpy.mock.calls.find(
|
|
2346
|
+
([eventName, , capture]) => eventName === 'scroll' && capture === true,
|
|
2347
|
+
);
|
|
2348
|
+
expect(scrollCall).toBeDefined();
|
|
2349
|
+
|
|
2350
|
+
// Call the handler the way a real scroll event would.
|
|
2351
|
+
(scrollCall as any)[1]();
|
|
2352
|
+
|
|
2353
|
+
expect(mockTrigger).toHaveBeenCalledWith(
|
|
2354
|
+
HostEvent.VisibleEmbedCoordinates,
|
|
2355
|
+
expect.objectContaining({ top: expect.any(Number) }),
|
|
2356
|
+
);
|
|
2357
|
+
}, 100);
|
|
2358
|
+
|
|
2359
|
+
appEmbed.destroy();
|
|
2360
|
+
addEventListenerSpy.mockRestore();
|
|
2361
|
+
});
|
|
2362
|
+
|
|
2363
|
+
test('should remove listeners on destroy when the flags come from defaults', async () => {
|
|
2364
|
+
const removeEventListenerSpy = jest.spyOn(window, 'removeEventListener');
|
|
2365
|
+
|
|
2366
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2367
|
+
...defaultViewConfig,
|
|
2368
|
+
fullHeight: true,
|
|
2369
|
+
} as AppViewConfig);
|
|
2370
|
+
|
|
2371
|
+
await appEmbed.render();
|
|
2372
|
+
appEmbed.destroy();
|
|
2373
|
+
|
|
2374
|
+
expect(removeEventListenerSpy).toHaveBeenCalledWith('resize', expect.anything());
|
|
2375
|
+
expect(removeEventListenerSpy).toHaveBeenCalledWith('scroll', expect.anything(), true);
|
|
2376
|
+
|
|
2377
|
+
removeEventListenerSpy.mockRestore();
|
|
2378
|
+
});
|
|
2379
|
+
|
|
2380
|
+
test('should keep an explicit false for the lazy loading flags', async () => {
|
|
2381
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2382
|
+
...defaultViewConfig,
|
|
2383
|
+
fullHeight: true,
|
|
2384
|
+
lazyLoadingForFullHeight: false,
|
|
2385
|
+
enableScrollableContainerLazyLoading: false,
|
|
2386
|
+
lazyLoadingMargin: '0px',
|
|
2387
|
+
} as AppViewConfig);
|
|
2388
|
+
|
|
2389
|
+
expect((appEmbed as any).viewConfig.lazyLoadingForFullHeight).toBe(false);
|
|
2390
|
+
expect((appEmbed as any).viewConfig.enableScrollableContainerLazyLoading).toBe(false);
|
|
2391
|
+
expect((appEmbed as any).viewConfig.lazyLoadingMargin).toBe('0px');
|
|
2392
|
+
});
|
|
2393
|
+
|
|
2060
2394
|
test('should not set lazyLoadingForEmbed when lazyLoadingForFullHeight is enabled but fullHeight is false', async () => {
|
|
2061
2395
|
const appEmbed = new AppEmbed(getRootEl(), {
|
|
2062
2396
|
...defaultViewConfig,
|
package/src/embed/app.ts
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import { logger } from '../utils/logger';
|
|
12
12
|
import { calculateVisibleElementData, getEffectiveClippingAncestors, getQueryParamString, getScrollableAncestors, isUndefined, isValidCssMargin, setParamIfDefined } from '../utils';
|
|
13
|
+
import { DEFAULT_LAZY_LOADING_MARGIN } from '../config';
|
|
13
14
|
import {
|
|
14
15
|
Param,
|
|
15
16
|
DOMSelector,
|
|
@@ -22,8 +23,8 @@ import {
|
|
|
22
23
|
SpotterFileUploadFileTypes,
|
|
23
24
|
} from '../types';
|
|
24
25
|
import { V1Embed } from './ts-embed';
|
|
25
|
-
import { SpotterChatViewConfig, SpotterSidebarViewConfig, SpotterQueryMode, SpotterShareConversationConfig } from './conversation';
|
|
26
|
-
import { buildSpotterSidebarAppInitData, buildSpotterShareConversationAppInitData } from './spotter-utils';
|
|
26
|
+
import { SpotterChatViewConfig, SpotterSidebarViewConfig, SpotterQueryMode, SpotterShareConversationConfig, StarterPromptsConfig } from './conversation';
|
|
27
|
+
import { buildSpotterSidebarAppInitData, buildSpotterShareConversationAppInitData, buildStarterPromptsAppInitData } from './spotter-utils';
|
|
27
28
|
import { SpotterVizConfig, buildSpotterVizAppInitData } from './spotter-viz-utils';
|
|
28
29
|
|
|
29
30
|
/**
|
|
@@ -67,6 +68,10 @@ export enum Page {
|
|
|
67
68
|
* Collections listing page
|
|
68
69
|
*/
|
|
69
70
|
Collections = 'collections',
|
|
71
|
+
/**
|
|
72
|
+
* Liveboard schedules listing page
|
|
73
|
+
*/
|
|
74
|
+
LiveboardSchedules = 'liveboard-schedules',
|
|
70
75
|
}
|
|
71
76
|
|
|
72
77
|
/**
|
|
@@ -471,6 +476,11 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
471
476
|
* `false` fetches visualizations incrementally as
|
|
472
477
|
* users scroll the page to view the charts and tables.
|
|
473
478
|
*
|
|
479
|
+
* From SDK 1.52.0, enabling `fullHeight` also turns on
|
|
480
|
+
* {@link lazyLoadingForFullHeight} and
|
|
481
|
+
* {@link enableScrollableContainerLazyLoading}, so visualizations load as
|
|
482
|
+
* they scroll into view. Set either flag to `false` to opt out.
|
|
483
|
+
*
|
|
474
484
|
* Supported embed types: `AppEmbed`
|
|
475
485
|
* @version SDK: 1.21.0 | ThoughtSpot: 9.4.0.cl, 9.4.0-sw
|
|
476
486
|
* @example
|
|
@@ -684,11 +694,17 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
684
694
|
isGranularXLSXCSVSchedulesEnabled?: boolean;
|
|
685
695
|
|
|
686
696
|
/**
|
|
687
|
-
*
|
|
697
|
+
* Loads visualizations only as they scroll into the viewport, instead of
|
|
698
|
+
* loading the whole full-height Liveboard at once.
|
|
699
|
+
*
|
|
700
|
+
* From SDK 1.52.0 this is enabled automatically whenever `fullHeight` is
|
|
701
|
+
* `true`. On SDK 1.51.0 and earlier it defaulted to `false` and had to be
|
|
702
|
+
* set explicitly. Set it to `false` to load every visualization upfront.
|
|
703
|
+
* The flag has no effect unless `fullHeight` is enabled.
|
|
688
704
|
*
|
|
689
705
|
* @type {boolean}
|
|
690
706
|
* @version SDK: 1.40.0 | ThoughtSpot: 10.12.0.cl
|
|
691
|
-
* @default
|
|
707
|
+
* @default true when `fullHeight` is enabled, from SDK 1.52.0
|
|
692
708
|
* @example
|
|
693
709
|
* ```js
|
|
694
710
|
* const embed = new AppEmbed('#embed-container', {
|
|
@@ -700,28 +716,44 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
700
716
|
*/
|
|
701
717
|
lazyLoadingForFullHeight?: boolean;
|
|
702
718
|
/**
|
|
703
|
-
*
|
|
719
|
+
* Computes the visible region of the embed against its scrollable and
|
|
720
|
+
* clipping ancestors, instead of treating the browser window as the only
|
|
721
|
+
* viewport, and tracks scroll and resize on those ancestors.
|
|
704
722
|
*
|
|
705
|
-
*
|
|
706
|
-
*
|
|
723
|
+
* From SDK 1.52.0 this is enabled automatically whenever `fullHeight` is
|
|
724
|
+
* `true`. On SDK 1.51.0 and earlier it defaulted to `false` and had to be
|
|
725
|
+
* set explicitly. Set it to `false` when the page scrolls with the window
|
|
726
|
+
* and the embed has no clipping ancestor, to skip the extra ancestor
|
|
727
|
+
* tracking.
|
|
707
728
|
*
|
|
708
729
|
* @type {boolean}
|
|
709
|
-
* @default
|
|
730
|
+
* @default true when `fullHeight` is enabled, from SDK 1.52.0
|
|
710
731
|
* @hidden
|
|
711
732
|
*/
|
|
712
733
|
enableScrollableContainerLazyLoading?: boolean;
|
|
713
734
|
|
|
714
735
|
/**
|
|
715
|
-
*
|
|
736
|
+
* How far outside the viewport a visualization starts loading, when
|
|
737
|
+
* {@link lazyLoadingForFullHeight} is enabled.
|
|
716
738
|
*
|
|
717
739
|
* For example, if the margin is set to '10px',
|
|
718
740
|
* the visualization will be loaded 10px before its top edge is visible in the
|
|
719
741
|
* viewport.
|
|
720
742
|
*
|
|
721
|
-
* The format is similar to CSS margin
|
|
743
|
+
* The format is similar to CSS margin, so `'500px 0px'` extends the
|
|
744
|
+
* prefetch 500px above and below the viewport and not sideways. Accepted
|
|
745
|
+
* units are `px`, `em`, `rem`, `%`, `vh` and `vw`, plus bare `0` and
|
|
746
|
+
* `auto`; an invalid value is logged and ignored.
|
|
747
|
+
*
|
|
748
|
+
* From SDK 1.52.0 this defaults to `'500px 0px'` — roughly one
|
|
749
|
+
* visualization ahead of the scroll position, so a chart has usually
|
|
750
|
+
* finished loading by the time it scrolls into view. Use a smaller margin
|
|
751
|
+
* to cut warehouse queries further, or `'0px'` to load a visualization
|
|
752
|
+
* only once it is actually visible.
|
|
722
753
|
*
|
|
723
754
|
* @type {string}
|
|
724
755
|
* @version SDK: 1.40.0 | ThoughtSpot: 10.12.0.cl
|
|
756
|
+
* @default '500px 0px' when `fullHeight` is enabled, from SDK 1.52.0
|
|
725
757
|
* @example
|
|
726
758
|
* ```js
|
|
727
759
|
* const embed = new AppEmbed('#embed-container', {
|
|
@@ -897,13 +929,12 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
897
929
|
* inputChatPlaceholder: 'Ask a question...',
|
|
898
930
|
* hideStarterPrompts: false,
|
|
899
931
|
* customStarterPrompts: [{ id: '1', displayText: 'Top products', fullPrompt: 'What are the top products by revenue?' }],
|
|
900
|
-
* //
|
|
932
|
+
* // The options below require SDK: 1.51.0
|
|
901
933
|
* loaderHeadline: 'Crunching the numbers...',
|
|
902
934
|
* loaderTips: [
|
|
903
935
|
* { label: 'Tip', text: 'try asking about revenue by region' },
|
|
904
936
|
* { label: 'Tip', text: 'use natural language' },
|
|
905
937
|
* ],
|
|
906
|
-
* // liveboardBrandName, spotterBrandName, insightTileBrandName, insightTileViewPlanLabel and insightTileLoaderText require SDK: 1.52.0 | ThoughtSpot Cloud: 26.9.0.cl
|
|
907
938
|
* liveboardBrandName: 'Reports',
|
|
908
939
|
* spotterBrandName: 'Analyst',
|
|
909
940
|
* insightTileBrandName: 'Insight card',
|
|
@@ -1002,6 +1033,7 @@ export interface AppEmbedAppInitData extends DefaultAppInitData {
|
|
|
1002
1033
|
spotterSidebarConfig?: SpotterSidebarViewConfig;
|
|
1003
1034
|
spotterVizConfig?: SpotterVizConfig;
|
|
1004
1035
|
spotterShareConversationConfig?: SpotterShareConversationConfig;
|
|
1036
|
+
starterPrompts?: StarterPromptsConfig;
|
|
1005
1037
|
};
|
|
1006
1038
|
}
|
|
1007
1039
|
|
|
@@ -1022,6 +1054,16 @@ export class AppEmbed extends V1Embed {
|
|
|
1022
1054
|
viewConfig.embedComponentType = 'AppEmbed';
|
|
1023
1055
|
super(domSelector, viewConfig);
|
|
1024
1056
|
if (this.viewConfig.fullHeight === true) {
|
|
1057
|
+
if (this.viewConfig.lazyLoadingForFullHeight === undefined) {
|
|
1058
|
+
this.viewConfig.lazyLoadingForFullHeight = true;
|
|
1059
|
+
}
|
|
1060
|
+
if (this.viewConfig.enableScrollableContainerLazyLoading === undefined) {
|
|
1061
|
+
this.viewConfig.enableScrollableContainerLazyLoading = true;
|
|
1062
|
+
}
|
|
1063
|
+
if (this.viewConfig.lazyLoadingMargin === undefined) {
|
|
1064
|
+
this.viewConfig.lazyLoadingMargin = DEFAULT_LAZY_LOADING_MARGIN;
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1025
1067
|
this.on(EmbedEvent.RouteChange, this.setIframeHeightForNonEmbedLiveboard);
|
|
1026
1068
|
this.on(EmbedEvent.EmbedHeight, this.updateIFrameHeight);
|
|
1027
1069
|
this.on(EmbedEvent.EmbedIframeCenter, this.embedIframeCenter);
|
|
@@ -1052,7 +1094,8 @@ export class AppEmbed extends V1Embed {
|
|
|
1052
1094
|
this.handleError.bind(this),
|
|
1053
1095
|
);
|
|
1054
1096
|
const vizInitData = buildSpotterVizAppInitData(sidebarInitData, this.viewConfig);
|
|
1055
|
-
|
|
1097
|
+
const shareInitData = buildSpotterShareConversationAppInitData(vizInitData, this.viewConfig);
|
|
1098
|
+
return buildStarterPromptsAppInitData(shareInitData, this.viewConfig);
|
|
1056
1099
|
}
|
|
1057
1100
|
|
|
1058
1101
|
/**
|
|
@@ -1094,6 +1137,7 @@ export class AppEmbed extends V1Embed {
|
|
|
1094
1137
|
enableAskSage,
|
|
1095
1138
|
collapseSearchBarInitially = false,
|
|
1096
1139
|
enable2ColumnLayout,
|
|
1140
|
+
isLiveboardAlwaysOn12ColLayout,
|
|
1097
1141
|
enableCustomColumnGroups = false,
|
|
1098
1142
|
dataPanelCustomGroupsAccordionInitialState = DataPanelCustomColumnGroupsAccordionState.EXPAND_ALL,
|
|
1099
1143
|
collapseSearchBar = true,
|
|
@@ -1108,6 +1152,7 @@ export class AppEmbed extends V1Embed {
|
|
|
1108
1152
|
discoveryExperience,
|
|
1109
1153
|
coverAndFilterOptionInPDF,
|
|
1110
1154
|
isLiveboardStylingAndGroupingEnabled,
|
|
1155
|
+
liveboardGutter,
|
|
1111
1156
|
isPNGInScheduledEmailsEnabled = false,
|
|
1112
1157
|
isLiveboardXLSXCSVDownloadEnabled,
|
|
1113
1158
|
isGranularXLSXCSVSchedulesEnabled,
|
|
@@ -1190,6 +1235,7 @@ export class AppEmbed extends V1Embed {
|
|
|
1190
1235
|
spotterFileUploadEnabled,
|
|
1191
1236
|
spotterFileUploadFileTypes,
|
|
1192
1237
|
enableStarterPrompts,
|
|
1238
|
+
openSpotterOnLiveboardByDefault,
|
|
1193
1239
|
} = spotterChatConfig;
|
|
1194
1240
|
|
|
1195
1241
|
setParamIfDefined(params, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
|
|
@@ -1200,6 +1246,9 @@ export class AppEmbed extends V1Embed {
|
|
|
1200
1246
|
if (enableStarterPrompts !== undefined) {
|
|
1201
1247
|
params[Param.IsStarterPromptsEnabled] = enableStarterPrompts;
|
|
1202
1248
|
}
|
|
1249
|
+
if (openSpotterOnLiveboardByDefault !== undefined) {
|
|
1250
|
+
params[Param.OpenSpotterOnLiveboardByDefault] = openSpotterOnLiveboardByDefault;
|
|
1251
|
+
}
|
|
1203
1252
|
if (spotterFileUploadFileTypes !== undefined) {
|
|
1204
1253
|
params[Param.SpotterFileUploadFileTypes] = JSON.stringify(spotterFileUploadFileTypes);
|
|
1205
1254
|
}
|
|
@@ -1252,6 +1301,9 @@ export class AppEmbed extends V1Embed {
|
|
|
1252
1301
|
if (enable2ColumnLayout !== undefined) {
|
|
1253
1302
|
params[Param.Enable2ColumnLayout] = enable2ColumnLayout;
|
|
1254
1303
|
}
|
|
1304
|
+
if (isLiveboardAlwaysOn12ColLayout !== undefined) {
|
|
1305
|
+
params[Param.IsLiveboardAlwaysOn12ColLayout] = isLiveboardAlwaysOn12ColLayout;
|
|
1306
|
+
}
|
|
1255
1307
|
|
|
1256
1308
|
if (enableAskSage) {
|
|
1257
1309
|
params[Param.enableAskSage] = enableAskSage;
|
|
@@ -1271,6 +1323,10 @@ export class AppEmbed extends V1Embed {
|
|
|
1271
1323
|
] = isLiveboardStylingAndGroupingEnabled;
|
|
1272
1324
|
}
|
|
1273
1325
|
|
|
1326
|
+
if (liveboardGutter !== undefined) {
|
|
1327
|
+
params[Param.LiveboardGutter] = liveboardGutter;
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1274
1330
|
if (isPNGInScheduledEmailsEnabled !== undefined) {
|
|
1275
1331
|
params[Param.isPNGInScheduledEmailsEnabled] = isPNGInScheduledEmailsEnabled;
|
|
1276
1332
|
}
|
|
@@ -1474,6 +1530,8 @@ export class AppEmbed extends V1Embed {
|
|
|
1474
1530
|
return modularHomeExperience ? 'home/monitor-alerts' : 'insights/monitor-alerts';
|
|
1475
1531
|
case Page.Collections:
|
|
1476
1532
|
return 'collections';
|
|
1533
|
+
case Page.LiveboardSchedules:
|
|
1534
|
+
return 'home/liveboard-schedules';
|
|
1477
1535
|
case Page.Home:
|
|
1478
1536
|
default:
|
|
1479
1537
|
return 'home';
|