Skip to content

Commit 4e6c0d5

Browse files
r-farkhutdinovRuslan Farkhutdinovmarker dao ®alexslavr
authored
Chat: Add image rendering (DevExpress#29698)
Co-authored-by: Ruslan Farkhutdinov <[email protected]> Co-authored-by: marker dao ® <[email protected]> Co-authored-by: alexlavrov <[email protected]>
1 parent 95aa799 commit 4e6c0d5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+369
-51
lines changed

e2e/testcafe-devextreme/tests/chat/data/index.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ interface User {
44
avatarUrl: string;
55
}
66

7+
interface Message {
8+
timestamp: Date;
9+
author: User;
10+
type?: 'image' | 'text';
11+
src?: string;
12+
text?: string;
13+
}
14+
715
export const avatarUrl = 'data:image/png;base64,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';
816
export const lineBreaks = '\n\n';
917

@@ -41,7 +49,7 @@ export const generateMessages = (
4149
coefficient = 4,
4250
n = 1,
4351
isEdited = false,
44-
): any => {
52+
): Message[] => {
4553
const messages = Array.from({ length: length * n }, (_, i) => {
4654
const text = useLongText
4755
? getLongText(useLineBreaks)
@@ -67,3 +75,13 @@ export const generateMessages = (
6775

6876
return messages;
6977
};
78+
79+
export const generateImageMessage = (
80+
user: User,
81+
src: string,
82+
): Message => ({
83+
timestamp,
84+
author: user,
85+
type: 'image',
86+
src,
87+
});
43.8 KB
Loading
42.8 KB
Loading
44.3 KB
Loading
12.2 KB
Loading
11.2 KB
Loading
12.5 KB
Loading

e2e/testcafe-devextreme/tests/chat/messageBubble.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createScreenshotsComparer } from 'devextreme-screenshot-comparer';
22
import Chat from 'devextreme-testcafe-models/chat';
3-
import { createUser, generateMessages } from './data';
3+
import { createUser, generateImageMessage, generateMessages } from './data';
44
import url from '../../helpers/getPageUrl';
55
import { createWidget } from '../../helpers/createWidget';
66
import { testScreenshot } from '../../helpers/themeUtils';
@@ -38,3 +38,29 @@ test('Chat: messagebubble', async (t) => {
3838
height: 650,
3939
}, '#chat');
4040
});
41+
42+
test('Chat: messagebubble - image rendering with size variations', async (t) => {
43+
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
44+
const chat = new Chat('#chat');
45+
46+
const user = createUser(1, 'ImageUser');
47+
48+
let imageMessages = generateImageMessage(user, '../../../apps/demos/images/products/1.png');
49+
50+
await chat.option({ items: [imageMessages] });
51+
await testScreenshot(t, takeScreenshot, 'Bubbles with image.png', { element: '#chat' });
52+
53+
imageMessages = generateImageMessage(user, '../../../apps/demos/images/products/1-small.png');
54+
55+
await chat.option({ items: [imageMessages] });
56+
await testScreenshot(t, takeScreenshot, 'Bubbles with small image.png', { element: '#chat' });
57+
58+
await t.expect(compareResults.isValid()).ok(compareResults.errorMessages());
59+
}).before(async () => {
60+
await appendElementTo('#container', 'div', 'chat');
61+
62+
return createWidget('dxChat', {
63+
width: 600,
64+
height: 650,
65+
}, '#chat');
66+
});

packages/devextreme-angular/src/ui/chat/nested/item-dxi.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ import { CollectionNestedOption } from 'devextreme-angular/core';
3030
providers: [NestedOptionHost]
3131
})
3232
export class DxiChatItemComponent extends CollectionNestedOption {
33+
@Input()
34+
get alt(): string {
35+
return this._getOption('alt');
36+
}
37+
set alt(value: string) {
38+
this._setOption('alt', value);
39+
}
40+
3341
@Input()
3442
get author(): User {
3543
return this._getOption('author');
@@ -62,6 +70,14 @@ export class DxiChatItemComponent extends CollectionNestedOption {
6270
this._setOption('isEdited', value);
6371
}
6472

73+
@Input()
74+
get src(): string {
75+
return this._getOption('src');
76+
}
77+
set src(value: string) {
78+
this._setOption('src', value);
79+
}
80+
6581
@Input()
6682
get text(): string {
6783
return this._getOption('text');
@@ -78,6 +94,14 @@ export class DxiChatItemComponent extends CollectionNestedOption {
7894
this._setOption('timestamp', value);
7995
}
8096

97+
@Input()
98+
get type(): string | undefined {
99+
return this._getOption('type');
100+
}
101+
set type(value: string | undefined) {
102+
this._setOption('type', value);
103+
}
104+
81105

82106
protected get _optionPath() {
83107
return 'items';

packages/devextreme-angular/src/ui/nested/base/button-group-item-dxi.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,10 @@ export abstract class DxiButtonGroupItem extends CollectionNestedOption {
9898
this._setOption('stylingMode', value);
9999
}
100100

101-
get type(): ButtonType | string {
101+
get type(): ButtonType | string | undefined {
102102
return this._getOption('type');
103103
}
104-
set type(value: ButtonType | string) {
104+
set type(value: ButtonType | string | undefined) {
105105
this._setOption('type', value);
106106
}
107107

@@ -147,6 +147,13 @@ export abstract class DxiButtonGroupItem extends CollectionNestedOption {
147147
this._setOption('hint', value);
148148
}
149149

150+
get alt(): string {
151+
return this._getOption('alt');
152+
}
153+
set alt(value: string) {
154+
this._setOption('alt', value);
155+
}
156+
150157
get author(): User {
151158
return this._getOption('author');
152159
}
@@ -175,6 +182,13 @@ export abstract class DxiButtonGroupItem extends CollectionNestedOption {
175182
this._setOption('isEdited', value);
176183
}
177184

185+
get src(): string {
186+
return this._getOption('src');
187+
}
188+
set src(value: string) {
189+
this._setOption('src', value);
190+
}
191+
178192
get timestamp(): Date | number | string {
179193
return this._getOption('timestamp');
180194
}

0 commit comments

Comments
 (0)