Skip to content

Commit b26d159

Browse files
authored
[SCAL-246794] Rename Spotter Embed types to improve clarity (#193)
1 parent d93285b commit b26d159

File tree

9 files changed

+13644
-8813
lines changed

9 files changed

+13644
-8813
lines changed

src/embed/bodyless-conversation.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'jest-fetch-mock';
2-
import { BodylessConversation, BodylessConversationViewConfig } from './bodyless-conversation';
2+
import { SpotterAgentEmbed, SpotterAgentEmbedViewConfig } from './bodyless-conversation';
33
import * as authInstance from '../auth';
44
import { init } from '../index';
55
import { Action, AuthType, RuntimeFilterOp } from '../types';
@@ -14,7 +14,7 @@ import {
1414
expectUrlToHaveParamsWithValues,
1515
} from '../test/test-utils';
1616

17-
describe('BodylessConversation', () => {
17+
describe('SpotterAgentEmbed', () => {
1818
const thoughtSpotHost = 'tshost';
1919

2020
beforeAll(() => {
@@ -117,12 +117,12 @@ describe('BodylessConversation', () => {
117117
},
118118
}),
119119
);
120-
const viewConfig: BodylessConversationViewConfig = {
120+
const viewConfig: SpotterAgentEmbedViewConfig = {
121121
worksheetId: 'worksheetId',
122122
};
123123

124-
const conversationEmbed = new BodylessConversation(viewConfig);
125-
const result = await conversationEmbed.sendMessage('userMessage');
124+
const spotterEmbed = new SpotterAgentEmbed(viewConfig);
125+
const result = await spotterEmbed.sendMessage('userMessage');
126126
const iframeSrc = getIFrameSrc(result.container);
127127
expectUrlToHaveParamsWithValues(iframeSrc, {
128128
sessionId: 'sessionId',
@@ -134,7 +134,7 @@ describe('BodylessConversation', () => {
134134
fetchMock.mockRejectOnce(
135135
new Error('error'),
136136
);
137-
const errorResult = await conversationEmbed.sendMessage('userMessage');
137+
const errorResult = await spotterEmbed.sendMessage('userMessage');
138138
expect(errorResult.error instanceof Error).toBeTruthy();
139139
});
140140
});

src/embed/bodyless-conversation.ts

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,31 @@ import { getQueryParamString } from '../utils';
88
* Configuration for bodyless conversation options.
99
* @group Embed components
1010
*/
11-
export interface BodylessConversationViewConfig extends ViewConfig {
11+
export interface SpotterAgentEmbedViewConfig extends ViewConfig {
1212
/**
1313
* The ID of the worksheet to use for the conversation.
1414
*/
1515
worksheetId: string;
1616
}
1717

18-
interface ConversationMessageViewConfig extends BodylessConversationViewConfig {
18+
/**
19+
* Configuration for conversation options.
20+
* @deprecated from SDK: 1.38.0 | ThoughtSpot: 10.10.0.cl
21+
* Use {@link SpotterAgentEmbedViewConfig} instead
22+
* @group Embed components
23+
*/
24+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
25+
export interface BodylessConversationViewConfig extends SpotterAgentEmbedViewConfig {}
26+
27+
interface SpotterAgentMessageViewConfig extends SpotterAgentEmbedViewConfig {
1928
sessionId: string;
2029
genNo: number;
2130
acSessionId: string;
2231
acGenNo: number;
2332
}
2433

2534
class ConversationMessage extends TsEmbed {
26-
constructor(container: HTMLElement, protected viewConfig: ConversationMessageViewConfig) {
35+
constructor(container: HTMLElement, protected viewConfig: SpotterAgentMessageViewConfig) {
2736
viewConfig.embedComponentType = 'bodyless-conversation';
2837
super(container, viewConfig);
2938
}
@@ -69,9 +78,9 @@ class ConversationMessage extends TsEmbed {
6978
* chatbots or other conversational interfaces.
7079
* @example
7180
* ```js
72-
* import { BodylessConversation } from '@thoughtspot/visual-embed-sdk';
81+
* import { SpotterAgentEmbed } from '@thoughtspot/visual-embed-sdk';
7382
*
74-
* const conversation = new BodylessConversation({
83+
* const conversation = new SpotterAgentEmbed({
7584
* worksheetId: 'worksheetId',
7685
* });
7786
*
@@ -81,12 +90,12 @@ class ConversationMessage extends TsEmbed {
8190
* document.body.appendChild(container); // or to any other element
8291
* ```
8392
* @group Embed components
84-
* @version SDK: 1.33.1 | ThoughtSpot: 10.5.0.cl
93+
* @version SDK: 1.37.0 | ThoughtSpot: 10.9.0.cl
8594
*/
86-
export class BodylessConversation {
95+
export class SpotterAgentEmbed {
8796
private conversationService: ConversationService;
8897

89-
constructor(private viewConfig: BodylessConversationViewConfig) {
98+
constructor(private viewConfig: SpotterAgentEmbedViewConfig) {
9099
const embedConfig = getEmbedConfig();
91100

92101
this.conversationService = new ConversationService(
@@ -113,3 +122,29 @@ export class BodylessConversation {
113122
return { container, viz: embed };
114123
}
115124
}
125+
126+
/**
127+
* Create a conversation embed, which can be integrated inside
128+
* chatbots or other conversational interfaces.
129+
* @deprecated from SDK: 1.38.0 | ThoughtSpot: 10.10.0.cl
130+
* Use {@link SpotterAgentEmbed} instead
131+
* @example
132+
* ```js
133+
* import { SpotterAgentEmbed } from '@thoughtspot/visual-embed-sdk';
134+
*
135+
* const conversation = new SpotterAgentEmbed({
136+
* worksheetId: 'worksheetId',
137+
* });
138+
*
139+
* const { container, error } = await conversation.sendMessage('show me sales by region');
140+
*
141+
* // append the container to the DOM
142+
* document.body.appendChild(container); // or to any other element
143+
* ```
144+
* @group Embed components
145+
*/
146+
export class BodylessConversation extends SpotterAgentEmbed {
147+
constructor(viewConfig: BodylessConversationViewConfig) {
148+
super(viewConfig);
149+
}
150+
}

src/embed/conversation.spec.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {
2-
ConversationEmbed,
3-
ConversationViewConfig,
2+
SpotterEmbed,
3+
SpotterEmbedViewConfig,
44
} from './conversation';
55
import * as authInstance from '../auth';
66
import { init } from '../index';
@@ -28,14 +28,14 @@ beforeAll(() => {
2828

2929
describe('ConversationEmbed', () => {
3030
it('should render the conversation embed', async () => {
31-
const viewConfig: ConversationViewConfig = {
31+
const viewConfig: SpotterEmbedViewConfig = {
3232
worksheetId: 'worksheetId',
3333
searchOptions: {
3434
searchQuery: 'searchQuery',
3535
},
3636
};
3737

38-
const conversationEmbed = new ConversationEmbed(getRootEl(), viewConfig);
38+
const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
3939
await conversationEmbed.render();
4040
expectUrlMatchesWithParams(
4141
getIFrameSrc(),
@@ -44,15 +44,15 @@ describe('ConversationEmbed', () => {
4444
});
4545

4646
it('should render the conversation embed with worksheets disabled', async () => {
47-
const viewConfig: ConversationViewConfig = {
47+
const viewConfig: SpotterEmbedViewConfig = {
4848
worksheetId: 'worksheetId',
4949
searchOptions: {
5050
searchQuery: 'searchQuery',
5151
},
5252
disableSourceSelection: true,
5353
};
5454

55-
const conversationEmbed = new ConversationEmbed(getRootEl(), viewConfig);
55+
const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
5656
await conversationEmbed.render();
5757
expectUrlMatchesWithParams(
5858
getIFrameSrc(),
@@ -61,15 +61,15 @@ describe('ConversationEmbed', () => {
6161
});
6262

6363
it('should render the conversation embed with spotter limitations text if flag is set', async () => {
64-
const viewConfig: ConversationViewConfig = {
64+
const viewConfig: SpotterEmbedViewConfig = {
6565
worksheetId: 'worksheetId',
6666
searchOptions: {
6767
searchQuery: 'searchQuery',
6868
},
6969
showSpotterLimitations: true,
7070
};
7171

72-
const conversationEmbed = new ConversationEmbed(getRootEl(), viewConfig);
72+
const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
7373
await conversationEmbed.render();
7474
expectUrlMatchesWithParams(
7575
getIFrameSrc(),
@@ -78,15 +78,15 @@ describe('ConversationEmbed', () => {
7878
});
7979

8080
it('should render the conversation embed with sample questions hidden', async () => {
81-
const viewConfig: ConversationViewConfig = {
81+
const viewConfig: SpotterEmbedViewConfig = {
8282
worksheetId: 'worksheetId',
8383
searchOptions: {
8484
searchQuery: 'searchQuery',
8585
},
8686
hideSampleQuestions: true,
8787
};
8888

89-
const conversationEmbed = new ConversationEmbed(getRootEl(), viewConfig);
89+
const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
9090
await conversationEmbed.render();
9191
expectUrlMatchesWithParams(
9292
getIFrameSrc(),
@@ -95,15 +95,15 @@ describe('ConversationEmbed', () => {
9595
});
9696

9797
it('should render the conversation embed with worksheets hidden', async () => {
98-
const viewConfig: ConversationViewConfig = {
98+
const viewConfig: SpotterEmbedViewConfig = {
9999
worksheetId: 'worksheetId',
100100
searchOptions: {
101101
searchQuery: 'searchQuery',
102102
},
103103
hideSourceSelection: true,
104104
};
105105

106-
const conversationEmbed = new ConversationEmbed(getRootEl(), viewConfig);
106+
const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
107107
await conversationEmbed.render();
108108
expectUrlMatchesWithParams(
109109
getIFrameSrc(),
@@ -112,13 +112,13 @@ describe('ConversationEmbed', () => {
112112
});
113113

114114
it('should handle error when worksheetId is not provided', async () => {
115-
const viewConfig: ConversationViewConfig = {
115+
const viewConfig: SpotterEmbedViewConfig = {
116116
worksheetId: '',
117117
searchOptions: {
118118
searchQuery: 'searchQuery',
119119
},
120120
};
121-
const conversationEmbed = new ConversationEmbed(getRootEl(), viewConfig);
121+
const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
122122
(conversationEmbed as any).handleError = jest.fn();
123123
await conversationEmbed.render();
124124
expect((conversationEmbed as any).handleError).toHaveBeenCalledWith(
@@ -127,15 +127,15 @@ describe('ConversationEmbed', () => {
127127
});
128128

129129
it('should render the conversation embed if data panel v2 flag is true', async () => {
130-
const viewConfig: ConversationViewConfig = {
130+
const viewConfig: SpotterEmbedViewConfig = {
131131
worksheetId: 'worksheetId',
132132
searchOptions: {
133133
searchQuery: 'searchQuery',
134134
},
135135
dataPanelV2: true,
136136
};
137137

138-
const conversationEmbed = new ConversationEmbed(getRootEl(), viewConfig);
138+
const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
139139
await conversationEmbed.render();
140140
expectUrlMatchesWithParams(
141141
getIFrameSrc(),

src/embed/conversation.ts

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ export interface SearchOptions {
1515
}
1616

1717
/**
18-
* The configuration for the embedded conversationEmbed options.
18+
* The configuration for the embedded spotterEmbed options.
1919
* @group Embed components
2020
*/
21-
export interface ConversationViewConfig extends ViewConfig {
21+
export interface SpotterEmbedViewConfig extends ViewConfig {
2222
/**
2323
* The ID of the worksheet to use for the conversation.
2424
*/
@@ -32,7 +32,7 @@ export interface ConversationViewConfig extends ViewConfig {
3232
* but still display the selected data source.
3333
* @example
3434
* ```js
35-
* const embed = new ConversationEmbed('#tsEmbed', {
35+
* const embed = new SpotterEmbed('#tsEmbed', {
3636
* ... // other options
3737
* disableSourceSelection : true,
3838
* })
@@ -44,7 +44,7 @@ export interface ConversationViewConfig extends ViewConfig {
4444
* hideSourceSelection : Hide data source selection
4545
* @example
4646
* ```js
47-
* const embed = new ConversationEmbed('#tsEmbed', {
47+
* const embed = new SpotterEmbed('#tsEmbed', {
4848
* ... // other options
4949
* hideSourceSelection : true,
5050
* })
@@ -71,7 +71,7 @@ export interface ConversationViewConfig extends ViewConfig {
7171
* default is false.
7272
* @example
7373
* ```js
74-
* const embed = new ConversationEmbed('#tsEmbed', {
74+
* const embed = new SpotterEmbed('#tsEmbed', {
7575
* ... // other options
7676
* showSpotterLimitations : true,
7777
* })
@@ -84,7 +84,7 @@ export interface ConversationViewConfig extends ViewConfig {
8484
* the initial screen of the conversation.
8585
* @example
8686
* ```js
87-
* const embed = new ConversationEmbed('#tsEmbed', {
87+
* const embed = new SpotterEmbed('#tsEmbed', {
8888
* ... // other options
8989
* hideSampleQuestions : true,
9090
* })
@@ -94,23 +94,32 @@ export interface ConversationViewConfig extends ViewConfig {
9494
hideSampleQuestions?: boolean;
9595
}
9696

97+
/**
98+
* The configuration for the embedded spotterEmbed options.
99+
* @deprecated from SDK: 1.38.0 | ThoughtSpot: 10.10.0.cl
100+
* Use {@link SpotterEmbedViewConfig} instead
101+
* @group Embed components
102+
*/
103+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
104+
export interface ConversationViewConfig extends SpotterEmbedViewConfig {}
105+
97106
/**
98107
* Embed ThoughtSpot AI Conversation.
99108
* @group Embed components
100109
* @example
101110
* ```js
102-
* const conversation = new ConversationEmbed('#tsEmbed', {
111+
* const conversation = new SpotterEmbed('#tsEmbed', {
103112
* worksheetId: 'worksheetId',
104113
* searchOptions: {
105114
* searchQuery: 'searchQuery',
106115
* },
107116
* });
108117
* conversation.render();
109118
* ```
110-
* @version SDK: 1.33.1 | ThoughtSpot: 10.5.0.cl
119+
* @version SDK: 1.37.0 | ThoughtSpot: 10.9.0.cl
111120
*/
112-
export class ConversationEmbed extends TsEmbed {
113-
constructor(container: HTMLElement, protected viewConfig: ConversationViewConfig) {
121+
export class SpotterEmbed extends TsEmbed {
122+
constructor(container: HTMLElement, protected viewConfig: SpotterEmbedViewConfig) {
114123
viewConfig.embedComponentType = 'conversation';
115124
super(container, viewConfig);
116125
}
@@ -163,11 +172,35 @@ export class ConversationEmbed extends TsEmbed {
163172
return `${this.getEmbedBasePath(query)}/embed/${path}${tsPostHashParams}`;
164173
}
165174

166-
public async render(): Promise<ConversationEmbed> {
175+
public async render(): Promise<SpotterEmbed> {
167176
await super.render();
168177

169178
const src = this.getIframeSrc();
170179
await this.renderIFrame(src);
171180
return this;
172181
}
173182
}
183+
184+
/**
185+
* Embed ThoughtSpot AI Conversation.
186+
* @deprecated from SDK: 1.38.0 | ThoughtSpot: 10.10.0.cl
187+
* Use {@link SpotterEmbed} instead
188+
* @group Embed components
189+
* @example
190+
* ```js
191+
* const conversation = new SpotterEmbed('#tsEmbed', {
192+
* worksheetId: 'worksheetId',
193+
* searchOptions: {
194+
* searchQuery: 'searchQuery',
195+
* },
196+
* });
197+
* conversation.render();
198+
* ```
199+
* @version SDK: 1.37.0 | ThoughtSpot: 10.9.0.cl
200+
*/
201+
export class ConversationEmbed extends SpotterEmbed {
202+
constructor(container: HTMLElement, protected viewConfig: ConversationViewConfig) {
203+
viewConfig.embedComponentType = 'conversation';
204+
super(container, viewConfig);
205+
}
206+
}

src/embed/ts-embed.spec.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import {
1414
AppViewConfig,
1515
SageEmbed,
1616
SageViewConfig,
17-
ConversationViewConfig,
18-
ConversationEmbed,
1917
SearchViewConfig,
2018
AnswerService,
2119
} from '../index';

0 commit comments

Comments
 (0)