Skip to content

Commit eb27ce2

Browse files
Merge branch '25_2' into 25_2_reduce_runners
2 parents 0f7040b + 29771bc commit eb27ce2

File tree

144 files changed

+2036
-1240
lines changed

Some content is hidden

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

144 files changed

+2036
-1240
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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ jobs:
101101
{ componentFolder: "dataGrid/common", name: "dataGrid / common (1/3)", indices: "1/3" },
102102
{ componentFolder: "dataGrid/common", name: "dataGrid / common (2/3)", indices: "2/3" },
103103
{ componentFolder: "dataGrid/common", name: "dataGrid / common (3/3)", indices: "3/3" },
104-
{ componentFolder: "dataGrid/sticky/common", name: "dataGrid / sticky common" },
105-
{ componentFolder: "dataGrid/sticky/fixed", name: "dataGrid / sticky"},
104+
{ componentFolder: "dataGrid/sticky", name: "dataGrid / sticky (1/2)", indices: "1/2" },
105+
{ componentFolder: "dataGrid/sticky", name: "dataGrid / sticky (2/2)", indices: "2/2" },
106106
{ componentFolder: "cardView", name: "cardView" },
107107

108108
# Scheduler tests need to be reworked to work in fluent theme

apps/demos/Demos/Stepper/StepTemplate/Angular/app/app.component.css

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
border-radius: 4px;
6868
}
6969

70-
::ng-deep #iconOnly :is(.dx-step-selected, .dx-step-completed) .dx-icon {
71-
color: var(--dx-color-primary);
70+
::ng-deep #iconOnly .dx-step-selected .dx-icon,
71+
::ng-deep #iconOnly .dx-step-completed .dx-icon {
72+
color: var(--dx-color-primary);
7273
}

