Skip to content
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

Merged
merged 3 commits into from
Oct 17, 2024

Conversation

masuP9
Copy link
Contributor

@masuP9 masuP9 commented Dec 27, 2023

Overview

<Table> のヘッダーセルにあるチェックボックスには、マシンリーダブルなラベルはあるが可視のラベルがなかったため追加。

参考: フォーム: ウェブアクセシビリティ簡易チェックリスト | アクセシビリティ | SmartHR Design System

関連チケット
https://smarthr.atlassian.net/browse/SHRUI-1066

入力する内容や、操作がラベルとして表示されている

What I did

テキストラベルを表示するスペースがセル内に無いため、マウスポインターがホバーした際、またはフォーカスした際に、「すべての行を選択」のツールチップを出した。

ツールチップのスクリーンショット。チェックボックスの右側に「すべての行を選択」と書かれた吹き出しが表示されている。

ヘッダーセルを固定した際に、<Table> コンポーネントの描画範囲外が描画されなくなるため、ツールチップは右側に出した。(右側の見出しセルが見えなくなるけど。。。)

その他

<ThCheckbox><th> でレンダリングされ、内包するコンテンツが「すべての行を選択」になるので、チェックボックスがあるカラムの名前が「すべての行を選択」になってしまう。

そのことを回避するために <th>aria-label を付与し、内包するコンテンツを無視して「選択」というカラム名に変更した。

Copy link

netlify bot commented Dec 27, 2023

Deploy Preview for smarthr-ui ready!

Name Link
🔨 Latest commit 7c373bf
🔍 Latest deploy log https://app.netlify.com/sites/smarthr-ui/deploys/658d140a9ec5550008aa3c94
😎 Deploy Preview https://deploy-preview-4149--smarthr-ui.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site configuration.

@masuP9 masuP9 force-pushed the feat/table-header-input-label branch from 52bf4f7 to 28909fe Compare December 28, 2023 05:37
@masuP9 masuP9 changed the title Feat/table header input label feat: 一括選択のチェックボックスに可視のラベルを追加 Dec 28, 2023
@masuP9 masuP9 force-pushed the feat/table-header-input-label branch 2 times, most recently from 1664c1a to 7c373bf Compare December 28, 2023 06:22
@masuP9 masuP9 force-pushed the feat/table-header-input-label branch 2 times, most recently from 46ec2c2 to 776d1fd Compare May 9, 2024 08:52
@masuP9 masuP9 force-pushed the feat/table-header-input-label branch from 776d1fd to 2026c04 Compare October 3, 2024 06:54
Copy link

pkg-pr-new bot commented Oct 3, 2024

Open in Stackblitz

pnpm add https://pkg.pr.new/kufu/smarthr-ui@4149

commit: e12cd51

@masuP9 masuP9 marked this pull request as ready for review October 3, 2024 07:02
@masuP9 masuP9 requested a review from a team as a code owner October 3, 2024 07:02
@masuP9 masuP9 requested review from AtsushiM, atzzCokeK, daiHash, uknmr and Qs-F and removed request for a team October 3, 2024 07:02
}

const CHECK_ALL_INVISIBLE_LABEL = 'すべての行を選択'
const CHECK_ALL_INVISIBLE_LABEL = 'すべての項目を選択/解除'
const CHECK_COLUMN_NAME = '選択'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

念の為なんですが、カラム名は選択でよさそうですか?(別のところで相談した時に選択で伝わるのか?と議論になったことがあり…)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Qs-F 別のところの議論が追えてないんですが、「選択」に自信があるわけではないです!議論のログがあれば参考にしたいっッス!(もしかしたら僕が覚えてないだけかもだけど)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Qs-F アクセシビリティ本部でもちょっと話したんですが、「選択」で良さそう(BestではないけどBetter)となったので、一旦「選択」で行きたいです!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

列としてマークアップされてるので「選択列」として理解できそうなので異論ないです。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

良いと思います! 🙏

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(今更ですがすみません議論のログはないかもです…!入社前に相談させてもらった件のときに、どこかの飲み会だったかな…でmasuP9 sanの改善方法を見せたときに「選択でわかるんかな?」みたいな話になっただけなので…)

Copy link
Collaborator

@uknmr uknmr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かいコメント入れました:pray:
あと原因はわかりませんが Firefox では可視ラベルが出なかったです。

packages/smarthr-ui/src/components/Table/ThCheckbox.tsx Outdated Show resolved Hide resolved
packages/smarthr-ui/src/components/Table/ThCheckbox.tsx Outdated Show resolved Hide resolved
packages/smarthr-ui/src/components/Table/ThCheckbox.tsx Outdated Show resolved Hide resolved
@masuP9 masuP9 force-pushed the feat/table-header-input-label branch from 2026c04 to befa615 Compare October 3, 2024 11:29
Comment on lines 55 to 69
<Balloon horizontal="left" vertical="middle" className={balloonStyle}>
<p className="shr-p-0.5">{checkAllInvisibleLabel}</p>
</Balloon>
Copy link
Collaborator

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',
Copy link
Collaborator

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()] で回避はできそうです。

Suggested change
'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',

Copy link
Contributor Author

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に遷移してきたタイミングだと、機能してないかも 😭 (再読み込みすると動く)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

謎ですね。Storybook 環境起因の可能性ありそうなので、棄却してプロダクトで問題出たら別途起票します!

Comment on lines 47 to 49
const checkAllInvisibleLabel =
decorators?.checkAllInvisibleLabel?.(CHECK_ALL_INVISIBLE_LABEL) || CHECK_ALL_INVISIBLE_LABEL
const checkColumnName = decorators?.checkColumnName?.(CHECK_COLUMN_NAME) || CHECK_COLUMN_NAME
Copy link
Member

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])

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AtsushiM memo化しましたが、それぞれ別にmemo化しました〜。まとめるメリットとかあったら教えて下さいまし〜。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

一つにまとめるメリットは 更新時の判定が一度で済む ことです。
特に今回のdecoratorsを見ているものの場合、一度目以降の判定で再生成されることは稀だと思われるため、判定回数が1/2になる、というメリットはあるかなぁという感じです。
まぁ分けてあっても微々たる差しかないと思いますので分離されていても特に問題ではないと思います!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あとは decoratorsで生成したテキスト という概念を一つにまとめられるので、もっとdecoratorsが増えるとまとめたほうが良い気がしています。
まぁ今回は2つですし....

@masuP9 masuP9 force-pushed the feat/table-header-input-label branch from befa615 to e12cd51 Compare October 9, 2024 05:29
Copy link
Collaborator

@uknmr uknmr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment on lines +47 to +53
const checkAllInvisibleLabel = useMemo(() => {
if (decorators && decorators.checkAllInvisibleLabel) {
return decorators.checkAllInvisibleLabel(CHECK_ALL_INVISIBLE_LABEL)
}

return CHECK_ALL_INVISIBLE_LABEL
}, [decorators])
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

imo: こんな感じで書けそう(lint の関係で書けなかったらごめんなさい)

Suggested change
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]
)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AtsuhiMが言う通り、判定多いので、その辺分かりやすい方が良いかなって思ったので今の判定で行きます!

Copy link
Collaborator

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

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],
)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@uknmr @masuP9
個人的には↑レベルでdecoratosが多いと更新判定のdecoratorsのチェックも馬鹿にならんのでuseMemoを一つにまとめるのもありかなぁ〜と思います

@masuP9 masuP9 merged commit cfd9fb8 into master Oct 17, 2024
31 checks passed
@masuP9 masuP9 deleted the feat/table-header-input-label branch October 17, 2024 01:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants