Skip to content

Commit d1312f1

Browse files
authored
DataGrid - NVDA reads all status messages on page load when multiple components are rendered (T1288423) (DevExpress#29777)
1 parent 9781316 commit d1312f1

File tree

6 files changed

+30
-17
lines changed

6 files changed

+30
-17
lines changed

e2e/testcafe-devextreme/tests/dataGrid/common/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/common/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: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ export class ResizingController extends modules.ViewController {
133133

134134
if (needFireContentReady) {
135135
when(resizeDeferred).done(() => {
136-
this._setAriaLabel();
136+
this._setAriaLabel(e);
137137
this.fireContentReadyAction();
138138
});
139139
}
@@ -191,20 +191,28 @@ export class ResizingController extends modules.ViewController {
191191
return 'dxDataGrid-ariaDataGrid';
192192
}
193193

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

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
@@ -174,7 +174,8 @@ QUnit.module('Initialization', baseModuleConfig, () => {
174174
assert.equal(filterRowWrapper.getTextEditorInput(1).attr('aria-describedby'), headersWrapper.getHeaderItem(0, 4).attr('id'));
175175

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

0 commit comments

Comments
 (0)