apps/demos/testing/widgets/vectormap/VectorMapZooming.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ fixture('VectorMap.DynamicViewport')
1111
runManualTest('VectorMap', 'DynamicViewport', (test) => {
1212
test('VectorMap.DynamicViewport', async (t) => {
1313
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
14-
const zoomButton = $($('#vector-map .dxm-control-bar g').nth(1)).find('circle').nth(0);
14+
const zoomButton = $($('#vector-map .dxm-control-bar g').nth(1));
1515
const showSelectBoxItems = () => t.click($('.options .dx-dropdowneditor-input-wrapper input.dx-texteditor-input'));
1616
const selectItem = (index) => $('.dx-dropdowneditor-overlay .dx-list-item-content').nth(index);
1717

18-
await t.click(zoomButton);
19-
await t.click(zoomButton);
18+
await t.click(zoomButton, { offsetX: 10, offsetY: 10 });
19+
await t.click(zoomButton, { offsetX: 10, offsetY: 10 });
2020
await testScreenshot(t, takeScreenshot, 'zoom_vector_map_by_control_bar.png');
2121

2222
await showSelectBoxItems();

apps/demos/utils/visual-tests/matrix-test-helper.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,6 @@ const SKIPPED_TESTS = {
225225
DataGrid: ['EditStateManagement', 'Toolbar', 'RemoteGrouping'],
226226
Scheduler: ['ContextMenu'],
227227
FileUploader: ['CustomDropzone'],
228-
// TODO: make this more stable
229-
Stepper: ['StepTemplate'],
230228
},
231229
Vue: {
232230
Charts: ['Crosshair'],

apps/react-storybook/stories/chat/Chat.stories.tsx

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,3 +790,127 @@ export const Editing: Story = {
790790
);
791791
}
792792
};
793+
794+
export const FileAttachments: Story = {
795+
args: {
796+
user: firstAuthor,
797+
...commonArgs,
798+
},
799+
argTypes: {
800+
user: {
801+
control: 'select',
802+
options: [firstAuthor.name, secondAuthor.name],
803+
mapping: {
804+
[firstAuthor.name]: firstAuthor,
805+
[secondAuthor.name]: secondAuthor,
806+
},
807+
defaultValue: firstAuthor.name,
808+
},
809+
},
810+
render: ({
811+
width,
812+
height,
813+
disabled,
814+
rtlEnabled,
815+
user,
816+
visible,
817+
activeStateEnabled,
818+
hoverStateEnabled,
819+
focusStateEnabled,
820+
}) => {
821+
const [messages, setMessages] = useState<ChatTypes.Message[]>([
822+
{
823+
id: 1,
824+
author: firstAuthor,
825+
text: 'Files attached in a very long message: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vel tempus orci, sit amet tempor tortor. Etiam ut aliquam nisi.',
826+
attachments: [
827+
{ name: 'report.pdf', size: 1024 * 512 },
828+
{ name: 'presentation.pptx', size: 1024 * 1024 },
829+
{ name: 'photo.jpg', size: 1024 * 300 },
830+
{ name: 'song.mp3', size: 1024 * 300 },
831+
],
832+
},
833+
{
834+
id: 2,
835+
author: secondAuthor,
836+
text: 'Files, short message',
837+
attachments: [
838+
{ name: 'report.pdf', size: 1024 * 512 },
839+
{ name: 'song.mp3', size: 1024 * 1024 },
840+
],
841+
},
842+
]);
843+
844+
const [toastConfig, setToastConfig] = useState({
845+
visible: false,
846+
message: '',
847+
});
848+
849+
const onAttachmentDownloadClick = useCallback((e: ChatTypes.AttachmentDownloadClickEvent) => {
850+
const { attachment } = e;
851+
852+
setToastConfig({
853+
visible: true,
854+
message: `Downloading ${attachment?.name}...`,
855+
});
856+
857+
setTimeout(() => {
858+
setToastConfig({
859+
visible: true,
860+
message: `${attachment?.name} downloaded successfully`,
861+
});
862+
}, 1000);
863+
}, []);
864+
865+
const onMessageEntered = useCallback(
866+
({ message }) => {
867+
setMessages((prev) => [...prev, message]);
868+
},
869+
[]
870+
);
871+
872+
const onToastHiding = useCallback(() => {
873+
setToastConfig({ visible: false, message: '' });
874+
}, []);
875+
876+
const fileUploaderOptions = useMemo(() => ({
877+
uploadFile: (file: File) => {
878+
setToastConfig({
879+
visible: true,
880+
message: `Uploading ${file.name}...`,
881+
});
882+
setTimeout(() => {
883+
setToastConfig({
884+
visible: true,
885+
message: `${file.name} uploaded successfully`,
886+
});
887+
}, 1000);
888+
}
889+
}), []);
890+
891+
return (
892+
<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
893+
<Chat
894+
width={width}
895+
height={height}
896+
items={messages}
897+
disabled={disabled}
898+
rtlEnabled={rtlEnabled}
899+
user={user}
900+
visible={visible}
901+
activeStateEnabled={activeStateEnabled}
902+
focusStateEnabled={focusStateEnabled}
903+
hoverStateEnabled={hoverStateEnabled}
904+
onAttachmentDownloadClick={onAttachmentDownloadClick}
905+
onMessageEntered={onMessageEntered}
906+
fileUploaderOptions={fileUploaderOptions}
907+
/>
908+
<Toast
909+
{...toastConfig}
910+
onHiding={onToastHiding}
911+
displayTime={1000}
912+
/>
913+
</div>
914+
);
915+
},
916+
};

e2e/testcafe-devextreme/helpers/restoreBrowserSize.ts

Lines changed: 0 additions & 19 deletions
This file was deleted.

e2e/testcafe-devextreme/runner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ function getArgs(): ParsedArgs {
103103
concurrency: 0,
104104
browsers: 'chrome',
105105
test: '',
106-
reporter: [process.env.CI === 'true' ? 'list' : 'minimal'],
106+
reporter: process.env.CI === 'true' ? 'list' : 'spec',
107107
componentFolder: '',
108108
file: '*',
109109
cache: true,

e2e/testcafe-devextreme/tests/accessibility/dataGrid/editing.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ fixture.disablePageReloads`DataGrid - Editing`
2121
.click(dataGrid.getToolbar().getItem(0));
2222

2323
await a11yCheck(t);
24-
}).before(() => createWidget('dxDataGrid', {
24+
}).before(async () => createWidget('dxDataGrid', {
2525
dataSource: getData(3, 2),
2626
height: 400,
2727
showBorders: true,

e2e/testcafe-devextreme/tests/accessibility/dataGrid/scrolling.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ test('Infinite scrolling', async (t) => {
1515
.ok();
1616

1717
await a11yCheck(t);
18-
}).before(() => createWidget('dxDataGrid', {
18+
}).before(async () => createWidget('dxDataGrid', {
1919
dataSource: getData(1000, 2),
2020
height: 400,
2121
showBorders: true,
@@ -32,7 +32,7 @@ test('Horizontal Virtual Scrolling', async (t) => {
3232
.ok();
3333

3434
await a11yCheck(t);
35-
}).before(() => createWidget('dxDataGrid', {
35+
}).before(async () => createWidget('dxDataGrid', {
3636
dataSource: getData(20, 100),
3737
columnWidth: 100,
3838
height: 400,

0 commit comments

Comments
 (0)