-
Notifications
You must be signed in to change notification settings - Fork 141
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: 一括選択のチェックボックスに可視のラベルを追加 #4149
Conversation
✅ Deploy Preview for smarthr-ui ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
52bf4f7
to
28909fe
Compare
1664c1a
to
7c373bf
Compare
46ec2c2
to
776d1fd
Compare
776d1fd
to
2026c04
Compare
commit: |
} | ||
|
||
const CHECK_ALL_INVISIBLE_LABEL = 'すべての行を選択' | ||
const CHECK_ALL_INVISIBLE_LABEL = 'すべての項目を選択/解除' | ||
const CHECK_COLUMN_NAME = '選択' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
念の為なんですが、カラム名は選択でよさそうですか?(別のところで相談した時に選択で伝わるのか?と議論になったことがあり…)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Qs-F 別のところの議論が追えてないんですが、「選択」に自信があるわけではないです!議論のログがあれば参考にしたいっッス!(もしかしたら僕が覚えてないだけかもだけど)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Qs-F アクセシビリティ本部でもちょっと話したんですが、「選択」で良さそう(BestではないけどBetter)となったので、一旦「選択」で行きたいです!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
列としてマークアップされてるので「選択列」として理解できそうなので異論ないです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
良いと思います! 🙏
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(今更ですがすみません議論のログはないかもです…!入社前に相談させてもらった件のときに、どこかの飲み会だったかな…でmasuP9 sanの改善方法を見せたときに「選択でわかるんかな?」みたいな話になっただけなので…)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
細かいコメント入れました:pray:
あと原因はわかりませんが Firefox では可視ラベルが出なかったです。
2026c04
to
befa615
Compare
<Balloon horizontal="left" vertical="middle" className={balloonStyle}> | ||
<p className="shr-p-0.5">{checkAllInvisibleLabel}</p> | ||
</Balloon> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
label が許可する内容は記述コンテンツなので、Ballon や p を span にするしかなさそう。
// 位置はセルの真ん中(50%)+checkboxの幅の半分(8px)+outlineの幅(4px)+Balloonの矢印の幅(5px), sr-onlyで隠す | ||
'shr-absolute shr-left-[calc(50%+(theme(fontSize.base)/2)+4px+5px)] shr-sr-only', | ||
// labelの中の要素に hover or focus-visible がある時のスタイル。shr-absoluteはshr-not-sr-onlyのpositionをabsoluteに上書きしている | ||
'group-has-[:hover,:focus-visible]/label:shr-not-sr-only group-has-[:hover,:focus-visible]/label:shr-absolute group-has-[:hover,:focus-visible]/label:shr-whitespace-nowrap', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
group-has-[]
が Firefox で機能していませんでした。group-[:has()]
で回避はできそうです。
'group-has-[:hover,:focus-visible]/label:shr-not-sr-only group-has-[:hover,:focus-visible]/label:shr-absolute group-has-[:hover,:focus-visible]/label:shr-whitespace-nowrap', | |
'group-[:has(:hover,:focus-visible)]/label:shr-not-sr-only group-[:has(:hover,:focus-visible)]/label:shr-absolute group-[:has(:hover,:focus-visible)]/label:shr-whitespace-nowrap', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@uknmr 今の記載の方法でもFirefoxでも動いてると思うんだけど、ちょっと気づいたのは他のStoryからTableのStoryに遷移してきたタイミングだと、機能してないかも 😭 (再読み込みすると動く)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
謎ですね。Storybook 環境起因の可能性ありそうなので、棄却してプロダクトで問題出たら別途起票します!
const checkAllInvisibleLabel = | ||
decorators?.checkAllInvisibleLabel?.(CHECK_ALL_INVISIBLE_LABEL) || CHECK_ALL_INVISIBLE_LABEL | ||
const checkColumnName = decorators?.checkColumnName?.(CHECK_COLUMN_NAME) || CHECK_COLUMN_NAME |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
さすがに判定が多い & decoratorの中身の処理が確定していないのでmemo化したいかも。
const decoratedTexts = useMemo(() => {
let checkAllInvisibleLabel = CHECK_ALL_INVISIBLE_LABEL
let checkColumnName = CHECK_COLUMN_NAME
if (decorators) {
if (decorators.checkAllInvisibleLabel) {
checkAllInvisibleLabel = decorators.checkAllInvisibleLabel(CHECK_ALL_INVISIBLE_LABEL)
}
if (decorators.checkColumnName) {
checkColumnName = decorators.checkColumnName(CHECK_COLUMN_NAME)
}
}
return {
checkAllInvisibleLabel,
checkColumnName,
}
}, [decorators])
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@AtsushiM memo化しましたが、それぞれ別にmemo化しました〜。まとめるメリットとかあったら教えて下さいまし〜。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
一つにまとめるメリットは 更新時の判定が一度で済む
ことです。
特に今回のdecoratorsを見ているものの場合、一度目以降の判定で再生成されることは稀だと思われるため、判定回数が1/2になる、というメリットはあるかなぁという感じです。
まぁ分けてあっても微々たる差しかないと思いますので分離されていても特に問題ではないと思います!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あとは decoratorsで生成したテキスト
という概念を一つにまとめられるので、もっとdecoratorsが増えるとまとめたほうが良い気がしています。
まぁ今回は2つですし....
befa615
to
e12cd51
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
const checkAllInvisibleLabel = useMemo(() => { | ||
if (decorators && decorators.checkAllInvisibleLabel) { | ||
return decorators.checkAllInvisibleLabel(CHECK_ALL_INVISIBLE_LABEL) | ||
} | ||
|
||
return CHECK_ALL_INVISIBLE_LABEL | ||
}, [decorators]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
imo: こんな感じで書けそう(lint の関係で書けなかったらごめんなさい)
const checkAllInvisibleLabel = useMemo(() => { | |
if (decorators && decorators.checkAllInvisibleLabel) { | |
return decorators.checkAllInvisibleLabel(CHECK_ALL_INVISIBLE_LABEL) | |
} | |
return CHECK_ALL_INVISIBLE_LABEL | |
}, [decorators]) | |
const checkAllInvisibleLabel = useMemo( | |
() => decorators?.checkAllInvisibleLabel?.(CHECK_ALL_INVISIBLE_LABEL) || CHECK_ALL_INVISIBLE_LABEL, | |
[decorators] | |
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AtsuhiMが言う通り、判定多いので、その辺分かりやすい方が良いかなって思ったので今の判定で行きます!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
smarthr-ui 全体で見ると、decorator がそもそも分かりにくくて “翻訳のお決まりのやつ” 感があるので、他にならってもいいかも?
FilterDropdown や SortDropdown は多くて参考になりそうでした。
https://github.com/kufu/smarthr-ui/blob/34eee9bb4f5048c7dfdd9c7ad29117d9ad066804/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/FilterDropdown.tsx#L84C37-L103C4
smarthr-ui/packages/smarthr-ui/src/components/Dropdown/SortDropdown/useSortDropdown.ts
Lines 25 to 42 in 34eee9b
const sortFieldLabel = useMemo( | |
() => decorators?.sortFieldLabel?.(SORT_FIELD_LABEL) || SORT_FIELD_LABEL, | |
[decorators], | |
) | |
const sortOrderLabel = useMemo( | |
() => decorators?.sortOrderLabel?.(SORT_ORDER_LABEL) || SORT_ORDER_LABEL, | |
[decorators], | |
) | |
const ascLabel = useMemo(() => decorators?.ascLabel?.(ASC_LABEL) || ASC_LABEL, [decorators]) | |
const descLabel = useMemo(() => decorators?.descLabel?.(DESC_LABEL) || DESC_LABEL, [decorators]) | |
const applyButtonLabel = useMemo( | |
() => decorators?.applyButtonLabel?.(APPLY_BUTTON_TEXT) || APPLY_BUTTON_TEXT, | |
[decorators], | |
) | |
const cancelButtonLabel = useMemo( | |
() => decorators?.cancelButtonLabel?.(CANCEL_BUTTON_TEXT) || CANCEL_BUTTON_TEXT, | |
[decorators], | |
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overview
<Table>
のヘッダーセルにあるチェックボックスには、マシンリーダブルなラベルはあるが可視のラベルがなかったため追加。参考: フォーム: ウェブアクセシビリティ簡易チェックリスト | アクセシビリティ | SmartHR Design System
関連チケット
https://smarthr.atlassian.net/browse/SHRUI-1066
What I did
テキストラベルを表示するスペースがセル内に無いため、マウスポインターがホバーした際、またはフォーカスした際に、「すべての行を選択」のツールチップを出した。
ヘッダーセルを固定した際に、
<Table>
コンポーネントの描画範囲外が描画されなくなるため、ツールチップは右側に出した。(右側の見出しセルが見えなくなるけど。。。)その他
<ThCheckbox>
は<th>
でレンダリングされ、内包するコンテンツが「すべての行を選択」になるので、チェックボックスがあるカラムの名前が「すべての行を選択」になってしまう。そのことを回避するために
<th>
にaria-label
を付与し、内包するコンテンツを無視して「選択」というカラム名に変更した。