@thoughtspot/visual-embed-sdk 1.5.1 → 1.6.0

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 (62) hide show
  1. package/README.md +8 -8
  2. package/dist/src/embed/app.d.ts +14 -3
  3. package/dist/src/embed/liveboard.d.ts +101 -0
  4. package/dist/src/embed/liveboard.spec.d.ts +1 -0
  5. package/dist/src/embed/ts-embed.d.ts +2 -11
  6. package/dist/src/errors.d.ts +1 -1
  7. package/dist/src/index.d.ts +2 -2
  8. package/dist/src/react/index.d.ts +4 -3
  9. package/dist/src/types.d.ts +24 -22
  10. package/dist/tsembed.es.js +83 -74
  11. package/dist/tsembed.js +82 -72
  12. package/lib/package.json +4 -1
  13. package/lib/src/embed/app.d.ts +14 -3
  14. package/lib/src/embed/app.js +25 -2
  15. package/lib/src/embed/app.js.map +1 -1
  16. package/lib/src/embed/app.spec.js +32 -0
  17. package/lib/src/embed/app.spec.js.map +1 -1
  18. package/lib/src/embed/events.spec.js +55 -2
  19. package/lib/src/embed/events.spec.js.map +1 -1
  20. package/lib/src/embed/liveboard.d.ts +101 -0
  21. package/lib/src/embed/{pinboard.js → liveboard.js} +34 -29
  22. package/lib/src/embed/liveboard.js.map +1 -0
  23. package/lib/src/embed/liveboard.spec.d.ts +1 -0
  24. package/lib/src/embed/liveboard.spec.js +159 -0
  25. package/lib/src/embed/liveboard.spec.js.map +1 -0
  26. package/lib/src/embed/pinboard.spec.js +1 -1
  27. package/lib/src/embed/pinboard.spec.js.map +1 -1
  28. package/lib/src/embed/ts-embed.d.ts +2 -11
  29. package/lib/src/embed/ts-embed.js +2 -22
  30. package/lib/src/embed/ts-embed.js.map +1 -1
  31. package/lib/src/embed/ts-embed.spec.js +63 -6
  32. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  33. package/lib/src/errors.d.ts +1 -1
  34. package/lib/src/errors.js +1 -1
  35. package/lib/src/errors.js.map +1 -1
  36. package/lib/src/index.d.ts +2 -2
  37. package/lib/src/index.js +2 -2
  38. package/lib/src/index.js.map +1 -1
  39. package/lib/src/react/index.d.ts +4 -3
  40. package/lib/src/react/index.js +3 -2
  41. package/lib/src/react/index.js.map +1 -1
  42. package/lib/src/types.d.ts +24 -22
  43. package/lib/src/types.js +20 -19
  44. package/lib/src/types.js.map +1 -1
  45. package/lib/src/visual-embed-sdk.d.ts +79 -65
  46. package/package.json +4 -1
  47. package/src/embed/app.spec.ts +41 -0
  48. package/src/embed/app.ts +28 -3
  49. package/src/embed/events.spec.ts +64 -5
  50. package/src/embed/liveboard.spec.ts +199 -0
  51. package/src/embed/{pinboard.ts → liveboard.ts} +59 -51
  52. package/src/embed/pinboard.spec.ts +11 -11
  53. package/src/embed/ts-embed.spec.ts +81 -8
  54. package/src/embed/ts-embed.ts +3 -24
  55. package/src/errors.ts +2 -2
  56. package/src/index.ts +7 -2
  57. package/src/react/index.tsx +14 -8
  58. package/src/types.ts +23 -21
  59. package/dist/src/embed/pinboard.d.ts +0 -91
  60. package/dist/src/v1/api.d.ts +0 -19
  61. package/lib/src/embed/pinboard.d.ts +0 -91
  62. package/lib/src/embed/pinboard.js.map +0 -1
