From b65ab26bbc6e0d1379b6b41418f5dfdd48b8d83a Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 16 Feb 2026 15:37:49 +0800 Subject: [PATCH 01/10] impl hotkeys --- .../accessibility/scheduler/scheduler.ts | 2 +- .../__tests__/__mock__/model/appointment.ts | 2 + .../scheduler/__tests__/appointments.test.ts | 98 +++++++++++++++++++ .../appointments/m_appointments_kbn.ts | 30 +++++- .../js/__internal/scheduler/m_scheduler.ts | 2 +- 5 files changed, 130 insertions(+), 4 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/accessibility/scheduler/scheduler.ts b/e2e/testcafe-devextreme/tests/accessibility/scheduler/scheduler.ts index 072aafdf3f48..745573effa48 100644 --- a/e2e/testcafe-devextreme/tests/accessibility/scheduler/scheduler.ts +++ b/e2e/testcafe-devextreme/tests/accessibility/scheduler/scheduler.ts @@ -13,7 +13,7 @@ test('Scheduler should have right aria attributes after view changed', async (t) await t.expect(scheduler.element.getAttribute('aria-label')).contains('Scheduler. Month view'); await t.expect(scheduler.getGeneralStatusContainer().textContent).contains('Scheduler. Month view'); - await t.expect(scheduler.element.getAttribute('role')).eql('group'); + await t.expect(scheduler.element.getAttribute('role')).eql('application'); await scheduler.option('currentView', 'week'); diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/appointment.ts b/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/appointment.ts index 06ec245aaac9..3298956f94aa 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/appointment.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/appointment.ts @@ -11,6 +11,7 @@ export interface AppointmentModel { getGeometry: () => Position; getColor: (view: string) => string | undefined; getSnapshot: () => object; + isFocused: () => boolean; } const getColor = (appointment: HTMLDivElement): string => appointment.style.backgroundColor; @@ -60,4 +61,5 @@ export const createAppointmentModel = ( date: getDisplayDate(element), ...getGeometry(element), }), + isFocused: () => element?.classList.contains('dx-state-focused') ?? false, }); diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts index e50e51e78830..87c3852a9d3d 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts @@ -1,14 +1,20 @@ import { afterEach, describe, expect, it, jest, } from '@jest/globals'; +import $ from '@js/core/renderer'; import { createScheduler } from './__mock__/create_scheduler'; import { setupSchedulerTestEnvironment } from './__mock__/m_mock_scheduler'; describe('Appointments', () => { afterEach(() => { + const $scheduler = $('.dx-scheduler'); + // @ts-expect-error + $scheduler.dxScheduler('dispose'); + document.body.innerHTML = ''; jest.useRealTimers(); }); + it('All-day appointment should not be resizable if current view is "day"', async () => { setupSchedulerTestEnvironment(); const { POM } = await createScheduler({ @@ -81,4 +87,96 @@ describe('Appointments', () => { expect(tooltipTitleElement?.textContent?.trim()).toBe('(No subject)'); } }); + + describe('Keyboard Navigation', () => { + const dataSource = [ + { + text: 'Appointment 1', + startDate: new Date(2015, 1, 9, 8), + endDate: new Date(2015, 1, 9, 9), + }, + { + text: 'Appointment 2', + startDate: new Date(2015, 1, 9, 10), + endDate: new Date(2015, 1, 9, 11), + }, + { + text: 'Appointment 3', + startDate: new Date(2015, 1, 9, 12), + endDate: new Date(2015, 1, 9, 13), + }, + ]; + + it('should focus first appointment on Home', async () => { + setupSchedulerTestEnvironment(); + const { POM, keydown } = await createScheduler({ + dataSource, + currentView: 'day', + currentDate: new Date(2015, 1, 9), + }); + + const appointments = POM.getAppointments(); + const firstAppointment = appointments[0]; + const lastAppointment = appointments[2]; + + lastAppointment.element.focus(); + keydown(lastAppointment.element, 'Home'); + + expect(firstAppointment.isFocused()).toBe(true); + expect(lastAppointment.isFocused()).toBe(false); + }); + + it('should focus last appointment on End', async () => { + setupSchedulerTestEnvironment(); + const { POM, keydown } = await createScheduler({ + dataSource, + currentView: 'day', + currentDate: new Date(2015, 1, 9), + }); + + const appointments = POM.getAppointments(); + const firstAppointment = appointments[0]; + const lastAppointment = appointments[2]; + + firstAppointment.element.focus(); + keydown(firstAppointment.element, 'End'); + + expect(firstAppointment.isFocused()).toBe(false); + expect(lastAppointment.isFocused()).toBe(true); + }); + + it('should not change focus when Home is pressed on the first appointment', async () => { + setupSchedulerTestEnvironment(); + const { POM, keydown } = await createScheduler({ + dataSource, + currentView: 'day', + currentDate: new Date(2015, 1, 9), + }); + + const appointments = POM.getAppointments(); + const firstAppointment = appointments[0]; + + firstAppointment.element.focus(); + keydown(firstAppointment.element, 'Home'); + + expect(firstAppointment.isFocused()).toBe(true); + }); + + it('should not change focus when End is pressed on the last appointment', async () => { + setupSchedulerTestEnvironment(); + const { POM, keydown } = await createScheduler({ + dataSource, + currentView: 'day', + currentDate: new Date(2015, 1, 9), + }); + + const appointments = POM.getAppointments(); + const lastAppointment = appointments[2]; + + lastAppointment.element.focus(); + keydown(lastAppointment.element, 'End'); + + expect(lastAppointment.isFocused()).toBe(true); + }); + }); }); diff --git a/packages/devextreme/js/__internal/scheduler/appointments/m_appointments_kbn.ts b/packages/devextreme/js/__internal/scheduler/appointments/m_appointments_kbn.ts index 88124bb7beb2..9e6788d0827b 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/m_appointments_kbn.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/m_appointments_kbn.ts @@ -59,6 +59,8 @@ export class AppointmentsKeyboardNavigation { escape: this.escHandler.bind(this), del: this.delHandler.bind(this), tab: this.tabHandler.bind(this), + home: this.homeHandler.bind(this), + end: this.endHandler.bind(this), }; } @@ -87,8 +89,7 @@ export class AppointmentsKeyboardNavigation { $nextAppointment = this.getFocusableItemBySortedIndex(index); } - this.resetTabIndex($nextAppointment); - eventsEngine.trigger($nextAppointment, 'focus'); + this.focusItem($nextAppointment); } } @@ -115,4 +116,29 @@ export class AppointmentsKeyboardNavigation { resizableInstance._toggleResizingClass(false); } } + + private homeHandler(): void { + const $firstItem = this.getFocusableItems().first(); + + if (this.$focusedItem && $firstItem.is(this.$focusedItem)) { + return; + } + + this.focusItem($firstItem); + } + + private endHandler(): void { + const $lastItem = this.getFocusableItems().last(); + + if (this.$focusedItem && $lastItem.is(this.$focusedItem)) { + return; + } + + this.focusItem($lastItem); + } + + private focusItem($item: dxElementWrapper): void { + this.resetTabIndex($item); + eventsEngine.trigger($item, 'focus'); + } } diff --git a/packages/devextreme/js/__internal/scheduler/m_scheduler.ts b/packages/devextreme/js/__internal/scheduler/m_scheduler.ts index 0c635929bded..23fdd2f53413 100644 --- a/packages/devextreme/js/__internal/scheduler/m_scheduler.ts +++ b/packages/devextreme/js/__internal/scheduler/m_scheduler.ts @@ -991,7 +991,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { this._a11yStatus = createA11yStatusContainer(); this._a11yStatus.prependTo(this.$element()); // @ts-expect-error - this.setAria({ role: 'group' }); + this.setAria({ role: 'application' }); } _initMarkupOnResourceLoaded() { From 2328c455e2146aad66353f9aee17ceba60db4ddb Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 16 Feb 2026 15:59:20 +0800 Subject: [PATCH 02/10] add text to aria-describedby --- .../scheduler/__tests__/appointments.test.ts | 16 ++++++++++++++++ .../appointments/appointment/m_appointment.ts | 18 ++++++++++-------- .../appointments/appointment/text_utils.ts | 1 + .../js/localization/messages/ar.json | 1 + .../js/localization/messages/bg.json | 1 + .../js/localization/messages/ca.json | 1 + .../js/localization/messages/cs.json | 1 + .../js/localization/messages/da.json | 1 + .../js/localization/messages/de.json | 1 + .../js/localization/messages/el.json | 1 + .../js/localization/messages/en.json | 1 + .../js/localization/messages/es.json | 1 + .../js/localization/messages/fa.json | 1 + .../js/localization/messages/fi.json | 1 + .../js/localization/messages/fr.json | 4 +--- .../js/localization/messages/hu.json | 1 + .../js/localization/messages/it.json | 1 + .../js/localization/messages/ja.json | 1 + .../js/localization/messages/lt.json | 1 + .../js/localization/messages/lv.json | 1 + .../js/localization/messages/nb.json | 1 + .../js/localization/messages/nl.json | 1 + .../js/localization/messages/pl.json | 1 + .../js/localization/messages/pt.json | 1 + .../js/localization/messages/ro.json | 1 + .../js/localization/messages/ru.json | 1 + .../js/localization/messages/sl.json | 1 + .../js/localization/messages/sv.json | 1 + .../js/localization/messages/tr.json | 1 + .../js/localization/messages/uk.json | 1 + .../js/localization/messages/vi.json | 1 + .../js/localization/messages/zh-tw.json | 1 + .../js/localization/messages/zh.json | 1 + 33 files changed, 57 insertions(+), 11 deletions(-) diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts index 87c3852a9d3d..aa2074e24ec5 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts @@ -88,6 +88,22 @@ describe('Appointments', () => { } }); + it('should have aria-describedby attr', async () => { + setupSchedulerTestEnvironment(); + const { POM } = await createScheduler({ + dataSource: [{ + text: 'Appointment 1', + startDate: new Date(2015, 1, 9, 8), + endDate: new Date(2015, 1, 9, 9), + }], + currentView: 'day', + currentDate: new Date(2015, 1, 9, 8), + }); + + const appointment = POM.getAppointment(); + expect(appointment.element?.hasAttribute('aria-describedby')).toBe(true); + }); + describe('Keyboard Navigation', () => { const dataSource = [ { diff --git a/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts b/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts index d92be8078b3b..7c50ec2cc4d1 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts @@ -193,14 +193,16 @@ export class Appointment extends DOMComponent { // eslint-disable-next-line no-void void getAriaDescription(this.option()) .then((text) => { - if (text) { - const id = `dx-${new Guid()}`; - const $description = $element.find(`.${APPOINTMENT_CONTENT_CLASSES.ARIA_DESCRIPTION}`); - - if ($description) { - $element.attr('aria-describedby', id); - $description.text(text).attr('id', id); - } + if (!text) { + return; + } + + const id = `dx-${new Guid()}`; + const $description = $element.find(`.${APPOINTMENT_CONTENT_CLASSES.ARIA_DESCRIPTION}`); + + if ($description) { + $element.attr('aria-describedby', id); + $description.text(text).attr('id', id); } }); } diff --git a/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts b/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts index 3c8efe798b7c..ea259ecf1bc3 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts @@ -83,6 +83,7 @@ export const getAriaDescription = async (options: AppointmentProperties): Promis const texts = [ getGroupText(options), ...resources, + messageLocalization.format('dxScheduler-appointmentAriaLabel-hotkeys'), ].filter(Boolean); return texts.join('; '); diff --git a/packages/devextreme/js/localization/messages/ar.json b/packages/devextreme/js/localization/messages/ar.json index 2fd9446ec636..a6e327bfa479 100644 --- a/packages/devextreme/js/localization/messages/ar.json +++ b/packages/devextreme/js/localization/messages/ar.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/bg.json b/packages/devextreme/js/localization/messages/bg.json index 92b304373d28..1d29bac4e449 100644 --- a/packages/devextreme/js/localization/messages/bg.json +++ b/packages/devextreme/js/localization/messages/bg.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ca.json b/packages/devextreme/js/localization/messages/ca.json index 2e96b054aebe..fba281b22f9b 100644 --- a/packages/devextreme/js/localization/messages/ca.json +++ b/packages/devextreme/js/localization/messages/ca.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/cs.json b/packages/devextreme/js/localization/messages/cs.json index 7d6dce123b91..9015d822a172 100644 --- a/packages/devextreme/js/localization/messages/cs.json +++ b/packages/devextreme/js/localization/messages/cs.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/da.json b/packages/devextreme/js/localization/messages/da.json index 000af0913d61..9ce0f62c5ba0 100644 --- a/packages/devextreme/js/localization/messages/da.json +++ b/packages/devextreme/js/localization/messages/da.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Gruppe: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Tilbagevendende aftale", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Aftaleliste", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/de.json b/packages/devextreme/js/localization/messages/de.json index 820fbc1bb60e..2d86e69c0a8d 100644 --- a/packages/devextreme/js/localization/messages/de.json +++ b/packages/devextreme/js/localization/messages/de.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Gruppe: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Wiederkehrender Termin", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Terminliste", "dxScheduler-newPopupTitle": "Neuer Termin", diff --git a/packages/devextreme/js/localization/messages/el.json b/packages/devextreme/js/localization/messages/el.json index 76963c3d52a5..081364b541bb 100644 --- a/packages/devextreme/js/localization/messages/el.json +++ b/packages/devextreme/js/localization/messages/el.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/en.json b/packages/devextreme/js/localization/messages/en.json index f8493a9ee8e7..5ea40d8d6971 100644 --- a/packages/devextreme/js/localization/messages/en.json +++ b/packages/devextreme/js/localization/messages/en.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/es.json b/packages/devextreme/js/localization/messages/es.json index 34f15c972163..e75bd771e6bf 100644 --- a/packages/devextreme/js/localization/messages/es.json +++ b/packages/devextreme/js/localization/messages/es.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/fa.json b/packages/devextreme/js/localization/messages/fa.json index c07d06c1503b..c0cb58f202e8 100644 --- a/packages/devextreme/js/localization/messages/fa.json +++ b/packages/devextreme/js/localization/messages/fa.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/fi.json b/packages/devextreme/js/localization/messages/fi.json index bfcd789211ca..e5b803e41224 100644 --- a/packages/devextreme/js/localization/messages/fi.json +++ b/packages/devextreme/js/localization/messages/fi.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/fr.json b/packages/devextreme/js/localization/messages/fr.json index e75febe222be..bfaddf80d5ad 100644 --- a/packages/devextreme/js/localization/messages/fr.json +++ b/packages/devextreme/js/localization/messages/fr.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Groupe : {0}", "dxScheduler-appointmentAriaLabel-recurring": "Rendez-vous récurrent", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Liste des rendez-vous ", "dxScheduler-newPopupTitle": "Nouveau rendez-vous", @@ -588,7 +589,6 @@ "dxHtmlEditor-aiCommandChangeTone": "Changer le ton", "dxHtmlEditor-aiCommandTranslate": "Traduire", "dxHtmlEditor-aiCommandAskAI": "Demander à l’IA", - "dxHtmlEditor-aiCommandChangeStyleFormal": "Formel", "dxHtmlEditor-aiCommandChangeStyleInformal": "Informel", "dxHtmlEditor-aiCommandChangeStyleTechnical": "Technique", @@ -601,13 +601,11 @@ "dxHtmlEditor-aiCommandChangeStyleExpository": "Expositif", "dxHtmlEditor-aiCommandChangeStyleDescriptive": "Descriptif", "dxHtmlEditor-aiCommandChangeStyleConversational": "Conversationnel", - "dxHtmlEditor-aiCommandChangeToneProfessional": "Professionnel", "dxHtmlEditor-aiCommandChangeToneCasual": "Décontracté", "dxHtmlEditor-aiCommandChangeToneStraightforward": "Direct", "dxHtmlEditor-aiCommandChangeToneConfident": "Confiant", "dxHtmlEditor-aiCommandChangeToneFriendly": "Amical", - "dxHtmlEditor-aiCommandTranslateArabic": "Arabe", "dxHtmlEditor-aiCommandTranslateChinese": "Chinois", "dxHtmlEditor-aiCommandTranslateEnglish": "Anglais", diff --git a/packages/devextreme/js/localization/messages/hu.json b/packages/devextreme/js/localization/messages/hu.json index 0a07fa405a93..96a59474eb67 100644 --- a/packages/devextreme/js/localization/messages/hu.json +++ b/packages/devextreme/js/localization/messages/hu.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/it.json b/packages/devextreme/js/localization/messages/it.json index d3dec65cba7e..72ef2a65ac45 100644 --- a/packages/devextreme/js/localization/messages/it.json +++ b/packages/devextreme/js/localization/messages/it.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ja.json b/packages/devextreme/js/localization/messages/ja.json index 46ad5ee4dde4..4a59c109b8a1 100644 --- a/packages/devextreme/js/localization/messages/ja.json +++ b/packages/devextreme/js/localization/messages/ja.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/lt.json b/packages/devextreme/js/localization/messages/lt.json index 604ec07302ce..6c32a1388f94 100644 --- a/packages/devextreme/js/localization/messages/lt.json +++ b/packages/devextreme/js/localization/messages/lt.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/lv.json b/packages/devextreme/js/localization/messages/lv.json index 7c2e65d24e12..ae2ca4fb5c99 100644 --- a/packages/devextreme/js/localization/messages/lv.json +++ b/packages/devextreme/js/localization/messages/lv.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/nb.json b/packages/devextreme/js/localization/messages/nb.json index e35b82f3d5ab..ce63ca887d74 100644 --- a/packages/devextreme/js/localization/messages/nb.json +++ b/packages/devextreme/js/localization/messages/nb.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/nl.json b/packages/devextreme/js/localization/messages/nl.json index 221a58b307f3..fab4b086edc5 100644 --- a/packages/devextreme/js/localization/messages/nl.json +++ b/packages/devextreme/js/localization/messages/nl.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/pl.json b/packages/devextreme/js/localization/messages/pl.json index ffbb12ecb54c..d347468a8c96 100644 --- a/packages/devextreme/js/localization/messages/pl.json +++ b/packages/devextreme/js/localization/messages/pl.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/pt.json b/packages/devextreme/js/localization/messages/pt.json index 11d46de782cc..f1e7d5a3044c 100644 --- a/packages/devextreme/js/localization/messages/pt.json +++ b/packages/devextreme/js/localization/messages/pt.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Grupo: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Compromisso recorrente", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Lista de compromissos", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ro.json b/packages/devextreme/js/localization/messages/ro.json index 7a5ffb517ff9..5c1182ffcc50 100644 --- a/packages/devextreme/js/localization/messages/ro.json +++ b/packages/devextreme/js/localization/messages/ro.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ru.json b/packages/devextreme/js/localization/messages/ru.json index f6986284fced..7db5f527c9e3 100644 --- a/packages/devextreme/js/localization/messages/ru.json +++ b/packages/devextreme/js/localization/messages/ru.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/sl.json b/packages/devextreme/js/localization/messages/sl.json index 5d3b0832eaaf..a41c7d7c10d8 100644 --- a/packages/devextreme/js/localization/messages/sl.json +++ b/packages/devextreme/js/localization/messages/sl.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/sv.json b/packages/devextreme/js/localization/messages/sv.json index 7a140cf3ce4f..f9ddfbd8f64a 100644 --- a/packages/devextreme/js/localization/messages/sv.json +++ b/packages/devextreme/js/localization/messages/sv.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Grupp: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Återkommande bokning", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Bokningslista", "dxScheduler-newPopupTitle": "Ny bokning", diff --git a/packages/devextreme/js/localization/messages/tr.json b/packages/devextreme/js/localization/messages/tr.json index 76677399dcb6..cfbbfff07b76 100644 --- a/packages/devextreme/js/localization/messages/tr.json +++ b/packages/devextreme/js/localization/messages/tr.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/uk.json b/packages/devextreme/js/localization/messages/uk.json index 31a1f7141d12..13c27e45200f 100644 --- a/packages/devextreme/js/localization/messages/uk.json +++ b/packages/devextreme/js/localization/messages/uk.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Група: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Повторювана подія", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Список подій", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/vi.json b/packages/devextreme/js/localization/messages/vi.json index eb042eeeec46..de60bbfc2066 100644 --- a/packages/devextreme/js/localization/messages/vi.json +++ b/packages/devextreme/js/localization/messages/vi.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/zh-tw.json b/packages/devextreme/js/localization/messages/zh-tw.json index 3cb9d947df4e..998d79fa2126 100644 --- a/packages/devextreme/js/localization/messages/zh-tw.json +++ b/packages/devextreme/js/localization/messages/zh-tw.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/zh.json b/packages/devextreme/js/localization/messages/zh.json index 1a90edc4be73..73eef0ce2557 100644 --- a/packages/devextreme/js/localization/messages/zh.json +++ b/packages/devextreme/js/localization/messages/zh.json @@ -274,6 +274,7 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", + "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", From b595f9e6a7afaaf50d8ceff17f142e3735e0ccda Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 16 Feb 2026 18:04:48 +0800 Subject: [PATCH 03/10] fix tests --- .../tests/accessibility/scheduler/appointment.ts | 14 +++++++------- .../appointments/appointment/text_utils.test.ts | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/accessibility/scheduler/appointment.ts b/e2e/testcafe-devextreme/tests/accessibility/scheduler/appointment.ts index b9533979d68c..6a7727e2871a 100644 --- a/e2e/testcafe-devextreme/tests/accessibility/scheduler/appointment.ts +++ b/e2e/testcafe-devextreme/tests/accessibility/scheduler/appointment.ts @@ -16,7 +16,7 @@ const currentDate = Date.UTC(2021, 1, 1); const appointmentTemplate = ({ appointmentData }) => `
${appointmentData.text}
`; ['month', 'week', 'day', 'agenda'].forEach((currentView) => { - test(`appointment should have correct aria-label without description (${currentView})`, async (t) => { + test(`appointment should have correct aria-label and have description (${currentView})`, async (t) => { const scheduler = new Scheduler('#container'); const appointment = scheduler.getAppointment('App 1'); @@ -24,7 +24,7 @@ const appointmentTemplate = ({ appointmentData }) => `
${appointmentData.tex .expect(appointment.getAriaLabel()) .eql('App 1: February 1, 2021, 12:00 PM - 1:00 PM') .expect(await appointment.hasAriaDescription()) - .notOk(); + .ok(); await a11yCheck(t, a11yCheckConfig, '#container'); }).before(async () => { @@ -36,7 +36,7 @@ const appointmentTemplate = ({ appointmentData }) => `
${appointmentData.tex }); }); - test(`appointment with template should have correct aria-label without description (${currentView})`, async (t) => { + test(`appointment with template should have correct aria-label and have description (${currentView})`, async (t) => { const scheduler = new Scheduler('#container'); const appointment = scheduler.getAppointment('App 1'); @@ -44,7 +44,7 @@ const appointmentTemplate = ({ appointmentData }) => `
${appointmentData.tex .expect(appointment.getAriaLabel()) .eql('App 1: February 1, 2021, 12:00 PM - 1:00 PM') .expect(await appointment.hasAriaDescription()) - .notOk(); + .ok(); await a11yCheck(t, a11yCheckConfig, '#container'); }).before(async () => { @@ -65,7 +65,7 @@ const appointmentTemplate = ({ appointmentData }) => `
${appointmentData.tex .expect(appointment.getAriaLabel()) .eql('App 1: February 1, 2021, 12:00 PM - 1:00 PM') .expect(await appointment.getAriaDescription()) - .eql('Group: resource1; Group 1: resource1'); + .contains('Group: resource1; Group 1: resource1'); await a11yCheck(t, a11yCheckConfig, '#container'); }).before(async () => { @@ -99,7 +99,7 @@ const appointmentTemplate = ({ appointmentData }) => `
${appointmentData.tex .expect(appointment.getAriaLabel()) .eql('App 1: February 1, 2021, 12:00 PM - 1:00 PM') .expect(await appointment.getAriaDescription()) - .eql('Group: resource1; Group 1: resource1'); + .contains('Group: resource1; Group 1: resource1'); await a11yCheck(t, a11yCheckConfig, '#container'); }).before(async () => { @@ -134,7 +134,7 @@ const appointmentTemplate = ({ appointmentData }) => `
${appointmentData.tex .expect(appointment.getAriaLabel()) .eql('App 1: February 1, 2021, 12:00 PM - 1:00 PM') .expect(await appointment.getAriaDescription()) - .eql('Group: resource11, resource21; Group 1: resource11; Group 2: resource21, resource22'); + .contains('Group: resource11, resource21; Group 1: resource11; Group 2: resource21, resource22'); await a11yCheck(t, a11yCheckConfig, '#container'); }).before(async () => { diff --git a/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.test.ts b/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.test.ts index d3c80cffcf0c..f8423acebe58 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.test.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.test.ts @@ -83,7 +83,7 @@ describe('Appointment text utils', () => { expect(await getAriaDescription({ ...options, groupTexts: [], - })).toBe('Assignee: Samantha Bright'); + })).toContain('Assignee: Samantha Bright'); }); it('should return text with multiple resources', async () => { @@ -94,7 +94,7 @@ describe('Appointment text utils', () => { expect(await getAriaDescription({ ...options, groupTexts: [], - })).toBe('Assignee: Samantha Bright, John Heart; Room: Room 1'); + })).toContain('Assignee: Samantha Bright, John Heart; Room: Room 1'); }); it('should return text with group', async () => { @@ -103,7 +103,7 @@ describe('Appointment text utils', () => { ...options, groupIndex: 0, groupTexts: ['Samantha Bright'], - })).toBe('Group: Samantha Bright'); + })).toContain('Group: Samantha Bright'); }); it('should return text with multiple groups and resources', async () => { @@ -115,7 +115,7 @@ describe('Appointment text utils', () => { ...options, groupIndex: 1, groupTexts: ['Samantha Bright', 'Room 1'], - })).toBe('Group: Samantha Bright, Room 1; Assignee: Samantha Bright; Room: Room 1, Room 2'); + })).toContain('Group: Samantha Bright, Room 1; Assignee: Samantha Bright; Room: Room 1, Room 2'); }); }); }); From 904882f0892ebbd8131978b29e1e36496b8242fa Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 16 Feb 2026 20:39:14 +0800 Subject: [PATCH 04/10] apply copilot's review --- .../__tests__/__mock__/model/appointment.ts | 6 ++ .../scheduler/__tests__/appointments.test.ts | 102 ++++++++++++++---- .../appointments/appointment/m_appointment.ts | 12 +-- .../appointments/appointment/m_types.ts | 1 + .../appointments/appointment/text_utils.ts | 11 +- .../appointments/m_appointment_collection.ts | 5 +- .../appointments/m_appointments_kbn.ts | 8 +- .../js/localization/messages/ar.json | 3 +- .../js/localization/messages/bg.json | 3 +- .../js/localization/messages/ca.json | 3 +- .../js/localization/messages/cs.json | 3 +- .../js/localization/messages/da.json | 3 +- .../js/localization/messages/de.json | 3 +- .../js/localization/messages/el.json | 3 +- .../js/localization/messages/en.json | 3 +- .../js/localization/messages/es.json | 3 +- .../js/localization/messages/fa.json | 3 +- .../js/localization/messages/fi.json | 3 +- .../js/localization/messages/fr.json | 3 +- .../js/localization/messages/hu.json | 3 +- .../js/localization/messages/it.json | 3 +- .../js/localization/messages/ja.json | 3 +- .../js/localization/messages/lt.json | 3 +- .../js/localization/messages/lv.json | 3 +- .../js/localization/messages/nb.json | 3 +- .../js/localization/messages/nl.json | 3 +- .../js/localization/messages/pl.json | 3 +- .../js/localization/messages/pt.json | 3 +- .../js/localization/messages/ro.json | 3 +- .../js/localization/messages/ru.json | 3 +- .../js/localization/messages/sl.json | 3 +- .../js/localization/messages/sv.json | 3 +- .../js/localization/messages/tr.json | 3 +- .../js/localization/messages/uk.json | 3 +- .../js/localization/messages/vi.json | 3 +- .../js/localization/messages/zh-tw.json | 3 +- .../js/localization/messages/zh.json | 3 +- 37 files changed, 170 insertions(+), 65 deletions(-) diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/appointment.ts b/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/appointment.ts index 3298956f94aa..4a5cf02fd5cd 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/appointment.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/appointment.ts @@ -8,6 +8,7 @@ export interface AppointmentModel { getText: () => string; getDisplayDate: () => string; getAriaLabel: () => string; + getAriaDescription: () => string; getGeometry: () => Position; getColor: (view: string) => string | undefined; getSnapshot: () => object; @@ -46,6 +47,11 @@ export const createAppointmentModel = ( getText: () => getText(element), getDisplayDate: () => getDisplayDate(element), getAriaLabel: () => element?.getAttribute('aria-label') ?? '', + getAriaDescription: (): string => { + const id = element?.getAttribute('aria-describedby') ?? ''; + const descriptionElement = id ? document.getElementById(id) : null; + return descriptionElement?.textContent ?? ''; + }, getGeometry: () => getGeometry(element), getColor(view: string): string | undefined { if (!element) { diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts index aa2074e24ec5..41ea48b7f993 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts @@ -1,12 +1,17 @@ import { - afterEach, describe, expect, it, jest, + afterEach, beforeEach, describe, expect, it, jest, } from '@jest/globals'; +import messageLocalization from '@js/common/core/localization/message'; import $ from '@js/core/renderer'; import { createScheduler } from './__mock__/create_scheduler'; import { setupSchedulerTestEnvironment } from './__mock__/m_mock_scheduler'; describe('Appointments', () => { + beforeEach(() => { + setupSchedulerTestEnvironment(); + }); + afterEach(() => { const $scheduler = $('.dx-scheduler'); // @ts-expect-error @@ -16,7 +21,6 @@ describe('Appointments', () => { }); it('All-day appointment should not be resizable if current view is "day"', async () => { - setupSchedulerTestEnvironment(); const { POM } = await createScheduler({ dataSource: [{ text: 'Appointment 1', @@ -33,7 +37,6 @@ describe('Appointments', () => { }); it('should display "(No subject)" for appointments without title', async () => { - setupSchedulerTestEnvironment({ height: 200 }); const appointmentWithoutTitle = { startDate: new Date(2017, 4, 9, 9, 30), endDate: new Date(2017, 4, 9, 11), @@ -56,7 +59,6 @@ describe('Appointments', () => { }); it('should display "(No subject)" in tooltip for appointments without title', async () => { - setupSchedulerTestEnvironment({ height: 200 }); const appointmentWithoutTitle = { startDate: new Date(2017, 4, 9, 9, 30), endDate: new Date(2017, 4, 9, 11), @@ -88,20 +90,84 @@ describe('Appointments', () => { } }); - it('should have aria-describedby attr', async () => { - setupSchedulerTestEnvironment(); - const { POM } = await createScheduler({ - dataSource: [{ - text: 'Appointment 1', - startDate: new Date(2015, 1, 9, 8), - endDate: new Date(2015, 1, 9, 9), - }], - currentView: 'day', - currentDate: new Date(2015, 1, 9, 8), + describe('Appointment aria attributes', () => { + const deleteHotkeyText = messageLocalization.format('dxScheduler-appointmentAriaLabel-deleteHotkey'); + const homeEndHotkeysText = messageLocalization.format('dxScheduler-appointmentAriaLabel-homeEndHotkeys'); + + it('should have correct aria-describedby when editing = false', async () => { + const { POM } = await createScheduler({ + dataSource: [{ + text: 'Appointment 1', + startDate: new Date(2015, 1, 9, 8), + endDate: new Date(2015, 1, 9, 9), + }], + currentView: 'day', + currentDate: new Date(2015, 1, 9, 8), + editing: false, + }); + + const appointment = POM.getAppointment(); + expect(appointment.getAriaDescription()).toBe(homeEndHotkeysText); }); - const appointment = POM.getAppointment(); - expect(appointment.element?.hasAttribute('aria-describedby')).toBe(true); + it('should have correct aria-describedby when allowUpdating = true', async () => { + const { POM } = await createScheduler({ + dataSource: [{ + text: 'Appointment 1', + startDate: new Date(2015, 1, 9, 8), + endDate: new Date(2015, 1, 9, 9), + }], + currentView: 'day', + currentDate: new Date(2015, 1, 9, 8), + editing: { + allowUpdating: true, + }, + }); + + const appointment = POM.getAppointment(); + expect(appointment.getAriaDescription()).toBe(`${deleteHotkeyText}; ${homeEndHotkeysText}`); + }); + + it('should have correct aria-describedby when allowUpdating = true and allowDeleting = false', async () => { + const { POM } = await createScheduler({ + dataSource: [{ + text: 'Appointment 1', + startDate: new Date(2015, 1, 9, 8), + endDate: new Date(2015, 1, 9, 9), + }], + currentView: 'day', + currentDate: new Date(2015, 1, 9, 8), + editing: { + allowUpdating: true, + allowDeleting: false, + }, + }); + + const appointment = POM.getAppointment(); + expect(appointment.getAriaDescription()).toBe(homeEndHotkeysText); + }); + + it('should have correct aria-describedby when allowDeleting is updated', async () => { + const { scheduler, POM } = await createScheduler({ + dataSource: [{ + text: 'Appointment 1', + startDate: new Date(2015, 1, 9, 8), + endDate: new Date(2015, 1, 9, 9), + }], + currentView: 'day', + currentDate: new Date(2015, 1, 9, 8), + editing: { + allowUpdating: true, + allowDeleting: false, + }, + }); + + scheduler.option('editing.allowDeleting', true); + await new Promise(process.nextTick); + + const appointment = POM.getAppointment(); + expect(appointment.getAriaDescription()).toBe(`${deleteHotkeyText}; ${homeEndHotkeysText}`); + }); }); describe('Keyboard Navigation', () => { @@ -124,7 +190,6 @@ describe('Appointments', () => { ]; it('should focus first appointment on Home', async () => { - setupSchedulerTestEnvironment(); const { POM, keydown } = await createScheduler({ dataSource, currentView: 'day', @@ -143,7 +208,6 @@ describe('Appointments', () => { }); it('should focus last appointment on End', async () => { - setupSchedulerTestEnvironment(); const { POM, keydown } = await createScheduler({ dataSource, currentView: 'day', @@ -162,7 +226,6 @@ describe('Appointments', () => { }); it('should not change focus when Home is pressed on the first appointment', async () => { - setupSchedulerTestEnvironment(); const { POM, keydown } = await createScheduler({ dataSource, currentView: 'day', @@ -179,7 +242,6 @@ describe('Appointments', () => { }); it('should not change focus when End is pressed on the last appointment', async () => { - setupSchedulerTestEnvironment(); const { POM, keydown } = await createScheduler({ dataSource, currentView: 'day', diff --git a/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts b/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts index 7c50ec2cc4d1..b00534f0106a 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts @@ -193,17 +193,15 @@ export class Appointment extends DOMComponent { // eslint-disable-next-line no-void void getAriaDescription(this.option()) .then((text) => { - if (!text) { + const $description = $element.find(`.${APPOINTMENT_CONTENT_CLASSES.ARIA_DESCRIPTION}`); + + if (!text || !$description.length) { return; } const id = `dx-${new Guid()}`; - const $description = $element.find(`.${APPOINTMENT_CONTENT_CLASSES.ARIA_DESCRIPTION}`); - - if ($description) { - $element.attr('aria-describedby', id); - $description.text(text).attr('id', id); - } + $element.attr('aria-describedby', id); + $description.text(text).attr('id', id); }); } diff --git a/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_types.ts b/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_types.ts index 42daf2e45316..4b0e3bd34090 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_types.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_types.ts @@ -14,6 +14,7 @@ export interface AppointmentProperties extends Record { direction: Orientation; allowResize: boolean; allowDrag: boolean; + allowDelete: boolean; allDay: boolean; reduced: string; isCompact: boolean; diff --git a/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts b/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts index ea259ecf1bc3..63058c9efbe0 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts @@ -80,11 +80,14 @@ const getResourceText = async (options: AppointmentProperties): Promise => { const resources = await getResourceText(options); - const texts = [ + const text = [ getGroupText(options), ...resources, - messageLocalization.format('dxScheduler-appointmentAriaLabel-hotkeys'), - ].filter(Boolean); + options.allowDelete + ? messageLocalization.format('dxScheduler-appointmentAriaLabel-deleteHotkey') + : null, + messageLocalization.format('dxScheduler-appointmentAriaLabel-homeEndHotkeys'), + ].filter(Boolean).join('; '); - return texts.join('; '); + return text; }; diff --git a/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts b/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts index a03bf2f4aafc..f1a32bc4f6c3 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts @@ -223,6 +223,7 @@ class SchedulerAppointments extends CollectionWidget { break; case 'allowDrag': case 'allowResize': + case 'allowDelete': case 'allowAllDayResize': (this as any)._cleanFocusState(); this.forceRepaintAllAppointments(this.option('items') || []); @@ -232,8 +233,6 @@ class SchedulerAppointments extends CollectionWidget { this._kbn.resetTabIndex($(args.value)); super._optionChanged(args); break; - case 'allowDelete': - break; case 'focusStateEnabled': this._clearDropDownItemsElements(); this.renderDropDownAppointments(); @@ -619,6 +618,7 @@ class SchedulerAppointments extends CollectionWidget { ): void { const allowResize = this.option('allowResize') && !settings.skipResizing; const allowDrag = this.option('allowDrag'); + const allowDelete = this.option('allowDelete'); const { allDay } = settings; const { groups, groupsLeafs, resourceById } = this.getResourceManager(); const isGroupByDate = this.option('groupByDate'); @@ -631,6 +631,7 @@ class SchedulerAppointments extends CollectionWidget { direction: settings.direction || 'vertical', allowResize, allowDrag, + allowDelete, allDay, // NOTE: hide reduced icon for grouped by date workspace reduced: isGroupByDate ? undefined : settings.reduced, diff --git a/packages/devextreme/js/__internal/scheduler/appointments/m_appointments_kbn.ts b/packages/devextreme/js/__internal/scheduler/appointments/m_appointments_kbn.ts index 9e6788d0827b..56c01578c029 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/m_appointments_kbn.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/m_appointments_kbn.ts @@ -117,7 +117,9 @@ export class AppointmentsKeyboardNavigation { } } - private homeHandler(): void { + private homeHandler(e: DxEvent): void { + e.preventDefault(); + const $firstItem = this.getFocusableItems().first(); if (this.$focusedItem && $firstItem.is(this.$focusedItem)) { @@ -127,7 +129,9 @@ export class AppointmentsKeyboardNavigation { this.focusItem($firstItem); } - private endHandler(): void { + private endHandler(e: DxEvent): void { + e.preventDefault(); + const $lastItem = this.getFocusableItems().last(); if (this.$focusedItem && $lastItem.is(this.$focusedItem)) { diff --git a/packages/devextreme/js/localization/messages/ar.json b/packages/devextreme/js/localization/messages/ar.json index a6e327bfa479..b27c709daa13 100644 --- a/packages/devextreme/js/localization/messages/ar.json +++ b/packages/devextreme/js/localization/messages/ar.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/bg.json b/packages/devextreme/js/localization/messages/bg.json index 1d29bac4e449..a1042ec41f98 100644 --- a/packages/devextreme/js/localization/messages/bg.json +++ b/packages/devextreme/js/localization/messages/bg.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ca.json b/packages/devextreme/js/localization/messages/ca.json index fba281b22f9b..0de569282f36 100644 --- a/packages/devextreme/js/localization/messages/ca.json +++ b/packages/devextreme/js/localization/messages/ca.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/cs.json b/packages/devextreme/js/localization/messages/cs.json index 9015d822a172..30fa54ee0f83 100644 --- a/packages/devextreme/js/localization/messages/cs.json +++ b/packages/devextreme/js/localization/messages/cs.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/da.json b/packages/devextreme/js/localization/messages/da.json index 9ce0f62c5ba0..8a6f7ed7549c 100644 --- a/packages/devextreme/js/localization/messages/da.json +++ b/packages/devextreme/js/localization/messages/da.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Gruppe: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Tilbagevendende aftale", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Aftaleliste", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/de.json b/packages/devextreme/js/localization/messages/de.json index 2d86e69c0a8d..979e50fd6876 100644 --- a/packages/devextreme/js/localization/messages/de.json +++ b/packages/devextreme/js/localization/messages/de.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Gruppe: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Wiederkehrender Termin", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Terminliste", "dxScheduler-newPopupTitle": "Neuer Termin", diff --git a/packages/devextreme/js/localization/messages/el.json b/packages/devextreme/js/localization/messages/el.json index 081364b541bb..7a25b97bfefd 100644 --- a/packages/devextreme/js/localization/messages/el.json +++ b/packages/devextreme/js/localization/messages/el.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/en.json b/packages/devextreme/js/localization/messages/en.json index 5ea40d8d6971..f6ef7f9ac2cd 100644 --- a/packages/devextreme/js/localization/messages/en.json +++ b/packages/devextreme/js/localization/messages/en.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/es.json b/packages/devextreme/js/localization/messages/es.json index e75bd771e6bf..b0698a4b0303 100644 --- a/packages/devextreme/js/localization/messages/es.json +++ b/packages/devextreme/js/localization/messages/es.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/fa.json b/packages/devextreme/js/localization/messages/fa.json index c0cb58f202e8..483742bb2bcf 100644 --- a/packages/devextreme/js/localization/messages/fa.json +++ b/packages/devextreme/js/localization/messages/fa.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/fi.json b/packages/devextreme/js/localization/messages/fi.json index e5b803e41224..777d8ec5d0e2 100644 --- a/packages/devextreme/js/localization/messages/fi.json +++ b/packages/devextreme/js/localization/messages/fi.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/fr.json b/packages/devextreme/js/localization/messages/fr.json index bfaddf80d5ad..b8ce94451cb2 100644 --- a/packages/devextreme/js/localization/messages/fr.json +++ b/packages/devextreme/js/localization/messages/fr.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Groupe : {0}", "dxScheduler-appointmentAriaLabel-recurring": "Rendez-vous récurrent", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Liste des rendez-vous ", "dxScheduler-newPopupTitle": "Nouveau rendez-vous", diff --git a/packages/devextreme/js/localization/messages/hu.json b/packages/devextreme/js/localization/messages/hu.json index 96a59474eb67..c2325365a257 100644 --- a/packages/devextreme/js/localization/messages/hu.json +++ b/packages/devextreme/js/localization/messages/hu.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/it.json b/packages/devextreme/js/localization/messages/it.json index 72ef2a65ac45..713c7614cebc 100644 --- a/packages/devextreme/js/localization/messages/it.json +++ b/packages/devextreme/js/localization/messages/it.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ja.json b/packages/devextreme/js/localization/messages/ja.json index 4a59c109b8a1..a1bfb0185251 100644 --- a/packages/devextreme/js/localization/messages/ja.json +++ b/packages/devextreme/js/localization/messages/ja.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/lt.json b/packages/devextreme/js/localization/messages/lt.json index 6c32a1388f94..7e91a5d0714e 100644 --- a/packages/devextreme/js/localization/messages/lt.json +++ b/packages/devextreme/js/localization/messages/lt.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/lv.json b/packages/devextreme/js/localization/messages/lv.json index ae2ca4fb5c99..d7cf10113990 100644 --- a/packages/devextreme/js/localization/messages/lv.json +++ b/packages/devextreme/js/localization/messages/lv.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/nb.json b/packages/devextreme/js/localization/messages/nb.json index ce63ca887d74..71b82f0db0f7 100644 --- a/packages/devextreme/js/localization/messages/nb.json +++ b/packages/devextreme/js/localization/messages/nb.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/nl.json b/packages/devextreme/js/localization/messages/nl.json index fab4b086edc5..20804e577d57 100644 --- a/packages/devextreme/js/localization/messages/nl.json +++ b/packages/devextreme/js/localization/messages/nl.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/pl.json b/packages/devextreme/js/localization/messages/pl.json index d347468a8c96..f41dab01e17e 100644 --- a/packages/devextreme/js/localization/messages/pl.json +++ b/packages/devextreme/js/localization/messages/pl.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/pt.json b/packages/devextreme/js/localization/messages/pt.json index f1e7d5a3044c..a4bc73a9c846 100644 --- a/packages/devextreme/js/localization/messages/pt.json +++ b/packages/devextreme/js/localization/messages/pt.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Grupo: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Compromisso recorrente", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Lista de compromissos", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ro.json b/packages/devextreme/js/localization/messages/ro.json index 5c1182ffcc50..64fd445ca9c8 100644 --- a/packages/devextreme/js/localization/messages/ro.json +++ b/packages/devextreme/js/localization/messages/ro.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ru.json b/packages/devextreme/js/localization/messages/ru.json index 7db5f527c9e3..9536ab86d990 100644 --- a/packages/devextreme/js/localization/messages/ru.json +++ b/packages/devextreme/js/localization/messages/ru.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/sl.json b/packages/devextreme/js/localization/messages/sl.json index a41c7d7c10d8..304d88730e18 100644 --- a/packages/devextreme/js/localization/messages/sl.json +++ b/packages/devextreme/js/localization/messages/sl.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/sv.json b/packages/devextreme/js/localization/messages/sv.json index f9ddfbd8f64a..4dc96aa3d651 100644 --- a/packages/devextreme/js/localization/messages/sv.json +++ b/packages/devextreme/js/localization/messages/sv.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Grupp: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Återkommande bokning", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Bokningslista", "dxScheduler-newPopupTitle": "Ny bokning", diff --git a/packages/devextreme/js/localization/messages/tr.json b/packages/devextreme/js/localization/messages/tr.json index cfbbfff07b76..cecebfb82d7b 100644 --- a/packages/devextreme/js/localization/messages/tr.json +++ b/packages/devextreme/js/localization/messages/tr.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/uk.json b/packages/devextreme/js/localization/messages/uk.json index 13c27e45200f..bf2a3c06208a 100644 --- a/packages/devextreme/js/localization/messages/uk.json +++ b/packages/devextreme/js/localization/messages/uk.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Група: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Повторювана подія", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Список подій", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/vi.json b/packages/devextreme/js/localization/messages/vi.json index de60bbfc2066..837d6025ba1d 100644 --- a/packages/devextreme/js/localization/messages/vi.json +++ b/packages/devextreme/js/localization/messages/vi.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/zh-tw.json b/packages/devextreme/js/localization/messages/zh-tw.json index 998d79fa2126..a126de125b0f 100644 --- a/packages/devextreme/js/localization/messages/zh-tw.json +++ b/packages/devextreme/js/localization/messages/zh-tw.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/zh.json b/packages/devextreme/js/localization/messages/zh.json index 73eef0ce2557..fe7cd007da0b 100644 --- a/packages/devextreme/js/localization/messages/zh.json +++ b/packages/devextreme/js/localization/messages/zh.json @@ -274,7 +274,8 @@ "dxScheduler-appointmentAriaLabel-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-hotkeys": "Press Delete to delete this appointment. Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", + "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", From c537ff816514e73a74ebc2f048f347e62804f332 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 16 Feb 2026 20:53:18 +0800 Subject: [PATCH 05/10] add tests to check e.preventDefault() --- .../common/keyboardNavigation/appointments.ts | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts b/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts new file mode 100644 index 000000000000..74876ac75f24 --- /dev/null +++ b/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts @@ -0,0 +1,105 @@ +import Scheduler from 'devextreme-testcafe-models/scheduler'; +import { ClientFunction } from 'testcafe'; +import url from '../../../../helpers/getPageUrl'; +import { createWidget } from '../../../../helpers/createWidget'; + +fixture.disablePageReloads`KeyboardNavigation.Appointments` + .page(url(__dirname, '../../../container.html')); + +const PARENT_SELECTOR = '#parentContainer'; +const SCHEDULER_SELECTOR = '#container'; + +test('Document should not scroll on \'End\' press when appointment is focused', async (t) => { + const scheduler = new Scheduler(SCHEDULER_SELECTOR); + + await t + .click(scheduler.getAppointment('Appointment 1').element) + .pressKey('End'); + + const scrollTop = await ClientFunction(() => document.body.scrollTop)(); + + await t.expect(scrollTop).eql(0); +}).before(async () => { + ClientFunction((selector) => { + const parent = document.querySelector(selector) as HTMLElement; + parent.style.height = '2000px'; + })(PARENT_SELECTOR); + + await createWidget('dxScheduler', { + dataSource: [ + { + text: 'Appointment 1', + startDate: new Date(2015, 1, 9, 8), + endDate: new Date(2015, 1, 9, 9), + }, + { + text: 'Appointment 2', + startDate: new Date(2015, 1, 9, 10), + endDate: new Date(2015, 1, 9, 11), + }, + { + text: 'Appointment 3', + startDate: new Date(2015, 1, 9, 12), + endDate: new Date(2015, 1, 9, 13), + }, + ], + height: 300, + currentView: 'day', + currentDate: new Date(2015, 1, 9), + }); +}).after(async () => { + ClientFunction((selector) => { + const parent = document.querySelector(selector) as HTMLElement; + parent.style.height = ''; + })(PARENT_SELECTOR); +}); + +test('Document should not scroll on \'Home\' press when appointment is focused', async (t) => { + const scheduler = new Scheduler(SCHEDULER_SELECTOR); + const initialScrollTop = 40; + + await ClientFunction( + (scrollTop) => { document.body.scrollTop = scrollTop; }, + )(initialScrollTop); + + await t + .click(scheduler.getAppointment('Appointment 1').element) + .pressKey('Home'); + + const scrollTop = await ClientFunction(() => document.body.scrollTop)(); + + await t.expect(scrollTop).eql(initialScrollTop); +}).before(async () => { + ClientFunction((selector) => { + const parent = document.querySelector(selector) as HTMLElement; + parent.style.height = '2000px'; + })(PARENT_SELECTOR); + + await createWidget('dxScheduler', { + dataSource: [ + { + text: 'Appointment 1', + startDate: new Date(2015, 1, 9, 8), + endDate: new Date(2015, 1, 9, 9), + }, + { + text: 'Appointment 2', + startDate: new Date(2015, 1, 9, 10), + endDate: new Date(2015, 1, 9, 11), + }, + { + text: 'Appointment 3', + startDate: new Date(2015, 1, 9, 12), + endDate: new Date(2015, 1, 9, 13), + }, + ], + height: 300, + currentView: 'day', + currentDate: new Date(2015, 1, 9), + }); +}).after(async () => { + ClientFunction((selector) => { + const parent = document.querySelector(selector) as HTMLElement; + parent.style.height = ''; + })(PARENT_SELECTOR); +}); From b2a6d6c804ebba687cb1ac91413b02d0c4b52a05 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 16 Feb 2026 21:07:53 +0800 Subject: [PATCH 06/10] fix scrollTo usage --- .../scheduler/common/keyboardNavigation/appointments.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts b/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts index 74876ac75f24..912c114b13b3 100644 --- a/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts +++ b/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts @@ -16,7 +16,7 @@ test('Document should not scroll on \'End\' press when appointment is focused', .click(scheduler.getAppointment('Appointment 1').element) .pressKey('End'); - const scrollTop = await ClientFunction(() => document.body.scrollTop)(); + const scrollTop = await ClientFunction(() => document.documentElement.scrollTop)(); await t.expect(scrollTop).eql(0); }).before(async () => { @@ -59,14 +59,14 @@ test('Document should not scroll on \'Home\' press when appointment is focused', const initialScrollTop = 40; await ClientFunction( - (scrollTop) => { document.body.scrollTop = scrollTop; }, + (scrollTop) => { document.documentElement.scrollTo(0, scrollTop); }, )(initialScrollTop); await t .click(scheduler.getAppointment('Appointment 1').element) .pressKey('Home'); - const scrollTop = await ClientFunction(() => document.body.scrollTop)(); + const scrollTop = await ClientFunction(() => document.documentElement.scrollTop)(); await t.expect(scrollTop).eql(initialScrollTop); }).before(async () => { From 54409f5397c461a5ad8062d3058dadbc7fdbd028 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 16 Feb 2026 21:47:32 +0800 Subject: [PATCH 07/10] fix testcafe test --- .../scheduler/common/keyboardNavigation/appointments.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts b/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts index 912c114b13b3..ebbc0647e99e 100644 --- a/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts +++ b/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts @@ -56,13 +56,10 @@ test('Document should not scroll on \'End\' press when appointment is focused', test('Document should not scroll on \'Home\' press when appointment is focused', async (t) => { const scheduler = new Scheduler(SCHEDULER_SELECTOR); - const initialScrollTop = 40; - - await ClientFunction( - (scrollTop) => { document.documentElement.scrollTo(0, scrollTop); }, - )(initialScrollTop); + const initialScrollTop = 100; await t + .scroll(0, initialScrollTop) .click(scheduler.getAppointment('Appointment 1').element) .pressKey('Home'); From 10a7d5376a3012fbb188af7f7ab7cee998336ca5 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Tue, 17 Feb 2026 13:41:44 +0800 Subject: [PATCH 08/10] rewrite test --- .../common/keyboardNavigation/appointments.ts | 52 +++++++++---------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts b/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts index ebbc0647e99e..e9e97e80d4d4 100644 --- a/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts +++ b/e2e/testcafe-devextreme/tests/scheduler/common/keyboardNavigation/appointments.ts @@ -2,28 +2,27 @@ import Scheduler from 'devextreme-testcafe-models/scheduler'; import { ClientFunction } from 'testcafe'; import url from '../../../../helpers/getPageUrl'; import { createWidget } from '../../../../helpers/createWidget'; +import { getDocumentScrollTop } from '../../../../helpers/domUtils'; fixture.disablePageReloads`KeyboardNavigation.Appointments` .page(url(__dirname, '../../../container.html')); -const PARENT_SELECTOR = '#parentContainer'; const SCHEDULER_SELECTOR = '#container'; test('Document should not scroll on \'End\' press when appointment is focused', async (t) => { const scheduler = new Scheduler(SCHEDULER_SELECTOR); - await t - .click(scheduler.getAppointment('Appointment 1').element) - .pressKey('End'); + await t.click(scheduler.getAppointment('Appointment 1').element); - const scrollTop = await ClientFunction(() => document.documentElement.scrollTop)(); + const expectedScrollTop = await getDocumentScrollTop(); - await t.expect(scrollTop).eql(0); + await t + .pressKey('End') + .expect(getDocumentScrollTop()).eql(expectedScrollTop); }).before(async () => { - ClientFunction((selector) => { - const parent = document.querySelector(selector) as HTMLElement; - parent.style.height = '2000px'; - })(PARENT_SELECTOR); + await ClientFunction(() => { + document.body.style.height = '2000px'; + })(); await createWidget('dxScheduler', { dataSource: [ @@ -48,29 +47,27 @@ test('Document should not scroll on \'End\' press when appointment is focused', currentDate: new Date(2015, 1, 9), }); }).after(async () => { - ClientFunction((selector) => { - const parent = document.querySelector(selector) as HTMLElement; - parent.style.height = ''; - })(PARENT_SELECTOR); + await ClientFunction(() => { + document.body.style.height = ''; + })(); }); test('Document should not scroll on \'Home\' press when appointment is focused', async (t) => { const scheduler = new Scheduler(SCHEDULER_SELECTOR); - const initialScrollTop = 100; await t - .scroll(0, initialScrollTop) - .click(scheduler.getAppointment('Appointment 1').element) - .pressKey('Home'); + .scroll(0, 100) + .click(scheduler.getAppointment('Appointment 1').element); - const scrollTop = await ClientFunction(() => document.documentElement.scrollTop)(); + const expectedScrollTop = await getDocumentScrollTop(); - await t.expect(scrollTop).eql(initialScrollTop); + await t + .pressKey('Home') + .expect(getDocumentScrollTop()).eql(expectedScrollTop); }).before(async () => { - ClientFunction((selector) => { - const parent = document.querySelector(selector) as HTMLElement; - parent.style.height = '2000px'; - })(PARENT_SELECTOR); + await ClientFunction(() => { + document.body.style.height = '2000px'; + })(); await createWidget('dxScheduler', { dataSource: [ @@ -95,8 +92,7 @@ test('Document should not scroll on \'Home\' press when appointment is focused', currentDate: new Date(2015, 1, 9), }); }).after(async () => { - ClientFunction((selector) => { - const parent = document.querySelector(selector) as HTMLElement; - parent.style.height = ''; - })(PARENT_SELECTOR); + await ClientFunction(() => { + document.body.style.height = ''; + })(); }); From 59e93220c6d1ae3d5999a8a54eba9250e6841ced Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Tue, 17 Feb 2026 17:39:46 +0800 Subject: [PATCH 09/10] rename localization varaibles --- .../scheduler/appointments/appointment/text_utils.ts | 6 +++--- packages/devextreme/js/localization/messages/ar.json | 6 +++--- packages/devextreme/js/localization/messages/bg.json | 6 +++--- packages/devextreme/js/localization/messages/ca.json | 6 +++--- packages/devextreme/js/localization/messages/cs.json | 6 +++--- packages/devextreme/js/localization/messages/da.json | 6 +++--- packages/devextreme/js/localization/messages/de.json | 6 +++--- packages/devextreme/js/localization/messages/el.json | 6 +++--- packages/devextreme/js/localization/messages/en.json | 6 +++--- packages/devextreme/js/localization/messages/es.json | 6 +++--- packages/devextreme/js/localization/messages/fa.json | 6 +++--- packages/devextreme/js/localization/messages/fi.json | 6 +++--- packages/devextreme/js/localization/messages/fr.json | 6 +++--- packages/devextreme/js/localization/messages/hu.json | 6 +++--- packages/devextreme/js/localization/messages/it.json | 6 +++--- packages/devextreme/js/localization/messages/ja.json | 6 +++--- packages/devextreme/js/localization/messages/lt.json | 6 +++--- packages/devextreme/js/localization/messages/lv.json | 6 +++--- packages/devextreme/js/localization/messages/nb.json | 6 +++--- packages/devextreme/js/localization/messages/nl.json | 6 +++--- packages/devextreme/js/localization/messages/pl.json | 6 +++--- packages/devextreme/js/localization/messages/pt.json | 6 +++--- packages/devextreme/js/localization/messages/ro.json | 6 +++--- packages/devextreme/js/localization/messages/ru.json | 6 +++--- packages/devextreme/js/localization/messages/sl.json | 6 +++--- packages/devextreme/js/localization/messages/sv.json | 6 +++--- packages/devextreme/js/localization/messages/tr.json | 6 +++--- packages/devextreme/js/localization/messages/uk.json | 6 +++--- packages/devextreme/js/localization/messages/vi.json | 6 +++--- packages/devextreme/js/localization/messages/zh-tw.json | 6 +++--- packages/devextreme/js/localization/messages/zh.json | 6 +++--- 31 files changed, 93 insertions(+), 93 deletions(-) diff --git a/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts b/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts index 63058c9efbe0..610a7112ea29 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/appointment/text_utils.ts @@ -68,7 +68,7 @@ const getGroupText = (options: AppointmentProperties): string => { const groupText = options.groupTexts.join(', '); // @ts-ignore @ts-expect-error - return messageLocalization.format('dxScheduler-appointmentAriaLabel-group', groupText); + return messageLocalization.format('dxScheduler-appointmentAriaDescription-group', groupText); }; const getResourceText = async (options: AppointmentProperties): Promise => { @@ -84,9 +84,9 @@ export const getAriaDescription = async (options: AppointmentProperties): Promis getGroupText(options), ...resources, options.allowDelete - ? messageLocalization.format('dxScheduler-appointmentAriaLabel-deleteHotkey') + ? messageLocalization.format('dxScheduler-hotkeysAriaDescription-delete') : null, - messageLocalization.format('dxScheduler-appointmentAriaLabel-homeEndHotkeys'), + messageLocalization.format('dxScheduler-hotkeysAriaDescription-homeEnd'), ].filter(Boolean).join('; '); return text; diff --git a/packages/devextreme/js/localization/messages/ar.json b/packages/devextreme/js/localization/messages/ar.json index b27c709daa13..ccf0f4475004 100644 --- a/packages/devextreme/js/localization/messages/ar.json +++ b/packages/devextreme/js/localization/messages/ar.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/bg.json b/packages/devextreme/js/localization/messages/bg.json index a1042ec41f98..1b70be7dad7f 100644 --- a/packages/devextreme/js/localization/messages/bg.json +++ b/packages/devextreme/js/localization/messages/bg.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ca.json b/packages/devextreme/js/localization/messages/ca.json index 0de569282f36..7921028cacee 100644 --- a/packages/devextreme/js/localization/messages/ca.json +++ b/packages/devextreme/js/localization/messages/ca.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/cs.json b/packages/devextreme/js/localization/messages/cs.json index 30fa54ee0f83..6e031dab8034 100644 --- a/packages/devextreme/js/localization/messages/cs.json +++ b/packages/devextreme/js/localization/messages/cs.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/da.json b/packages/devextreme/js/localization/messages/da.json index 8a6f7ed7549c..5153d6a8b1d6 100644 --- a/packages/devextreme/js/localization/messages/da.json +++ b/packages/devextreme/js/localization/messages/da.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Gruppe: {0}", + "dxScheduler-appointmentAriaDescription-group": "Gruppe: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Tilbagevendende aftale", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Aftaleliste", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/de.json b/packages/devextreme/js/localization/messages/de.json index 979e50fd6876..6479f5b4580c 100644 --- a/packages/devextreme/js/localization/messages/de.json +++ b/packages/devextreme/js/localization/messages/de.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "Die aktuelle Zeitanzeige ist in der Ansicht sichtbar", "dxScheduler-ariaLabel-currentIndicator-not-present": "Die aktuelle Zeitanzeige ist auf dem Bildschirm nicht sichtbar", - "dxScheduler-appointmentAriaLabel-group": "Gruppe: {0}", + "dxScheduler-appointmentAriaDescription-group": "Gruppe: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Wiederkehrender Termin", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Terminliste", "dxScheduler-newPopupTitle": "Neuer Termin", diff --git a/packages/devextreme/js/localization/messages/el.json b/packages/devextreme/js/localization/messages/el.json index 7a25b97bfefd..ba4a6ad7ac70 100644 --- a/packages/devextreme/js/localization/messages/el.json +++ b/packages/devextreme/js/localization/messages/el.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/en.json b/packages/devextreme/js/localization/messages/en.json index f6ef7f9ac2cd..8716c6537340 100644 --- a/packages/devextreme/js/localization/messages/en.json +++ b/packages/devextreme/js/localization/messages/en.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/es.json b/packages/devextreme/js/localization/messages/es.json index b0698a4b0303..ede810cc4f99 100644 --- a/packages/devextreme/js/localization/messages/es.json +++ b/packages/devextreme/js/localization/messages/es.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/fa.json b/packages/devextreme/js/localization/messages/fa.json index 483742bb2bcf..f6b212f11cb1 100644 --- a/packages/devextreme/js/localization/messages/fa.json +++ b/packages/devextreme/js/localization/messages/fa.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/fi.json b/packages/devextreme/js/localization/messages/fi.json index 777d8ec5d0e2..1a6891fe9b9f 100644 --- a/packages/devextreme/js/localization/messages/fi.json +++ b/packages/devextreme/js/localization/messages/fi.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/fr.json b/packages/devextreme/js/localization/messages/fr.json index b8ce94451cb2..9f5726ff0242 100644 --- a/packages/devextreme/js/localization/messages/fr.json +++ b/packages/devextreme/js/localization/messages/fr.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "L'indicateur de temps actuel est visible dans la vue", "dxScheduler-ariaLabel-currentIndicator-not-present": "L'indicateur de l'heure actuelle n'est pas visible sur l'écran", - "dxScheduler-appointmentAriaLabel-group": "Groupe : {0}", + "dxScheduler-appointmentAriaDescription-group": "Groupe : {0}", "dxScheduler-appointmentAriaLabel-recurring": "Rendez-vous récurrent", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Liste des rendez-vous ", "dxScheduler-newPopupTitle": "Nouveau rendez-vous", diff --git a/packages/devextreme/js/localization/messages/hu.json b/packages/devextreme/js/localization/messages/hu.json index c2325365a257..af200ee4bb35 100644 --- a/packages/devextreme/js/localization/messages/hu.json +++ b/packages/devextreme/js/localization/messages/hu.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/it.json b/packages/devextreme/js/localization/messages/it.json index 713c7614cebc..4644b667a500 100644 --- a/packages/devextreme/js/localization/messages/it.json +++ b/packages/devextreme/js/localization/messages/it.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ja.json b/packages/devextreme/js/localization/messages/ja.json index a1bfb0185251..c93f3f37479f 100644 --- a/packages/devextreme/js/localization/messages/ja.json +++ b/packages/devextreme/js/localization/messages/ja.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/lt.json b/packages/devextreme/js/localization/messages/lt.json index 7e91a5d0714e..ed2477d2e04a 100644 --- a/packages/devextreme/js/localization/messages/lt.json +++ b/packages/devextreme/js/localization/messages/lt.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/lv.json b/packages/devextreme/js/localization/messages/lv.json index d7cf10113990..ae8abfa6b6a5 100644 --- a/packages/devextreme/js/localization/messages/lv.json +++ b/packages/devextreme/js/localization/messages/lv.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/nb.json b/packages/devextreme/js/localization/messages/nb.json index 71b82f0db0f7..e3d2ef5c87b9 100644 --- a/packages/devextreme/js/localization/messages/nb.json +++ b/packages/devextreme/js/localization/messages/nb.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/nl.json b/packages/devextreme/js/localization/messages/nl.json index 20804e577d57..040920019581 100644 --- a/packages/devextreme/js/localization/messages/nl.json +++ b/packages/devextreme/js/localization/messages/nl.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/pl.json b/packages/devextreme/js/localization/messages/pl.json index f41dab01e17e..b2c58d514d8d 100644 --- a/packages/devextreme/js/localization/messages/pl.json +++ b/packages/devextreme/js/localization/messages/pl.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/pt.json b/packages/devextreme/js/localization/messages/pt.json index a4bc73a9c846..639f1831179b 100644 --- a/packages/devextreme/js/localization/messages/pt.json +++ b/packages/devextreme/js/localization/messages/pt.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Grupo: {0}", + "dxScheduler-appointmentAriaDescription-group": "Grupo: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Compromisso recorrente", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Lista de compromissos", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ro.json b/packages/devextreme/js/localization/messages/ro.json index 64fd445ca9c8..575b8538eb4f 100644 --- a/packages/devextreme/js/localization/messages/ro.json +++ b/packages/devextreme/js/localization/messages/ro.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/ru.json b/packages/devextreme/js/localization/messages/ru.json index 9536ab86d990..11d5d1f13010 100644 --- a/packages/devextreme/js/localization/messages/ru.json +++ b/packages/devextreme/js/localization/messages/ru.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/sl.json b/packages/devextreme/js/localization/messages/sl.json index 304d88730e18..e8af068f4b4e 100644 --- a/packages/devextreme/js/localization/messages/sl.json +++ b/packages/devextreme/js/localization/messages/sl.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/sv.json b/packages/devextreme/js/localization/messages/sv.json index 4dc96aa3d651..fd0c909a8e22 100644 --- a/packages/devextreme/js/localization/messages/sv.json +++ b/packages/devextreme/js/localization/messages/sv.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "Aktuell tidsindikator visas i vyn", "dxScheduler-ariaLabel-currentIndicator-not-present": "Aktuell tidsindikator visas inte på skärmen", - "dxScheduler-appointmentAriaLabel-group": "Grupp: {0}", + "dxScheduler-appointmentAriaDescription-group": "Grupp: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Återkommande bokning", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Bokningslista", "dxScheduler-newPopupTitle": "Ny bokning", diff --git a/packages/devextreme/js/localization/messages/tr.json b/packages/devextreme/js/localization/messages/tr.json index cecebfb82d7b..cb7ad2144c0b 100644 --- a/packages/devextreme/js/localization/messages/tr.json +++ b/packages/devextreme/js/localization/messages/tr.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/uk.json b/packages/devextreme/js/localization/messages/uk.json index bf2a3c06208a..3715cda70b12 100644 --- a/packages/devextreme/js/localization/messages/uk.json +++ b/packages/devextreme/js/localization/messages/uk.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "Індикатор поточного часу відображається у поданні", "dxScheduler-ariaLabel-currentIndicator-not-present": "Індикатор поточного часу не відображається на екрані", - "dxScheduler-appointmentAriaLabel-group": "Група: {0}", + "dxScheduler-appointmentAriaDescription-group": "Група: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Повторювана подія", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Список подій", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/vi.json b/packages/devextreme/js/localization/messages/vi.json index 837d6025ba1d..461a6ed96473 100644 --- a/packages/devextreme/js/localization/messages/vi.json +++ b/packages/devextreme/js/localization/messages/vi.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/zh-tw.json b/packages/devextreme/js/localization/messages/zh-tw.json index a126de125b0f..d81a1446f323 100644 --- a/packages/devextreme/js/localization/messages/zh-tw.json +++ b/packages/devextreme/js/localization/messages/zh-tw.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", diff --git a/packages/devextreme/js/localization/messages/zh.json b/packages/devextreme/js/localization/messages/zh.json index fe7cd007da0b..0337590f72b7 100644 --- a/packages/devextreme/js/localization/messages/zh.json +++ b/packages/devextreme/js/localization/messages/zh.json @@ -272,10 +272,10 @@ "dxScheduler-ariaLabel-currentIndicator-present": "The current time indicator is visible in the view", "dxScheduler-ariaLabel-currentIndicator-not-present": "The current time indicator is not visible on the screen", - "dxScheduler-appointmentAriaLabel-group": "Group: {0}", + "dxScheduler-appointmentAriaDescription-group": "Group: {0}", "dxScheduler-appointmentAriaLabel-recurring": "Recurring appointment", - "dxScheduler-appointmentAriaLabel-deleteHotkey": "Press Delete to delete this appointment", - "dxScheduler-appointmentAriaLabel-homeEndHotkeys": "Press Home or End to quickly navigate to the first or last appointment", + "dxScheduler-hotkeysAriaDescription-delete": "Press Delete to delete this appointment", + "dxScheduler-hotkeysAriaDescription-homeEnd": "Press Home or End to quickly navigate to the first or last appointment", "dxScheduler-appointmentListAriaLabel": "Appointment list", "dxScheduler-newPopupTitle": "New Appointment", From 3e4a5e5634c36aaba89cfd063abd6c2bf6428239 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Tue, 17 Feb 2026 18:19:32 +0800 Subject: [PATCH 10/10] update localization var name in test --- .../js/__internal/scheduler/__tests__/appointments.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts index 41ea48b7f993..b02f955123f1 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts @@ -91,8 +91,8 @@ describe('Appointments', () => { }); describe('Appointment aria attributes', () => { - const deleteHotkeyText = messageLocalization.format('dxScheduler-appointmentAriaLabel-deleteHotkey'); - const homeEndHotkeysText = messageLocalization.format('dxScheduler-appointmentAriaLabel-homeEndHotkeys'); + const deleteHotkeyText = messageLocalization.format('dxScheduler-hotkeysAriaDescription-delete'); + const homeEndHotkeysText = messageLocalization.format('dxScheduler-hotkeysAriaDescription-homeEnd'); it('should have correct aria-describedby when editing = false', async () => { const { POM } = await createScheduler({