@thoughtspot/visual-embed-sdk 1.46.5-beta.1 → 1.47.0
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 +4 -4
- package/cjs/src/css-variables.d.ts +36 -0
- package/cjs/src/css-variables.d.ts.map +1 -1
- package/cjs/src/embed/app.d.ts +41 -17
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +26 -47
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +36 -79
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +24 -2
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +18 -33
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +129 -97
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/contracts.d.ts +31 -0
- package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/contracts.js +2 -0
- package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts +18 -0
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.js +69 -9
- package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +185 -19
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.d.ts +22 -0
- package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -0
- package/cjs/src/embed/hostEventClient/utils.js +57 -0
- package/cjs/src/embed/hostEventClient/utils.js.map +1 -0
- package/cjs/src/embed/hostEventClient/utils.spec.d.ts +2 -0
- package/cjs/src/embed/hostEventClient/utils.spec.d.ts.map +1 -0
- package/cjs/src/embed/hostEventClient/utils.spec.js +190 -0
- package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -0
- package/cjs/src/embed/liveboard.d.ts +18 -1
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +9 -11
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +29 -71
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/spotter-utils.d.ts +20 -0
- package/cjs/src/embed/spotter-utils.d.ts.map +1 -0
- package/cjs/src/embed/spotter-utils.js +52 -0
- package/cjs/src/embed/spotter-utils.js.map +1 -0
- package/cjs/src/embed/spotter-utils.spec.d.ts +2 -0
- package/cjs/src/embed/spotter-utils.spec.d.ts.map +1 -0
- package/cjs/src/embed/spotter-utils.spec.js +54 -0
- package/cjs/src/embed/spotter-utils.spec.js.map +1 -0
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +25 -5
- 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 +28 -67
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/errors.d.ts +2 -1
- package/cjs/src/errors.d.ts.map +1 -1
- package/cjs/src/errors.js +2 -1
- package/cjs/src/errors.js.map +1 -1
- package/cjs/src/index.d.ts +1 -2
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +2 -4
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/react/all-types-export.d.ts +2 -2
- package/cjs/src/react/all-types-export.d.ts.map +1 -1
- package/cjs/src/react/all-types-export.js +1 -3
- package/cjs/src/react/all-types-export.js.map +1 -1
- package/cjs/src/react/index.d.ts +1 -36
- package/cjs/src/react/index.d.ts.map +1 -1
- package/cjs/src/react/index.js +1 -34
- package/cjs/src/react/index.js.map +1 -1
- package/cjs/src/types.d.ts +143 -76
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +118 -47
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils.d.ts +0 -9
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +1 -10
- package/cjs/src/utils.js.map +1 -1
- package/dist/{index-DW2wEHqy.js → index-Bm2Hck8q.js} +1 -1
- package/dist/src/css-variables.d.ts +36 -0
- package/dist/src/css-variables.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +41 -17
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +24 -2
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/contracts.d.ts +31 -0
- package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts +18 -0
- package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/utils.d.ts +22 -0
- package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -0
- package/dist/src/embed/hostEventClient/utils.spec.d.ts +2 -0
- package/dist/src/embed/hostEventClient/utils.spec.d.ts.map +1 -0
- package/dist/src/embed/liveboard.d.ts +18 -1
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/spotter-utils.d.ts +20 -0
- package/dist/src/embed/spotter-utils.d.ts.map +1 -0
- package/dist/src/embed/spotter-utils.spec.d.ts +2 -0
- package/dist/src/embed/spotter-utils.spec.d.ts.map +1 -0
- 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 +2 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/index.d.ts +1 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/react/all-types-export.d.ts +2 -2
- package/dist/src/react/all-types-export.d.ts.map +1 -1
- package/dist/src/react/index.d.ts +1 -36
- package/dist/src/react/index.d.ts.map +1 -1
- package/dist/src/types.d.ts +143 -76
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils.d.ts +0 -9
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +378 -304
- package/dist/tsembed-react.js +366 -294
- package/dist/tsembed.es.js +393 -285
- package/dist/tsembed.js +30798 -30691
- package/dist/visual-embed-sdk-react-full.d.ts +310 -273
- package/dist/visual-embed-sdk-react.d.ts +310 -273
- package/dist/visual-embed-sdk.d.ts +308 -243
- package/lib/package.json +4 -4
- package/lib/src/css-variables.d.ts +36 -0
- package/lib/src/css-variables.d.ts.map +1 -1
- package/lib/src/embed/app.d.ts +41 -17
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +28 -49
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +36 -79
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +24 -2
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +19 -34
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +131 -99
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/contracts.d.ts +31 -0
- package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/contracts.js +2 -0
- package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts +18 -0
- package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.js +69 -9
- package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +185 -19
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/utils.d.ts +22 -0
- package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -0
- package/lib/src/embed/hostEventClient/utils.js +49 -0
- package/lib/src/embed/hostEventClient/utils.js.map +1 -0
- package/lib/src/embed/hostEventClient/utils.spec.d.ts +2 -0
- package/lib/src/embed/hostEventClient/utils.spec.d.ts.map +1 -0
- package/lib/src/embed/hostEventClient/utils.spec.js +188 -0
- package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -0
- package/lib/src/embed/liveboard.d.ts +18 -1
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +9 -11
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +29 -71
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/spotter-utils.d.ts +20 -0
- package/lib/src/embed/spotter-utils.d.ts.map +1 -0
- package/lib/src/embed/spotter-utils.js +47 -0
- package/lib/src/embed/spotter-utils.js.map +1 -0
- package/lib/src/embed/spotter-utils.spec.d.ts +2 -0
- package/lib/src/embed/spotter-utils.spec.d.ts.map +1 -0
- package/lib/src/embed/spotter-utils.spec.js +52 -0
- package/lib/src/embed/spotter-utils.spec.js.map +1 -0
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +25 -5
- 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 +30 -69
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/errors.d.ts +2 -1
- package/lib/src/errors.d.ts.map +1 -1
- package/lib/src/errors.js +2 -1
- package/lib/src/errors.js.map +1 -1
- package/lib/src/index.d.ts +1 -2
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +1 -2
- package/lib/src/index.js.map +1 -1
- package/lib/src/react/all-types-export.d.ts +2 -2
- package/lib/src/react/all-types-export.d.ts.map +1 -1
- package/lib/src/react/all-types-export.js +1 -1
- package/lib/src/react/all-types-export.js.map +1 -1
- package/lib/src/react/index.d.ts +1 -36
- package/lib/src/react/index.d.ts.map +1 -1
- package/lib/src/react/index.js +0 -33
- package/lib/src/react/index.js.map +1 -1
- package/lib/src/types.d.ts +143 -76
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +118 -47
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils.d.ts +0 -9
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +0 -8
- package/lib/src/utils.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +308 -243
- package/package.json +4 -4
- package/src/css-variables.ts +45 -0
- package/src/embed/app.spec.ts +51 -107
- package/src/embed/app.ts +60 -82
- package/src/embed/conversation.spec.ts +150 -119
- package/src/embed/conversation.ts +34 -58
- package/src/embed/hostEventClient/contracts.ts +31 -0
- package/src/embed/hostEventClient/host-event-client.spec.ts +260 -19
- package/src/embed/hostEventClient/host-event-client.ts +87 -11
- package/src/embed/hostEventClient/utils.spec.ts +225 -0
- package/src/embed/hostEventClient/utils.ts +74 -0
- package/src/embed/liveboard.spec.ts +38 -93
- package/src/embed/liveboard.ts +28 -10
- package/src/embed/spotter-utils.spec.ts +56 -0
- package/src/embed/spotter-utils.ts +65 -0
- package/src/embed/ts-embed.spec.ts +56 -108
- package/src/embed/ts-embed.ts +25 -4
- package/src/errors.ts +2 -1
- package/src/index.ts +2 -5
- package/src/react/all-types-export.ts +0 -3
- package/src/react/index.tsx +15 -59
- package/src/types.ts +206 -138
- package/src/utils.ts +0 -14
- package/cjs/src/embed/sage.d.ts +0 -164
- package/cjs/src/embed/sage.d.ts.map +0 -1
- package/cjs/src/embed/sage.js +0 -88
- package/cjs/src/embed/sage.js.map +0 -1
- package/cjs/src/embed/sage.spec.d.ts +0 -2
- package/cjs/src/embed/sage.spec.d.ts.map +0 -1
- package/cjs/src/embed/sage.spec.js +0 -151
- package/cjs/src/embed/sage.spec.js.map +0 -1
- package/dist/src/embed/sage.d.ts +0 -164
- package/dist/src/embed/sage.d.ts.map +0 -1
- package/dist/src/embed/sage.spec.d.ts +0 -2
- package/dist/src/embed/sage.spec.d.ts.map +0 -1
- package/lib/src/embed/sage.d.ts +0 -164
- package/lib/src/embed/sage.d.ts.map +0 -1
- package/lib/src/embed/sage.js +0 -84
- package/lib/src/embed/sage.js.map +0 -1
- package/lib/src/embed/sage.spec.d.ts +0 -2
- package/lib/src/embed/sage.spec.d.ts.map +0 -1
- package/lib/src/embed/sage.spec.js +0 -148
- package/lib/src/embed/sage.spec.js.map +0 -1
- package/src/embed/sage.spec.ts +0 -206
- package/src/embed/sage.ts +0 -231
package/dist/tsembed-react.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* @thoughtspot/visual-embed-sdk version 1.
|
|
1
|
+
/* @thoughtspot/visual-embed-sdk version 1.47.0 */
|
|
2
2
|
'use client';
|
|
3
3
|
(function (global, factory) {
|
|
4
4
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
|
|
@@ -1083,6 +1083,17 @@
|
|
|
1083
1083
|
* ```
|
|
1084
1084
|
*/
|
|
1085
1085
|
EmbedEvent["DownloadAsXlsx"] = "downloadAsXlsx";
|
|
1086
|
+
/**
|
|
1087
|
+
* Emitted when the Download Liveboard as Continuous PDF action is triggered
|
|
1088
|
+
* on a Liveboard.
|
|
1089
|
+
* @version SDK: 1.48.0 | ThoughtSpot: 26.5.0.cl
|
|
1090
|
+
* @example
|
|
1091
|
+
* ```js
|
|
1092
|
+
* liveboardEmbed.on(EmbedEvent.DownloadLiveboardAsContinuousPDF, payload => {
|
|
1093
|
+
* console.log('download liveboard as continuous PDF', payload)})
|
|
1094
|
+
* ```
|
|
1095
|
+
*/
|
|
1096
|
+
EmbedEvent["DownloadLiveboardAsContinuousPDF"] = "downloadLiveboardAsContinuousPDF";
|
|
1086
1097
|
/**
|
|
1087
1098
|
* Emitted when an Answer is deleted in the app
|
|
1088
1099
|
* Use start:true to subscribe to when delete is initiated, or end:true to subscribe
|
|
@@ -1460,19 +1471,6 @@
|
|
|
1460
1471
|
* @version SDK: 1.23.0 | ThoughtSpot: 9.4.0.cl, 9.5.0.sw
|
|
1461
1472
|
*/
|
|
1462
1473
|
EmbedEvent["FilterChanged"] = "filterChanged";
|
|
1463
|
-
/**
|
|
1464
|
-
* Emitted when a user clicks the **Go** button to initiate
|
|
1465
|
-
* a Natural Language Search query
|
|
1466
|
-
* @version SDK: 1.26.0 | ThoughtSpot: 9.7.0.cl, 9.8.0.sw
|
|
1467
|
-
*/
|
|
1468
|
-
EmbedEvent["SageEmbedQuery"] = "sageEmbedQuery";
|
|
1469
|
-
/**
|
|
1470
|
-
* Emitted when a user selects a data source on the embedded
|
|
1471
|
-
* Natural Language Search interface.
|
|
1472
|
-
*
|
|
1473
|
-
* @version SDK: 1.26.0 | ThoughtSpot: 9.7.0.cl, 9.8.0.sw
|
|
1474
|
-
*/
|
|
1475
|
-
EmbedEvent["SageWorksheetUpdated"] = "sageWorksheetUpdated";
|
|
1476
1474
|
/**
|
|
1477
1475
|
* Emitted when a user updates a connection on the **Data** page
|
|
1478
1476
|
* @version SDK: 1.27.0 | ThoughtSpot: 9.8.0.cl, 9.8.0.sw
|
|
@@ -2611,6 +2609,18 @@
|
|
|
2611
2609
|
* @version SDK: 1.15.0 | ThoughtSpot: 8.7.0.cl, 8.8.1.sw
|
|
2612
2610
|
*/
|
|
2613
2611
|
HostEvent["DownloadAsPdf"] = "downloadAsPdf";
|
|
2612
|
+
/**
|
|
2613
|
+
* Trigger the **Download Liveboard as Continuous PDF** action on an
|
|
2614
|
+
* embedded Liveboard.
|
|
2615
|
+
*
|
|
2616
|
+
* @example
|
|
2617
|
+
* ```js
|
|
2618
|
+
* liveboardEmbed.trigger(HostEvent.DownloadLiveboardAsContinuousPDF)
|
|
2619
|
+
* ```
|
|
2620
|
+
*
|
|
2621
|
+
* @version SDK: 1.48.0 | ThoughtSpot: 26.5.0.cl
|
|
2622
|
+
*/
|
|
2623
|
+
HostEvent["DownloadLiveboardAsContinuousPDF"] = "downloadLiveboardAsContinuousPDF";
|
|
2614
2624
|
/**
|
|
2615
2625
|
* Trigger the **AI Highlights** action on an embedded Liveboard
|
|
2616
2626
|
*
|
|
@@ -2837,6 +2847,20 @@
|
|
|
2837
2847
|
* vizId: '730496d6-6903-4601-937e-2c691821af3c'
|
|
2838
2848
|
* }, ContextType.Liveboard);
|
|
2839
2849
|
* ```
|
|
2850
|
+
* @example
|
|
2851
|
+
* ```js
|
|
2852
|
+
* // Copy link from liveboard context
|
|
2853
|
+
* import { ContextType } from '@thoughtspot/visual-embed-sdk';
|
|
2854
|
+
* liveboardEmbed.trigger(HostEvent.CopyLink, {}, ContextType.Liveboard);
|
|
2855
|
+
* ```
|
|
2856
|
+
* @example
|
|
2857
|
+
* ```js
|
|
2858
|
+
* // Copy link from liveboard visualization context
|
|
2859
|
+
* import { ContextType } from '@thoughtspot/visual-embed-sdk';
|
|
2860
|
+
* liveboardEmbed.trigger(HostEvent.CopyLink, {
|
|
2861
|
+
* vizId: '730496d6-6903-4601-937e-2c691821af3c'
|
|
2862
|
+
* }, ContextType.Liveboard);
|
|
2863
|
+
* ```
|
|
2840
2864
|
* @version SDK: 1.15.0 | ThoughtSpot: 8.7.0.cl, 8.8.1.sw
|
|
2841
2865
|
*/
|
|
2842
2866
|
HostEvent["CopyLink"] = "embedDocument";
|
|
@@ -2868,6 +2892,20 @@
|
|
|
2868
2892
|
* import { ContextType } from '@thoughtspot/visual-embed-sdk';
|
|
2869
2893
|
* liveboardEmbed.trigger(HostEvent.Present, {}, ContextType.Liveboard);
|
|
2870
2894
|
* ```
|
|
2895
|
+
* @example
|
|
2896
|
+
* ```js
|
|
2897
|
+
* // Present from liveboard visualization context
|
|
2898
|
+
* import { ContextType } from '@thoughtspot/visual-embed-sdk';
|
|
2899
|
+
* liveboardEmbed.trigger(HostEvent.Present, {
|
|
2900
|
+
* vizId: '730496d6-6903-4601-937e-2c691821af3c'
|
|
2901
|
+
* }, ContextType.Liveboard);
|
|
2902
|
+
* ```
|
|
2903
|
+
* @example
|
|
2904
|
+
* ```js
|
|
2905
|
+
* // Present from liveboard context
|
|
2906
|
+
* import { ContextType } from '@thoughtspot/visual-embed-sdk';
|
|
2907
|
+
* liveboardEmbed.trigger(HostEvent.Present, {}, ContextType.Liveboard);
|
|
2908
|
+
* ```
|
|
2871
2909
|
* @version SDK: 1.15.0 | ThoughtSpot: 8.7.0.cl, 8.8.1.sw
|
|
2872
2910
|
*/
|
|
2873
2911
|
HostEvent["Present"] = "present";
|
|
@@ -2896,7 +2934,7 @@
|
|
|
2896
2934
|
* tml.answer.search_query // TML representation of the search query
|
|
2897
2935
|
* );
|
|
2898
2936
|
* })
|
|
2899
|
-
|
|
2937
|
+
* ```
|
|
2900
2938
|
* @example
|
|
2901
2939
|
* ```js
|
|
2902
2940
|
* // Get TML from search context
|
|
@@ -3520,21 +3558,6 @@
|
|
|
3520
3558
|
* @version SDK: 1.26.0 | ThoughtSpot: 9.7.0.cl, 9.8.0.sw
|
|
3521
3559
|
*/
|
|
3522
3560
|
HostEvent["SetHiddenTabs"] = "SetPinboardHiddenTabs";
|
|
3523
|
-
/**
|
|
3524
|
-
* Updates the search query string for Natural Language Search operations.
|
|
3525
|
-
* @param - Includes the following keys:
|
|
3526
|
-
* - `queryString`: Text string in Natural Language format.
|
|
3527
|
-
* - `executeSearch`: Boolean to execute search and update search query.
|
|
3528
|
-
* @example
|
|
3529
|
-
* ```js
|
|
3530
|
-
* sageEmbed.trigger(HostEvent.UpdateSageQuery, {
|
|
3531
|
-
* queryString: 'revenue per year',
|
|
3532
|
-
* executeSearch: true,
|
|
3533
|
-
* })
|
|
3534
|
-
* ```
|
|
3535
|
-
* @version SDK: 1.26.0 | ThoughtSpot: 9.8.0.cl, 9.8.0.sw
|
|
3536
|
-
*/
|
|
3537
|
-
HostEvent["UpdateSageQuery"] = "updateSageQuery";
|
|
3538
3561
|
/**
|
|
3539
3562
|
* Get the Answer session for a Search or
|
|
3540
3563
|
* Liveboard visualization.
|
|
@@ -4100,7 +4123,6 @@
|
|
|
4100
4123
|
Param["HideNotification"] = "hideNotification";
|
|
4101
4124
|
Param["HideApplicationSwitcher"] = "applicationSwitcherHidden";
|
|
4102
4125
|
Param["HideOrgSwitcher"] = "orgSwitcherHidden";
|
|
4103
|
-
Param["IsSageEmbed"] = "isSageEmbed";
|
|
4104
4126
|
Param["HideWorksheetSelector"] = "hideWorksheetSelector";
|
|
4105
4127
|
Param["DisableWorksheetChange"] = "disableWorksheetChange";
|
|
4106
4128
|
Param["HideSourceSelection"] = "hideSourceSelection";
|
|
@@ -4151,7 +4173,6 @@
|
|
|
4151
4173
|
Param["HideIrrelevantFiltersInTab"] = "hideIrrelevantFiltersAtTabLevel";
|
|
4152
4174
|
Param["IsEnhancedFilterInteractivityEnabled"] = "isLiveboardPermissionV2Enabled";
|
|
4153
4175
|
Param["SpotterEnabled"] = "isSpotterExperienceEnabled";
|
|
4154
|
-
Param["IsUnifiedSearchExperienceEnabled"] = "isUnifiedSearchExperienceEnabled";
|
|
4155
4176
|
Param["OverrideOrgId"] = "orgId";
|
|
4156
4177
|
Param["OauthPollingInterval"] = "oAuthPollingInterval";
|
|
4157
4178
|
Param["IsForceRedirect"] = "isForceRedirect";
|
|
@@ -4165,6 +4186,7 @@
|
|
|
4165
4186
|
Param["IsLazyLoadingForEmbedEnabled"] = "isLazyLoadingForEmbedEnabled";
|
|
4166
4187
|
Param["RootMarginForLazyLoad"] = "rootMarginForLazyLoad";
|
|
4167
4188
|
Param["isPNGInScheduledEmailsEnabled"] = "isPNGInScheduledEmailsEnabled";
|
|
4189
|
+
Param["IsWYSIWYGLiveboardPDFEnabled"] = "isWYSIWYGLiveboardPDFEnabled";
|
|
4168
4190
|
Param["isLiveboardXLSXCSVDownloadEnabled"] = "isLiveboardXLSXCSVDownloadEnabled";
|
|
4169
4191
|
Param["isGranularXLSXCSVSchedulesEnabled"] = "isGranularXLSXCSVSchedulesEnabled";
|
|
4170
4192
|
Param["isCentralizedLiveboardFilterUXEnabled"] = "isCentralizedLiveboardFilterUXEnabled";
|
|
@@ -4509,6 +4531,16 @@
|
|
|
4509
4531
|
* @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
|
|
4510
4532
|
*/
|
|
4511
4533
|
Action["DownloadLiveboard"] = "downloadLiveboard";
|
|
4534
|
+
/**
|
|
4535
|
+
* The **Download Liveboard as Continuous PDF** menu action on a Liveboard.
|
|
4536
|
+
* Allows downloading the entire Liveboard as a continuous PDF.
|
|
4537
|
+
* @example
|
|
4538
|
+
* ```js
|
|
4539
|
+
* disabledActions: [Action.DownloadLiveboardAsContinuousPDF]
|
|
4540
|
+
* ```
|
|
4541
|
+
* @version SDK: 1.48.0 | ThoughtSpot: 26.5.0.cl
|
|
4542
|
+
*/
|
|
4543
|
+
Action["DownloadLiveboardAsContinuousPDF"] = "downloadLiveboardAsContinuousPDF";
|
|
4512
4544
|
/**
|
|
4513
4545
|
* @hidden
|
|
4514
4546
|
*/
|
|
@@ -5467,11 +5499,11 @@
|
|
|
5467
5499
|
*/
|
|
5468
5500
|
Action["CoverAndFilterOptionInPDF"] = "coverAndFilterOptionInPDF";
|
|
5469
5501
|
/**
|
|
5470
|
-
|
|
5471
|
-
|
|
5472
|
-
|
|
5473
|
-
|
|
5474
|
-
|
|
5502
|
+
* Action ID to hide or disable the Coaching workflow in Spotter conversations.
|
|
5503
|
+
* When disabled, users cannot access **Add to Coaching** workflow in conversation.
|
|
5504
|
+
* The **Add to Coaching** feature allows adding reference questions and
|
|
5505
|
+
* business terms to improve Spotter’s responses. This feature is generally available
|
|
5506
|
+
* (GA) from version 26.2.0.cl and enabled by default on embed deployments.
|
|
5475
5507
|
* @example
|
|
5476
5508
|
* ```js
|
|
5477
5509
|
* hiddenAction: [Action.InConversationTraining]
|
|
@@ -5548,17 +5580,17 @@
|
|
|
5548
5580
|
*/
|
|
5549
5581
|
Action["LiveboardStylePanel"] = "liveboardStylePanel";
|
|
5550
5582
|
/**
|
|
5551
|
-
|
|
5552
|
-
|
|
5553
|
-
|
|
5554
|
-
|
|
5555
|
-
|
|
5556
|
-
|
|
5557
|
-
|
|
5558
|
-
|
|
5559
|
-
|
|
5560
|
-
|
|
5561
|
-
|
|
5583
|
+
* The **Publish** action for Liveboards, Answers and Models.
|
|
5584
|
+
* Opens the publishing modal. It's a parent action for the
|
|
5585
|
+
* **Manage Publishing** and **Unpublish** actions if the object
|
|
5586
|
+
* is already published, otherwise appears standalone.
|
|
5587
|
+
* @example
|
|
5588
|
+
* ```js
|
|
5589
|
+
* hiddenActions: [Action.Publish]
|
|
5590
|
+
* disabledActions: [Action.Publish]
|
|
5591
|
+
* ```
|
|
5592
|
+
* @version SDK: 1.45.0 | ThoughtSpot Cloud: 26.2.0.cl
|
|
5593
|
+
*/
|
|
5562
5594
|
Action["Publish"] = "publish";
|
|
5563
5595
|
/**
|
|
5564
5596
|
* The **Manage Publishing** action for Liveboards, Answers and Models.
|
|
@@ -5726,6 +5758,39 @@
|
|
|
5726
5758
|
* @version SDK: 1.46.0 | ThoughtSpot Cloud: 26.3.0.cl
|
|
5727
5759
|
*/
|
|
5728
5760
|
Action["SpotterDocs"] = "spotterDocs";
|
|
5761
|
+
/**
|
|
5762
|
+
* Controls visibility and disable state of the connector resources
|
|
5763
|
+
* section in the Spotter chat interface.
|
|
5764
|
+
* @example
|
|
5765
|
+
* ```js
|
|
5766
|
+
* hiddenActions: [Action.SpotterChatConnectorResources]
|
|
5767
|
+
* disabledActions: [Action.SpotterChatConnectorResources]
|
|
5768
|
+
* ```
|
|
5769
|
+
* @version SDK: 1.48.0 | ThoughtSpot Cloud: 26.5.0.cl
|
|
5770
|
+
*/
|
|
5771
|
+
Action["SpotterChatConnectorResources"] = "spotterChatConnectorResources";
|
|
5772
|
+
/**
|
|
5773
|
+
* Controls visibility and disable state of the connectors
|
|
5774
|
+
* in the Spotter chat interface.
|
|
5775
|
+
* @example
|
|
5776
|
+
* ```js
|
|
5777
|
+
* hiddenActions: [Action.SpotterChatConnectors]
|
|
5778
|
+
* disabledActions: [Action.SpotterChatConnectors]
|
|
5779
|
+
* ```
|
|
5780
|
+
* @version SDK: 1.48.0 | ThoughtSpot Cloud: 26.5.0.cl
|
|
5781
|
+
*/
|
|
5782
|
+
Action["SpotterChatConnectors"] = "spotterChatConnectors";
|
|
5783
|
+
/**
|
|
5784
|
+
* Controls visibility and disable state of the mode switcher
|
|
5785
|
+
* in the Spotter chat interface.
|
|
5786
|
+
* @example
|
|
5787
|
+
* ```js
|
|
5788
|
+
* hiddenActions: [Action.SpotterChatModeSwitcher]
|
|
5789
|
+
* disabledActions: [Action.SpotterChatModeSwitcher]
|
|
5790
|
+
* ```
|
|
5791
|
+
* @version SDK: 1.48.0 | ThoughtSpot Cloud: 26.5.0.cl
|
|
5792
|
+
*/
|
|
5793
|
+
Action["SpotterChatModeSwitcher"] = "spotterChatModeSwitcher";
|
|
5729
5794
|
/**
|
|
5730
5795
|
* The **Include current period** checkbox for date filters.
|
|
5731
5796
|
* Controls the visibility and availability of the option to include
|
|
@@ -6019,6 +6084,12 @@
|
|
|
6019
6084
|
EmbedErrorCodes["UPDATE_PARAMS_FAILED"] = "UPDATE_PARAMS_FAILED";
|
|
6020
6085
|
/** Invalid URL provided in configuration */
|
|
6021
6086
|
EmbedErrorCodes["INVALID_URL"] = "INVALID_URL";
|
|
6087
|
+
/** Host event payload validation failed */
|
|
6088
|
+
EmbedErrorCodes["HOST_EVENT_VALIDATION"] = "HOST_EVENT_VALIDATION";
|
|
6089
|
+
/** UpdateFilters payload is invalid - missing or malformed filter/filters */
|
|
6090
|
+
EmbedErrorCodes["UPDATEFILTERS_INVALID_PAYLOAD"] = "UPDATEFILTERS_INVALID_PAYLOAD";
|
|
6091
|
+
/** DrillDown payload is invalid - missing or malformed points */
|
|
6092
|
+
EmbedErrorCodes["DRILLDOWN_INVALID_PAYLOAD"] = "DRILLDOWN_INVALID_PAYLOAD";
|
|
6022
6093
|
})(EmbedErrorCodes || (EmbedErrorCodes = {}));
|
|
6023
6094
|
/**
|
|
6024
6095
|
* Context types for specifying the page context when triggering host events.
|
|
@@ -6154,7 +6225,6 @@
|
|
|
6154
6225
|
LIVEBOARD_VIZ_ID_VALIDATION: 'Please select a Liveboard to embed.',
|
|
6155
6226
|
TRIGGER_TIMED_OUT: 'Trigger timed-out in getting a response',
|
|
6156
6227
|
SEARCHEMBED_BETA_WRANING_MESSAGE: 'SearchEmbed is in Beta in this release.',
|
|
6157
|
-
SAGE_EMBED_BETA_WARNING_MESSAGE: 'SageEmbed is in Beta in this release.',
|
|
6158
6228
|
THIRD_PARTY_COOKIE_BLOCKED_ALERT: 'Third-party cookie access is blocked on this browser. Please allow third-party cookies for this to work properly. \nYou can use `suppressNoCookieAccessAlert` to suppress this message.',
|
|
6159
6229
|
DUPLICATE_TOKEN_ERR: 'Duplicate token. Please issue a new token every time getAuthToken callback is called. See https://developers.thoughtspot.com/docs/?pageid=embed-auth#trusted-auth-embed for more details.',
|
|
6160
6230
|
SDK_NOT_INITIALIZED: 'SDK not initialized',
|
|
@@ -6180,6 +6250,8 @@
|
|
|
6180
6250
|
SSR_ENVIRONMENT_ERROR: 'SSR environment detected. This function cannot be called in SSR environment.',
|
|
6181
6251
|
UPDATE_PARAMS_FAILED: 'Failed to update embed parameters',
|
|
6182
6252
|
INVALID_SPOTTER_DOCUMENTATION_URL: 'Invalid spotterDocumentationUrl. Please provide a valid http or https URL.',
|
|
6253
|
+
UPDATEFILTERS_INVALID_PAYLOAD: 'UpdateFilters requires a valid filter or filters array. Expected: { filter: { column, oper, values } } or { filters: [{ column, oper, values }, ...] }',
|
|
6254
|
+
DRILLDOWN_INVALID_PAYLOAD: 'DrillDown requires a valid points object. Expected: { points: { clickedPoint?, selectedPoints? }, autoDrillDown?, vizId? }',
|
|
6183
6255
|
};
|
|
6184
6256
|
const CUSTOM_ACTIONS_ERROR_MESSAGE = {
|
|
6185
6257
|
INVALID_ACTION_OBJECT: 'Custom Action Validation Error: Invalid action object provided',
|
|
@@ -6683,14 +6755,6 @@
|
|
|
6683
6755
|
return [false, error instanceof Error ? error : new Error(String(error))];
|
|
6684
6756
|
}
|
|
6685
6757
|
};
|
|
6686
|
-
/**
|
|
6687
|
-
* Resolves enablePastConversationsSidebar with
|
|
6688
|
-
* spotterSidebarConfig taking precedence over the
|
|
6689
|
-
* standalone flag.
|
|
6690
|
-
*/
|
|
6691
|
-
const resolveEnablePastConversationsSidebar = (params) => (params.spotterSidebarConfigValue !== undefined
|
|
6692
|
-
? params.spotterSidebarConfigValue
|
|
6693
|
-
: params.standaloneValue);
|
|
6694
6758
|
/**
|
|
6695
6759
|
* Sets a query parameter if the value is defined.
|
|
6696
6760
|
* @param queryParams - The query params object to modify
|
|
@@ -8198,9 +8262,9 @@
|
|
|
8198
8262
|
|
|
8199
8263
|
var stubFalse_1 = stubFalse;
|
|
8200
8264
|
|
|
8201
|
-
var isBuffer_1 = createCommonjsModule(function (module, exports) {
|
|
8265
|
+
var isBuffer_1 = createCommonjsModule(function (module, exports$1) {
|
|
8202
8266
|
/** Detect free variable `exports`. */
|
|
8203
|
-
var freeExports = exports && !exports.nodeType && exports;
|
|
8267
|
+
var freeExports = exports$1 && !exports$1.nodeType && exports$1;
|
|
8204
8268
|
|
|
8205
8269
|
/** Detect free variable `module`. */
|
|
8206
8270
|
var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;
|
|
@@ -8370,9 +8434,9 @@
|
|
|
8370
8434
|
|
|
8371
8435
|
var _baseUnary = baseUnary;
|
|
8372
8436
|
|
|
8373
|
-
var _nodeUtil = createCommonjsModule(function (module, exports) {
|
|
8437
|
+
var _nodeUtil = createCommonjsModule(function (module, exports$1) {
|
|
8374
8438
|
/** Detect free variable `exports`. */
|
|
8375
|
-
var freeExports = exports && !exports.nodeType && exports;
|
|
8439
|
+
var freeExports = exports$1 && !exports$1.nodeType && exports$1;
|
|
8376
8440
|
|
|
8377
8441
|
/** Detect free variable `module`. */
|
|
8378
8442
|
var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;
|
|
@@ -8987,6 +9051,8 @@
|
|
|
8987
9051
|
UIPassthroughEvent["GetAnswerConfig"] = "getAnswerPageConfig";
|
|
8988
9052
|
UIPassthroughEvent["GetLiveboardConfig"] = "getPinboardPageConfig";
|
|
8989
9053
|
UIPassthroughEvent["GetUnsavedAnswerTML"] = "getUnsavedAnswerTML";
|
|
9054
|
+
UIPassthroughEvent["UpdateFilters"] = "updateFilters";
|
|
9055
|
+
UIPassthroughEvent["Drilldown"] = "drillDown";
|
|
8990
9056
|
UIPassthroughEvent["GetAnswerSession"] = "getAnswerSession";
|
|
8991
9057
|
UIPassthroughEvent["GetFilters"] = "getFilters";
|
|
8992
9058
|
UIPassthroughEvent["GetIframeUrl"] = "getIframeUrl";
|
|
@@ -10271,9 +10337,6 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
10271
10337
|
|
|
10272
10338
|
var _stringToPath = stringToPath;
|
|
10273
10339
|
|
|
10274
|
-
/** Used as references for various `Number` constants. */
|
|
10275
|
-
var INFINITY$1 = 1 / 0;
|
|
10276
|
-
|
|
10277
10340
|
/** Used to convert symbols to primitives and strings. */
|
|
10278
10341
|
var symbolProto = _Symbol ? _Symbol.prototype : undefined,
|
|
10279
10342
|
symbolToString = symbolProto ? symbolProto.toString : undefined;
|
|
@@ -10299,7 +10362,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
10299
10362
|
return symbolToString ? symbolToString.call(value) : '';
|
|
10300
10363
|
}
|
|
10301
10364
|
var result = (value + '');
|
|
10302
|
-
return (result == '0' && (1 / value) == -
|
|
10365
|
+
return (result == '0' && (1 / value) == -Infinity) ? '-0' : result;
|
|
10303
10366
|
}
|
|
10304
10367
|
|
|
10305
10368
|
var _baseToString = baseToString;
|
|
@@ -10348,9 +10411,6 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
10348
10411
|
|
|
10349
10412
|
var _castPath = castPath;
|
|
10350
10413
|
|
|
10351
|
-
/** Used as references for various `Number` constants. */
|
|
10352
|
-
var INFINITY = 1 / 0;
|
|
10353
|
-
|
|
10354
10414
|
/**
|
|
10355
10415
|
* Converts `value` to a string key if it's not a string or symbol.
|
|
10356
10416
|
*
|
|
@@ -10363,7 +10423,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
10363
10423
|
return value;
|
|
10364
10424
|
}
|
|
10365
10425
|
var result = (value + '');
|
|
10366
|
-
return (result == '0' && (1 / value) == -
|
|
10426
|
+
return (result == '0' && (1 / value) == -Infinity) ? '-0' : result;
|
|
10367
10427
|
}
|
|
10368
10428
|
|
|
10369
10429
|
var _toKey = toKey;
|
|
@@ -17675,10 +17735,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
17675
17735
|
VISUAL_SDK_RENDER_FAILED: 'visual-sdk-render-failed',
|
|
17676
17736
|
VISUAL_SDK_TRIGGER: 'visual-sdk-trigger',
|
|
17677
17737
|
VISUAL_SDK_ON: 'visual-sdk-on',
|
|
17678
|
-
|
|
17679
|
-
VISUAL_SDK_EMBED_CREATE: 'visual-sdk-embed-create',
|
|
17680
|
-
VERCEL_INTEGRATION_COMPLETED: 'vercel-integration-completed',
|
|
17681
|
-
};
|
|
17738
|
+
VISUAL_SDK_EMBED_CREATE: 'visual-sdk-embed-create'};
|
|
17682
17739
|
let isMixpanelInitialized = false;
|
|
17683
17740
|
let eventQueue = [];
|
|
17684
17741
|
/**
|
|
@@ -19228,10 +19285,66 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
19228
19285
|
return eventData;
|
|
19229
19286
|
}
|
|
19230
19287
|
|
|
19231
|
-
var
|
|
19288
|
+
var version$1="1.47.0";var pkgInfo = {version:version$1};
|
|
19289
|
+
|
|
19290
|
+
function isValidUpdateFiltersPayload(payload) {
|
|
19291
|
+
if (!payload)
|
|
19292
|
+
return false;
|
|
19293
|
+
const isValidFilter = (f) => {
|
|
19294
|
+
const hasColumn = typeof f.column === 'string' || typeof f.columnName === 'string';
|
|
19295
|
+
const hasOperator = typeof f.oper === 'string' || typeof f.operator === 'string';
|
|
19296
|
+
const hasValues = Array.isArray(f.values);
|
|
19297
|
+
const validType = !f.type || typeof f.type === 'string';
|
|
19298
|
+
return hasColumn && hasOperator && hasValues && validType;
|
|
19299
|
+
};
|
|
19300
|
+
const hasValidFilter = payload.filter && isValidFilter(payload.filter);
|
|
19301
|
+
const hasValidFilters = Array.isArray(payload.filters) && payload.filters.length > 0 && payload.filters.every(isValidFilter);
|
|
19302
|
+
return !!(hasValidFilter || hasValidFilters);
|
|
19303
|
+
}
|
|
19304
|
+
function isValidDrillDownPayload(payload) {
|
|
19305
|
+
if (!payload)
|
|
19306
|
+
return false;
|
|
19307
|
+
const points = payload.points;
|
|
19308
|
+
if (!points || typeof points !== 'object')
|
|
19309
|
+
return false;
|
|
19310
|
+
const hasClickedPoint = 'clickedPoint' in points && points.clickedPoint != null;
|
|
19311
|
+
const hasSelectedPoints = Array.isArray(points.selectedPoints) && points.selectedPoints.length > 0;
|
|
19312
|
+
return hasClickedPoint || hasSelectedPoints;
|
|
19313
|
+
}
|
|
19314
|
+
function createValidationError(message) {
|
|
19315
|
+
const err = new Error(message);
|
|
19316
|
+
err.isValidationError = true;
|
|
19317
|
+
err.embedErrorDetails = {
|
|
19318
|
+
type: exports.EmbedEvent.Error,
|
|
19319
|
+
data: {
|
|
19320
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
19321
|
+
message,
|
|
19322
|
+
code: EmbedErrorCodes.HOST_EVENT_VALIDATION,
|
|
19323
|
+
error: message
|
|
19324
|
+
},
|
|
19325
|
+
status: embedEventStatus.END
|
|
19326
|
+
};
|
|
19327
|
+
throw err;
|
|
19328
|
+
}
|
|
19329
|
+
function throwUpdateFiltersValidationError() {
|
|
19330
|
+
createValidationError(ERROR_MESSAGE.UPDATEFILTERS_INVALID_PAYLOAD);
|
|
19331
|
+
}
|
|
19332
|
+
function throwDrillDownValidationError() {
|
|
19333
|
+
createValidationError(ERROR_MESSAGE.DRILLDOWN_INVALID_PAYLOAD);
|
|
19334
|
+
}
|
|
19232
19335
|
|
|
19233
|
-
/**
|
|
19234
|
-
|
|
19336
|
+
/**
|
|
19337
|
+
* Maps HostEvent to its corresponding UIPassthroughEvent.
|
|
19338
|
+
* Includes both custom-handler events (Pin, SaveAnswer, UpdateFilters, DrillDown)
|
|
19339
|
+
* and getter events (GetAnswerSession, GetFilters, etc.) that use getDataWithPassthroughFallback.
|
|
19340
|
+
*/
|
|
19341
|
+
const PASSTHROUGH_MAP = {
|
|
19342
|
+
// Custom handlers (setters with special logic)
|
|
19343
|
+
[exports.HostEvent.Pin]: UIPassthroughEvent.PinAnswerToLiveboard,
|
|
19344
|
+
[exports.HostEvent.SaveAnswer]: UIPassthroughEvent.SaveAnswer,
|
|
19345
|
+
[exports.HostEvent.UpdateFilters]: UIPassthroughEvent.UpdateFilters,
|
|
19346
|
+
[exports.HostEvent.DrillDown]: UIPassthroughEvent.Drilldown,
|
|
19347
|
+
// Getters (use getDataWithPassthroughFallback)
|
|
19235
19348
|
[exports.HostEvent.GetAnswerSession]: UIPassthroughEvent.GetAnswerSession,
|
|
19236
19349
|
[exports.HostEvent.GetFilters]: UIPassthroughEvent.GetFilters,
|
|
19237
19350
|
[exports.HostEvent.GetIframeUrl]: UIPassthroughEvent.GetIframeUrl,
|
|
@@ -19242,10 +19355,14 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
19242
19355
|
};
|
|
19243
19356
|
class HostEventClient {
|
|
19244
19357
|
constructor(iFrame) {
|
|
19358
|
+
/** Cached list of available UI passthrough keys from the embedded app */
|
|
19359
|
+
this.availablePassthroughKeysCache = null;
|
|
19245
19360
|
this.iFrame = iFrame;
|
|
19246
19361
|
this.customHandlers = {
|
|
19247
19362
|
[exports.HostEvent.Pin]: (p, c) => this.handlePinEvent(p, c),
|
|
19248
19363
|
[exports.HostEvent.SaveAnswer]: (p, c) => this.handleSaveAnswerEvent(p, c),
|
|
19364
|
+
[exports.HostEvent.UpdateFilters]: (p, c) => this.handleUpdateFiltersEvent(p, c),
|
|
19365
|
+
[exports.HostEvent.DrillDown]: (p, c) => this.handleDrillDownEvent(p, c),
|
|
19249
19366
|
};
|
|
19250
19367
|
}
|
|
19251
19368
|
/**
|
|
@@ -19308,6 +19425,26 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
19308
19425
|
setIframeElement(iFrame) {
|
|
19309
19426
|
this.iFrame = iFrame;
|
|
19310
19427
|
}
|
|
19428
|
+
/**
|
|
19429
|
+
* Fetches the list of available UI passthrough keys from the embedded app.
|
|
19430
|
+
* Result is cached for the session. Returns empty array on failure.
|
|
19431
|
+
*/
|
|
19432
|
+
async getAvailableUIPassthroughKeys(context) {
|
|
19433
|
+
var _a, _b;
|
|
19434
|
+
if (this.availablePassthroughKeysCache !== null) {
|
|
19435
|
+
return this.availablePassthroughKeysCache;
|
|
19436
|
+
}
|
|
19437
|
+
try {
|
|
19438
|
+
const response = await this.triggerUIPassthroughApi(UIPassthroughEvent.GetAvailableUIPassthroughs, {}, context);
|
|
19439
|
+
const matched = (_a = response === null || response === void 0 ? void 0 : response.find) === null || _a === void 0 ? void 0 : _a.call(response, (r) => r.value && !r.error);
|
|
19440
|
+
const keys = (_b = matched === null || matched === void 0 ? void 0 : matched.value) === null || _b === void 0 ? void 0 : _b.keys;
|
|
19441
|
+
this.availablePassthroughKeysCache = Array.isArray(keys) ? keys : [];
|
|
19442
|
+
return this.availablePassthroughKeysCache;
|
|
19443
|
+
}
|
|
19444
|
+
catch {
|
|
19445
|
+
return [];
|
|
19446
|
+
}
|
|
19447
|
+
}
|
|
19311
19448
|
async triggerUIPassthroughApi(apiName, parameters, context) {
|
|
19312
19449
|
const res = await this.processTrigger(exports.HostEvent.UIPassthrough, {
|
|
19313
19450
|
type: apiName,
|
|
@@ -19343,16 +19480,41 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
19343
19480
|
answerId: (_d = (_c = (_b = (_a = data === null || data === void 0 ? void 0 : data.saveResponse) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.Answer__save) === null || _c === void 0 ? void 0 : _c.answer) === null || _d === void 0 ? void 0 : _d.id,
|
|
19344
19481
|
};
|
|
19345
19482
|
}
|
|
19483
|
+
handleUpdateFiltersEvent(payload, context) {
|
|
19484
|
+
if (!isValidUpdateFiltersPayload(payload)) {
|
|
19485
|
+
throwUpdateFiltersValidationError();
|
|
19486
|
+
}
|
|
19487
|
+
return this.handleHostEventWithParam(UIPassthroughEvent.UpdateFilters, payload, context);
|
|
19488
|
+
}
|
|
19489
|
+
handleDrillDownEvent(payload, context) {
|
|
19490
|
+
if (!isValidDrillDownPayload(payload)) {
|
|
19491
|
+
throwDrillDownValidationError();
|
|
19492
|
+
}
|
|
19493
|
+
return this.handleHostEventWithParam(UIPassthroughEvent.Drilldown, payload, context);
|
|
19494
|
+
}
|
|
19495
|
+
/**
|
|
19496
|
+
* Dispatches a host event using the appropriate channel:
|
|
19497
|
+
* 1. If the embedded app supports UI passthrough for this event, use it (custom handler or getter).
|
|
19498
|
+
* 2. Otherwise fall back to the legacy host event channel.
|
|
19499
|
+
*
|
|
19500
|
+
* @param hostEvent - The host event to trigger
|
|
19501
|
+
* @param payload - Optional payload for the event
|
|
19502
|
+
* @param context - Optional context (e.g. vizId) for scoped operations
|
|
19503
|
+
*/
|
|
19346
19504
|
async triggerHostEvent(hostEvent, payload, context) {
|
|
19347
19505
|
const customHandler = this.customHandlers[hostEvent];
|
|
19348
|
-
|
|
19349
|
-
|
|
19350
|
-
|
|
19351
|
-
|
|
19352
|
-
|
|
19353
|
-
return this.getDataWithPassthroughFallback(passthroughEvent, hostEvent, payload, context);
|
|
19506
|
+
const passthroughEvent = PASSTHROUGH_MAP[hostEvent];
|
|
19507
|
+
// If embedded app supports passthrough but not this event, use legacy channel
|
|
19508
|
+
const keys = passthroughEvent ? await this.getAvailableUIPassthroughKeys(context) : [];
|
|
19509
|
+
if (passthroughEvent && keys.length > 0 && !keys.includes(passthroughEvent)) {
|
|
19510
|
+
return this.hostEventFallback(hostEvent, payload, context);
|
|
19354
19511
|
}
|
|
19355
|
-
|
|
19512
|
+
// Custom handler (setters) > getter passthrough > legacy fallback
|
|
19513
|
+
return (customHandler
|
|
19514
|
+
? customHandler(payload, context)
|
|
19515
|
+
: passthroughEvent
|
|
19516
|
+
? this.getDataWithPassthroughFallback(passthroughEvent, hostEvent, payload, context)
|
|
19517
|
+
: this.hostEventFallback(hostEvent, payload, context));
|
|
19356
19518
|
}
|
|
19357
19519
|
}
|
|
19358
19520
|
|
|
@@ -20686,7 +20848,19 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
20686
20848
|
return null;
|
|
20687
20849
|
}
|
|
20688
20850
|
// send an empty object, this is needed for liveboard default handlers
|
|
20689
|
-
return this.hostEventClient.triggerHostEvent(messageType, data, context)
|
|
20851
|
+
return this.hostEventClient.triggerHostEvent(messageType, data, context).catch((err) => {
|
|
20852
|
+
var _a;
|
|
20853
|
+
if (err === null || err === void 0 ? void 0 : err.isValidationError) {
|
|
20854
|
+
const errorDetails = (_a = err.embedErrorDetails) !== null && _a !== void 0 ? _a : {
|
|
20855
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
20856
|
+
message: err.message || ERROR_MESSAGE.UPDATEFILTERS_INVALID_PAYLOAD,
|
|
20857
|
+
code: EmbedErrorCodes.UPDATEFILTERS_INVALID_PAYLOAD,
|
|
20858
|
+
error: err.message,
|
|
20859
|
+
};
|
|
20860
|
+
this.handleError(errorDetails);
|
|
20861
|
+
}
|
|
20862
|
+
throw err;
|
|
20863
|
+
});
|
|
20690
20864
|
}
|
|
20691
20865
|
/**
|
|
20692
20866
|
* Triggers an event to the embedded app, skipping the UI flow.
|
|
@@ -20809,6 +20983,9 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
20809
20983
|
try {
|
|
20810
20984
|
this.removeFullscreenChangeHandler();
|
|
20811
20985
|
this.unsubscribeToEvents();
|
|
20986
|
+
if (!this.isRendered) {
|
|
20987
|
+
return;
|
|
20988
|
+
}
|
|
20812
20989
|
if (!getEmbedConfig().waitForCleanupOnDestroy) {
|
|
20813
20990
|
this.trigger(exports.HostEvent.DestroyEmbed);
|
|
20814
20991
|
(_b = (_a = this.insertedDomEl) === null || _a === void 0 ? void 0 : _a.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(this.insertedDomEl);
|
|
@@ -20818,11 +20995,16 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
20818
20995
|
Promise.race([
|
|
20819
20996
|
this.trigger(exports.HostEvent.DestroyEmbed),
|
|
20820
20997
|
new Promise((resolve) => setTimeout(resolve, cleanupTimeout)),
|
|
20821
|
-
]).
|
|
20822
|
-
var _a, _b;
|
|
20823
|
-
(_b = (_a = this.insertedDomEl) === null || _a === void 0 ? void 0 : _a.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(this.insertedDomEl);
|
|
20824
|
-
}).catch((e) => {
|
|
20998
|
+
]).catch((e) => {
|
|
20825
20999
|
logger$3.log('Error destroying TS Embed', e);
|
|
21000
|
+
}).finally(() => {
|
|
21001
|
+
var _a, _b;
|
|
21002
|
+
try {
|
|
21003
|
+
(_b = (_a = this.insertedDomEl) === null || _a === void 0 ? void 0 : _a.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(this.insertedDomEl);
|
|
21004
|
+
}
|
|
21005
|
+
catch (e) {
|
|
21006
|
+
logger$3.log('Error removing DOM element on destroy', e);
|
|
21007
|
+
}
|
|
20826
21008
|
});
|
|
20827
21009
|
}
|
|
20828
21010
|
}
|
|
@@ -21163,87 +21345,6 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
21163
21345
|
}
|
|
21164
21346
|
};
|
|
21165
21347
|
|
|
21166
|
-
/**
|
|
21167
|
-
* Copyright (c) 2023
|
|
21168
|
-
*
|
|
21169
|
-
* Embed ThoughtSpot Sage
|
|
21170
|
-
* @summary TS Sage embed
|
|
21171
|
-
* @author Mourya Balabhadra <mourya.balabhadra@thoughtspot.com>
|
|
21172
|
-
*/
|
|
21173
|
-
/**
|
|
21174
|
-
* Embed ThoughtSpot LLM and GPT-based Natural Language Search component.
|
|
21175
|
-
* @version SDK: 1.23.0 | ThoughtSpot: 9.4.0.cl, 9.5.1-sw
|
|
21176
|
-
*
|
|
21177
|
-
* Note: This embed will be deprecated from SDK: 1.40.0 | ThoughtSpot: 10.13.0.cl
|
|
21178
|
-
* @group Embed components
|
|
21179
|
-
*/
|
|
21180
|
-
let SageEmbed$1 = class SageEmbed extends V1Embed {
|
|
21181
|
-
constructor(domSelector, viewConfig) {
|
|
21182
|
-
viewConfig.embedComponentType = 'SageEmbed';
|
|
21183
|
-
super(domSelector, viewConfig);
|
|
21184
|
-
}
|
|
21185
|
-
getEmbedParamsObject() {
|
|
21186
|
-
const { disableWorksheetChange, hideWorksheetSelector, showObjectSuggestions, dataPanelV2, hideSampleQuestions, isProductTour, hideSageAnswerHeader, hideAutocompleteSuggestions, } = this.viewConfig;
|
|
21187
|
-
const params = this.getBaseQueryParams();
|
|
21188
|
-
params[Param.DataPanelV2Enabled] = !!dataPanelV2;
|
|
21189
|
-
params[Param.IsSageEmbed] = true;
|
|
21190
|
-
params[Param.DisableWorksheetChange] = !!disableWorksheetChange;
|
|
21191
|
-
params[Param.HideWorksheetSelector] = !!hideWorksheetSelector;
|
|
21192
|
-
params[Param.HideEurekaSuggestions] = !!hideAutocompleteSuggestions;
|
|
21193
|
-
if (showObjectSuggestions) {
|
|
21194
|
-
params[Param.HideEurekaSuggestions] = !showObjectSuggestions;
|
|
21195
|
-
// support backwards compatibility
|
|
21196
|
-
}
|
|
21197
|
-
params[Param.HideSampleQuestions] = !!hideSampleQuestions;
|
|
21198
|
-
params[Param.IsProductTour] = !!isProductTour;
|
|
21199
|
-
params[Param.HideSageAnswerHeader] = !!hideSageAnswerHeader;
|
|
21200
|
-
return params;
|
|
21201
|
-
}
|
|
21202
|
-
/**
|
|
21203
|
-
* Constructs a map of parameters to be passed on to the
|
|
21204
|
-
* embedded Eureka or Sage search page.
|
|
21205
|
-
* @returns {string} query string
|
|
21206
|
-
*/
|
|
21207
|
-
getEmbedParams() {
|
|
21208
|
-
const params = this.getEmbedParamsObject();
|
|
21209
|
-
return getQueryParamString(params, true);
|
|
21210
|
-
}
|
|
21211
|
-
/**
|
|
21212
|
-
* Construct the URL of the embedded ThoughtSpot sage to be
|
|
21213
|
-
* loaded in the iframe
|
|
21214
|
-
* @returns {string} iframe url
|
|
21215
|
-
*/
|
|
21216
|
-
getIFrameSrc() {
|
|
21217
|
-
const path = 'eureka';
|
|
21218
|
-
const postHashObj = {};
|
|
21219
|
-
const tsPostHashParams = this.getThoughtSpotPostUrlParams();
|
|
21220
|
-
const { dataSource, searchOptions, } = this.viewConfig;
|
|
21221
|
-
if (dataSource)
|
|
21222
|
-
postHashObj[Param.WorksheetId] = dataSource;
|
|
21223
|
-
if ((searchOptions === null || searchOptions === void 0 ? void 0 : searchOptions.searchQuery) && searchOptions.executeSearch) {
|
|
21224
|
-
postHashObj[Param.executeSearch] = true;
|
|
21225
|
-
}
|
|
21226
|
-
let sagePostHashParams = new URLSearchParams(postHashObj).toString();
|
|
21227
|
-
if (sagePostHashParams)
|
|
21228
|
-
sagePostHashParams = `${tsPostHashParams ? '&' : '?'}${sagePostHashParams}`;
|
|
21229
|
-
if (searchOptions === null || searchOptions === void 0 ? void 0 : searchOptions.searchQuery)
|
|
21230
|
-
sagePostHashParams += `${sagePostHashParams ? '&' : '?'}${[Param.Query]}=${encodeURIComponent(searchOptions.searchQuery)}`;
|
|
21231
|
-
// use encodeURIComponent for query instead of URLSearchParams
|
|
21232
|
-
// as it adds + instead of %20 for spaces
|
|
21233
|
-
return `${this.getRootIframeSrc()}/embed/${path}${tsPostHashParams}${sagePostHashParams}`;
|
|
21234
|
-
}
|
|
21235
|
-
/**
|
|
21236
|
-
* Render the embedded ThoughtSpot Sage
|
|
21237
|
-
* @returns {SageEmbed} Eureka/Sage embed
|
|
21238
|
-
*/
|
|
21239
|
-
async render() {
|
|
21240
|
-
await super.render();
|
|
21241
|
-
const src = this.getIFrameSrc();
|
|
21242
|
-
await this.renderV1Embed(src);
|
|
21243
|
-
return this;
|
|
21244
|
-
}
|
|
21245
|
-
};
|
|
21246
|
-
|
|
21247
21348
|
/**
|
|
21248
21349
|
* Copyright (c) 2022
|
|
21249
21350
|
*
|
|
@@ -21415,7 +21516,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
21415
21516
|
*/
|
|
21416
21517
|
async render() {
|
|
21417
21518
|
await super.render();
|
|
21418
|
-
this.viewConfig;
|
|
21519
|
+
const { answerId } = this.viewConfig;
|
|
21419
21520
|
const src = this.getIFrameSrc();
|
|
21420
21521
|
await this.renderIFrame(src);
|
|
21421
21522
|
getAuthPromise().then(() => {
|
|
@@ -21428,6 +21529,50 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
21428
21529
|
}
|
|
21429
21530
|
};
|
|
21430
21531
|
|
|
21532
|
+
/**
|
|
21533
|
+
* Resolves enablePastConversationsSidebar with
|
|
21534
|
+
* spotterSidebarConfig taking precedence over the
|
|
21535
|
+
* standalone flag.
|
|
21536
|
+
*/
|
|
21537
|
+
const resolveEnablePastConversationsSidebar = (params) => (params.spotterSidebarConfigValue !== undefined
|
|
21538
|
+
? params.spotterSidebarConfigValue
|
|
21539
|
+
: params.standaloneValue);
|
|
21540
|
+
function buildSpotterSidebarAppInitData(defaultAppInitData, viewConfig, handleError) {
|
|
21541
|
+
const { spotterSidebarConfig, enablePastConversationsSidebar } = viewConfig;
|
|
21542
|
+
const resolvedEnablePastConversations = resolveEnablePastConversationsSidebar({
|
|
21543
|
+
spotterSidebarConfigValue: spotterSidebarConfig === null || spotterSidebarConfig === void 0 ? void 0 : spotterSidebarConfig.enablePastConversationsSidebar,
|
|
21544
|
+
standaloneValue: enablePastConversationsSidebar,
|
|
21545
|
+
});
|
|
21546
|
+
const hasConfig = spotterSidebarConfig || resolvedEnablePastConversations !== undefined;
|
|
21547
|
+
if (!hasConfig)
|
|
21548
|
+
return defaultAppInitData;
|
|
21549
|
+
const resolvedSidebarConfig = {
|
|
21550
|
+
...spotterSidebarConfig,
|
|
21551
|
+
...(resolvedEnablePastConversations !== undefined && {
|
|
21552
|
+
enablePastConversationsSidebar: resolvedEnablePastConversations,
|
|
21553
|
+
}),
|
|
21554
|
+
};
|
|
21555
|
+
if (resolvedSidebarConfig.spotterDocumentationUrl !== undefined) {
|
|
21556
|
+
const [isValid, validationError] = validateHttpUrl(resolvedSidebarConfig.spotterDocumentationUrl);
|
|
21557
|
+
if (!isValid) {
|
|
21558
|
+
handleError({
|
|
21559
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
21560
|
+
message: ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
|
|
21561
|
+
code: EmbedErrorCodes.INVALID_URL,
|
|
21562
|
+
error: (validationError === null || validationError === void 0 ? void 0 : validationError.message) || ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
|
|
21563
|
+
});
|
|
21564
|
+
delete resolvedSidebarConfig.spotterDocumentationUrl;
|
|
21565
|
+
}
|
|
21566
|
+
}
|
|
21567
|
+
return {
|
|
21568
|
+
...defaultAppInitData,
|
|
21569
|
+
embedParams: {
|
|
21570
|
+
...(defaultAppInitData.embedParams || {}),
|
|
21571
|
+
spotterSidebarConfig: resolvedSidebarConfig,
|
|
21572
|
+
},
|
|
21573
|
+
};
|
|
21574
|
+
}
|
|
21575
|
+
|
|
21431
21576
|
/**
|
|
21432
21577
|
* Copyright (c) 2022
|
|
21433
21578
|
*
|
|
@@ -21557,7 +21702,10 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
21557
21702
|
this.defaultHeight = 500;
|
|
21558
21703
|
this.sendFullHeightLazyLoadData = () => {
|
|
21559
21704
|
const data = calculateVisibleElementData(this.iFrame);
|
|
21560
|
-
this
|
|
21705
|
+
// this should be fired only if the lazyLoadingForFullHeight and fullHeight are true
|
|
21706
|
+
if (this.viewConfig.lazyLoadingForFullHeight && this.viewConfig.fullHeight) {
|
|
21707
|
+
this.trigger(exports.HostEvent.VisibleEmbedCoordinates, data);
|
|
21708
|
+
}
|
|
21561
21709
|
};
|
|
21562
21710
|
/**
|
|
21563
21711
|
* This is a handler for the RequestVisibleEmbedCoordinates event.
|
|
@@ -21570,22 +21718,13 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
21570
21718
|
const visibleCoordinatesData = calculateVisibleElementData(this.iFrame);
|
|
21571
21719
|
responder({ type: exports.EmbedEvent.RequestVisibleEmbedCoordinates, data: visibleCoordinatesData });
|
|
21572
21720
|
};
|
|
21573
|
-
this.HEIGHT_CHANAGE_THRESHOLD = 30;
|
|
21574
21721
|
/**
|
|
21575
21722
|
* Set the iframe height as per the computed height received
|
|
21576
21723
|
* from the ThoughtSpot app.
|
|
21577
21724
|
* @param data The event payload
|
|
21578
21725
|
*/
|
|
21579
21726
|
this.updateIFrameHeight = (data) => {
|
|
21580
|
-
|
|
21581
|
-
const currentHeight = this.iFrame.getBoundingClientRect().height;
|
|
21582
|
-
const heightToSet = Math.max(data.data, this.defaultHeight);
|
|
21583
|
-
const heightChange = Math.abs(heightToSet - currentHeight);
|
|
21584
|
-
if (heightChange < this.HEIGHT_CHANAGE_THRESHOLD) {
|
|
21585
|
-
logger$3.info('Height change is less than the threshold, skipping height update', { heightChange, heightToSet, currentHeight });
|
|
21586
|
-
return;
|
|
21587
|
-
}
|
|
21588
|
-
this.setIFrameHeight(heightToSet);
|
|
21727
|
+
this.setIFrameHeight(Math.max(data.data, this.defaultHeight));
|
|
21589
21728
|
this.sendFullHeightLazyLoadData();
|
|
21590
21729
|
};
|
|
21591
21730
|
this.embedIframeCenter = (data, responder) => {
|
|
@@ -21619,12 +21758,28 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
21619
21758
|
this.on(exports.EmbedEvent.RequestVisibleEmbedCoordinates, this.requestVisibleEmbedCoordinatesHandler);
|
|
21620
21759
|
}
|
|
21621
21760
|
}
|
|
21761
|
+
/**
|
|
21762
|
+
* Extends the default APP_INIT payload with `embedParams.spotterSidebarConfig`
|
|
21763
|
+
* so the conv-assist app can read sidebar configuration on initialisation.
|
|
21764
|
+
*
|
|
21765
|
+
* Precedence for `enablePastConversationsSidebar`:
|
|
21766
|
+
* `spotterSidebarConfig.enablePastConversationsSidebar` wins over the
|
|
21767
|
+
* deprecated top-level `enablePastConversationsSidebar` flag; if the former
|
|
21768
|
+
* is absent the latter is used as a fallback.
|
|
21769
|
+
*
|
|
21770
|
+
* An invalid `spotterDocumentationUrl` triggers a validation error and is
|
|
21771
|
+
* excluded from the payload rather than forwarded to the app.
|
|
21772
|
+
*/
|
|
21773
|
+
async getAppInitData() {
|
|
21774
|
+
const defaultAppInitData = await super.getAppInitData();
|
|
21775
|
+
return buildSpotterSidebarAppInitData(defaultAppInitData, this.viewConfig, this.handleError.bind(this));
|
|
21776
|
+
}
|
|
21622
21777
|
/**
|
|
21623
21778
|
* Constructs a map of parameters to be passed on to the
|
|
21624
21779
|
* embedded Liveboard or visualization.
|
|
21625
21780
|
*/
|
|
21626
21781
|
getEmbedParams() {
|
|
21627
|
-
const { tag, hideTagFilterChips, hideObjects, liveboardV2, showPrimaryNavbar, disableProfileAndHelp, hideHamburger, hideObjectSearch, hideNotification, hideApplicationSwitcher, hideOrgSwitcher, enableSearchAssist, fullHeight, dataPanelV2 = true, hideLiveboardHeader = false, showLiveboardTitle = true, showLiveboardDescription = true, showMaskedFilterChip = false, isLiveboardMasterpiecesEnabled = false, hideHomepageLeftNav = false, modularHomeExperience = false, isLiveboardHeaderSticky = true, enableAskSage, collapseSearchBarInitially = false, enable2ColumnLayout, enableCustomColumnGroups = false, dataPanelCustomGroupsAccordionInitialState = DataPanelCustomColumnGroupsAccordionState.EXPAND_ALL, collapseSearchBar = true, isLiveboardCompactHeaderEnabled = false, showLiveboardVerifiedBadge = true, showLiveboardReverifyBanner = true, hideIrrelevantChipsInLiveboardTabs = false, isEnhancedFilterInteractivityEnabled = false, homePageSearchBarMode,
|
|
21782
|
+
const { tag, hideTagFilterChips, hideObjects, liveboardV2, showPrimaryNavbar, disableProfileAndHelp, hideHamburger, hideObjectSearch, hideNotification, hideApplicationSwitcher, hideOrgSwitcher, enableSearchAssist, fullHeight, dataPanelV2 = true, hideLiveboardHeader = false, showLiveboardTitle = true, showLiveboardDescription = true, showMaskedFilterChip = false, isLiveboardMasterpiecesEnabled = false, hideHomepageLeftNav = false, modularHomeExperience = false, isLiveboardHeaderSticky = true, enableAskSage, collapseSearchBarInitially = false, enable2ColumnLayout, enableCustomColumnGroups = false, dataPanelCustomGroupsAccordionInitialState = DataPanelCustomColumnGroupsAccordionState.EXPAND_ALL, collapseSearchBar = true, isLiveboardCompactHeaderEnabled = false, showLiveboardVerifiedBadge = true, showLiveboardReverifyBanner = true, hideIrrelevantChipsInLiveboardTabs = false, isEnhancedFilterInteractivityEnabled = false, homePageSearchBarMode, enablePendoHelp = true, discoveryExperience, coverAndFilterOptionInPDF = false, isLiveboardStylingAndGroupingEnabled, isPNGInScheduledEmailsEnabled = false, isLiveboardXLSXCSVDownloadEnabled = false, isGranularXLSXCSVSchedulesEnabled = false, isCentralizedLiveboardFilterUXEnabled = false, isLinkParametersEnabled, updatedSpotterChatPrompt, spotterChatConfig, minimumHeight, isThisPeriodInDateFiltersEnabled, enableHomepageAnnouncement = false, isContinuousLiveboardPDFEnabled, } = this.viewConfig;
|
|
21628
21783
|
let params = {};
|
|
21629
21784
|
params[Param.PrimaryNavHidden] = !showPrimaryNavbar;
|
|
21630
21785
|
params[Param.HideProfleAndHelp] = !!disableProfileAndHelp;
|
|
@@ -21642,45 +21797,11 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
21642
21797
|
params[Param.ShowLiveboardVerifiedBadge] = showLiveboardVerifiedBadge;
|
|
21643
21798
|
params[Param.ShowLiveboardReverifyBanner] = showLiveboardReverifyBanner;
|
|
21644
21799
|
params[Param.HideIrrelevantFiltersInTab] = hideIrrelevantChipsInLiveboardTabs;
|
|
21645
|
-
params[Param.IsUnifiedSearchExperienceEnabled] = isUnifiedSearchExperienceEnabled;
|
|
21646
21800
|
params[Param.CoverAndFilterOptionInPDF] = !!coverAndFilterOptionInPDF;
|
|
21647
21801
|
params = this.getBaseQueryParams(params);
|
|
21648
21802
|
if (!isUndefined(updatedSpotterChatPrompt)) {
|
|
21649
21803
|
params[Param.UpdatedSpotterChatPrompt] = !!updatedSpotterChatPrompt;
|
|
21650
21804
|
}
|
|
21651
|
-
const resolvedEnablePastConversationsSidebar = resolveEnablePastConversationsSidebar({
|
|
21652
|
-
spotterSidebarConfigValue: spotterSidebarConfig === null || spotterSidebarConfig === void 0 ? void 0 : spotterSidebarConfig.enablePastConversationsSidebar,
|
|
21653
|
-
standaloneValue: this.viewConfig.enablePastConversationsSidebar,
|
|
21654
|
-
});
|
|
21655
|
-
setParamIfDefined(params, Param.EnablePastConversationsSidebar, resolvedEnablePastConversationsSidebar, true);
|
|
21656
|
-
// Handle spotterSidebarConfig params
|
|
21657
|
-
if (spotterSidebarConfig) {
|
|
21658
|
-
const { spotterSidebarTitle, spotterSidebarDefaultExpanded, spotterChatRenameLabel, spotterChatDeleteLabel, spotterDeleteConversationModalTitle, spotterPastConversationAlertMessage, spotterDocumentationUrl, spotterBestPracticesLabel, spotterConversationsBatchSize, spotterNewChatButtonTitle, } = spotterSidebarConfig;
|
|
21659
|
-
setParamIfDefined(params, Param.SpotterSidebarDefaultExpanded, spotterSidebarDefaultExpanded, true);
|
|
21660
|
-
setParamIfDefined(params, Param.SpotterSidebarTitle, spotterSidebarTitle);
|
|
21661
|
-
setParamIfDefined(params, Param.SpotterChatRenameLabel, spotterChatRenameLabel);
|
|
21662
|
-
setParamIfDefined(params, Param.SpotterChatDeleteLabel, spotterChatDeleteLabel);
|
|
21663
|
-
setParamIfDefined(params, Param.SpotterDeleteConversationModalTitle, spotterDeleteConversationModalTitle);
|
|
21664
|
-
setParamIfDefined(params, Param.SpotterPastConversationAlertMessage, spotterPastConversationAlertMessage);
|
|
21665
|
-
setParamIfDefined(params, Param.SpotterBestPracticesLabel, spotterBestPracticesLabel);
|
|
21666
|
-
setParamIfDefined(params, Param.SpotterConversationsBatchSize, spotterConversationsBatchSize);
|
|
21667
|
-
setParamIfDefined(params, Param.SpotterNewChatButtonTitle, spotterNewChatButtonTitle);
|
|
21668
|
-
// URL param with validation
|
|
21669
|
-
if (spotterDocumentationUrl !== undefined) {
|
|
21670
|
-
const [isValid, validationError] = validateHttpUrl(spotterDocumentationUrl);
|
|
21671
|
-
if (isValid) {
|
|
21672
|
-
params[Param.SpotterDocumentationUrl] = spotterDocumentationUrl;
|
|
21673
|
-
}
|
|
21674
|
-
else {
|
|
21675
|
-
this.handleError({
|
|
21676
|
-
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
21677
|
-
message: ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
|
|
21678
|
-
code: EmbedErrorCodes.INVALID_URL,
|
|
21679
|
-
error: (validationError === null || validationError === void 0 ? void 0 : validationError.message) || ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
|
|
21680
|
-
});
|
|
21681
|
-
}
|
|
21682
|
-
}
|
|
21683
|
-
}
|
|
21684
21805
|
// Handle spotterChatConfig params
|
|
21685
21806
|
if (spotterChatConfig) {
|
|
21686
21807
|
const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, } = spotterChatConfig;
|
|
@@ -21756,6 +21877,9 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
|
|
|
21756
21877
|
if (enableHomepageAnnouncement !== undefined) {
|
|
21757
21878
|
params[Param.EnableHomepageAnnouncement] = enableHomepageAnnouncement;
|
|
21758
21879
|
}
|
|
21880
|
+
if (isContinuousLiveboardPDFEnabled !== undefined) {
|
|
21881
|
+
params[Param.IsWYSIWYGLiveboardPDFEnabled] = isContinuousLiveboardPDFEnabled;
|
|
21882
|
+
}
|
|
21759
21883
|
this.defaultHeight = minimumHeight || this.defaultHeight;
|
|
21760
21884
|
params[Param.DataPanelV2Enabled] = dataPanelV2;
|
|
21761
21885
|
params[Param.HideHomepageLeftNav] = hideHomepageLeftNav;
|
|
@@ -22031,7 +22155,10 @@ query GetEurekaVizSnapshots(
|
|
|
22031
22155
|
this.defaultHeight = 500;
|
|
22032
22156
|
this.sendFullHeightLazyLoadData = () => {
|
|
22033
22157
|
const data = calculateVisibleElementData(this.iFrame);
|
|
22034
|
-
this
|
|
22158
|
+
// this should be fired only if the lazyLoadingForFullHeight and fullHeight are true
|
|
22159
|
+
if (this.viewConfig.lazyLoadingForFullHeight && this.viewConfig.fullHeight) {
|
|
22160
|
+
this.trigger(exports.HostEvent.VisibleEmbedCoordinates, data);
|
|
22161
|
+
}
|
|
22035
22162
|
};
|
|
22036
22163
|
/**
|
|
22037
22164
|
* This is a handler for the RequestVisibleEmbedCoordinates event.
|
|
@@ -22044,21 +22171,13 @@ query GetEurekaVizSnapshots(
|
|
|
22044
22171
|
const visibleCoordinatesData = calculateVisibleElementData(this.iFrame);
|
|
22045
22172
|
responder({ type: exports.EmbedEvent.RequestVisibleEmbedCoordinates, data: visibleCoordinatesData });
|
|
22046
22173
|
};
|
|
22047
|
-
this.HEIGHT_CHANAGE_THRESHOLD = 30;
|
|
22048
22174
|
/**
|
|
22049
22175
|
* Set the iframe height as per the computed height received
|
|
22050
22176
|
* from the ThoughtSpot app.
|
|
22051
22177
|
* @param data The event payload
|
|
22052
22178
|
*/
|
|
22053
22179
|
this.updateIFrameHeight = (data) => {
|
|
22054
|
-
|
|
22055
|
-
const heightToSet = Math.max(data.data, this.defaultHeight);
|
|
22056
|
-
const heightChange = Math.abs(heightToSet - currentHeight);
|
|
22057
|
-
if (heightChange < this.HEIGHT_CHANAGE_THRESHOLD) {
|
|
22058
|
-
logger$3.info('Height change is less than the threshold, skipping height update', { heightChange, heightToSet, currentHeight });
|
|
22059
|
-
return;
|
|
22060
|
-
}
|
|
22061
|
-
this.setIFrameHeight(heightToSet);
|
|
22180
|
+
this.setIFrameHeight(Math.max(data.data, this.defaultHeight));
|
|
22062
22181
|
this.sendFullHeightLazyLoadData();
|
|
22063
22182
|
};
|
|
22064
22183
|
this.embedIframeCenter = (data, responder) => {
|
|
@@ -22119,7 +22238,7 @@ query GetEurekaVizSnapshots(
|
|
|
22119
22238
|
getEmbedParamsObject() {
|
|
22120
22239
|
let params = {};
|
|
22121
22240
|
params = this.getBaseQueryParams(params);
|
|
22122
|
-
const { enableVizTransformations, fullHeight, defaultHeight, minimumHeight, visibleVizs, liveboardV2, vizId, hideTabPanel, activeTabId, hideLiveboardHeader, showLiveboardDescription, showLiveboardTitle, isLiveboardHeaderSticky = true, isLiveboardCompactHeaderEnabled = false, showLiveboardVerifiedBadge = true, showLiveboardReverifyBanner = true, hideIrrelevantChipsInLiveboardTabs = false, showMaskedFilterChip = false, isLiveboardMasterpiecesEnabled = false, isEnhancedFilterInteractivityEnabled = false, enableAskSage, enable2ColumnLayout, dataPanelV2 = true, enableCustomColumnGroups = false, oAuthPollingInterval, isForceRedirect, dataSourceId, coverAndFilterOptionInPDF = false, isLiveboardStylingAndGroupingEnabled, isPNGInScheduledEmailsEnabled = false, isLiveboardXLSXCSVDownloadEnabled = false, isGranularXLSXCSVSchedulesEnabled = false, showSpotterLimitations, isCentralizedLiveboardFilterUXEnabled = false, isLinkParametersEnabled, updatedSpotterChatPrompt, spotterChatConfig, isThisPeriodInDateFiltersEnabled, } = this.viewConfig;
|
|
22241
|
+
const { enableVizTransformations, fullHeight, defaultHeight, minimumHeight, visibleVizs, liveboardV2, vizId, hideTabPanel, activeTabId, hideLiveboardHeader, showLiveboardDescription, showLiveboardTitle, isLiveboardHeaderSticky = true, isLiveboardCompactHeaderEnabled = false, showLiveboardVerifiedBadge = true, showLiveboardReverifyBanner = true, hideIrrelevantChipsInLiveboardTabs = false, showMaskedFilterChip = false, isLiveboardMasterpiecesEnabled = false, isEnhancedFilterInteractivityEnabled = false, enableAskSage, enable2ColumnLayout, dataPanelV2 = true, enableCustomColumnGroups = false, oAuthPollingInterval, isForceRedirect, dataSourceId, coverAndFilterOptionInPDF = false, isLiveboardStylingAndGroupingEnabled, isPNGInScheduledEmailsEnabled = false, isLiveboardXLSXCSVDownloadEnabled = false, isGranularXLSXCSVSchedulesEnabled = false, showSpotterLimitations, isCentralizedLiveboardFilterUXEnabled = false, isLinkParametersEnabled, updatedSpotterChatPrompt, spotterChatConfig, isThisPeriodInDateFiltersEnabled, isContinuousLiveboardPDFEnabled, } = this.viewConfig;
|
|
22123
22242
|
const preventLiveboardFilterRemoval = this.viewConfig.preventLiveboardFilterRemoval
|
|
22124
22243
|
|| this.viewConfig.preventPinboardFilterRemoval;
|
|
22125
22244
|
if (fullHeight === true) {
|
|
@@ -22208,6 +22327,9 @@ query GetEurekaVizSnapshots(
|
|
|
22208
22327
|
if (isThisPeriodInDateFiltersEnabled !== undefined) {
|
|
22209
22328
|
params[Param.IsThisPeriodInDateFiltersEnabled] = isThisPeriodInDateFiltersEnabled;
|
|
22210
22329
|
}
|
|
22330
|
+
if (isContinuousLiveboardPDFEnabled !== undefined) {
|
|
22331
|
+
params[Param.IsWYSIWYGLiveboardPDFEnabled] = isContinuousLiveboardPDFEnabled;
|
|
22332
|
+
}
|
|
22211
22333
|
params[Param.LiveboardHeaderSticky] = isLiveboardHeaderSticky;
|
|
22212
22334
|
params[Param.LiveboardHeaderV2] = isLiveboardCompactHeaderEnabled;
|
|
22213
22335
|
params[Param.ShowLiveboardVerifiedBadge] = showLiveboardVerifiedBadge;
|
|
@@ -22955,14 +23077,24 @@ query SendMessage($params: Input_convassist_SendMessageRequest) {
|
|
|
22955
23077
|
super(container, viewConfig);
|
|
22956
23078
|
this.viewConfig = viewConfig;
|
|
22957
23079
|
}
|
|
23080
|
+
/**
|
|
23081
|
+
* Extends the default APP_INIT payload with `embedParams.spotterSidebarConfig`
|
|
23082
|
+
* so the conv-assist app can read sidebar configuration on initialisation.
|
|
23083
|
+
*
|
|
23084
|
+
* Precedence for `enablePastConversationsSidebar`:
|
|
23085
|
+
* `spotterSidebarConfig.enablePastConversationsSidebar` wins over the
|
|
23086
|
+
* deprecated top-level `enablePastConversationsSidebar` flag; if the former
|
|
23087
|
+
* is absent the latter is used as a fallback.
|
|
23088
|
+
*
|
|
23089
|
+
* An invalid `spotterDocumentationUrl` triggers a validation error and is
|
|
23090
|
+
* excluded from the payload rather than forwarded to the app.
|
|
23091
|
+
*/
|
|
23092
|
+
async getAppInitData() {
|
|
23093
|
+
const defaultAppInitData = await super.getAppInitData();
|
|
23094
|
+
return buildSpotterSidebarAppInitData(defaultAppInitData, this.viewConfig, this.handleError.bind(this));
|
|
23095
|
+
}
|
|
22958
23096
|
getEmbedParamsObject() {
|
|
22959
|
-
const { worksheetId, searchOptions, disableSourceSelection, hideSourceSelection, dataPanelV2, showSpotterLimitations, hideSampleQuestions, runtimeFilters, excludeRuntimeFiltersfromURL, runtimeParameters, excludeRuntimeParametersfromURL, updatedSpotterChatPrompt,
|
|
22960
|
-
// Extract sidebar config properties
|
|
22961
|
-
const { enablePastConversationsSidebar: sidebarEnablePastConversationsSidebar, spotterSidebarTitle, spotterSidebarDefaultExpanded, spotterChatRenameLabel, spotterChatDeleteLabel, spotterDeleteConversationModalTitle, spotterPastConversationAlertMessage, spotterDocumentationUrl, spotterBestPracticesLabel, spotterConversationsBatchSize, spotterNewChatButtonTitle, } = spotterSidebarConfig || {};
|
|
22962
|
-
const resolvedEnablePastConversationsSidebar = resolveEnablePastConversationsSidebar({
|
|
22963
|
-
spotterSidebarConfigValue: sidebarEnablePastConversationsSidebar,
|
|
22964
|
-
standaloneValue: this.viewConfig.enablePastConversationsSidebar,
|
|
22965
|
-
});
|
|
23097
|
+
const { worksheetId, searchOptions, disableSourceSelection, hideSourceSelection, dataPanelV2, showSpotterLimitations, hideSampleQuestions, runtimeFilters, excludeRuntimeFiltersfromURL, runtimeParameters, excludeRuntimeParametersfromURL, updatedSpotterChatPrompt, spotterChatConfig, } = this.viewConfig;
|
|
22966
23098
|
if (!worksheetId) {
|
|
22967
23099
|
this.handleError({
|
|
22968
23100
|
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
@@ -22980,32 +23112,6 @@ query SendMessage($params: Input_convassist_SendMessageRequest) {
|
|
|
22980
23112
|
setParamIfDefined(queryParams, Param.ShowSpotterLimitations, showSpotterLimitations, true);
|
|
22981
23113
|
setParamIfDefined(queryParams, Param.HideSampleQuestions, hideSampleQuestions, true);
|
|
22982
23114
|
setParamIfDefined(queryParams, Param.UpdatedSpotterChatPrompt, updatedSpotterChatPrompt, true);
|
|
22983
|
-
setParamIfDefined(queryParams, Param.EnablePastConversationsSidebar, resolvedEnablePastConversationsSidebar, true);
|
|
22984
|
-
setParamIfDefined(queryParams, Param.SpotterSidebarDefaultExpanded, spotterSidebarDefaultExpanded, true);
|
|
22985
|
-
// String params
|
|
22986
|
-
setParamIfDefined(queryParams, Param.SpotterSidebarTitle, spotterSidebarTitle);
|
|
22987
|
-
setParamIfDefined(queryParams, Param.SpotterChatRenameLabel, spotterChatRenameLabel);
|
|
22988
|
-
setParamIfDefined(queryParams, Param.SpotterChatDeleteLabel, spotterChatDeleteLabel);
|
|
22989
|
-
setParamIfDefined(queryParams, Param.SpotterDeleteConversationModalTitle, spotterDeleteConversationModalTitle);
|
|
22990
|
-
setParamIfDefined(queryParams, Param.SpotterPastConversationAlertMessage, spotterPastConversationAlertMessage);
|
|
22991
|
-
setParamIfDefined(queryParams, Param.SpotterBestPracticesLabel, spotterBestPracticesLabel);
|
|
22992
|
-
setParamIfDefined(queryParams, Param.SpotterConversationsBatchSize, spotterConversationsBatchSize);
|
|
22993
|
-
setParamIfDefined(queryParams, Param.SpotterNewChatButtonTitle, spotterNewChatButtonTitle);
|
|
22994
|
-
// URL param with validation
|
|
22995
|
-
if (spotterDocumentationUrl !== undefined) {
|
|
22996
|
-
const [isValid, validationError] = validateHttpUrl(spotterDocumentationUrl);
|
|
22997
|
-
if (isValid) {
|
|
22998
|
-
queryParams[Param.SpotterDocumentationUrl] = spotterDocumentationUrl;
|
|
22999
|
-
}
|
|
23000
|
-
else {
|
|
23001
|
-
this.handleError({
|
|
23002
|
-
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
23003
|
-
message: ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
|
|
23004
|
-
code: EmbedErrorCodes.INVALID_URL,
|
|
23005
|
-
error: (validationError === null || validationError === void 0 ? void 0 : validationError.message) || ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
|
|
23006
|
-
});
|
|
23007
|
-
}
|
|
23008
|
-
}
|
|
23009
23115
|
// Handle spotterChatConfig params
|
|
23010
23116
|
if (spotterChatConfig) {
|
|
23011
23117
|
const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, } = spotterChatConfig;
|
|
@@ -23255,38 +23361,6 @@ query SendMessage($params: Input_convassist_SendMessageRequest) {
|
|
|
23255
23361
|
* ```
|
|
23256
23362
|
*/
|
|
23257
23363
|
const PreRenderedSearchBarEmbed = componentFactory(SearchBarEmbed$1, true);
|
|
23258
|
-
/**
|
|
23259
|
-
* React component for LLM based search Sage embed.
|
|
23260
|
-
* @example
|
|
23261
|
-
* ```tsx
|
|
23262
|
-
* function Sage() {
|
|
23263
|
-
* return <SageEmbed
|
|
23264
|
-
* showObjectResults={true}
|
|
23265
|
-
* ... other view config props or event listeners.
|
|
23266
|
-
* />
|
|
23267
|
-
* }
|
|
23268
|
-
* ```
|
|
23269
|
-
*/
|
|
23270
|
-
const SageEmbed = componentFactory(SageEmbed$1);
|
|
23271
|
-
/**
|
|
23272
|
-
* React component for PreRendered Sage embed.
|
|
23273
|
-
*
|
|
23274
|
-
* PreRenderedSageEmbed will preRender the SageEmbed and will be hidden by
|
|
23275
|
-
* default.
|
|
23276
|
-
*
|
|
23277
|
-
* SageEmbed with preRenderId passed will call showPreRender on the embed.
|
|
23278
|
-
* @example
|
|
23279
|
-
* ```tsx
|
|
23280
|
-
* function LandingPageComponent() {
|
|
23281
|
-
* return <PreRenderedSageEmbed preRenderId="someId" showObjectResults={true} />
|
|
23282
|
-
* }
|
|
23283
|
-
* ```
|
|
23284
|
-
* function MyComponent() {
|
|
23285
|
-
* return <SageEmbed preRenderId="someId" showObjectResults={true} />
|
|
23286
|
-
* }
|
|
23287
|
-
* ```
|
|
23288
|
-
*/
|
|
23289
|
-
const PreRenderedSageEmbed = componentFactory(SageEmbed$1, true);
|
|
23290
23364
|
/**
|
|
23291
23365
|
* React component for LLM based conversation BI.
|
|
23292
23366
|
* @example
|
|
@@ -30878,10 +30952,8 @@ query SendMessage($params: Input_convassist_SendMessageRequest) {
|
|
|
30878
30952
|
exports.PreRenderedConversationEmbed = PreRenderedConversationEmbed;
|
|
30879
30953
|
exports.PreRenderedLiveboardEmbed = PreRenderedLiveboardEmbed;
|
|
30880
30954
|
exports.PreRenderedPinboardEmbed = PreRenderedPinboardEmbed;
|
|
30881
|
-
exports.PreRenderedSageEmbed = PreRenderedSageEmbed;
|
|
30882
30955
|
exports.PreRenderedSearchBarEmbed = PreRenderedSearchBarEmbed;
|
|
30883
30956
|
exports.PreRenderedSearchEmbed = PreRenderedSearchEmbed;
|
|
30884
|
-
exports.SageEmbed = SageEmbed;
|
|
30885
30957
|
exports.SearchBarEmbed = SearchBarEmbed;
|
|
30886
30958
|
exports.SearchEmbed = SearchEmbed;
|
|
30887
30959
|
exports.SpotterEmbed = SpotterEmbed;
|