@thoughtspot/visual-embed-sdk 1.26.2 → 1.26.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/embed/app.d.ts +0 -1
  3. package/cjs/src/embed/app.d.ts.map +1 -1
  4. package/cjs/src/embed/app.js +1 -1
  5. package/cjs/src/embed/app.js.map +1 -1
  6. package/cjs/src/embed/liveboard.d.ts +0 -1
  7. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  8. package/cjs/src/embed/liveboard.js +1 -1
  9. package/cjs/src/embed/liveboard.js.map +1 -1
  10. package/cjs/src/embed/sage.d.ts +0 -1
  11. package/cjs/src/embed/sage.d.ts.map +1 -1
  12. package/cjs/src/embed/sage.js +1 -1
  13. package/cjs/src/embed/sage.js.map +1 -1
  14. package/cjs/src/embed/search.d.ts +0 -1
  15. package/cjs/src/embed/search.d.ts.map +1 -1
  16. package/cjs/src/embed/search.js +2 -3
  17. package/cjs/src/embed/search.js.map +1 -1
  18. package/cjs/src/embed/ts-embed.d.ts +0 -1
  19. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  20. package/cjs/src/embed/ts-embed.js +1 -3
  21. package/cjs/src/embed/ts-embed.js.map +1 -1
  22. package/cjs/src/types.d.ts +6 -0
  23. package/cjs/src/types.d.ts.map +1 -1
  24. package/cjs/src/types.js.map +1 -1
  25. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  26. package/cjs/src/utils/graphql/answerService/answerService.js +1 -1
  27. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  28. package/cjs/src/utils/graphql/answerService/answerService.spec.js +2 -0
  29. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  30. package/dist/src/embed/app.d.ts +0 -1
  31. package/dist/src/embed/app.d.ts.map +1 -1
  32. package/dist/src/embed/liveboard.d.ts +0 -1
  33. package/dist/src/embed/liveboard.d.ts.map +1 -1
  34. package/dist/src/embed/sage.d.ts +0 -1
  35. package/dist/src/embed/sage.d.ts.map +1 -1
  36. package/dist/src/embed/search.d.ts +0 -1
  37. package/dist/src/embed/search.d.ts.map +1 -1
  38. package/dist/src/embed/ts-embed.d.ts +0 -1
  39. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  40. package/dist/src/types.d.ts +6 -0
  41. package/dist/src/types.d.ts.map +1 -1
  42. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  43. package/dist/tsembed-react.es.js +8 -11
  44. package/dist/tsembed-react.js +8 -11
  45. package/dist/tsembed.es.js +8 -11
  46. package/dist/tsembed.js +8 -11
  47. package/dist/visual-embed-sdk-react-full.d.ts +6 -5
  48. package/dist/visual-embed-sdk-react.d.ts +6 -5
  49. package/dist/visual-embed-sdk.d.ts +6 -5
  50. package/lib/package.json +1 -1
  51. package/lib/src/embed/app.d.ts +0 -1
  52. package/lib/src/embed/app.d.ts.map +1 -1
  53. package/lib/src/embed/app.js +1 -1
  54. package/lib/src/embed/app.js.map +1 -1
  55. package/lib/src/embed/liveboard.d.ts +0 -1
  56. package/lib/src/embed/liveboard.d.ts.map +1 -1
  57. package/lib/src/embed/liveboard.js +1 -1
  58. package/lib/src/embed/liveboard.js.map +1 -1
  59. package/lib/src/embed/sage.d.ts +0 -1
  60. package/lib/src/embed/sage.d.ts.map +1 -1
  61. package/lib/src/embed/sage.js +1 -1
  62. package/lib/src/embed/sage.js.map +1 -1
  63. package/lib/src/embed/search.d.ts +0 -1
  64. package/lib/src/embed/search.d.ts.map +1 -1
  65. package/lib/src/embed/search.js +2 -3
  66. package/lib/src/embed/search.js.map +1 -1
  67. package/lib/src/embed/ts-embed.d.ts +0 -1
  68. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  69. package/lib/src/embed/ts-embed.js +1 -3
  70. package/lib/src/embed/ts-embed.js.map +1 -1
  71. package/lib/src/types.d.ts +6 -0
  72. package/lib/src/types.d.ts.map +1 -1
  73. package/lib/src/types.js.map +1 -1
  74. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  75. package/lib/src/utils/graphql/answerService/answerService.js +1 -1
  76. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  77. package/lib/src/utils/graphql/answerService/answerService.spec.js +2 -0
  78. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  79. package/lib/src/visual-embed-sdk.d.ts +6 -5
  80. package/package.json +1 -1
  81. package/src/embed/app.ts +1 -2
  82. package/src/embed/liveboard.ts +1 -2
  83. package/src/embed/sage.ts +1 -2
  84. package/src/embed/search.ts +2 -4
  85. package/src/embed/ts-embed.ts +6 -9
  86. package/src/types.ts +16 -10
  87. package/src/utils/graphql/answerService/answerService.spec.ts +2 -0
  88. package/src/utils/graphql/answerService/answerService.ts +3 -1
  89. package/cjs/src/embed/TsEmbed.d.ts +0 -302
  90. package/cjs/src/embed/TsEmbed.d.ts.map +0 -1
  91. package/cjs/src/embed/TsEmbed.js +0 -851
  92. package/cjs/src/embed/TsEmbed.js.map +0 -1
  93. package/cjs/src/utils/answerService.d.ts +0 -10
  94. package/cjs/src/utils/answerService.d.ts.map +0 -1
  95. package/cjs/src/utils/answerService.js +0 -61
  96. package/cjs/src/utils/answerService.js.map +0 -1
  97. package/cjs/src/utils/answerService.spec.d.ts +0 -2
  98. package/cjs/src/utils/answerService.spec.d.ts.map +0 -1
  99. package/cjs/src/utils/answerService.spec.js +0 -31
  100. package/cjs/src/utils/answerService.spec.js.map +0 -1
  101. package/cjs/src/utils/authService/tokenisedAuthSerice.d.ts +0 -11
  102. package/cjs/src/utils/authService/tokenisedAuthSerice.d.ts.map +0 -1
  103. package/cjs/src/utils/authService/tokenisedAuthSerice.js +0 -44
  104. package/cjs/src/utils/authService/tokenisedAuthSerice.js.map +0 -1
  105. package/cjs/src/utils/authService.d.ts +0 -55
  106. package/cjs/src/utils/authService.d.ts.map +0 -1
  107. package/cjs/src/utils/authService.js +0 -139
  108. package/cjs/src/utils/authService.js.map +0 -1
  109. package/cjs/src/utils/authService.spec.d.ts +0 -2
  110. package/cjs/src/utils/authService.spec.d.ts.map +0 -1
  111. package/cjs/src/utils/authService.spec.js +0 -82
  112. package/cjs/src/utils/authService.spec.js.map +0 -1
  113. package/cjs/src/utils/graphql/graphql-request.spec.d.ts +0 -2
  114. package/cjs/src/utils/graphql/graphql-request.spec.d.ts.map +0 -1
  115. package/cjs/src/utils/graphql/graphql-request.spec.js +0 -39
  116. package/cjs/src/utils/graphql/graphql-request.spec.js.map +0 -1
  117. package/cjs/src/utils/logger.d.ts +0 -28
  118. package/cjs/src/utils/logger.d.ts.map +0 -1
  119. package/cjs/src/utils/logger.js +0 -82
  120. package/cjs/src/utils/logger.js.map +0 -1
  121. package/dist/src/utils/answerService.d.ts +0 -10
  122. package/dist/src/utils/answerService.d.ts.map +0 -1
  123. package/dist/src/utils/answerService.spec.d.ts +0 -2
  124. package/dist/src/utils/answerService.spec.d.ts.map +0 -1
  125. package/dist/src/utils/authService/tokenisedAuthSerice.d.ts +0 -11
  126. package/dist/src/utils/authService/tokenisedAuthSerice.d.ts.map +0 -1
  127. package/dist/src/utils/authService.d.ts +0 -55
  128. package/dist/src/utils/authService.d.ts.map +0 -1
  129. package/dist/src/utils/authService.spec.d.ts +0 -2
  130. package/dist/src/utils/authService.spec.d.ts.map +0 -1
  131. package/dist/src/utils/graphql/graphql-request.spec.d.ts +0 -2
  132. package/dist/src/utils/graphql/graphql-request.spec.d.ts.map +0 -1
  133. package/dist/src/utils/logger.d.ts +0 -28
  134. package/dist/src/utils/logger.d.ts.map +0 -1
  135. package/lib/src/embed/TsEmbed.d.ts +0 -302
  136. package/lib/src/embed/TsEmbed.d.ts.map +0 -1
  137. package/lib/src/embed/TsEmbed.js +0 -847
  138. package/lib/src/embed/TsEmbed.js.map +0 -1
  139. package/lib/src/utils/answerService.d.ts +0 -10
  140. package/lib/src/utils/answerService.d.ts.map +0 -1
  141. package/lib/src/utils/answerService.js +0 -57
  142. package/lib/src/utils/answerService.js.map +0 -1
  143. package/lib/src/utils/answerService.spec.d.ts +0 -2
  144. package/lib/src/utils/answerService.spec.d.ts.map +0 -1
  145. package/lib/src/utils/answerService.spec.js +0 -29
  146. package/lib/src/utils/answerService.spec.js.map +0 -1
  147. package/lib/src/utils/authService/tokenisedAuthSerice.d.ts +0 -11
  148. package/lib/src/utils/authService/tokenisedAuthSerice.d.ts.map +0 -1
  149. package/lib/src/utils/authService/tokenisedAuthSerice.js +0 -39
  150. package/lib/src/utils/authService/tokenisedAuthSerice.js.map +0 -1
  151. package/lib/src/utils/authService.d.ts +0 -55
  152. package/lib/src/utils/authService.d.ts.map +0 -1
  153. package/lib/src/utils/authService.js +0 -129
  154. package/lib/src/utils/authService.js.map +0 -1
  155. package/lib/src/utils/authService.spec.d.ts +0 -2
  156. package/lib/src/utils/authService.spec.d.ts.map +0 -1
  157. package/lib/src/utils/authService.spec.js +0 -80
  158. package/lib/src/utils/authService.spec.js.map +0 -1
  159. package/lib/src/utils/graphql/graphql-request.spec.d.ts +0 -2
  160. package/lib/src/utils/graphql/graphql-request.spec.d.ts.map +0 -1
  161. package/lib/src/utils/graphql/graphql-request.spec.js +0 -36
  162. package/lib/src/utils/graphql/graphql-request.spec.js.map +0 -1
  163. package/lib/src/utils/logger.d.ts +0 -28
  164. package/lib/src/utils/logger.d.ts.map +0 -1
  165. package/lib/src/utils/logger.js +0 -75
  166. package/lib/src/utils/logger.js.map +0 -1
