Skip to content

Commit 9f5ed00

Browse files
committed
✨(frontend) improve screen reader support in DocShare modal
adds relevant aria-labels to enhance accessibility for assistive technologies Signed-off-by: Cyril <[email protected]>
1 parent 2e64298 commit 9f5ed00

File tree

12 files changed

+75
-22
lines changed

12 files changed

+75
-22
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ and this project adheres to
1717
- ♿(frontend) improve ARIA in doc grid and editor for a11y #1519
1818
- ♿(frontend) improve accessibility and styling of summary table #1528
1919
- ♿(frontend) add focus trap and enter key support to remove doc modal #1531
20+
- ♿(frontend) improve screen reader support in DocShare modal #1628
2021
- 🐛(docx) fix image overflow by limiting width to 600px during export #1525
2122
- 🐛(frontend) preserve @ character when esc is pressed after typing it #1512
2223
- 🐛(frontend) make summary button fixed to remain visible during scroll #1581

src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ test.describe('Doc Header', () => {
208208
await expect(
209209
invitationCard.getByText('[email protected]').first(),
210210
).toBeVisible();
211-
const invitationRole = invitationCard.getByLabel('doc-role-dropdown');
211+
const invitationRole = invitationCard.getByTestId('doc-role-dropdown');
212212
await expect(invitationRole).toBeVisible();
213213

214214
await invitationRole.click();
@@ -217,7 +217,7 @@ test.describe('Doc Header', () => {
217217
await expect(invitationCard).toBeHidden();
218218

219219
const memberCard = shareModal.getByLabel('List members card');
220-
const roles = memberCard.getByLabel('doc-role-dropdown');
220+
const roles = memberCard.getByTestId('doc-role-dropdown');
221221
await expect(memberCard).toBeVisible();
222222
await expect(
223223
memberCard.getByText('[email protected]').first(),

src/frontend/apps/e2e/__tests__/app-impress/doc-member-create.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ test.describe('Document create member', () => {
7474
await expect(list.getByText(email)).toBeVisible();
7575

7676
// Check roles are displayed
77-
await list.getByLabel('doc-role-dropdown').click();
77+
await list.getByTestId('doc-role-dropdown').click();
7878
await expect(page.getByRole('menuitem', { name: 'Reader' })).toBeVisible();
7979
await expect(page.getByRole('menuitem', { name: 'Editor' })).toBeVisible();
8080
await expect(page.getByRole('menuitem', { name: 'Owner' })).toBeVisible();
@@ -128,7 +128,7 @@ test.describe('Document create member', () => {
128128

129129
// Choose a role
130130
const container = page.getByTestId('doc-share-add-member-list');
131-
await container.getByLabel('doc-role-dropdown').click();
131+
await container.getByTestId('doc-role-dropdown').click();
132132
await page.getByRole('menuitem', { name: 'Owner' }).click();
133133

134134
const responsePromiseCreateInvitation = page.waitForResponse(
@@ -146,7 +146,7 @@ test.describe('Document create member', () => {
146146
await page.getByTestId(`search-user-row-${email}`).click();
147147

148148
// Choose a role
149-
await container.getByLabel('doc-role-dropdown').click();
149+
await container.getByTestId('doc-role-dropdown').click();
150150
await page.getByRole('menuitem', { name: 'Owner' }).click();
151151

152152
const responsePromiseCreateInvitationFail = page.waitForResponse(
@@ -183,7 +183,7 @@ test.describe('Document create member', () => {
183183

184184
// Choose a role
185185
const container = page.getByTestId('doc-share-add-member-list');
186-
await container.getByLabel('doc-role-dropdown').click();
186+
await container.getByTestId('doc-role-dropdown').click();
187187
await page.getByRole('menuitem', { name: 'Administrator' }).click();
188188

189189
const responsePromiseCreateInvitation = page.waitForResponse(
@@ -210,7 +210,7 @@ test.describe('Document create member', () => {
210210
response.request().method() === 'PATCH',
211211
);
212212

213-
await userInvitation.getByLabel('doc-role-dropdown').click();
213+
await userInvitation.getByTestId('doc-role-dropdown').click();
214214
await page.getByRole('menuitem', { name: 'Reader' }).click();
215215

216216
const responsePatchInvitation = await responsePromisePatchInvitation;
@@ -272,7 +272,7 @@ test.describe('Document create member', () => {
272272
const container = page.getByTestId(
273273
`doc-share-access-request-row-${emailRequest}`,
274274
);
275-
await container.getByLabel('doc-role-dropdown').click();
275+
await container.getByTestId('doc-role-dropdown').click();
276276
await page.getByRole('menuitem', { name: 'Administrator' }).click();
277277
await container.getByRole('button', { name: 'Approve' }).click();
278278

src/frontend/apps/e2e/__tests__/app-impress/doc-member-list.spec.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ test.describe('Document list members', () => {
152152
const currentUser = list.getByTestId(
153153
`doc-share-member-row-user.test@${browserName}.test`,
154154
);
155-
const currentUserRole = currentUser.getByLabel('doc-role-dropdown');
155+
const currentUserRole = currentUser.getByTestId('doc-role-dropdown');
156156
await expect(currentUser).toBeVisible();
157157
await expect(currentUserRole).toBeVisible();
158158
await currentUserRole.click();
@@ -169,7 +169,7 @@ test.describe('Document list members', () => {
169169
});
170170
const newUserEmail = await addNewMember(page, 0, 'Owner');
171171
const newUser = list.getByTestId(`doc-share-member-row-${newUserEmail}`);
172-
const newUserRoles = newUser.getByLabel('doc-role-dropdown');
172+
const newUserRoles = newUser.getByTestId('doc-role-dropdown');
173173

174174
await expect(newUser).toBeVisible();
175175

@@ -214,9 +214,7 @@ test.describe('Document list members', () => {
214214

215215
const emailMyself = `user.test@${browserName}.test`;
216216
const mySelf = list.getByTestId(`doc-share-member-row-${emailMyself}`);
217-
const mySelfRole = mySelf.getByRole('button', {
218-
name: 'doc-role-dropdown',
219-
});
217+
const mySelfRole = mySelf.getByTestId('doc-role-dropdown');
220218

221219
const userOwnerEmail = await addNewMember(page, 0, 'Owner');
222220
const userOwner = list.getByTestId(
@@ -231,9 +229,7 @@ test.describe('Document list members', () => {
231229
const userReader = list.getByTestId(
232230
`doc-share-member-row-${userReaderEmail}`,
233231
);
234-
const userReaderRole = userReader.getByRole('button', {
235-
name: 'doc-role-dropdown',
236-
});
232+
const userReaderRole = userReader.getByTestId('doc-role-dropdown');
237233

238234
await expect(mySelf).toBeVisible();
239235
await expect(userOwner).toBeVisible();

src/frontend/apps/e2e/__tests__/app-impress/doc-tree.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ test.describe('Doc Tree', () => {
226226
const currentUser = list.getByTestId(
227227
`doc-share-member-row-user.test@${browserName}.test`,
228228
);
229-
const currentUserRole = currentUser.getByLabel('doc-role-dropdown');
229+
const currentUserRole = currentUser.getByTestId('doc-role-dropdown');
230230
await currentUserRole.click();
231231
await page.getByRole('menuitem', { name: 'Administrator' }).click();
232232
await list.click();

src/frontend/apps/e2e/__tests__/app-impress/utils-share.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ export const addNewMember = async (
3838
await page.getByRole('option', { name: users[index].email }).click();
3939

4040
// Choose a role
41-
await page.getByLabel('doc-role-dropdown').click();
41+
await page.getByTestId('doc-role-dropdown').click();
4242
await page.getByRole('menuitem', { name: role }).click();
43-
await page.getByRole('button', { name: 'Invite' }).click();
43+
await page.getByRole('button', { name: /^Invite / }).click();
4444

4545
return users[index].email;
4646
};
@@ -74,7 +74,7 @@ export const updateRoleUser = async (
7474
const list = page.getByTestId('doc-share-quick-search');
7575

7676
const currentUser = list.getByTestId(`doc-share-member-row-${email}`);
77-
const currentUserRole = currentUser.getByLabel('doc-role-dropdown');
77+
const currentUserRole = currentUser.getByTestId('doc-role-dropdown');
7878
await currentUserRole.click();
7979
await page.getByRole('menuitem', { name: role }).click();
8080
await list.click();

src/frontend/apps/impress/src/components/quick-search/QuickSearch.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export const QuickSearch = ({
6969
label={label}
7070
shouldFilter={false}
7171
ref={ref}
72-
tabIndex={0}
72+
tabIndex={-1}
7373
value={selectedValue}
7474
onValueChange={handleValueChange}
7575
>

src/frontend/apps/impress/src/features/docs/doc-share/components/DocRoleDropdown.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type DocRoleDropdownProps = {
1818
onSelectRole: (role: Role) => void;
1919
rolesAllowed?: Role[];
2020
isLastOwner?: boolean;
21+
ariaLabel?: string;
2122
};
2223

2324
export const DocRoleDropdown = ({
@@ -29,6 +30,7 @@ export const DocRoleDropdown = ({
2930
rolesAllowed,
3031
access,
3132
isLastOwner = false,
33+
ariaLabel,
3234
}: DocRoleDropdownProps) => {
3335
const { t } = useTranslation();
3436
const { transRole, translatedRoles } = useTrans();
@@ -113,11 +115,15 @@ export const DocRoleDropdown = ({
113115
return (
114116
<DropdownMenu
115117
topMessage={topMessage}
116-
label="doc-role-dropdown"
118+
label={t('{{action}}, current role: {{role}}', {
119+
action: ariaLabel,
120+
role: transRole(currentRole),
121+
})}
117122
showArrow={true}
118123
arrowCss={css`
119124
color: var(--c--theme--colors--primary-800) !important;
120125
`}
126+
testId="doc-role-dropdown"
121127
options={[
122128
...roles,
123129
{

src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareAccessRequest.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ const DocShareAccessRequestItem = ({ doc, accessRequest }: Props) => {
7878
onSelectRole={setRole}
7979
canUpdate={doc.abilities.accesses_manage}
8080
rolesAllowed={accessRequest.abilities.set_role_to}
81+
ariaLabel={t('Change role for {{name}}', {
82+
name: accessRequest.user.full_name || accessRequest.user.email,
83+
})}
8184
/>
8285
<Button
8386
color="tertiary"

src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareInvitation.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ export const DocShareInvitationItem = ({
112112
canUpdate={canUpdate}
113113
doc={doc}
114114
access={invitation}
115+
ariaLabel={t('Change role for {{email}}', {
116+
email: invitation.email,
117+
})}
115118
/>
116119

117120
{canUpdate && (

0 commit comments

Comments
 (0)