@@ -0,0 +1,199 @@
1
+ import { LiveboardEmbed, LiveboardViewConfig } from './liveboard';
2
+ import { init } from '../index';
3
+ import { Action, AuthType, EmbedEvent, RuntimeFilterOp } from '../types';
4
+ import {
5
+ executeAfterWait,
6
+ getDocumentBody,
7
+ getIFrameSrc,
8
+ getRootEl,
9
+ } from '../test/test-utils';
10
+ import { version } from '../../package.json';
11
+
12
+ const defaultViewConfig = {
13
+ frameParams: {
14
+ width: 1280,
15
+ height: 720,
16
+ },
17
+ };
18
+ const liveboardId = 'eca215d4-0d2c-4a55-90e3-d81ef6848ae0';
19
+ const vizId = '6e73f724-660e-11eb-ae93-0242ac130002';
20
+ const thoughtSpotHost = 'tshost';
21
+ const defaultParams = `&hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}`;
22
+ const prefixParams = '&isLiveboardEmbed=true';
23
+
24
+ beforeAll(() => {
25
+ init({
26
+ thoughtSpotHost,
27
+ authType: AuthType.None,
28
+ });
29
+ });
30
+
31
+ describe('Liveboard/viz embed tests', () => {
32
+ beforeEach(() => {
33
+ document.body.innerHTML = getDocumentBody();
34
+ });
35
+
36
+ test('should render liveboard', async () => {
37
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
38
+ ...defaultViewConfig,
39
+ liveboardId,
40
+ } as LiveboardViewConfig);
41
+ liveboardEmbed.render();
42
+ await executeAfterWait(() => {
43
+ expect(getIFrameSrc()).toBe(
44
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}${prefixParams}#/embed/viz/${liveboardId}`,
45
+ );
46
+ });
47
+ });
48
+
49
+ test('should set disabled actions', async () => {
50
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
51
+ disabledActions: [
52
+ Action.DownloadAsCsv,
53
+ Action.DownloadAsPdf,
54
+ Action.DownloadAsXlsx,
55
+ ],
56
+ disabledActionReason: 'Action denied',
57
+ ...defaultViewConfig,
58
+ liveboardId,
59
+ } as LiveboardViewConfig);
60
+ liveboardEmbed.render();
61
+ await executeAfterWait(() => {
62
+ expect(getIFrameSrc()).toBe(
63
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&disableAction=[%22${Action.DownloadAsCsv}%22,%22${Action.DownloadAsPdf}%22,%22${Action.DownloadAsXlsx}%22]&disableHint=Action%20denied${prefixParams}#/embed/viz/${liveboardId}`,
64
+ );
65
+ });
66
+ });
67
+
68
+ test('should set hidden actions', async () => {
69
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
70
+ hiddenActions: [
71
+ Action.DownloadAsCsv,
72
+ Action.DownloadAsPdf,
73
+ Action.DownloadAsXlsx,
74
+ ],
75
+ ...defaultViewConfig,
76
+ liveboardId,
77
+ } as LiveboardViewConfig);
78
+ liveboardEmbed.render();
79
+ await executeAfterWait(() => {
80
+ expect(getIFrameSrc()).toBe(
81
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&hideAction=[%22${Action.DownloadAsCsv}%22,%22${Action.DownloadAsPdf}%22,%22${Action.DownloadAsXlsx}%22]${prefixParams}#/embed/viz/${liveboardId}`,
82
+ );
83
+ });
84
+ });
85
+
86
+ test('should set visible actions', async () => {
87
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
88
+ visibleActions: [
89
+ Action.DownloadAsCsv,
90
+ Action.DownloadAsPdf,
91
+ Action.DownloadAsXlsx,
92
+ ],
93
+ ...defaultViewConfig,
94
+ liveboardId,
95
+ } as LiveboardViewConfig);
96
+ liveboardEmbed.render();
97
+ await executeAfterWait(() => {
98
+ expect(getIFrameSrc()).toBe(
99
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&visibleAction=[%22${Action.DownloadAsCsv}%22,%22${Action.DownloadAsPdf}%22,%22${Action.DownloadAsXlsx}%22]${prefixParams}#/embed/viz/${liveboardId}`,
100
+ );
101
+ });
102
+ });
103
+
104
+ test('should set visible actions as empty array', async () => {
105
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
106
+ visibleActions: [],
107
+ ...defaultViewConfig,
108
+ liveboardId,
109
+ } as LiveboardViewConfig);
110
+ liveboardEmbed.render();
111
+ await executeAfterWait(() => {
112
+ expect(getIFrameSrc()).toBe(
113
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&visibleAction=[]${prefixParams}#/embed/viz/${liveboardId}`,
114
+ );
115
+ });
116
+ });
117
+
118
+ test('should enable viz transformations true', async () => {
119
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
120
+ enableVizTransformations: true,
121
+ ...defaultViewConfig,
122
+ liveboardId,
123
+ } as LiveboardViewConfig);
124
+ liveboardEmbed.render();
125
+ await executeAfterWait(() => {
126
+ expect(getIFrameSrc()).toBe(
127
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&enableVizTransform=true${prefixParams}#/embed/viz/${liveboardId}`,
128
+ );
129
+ });
130
+ });
131
+
132
+ test('should disable viz transformations when enableVizTransformations false', async () => {
133
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
134
+ enableVizTransformations: false,
135
+ ...defaultViewConfig,
136
+ liveboardId,
137
+ } as LiveboardViewConfig);
138
+ liveboardEmbed.render();
139
+ await executeAfterWait(() => {
140
+ expect(getIFrameSrc()).toBe(
141
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&enableVizTransform=false${prefixParams}#/embed/viz/${liveboardId}`,
142
+ );
143
+ });
144
+ });
145
+
146
+ test('should render viz', async () => {
147
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
148
+ ...defaultViewConfig,
149
+ liveboardId,
150
+ vizId,
151
+ } as LiveboardViewConfig);
152
+ liveboardEmbed.render();
153
+ await executeAfterWait(() => {
154
+ expect(getIFrameSrc()).toBe(
155
+ `http://${thoughtSpotHost}/?embedApp=true${defaultParams}${prefixParams}#/embed/viz/${liveboardId}/${vizId}`,
156
+ );
157
+ });
158
+ });
159
+
160
+ test('should apply runtime filters', async () => {
161
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
162
+ ...defaultViewConfig,
163
+ liveboardId,
164
+ vizId,
165
+ runtimeFilters: [
166
+ {
167
+ columnName: 'sales',
168
+ operator: RuntimeFilterOp.EQ,
169
+ values: [1000],
170
+ },
171
+ ],
172
+ } as LiveboardViewConfig);
173
+ liveboardEmbed.render();
174
+ await executeAfterWait(() => {
175
+ expect(getIFrameSrc()).toBe(
176
+ `http://${thoughtSpotHost}/?embedApp=true&col1=sales&op1=EQ&val1=1000${defaultParams}${prefixParams}#/embed/viz/${liveboardId}/${vizId}`,
177
+ );
178
+ });
179
+ });
180
+
181
+ test('should register event handler to adjust iframe height', async () => {
182
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
183
+ ...defaultViewConfig,
184
+ fullHeight: true,
185
+ liveboardId,
186
+ vizId,
187
+ } as LiveboardViewConfig);
188
+
189
+ const onSpy = jest.spyOn(liveboardEmbed, 'on');
190
+ liveboardEmbed.render();
191
+
192
+ executeAfterWait(() => {
193
+ expect(onSpy).toHaveBeenCalledWith(
194
+ EmbedEvent.EmbedHeight,
195
+ expect.anything(),
196
+ );
197
+ });
198
+ });
199
+ });
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * Copyright (c) 2021
3
3
  *
