@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/ts-embed.ts
CHANGED
|
@@ -15,6 +15,8 @@ import {
|
|
|
15
15
|
setAttributes,
|
|
16
16
|
getCustomisations,
|
|
17
17
|
getDOMNode,
|
|
18
|
+
getFilterQuery,
|
|
19
|
+
getQueryParamString,
|
|
18
20
|
} from '../utils';
|
|
19
21
|
import {
|
|
20
22
|
getThoughtSpotHost,
|
|
@@ -38,6 +40,7 @@ import {
|
|
|
38
40
|
ViewConfig,
|
|
39
41
|
FrameParams,
|
|
40
42
|
ContextMenuTriggerOptions,
|
|
43
|
+
RuntimeFilter,
|
|
41
44
|
} from '../types';
|
|
42
45
|
import { uploadMixpanelEvent, MIXPANEL_EVENT } from '../mixpanel-service';
|
|
43
46
|
import { processEventData } from '../utils/processData';
|
|
@@ -64,6 +67,7 @@ const TS_EMBED_ID = '_thoughtspot-embed';
|
|
|
64
67
|
* The event id map from v2 event names to v1 event id
|
|
65
68
|
* v1 events are the classic embed events implemented in Blink v1
|
|
66
69
|
* We cannot rename v1 event types to maintain backward compatibility
|
|
70
|
+
*
|
|
67
71
|
* @internal
|
|
68
72
|
*/
|
|
69
73
|
const V1EventMap = {};
|
|
@@ -87,6 +91,8 @@ export class TsEmbed {
|
|
|
87
91
|
*/
|
|
88
92
|
private el: Element;
|
|
89
93
|
|
|
94
|
+
protected isAppInitialized = false;
|
|
95
|
+
|
|
90
96
|
/**
|
|
91
97
|
* A reference to the iframe within which the ThoughtSpot app
|
|
92
98
|
* will be rendered.
|
|
@@ -128,6 +134,7 @@ export class TsEmbed {
|
|
|
128
134
|
* Should we encode URL Query Params using base64 encoding which thoughtspot
|
|
129
135
|
* will generate for embedding. This provides additional security to
|
|
130
136
|
* thoughtspot clusters against Cross site scripting attacks.
|
|
137
|
+
*
|
|
131
138
|
* @default false
|
|
132
139
|
*/
|
|
133
140
|
private shouldEncodeUrlQueryParams = false;
|
|
@@ -138,6 +145,9 @@ export class TsEmbed {
|
|
|
138
145
|
this.el = getDOMNode(domSelector);
|
|
139
146
|
// TODO: handle error
|
|
140
147
|
this.embedConfig = getEmbedConfig();
|
|
148
|
+
if (!this.embedConfig.authTriggerContainer && !this.embedConfig.useEventForSAMLPopup) {
|
|
149
|
+
this.embedConfig.authTriggerContainer = domSelector;
|
|
150
|
+
}
|
|
141
151
|
this.thoughtSpotHost = getThoughtSpotHost(this.embedConfig);
|
|
142
152
|
this.thoughtSpotV2Base = getV2BasePath(this.embedConfig);
|
|
143
153
|
this.eventHandlerMap = new Map();
|
|
@@ -156,6 +166,7 @@ export class TsEmbed {
|
|
|
156
166
|
|
|
157
167
|
/**
|
|
158
168
|
* Handles errors within the SDK
|
|
169
|
+
*
|
|
159
170
|
* @param error The error message or object
|
|
160
171
|
*/
|
|
161
172
|
protected handleError(error: string | Record<string, unknown>) {
|
|
@@ -169,6 +180,7 @@ export class TsEmbed {
|
|
|
169
180
|
|
|
170
181
|
/**
|
|
171
182
|
* Extracts the type field from the event payload
|
|
183
|
+
*
|
|
172
184
|
* @param event The window message event
|
|
173
185
|
*/
|
|
174
186
|
private getEventType(event: MessageEvent) {
|
|
@@ -178,6 +190,7 @@ export class TsEmbed {
|
|
|
178
190
|
|
|
179
191
|
/**
|
|
180
192
|
* Extracts the port field from the event payload
|
|
193
|
+
*
|
|
181
194
|
* @param event The window message event
|
|
182
195
|
* @returns
|
|
183
196
|
*/
|
|
@@ -191,6 +204,9 @@ export class TsEmbed {
|
|
|
191
204
|
/**
|
|
192
205
|
* fix for ts7.sep.cl
|
|
193
206
|
* will be removed for ts7.oct.cl
|
|
207
|
+
*
|
|
208
|
+
* @param event
|
|
209
|
+
* @param eventType
|
|
194
210
|
* @hidden
|
|
195
211
|
*/
|
|
196
212
|
private formatEventData(event: MessageEvent, eventType: string) {
|
|
@@ -218,12 +234,7 @@ export class TsEmbed {
|
|
|
218
234
|
if (event.source === this.iFrame.contentWindow) {
|
|
219
235
|
this.executeCallbacks(
|
|
220
236
|
eventType,
|
|
221
|
-
processEventData(
|
|
222
|
-
eventType,
|
|
223
|
-
eventData,
|
|
224
|
-
this.thoughtSpotHost,
|
|
225
|
-
this.el,
|
|
226
|
-
),
|
|
237
|
+
processEventData(eventType, eventData, this.thoughtSpotHost, this.el),
|
|
227
238
|
eventPort,
|
|
228
239
|
);
|
|
229
240
|
}
|
|
@@ -232,19 +243,20 @@ export class TsEmbed {
|
|
|
232
243
|
|
|
233
244
|
/**
|
|
234
245
|
* Send Custom style as part of payload of APP_INIT
|
|
246
|
+
*
|
|
247
|
+
* @param _
|
|
248
|
+
* @param responder
|
|
235
249
|
*/
|
|
236
250
|
private appInitCb = async (_: any, responder: any) => {
|
|
237
251
|
let authToken = '';
|
|
238
252
|
if (this.embedConfig.authType === AuthType.TrustedAuthTokenCookieless) {
|
|
239
253
|
authToken = await getAuthenticaionToken(this.embedConfig);
|
|
240
254
|
}
|
|
255
|
+
this.isAppInitialized = true;
|
|
241
256
|
responder({
|
|
242
257
|
type: EmbedEvent.APP_INIT,
|
|
243
258
|
data: {
|
|
244
|
-
customisations: getCustomisations(
|
|
245
|
-
this.embedConfig,
|
|
246
|
-
this.viewConfig,
|
|
247
|
-
),
|
|
259
|
+
customisations: getCustomisations(this.embedConfig, this.viewConfig),
|
|
248
260
|
authToken,
|
|
249
261
|
},
|
|
250
262
|
});
|
|
@@ -252,6 +264,9 @@ export class TsEmbed {
|
|
|
252
264
|
|
|
253
265
|
/**
|
|
254
266
|
* Sends updated auth token to the iFrame to avoid user logout
|
|
267
|
+
*
|
|
268
|
+
* @param _
|
|
269
|
+
* @param responder
|
|
255
270
|
*/
|
|
256
271
|
private updateAuthToken = async (_: any, responder: any) => {
|
|
257
272
|
const { autoLogin = false, authType } = this.embedConfig; // Set autoLogin default to false
|
|
@@ -277,6 +292,8 @@ export class TsEmbed {
|
|
|
277
292
|
|
|
278
293
|
/**
|
|
279
294
|
* Constructs the base URL string to load the ThoughtSpot app.
|
|
295
|
+
*
|
|
296
|
+
* @param query
|
|
280
297
|
*/
|
|
281
298
|
protected getEmbedBasePath(query: string): string {
|
|
282
299
|
let queryString = query;
|
|
@@ -285,31 +302,25 @@ export class TsEmbed {
|
|
|
285
302
|
queryString.substr(1),
|
|
286
303
|
)}`;
|
|
287
304
|
}
|
|
288
|
-
const basePath = [
|
|
289
|
-
this.thoughtSpotHost,
|
|
290
|
-
this.thoughtSpotV2Base,
|
|
291
|
-
queryString,
|
|
292
|
-
]
|
|
305
|
+
const basePath = [this.thoughtSpotHost, this.thoughtSpotV2Base, queryString]
|
|
293
306
|
.filter((x) => x.length > 0)
|
|
294
307
|
.join('/');
|
|
295
308
|
|
|
296
|
-
return `${basePath}
|
|
309
|
+
return `${basePath}#`;
|
|
297
310
|
}
|
|
298
311
|
|
|
299
312
|
/**
|
|
300
313
|
* Common query params set for all the embed modes.
|
|
314
|
+
*
|
|
315
|
+
* @param queryParams
|
|
301
316
|
* @returns queryParams
|
|
302
317
|
*/
|
|
303
|
-
protected getBaseQueryParams() {
|
|
304
|
-
const queryParams = {};
|
|
318
|
+
protected getBaseQueryParams(queryParams = {}) {
|
|
305
319
|
let hostAppUrl = window?.location?.host || '';
|
|
306
320
|
|
|
307
|
-
// The below check is needed because TS Cloud firewall, blocks
|
|
308
|
-
// in any url param.
|
|
309
|
-
if (
|
|
310
|
-
hostAppUrl.includes('localhost') ||
|
|
311
|
-
hostAppUrl.includes('127.0.0.1')
|
|
312
|
-
) {
|
|
321
|
+
// The below check is needed because TS Cloud firewall, blocks
|
|
322
|
+
// localhost/127.0.0.1 in any url param.
|
|
323
|
+
if (hostAppUrl.includes('localhost') || hostAppUrl.includes('127.0.0.1')) {
|
|
313
324
|
hostAppUrl = 'local-host';
|
|
314
325
|
}
|
|
315
326
|
queryParams[Param.HostAppUrl] = encodeURIComponent(hostAppUrl);
|
|
@@ -317,10 +328,7 @@ export class TsEmbed {
|
|
|
317
328
|
queryParams[Param.ViewPortWidth] = window.innerWidth;
|
|
318
329
|
queryParams[Param.Version] = version;
|
|
319
330
|
queryParams[Param.AuthType] = this.embedConfig.authType;
|
|
320
|
-
if (
|
|
321
|
-
this.embedConfig.disableLoginRedirect === true ||
|
|
322
|
-
this.embedConfig.autoLogin === true
|
|
323
|
-
) {
|
|
331
|
+
if (this.embedConfig.disableLoginRedirect === true || this.embedConfig.autoLogin === true) {
|
|
324
332
|
queryParams[Param.DisableLoginRedirect] = true;
|
|
325
333
|
}
|
|
326
334
|
if (this.embedConfig.authType === AuthType.EmbeddedSSO) {
|
|
@@ -345,16 +353,12 @@ export class TsEmbed {
|
|
|
345
353
|
} = this.viewConfig;
|
|
346
354
|
|
|
347
355
|
if (Array.isArray(visibleActions) && Array.isArray(hiddenActions)) {
|
|
348
|
-
this.handleError(
|
|
349
|
-
'You cannot have both hidden actions and visible actions',
|
|
350
|
-
);
|
|
356
|
+
this.handleError('You cannot have both hidden actions and visible actions');
|
|
351
357
|
return queryParams;
|
|
352
358
|
}
|
|
353
359
|
|
|
354
360
|
// TODO remove embedConfig.customCssUrl
|
|
355
|
-
const cssUrlParam =
|
|
356
|
-
customizations?.style?.customCSSUrl ||
|
|
357
|
-
this.embedConfig.customCssUrl;
|
|
361
|
+
const cssUrlParam = customizations?.style?.customCSSUrl || this.embedConfig.customCssUrl;
|
|
358
362
|
|
|
359
363
|
if (cssUrlParam) {
|
|
360
364
|
queryParams[Param.CustomCSSUrl] = cssUrlParam;
|
|
@@ -366,31 +370,26 @@ export class TsEmbed {
|
|
|
366
370
|
if (disabledActionReason) {
|
|
367
371
|
queryParams[Param.DisableActionReason] = disabledActionReason;
|
|
368
372
|
}
|
|
369
|
-
queryParams[Param.HideActions] = [
|
|
370
|
-
...this.defaultHiddenActions,
|
|
371
|
-
...(hiddenActions ?? []),
|
|
372
|
-
];
|
|
373
|
+
queryParams[Param.HideActions] = [...this.defaultHiddenActions, ...(hiddenActions ?? [])];
|
|
373
374
|
if (Array.isArray(visibleActions)) {
|
|
374
375
|
queryParams[Param.VisibleActions] = visibleActions;
|
|
375
376
|
}
|
|
376
377
|
|
|
377
|
-
/**
|
|
378
|
-
*
|
|
378
|
+
/**
|
|
379
|
+
* Default behavior for context menu will be left-click
|
|
380
|
+
* from version 9.2.0.cl the user have an option to override context
|
|
381
|
+
* menu click
|
|
379
382
|
*/
|
|
380
383
|
if (contextMenuTrigger === ContextMenuTriggerOptions.LEFT_CLICK) {
|
|
381
384
|
queryParams[Param.ContextMenuTrigger] = true;
|
|
382
|
-
} else if (
|
|
383
|
-
contextMenuTrigger === ContextMenuTriggerOptions.RIGHT_CLICK
|
|
384
|
-
) {
|
|
385
|
+
} else if (contextMenuTrigger === ContextMenuTriggerOptions.RIGHT_CLICK) {
|
|
385
386
|
queryParams[Param.ContextMenuTrigger] = false;
|
|
386
387
|
}
|
|
387
388
|
|
|
388
|
-
const spriteUrl = customizations?.iconSpriteUrl
|
|
389
|
+
const spriteUrl = customizations?.iconSpriteUrl
|
|
390
|
+
|| this.embedConfig.customizations?.iconSpriteUrl;
|
|
389
391
|
if (spriteUrl) {
|
|
390
|
-
queryParams[Param.IconSpriteUrl] = spriteUrl.replace(
|
|
391
|
-
'https://',
|
|
392
|
-
'',
|
|
393
|
-
);
|
|
392
|
+
queryParams[Param.IconSpriteUrl] = spriteUrl.replace('https://', '');
|
|
394
393
|
}
|
|
395
394
|
|
|
396
395
|
if (showAlerts !== undefined) {
|
|
@@ -414,48 +413,72 @@ export class TsEmbed {
|
|
|
414
413
|
/**
|
|
415
414
|
* Constructs the base URL string to load v1 of the ThoughtSpot app.
|
|
416
415
|
* This is used for embedding Liveboards, visualizations, and full application.
|
|
416
|
+
*
|
|
417
417
|
* @param queryString The query string to append to the URL.
|
|
418
418
|
* @param isAppEmbed A Boolean parameter to specify if you are embedding
|
|
419
419
|
* the full application.
|
|
420
420
|
*/
|
|
421
|
-
protected getV1EmbedBasePath(
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
enableSearchAssist = false,
|
|
427
|
-
): string {
|
|
428
|
-
const queryStringFrag = queryString ? `&${queryString}` : '';
|
|
429
|
-
const primaryNavParam = `&primaryNavHidden=${!showPrimaryNavbar}`;
|
|
430
|
-
const disableProfileAndHelpParam = `&profileAndHelpInNavBarHidden=${disableProfileAndHelp}`;
|
|
431
|
-
const enableSearchAssistParam = `&${Param.EnableSearchAssist}=${enableSearchAssist}`;
|
|
432
|
-
let queryParams = `?embedApp=true${isAppEmbed ? primaryNavParam : ''}${
|
|
433
|
-
isAppEmbed ? disableProfileAndHelpParam : ''
|
|
434
|
-
}${
|
|
435
|
-
enableSearchAssist ? enableSearchAssistParam : ''
|
|
436
|
-
}${queryStringFrag}`;
|
|
437
|
-
if (this.shouldEncodeUrlQueryParams) {
|
|
438
|
-
queryParams = `?base64UrlEncodedFlags=${getEncodedQueryParamsString(
|
|
439
|
-
queryParams.substr(1),
|
|
440
|
-
)}`;
|
|
441
|
-
}
|
|
442
|
-
let path = `${this.thoughtSpotHost}/${queryParams}#`;
|
|
443
|
-
if (!isAppEmbed) {
|
|
444
|
-
path = `${path}/embed`;
|
|
445
|
-
}
|
|
421
|
+
protected getV1EmbedBasePath(queryString: string): string {
|
|
422
|
+
const queryParams = this.shouldEncodeUrlQueryParams
|
|
423
|
+
? `?base64UrlEncodedFlags=${getEncodedQueryParamsString(queryString)}`
|
|
424
|
+
: `?${queryString}`;
|
|
425
|
+
const path = `${this.thoughtSpotHost}/${queryParams}#`;
|
|
446
426
|
return path;
|
|
447
427
|
}
|
|
448
428
|
|
|
429
|
+
protected getEmbedParams() {
|
|
430
|
+
const queryParams = this.getBaseQueryParams();
|
|
431
|
+
return getQueryParamString(queryParams);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
protected getRootIframeSrc() {
|
|
435
|
+
const query = this.getEmbedParams();
|
|
436
|
+
return this.getEmbedBasePath(query);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
protected createIframeEl(frameSrc: string): HTMLIFrameElement {
|
|
440
|
+
const iFrame = document.createElement('iframe');
|
|
441
|
+
|
|
442
|
+
iFrame.src = frameSrc;
|
|
443
|
+
iFrame.id = TS_EMBED_ID;
|
|
444
|
+
|
|
445
|
+
// according to screenfull.js documentation
|
|
446
|
+
// allowFullscreen, webkitallowfullscreen and mozallowfullscreen must be
|
|
447
|
+
// true
|
|
448
|
+
iFrame.allowFullscreen = true;
|
|
449
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
450
|
+
// @ts-ignore
|
|
451
|
+
iFrame.webkitallowfullscreen = true;
|
|
452
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
453
|
+
// @ts-ignore
|
|
454
|
+
iFrame.mozallowfullscreen = true;
|
|
455
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
456
|
+
// @ts-ignore
|
|
457
|
+
iFrame.allow = 'clipboard-read; clipboard-write';
|
|
458
|
+
|
|
459
|
+
const {
|
|
460
|
+
height: frameHeight,
|
|
461
|
+
width: frameWidth, ...restParams
|
|
462
|
+
} = this.viewConfig.frameParams || {};
|
|
463
|
+
const width = getCssDimension(frameWidth || DEFAULT_EMBED_WIDTH);
|
|
464
|
+
const height = getCssDimension(frameHeight || DEFAULT_EMBED_HEIGHT);
|
|
465
|
+
setAttributes(iFrame, restParams);
|
|
466
|
+
|
|
467
|
+
iFrame.style.width = `${width}`;
|
|
468
|
+
iFrame.style.height = `${height}`;
|
|
469
|
+
iFrame.style.border = '0';
|
|
470
|
+
iFrame.name = 'ThoughtSpot Embedded Analytics';
|
|
471
|
+
return iFrame;
|
|
472
|
+
}
|
|
473
|
+
|
|
449
474
|
/**
|
|
450
475
|
* Renders the embedded ThoughtSpot app in an iframe and sets up
|
|
451
476
|
* event listeners.
|
|
477
|
+
*
|
|
452
478
|
* @param url
|
|
453
479
|
* @param frameOptions
|
|
454
480
|
*/
|
|
455
|
-
protected async renderIFrame(
|
|
456
|
-
url: string,
|
|
457
|
-
frameOptions: FrameParams = {},
|
|
458
|
-
): Promise<any> {
|
|
481
|
+
protected async renderIFrame(url: string): Promise<any> {
|
|
459
482
|
if (this.isError) {
|
|
460
483
|
return null;
|
|
461
484
|
}
|
|
@@ -484,45 +507,8 @@ export class TsEmbed {
|
|
|
484
507
|
return;
|
|
485
508
|
}
|
|
486
509
|
|
|
487
|
-
uploadMixpanelEvent(
|
|
488
|
-
|
|
489
|
-
);
|
|
490
|
-
|
|
491
|
-
this.iFrame =
|
|
492
|
-
this.iFrame || document.createElement('iframe');
|
|
493
|
-
|
|
494
|
-
this.iFrame.src = url;
|
|
495
|
-
this.iFrame.id = TS_EMBED_ID;
|
|
496
|
-
|
|
497
|
-
// according to screenfull.js documentation
|
|
498
|
-
// allowFullscreen, webkitallowfullscreen and mozallowfullscreen must be true
|
|
499
|
-
this.iFrame.allowFullscreen = true;
|
|
500
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
501
|
-
// @ts-ignore
|
|
502
|
-
this.iFrame.webkitallowfullscreen = true;
|
|
503
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
504
|
-
// @ts-ignore
|
|
505
|
-
this.iFrame.mozallowfullscreen = true;
|
|
506
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
507
|
-
// @ts-ignore
|
|
508
|
-
this.iFrame.allow = 'clipboard-read; clipboard-write';
|
|
509
|
-
const {
|
|
510
|
-
height: frameHeight,
|
|
511
|
-
width: frameWidth,
|
|
512
|
-
...restParams
|
|
513
|
-
} = frameOptions;
|
|
514
|
-
const width = getCssDimension(
|
|
515
|
-
frameWidth || DEFAULT_EMBED_WIDTH,
|
|
516
|
-
);
|
|
517
|
-
const height = getCssDimension(
|
|
518
|
-
frameHeight || DEFAULT_EMBED_HEIGHT,
|
|
519
|
-
);
|
|
520
|
-
setAttributes(this.iFrame, restParams);
|
|
521
|
-
|
|
522
|
-
this.iFrame.style.width = `${width}`;
|
|
523
|
-
this.iFrame.style.height = `${height}`;
|
|
524
|
-
this.iFrame.style.border = '0';
|
|
525
|
-
this.iFrame.name = 'ThoughtSpot Embedded Analytics';
|
|
510
|
+
uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_RENDER_COMPLETE);
|
|
511
|
+
this.iFrame = this.iFrame || this.createIframeEl(url);
|
|
526
512
|
this.iFrame.addEventListener('load', () => {
|
|
527
513
|
nextInQueue();
|
|
528
514
|
const loadTimestamp = Date.now();
|
|
@@ -532,20 +518,15 @@ export class TsEmbed {
|
|
|
532
518
|
},
|
|
533
519
|
type: EmbedEvent.Load,
|
|
534
520
|
});
|
|
535
|
-
uploadMixpanelEvent(
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
timeTookToLoad: loadTimestamp - initTimestamp,
|
|
539
|
-
},
|
|
540
|
-
);
|
|
521
|
+
uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_IFRAME_LOAD_PERFORMANCE, {
|
|
522
|
+
timeTookToLoad: loadTimestamp - initTimestamp,
|
|
523
|
+
});
|
|
541
524
|
});
|
|
542
525
|
this.iFrame.addEventListener('error', () => {
|
|
543
526
|
nextInQueue();
|
|
544
527
|
});
|
|
545
528
|
this.insertIntoDOM(this.iFrame);
|
|
546
|
-
const prefetchIframe = document.querySelectorAll(
|
|
547
|
-
'.prefetchIframe',
|
|
548
|
-
);
|
|
529
|
+
const prefetchIframe = document.querySelectorAll('.prefetchIframe');
|
|
549
530
|
if (prefetchIframe.length) {
|
|
550
531
|
prefetchIframe.forEach((el) => {
|
|
551
532
|
el.remove();
|
|
@@ -555,10 +536,9 @@ export class TsEmbed {
|
|
|
555
536
|
})
|
|
556
537
|
.catch((error) => {
|
|
557
538
|
nextInQueue();
|
|
558
|
-
uploadMixpanelEvent(
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
);
|
|
539
|
+
uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_RENDER_FAILED, {
|
|
540
|
+
error: JSON.stringify(error),
|
|
541
|
+
});
|
|
562
542
|
this.insertIntoDOM(this.embedConfig.loginFailedMessage);
|
|
563
543
|
this.handleError(error);
|
|
564
544
|
});
|
|
@@ -591,14 +571,16 @@ export class TsEmbed {
|
|
|
591
571
|
|
|
592
572
|
/**
|
|
593
573
|
* Sets the height of the iframe
|
|
574
|
+
*
|
|
594
575
|
* @param height The height in pixels
|
|
595
576
|
*/
|
|
596
|
-
protected setIFrameHeight(height: number): void {
|
|
597
|
-
this.iFrame.style.height =
|
|
577
|
+
protected setIFrameHeight(height: number | string): void {
|
|
578
|
+
this.iFrame.style.height = getCssDimension(height);
|
|
598
579
|
}
|
|
599
580
|
|
|
600
581
|
/**
|
|
601
582
|
* Executes all registered event handlers for a particular event type
|
|
583
|
+
*
|
|
602
584
|
* @param eventType The event type
|
|
603
585
|
* @param data The payload invoked with the event handler
|
|
604
586
|
* @param eventPort The event Port for a specific MessageChannel
|
|
@@ -608,16 +590,18 @@ export class TsEmbed {
|
|
|
608
590
|
data: any,
|
|
609
591
|
eventPort?: MessagePort | void,
|
|
610
592
|
): void {
|
|
611
|
-
const
|
|
593
|
+
const eventHandlers = this.eventHandlerMap.get(eventType) || [];
|
|
612
594
|
const allHandlers = this.eventHandlerMap.get(EmbedEvent.ALL) || [];
|
|
613
|
-
callbacks
|
|
595
|
+
const callbacks = [...eventHandlers, ...allHandlers];
|
|
614
596
|
const dataStatus = data?.status || embedEventStatus.END;
|
|
615
597
|
callbacks.forEach((callbackObj) => {
|
|
616
598
|
if (
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
(
|
|
620
|
-
|
|
599
|
+
// When start status is true it trigger only start releated
|
|
600
|
+
// payload
|
|
601
|
+
(callbackObj.options.start && dataStatus === embedEventStatus.START)
|
|
602
|
+
// When start status is false it trigger only end releated
|
|
603
|
+
// payload
|
|
604
|
+
|| (!callbackObj.options.start && dataStatus === embedEventStatus.END)
|
|
621
605
|
) {
|
|
622
606
|
callbackObj.callback(data, (payload) => {
|
|
623
607
|
this.triggerEventOnPort(eventPort, payload);
|
|
@@ -635,6 +619,7 @@ export class TsEmbed {
|
|
|
635
619
|
|
|
636
620
|
/**
|
|
637
621
|
* Gets the v1 event type (if applicable) for the EmbedEvent type
|
|
622
|
+
*
|
|
638
623
|
* @param eventType The v2 event type
|
|
639
624
|
* @returns The corresponding v1 event type if one exists
|
|
640
625
|
* or else the v2 event type itself
|
|
@@ -647,6 +632,7 @@ export class TsEmbed {
|
|
|
647
632
|
* Calculates the iframe center for the current visible viewPort
|
|
648
633
|
* of iframe using Scroll position of Host App, offsetTop for iframe
|
|
649
634
|
* in Host app. ViewPort height of the tab.
|
|
635
|
+
*
|
|
650
636
|
* @returns iframe Center in visible viewport,
|
|
651
637
|
* Iframe height,
|
|
652
638
|
* View port height.
|
|
@@ -661,18 +647,11 @@ export class TsEmbed {
|
|
|
661
647
|
let iframeOffset;
|
|
662
648
|
|
|
663
649
|
if (iframeScrolled < 0) {
|
|
664
|
-
iframeVisibleViewPort =
|
|
665
|
-
|
|
666
|
-
iframeVisibleViewPort = Math.min(
|
|
667
|
-
iframeHeight,
|
|
668
|
-
iframeVisibleViewPort,
|
|
669
|
-
);
|
|
650
|
+
iframeVisibleViewPort = viewPortHeight - (offsetTopClient - scrollTopClient);
|
|
651
|
+
iframeVisibleViewPort = Math.min(iframeHeight, iframeVisibleViewPort);
|
|
670
652
|
iframeOffset = 0;
|
|
671
653
|
} else {
|
|
672
|
-
iframeVisibleViewPort = Math.min(
|
|
673
|
-
iframeHeight - iframeScrolled,
|
|
674
|
-
viewPortHeight,
|
|
675
|
-
);
|
|
654
|
+
iframeVisibleViewPort = Math.min(iframeHeight - iframeScrolled, viewPortHeight);
|
|
676
655
|
iframeOffset = iframeScrolled;
|
|
677
656
|
}
|
|
678
657
|
const iframeCenter = iframeOffset + iframeVisibleViewPort / 2;
|
|
@@ -713,9 +692,7 @@ export class TsEmbed {
|
|
|
713
692
|
options: MessageOptions = { start: false },
|
|
714
693
|
): typeof TsEmbed.prototype {
|
|
715
694
|
if (this.isRendered) {
|
|
716
|
-
this.handleError(
|
|
717
|
-
'Please register event handlers before calling render',
|
|
718
|
-
);
|
|
695
|
+
this.handleError('Please register event handlers before calling render');
|
|
719
696
|
}
|
|
720
697
|
const callbacks = this.eventHandlerMap.get(messageType) || [];
|
|
721
698
|
callbacks.push({ options, callback });
|
|
@@ -723,11 +700,38 @@ export class TsEmbed {
|
|
|
723
700
|
return this;
|
|
724
701
|
}
|
|
725
702
|
|
|
703
|
+
/**
|
|
704
|
+
* Removes an event listener for a particular event type.
|
|
705
|
+
*
|
|
706
|
+
* @param messageType The message type
|
|
707
|
+
* @param callback The callback to remove
|
|
708
|
+
* @example
|
|
709
|
+
* ```js
|
|
710
|
+
* const errorHandler = (data) => { console.error(data); };
|
|
711
|
+
* tsEmbed.on(EmbedEvent.Error, errorHandler);
|
|
712
|
+
* tsEmbed.off(EmbedEvent.Error, errorHandler);
|
|
713
|
+
* ```
|
|
714
|
+
*/
|
|
715
|
+
public off(
|
|
716
|
+
messageType: EmbedEvent,
|
|
717
|
+
callback: MessageCallback,
|
|
718
|
+
): typeof TsEmbed.prototype {
|
|
719
|
+
const callbacks = this.eventHandlerMap.get(messageType) || [];
|
|
720
|
+
const index = callbacks.findIndex((cb) => cb.callback === callback);
|
|
721
|
+
if (index > -1) {
|
|
722
|
+
callbacks.splice(index, 1);
|
|
723
|
+
}
|
|
724
|
+
return this;
|
|
725
|
+
}
|
|
726
|
+
|
|
726
727
|
/**
|
|
727
728
|
* Triggers an event on specific Port registered against
|
|
728
729
|
* for the EmbedEvent
|
|
730
|
+
*
|
|
729
731
|
* @param eventType The message type
|
|
730
732
|
* @param data The payload to send
|
|
733
|
+
* @param eventPort
|
|
734
|
+
* @param payload
|
|
731
735
|
*/
|
|
732
736
|
private triggerEventOnPort(eventPort: MessagePort | void, payload: any) {
|
|
733
737
|
if (eventPort) {
|
|
@@ -747,25 +751,20 @@ export class TsEmbed {
|
|
|
747
751
|
|
|
748
752
|
/**
|
|
749
753
|
* Triggers an event to the embedded app
|
|
754
|
+
*
|
|
750
755
|
* @param messageType The event type
|
|
751
756
|
* @param data The payload to send with the message
|
|
752
757
|
*/
|
|
753
758
|
public trigger(messageType: HostEvent, data: any = {}): Promise<any> {
|
|
754
|
-
uploadMixpanelEvent(
|
|
755
|
-
|
|
756
|
-
);
|
|
757
|
-
return processTrigger(
|
|
758
|
-
this.iFrame,
|
|
759
|
-
messageType,
|
|
760
|
-
this.thoughtSpotHost,
|
|
761
|
-
data,
|
|
762
|
-
);
|
|
759
|
+
uploadMixpanelEvent(`${MIXPANEL_EVENT.VISUAL_SDK_TRIGGER}-${messageType}`);
|
|
760
|
+
return processTrigger(this.iFrame, messageType, this.thoughtSpotHost, data);
|
|
763
761
|
}
|
|
764
762
|
|
|
765
763
|
/**
|
|
766
764
|
* Marks the ThoughtSpot object to have been rendered
|
|
767
765
|
* Needs to be overridden by subclasses to do the actual
|
|
768
766
|
* rendering of the iframe.
|
|
767
|
+
*
|
|
769
768
|
* @param args
|
|
770
769
|
*/
|
|
771
770
|
public render(): TsEmbed {
|
|
@@ -778,6 +777,7 @@ export class TsEmbed {
|
|
|
778
777
|
* Get the Post Url Params for THOUGHTSPOT from the current
|
|
779
778
|
* host app URL.
|
|
780
779
|
* THOUGHTSPOT URL params starts with a prefix "ts-"
|
|
780
|
+
*
|
|
781
781
|
* @version SDK: 1.14.0 | ThoughtSpot: 8.4.0.cl, 8.4.1-sw
|
|
782
782
|
*/
|
|
783
783
|
public getThoughtSpotPostUrlParams(): string {
|
|
@@ -805,6 +805,7 @@ export class TsEmbed {
|
|
|
805
805
|
|
|
806
806
|
/**
|
|
807
807
|
* Destroys the ThoughtSpot embed, and remove any nodes from the DOM.
|
|
808
|
+
*
|
|
808
809
|
* @version SDK: 1.19.1 | ThoughtSpot: *
|
|
809
810
|
*/
|
|
810
811
|
public destroy(): void {
|
|
@@ -814,6 +815,23 @@ export class TsEmbed {
|
|
|
814
815
|
console.log('Error destroying TS Embed', e);
|
|
815
816
|
}
|
|
816
817
|
}
|
|
818
|
+
|
|
819
|
+
public getUnderlyingFrameElement(): HTMLIFrameElement {
|
|
820
|
+
return this.iFrame;
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/**
|
|
824
|
+
* Prerenders a generic instance of the TS component.
|
|
825
|
+
* This means without the path but with the flags already applied.
|
|
826
|
+
* This is useful for prerendering the component in the background.
|
|
827
|
+
*
|
|
828
|
+
* @version SDK: 1.22.0
|
|
829
|
+
* @returns
|
|
830
|
+
*/
|
|
831
|
+
public async prerenderGeneric(): Promise<any> {
|
|
832
|
+
const prerenderFrameSrc = this.getRootIframeSrc();
|
|
833
|
+
return this.renderIFrame(prerenderFrameSrc);
|
|
834
|
+
}
|
|
817
835
|
}
|
|
818
836
|
|
|
819
837
|
/**
|
|
@@ -833,15 +851,23 @@ export class V1Embed extends TsEmbed {
|
|
|
833
851
|
|
|
834
852
|
/**
|
|
835
853
|
* Render the ap p in an iframe and set up event handlers
|
|
854
|
+
*
|
|
836
855
|
* @param iframeSrc
|
|
837
856
|
*/
|
|
838
857
|
protected renderV1Embed(iframeSrc: string): any {
|
|
839
|
-
return this.renderIFrame(iframeSrc
|
|
858
|
+
return this.renderIFrame(iframeSrc);
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
protected getRootIframeSrc(): string {
|
|
862
|
+
const runtimeFilters = this.viewConfig.runtimeFilters;
|
|
863
|
+
const filterQuery = getFilterQuery(runtimeFilters || []);
|
|
864
|
+
const queryParams = this.getEmbedParams();
|
|
865
|
+
const queryString = [filterQuery, queryParams].filter(Boolean).join('&');
|
|
866
|
+
return this.getV1EmbedBasePath(queryString);
|
|
840
867
|
}
|
|
841
868
|
|
|
842
869
|
/**
|
|
843
|
-
* @inheritdoc
|
|
844
|
-
*
|
|
870
|
+
* @inheritdoc
|
|
845
871
|
* @example
|
|
846
872
|
* ```js
|
|
847
873
|
* tsEmbed.on(EmbedEvent.Error, (data) => {
|
package/src/errors.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
export const ERROR_MESSAGE = {
|
|
2
|
-
INVALID_THOUGHTSPOT_HOST:
|
|
3
|
-
|
|
4
|
-
LIVEBOARD_VIZ_ID_VALIDATION:
|
|
5
|
-
'Please provide either liveboardId or pinboardId',
|
|
2
|
+
INVALID_THOUGHTSPOT_HOST: 'Error parsing ThoughtSpot host. Please provide a valid URL.',
|
|
3
|
+
LIVEBOARD_VIZ_ID_VALIDATION: 'Please provide either liveboardId or pinboardId',
|
|
6
4
|
TRIGGER_TIMED_OUT: 'Trigger timedout in getting response',
|
|
7
|
-
SEARCHEMBED_BETA_WRANING_MESSAGE:
|
|
8
|
-
'Search Embed is in Beta in this release.',
|
|
5
|
+
SEARCHEMBED_BETA_WRANING_MESSAGE: 'Search Embed is in Beta in this release.',
|
|
9
6
|
};
|