@thoughtspot/visual-embed-sdk 1.44.1 → 1.44.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.
Files changed (246) hide show
  1. package/cjs/package.json +6 -5
  2. package/cjs/src/api-intercept.d.ts.map +1 -1
  3. package/cjs/src/api-intercept.js +8 -3
  4. package/cjs/src/api-intercept.js.map +1 -1
  5. package/cjs/src/api-intercept.spec.js +19 -3
  6. package/cjs/src/api-intercept.spec.js.map +1 -1
  7. package/cjs/src/auth.spec.js +43 -42
  8. package/cjs/src/auth.spec.js.map +1 -1
  9. package/cjs/src/authToken.spec.js +3 -3
  10. package/cjs/src/authToken.spec.js.map +1 -1
  11. package/cjs/src/embed/app.d.ts +17 -0
  12. package/cjs/src/embed/app.d.ts.map +1 -1
  13. package/cjs/src/embed/app.js +9 -5
  14. package/cjs/src/embed/app.js.map +1 -1
  15. package/cjs/src/embed/app.spec.js +96 -6
  16. package/cjs/src/embed/app.spec.js.map +1 -1
  17. package/cjs/src/embed/base.d.ts +1 -1
  18. package/cjs/src/embed/base.d.ts.map +1 -1
  19. package/cjs/src/embed/base.js +4 -0
  20. package/cjs/src/embed/base.js.map +1 -1
  21. package/cjs/src/embed/base.spec.js +71 -15
  22. package/cjs/src/embed/base.spec.js.map +1 -1
  23. package/cjs/src/embed/bodyless-conversation.spec.js +2 -2
  24. package/cjs/src/embed/bodyless-conversation.spec.js.map +1 -1
  25. package/cjs/src/embed/conversation.d.ts.map +1 -1
  26. package/cjs/src/embed/conversation.js +6 -1
  27. package/cjs/src/embed/conversation.js.map +1 -1
  28. package/cjs/src/embed/conversation.spec.js +8 -3
  29. package/cjs/src/embed/conversation.spec.js.map +1 -1
  30. package/cjs/src/embed/embed.spec.js +101 -2
  31. package/cjs/src/embed/embed.spec.js.map +1 -1
  32. package/cjs/src/embed/events.spec.js +2 -2
  33. package/cjs/src/embed/events.spec.js.map +1 -1
  34. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +1 -1
  35. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  36. package/cjs/src/embed/liveboard.d.ts +18 -0
  37. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  38. package/cjs/src/embed/liveboard.js +13 -6
  39. package/cjs/src/embed/liveboard.js.map +1 -1
  40. package/cjs/src/embed/liveboard.spec.js +114 -26
  41. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  42. package/cjs/src/embed/pinboard.spec.js +1 -1
  43. package/cjs/src/embed/pinboard.spec.js.map +1 -1
  44. package/cjs/src/embed/sage.spec.js +2 -2
  45. package/cjs/src/embed/sage.spec.js.map +1 -1
  46. package/cjs/src/embed/search.spec.js +118 -2
  47. package/cjs/src/embed/search.spec.js.map +1 -1
  48. package/cjs/src/embed/ts-embed-trigger.spec.js +2 -3
  49. package/cjs/src/embed/ts-embed-trigger.spec.js.map +1 -1
  50. package/cjs/src/embed/ts-embed.d.ts +3 -2
  51. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  52. package/cjs/src/embed/ts-embed.js +51 -17
  53. package/cjs/src/embed/ts-embed.js.map +1 -1
  54. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  55. package/cjs/src/embed/ts-embed.spec.js +335 -71
  56. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  57. package/cjs/src/errors.d.ts +8 -0
  58. package/cjs/src/errors.d.ts.map +1 -1
  59. package/cjs/src/errors.js +8 -0
  60. package/cjs/src/errors.js.map +1 -1
  61. package/cjs/src/mixpanel-service.spec.js +1 -1
  62. package/cjs/src/mixpanel-service.spec.js.map +1 -1
  63. package/cjs/src/react/index.spec.js +3 -4
  64. package/cjs/src/react/index.spec.js.map +1 -1
  65. package/cjs/src/test/test-utils.js +1 -1
  66. package/cjs/src/test/test-utils.js.map +1 -1
  67. package/cjs/src/types.d.ts +194 -1
  68. package/cjs/src/types.d.ts.map +1 -1
  69. package/cjs/src/types.js +94 -2
  70. package/cjs/src/types.js.map +1 -1
  71. package/cjs/src/utils/authService/authService.spec.js +8 -8
  72. package/cjs/src/utils/authService/authService.spec.js.map +1 -1
  73. package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  74. package/cjs/src/utils/graphql/answerService/answerService.spec.js +1 -1
  75. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  76. package/cjs/src/utils/graphql/graphql-request.spec.js +1 -1
  77. package/cjs/src/utils/graphql/graphql-request.spec.js.map +1 -1
  78. package/cjs/src/utils/graphql/sourceService.spec.js +1 -1
  79. package/cjs/src/utils/graphql/sourceService.spec.js.map +1 -1
  80. package/cjs/src/utils/logger.spec.d.ts +5 -20
  81. package/cjs/src/utils/logger.spec.d.ts.map +1 -1
  82. package/cjs/src/utils/processData.spec.js +17 -17
  83. package/cjs/src/utils/processData.spec.js.map +1 -1
  84. package/cjs/src/utils/processTrigger.spec.js +8 -8
  85. package/cjs/src/utils/processTrigger.spec.js.map +1 -1
  86. package/cjs/src/utils.d.ts +16 -3
  87. package/cjs/src/utils.d.ts.map +1 -1
  88. package/cjs/src/utils.js +60 -5
  89. package/cjs/src/utils.js.map +1 -1
  90. package/cjs/src/utils.spec.js +72 -10
  91. package/cjs/src/utils.spec.js.map +1 -1
  92. package/dist/{index-BE9gGzRX.js → index-D0n5LIka.js} +1 -1
  93. package/dist/src/api-intercept.d.ts.map +1 -1
  94. package/dist/src/embed/app.d.ts +17 -0
  95. package/dist/src/embed/app.d.ts.map +1 -1
  96. package/dist/src/embed/base.d.ts +1 -1
  97. package/dist/src/embed/base.d.ts.map +1 -1
  98. package/dist/src/embed/conversation.d.ts.map +1 -1
  99. package/dist/src/embed/liveboard.d.ts +18 -0
  100. package/dist/src/embed/liveboard.d.ts.map +1 -1
  101. package/dist/src/embed/ts-embed.d.ts +3 -2
  102. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  103. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  104. package/dist/src/errors.d.ts +8 -0
  105. package/dist/src/errors.d.ts.map +1 -1
  106. package/dist/src/types.d.ts +194 -1
  107. package/dist/src/types.d.ts.map +1 -1
  108. package/dist/src/utils/logger.spec.d.ts +5 -20
  109. package/dist/src/utils/logger.spec.d.ts.map +1 -1
  110. package/dist/src/utils.d.ts +16 -3
  111. package/dist/src/utils.d.ts.map +1 -1
  112. package/dist/tsembed-react.es.js +282 -74
  113. package/dist/tsembed-react.js +281 -73
  114. package/dist/tsembed.es.js +282 -74
  115. package/dist/tsembed.js +281 -73
  116. package/dist/visual-embed-sdk-react-full.d.ts +185 -3
  117. package/dist/visual-embed-sdk-react.d.ts +184 -2
  118. package/dist/visual-embed-sdk.d.ts +185 -3
  119. package/lib/package.json +6 -5
  120. package/lib/src/api-intercept.d.ts.map +1 -1
  121. package/lib/src/api-intercept.js +9 -4
  122. package/lib/src/api-intercept.js.map +1 -1
  123. package/lib/src/api-intercept.spec.js +20 -4
  124. package/lib/src/api-intercept.spec.js.map +1 -1
  125. package/lib/src/auth.spec.js +43 -42
  126. package/lib/src/auth.spec.js.map +1 -1
  127. package/lib/src/authToken.spec.js +3 -3
  128. package/lib/src/authToken.spec.js.map +1 -1
  129. package/lib/src/embed/app.d.ts +17 -0
  130. package/lib/src/embed/app.d.ts.map +1 -1
  131. package/lib/src/embed/app.js +10 -6
  132. package/lib/src/embed/app.js.map +1 -1
  133. package/lib/src/embed/app.spec.js +96 -6
  134. package/lib/src/embed/app.spec.js.map +1 -1
  135. package/lib/src/embed/base.d.ts +1 -1
  136. package/lib/src/embed/base.d.ts.map +1 -1
  137. package/lib/src/embed/base.js +5 -1
  138. package/lib/src/embed/base.js.map +1 -1
  139. package/lib/src/embed/base.spec.js +72 -16
  140. package/lib/src/embed/base.spec.js.map +1 -1
  141. package/lib/src/embed/bodyless-conversation.spec.js +2 -2
  142. package/lib/src/embed/bodyless-conversation.spec.js.map +1 -1
  143. package/lib/src/embed/conversation.d.ts.map +1 -1
  144. package/lib/src/embed/conversation.js +7 -2
  145. package/lib/src/embed/conversation.js.map +1 -1
  146. package/lib/src/embed/conversation.spec.js +9 -4
  147. package/lib/src/embed/conversation.spec.js.map +1 -1
  148. package/lib/src/embed/embed.spec.js +103 -4
  149. package/lib/src/embed/embed.spec.js.map +1 -1
  150. package/lib/src/embed/events.spec.js +2 -2
  151. package/lib/src/embed/events.spec.js.map +1 -1
  152. package/lib/src/embed/hostEventClient/host-event-client.spec.js +2 -2
  153. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  154. package/lib/src/embed/liveboard.d.ts +18 -0
  155. package/lib/src/embed/liveboard.d.ts.map +1 -1
  156. package/lib/src/embed/liveboard.js +15 -8
  157. package/lib/src/embed/liveboard.js.map +1 -1
  158. package/lib/src/embed/liveboard.spec.js +114 -26
  159. package/lib/src/embed/liveboard.spec.js.map +1 -1
  160. package/lib/src/embed/pinboard.spec.js +1 -1
  161. package/lib/src/embed/pinboard.spec.js.map +1 -1
  162. package/lib/src/embed/sage.spec.js +2 -2
  163. package/lib/src/embed/sage.spec.js.map +1 -1
  164. package/lib/src/embed/search.spec.js +118 -2
  165. package/lib/src/embed/search.spec.js.map +1 -1
  166. package/lib/src/embed/ts-embed-trigger.spec.js +2 -3
  167. package/lib/src/embed/ts-embed-trigger.spec.js.map +1 -1
  168. package/lib/src/embed/ts-embed.d.ts +3 -2
  169. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  170. package/lib/src/embed/ts-embed.js +52 -18
  171. package/lib/src/embed/ts-embed.js.map +1 -1
  172. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  173. package/lib/src/embed/ts-embed.spec.js +336 -72
  174. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  175. package/lib/src/errors.d.ts +8 -0
  176. package/lib/src/errors.d.ts.map +1 -1
  177. package/lib/src/errors.js +8 -0
  178. package/lib/src/errors.js.map +1 -1
  179. package/lib/src/mixpanel-service.spec.js +1 -1
  180. package/lib/src/mixpanel-service.spec.js.map +1 -1
  181. package/lib/src/react/index.spec.js +3 -4
  182. package/lib/src/react/index.spec.js.map +1 -1
  183. package/lib/src/test/test-utils.js +1 -1
  184. package/lib/src/test/test-utils.js.map +1 -1
  185. package/lib/src/types.d.ts +194 -1
  186. package/lib/src/types.d.ts.map +1 -1
  187. package/lib/src/types.js +93 -1
  188. package/lib/src/types.js.map +1 -1
  189. package/lib/src/utils/authService/authService.spec.js +8 -8
  190. package/lib/src/utils/authService/authService.spec.js.map +1 -1
  191. package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  192. package/lib/src/utils/graphql/answerService/answerService.spec.js +1 -1
  193. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  194. package/lib/src/utils/graphql/graphql-request.spec.js +1 -1
  195. package/lib/src/utils/graphql/graphql-request.spec.js.map +1 -1
  196. package/lib/src/utils/graphql/sourceService.spec.js +1 -1
  197. package/lib/src/utils/graphql/sourceService.spec.js.map +1 -1
  198. package/lib/src/utils/logger.spec.d.ts +5 -20
  199. package/lib/src/utils/logger.spec.d.ts.map +1 -1
  200. package/lib/src/utils/processData.spec.js +17 -17
  201. package/lib/src/utils/processData.spec.js.map +1 -1
  202. package/lib/src/utils/processTrigger.spec.js +8 -8
  203. package/lib/src/utils/processTrigger.spec.js.map +1 -1
  204. package/lib/src/utils.d.ts +16 -3
  205. package/lib/src/utils.d.ts.map +1 -1
  206. package/lib/src/utils.js +57 -4
  207. package/lib/src/utils.js.map +1 -1
  208. package/lib/src/utils.spec.js +73 -11
  209. package/lib/src/utils.spec.js.map +1 -1
  210. package/package.json +6 -5
  211. package/src/api-intercept.spec.ts +23 -10
  212. package/src/api-intercept.ts +9 -4
  213. package/src/auth.spec.ts +53 -51
  214. package/src/authToken.spec.ts +3 -3
  215. package/src/embed/app.spec.ts +128 -7
  216. package/src/embed/app.ts +30 -4
  217. package/src/embed/base.spec.ts +95 -21
  218. package/src/embed/base.ts +5 -2
  219. package/src/embed/bodyless-conversation.spec.ts +2 -2
  220. package/src/embed/conversation.spec.ts +9 -4
  221. package/src/embed/conversation.ts +7 -2
  222. package/src/embed/embed.spec.ts +122 -2
  223. package/src/embed/events.spec.ts +2 -2
  224. package/src/embed/hostEventClient/host-event-client.spec.ts +2 -2
  225. package/src/embed/liveboard.spec.ts +137 -29
  226. package/src/embed/liveboard.ts +36 -6
  227. package/src/embed/pinboard.spec.ts +1 -1
  228. package/src/embed/sage.spec.ts +2 -2
  229. package/src/embed/search.spec.ts +133 -2
  230. package/src/embed/ts-embed-trigger.spec.ts +2 -3
  231. package/src/embed/ts-embed.spec.ts +424 -91
  232. package/src/embed/ts-embed.ts +56 -19
  233. package/src/errors.ts +8 -0
  234. package/src/mixpanel-service.spec.ts +1 -1
  235. package/src/react/index.spec.tsx +4 -5
  236. package/src/test/test-utils.ts +2 -2
  237. package/src/types.ts +206 -1
  238. package/src/utils/authService/authService.spec.ts +17 -17
  239. package/src/utils/authService/tokenizedAuthService.spec.ts +4 -4
  240. package/src/utils/graphql/answerService/answerService.spec.ts +3 -3
  241. package/src/utils/graphql/graphql-request.spec.ts +2 -2
  242. package/src/utils/graphql/sourceService.spec.ts +1 -1
  243. package/src/utils/processData.spec.ts +26 -26
  244. package/src/utils/processTrigger.spec.ts +8 -8
  245. package/src/utils.spec.ts +100 -11
  246. package/src/utils.ts +59 -7
