Skip to content

Commit 82d7735

Browse files
Merge branch '25_2' of https://github.com/DevExpress/DevExtreme into ng-new-syntax-form-html-editor
2 parents 8ad967d + 38705cf commit 82d7735

File tree

4,245 files changed

+24379
-15984
lines changed

Some content is hidden

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

4,245 files changed

+24379
-15984
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
applyTo: "**/localization/messages/**/*.json"
3+
---
4+
5+
# CRITICAL: DO NOT REVIEW LOCALIZATION FILES
6+
7+
These files are managed by a dedicated localization team through a separate workflow.
8+
9+
## Absolute Prohibitions - You MUST NOT:
10+
11+
- ❌ NEVER suggest translating English text to other languages
12+
- ❌ NEVER comment that text should be translated to match the locale
13+
- ❌ NEVER suggest alternative translations or phrasings in any language
14+
- ❌ NEVER comment on language consistency (e.g., "this should be in Arabic")
15+
- ❌ NEVER suggest changing text content for localization purposes
16+
- ❌ NEVER comment on which language should be used
17+
- ❌ NEVER suggest adding or removing message keys
18+
- ❌ NEVER provide language-specific style recommendations
19+
20+
## Why These Files Are Off-Limits:
21+
22+
Translation suggestions make PR pages UNRESPONSIVE and overwhelm human reviewers. The localization team handles all translation work through a separate quality assurance process.
23+
24+
## The ONLY Acceptable Comments:
25+
26+
✅ Critical JSON syntax errors that would break the build (missing commas, unclosed brackets)
27+
✅ Severe grammar errors (ONLY if they would cause user confusion)
28+
29+
## Examples of FORBIDDEN Comments:
30+
31+
- ❌ "This English text should be translated to Arabic"
32+
- ❌ "Translation is missing for this locale"
33+
- ❌ "Consider translating '(No subject)' to '(بدون موضوع)'"
34+
- ❌ "This text is in English but should be in German"
35+
- ❌ "Inconsistent language - use native translation"
36+
37+
If you have ANY doubt about whether to comment on a localization file, DO NOT COMMENT.
38+
39+
Focus your review on actual code files instead.

.github/workflows/testcafe_tests.yml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,8 @@ jobs:
102102
{ componentFolder: "dataGrid/common", name: "dataGrid / common (3/5)", indices: "3/5" },
103103
{ componentFolder: "dataGrid/common", name: "dataGrid / common (4/5)", indices: "4/5" },
104104
{ componentFolder: "dataGrid/common", name: "dataGrid / common (5/5)", indices: "5/5" },
105-
{ componentFolder: "dataGrid/sticky/common", name: "dataGrid / sticky common" },
106-
{ componentFolder: "dataGrid/sticky/fixed", name: "dataGrid / sticky (1/3)", indices: "1/3" },
107-
{ componentFolder: "dataGrid/sticky/fixed", name: "dataGrid / sticky (2/3)", indices: "2/3" },
108-
{ componentFolder: "dataGrid/sticky/fixed", name: "dataGrid / sticky (3/3)", indices: "3/3" },
105+
{ componentFolder: "dataGrid/sticky", name: "dataGrid / sticky (1/2)", indices: "1/2" },
106+
{ componentFolder: "dataGrid/sticky", name: "dataGrid / sticky (2/2)", indices: "2/2" },
109107
{ componentFolder: "cardView", name: "cardView" },
110108

111109
# Scheduler tests need to be reworked to work in fluent theme
@@ -120,8 +118,7 @@ jobs:
120118
{ componentFolder: "scheduler/timezones", name: "scheduler / timezones (Europe/Berlin)", timezone: "Europe/Berlin", theme: 'generic.light' },
121119
{ componentFolder: "scheduler/timezones", name: "scheduler / timezones (America/Los_Angeles)", timezone: "America/Los_Angeles", theme: 'generic.light' },
122120

123-
{ componentFolder: "editors", name: "editors (1/2)", indices: "1/2" },
124-
{ componentFolder: "editors", name: "editors (2/2)", indices: "2/2" },
121+
{ componentFolder: "editors", name: "editors" },
125122
{ componentFolder: "navigation", name: "navigation" },
126123
]
127124
runs-on: devextreme-shr2

apps/demos/Demos/Accordion/Overview/Angular/app/app.component.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,11 @@
5757
<div class="option">
5858
<span>Animation duration</span>
5959
<dx-slider [min]="0" [max]="1000" [(value)]="accordion.animationDuration">
60-
<dxo-tooltip [enabled]="true" position="bottom"></dxo-tooltip>
61-
<dxo-label [visible]="true"></dxo-label>
60+
<dxo-slider-tooltip
61+
[enabled]="true"
62+
position="bottom"
63+
></dxo-slider-tooltip>
64+
<dxo-slider-label [visible]="true"></dxo-slider-label>
6265
</dx-slider>
6366
</div>
6467
<div class="option">

