@thoughtspot/visual-embed-sdk 1.45.1 → 1.45.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/package.json +1 -1
- package/cjs/src/authToken.d.ts +1 -1
- package/cjs/src/authToken.d.ts.map +1 -1
- package/cjs/src/authToken.js +2 -2
- package/cjs/src/authToken.js.map +1 -1
- package/cjs/src/authToken.spec.js +71 -0
- package/cjs/src/authToken.spec.js.map +1 -1
- package/cjs/src/css-variables.d.ts +48 -0
- package/cjs/src/css-variables.d.ts.map +1 -1
- package/cjs/src/embed/app.d.ts +37 -0
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +37 -1
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +24 -0
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +127 -9
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +41 -18
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +96 -3
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/contracts.d.ts +3 -3
- package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts +8 -8
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.js +18 -18
- package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +7 -7
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +40 -3
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +40 -12
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +180 -8
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +23 -2
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +64 -22
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +138 -19
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/errors.d.ts +1 -0
- package/cjs/src/errors.d.ts.map +1 -1
- package/cjs/src/errors.js +1 -0
- package/cjs/src/errors.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/types.d.ts +356 -42
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +227 -20
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
- package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
- package/cjs/src/utils/graphql/answerService/answer-queries.js +23 -1
- package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.d.ts +2 -1
- package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.js +9 -1
- package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.spec.js +73 -0
- package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/cjs/src/utils/processTrigger.d.ts +3 -2
- package/cjs/src/utils/processTrigger.d.ts.map +1 -1
- package/cjs/src/utils/processTrigger.js +4 -2
- package/cjs/src/utils/processTrigger.js.map +1 -1
- package/cjs/src/utils.d.ts +20 -1
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +40 -1
- package/cjs/src/utils.js.map +1 -1
- package/cjs/src/utils.spec.js +49 -0
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-Dgzjq7qH.js → index-BuwECGdm.js} +1 -1
- package/dist/src/authToken.d.ts +1 -1
- package/dist/src/authToken.d.ts.map +1 -1
- package/dist/src/css-variables.d.ts +48 -0
- package/dist/src/css-variables.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +37 -0
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +127 -9
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/contracts.d.ts +3 -3
- package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts +8 -8
- package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +40 -3
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +23 -2
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.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/types.d.ts +356 -42
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
- package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
- package/dist/src/utils/graphql/answerService/answerService.d.ts +2 -1
- package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/dist/src/utils/processTrigger.d.ts +3 -2
- package/dist/src/utils/processTrigger.d.ts.map +1 -1
- package/dist/src/utils.d.ts +20 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +501 -98
- package/dist/tsembed-react.js +500 -97
- package/dist/tsembed.es.js +516 -113
- package/dist/tsembed.js +29956 -29553
- package/dist/visual-embed-sdk-react-full.d.ts +819 -282
- package/dist/visual-embed-sdk-react.d.ts +818 -281
- package/dist/visual-embed-sdk.d.ts +882 -321
- package/lib/package.json +1 -1
- package/lib/src/authToken.d.ts +1 -1
- package/lib/src/authToken.d.ts.map +1 -1
- package/lib/src/authToken.js +2 -2
- package/lib/src/authToken.js.map +1 -1
- package/lib/src/authToken.spec.js +72 -1
- package/lib/src/authToken.spec.js.map +1 -1
- package/lib/src/css-variables.d.ts +48 -0
- package/lib/src/css-variables.d.ts.map +1 -1
- package/lib/src/embed/app.d.ts +37 -0
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +39 -3
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +24 -0
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +127 -9
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +42 -19
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +96 -3
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/contracts.d.ts +3 -3
- package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts +8 -8
- package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.js +18 -18
- package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +7 -7
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +40 -3
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +41 -13
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +180 -8
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +23 -2
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +64 -22
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +139 -20
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/errors.d.ts +1 -0
- package/lib/src/errors.d.ts.map +1 -1
- package/lib/src/errors.js +1 -0
- package/lib/src/errors.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/types.d.ts +356 -42
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +226 -19
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
- package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
- package/lib/src/utils/graphql/answerService/answer-queries.js +22 -0
- package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.d.ts +2 -1
- package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.js +9 -1
- package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.spec.js +73 -0
- package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/lib/src/utils/processTrigger.d.ts +3 -2
- package/lib/src/utils/processTrigger.d.ts.map +1 -1
- package/lib/src/utils/processTrigger.js +4 -2
- package/lib/src/utils/processTrigger.js.map +1 -1
- package/lib/src/utils.d.ts +20 -1
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +36 -0
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js +50 -1
- package/lib/src/utils.spec.js.map +1 -1
- package/package.json +1 -1
- package/src/authToken.spec.ts +91 -2
- package/src/authToken.ts +2 -2
- package/src/css-variables.ts +60 -0
- package/src/embed/app.spec.ts +32 -0
- package/src/embed/app.ts +97 -1
- package/src/embed/conversation.spec.ts +117 -3
- package/src/embed/conversation.ts +188 -29
- package/src/embed/hostEventClient/contracts.ts +4 -4
- package/src/embed/hostEventClient/host-event-client.spec.ts +7 -1
- package/src/embed/hostEventClient/host-event-client.ts +22 -11
- package/src/embed/liveboard.spec.ts +264 -10
- package/src/embed/liveboard.ts +105 -14
- package/src/embed/ts-embed.spec.ts +184 -8
- package/src/embed/ts-embed.ts +81 -24
- package/src/errors.ts +1 -0
- package/src/index.ts +7 -1
- package/src/types.ts +364 -40
- package/src/utils/graphql/answerService/answer-queries.ts +23 -0
- package/src/utils/graphql/answerService/answerService.spec.ts +87 -0
- package/src/utils/graphql/answerService/answerService.ts +13 -1
- package/src/utils/processTrigger.ts +6 -3
- package/src/utils.spec.ts +56 -0
- package/src/utils.ts +44 -0
|
@@ -855,6 +855,187 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
855
855
|
});
|
|
856
856
|
});
|
|
857
857
|
|
|
858
|
+
describe('personalizedViewId functionality', () => {
|
|
859
|
+
const personalizedViewId = 'view-456-guid';
|
|
860
|
+
|
|
861
|
+
test('should render liveboard with personalizedViewId', async () => {
|
|
862
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
863
|
+
...defaultViewConfig,
|
|
864
|
+
liveboardId,
|
|
865
|
+
personalizedViewId,
|
|
866
|
+
} as LiveboardViewConfig);
|
|
867
|
+
liveboardEmbed.render();
|
|
868
|
+
await executeAfterWait(() => {
|
|
869
|
+
expectUrlToHaveParamsWithValues(getIFrameSrc(), { view: personalizedViewId });
|
|
870
|
+
});
|
|
871
|
+
});
|
|
872
|
+
|
|
873
|
+
test('should render liveboard with personalizedViewId and activeTabId together', async () => {
|
|
874
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
875
|
+
...defaultViewConfig,
|
|
876
|
+
liveboardId,
|
|
877
|
+
personalizedViewId,
|
|
878
|
+
activeTabId,
|
|
879
|
+
} as LiveboardViewConfig);
|
|
880
|
+
liveboardEmbed.render();
|
|
881
|
+
await executeAfterWait(() => {
|
|
882
|
+
// URL should be: #/embed/viz/{id}/tab/{tabId}?view={viewId}
|
|
883
|
+
expect(getIFrameSrc()).toMatch(
|
|
884
|
+
new RegExp(
|
|
885
|
+
`#/embed/viz/${liveboardId}/tab/${activeTabId}\\?view=${personalizedViewId}`,
|
|
886
|
+
),
|
|
887
|
+
);
|
|
888
|
+
});
|
|
889
|
+
});
|
|
890
|
+
|
|
891
|
+
test('should render liveboard with personalizedViewId and vizId together', async () => {
|
|
892
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
893
|
+
...defaultViewConfig,
|
|
894
|
+
liveboardId,
|
|
895
|
+
personalizedViewId,
|
|
896
|
+
vizId,
|
|
897
|
+
} as LiveboardViewConfig);
|
|
898
|
+
liveboardEmbed.render();
|
|
899
|
+
await executeAfterWait(() => {
|
|
900
|
+
// URL should be: #/embed/viz/{id}/{vizId}?view={viewId}
|
|
901
|
+
expect(getIFrameSrc()).toMatch(
|
|
902
|
+
new RegExp(`#/embed/viz/${liveboardId}/${vizId}\\?view=${personalizedViewId}`),
|
|
903
|
+
);
|
|
904
|
+
});
|
|
905
|
+
});
|
|
906
|
+
|
|
907
|
+
test('should render liveboard with personalizedViewId, activeTabId, and vizId together', async () => {
|
|
908
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
909
|
+
...defaultViewConfig,
|
|
910
|
+
liveboardId,
|
|
911
|
+
personalizedViewId,
|
|
912
|
+
activeTabId,
|
|
913
|
+
vizId,
|
|
914
|
+
} as LiveboardViewConfig);
|
|
915
|
+
liveboardEmbed.render();
|
|
916
|
+
await executeAfterWait(() => {
|
|
917
|
+
// URL should be: #/embed/viz/{id}/tab/{tabId}/{vizId}?view={viewId}
|
|
918
|
+
expect(getIFrameSrc()).toMatch(
|
|
919
|
+
new RegExp(
|
|
920
|
+
`#/embed/viz/${liveboardId}/tab/${activeTabId}/${vizId}\\?view=${personalizedViewId}`,
|
|
921
|
+
),
|
|
922
|
+
);
|
|
923
|
+
});
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
test('should not include view param when personalizedViewId is not provided', async () => {
|
|
927
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
928
|
+
...defaultViewConfig,
|
|
929
|
+
liveboardId,
|
|
930
|
+
} as LiveboardViewConfig);
|
|
931
|
+
liveboardEmbed.render();
|
|
932
|
+
await executeAfterWait(() => {
|
|
933
|
+
expect(getIFrameSrc()).not.toContain('view=');
|
|
934
|
+
});
|
|
935
|
+
});
|
|
936
|
+
|
|
937
|
+
test('should include personalizedViewId in getLiveboardUrl', async () => {
|
|
938
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
939
|
+
...defaultViewConfig,
|
|
940
|
+
liveboardId,
|
|
941
|
+
personalizedViewId,
|
|
942
|
+
} as LiveboardViewConfig);
|
|
943
|
+
await liveboardEmbed.render();
|
|
944
|
+
expect(liveboardEmbed.getLiveboardUrl()).toBe(
|
|
945
|
+
`http://${thoughtSpotHost}/#/pinboard/${liveboardId}?view=${personalizedViewId}`,
|
|
946
|
+
);
|
|
947
|
+
});
|
|
948
|
+
|
|
949
|
+
test('should include personalizedViewId with activeTabId in getLiveboardUrl', async () => {
|
|
950
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
951
|
+
...defaultViewConfig,
|
|
952
|
+
liveboardId,
|
|
953
|
+
personalizedViewId,
|
|
954
|
+
activeTabId,
|
|
955
|
+
} as LiveboardViewConfig);
|
|
956
|
+
await liveboardEmbed.render();
|
|
957
|
+
expect(liveboardEmbed.getLiveboardUrl()).toBe(
|
|
958
|
+
`http://${thoughtSpotHost}/#/pinboard/${liveboardId}/tab/${activeTabId}?view=${personalizedViewId}`,
|
|
959
|
+
);
|
|
960
|
+
});
|
|
961
|
+
|
|
962
|
+
test('personalizedViewId should work with runtime filters', async () => {
|
|
963
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
964
|
+
...defaultViewConfig,
|
|
965
|
+
liveboardId,
|
|
966
|
+
personalizedViewId,
|
|
967
|
+
runtimeFilters: [
|
|
968
|
+
{
|
|
969
|
+
columnName: 'sales',
|
|
970
|
+
operator: RuntimeFilterOp.EQ,
|
|
971
|
+
values: [1000],
|
|
972
|
+
},
|
|
973
|
+
],
|
|
974
|
+
excludeRuntimeFiltersfromURL: false,
|
|
975
|
+
} as LiveboardViewConfig);
|
|
976
|
+
liveboardEmbed.render();
|
|
977
|
+
await executeAfterWait(() => {
|
|
978
|
+
expectUrlToHaveParamsWithValues(getIFrameSrc(), {
|
|
979
|
+
view: personalizedViewId,
|
|
980
|
+
col1: 'sales',
|
|
981
|
+
op1: 'EQ',
|
|
982
|
+
val1: '1000',
|
|
983
|
+
});
|
|
984
|
+
});
|
|
985
|
+
});
|
|
986
|
+
|
|
987
|
+
describe('backward compatibility with liveboardId?view= workaround', () => {
|
|
988
|
+
const workaroundViewId = 'workaround-view-id';
|
|
989
|
+
const liveboardIdWithView = `${liveboardId}?view=${workaroundViewId}`;
|
|
990
|
+
|
|
991
|
+
test('should extract view from workaround and add at end of URL', async () => {
|
|
992
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
993
|
+
...defaultViewConfig,
|
|
994
|
+
liveboardId: liveboardIdWithView,
|
|
995
|
+
} as LiveboardViewConfig);
|
|
996
|
+
liveboardEmbed.render();
|
|
997
|
+
await executeAfterWait(() => {
|
|
998
|
+
// URL: #/embed/viz/{cleanId}?view={workaroundViewId}
|
|
999
|
+
expect(getIFrameSrc()).toMatch(
|
|
1000
|
+
new RegExp(`#/embed/viz/${liveboardId}\\?view=${workaroundViewId}`),
|
|
1001
|
+
);
|
|
1002
|
+
});
|
|
1003
|
+
});
|
|
1004
|
+
|
|
1005
|
+
test('should extract view and place after tab when activeTabId is provided', async () => {
|
|
1006
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1007
|
+
...defaultViewConfig,
|
|
1008
|
+
liveboardId: liveboardIdWithView,
|
|
1009
|
+
activeTabId,
|
|
1010
|
+
} as LiveboardViewConfig);
|
|
1011
|
+
liveboardEmbed.render();
|
|
1012
|
+
await executeAfterWait(() => {
|
|
1013
|
+
// URL: #/embed/viz/{id}/tab/{tabId}?view={viewId} (view at END, not middle)
|
|
1014
|
+
expect(getIFrameSrc()).toMatch(
|
|
1015
|
+
new RegExp(
|
|
1016
|
+
`#/embed/viz/${liveboardId}/tab/${activeTabId}\\?view=${workaroundViewId}`,
|
|
1017
|
+
),
|
|
1018
|
+
);
|
|
1019
|
+
});
|
|
1020
|
+
});
|
|
1021
|
+
|
|
1022
|
+
test('should use personalizedViewId over workaround when both provided', async () => {
|
|
1023
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1024
|
+
...defaultViewConfig,
|
|
1025
|
+
liveboardId: liveboardIdWithView,
|
|
1026
|
+
personalizedViewId,
|
|
1027
|
+
} as LiveboardViewConfig);
|
|
1028
|
+
liveboardEmbed.render();
|
|
1029
|
+
await executeAfterWait(() => {
|
|
1030
|
+
// personalizedViewId wins, workaround stripped
|
|
1031
|
+
expect(getIFrameSrc()).toMatch(
|
|
1032
|
+
new RegExp(`#/embed/viz/${liveboardId}\\?view=${personalizedViewId}`),
|
|
1033
|
+
);
|
|
1034
|
+
});
|
|
1035
|
+
});
|
|
1036
|
+
});
|
|
1037
|
+
});
|
|
1038
|
+
|
|
858
1039
|
test('navigateToLiveboard should trigger the navigate event with the correct path', async () => {
|
|
859
1040
|
mockMessageChannel();
|
|
860
1041
|
// mock getSessionInfo
|
|
@@ -979,6 +1160,40 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
979
1160
|
});
|
|
980
1161
|
});
|
|
981
1162
|
|
|
1163
|
+
test('should set hideToolResponseCardBranding parameter in url params via spotterChatConfig', async () => {
|
|
1164
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1165
|
+
...defaultViewConfig,
|
|
1166
|
+
liveboardId,
|
|
1167
|
+
spotterChatConfig: {
|
|
1168
|
+
hideToolResponseCardBranding: true,
|
|
1169
|
+
},
|
|
1170
|
+
} as LiveboardViewConfig);
|
|
1171
|
+
await liveboardEmbed.render();
|
|
1172
|
+
await executeAfterWait(() => {
|
|
1173
|
+
expectUrlMatchesWithParams(
|
|
1174
|
+
getIFrameSrc(),
|
|
1175
|
+
`http://${thoughtSpotHost}/?embedApp=true${defaultParams}${prefixParams}&hideToolResponseCardBranding=true#/embed/viz/${liveboardId}`,
|
|
1176
|
+
);
|
|
1177
|
+
});
|
|
1178
|
+
});
|
|
1179
|
+
|
|
1180
|
+
test('should set toolResponseCardBrandingLabel parameter in url params via spotterChatConfig', async () => {
|
|
1181
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1182
|
+
...defaultViewConfig,
|
|
1183
|
+
liveboardId,
|
|
1184
|
+
spotterChatConfig: {
|
|
1185
|
+
toolResponseCardBrandingLabel: 'MyBrand',
|
|
1186
|
+
},
|
|
1187
|
+
} as LiveboardViewConfig);
|
|
1188
|
+
await liveboardEmbed.render();
|
|
1189
|
+
await executeAfterWait(() => {
|
|
1190
|
+
expectUrlMatchesWithParams(
|
|
1191
|
+
getIFrameSrc(),
|
|
1192
|
+
`http://${thoughtSpotHost}/?embedApp=true${defaultParams}${prefixParams}&toolResponseCardBrandingLabel=MyBrand#/embed/viz/${liveboardId}`,
|
|
1193
|
+
);
|
|
1194
|
+
});
|
|
1195
|
+
});
|
|
1196
|
+
|
|
982
1197
|
test('SetActiveTab Hostevent should not trigger the navigate event with the correct path, for vizEmbed', async () => {
|
|
983
1198
|
const mockProcessTrigger = jest.spyOn(tsEmbed.TsEmbed.prototype, 'trigger');
|
|
984
1199
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
@@ -1137,7 +1352,12 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1137
1352
|
) as HTMLIFrameElement;
|
|
1138
1353
|
|
|
1139
1354
|
// should render the generic link
|
|
1140
|
-
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1355
|
+
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1356
|
+
testLiveboardId,
|
|
1357
|
+
'testVizId',
|
|
1358
|
+
'testActiveTabId',
|
|
1359
|
+
undefined,
|
|
1360
|
+
);
|
|
1141
1361
|
expect(iFrame.src).toMatch(/http:\/\/tshost\/.*&isLiveboardEmbed=true.*#$/);
|
|
1142
1362
|
|
|
1143
1363
|
expect(consoleSpy).toHaveBeenCalledTimes(0);
|
|
@@ -1195,7 +1415,12 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1195
1415
|
libEmbed.getPreRenderIds().child,
|
|
1196
1416
|
) as HTMLIFrameElement;
|
|
1197
1417
|
// should render the generic link
|
|
1198
|
-
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1418
|
+
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1419
|
+
testLiveboardId,
|
|
1420
|
+
'testVizId',
|
|
1421
|
+
'testActiveTabId',
|
|
1422
|
+
undefined,
|
|
1423
|
+
);
|
|
1199
1424
|
expect(iFrame.src).toMatch(/http:\/\/tshost\/.*&isLiveboardEmbed=true.*#$/);
|
|
1200
1425
|
expect(consoleSpy).toHaveBeenCalledTimes(0);
|
|
1201
1426
|
}, 1005);
|
|
@@ -1528,9 +1753,13 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1528
1753
|
mockProcessTrigger.mockResolvedValue({ session: 'test' });
|
|
1529
1754
|
await executeAfterWait(async () => {
|
|
1530
1755
|
await liveboardEmbed.trigger(HostEvent.Save);
|
|
1531
|
-
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
1532
|
-
|
|
1533
|
-
|
|
1756
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(
|
|
1757
|
+
HostEvent.Save,
|
|
1758
|
+
{
|
|
1759
|
+
vizId: 'testViz',
|
|
1760
|
+
},
|
|
1761
|
+
undefined,
|
|
1762
|
+
);
|
|
1534
1763
|
});
|
|
1535
1764
|
});
|
|
1536
1765
|
});
|
|
@@ -1564,7 +1793,12 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1564
1793
|
liveboardEmbed['executeEmbedContainerReadyCallbacks']();
|
|
1565
1794
|
|
|
1566
1795
|
// Now navigateToLiveboard should be called
|
|
1567
|
-
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1796
|
+
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1797
|
+
liveboardId,
|
|
1798
|
+
vizId,
|
|
1799
|
+
activeTabId,
|
|
1800
|
+
undefined,
|
|
1801
|
+
);
|
|
1568
1802
|
});
|
|
1569
1803
|
|
|
1570
1804
|
test('should update currentLiveboardState for prerender object when embed container loads', async () => {
|
|
@@ -1617,7 +1851,12 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1617
1851
|
liveboardEmbed['beforePrerenderVisible']();
|
|
1618
1852
|
|
|
1619
1853
|
// navigateToLiveboard should be called immediately
|
|
1620
|
-
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1854
|
+
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1855
|
+
liveboardId,
|
|
1856
|
+
vizId,
|
|
1857
|
+
activeTabId,
|
|
1858
|
+
undefined,
|
|
1859
|
+
);
|
|
1621
1860
|
});
|
|
1622
1861
|
|
|
1623
1862
|
test('should handle beforePrerenderVisible without prerender object', async () => {
|
|
@@ -1642,7 +1881,12 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1642
1881
|
liveboardEmbed['executeEmbedContainerReadyCallbacks']();
|
|
1643
1882
|
|
|
1644
1883
|
// navigateToLiveboard should still be called
|
|
1645
|
-
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1884
|
+
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1885
|
+
liveboardId,
|
|
1886
|
+
vizId,
|
|
1887
|
+
activeTabId,
|
|
1888
|
+
undefined,
|
|
1889
|
+
);
|
|
1646
1890
|
});
|
|
1647
1891
|
|
|
1648
1892
|
test('should work with all liveboard parameters', async () => {
|
|
@@ -1666,7 +1910,12 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1666
1910
|
liveboardEmbed['beforePrerenderVisible']();
|
|
1667
1911
|
|
|
1668
1912
|
// Check that all parameters are passed correctly
|
|
1669
|
-
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1913
|
+
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1914
|
+
customLiveboardId,
|
|
1915
|
+
customVizId,
|
|
1916
|
+
customActiveTabId,
|
|
1917
|
+
undefined,
|
|
1918
|
+
);
|
|
1670
1919
|
});
|
|
1671
1920
|
|
|
1672
1921
|
test('should work with minimal liveboard parameters', async () => {
|
|
@@ -1684,7 +1933,12 @@ describe('Liveboard/viz embed tests', () => {
|
|
|
1684
1933
|
liveboardEmbed['beforePrerenderVisible']();
|
|
1685
1934
|
|
|
1686
1935
|
// Check that undefined parameters are passed correctly
|
|
1687
|
-
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1936
|
+
expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
|
|
1937
|
+
liveboardId,
|
|
1938
|
+
undefined,
|
|
1939
|
+
undefined,
|
|
1940
|
+
undefined,
|
|
1941
|
+
);
|
|
1688
1942
|
});
|
|
1689
1943
|
});
|
|
1690
1944
|
|
package/src/embed/liveboard.ts
CHANGED
|
@@ -22,13 +22,15 @@ import {
|
|
|
22
22
|
LiveboardAppEmbedViewConfig,
|
|
23
23
|
ErrorDetailsTypes,
|
|
24
24
|
EmbedErrorCodes,
|
|
25
|
+
ContextType,
|
|
25
26
|
} from '../types';
|
|
26
|
-
import { calculateVisibleElementData, getQueryParamString, isUndefined, isValidCssMargin } from '../utils';
|
|
27
|
+
import { calculateVisibleElementData, getQueryParamString, isUndefined, isValidCssMargin, setParamIfDefined } from '../utils';
|
|
27
28
|
import { getAuthPromise } from './base';
|
|
28
29
|
import { TsEmbed, V1Embed } from './ts-embed';
|
|
29
30
|
import { addPreviewStylesIfNotPresent } from '../utils/global-styles';
|
|
30
31
|
import { TriggerPayload, TriggerResponse } from './hostEventClient/contracts';
|
|
31
32
|
import { logger } from '../utils/logger';
|
|
33
|
+
import { SpotterChatViewConfig } from './conversation';
|
|
32
34
|
|
|
33
35
|
|
|
34
36
|
/**
|
|
@@ -208,6 +210,23 @@ export interface LiveboardViewConfig extends BaseViewConfig, LiveboardOtherViewC
|
|
|
208
210
|
* @version SDK: 1.15.0 | ThoughtSpot: 8.7.0.cl, 8.8.1-sw
|
|
209
211
|
*/
|
|
210
212
|
activeTabId?: string;
|
|
213
|
+
/**
|
|
214
|
+
* The GUID of a saved personalized view to load.
|
|
215
|
+
* A personalized view is a saved configuration of a Liveboard
|
|
216
|
+
* that includes specific filter selections.
|
|
217
|
+
*
|
|
218
|
+
* Supported embed types: `LiveboardEmbed`
|
|
219
|
+
* @example
|
|
220
|
+
* ```js
|
|
221
|
+
* const embed = new LiveboardEmbed('#tsEmbed', {
|
|
222
|
+
* liveboardId: 'liveboard-guid',
|
|
223
|
+
* personalizedViewId: 'view-guid',
|
|
224
|
+
* activeTabId: 'tab-guid',
|
|
225
|
+
* })
|
|
226
|
+
* ```
|
|
227
|
+
* @version SDK: 1.46.0 | ThoughtSpot: 26.4.0.cl
|
|
228
|
+
*/
|
|
229
|
+
personalizedViewId?: string;
|
|
211
230
|
/**
|
|
212
231
|
* Show or hide the tab panel of the embedded Liveboard.
|
|
213
232
|
*
|
|
@@ -463,6 +482,24 @@ export interface LiveboardViewConfig extends BaseViewConfig, LiveboardOtherViewC
|
|
|
463
482
|
* @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
|
|
464
483
|
*/
|
|
465
484
|
updatedSpotterChatPrompt?: boolean;
|
|
485
|
+
/**
|
|
486
|
+
* Configuration for customizing Spotter chat UI
|
|
487
|
+
* branding in tool response cards.
|
|
488
|
+
*
|
|
489
|
+
* Supported embed types: `LiveboardEmbed`
|
|
490
|
+
* @example
|
|
491
|
+
* ```js
|
|
492
|
+
* const embed = new LiveboardEmbed('#tsEmbed', {
|
|
493
|
+
* ... //other embed view config
|
|
494
|
+
* spotterChatConfig: {
|
|
495
|
+
* hideToolResponseCardBranding: true,
|
|
496
|
+
* toolResponseCardBrandingLabel: 'MyBrand',
|
|
497
|
+
* },
|
|
498
|
+
* })
|
|
499
|
+
* ```
|
|
500
|
+
* @version SDK: 1.46.0 | ThoughtSpot: 26.4.0.cl
|
|
501
|
+
*/
|
|
502
|
+
spotterChatConfig?: SpotterChatViewConfig;
|
|
466
503
|
}
|
|
467
504
|
|
|
468
505
|
/**
|
|
@@ -552,6 +589,7 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
552
589
|
isCentralizedLiveboardFilterUXEnabled = false,
|
|
553
590
|
isLinkParametersEnabled,
|
|
554
591
|
updatedSpotterChatPrompt,
|
|
592
|
+
spotterChatConfig,
|
|
555
593
|
isThisPeriodInDateFiltersEnabled,
|
|
556
594
|
} = this.viewConfig;
|
|
557
595
|
|
|
@@ -618,7 +656,6 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
618
656
|
params[Param.DataSourceId] = dataSourceId;
|
|
619
657
|
}
|
|
620
658
|
|
|
621
|
-
|
|
622
659
|
if (isLiveboardStylingAndGroupingEnabled !== undefined) {
|
|
623
660
|
params[Param.IsLiveboardStylingAndGroupingEnabled] = isLiveboardStylingAndGroupingEnabled;
|
|
624
661
|
}
|
|
@@ -639,6 +676,17 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
639
676
|
params[Param.ShowSpotterLimitations] = showSpotterLimitations;
|
|
640
677
|
}
|
|
641
678
|
|
|
679
|
+
// Handle spotterChatConfig params
|
|
680
|
+
if (spotterChatConfig) {
|
|
681
|
+
const {
|
|
682
|
+
hideToolResponseCardBranding,
|
|
683
|
+
toolResponseCardBrandingLabel,
|
|
684
|
+
} = spotterChatConfig;
|
|
685
|
+
|
|
686
|
+
setParamIfDefined(params, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
|
|
687
|
+
setParamIfDefined(params, Param.ToolResponseCardBrandingLabel, toolResponseCardBrandingLabel);
|
|
688
|
+
}
|
|
689
|
+
|
|
642
690
|
if (isLinkParametersEnabled !== undefined) {
|
|
643
691
|
params[Param.isLinkParametersEnabled] = isLinkParametersEnabled;
|
|
644
692
|
}
|
|
@@ -670,15 +718,39 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
670
718
|
return params;
|
|
671
719
|
}
|
|
672
720
|
|
|
673
|
-
private getIframeSuffixSrc(
|
|
674
|
-
|
|
721
|
+
private getIframeSuffixSrc(
|
|
722
|
+
liveboardId: string,
|
|
723
|
+
vizId: string,
|
|
724
|
+
activeTabId: string,
|
|
725
|
+
personalizedViewId?: string,
|
|
726
|
+
) {
|
|
727
|
+
// Extract view from liveboardId if passed along with it (legacy approach)
|
|
728
|
+
// View must be appended as query param at the end, not embedded in path
|
|
729
|
+
let liveboardGuid = liveboardId;
|
|
730
|
+
let legacyViewId: string | undefined;
|
|
731
|
+
|
|
732
|
+
if (liveboardId?.includes('?')) {
|
|
733
|
+
const [id, query] = liveboardId.split('?');
|
|
734
|
+
liveboardGuid = id;
|
|
735
|
+
const params = new URLSearchParams(query);
|
|
736
|
+
legacyViewId = params.get('view') || undefined;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
// personalizedViewId takes precedence over legacyViewId (when passed as part of liveboardId)
|
|
740
|
+
const effectiveViewId = personalizedViewId || legacyViewId;
|
|
741
|
+
|
|
742
|
+
let suffix = `/embed/viz/${liveboardGuid}`;
|
|
675
743
|
if (activeTabId) {
|
|
676
|
-
suffix = `${suffix}/tab/${activeTabId}
|
|
744
|
+
suffix = `${suffix}/tab/${activeTabId}`;
|
|
677
745
|
}
|
|
678
746
|
if (vizId) {
|
|
679
747
|
suffix = `${suffix}/${vizId}`;
|
|
680
748
|
}
|
|
681
|
-
const
|
|
749
|
+
const additionalParams: { [key: string]: string } = {};
|
|
750
|
+
if (effectiveViewId) {
|
|
751
|
+
additionalParams.view = effectiveViewId;
|
|
752
|
+
}
|
|
753
|
+
const tsPostHashParams = this.getThoughtSpotPostUrlParams(additionalParams);
|
|
682
754
|
suffix = `${suffix}${tsPostHashParams}`;
|
|
683
755
|
return suffix;
|
|
684
756
|
}
|
|
@@ -686,7 +758,7 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
686
758
|
private sendFullHeightLazyLoadData = () => {
|
|
687
759
|
const data = calculateVisibleElementData(this.iFrame);
|
|
688
760
|
this.trigger(HostEvent.VisibleEmbedCoordinates, data);
|
|
689
|
-
}
|
|
761
|
+
};
|
|
690
762
|
|
|
691
763
|
/**
|
|
692
764
|
* This is a handler for the RequestVisibleEmbedCoordinates event.
|
|
@@ -705,7 +777,7 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
705
777
|
* to be loaded within the iFrame.
|
|
706
778
|
*/
|
|
707
779
|
private getIFrameSrc(): string {
|
|
708
|
-
const { vizId, activeTabId } = this.viewConfig;
|
|
780
|
+
const { vizId, activeTabId, personalizedViewId } = this.viewConfig;
|
|
709
781
|
const liveboardId = this.viewConfig.liveboardId ?? this.viewConfig.pinboardId;
|
|
710
782
|
|
|
711
783
|
if (!liveboardId) {
|
|
@@ -720,6 +792,7 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
720
792
|
liveboardId,
|
|
721
793
|
vizId,
|
|
722
794
|
activeTabId,
|
|
795
|
+
personalizedViewId,
|
|
723
796
|
)}`;
|
|
724
797
|
}
|
|
725
798
|
|
|
@@ -812,18 +885,25 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
812
885
|
liveboardId: this.viewConfig.liveboardId,
|
|
813
886
|
vizId: this.viewConfig.vizId,
|
|
814
887
|
activeTabId: this.viewConfig.activeTabId,
|
|
888
|
+
personalizedViewId: this.viewConfig.personalizedViewId,
|
|
815
889
|
};
|
|
816
890
|
|
|
817
891
|
protected beforePrerenderVisible(): void {
|
|
818
892
|
const embedObj = this.getPreRenderObj<LiveboardEmbed>();
|
|
819
893
|
|
|
820
894
|
this.executeAfterEmbedContainerLoaded(() => {
|
|
821
|
-
this.navigateToLiveboard(
|
|
895
|
+
this.navigateToLiveboard(
|
|
896
|
+
this.viewConfig.liveboardId,
|
|
897
|
+
this.viewConfig.vizId,
|
|
898
|
+
this.viewConfig.activeTabId,
|
|
899
|
+
this.viewConfig.personalizedViewId,
|
|
900
|
+
);
|
|
822
901
|
if (embedObj) {
|
|
823
902
|
embedObj.currentLiveboardState = {
|
|
824
903
|
liveboardId: this.viewConfig.liveboardId,
|
|
825
904
|
vizId: this.viewConfig.vizId,
|
|
826
905
|
activeTabId: this.viewConfig.activeTabId,
|
|
906
|
+
personalizedViewId: this.viewConfig.personalizedViewId,
|
|
827
907
|
};
|
|
828
908
|
}
|
|
829
909
|
});
|
|
@@ -842,10 +922,11 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
842
922
|
* @param {any} data The payload to send with the message
|
|
843
923
|
* @returns A promise that resolves with the response from the embedded app
|
|
844
924
|
*/
|
|
845
|
-
public trigger<HostEventT extends HostEvent, PayloadT>(
|
|
925
|
+
public trigger<HostEventT extends HostEvent, PayloadT, ContextT extends ContextType>(
|
|
846
926
|
messageType: HostEventT,
|
|
847
927
|
data: TriggerPayload<PayloadT, HostEventT> = ({} as any),
|
|
848
|
-
|
|
928
|
+
context?: ContextT,
|
|
929
|
+
): Promise<TriggerResponse<PayloadT, HostEventT, ContextT>> {
|
|
849
930
|
const dataWithVizId: any = data;
|
|
850
931
|
if (messageType === HostEvent.SetActiveTab) {
|
|
851
932
|
this.setActiveTab(data as { tabId: string });
|
|
@@ -854,7 +935,7 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
854
935
|
if (typeof dataWithVizId === 'object' && this.viewConfig.vizId) {
|
|
855
936
|
dataWithVizId.vizId = this.viewConfig.vizId;
|
|
856
937
|
}
|
|
857
|
-
return super.trigger(messageType, dataWithVizId);
|
|
938
|
+
return super.trigger(messageType, dataWithVizId, context);
|
|
858
939
|
}
|
|
859
940
|
/**
|
|
860
941
|
* Destroys the ThoughtSpot embed, and remove any nodes from the DOM.
|
|
@@ -900,11 +981,17 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
900
981
|
return this;
|
|
901
982
|
}
|
|
902
983
|
|
|
903
|
-
public navigateToLiveboard(
|
|
904
|
-
|
|
984
|
+
public navigateToLiveboard(
|
|
985
|
+
liveboardId: string,
|
|
986
|
+
vizId?: string,
|
|
987
|
+
activeTabId?: string,
|
|
988
|
+
personalizedViewId?: string,
|
|
989
|
+
) {
|
|
990
|
+
const path = this.getIframeSuffixSrc(liveboardId, vizId, activeTabId, personalizedViewId);
|
|
905
991
|
this.viewConfig.liveboardId = liveboardId;
|
|
906
992
|
this.viewConfig.activeTabId = activeTabId;
|
|
907
993
|
this.viewConfig.vizId = vizId;
|
|
994
|
+
this.viewConfig.personalizedViewId = personalizedViewId;
|
|
908
995
|
if (this.isRendered) {
|
|
909
996
|
this.trigger(HostEvent.Navigate, path.substring(1));
|
|
910
997
|
} else if (this.viewConfig.preRenderId) {
|
|
@@ -929,6 +1016,10 @@ export class LiveboardEmbed extends V1Embed {
|
|
|
929
1016
|
url = `${url}/${this.viewConfig.vizId}`;
|
|
930
1017
|
}
|
|
931
1018
|
|
|
1019
|
+
if (this.viewConfig.personalizedViewId) {
|
|
1020
|
+
url = `${url}?view=${this.viewConfig.personalizedViewId}`;
|
|
1021
|
+
}
|
|
1022
|
+
|
|
932
1023
|
return url;
|
|
933
1024
|
}
|
|
934
1025
|
}
|