@@ -1,13 +1,18 @@
1
1
  import { logger } from '../utils/logger';
2
2
  import {
3
3
  init, AuthType, SearchEmbed, EmbedEvent,
4
+ RuntimeFilterOp,
5
+ Action,
4
6
  } from '../index';
5
7
  import {
6
8
  EVENT_WAIT_TIME,
7
9
  executeAfterWait,
10
+ expectUrlToHaveParamsWithValues,
8
11
  getDocumentBody,
9
12
  getIFrameEl,
13
+ getIFrameSrc,
10
14
  getRootEl,
15
+ postMessageToParent,
11
16
  } from '../test/test-utils';
12
17
  import * as authInstance from '../auth';
13
18
 
@@ -24,8 +29,8 @@ beforeAll(() => {
24
29
  thoughtSpotHost,
25
30
  authType: AuthType.None,
26
31
  });
27
- spyOn(window, 'alert');
28
- jest.spyOn(authInstance, 'postLoginService').mockResolvedValue(true);
32
+ jest.spyOn(window, 'alert');
33
+ jest.spyOn(authInstance, 'postLoginService').mockImplementation(() => Promise.resolve(undefined));
29
34
  });
30
35
 
31
36
  describe('test view config', () => {
@@ -52,4 +57,119 @@ describe('test view config', () => {
52
57
  expect(iframe.style.height).toBe(`${height}px`);
53
58
  });
54
59
  });