@@ -1,851 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TsEmbed = void 0;
4
- const utils_1 = require("../utils");
5
- const config_1 = require("../config");
6
- const types_1 = require("../types");
7
- const mixpanel_service_1 = require("../mixpanel-service");
8
- const processData_1 = require("../utils/processData");
9
- const processTrigger_1 = require("../utils/processTrigger");
10
- const base_1 = require("./base");
11
- const auth_1 = require("../auth");
12
- const ts_embed_1 = require("./ts-embed");
13
- /**
14
- * Base class for embedding v2 experience
15
- * Note: the v2 version of ThoughtSpot Blink is built on the new stack:
16
- * React+GraphQL
17
- */
18
- class TsEmbed {
19
- constructor(domSelector, viewConfig) {
20
- this.isAppInitialized = false;
21
- this.embedComponentType = 'TsEmbed';
22
- /**
23
- * Should we encode URL Query Params using base64 encoding which thoughtspot
24
- * will generate for embedding. This provides additional security to
25
- * thoughtspot clusters against Cross site scripting attacks.
26
- *
27
- * @default false
28
- */
29
- this.shouldEncodeUrlQueryParams = false;
30
- this.defaultHiddenActions = [types_1.Action.ReportError];
31
- this.subscribedListeners = {};
32
- /**
33
- * Send Custom style as part of payload of APP_INIT
34
- *
35
- * @param _
36
- * @param responder
37
- */
38
- this.appInitCb = async (_, responder) => {
39
- var _a, _b;
40
- let authToken = '';
41
- if (this.embedConfig.authType === types_1.AuthType.TrustedAuthTokenCookieless) {
42
- authToken = await (0, auth_1.getAuthenticaionToken)(this.embedConfig);
43
- }
44
- this.isAppInitialized = true;
45
- responder({
46
- type: types_1.EmbedEvent.APP_INIT,
47
- data: {
48
- customisations: (0, utils_1.getCustomisations)(this.embedConfig, this.viewConfig),
49
- authToken,
50
- runtimeFilterParams: this.viewConfig.excludeRuntimeFiltersfromURL
51
- ? (0, utils_1.getRuntimeFilters)(this.viewConfig.runtimeFilters)
52
- : null,
53
- hiddenHomepageModules: this.viewConfig.hiddenHomepageModules || [],
54
- reorderedHomepageModules: this.viewConfig.reorderedHomepageModules || [],
55
- hostConfig: this.embedConfig.hostConfig,
56
- hiddenHomeLeftNavItems: ((_a = this.viewConfig) === null || _a === void 0 ? void 0 : _a.hiddenHomeLeftNavItems)
57
- ? (_b = this.viewConfig) === null || _b === void 0 ? void 0 : _b.hiddenHomeLeftNavItems
58
- : [],
59
- },
60
- });
61
- };
62
- /**
63
- * Sends updated auth token to the iFrame to avoid user logout
64
- *
65
- * @param _
66
- * @param responder
67
- */
68
- this.updateAuthToken = async (_, responder) => {
69
- const { autoLogin = false, authType } = this.embedConfig; // Set autoLogin default to false
70
- if (authType === types_1.AuthType.TrustedAuthTokenCookieless) {
71
- const authToken = await (0, auth_1.getAuthenticaionToken)(this.embedConfig);
72
- responder({
73
- type: types_1.EmbedEvent.AuthExpire,
74
- data: { authToken },
75
- });
76
- }
77
- else if (autoLogin) {
78
- (0, base_1.handleAuth)();
79
- }
80
- (0, base_1.notifyAuthFailure)(auth_1.AuthFailureType.EXPIRY);
81
- };
82
- /**
83
- * Register APP_INIT event and sendback init payload
84
- */
85
- this.registerAppInit = () => {
86
- this.on(types_1.EmbedEvent.APP_INIT, this.appInitCb, { start: false }, true);
87
- this.on(types_1.EmbedEvent.AuthExpire, this.updateAuthToken, { start: false }, true);
88
- };
89
- this.el = (0, utils_1.getDOMNode)(domSelector);
90
- // TODO: handle error
91
- this.embedConfig = (0, base_1.getEmbedConfig)();
92
- if (!this.embedConfig.authTriggerContainer && !this.embedConfig.useEventForSAMLPopup) {
93
- this.embedConfig.authTriggerContainer = domSelector;
94
- }
95
- this.thoughtSpotHost = (0, config_1.getThoughtSpotHost)(this.embedConfig);
96
- this.thoughtSpotV2Base = (0, config_1.getV2BasePath)(this.embedConfig);
97
- this.eventHandlerMap = new Map();
98
- this.isError = false;
99
- this.viewConfig = viewConfig;
100
- this.shouldEncodeUrlQueryParams = this.embedConfig.shouldEncodeUrlQueryParams;
101
- this.registerAppInit();
102
- (0, mixpanel_service_1.uploadMixpanelEvent)(mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
103
- ...viewConfig,
104
- embedComponentType: this.embedComponentType,
105
- });
106
- }
107
- /**
108
- * Throws error encountered during initialization.
109
- */
110
- throwInitError() {
111
- this.handleError('You need to init the ThoughtSpot SDK module first');
112
- }
113
- /**
114
- * Handles errors within the SDK
115
- *
116
- * @param error The error message or object
117
- */
118
- handleError(error) {
119
- this.isError = true;
120
- this.executeCallbacks(types_1.EmbedEvent.Error, {
121
- error,
122
- });
123
- // Log error
124
- console.error(error);
125
- }
126
- /**
127
- * Extracts the type field from the event payload
128
- *
129
- * @param event The window message event
130
- */
131
- getEventType(event) {
132
- var _a, _b;
133
- // eslint-disable-next-line no-underscore-dangle
134
- return ((_a = event.data) === null || _a === void 0 ? void 0 : _a.type) || ((_b = event.data) === null || _b === void 0 ? void 0 : _b.__type);
135
- }
136
- /**
137
- * Extracts the port field from the event payload
138
- *
139
- * @param event The window message event
140
- * @returns
141
- */
142
- getEventPort(event) {
143
- if (event.ports.length && event.ports[0]) {
144
- return event.ports[0];
145
- }
146
- return null;
147
- }
148
- /**
149
- * fix for ts7.sep.cl
150
- * will be removed for ts7.oct.cl
151
- *
152
- * @param event
153
- * @param eventType
154
- * @hidden
155
- */
156
- formatEventData(event, eventType) {
157
- const eventData = {
158
- ...event.data,
159
- type: eventType,
160
- };
161
- if (!eventData.data) {
162
- eventData.data = event.data.payload;
163
- }
164
- return eventData;
165
- }
166
- /**
167
- * Adds a global event listener to window for "message" events.
168
- * ThoughtSpot detects if a particular event is targeted to this
169
- * embed instance through an identifier contained in the payload,
170
- * and executes the registered callbacks accordingly.
171
- */
172
- subscribeToEvents() {
173
- this.unsubscribeToEvents();
174
- const messageEventListener = (event) => {
175
- const eventType = this.getEventType(event);
176
- const eventPort = this.getEventPort(event);
177
- const eventData = this.formatEventData(event, eventType);
178
- if (event.source === this.iFrame.contentWindow) {
179
- this.executeCallbacks(eventType, (0, processData_1.processEventData)(eventType, eventData, this.thoughtSpotHost, this.el), eventPort);
180
- }
181
- };
182
- window.addEventListener('message', messageEventListener);
183
- const onlineEventListener = (e) => {
184
- this.trigger(types_1.HostEvent.Reload);
185
- };
186
- window.addEventListener('online', onlineEventListener);
187
- const offlineEventListener = (e) => {
188
- const offlineWarning = 'Network not Detected. Embed is offline. Please reconnect and refresh';
189
- this.executeCallbacks(types_1.EmbedEvent.Error, {
190
- offlineWarning,
191
- });
192
- console.warn(offlineWarning);
193
- };
194
- window.addEventListener('offline', offlineEventListener);
195
- this.subscribedListeners = {
196
- message: messageEventListener,
197
- online: onlineEventListener,
198
- offline: offlineEventListener,
199
- };
200
- }
201
- unsubscribeToEvents() {
202
- Object.keys(this.subscribedListeners).forEach((key) => {
203
- window.removeEventListener(key, this.subscribedListeners[key]);
204
- });
205
- }
206
- /**
207
- * Constructs the base URL string to load the ThoughtSpot app.
208
- *
209
- * @param query
210
- */
211
- getEmbedBasePath(query) {
212
- let queryString = query;
213
- if (this.shouldEncodeUrlQueryParams) {
214
- queryString = `?base64UrlEncodedFlags=${(0, utils_1.getEncodedQueryParamsString)(queryString.substr(1))}`;
215
- }
216
- const basePath = [this.thoughtSpotHost, this.thoughtSpotV2Base, queryString]
217
- .filter((x) => x.length > 0)
218
- .join('/');
219
- return `${basePath}#`;
220
- }
221
- /**
222
- * Common query params set for all the embed modes.
223
- *
224
- * @param queryParams
225
- * @returns queryParams
226
- */
227
- getBaseQueryParams(queryParams = {}) {
228
- var _a, _b, _c, _d;
229
- let hostAppUrl = ((_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.host) || '';
230
- // The below check is needed because TS Cloud firewall, blocks
231
- // localhost/127.0.0.1 in any url param.
232
- if (hostAppUrl.includes('localhost') || hostAppUrl.includes('127.0.0.1')) {
233
- hostAppUrl = 'local-host';
234
- }
235
- queryParams[types_1.Param.HostAppUrl] = encodeURIComponent(hostAppUrl);
236
- queryParams[types_1.Param.ViewPortHeight] = window.innerHeight;
237
- queryParams[types_1.Param.ViewPortWidth] = window.innerWidth;
238
- queryParams[types_1.Param.Version] = version;
239
- queryParams[types_1.Param.AuthType] = this.embedConfig.authType;
240
- queryParams[types_1.Param.blockNonEmbedFullAppAccess] = (_b = this.embedConfig.blockNonEmbedFullAppAccess) !== null && _b !== void 0 ? _b : true;
241
- if (this.embedConfig.disableLoginRedirect === true || this.embedConfig.autoLogin === true) {
242
- queryParams[types_1.Param.DisableLoginRedirect] = true;
243
- }
244
- if (this.embedConfig.authType === types_1.AuthType.EmbeddedSSO) {
245
- queryParams[types_1.Param.ForceSAMLAutoRedirect] = true;
246
- }
247
- if (this.embedConfig.authType === types_1.AuthType.TrustedAuthTokenCookieless) {
248
- queryParams[types_1.Param.cookieless] = true;
249
- }
250
- if (this.embedConfig.pendoTrackingKey) {
251
- queryParams[types_1.Param.PendoTrackingKey] = this.embedConfig.pendoTrackingKey;
252
- }
253
- const { disabledActions, disabledActionReason, hiddenActions, visibleActions, hiddenTabs, visibleTabs, showAlerts, additionalFlags, locale, customizations, contextMenuTrigger, linkOverride, insertInToSlide, hideLiveboardHeader, showLiveboardDescription, showLiveboardTitle, } = this.viewConfig;
254
- if (Array.isArray(visibleActions) && Array.isArray(hiddenActions)) {
255
- this.handleError('You cannot have both hidden actions and visible actions');
256
- return queryParams;
257
- }
258
- if (Array.isArray(visibleTabs) && Array.isArray(hiddenTabs)) {
259
- this.handleError('You cannot have both hidden Tabs and visible Tabs');
260
- return queryParams;
261
- }
262
- // TODO remove embedConfig.customCssUrl
263
- const cssUrlParam = ((_c = customizations === null || customizations === void 0 ? void 0 : customizations.style) === null || _c === void 0 ? void 0 : _c.customCSSUrl) || this.embedConfig.customCssUrl;
264
- if (cssUrlParam) {
265
- queryParams[types_1.Param.CustomCSSUrl] = cssUrlParam;
266
- }
267
- if (disabledActions === null || disabledActions === void 0 ? void 0 : disabledActions.length) {
268
- queryParams[types_1.Param.DisableActions] = disabledActions;
269
- }
270
- if (disabledActionReason) {
271
- queryParams[types_1.Param.DisableActionReason] = disabledActionReason;
272
- }
273
- queryParams[types_1.Param.HideActions] = [...this.defaultHiddenActions, ...(hiddenActions !== null && hiddenActions !== void 0 ? hiddenActions : [])];
274
- if (Array.isArray(visibleActions)) {
275
- queryParams[types_1.Param.VisibleActions] = visibleActions;
276
- }
277
- if (Array.isArray(hiddenTabs)) {
278
- queryParams[types_1.Param.HiddenTabs] = hiddenTabs;
279
- }
280
- if (Array.isArray(visibleTabs)) {
281
- queryParams[types_1.Param.VisibleTabs] = visibleTabs;
282
- }
283
- /**
284
- * Default behavior for context menu will be left-click
285
- * from version 9.2.0.cl the user have an option to override context
286
- * menu click
287
- */
288
- if (contextMenuTrigger === types_1.ContextMenuTriggerOptions.LEFT_CLICK) {
289
- queryParams[types_1.Param.ContextMenuTrigger] = true;
290
- }
291
- else if (contextMenuTrigger === types_1.ContextMenuTriggerOptions.RIGHT_CLICK) {
292
- queryParams[types_1.Param.ContextMenuTrigger] = false;
293
- }
294
- const spriteUrl = (customizations === null || customizations === void 0 ? void 0 : customizations.iconSpriteUrl)
295
- || ((_d = this.embedConfig.customizations) === null || _d === void 0 ? void 0 : _d.iconSpriteUrl);
296
- if (spriteUrl) {
297
- queryParams[types_1.Param.IconSpriteUrl] = spriteUrl.replace('https://', '');
298
- }
299
- if (showAlerts !== undefined) {
300
- queryParams[types_1.Param.ShowAlerts] = showAlerts;
301
- }
302
- if (locale !== undefined) {
303
- queryParams[types_1.Param.Locale] = locale;
304
- }
305
- if (additionalFlags && additionalFlags.constructor.name === 'Object') {
306
- Object.assign(queryParams, additionalFlags);
307
- }
308
- if (linkOverride) {
309
- queryParams[types_1.Param.LinkOverride] = linkOverride;
310
- }
311
- if (insertInToSlide) {
312
- queryParams[types_1.Param.ShowInsertToSlide] = insertInToSlide;
313
- }
314
- if (hideLiveboardHeader) {
315
- queryParams[types_1.Param.HideLiveboardHeader] = hideLiveboardHeader;
316
- }
317
- if (showLiveboardDescription) {
318
- queryParams[types_1.Param.ShowLiveboardDescription] = showLiveboardDescription;
319
- }
320
- if (showLiveboardTitle) {
321
- queryParams[types_1.Param.ShowLiveboardTitle] = showLiveboardTitle;
322
- }
323
- return queryParams;
324
- }
325
- /**
326
- * Constructs the base URL string to load v1 of the ThoughtSpot app.
327
- * This is used for embedding Liveboards, visualizations, and full application.
328
- *
329
- * @param queryString The query string to append to the URL.
330
- * @param isAppEmbed A Boolean parameter to specify if you are embedding
331
- * the full application.
332
- */
333
- getV1EmbedBasePath(queryString) {
334
- const queryParams = this.shouldEncodeUrlQueryParams
335
- ? `?base64UrlEncodedFlags=${(0, utils_1.getEncodedQueryParamsString)(queryString)}`
336
- : `?${queryString}`;
337
- const path = `${this.thoughtSpotHost}/${queryParams}#`;
338
- return path;
339
- }
340
- getEmbedParams() {
341
- const queryParams = this.getBaseQueryParams();
342
- return (0, utils_1.getQueryParamString)(queryParams);
343
- }
344
- getRootIframeSrc() {
345
- const query = this.getEmbedParams();
346
- return this.getEmbedBasePath(query);
347
- }
348
- createIframeEl(frameSrc) {
349
- const iFrame = document.createElement('iframe');
350
- iFrame.src = frameSrc;
351
- iFrame.id = ts_embed_1.TS_EMBED_ID;
352
- // according to screenfull.js documentation
353
- // allowFullscreen, webkitallowfullscreen and mozallowfullscreen must be
354
- // true
355
- iFrame.allowFullscreen = true;
356
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
357
- // @ts-ignore
358
- iFrame.webkitallowfullscreen = true;
359
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
360
- // @ts-ignore
361
- iFrame.mozallowfullscreen = true;
362
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
363
- // @ts-ignore
364
- iFrame.allow = 'clipboard-read; clipboard-write';
365
- const { height: frameHeight, width: frameWidth, ...restParams } = this.viewConfig.frameParams || {};
366
- const width = (0, utils_1.getCssDimension)(frameWidth || config_1.DEFAULT_EMBED_WIDTH);
367
- const height = (0, utils_1.getCssDimension)(frameHeight || config_1.DEFAULT_EMBED_HEIGHT);
368
- (0, utils_1.setAttributes)(iFrame, restParams);
369
- iFrame.style.width = `${width}`;
370
- iFrame.style.height = `${height}`;
371
- iFrame.style.border = '0';
372
- iFrame.name = 'ThoughtSpot Embedded Analytics';
373
- return iFrame;
374
- }
375
- handleInsertionIntoDOM(child, showPreRenderByDefault = false) {
376
- if (this.isPreRendered) {
377
- this.insertIntoDOMForPreRender(this.embedConfig.loginFailedMessage, showPreRenderByDefault);
378
- }
379
- else {
380
- this.insertIntoDOM(this.embedConfig.loginFailedMessage);
381
- }
382
- }
383
- /**
384
- * Renders the embedded ThoughtSpot app in an iframe and sets up
385
- * event listeners.
386
- *
387
- * @param url - The URL of the embedded ThoughtSpot app.
388
- * @param showPreRenderByDefault - The flag to show the preRender by default.
389
- */
390
- async renderIFrame(url, showPreRenderByDefault = false) {
391
- if (this.isError) {
392
- return null;
393
- }
394
- if (!this.thoughtSpotHost) {
395
- this.throwInitError();
396
- }
397
- if (url.length > config_1.URL_MAX_LENGTH) {
398
- // warn: The URL is too long
399
- }
400
- return (0, base_1.renderInQueue)((nextInQueue) => {
401
- var _a;
402
- const initTimestamp = Date.now();
403
- this.executeCallbacks(types_1.EmbedEvent.Init, {
404
- data: {
405
- timestamp: initTimestamp,
406
- },
407
- type: types_1.EmbedEvent.Init,
408
- });
409
- (0, mixpanel_service_1.uploadMixpanelEvent)(mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
410
- return (_a = (0, base_1.getAuthPromise)()) === null || _a === void 0 ? void 0 : _a.then((isLoggedIn) => {
411
- if (!isLoggedIn) {
412
- this.handleInsertionIntoDOM(this.embedConfig.loginFailedMessage, showPreRenderByDefault);
413
- return;
414
- }
415
- this.iFrame = this.iFrame || this.createIframeEl(url);
416
- this.iFrame.addEventListener('load', () => {
417
- nextInQueue();
418
- const loadTimestamp = Date.now();
419
- this.executeCallbacks(types_1.EmbedEvent.Load, {
420
- data: {
421
- timestamp: loadTimestamp,
422
- },
423
- type: types_1.EmbedEvent.Load,
424
- });
425
- (0, mixpanel_service_1.uploadMixpanelEvent)(mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_RENDER_COMPLETE, {
426
- elWidth: this.iFrame.clientWidth,
427
- elHeight: this.iFrame.clientHeight,
428
- timeTookToLoad: loadTimestamp - initTimestamp,
429
- });
430
- });
431
- this.iFrame.addEventListener('error', () => {
432
- nextInQueue();
433
- });
434
- this.handleInsertionIntoDOM(this.iFrame, showPreRenderByDefault);
435
- const prefetchIframe = document.querySelectorAll('.prefetchIframe');
436
- if (prefetchIframe.length) {
437
- prefetchIframe.forEach((el) => {
438
- el.remove();
439
- });
440
- }
441
- this.subscribeToEvents();
442
- }).catch((error) => {
443
- nextInQueue();
444
- (0, mixpanel_service_1.uploadMixpanelEvent)(mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_RENDER_FAILED, {
445
- error: JSON.stringify(error),
446
- });
447
- this.handleInsertionIntoDOM(this.embedConfig.loginFailedMessage);
448
- this.handleError(error);
449
- });
450
- });
451
- }
452
- getPreRenderIds() {
453
- return {
454
- wrapper: `tsEmbed-pre-render-wrapper-${this.viewConfig.preRenderId}`,
455
- shield: `tsEmbed-pre-render-shield-${this.viewConfig.preRenderId}`,
456
- child: `tsEmbed-pre-render-child-${this.viewConfig.preRenderId}`,
457
- };
458
- }
459
- createPreRenderWrapper(child) {
460
- if (!this.viewConfig.preRenderId) {
461
- throw new Error('PreRender id is required');
462
- }
463
- const preRenderIds = this.getPreRenderIds();
464
- [preRenderIds.wrapper, preRenderIds.shield, preRenderIds.child]
465
- .map((id) => document.getElementById(id))
466
- .filter((element) => element)
467
- .forEach((existingElement) => existingElement.remove());
468
- const preRenderWrapper = document.createElement('div');
469
- preRenderWrapper.id = preRenderIds.wrapper;
470
- (0, utils_1.setStyleProperties)(preRenderWrapper, { position: 'absolute', width: '100vw', height: '100vh' });
471
- // const preRenderShield = document.createElement('div');
472
- // preRenderShield.id = preRenderIds.shield;
473
- // setStyleProperties(preRenderShield, { position: 'absolute', width: '100%', height: '100%' });
474
- child.id = preRenderIds.child;
475
- preRenderWrapper.appendChild(child);
476
- // preRenderWrapper.appendChild(preRenderShield);
477
- this.preRenderWrapper = preRenderWrapper;
478
- // this.preRenderShield = preRenderShield;
479
- this.preRenderChild = child;
480
- return preRenderWrapper;
481
- }
482
- connectPreRendered() {
483
- const preRenderIds = this.getPreRenderIds();
484
- this.preRenderWrapper = this.preRenderWrapper
485
- || document.getElementById(preRenderIds.wrapper);
486
- // this.preRenderShield = this.preRenderShield
487
- // || document.getElementById(preRenderIds.shield);
488
- this.preRenderChild = this.preRenderChild
489
- || document.getElementById(preRenderIds.child);
490
- if (this.preRenderWrapper && this.preRenderChild) {
491
- this.isPreRendered = true;
492
- this.iFrame = this.preRenderChild;
493
- }
494
- return this.isPreRenderAvailable();
495
- }
496
- isPreRenderAvailable() {
497
- return this.isPreRendered;
498
- }
499
- insertIntoDOMForPreRender(child, showPreRenderByDefault = false) {
500
- let childNode;
501
- if (typeof child === 'string') {
502
- const divChildNode = document.createElement('div');
503
- divChildNode.innerHTML = child;
504
- childNode = divChildNode;
505
- }
506
- else {
507
- childNode = child;
508
- }
509
- const preRenderWrapper = this.createPreRenderWrapper(childNode);
510
- if (showPreRenderByDefault) {
511
- this.showPreRender();
512
- }
513
- else {
514
- this.hidePreRender();
515
- }
516
- document.body.appendChild(preRenderWrapper);
517
- }
518
- hidePreRender() {
519
- if (!this.isPreRenderAvailable()) {
520
- // if the embed component is not preRendered , nothing to hide
521
- console.log('No preRender found, not hiding ');
522
- return;
523
- }
524
- (0, utils_1.setStyleProperties)(this.preRenderWrapper, {
525
- opacity: '0',
526
- pointerEvents: 'none',
527
- zIndex: '-1000',
528
- position: 'absolute ',
529
- top: '0',
530
- left: '0',
531
- });
532
- const childBoundingRect = this.preRenderChild.getBoundingClientRect();
533
- (0, utils_1.setStyleProperties)(this.preRenderShield, {
534
- opacity: '0',
535
- pointerEvents: 'none',
536
- zIndex: '1',
537
- width: `${childBoundingRect.width}px`,
538
- height: `${childBoundingRect.height}px`,
539
- position: 'absolute',
540
- top: '0',
541
- left: '0',
542
- });
543
- this.unsubscribeToEvents();
544
- }
545
- showPreRender() {
546
- if (!this.isPreRenderAvailable()) {
547
- const isAvailable = this.connectPreRendered();
548
- if (!isAvailable) {
549
- // if the Embed component is nor preRendered , Render it now and
550
- // show it (hide is defalt behaviour)
551
- console.log('No preRender found, creating new ');
552
- this.preRender(true);
553
- return;
554
- }
555
- }
556
- this.syncPreRenderStyle();
557
- (0, utils_1.removeStyleProperties)(this.preRenderWrapper, ['z-index', 'opacity', 'pointer-events']);
558
- (0, utils_1.setStyleProperties)(this.preRenderShield, { zIndex: '-1' });
559
- this.subscribeToEvents();
560
- }
561
- syncPreRenderStyle() {
562
- if (!this.el) {
563
- throw new Error('Embed element is not defined');
564
- }
565
- const elBoundingClient = this.el.getBoundingClientRect();
566
- (0, utils_1.setStyleProperties)(this.preRenderWrapper, {
567
- top: `${elBoundingClient.y}px`, left: `${elBoundingClient.x}px`, width: `${elBoundingClient.width}px`, height: `${elBoundingClient.height}px`,
568
- });
569
- }
570
- insertIntoDOM(child) {
571
- var _a;
572
- if (this.viewConfig.insertAsSibling) {
573
- if (typeof child === 'string') {
574
- const div = document.createElement('div');
575
- div.innerHTML = child;
576
- div.id = ts_embed_1.TS_EMBED_ID;
577
- // eslint-disable-next-line no-param-reassign
578
- child = div;
579
- }
580
- if (((_a = this.el.nextElementSibling) === null || _a === void 0 ? void 0 : _a.id) === ts_embed_1.TS_EMBED_ID) {
581
- this.el.nextElementSibling.remove();
582
- }
583
- this.el.parentElement.insertBefore(child, this.el.nextSibling);
584
- this.insertedDomEl = child;
585
- }
586
- else if (typeof child === 'string') {
587
- this.el.innerHTML = child;
588
- this.insertedDomEl = this.el.children[0];
589
- }
590
- else {
591
- this.el.innerHTML = '';
592
- this.el.appendChild(child);
593
- this.insertedDomEl = child;
594
- }
595
- }
596
- /**
597
- * Sets the height of the iframe
598
- *
599
- * @param height The height in pixels
600
- */
601
- setIFrameHeight(height) {
602
- this.iFrame.style.height = (0, utils_1.getCssDimension)(height);
603
- }
604
- /**
605
- * Executes all registered event handlers for a particular event type
606
- *
607
- * @param eventType The event type
608
- * @param data The payload invoked with the event handler
609
- * @param eventPort The event Port for a specific MessageChannel
610
- */
611
- executeCallbacks(eventType, data, eventPort) {
612
- const eventHandlers = this.eventHandlerMap.get(eventType) || [];
613
- const allHandlers = this.eventHandlerMap.get(types_1.EmbedEvent.ALL) || [];
614
- const callbacks = [...eventHandlers, ...allHandlers];
615
- const dataStatus = (data === null || data === void 0 ? void 0 : data.status) || utils_1.embedEventStatus.END;
616
- callbacks.forEach((callbackObj) => {
617
- if (
618
- // When start status is true it trigger only start releated
619
- // payload
620
- (callbackObj.options.start && dataStatus === utils_1.embedEventStatus.START)
621
- // When start status is false it trigger only end releated
622
- // payload
623
- || (!callbackObj.options.start && dataStatus === utils_1.embedEventStatus.END)) {
624
- callbackObj.callback(data, (payload) => {
625
- this.triggerEventOnPort(eventPort, payload);
626
- });
627
- }
628
- });
629
- }
630
- /**
631
- * Returns the ThoughtSpot hostname or IP address.
632
- */
633
- getThoughtSpotHost() {
634
- return this.thoughtSpotHost;
635
- }
636
- /**
637
- * Gets the v1 event type (if applicable) for the EmbedEvent type
638
- *
639
- * @param eventType The v2 event type
640
- * @returns The corresponding v1 event type if one exists
641
- * or else the v2 event type itself
642
- */
643
- getCompatibleEventType(eventType) {
644
- return ts_embed_1.V1EventMap[eventType] || eventType;
645
- }
646
- /**
647
- * Calculates the iframe center for the current visible viewPort
648
- * of iframe using Scroll position of Host App, offsetTop for iframe
649
- * in Host app. ViewPort height of the tab.
650
- *
651
- * @returns iframe Center in visible viewport,
652
- * Iframe height,
653
- * View port height.
654
- */
655
- getIframeCenter() {
656
- const offsetTopClient = (0, utils_1.getOffsetTop)(this.iFrame);
657
- const scrollTopClient = window.scrollY;
658
- const viewPortHeight = window.innerHeight;
659
- const iframeHeight = this.iFrame.offsetHeight;
660
- const iframeScrolled = scrollTopClient - offsetTopClient;
661
- let iframeVisibleViewPort;
662
- let iframeOffset;
663
- if (iframeScrolled < 0) {
664
- iframeVisibleViewPort = viewPortHeight - (offsetTopClient - scrollTopClient);
665
- iframeVisibleViewPort = Math.min(iframeHeight, iframeVisibleViewPort);
666
- iframeOffset = 0;
667
- }
668
- else {
669
- iframeVisibleViewPort = Math.min(iframeHeight - iframeScrolled, viewPortHeight);
670
- iframeOffset = iframeScrolled;
671
- }
672
- const iframeCenter = iframeOffset + iframeVisibleViewPort / 2;
673
- return {
674
- iframeCenter,
675
- iframeScrolled,
676
- iframeHeight,
677
- viewPortHeight,
678
- iframeVisibleViewPort,
679
- };
680
- }
681
- /**
682
- * Registers an event listener to trigger an alert when the ThoughtSpot app
683
- * sends an event of a particular message type to the host application.
684
- *
685
- * @param messageType The message type
686
- * @param callback A callback as a function
687
- * @param options The message options
688
- * @param isSelf
689
- * @param isRegisteredBySDK
690
- * @example
691
- * ```js
692
- * tsEmbed.on(EmbedEvent.Error, (data) => {
693
- * console.error(data);
694
- * });
695
- * ```
696
- * @example
697
- * ```js
698
- * tsEmbed.on(EmbedEvent.Save, (data) => {
699
- * console.log("Answer save clicked", data);
700
- * }, {
701
- * start: true // This will trigger the callback on start of save
702
- * });
703
- * ```
704
- */
705
- on(messageType, callback, options = { start: false }, isRegisteredBySDK = false) {
706
- (0, mixpanel_service_1.uploadMixpanelEvent)(`${mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_ON}-${messageType}`, {
707
- isRegisteredBySDK,
708
- });
709
- if (this.isRendered) {
710
- this.handleError('Please register event handlers before calling render');
711
- }
712
- const callbacks = this.eventHandlerMap.get(messageType) || [];
713
- callbacks.push({ options, callback });
714
- this.eventHandlerMap.set(messageType, callbacks);
715
- return this;
716
- }
717
- /**
718
- * Removes an event listener for a particular event type.
719
- *
720
- * @param messageType The message type
721
- * @param callback The callback to remove
722
- * @example
723
- * ```js
724
- * const errorHandler = (data) => { console.error(data); };
725
- * tsEmbed.on(EmbedEvent.Error, errorHandler);
726
- * tsEmbed.off(EmbedEvent.Error, errorHandler);
727
- * ```
728
- */
729
- off(messageType, callback) {
730
- const callbacks = this.eventHandlerMap.get(messageType) || [];
731
- const index = callbacks.findIndex((cb) => cb.callback === callback);
732
- if (index > -1) {
733
- callbacks.splice(index, 1);
734
- }
735
- return this;
736
- }
737
- /**
738
- * Triggers an event on specific Port registered against
739
- * for the EmbedEvent
740
- *
741
- * @param eventType The message type
742
- * @param data The payload to send
743
- * @param eventPort
744
- * @param payload
745
- */
746
- triggerEventOnPort(eventPort, payload) {
747
- if (eventPort) {
748
- try {
749
- eventPort.postMessage({
750
- type: payload.type,
751
- data: payload.data,
752
- });
753
- }
754
- catch (e) {
755
- eventPort.postMessage({ error: e });
756
- console.log(e);
757
- }
758
- }
759
- else {
760
- console.log('Event Port is not defined');
761
- }
762
- }
763
- /**
764
- * Triggers an event to the embedded app
765
- *
766
- * @param messageType The event type
767
- * @param data The payload to send with the message
768
- */
769
- trigger(messageType, data = {}) {
770
- (0, mixpanel_service_1.uploadMixpanelEvent)(`${mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_TRIGGER}-${messageType}`);
771
- return (0, processTrigger_1.processTrigger)(this.iFrame, messageType, this.thoughtSpotHost, data);
772
- }
773
- /**
774
- * Marks the ThoughtSpot object to have been rendered
775
- * Needs to be overridden by subclasses to do the actual
776
- * rendering of the iframe.
777
- *
778
- * @param args
779
- */
780
- render() {
781
- this.isRendered = true;
782
- return this;
783
- }
784
- /**
785
- * Creates the preRender shell
786
- *
787
- * @param showPreRenderByDefault
788
- */
789
- preRender(showPreRenderByDefault = false) {
790
- this.isPreRendered = true;
791
- return this;
792
- }
793
- /**
794
- * Get the Post Url Params for THOUGHTSPOT from the current
795
- * host app URL.
796
- * THOUGHTSPOT URL params starts with a prefix "ts-"
797
- *
798
- * @version SDK: 1.14.0 | ThoughtSpot: 8.4.0.cl, 8.4.1-sw
799
- */
800
- getThoughtSpotPostUrlParams() {
801
- const urlHash = window.location.hash;
802
- const queryParams = window.location.search;
803
- const postHashParams = urlHash.split('?');
804
- const postURLParams = postHashParams[postHashParams.length - 1];
805
- const queryParamsObj = new URLSearchParams(queryParams);
806
- const postURLParamsObj = new URLSearchParams(postURLParams);
807
- const params = new URLSearchParams();
808
- const addKeyValuePairCb = (value, key) => {
809
- if (key.startsWith(ts_embed_1.THOUGHTSPOT_PARAM_PREFIX)) {
810
- params.append(key, value);
811
- }
812
- };
813
- queryParamsObj.forEach(addKeyValuePairCb);
814
- postURLParamsObj.forEach(addKeyValuePairCb);
815
- let tsParams = params.toString();
816
- tsParams = tsParams ? `?${tsParams}` : '';
817
- return tsParams;
818
- }
819
- /**
820
- * Destroys the ThoughtSpot embed, and remove any nodes from the DOM.
821
- *
822
- * @version SDK: 1.19.1 | ThoughtSpot: *
823
- */
824
- destroy() {
825
- var _a;
826
- try {
827
- (_a = this.insertedDomEl) === null || _a === void 0 ? void 0 : _a.parentNode.removeChild(this.insertedDomEl);
828
- this.unsubscribeToEvents();
829
- }
830
- catch (e) {
831
- console.log('Error destroying TS Embed', e);
832
- }
833
- }
834
- getUnderlyingFrameElement() {
835
- return this.iFrame;
836
- }
837
- /**
838
- * Prerenders a generic instance of the TS component.
839
- * This means without the path but with the flags already applied.
840
- * This is useful for prerendering the component in the background.
841
- *
842
- * @version SDK: 1.22.0
843
- * @returns
844
- */
845
- async prerenderGeneric() {
846
- const prerenderFrameSrc = this.getRootIframeSrc();
847
- return this.renderIFrame(prerenderFrameSrc);
848
- }
849
- }
850
- exports.TsEmbed = TsEmbed;
851
- //# sourceMappingURL=TsEmbed.js.map