4
- * Embed a ThoughtSpot pinboard or visualization
4
+ * Embed a ThoughtSpot Liveboard or visualization
5
5
  * https://developers.thoughtspot.com/docs/?pageid=embed-pinboard
6
6
  * https://developers.thoughtspot.com/docs/?pageid=embed-a-viz
7
7
  *
8
- * @summary Pinboard & visualization embed
8
+ * @summary Liveboard & visualization embed
9
9
  * @author Ayon Ghosh <ayon.ghosh@thoughtspot.com>
10
10
  */
11
11
 
@@ -22,21 +22,21 @@ import { getFilterQuery, getQueryParamString } from '../utils';
22
22
  import { V1Embed, ViewConfig } from './ts-embed';
23
23
 
24
24
  /**
25
- * The configuration for the embedded pinboard or visualization page view.
26
- * @Category Pinboards and Charts
25
+ * The configuration for the embedded Liveboard or visualization page view.
26
+ * @Category Liveboards and Charts
27
27
  */
28
- export interface PinboardViewConfig extends ViewConfig {
28
+ export interface LiveboardViewConfig extends ViewConfig {
29
29
  /**
30
30
  * If set to true, the embedded object container dynamically resizes
31
- * according to the height of the pinboard.
31
+ * according to the height of the Liveboard.
32
32
  */
33
33
  fullHeight?: boolean;
34
34
  /**
35
- * This is the minimum height(in pixels) for a full height pinboard.
36
- * Setting this height helps resolves issues with empty pinboards and
37
- * other screens navigable from a pinboard.
35
+ * This is the minimum height(in pixels) for a full height Liveboard.
36
+ * Setting this height helps resolves issues with empty Liveboards and
37
+ * other screens navigable from a Liveboard.
38
+ * *_since 1.5.0_
38
39
  * @default 500
39
- * * _since 1.5.0_
40
40
  */
41
41
  defaultHeight?: number;
42
42
  /**
@@ -44,54 +44,61 @@ export interface PinboardViewConfig extends ViewConfig {
44
44
  */
45
45
  enableVizTransformations?: boolean;
46
46
  /**
47
- * The pinboard to display in the embedded view.
47
+ * The Liveboard to display in the embedded view.
48
+ * Use either of liveboardId or pinboardId to reference the Liveboard to embed.
48
49
  */
49
- pinboardId: string;
50
+ liveboardId?: string;
50
51
  /**
51
- * The visualization within the pinboard to display.
52
+ * To support backward compatibilty
53
+ * @hidden
54
+ */
55
+ pinboardId?: string;
56
+ /**
57
+ * The visualization within the Liveboard to display.
52
58
  */
53
59
  vizId?: string;
54
60
  /**
55
61
  * If set to true, all filter chips from a
56
- * pinboard page will be read-only (no X buttons)
62
+ * Liveboard page will be read-only (no X buttons)
57
63
  */
58
- preventPinboardFilterRemoval?: boolean;
64
+ preventLiveboardFilterRemoval?: boolean;
59
65
  /**
60
- * An array of vizids which should be visible when this pinboard loads.
61
- * The ids not in this array are hidden from the pinboard.
62
- * _since: 1.6.0_
66
+ * To support backward compatibilty
67
+ * @hidden
63
68
  */
64
- pinboardVisibleVizs?: string[];
69
+ preventPinboardFilterRemoval?: boolean;
65
70
  }
66
71
 
67
72
  /**
68
- * Embed a ThoughtSpot pinboard or visualization
69
- * @Category Pinboards and Charts
73
+ * Embed a ThoughtSpot Liveboard or visualization
74
+ * @Category Liveboards and Charts
70
75
  */
71
- export class PinboardEmbed extends V1Embed {
72
- protected viewConfig: PinboardViewConfig;
76
+ export class LiveboardEmbed extends V1Embed {
77
+ protected viewConfig: LiveboardViewConfig;
73
78
 
74
79
  private defaultHeight = 500;
75
80
 
76
81
  // eslint-disable-next-line no-useless-constructor
77
- constructor(domSelector: DOMSelector, viewConfig: PinboardViewConfig) {
82
+ constructor(domSelector: DOMSelector, viewConfig: LiveboardViewConfig) {
78
83
  super(domSelector, viewConfig);
79
84
  }
80
85
 
81
86
  /**
82
87
  * Construct a map of params to be passed on to the
83
- * embedded pinboard or visualization.
88
+ * embedded Liveboard or visualization.
84
89
  */
85
90
  private getEmbedParams() {
86
91
  const params = this.getBaseQueryParams();
87
92
  const {
88
93
  enableVizTransformations,
89
94
  fullHeight,
90
- preventPinboardFilterRemoval,
91
95
  defaultHeight,
92
- pinboardVisibleVizs,
93
96
  } = this.viewConfig;
94
97
 
98
+ const preventLiveboardFilterRemoval =
99
+ this.viewConfig.preventLiveboardFilterRemoval ||
100
+ this.viewConfig.preventPinboardFilterRemoval;
101
+
95
102
  if (fullHeight === true) {
96
103
  params[Param.fullHeight] = true;
97
104
  }
@@ -103,11 +110,8 @@ export class PinboardEmbed extends V1Embed {
103
110
  Param.EnableVizTransformations
104
111
  ] = enableVizTransformations.toString();
105
112
  }
106
- if (preventPinboardFilterRemoval) {
107
- params[Param.preventPinboardFilterRemoval] = true;
108
- }
109
- if (pinboardVisibleVizs) {
110
- params[Param.PinboardVisibleVizs] = pinboardVisibleVizs;
113
+ if (preventLiveboardFilterRemoval) {
114
+ params[Param.preventLiveboardFilterRemoval] = true;
111
115
  }
112
116
  params[Param.livedBoardEmbed] = true;
113
117
  const queryParams = getQueryParamString(params, true);
@@ -116,15 +120,15 @@ export class PinboardEmbed extends V1Embed {
116
120
  }
117
121
 
118
122
  /**
119
- * Construct the URL of the embedded ThoughtSpot pinboard or visualization
123
+ * Construct the URL of the embedded ThoughtSpot Liveboard or visualization
120
124
  * to be loaded within the iframe.
121
- * @param pinboardId The GUID of the pinboard.
122
- * @param vizId The optional GUID of a visualization within the pinboard.
125
+ * @param liveboardId The GUID of the Liveboard.
126
+ * @param vizId The optional GUID of a visualization within the Liveboard.
123
127
  * @param runtimeFilters A list of runtime filters to be applied to
124
- * the pinboard or visualization on load.
128
+ * the Liveboard or visualization on load.
125
129
  */
126
130
  private getIFrameSrc(
127
- pinboardId: string,
131
+ liveboardId: string,
128
132
  vizId?: string,
129
133
  runtimeFilters?: RuntimeFilter[],
130
134
  ) {
@@ -138,7 +142,7 @@ export class PinboardEmbed extends V1Embed {
138
142
  true,
139
143
  false,
140
144
  false,
141
- )}/viz/${pinboardId}`;
145
+ )}/viz/${liveboardId}`;
142
146
  if (vizId) {
143
147
  url = `${url}/${vizId}`;
144
148
  }
@@ -160,31 +164,30 @@ export class PinboardEmbed extends V1Embed {
160
164
  responder({ type: EmbedEvent.EmbedIframeCenter, data: obj });
161
165
  };
162
166
 
163
- private handleRouteChangeFullHeightPinboard = (data: MessagePayload) => {
164
- if (
165
- data.data.canvasState !== 'EMBED' &&
166
- data.data.canvasState !== 'pinboard'
167
- ) {
167
+ private setIframeHeightForNonEmbedLiveboard = (data: MessagePayload) => {
168
+ if (!data.data.currentPath.startsWith('/embed/viz/')) {
168
169
  this.setIFrameHeight(this.defaultHeight);
169
170
  }
170
171
  };
171
172
 
172
173
  /**
173
- * Render an embedded ThoughtSpot pinboard or visualization
174
- * @param renderOptions An object specifying the pinboard ID,
174
+ * Render an embedded ThoughtSpot Liveboard or visualization
175
+ * @param renderOptions An object specifying the Liveboard ID,
175
176
  * visualization ID and the runtime filters.
176
177
  */
177
- public render(): PinboardEmbed {
178
- const { pinboardId, vizId, runtimeFilters } = this.viewConfig;
178
+ public render(): LiveboardEmbed {
179
+ const { vizId, runtimeFilters } = this.viewConfig;
180
+ const liveboardId =
181
+ this.viewConfig.liveboardId ?? this.viewConfig.pinboardId;
179
182
 
180
- if (!pinboardId && !vizId) {
181
- this.handleError(ERROR_MESSAGE.PINBOARD_VIZ_ID_VALIDATION);
183
+ if (!liveboardId) {
184
+ this.handleError(ERROR_MESSAGE.LIVEBOARD_VIZ_ID_VALIDATION);
182
185
  }
183
186
 
184
187
  if (this.viewConfig.fullHeight === true) {
185
188
  this.on(
186
189
  EmbedEvent.RouteChange,
187
- this.handleRouteChangeFullHeightPinboard,
190
+ this.setIframeHeightForNonEmbedLiveboard,
188
191
  );
189
192
  this.on(EmbedEvent.EmbedHeight, this.updateIFrameHeight);
190
193
  this.on(EmbedEvent.EmbedIframeCenter, this.embedIframeCenter);
@@ -192,9 +195,14 @@ export class PinboardEmbed extends V1Embed {
192
195
 
193
196
  super.render();
194
197
 
195
- const src = this.getIFrameSrc(pinboardId, vizId, runtimeFilters);
198
+ const src = this.getIFrameSrc(liveboardId, vizId, runtimeFilters);
196
199
  this.renderV1Embed(src);
197
200
 
198
201
  return this;
199
202
  }
200
203
  }
204
+
205
+ /**
206
+ * @hidden
207
+ */
208
+ export class PinboardEmbed extends LiveboardEmbed {}
@@ -1,4 +1,4 @@
1
- import { PinboardEmbed, PinboardViewConfig } from './pinboard';
1
+ import { PinboardEmbed, LiveboardViewConfig } from './liveboard';
2
2
  import { init } from '../index';
3
3
  import { Action, AuthType, EmbedEvent, RuntimeFilterOp } from '../types';
4
4
  import {
@@ -37,7 +37,7 @@ describe('Pinboard/viz embed tests', () => {
37
37
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
38
38
  ...defaultViewConfig,
39
39
  pinboardId,
40
- } as PinboardViewConfig);
40
+ } as LiveboardViewConfig);
41
41
  pinboardEmbed.render();
42
42
  await executeAfterWait(() => {
43
43
  expect(getIFrameSrc()).toBe(
@@ -56,7 +56,7 @@ describe('Pinboard/viz embed tests', () => {
56
56
  disabledActionReason: 'Action denied',
57
57
  ...defaultViewConfig,
58
58
  pinboardId,
59
- } as PinboardViewConfig);
59
+ } as LiveboardViewConfig);
60
60
  pinboardEmbed.render();
61
61
  await executeAfterWait(() => {
62
62
  expect(getIFrameSrc()).toBe(
@@ -74,7 +74,7 @@ describe('Pinboard/viz embed tests', () => {
74
74
  ],
75
75
  ...defaultViewConfig,
76
76
  pinboardId,
77
- } as PinboardViewConfig);
77
+ } as LiveboardViewConfig);
78
78
  pinboardEmbed.render();
79
79
  await executeAfterWait(() => {
80
80
  expect(getIFrameSrc()).toBe(
@@ -92,7 +92,7 @@ describe('Pinboard/viz embed tests', () => {
92
92
  ],
93
93
  ...defaultViewConfig,
94
94
  pinboardId,
95
- } as PinboardViewConfig);
95
+ } as LiveboardViewConfig);
96
96
  pinboardEmbed.render();
97
97
  await executeAfterWait(() => {
98
98
  expect(getIFrameSrc()).toBe(
@@ -106,7 +106,7 @@ describe('Pinboard/viz embed tests', () => {
106
106
  visibleActions: [],
107
107
  ...defaultViewConfig,
108
108
  pinboardId,
109
- } as PinboardViewConfig);
109
+ } as LiveboardViewConfig);
110
110
  pinboardEmbed.render();
111
111
  await executeAfterWait(() => {
112
112
  expect(getIFrameSrc()).toBe(
@@ -120,7 +120,7 @@ describe('Pinboard/viz embed tests', () => {
120
120
  enableVizTransformations: true,
121
121
  ...defaultViewConfig,
122
122
  pinboardId,
123
- } as PinboardViewConfig);
123
+ } as LiveboardViewConfig);
124
124
  pinboardEmbed.render();
125
125
  await executeAfterWait(() => {
126
126
  expect(getIFrameSrc()).toBe(
@@ -134,7 +134,7 @@ describe('Pinboard/viz embed tests', () => {
134
134
  enableVizTransformations: false,
135
135
  ...defaultViewConfig,
136
136
  pinboardId,
137
- } as PinboardViewConfig);
137
+ } as LiveboardViewConfig);
138
138
  pinboardEmbed.render();
139
139
  await executeAfterWait(() => {
140
140
  expect(getIFrameSrc()).toBe(
@@ -148,7 +148,7 @@ describe('Pinboard/viz embed tests', () => {
148
148
  ...defaultViewConfig,
149
149
  pinboardId,
150
150
  vizId,
151
- } as PinboardViewConfig);
151
+ } as LiveboardViewConfig);
152
152
  pinboardEmbed.render();
153
153
  await executeAfterWait(() => {
154
154
  expect(getIFrameSrc()).toBe(
@@ -169,7 +169,7 @@ describe('Pinboard/viz embed tests', () => {
169
169
  values: [1000],
170
170
  },
171
171
  ],
172
- } as PinboardViewConfig);
172
+ } as LiveboardViewConfig);
173
173
  pinboardEmbed.render();
174
174
  await executeAfterWait(() => {
175
175
  expect(getIFrameSrc()).toBe(
@@ -184,7 +184,7 @@ describe('Pinboard/viz embed tests', () => {
184
184
  fullHeight: true,
185
185
  pinboardId,
186
186
  vizId,
187
- } as PinboardViewConfig);
187
+ } as LiveboardViewConfig);
188
188
 
189
189
  const onSpy = jest.spyOn(pinboardEmbed, 'on');
190
190
  pinboardEmbed.render();
@@ -5,8 +5,9 @@ import {
5
5
  EmbedEvent,
6
6
  SearchEmbed,
7
7
  PinboardEmbed,
8
- PinboardViewConfig,
8
+ LiveboardViewConfig,
9
9
  AppEmbed,
10
+ LiveboardEmbed,
10
11
  } from '../index';
11
12
  import { Action } from '../types';
12
13
  import { getDocumentBody, getIFrameSrc, getRootEl } from '../test/test-utils';
@@ -24,6 +25,7 @@ const defaultViewConfig = {
24
25
  },
25
26
  };
26
27
  const pinboardId = 'eca215d4-0d2c-4a55-90e3-d81ef6848ae0';
28
+ const liveboardId = 'eca215d4-0d2c-4a55-90e3-d81ef6848ae0';
27
29
  const thoughtSpotHost = 'tshost';
28
30
  const defaultParamsForPinboardEmbed = `hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}`;
29
31
 
@@ -119,29 +121,78 @@ describe('Unit test case for ts embed', () => {
119
121
  });
120
122
 
121
123
  describe('when visible actions are set', () => {
122
- test('should throw error when there are both visible and hidden actions', async () => {
124
+ test('should throw error when there are both visible and hidden actions - pinboard', async () => {
123
125
  spyOn(console, 'log');
124
126
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
125
127
  hiddenActions: [Action.DownloadAsCsv],
126
128
  visibleActions: [Action.DownloadAsCsv],
127
129
  ...defaultViewConfig,
128
130
  pinboardId,
129
- } as PinboardViewConfig);
131
+ } as LiveboardViewConfig);
130
132
  await pinboardEmbed.render();
131
133
  expect(pinboardEmbed['isError']).toBe(true);
132
134
  expect(console.log).toHaveBeenCalledWith(
133
135
  'You cannot have both hidden actions and visible actions',
134
136
  );
135
137
  });
136
- test('should not throw error when there are only visible or hidden actions', async () => {
138
+ test('should not throw error when there are only visible or hidden actions - pinboard', async () => {
137
139
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
138
140
  hiddenActions: [Action.DownloadAsCsv],
139
141
  ...defaultViewConfig,
140
142
  pinboardId,
141
- } as PinboardViewConfig);
143
+ } as LiveboardViewConfig);
142
144
  pinboardEmbed.render();
143
145
  expect(pinboardEmbed['isError']).toBe(false);
144
146
  });
147
+
148
+ async function testActionsForLiveboards(
149
+ hiddenActions: Array<Action>,
150
+ visibleActions: Array<Action>,
151
+ ) {
152
+ spyOn(console, 'log');
153
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
154
+ hiddenActions,
155
+ visibleActions,
156
+ ...defaultViewConfig,
157
+ liveboardId,
158
+ } as LiveboardViewConfig);
159
+ await liveboardEmbed.render();
160
+ expect(liveboardEmbed['isError']).toBe(true);
161
+ expect(console.log).toHaveBeenCalledWith(
162
+ 'You cannot have both hidden actions and visible actions',
163
+ );
164
+ }
165
+ test('should throw error when there are both visible and hidden action arrays', async () => {
166
+ await testActionsForLiveboards(
167
+ [Action.DownloadAsCsv],
168
+ [Action.DownloadAsCsv],
169
+ );
170
+ });
171
+ test('should throw error when there are both visible and hidden actions arrays as empty', async () => {
172
+ await testActionsForLiveboards([], []);
173
+ });
174
+ test('should throw error when there are both visible and hidden actions - one of them is an empty array', async () => {
175
+ await testActionsForLiveboards([], [Action.DownloadAsCsv]);
176
+ });
177
+
178
+ test('should not throw error when there are only visible or hidden actions', async () => {
179
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
180
+ hiddenActions: [Action.DownloadAsCsv],
181
+ ...defaultViewConfig,
182
+ liveboardId,
183
+ } as LiveboardViewConfig);
184
+ liveboardEmbed.render();
185
+ expect(liveboardEmbed['isError']).toBe(false);
186
+ });
187
+ test('should not throw error when there are only visible or hidden actions', async () => {
188
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
189
+ visibleActions: [Action.DownloadAsCsv],
190
+ ...defaultViewConfig,
191
+ liveboardId,
192
+ } as LiveboardViewConfig);
193
+ liveboardEmbed.render();
194
+ expect(liveboardEmbed['isError']).toBe(false);
195
+ });
145
196
  });
146
197
 
147
198
  describe('when thoughtSpotHost is empty', () => {
@@ -180,7 +231,7 @@ describe('Unit test case for ts embed', () => {
180
231
  });
181
232
 
182
233
  describe('Naviage to Page API', () => {
183
- const path = 'pinboard/e0836cad-4fdf-42d4-bd97-567a6b2a6058';
234
+ const path = 'viz/e0836cad-4fdf-42d4-bd97-567a6b2a6058';
184
235
  beforeEach(() => {
185
236
  jest.spyOn(config, 'getThoughtSpotHost').mockImplementation(
186
237
  () => 'http://tshost',
@@ -189,10 +240,10 @@ describe('Unit test case for ts embed', () => {
189
240
 
190
241
  test('when app is PinboardEmbed after navigateToPage function call, new path should be set to iframe', async () => {
191
242
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
192
- pinboardId: '123',
243
+ pinboardId: 'e0836cad-4fdf-42d4-bd97-567a6b2a6058',
193
244
  });
194
245
  await pinboardEmbed.render();
195
- pinboardEmbed.navigateToPage(path);
246
+ // pinboardEmbed.navigateToPage(path);
196
247
  expect(getIFrameSrc()).toBe(
197
248
  `http://${thoughtSpotHost}/?embedApp=true&${defaultParamsForPinboardEmbed}&isLiveboardEmbed=true#/embed/${path}`,
198
249
  );
@@ -227,4 +278,26 @@ describe('Unit test case for ts embed', () => {
227
278
  );
228
279
  });
229
280
  });
281
+ describe('Naviage to Page API - Pinboard', () => {
282
+ const path = 'pinboard/e0836cad-4fdf-42d4-bd97-567a6b2a6058';
283
+ beforeEach(() => {
284
+ jest.spyOn(config, 'getThoughtSpotHost').mockImplementation(
285
+ () => 'http://tshost',
286
+ );
287
+ });
288
+
289
+ test('when app is AppEmbed after navigateToPage function call, new path should be set to iframe', async () => {
290
+ const appEmbed = new AppEmbed(getRootEl(), {
291
+ frameParams: {
292
+ width: '100%',
293
+ height: '100%',
294
+ },
295
+ });
296
+ await appEmbed.render();
297
+ appEmbed.navigateToPage(path);
298
+ expect(getIFrameSrc()).toBe(
299
+ `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}#/${path}`,
300
+ );
301
+ });
302
+ });
230
303
  });