60
+
61
+ test('should pass hideResults parameter when configured', async () => {
62
+ const searchEmbed = new SearchEmbed(getRootEl(), {
63
+ ...defaultViewConfig,
64
+ hideResults: true,
65
+ });
66
+ searchEmbed.render();
67
+
68
+ await executeAfterWait(() => {
69
+ const iframeSrc = getIFrameSrc();
70
+ expectUrlToHaveParamsWithValues(iframeSrc, {
71
+ hideResult: true,
72
+ });
73
+ });
74
+ });
75
+
76
+ test('should pass forceTable parameter when configured', async () => {
77
+ const searchEmbed = new SearchEmbed(getRootEl(), {
78
+ ...defaultViewConfig,
79
+ forceTable: true,
80
+ });
81
+ searchEmbed.render();
82
+
83
+ await executeAfterWait(() => {
84
+ const iframeSrc = getIFrameSrc();
85
+ expectUrlToHaveParamsWithValues(iframeSrc, {
86
+ forceTable: true,
87
+ });
88
+ });
89
+ });
90
+
91
+ test('should pass enableSearchAssist parameter when configured', async () => {
92
+ const searchEmbed = new SearchEmbed(getRootEl(), {
93
+ ...defaultViewConfig,
94
+ enableSearchAssist: true,
95
+ });
96
+ searchEmbed.render();
97
+
98
+ await executeAfterWait(() => {
99
+ const iframeSrc = getIFrameSrc();
100
+ expectUrlToHaveParamsWithValues(iframeSrc, {
101
+ enableSearchAssist: true,
102
+ });
103
+ });
104
+ });
105
+
106
+ test('should pass hideSearchBar parameter when configured', async () => {
107
+ const searchEmbed = new SearchEmbed(getRootEl(), {
108
+ ...defaultViewConfig,
109
+ hideSearchBar: true,
110
+ });
111
+ searchEmbed.render();
112
+
113
+ await executeAfterWait(() => {
114
+ const iframeSrc = getIFrameSrc();
115
+ expectUrlToHaveParamsWithValues(iframeSrc, {
116
+ hideSearchBar: true,
117
+ });
118
+ });
119
+ });
120
+
121
+ test('should register and trigger event listeners', async () => {
122
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
123
+ const mockCallback = jest.fn();
124
+
125
+ searchEmbed.on(EmbedEvent.Load, mockCallback);
126
+ await searchEmbed.render();
127
+
128
+ await executeAfterWait(() => {
129
+ const iframe = getIFrameEl();
130
+ postMessageToParent(iframe.contentWindow, {
131
+ type: EmbedEvent.Load,
132
+ });
133
+ });
134
+
135
+ await executeAfterWait(() => {
136
+ expect(mockCallback).toHaveBeenCalled();
137
+ }, EVENT_WAIT_TIME);
138
+ });
139
+
140
+ test('should pass disabledActions parameter when configured', async () => {
141
+ const disabledActions = [Action.Download, Action.Share];
142
+ const searchEmbed = new SearchEmbed(getRootEl(), {
143
+ ...defaultViewConfig,
144
+ disabledActions,
145
+ });
146
+ searchEmbed.render();
147
+
148
+ await executeAfterWait(() => {
149
+ const iframeSrc = getIFrameSrc();
150
+ expect(iframeSrc).toContain('disableAction');
151
+ });
152
+ });
153
+
154
+ test('should pass runtime filters when configured', async () => {
155
+ const runtimeFilters = [
156
+ {
157
+ columnName: 'revenue',
158
+ operator: RuntimeFilterOp.GT,
159
+ values: [1000],
160
+ },
161
+ ];
162
+ const searchEmbed = new SearchEmbed(getRootEl(), {
163
+ ...defaultViewConfig,
164
+ runtimeFilters,
165
+ });
166
+ searchEmbed.render();
167
+
168
+ await executeAfterWait(() => {
169
+ const iframeSrc = getIFrameSrc();
170
+ expect(iframeSrc).toContain('col1=revenue');
171
+ expect(iframeSrc).toContain('op1=GT');
172
+ expect(iframeSrc).toContain('val1=1000');
173
+ });
174
+ });
55
175
  });
