@thoughtspot/visual-embed-sdk 1.51.0 → 1.51.1
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/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 +16 -8
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +69 -32
- 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.spec.js +4 -0
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-aBzH5ZwF.js → index-DxLfQxoT.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 +16 -8
- 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/tsembed-react.es.js +330 -61
- package/dist/tsembed-react.js +329 -60
- package/dist/tsembed.es.js +390 -123
- package/dist/tsembed.js +392 -125
- package/dist/visual-embed-sdk-react-full.d.ts +696 -89
- package/dist/visual-embed-sdk-react.d.ts +692 -88
- package/dist/visual-embed-sdk.d.ts +632 -59
- 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/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 +16 -8
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +69 -32
- 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.spec.js +4 -0
- package/lib/src/utils.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +632 -59
- 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/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 +83 -37
- 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 +5 -0
|
@@ -7,6 +7,8 @@ import * as processTriggerInstance from '../utils/processTrigger';
|
|
|
7
7
|
import * as auth from '../auth';
|
|
8
8
|
import * as previewService from '../utils/graphql/preview-service';
|
|
9
9
|
import * as SessionInfoService from '../utils/sessionInfoService';
|
|
10
|
+
import { logger } from '../utils/logger';
|
|
11
|
+
import { DEFAULT_LAZY_LOADING_MARGIN } from '../config';
|
|
10
12
|
const defaultViewConfig = {
|
|
11
13
|
frameParams: {
|
|
12
14
|
width: 1280,
|
|
@@ -106,6 +108,22 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
106
108
|
expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true&${defaultParamsWithoutHiddenActions}&hideAction=[%22${Action.ReportError}%22,%22${Action.DownloadAsCsv}%22,%22${Action.DownloadAsPdf}%22,%22${Action.DownloadAsXlsx}%22]${prefixParams}#/embed/viz/${liveboardId}`);
|
|
107
109
|
});
|
|
108
110
|
});
|
|
111
|
+
test('should hide and disable the Spotter button on the Liveboard header', async () => {
|
|
112
|
+
expect(Action.SpotterOnLiveboard).toBe('spotterOnLiveboard');
|
|
113
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
114
|
+
hiddenActions: [Action.SpotterOnLiveboard],
|
|
115
|
+
disabledActions: [Action.SpotterOnLiveboard],
|
|
116
|
+
...defaultViewConfig,
|
|
117
|
+
liveboardId,
|
|
118
|
+
});
|
|
119
|
+
liveboardEmbed.render();
|
|
120
|
+
await executeAfterWait(() => {
|
|
121
|
+
expectUrlToHaveParamsWithValues(getIFrameSrc(), {
|
|
122
|
+
hideAction: JSON.stringify([Action.ReportError, Action.SpotterOnLiveboard]),
|
|
123
|
+
disableAction: JSON.stringify([Action.SpotterOnLiveboard]),
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
109
127
|
test('should set visible actions', async () => {
|
|
110
128
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
111
129
|
visibleActions: [Action.DownloadAsCsv, Action.DownloadAsPdf, Action.DownloadAsXlsx],
|
|
@@ -141,6 +159,17 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
141
159
|
expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&enable2ColumnLayout=true${prefixParams}#/embed/viz/${liveboardId}`);
|
|
142
160
|
});
|
|
143
161
|
});
|
|
162
|
+
test('should set isLiveboardAlwaysOn12ColLayout to true in url', async () => {
|
|
163
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
164
|
+
isLiveboardAlwaysOn12ColLayout: true,
|
|
165
|
+
...defaultViewConfig,
|
|
166
|
+
liveboardId,
|
|
167
|
+
});
|
|
168
|
+
liveboardEmbed.render();
|
|
169
|
+
await executeAfterWait(() => {
|
|
170
|
+
expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&isLiveboardAlwaysOn12ColLayout=true${prefixParams}#/embed/viz/${liveboardId}`);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
144
173
|
test('should set isLiveboardStylingAndGroupingEnabled to true in url (deprecated, use isLiveboardMasterpiecesEnabled)', async () => {
|
|
145
174
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
146
175
|
isLiveboardStylingAndGroupingEnabled: true,
|
|
@@ -152,6 +181,28 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
152
181
|
expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&isLiveboardStylingAndGroupingEnabled=true${prefixParams}#/embed/viz/${liveboardId}`);
|
|
153
182
|
});
|
|
154
183
|
});
|
|
184
|
+
test('should set liveboardGutter in url', async () => {
|
|
185
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
186
|
+
...defaultViewConfig,
|
|
187
|
+
liveboardId,
|
|
188
|
+
liveboardGutter: 8,
|
|
189
|
+
});
|
|
190
|
+
liveboardEmbed.render();
|
|
191
|
+
await executeAfterWait(() => {
|
|
192
|
+
expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&liveboardGutter=8${prefixParams}#/embed/viz/${liveboardId}`);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
test('should set liveboardGutter to 0 in url', async () => {
|
|
196
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
197
|
+
...defaultViewConfig,
|
|
198
|
+
liveboardId,
|
|
199
|
+
liveboardGutter: 0,
|
|
200
|
+
});
|
|
201
|
+
liveboardEmbed.render();
|
|
202
|
+
await executeAfterWait(() => {
|
|
203
|
+
expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&liveboardGutter=0${prefixParams}#/embed/viz/${liveboardId}`);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
155
206
|
test('should set isThisPeriodInDateFiltersEnabled to true in url', async () => {
|
|
156
207
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
157
208
|
...defaultViewConfig,
|
|
@@ -969,6 +1020,37 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
969
1020
|
expect(onSpy).toHaveBeenCalledWith(HostEvent.Navigate, 'embed/viz/lb1/viz1');
|
|
970
1021
|
}, 1002);
|
|
971
1022
|
});
|
|
1023
|
+
test('navigateToLiveboard should call preRender when preRenderConfig.preRenderId is set', () => {
|
|
1024
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1025
|
+
...defaultViewConfig,
|
|
1026
|
+
liveboardId,
|
|
1027
|
+
preRenderConfig: {
|
|
1028
|
+
preRenderId: 'config-pre-render-id',
|
|
1029
|
+
},
|
|
1030
|
+
});
|
|
1031
|
+
const preRenderSpy = jest
|
|
1032
|
+
.spyOn(liveboardEmbed, 'preRender')
|
|
1033
|
+
.mockResolvedValue(liveboardEmbed);
|
|
1034
|
+
liveboardEmbed.navigateToLiveboard('lb1');
|
|
1035
|
+
expect(preRenderSpy).toHaveBeenCalledTimes(1);
|
|
1036
|
+
expect(preRenderSpy).toHaveBeenCalledWith(true);
|
|
1037
|
+
});
|
|
1038
|
+
test('navigateToLiveboard should prefer preRenderConfig.preRenderId over top-level preRenderId', () => {
|
|
1039
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1040
|
+
...defaultViewConfig,
|
|
1041
|
+
liveboardId,
|
|
1042
|
+
preRenderId: 'top-level-id',
|
|
1043
|
+
preRenderConfig: {
|
|
1044
|
+
preRenderId: 'config-level-id',
|
|
1045
|
+
},
|
|
1046
|
+
});
|
|
1047
|
+
const preRenderSpy = jest
|
|
1048
|
+
.spyOn(liveboardEmbed, 'preRender')
|
|
1049
|
+
.mockResolvedValue(liveboardEmbed);
|
|
1050
|
+
liveboardEmbed.navigateToLiveboard('lb1');
|
|
1051
|
+
expect(preRenderSpy).toHaveBeenCalledTimes(1);
|
|
1052
|
+
expect(preRenderSpy).toHaveBeenCalledWith(true);
|
|
1053
|
+
});
|
|
972
1054
|
test('should set runtime parametere values in url params', async () => {
|
|
973
1055
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
974
1056
|
...defaultViewConfig,
|
|
@@ -1019,6 +1101,43 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1019
1101
|
expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}${prefixParams}&enableStarterPrompts=true#/embed/viz/${liveboardId}`);
|
|
1020
1102
|
});
|
|
1021
1103
|
});
|
|
1104
|
+
test('should set openSpotterOnLiveboardByDefault parameter in url params', async () => {
|
|
1105
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1106
|
+
...defaultViewConfig,
|
|
1107
|
+
liveboardId,
|
|
1108
|
+
spotterChatConfig: { openSpotterOnLiveboardByDefault: true },
|
|
1109
|
+
});
|
|
1110
|
+
await liveboardEmbed.render();
|
|
1111
|
+
await executeAfterWait(() => {
|
|
1112
|
+
expectUrlToHaveParamsWithValues(getIFrameSrc(), {
|
|
1113
|
+
openSpotterOnLiveboardByDefault: 'true',
|
|
1114
|
+
});
|
|
1115
|
+
});
|
|
1116
|
+
});
|
|
1117
|
+
test('should set openSpotterOnLiveboardByDefault to false when explicitly disabled', async () => {
|
|
1118
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1119
|
+
...defaultViewConfig,
|
|
1120
|
+
liveboardId,
|
|
1121
|
+
spotterChatConfig: { openSpotterOnLiveboardByDefault: false },
|
|
1122
|
+
});
|
|
1123
|
+
await liveboardEmbed.render();
|
|
1124
|
+
await executeAfterWait(() => {
|
|
1125
|
+
expectUrlToHaveParamsWithValues(getIFrameSrc(), {
|
|
1126
|
+
openSpotterOnLiveboardByDefault: 'false',
|
|
1127
|
+
});
|
|
1128
|
+
});
|
|
1129
|
+
});
|
|
1130
|
+
test('should not set openSpotterOnLiveboardByDefault when it is not configured', async () => {
|
|
1131
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1132
|
+
...defaultViewConfig,
|
|
1133
|
+
liveboardId,
|
|
1134
|
+
spotterChatConfig: { enableStarterPrompts: true },
|
|
1135
|
+
});
|
|
1136
|
+
await liveboardEmbed.render();
|
|
1137
|
+
await executeAfterWait(() => {
|
|
1138
|
+
expect(getIFrameSrc()).not.toContain('openSpotterOnLiveboardByDefault');
|
|
1139
|
+
});
|
|
1140
|
+
});
|
|
1022
1141
|
test('should set spotterFileUploadFileTypes parameter in url params', async () => {
|
|
1023
1142
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1024
1143
|
...defaultViewConfig,
|
|
@@ -1136,6 +1255,34 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1136
1255
|
});
|
|
1137
1256
|
});
|
|
1138
1257
|
});
|
|
1258
|
+
test('should include starterPrompts in APP_INIT embedParams', async () => {
|
|
1259
|
+
const starterPrompts = {
|
|
1260
|
+
enable: true,
|
|
1261
|
+
quick: {
|
|
1262
|
+
label: 'Quick',
|
|
1263
|
+
questions: [
|
|
1264
|
+
{ label: 'Q1', prompt: 'P1' },
|
|
1265
|
+
{ label: 'Q2', prompt: 'P2' },
|
|
1266
|
+
],
|
|
1267
|
+
},
|
|
1268
|
+
research: { label: 'Research' },
|
|
1269
|
+
};
|
|
1270
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1271
|
+
...defaultViewConfig,
|
|
1272
|
+
liveboardId,
|
|
1273
|
+
spotterChatConfig: { starterPrompts },
|
|
1274
|
+
});
|
|
1275
|
+
mockMessageChannel();
|
|
1276
|
+
await liveboardEmbed.render();
|
|
1277
|
+
const mockPort = { postMessage: jest.fn() };
|
|
1278
|
+
await executeAfterWait(() => {
|
|
1279
|
+
postMessageToParent(getIFrameEl().contentWindow, { type: EmbedEvent.APP_INIT, data: {} }, mockPort);
|
|
1280
|
+
});
|
|
1281
|
+
await executeAfterWait(() => {
|
|
1282
|
+
expect(mockPort.postMessage.mock.calls[0][0].data.embedParams.starterPrompts)
|
|
1283
|
+
.toEqual(starterPrompts);
|
|
1284
|
+
});
|
|
1285
|
+
});
|
|
1139
1286
|
test('should pass brandHeadline through spotterVizConfig in APP_INIT', async () => {
|
|
1140
1287
|
const spotterViz = { brandName: 'MyBrand', brandHeadline: "Hi, there! I'm" };
|
|
1141
1288
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
@@ -1458,6 +1605,188 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1458
1605
|
expect(iframeSrc).toContain('isFullHeightPinboard=true');
|
|
1459
1606
|
}, 100);
|
|
1460
1607
|
});
|
|
1608
|
+
test('should default lazy loading flags to true when fullHeight is enabled', async () => {
|
|
1609
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1610
|
+
...defaultViewConfig,
|
|
1611
|
+
liveboardId,
|
|
1612
|
+
fullHeight: true,
|
|
1613
|
+
});
|
|
1614
|
+
expect(liveboardEmbed.viewConfig.lazyLoadingForFullHeight).toBe(true);
|
|
1615
|
+
expect(liveboardEmbed.viewConfig.enableScrollableContainerLazyLoading).toBe(true);
|
|
1616
|
+
expect(liveboardEmbed.viewConfig.lazyLoadingMargin).toBe('500px 0px');
|
|
1617
|
+
await liveboardEmbed.render();
|
|
1618
|
+
await executeAfterWait(() => {
|
|
1619
|
+
const iframeSrc = getIFrameSrc();
|
|
1620
|
+
expect(iframeSrc).toContain('isLazyLoadingForEmbedEnabled=true');
|
|
1621
|
+
expect(iframeSrc).toContain('isFullHeightPinboard=true');
|
|
1622
|
+
expect(iframeSrc).toContain('rootMarginForLazyLoad=500px%200px');
|
|
1623
|
+
}, 100);
|
|
1624
|
+
});
|
|
1625
|
+
test('should not default lazy loading flags when fullHeight is not enabled', async () => {
|
|
1626
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1627
|
+
...defaultViewConfig,
|
|
1628
|
+
liveboardId,
|
|
1629
|
+
});
|
|
1630
|
+
expect(liveboardEmbed.viewConfig.lazyLoadingForFullHeight).toBeUndefined();
|
|
1631
|
+
expect(liveboardEmbed.viewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
|
|
1632
|
+
expect(liveboardEmbed.viewConfig.lazyLoadingMargin).toBeUndefined();
|
|
1633
|
+
});
|
|
1634
|
+
test('should not write the defaults back onto the caller view config', async () => {
|
|
1635
|
+
const callerViewConfig = {
|
|
1636
|
+
...defaultViewConfig,
|
|
1637
|
+
liveboardId,
|
|
1638
|
+
fullHeight: true,
|
|
1639
|
+
};
|
|
1640
|
+
new LiveboardEmbed(getRootEl(), callerViewConfig);
|
|
1641
|
+
expect(callerViewConfig.lazyLoadingForFullHeight).toBeUndefined();
|
|
1642
|
+
expect(callerViewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
|
|
1643
|
+
expect(callerViewConfig.lazyLoadingMargin).toBeUndefined();
|
|
1644
|
+
});
|
|
1645
|
+
test('should not default lazy loading flags when fullHeight is explicitly false', async () => {
|
|
1646
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1647
|
+
...defaultViewConfig,
|
|
1648
|
+
liveboardId,
|
|
1649
|
+
fullHeight: false,
|
|
1650
|
+
});
|
|
1651
|
+
expect(liveboardEmbed.viewConfig.lazyLoadingForFullHeight).toBeUndefined();
|
|
1652
|
+
expect(liveboardEmbed.viewConfig.enableScrollableContainerLazyLoading).toBeUndefined();
|
|
1653
|
+
expect(liveboardEmbed.viewConfig.lazyLoadingMargin).toBeUndefined();
|
|
1654
|
+
});
|
|
1655
|
+
test('should default lazyLoadingMargin when lazyLoadingForFullHeight is set explicitly', async () => {
|
|
1656
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1657
|
+
...defaultViewConfig,
|
|
1658
|
+
liveboardId,
|
|
1659
|
+
fullHeight: true,
|
|
1660
|
+
lazyLoadingForFullHeight: true,
|
|
1661
|
+
});
|
|
1662
|
+
expect(liveboardEmbed.viewConfig.lazyLoadingMargin).toBe(DEFAULT_LAZY_LOADING_MARGIN);
|
|
1663
|
+
await liveboardEmbed.render();
|
|
1664
|
+
await executeAfterWait(() => {
|
|
1665
|
+
expect(getIFrameSrc()).toContain('rootMarginForLazyLoad=500px%200px');
|
|
1666
|
+
}, 100);
|
|
1667
|
+
});
|
|
1668
|
+
test('should let an explicit lazyLoadingMargin win over the default', async () => {
|
|
1669
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1670
|
+
...defaultViewConfig,
|
|
1671
|
+
liveboardId,
|
|
1672
|
+
fullHeight: true,
|
|
1673
|
+
lazyLoadingMargin: '250px',
|
|
1674
|
+
});
|
|
1675
|
+
await liveboardEmbed.render();
|
|
1676
|
+
await executeAfterWait(() => {
|
|
1677
|
+
const iframeSrc = getIFrameSrc();
|
|
1678
|
+
expect(iframeSrc).toContain('rootMarginForLazyLoad=250px');
|
|
1679
|
+
expect(iframeSrc).not.toContain('rootMarginForLazyLoad=500px%200px');
|
|
1680
|
+
}, 100);
|
|
1681
|
+
});
|
|
1682
|
+
test('should drop an invalid lazyLoadingMargin and log an error', async () => {
|
|
1683
|
+
const loggerErrorSpy = jest.spyOn(logger, 'error').mockImplementation(() => undefined);
|
|
1684
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1685
|
+
...defaultViewConfig,
|
|
1686
|
+
liveboardId,
|
|
1687
|
+
fullHeight: true,
|
|
1688
|
+
lazyLoadingMargin: 'not-a-margin',
|
|
1689
|
+
});
|
|
1690
|
+
await liveboardEmbed.render();
|
|
1691
|
+
await executeAfterWait(() => {
|
|
1692
|
+
const iframeSrc = getIFrameSrc();
|
|
1693
|
+
expect(iframeSrc).toContain('isLazyLoadingForEmbedEnabled=true');
|
|
1694
|
+
expect(iframeSrc).not.toContain('rootMarginForLazyLoad');
|
|
1695
|
+
expect(loggerErrorSpy).toHaveBeenCalledWith('Please provide a valid lazyLoadingMargin value (e.g., "10px")');
|
|
1696
|
+
}, 100);
|
|
1697
|
+
});
|
|
1698
|
+
test('should track scrollable ancestors by default when only fullHeight is set', async () => {
|
|
1699
|
+
const scrollContainer = getRootEl();
|
|
1700
|
+
scrollContainer.style.overflow = 'auto';
|
|
1701
|
+
const scrollContainerSpy = jest.spyOn(scrollContainer, 'addEventListener');
|
|
1702
|
+
const resizeObserveSpy = jest.fn();
|
|
1703
|
+
const resizeDisconnectSpy = jest.fn();
|
|
1704
|
+
const originalResizeObserver = window.ResizeObserver;
|
|
1705
|
+
window.ResizeObserver = jest.fn().mockImplementation(() => ({
|
|
1706
|
+
observe: resizeObserveSpy,
|
|
1707
|
+
disconnect: resizeDisconnectSpy,
|
|
1708
|
+
}));
|
|
1709
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1710
|
+
...defaultViewConfig,
|
|
1711
|
+
liveboardId,
|
|
1712
|
+
fullHeight: true,
|
|
1713
|
+
});
|
|
1714
|
+
await liveboardEmbed.render();
|
|
1715
|
+
await executeAfterWait(() => {
|
|
1716
|
+
expect(scrollContainerSpy).toHaveBeenCalledWith('scroll', expect.any(Function));
|
|
1717
|
+
expect(resizeObserveSpy).toHaveBeenCalledWith(scrollContainer);
|
|
1718
|
+
}, 100);
|
|
1719
|
+
liveboardEmbed.destroy();
|
|
1720
|
+
expect(resizeDisconnectSpy).toHaveBeenCalled();
|
|
1721
|
+
scrollContainer.style.overflow = '';
|
|
1722
|
+
window.ResizeObserver = originalResizeObserver;
|
|
1723
|
+
});
|
|
1724
|
+
test('should skip ancestor tracking when enableScrollableContainerLazyLoading is false', async () => {
|
|
1725
|
+
const scrollContainer = getRootEl();
|
|
1726
|
+
scrollContainer.style.overflow = 'auto';
|
|
1727
|
+
const scrollContainerSpy = jest.spyOn(scrollContainer, 'addEventListener');
|
|
1728
|
+
const windowSpy = jest.spyOn(window, 'addEventListener');
|
|
1729
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1730
|
+
...defaultViewConfig,
|
|
1731
|
+
liveboardId,
|
|
1732
|
+
fullHeight: true,
|
|
1733
|
+
enableScrollableContainerLazyLoading: false,
|
|
1734
|
+
});
|
|
1735
|
+
await liveboardEmbed.render();
|
|
1736
|
+
await executeAfterWait(() => {
|
|
1737
|
+
expect(windowSpy).toHaveBeenCalledWith('scroll', expect.anything(), true);
|
|
1738
|
+
expect(scrollContainerSpy).not.toHaveBeenCalledWith('scroll', expect.any(Function));
|
|
1739
|
+
}, 100);
|
|
1740
|
+
liveboardEmbed.destroy();
|
|
1741
|
+
scrollContainer.style.overflow = '';
|
|
1742
|
+
});
|
|
1743
|
+
test('should wire the window scroll listener to the coordinates sender by default', async () => {
|
|
1744
|
+
const addEventListenerSpy = jest.spyOn(window, 'addEventListener');
|
|
1745
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1746
|
+
...defaultViewConfig,
|
|
1747
|
+
liveboardId,
|
|
1748
|
+
fullHeight: true,
|
|
1749
|
+
});
|
|
1750
|
+
const mockTrigger = jest
|
|
1751
|
+
.spyOn(liveboardEmbed, 'trigger')
|
|
1752
|
+
.mockImplementation(() => Promise.resolve(undefined));
|
|
1753
|
+
await liveboardEmbed.render();
|
|
1754
|
+
await executeAfterWait(() => {
|
|
1755
|
+
const scrollCall = addEventListenerSpy.mock.calls.find(([eventName, , capture]) => eventName === 'scroll' && capture === true);
|
|
1756
|
+
expect(scrollCall).toBeDefined();
|
|
1757
|
+
// Call the handler the way a real scroll event would.
|
|
1758
|
+
scrollCall[1]();
|
|
1759
|
+
expect(mockTrigger).toHaveBeenCalledWith(HostEvent.VisibleEmbedCoordinates, expect.objectContaining({ top: expect.any(Number) }));
|
|
1760
|
+
}, 100);
|
|
1761
|
+
liveboardEmbed.destroy();
|
|
1762
|
+
addEventListenerSpy.mockRestore();
|
|
1763
|
+
});
|
|
1764
|
+
test('should remove listeners on destroy when the flags come from defaults', async () => {
|
|
1765
|
+
const removeEventListenerSpy = jest.spyOn(window, 'removeEventListener');
|
|
1766
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1767
|
+
...defaultViewConfig,
|
|
1768
|
+
liveboardId,
|
|
1769
|
+
fullHeight: true,
|
|
1770
|
+
});
|
|
1771
|
+
await liveboardEmbed.render();
|
|
1772
|
+
liveboardEmbed.destroy();
|
|
1773
|
+
expect(removeEventListenerSpy).toHaveBeenCalledWith('resize', expect.anything());
|
|
1774
|
+
expect(removeEventListenerSpy).toHaveBeenCalledWith('scroll', expect.anything(), true);
|
|
1775
|
+
removeEventListenerSpy.mockRestore();
|
|
1776
|
+
});
|
|
1777
|
+
test('should keep an explicit false for the lazy loading flags', async () => {
|
|
1778
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1779
|
+
...defaultViewConfig,
|
|
1780
|
+
liveboardId,
|
|
1781
|
+
fullHeight: true,
|
|
1782
|
+
lazyLoadingForFullHeight: false,
|
|
1783
|
+
enableScrollableContainerLazyLoading: false,
|
|
1784
|
+
lazyLoadingMargin: '0px',
|
|
1785
|
+
});
|
|
1786
|
+
expect(liveboardEmbed.viewConfig.lazyLoadingForFullHeight).toBe(false);
|
|
1787
|
+
expect(liveboardEmbed.viewConfig.enableScrollableContainerLazyLoading).toBe(false);
|
|
1788
|
+
expect(liveboardEmbed.viewConfig.lazyLoadingMargin).toBe('0px');
|
|
1789
|
+
});
|
|
1461
1790
|
test('should not set lazyLoadingForEmbed when lazyLoadingForFullHeight is enabled but fullHeight is false', async () => {
|
|
1462
1791
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1463
1792
|
...defaultViewConfig,
|
|
@@ -1522,7 +1851,7 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1522
1851
|
width: 650,
|
|
1523
1852
|
});
|
|
1524
1853
|
});
|
|
1525
|
-
test('should send
|
|
1854
|
+
test('should send visible data when fullHeight is enabled and lazyLoadingForFullHeight is omitted', async () => {
|
|
1526
1855
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1527
1856
|
...defaultViewConfig,
|
|
1528
1857
|
liveboardId,
|
|
@@ -1533,7 +1862,7 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1533
1862
|
await liveboardEmbed.render();
|
|
1534
1863
|
// Trigger the lazy load data calculation
|
|
1535
1864
|
liveboardEmbed.sendFullHeightLazyLoadData();
|
|
1536
|
-
expect(mockTrigger).
|
|
1865
|
+
expect(mockTrigger).toHaveBeenCalledWith(HostEvent.VisibleEmbedCoordinates, {
|
|
1537
1866
|
top: 0,
|
|
1538
1867
|
height: 500,
|
|
1539
1868
|
left: 0,
|
|
@@ -1864,5 +2193,23 @@ describe('LiveboardEmbed updatedSpotterExperience tests', () => {
|
|
|
1864
2193
|
expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true${defaultParams}${prefixParams}&updatedSpotterExperience=false#/embed/viz/${liveboardId}`);
|
|
1865
2194
|
});
|
|
1866
2195
|
});
|
|
2196
|
+
describe('trigger typing contracts (compile-time)', () => {
|
|
2197
|
+
it('infers typed response for no-payload calls through the LiveboardEmbed override', () => {
|
|
2198
|
+
const embed = new LiveboardEmbed(getRootEl(), {
|
|
2199
|
+
liveboardId: 'test-liveboard-id',
|
|
2200
|
+
});
|
|
2201
|
+
const getTabs = () => embed.trigger(HostEvent.GetTabs);
|
|
2202
|
+
const tabsIsTyped = false;
|
|
2203
|
+
const tabsHasContractFields = true;
|
|
2204
|
+
const probeUnknownField = (r) =>
|
|
2205
|
+
// @ts-expect-error — field not on the GetTabs contract (was silent when `any`)
|
|
2206
|
+
r.tabCount;
|
|
2207
|
+
void probeUnknownField;
|
|
2208
|
+
const reload = () => embed.trigger(HostEvent.Reload);
|
|
2209
|
+
const reloadStaysAny = true;
|
|
2210
|
+
expect([tabsIsTyped, tabsHasContractFields, reloadStaysAny])
|
|
2211
|
+
.toEqual([false, true, true]);
|
|
2212
|
+
});
|
|
2213
|
+
});
|
|
1867
2214
|
});
|
|
1868
2215
|
//# sourceMappingURL=liveboard.spec.js.map
|