@thoughtspot/visual-embed-sdk 1.46.1 → 1.46.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/package.json +1 -1
- package/cjs/src/auth.d.ts +29 -4
- package/cjs/src/auth.d.ts.map +1 -1
- package/cjs/src/auth.js +29 -7
- package/cjs/src/auth.js.map +1 -1
- package/cjs/src/auth.spec.js +1 -3
- package/cjs/src/auth.spec.js.map +1 -1
- package/cjs/src/authToken.js +0 -1
- package/cjs/src/authToken.js.map +1 -1
- package/cjs/src/authToken.spec.js +2 -1
- package/cjs/src/authToken.spec.js.map +1 -1
- package/cjs/src/css-variables.d.ts +17 -17
- package/cjs/src/embed/app.d.ts +62 -33
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +10 -3
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +34 -1
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.d.ts +41 -0
- package/cjs/src/embed/auto-frame-renderer.d.ts.map +1 -0
- package/cjs/src/embed/auto-frame-renderer.js +145 -0
- package/cjs/src/embed/auto-frame-renderer.js.map +1 -0
- package/cjs/src/embed/auto-frame-renderer.spec.d.ts +2 -0
- package/cjs/src/embed/auto-frame-renderer.spec.d.ts.map +1 -0
- package/cjs/src/embed/auto-frame-renderer.spec.js +195 -0
- package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -0
- package/cjs/src/embed/base.d.ts +2 -2
- package/cjs/src/embed/base.d.ts.map +1 -1
- package/cjs/src/embed/base.js +6 -9
- package/cjs/src/embed/base.js.map +1 -1
- package/cjs/src/embed/bodyless-conversation.d.ts +5 -5
- package/cjs/src/embed/bodyless-conversation.js +4 -4
- package/cjs/src/embed/conversation.d.ts +43 -30
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +10 -11
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +27 -0
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.js +0 -2
- package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +42 -35
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +6 -4
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +5 -3
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/sage.d.ts +5 -5
- package/cjs/src/embed/sage.js +1 -2
- package/cjs/src/embed/sage.js.map +1 -1
- package/cjs/src/embed/search-bar.d.ts +7 -7
- package/cjs/src/embed/search-bar.js +1 -1
- package/cjs/src/embed/search.d.ts +13 -12
- package/cjs/src/embed/search.d.ts.map +1 -1
- package/cjs/src/embed/search.js.map +1 -1
- package/cjs/src/embed/search.spec.js +0 -2
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +3 -3
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +15 -9
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +37 -1
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/index.d.ts +3 -2
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +3 -1
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/react/index.d.ts +15 -15
- package/cjs/src/react/index.js +12 -13
- package/cjs/src/react/index.js.map +1 -1
- package/cjs/src/react/index.spec.js +6 -3
- package/cjs/src/react/index.spec.js.map +1 -1
- package/cjs/src/tokenizedFetch.d.ts +1 -1
- package/cjs/src/tokenizedFetch.js +1 -1
- package/cjs/src/types.d.ts +350 -287
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +240 -218
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.d.ts +9 -6
- package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.js +13 -15
- package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.spec.js +55 -0
- package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/cjs/src/utils/graphql/preview-service.js +0 -1
- package/cjs/src/utils/graphql/preview-service.js.map +1 -1
- package/cjs/src/utils/processData.js +0 -5
- package/cjs/src/utils/processData.js.map +1 -1
- package/cjs/src/utils.d.ts +9 -0
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +10 -1
- package/cjs/src/utils.js.map +1 -1
- package/dist/{index-Vyh6Ha5f.js → index-DyX-x6uN.js} +1 -1
- package/dist/src/auth.d.ts +29 -4
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/css-variables.d.ts +17 -17
- package/dist/src/embed/app.d.ts +62 -33
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/auto-frame-renderer.d.ts +41 -0
- package/dist/src/embed/auto-frame-renderer.d.ts.map +1 -0
- package/dist/src/embed/auto-frame-renderer.spec.d.ts +2 -0
- package/dist/src/embed/auto-frame-renderer.spec.d.ts.map +1 -0
- package/dist/src/embed/base.d.ts +2 -2
- package/dist/src/embed/base.d.ts.map +1 -1
- package/dist/src/embed/bodyless-conversation.d.ts +5 -5
- package/dist/src/embed/conversation.d.ts +43 -30
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +42 -35
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/sage.d.ts +5 -5
- package/dist/src/embed/search-bar.d.ts +7 -7
- package/dist/src/embed/search.d.ts +13 -12
- package/dist/src/embed/search.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +3 -3
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/react/index.d.ts +15 -15
- package/dist/src/tokenizedFetch.d.ts +1 -1
- package/dist/src/types.d.ts +350 -287
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/graphql/answerService/answerService.d.ts +9 -6
- package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/dist/src/utils.d.ts +9 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +359 -329
- package/dist/tsembed-react.js +358 -328
- package/dist/tsembed.es.js +490 -321
- package/dist/tsembed.js +489 -319
- package/dist/visual-embed-sdk-react-full.d.ts +574 -442
- package/dist/visual-embed-sdk-react.d.ts +572 -440
- package/dist/visual-embed-sdk.d.ts +622 -446
- package/lib/package.json +1 -1
- package/lib/src/auth.d.ts +29 -4
- package/lib/src/auth.d.ts.map +1 -1
- package/lib/src/auth.js +29 -7
- package/lib/src/auth.js.map +1 -1
- package/lib/src/auth.spec.js +1 -3
- package/lib/src/auth.spec.js.map +1 -1
- package/lib/src/authToken.js +0 -1
- package/lib/src/authToken.js.map +1 -1
- package/lib/src/authToken.spec.js +2 -1
- package/lib/src/authToken.spec.js.map +1 -1
- package/lib/src/css-variables.d.ts +17 -17
- package/lib/src/embed/app.d.ts +62 -33
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +11 -4
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +34 -1
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.d.ts +41 -0
- package/lib/src/embed/auto-frame-renderer.d.ts.map +1 -0
- package/lib/src/embed/auto-frame-renderer.js +141 -0
- package/lib/src/embed/auto-frame-renderer.js.map +1 -0
- package/lib/src/embed/auto-frame-renderer.spec.d.ts +2 -0
- package/lib/src/embed/auto-frame-renderer.spec.d.ts.map +1 -0
- package/lib/src/embed/auto-frame-renderer.spec.js +192 -0
- package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -0
- package/lib/src/embed/base.d.ts +2 -2
- package/lib/src/embed/base.d.ts.map +1 -1
- package/lib/src/embed/base.js +6 -9
- package/lib/src/embed/base.js.map +1 -1
- package/lib/src/embed/bodyless-conversation.d.ts +5 -5
- package/lib/src/embed/bodyless-conversation.js +4 -4
- package/lib/src/embed/conversation.d.ts +43 -30
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +11 -11
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +27 -0
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.js +0 -2
- package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +42 -35
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +6 -4
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +5 -3
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/sage.d.ts +5 -5
- package/lib/src/embed/sage.js +1 -2
- package/lib/src/embed/sage.js.map +1 -1
- package/lib/src/embed/search-bar.d.ts +7 -7
- package/lib/src/embed/search-bar.js +1 -1
- package/lib/src/embed/search.d.ts +13 -12
- package/lib/src/embed/search.d.ts.map +1 -1
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/search.spec.js +0 -2
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +3 -3
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +15 -9
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +37 -1
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/index.d.ts +3 -2
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +1 -0
- package/lib/src/index.js.map +1 -1
- package/lib/src/react/index.d.ts +15 -15
- package/lib/src/react/index.js +12 -13
- package/lib/src/react/index.js.map +1 -1
- package/lib/src/react/index.spec.js +6 -3
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/tokenizedFetch.d.ts +1 -1
- package/lib/src/tokenizedFetch.js +1 -1
- package/lib/src/types.d.ts +350 -287
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +240 -218
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.d.ts +9 -6
- package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.js +12 -14
- package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.spec.js +55 -0
- package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/lib/src/utils/graphql/preview-service.js +0 -1
- package/lib/src/utils/graphql/preview-service.js.map +1 -1
- package/lib/src/utils/processData.js +0 -5
- package/lib/src/utils/processData.js.map +1 -1
- package/lib/src/utils.d.ts +9 -0
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +8 -0
- package/lib/src/utils.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +11466 -0
- package/package.json +1 -1
- package/src/auth.spec.ts +1 -1
- package/src/auth.ts +32 -7
- package/src/authToken.spec.ts +2 -1
- package/src/authToken.ts +1 -1
- package/src/css-variables.ts +17 -17
- package/src/embed/app.spec.ts +46 -1
- package/src/embed/app.ts +74 -36
- package/src/embed/auto-frame-renderer.spec.ts +266 -0
- package/src/embed/auto-frame-renderer.ts +152 -0
- package/src/embed/base.spec.ts +1 -1
- package/src/embed/base.ts +9 -10
- package/src/embed/bodyless-conversation.ts +5 -5
- package/src/embed/conversation.spec.ts +37 -0
- package/src/embed/conversation.ts +55 -38
- package/src/embed/hostEventClient/host-event-client.ts +2 -2
- package/src/embed/liveboard.spec.ts +5 -3
- package/src/embed/liveboard.ts +47 -38
- package/src/embed/sage.ts +6 -6
- package/src/embed/search-bar.tsx +7 -7
- package/src/embed/search.spec.ts +2 -2
- package/src/embed/search.ts +13 -12
- package/src/embed/ts-embed.spec.ts +44 -1
- package/src/embed/ts-embed.ts +14 -9
- package/src/index.ts +3 -0
- package/src/react/index.spec.tsx +6 -3
- package/src/react/index.tsx +16 -16
- package/src/tokenizedFetch.ts +1 -1
- package/src/types.ts +350 -286
- package/src/utils/graphql/answerService/answerService.spec.ts +62 -0
- package/src/utils/graphql/answerService/answerService.ts +14 -10
- package/src/utils/graphql/preview-service.ts +1 -1
- package/src/utils/processData.ts +5 -5
- package/src/utils.ts +14 -0
package/src/embed/app.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { logger } from '../utils/logger';
|
|
12
|
-
import { calculateVisibleElementData, getQueryParamString, isUndefined, isValidCssMargin, setParamIfDefined, validateHttpUrl } from '../utils';
|
|
12
|
+
import { calculateVisibleElementData, getQueryParamString, isUndefined, isValidCssMargin, setParamIfDefined, validateHttpUrl, resolveEnablePastConversationsSidebar } from '../utils';
|
|
13
13
|
import {
|
|
14
14
|
Param,
|
|
15
15
|
DOMSelector,
|
|
@@ -140,7 +140,7 @@ export enum ListPage {
|
|
|
140
140
|
*/
|
|
141
141
|
export interface DiscoveryExperience {
|
|
142
142
|
/**
|
|
143
|
-
* primaryNavbarVersion determines the version of the navigation
|
|
143
|
+
* primaryNavbarVersion determines the version of the primary navigation bar.
|
|
144
144
|
*/
|
|
145
145
|
primaryNavbarVersion?: PrimaryNavbarVersion;
|
|
146
146
|
/**
|
|
@@ -164,8 +164,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
164
164
|
* This flag also controls the homepage left navigation bar.
|
|
165
165
|
*
|
|
166
166
|
* Supported embed types: `AppEmbed`
|
|
167
|
-
* @default true
|
|
168
167
|
* @version SDK: 1.2.0 | ThoughtSpot: 8.4.0.cl
|
|
168
|
+
* @default true
|
|
169
169
|
* @example
|
|
170
170
|
* ```js
|
|
171
171
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -186,8 +186,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
186
186
|
* **Note**: This attribute is not supported in the classic (V1) experience.
|
|
187
187
|
*
|
|
188
188
|
* Supported embed types: `AppEmbed`
|
|
189
|
-
* @default false
|
|
190
189
|
* @version SDK: 1.28.0 | ThoughtSpot: 9.12.5.cl
|
|
190
|
+
* @default false
|
|
191
191
|
* @example
|
|
192
192
|
* ```js
|
|
193
193
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -204,8 +204,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
204
204
|
* navigation bar is not hidden via `showPrimaryNavbar`.
|
|
205
205
|
*
|
|
206
206
|
* Supported embed types: `AppEmbed`
|
|
207
|
-
* @default false
|
|
208
207
|
* @version SDK: 1.2.0 | ThoughtSpot: 8.4.0.cl
|
|
208
|
+
* @default false
|
|
209
209
|
* @example
|
|
210
210
|
* ```js
|
|
211
211
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -216,12 +216,12 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
216
216
|
*/
|
|
217
217
|
disableProfileAndHelp?: boolean;
|
|
218
218
|
/**
|
|
219
|
-
* @version SDK: 1.36.3 | ThoughtSpot: 10.1.0.cl
|
|
220
|
-
* @default true
|
|
221
219
|
* Whether the help menu in the top navigation bar should be served
|
|
222
220
|
* from Pendo or ThoughtSpot's internal help items.
|
|
223
221
|
*
|
|
224
222
|
* Supported embed types: `AppEmbed`
|
|
223
|
+
* @version SDK: 1.36.3 | ThoughtSpot: 10.1.0.cl
|
|
224
|
+
* @default true
|
|
225
225
|
* @example
|
|
226
226
|
* ```js
|
|
227
227
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -236,8 +236,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
236
236
|
* the top navigation bar in the V3 navigation experience.
|
|
237
237
|
*
|
|
238
238
|
* Supported embed types: `AppEmbed`
|
|
239
|
-
* @default false
|
|
240
239
|
* @version SDK: 1.40.0 | ThoughtSpot: 10.11.0.cl
|
|
240
|
+
* @default false
|
|
241
241
|
* @example
|
|
242
242
|
* ```js
|
|
243
243
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -256,8 +256,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
256
256
|
* in the classic (V1) experience.
|
|
257
257
|
*
|
|
258
258
|
* Supported embed types: `AppEmbed`
|
|
259
|
-
* @default true
|
|
260
259
|
* @version SDK: 1.40.0 | ThoughtSpot: 10.11.0.cl
|
|
260
|
+
* @default true
|
|
261
261
|
* @example
|
|
262
262
|
* ```js
|
|
263
263
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -275,8 +275,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
275
275
|
* in the classic (V1) and V2 experience modes.
|
|
276
276
|
*
|
|
277
277
|
* Supported embed types: `AppEmbed`
|
|
278
|
-
* @default true
|
|
279
278
|
* @version SDK: 1.40.0 | ThoughtSpot: 10.11.0.cl
|
|
279
|
+
* @default true
|
|
280
280
|
* @example
|
|
281
281
|
* ```js
|
|
282
282
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -292,7 +292,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
292
292
|
* In the V3 experience, it shows or hides application selection
|
|
293
293
|
* icons on the left navigation panel.
|
|
294
294
|
* By default, the application selection menu and icons are
|
|
295
|
-
* shown in the UI
|
|
295
|
+
* shown in the UI.
|
|
296
296
|
*
|
|
297
297
|
* **Note**: This attribute is not supported in the classic (V1) experience.
|
|
298
298
|
*
|
|
@@ -332,7 +332,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
332
332
|
* takes precedence. This is the path post the `#/` in the URL of the standalone
|
|
333
333
|
* ThoughtSpot app. Use this to open the embedded view to a specific path.
|
|
334
334
|
*
|
|
335
|
-
* For
|
|
335
|
+
* For example, if you want the component to open to a specific Liveboard
|
|
336
336
|
* you could set the path to `pinboard/<liveboardId>/tab/<tabId>`.
|
|
337
337
|
*
|
|
338
338
|
* Supported embed types: `AppEmbed`
|
|
@@ -350,7 +350,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
350
350
|
* The application page to set as the start page
|
|
351
351
|
* in the embedded view.
|
|
352
352
|
*
|
|
353
|
-
* Use this to open to particular page in the app. To open to a specific
|
|
353
|
+
* Use this to open to a particular page in the app. To open to a specific
|
|
354
354
|
* path within the app, use the `path` attribute which is more flexible.
|
|
355
355
|
*
|
|
356
356
|
* Supported embed types: `AppEmbed`
|
|
@@ -430,8 +430,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
430
430
|
* If set to true, the Search Assist feature is enabled.
|
|
431
431
|
*
|
|
432
432
|
* Supported embed types: `AppEmbed`
|
|
433
|
-
* @default true
|
|
434
433
|
* @version SDK: 1.13.0 | ThoughtSpot: 8.5.0.cl, 8.8.1-sw
|
|
434
|
+
* @default true
|
|
435
435
|
* @example
|
|
436
436
|
* ```js
|
|
437
437
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -469,8 +469,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
469
469
|
* For more information,
|
|
470
470
|
* see link:https://developers.thoughtspot.com/docs/full-app-customize[full app embed documentation].
|
|
471
471
|
* Supported embed types: `AppEmbed`
|
|
472
|
-
* @default false
|
|
473
472
|
* @version SDK: 1.28.0 | ThoughtSpot: 9.12.5.cl
|
|
473
|
+
* @default false
|
|
474
474
|
* @example
|
|
475
475
|
* ```js
|
|
476
476
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -485,8 +485,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
485
485
|
* For more information, see
|
|
486
486
|
* link:https://developers.thoughtspot.com/docs/full-app-customize[full app embed documentation].
|
|
487
487
|
* Supported embed types: `AppEmbed`
|
|
488
|
-
* @default false
|
|
489
488
|
* @version SDK: 1.40.0 | ThoughtSpot: 10.11.0.cl
|
|
489
|
+
* @default false
|
|
490
490
|
* @example
|
|
491
491
|
* ```js
|
|
492
492
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -501,10 +501,10 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
501
501
|
*/
|
|
502
502
|
discoveryExperience?: DiscoveryExperience;
|
|
503
503
|
/**
|
|
504
|
-
* To set the initial state of the search bar in case of saved-answers.
|
|
504
|
+
* To set the initial state of the search bar in case of saved-answers. Use {@link collapseSearchBar} instead.
|
|
505
505
|
* @version SDK: 1.32.0 | ThoughtSpot: 10.0.0.cl
|
|
506
|
+
* @deprecated This flag is deprecated.
|
|
506
507
|
* @default false
|
|
507
|
-
* @deprecated Use {@link collapseSearchBar} instead
|
|
508
508
|
*/
|
|
509
509
|
collapseSearchBarInitially?: boolean;
|
|
510
510
|
/**
|
|
@@ -532,14 +532,14 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
532
532
|
* Flag to use home page search bar mode
|
|
533
533
|
*
|
|
534
534
|
* Supported embed types: `AppEmbed`
|
|
535
|
-
* @version SDK
|
|
535
|
+
* @version SDK: 1.33.0 | ThoughtSpot: 10.3.0.cl
|
|
536
536
|
*/
|
|
537
537
|
homePageSearchBarMode?: HomePageSearchBarMode;
|
|
538
538
|
/**
|
|
539
539
|
* This flag is used to enable unified search experience for full app embed.
|
|
540
540
|
*
|
|
541
541
|
* Supported embed types: `AppEmbed`
|
|
542
|
-
* @version SDK: 1.34.0 | ThoughtSpot:10.5.0.cl
|
|
542
|
+
* @version SDK: 1.34.0 | ThoughtSpot: 10.5.0.cl
|
|
543
543
|
* @default true
|
|
544
544
|
* @example
|
|
545
545
|
* ```js
|
|
@@ -552,7 +552,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
552
552
|
isUnifiedSearchExperienceEnabled?: boolean;
|
|
553
553
|
|
|
554
554
|
/**
|
|
555
|
-
* This flag is used to enable/disable the styling and grouping in a Liveboard
|
|
555
|
+
* This flag is used to enable/disable the styling and grouping in a Liveboard. Use {@link isLiveboardMasterpiecesEnabled} instead.
|
|
556
|
+
* @deprecated This flag is deprecated.
|
|
556
557
|
*
|
|
557
558
|
* Supported embed types: `AppEmbed`, `LiveboardEmbed`
|
|
558
559
|
* @type {boolean}
|
|
@@ -569,7 +570,8 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
569
570
|
isLiveboardStylingAndGroupingEnabled?: boolean;
|
|
570
571
|
|
|
571
572
|
/**
|
|
572
|
-
* This flag is used to enable/disable the png embedding of liveboard in scheduled
|
|
573
|
+
* This flag is used to enable/disable the png embedding of liveboard in scheduled
|
|
574
|
+
* mails
|
|
573
575
|
*
|
|
574
576
|
* Supported embed types: `AppEmbed`, `LiveboardEmbed`
|
|
575
577
|
* @type {boolean}
|
|
@@ -622,6 +624,9 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
622
624
|
/**
|
|
623
625
|
* This flag is used to enable the full height lazy load data.
|
|
624
626
|
*
|
|
627
|
+
* @type {boolean}
|
|
628
|
+
* @version SDK: 1.40.0 | ThoughtSpot: 10.12.0.cl
|
|
629
|
+
* @default false
|
|
625
630
|
* @example
|
|
626
631
|
* ```js
|
|
627
632
|
* const embed = new AppEmbed('#embed-container', {
|
|
@@ -630,10 +635,6 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
630
635
|
* lazyLoadingForFullHeight: true,
|
|
631
636
|
* })
|
|
632
637
|
* ```
|
|
633
|
-
*
|
|
634
|
-
* @type {boolean}
|
|
635
|
-
* @default false
|
|
636
|
-
* @version SDK: 1.40.0 | ThoughtSpot:10.12.0.cl
|
|
637
638
|
*/
|
|
638
639
|
lazyLoadingForFullHeight?: boolean;
|
|
639
640
|
|
|
@@ -641,23 +642,23 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
641
642
|
* The margin to be used for lazy loading.
|
|
642
643
|
*
|
|
643
644
|
* For example, if the margin is set to '10px',
|
|
644
|
-
* the visualization will be loaded 10px before
|
|
645
|
+
* the visualization will be loaded 10px before its top edge is visible in the
|
|
645
646
|
* viewport.
|
|
646
647
|
*
|
|
647
648
|
* The format is similar to CSS margin.
|
|
648
649
|
*
|
|
650
|
+
* @type {string}
|
|
651
|
+
* @version SDK: 1.40.0 | ThoughtSpot: 10.12.0.cl
|
|
649
652
|
* @example
|
|
650
653
|
* ```js
|
|
651
654
|
* const embed = new AppEmbed('#embed-container', {
|
|
652
655
|
* // ...other options
|
|
653
656
|
* fullHeight: true,
|
|
654
657
|
* lazyLoadingForFullHeight: true,
|
|
655
|
-
* // Using 0px, the visualization will be only loaded when
|
|
658
|
+
* // Using 0px, the visualization will be only loaded when it's visible in the viewport.
|
|
656
659
|
* lazyLoadingMargin: '0px',
|
|
657
660
|
* })
|
|
658
661
|
* ```
|
|
659
|
-
* @type {string}
|
|
660
|
-
* @version SDK: 1.40.0 | ThoughtSpot:10.12.0.cl
|
|
661
662
|
*/
|
|
662
663
|
lazyLoadingMargin?: string;
|
|
663
664
|
|
|
@@ -665,6 +666,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
665
666
|
* updatedSpotterChatPrompt : Controls the updated spotter chat prompt.
|
|
666
667
|
*
|
|
667
668
|
* Supported embed types: `AppEmbed`
|
|
669
|
+
* @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
|
|
668
670
|
* @default false
|
|
669
671
|
* @example
|
|
670
672
|
* ```js
|
|
@@ -673,25 +675,36 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
673
675
|
* updatedSpotterChatPrompt : true,
|
|
674
676
|
* })
|
|
675
677
|
* ```
|
|
676
|
-
* @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
|
|
677
678
|
*/
|
|
678
679
|
updatedSpotterChatPrompt?: boolean;
|
|
680
|
+
/**
|
|
681
|
+
* Controls the visibility of the past conversations sidebar.
|
|
682
|
+
*
|
|
683
|
+
* Supported embed types: `AppEmbed`
|
|
684
|
+
* @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
|
|
685
|
+
* @deprecated from SDK: 1.47.0 | ThoughtSpot: 26.4.0.cl
|
|
686
|
+
* Use `spotterSidebarConfig.enablePastConversationsSidebar`.
|
|
687
|
+
* @default false
|
|
688
|
+
*/
|
|
689
|
+
enablePastConversationsSidebar?: boolean;
|
|
679
690
|
/**
|
|
680
691
|
* Configuration for the Spotter sidebar UI customization.
|
|
681
692
|
* Only applicable when navigating to Spotter within the app.
|
|
682
693
|
*
|
|
683
694
|
* Supported embed types: `AppEmbed`
|
|
695
|
+
* @version SDK: 1.47.0 | ThoughtSpot: 26.4.0.cl
|
|
684
696
|
* @example
|
|
685
697
|
* ```js
|
|
686
698
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
687
|
-
*
|
|
699
|
+
* // Deprecated standalone flag (backward compatibility)
|
|
700
|
+
* enablePastConversationsSidebar: false,
|
|
701
|
+
* // Recommended config; this value takes precedence
|
|
688
702
|
* spotterSidebarConfig: {
|
|
689
703
|
* enablePastConversationsSidebar: true,
|
|
690
704
|
* spotterSidebarTitle: 'My Conversations',
|
|
691
705
|
* },
|
|
692
706
|
* })
|
|
693
707
|
* ```
|
|
694
|
-
* @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
|
|
695
708
|
*/
|
|
696
709
|
spotterSidebarConfig?: SpotterSidebarViewConfig;
|
|
697
710
|
/**
|
|
@@ -699,6 +712,7 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
699
712
|
* branding in tool response cards.
|
|
700
713
|
*
|
|
701
714
|
* Supported embed types: `AppEmbed`
|
|
715
|
+
* @version SDK: 1.46.0 | ThoughtSpot: 26.4.0.cl
|
|
702
716
|
* @example
|
|
703
717
|
* ```js
|
|
704
718
|
* const embed = new AppEmbed('#tsEmbed', {
|
|
@@ -709,7 +723,6 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
709
723
|
* },
|
|
710
724
|
* })
|
|
711
725
|
* ```
|
|
712
|
-
* @version SDK: 1.46.0 | ThoughtSpot: 26.4.0.cl
|
|
713
726
|
*/
|
|
714
727
|
spotterChatConfig?: SpotterChatViewConfig;
|
|
715
728
|
/**
|
|
@@ -729,6 +742,22 @@ export interface AppViewConfig extends AllEmbedViewConfig {
|
|
|
729
742
|
* ```
|
|
730
743
|
*/
|
|
731
744
|
minimumHeight?: number;
|
|
745
|
+
/**
|
|
746
|
+
* To enable the homepage announcement banner.
|
|
747
|
+
* Controls the visibility of the announcement section
|
|
748
|
+
* on the homepage.
|
|
749
|
+
*
|
|
750
|
+
* Supported embed types: `AppEmbed`
|
|
751
|
+
* @example
|
|
752
|
+
* ```js
|
|
753
|
+
* const embed = new AppEmbed('#tsEmbed', {
|
|
754
|
+
* ... // other embed view config
|
|
755
|
+
* enableHomepageAnnouncement: true,
|
|
756
|
+
* })
|
|
757
|
+
* ```
|
|
758
|
+
* @version SDK: 1.48.0 | ThoughtSpot: 26.5.0.cl
|
|
759
|
+
*/
|
|
760
|
+
enableHomepageAnnouncement?: boolean;
|
|
732
761
|
}
|
|
733
762
|
|
|
734
763
|
/**
|
|
@@ -809,6 +838,7 @@ export class AppEmbed extends V1Embed {
|
|
|
809
838
|
spotterChatConfig,
|
|
810
839
|
minimumHeight,
|
|
811
840
|
isThisPeriodInDateFiltersEnabled,
|
|
841
|
+
enableHomepageAnnouncement,
|
|
812
842
|
} = this.viewConfig;
|
|
813
843
|
|
|
814
844
|
let params: any = {};
|
|
@@ -837,10 +867,15 @@ export class AppEmbed extends V1Embed {
|
|
|
837
867
|
params[Param.UpdatedSpotterChatPrompt] = !!updatedSpotterChatPrompt;
|
|
838
868
|
}
|
|
839
869
|
|
|
870
|
+
const resolvedEnablePastConversationsSidebar = resolveEnablePastConversationsSidebar({
|
|
871
|
+
spotterSidebarConfigValue: spotterSidebarConfig?.enablePastConversationsSidebar,
|
|
872
|
+
standaloneValue: this.viewConfig.enablePastConversationsSidebar,
|
|
873
|
+
});
|
|
874
|
+
setParamIfDefined(params, Param.EnablePastConversationsSidebar, resolvedEnablePastConversationsSidebar, true);
|
|
875
|
+
|
|
840
876
|
// Handle spotterSidebarConfig params
|
|
841
877
|
if (spotterSidebarConfig) {
|
|
842
878
|
const {
|
|
843
|
-
enablePastConversationsSidebar,
|
|
844
879
|
spotterSidebarTitle,
|
|
845
880
|
spotterSidebarDefaultExpanded,
|
|
846
881
|
spotterChatRenameLabel,
|
|
@@ -853,7 +888,6 @@ export class AppEmbed extends V1Embed {
|
|
|
853
888
|
spotterNewChatButtonTitle,
|
|
854
889
|
} = spotterSidebarConfig;
|
|
855
890
|
|
|
856
|
-
setParamIfDefined(params, Param.EnablePastConversationsSidebar, enablePastConversationsSidebar, true);
|
|
857
891
|
setParamIfDefined(params, Param.SpotterSidebarDefaultExpanded, spotterSidebarDefaultExpanded, true);
|
|
858
892
|
setParamIfDefined(params, Param.SpotterSidebarTitle, spotterSidebarTitle);
|
|
859
893
|
setParamIfDefined(params, Param.SpotterChatRenameLabel, spotterChatRenameLabel);
|
|
@@ -979,6 +1013,10 @@ export class AppEmbed extends V1Embed {
|
|
|
979
1013
|
params[Param.IsThisPeriodInDateFiltersEnabled] = isThisPeriodInDateFiltersEnabled;
|
|
980
1014
|
}
|
|
981
1015
|
|
|
1016
|
+
if (enableHomepageAnnouncement !== undefined) {
|
|
1017
|
+
params[Param.EnableHomepageAnnouncement] = enableHomepageAnnouncement;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
982
1020
|
this.defaultHeight = minimumHeight || this.defaultHeight;
|
|
983
1021
|
|
|
984
1022
|
params[Param.DataPanelV2Enabled] = dataPanelV2;
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { startAutoMCPFrameRenderer } from './auto-frame-renderer';
|
|
2
|
+
import { Param, AuthType } from '../types';
|
|
3
|
+
import { init } from '../index';
|
|
4
|
+
import * as authInstance from '../auth';
|
|
5
|
+
import { TsEmbed } from './ts-embed';
|
|
6
|
+
import {
|
|
7
|
+
getDocumentBody,
|
|
8
|
+
} from '../test/test-utils';
|
|
9
|
+
|
|
10
|
+
const thoughtSpotHost = 'tshost';
|
|
11
|
+
|
|
12
|
+
describe('startAutoMCPFrameRenderer', () => {
|
|
13
|
+
let renderIFrameSpy: jest.SpyInstance;
|
|
14
|
+
let getEmbedBasePathSpy: jest.SpyInstance;
|
|
15
|
+
|
|
16
|
+
beforeAll(() => {
|
|
17
|
+
init({
|
|
18
|
+
thoughtSpotHost,
|
|
19
|
+
authType: AuthType.None,
|
|
20
|
+
});
|
|
21
|
+
jest.spyOn(authInstance, 'postLoginService').mockImplementation(() => Promise.resolve(undefined));
|
|
22
|
+
jest.spyOn(window, 'alert').mockImplementation(() => undefined);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
document.body.innerHTML = getDocumentBody();
|
|
27
|
+
getEmbedBasePathSpy = jest.spyOn(
|
|
28
|
+
TsEmbed.prototype as any,
|
|
29
|
+
'getEmbedBasePath',
|
|
30
|
+
).mockImplementation(function (this: any, query: string) {
|
|
31
|
+
return `http://${thoughtSpotHost}/?${query}#`;
|
|
32
|
+
});
|
|
33
|
+
renderIFrameSpy = jest.spyOn(
|
|
34
|
+
TsEmbed.prototype as any,
|
|
35
|
+
'renderIFrame',
|
|
36
|
+
).mockResolvedValue(undefined);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
renderIFrameSpy.mockRestore();
|
|
41
|
+
getEmbedBasePathSpy.mockRestore();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe('MutationObserver setup', () => {
|
|
45
|
+
test('should return a MutationObserver', () => {
|
|
46
|
+
const observer = startAutoMCPFrameRenderer();
|
|
47
|
+
expect(observer).toBeInstanceOf(MutationObserver);
|
|
48
|
+
observer.disconnect();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('should observe document.body with childList and subtree', () => {
|
|
52
|
+
const observeSpy = jest.spyOn(MutationObserver.prototype, 'observe');
|
|
53
|
+
const observer = startAutoMCPFrameRenderer();
|
|
54
|
+
expect(observeSpy).toHaveBeenCalledWith(document.body, {
|
|
55
|
+
childList: true,
|
|
56
|
+
subtree: true,
|
|
57
|
+
});
|
|
58
|
+
observer.disconnect();
|
|
59
|
+
observeSpy.mockRestore();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('iframe detection via tsmcp param', () => {
|
|
64
|
+
test('should process directly-added iframes with tsmcp=true', async () => {
|
|
65
|
+
const observer = startAutoMCPFrameRenderer();
|
|
66
|
+
|
|
67
|
+
const iframe = document.createElement('iframe');
|
|
68
|
+
iframe.src = `https://${thoughtSpotHost}/v2/?${Param.Tsmcp}=true#/embed/viz/lb1/tab1`;
|
|
69
|
+
document.body.appendChild(iframe);
|
|
70
|
+
|
|
71
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
72
|
+
|
|
73
|
+
expect(renderIFrameSpy).toHaveBeenCalled();
|
|
74
|
+
observer.disconnect();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test('should not process iframes without tsmcp param', async () => {
|
|
78
|
+
const observer = startAutoMCPFrameRenderer();
|
|
79
|
+
|
|
80
|
+
const iframe = document.createElement('iframe');
|
|
81
|
+
iframe.src = `https://${thoughtSpotHost}/v2/?embedApp=true#/embed/viz/lb1`;
|
|
82
|
+
document.body.appendChild(iframe);
|
|
83
|
+
|
|
84
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
85
|
+
|
|
86
|
+
expect(renderIFrameSpy).not.toHaveBeenCalled();
|
|
87
|
+
observer.disconnect();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('should process tsmcp iframes nested inside added elements', async () => {
|
|
91
|
+
const observer = startAutoMCPFrameRenderer();
|
|
92
|
+
|
|
93
|
+
const wrapper = document.createElement('div');
|
|
94
|
+
const iframe = document.createElement('iframe');
|
|
95
|
+
iframe.src = `https://${thoughtSpotHost}/?${Param.Tsmcp}=true`;
|
|
96
|
+
wrapper.appendChild(iframe);
|
|
97
|
+
document.body.appendChild(wrapper);
|
|
98
|
+
|
|
99
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
100
|
+
|
|
101
|
+
expect(renderIFrameSpy).toHaveBeenCalled();
|
|
102
|
+
observer.disconnect();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test('should not process nested iframes without tsmcp param', async () => {
|
|
106
|
+
const observer = startAutoMCPFrameRenderer();
|
|
107
|
+
|
|
108
|
+
const wrapper = document.createElement('div');
|
|
109
|
+
const iframe = document.createElement('iframe');
|
|
110
|
+
iframe.src = `https://${thoughtSpotHost}/?embedApp=true`;
|
|
111
|
+
wrapper.appendChild(iframe);
|
|
112
|
+
document.body.appendChild(wrapper);
|
|
113
|
+
|
|
114
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
115
|
+
|
|
116
|
+
expect(renderIFrameSpy).not.toHaveBeenCalled();
|
|
117
|
+
observer.disconnect();
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test('should ignore non-iframe element nodes', async () => {
|
|
121
|
+
const observer = startAutoMCPFrameRenderer();
|
|
122
|
+
|
|
123
|
+
const div = document.createElement('div');
|
|
124
|
+
div.textContent = `${Param.Tsmcp}=true`;
|
|
125
|
+
document.body.appendChild(div);
|
|
126
|
+
|
|
127
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
128
|
+
|
|
129
|
+
expect(renderIFrameSpy).not.toHaveBeenCalled();
|
|
130
|
+
observer.disconnect();
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test('should ignore text nodes', async () => {
|
|
134
|
+
const observer = startAutoMCPFrameRenderer();
|
|
135
|
+
|
|
136
|
+
const text = document.createTextNode('tsmcp=true');
|
|
137
|
+
document.body.appendChild(text);
|
|
138
|
+
|
|
139
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
140
|
+
|
|
141
|
+
expect(renderIFrameSpy).not.toHaveBeenCalled();
|
|
142
|
+
observer.disconnect();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('should process multiple tsmcp iframes in one mutation', async () => {
|
|
146
|
+
const observer = startAutoMCPFrameRenderer();
|
|
147
|
+
|
|
148
|
+
const wrapper = document.createElement('div');
|
|
149
|
+
const iframe1 = document.createElement('iframe');
|
|
150
|
+
iframe1.src = `https://${thoughtSpotHost}/?${Param.Tsmcp}=true&id=1`;
|
|
151
|
+
const iframe2 = document.createElement('iframe');
|
|
152
|
+
iframe2.src = `https://${thoughtSpotHost}/?${Param.Tsmcp}=true&id=2`;
|
|
153
|
+
wrapper.appendChild(iframe1);
|
|
154
|
+
wrapper.appendChild(iframe2);
|
|
155
|
+
document.body.appendChild(wrapper);
|
|
156
|
+
|
|
157
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
158
|
+
|
|
159
|
+
expect(renderIFrameSpy).toHaveBeenCalledTimes(2);
|
|
160
|
+
observer.disconnect();
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test('should ignore iframes with invalid src URLs', async () => {
|
|
164
|
+
const observer = startAutoMCPFrameRenderer();
|
|
165
|
+
|
|
166
|
+
const iframe = document.createElement('iframe');
|
|
167
|
+
iframe.src = 'about:blank';
|
|
168
|
+
document.body.appendChild(iframe);
|
|
169
|
+
|
|
170
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
171
|
+
|
|
172
|
+
expect(renderIFrameSpy).not.toHaveBeenCalled();
|
|
173
|
+
observer.disconnect();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
describe('handleInsertionIntoDOM override', () => {
|
|
178
|
+
test('should replace the original iframe when renderIFrame inserts DOM', async () => {
|
|
179
|
+
renderIFrameSpy.mockRestore();
|
|
180
|
+
|
|
181
|
+
const replaceSpy = jest.fn();
|
|
182
|
+
|
|
183
|
+
renderIFrameSpy = jest.spyOn(
|
|
184
|
+
TsEmbed.prototype as any,
|
|
185
|
+
'renderIFrame',
|
|
186
|
+
).mockImplementation(async function (this: any) {
|
|
187
|
+
const newIframe = document.createElement('iframe');
|
|
188
|
+
newIframe.src = 'https://replaced.example.com';
|
|
189
|
+
this.frameToReplace.replaceWith = replaceSpy;
|
|
190
|
+
this.handleInsertionIntoDOM(newIframe);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
const observer = startAutoMCPFrameRenderer();
|
|
194
|
+
|
|
195
|
+
const iframe = document.createElement('iframe');
|
|
196
|
+
iframe.src = `https://${thoughtSpotHost}/?${Param.Tsmcp}=true`;
|
|
197
|
+
document.body.appendChild(iframe);
|
|
198
|
+
|
|
199
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
200
|
+
|
|
201
|
+
expect(replaceSpy).toHaveBeenCalled();
|
|
202
|
+
observer.disconnect();
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
describe('viewConfig forwarding', () => {
|
|
207
|
+
test('should accept empty viewConfig', () => {
|
|
208
|
+
const observer = startAutoMCPFrameRenderer({});
|
|
209
|
+
expect(observer).toBeInstanceOf(MutationObserver);
|
|
210
|
+
observer.disconnect();
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test('should accept no arguments (default empty config)', () => {
|
|
214
|
+
const observer = startAutoMCPFrameRenderer();
|
|
215
|
+
expect(observer).toBeInstanceOf(MutationObserver);
|
|
216
|
+
observer.disconnect();
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
describe('getMCPIframeSrc URL construction', () => {
|
|
221
|
+
test('should strip tsmcp param and merge embed params into rendered src', async () => {
|
|
222
|
+
let capturedSrc = '';
|
|
223
|
+
renderIFrameSpy.mockRestore();
|
|
224
|
+
renderIFrameSpy = jest.spyOn(
|
|
225
|
+
TsEmbed.prototype as any,
|
|
226
|
+
'renderIFrame',
|
|
227
|
+
).mockImplementation(async function (this: any, src: string) {
|
|
228
|
+
capturedSrc = src;
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const observer = startAutoMCPFrameRenderer();
|
|
232
|
+
|
|
233
|
+
const iframe = document.createElement('iframe');
|
|
234
|
+
iframe.src = `https://${thoughtSpotHost}/v2/?${Param.Tsmcp}=true&customParam=hello#/embed/viz`;
|
|
235
|
+
document.body.appendChild(iframe);
|
|
236
|
+
|
|
237
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
238
|
+
|
|
239
|
+
expect(capturedSrc).not.toContain(`${Param.Tsmcp}=true`);
|
|
240
|
+
expect(capturedSrc).toContain('customParam=hello');
|
|
241
|
+
observer.disconnect();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
test('should preserve hash from original iframe src', async () => {
|
|
245
|
+
let capturedSrc = '';
|
|
246
|
+
renderIFrameSpy.mockRestore();
|
|
247
|
+
renderIFrameSpy = jest.spyOn(
|
|
248
|
+
TsEmbed.prototype as any,
|
|
249
|
+
'renderIFrame',
|
|
250
|
+
).mockImplementation(async function (this: any, src: string) {
|
|
251
|
+
capturedSrc = src;
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
const observer = startAutoMCPFrameRenderer();
|
|
255
|
+
|
|
256
|
+
const iframe = document.createElement('iframe');
|
|
257
|
+
iframe.src = `https://${thoughtSpotHost}/v2/?${Param.Tsmcp}=true#/embed/viz/lb123`;
|
|
258
|
+
document.body.appendChild(iframe);
|
|
259
|
+
|
|
260
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
261
|
+
|
|
262
|
+
expect(capturedSrc).toContain('/embed/viz/lb123');
|
|
263
|
+
observer.disconnect();
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
});
|