@@ -36,8 +36,8 @@ beforeAll(() => {
36
36
  thoughtSpotHost,
37
37
  authType: AuthType.None,
38
38
  });
39
- spyOn(window, 'alert');
40
- jest.spyOn(authInstance, 'postLoginService').mockReturnValue(true);
39
+ jest.spyOn(window, 'alert');
40
+ jest.spyOn(authInstance, 'postLoginService').mockImplementation(() => Promise.resolve(undefined));
41
41
  });
42
42
 
43
43
  describe('test communication between host app and ThoughtSpot', () => {
@@ -1,5 +1,5 @@
1
1
  import { getIFrameEl, getRootEl } from '../../test/test-utils';
2
- import { HostEvent } from '../../types';
2
+ import { AuthType, HostEvent } from '../../types';
3
3
  import { processTrigger } from '../../utils/processTrigger';
4
4
  import * as EmbedConfigService from '../embedConfig';
5
5
  import {
@@ -23,7 +23,7 @@ const createHostEventClient = () => {
23
23
  describe('HostEventClient', () => {
24
24
  const mockThoughtSpotHost = 'http://localhost';
25
25
  beforeEach(() => {
26
- jest.spyOn(EmbedConfigService, 'getEmbedConfig').mockReturnValue({ thoughtSpotHost: mockThoughtSpotHost });
26
+ jest.spyOn(EmbedConfigService, 'getEmbedConfig').mockReturnValue({ thoughtSpotHost: mockThoughtSpotHost, authType: AuthType.None } as any);
27
27
  });
28
28
 
29
29
  afterEach(() => {
@@ -27,6 +27,7 @@ import * as processTriggerInstance from '../utils/processTrigger';
27
27
  import * as auth from '../auth';
28
28
  import * as previewService from '../utils/graphql/preview-service';
29
29
  import * as SessionInfoService from '../utils/sessionInfoService';
30
+ import { logger } from '../utils/logger';
30
31
 
31
32
  const defaultViewConfig = {
32
33
  frameParams: {
@@ -57,7 +58,7 @@ beforeAll(() => {
57
58
  thoughtSpotHost,
58
59
  authType: AuthType.None,
59
60
  });
60
- jest.spyOn(auth, 'postLoginService').mockImplementation(() => Promise.resolve({}));
61
+ jest.spyOn(auth, 'postLoginService').mockImplementation(() => Promise.resolve(undefined));
61
62
  });
62
63
 
63
64
  describe('Liveboard/viz embed tests', () => {
@@ -407,6 +408,70 @@ describe('Liveboard/viz embed tests', () => {
407
408
  });
408
409
  });
409
410
 
411
+ test('Should add showMaskedFilterChip flag set to true to the iframe src', async () => {
412
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
413
+ ...defaultViewConfig,
414
+ liveboardId,
415
+ showMaskedFilterChip: true,
416
+ } as LiveboardViewConfig);
417
+
418
+ liveboardEmbed.render();
419
+ await executeAfterWait(() => {
420
+ expectUrlMatchesWithParams(
421
+ getIFrameSrc(),
422
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&showMaskedFilterChip=true${prefixParams}#/embed/viz/${liveboardId}`,
423
+ );
424
+ });
425
+ });
426
+
427
+ test('Should add showMaskedFilterChip flag set to false to the iframe src', async () => {
428
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
429
+ ...defaultViewConfig,
430
+ liveboardId,
431
+ showMaskedFilterChip: false,
432
+ } as LiveboardViewConfig);
433
+
434
+ liveboardEmbed.render();
435
+ await executeAfterWait(() => {
436
+ expectUrlMatchesWithParams(
437
+ getIFrameSrc(),
438
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&showMaskedFilterChip=false${prefixParams}#/embed/viz/${liveboardId}`,
439
+ );
440
+ });
441
+ });
442
+
443
+ test('Should add isLiveboardMasterpiecesEnabled flag set to true to the iframe src', async () => {
444
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
445
+ ...defaultViewConfig,
446
+ liveboardId,
447
+ isLiveboardMasterpiecesEnabled: true,
448
+ } as LiveboardViewConfig);
449
+
450
+ liveboardEmbed.render();
451
+ await executeAfterWait(() => {
452
+ expectUrlMatchesWithParams(
453
+ getIFrameSrc(),
454
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&isLiveboardMasterpiecesEnabled=true${prefixParams}#/embed/viz/${liveboardId}`,
455
+ );
456
+ });
457
+ });
458
+
459
+ test('Should add isLiveboardMasterpiecesEnabled flag set to false to the iframe src', async () => {
460
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
461
+ ...defaultViewConfig,
462
+ liveboardId,
463
+ isLiveboardMasterpiecesEnabled: false,
464
+ } as LiveboardViewConfig);
465
+
466
+ liveboardEmbed.render();
467
+ await executeAfterWait(() => {
468
+ expectUrlMatchesWithParams(
469
+ getIFrameSrc(),
470
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&isLiveboardMasterpiecesEnabled=false${prefixParams}#/embed/viz/${liveboardId}`,
471
+ );
472
+ });
473
+ });
474
+
410
475
  test('Should add hideIrrelevantFiltersAtTabLevel flag to the iframe src', async () => {
411
476
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
412
477
  ...defaultViewConfig,
@@ -679,7 +744,7 @@ describe('Liveboard/viz embed tests', () => {
679
744
  });
680
745
  });
