Skip to content

feat(classroom,admin): お知らせ通知センターと課題共有パイプライン (#1111 #1110 #1106)#1120

Merged
smalruby3-editor-bot[bot] merged 32 commits into
developfrom
topic/classroom-notification-center
Jul 26, 2026
Merged

feat(classroom,admin): お知らせ通知センターと課題共有パイプライン (#1111 #1110 #1106)#1120
smalruby3-editor-bot[bot] merged 32 commits into
developfrom
topic/classroom-notification-center

Conversation

@smalruby3-editor-bot

Copy link
Copy Markdown

Summary

クラス管理「お知らせ通知センター」と課題共有パイプラインの 3 EPIC を実装。運営(Admin)が良い課題を見つけ → 作成した先生に届け → 先生が「みんなの課題」へ公開する一連の流れを支える。

紹介プレゼン: docs/classroom-notification-center/(集約ページ + スクリーンショット)。

EPICs

アーキテクチャの芯

  • 単一ライター: ClassroomNotifications は classroom スタック所有・admin スタックは write-only grant。先生 API は一覧/既読のみ。偽造不可を IAM でも担保。
  • 公開は先生本人(CC BY 同意)。運営は代理公開しない。内部 ID(teacherSub / 推薦者 email)は先生 UI に出さない。
  • 推薦/推奨は通知→印付け順・条件式で冪等、取り消しは静か、全操作 audit。

Deploy

  • infra prod デプロイ済み(ClassroomStack / AdminStack): 新テーブル ClassroomNotifications + 新ルート群。新エンドポイントは prod で 401(認証で保護)を確認。
  • フロント(scratch-gui / admin SPA)は本 PR マージ時の CI ビルドで prod(GitHub Pages)へ反映。

Test

  • unit: classroom infra / admin infra / admin SPA / scratch-gui(お知らせ・推薦・共有推奨・アバター・ページネーション等)
  • stg で 3 EPIC 通し + 実 API スモーク済み。各機能に敵対レビュー実施(Must 対応済み)。
  • スタブ式 Playwright 検証: tools/playwright-verify/verify-{notification-center,shared-recommendation,share-suggestion}.mjs

Related

Closes #1111 #1110 #1106

🤖 Generated with Claude Code

smalruby3-editor-bot Bot and others added 30 commits July 25, 2026 16:06
お知らせセンターの土台。ClassroomNotifications テーブル (PK teacherSub /
SK notificationId=createdAt接頭辞) と、先生向けの GET /notifications
(一覧+未読数) / POST /notifications/mark-read (ids省略で全既読) を追加。

設計上の分岐点 (このコミットに立ち戻ればやり直せる):
- D1 置き場所: 汎用お知らせ基盤ではなく classroom スタック所有にした。
  受信者が先生 (teacherSub) で、既存の先生 ID Token 認証をそのまま
  読み出しに使えるため。書き込みは admin スタックが名前規約 import で
  行う (SharedAssignments と同じ N2 維持の形)。代替案: admin スタック
  所有 (先生の読み出し認可を admin 側に作る必要があり不採用)
- D2 既読API: mark-read は notificationIds 省略時に直近50件窓の未読を
  全既読化 (パネルを開いたらバッジが消える UX 前提)。代替案: 1件ずつ
  既読 (クリック時に都度更新。API往復が増えるため不採用)
- D3 保持期間: TTL は書き手 (admin スタック) が付与する。通知は短命な
  案内でありレコードではないため DESTROY / stream なし

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
POST /admin/notifications。SPA からは classroomId だけを送り、宛先の
teacherSub はサーバー側で解決して ClassroomNotifications へ書き込む。
テーブルは classroom スタック所有を名前規約 import (N2) し、この
スタックが単一の書き手 (write-only grant)。全送信を audit() 記録。

設計上の分岐点 (このコミットに立ち戻ればやり直せる):
- D4 宛先指定: teacherSub を admin SPA へ渡さず classroomId で指定。
  admin 投影が authorSub/teacherSub を意図的に隠す既存原則の踏襲。
  代替案: teacherSub 直接指定 (内部IDの露出が増えるため不採用)
- D5 grant: 読みを許可せず grantWriteData のみ。読み出し導線は
  先生側 (classroom API) に限定し、単一ライターの非対称を IAM でも
  表現。代替案: RW grant (送信履歴の admin 表示が必要になったら拡張)
- link.kind は whitelist ('classroom' のみ)。後続 Issue (#1110/#1106)
  で kind を増やす際はここに追加する

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
クラス検索/俯瞰候補から開くクラス詳細の下部に「先生へのお知らせ」
パネルを追加。タイトル+本文を入力し、既存の二段階確認 (arm/confirm)
を通って POST /admin/notifications を呼ぶ。

設計上の分岐点 (このコミットに立ち戻ればやり直せる):
- D6 送信UIの置き場所: クラス詳細 (ClassroomDetail) 内に配置。
  俯瞰の有益候補クリック→詳細→送信、検索→詳細→送信の両動線が
  1 箇所で済むため。代替案: 専用タブ/俯瞰の行内ボタン (対象クラスの
  文脈確認なしに送れてしまうため不採用)
- 既存の mutation 規約 (二段階確認・本文必須で無効化) を踏襲

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
先生モーダルのタイトルバー (× の左隣) に 🔔 ボタン + 未読バッジを
追加。クリックでお知らせ一覧パネルを開き、開いた時点で全既読化。
お知らせの link.kind='classroom' クリックで該当クラスのボード文脈
(クラス選択→課題詳細) へジャンプする。60 秒間隔でポーリング。

設計上の分岐点 (このコミットに立ち戻ればやり直せる):
- D7 アイコン: 絵文字 🔔 を採用。classroom UI は絵文字/テキスト
  バッジが既存慣行 (⚠ など) で新規 SVG アセット不要のため。
  代替案: icon--*.svg (menu-bar の慣行。視覚統一が必要になれば移行)
- D8 既読化: パネルを開いた時点で mark-read (全件)。バッジは即消え、
  未読ドットは取得済み readAt のままなのでその場では見分けられる。
  代替案: アイテムクリックごとに個別既読 (API往復増のため不採用)
- D9 更新間隔: 専用フックで 60 秒ポーリング。既存の 30 秒クラス一覧
  リフレッシュへの相乗りはフック間結合が増えるため不採用
- D10 通知取得エラーは黙殺 (401 のみ再認証へ)。通知障害がクラス管理
  本体を壊さないため
- 配置: logout を right 4.5rem→7.5rem、email を 10.5rem→13.5rem へ
  ずらし、🔔 を 4.5rem (× の隣) に置いた

検証: jest 19 件 + headless Playwright (APIスタブ) 9/9 チェック合格

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- architecture.md: /notifications ルート表 + ClassroomNotifications
  データモデル (単一ライター設計の説明つき)
- source-code.md: 新規ファイル・ハンドラ関数
- ui-ux.md: 1.8 お知らせセンター (data-testid 一覧 + スクリーンショット 0218)
- admin/README.md: 送信フォームの説明 + スクリーンショット 0106
- tools/playwright-verify/verify-notification-center.mjs: API スタブ式の
  リグレッションスクリプト (stg 不要で 9 チェック)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
レビュー (PR #1113) の指摘への対応:

- [Must] 通知タイムスタンプを toLocaleString でローカルタイム表示に
  (ISO slice だと UTC のまま出て日本では 9 時間ずれる)
- [Question] handleToggleNotifications の副作用を state updater の外へ
  (StrictMode/concurrent で updater が再実行されても二重送信しない)
- [FYI] link.kind の whitelist 検証を putNotification 内へ移動
  (呼び出し側ハードコードで dead code だったのを、将来の送信経路
  すべてが通る位置に)
- [FYI] mark-read: body が JSON 配列のとき 400 (暗黙の全既読を防ぐ)、
  id は 200 文字上限 (DynamoDB ValidationException→500 ではなく 400)
- [FYI] classroom Lambda の通知テーブル grant を Query/UpdateItem のみに
  縮小 (PutItem を外し「エディタから偽造不可」を IAM でも担保)
- [FYI] use-teacher-notifications のフックユニットテストを追加 (6件:
  interval 停止・開いたら一度だけ mark-read・401 再認証・リセット)
- [FYI] .claude/rules/infra/smalruby-classroom.md のテーブル一覧の
  ドリフト解消 (4→8 テーブル)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(classroom): クラス管理右上のお知らせ通知センター (#1111)
admin API に POST/DELETE /admin/shared-assignments/{id}/recommend を追加。
推薦時は recommendedAt/recommendedBy を記録し、著者の先生へお知らせ
センター (#1111) 経由で通知(link.kind='shared-mine')。取り消しは
静かに解除(audit のみ)。一覧に visibility フィルタを追加。
先生側 API (mapSharedSummary) には boolean の recommended だけを投影。

設計上の分岐点 (このコミットに立ち戻ればやり直せる):
- D11 推薦の保存先: SharedAssignments 項目に直接 recommendedAt/By を
  持たせた (admin は既に同テーブルのモデレーション書込 grant を保有)。
  代替案: 別テーブル (結合が増えるだけなので不採用)
- D12 対象: status='published' なら visibility を問わず推薦可 (EPIC の
  主対象は限定公開だが、公開項目の推薦印も後続で意味を持ちうる)。
  unlisted (取り下げ) は 404
- D13 通知: 推薦時のみ・冪等 (既推薦なら no-op で再通知しない)。
  通知の put は best-effort にせず失敗を運営に見せる (通知が主目的)
- D14 露出: 先生側には recommended (boolean) のみ。recommendedBy
  (admin email) は先生に出さない。admin にも passcode は出さない

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
みんなの課題ビューに「限定公開」タブ (visibility フィルタ) を追加し、
一覧行と詳細に 限定公開/推薦中 バッジを表示。詳細に「推薦する/
推薦を取り消す」を非公開化とは独立した二段階確認で追加。

設計上の分岐点:
- D15 推薦候補の見せ方: 専用タブ (限定公開) を追加。すべての投稿に
  フィルタ UI を足す案より、運営の定常動線 (限定公開を巡回→推薦) が
  1 クリックで出るタブを採用
- 推薦の確認文言に「先生にお知らせが届きます」を明記 (通知が飛ぶ
  操作であることを操作時点で意識させる)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
みんなの課題の「自分の投稿」カードに 限定公開/推薦 バッジを表示。
自分の限定公開の詳細に「みんなの課題に公開する」CTA を追加し、
共有フォームを編集モード (initialValues・classroomId なし) で再利用
して PATCH visibility='public' + CC BY 同意で全体公開に広げる。
推薦通知 (link.kind='shared-mine') のジャンプ先として「自分の投稿」
を直接開く handleOpenCatalogMine を追加。

設計上の分岐点 (このコミットに立ち戻ればやり直せる):
- D16 推薦印の場所: 「自分の投稿」一覧のカード (先生の共有課題の
  一覧=ボード) に表示。クラスの課題ボード行への表示は共有項目が
  元 classroomId を持たないため今回のスコープ外 (必要なら共有時に
  sourceClassroomId を保存する追加が要る)
- D17 発展フォーム: 新規フォームを作らず SharedAssignmentForm を
  編集モード対応に拡張して再利用 (バリデーション/文言が公開時と
  完全一致し、二重管理を避ける)。CC BY 同意は編集モードでも必須
- D18 ジャンプの文脈: カタログはボード内サブビューのため、クラス
  未選択時はアクティブな先頭クラスを開いてから表示 (専用フェーズの
  新設はナビ構造の変更が大きく不採用)

検証: jest 22件 + headless Playwright 12/12 (通知ジャンプ→バッジ→
発展フォーム→PATCH payload まで)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- assignment-sharing/README.md: 限定公開と運営の推薦セクション
  (パイプライン図・発展フロー・スクリーンショット 0105/0106)
- classroom/architecture.md: recommendedAt/By と admin ルートの説明
- classroom/testing.md: 新 data-testid 5 件
- admin/README.md: 限定公開タブ + 推薦操作 + スクリーンショット 0107
- tools/playwright-verify/README.md: verify-shared-recommendation.mjs

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
レビュー (PR #1114) の指摘への対応:

- [Must] shared-mine 通知ジャンプ: クラス選択済みでも必ず
  handleSelectGroup でボードへ戻してからカタログを開く (課題詳細など
  別フェーズでは無反応になっていた)。クラスが 1 つも無い場合は
  黙殺せずエラー表示 (i18n 追加)
- [Must] broadenTarget/broadenDone をカタログの開閉・タブ切替で必ず
  リセット (古い公開フォーム/完了メッセージが再表示されるリーク)
- [Question] 推薦を limited のみに制限 (公開項目への推薦は通知文が
  意味を成さない)。推薦取り消しは公開に広がった後も可能なまま。
  D12 の決定をレビューを受けて改訂
- [Question+FYI] 通知→印付けの順に変更 + ConditionExpression で冪等を
  原子化 (印付け成功後の通知失敗が回復不能だった / 同時 POST の二重
  通知防止)。最悪ケースは通知の重複 (無害) に倒す
- [FYI] #1109 の潜在バグ修正: 限定公開→全体公開の PATCH で明示的な
  null クリア (コマ数・所属) が既存値へ巻き戻っていた (?? → undefined
  判定に統一)。回帰テスト追加
- [FYI] 境界テスト追加: 先生 PATCH が recommendedAt/By を無視する
  whitelist の pin、投影に recommendedBy が漏れない検証

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…1110

feat(admin,classroom,gui): Admin による課題推薦 — 限定公開→みんなの課題への発展 (#1110)
admin API に POST/DELETE /admin/classrooms/{id}/recommend-sharing を
追加。推奨時は recommendedForSharingAt/By を Classrooms 項目に記録し、
作成した先生へお知らせ (#1111・type 'share_suggestion'・link kind
'classroom') を送る。先生側 API には boolean の recommendedForSharing
だけを投影。

俯瞰ダッシュボードの有益候補が常に空になるバグを修正:
classroom-overview.ts が課題コンテンツを row.content で読んでいたが、
classroom item の実フィールド名は assignment (content は
SharedAssignments 側の名前)。実データに対して richness が常に 0 →
score>=3 の候補ゼロだった。回帰テストでフィールド名を pin。

設計上の分岐点 (このコミットに立ち戻ればやり直せる):
- D19 フラグの置き場所: Classrooms 項目に直接 (課題=Classroom レコード
  で 1:1、admin は既に RW grant 保有)。代替案: assignment 属性の中
  (課題コンテンツの編集で上書きされるリスクがあり不採用)
- D20 通知文: 課題一覧の「共有」ボタンへの操作誘導を本文に含める
  (バナーに気付かなくても通知だけで動線が分かる)
- #1110 レビューで確立した「通知→印付け・条件式で冪等原子化・
  取り消しは静か」の形を踏襲
- 対象は active のみ (アーカイブ済みは先生から見えないため 404)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
クラス詳細 (俯瞰候補クリック/クラス検索から到達) に「みんなの課題への
共有を推奨する / 取り消す」を二段階確認で追加し、推奨中バッジを表示。
俯瞰ダッシュボードの有益候補行にも「推奨済み」バッジを出して、
どの候補に働きかけ済みかが一目で分かるようにした。

設計上の分岐点:
- D21 操作の置き場所: 候補行に直接ボタンを置かず、詳細画面に集約
  (#1111 の D6 と同じ「対象の文脈を確認してから操作」原則)。
  俯瞰候補→クリック→詳細→推奨、の 3 クリック動線
- 確認文言に「お知らせが届き、課題にバナーが出ます」を明記

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
recommendedForSharing が立った課題の詳細上部に「この課題、みんなの
課題に共有しませんか?」バナーを表示。「共有フォームを開く」CTA は
ボードへ戻って既存の共有ステップ (teacher-share-step) を開く。
課題一覧 (ボード) の該当行には「共有おすすめ」マークを表示。

設計上の分岐点 (このコミットに立ち戻ればやり直せる):
- D22 CTA の挙動: 共有導線はボード行に一本化済み (#1109) のため、
  新しい共有 UI を詳細に作らず onBackToDashboard + handleOpenShareFor
  の合成でボードの共有ステップへ誘導。代替案: 詳細内に共有フォームを
  埋め込む (#1109 の一本化を崩すため不採用)
- D23 バナーの解除: 先生側から消す操作は付けない (推奨の取り下げは
  admin の責務。先生が共有すれば admin が俯瞰で気付いて取り消せる)
- 通知 (share_suggestion・link.kind='classroom') は既存のジャンプ処理
  で課題詳細に直行し、そこにバナーが出る構成

検証: jest 24件 + headless Playwright 4/4 (通知→バナー→共有ステップ
→ボードのマーク)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- classroom/ui-ux.md: 1.9 共有推奨バナー (testid + スクリーンショット 0219)
- classroom/architecture.md: Classrooms テーブルの recommendedForSharing* 属性
- classroom/testing.md: 新 data-testid 2 件
- admin/README.md: 共有推奨操作 + 俯瞰候補の推奨済みバッジ + スクショ 0108
- tools/playwright-verify: verify-share-suggestion.mjs (スタブ式 4 チェック)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
レビューの指摘への対応:

- [Must] バナー CTA: selectedGroup が null の経路 (未グループ課題・
  クラス一覧からの直接オープン) で共有ステップが出ず無反応 +
  shareTarget が残って後で誤発火する欠陥を修正。課題の所属グループ →
  現在のグループ → 先頭のアクティブグループの順で必ず選んでから開く
  (pickShareSuggestionGroup として抽出しユニットテスト 4 件で pin)
- [Must] hasAssignment ゲート: 中身の無い課題では共有 API が 400 に
  なるため、バナーは hasAssignment のときだけ表示 (推奨後に説明を
  空にしたケースも吸収)。admin API 側も中身の無い課題への推奨を 400
  で拒否 (通知が「共有できます」と約束する行き止まりを防ぐ)
- [Question] アーカイブ済みでも推奨の取り消しは可能に (フラグが運営
  から触れなくなり、復元時に古いバナーが再出現する問題)
- [FYI] 「同時 POST の二重通知防止」の過大なコメントを実態 (印付けの
  冪等のみ原子化・最悪ケースは重複通知) に修正
- [FYI] バナー defaultMessage の日英混在を解消 (日本語は ja.js 側)
- 検証スクリプトに未グループ経路のシナリオを追加 (6/6 チェック)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
handler.test.ts の俯瞰テストが classroom row に旧仮定の content: を
使っており、フィールド名バグ (content→assignment 修正) を焼き込んで
いた。実データと同じ assignment: に直し、コメントで取り違えを防止。
(211/314 行の content は SharedAssignments 項目なので正しいまま)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(admin+classroom): 共有推奨フラグ + 先生UI共有促しバナー (#1106)
みんなの課題/バグ報告/クラス・課題/期限切れ復元の各詳細画面の
「← 一覧に戻る」が class 無しの素の button で、既定ブラウザ表示のまま
浮いていた。共通の .admin-back-button (白背景・1px枠・角丸=アクション
ボタンと同じ見た目) を追加し、6 箇所すべてに適用。

人間レビュー指摘 (Admin > みんなの課題詳細) への対応。同じ素ボタンが
他ビューにも全部あったので一括で揃えた。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
人間レビュー指摘 2 点:
- 前コミットの .admin-back-button に font: inherit を付けたため UA 既定
  (13.3px) より大きくなり他ボタンより一回り大きく見えていた。
  .admin-actions button とセレクタを統合し font 未指定=UA 既定に揃えた
  (実測: 両者 font 13.33px / padding 6.4×14.4 / 高さ 32.8px で一致)
- みんなの課題詳細で限定公開項目の authorName/schoolLevel/subject 等が
  'undefined' と表示されていた。限定公開 (#1109) はこれらを省略できる
  ため欠損ではなく未入力。orUnspecified で undefined→「未指定」に
  フォールバック (詳細のクレジット行・属性行・一覧の投稿者)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
topic/classroom-notification-center で実装した 3 EPIC (#1111 お知らせ
センター / #1110 Admin 推薦 / #1106 共有推奨) を横断的にまとめた集約
ページと、クリーンなスタブデータで撮影したスクリーンショット 10 枚を
追加。全体パイプライン (限定公開→運営が把握→推薦/推奨→全体公開) と
各機能の UI を 1 ページで把握できる。

人間向けの HTML プレゼン資料は git 管理外の
notes/topic-classroom-notification-center/index.html にあり、この
スクリーンショットを相対パスで参照する。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fix(admin): 詳細画面の戻るボタンのスタイルを揃える (#1106 レビュー)
…ion-center

docs: トピック機能紹介の集約ページとスクリーンショット
人間レビュー指摘への対応:

1) コスト削減: お知らせ取得を 60 秒ポーリング → 1 日 1 回
   - use-teacher-notifications: interval 廃止。localStorage に日付つきで
     キャッシュし、その日はじめてのクラス管理オープン時だけ 1 回取得。
     同日再オープンは API を叩かない。共有 PC 対策で先生メールで識別。

2) 右上をアバターメニューに(teacher / admin 両方)
   - メール頭文字(k / kt)の丸 + ▼。クリックでポップアップ(メール +
     ログアウト。将来の設定項目もここに集約)。紫背景で視認できる白丸 +
     紫文字。initialsFromEmail を lib に切り出し。旧 email/logout は廃止
   - フルスクリーン Modal は左「戻る」で閉じ右上に × が無いため、アバターを
     右端(1.25rem)へ寄せて余白をなくした(admin と同じ・追加レビュー指摘)

3) 通知ベルを白一色 SVG に(絵文字は主張が強い)。アバターの左へ

4) パネルは先頭 5 件 + 「すべて見る(N件)」→ 全件一覧ページ
   (teacher-notifications フェーズ・10 件/ページ・追加 API なし)

docs: classroom/ui-ux.md §1.8 更新、集約ページのスクショ 0101/0102 を
新 UI で撮り直し。

検証: jest 119件 + headless で teacher UX 11/11・admin アバター・右端
寄せ(gap 20px)を確認。gui/admin lint クリーン。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
アバターメニュー化・白ベル・右端寄せ後の UI に合わせて、
docs/classroom-notification-center/screenshots を一括更新
(teacher タイトルバー / admin ヘッダーとも新 chrome)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- [Must] mesh 回帰スクリプト修復: ログアウトがアバターメニュー内へ
  移動したため、mesh-v2-classroom-binding.mjs で classroom-avatar-button
  を先にクリックしてから classroom-teacher-logout を押すよう修正
- [Question] dev-bypass 等 email 不明(空キー)時はキャッシュを使わず
  毎回取得(共有 PC で別の先生の通知が混ざらないように)。本番の
  Google/Microsoft ID トークンは email を持つのでキャッシュは有効
- [Question] docs/classroom/testing.md の testid を更新(logout は
  アバターメニュー内・classroom-teacher-email 廃止・avatar-* 追加)
- [FYI] admin app.css の未使用 .admin-header-email を削除

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(gui,admin): 通知の日次取得・アバターメニュー・白ベル・全件ページ (#1111 レビュー)
人間レビュー指摘への対応:

1) パネルヘッダーに ⋯(三点)メニューを追加(参考 UI 準拠)
   - 「すべて既読にする」(未読 0 で無効)/「お知らせを開く」(全件一覧)
   - 一覧は件数に関係なく開ける(旧「5 件以上のときだけ すべて見る」を廃止)
   - パネルを開くだけでは既読にせず、既読は ⋯「すべて既読にする」で明示
     (handleMarkAllRead を hook に追加。in-memory readAt/キャッシュ/バッジを更新)

2) 全件一覧ページのナビゲーション(ポリシー化)
   - パンくずを「クラス管理 > お知らせ」に(先頭「クラス管理」でトップ=
     クラス一覧へ戻れる)。testid classroom-breadcrumb-top
   - キャンセルが不適切な画面なので左下に「戻る」ボタン
     (classroom-notifications-back → トップへ)

docs: ui-ux §1.8 の testid/挙動を更新、集約スクショ 0102 を ⋯ メニュー
つきで撮り直し。

検証: jest(notifications/list/hook/avatar 28件 + admin 43件)+ headless
8/8(開くだけでは未読維持・⋯ から既読/一覧・<5件でも一覧到達・パンくず
「クラス管理」・左下戻る)。gui/admin lint クリーン。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
smalruby3-editor-bot Bot and others added 2 commits July 26, 2026 12:17
敵対レビュー FYI 対応:
- use-teacher-notifications.js の docstring が旧「開くと全既読」のまま
  だったので実挙動(⋯「すべて既読にする」で明示既読)に更新
- .notifications-panel の overflow/max-height を外し、ヘッダーの ⋯
  ポップアップが短いパネルでクリップされないように(プレビューは最大
  5 件で高さ有界なのでパネルスクロールは不要)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(gui): お知らせパネルの ⋯ メニューと一覧ページのパンくず/戻る (#1111 レビュー)
@smalruby3-editor-bot
smalruby3-editor-bot Bot merged commit 81cce54 into develop Jul 26, 2026
21 checks passed
@smalruby3-editor-bot
smalruby3-editor-bot Bot deleted the topic/classroom-notification-center branch July 26, 2026 12:55
@github-actions

Copy link
Copy Markdown

github-actions Bot pushed a commit that referenced this pull request Jul 26, 2026
…oom-notification-center

feat(classroom,admin): お知らせ通知センターと課題共有パイプライン (#1111 #1110 #1106)
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.

epic(classroom): クラス管理の右上「お知らせ」通知センター

0 participants