@thoughtspot/visual-embed-sdk 1.20.2 → 1.20.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/README.md +1 -1
- package/cjs/package.json +171 -0
- package/cjs/src/auth.d.ts +183 -0
- package/cjs/src/auth.d.ts.map +1 -0
- package/cjs/src/auth.js +457 -0
- package/cjs/src/auth.js.map +1 -0
- package/cjs/src/auth.spec.d.ts +13 -0
- package/cjs/src/auth.spec.d.ts.map +1 -0
- package/cjs/src/auth.spec.js +397 -0
- package/cjs/src/auth.spec.js.map +1 -0
- package/cjs/src/config.d.ts +22 -0
- package/cjs/src/config.d.ts.map +1 -0
- package/cjs/src/config.js +70 -0
- package/cjs/src/config.js.map +1 -0
- package/cjs/src/config.spec.d.ts +5 -0
- package/cjs/src/config.spec.d.ts.map +1 -0
- package/cjs/src/config.spec.js +65 -0
- package/cjs/src/config.spec.js.map +1 -0
- package/cjs/src/embed/app.d.ts +168 -0
- package/cjs/src/embed/app.d.ts.map +1 -0
- package/cjs/src/embed/app.js +215 -0
- package/cjs/src/embed/app.js.map +1 -0
- package/cjs/src/embed/app.spec.d.ts +2 -0
- package/cjs/src/embed/app.spec.d.ts.map +1 -0
- package/cjs/src/embed/app.spec.js +239 -0
- package/cjs/src/embed/app.spec.js.map +1 -0
- package/cjs/src/embed/base.d.ts +79 -0
- package/cjs/src/embed/base.d.ts.map +1 -0
- package/cjs/src/embed/base.js +229 -0
- package/cjs/src/embed/base.js.map +1 -0
- package/cjs/src/embed/base.spec.d.ts +2 -0
- package/cjs/src/embed/base.spec.d.ts.map +1 -0
- package/cjs/src/embed/base.spec.js +198 -0
- package/cjs/src/embed/base.spec.js.map +1 -0
- package/cjs/src/embed/embed.spec.d.ts +2 -0
- package/cjs/src/embed/embed.spec.d.ts.map +1 -0
- package/cjs/src/embed/embed.spec.js +74 -0
- package/cjs/src/embed/embed.spec.js.map +1 -0
- package/cjs/src/embed/events.spec.d.ts +2 -0
- package/cjs/src/embed/events.spec.d.ts.map +1 -0
- package/cjs/src/embed/events.spec.js +238 -0
- package/cjs/src/embed/events.spec.js.map +1 -0
- package/cjs/src/embed/liveboard.d.ts +150 -0
- package/cjs/src/embed/liveboard.d.ts.map +1 -0
- package/cjs/src/embed/liveboard.js +168 -0
- package/cjs/src/embed/liveboard.js.map +1 -0
- package/cjs/src/embed/liveboard.spec.d.ts +2 -0
- package/cjs/src/embed/liveboard.spec.d.ts.map +1 -0
- package/cjs/src/embed/liveboard.spec.js +229 -0
- package/cjs/src/embed/liveboard.spec.js.map +1 -0
- package/cjs/src/embed/pinboard.spec.d.ts +2 -0
- package/cjs/src/embed/pinboard.spec.d.ts.map +1 -0
- package/cjs/src/embed/pinboard.spec.js +148 -0
- package/cjs/src/embed/pinboard.spec.js.map +1 -0
- package/cjs/src/embed/search-bar.d.ts +50 -0
- package/cjs/src/embed/search-bar.d.ts.map +1 -0
- package/cjs/src/embed/search-bar.js +63 -0
- package/cjs/src/embed/search-bar.js.map +1 -0
- package/cjs/src/embed/search.d.ts +129 -0
- package/cjs/src/embed/search.d.ts.map +1 -0
- package/cjs/src/embed/search.js +121 -0
- package/cjs/src/embed/search.js.map +1 -0
- package/cjs/src/embed/search.spec.d.ts +2 -0
- package/cjs/src/embed/search.spec.d.ts.map +1 -0
- package/cjs/src/embed/search.spec.js +238 -0
- package/cjs/src/embed/search.spec.js.map +1 -0
- package/cjs/src/embed/searchEmbed-basic-auth.spec.d.ts +2 -0
- package/cjs/src/embed/searchEmbed-basic-auth.spec.d.ts.map +1 -0
- package/cjs/src/embed/searchEmbed-basic-auth.spec.js +103 -0
- package/cjs/src/embed/searchEmbed-basic-auth.spec.js.map +1 -0
- package/cjs/src/embed/ts-embed.d.ts +323 -0
- package/cjs/src/embed/ts-embed.d.ts.map +1 -0
- package/cjs/src/embed/ts-embed.js +719 -0
- package/cjs/src/embed/ts-embed.js.map +1 -0
- package/cjs/src/embed/ts-embed.spec.d.ts +2 -0
- package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -0
- package/cjs/src/embed/ts-embed.spec.js +771 -0
- package/cjs/src/embed/ts-embed.spec.js.map +1 -0
- package/cjs/src/errors.d.ts +7 -0
- package/cjs/src/errors.d.ts.map +1 -0
- package/cjs/src/errors.js +10 -0
- package/cjs/src/errors.js.map +1 -0
- package/cjs/src/index.d.ts +18 -0
- package/cjs/src/index.d.ts.map +1 -0
- package/cjs/src/index.js +42 -0
- package/cjs/src/index.js.map +1 -0
- package/cjs/src/mixpanel-service.d.ts +29 -0
- package/cjs/src/mixpanel-service.d.ts.map +1 -0
- package/cjs/src/mixpanel-service.js +76 -0
- package/cjs/src/mixpanel-service.js.map +1 -0
- package/cjs/src/mixpanel-service.spec.d.ts +2 -0
- package/cjs/src/mixpanel-service.spec.d.ts.map +1 -0
- package/cjs/src/mixpanel-service.spec.js +63 -0
- package/cjs/src/mixpanel-service.spec.js.map +1 -0
- package/cjs/src/react/all-types-export.d.ts +3 -0
- package/cjs/src/react/all-types-export.d.ts.map +1 -0
- package/cjs/src/react/all-types-export.js +29 -0
- package/cjs/src/react/all-types-export.js.map +1 -0
- package/cjs/src/react/all-types-export.spec.d.ts +2 -0
- package/cjs/src/react/all-types-export.spec.d.ts.map +1 -0
- package/cjs/src/react/all-types-export.spec.js +13 -0
- package/cjs/src/react/all-types-export.spec.js.map +1 -0
- package/cjs/src/react/index.d.ts +95 -0
- package/cjs/src/react/index.d.ts.map +1 -0
- package/cjs/src/react/index.js +121 -0
- package/cjs/src/react/index.js.map +1 -0
- package/cjs/src/react/index.spec.d.ts +3 -0
- package/cjs/src/react/index.spec.d.ts.map +1 -0
- package/cjs/src/react/index.spec.js +138 -0
- package/cjs/src/react/index.spec.js.map +1 -0
- package/cjs/src/react/util.d.ts +19 -0
- package/cjs/src/react/util.d.ts.map +1 -0
- package/cjs/src/react/util.js +25 -0
- package/cjs/src/react/util.js.map +1 -0
- package/cjs/src/test/test-utils.d.ts +48 -0
- package/cjs/src/test/test-utils.d.ts.map +1 -0
- package/cjs/src/test/test-utils.js +108 -0
- package/cjs/src/test/test-utils.js.map +1 -0
- package/cjs/src/types.d.ts +2020 -0
- package/cjs/src/types.d.ts.map +1 -0
- package/cjs/src/types.js +1543 -0
- package/cjs/src/types.js.map +1 -0
- package/cjs/src/utils/answerService.d.ts +10 -0
- package/cjs/src/utils/answerService.d.ts.map +1 -0
- package/cjs/src/utils/answerService.js +61 -0
- package/cjs/src/utils/answerService.js.map +1 -0
- package/cjs/src/utils/answerService.spec.d.ts +2 -0
- package/cjs/src/utils/answerService.spec.d.ts.map +1 -0
- package/cjs/src/utils/answerService.spec.js +31 -0
- package/cjs/src/utils/answerService.spec.js.map +1 -0
- package/cjs/src/utils/authService.d.ts +37 -0
- package/cjs/src/utils/authService.d.ts.map +1 -0
- package/cjs/src/utils/authService.js +106 -0
- package/cjs/src/utils/authService.js.map +1 -0
- package/cjs/src/utils/authService.spec.d.ts +2 -0
- package/cjs/src/utils/authService.spec.d.ts.map +1 -0
- package/cjs/src/utils/authService.spec.js +72 -0
- package/cjs/src/utils/authService.spec.js.map +1 -0
- package/cjs/src/utils/processData.d.ts +16 -0
- package/cjs/src/utils/processData.d.ts.map +1 -0
- package/cjs/src/utils/processData.js +110 -0
- package/cjs/src/utils/processData.js.map +1 -0
- package/cjs/src/utils/processData.spec.d.ts +2 -0
- package/cjs/src/utils/processData.spec.d.ts.map +1 -0
- package/cjs/src/utils/processData.spec.js +142 -0
- package/cjs/src/utils/processData.spec.js.map +1 -0
- package/cjs/src/utils/processTrigger.d.ts +10 -0
- package/cjs/src/utils/processTrigger.d.ts.map +1 -0
- package/cjs/src/utils/processTrigger.js +63 -0
- package/cjs/src/utils/processTrigger.js.map +1 -0
- package/cjs/src/utils/processTrigger.spec.d.ts +2 -0
- package/cjs/src/utils/processTrigger.spec.d.ts.map +1 -0
- package/cjs/src/utils/processTrigger.spec.js +58 -0
- package/cjs/src/utils/processTrigger.spec.js.map +1 -0
- package/cjs/src/utils.d.ts +68 -0
- package/cjs/src/utils.d.ts.map +1 -0
- package/cjs/src/utils.js +196 -0
- package/cjs/src/utils.js.map +1 -0
- package/cjs/src/utils.spec.d.ts +5 -0
- package/cjs/src/utils.spec.d.ts.map +1 -0
- package/cjs/src/utils.spec.js +98 -0
- package/cjs/src/utils.spec.js.map +1 -0
- package/dist/src/auth.d.ts +54 -5
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/auth.spec.d.ts +3 -0
- package/dist/src/auth.spec.d.ts.map +1 -1
- package/dist/src/config.d.ts +1 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +35 -6
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts +20 -9
- package/dist/src/embed/base.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +17 -5
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/search-bar.d.ts +3 -0
- package/dist/src/embed/search-bar.d.ts.map +1 -1
- package/dist/src/embed/search.d.ts +9 -1
- package/dist/src/embed/search.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +65 -7
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/mixpanel-service.d.ts +8 -0
- package/dist/src/mixpanel-service.d.ts.map +1 -1
- package/dist/src/react/all-types-export.d.ts +3 -0
- package/dist/src/react/all-types-export.d.ts.map +1 -0
- package/dist/src/react/all-types-export.spec.d.ts +2 -0
- package/dist/src/react/all-types-export.spec.d.ts.map +1 -0
- package/dist/src/react/index.d.ts +72 -0
- package/dist/src/react/index.d.ts.map +1 -1
- package/dist/src/react/util.d.ts +4 -0
- package/dist/src/react/util.d.ts.map +1 -1
- package/dist/src/test/test-utils.d.ts +11 -2
- package/dist/src/test/test-utils.d.ts.map +1 -1
- package/dist/src/types.d.ts +499 -96
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/answerService.d.ts +7 -0
- package/dist/src/utils/answerService.d.ts.map +1 -1
- package/dist/src/utils/authService.d.ts +30 -0
- package/dist/src/utils/authService.d.ts.map +1 -1
- package/dist/src/utils/processData.d.ts +12 -0
- package/dist/src/utils/processData.d.ts.map +1 -1
- package/dist/src/utils/processTrigger.d.ts +7 -0
- package/dist/src/utils/processTrigger.d.ts.map +1 -1
- package/dist/src/utils.d.ts +12 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +28024 -0
- package/dist/tsembed-react.js +27966 -0
- package/dist/tsembed.es.js +18114 -305
- package/dist/tsembed.js +18088 -327
- package/dist/visual-embed-sdk-react-full.d.ts +3092 -0
- package/dist/visual-embed-sdk-react.d.ts +2781 -0
- package/dist/visual-embed-sdk.d.ts +2944 -0
- package/lib/package.json +15 -14
- package/lib/src/auth.d.ts +54 -5
- package/lib/src/auth.d.ts.map +1 -1
- package/lib/src/auth.js +91 -31
- package/lib/src/auth.js.map +1 -1
- package/lib/src/auth.spec.d.ts +3 -0
- package/lib/src/auth.spec.d.ts.map +1 -1
- package/lib/src/auth.spec.js +37 -6
- package/lib/src/auth.spec.js.map +1 -1
- package/lib/src/config.d.ts +1 -0
- package/lib/src/config.d.ts.map +1 -1
- package/lib/src/config.js +5 -3
- package/lib/src/config.js.map +1 -1
- package/lib/src/config.spec.js.map +1 -1
- package/lib/src/embed/app.d.ts +35 -6
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +55 -16
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +41 -12
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts +20 -9
- package/lib/src/embed/base.d.ts.map +1 -1
- package/lib/src/embed/base.js +31 -15
- package/lib/src/embed/base.js.map +1 -1
- package/lib/src/embed/base.spec.js.map +1 -1
- package/lib/src/embed/embed.spec.js +1 -1
- package/lib/src/embed/embed.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +17 -5
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +49 -37
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +37 -30
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/pinboard.spec.js +14 -26
- package/lib/src/embed/pinboard.spec.js.map +1 -1
- package/lib/src/embed/search-bar.d.ts +3 -0
- package/lib/src/embed/search-bar.d.ts.map +1 -1
- package/lib/src/embed/search-bar.js +5 -6
- package/lib/src/embed/search-bar.js.map +1 -1
- package/lib/src/embed/search.d.ts +9 -1
- package/lib/src/embed/search.d.ts.map +1 -1
- package/lib/src/embed/search.js +18 -14
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/search.spec.js +16 -19
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/searchEmbed-basic-auth.spec.js +4 -0
- package/lib/src/embed/searchEmbed-basic-auth.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +65 -7
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +154 -77
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +46 -24
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/errors.d.ts.map +1 -1
- package/lib/src/errors.js.map +1 -1
- package/lib/src/index.d.ts +2 -2
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +4 -4
- package/lib/src/index.js.map +1 -1
- package/lib/src/mixpanel-service.d.ts +8 -0
- package/lib/src/mixpanel-service.d.ts.map +1 -1
- package/lib/src/mixpanel-service.js +13 -1
- package/lib/src/mixpanel-service.js.map +1 -1
- package/lib/src/mixpanel-service.spec.js.map +1 -1
- package/lib/src/react/all-types-export.d.ts +3 -0
- package/lib/src/react/all-types-export.d.ts.map +1 -0
- package/lib/src/react/all-types-export.js +5 -0
- package/lib/src/react/all-types-export.js.map +1 -0
- package/lib/src/react/all-types-export.spec.d.ts +2 -0
- package/lib/src/react/all-types-export.spec.d.ts.map +1 -0
- package/lib/src/react/all-types-export.spec.js +10 -0
- package/lib/src/react/all-types-export.spec.js.map +1 -0
- package/lib/src/react/index.d.ts +72 -0
- package/lib/src/react/index.d.ts.map +1 -1
- package/lib/src/react/index.js +79 -7
- package/lib/src/react/index.js.map +1 -1
- package/lib/src/react/index.spec.js +27 -6
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/react/util.d.ts +4 -0
- package/lib/src/react/util.d.ts.map +1 -1
- package/lib/src/react/util.js +4 -0
- package/lib/src/react/util.js.map +1 -1
- package/lib/src/test/test-utils.d.ts +11 -2
- package/lib/src/test/test-utils.d.ts.map +1 -1
- package/lib/src/test/test-utils.js +36 -25
- package/lib/src/test/test-utils.js.map +1 -1
- package/lib/src/types.d.ts +499 -96
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +374 -68
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/answerService.d.ts +7 -0
- package/lib/src/utils/answerService.d.ts.map +1 -1
- package/lib/src/utils/answerService.js +7 -0
- package/lib/src/utils/answerService.js.map +1 -1
- package/lib/src/utils/answerService.spec.js.map +1 -1
- package/lib/src/utils/authService.d.ts +30 -0
- package/lib/src/utils/authService.d.ts.map +1 -1
- package/lib/src/utils/authService.js +39 -2
- package/lib/src/utils/authService.js.map +1 -1
- package/lib/src/utils/authService.spec.js.map +1 -1
- package/lib/src/utils/processData.d.ts +12 -0
- package/lib/src/utils/processData.d.ts.map +1 -1
- package/lib/src/utils/processData.js +33 -5
- package/lib/src/utils/processData.js.map +1 -1
- package/lib/src/utils/processData.spec.js.map +1 -1
- package/lib/src/utils/processTrigger.d.ts +7 -0
- package/lib/src/utils/processTrigger.d.ts.map +1 -1
- package/lib/src/utils/processTrigger.js +17 -3
- package/lib/src/utils/processTrigger.js.map +1 -1
- package/lib/src/utils/processTrigger.spec.js.map +1 -1
- package/lib/src/utils.d.ts +12 -0
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +24 -19
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js.map +1 -1
- package/package.json +15 -14
- package/src/auth.spec.ts +83 -133
- package/src/auth.ts +148 -115
- package/src/config.spec.ts +2 -4
- package/src/config.ts +5 -3
- package/src/embed/app.spec.ts +57 -14
- package/src/embed/app.ts +91 -36
- package/src/embed/base.spec.ts +3 -9
- package/src/embed/base.ts +51 -53
- package/src/embed/embed.spec.ts +5 -6
- package/src/embed/liveboard.spec.ts +56 -37
- package/src/embed/liveboard.ts +66 -64
- package/src/embed/pinboard.spec.ts +26 -29
- package/src/embed/search-bar.tsx +10 -8
- package/src/embed/search.spec.ts +31 -21
- package/src/embed/search.ts +26 -20
- package/src/embed/searchEmbed-basic-auth.spec.ts +22 -28
- package/src/embed/ts-embed.spec.ts +99 -144
- package/src/embed/ts-embed.ts +188 -162
- package/src/errors.ts +3 -6
- package/src/index.ts +6 -10
- package/src/mixpanel-service.spec.ts +1 -3
- package/src/mixpanel-service.ts +13 -1
- package/src/react/index.spec.tsx +66 -13
- package/src/react/index.tsx +111 -62
- package/src/react/util.ts +8 -4
- package/src/test/test-utils.ts +43 -39
- package/src/types.ts +498 -98
- package/src/utils/answerService.spec.ts +3 -5
- package/src/utils/answerService.ts +21 -17
- package/src/utils/authService.spec.ts +26 -41
- package/src/utils/authService.ts +47 -21
- package/src/utils/processData.spec.ts +26 -59
- package/src/utils/processData.ts +36 -14
- package/src/utils/processTrigger.spec.ts +1 -6
- package/src/utils/processTrigger.ts +18 -9
- package/src/utils.spec.ts +8 -12
- package/src/utils.ts +25 -26
- package/lib/src/visual-embed-sdk.d.ts +0 -2419
package/src/embed/app.spec.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { AppEmbed, AppViewConfig, Page } from './app';
|
|
2
2
|
import { init } from '../index';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
Action, AuthType, EmbedEvent, HostEvent, RuntimeFilterOp,
|
|
5
|
+
} from '../types';
|
|
4
6
|
import {
|
|
5
7
|
executeAfterWait,
|
|
6
8
|
getDocumentBody,
|
|
@@ -11,9 +13,11 @@ import {
|
|
|
11
13
|
defaultParams,
|
|
12
14
|
defaultParamsForPinboardEmbed,
|
|
13
15
|
defaultParamsWithoutHiddenActions,
|
|
16
|
+
expectUrlMatchesWithParams,
|
|
14
17
|
} from '../test/test-utils';
|
|
15
18
|
import { version } from '../../package.json';
|
|
16
19
|
import * as config from '../config';
|
|
20
|
+
import { TsEmbed, V1Embed } from './ts-embed';
|
|
17
21
|
|
|
18
22
|
const defaultViewConfig = {
|
|
19
23
|
frameParams: {
|
|
@@ -44,7 +48,8 @@ describe('App embed tests', () => {
|
|
|
44
48
|
const appEmbed = new AppEmbed(getRootEl(), defaultViewConfig);
|
|
45
49
|
appEmbed.render();
|
|
46
50
|
await executeAfterWait(() => {
|
|
47
|
-
|
|
51
|
+
expectUrlMatchesWithParams(
|
|
52
|
+
getIFrameSrc(),
|
|
48
53
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false${defaultParams}${defaultParamsPost}#/home`,
|
|
49
54
|
);
|
|
50
55
|
});
|
|
@@ -57,7 +62,8 @@ describe('App embed tests', () => {
|
|
|
57
62
|
} as AppViewConfig);
|
|
58
63
|
appEmbed.render();
|
|
59
64
|
await executeAfterWait(() => {
|
|
60
|
-
|
|
65
|
+
expectUrlMatchesWithParams(
|
|
66
|
+
getIFrameSrc(),
|
|
61
67
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=false&profileAndHelpInNavBarHidden=false${defaultParams}${defaultParamsPost}#/home`,
|
|
62
68
|
);
|
|
63
69
|
});
|
|
@@ -70,7 +76,8 @@ describe('App embed tests', () => {
|
|
|
70
76
|
} as AppViewConfig);
|
|
71
77
|
appEmbed.render();
|
|
72
78
|
await executeAfterWait(() => {
|
|
73
|
-
|
|
79
|
+
expectUrlMatchesWithParams(
|
|
80
|
+
getIFrameSrc(),
|
|
74
81
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=true${defaultParams}${defaultParamsPost}#/home`,
|
|
75
82
|
);
|
|
76
83
|
});
|
|
@@ -101,7 +108,8 @@ describe('App embed tests', () => {
|
|
|
101
108
|
appEmbed.render();
|
|
102
109
|
|
|
103
110
|
await executeAfterWait(() => {
|
|
104
|
-
|
|
111
|
+
expectUrlMatchesWithParams(
|
|
112
|
+
getIFrameSrc(),
|
|
105
113
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false${defaultParams}${defaultParamsPost}#/${route}`,
|
|
106
114
|
);
|
|
107
115
|
cleanUp();
|
|
@@ -117,7 +125,8 @@ describe('App embed tests', () => {
|
|
|
117
125
|
} as AppViewConfig);
|
|
118
126
|
appEmbed.render();
|
|
119
127
|
await executeAfterWait(() => {
|
|
120
|
-
|
|
128
|
+
expectUrlMatchesWithParams(
|
|
129
|
+
getIFrameSrc(),
|
|
121
130
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false${defaultParams}${defaultParamsPost}#/foo/bar`,
|
|
122
131
|
);
|
|
123
132
|
});
|
|
@@ -138,7 +147,8 @@ describe('App embed tests', () => {
|
|
|
138
147
|
|
|
139
148
|
appEmbed.render();
|
|
140
149
|
await executeAfterWait(() => {
|
|
141
|
-
|
|
150
|
+
expectUrlMatchesWithParams(
|
|
151
|
+
getIFrameSrc(),
|
|
142
152
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=false&profileAndHelpInNavBarHidden=false&col1=sales&op1=EQ&val1=1000${defaultParams}${defaultParamsPost}#/home`,
|
|
143
153
|
);
|
|
144
154
|
});
|
|
@@ -155,7 +165,8 @@ describe('App embed tests', () => {
|
|
|
155
165
|
|
|
156
166
|
appEmbed.render();
|
|
157
167
|
await executeAfterWait(() => {
|
|
158
|
-
|
|
168
|
+
expectUrlMatchesWithParams(
|
|
169
|
+
getIFrameSrc(),
|
|
159
170
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=false&profileAndHelpInNavBarHidden=false&${defaultParamsWithoutHiddenActions}&disableAction=[%22save%22,%22update%22]&disableHint=Access%20denied&hideAction=[%22${Action.ReportError}%22,%22download%22]${defaultParamsPost}#/home`,
|
|
160
171
|
);
|
|
161
172
|
});
|
|
@@ -170,7 +181,8 @@ describe('App embed tests', () => {
|
|
|
170
181
|
|
|
171
182
|
appEmbed.render();
|
|
172
183
|
await executeAfterWait(() => {
|
|
173
|
-
|
|
184
|
+
expectUrlMatchesWithParams(
|
|
185
|
+
getIFrameSrc(),
|
|
174
186
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false${defaultParams}&tag=Finance${defaultParamsPost}#/home`,
|
|
175
187
|
);
|
|
176
188
|
});
|
|
@@ -184,18 +196,48 @@ describe('App embed tests', () => {
|
|
|
184
196
|
|
|
185
197
|
appEmbed.render();
|
|
186
198
|
await executeAfterWait(() => {
|
|
187
|
-
|
|
199
|
+
expectUrlMatchesWithParams(
|
|
200
|
+
getIFrameSrc(),
|
|
188
201
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&enableSearchAssist=true${defaultParams}${defaultParamsPost}#/home`,
|
|
189
202
|
);
|
|
190
203
|
});
|
|
191
204
|
});
|
|
192
205
|
|
|
206
|
+
test('should register event handlers to adjust iframe height', async () => {
|
|
207
|
+
const onSpy = jest.spyOn(AppEmbed.prototype, 'on')
|
|
208
|
+
.mockImplementation((event, callback) => {
|
|
209
|
+
if (event === EmbedEvent.RouteChange) {
|
|
210
|
+
callback({ data: { currentPath: '/answers' } }, jest.fn());
|
|
211
|
+
}
|
|
212
|
+
if (event === EmbedEvent.EmbedHeight) {
|
|
213
|
+
callback({ data: '100%' });
|
|
214
|
+
}
|
|
215
|
+
if (event === EmbedEvent.EmbedIframeCenter) {
|
|
216
|
+
callback({}, jest.fn());
|
|
217
|
+
}
|
|
218
|
+
return null;
|
|
219
|
+
});
|
|
220
|
+
jest.spyOn(TsEmbed.prototype as any, 'getIframeCenter').mockReturnValue({});
|
|
221
|
+
jest.spyOn(TsEmbed.prototype as any, 'setIFrameHeight').mockReturnValue({});
|
|
222
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
223
|
+
...defaultViewConfig,
|
|
224
|
+
fullHeight: true,
|
|
225
|
+
} as AppViewConfig);
|
|
226
|
+
|
|
227
|
+
appEmbed.render();
|
|
228
|
+
|
|
229
|
+
await executeAfterWait(() => {
|
|
230
|
+
expect(onSpy).toHaveBeenCalledWith(EmbedEvent.EmbedHeight, expect.anything());
|
|
231
|
+
expect(onSpy).toHaveBeenCalledWith(EmbedEvent.RouteChange, expect.anything());
|
|
232
|
+
expect(onSpy).toHaveBeenCalledWith(EmbedEvent.EmbedIframeCenter, expect.anything());
|
|
233
|
+
});
|
|
234
|
+
jest.clearAllMocks();
|
|
235
|
+
});
|
|
236
|
+
|
|
193
237
|
describe('Navigate to Page API', () => {
|
|
194
238
|
const path = 'pinboard/e0836cad-4fdf-42d4-bd97-567a6b2a6058';
|
|
195
239
|
beforeEach(() => {
|
|
196
|
-
jest.spyOn(config, 'getThoughtSpotHost').mockImplementation(
|
|
197
|
-
() => 'http://tshost',
|
|
198
|
-
);
|
|
240
|
+
jest.spyOn(config, 'getThoughtSpotHost').mockImplementation(() => 'http://tshost');
|
|
199
241
|
});
|
|
200
242
|
|
|
201
243
|
test('when app is AppEmbed after navigateToPage function call, new path should be set to iframe', async () => {
|
|
@@ -207,7 +249,8 @@ describe('App embed tests', () => {
|
|
|
207
249
|
});
|
|
208
250
|
await appEmbed.render();
|
|
209
251
|
appEmbed.navigateToPage(path);
|
|
210
|
-
|
|
252
|
+
expectUrlMatchesWithParams(
|
|
253
|
+
getIFrameSrc(),
|
|
211
254
|
`http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}${defaultParamsPost}#/${path}`,
|
|
212
255
|
);
|
|
213
256
|
});
|
package/src/embed/app.ts
CHANGED
|
@@ -9,13 +9,9 @@
|
|
|
9
9
|
* @author Ayon Ghosh <ayon.ghosh@thoughtspot.com>
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import {
|
|
12
|
+
import { getQueryParamString } from '../utils';
|
|
13
13
|
import {
|
|
14
|
-
Param,
|
|
15
|
-
RuntimeFilter,
|
|
16
|
-
DOMSelector,
|
|
17
|
-
HostEvent,
|
|
18
|
-
ViewConfig,
|
|
14
|
+
Param, DOMSelector, HostEvent, ViewConfig, EmbedEvent, MessagePayload,
|
|
19
15
|
} from '../types';
|
|
20
16
|
import { V1Embed } from './ts-embed';
|
|
21
17
|
|
|
@@ -56,6 +52,7 @@ export enum Page {
|
|
|
56
52
|
|
|
57
53
|
/**
|
|
58
54
|
* The view configuration for full app embedding.
|
|
55
|
+
*
|
|
59
56
|
* @group Embed components
|
|
60
57
|
*/
|
|
61
58
|
export interface AppViewConfig extends ViewConfig {
|
|
@@ -81,8 +78,9 @@ export interface AppViewConfig extends ViewConfig {
|
|
|
81
78
|
*/
|
|
82
79
|
pageId?: Page;
|
|
83
80
|
/**
|
|
84
|
-
* This puts a filter tag on the application. All metadata lists in the
|
|
85
|
-
* Liveboards and answers, would be filtered by this
|
|
81
|
+
* This puts a filter tag on the application. All metadata lists in the
|
|
82
|
+
* application, such as Liveboards and answers, would be filtered by this
|
|
83
|
+
* tag.
|
|
86
84
|
*/
|
|
87
85
|
tag?: string;
|
|
88
86
|
/**
|
|
@@ -92,36 +90,71 @@ export interface AppViewConfig extends ViewConfig {
|
|
|
92
90
|
/**
|
|
93
91
|
* Render liveboards using the new v2 rendering mode
|
|
94
92
|
* This is a transient flag which is primarily meant for internal use
|
|
93
|
+
*
|
|
95
94
|
* @version SDK: 1.11.0 | ThoughtSpot: 8.3.0.cl, 8.4.1-sw
|
|
96
95
|
* @hidden
|
|
97
96
|
*/
|
|
98
97
|
liveboardV2?: boolean;
|
|
99
98
|
/**
|
|
100
99
|
* If set to true, the Search Assist feature is enabled.
|
|
100
|
+
*
|
|
101
101
|
* @version SDK: 1.13.0 | ThoughtSpot: 8.5.0.cl, 8.8.1-sw
|
|
102
102
|
*/
|
|
103
103
|
enableSearchAssist?: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* If set to true, the embedded object container dynamically resizes
|
|
106
|
+
* according to the height of the pages which support fullHeight mode.
|
|
107
|
+
*
|
|
108
|
+
* @version SDK: 1.21.0 | ThoughtSpot: 9.4.0.cl, 9.4.0-sw
|
|
109
|
+
*/
|
|
110
|
+
fullHeight?:boolean;
|
|
104
111
|
}
|
|
105
112
|
|
|
106
113
|
/**
|
|
107
114
|
* Embeds full ThoughtSpot experience in a host application.
|
|
115
|
+
*
|
|
108
116
|
* @group Embed components
|
|
109
117
|
*/
|
|
110
118
|
export class AppEmbed extends V1Embed {
|
|
111
119
|
protected viewConfig: AppViewConfig;
|
|
112
120
|
|
|
121
|
+
private defaultHeight = '100%';
|
|
122
|
+
|
|
113
123
|
// eslint-disable-next-line no-useless-constructor
|
|
114
124
|
constructor(domSelector: DOMSelector, viewConfig: AppViewConfig) {
|
|
115
125
|
super(domSelector, viewConfig);
|
|
126
|
+
if (this.viewConfig.fullHeight === true) {
|
|
127
|
+
this.on(EmbedEvent.RouteChange, this.setIframeHeightForNonEmbedLiveboard);
|
|
128
|
+
this.on(EmbedEvent.EmbedHeight, this.updateIFrameHeight);
|
|
129
|
+
this.on(EmbedEvent.EmbedIframeCenter, this.embedIframeCenter);
|
|
130
|
+
}
|
|
116
131
|
}
|
|
117
132
|
|
|
118
133
|
/**
|
|
119
134
|
* Constructs a map of parameters to be passed on to the
|
|
120
135
|
* embedded Liveboard or visualization.
|
|
121
136
|
*/
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
|
|
137
|
+
protected getEmbedParams() {
|
|
138
|
+
const {
|
|
139
|
+
tag,
|
|
140
|
+
hideObjects,
|
|
141
|
+
liveboardV2,
|
|
142
|
+
showPrimaryNavbar,
|
|
143
|
+
disableProfileAndHelp,
|
|
144
|
+
enableSearchAssist,
|
|
145
|
+
fullHeight,
|
|
146
|
+
} = this.viewConfig;
|
|
147
|
+
|
|
148
|
+
let params = {};
|
|
149
|
+
params[Param.EmbedApp] = true;
|
|
150
|
+
params[Param.PrimaryNavHidden] = !showPrimaryNavbar;
|
|
151
|
+
params[Param.HideProfleAndHelp] = !!disableProfileAndHelp;
|
|
152
|
+
|
|
153
|
+
params = this.getBaseQueryParams(params);
|
|
154
|
+
|
|
155
|
+
if (fullHeight === true) {
|
|
156
|
+
params[Param.fullHeight] = true;
|
|
157
|
+
}
|
|
125
158
|
|
|
126
159
|
if (tag) {
|
|
127
160
|
params[Param.Tag] = tag;
|
|
@@ -133,6 +166,10 @@ export class AppEmbed extends V1Embed {
|
|
|
133
166
|
params[Param.LiveboardV2Enabled] = liveboardV2;
|
|
134
167
|
}
|
|
135
168
|
|
|
169
|
+
if (enableSearchAssist !== undefined) {
|
|
170
|
+
params[Param.EnableSearchAssist] = enableSearchAssist;
|
|
171
|
+
}
|
|
172
|
+
|
|
136
173
|
const queryParams = getQueryParamString(params, true);
|
|
137
174
|
|
|
138
175
|
return queryParams;
|
|
@@ -140,21 +177,13 @@ export class AppEmbed extends V1Embed {
|
|
|
140
177
|
|
|
141
178
|
/**
|
|
142
179
|
* Constructs the URL of the ThoughtSpot app page to be rendered.
|
|
180
|
+
*
|
|
143
181
|
* @param pageId The ID of the page to be embedded.
|
|
144
182
|
*/
|
|
145
|
-
private getIFrameSrc(
|
|
146
|
-
const
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
.filter(Boolean)
|
|
150
|
-
.join('&');
|
|
151
|
-
let url = `${this.getV1EmbedBasePath(
|
|
152
|
-
queryString,
|
|
153
|
-
this.viewConfig.showPrimaryNavbar,
|
|
154
|
-
this.viewConfig.disableProfileAndHelp,
|
|
155
|
-
true,
|
|
156
|
-
this.viewConfig.enableSearchAssist,
|
|
157
|
-
)}/${pageId}`;
|
|
183
|
+
private getIFrameSrc() {
|
|
184
|
+
const { pageId, path } = this.viewConfig;
|
|
185
|
+
const pageRoute = this.formatPath(path) || this.getPageRoute(pageId);
|
|
186
|
+
let url = `${this.getRootIframeSrc()}/${pageRoute}`;
|
|
158
187
|
|
|
159
188
|
const tsPostHashParams = this.getThoughtSpotPostUrlParams();
|
|
160
189
|
url = `${url}${tsPostHashParams}`;
|
|
@@ -162,8 +191,33 @@ export class AppEmbed extends V1Embed {
|
|
|
162
191
|
return url;
|
|
163
192
|
}
|
|
164
193
|
|
|
194
|
+
/**
|
|
195
|
+
* Set the iframe height as per the computed height received
|
|
196
|
+
* from the ThoughtSpot app.
|
|
197
|
+
*
|
|
198
|
+
* @param data The event payload
|
|
199
|
+
*/
|
|
200
|
+
protected updateIFrameHeight = (data: MessagePayload) => {
|
|
201
|
+
this.setIFrameHeight(Math.max(data.data, this.iFrame?.scrollHeight));
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private embedIframeCenter = (data: MessagePayload, responder: any) => {
|
|
205
|
+
const obj = this.getIframeCenter();
|
|
206
|
+
responder({ type: EmbedEvent.EmbedIframeCenter, data: obj });
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
private setIframeHeightForNonEmbedLiveboard = (data: MessagePayload) => {
|
|
210
|
+
const {
|
|
211
|
+
height: frameHeight, ...restParams
|
|
212
|
+
} = this.viewConfig.frameParams || {};
|
|
213
|
+
if (!data.data.currentPath.startsWith('/pinboard/')) {
|
|
214
|
+
this.setIFrameHeight(frameHeight || this.defaultHeight);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
|
|
165
218
|
/**
|
|
166
219
|
* Gets the ThoughtSpot route of the page for a particular page ID.
|
|
220
|
+
*
|
|
167
221
|
* @param pageId The identifier for a page in the ThoughtSpot app.
|
|
168
222
|
*/
|
|
169
223
|
private getPageRoute(pageId: Page) {
|
|
@@ -188,6 +242,7 @@ export class AppEmbed extends V1Embed {
|
|
|
188
242
|
|
|
189
243
|
/**
|
|
190
244
|
* Formats the path provided by the user.
|
|
245
|
+
*
|
|
191
246
|
* @param path The URL path.
|
|
192
247
|
* @returns The URL path that the embedded app understands.
|
|
193
248
|
*/
|
|
@@ -206,10 +261,13 @@ export class AppEmbed extends V1Embed {
|
|
|
206
261
|
|
|
207
262
|
/**
|
|
208
263
|
* Navigate to particular page for app embed. eg:answers/pinboards/home
|
|
209
|
-
* This is used for embedding answers, pinboards, visualizations and full application
|
|
264
|
+
* This is used for embedding answers, pinboards, visualizations and full application
|
|
265
|
+
* only.
|
|
266
|
+
*
|
|
210
267
|
* @param path string | number The string, set to iframe src and navigate to new page
|
|
211
268
|
* eg: appEmbed.navigateToPage('pinboards')
|
|
212
|
-
* When used with `noReload` this can also be a number
|
|
269
|
+
* When used with `noReload` (default: true) this can also be a number
|
|
270
|
+
* like 1/-1 to go forward/back.
|
|
213
271
|
* @param noReload boolean Trigger the navigation without reloading the page
|
|
214
272
|
* @version SDK: 1.12.0 | ThoughtSpot: 8.4.0.cl, 8.4.1-sw
|
|
215
273
|
*/
|
|
@@ -222,31 +280,28 @@ export class AppEmbed extends V1Embed {
|
|
|
222
280
|
this.trigger(HostEvent.Navigate, path);
|
|
223
281
|
} else {
|
|
224
282
|
if (typeof path !== 'string') {
|
|
225
|
-
console.warn(
|
|
226
|
-
'Path can only by a string when triggered without noReload',
|
|
227
|
-
);
|
|
283
|
+
console.warn('Path can only by a string when triggered without noReload');
|
|
228
284
|
return;
|
|
229
285
|
}
|
|
230
286
|
const iframeSrc = this.iFrame.src;
|
|
231
287
|
const embedPath = '#/embed';
|
|
232
288
|
const currentPath = iframeSrc.includes(embedPath) ? embedPath : '#';
|
|
233
|
-
this.iFrame.src = `${
|
|
234
|
-
|
|
235
|
-
|
|
289
|
+
this.iFrame.src = `${iframeSrc.split(currentPath)[0]}${currentPath}/${path.replace(
|
|
290
|
+
/^\/?#?\//,
|
|
291
|
+
'',
|
|
292
|
+
)}`;
|
|
236
293
|
}
|
|
237
294
|
}
|
|
238
295
|
|
|
239
296
|
/**
|
|
240
297
|
* Renders the embedded application pages in the ThoughtSpot app.
|
|
298
|
+
*
|
|
241
299
|
* @param renderOptions An object containing the page ID
|
|
242
300
|
* to be embedded.
|
|
243
301
|
*/
|
|
244
302
|
public render(): AppEmbed {
|
|
245
303
|
super.render();
|
|
246
|
-
|
|
247
|
-
const { pageId, runtimeFilters, path } = this.viewConfig;
|
|
248
|
-
const pageRoute = this.formatPath(path) || this.getPageRoute(pageId);
|
|
249
|
-
const src = this.getIFrameSrc(pageRoute, runtimeFilters);
|
|
304
|
+
const src = this.getIFrameSrc();
|
|
250
305
|
this.renderV1Embed(src);
|
|
251
306
|
|
|
252
307
|
return this;
|
package/src/embed/base.spec.ts
CHANGED
|
@@ -62,9 +62,7 @@ describe('Base TS Embed', () => {
|
|
|
62
62
|
callPrefetch: true,
|
|
63
63
|
});
|
|
64
64
|
expect(getAllIframeEl().length).toBe(1);
|
|
65
|
-
const prefetchIframe = document.querySelectorAll<HTMLIFrameElement>(
|
|
66
|
-
'.prefetchIframe',
|
|
67
|
-
);
|
|
65
|
+
const prefetchIframe = document.querySelectorAll<HTMLIFrameElement>('.prefetchIframe');
|
|
68
66
|
expect(prefetchIframe.length).toBe(1);
|
|
69
67
|
const firstIframe = <HTMLIFrameElement>prefetchIframe[0];
|
|
70
68
|
expect(firstIframe.src).toBe(url);
|
|
@@ -79,9 +77,7 @@ describe('Base TS Embed', () => {
|
|
|
79
77
|
index.PrefetchFeatures.LiveboardEmbed,
|
|
80
78
|
]);
|
|
81
79
|
expect(getAllIframeEl().length).toBe(2);
|
|
82
|
-
const prefetchIframe = document.querySelectorAll<HTMLIFrameElement>(
|
|
83
|
-
'.prefetchIframe',
|
|
84
|
-
);
|
|
80
|
+
const prefetchIframe = document.querySelectorAll<HTMLIFrameElement>('.prefetchIframe');
|
|
85
81
|
expect(prefetchIframe.length).toBe(2);
|
|
86
82
|
const firstIframe = <HTMLIFrameElement>prefetchIframe[0];
|
|
87
83
|
expect(firstIframe.src).toBe(searchUrl);
|
|
@@ -93,9 +89,7 @@ describe('Base TS Embed', () => {
|
|
|
93
89
|
const url = '';
|
|
94
90
|
index.prefetch(url);
|
|
95
91
|
expect(getAllIframeEl().length).toBe(0);
|
|
96
|
-
const prefetchIframe = document.querySelectorAll<HTMLIFrameElement>(
|
|
97
|
-
'.prefetchIframe',
|
|
98
|
-
);
|
|
92
|
+
const prefetchIframe = document.querySelectorAll<HTMLIFrameElement>('.prefetchIframe');
|
|
99
93
|
expect(prefetchIframe.length).toBe(0);
|
|
100
94
|
});
|
|
101
95
|
|
package/src/embed/base.ts
CHANGED
|
@@ -46,10 +46,7 @@ export const getEmbedConfig = (): EmbedConfig => config;
|
|
|
46
46
|
export const getAuthPromise = (): Promise<boolean> => authPromise;
|
|
47
47
|
|
|
48
48
|
export {
|
|
49
|
-
notifyAuthFailure,
|
|
50
|
-
notifyAuthSDKSuccess,
|
|
51
|
-
notifyAuthSuccess,
|
|
52
|
-
notifyLogout,
|
|
49
|
+
notifyAuthFailure, notifyAuthSDKSuccess, notifyAuthSuccess, notifyLogout,
|
|
53
50
|
};
|
|
54
51
|
|
|
55
52
|
/**
|
|
@@ -80,16 +77,16 @@ const hostUrlToFeatureUrl = {
|
|
|
80
77
|
};
|
|
81
78
|
|
|
82
79
|
/**
|
|
83
|
-
* Prefetches static resources from the specified URL. Web browsers can then cache the
|
|
80
|
+
* Prefetches static resources from the specified URL. Web browsers can then cache the
|
|
81
|
+
* prefetched resources and serve them from the user's local disk to provide faster access
|
|
82
|
+
* to your app.
|
|
83
|
+
*
|
|
84
84
|
* @param url The URL provided for prefetch
|
|
85
85
|
* @param prefetchFeatures Specify features which needs to be prefetched.
|
|
86
86
|
* @version SDK: 1.4.0 | ThoughtSpot: ts7.sep.cl, 7.2.1
|
|
87
87
|
* @group Global methods
|
|
88
88
|
*/
|
|
89
|
-
export const prefetch = (
|
|
90
|
-
url?: string,
|
|
91
|
-
prefetchFeatures?: PrefetchFeatures[],
|
|
92
|
-
): void => {
|
|
89
|
+
export const prefetch = (url?: string, prefetchFeatures?: PrefetchFeatures[]): void => {
|
|
93
90
|
if (url === '') {
|
|
94
91
|
// eslint-disable-next-line no-console
|
|
95
92
|
console.warn('The prefetch method does not have a valid URL');
|
|
@@ -97,21 +94,25 @@ export const prefetch = (
|
|
|
97
94
|
const features = prefetchFeatures || [PrefetchFeatures.FullApp];
|
|
98
95
|
let hostUrl = url || config.thoughtSpotHost;
|
|
99
96
|
hostUrl = hostUrl[hostUrl.length - 1] === '/' ? hostUrl : `${hostUrl}/`;
|
|
100
|
-
uniq(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
97
|
+
uniq(features.map((feature) => hostUrlToFeatureUrl[feature](hostUrl))).forEach(
|
|
98
|
+
(prefetchUrl, index) => {
|
|
99
|
+
const iFrame = document.createElement('iframe');
|
|
100
|
+
iFrame.src = prefetchUrl;
|
|
101
|
+
iFrame.style.width = '0';
|
|
102
|
+
iFrame.style.height = '0';
|
|
103
|
+
iFrame.style.border = '0';
|
|
104
|
+
iFrame.classList.add('prefetchIframe');
|
|
105
|
+
iFrame.classList.add(`prefetchIframeNum-${index}`);
|
|
106
|
+
document.body.appendChild(iFrame);
|
|
107
|
+
},
|
|
108
|
+
);
|
|
112
109
|
}
|
|
113
110
|
};
|
|
114
111
|
|
|
112
|
+
/**
|
|
113
|
+
*
|
|
114
|
+
* @param embedConfig
|
|
115
|
+
*/
|
|
115
116
|
function sanity(embedConfig: EmbedConfig) {
|
|
116
117
|
if (embedConfig.thoughtSpotHost === undefined) {
|
|
117
118
|
throw new Error('ThoughtSpot host not provided');
|
|
@@ -121,23 +122,19 @@ function sanity(embedConfig: EmbedConfig) {
|
|
|
121
122
|
throw new Error('Username not provided with Trusted auth');
|
|
122
123
|
}
|
|
123
124
|
|
|
124
|
-
if (
|
|
125
|
-
|
|
126
|
-
typeof embedConfig.getAuthToken !== 'function'
|
|
127
|
-
) {
|
|
128
|
-
throw new Error(
|
|
129
|
-
'Trusted auth should provide either authEndpoint or getAuthToken',
|
|
130
|
-
);
|
|
125
|
+
if (!embedConfig.authEndpoint && typeof embedConfig.getAuthToken !== 'function') {
|
|
126
|
+
throw new Error('Trusted auth should provide either authEndpoint or getAuthToken');
|
|
131
127
|
}
|
|
132
128
|
}
|
|
133
129
|
}
|
|
134
130
|
|
|
131
|
+
/**
|
|
132
|
+
*
|
|
133
|
+
* @param embedConfig
|
|
134
|
+
*/
|
|
135
135
|
function backwardCompat(embedConfig: EmbedConfig): EmbedConfig {
|
|
136
136
|
const newConfig = { ...embedConfig };
|
|
137
|
-
if (
|
|
138
|
-
embedConfig.noRedirect !== undefined &&
|
|
139
|
-
embedConfig.inPopup === undefined
|
|
140
|
-
) {
|
|
137
|
+
if (embedConfig.noRedirect !== undefined && embedConfig.inPopup === undefined) {
|
|
141
138
|
newConfig.inPopup = embedConfig.noRedirect;
|
|
142
139
|
}
|
|
143
140
|
return newConfig;
|
|
@@ -148,9 +145,9 @@ function backwardCompat(embedConfig: EmbedConfig): EmbedConfig {
|
|
|
148
145
|
* authentication if applicable. This function needs to be called before any ThoughtSpot
|
|
149
146
|
* component like liveboard etc can be embedded. But need not wait for AuthEvent.SUCCESS
|
|
150
147
|
* to actually embed. That is handled internally.
|
|
148
|
+
*
|
|
151
149
|
* @param embedConfig The configuration object containing ThoughtSpot host,
|
|
152
150
|
* authentication mechanism and so on.
|
|
153
|
-
*
|
|
154
151
|
* @example
|
|
155
152
|
* ```js
|
|
156
153
|
* const authStatus = init({
|
|
@@ -159,8 +156,8 @@ function backwardCompat(embedConfig: EmbedConfig): EmbedConfig {
|
|
|
159
156
|
* });
|
|
160
157
|
* authStatus.on(AuthStatus.FAILURE, (reason) => { // do something here });
|
|
161
158
|
* ```
|
|
162
|
-
*
|
|
163
|
-
*
|
|
159
|
+
* @returns {@link AuthEventEmitter} event emitter which emits events on authentication success,
|
|
160
|
+
* failure and logout. See {@link AuthStatus}
|
|
164
161
|
* @version SDK: 1.0.0 | ThoughtSpot ts7.april.cl, 7.2.1
|
|
165
162
|
* @group Authentication / Init
|
|
166
163
|
*/
|
|
@@ -179,17 +176,12 @@ export const init = (embedConfig: EmbedConfig): AuthEventEmitter => {
|
|
|
179
176
|
uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_CALLED_INIT, {
|
|
180
177
|
authType: config.authType,
|
|
181
178
|
host: config.thoughtSpotHost,
|
|
182
|
-
usedCustomizationSheet:
|
|
183
|
-
|
|
184
|
-
usedCustomizationVariables:
|
|
185
|
-
embedConfig.customizations?.style?.customCSS?.variables != null,
|
|
179
|
+
usedCustomizationSheet: embedConfig.customizations?.style?.customCSSUrl != null,
|
|
180
|
+
usedCustomizationVariables: embedConfig.customizations?.style?.customCSS?.variables != null,
|
|
186
181
|
usedCustomizationRules:
|
|
187
|
-
embedConfig.customizations?.style?.customCSS?.rules_UNSTABLE !=
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
?.strings,
|
|
191
|
-
usedCustomizationIconSprite: !!embedConfig.customizations
|
|
192
|
-
?.iconSpriteUrl,
|
|
182
|
+
embedConfig.customizations?.style?.customCSS?.rules_UNSTABLE != null,
|
|
183
|
+
usedCustomizationStrings: !!embedConfig.customizations?.content?.strings,
|
|
184
|
+
usedCustomizationIconSprite: !!embedConfig.customizations?.iconSpriteUrl,
|
|
193
185
|
});
|
|
194
186
|
|
|
195
187
|
if (config.callPrefetch) {
|
|
@@ -198,16 +190,19 @@ export const init = (embedConfig: EmbedConfig): AuthEventEmitter => {
|
|
|
198
190
|
return authEE as AuthEventEmitter;
|
|
199
191
|
};
|
|
200
192
|
|
|
193
|
+
/**
|
|
194
|
+
*
|
|
195
|
+
*/
|
|
201
196
|
export function disableAutoLogin(): void {
|
|
202
197
|
config.autoLogin = false;
|
|
203
198
|
}
|
|
204
199
|
|
|
205
200
|
/**
|
|
206
|
-
* Logs out from ThoughtSpot. This also sets the autoLogin flag to false, to
|
|
207
|
-
* the SDK from automatically logging in again.
|
|
201
|
+
* Logs out from ThoughtSpot. This also sets the autoLogin flag to false, to
|
|
202
|
+
* prevent the SDK from automatically logging in again.
|
|
208
203
|
*
|
|
209
|
-
* You can call the `init` method again to re login, if autoLogin is set to
|
|
210
|
-
* second call it will be honored.
|
|
204
|
+
* You can call the `init` method again to re login, if autoLogin is set to
|
|
205
|
+
* true in this second call it will be honored.
|
|
211
206
|
*
|
|
212
207
|
* @param doNotDisableAutoLogin This flag when passed will not disable autoLogin
|
|
213
208
|
* @returns Promise which resolves when logout completes.
|
|
@@ -227,12 +222,12 @@ export const logout = (doNotDisableAutoLogin = false): Promise<boolean> => {
|
|
|
227
222
|
let renderQueue: Promise<any> = Promise.resolve();
|
|
228
223
|
|
|
229
224
|
/**
|
|
230
|
-
* Renders functions in a queue, resolves to next function only after the callback next
|
|
225
|
+
* Renders functions in a queue, resolves to next function only after the callback next
|
|
226
|
+
* is called
|
|
227
|
+
*
|
|
231
228
|
* @param fn The function being registered
|
|
232
229
|
*/
|
|
233
|
-
export const renderInQueue = (
|
|
234
|
-
fn: (next?: (val?: any) => void) => Promise<any>,
|
|
235
|
-
): Promise<any> => {
|
|
230
|
+
export const renderInQueue = (fn: (next?: (val?: any) => void) => Promise<any>): Promise<any> => {
|
|
236
231
|
const { queueMultiRenders = false } = config;
|
|
237
232
|
if (queueMultiRenders) {
|
|
238
233
|
renderQueue = renderQueue.then(() => new Promise((res) => fn(res)));
|
|
@@ -243,6 +238,9 @@ export const renderInQueue = (
|
|
|
243
238
|
};
|
|
244
239
|
|
|
245
240
|
// For testing purposes only
|
|
241
|
+
/**
|
|
242
|
+
*
|
|
243
|
+
*/
|
|
246
244
|
export function reset(): void {
|
|
247
245
|
config = {} as any;
|
|
248
246
|
setAuthEE(null);
|
package/src/embed/embed.spec.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
init, AuthType, SearchEmbed, EmbedEvent,
|
|
3
|
+
} from '../index';
|
|
2
4
|
import {
|
|
3
5
|
EVENT_WAIT_TIME,
|
|
4
6
|
executeAfterWait,
|
|
@@ -59,8 +61,7 @@ describe('test view config', () => {
|
|
|
59
61
|
await executeAfterWait(() => {
|
|
60
62
|
expect(onErrorSpy).toHaveBeenCalledWith(
|
|
61
63
|
{
|
|
62
|
-
error:
|
|
63
|
-
'Please register event handlers before calling render',
|
|
64
|
+
error: 'Please register event handlers before calling render',
|
|
64
65
|
},
|
|
65
66
|
expect.any(Function),
|
|
66
67
|
);
|
|
@@ -84,9 +85,7 @@ describe('Custom CSS Url', () => {
|
|
|
84
85
|
embed.render();
|
|
85
86
|
executeAfterWait(() => {
|
|
86
87
|
const iframe = getIFrameEl();
|
|
87
|
-
expect(iframe.src.includes('customCssUrl=bla.com/foo.css')).toBe(
|
|
88
|
-
true,
|
|
89
|
-
);
|
|
88
|
+
expect(iframe.src.includes('customCssUrl=bla.com/foo.css')).toBe(true);
|
|
90
89
|
done();
|
|
91
90
|
});
|
|
92
91
|
});
|