681
746
  test('should process the trigger, for vizEmbed', async () => {
682
- const mockProcessTrigger = spyOn(processTriggerInstance, 'processTrigger');
747
+ const mockProcessTrigger = jest.spyOn(processTriggerInstance, 'processTrigger').mockImplementation(jest.fn());
683
748
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
684
749
  enableVizTransformations: true,
685
750
  ...defaultViewConfig,
@@ -689,7 +754,7 @@ describe('Liveboard/viz embed tests', () => {
689
754
  liveboardEmbed.render();
690
755
  await executeAfterWait(async () => {
691
756
  await liveboardEmbed.trigger(HostEvent.Pin);
692
- expect(mockProcessTrigger).toBeCalled();
757
+ expect(mockProcessTrigger).toHaveBeenCalled();
693
758
  });
694
759
  });
695
760
 
@@ -756,7 +821,7 @@ describe('Liveboard/viz embed tests', () => {
756
821
  });
757
822
  });
758
823
 
759
- test('navigateToLiveboard should trigger the navigate event with the correct path', async (done) => {
824
+ test('navigateToLiveboard should trigger the navigate event with the correct path', async () => {
760
825
  mockMessageChannel();
761
826
  // mock getSessionInfo
762
827
 
@@ -766,7 +831,7 @@ describe('Liveboard/viz embed tests', () => {
766
831
  } as LiveboardViewConfig);
767
832
  const onSpy = jest.spyOn(liveboardEmbed, 'trigger');
768
833
  await liveboardEmbed.prerenderGeneric();
769
- executeAfterWait(() => {
834
+ await executeAfterWait(() => {
770
835
  const iframe = getIFrameEl();
771
836
  postMessageToParent(iframe.contentWindow, {
772
837
  type: EmbedEvent.APP_INIT,
@@ -777,13 +842,12 @@ describe('Liveboard/viz embed tests', () => {
777
842
  liveboardEmbed.navigateToLiveboard('lb1', 'viz1');
778
843
  });
779
844
 
780
- executeAfterWait(() => {
845
+ await executeAfterWait(() => {
781
846
  expect(onSpy).toHaveBeenCalledWith(HostEvent.Navigate, 'embed/viz/lb1/viz1');
782
- done();
783
847
  }, 1002);
784
848
  });
785
849
 
786
- test('navigateToLiveboard with preRender', async (done) => {
850
+ test('navigateToLiveboard with preRender', async () => {
787
851
  mockMessageChannel();
788
852
 
789
853
  // mock getSessionInfo
@@ -793,7 +857,7 @@ describe('Liveboard/viz embed tests', () => {
793
857
  currentOrgId: 1,
794
858
  privileges: [],
795
859
  mixpanelToken: '1234567890',
796
- });
860
+ } as any);
797
861
  mockGetSessionInfo();
798
862
 
799
863
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
@@ -802,7 +866,7 @@ describe('Liveboard/viz embed tests', () => {
802
866
  } as LiveboardViewConfig);
803
867
  const onSpy = jest.spyOn(liveboardEmbed, 'trigger');
804
868
  await liveboardEmbed.prerenderGeneric();
805
- executeAfterWait(() => {
869
+ await executeAfterWait(() => {
806
870
  const iframe = getIFrameEl();
807
871
  postMessageToParent(iframe.contentWindow, {
808
872
  type: EmbedEvent.APP_INIT,
@@ -811,10 +875,9 @@ describe('Liveboard/viz embed tests', () => {
811
875
  type: EmbedEvent.AuthInit,
812
876
  });
813
877
  });
814
- executeAfterWait(() => {
878
+ await executeAfterWait(() => {
815
879
  liveboardEmbed.navigateToLiveboard('lb1', 'viz1');
816
880
  expect(onSpy).toHaveBeenCalledWith(HostEvent.Navigate, 'embed/viz/lb1/viz1');
817
- done();
818
881
  }, 1002);
819
882
  });
820
883
  test('should set runtime parametere values in url params', async () => {
@@ -894,7 +957,7 @@ describe('Liveboard/viz embed tests', () => {
894
957
  const result = liveboardEmbed.trigger(HostEvent.SetActiveTab, {
895
958
  tabId: newActiveTabId,
896
959
  });
897
- expect(mockProcessTrigger).not.toBeCalled();
960
+ expect(mockProcessTrigger).not.toHaveBeenCalled();
898
961
  });
899
962
  });
900
963
 
@@ -924,14 +987,14 @@ describe('Liveboard/viz embed tests', () => {
924
987
  authType: AuthType.None,
925
988
  });
926
989
  });
927
- test('it should preRender generic with liveboard id is not passed', async (done) => {
990
+ test('it should preRender generic with liveboard id is not passed', async () => {
928
991
  const consoleSpy = jest.spyOn(console, 'error');
929
992
  const libEmbed = new LiveboardEmbed(getRootEl(), {
930
993
  preRenderId: 'testPreRender',
931
994
  });
932
995
  const prerenderGenericSpy = jest.spyOn(libEmbed, 'prerenderGeneric');
933
996
  await libEmbed.preRender();
934
- executeAfterWait(() => {
997
+ await executeAfterWait(() => {
935
998
  const iFrame = document.getElementById(
936
999
  libEmbed.getPreRenderIds().child,
937
1000
  ) as HTMLIFrameElement;
@@ -941,8 +1004,6 @@ describe('Liveboard/viz embed tests', () => {
941
1004
  expect(iFrame.src).toMatch(/http:\/\/tshost\/.*&isLiveboardEmbed=true.*#$/);
942
1005
 
943
1006
  expect(consoleSpy).toHaveBeenCalledTimes(0);
944
-
945
- done();
946
1007
  });
947
1008
  });
948
1009
 
@@ -990,7 +1051,7 @@ describe('Liveboard/viz embed tests', () => {
990
1051
  });
991
1052
  });
992
1053
 
993
- test('it should navigateToLiveboard with liveboard id is not passed with EmbedListenerReady event', async (done) => {
1054
+ test('it should navigateToLiveboard with liveboard id is not passed with EmbedListenerReady event', async () => {
994
1055
  mockMessageChannel();
995
1056
  const consoleSpy = jest.spyOn(console, 'error');
996
1057
  const testPreRenderId = 'testPreRender';
@@ -1035,7 +1096,7 @@ describe('Liveboard/viz embed tests', () => {
1035
1096
  const navigateToLiveboardSpy = jest.spyOn(newLibEmbed, 'navigateToLiveboard');
1036
1097
  await newLibEmbed.showPreRender();
1037
1098
 
1038
- executeAfterWait(() => {
1099
+ await executeAfterWait(() => {
1039
1100
  const iFrame = document.getElementById(
1040
1101
  libEmbed.getPreRenderIds().child,
1041
1102
  ) as HTMLIFrameElement;
@@ -1045,12 +1106,10 @@ describe('Liveboard/viz embed tests', () => {
1045
1106
  expect(iFrame.src).toMatch(/http:\/\/tshost\/.*&isLiveboardEmbed=true.*#$/);
1046
1107
 
1047
1108
  expect(consoleSpy).toHaveBeenCalledTimes(0);
1048
-
1049
- done();
1050
1109
  });
1051
1110
  });
1052
1111
 
1053
- test('it should navigateToLiveboard with liveboard id is not passed with AuthInit event', async (done) => {
1112
+ test('it should navigateToLiveboard with liveboard id is not passed with AuthInit event', async () => {
1054
1113
  mockMessageChannel();
1055
1114
  const consoleSpy = jest.spyOn(console, 'error');
1056
1115
  const testPreRenderId = 'testPreRender';
@@ -1104,7 +1163,6 @@ describe('Liveboard/viz embed tests', () => {
1104
1163
  expect(navigateToLiveboardSpy).toHaveBeenCalledWith(testLiveboardId, 'testVizId', 'testActiveTabId');
1105
1164
  expect(iFrame.src).toMatch(/http:\/\/tshost\/.*&isLiveboardEmbed=true.*#$/);
1106
1165
  expect(consoleSpy).toHaveBeenCalledTimes(0);
1107
- done();
1108
1166
  }, 1005);
1109
1167
  });
1110
1168
 
@@ -1213,6 +1271,7 @@ describe('Liveboard/viz embed tests', () => {
1213
1271
  liveboardId,
1214
1272
  fullHeight: true,
1215
1273
  lazyLoadingForFullHeight: true,
1274
+ lazyLoadingMargin: '10px',
1216
1275
  } as LiveboardViewConfig);
1217
1276
 
1218
1277
  await liveboardEmbed.render();
@@ -1266,6 +1325,7 @@ describe('Liveboard/viz embed tests', () => {
1266
1325
  liveboardId,
1267
1326
  fullHeight: true,
1268
1327
  lazyLoadingForFullHeight: true,
1328
+ lazyLoadingMargin: '10px',
1269
1329
  } as LiveboardViewConfig);
1270
1330
 
1271
1331
  await liveboardEmbed.render();
@@ -1284,6 +1344,7 @@ describe('Liveboard/viz embed tests', () => {
1284
1344
  liveboardId,
1285
1345
  fullHeight: true,
1286
1346
  lazyLoadingForFullHeight: true,
1347
+ lazyLoadingMargin: '10px',
1287
1348
  } as LiveboardViewConfig);
1288
1349
 
1289
1350
  const mockTrigger = jest.spyOn(liveboardEmbed, 'trigger');
@@ -1316,6 +1377,7 @@ describe('Liveboard/viz embed tests', () => {
1316
1377
  liveboardId,
1317
1378
  fullHeight: true,
1318
1379
  lazyLoadingForFullHeight: true,
1380
+ lazyLoadingMargin: '10px',
1319
1381
  } as LiveboardViewConfig);
1320
1382
 
1321
1383
  const mockTrigger = jest.spyOn(liveboardEmbed, 'trigger');
@@ -1341,6 +1403,7 @@ describe('Liveboard/viz embed tests', () => {
1341
1403
  liveboardId,
1342
1404
  fullHeight: true,
1343
1405
  lazyLoadingForFullHeight: true,
1406
+ lazyLoadingMargin: '10px',
1344
1407
  } as LiveboardViewConfig);
1345
1408
 
1346
1409
  await liveboardEmbed.render();
@@ -1362,6 +1425,7 @@ describe('Liveboard/viz embed tests', () => {
1362
1425
  liveboardId,
1363
1426
  fullHeight: true,
1364
1427
  lazyLoadingForFullHeight: true,
1428
+ lazyLoadingMargin: '10px',
1365
1429
  } as LiveboardViewConfig);
1366
1430
 
1367
1431
  await liveboardEmbed.render();
@@ -1390,6 +1454,7 @@ describe('Liveboard/viz embed tests', () => {
1390
1454
  liveboardId,
1391
1455
  fullHeight: true,
1392
1456
  lazyLoadingForFullHeight: true,
1457
+ lazyLoadingMargin: '10px',
1393
1458
  } as LiveboardViewConfig);
1394
1459
 
1395
1460
  // Set the iframe before render
@@ -1448,7 +1513,7 @@ describe('Liveboard/viz embed tests', () => {
1448
1513
  ...defaultViewConfig,
1449
1514
  });
1450
1515
 
1451
- const navigateToLiveboardSpy = jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockResolvedValue(undefined);
1516
+ const navigateToLiveboardSpy = jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockImplementation(() => Promise.resolve(undefined));
1452
1517
 
1453
1518
  // Mock embed container as not loaded initially
1454
1519
  liveboardEmbed.isEmbedContainerLoaded = false;
@@ -1480,7 +1545,7 @@ describe('Liveboard/viz embed tests', () => {
1480
1545
  };
1481
1546
 
1482
1547
  jest.spyOn(liveboardEmbed as any, 'getPreRenderObj').mockReturnValue(mockPreRenderObj as any);
1483
- jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockResolvedValue(undefined);
1548
+ jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockImplementation(() => Promise.resolve(undefined));
1484
1549
 
1485
1550
  // Mock embed container as not loaded initially
1486
1551
  liveboardEmbed.isEmbedContainerLoaded = false;
@@ -1508,7 +1573,7 @@ describe('Liveboard/viz embed tests', () => {
1508
1573
  ...defaultViewConfig,
1509
1574
  });
1510
1575
 
1511
- const navigateToLiveboardSpy = jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockResolvedValue(undefined);
1576
+ const navigateToLiveboardSpy = jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockImplementation(() => Promise.resolve(undefined));
1512
1577
 
1513
1578
  // Mock embed container as already loaded
1514
1579
  liveboardEmbed.isEmbedContainerLoaded = true;
@@ -1529,7 +1594,7 @@ describe('Liveboard/viz embed tests', () => {
1529
1594
  });
1530
1595
 
1531
1596
  jest.spyOn(liveboardEmbed as any, 'getPreRenderObj').mockReturnValue(null);
1532
- const navigateToLiveboardSpy = jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockResolvedValue(undefined);
1597
+ const navigateToLiveboardSpy = jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockImplementation(() => Promise.resolve(undefined));
1533
1598
 
1534
1599
  // Mock embed container as not loaded initially
1535
1600
  liveboardEmbed.isEmbedContainerLoaded = false;
@@ -1557,7 +1622,7 @@ describe('Liveboard/viz embed tests', () => {
1557
1622
  ...defaultViewConfig,
1558
1623
  });
1559
1624
 
1560
- const navigateToLiveboardSpy = jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockResolvedValue(undefined);
1625
+ const navigateToLiveboardSpy = jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockImplementation(() => Promise.resolve(undefined));
1561
1626
 
1562
1627
  // Mock embed container as already loaded
1563
1628
  liveboardEmbed.isEmbedContainerLoaded = true;
@@ -1575,7 +1640,7 @@ describe('Liveboard/viz embed tests', () => {
1575
1640
  ...defaultViewConfig,
1576
1641
  });
1577
1642
 
1578
- const navigateToLiveboardSpy = jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockResolvedValue(undefined);
1643
+ const navigateToLiveboardSpy = jest.spyOn(liveboardEmbed, 'navigateToLiveboard').mockImplementation(() => Promise.resolve(undefined));
1579
1644
 
1580
1645
  // Mock embed container as already loaded
1581
1646
  liveboardEmbed.isEmbedContainerLoaded = true;
@@ -1587,4 +1652,47 @@ describe('Liveboard/viz embed tests', () => {
1587
1652
  expect(navigateToLiveboardSpy).toHaveBeenCalledWith(liveboardId, undefined, undefined);
1588
1653
  });
1589
1654
  });
1655
+
1656
+ describe('Liveboard Embed Default Height and Minimum Height Handling', () => {
1657
+ test('should set default height to 800 when minimum height is provided', async () => {
1658
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1659
+ liveboardId,
1660
+ ...defaultViewConfig,
1661
+ fullHeight: true,
1662
+ defaultHeight: 700,
1663
+ minimumHeight: 800,
1664
+ });
1665
+ await liveboardEmbed.render();
1666
+ expect(liveboardEmbed['defaultHeight']).toBe(800);
1667
+ });
1668
+ test('should set default height to 700 when default height is provided', async () => {
1669
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1670
+ liveboardId,
1671
+ ...defaultViewConfig,
1672
+ fullHeight: true,
1673
+ defaultHeight: 700,
1674
+ });
1675
+ await liveboardEmbed.render();
1676
+ expect(liveboardEmbed['defaultHeight']).toBe(700);
1677
+ });
1678
+ test('should set default height to 800 when minimum height is provided but default height is not', async () => {
1679
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1680
+ liveboardId,
1681
+ ...defaultViewConfig,
1682
+ fullHeight: true,
1683
+ minimumHeight: 800,
1684
+ });
1685
+ await liveboardEmbed.render();
1686
+ expect(liveboardEmbed['defaultHeight']).toBe(800);
1687
+ });
1688
+ test('should set default height to 500 when neither default height nor minimum height is provided', async () => {
1689
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1690
+ liveboardId,
1691
+ ...defaultViewConfig,
1692
+ fullHeight: true,
1693
+ });
1694
+ await liveboardEmbed.render();
1695
+ expect(liveboardEmbed['defaultHeight']).toBe(500);
1696
+ });
1697
+ });
1590
1698
  });
@@ -20,8 +20,10 @@ import {
20
20
  SearchLiveboardCommonViewConfig as LiveboardOtherViewConfig,
21
21
  BaseViewConfig,
22
22
  LiveboardAppEmbedViewConfig,
23
+ ErrorDetailsTypes,
24
+ EmbedErrorCodes,
23
25
  } from '../types';
24
- import { calculateVisibleElementData, getQueryParamString, isUndefined } from '../utils';
26
+ import { calculateVisibleElementData, getQueryParamString, isUndefined, isValidCssMargin } from '../utils';
25
27
  import { getAuthPromise } from './base';
26
28
  import { TsEmbed, V1Embed } from './ts-embed';
27
29
  import { addPreviewStylesIfNotPresent } from '../utils/global-styles';
@@ -65,6 +67,7 @@ export interface LiveboardViewConfig extends BaseViewConfig, LiveboardOtherViewC
65
67
  * Supported embed types: `LiveboardEmbed`
66
68
  * @version SDK: 1.5.0 | ThoughtSpot: ts7.oct.cl, 7.2.1
67
69
  * @default 500
70
+ * @deprecated Use `minimumHeight` instead.
68
71
  * @example
69
72
  * ```js
70
73
  * const embed = new LiveboardEmbed('#embed', {
@@ -75,6 +78,23 @@ export interface LiveboardViewConfig extends BaseViewConfig, LiveboardOtherViewC
75
78
  * ```
76
79
  */
77
80
  defaultHeight?: number;
81
+ /**
82
+ * This is the minimum height (in pixels) for a full-height Liveboard.
83
+ * Setting this height helps resolve issues with empty Liveboards and
84
+ * other screens navigable from a Liveboard.
85
+ *
86
+ * @version SDK: 1.44.2 | ThoughtSpot: 26.0.2.cl
87
+ * @default 500
88
+ * @example
89
+ * ```js
90
+ * const embed = new LiveboardEmbed('#embed', {
91
+ * ... // other liveboard view config
92
+ * fullHeight: true,
93
+ * minimumHeight: 600,
94
+ * });
95
+ * ```
96
+ */
97
+ minimumHeight?: number;
78
98
  /**
79
99
  * @Deprecated If set to true, the context menu in visualizations will be enabled.
80
100
  * @example
@@ -467,6 +487,7 @@ export class LiveboardEmbed extends V1Embed {
467
487
  enableVizTransformations,
468
488
  fullHeight,
469
489
  defaultHeight,
490
+ minimumHeight,
470
491
  visibleVizs,
471
492
  liveboardV2,
472
493
  vizId,
@@ -480,6 +501,8 @@ export class LiveboardEmbed extends V1Embed {
480
501
  showLiveboardVerifiedBadge = true,
481
502
  showLiveboardReverifyBanner = true,
482
503
  hideIrrelevantChipsInLiveboardTabs = false,
504
+ showMaskedFilterChip = false,
505
+ isLiveboardMasterpiecesEnabled = false,
483
506
  isEnhancedFilterInteractivityEnabled = false,
484
507
  enableAskSage,
485
508
  enable2ColumnLayout,
@@ -505,12 +528,12 @@ export class LiveboardEmbed extends V1Embed {
505
528
  params[Param.fullHeight] = true;
506
529
  if (this.viewConfig.lazyLoadingForFullHeight) {
507
530
  params[Param.IsLazyLoadingForEmbedEnabled] = true;
508
- params[Param.RootMarginForLazyLoad] = this.viewConfig.lazyLoadingMargin;
531
+ if (isValidCssMargin(this.viewConfig.lazyLoadingMargin)) {
532
+ params[Param.RootMarginForLazyLoad] = this.viewConfig.lazyLoadingMargin;
533
+ }
509
534
  }
510
535
  }
511
- if (defaultHeight) {
512
- this.defaultHeight = defaultHeight;
513
- }
536
+ this.defaultHeight = minimumHeight || defaultHeight || this.defaultHeight;
514
537
  if (enableVizTransformations !== undefined) {
515
538
  params[Param.EnableVizTransformations] = enableVizTransformations.toString();
516
539
  }
@@ -589,6 +612,8 @@ export class LiveboardEmbed extends V1Embed {
589
612
  params[Param.ShowLiveboardVerifiedBadge] = showLiveboardVerifiedBadge;
590
613
  params[Param.ShowLiveboardReverifyBanner] = showLiveboardReverifyBanner;
591
614
  params[Param.HideIrrelevantFiltersInTab] = hideIrrelevantChipsInLiveboardTabs;
615
+ params[Param.ShowMaskedFilterChip] = showMaskedFilterChip;
616
+ params[Param.IsLiveboardMasterpiecesEnabled] = isLiveboardMasterpiecesEnabled;
592
617
  params[Param.IsEnhancedFilterInteractivityEnabled] = isEnhancedFilterInteractivityEnabled;
593
618
  params[Param.DataPanelV2Enabled] = dataPanelV2;
594
619
  params[Param.EnableCustomColumnGroups] = enableCustomColumnGroups;
@@ -642,7 +667,12 @@ export class LiveboardEmbed extends V1Embed {
642
667
  const liveboardId = this.viewConfig.liveboardId ?? this.viewConfig.pinboardId;
643
668
 
644
669
  if (!liveboardId) {
645
- this.handleError(ERROR_MESSAGE.LIVEBOARD_VIZ_ID_VALIDATION);
670
+ this.handleError({
671
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
672
+ message: ERROR_MESSAGE.LIVEBOARD_VIZ_ID_VALIDATION,
673
+ code: EmbedErrorCodes.LIVEBOARD_ID_MISSING,
674
+ error: ERROR_MESSAGE.LIVEBOARD_VIZ_ID_VALIDATION,
675
+ });
646
676
  }
647
677
  return `${this.getRootIframeSrc()}${this.getIframeSuffixSrc(
648
678
  liveboardId,
@@ -31,7 +31,7 @@ beforeAll(() => {
31
31
  thoughtSpotHost,
32
32
  authType: AuthType.None,
33
33
  });
34
- jest.spyOn(auth, 'postLoginService').mockReturnValue(true);
34
+ jest.spyOn(auth, 'postLoginService').mockImplementation(() => Promise.resolve(undefined));
35
35
  });
36
36
 
37
37
  describe('Pinboard/viz embed tests', () => {