@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.
Files changed (213) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/authToken.d.ts +1 -1
  3. package/cjs/src/authToken.d.ts.map +1 -1
  4. package/cjs/src/authToken.js +2 -2
  5. package/cjs/src/authToken.js.map +1 -1
  6. package/cjs/src/authToken.spec.js +71 -0
  7. package/cjs/src/authToken.spec.js.map +1 -1
  8. package/cjs/src/css-variables.d.ts +48 -0
  9. package/cjs/src/css-variables.d.ts.map +1 -1
  10. package/cjs/src/embed/app.d.ts +37 -0
  11. package/cjs/src/embed/app.d.ts.map +1 -1
  12. package/cjs/src/embed/app.js +37 -1
  13. package/cjs/src/embed/app.js.map +1 -1
  14. package/cjs/src/embed/app.spec.js +24 -0
  15. package/cjs/src/embed/app.spec.js.map +1 -1
  16. package/cjs/src/embed/conversation.d.ts +127 -9
  17. package/cjs/src/embed/conversation.d.ts.map +1 -1
  18. package/cjs/src/embed/conversation.js +41 -18
  19. package/cjs/src/embed/conversation.js.map +1 -1
  20. package/cjs/src/embed/conversation.spec.js +96 -3
  21. package/cjs/src/embed/conversation.spec.js.map +1 -1
  22. package/cjs/src/embed/hostEventClient/contracts.d.ts +3 -3
  23. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  24. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  25. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +8 -8
  26. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  27. package/cjs/src/embed/hostEventClient/host-event-client.js +18 -18
  28. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  29. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +7 -7
  30. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  31. package/cjs/src/embed/liveboard.d.ts +40 -3
  32. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  33. package/cjs/src/embed/liveboard.js +40 -12
  34. package/cjs/src/embed/liveboard.js.map +1 -1
  35. package/cjs/src/embed/liveboard.spec.js +180 -8
  36. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  37. package/cjs/src/embed/ts-embed.d.ts +23 -2
  38. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  39. package/cjs/src/embed/ts-embed.js +64 -22
  40. package/cjs/src/embed/ts-embed.js.map +1 -1
  41. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  42. package/cjs/src/embed/ts-embed.spec.js +138 -19
  43. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  44. package/cjs/src/errors.d.ts +1 -0
  45. package/cjs/src/errors.d.ts.map +1 -1
  46. package/cjs/src/errors.js +1 -0
  47. package/cjs/src/errors.js.map +1 -1
  48. package/cjs/src/index.d.ts +3 -3
  49. package/cjs/src/index.d.ts.map +1 -1
  50. package/cjs/src/index.js +3 -2
  51. package/cjs/src/index.js.map +1 -1
  52. package/cjs/src/types.d.ts +356 -42
  53. package/cjs/src/types.d.ts.map +1 -1
  54. package/cjs/src/types.js +227 -20
  55. package/cjs/src/types.js.map +1 -1
  56. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  57. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  58. package/cjs/src/utils/graphql/answerService/answer-queries.js +23 -1
  59. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  60. package/cjs/src/utils/graphql/answerService/answerService.d.ts +2 -1
  61. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  62. package/cjs/src/utils/graphql/answerService/answerService.js +9 -1
  63. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  64. package/cjs/src/utils/graphql/answerService/answerService.spec.js +73 -0
  65. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  66. package/cjs/src/utils/processTrigger.d.ts +3 -2
  67. package/cjs/src/utils/processTrigger.d.ts.map +1 -1
  68. package/cjs/src/utils/processTrigger.js +4 -2
  69. package/cjs/src/utils/processTrigger.js.map +1 -1
  70. package/cjs/src/utils.d.ts +20 -1
  71. package/cjs/src/utils.d.ts.map +1 -1
  72. package/cjs/src/utils.js +40 -1
  73. package/cjs/src/utils.js.map +1 -1
  74. package/cjs/src/utils.spec.js +49 -0
  75. package/cjs/src/utils.spec.js.map +1 -1
  76. package/dist/{index-Dgzjq7qH.js → index-BuwECGdm.js} +1 -1
  77. package/dist/src/authToken.d.ts +1 -1
  78. package/dist/src/authToken.d.ts.map +1 -1
  79. package/dist/src/css-variables.d.ts +48 -0
  80. package/dist/src/css-variables.d.ts.map +1 -1
  81. package/dist/src/embed/app.d.ts +37 -0
  82. package/dist/src/embed/app.d.ts.map +1 -1
  83. package/dist/src/embed/conversation.d.ts +127 -9
  84. package/dist/src/embed/conversation.d.ts.map +1 -1
  85. package/dist/src/embed/hostEventClient/contracts.d.ts +3 -3
  86. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  87. package/dist/src/embed/hostEventClient/host-event-client.d.ts +8 -8
  88. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  89. package/dist/src/embed/liveboard.d.ts +40 -3
  90. package/dist/src/embed/liveboard.d.ts.map +1 -1
  91. package/dist/src/embed/ts-embed.d.ts +23 -2
  92. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  93. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  94. package/dist/src/errors.d.ts +1 -0
  95. package/dist/src/errors.d.ts.map +1 -1
  96. package/dist/src/index.d.ts +3 -3
  97. package/dist/src/index.d.ts.map +1 -1
  98. package/dist/src/types.d.ts +356 -42
  99. package/dist/src/types.d.ts.map +1 -1
  100. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  101. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  102. package/dist/src/utils/graphql/answerService/answerService.d.ts +2 -1
  103. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  104. package/dist/src/utils/processTrigger.d.ts +3 -2
  105. package/dist/src/utils/processTrigger.d.ts.map +1 -1
  106. package/dist/src/utils.d.ts +20 -1
  107. package/dist/src/utils.d.ts.map +1 -1
  108. package/dist/tsembed-react.es.js +501 -98
  109. package/dist/tsembed-react.js +500 -97
  110. package/dist/tsembed.es.js +516 -113
  111. package/dist/tsembed.js +29956 -29553
  112. package/dist/visual-embed-sdk-react-full.d.ts +819 -282
  113. package/dist/visual-embed-sdk-react.d.ts +818 -281
  114. package/dist/visual-embed-sdk.d.ts +882 -321
  115. package/lib/package.json +1 -1
  116. package/lib/src/authToken.d.ts +1 -1
  117. package/lib/src/authToken.d.ts.map +1 -1
  118. package/lib/src/authToken.js +2 -2
  119. package/lib/src/authToken.js.map +1 -1
  120. package/lib/src/authToken.spec.js +72 -1
  121. package/lib/src/authToken.spec.js.map +1 -1
  122. package/lib/src/css-variables.d.ts +48 -0
  123. package/lib/src/css-variables.d.ts.map +1 -1
  124. package/lib/src/embed/app.d.ts +37 -0
  125. package/lib/src/embed/app.d.ts.map +1 -1
  126. package/lib/src/embed/app.js +39 -3
  127. package/lib/src/embed/app.js.map +1 -1
  128. package/lib/src/embed/app.spec.js +24 -0
  129. package/lib/src/embed/app.spec.js.map +1 -1
  130. package/lib/src/embed/conversation.d.ts +127 -9
  131. package/lib/src/embed/conversation.d.ts.map +1 -1
  132. package/lib/src/embed/conversation.js +42 -19
  133. package/lib/src/embed/conversation.js.map +1 -1
  134. package/lib/src/embed/conversation.spec.js +96 -3
  135. package/lib/src/embed/conversation.spec.js.map +1 -1
  136. package/lib/src/embed/hostEventClient/contracts.d.ts +3 -3
  137. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  138. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  139. package/lib/src/embed/hostEventClient/host-event-client.d.ts +8 -8
  140. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  141. package/lib/src/embed/hostEventClient/host-event-client.js +18 -18
  142. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  143. package/lib/src/embed/hostEventClient/host-event-client.spec.js +7 -7
  144. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  145. package/lib/src/embed/liveboard.d.ts +40 -3
  146. package/lib/src/embed/liveboard.d.ts.map +1 -1
  147. package/lib/src/embed/liveboard.js +41 -13
  148. package/lib/src/embed/liveboard.js.map +1 -1
  149. package/lib/src/embed/liveboard.spec.js +180 -8
  150. package/lib/src/embed/liveboard.spec.js.map +1 -1
  151. package/lib/src/embed/ts-embed.d.ts +23 -2
  152. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  153. package/lib/src/embed/ts-embed.js +64 -22
  154. package/lib/src/embed/ts-embed.js.map +1 -1
  155. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  156. package/lib/src/embed/ts-embed.spec.js +139 -20
  157. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  158. package/lib/src/errors.d.ts +1 -0
  159. package/lib/src/errors.d.ts.map +1 -1
  160. package/lib/src/errors.js +1 -0
  161. package/lib/src/errors.js.map +1 -1
  162. package/lib/src/index.d.ts +3 -3
  163. package/lib/src/index.d.ts.map +1 -1
  164. package/lib/src/index.js +2 -2
  165. package/lib/src/index.js.map +1 -1
  166. package/lib/src/types.d.ts +356 -42
  167. package/lib/src/types.d.ts.map +1 -1
  168. package/lib/src/types.js +226 -19
  169. package/lib/src/types.js.map +1 -1
  170. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  171. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  172. package/lib/src/utils/graphql/answerService/answer-queries.js +22 -0
  173. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  174. package/lib/src/utils/graphql/answerService/answerService.d.ts +2 -1
  175. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  176. package/lib/src/utils/graphql/answerService/answerService.js +9 -1
  177. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  178. package/lib/src/utils/graphql/answerService/answerService.spec.js +73 -0
  179. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  180. package/lib/src/utils/processTrigger.d.ts +3 -2
  181. package/lib/src/utils/processTrigger.d.ts.map +1 -1
  182. package/lib/src/utils/processTrigger.js +4 -2
  183. package/lib/src/utils/processTrigger.js.map +1 -1
  184. package/lib/src/utils.d.ts +20 -1
  185. package/lib/src/utils.d.ts.map +1 -1
  186. package/lib/src/utils.js +36 -0
  187. package/lib/src/utils.js.map +1 -1
  188. package/lib/src/utils.spec.js +50 -1
  189. package/lib/src/utils.spec.js.map +1 -1
  190. package/package.json +1 -1
  191. package/src/authToken.spec.ts +91 -2
  192. package/src/authToken.ts +2 -2
  193. package/src/css-variables.ts +60 -0
  194. package/src/embed/app.spec.ts +32 -0
  195. package/src/embed/app.ts +97 -1
  196. package/src/embed/conversation.spec.ts +117 -3
  197. package/src/embed/conversation.ts +188 -29
  198. package/src/embed/hostEventClient/contracts.ts +4 -4
  199. package/src/embed/hostEventClient/host-event-client.spec.ts +7 -1
  200. package/src/embed/hostEventClient/host-event-client.ts +22 -11
  201. package/src/embed/liveboard.spec.ts +264 -10
  202. package/src/embed/liveboard.ts +105 -14
  203. package/src/embed/ts-embed.spec.ts +184 -8
  204. package/src/embed/ts-embed.ts +81 -24
  205. package/src/errors.ts +1 -0
  206. package/src/index.ts +7 -1
  207. package/src/types.ts +364 -40
  208. package/src/utils/graphql/answerService/answer-queries.ts +23 -0
  209. package/src/utils/graphql/answerService/answerService.spec.ts +87 -0
  210. package/src/utils/graphql/answerService/answerService.ts +13 -1
  211. package/src/utils/processTrigger.ts +6 -3
  212. package/src/utils.spec.ts +56 -0
  213. 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(testLiveboardId, 'testVizId', 'testActiveTabId');
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(testLiveboardId, 'testVizId', 'testActiveTabId');
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(HostEvent.Save, {
1532
- vizId: 'testViz',
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(liveboardId, vizId, activeTabId);
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(liveboardId, vizId, activeTabId);
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(liveboardId, vizId, activeTabId);
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(customLiveboardId, customVizId, customActiveTabId);
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(liveboardId, undefined, undefined);
1936
+ expect(navigateToLiveboardSpy).toHaveBeenCalledWith(
1937
+ liveboardId,
1938
+ undefined,
1939
+ undefined,
1940
+ undefined,
1941
+ );
1688
1942
  });
1689
1943
  });
1690
1944
 
@@ -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(liveboardId: string, vizId: string, activeTabId: string) {
674
- let suffix = `/embed/viz/${liveboardId}`;
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 tsPostHashParams = this.getThoughtSpotPostUrlParams();
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(this.viewConfig.liveboardId, this.viewConfig.vizId, this.viewConfig.activeTabId);
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
- ): Promise<TriggerResponse<PayloadT, HostEventT>> {
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(liveboardId: string, vizId?: string, activeTabId?: string) {
904
- const path = this.getIframeSuffixSrc(liveboardId, vizId, activeTabId);
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
  }