@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
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { AutoMCPFrameRendererViewConfig, Param } from "../types";
|
|
2
|
+
import { TsEmbed } from "./ts-embed";
|
|
3
|
+
import { getQueryParamString } from "../utils";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Starts an automatic renderer that watches the DOM for iframes containing
|
|
8
|
+
* the `tsmcp=true` query parameter and replaces them with fully configured
|
|
9
|
+
* ThoughtSpot embed iframes. The query parameter is automatically added by
|
|
10
|
+
* the ThoughtSpot MCP server.
|
|
11
|
+
*
|
|
12
|
+
* A {@link MutationObserver} is set up on `document.body` to detect both
|
|
13
|
+
* directly added iframes and iframes nested within added container elements.
|
|
14
|
+
* Each matching iframe is replaced in-place with a new ThoughtSpot embed
|
|
15
|
+
* iframe that merges the original iframe's query parameters with the SDK
|
|
16
|
+
* embed parameters.
|
|
17
|
+
*
|
|
18
|
+
* Call {@link MutationObserver.disconnect | observer.disconnect()} on the
|
|
19
|
+
* returned observer to stop monitoring the DOM.
|
|
20
|
+
*
|
|
21
|
+
* @param viewConfig - Optional configuration for the auto-rendered embeds.
|
|
22
|
+
* Accepts all properties from {@link AutoMCPFrameRendererViewConfig}.
|
|
23
|
+
* Defaults to an empty config.
|
|
24
|
+
* @returns A {@link MutationObserver} instance that is actively observing
|
|
25
|
+
* `document.body`. Disconnect it when monitoring is no longer needed.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```js
|
|
29
|
+
* import { startAutoMCPFrameRenderer } from '@thoughtspot/visual-embed-sdk';
|
|
30
|
+
*
|
|
31
|
+
* // Start watching the DOM for tsmcp iframes
|
|
32
|
+
* const observer = startAutoMCPFrameRenderer({
|
|
33
|
+
* // optional view config overrides
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Later, stop watching
|
|
37
|
+
* observer.disconnect();
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* Detailed example of how to use the auto-frame renderer:
|
|
42
|
+
* [Python React Agent Simple UI](https://github.com/thoughtspot/developer-examples/tree/main/mcp/python-react-agent-simple-ui)
|
|
43
|
+
*/
|
|
44
|
+
export function startAutoMCPFrameRenderer(viewConfig: AutoMCPFrameRendererViewConfig = {}) {
|
|
45
|
+
|
|
46
|
+
const replaceWithMCPIframe = (iframe: HTMLIFrameElement) => {
|
|
47
|
+
const autoMCPFrameRenderer = new AutoFrameRenderer(viewConfig);
|
|
48
|
+
autoMCPFrameRenderer.replaceIframe(iframe);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const observer = new MutationObserver((mutations) => {
|
|
52
|
+
for (const mutation of mutations) {
|
|
53
|
+
for (const node of Array.from(mutation.addedNodes)) {
|
|
54
|
+
if (node instanceof HTMLIFrameElement && isTSMCPIframe(node)) {
|
|
55
|
+
replaceWithMCPIframe(node);
|
|
56
|
+
}
|
|
57
|
+
if (node instanceof HTMLElement) {
|
|
58
|
+
node.querySelectorAll('iframe').forEach((iframe) => {
|
|
59
|
+
if (isTSMCPIframe(iframe)) {
|
|
60
|
+
replaceWithMCPIframe(iframe);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
69
|
+
|
|
70
|
+
return observer;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function isTSMCPIframe(iframe: HTMLIFrameElement) {
|
|
74
|
+
try {
|
|
75
|
+
const url = new URL(iframe.src);
|
|
76
|
+
return url.searchParams.get(Param.Tsmcp) === 'true';
|
|
77
|
+
} catch (e) {
|
|
78
|
+
// The iframe src might not be a valid URL (e.g., 'about:blank').
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Embed component that automatically replaces a plain iframe with a
|
|
85
|
+
* ThoughtSpot embed iframe. It merges the SDK's embed parameters with
|
|
86
|
+
* the original iframe's query parameters (stripping the `tsmcp` marker)
|
|
87
|
+
* and swaps the original iframe element in the DOM.
|
|
88
|
+
*
|
|
89
|
+
* This class is used internally by {@link startAutoMCPFrameRenderer} and
|
|
90
|
+
* is not intended to be instantiated directly.
|
|
91
|
+
*/
|
|
92
|
+
class AutoFrameRenderer extends TsEmbed {
|
|
93
|
+
private frameToReplace: HTMLIFrameElement;
|
|
94
|
+
|
|
95
|
+
constructor(protected viewConfig: AutoMCPFrameRendererViewConfig) {
|
|
96
|
+
viewConfig.embedComponentType = 'auto-frame-renderer';
|
|
97
|
+
const container = document.createElement('div');
|
|
98
|
+
super(container, viewConfig);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Builds the final iframe `src` by merging the SDK embed parameters
|
|
103
|
+
* with the query parameters already present on the source iframe URL.
|
|
104
|
+
* The `tsmcp` marker param is removed so it does not propagate to the
|
|
105
|
+
* ThoughtSpot application.
|
|
106
|
+
*
|
|
107
|
+
* @param sourceSrc - The original iframe's `src` URL string.
|
|
108
|
+
* @returns The constructed URL to use for the ThoughtSpot embed iframe.
|
|
109
|
+
*/
|
|
110
|
+
private getMCPIframeSrc(sourceSrc: string) {
|
|
111
|
+
const queryParams = this.getEmbedParamsObject();
|
|
112
|
+
const sourceURL = new URL(sourceSrc);
|
|
113
|
+
const existingQueryParams = sourceURL.searchParams;
|
|
114
|
+
const existingQueryParamsObject = Object.fromEntries(existingQueryParams);
|
|
115
|
+
delete existingQueryParamsObject[Param.Tsmcp];
|
|
116
|
+
|
|
117
|
+
const mergedQueryParams = { ...queryParams, ...existingQueryParamsObject };
|
|
118
|
+
const mergedQueryParamsString = getQueryParamString(mergedQueryParams);
|
|
119
|
+
const frameSrc = `${this.getEmbedBasePath(mergedQueryParamsString)}${sourceURL.hash.replace('#', '')}`;
|
|
120
|
+
return frameSrc;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Overrides the base insertion behavior so the new embed iframe
|
|
125
|
+
* replaces the original iframe in-place rather than being appended
|
|
126
|
+
* to a container element. Falls back to the default behavior when
|
|
127
|
+
* no iframe has been set for replacement.
|
|
128
|
+
*/
|
|
129
|
+
protected handleInsertionIntoDOM(child: string | Node): void {
|
|
130
|
+
if (this.frameToReplace) {
|
|
131
|
+
this.frameToReplace.replaceWith(child);
|
|
132
|
+
} else {
|
|
133
|
+
super.handleInsertionIntoDOM(child);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Replaces the given iframe with a new ThoughtSpot embed iframe.
|
|
139
|
+
*
|
|
140
|
+
* The original iframe's `src` is used to derive the embed URL, and
|
|
141
|
+
* once the new iframe is rendered it takes the original's place in
|
|
142
|
+
* the DOM tree.
|
|
143
|
+
*
|
|
144
|
+
* @param iframe - The existing `<iframe>` element to replace.
|
|
145
|
+
*/
|
|
146
|
+
public async replaceIframe(iframe: HTMLIFrameElement): Promise<void> {
|
|
147
|
+
this.frameToReplace = iframe;
|
|
148
|
+
const src = this.getMCPIframeSrc(iframe.src);
|
|
149
|
+
await this.renderIFrame(src);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
package/src/embed/base.spec.ts
CHANGED
package/src/embed/base.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
3
|
/**
|
|
4
4
|
* Copyright (c) 2022
|
|
5
5
|
*
|
|
@@ -36,7 +36,6 @@ import { getEmbedConfig, setEmbedConfig } from './embedConfig';
|
|
|
36
36
|
import { getQueryParamString, getValueFromWindow, isWindowUndefined, storeValueInWindow } from '../utils';
|
|
37
37
|
import { resetAllCachedServices } from '../utils/resetServices';
|
|
38
38
|
import { reload } from '../utils/processTrigger';
|
|
39
|
-
import { ERROR_MESSAGE } from '../errors';
|
|
40
39
|
|
|
41
40
|
const CONFIG_DEFAULTS: Partial<EmbedConfig> = {
|
|
42
41
|
loginFailedMessage: 'Not logged in',
|
|
@@ -116,7 +115,7 @@ export const prefetch = (
|
|
|
116
115
|
additionalFlags?: { [key: string]: string | number | boolean },
|
|
117
116
|
): void => {
|
|
118
117
|
if (url === '') {
|
|
119
|
-
|
|
118
|
+
|
|
120
119
|
logger.warn('The prefetch method does not have a valid URL');
|
|
121
120
|
} else {
|
|
122
121
|
const features = prefetchFeatures || [PrefetchFeatures.FullApp];
|
|
@@ -142,9 +141,9 @@ export const prefetch = (
|
|
|
142
141
|
iFrame.style.height = '0';
|
|
143
142
|
iFrame.style.border = '0';
|
|
144
143
|
|
|
145
|
-
// Make it 'fixed' to keep it in a different stacking
|
|
146
|
-
//
|
|
147
|
-
//
|
|
144
|
+
// Make it 'fixed' to keep it in a different stacking
|
|
145
|
+
// context. This should solve the focus behaviours inside
|
|
146
|
+
// the iframe from interfering with main body.
|
|
148
147
|
iFrame.style.position = 'fixed';
|
|
149
148
|
// Push it out of viewport.
|
|
150
149
|
iFrame.style.top = '100vh';
|
|
@@ -323,7 +322,7 @@ export const renderInQueue = (fn: (next?: (val?: any) => void) => Promise<any>):
|
|
|
323
322
|
return renderQueue;
|
|
324
323
|
}
|
|
325
324
|
// Sending an empty function to keep it consistent with the above usage.
|
|
326
|
-
return fn(() => {});
|
|
325
|
+
return fn(() => {});
|
|
327
326
|
};
|
|
328
327
|
|
|
329
328
|
/**
|
|
@@ -345,7 +344,7 @@ export const renderInQueue = (fn: (next?: (val?: any) => void) => Promise<any>):
|
|
|
345
344
|
* }).catch(error => {
|
|
346
345
|
* console.error(error);
|
|
347
346
|
* });
|
|
348
|
-
|
|
347
|
+
* ```
|
|
349
348
|
* @version SDK: 1.23.0 | ThoughtSpot: 9.4.0.cl
|
|
350
349
|
* @group Global methods
|
|
351
350
|
*/
|
|
@@ -466,9 +465,9 @@ export function reset(): void {
|
|
|
466
465
|
|
|
467
466
|
/**
|
|
468
467
|
* Reloads the ThoughtSpot iframe.
|
|
468
|
+
* @version SDK: 1.43.1
|
|
469
469
|
* @param iFrame
|
|
470
470
|
* @group Global methods
|
|
471
|
-
* @version SDK: 1.43.1
|
|
472
471
|
*/
|
|
473
472
|
export const reloadIframe = (iFrame: HTMLIFrameElement) => {
|
|
474
473
|
if (!iFrame) {
|
|
@@ -17,8 +17,8 @@ export interface SpotterAgentEmbedViewConfig extends Omit<BaseViewConfig, 'prima
|
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Configuration for conversation options.
|
|
20
|
-
* @deprecated from SDK: 1.39.0 | ThoughtSpot: 10.10.0.cl
|
|
21
20
|
* Use {@link SpotterAgentEmbedViewConfig} instead
|
|
21
|
+
* @deprecated from SDK: 1.39.0 | ThoughtSpot: 10.10.0.cl
|
|
22
22
|
* @group Embed components
|
|
23
23
|
*/
|
|
24
24
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
@@ -87,6 +87,8 @@ export class ConversationMessage extends TsEmbed {
|
|
|
87
87
|
/**
|
|
88
88
|
* Create a conversation embed, which can be integrated inside
|
|
89
89
|
* chatbots or other conversational interfaces.
|
|
90
|
+
* @version SDK: 1.37.0 | ThoughtSpot: 10.9.0.cl
|
|
91
|
+
* @group Embed components
|
|
90
92
|
* @example
|
|
91
93
|
* ```js
|
|
92
94
|
* import { SpotterAgentEmbed } from '@thoughtspot/visual-embed-sdk';
|
|
@@ -100,8 +102,6 @@ export class ConversationMessage extends TsEmbed {
|
|
|
100
102
|
* // append the container to the DOM
|
|
101
103
|
* document.body.appendChild(container); // or to any other element
|
|
102
104
|
* ```
|
|
103
|
-
* @group Embed components
|
|
104
|
-
* @version SDK: 1.37.0 | ThoughtSpot: 10.9.0.cl
|
|
105
105
|
*/
|
|
106
106
|
export class SpotterAgentEmbed {
|
|
107
107
|
private conversationService: ConversationService;
|
|
@@ -164,8 +164,9 @@ export class SpotterAgentEmbed {
|
|
|
164
164
|
/**
|
|
165
165
|
* Create a conversation embed, which can be integrated inside
|
|
166
166
|
* chatbots or other conversational interfaces.
|
|
167
|
-
* @deprecated from SDK: 1.39.0 | ThoughtSpot: 10.10.0.cl
|
|
168
167
|
* Use {@link SpotterAgentEmbed} instead
|
|
168
|
+
* @deprecated from SDK: 1.39.0 | ThoughtSpot: 10.10.0.cl
|
|
169
|
+
* @group Embed components
|
|
169
170
|
* @example
|
|
170
171
|
* ```js
|
|
171
172
|
* import { SpotterAgentEmbed } from '@thoughtspot/visual-embed-sdk';
|
|
@@ -179,7 +180,6 @@ export class SpotterAgentEmbed {
|
|
|
179
180
|
* // append the container to the DOM
|
|
180
181
|
* document.body.appendChild(container); // or to any other element
|
|
181
182
|
* ```
|
|
182
|
-
* @group Embed components
|
|
183
183
|
*/
|
|
184
184
|
export class BodylessConversation extends SpotterAgentEmbed {
|
|
185
185
|
constructor(viewConfig: BodylessConversationViewConfig) {
|
|
@@ -327,6 +327,43 @@ describe('ConversationEmbed', () => {
|
|
|
327
327
|
);
|
|
328
328
|
});
|
|
329
329
|
|
|
330
|
+
it('should render the conversation embed with deprecated standalone enablePastConversationsSidebar flag', async () => {
|
|
331
|
+
const viewConfig: SpotterEmbedViewConfig = {
|
|
332
|
+
worksheetId: 'worksheetId',
|
|
333
|
+
searchOptions: {
|
|
334
|
+
searchQuery: 'searchQuery',
|
|
335
|
+
},
|
|
336
|
+
enablePastConversationsSidebar: true,
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
|
|
340
|
+
await conversationEmbed.render();
|
|
341
|
+
expectUrlMatchesWithParams(
|
|
342
|
+
getIFrameSrc(),
|
|
343
|
+
`http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&enablePastConversationsSidebar=true#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
|
|
344
|
+
);
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
it('should prefer spotterSidebarConfig.enablePastConversationsSidebar over deprecated standalone flag', async () => {
|
|
348
|
+
const viewConfig: SpotterEmbedViewConfig = {
|
|
349
|
+
worksheetId: 'worksheetId',
|
|
350
|
+
searchOptions: {
|
|
351
|
+
searchQuery: 'searchQuery',
|
|
352
|
+
},
|
|
353
|
+
enablePastConversationsSidebar: false,
|
|
354
|
+
spotterSidebarConfig: {
|
|
355
|
+
enablePastConversationsSidebar: true,
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
|
|
360
|
+
await conversationEmbed.render();
|
|
361
|
+
expectUrlMatchesWithParams(
|
|
362
|
+
getIFrameSrc(),
|
|
363
|
+
`http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&enablePastConversationsSidebar=true#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
|
|
364
|
+
);
|
|
365
|
+
});
|
|
366
|
+
|
|
330
367
|
it('should render the conversation embed with all boolean flags set', async () => {
|
|
331
368
|
const viewConfig: SpotterEmbedViewConfig = {
|
|
332
369
|
worksheetId: 'worksheetId',
|