A11Y: Improve accessibility of embedded replies below post

The changes are:

* Add an aria-label for the button that embeds/expand the replies of a
post below it
* Add an aria-label for the button that collapses the embedded replies
* Add an aria-label to describe the embedded replies section when
expanded and an aria-label for each embedded reply
This commit is contained in:
OsamaSayegh 2022-03-30 00:43:27 +03:00 committed by Osama Sayegh
parent fd26facdf3
commit ca58d80b0c
4 changed files with 47 additions and 13 deletions

View File

@ -21,24 +21,34 @@ createWidget("post-link-arrow", {
}); });
export default createWidget("embedded-post", { export default createWidget("embedded-post", {
tagName: "div.reply",
buildKey: (attrs) => `embedded-post-${attrs.id}`, buildKey: (attrs) => `embedded-post-${attrs.id}`,
buildAttributes(attrs) {
const attributes = { "data-post-id": attrs.id };
if (this.state.role) {
attributes.role = this.state.role;
}
if (this.state["aria-label"]) {
attributes["aria-label"] = this.state["aria-label"];
}
return attributes;
},
html(attrs, state) { html(attrs, state) {
attrs.embeddedPost = true; attrs.embeddedPost = true;
return [ return [
h("div.reply", { attributes: { "data-post-id": attrs.id } }, [ h("div.row", [
h("div.row", [ this.attach("post-avatar", attrs),
this.attach("post-avatar", attrs), h("div.topic-body", [
h("div.topic-body", [ h("div.topic-meta-data.embedded-reply", [
h("div.topic-meta-data.embedded-reply", [ this.attach("poster-name", attrs),
this.attach("poster-name", attrs), this.attach("post-link-arrow", {
this.attach("post-link-arrow", { above: state.above,
above: state.above, shareUrl: attrs.customShare,
shareUrl: attrs.customShare, }),
}),
]),
new PostCooked(attrs, new DecoratorHelper(this), this.currentUser),
]), ]),
new PostCooked(attrs, new DecoratorHelper(this), this.currentUser),
]), ]),
]), ]),
]; ];

View File

@ -270,6 +270,10 @@ registerButton("replies", (attrs, state, siteSettings) => {
return; return;
} }
let ariaPressed;
if (!siteSettings.enable_filtered_replies_view) {
ariaPressed = state.repliesShown ? "true" : "false";
}
return { return {
action, action,
icon, icon,
@ -284,6 +288,10 @@ registerButton("replies", (attrs, state, siteSettings) => {
label: attrs.mobileView ? "post.has_replies_count" : "post.has_replies", label: attrs.mobileView ? "post.has_replies_count" : "post.has_replies",
iconRight: !siteSettings.enable_filtered_replies_view || attrs.mobileView, iconRight: !siteSettings.enable_filtered_replies_view || attrs.mobileView,
disabled: !!attrs.deleted, disabled: !!attrs.deleted,
translatedAriaLabel: I18n.t("post.sr_expand_replies", {
count: replyCount,
}),
ariaPressed,
}; };
}); });

View File

@ -464,7 +464,16 @@ createWidget("post-contents", {
result.push( result.push(
h("section.embedded-posts.bottom", [ h("section.embedded-posts.bottom", [
repliesBelow.map((p) => { repliesBelow.map((p) => {
return this.attach("embedded-post", p, { model: p.asPost }); return this.attach("embedded-post", p, {
model: p.asPost,
state: {
role: "region",
"aria-label": I18n.t("post.sr_embedded_reply_description", {
post_number: attrs.post_number,
username: p.username,
}),
},
});
}), }),
this.attach("button", { this.attach("button", {
title: "post.collapse", title: "post.collapse",
@ -472,6 +481,7 @@ createWidget("post-contents", {
action: "toggleRepliesBelow", action: "toggleRepliesBelow",
actionParam: "true", actionParam: "true",
className: "btn collapse-up", className: "btn collapse-up",
translatedAriaLabel: I18n.t("post.sr_collapse_replies"),
}), }),
]) ])
); );

View File

@ -3065,7 +3065,13 @@ en:
show_hidden: "View ignored content." show_hidden: "View ignored content."
deleted_by_author_simple: "(post deleted by author)" deleted_by_author_simple: "(post deleted by author)"
collapse: "collapse" collapse: "collapse"
sr_collapse_replies: "Collapse embedded replies"
sr_expand_replies:
one: "This post has %{count} reply. Click to expand"
other: "This post has %{count} replies. Click to expand"
expand_collapse: "expand/collapse" expand_collapse: "expand/collapse"
sr_below_embedded_posts_description: "post #%{post_number} replies"
sr_embedded_reply_description: "reply by @%{username} to post #%{post_number}"
locked: "a staff member has locked this post from being edited" locked: "a staff member has locked this post from being edited"
gap: gap:
one: "view %{count} hidden reply" one: "view %{count} hidden reply"