@thoughtspot/visual-embed-sdk 1.52.1 → 1.52.2-beta
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 +11 -4
- package/cjs/src/contracts/host-event-contracts.d.ts +49 -11
- package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -1
- package/cjs/src/embed/app.d.ts +4 -3
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +1 -1
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +10 -0
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.js +1 -1
- package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.spec.js +24 -13
- package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
- package/cjs/src/embed/bodyless-conversation.js +1 -1
- package/cjs/src/embed/bodyless-conversation.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +1 -0
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +4 -4
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +35 -24
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/embedConfig.spec.js +2 -1
- package/cjs/src/embed/embedConfig.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts +2 -2
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.js +16 -10
- package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +14 -8
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.d.ts +9 -0
- package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.js +49 -3
- package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.spec.js +151 -0
- package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +4 -3
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +18 -13
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +2 -1
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/search-bar.js +1 -1
- package/cjs/src/embed/search-bar.js.map +1 -1
- package/cjs/src/embed/search.js +1 -1
- package/cjs/src/embed/search.js.map +1 -1
- package/cjs/src/embed/search.spec.js +20 -0
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/spotter-utils.d.ts +8 -1
- package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
- package/cjs/src/embed/spotter-utils.js +14 -1
- package/cjs/src/embed/spotter-utils.js.map +1 -1
- package/cjs/src/embed/spotter-utils.spec.js +26 -0
- package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +3 -0
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +108 -29
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +163 -23
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/errors.js +1 -1
- package/cjs/src/errors.js.map +1 -1
- package/cjs/src/index.d.ts +2 -1
- 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/all-types-export.d.ts +1 -1
- package/cjs/src/react/all-types-export.d.ts.map +1 -1
- package/cjs/src/react/all-types-export.js +2 -1
- package/cjs/src/react/all-types-export.js.map +1 -1
- package/cjs/src/types.d.ts +45 -22
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +44 -21
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/authService/tokenizedAuthService.spec.js +2 -1
- package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/cjs/src/utils/custom-actions.spec.js +4 -2
- package/cjs/src/utils/custom-actions.spec.js.map +1 -1
- package/cjs/src/utils/filterConverter.d.ts +106 -0
- package/cjs/src/utils/filterConverter.d.ts.map +1 -0
- package/cjs/src/utils/filterConverter.js +215 -0
- package/cjs/src/utils/filterConverter.js.map +1 -0
- package/cjs/src/utils/filterConverter.spec.d.ts +2 -0
- package/cjs/src/utils/filterConverter.spec.d.ts.map +1 -0
- package/cjs/src/utils/filterConverter.spec.js +709 -0
- package/cjs/src/utils/filterConverter.spec.js.map +1 -0
- package/cjs/src/utils/processData.spec.js +2 -1
- package/cjs/src/utils/processData.spec.js.map +1 -1
- package/dist/{index-C1pmYb5H.js → index-CcBYlGo9.js} +1 -1
- package/dist/src/contracts/host-event-contracts.d.ts +49 -11
- package/dist/src/contracts/host-event-contracts.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +4 -3
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +1 -0
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts +2 -2
- package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/utils.d.ts +9 -0
- package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +4 -3
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/spotter-utils.d.ts +8 -1
- package/dist/src/embed/spotter-utils.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +3 -0
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/react/all-types-export.d.ts +1 -1
- package/dist/src/react/all-types-export.d.ts.map +1 -1
- package/dist/src/types.d.ts +45 -22
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/filterConverter.d.ts +106 -0
- package/dist/src/utils/filterConverter.d.ts.map +1 -0
- package/dist/src/utils/filterConverter.spec.d.ts +2 -0
- package/dist/src/utils/filterConverter.spec.d.ts.map +1 -0
- package/dist/tsembed-react.es.js +257 -87
- package/dist/tsembed-react.js +256 -86
- package/dist/tsembed.es.js +466 -89
- package/dist/tsembed.js +465 -87
- package/dist/visual-embed-sdk-react-full.d.ts +202 -40
- package/dist/visual-embed-sdk-react.d.ts +108 -40
- package/dist/visual-embed-sdk.d.ts +202 -40
- package/lib/package.json +11 -4
- package/lib/src/contracts/host-event-contracts.d.ts +49 -11
- package/lib/src/contracts/host-event-contracts.d.ts.map +1 -1
- package/lib/src/embed/app.d.ts +4 -3
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +1 -1
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +10 -0
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.js +1 -1
- package/lib/src/embed/auto-frame-renderer.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.spec.js +24 -13
- package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
- package/lib/src/embed/bodyless-conversation.js +1 -1
- package/lib/src/embed/bodyless-conversation.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +1 -0
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +5 -5
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +35 -24
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/embedConfig.spec.js +2 -1
- package/lib/src/embed/embedConfig.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts +2 -2
- package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.js +17 -11
- package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +14 -8
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/utils.d.ts +9 -0
- package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/utils.js +47 -2
- package/lib/src/embed/hostEventClient/utils.js.map +1 -1
- package/lib/src/embed/hostEventClient/utils.spec.js +152 -1
- package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +4 -3
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +18 -13
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +2 -1
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/search-bar.js +1 -1
- package/lib/src/embed/search-bar.js.map +1 -1
- package/lib/src/embed/search.js +1 -1
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/search.spec.js +20 -0
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/spotter-utils.d.ts +8 -1
- package/lib/src/embed/spotter-utils.d.ts.map +1 -1
- package/lib/src/embed/spotter-utils.js +12 -0
- package/lib/src/embed/spotter-utils.js.map +1 -1
- package/lib/src/embed/spotter-utils.spec.js +27 -1
- package/lib/src/embed/spotter-utils.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +3 -0
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +108 -29
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +164 -24
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/errors.js +1 -1
- package/lib/src/errors.js.map +1 -1
- package/lib/src/index.d.ts +2 -1
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +2 -1
- package/lib/src/index.js.map +1 -1
- package/lib/src/react/all-types-export.d.ts +1 -1
- package/lib/src/react/all-types-export.d.ts.map +1 -1
- package/lib/src/react/all-types-export.js +1 -1
- package/lib/src/react/all-types-export.js.map +1 -1
- package/lib/src/types.d.ts +45 -22
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +44 -21
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/authService/tokenizedAuthService.spec.js +2 -1
- package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/lib/src/utils/custom-actions.spec.js +4 -2
- package/lib/src/utils/custom-actions.spec.js.map +1 -1
- package/lib/src/utils/filterConverter.d.ts +106 -0
- package/lib/src/utils/filterConverter.d.ts.map +1 -0
- package/lib/src/utils/filterConverter.js +210 -0
- package/lib/src/utils/filterConverter.js.map +1 -0
- package/lib/src/utils/filterConverter.spec.d.ts +2 -0
- package/lib/src/utils/filterConverter.spec.d.ts.map +1 -0
- package/lib/src/utils/filterConverter.spec.js +707 -0
- package/lib/src/utils/filterConverter.spec.js.map +1 -0
- package/lib/src/utils/processData.spec.js +2 -1
- package/lib/src/utils/processData.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +202 -40
- package/package.json +11 -4
- package/src/contracts/host-event-contracts.ts +55 -11
- package/src/embed/app.spec.ts +15 -0
- package/src/embed/app.ts +5 -4
- package/src/embed/auto-frame-renderer.spec.ts +24 -13
- package/src/embed/auto-frame-renderer.ts +1 -1
- package/src/embed/bodyless-conversation.ts +1 -1
- package/src/embed/conversation.spec.ts +38 -27
- package/src/embed/conversation.ts +5 -5
- package/src/embed/embedConfig.spec.ts +2 -1
- package/src/embed/hostEventClient/host-event-client.spec.ts +14 -8
- package/src/embed/hostEventClient/host-event-client.ts +18 -10
- package/src/embed/hostEventClient/utils.spec.ts +176 -1
- package/src/embed/hostEventClient/utils.ts +51 -2
- package/src/embed/liveboard.spec.ts +4 -3
- package/src/embed/liveboard.ts +22 -16
- package/src/embed/search-bar.tsx +1 -1
- package/src/embed/search.spec.ts +23 -0
- package/src/embed/search.ts +1 -1
- package/src/embed/spotter-utils.spec.ts +29 -0
- package/src/embed/spotter-utils.ts +16 -0
- package/src/embed/ts-embed.spec.ts +204 -23
- package/src/embed/ts-embed.ts +114 -28
- package/src/errors.ts +1 -1
- package/src/index.ts +10 -0
- package/src/react/all-types-export.ts +4 -0
- package/src/types.ts +44 -21
- package/src/utils/authService/tokenizedAuthService.spec.ts +2 -1
- package/src/utils/custom-actions.spec.ts +4 -2
- package/src/utils/filterConverter.spec.ts +801 -0
- package/src/utils/filterConverter.ts +304 -0
- package/src/utils/processData.spec.ts +2 -1
package/src/embed/ts-embed.ts
CHANGED
|
@@ -120,10 +120,62 @@ const PRERENDER_WRAPPER_ID_PREFIX = 'tsEmbed-pre-render-wrapper-';
|
|
|
120
120
|
// post is not the same as the params being in effect.
|
|
121
121
|
const UPDATE_EMBED_PARAMS_SETTLE_MS = 200;
|
|
122
122
|
|
|
123
|
-
// The container ignores runtimeFilterParams/runtimeParameterParams unless
|
|
124
|
-
// null or '' leaves the previous embed's values in place. '&' is
|
|
123
|
+
// The container ignores runtimeFilterParams/runtimeParameterParams unless
|
|
124
|
+
// truthy, so null or '' leaves the previous embed's values in place. '&' is
|
|
125
|
+
// truthy and parses to {}.
|
|
125
126
|
const NO_RUNTIME_PARAMS = '&';
|
|
126
127
|
|
|
128
|
+
/**
|
|
129
|
+
* Query parameters that stay on the iframe `src` while config is excluded from
|
|
130
|
+
* the URL, which is the default unless the embed sets the
|
|
131
|
+
* `excludeConfigFromURL` additional flag to `false`. These are the parameters the
|
|
132
|
+
* application shell needs before it can receive a postMessage at all: the
|
|
133
|
+
* embed marker, the host application URL used to validate the message origin,
|
|
134
|
+
* the SDK version, the flags that pick the authentication flow, and the
|
|
135
|
+
* boot-time settings that would otherwise be applied a frame late (viewport,
|
|
136
|
+
* log level, locale, formatting and org). Everything else is delivered over
|
|
137
|
+
* `HostEvent.UpdateEmbedParams`.
|
|
138
|
+
* @internal
|
|
139
|
+
*/
|
|
140
|
+
const BOOTSTRAP_URL_PARAMS: ReadonlySet<string> = new Set<string>([
|
|
141
|
+
Param.EmbedApp,
|
|
142
|
+
Param.HostAppUrl,
|
|
143
|
+
Param.Version,
|
|
144
|
+
Param.AuthType,
|
|
145
|
+
Param.AutoLogin,
|
|
146
|
+
Param.DisableLoginRedirect,
|
|
147
|
+
Param.ForceSAMLAutoRedirect,
|
|
148
|
+
Param.cookieless,
|
|
149
|
+
Param.preAuthCache,
|
|
150
|
+
Param.blockNonEmbedFullAppAccess,
|
|
151
|
+
Param.OverrideOrgId,
|
|
152
|
+
Param.ViewPortHeight,
|
|
153
|
+
Param.ViewPortWidth,
|
|
154
|
+
Param.ClientLogLevel,
|
|
155
|
+
Param.OverrideNativeConsole,
|
|
156
|
+
Param.PendoTrackingKey,
|
|
157
|
+
Param.NumberFormatLocale,
|
|
158
|
+
Param.DateFormatLocale,
|
|
159
|
+
Param.CurrencyFormat,
|
|
160
|
+
Param.Locale,
|
|
161
|
+
Param.searchEmbed,
|
|
162
|
+
Param.livedBoardEmbed,
|
|
163
|
+
Param.isSpotterAgentEmbed,
|
|
164
|
+
Param.SpotterEnabled,
|
|
165
|
+
Param.IsFullAppEmbed,
|
|
166
|
+
Param.IsOnBeforeGetVizDataInterceptEnabled,
|
|
167
|
+
Param.LinkOverride,
|
|
168
|
+
Param.EnableLinkOverridesV2,
|
|
169
|
+
Param.DisableRedirectionLinksInNewTab,
|
|
170
|
+
Param.OverrideHistoryState,
|
|
171
|
+
Param.ForceTable,
|
|
172
|
+
Param.StringIDsUrl,
|
|
173
|
+
Param.DataSources,
|
|
174
|
+
Param.ExposeTranslationIDs,
|
|
175
|
+
Param.IconSpriteUrl,
|
|
176
|
+
Param.Tag,
|
|
177
|
+
]);
|
|
178
|
+
|
|
127
179
|
/**
|
|
128
180
|
* The event id map from v2 event names to v1 event id
|
|
129
181
|
* v1 events are the classic embed events implemented in Blink v1
|
|
@@ -740,8 +792,9 @@ export class TsEmbed {
|
|
|
740
792
|
...this.viewConfig,
|
|
741
793
|
...queryParams,
|
|
742
794
|
...appInitData,
|
|
743
|
-
// A show cycle has no URL to carry these, so the payload always
|
|
744
|
-
// — including "none", which is the case that leaks the
|
|
795
|
+
// A show cycle has no URL to carry these, so the payload always
|
|
796
|
+
// states them — including "none", which is the case that leaks the
|
|
797
|
+
// previous filters.
|
|
745
798
|
runtimeFilterParams:
|
|
746
799
|
getFilterQuery(this.viewConfig.runtimeFilters ?? []) || NO_RUNTIME_PARAMS,
|
|
747
800
|
runtimeParameterParams:
|
|
@@ -948,7 +1001,7 @@ export class TsEmbed {
|
|
|
948
1001
|
}
|
|
949
1002
|
|
|
950
1003
|
protected getEmbedParams() {
|
|
951
|
-
const queryParams = this.
|
|
1004
|
+
const queryParams = this.getUrlQueryParamsObject();
|
|
952
1005
|
return getQueryParamString(queryParams);
|
|
953
1006
|
}
|
|
954
1007
|
|
|
@@ -957,6 +1010,16 @@ export class TsEmbed {
|
|
|
957
1010
|
return params;
|
|
958
1011
|
}
|
|
959
1012
|
|
|
1013
|
+
protected getUrlQueryParamsObject(): Record<any, any> {
|
|
1014
|
+
const queryParams = this.getEmbedParamsObject();
|
|
1015
|
+
if (!this.isConfigExcludedFromUrl()) {
|
|
1016
|
+
return queryParams;
|
|
1017
|
+
}
|
|
1018
|
+
return Object.fromEntries(
|
|
1019
|
+
Object.entries(queryParams).filter(([key]) => BOOTSTRAP_URL_PARAMS.has(key)),
|
|
1020
|
+
);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
960
1023
|
protected getRootIframeSrc() {
|
|
961
1024
|
const query = this.getEmbedParams();
|
|
962
1025
|
return this.getEmbedBasePath(query);
|
|
@@ -1615,8 +1678,9 @@ export class TsEmbed {
|
|
|
1615
1678
|
(this.preRenderWrapper as any)[this.embedNodeKey] = this;
|
|
1616
1679
|
}
|
|
1617
1680
|
|
|
1618
|
-
// The flag lives on the wrapper because it describes the iframe: an
|
|
1619
|
-
// hidden when the container announced itself would otherwise
|
|
1681
|
+
// The flag lives on the wrapper because it describes the iframe: an
|
|
1682
|
+
// instance hidden when the container announced itself would otherwise
|
|
1683
|
+
// report false forever.
|
|
1620
1684
|
private markEmbedContainerLoaded() {
|
|
1621
1685
|
this.isEmbedContainerLoaded = true;
|
|
1622
1686
|
if (this.preRenderWrapper) {
|
|
@@ -1672,10 +1736,14 @@ export class TsEmbed {
|
|
|
1672
1736
|
const AUTH_INIT_FALLBACK_DELAY = 1000;
|
|
1673
1737
|
// Wait for 1 second to ensure the embed container is loaded
|
|
1674
1738
|
// This is a workaround to ensure the embed container is loaded
|
|
1675
|
-
// this is needed until all clusters have EmbedListenerReady
|
|
1739
|
+
// this is needed until all clusters have EmbedListenerReady
|
|
1740
|
+
// event
|
|
1676
1741
|
setTimeout(processEmbedContainerReady, AUTH_INIT_FALLBACK_DELAY);
|
|
1677
1742
|
} else if (source === EmbedEvent.EmbedListenerReady) {
|
|
1678
1743
|
processEmbedContainerReady();
|
|
1744
|
+
if (this.isConfigExcludedFromUrl()) {
|
|
1745
|
+
this.triggerUpdateEmbedParams();
|
|
1746
|
+
}
|
|
1679
1747
|
}
|
|
1680
1748
|
};
|
|
1681
1749
|
|
|
@@ -2040,9 +2108,33 @@ export class TsEmbed {
|
|
|
2040
2108
|
}
|
|
2041
2109
|
|
|
2042
2110
|
// Subclasses that navigate the pre-render on show must await this before
|
|
2043
|
-
// triggering Navigate. Resolves even on failure, so navigation is never
|
|
2111
|
+
// triggering Navigate. Resolves even on failure, so navigation is never
|
|
2112
|
+
// blocked.
|
|
2044
2113
|
protected preRenderParamsApplied: Promise<void> = Promise.resolve();
|
|
2045
2114
|
|
|
2115
|
+
protected isConfigExcludedFromUrl(): boolean {
|
|
2116
|
+
const flag =
|
|
2117
|
+
this.viewConfig.additionalFlags?.excludeConfigFromURL ??
|
|
2118
|
+
this.embedConfig.additionalFlags?.excludeConfigFromURL;
|
|
2119
|
+
// Enabled by default; only an explicit false opts out.
|
|
2120
|
+
return flag !== false && flag !== 'false';
|
|
2121
|
+
}
|
|
2122
|
+
|
|
2123
|
+
protected async triggerUpdateEmbedParams(): Promise<void> {
|
|
2124
|
+
try {
|
|
2125
|
+
const params = await this.getUpdateEmbedParamsObject();
|
|
2126
|
+
this.trigger(HostEvent.UpdateEmbedParams, params);
|
|
2127
|
+
} catch (error) {
|
|
2128
|
+
logger.error(ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
|
|
2129
|
+
this.handleError({
|
|
2130
|
+
errorType: ErrorDetailsTypes.API,
|
|
2131
|
+
message: error?.message || ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
|
|
2132
|
+
code: EmbedErrorCodes.UPDATE_PARAMS_FAILED,
|
|
2133
|
+
error: error?.message || error,
|
|
2134
|
+
});
|
|
2135
|
+
}
|
|
2136
|
+
}
|
|
2137
|
+
|
|
2046
2138
|
protected beforePrerenderVisible(): void {
|
|
2047
2139
|
// We can ignore this as its a bit expensive and the newer customers
|
|
2048
2140
|
// have moved on to UpdateEmbedParams supported clusters
|
|
@@ -2053,16 +2145,7 @@ export class TsEmbed {
|
|
|
2053
2145
|
this.preRenderParamsApplied = new Promise<void>((resolve) => {
|
|
2054
2146
|
this.executeAfterEmbedContainerLoaded(async () => {
|
|
2055
2147
|
try {
|
|
2056
|
-
|
|
2057
|
-
this.trigger(HostEvent.UpdateEmbedParams, params);
|
|
2058
|
-
} catch (error) {
|
|
2059
|
-
logger.error(ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
|
|
2060
|
-
this.handleError({
|
|
2061
|
-
errorType: ErrorDetailsTypes.API,
|
|
2062
|
-
message: error?.message || ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
|
|
2063
|
-
code: EmbedErrorCodes.UPDATE_PARAMS_FAILED,
|
|
2064
|
-
error: error?.message || error,
|
|
2065
|
-
});
|
|
2148
|
+
await this.triggerUpdateEmbedParams();
|
|
2066
2149
|
} finally {
|
|
2067
2150
|
setTimeout(resolve, UPDATE_EMBED_PARAMS_SETTLE_MS);
|
|
2068
2151
|
}
|
|
@@ -2099,8 +2182,9 @@ export class TsEmbed {
|
|
|
2099
2182
|
if (this.hostElement) {
|
|
2100
2183
|
this.insertedDomEl = this.createPreRenderPlaceholder();
|
|
2101
2184
|
if ((this.viewConfig as { fullHeight: boolean }).fullHeight) {
|
|
2102
|
-
// If fullHeight has already sized the wrapper, seed the
|
|
2103
|
-
// with the same height so syncPreRenderStyle gets
|
|
2185
|
+
// If fullHeight has already sized the wrapper, seed the
|
|
2186
|
+
// placeholder with the same height so syncPreRenderStyle gets
|
|
2187
|
+
// an accurate rect.
|
|
2104
2188
|
const existingHeight = this.preRenderWrapper.style.height;
|
|
2105
2189
|
if (existingHeight) {
|
|
2106
2190
|
(this.insertedDomEl as HTMLDivElement).style.height = existingHeight;
|
|
@@ -2109,12 +2193,13 @@ export class TsEmbed {
|
|
|
2109
2193
|
|
|
2110
2194
|
const placeHolderId = this.getPreRenderIds().placeHolder;
|
|
2111
2195
|
// Remove any stale placeholder from a previous cycle. It is located
|
|
2112
|
-
// via a subtree-wide querySelector, so it may be nested deeper
|
|
2113
|
-
// direct child (E.g.: with fullHeight the host app can wrap
|
|
2114
|
-
// Element.remove() — which detaches from whatever the real
|
|
2115
|
-
// rather than hostElement.removeChild(), which throws
|
|
2116
|
-
// when the match is not a direct child. Mirrors the
|
|
2117
|
-
// cleanup in
|
|
2196
|
+
// via a subtree-wide querySelector, so it may be nested deeper
|
|
2197
|
+
// than a direct child (E.g.: with fullHeight the host app can wrap
|
|
2198
|
+
// it). Use Element.remove() — which detaches from whatever the real
|
|
2199
|
+
// parent is — rather than hostElement.removeChild(), which throws
|
|
2200
|
+
// NotFoundError when the match is not a direct child. Mirrors the
|
|
2201
|
+
// wrapper/child cleanup in
|
|
2202
|
+
// createPreRenderWrapper()/createPreRenderChild().
|
|
2118
2203
|
this.hostElement.querySelector(`#${placeHolderId}`)?.remove();
|
|
2119
2204
|
|
|
2120
2205
|
this.hostElement.appendChild(this.insertedDomEl);
|
|
@@ -2153,7 +2238,8 @@ export class TsEmbed {
|
|
|
2153
2238
|
this.setupFullscreenChangeHandler();
|
|
2154
2239
|
}
|
|
2155
2240
|
|
|
2156
|
-
// Last, so everything above still sees the instance being taken over
|
|
2241
|
+
// Last, so everything above still sees the instance being taken over
|
|
2242
|
+
// from.
|
|
2157
2243
|
this.takeOverPreRender();
|
|
2158
2244
|
|
|
2159
2245
|
return this;
|
package/src/errors.ts
CHANGED
|
@@ -29,7 +29,7 @@ export const ERROR_MESSAGE = {
|
|
|
29
29
|
SSR_ENVIRONMENT_ERROR: 'SSR environment detected. This function cannot be called in SSR environment.',
|
|
30
30
|
UPDATE_PARAMS_FAILED: 'Failed to update embed parameters',
|
|
31
31
|
INVALID_SPOTTER_DOCUMENTATION_URL: 'Invalid spotterDocumentationUrl. Please provide a valid http or https URL.',
|
|
32
|
-
UPDATEFILTERS_INVALID_PAYLOAD: 'UpdateFilters requires a valid filter or filters array. Expected: { filter: {
|
|
32
|
+
UPDATEFILTERS_INVALID_PAYLOAD: 'UpdateFilters requires a valid filter or filters array. Expected: { filter: { columnName, operator, values } } or { filters: [{ columnName, operator, values }, ...] }',
|
|
33
33
|
DRILLDOWN_INVALID_PAYLOAD: 'DrillDown requires a valid points object. Expected: { points: { clickedPoint?, selectedPoints? }, autoDrillDown?, vizId? }',
|
|
34
34
|
UPDATEPARAMETERS_INVALID_PAYLOAD: 'UpdateParameters received an invalid applicability. Expected: { level: LIVEBOARD | TAB | GROUP, targetId } where targetId is required for TAB and GROUP levels',
|
|
35
35
|
};
|
package/src/index.ts
CHANGED
|
@@ -151,6 +151,12 @@ import {
|
|
|
151
151
|
NavigateRequest,
|
|
152
152
|
SetActiveTabRequest,
|
|
153
153
|
} from './contracts/host-event-contracts';
|
|
154
|
+
import {
|
|
155
|
+
convertFilterChangedToUpdateFiltersPayload,
|
|
156
|
+
FilterChangedPayload,
|
|
157
|
+
UpdateFiltersFilterParam,
|
|
158
|
+
UpdateFiltersPayload,
|
|
159
|
+
} from './utils/filterConverter';
|
|
154
160
|
|
|
155
161
|
export {
|
|
156
162
|
init,
|
|
@@ -318,6 +324,10 @@ export {
|
|
|
318
324
|
DataLabelFilterOperator,
|
|
319
325
|
TableTheme,
|
|
320
326
|
TableContentDensity,
|
|
327
|
+
convertFilterChangedToUpdateFiltersPayload,
|
|
328
|
+
FilterChangedPayload,
|
|
329
|
+
UpdateFiltersFilterParam,
|
|
330
|
+
UpdateFiltersPayload,
|
|
321
331
|
};
|
|
322
332
|
|
|
323
333
|
export { resetCachedAuthToken } from './authToken';
|
package/src/types.ts
CHANGED
|
@@ -5918,6 +5918,12 @@ export enum HostEvent {
|
|
|
5918
5918
|
* ```js
|
|
5919
5919
|
* const data = await liveboardEmbed.trigger(HostEvent.GetFilters);
|
|
5920
5920
|
* console.log('data', data);
|
|
5921
|
+
* // {
|
|
5922
|
+
* // liveboardFilters: [ ... ],
|
|
5923
|
+
* // runtimeFilters: [
|
|
5924
|
+
* // { columnName: "Region", operator: "IN", values: ["West"] }
|
|
5925
|
+
* // ]
|
|
5926
|
+
* // }
|
|
5921
5927
|
* ```
|
|
5922
5928
|
* @example
|
|
5923
5929
|
* ```js
|
|
@@ -5942,9 +5948,9 @@ export enum HostEvent {
|
|
|
5942
5948
|
*
|
|
5943
5949
|
* Each filter object must include the following attributes:
|
|
5944
5950
|
*
|
|
5945
|
-
* `
|
|
5951
|
+
* `columnName` - Name of the column to filter on.
|
|
5946
5952
|
*
|
|
5947
|
-
* `
|
|
5953
|
+
* `operator` - Filter operator, for example, EQ, IN, CONTAINS.
|
|
5948
5954
|
* For information about the supported filter operators,
|
|
5949
5955
|
* see link:https://developers.thoughtspot.com/docs/runtime-filters#rtOperator[Developer Documentation].
|
|
5950
5956
|
*
|
|
@@ -5971,8 +5977,8 @@ export enum HostEvent {
|
|
|
5971
5977
|
*
|
|
5972
5978
|
* liveboardEmbed.trigger(HostEvent.UpdateFilters, {
|
|
5973
5979
|
* filter: {
|
|
5974
|
-
*
|
|
5975
|
-
*
|
|
5980
|
+
* columnName: "item type",
|
|
5981
|
+
* operator: "IN",
|
|
5976
5982
|
* values: ["bags","shirts"]
|
|
5977
5983
|
* }
|
|
5978
5984
|
* });
|
|
@@ -5982,8 +5988,8 @@ export enum HostEvent {
|
|
|
5982
5988
|
*
|
|
5983
5989
|
* liveboardEmbed.trigger(HostEvent.UpdateFilters, {
|
|
5984
5990
|
* filter: {
|
|
5985
|
-
*
|
|
5986
|
-
*
|
|
5991
|
+
* columnName: "date",
|
|
5992
|
+
* operator: "EQ",
|
|
5987
5993
|
* values: ["JULY","2023"],
|
|
5988
5994
|
* type: "MONTH_YEAR"
|
|
5989
5995
|
* }
|
|
@@ -5994,18 +6000,18 @@ export enum HostEvent {
|
|
|
5994
6000
|
* ```js
|
|
5995
6001
|
* liveboardEmbed.trigger(HostEvent.UpdateFilters, {
|
|
5996
6002
|
* filters: [{
|
|
5997
|
-
*
|
|
5998
|
-
*
|
|
6003
|
+
* columnName: "Item Type",
|
|
6004
|
+
* operator: 'IN',
|
|
5999
6005
|
* values: ["bags","shirts"]
|
|
6000
6006
|
* },
|
|
6001
6007
|
* {
|
|
6002
|
-
*
|
|
6003
|
-
*
|
|
6008
|
+
* columnName: "Region",
|
|
6009
|
+
* operator: 'IN',
|
|
6004
6010
|
* values: ["West","Midwest"]
|
|
6005
6011
|
* },
|
|
6006
6012
|
* {
|
|
6007
|
-
*
|
|
6008
|
-
*
|
|
6013
|
+
* columnName: "Date",
|
|
6014
|
+
* operator: 'EQ',
|
|
6009
6015
|
* values: ["2023-07-31"],
|
|
6010
6016
|
* type: "EXACT_DATE"
|
|
6011
6017
|
* }]
|
|
@@ -6019,13 +6025,13 @@ export enum HostEvent {
|
|
|
6019
6025
|
* ```js
|
|
6020
6026
|
* liveboardEmbed.trigger(HostEvent.UpdateFilters, {
|
|
6021
6027
|
* filters: [{
|
|
6022
|
-
*
|
|
6023
|
-
*
|
|
6028
|
+
* columnName: "(Sample) Retail - Apparel::city",
|
|
6029
|
+
* operator: 'IN',
|
|
6024
6030
|
* values: ["atlanta"]
|
|
6025
6031
|
* },
|
|
6026
6032
|
* {
|
|
6027
|
-
*
|
|
6028
|
-
*
|
|
6033
|
+
* columnName: "(Sample) Retail - Apparel::Region",
|
|
6034
|
+
* operator: 'IN',
|
|
6029
6035
|
* values: ["West","Midwest"]
|
|
6030
6036
|
* }]
|
|
6031
6037
|
* });
|
|
@@ -6036,8 +6042,8 @@ export enum HostEvent {
|
|
|
6036
6042
|
* import { ContextType } from '@thoughtspot/visual-embed-sdk';
|
|
6037
6043
|
* liveboardEmbed.trigger(HostEvent.UpdateFilters, {
|
|
6038
6044
|
* filter: {
|
|
6039
|
-
*
|
|
6040
|
-
*
|
|
6045
|
+
* columnName: "item type",
|
|
6046
|
+
* operator: "IN",
|
|
6041
6047
|
* values: ["shoes", "boots"]
|
|
6042
6048
|
* }
|
|
6043
6049
|
* }, ContextType.Liveboard);
|
|
@@ -6047,8 +6053,8 @@ export enum HostEvent {
|
|
|
6047
6053
|
* // Scope the filter to a specific Liveboard tab
|
|
6048
6054
|
* liveboardEmbed.trigger(HostEvent.UpdateFilters, {
|
|
6049
6055
|
* filter: {
|
|
6050
|
-
*
|
|
6051
|
-
*
|
|
6056
|
+
* columnName: "item type",
|
|
6057
|
+
* operator: "IN",
|
|
6052
6058
|
* values: ["bags", "shirts"],
|
|
6053
6059
|
* applicability: {
|
|
6054
6060
|
* level: "TAB",
|
|
@@ -6057,6 +6063,12 @@ export enum HostEvent {
|
|
|
6057
6063
|
* }
|
|
6058
6064
|
* });
|
|
6059
6065
|
* ```
|
|
6066
|
+
* Use `columnName` and `operator` - the same spelling as
|
|
6067
|
+
* {@link RuntimeFilter}. The older `column` and `oper` spellings are
|
|
6068
|
+
* deprecated; they are still accepted, but pass only one spelling of each
|
|
6069
|
+
* field, never both. To reapply the filter state captured from
|
|
6070
|
+
* {@link EmbedEvent.FilterChanged}, use `convertFilterChangedToUpdateFiltersPayload`
|
|
6071
|
+
* to convert its payload into the shape expected here.
|
|
6060
6072
|
* @version SDK: 1.23.0 | ThoughtSpot: 9.4.0.cl
|
|
6061
6073
|
*/
|
|
6062
6074
|
UpdateFilters = 'updateFilters',
|
|
@@ -7053,7 +7065,6 @@ export enum Param {
|
|
|
7053
7065
|
IsStarterPromptsEnabled = 'enableStarterPrompts',
|
|
7054
7066
|
UpdatedSpotterExperience = 'updatedSpotterExperience',
|
|
7055
7067
|
SpotterDataSources = 'spotterDataSources',
|
|
7056
|
-
AnalystId = 'analystId',
|
|
7057
7068
|
OpenSpotterOnLiveboardByDefault = 'openSpotterOnLiveboardByDefault',
|
|
7058
7069
|
ShowAnswerEditPanel = 'showAnswerEditPanel',
|
|
7059
7070
|
}
|
|
@@ -9311,6 +9322,18 @@ export enum Action {
|
|
|
9311
9322
|
* ```
|
|
9312
9323
|
*/
|
|
9313
9324
|
DeleteCollection = 'deleteCollection',
|
|
9325
|
+
/**
|
|
9326
|
+
* Controls the visibility of the "Customize homepage" button on the
|
|
9327
|
+
* embedded home page.
|
|
9328
|
+
* @version SDK: 1.55.0 | ThoughtSpot Cloud: 26.12.0.cl
|
|
9329
|
+
* @example
|
|
9330
|
+
* ```js
|
|
9331
|
+
* {
|
|
9332
|
+
* hiddenActions: [Action.CustomizeHomepage],
|
|
9333
|
+
* }
|
|
9334
|
+
* ```
|
|
9335
|
+
*/
|
|
9336
|
+
CustomizeHomepage = 'customizeHomepage',
|
|
9314
9337
|
}
|
|
9315
9338
|
export interface AnswerServiceType {
|
|
9316
9339
|
getAnswer?: (offset: number, batchSize: number) => any;
|
|
@@ -79,7 +79,8 @@ describe('fetchPreauthInfoService', () => {
|
|
|
79
79
|
});
|
|
80
80
|
it('fetchPreauthInfoService if fetch fails', async () => {
|
|
81
81
|
const mockFetch = jest.spyOn(tokenizedFetchModule, 'tokenizedFetch');
|
|
82
|
-
// Prevent logger.error from reaching console.error (which throws in
|
|
82
|
+
// Prevent logger.error from reaching console.error (which throws in
|
|
83
|
+
// test env)
|
|
83
84
|
jest.spyOn(logger, 'error').mockImplementation(() => {});
|
|
84
85
|
|
|
85
86
|
mockFetch.mockResolvedValueOnce({
|
|
@@ -439,7 +439,8 @@ describe('getCustomActions function', () => {
|
|
|
439
439
|
metadataIds: { liveboardIds: ['lb-1'] },
|
|
440
440
|
} as any;
|
|
441
441
|
const result = getCustomActions([action]);
|
|
442
|
-
// Expect an error containing 'none' for unsupported metadataIds on
|
|
442
|
+
// Expect an error containing 'none' for unsupported metadataIds on
|
|
443
|
+
// SPOTTER
|
|
443
444
|
expect(result.errors.some((e) => e.includes('none'))).toBe(true);
|
|
444
445
|
});
|
|
445
446
|
|
|
@@ -452,7 +453,8 @@ describe('getCustomActions function', () => {
|
|
|
452
453
|
dataModelIds: { modelIds: ['model-1'] },
|
|
453
454
|
} as any;
|
|
454
455
|
const result = getCustomActions([action]);
|
|
455
|
-
// Expect an error containing 'none' for unsupported dataModelIds
|
|
456
|
+
// Expect an error containing 'none' for unsupported dataModelIds
|
|
457
|
+
// on LIVEBOARD
|
|
456
458
|
expect(result.errors.some((e) => e.includes('none'))).toBe(true);
|
|
457
459
|
});
|
|
458
460
|
});
|