@thoughtspot/visual-embed-sdk 1.52.0 → 1.52.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 +9 -1
- package/cjs/src/contracts/contracts.spec.d.ts +2 -0
- package/cjs/src/contracts/contracts.spec.d.ts.map +1 -0
- package/cjs/src/contracts/contracts.spec.js +345 -0
- package/cjs/src/contracts/contracts.spec.js.map +1 -0
- package/cjs/src/contracts/embed-event-payloads.d.ts +73 -0
- package/cjs/src/contracts/embed-event-payloads.d.ts.map +1 -0
- package/cjs/src/contracts/embed-event-payloads.js +3 -0
- package/cjs/src/contracts/embed-event-payloads.js.map +1 -0
- package/cjs/src/contracts/host-event-contracts.d.ts +378 -0
- package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -0
- package/cjs/src/contracts/host-event-contracts.js +3 -0
- package/cjs/src/contracts/host-event-contracts.js.map +1 -0
- package/cjs/src/contracts/index.d.ts +22 -0
- package/cjs/src/contracts/index.d.ts.map +1 -0
- package/cjs/src/contracts/index.js +33 -0
- package/cjs/src/contracts/index.js.map +1 -0
- package/cjs/src/contracts/ui-passthrough-contracts.d.ts +277 -0
- package/cjs/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
- package/cjs/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
- package/cjs/src/contracts/ui-passthrough-contracts.js.map +1 -0
- package/cjs/src/embed/app.d.ts +17 -140
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +20 -120
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +70 -26
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/events.spec.js +12 -2
- package/cjs/src/embed/events.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts +3 -2
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.js +23 -18
- package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +36 -36
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.d.ts +1 -1
- package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.js +3 -3
- package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +9 -161
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +66 -134
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +211 -28
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/search.d.ts +14 -0
- package/cjs/src/embed/search.d.ts.map +1 -1
- package/cjs/src/embed/search.js +4 -1
- package/cjs/src/embed/search.js.map +1 -1
- package/cjs/src/embed/search.spec.js +65 -0
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +17 -22
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +82 -56
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +325 -17
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/full-height.d.ts +137 -0
- package/cjs/src/full-height.d.ts.map +1 -0
- package/cjs/src/full-height.js +272 -0
- package/cjs/src/full-height.js.map +1 -0
- package/cjs/src/full-height.spec.d.ts +2 -0
- package/cjs/src/full-height.spec.d.ts.map +1 -0
- package/cjs/src/full-height.spec.js +835 -0
- package/cjs/src/full-height.spec.js.map +1 -0
- package/cjs/src/index.d.ts +4 -3
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +3 -3
- 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.map +1 -1
- package/cjs/src/react/all-types-export.parity.spec.js +55 -3
- package/cjs/src/react/all-types-export.parity.spec.js.map +1 -1
- package/cjs/src/types.d.ts +540 -3
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +326 -1
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/processTrigger.d.ts +3 -1
- package/cjs/src/utils/processTrigger.d.ts.map +1 -1
- package/cjs/src/utils/processTrigger.js +19 -51
- package/cjs/src/utils/processTrigger.js.map +1 -1
- package/cjs/src/utils/transport/iframe-transport.d.ts +55 -0
- package/cjs/src/utils/transport/iframe-transport.d.ts.map +1 -0
- package/cjs/src/utils/transport/iframe-transport.js +108 -0
- package/cjs/src/utils/transport/iframe-transport.js.map +1 -0
- package/cjs/src/utils/transport/iframe-transport.spec.d.ts +2 -0
- package/cjs/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
- package/cjs/src/utils/transport/iframe-transport.spec.js +140 -0
- package/cjs/src/utils/transport/iframe-transport.spec.js.map +1 -0
- package/cjs/src/utils.d.ts +18 -0
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +39 -1
- package/cjs/src/utils.js.map +1 -1
- package/cjs/src/utils.spec.js +62 -0
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-BMppCU63.js → index-C1pmYb5H.js} +1 -1
- package/dist/src/contracts/contracts.spec.d.ts +2 -0
- package/dist/src/contracts/contracts.spec.d.ts.map +1 -0
- package/dist/src/contracts/embed-event-payloads.d.ts +73 -0
- package/dist/src/contracts/embed-event-payloads.d.ts.map +1 -0
- package/dist/src/contracts/host-event-contracts.d.ts +378 -0
- package/dist/src/contracts/host-event-contracts.d.ts.map +1 -0
- package/dist/src/contracts/index.d.ts +22 -0
- package/dist/src/contracts/index.d.ts.map +1 -0
- package/dist/src/contracts/ui-passthrough-contracts.d.ts +277 -0
- package/dist/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
- package/dist/src/embed/app.d.ts +17 -140
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts +3 -2
- package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/utils.d.ts +1 -1
- package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +9 -161
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/search.d.ts +14 -0
- package/dist/src/embed/search.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +17 -22
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/full-height.d.ts +137 -0
- package/dist/src/full-height.d.ts.map +1 -0
- package/dist/src/full-height.spec.d.ts +2 -0
- package/dist/src/full-height.spec.d.ts.map +1 -0
- package/dist/src/index.d.ts +4 -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/types.d.ts +540 -3
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/processTrigger.d.ts +3 -1
- package/dist/src/utils/processTrigger.d.ts.map +1 -1
- package/dist/src/utils/transport/iframe-transport.d.ts +55 -0
- package/dist/src/utils/transport/iframe-transport.d.ts.map +1 -0
- package/dist/src/utils/transport/iframe-transport.spec.d.ts +2 -0
- package/dist/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
- package/dist/src/utils.d.ts +18 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +925 -363
- package/dist/tsembed-react.js +924 -362
- package/dist/tsembed.es.js +925 -363
- package/dist/tsembed.js +924 -362
- package/dist/visual-embed-sdk-react-full.d.ts +1357 -656
- package/dist/visual-embed-sdk-react.d.ts +1257 -606
- package/dist/visual-embed-sdk.d.ts +1320 -642
- package/lib/package.json +9 -1
- package/lib/src/contracts/contracts.spec.d.ts +2 -0
- package/lib/src/contracts/contracts.spec.d.ts.map +1 -0
- package/lib/src/contracts/contracts.spec.js +342 -0
- package/lib/src/contracts/contracts.spec.js.map +1 -0
- package/lib/src/contracts/embed-event-payloads.d.ts +73 -0
- package/lib/src/contracts/embed-event-payloads.d.ts.map +1 -0
- package/lib/src/contracts/embed-event-payloads.js +2 -0
- package/lib/src/contracts/embed-event-payloads.js.map +1 -0
- package/lib/src/contracts/host-event-contracts.d.ts +378 -0
- package/lib/src/contracts/host-event-contracts.d.ts.map +1 -0
- package/lib/src/contracts/host-event-contracts.js +2 -0
- package/lib/src/contracts/host-event-contracts.js.map +1 -0
- package/lib/src/contracts/index.d.ts +22 -0
- package/lib/src/contracts/index.d.ts.map +1 -0
- package/lib/src/contracts/index.js +22 -0
- package/lib/src/contracts/index.js.map +1 -0
- package/lib/src/contracts/ui-passthrough-contracts.d.ts +277 -0
- package/lib/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
- package/lib/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
- package/lib/src/contracts/ui-passthrough-contracts.js.map +1 -0
- package/lib/src/embed/app.d.ts +17 -140
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +22 -122
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +70 -26
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/events.spec.js +12 -2
- package/lib/src/embed/events.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts +3 -2
- package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.js +6 -1
- package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/utils.d.ts +1 -1
- package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/utils.js +1 -1
- package/lib/src/embed/hostEventClient/utils.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +9 -161
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +67 -135
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +211 -28
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/search.d.ts +14 -0
- package/lib/src/embed/search.d.ts.map +1 -1
- package/lib/src/embed/search.js +4 -1
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/search.spec.js +65 -0
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +17 -22
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +82 -56
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +322 -14
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/full-height.d.ts +137 -0
- package/lib/src/full-height.d.ts.map +1 -0
- package/lib/src/full-height.js +268 -0
- package/lib/src/full-height.js.map +1 -0
- package/lib/src/full-height.spec.d.ts +2 -0
- package/lib/src/full-height.spec.d.ts.map +1 -0
- package/lib/src/full-height.spec.js +833 -0
- package/lib/src/full-height.spec.js.map +1 -0
- package/lib/src/index.d.ts +4 -3
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +1 -1
- 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.map +1 -1
- package/lib/src/react/all-types-export.parity.spec.js +55 -3
- package/lib/src/react/all-types-export.parity.spec.js.map +1 -1
- package/lib/src/types.d.ts +540 -3
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +326 -1
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/processTrigger.d.ts +3 -1
- package/lib/src/utils/processTrigger.d.ts.map +1 -1
- package/lib/src/utils/processTrigger.js +19 -51
- package/lib/src/utils/processTrigger.js.map +1 -1
- package/lib/src/utils/transport/iframe-transport.d.ts +55 -0
- package/lib/src/utils/transport/iframe-transport.d.ts.map +1 -0
- package/lib/src/utils/transport/iframe-transport.js +101 -0
- package/lib/src/utils/transport/iframe-transport.js.map +1 -0
- package/lib/src/utils/transport/iframe-transport.spec.d.ts +2 -0
- package/lib/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
- package/lib/src/utils/transport/iframe-transport.spec.js +138 -0
- package/lib/src/utils/transport/iframe-transport.spec.js.map +1 -0
- package/lib/src/utils.d.ts +18 -0
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +37 -0
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js +63 -1
- package/lib/src/utils.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +1320 -642
- package/package.json +9 -1
- package/src/contracts/contracts.spec.ts +392 -0
- package/src/contracts/embed-event-payloads.ts +83 -0
- package/src/contracts/host-event-contracts.ts +456 -0
- package/src/contracts/index.ts +53 -0
- package/src/contracts/ui-passthrough-contracts.ts +301 -0
- package/src/embed/app.spec.ts +86 -34
- package/src/embed/app.ts +37 -264
- package/src/embed/events.spec.ts +14 -2
- package/src/embed/hostEventClient/host-event-client.spec.ts +2 -2
- package/src/embed/hostEventClient/host-event-client.ts +18 -5
- package/src/embed/hostEventClient/utils.ts +2 -1
- package/src/embed/liveboard.spec.ts +257 -38
- package/src/embed/liveboard.ts +75 -296
- package/src/embed/search.spec.ts +80 -0
- package/src/embed/search.ts +20 -0
- package/src/embed/ts-embed.spec.ts +448 -15
- package/src/embed/ts-embed.ts +109 -66
- package/src/full-height.spec.ts +1008 -0
- package/src/full-height.ts +361 -0
- package/src/index.ts +93 -5
- package/src/react/all-types-export.parity.spec.ts +63 -3
- package/src/react/all-types-export.ts +45 -0
- package/src/types.ts +540 -1
- package/src/utils/processTrigger.ts +28 -58
- package/src/utils/transport/iframe-transport.spec.ts +177 -0
- package/src/utils/transport/iframe-transport.ts +122 -0
- package/src/utils.spec.ts +71 -0
- package/src/utils.ts +38 -0
- package/cjs/src/embed/hostEventClient/contracts.d.ts +0 -231
- package/cjs/src/embed/hostEventClient/contracts.d.ts.map +0 -1
- package/cjs/src/embed/hostEventClient/contracts.js.map +0 -1
- package/dist/src/embed/hostEventClient/contracts.d.ts +0 -231
- package/dist/src/embed/hostEventClient/contracts.d.ts.map +0 -1
- package/lib/src/embed/hostEventClient/contracts.d.ts +0 -231
- package/lib/src/embed/hostEventClient/contracts.d.ts.map +0 -1
- package/lib/src/embed/hostEventClient/contracts.js.map +0 -1
- package/src/embed/hostEventClient/contracts.ts +0 -262
|
@@ -62,7 +62,7 @@ import { logger } from '../utils/logger';
|
|
|
62
62
|
import { version } from '../../package.json';
|
|
63
63
|
import { HiddenActionItemByDefaultForSearchEmbed } from './search';
|
|
64
64
|
import { processTrigger } from '../utils/processTrigger';
|
|
65
|
-
import { UIPassthroughEvent } from '
|
|
65
|
+
import { UIPassthroughEvent } from '../contracts/ui-passthrough-contracts';
|
|
66
66
|
import * as sessionInfoService from '../utils/sessionInfoService';
|
|
67
67
|
import * as authToken from '../authToken';
|
|
68
68
|
import * as apiIntercept from '../api-intercept';
|
|
@@ -243,7 +243,10 @@ describe('Unit test case for ts embed', () => {
|
|
|
243
243
|
liveboardEmbed.render();
|
|
244
244
|
mockProcessTrigger.mockResolvedValue({ session: 'test' });
|
|
245
245
|
await executeAfterWait(async () => {
|
|
246
|
-
|
|
246
|
+
// `false` is a deliberately off-contract payload here — this
|
|
247
|
+
// asserts raw passthrough to processTrigger, not a real Save
|
|
248
|
+
// payload — so it is cast past the typed `data` parameter.
|
|
249
|
+
await liveboardEmbed.trigger(HostEvent.Save, false as any);
|
|
247
250
|
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
248
251
|
getIFrameEl(),
|
|
249
252
|
HostEvent.Save,
|
|
@@ -4377,7 +4380,9 @@ describe('Unit test case for ts embed', () => {
|
|
|
4377
4380
|
|
|
4378
4381
|
test('should return getPreRenderObj and log if same object', () => {
|
|
4379
4382
|
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
4380
|
-
|
|
4383
|
+
// debug, not info: the wrapper points at the embed being shown, so
|
|
4384
|
+
// this is now the common case rather than a rare diagnostic.
|
|
4385
|
+
const loggerSpy = jest.spyOn(logger, 'debug');
|
|
4381
4386
|
|
|
4382
4387
|
// getPreRenderObj reads the embed reference from preRenderWrapper
|
|
4383
4388
|
(searchEmbed as any).preRenderWrapper = {
|
|
@@ -5269,16 +5274,6 @@ describe('Additional Coverage Tests', () => {
|
|
|
5269
5274
|
});
|
|
5270
5275
|
});
|
|
5271
5276
|
|
|
5272
|
-
test('should test getIframeCenter calculation', async () => {
|
|
5273
|
-
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
5274
|
-
await searchEmbed.render();
|
|
5275
|
-
await executeAfterWait(() => {
|
|
5276
|
-
const center = searchEmbed['getIframeCenter']();
|
|
5277
|
-
expect(center).toHaveProperty('iframeCenter');
|
|
5278
|
-
expect(center).toHaveProperty('iframeHeight');
|
|
5279
|
-
expect(center).toHaveProperty('viewPortHeight');
|
|
5280
|
-
});
|
|
5281
|
-
});
|
|
5282
5277
|
|
|
5283
5278
|
test('should handle preRender with replaceExistingPreRender=true', async () => {
|
|
5284
5279
|
createRootEleForEmbed();
|
|
@@ -5680,7 +5675,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
5680
5675
|
embed2.showPreRender();
|
|
5681
5676
|
|
|
5682
5677
|
await executeAfterWait(() => {
|
|
5683
|
-
|
|
5678
|
+
// Not LastCalledWith: LiveboardEmbed fires Navigate after this.
|
|
5679
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
5684
5680
|
expect.any(Object),
|
|
5685
5681
|
HostEvent.UpdateEmbedParams,
|
|
5686
5682
|
expect.any(String),
|
|
@@ -5733,7 +5729,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
5733
5729
|
embed2.showPreRender();
|
|
5734
5730
|
|
|
5735
5731
|
await executeAfterWait(() => {
|
|
5736
|
-
|
|
5732
|
+
// Not LastCalledWith: LiveboardEmbed fires Navigate after this.
|
|
5733
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
5737
5734
|
expect.any(Object),
|
|
5738
5735
|
HostEvent.UpdateEmbedParams,
|
|
5739
5736
|
expect.any(String),
|
|
@@ -5753,6 +5750,442 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
5753
5750
|
});
|
|
5754
5751
|
});
|
|
5755
5752
|
|
|
5753
|
+
test('should carry the new config filters in UpdateEmbedParams', async () => {
|
|
5754
|
+
await setupPreRenderTest('params-new-filters', { liveboardId: 'original-lb' });
|
|
5755
|
+
|
|
5756
|
+
const runtimeFilters = [
|
|
5757
|
+
{
|
|
5758
|
+
columnName: 'Color',
|
|
5759
|
+
operator: RuntimeFilterOp.IN,
|
|
5760
|
+
values: ['red', 'blue'],
|
|
5761
|
+
},
|
|
5762
|
+
];
|
|
5763
|
+
|
|
5764
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
5765
|
+
preRenderId: 'params-new-filters',
|
|
5766
|
+
liveboardId: 'original-lb',
|
|
5767
|
+
runtimeFilters,
|
|
5768
|
+
});
|
|
5769
|
+
|
|
5770
|
+
embed2.showPreRender();
|
|
5771
|
+
|
|
5772
|
+
await executeAfterWait(() => {
|
|
5773
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
5774
|
+
expect.any(Object),
|
|
5775
|
+
HostEvent.UpdateEmbedParams,
|
|
5776
|
+
expect.any(String),
|
|
5777
|
+
expect.objectContaining({
|
|
5778
|
+
runtimeFilters,
|
|
5779
|
+
// The serialized form is the one the container reads.
|
|
5780
|
+
runtimeFilterParams: 'col1=Color&op1=IN&val1=red&val1=blue',
|
|
5781
|
+
}),
|
|
5782
|
+
undefined,
|
|
5783
|
+
);
|
|
5784
|
+
|
|
5785
|
+
// Everything rides in the params payload; nothing follows it.
|
|
5786
|
+
const runtimeFilterCalls = mockProcessTrigger.mock.calls.filter(
|
|
5787
|
+
(call: any[]) => call[1] === HostEvent.UpdateRuntimeFilters,
|
|
5788
|
+
);
|
|
5789
|
+
expect(runtimeFilterCalls).toHaveLength(0);
|
|
5790
|
+
});
|
|
5791
|
+
});
|
|
5792
|
+
|
|
5793
|
+
test('should serialize the filters when they are not excluded from the URL', async () => {
|
|
5794
|
+
await setupPreRenderTest('params-url-filters', { liveboardId: 'original-lb' });
|
|
5795
|
+
|
|
5796
|
+
// With the flag off, getDefaultAppInitData leaves runtimeFilterParams
|
|
5797
|
+
// null and a URL render carries the filters in the iframe's query
|
|
5798
|
+
// string. A show cycle has no URL, so the payload has to carry them.
|
|
5799
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
5800
|
+
preRenderId: 'params-url-filters',
|
|
5801
|
+
liveboardId: 'original-lb',
|
|
5802
|
+
excludeRuntimeFiltersfromURL: false,
|
|
5803
|
+
runtimeFilters: [
|
|
5804
|
+
{
|
|
5805
|
+
columnName: 'Color',
|
|
5806
|
+
operator: RuntimeFilterOp.IN,
|
|
5807
|
+
values: ['red'],
|
|
5808
|
+
},
|
|
5809
|
+
],
|
|
5810
|
+
});
|
|
5811
|
+
|
|
5812
|
+
embed2.showPreRender();
|
|
5813
|
+
|
|
5814
|
+
await executeAfterWait(() => {
|
|
5815
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
5816
|
+
expect.any(Object),
|
|
5817
|
+
HostEvent.UpdateEmbedParams,
|
|
5818
|
+
expect.any(String),
|
|
5819
|
+
expect.objectContaining({
|
|
5820
|
+
runtimeFilterParams: 'col1=Color&op1=IN&val1=red',
|
|
5821
|
+
}),
|
|
5822
|
+
undefined,
|
|
5823
|
+
);
|
|
5824
|
+
});
|
|
5825
|
+
});
|
|
5826
|
+
|
|
5827
|
+
test('should trigger Navigate only after UpdateEmbedParams has settled', async () => {
|
|
5828
|
+
await setupPreRenderTest('navigate-after-params', {
|
|
5829
|
+
liveboardId: 'original-lb',
|
|
5830
|
+
runtimeFilters: [
|
|
5831
|
+
{
|
|
5832
|
+
columnName: 'Color',
|
|
5833
|
+
operator: RuntimeFilterOp.IN,
|
|
5834
|
+
values: ['red'],
|
|
5835
|
+
},
|
|
5836
|
+
],
|
|
5837
|
+
});
|
|
5838
|
+
|
|
5839
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
5840
|
+
preRenderId: 'navigate-after-params',
|
|
5841
|
+
liveboardId: 'updated-lb',
|
|
5842
|
+
});
|
|
5843
|
+
|
|
5844
|
+
embed2.showPreRender();
|
|
5845
|
+
|
|
5846
|
+
// Inside the settle window the params are already out
|
|
5847
|
+
// and Navigate is not.
|
|
5848
|
+
await executeAfterWait(() => {
|
|
5849
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call: any[]) => call[1]);
|
|
5850
|
+
expect(eventTypes).toContain(HostEvent.UpdateEmbedParams);
|
|
5851
|
+
expect(eventTypes).not.toContain(HostEvent.Navigate);
|
|
5852
|
+
}, 50);
|
|
5853
|
+
|
|
5854
|
+
await executeAfterWait(() => {
|
|
5855
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call: any[]) => call[1]);
|
|
5856
|
+
// A Navigate that beat the params would make the container load
|
|
5857
|
+
// `updated-lb` while still holding `original-lb`'s runtime filters,
|
|
5858
|
+
// and drop the params that then arrive mid-load (SCAL-336321).
|
|
5859
|
+
expect(eventTypes).toContain(HostEvent.Navigate);
|
|
5860
|
+
expect(eventTypes.indexOf(HostEvent.UpdateEmbedParams)).toBeLessThan(
|
|
5861
|
+
eventTypes.indexOf(HostEvent.Navigate),
|
|
5862
|
+
);
|
|
5863
|
+
}, 300);
|
|
5864
|
+
});
|
|
5865
|
+
|
|
5866
|
+
test('should mark the params empty when the config declares no filters', async () => {
|
|
5867
|
+
await setupPreRenderTest('params-clear-filters', {
|
|
5868
|
+
liveboardId: 'original-lb',
|
|
5869
|
+
runtimeFilters: [
|
|
5870
|
+
{
|
|
5871
|
+
columnName: 'Color',
|
|
5872
|
+
operator: RuntimeFilterOp.IN,
|
|
5873
|
+
values: ['red', 'blue'],
|
|
5874
|
+
},
|
|
5875
|
+
],
|
|
5876
|
+
});
|
|
5877
|
+
|
|
5878
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
5879
|
+
preRenderId: 'params-clear-filters',
|
|
5880
|
+
liveboardId: 'original-lb',
|
|
5881
|
+
});
|
|
5882
|
+
|
|
5883
|
+
embed2.showPreRender();
|
|
5884
|
+
|
|
5885
|
+
await executeAfterWait(() => {
|
|
5886
|
+
// Not null and not '': the container only reads this field when it
|
|
5887
|
+
// is truthy, so either would leave the previous embed's filters in
|
|
5888
|
+
// place. A lone separator passes that gate and parses to {}.
|
|
5889
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
5890
|
+
expect.any(Object),
|
|
5891
|
+
HostEvent.UpdateEmbedParams,
|
|
5892
|
+
expect.any(String),
|
|
5893
|
+
expect.objectContaining({ runtimeFilterParams: '&' }),
|
|
5894
|
+
undefined,
|
|
5895
|
+
);
|
|
5896
|
+
|
|
5897
|
+
const runtimeFilterCalls = mockProcessTrigger.mock.calls.filter(
|
|
5898
|
+
(call: any[]) => call[1] === HostEvent.UpdateRuntimeFilters,
|
|
5899
|
+
);
|
|
5900
|
+
expect(runtimeFilterCalls).toHaveLength(0);
|
|
5901
|
+
});
|
|
5902
|
+
});
|
|
5903
|
+
|
|
5904
|
+
test('should mark the params empty for an explicitly empty filter array', async () => {
|
|
5905
|
+
await setupPreRenderTest('params-empty-array', {
|
|
5906
|
+
liveboardId: 'original-lb',
|
|
5907
|
+
runtimeFilters: [
|
|
5908
|
+
{
|
|
5909
|
+
columnName: 'Color',
|
|
5910
|
+
operator: RuntimeFilterOp.IN,
|
|
5911
|
+
values: ['red'],
|
|
5912
|
+
},
|
|
5913
|
+
],
|
|
5914
|
+
});
|
|
5915
|
+
|
|
5916
|
+
// `runtimeFilters: []` is the shape the customer reported as not
|
|
5917
|
+
// resetting anything.
|
|
5918
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
5919
|
+
preRenderId: 'params-empty-array',
|
|
5920
|
+
liveboardId: 'original-lb',
|
|
5921
|
+
runtimeFilters: [],
|
|
5922
|
+
});
|
|
5923
|
+
|
|
5924
|
+
embed2.showPreRender();
|
|
5925
|
+
|
|
5926
|
+
await executeAfterWait(() => {
|
|
5927
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
5928
|
+
expect.any(Object),
|
|
5929
|
+
HostEvent.UpdateEmbedParams,
|
|
5930
|
+
expect.any(String),
|
|
5931
|
+
expect.objectContaining({ runtimeFilterParams: '&' }),
|
|
5932
|
+
undefined,
|
|
5933
|
+
);
|
|
5934
|
+
});
|
|
5935
|
+
});
|
|
5936
|
+
|
|
5937
|
+
test('should mark the params empty when no config in the chain has filters', async () => {
|
|
5938
|
+
await setupPreRenderTest('params-no-filters', { liveboardId: 'original-lb' });
|
|
5939
|
+
|
|
5940
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
5941
|
+
preRenderId: 'params-no-filters',
|
|
5942
|
+
liveboardId: 'updated-lb',
|
|
5943
|
+
});
|
|
5944
|
+
|
|
5945
|
+
embed2.showPreRender();
|
|
5946
|
+
|
|
5947
|
+
await executeAfterWait(() => {
|
|
5948
|
+
const paramsCall = mockProcessTrigger.mock.calls.find(
|
|
5949
|
+
(call: any[]) => call[1] === HostEvent.UpdateEmbedParams,
|
|
5950
|
+
);
|
|
5951
|
+
expect(paramsCall?.[3]).not.toHaveProperty('runtimeFilters');
|
|
5952
|
+
expect(paramsCall?.[3].runtimeFilterParams).toBe('&');
|
|
5953
|
+
});
|
|
5954
|
+
});
|
|
5955
|
+
|
|
5956
|
+
test('should state each embed filters as the pre-render is handed along', async () => {
|
|
5957
|
+
await setupPreRenderTest('params-chain', {
|
|
5958
|
+
liveboardId: 'original-lb',
|
|
5959
|
+
runtimeFilters: [
|
|
5960
|
+
{
|
|
5961
|
+
columnName: 'Color',
|
|
5962
|
+
operator: RuntimeFilterOp.IN,
|
|
5963
|
+
values: ['red', 'blue'],
|
|
5964
|
+
},
|
|
5965
|
+
],
|
|
5966
|
+
});
|
|
5967
|
+
|
|
5968
|
+
// Second in the chain declares none, so it empties the field rather
|
|
5969
|
+
// than letting the creator's filters stand.
|
|
5970
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
5971
|
+
preRenderId: 'params-chain',
|
|
5972
|
+
liveboardId: 'second-lb',
|
|
5973
|
+
});
|
|
5974
|
+
await embed2.showPreRender();
|
|
5975
|
+
await executeAfterWait(() => {
|
|
5976
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
5977
|
+
expect.any(Object),
|
|
5978
|
+
HostEvent.UpdateEmbedParams,
|
|
5979
|
+
expect.any(String),
|
|
5980
|
+
expect.objectContaining({ runtimeFilterParams: '&' }),
|
|
5981
|
+
undefined,
|
|
5982
|
+
);
|
|
5983
|
+
});
|
|
5984
|
+
|
|
5985
|
+
mockProcessTrigger.mockClear();
|
|
5986
|
+
|
|
5987
|
+
// Third declares its own, and states them without reference to either
|
|
5988
|
+
// embed before it.
|
|
5989
|
+
const embed3 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
5990
|
+
preRenderId: 'params-chain',
|
|
5991
|
+
liveboardId: 'third-lb',
|
|
5992
|
+
runtimeFilters: [
|
|
5993
|
+
{
|
|
5994
|
+
columnName: 'Region',
|
|
5995
|
+
operator: RuntimeFilterOp.EQ,
|
|
5996
|
+
values: ['North'],
|
|
5997
|
+
},
|
|
5998
|
+
],
|
|
5999
|
+
});
|
|
6000
|
+
await embed3.showPreRender();
|
|
6001
|
+
|
|
6002
|
+
await executeAfterWait(() => {
|
|
6003
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
6004
|
+
expect.any(Object),
|
|
6005
|
+
HostEvent.UpdateEmbedParams,
|
|
6006
|
+
expect.any(String),
|
|
6007
|
+
expect.objectContaining({
|
|
6008
|
+
runtimeFilterParams: 'col1=Region&op1=EQ&val1=North',
|
|
6009
|
+
}),
|
|
6010
|
+
undefined,
|
|
6011
|
+
);
|
|
6012
|
+
});
|
|
6013
|
+
});
|
|
6014
|
+
|
|
6015
|
+
test('should carry the new config runtime parameters in UpdateEmbedParams', async () => {
|
|
6016
|
+
await setupPreRenderTest('params-parameters', {
|
|
6017
|
+
liveboardId: 'original-lb',
|
|
6018
|
+
runtimeParameters: [{ name: 'Region Param', value: 'East' }],
|
|
6019
|
+
});
|
|
6020
|
+
|
|
6021
|
+
const runtimeParameters = [{ name: 'Region Param', value: 'West' }];
|
|
6022
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
6023
|
+
preRenderId: 'params-parameters',
|
|
6024
|
+
liveboardId: 'original-lb',
|
|
6025
|
+
runtimeParameters,
|
|
6026
|
+
});
|
|
6027
|
+
|
|
6028
|
+
embed2.showPreRender();
|
|
6029
|
+
|
|
6030
|
+
await executeAfterWait(() => {
|
|
6031
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
6032
|
+
expect.any(Object),
|
|
6033
|
+
HostEvent.UpdateEmbedParams,
|
|
6034
|
+
expect.any(String),
|
|
6035
|
+
expect.objectContaining({
|
|
6036
|
+
runtimeParameters,
|
|
6037
|
+
runtimeParameterParams: 'param1=Region%20Param¶mVal1=West',
|
|
6038
|
+
}),
|
|
6039
|
+
undefined,
|
|
6040
|
+
);
|
|
6041
|
+
|
|
6042
|
+
// A parameter always carries a value, so the payload says everything
|
|
6043
|
+
// there is to say — no follow-up event.
|
|
6044
|
+
const parameterCalls = mockProcessTrigger.mock.calls.filter(
|
|
6045
|
+
(call: any[]) => call[1] === HostEvent.UpdateParameters,
|
|
6046
|
+
);
|
|
6047
|
+
expect(parameterCalls).toHaveLength(0);
|
|
6048
|
+
});
|
|
6049
|
+
});
|
|
6050
|
+
|
|
6051
|
+
test('should mark the params empty when the config declares no parameters', async () => {
|
|
6052
|
+
await setupPreRenderTest('params-clear-parameters', {
|
|
6053
|
+
liveboardId: 'original-lb',
|
|
6054
|
+
runtimeParameters: [{ name: 'Region Param', value: 'East' }],
|
|
6055
|
+
});
|
|
6056
|
+
|
|
6057
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
6058
|
+
preRenderId: 'params-clear-parameters',
|
|
6059
|
+
liveboardId: 'original-lb',
|
|
6060
|
+
});
|
|
6061
|
+
|
|
6062
|
+
embed2.showPreRender();
|
|
6063
|
+
|
|
6064
|
+
await executeAfterWait(() => {
|
|
6065
|
+
// Same gate as the filters: the container only reads this field
|
|
6066
|
+
// when it is truthy, so null would leave 'East' standing.
|
|
6067
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
6068
|
+
expect.any(Object),
|
|
6069
|
+
HostEvent.UpdateEmbedParams,
|
|
6070
|
+
expect.any(String),
|
|
6071
|
+
expect.objectContaining({ runtimeParameterParams: '&' }),
|
|
6072
|
+
undefined,
|
|
6073
|
+
);
|
|
6074
|
+
});
|
|
6075
|
+
});
|
|
6076
|
+
|
|
6077
|
+
test('should keep an empty string parameter value distinct from having none', async () => {
|
|
6078
|
+
await setupPreRenderTest('params-empty-value', { liveboardId: 'original-lb' });
|
|
6079
|
+
|
|
6080
|
+
// `paramVal1=` is that parameter's value, not an absence — so it must
|
|
6081
|
+
// not collapse to the empty marker.
|
|
6082
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
6083
|
+
preRenderId: 'params-empty-value',
|
|
6084
|
+
liveboardId: 'original-lb',
|
|
6085
|
+
runtimeParameters: [{ name: 'Region Param', value: '' }],
|
|
6086
|
+
});
|
|
6087
|
+
|
|
6088
|
+
embed2.showPreRender();
|
|
6089
|
+
|
|
6090
|
+
await executeAfterWait(() => {
|
|
6091
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
6092
|
+
expect.any(Object),
|
|
6093
|
+
HostEvent.UpdateEmbedParams,
|
|
6094
|
+
expect.any(String),
|
|
6095
|
+
expect.objectContaining({
|
|
6096
|
+
runtimeParameterParams: 'param1=Region%20Param¶mVal1=',
|
|
6097
|
+
}),
|
|
6098
|
+
undefined,
|
|
6099
|
+
);
|
|
6100
|
+
});
|
|
6101
|
+
});
|
|
6102
|
+
|
|
6103
|
+
|
|
6104
|
+
test('should hand the pre-render over to the embed being shown', async () => {
|
|
6105
|
+
const embed1 = await setupPreRenderTest('take-over-state', { liveboardId: 'original-lb' });
|
|
6106
|
+
|
|
6107
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
6108
|
+
preRenderId: 'take-over-state',
|
|
6109
|
+
liveboardId: 'second-lb',
|
|
6110
|
+
});
|
|
6111
|
+
|
|
6112
|
+
await embed2.showPreRender();
|
|
6113
|
+
|
|
6114
|
+
// It connected to embed1's pre-render and is now what the wrapper
|
|
6115
|
+
// points at, so getPreRenderObj() means "what is showing".
|
|
6116
|
+
expect((embed2 as any).getPreRenderObj()).toBe(embed2);
|
|
6117
|
+
expect((embed1 as any).getPreRenderObj()).toBe(embed2);
|
|
6118
|
+
});
|
|
6119
|
+
|
|
6120
|
+
test('should not strand callbacks when the container loads after the shown embed was hidden', async () => {
|
|
6121
|
+
// The creator is subscribed but the container has NOT announced itself
|
|
6122
|
+
// yet, which is the state a real pre-render starts in.
|
|
6123
|
+
const embed1 = await setupPreRenderTest('loaded-after-hide', { liveboardId: 'original-lb' });
|
|
6124
|
+
embed1.isEmbedContainerLoaded = false;
|
|
6125
|
+
|
|
6126
|
+
// Second embed shows, takes the pre-render over, then is hidden — which
|
|
6127
|
+
// unsubscribes it, so it will never hear EmbedListenerReady itself.
|
|
6128
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
6129
|
+
preRenderId: 'loaded-after-hide',
|
|
6130
|
+
liveboardId: 'second-lb',
|
|
6131
|
+
});
|
|
6132
|
+
await embed2.showPreRender();
|
|
6133
|
+
embed2.hidePreRender();
|
|
6134
|
+
expect(embed2.isEmbedContainerLoaded).toBe(false);
|
|
6135
|
+
|
|
6136
|
+
// Container comes up and the creator hears it.
|
|
6137
|
+
(embed1 as any).createEmbedContainerHandler(EmbedEvent.EmbedListenerReady)();
|
|
6138
|
+
|
|
6139
|
+
mockProcessTrigger.mockClear();
|
|
6140
|
+
mockProcessTrigger.mockResolvedValue({});
|
|
6141
|
+
|
|
6142
|
+
// A third embed reads the state off embed2, which owns the wrapper and
|
|
6143
|
+
// never learned the container was up. Reading a per-instance snapshot
|
|
6144
|
+
// here leaves UpdateEmbedParams queued forever and the pre-render stuck
|
|
6145
|
+
// on the previous liveboard.
|
|
6146
|
+
const embed3 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
6147
|
+
preRenderId: 'loaded-after-hide',
|
|
6148
|
+
liveboardId: 'third-lb',
|
|
6149
|
+
});
|
|
6150
|
+
await embed3.showPreRender();
|
|
6151
|
+
|
|
6152
|
+
expect(embed3.isEmbedContainerLoaded).toBe(true);
|
|
6153
|
+
await executeAfterWait(() => {
|
|
6154
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call: any[]) => call[1]);
|
|
6155
|
+
expect(eventTypes).toContain(HostEvent.UpdateEmbedParams);
|
|
6156
|
+
}, 300);
|
|
6157
|
+
});
|
|
6158
|
+
|
|
6159
|
+
test('should not reconcile runtime filters unless the view config opts in', async () => {
|
|
6160
|
+
await setupPreRenderTest('reconcile-flag-off', {
|
|
6161
|
+
liveboardId: 'original-lb',
|
|
6162
|
+
runtimeFilters: [
|
|
6163
|
+
{
|
|
6164
|
+
columnName: 'Color',
|
|
6165
|
+
operator: RuntimeFilterOp.IN,
|
|
6166
|
+
values: ['red', 'blue'],
|
|
6167
|
+
},
|
|
6168
|
+
],
|
|
6169
|
+
});
|
|
6170
|
+
|
|
6171
|
+
// Same shape as the clear-filters case above, minus the flag: the
|
|
6172
|
+
// previous config left filters on the shared pre-render and this one
|
|
6173
|
+
// declares none. Without preRenderConfig.reconcileRuntimeParams the SDK
|
|
6174
|
+
// leaves that to the container, so no UpdateRuntimeFilters goes out.
|
|
6175
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
6176
|
+
preRenderId: 'reconcile-flag-off',
|
|
6177
|
+
liveboardId: 'original-lb',
|
|
6178
|
+
});
|
|
6179
|
+
|
|
6180
|
+
embed2.showPreRender();
|
|
6181
|
+
|
|
6182
|
+
await executeAfterWait(() => {
|
|
6183
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call: any[]) => call[1]);
|
|
6184
|
+
expect(eventTypes).toContain(HostEvent.UpdateEmbedParams);
|
|
6185
|
+
expect(eventTypes).not.toContain(HostEvent.UpdateRuntimeFilters);
|
|
6186
|
+
});
|
|
6187
|
+
});
|
|
6188
|
+
|
|
5756
6189
|
test('should handle error when getUpdateEmbedParamsObject fails during showPreRender', async () => {
|
|
5757
6190
|
await setupPreRenderTest('error-test', { liveboardId: 'original-lb' });
|
|
5758
6191
|
|