Skip to content

Commit 59dce4e

Browse files
authored
DataGrid - NVDA reads all status messages on page load when multiple components are rendered (T1288423) (#29890)
1 parent 2bcb72c commit 59dce4e

File tree

6 files changed

+29
-12
lines changed

6 files changed

+29
-12
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ fixture`Accessibility bugs`
99
test('T1187314 - DataGrid displays an incorrect row count in "aria-label" if there is no data after filtering', async (t) => {
1010
const dataGrid = new DataGrid('#container');
1111

12+
await dataGrid.apiFilter(['id', '=', '1']);
1213
await t
1314
.expect(dataGrid.getContainer().getAttribute('aria-label'))
1415
.eql('Data grid with 0 rows and 2 columns');
@@ -19,7 +20,6 @@ test('T1187314 - DataGrid displays an incorrect row count in "aria-label" if the
1920
data: 'A',
2021
}],
2122
filterRow: { visible: true },
22-
filterValue: ['id', '=', '1'],
2323
scrolling: { mode: 'infinite' },
2424
}));
2525

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const DATA_SOURCE = [
2727
];
2828

2929
test('Accessibility: DataGrid general status should contains correct text', async (t) => {
30-
const expectedStatusText = 'Data grid with 3 rows and 2 columns';
30+
const expectedStatusText = '';
3131
const dataGrid = new DataGrid('#container');
3232

3333
const statusText = await dataGrid.getGeneralStatusContainer().textContent;

packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,7 @@ export class DataController extends DataHelperMixin(modules.Controller) {
12181218
public updateItems(change?, isDataChanged?) {
12191219
change = change || {};
12201220
const that = this;
1221+
change.isFirstRender = !that.changed.fired();
12211222

12221223
if (that._repaintChangesOnly !== undefined) {
12231224
change.repaintChangesOnly = change.repaintChangesOnly ?? that._repaintChangesOnly;

packages/devextreme/js/__internal/grids/grid_core/views/m_grid_view.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ export class ResizingController extends modules.ViewController {
136136

137137
if (needFireContentReady) {
138138
when(resizeDeferred).done(() => {
139-
this._setAriaLabel();
139+
this._setAriaLabel(e);
140140
this.fireContentReadyAction();
141141
});
142142
}
@@ -194,17 +194,29 @@ export class ResizingController extends modules.ViewController {
194194
return 'dxDataGrid-ariaDataGrid';
195195
}
196196

197-
private _setAriaLabel(): void {
198-
const columnCount = this._columnsController?._columns?.filter(({ visible }) => !!visible).length ?? 0;
199-
const totalItemsCount = Math.max(0, this._dataController.totalItemsCount());
200-
const widgetAriaLabel = this._getWidgetAriaLabel();
201-
const widgetStatusText = messageLocalization
197+
private _setAriaLabel(e?: any): void {
198+
let widgetStatusText = '';
199+
let labelParts: string[] = [];
200+
201+
if (!e?.isFirstRender) {
202+
const columnCount = this._columnsController?._columns?.filter(({ visible }) => !!visible).length ?? 0;
203+
const totalItemsCount = Math.max(0, this._dataController.totalItemsCount());
204+
const widgetAriaLabel = this._getWidgetAriaLabel();
205+
widgetStatusText = messageLocalization
202206
// @ts-expect-error Badly typed format method
203-
.format(widgetAriaLabel, totalItemsCount, columnCount);
204-
// @ts-expect-error Badly typed dxElementWrapper
207+
.format(widgetAriaLabel, totalItemsCount, columnCount);
208+
209+
// @ts-expect-error Treelist Variable
210+
const expandableWidgetAriaLabel = messageLocalization.format(this._expandableWidgetAriaId);
211+
labelParts = [widgetStatusText];
212+
if (expandableWidgetAriaLabel) {
213+
labelParts.push(expandableWidgetAriaLabel);
214+
}
215+
}
216+
// @ts-expect-error
205217
const $ariaLabelElement = this.component.$element().children(`.${GRIDBASE_CONTAINER_CLASS}`);
206218

207-
this.component.setAria('label', widgetStatusText, $ariaLabelElement);
219+
this.component.setAria('label', labelParts.join('. '), $ariaLabelElement);
208220
this._gridView.setWidgetA11yStatusText(widgetStatusText);
209221
}
210222

packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/dataController.tests.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3789,6 +3789,7 @@ QUnit.module('Virtual rendering', { beforeEach: setupVirtualRenderingModule, aft
37893789
isLiveUpdate: true,
37903790
repaintChangesOnly: true,
37913791
needUpdateDimensions: true,
3792+
isFirstRender: false,
37923793
changeTypes: [
37933794
'remove',
37943795
'remove',
@@ -4062,6 +4063,7 @@ QUnit.module('Virtual rendering', { beforeEach: setupVirtualRenderingModule, aft
40624063
assert.deepEqual(this.changedArgs, [{
40634064
changeType: 'refresh',
40644065
isDataChanged: true,
4066+
isFirstRender: false,
40654067
repaintChangesOnly: false,
40664068
items: this.dataController.items(),
40674069
needUpdateDimensions: true,
@@ -4088,6 +4090,7 @@ QUnit.module('Virtual rendering', { beforeEach: setupVirtualRenderingModule, aft
40884090
assert.deepEqual(this.changedArgs, [{
40894091
changeType: 'refresh',
40904092
isDataChanged: true,
4093+
isFirstRender: false,
40914094
needUpdateDimensions: true,
40924095
repaintChangesOnly: false,
40934096
items: this.dataController.items(),

packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/dataGrid.tests.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ QUnit.module('Initialization', baseModuleConfig, () => {
173173
assert.equal(filterRowWrapper.getTextEditorInput(1).attr('aria-describedby'), headersWrapper.getHeaderItem(0, 4).attr('id'));
174174

175175
assert.equal(dataGridWrapper.getElement().find('.dx-datagrid').attr('role'), 'group', 'group role');
176-
assert.equal(dataGridWrapper.getElement().find('.dx-datagrid').attr('aria-label'), 'Data grid with 2 rows and 4 columns', 'aria-label of the datagrid container');
176+
// T1288423
177+
assert.equal(dataGridWrapper.getElement().find('.dx-datagrid').attr('aria-label'), '', 'aria-label of the datagrid container');
177178
assert.equal(headersWrapper.getElement().attr('role'), 'presentation', 'Headers role');
178179
assert.equal(headersWrapper.getColumnsIndicators().attr('role'), 'presentation', 'Headers columns indicators role');
179180
assert.equal($('.dx-datagrid-scroll-container').attr('role'), 'presentation', 'Scroll container role');

0 commit comments

Comments
 (0)