fix(json-csv): デバウンス中のダウンロードを抑止 (#184) - #187
Conversation
useCodec から isPending を取得し DownloadButton の disabled prop に渡すことで、 デバウンス中(タイピング直後)のダウンロードを防止する。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
レビュー結果PR #181 (#149) で 良い点
修正提案 / 指摘
質問
総じて、変更範囲・テスト粒度・規約準拠は良好で、上記は主に UX 一貫性と将来的な保守性に関する軽微な指摘です。 Generated by Claude Code |
レビュー指摘の訂正・撤回先ほどのレビューコメントで「[任意] E2E テストの 撤回理由
該当指摘は無視してください。他の指摘( Generated by Claude Code |
- DownloadButton の disabled 条件を `isPending` から `isPending || \!output` に変更し、 出力が空の状態でボタンが押せてしまう UX 不整合を解消(ConfigConverter 側と統一) - E2E テストコメントの「300ms」具体値を「useCodec の既定値」に抽象化し、 debounceMs 変更時にコメントが乖離するリスクを排除 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Deploying devtools with
|
| Latest commit: |
8dd06fb
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://f14acc6f.devtools-d9w.pages.dev |
| Branch Preview URL: | https://fix-issue-184-jsoncsv-deboun.devtools-d9w.pages.dev |
|
レビューありがとうございます。指摘内容を確認し、以下の対応を行いました。 採用した修正(2 件)[推奨] [任意] E2E コメントの 上記 2 件をまとめて 1 コミットにしました: 撤回された指摘(1 件)の確認
横展開確認(質問への回答)
Generated by Claude Code |
fumtas1k
left a comment
There was a problem hiding this comment.
概要
JsonCsv.tsx の useCodec 戻り値から isPending を取得し、DownloadButton の disabled に isPending || !output を渡すことで、デバウンス中に古い変換結果がダウンロードされる不整合を防ぐ修正です。PR #181(ConfigConverter)の横展開で、対応する E2E テストも 1 件追加されています。
良い点
- 責務分離が綺麗:
useCodecに既にisPendingが用意されており、UI 側は disabled に渡すだけで済んでいる。フック設計の意図に沿った最小差分の修正。 !outputも併せて disabled 条件に入れている:isPendingのみでなく出力が空の場合も無効化しているため、初期表示や無効入力時の誤操作も防げており、ConfigConverter側 (output ? <DownloadButton .../> : undefined) と機能的に等価な状態を保てている。- a11y 規約遵守:
DownloadButtonがdisabled時にcursor: not-allowedとcolors.muted系を切り替える既存実装の上に乗っており、a11y 属性の削除や Tailwind カラークラスの混入はない。 - 規約遵守: PR タイトル・本文は日本語、
--base develop指定済、コード内コメントも日本語でcolors.*利用が維持されている。 - E2E テストが同時に追加: 「初期 enable → 再入力で disable → デバウンス完了で再 enable」という遷移を 1 ケースで検証しており、回帰防止として十分。
指摘事項(必須対応)
なし。修正内容・テストともに規約とプロジェクト方針に合致しています。
改善提案(任意対応)
- [Minor] E2E テストの待機タイムアウトの根拠:
toBeEnabled({ timeout: 3000 })はuseCodecの既定debounceMs = 300に対して十分な余裕がありますが、将来debounceMsが変わった場合の意図が読みづらくなります。コメントに「既定 300ms に対する余裕」と一言添えるか、ヘルパー定数化しておくと保守性が上がります(必須ではありません)。 - [Minor] テスト名の表現: 「タイピング直後は disabled になり〜」は実際には
inputField.fillを 2 回呼んだうちの 2 回目以降の遷移を見ています。1 回目の fill 直後の disabled→enable も検証対象に含めると、より厳密にデバウンス挙動を保証できます(ただしフレーキー要因にもなり得るため、現状のままで実用上は十分です)。 - [Minor] ダウンロードハンドラの防御:
handleDownloadCsv内でif (!output) return;のガードがありますが、ボタン側でも!outputを disabled にしているので二重防御になっています。意図通りであれば問題なし。コメントとして明記しておくと将来の混乱を避けられます。 - [Minor] 横展開対象の確認:
useCodec+DownloadButtonの組み合わせがConfigConverter・JsonCsv以外にもあれば、同じ不整合が残っていないか別 issue でトラッキングしておくと良さそうです。
総評
approve 推奨(PR 作者本人レビューのため event は COMMENT で投稿)。
- 修正の意図と実装が一致し、フック側の既存 API(
isPending)をそのまま活用したミニマルかつ正しい変更です。 - E2E テストも同時に追加されており、
docs/shared-agent-rules.mdのテスト規約・言語規約・スタイリング規約・a11y 規約のいずれにも違反は見られません。 - 上記改善提案はいずれも任意で、本 PR をブロックする理由にはなりません。このままマージで問題ないと判断します。
Generated by Claude Code
|
直前のレビューで提案した「E2E テストのタイムアウトに根拠コメントを追加すべき」という指摘を訂正させてください。 Playwright 公式は web-first assertions( 本 PR の差分自体には影響しないため、コードベース全体の方針整理として別 issue #193 に切り出しました。混乱させてしまい申し訳ありません。 Generated by Claude Code |
|
コメントありがとうございます。issue #193 (E2E の web-first assertions / 個別 timeout 抑制方針) として別途切り出していただいたので、本 PR では追加対応不要と判断します。issue #194 (worktree 環境での E2E timeout 早期検出) と併せて、今後の E2E ガイドライン整備として継続フォローしていきます。 Generated by Claude Code |
- handleDownloadCsv 内の二重防御に意図を説明するコメントを追記 - E2E の toBeEnabled timeout: 3000 に debounceMs 根拠コメントを追記 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
レビューありがとうございます。改善提案 4 件について対応結果をご報告します。 採用(2 件)[Minor 採用] E2E テストのタイムアウト根拠コメント [Minor 採用] ダウンロードハンドラの二重防御コメント 不採用(2 件)[Minor 不採用] テスト名の表現(1 回目 fill 直後の disabled→enable 検証) [Minor 不採用] 横展開対象の確認 最終コミットSHA: Generated by Claude Code |
fumtas1k
left a comment
There was a problem hiding this comment.
再レビュー概要
前回レビューの指摘・改善提案について、採用 3 件・不採用 2 件(合理的判断)・撤回 1 件(issue #193 切り出し)が明確に整理され、最終 SHA 8dd06fb にて全て期待通り反映されていることを確認しました。差分は依然として最小(+28/-2、2 ファイル)で、規約遵守・テストカバレッジともに問題ありません。修正後の状態は十分にマージ可能 と判断します(PR 作者本人レビューのため event は COMMENT)。
前回指摘の対応確認
| # | 指摘内容 | 対応状況 | 確認箇所 |
|---|---|---|---|
| 1 | [推奨] disabled={isPending || !output} で空状態の UX 不整合解消・ConfigConverter との一貫性確保 |
✅ 対応済 | src/components/tools/JsonCsv.tsx の DownloadButton props で disabled={isPending || !output} を確認 |
| 2 | [Minor] E2E テストコメントから 300ms 具体値を除去(debounceMs 既定値変更時の乖離回避) |
✅ 対応済 | tests/e2e/json-csv.spec.ts:84 直前のコメントが「useCodec の既定 debounceMs(300ms)に対する余裕」表現に変更され、「既定値に対する余裕」という意図が明確化 |
| 3 | [Minor] handleDownloadCsv 内 if (!output) return; の二重防御をコメントで明示 |
✅ 対応済 | JsonCsv.tsx の同行直前に「ボタン側でも disabled={!output} で防御しているが念のため二重防御」コメントを確認 |
| 4 | [Minor] テスト名で 1 回目 fill 直後の disabled→enable も検証 |
N/A | フレーキー要因の懸念から不採用、合理的判断 |
| 5 | [Minor] useCodec × DownloadButton の他箇所横展開チェック |
✅ 対応済 | 回答コメントにて useCodec 利用 4 ファイル(JsonCsv / ConfigConverter / JsonXml / Base64Codec)を全数確認、ダウンロード機能を持つのは前 2 者のみで PR #181・#187 で網羅済みと整理 |
| 6 | [任意・撤回] toBeDisabled() への個別 timeout 明示 |
N/A | Playwright のベストプラクティス(web-first assertions + グローバル expect.timeout)に反するため撤回済。issue #193 として方針整備に切り出し |
新規指摘
なし。今回の修正で残課題は解消されています。
念のため最終差分を再確認しましたが、
- 言語規約(コミット・コメント・PR 本文すべて日本語)
- スタイリング規約(Tailwind カラークラス未使用、
DownloadButtonのcolors.*経由スタイルに依存) - a11y 属性(
aria-*/role=の不当な削除なし、disabled切替も既存DownloadButtonの cursor/colors 切替に乗っている) - React/TS 規約(
className/htmlForの崩れなし) - E2E テストの web-first assertions 利用(
toBeVisible/toBeEnabled/toBeDisabled、個別 timeout は debounce 待ちの 1 箇所のみで根拠コメント付き) - ベース ブランチ(
develop) - ドキュメント(本修正は単一バグ fix のため README/SPEC/decisions 更新不要)
いずれも規約に違反する箇所はありません。
総評
修正後 approve 推奨(PR 作者本人レビューのため event は COMMENT で投稿)。
- 前回の必須指摘・採用した改善提案はすべて反映済。
- 不採用 2 件・撤回 1 件いずれも理由が明確で、別 issue(#193 / #194)への切り出しも適切。
- このままマージで問題なしと判断します。
Generated by Claude Code
* chore(rules): E2E 実行責務をサブエージェントから親に移管 worktree 並列環境でのポート競合・sandbox 制約による誤報告を防ぐため、 サブエージェントの npm run test:e2e 実行を禁止し、親(司令塔)が代行する手順を 3 章に明文化する。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs(decisions): [056] E2E 実行責務移管の判断記録を追加 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(rules): レビュー反映(CLAUDE.md 整合・親向けチェックリスト追加・補足) - [Major 1] CLAUDE.md 検証行をサブエージェント向けに更新(npm run test:e2e は親が代行) - [Major 2] shared-agent-rules.md 3.2 直下に親向け push 前チェックリスト(表形式)を追加 - [Minor 3] 3.2 冒頭に dev server 残置時の停止依頼に関する補足を追記 - [Minor 4] push-前必須チェックリスト アンカー参照を grep 確認(該当なし、対応不要) - [任意 5] 環境由来の失敗例に Playwright 固有メッセージ(Timed out/webServer was not ready)を追記 - [任意 6] 3.2 手順 2 に npm run test:e2e -- <spec> でも可の旨を追記 - [任意 7] decisions.md [057] に将来の見直しトリガーを追記 - [任意 8] 3.2 末尾に関連 issue #193 への参照を追記 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(rules): 親向けレビュー取得手順を追記(取りこぼし防止) PR #187/#188/#189 で Reviews API を見落として正式レビューを取りこぼした事故を受け、 3.2 章「親向けレビュー取得手順」節を追加。Issue comments と Pull Request reviews の 両 API を確認するよう明示。decisions.md [057] に事故の経緯も追記。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
概要
JsonCsv.tsxのuseCodec戻り値からisPendingを取得し、CSV ダウンロードボタン(DownloadButton)のdisabledprop に渡すことで、デバウンス中(タイピング直後)に古い変換結果をダウンロードしてしまうバグを修正する。PR #181 (#149) で
ConfigConverter.tsxに入れた修正の横展開。変更内容
src/components/tools/JsonCsv.tsx:useCodecからisPendingを取得しDownloadButtonにdisabled={isPending}を設定tests/e2e/json-csv.spec.ts: タイピング直後にダウンロードボタンが disabled になり、デバウンス完了後に有効化されることを検証する E2E ケースを 1 件追加テスト
npm run test全件 pass(406 件)npm run test:e2e -- tests/e2e/json-csv.spec.ts全件 pass(9 件)Closes #184
🤖 Generated with Claude Code