apps/demos/Demos/ActionSheet/PopoverMode/Angular/app/app.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<dx-list (onItemClick)="itemClick($event)">
2-
<dxi-item *ngFor="let contact of contacts">
2+
<dxi-list-item *ngFor="let contact of contacts">
33
<div>{{ contact.name }}</div>
44
<div>{{ contact.phone }}</div>
55
<div>{{ contact.email }}</div>
6-
</dxi-item>
6+
</dxi-list-item>
77
</dx-list>
88
<dx-action-sheet
99
[items]="commands"
Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,51 @@
11
<dx-box direction="row" width="100%" [height]="75">
2-
<dxi-item class="rect demo-dark" [ratio]="1"> ratio = 1 </dxi-item>
3-
<dxi-item class="rect demo-light" [ratio]="2"> ratio = 2 </dxi-item>
4-
<dxi-item class="rect demo-dark" [ratio]="1"> ratio = 1 </dxi-item>
2+
<dxi-box-item class="rect demo-dark" [ratio]="1"> ratio = 1 </dxi-box-item>
3+
<dxi-box-item class="rect demo-light" [ratio]="2"> ratio = 2 </dxi-box-item>
4+
<dxi-box-item class="rect demo-dark" [ratio]="1"> ratio = 1 </dxi-box-item>
55
</dx-box>
66
<br />
77
<dx-box direction="row" width="100%" [height]="75">
8-
<dxi-item class="rect demo-dark" [ratio]="0" [baseSize]="150">
8+
<dxi-box-item class="rect demo-dark" [ratio]="0" [baseSize]="150">
99
150px
10-
</dxi-item>
11-
<dxi-item class="demo-light" [ratio]="1">
10+
</dxi-box-item>
11+
<dxi-box-item class="demo-light" [ratio]="1">
1212
<dx-box
1313
direction="row"
1414
width="100%"
1515
[height]="75"
1616
align="center"
1717
crossAlign="center"
1818
>
19-
<dxi-item [ratio]="0" [baseSize]="50">
19+
<dxi-box-item [ratio]="0" [baseSize]="50">
2020
<div class="small"></div>
21-
</dxi-item>
22-
<dxi-item [ratio]="0" [baseSize]="50">
21+
</dxi-box-item>
22+
<dxi-box-item [ratio]="0" [baseSize]="50">
2323
<div class="small"></div>
24-
</dxi-item>
25-
<dxi-item [ratio]="0" [baseSize]="50">
24+
</dxi-box-item>
25+
<dxi-box-item [ratio]="0" [baseSize]="50">
2626
<div class="small"></div>
27-
</dxi-item>
27+
</dxi-box-item>
2828
</dx-box>
29-
</dxi-item>
30-
<dxi-item class="rect demo-dark" [ratio]="0" baseSize="10%"> 10% </dxi-item>
29+
</dxi-box-item>
30+
<dxi-box-item class="rect demo-dark" [ratio]="0" baseSize="10%">
31+
10%
32+
</dxi-box-item>
3133
</dx-box>
3234
<br />
3335
<dx-box direction="col" width="100%" [height]="250">
34-
<dxi-item class="rect demo-dark header" [ratio]="1"> Header </dxi-item>
35-
<dxi-item [ratio]="2" [baseSize]="0">
36+
<dxi-box-item class="rect demo-dark header" [ratio]="1">
37+
Header
38+
</dxi-box-item>
39+
<dxi-box-item [ratio]="2" [baseSize]="0">
3640
<dx-box direction="row" width="100%" [height]="125">
37-
<dxi-item class="rect demo-dark" [ratio]="1"> Left Bar </dxi-item>
38-
<dxi-item class="rect demo-light" [ratio]="1"> Content </dxi-item>
39-
<dxi-item class="rect demo-dark" [ratio]="1"> Right Bar </dxi-item>
41+
<dxi-box-item class="rect demo-dark" [ratio]="1"> Left Bar </dxi-box-item>
42+
<dxi-box-item class="rect demo-light" [ratio]="1"> Content </dxi-box-item>
43+
<dxi-box-item class="rect demo-dark" [ratio]="1">
44+
Right Bar
45+
</dxi-box-item>
4046
</dx-box>
41-
</dxi-item>
42-
<dxi-item class="rect demo-dark footer" [ratio]="1"> Footer </dxi-item>
47+
</dxi-box-item>
48+
<dxi-box-item class="rect demo-dark footer" [ratio]="1">
49+
Footer
50+
</dxi-box-item>
4351
</dx-box>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
MockDate.set(new Date('2025/05/05 16:35:10'));
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
const getTimestamp = function (date, offsetMinutes = 0) {
2+
return date.getTime() + offsetMinutes * 60000;
3+
};
4+
5+
const date = new Date();
6+
date.setHours(0, 0, 0, 0);
7+
8+
const currentUser = {
9+
id: 'c94c0e76-fb49-4b9b-8f07-9f93ed93b4f3',
10+
name: 'John Doe',
11+
};
12+
13+
const supportAgent = {
14+
id: 'd16d1a4c-5c67-4e20-b70e-2991c22747c3',
15+
name: 'Support Agent',
16+
avatarUrl: '../../../../images/petersmith.png',
17+
};
18+
19+
const createEmptyAttachment = (name, type) => {
20+
const blob = new Blob([''], { type });
21+
const url = URL.createObjectURL(blob);
22+
23+
return {
24+
name,
25+
url,
26+
size: 1024 * 10,
27+
};
28+
};
29+
30+
const screenshot1 = createEmptyAttachment('Screenshot1.jpg', 'image/jpeg');
31+
const screenshot2 = createEmptyAttachment('Screenshot2.jpg', 'image/jpeg');
32+
const screenshot3 = createEmptyAttachment('Screenshot3.jpg', 'image/jpeg');
33+
const instructions = createEmptyAttachment('Instructions.pdf', 'application/pdf');
34+
35+
const messages = [
36+
{
37+
id: new DevExpress.data.Guid(),
38+
timestamp: getTimestamp(date, -9),
39+
author: supportAgent,
40+
text: 'Hello, John!\nHow can I assist you today?',
41+
},
42+
{
43+
id: new DevExpress.data.Guid(),
44+
timestamp: getTimestamp(date, -7),
45+
author: currentUser,
46+
text: "Hi, I'm having trouble accessing my account.\nIt says my password is incorrect. I’ve attached some screenshots for you to check.",
47+
attachments: [screenshot1, screenshot2, screenshot3],
48+
},
49+
{
50+
id: new DevExpress.data.Guid(),
51+
timestamp: getTimestamp(date, -7),
52+
author: supportAgent,
53+
text: 'Thanks for the screenshots! I can help you with that. Please refer to the attached file for instructions to restore access.',
54+
attachments: [instructions],
55+
},
56+
];
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<!DOCTYPE html>
2+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
3+
<head>
4+
<title>DevExtreme Demo</title>
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
6+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" />
8+
<script src="../../../../node_modules/jquery/dist/jquery.min.js"></script>
9+
<link rel="stylesheet" type="text/css" href="../../../../node_modules/devextreme-dist/css/dx.light.css" />
10+
<script src="../../../../node_modules/devextreme-dist/js/dx.all.js"></script>
11+
<link rel="stylesheet" type="text/css" href="styles.css" />
12+
<script src="data.js"></script>
13+
<script src="index.js"></script>
14+
</head>
15+
<body class="dx-viewport">
16+
<div class="demo-container">
17+
<div class="chat-container">
18+
<div id="chat"></div>
19+
</div>
20+
</div>
21+
</body>
22+
</html>
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
$(() => {
2+
const customStore = new DevExpress.data.CustomStore({
3+
key: 'id',
4+
load: async () => messages,
5+
insert: async (message) => {
6+
messages.push(message);
7+
return message;
8+
},
9+
});
10+
11+
const dataSource = new DevExpress.data.DataSource({
12+
store: customStore,
13+
paginate: false,
14+
});
15+
16+
const uploadedFilesMap = new Map();
17+
18+
$('#chat').dxChat({
19+
height: 600,
20+
dataSource,
21+
reloadOnChange: false,
22+
user: currentUser,
23+
fileUploaderOptions: {
24+
uploadFile: () => {},
25+
onValueChanged(e) {
26+
e.value.forEach((file) => {
27+
const url = URL.createObjectURL(file);
28+
uploadedFilesMap.set(file.name, url);
29+
});
30+
},
31+
},
32+
onMessageEntered(e) {
33+
const { message } = e;
34+
35+
const attachmentsWithUrls = message.attachments?.map((attachment) => {
36+
const url = uploadedFilesMap.get(attachment.name);
37+
return { ...attachment, url };
38+
});
39+
40+
dataSource.store().push([{
41+
type: 'insert',
42+
data: {
43+
id: new DevExpress.data.Guid(),
44+
...message,
45+
attachments: attachmentsWithUrls,
46+
},
47+
}]);
48+
},
49+
onAttachmentDownloadClick(e) {
50+
const { attachment } = e;
51+
52+
if (!attachment?.url) {
53+
return;
54+
}
55+
56+
const link = document.createElement('a');
57+
link.href = attachment.url;
58+
link.download = attachment.name;
59+
document.body.appendChild(link);
60+
61+
link.click();
62+
63+
document.body.removeChild(link);
64+
},
65+
}).dxChat('instance');
66+
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
.demo-container {
2+
min-width: 720px;
3+
}
4+
5+
.chat-container {
6+
display: flex;
7+
flex-grow: 1;
8+
align-items: center;
9+
justify-content: center;
10+
}
11+
12+
.dx-chat {
13+
max-width: 480px;
14+
}
15+
16+
.caption {
17+
font-size: var(--dx-font-size-sm);
18+
font-weight: 500;
19+
}
20+
21+
.dx-avatar {
22+
border: 1px solid var(--dx-color-border);
23+
}

0 commit comments

Comments
 (0)