Skip to content

feat(admin+classroom): 共有推奨フラグ + 先生UI共有促しバナー (#1106)#1115

Merged
smalruby3-editor-bot[bot] merged 6 commits into
topic/classroom-notification-centerfrom
feature/share-suggestion-1106
Jul 25, 2026
Merged

feat(admin+classroom): 共有推奨フラグ + 先生UI共有促しバナー (#1106)#1115
smalruby3-editor-bot[bot] merged 6 commits into
topic/classroom-notification-centerfrom
feature/share-suggestion-1106

Conversation

@smalruby3-editor-bot

Copy link
Copy Markdown

Summary

EPIC #1106 の実装。Admin が「有益」と判断した課題に共有推奨フラグを立て、作成した先生の編集画面(課題詳細)に「この課題、みんなの課題に共有しませんか?」バナーを出して既存の共有フローへ誘導する。通知は #1111 のお知らせセンターshare_suggestion・クリックで該当課題の詳細へジャンプ)。公開はあくまで CC BY 同意を伴う先生本人の共有操作のみ(Admin による代理公開はしない = 著作権上の制約に対応)。

Changes Made

  • infra/smalruby-admin:
    • POST/DELETE /admin/classrooms/{id}/recommend-sharing(audit 付き・冪等・通知→印付けの順・中身の無い課題は 400・取り消しはアーカイブ後も可能)
    • 俯瞰ダッシュボードの有益候補が常に空になるバグを修正: classroom-overview.ts が課題コンテンツを row.content で読んでいたが、classroom item の実フィールド名は assignmentcontent は SharedAssignments 側の名前)。実データに対して richness が常に 0 → score>=3 の候補ゼロだった。回帰テストでフィールド名を pin
    • 候補行に recommendedForSharing フラグ
  • infra/smalruby-classroom: 先生側投影(一覧 + 詳細)に recommendedForSharing(boolean のみ。By は非公開)
  • packages/admin: クラス詳細に「みんなの課題への共有を推奨する / 取り消す」(二段階確認)+ 共有推奨中バッジ、俯瞰候補行に推奨済みバッジ
  • packages/scratch-gui:
    • 課題詳細上部にバナー(hasAssignment ゲート付き)→ CTA でボードの共有ステップ(既存フロー)を開く
    • 課題一覧(ボード)行に「共有おすすめ」マーク
    • CTA は課題の所属グループ → 現在のグループ → 先頭のアクティブグループの順で必ずグループを選んでから開く(pickShareSuggestionGroup。未グループのレガシー課題でも動く)
  • docs: classroom ui-ux(1.9 バナー + スクショ 0219)/ architecture / testing、admin README(+ スクショ 0108)
  • tools/playwright-verify: verify-share-suggestion.mjs(スタブ式・6 チェック。未グループ経路含む)

設計判断(各コミットメッセージに詳細 D19〜D23)

敵対レビュー(実施済み・対応済み)

分類 指摘 対応
[Must] CTA が selectedGroup null の経路(未グループ課題・一覧からの直接オープン)で無反応 + shareTarget が残って誤発火 グループ選択のフォールバック(pickShareSuggestionGroup + ユニットテスト 4 件・E2E シナリオ追加) ✅
[Must] バナーが hasAssignment でゲートされておらず、中身の無い課題で共有が行き止まり GUI ゲート + admin API 側も 400 で拒否 ✅
[Question] アーカイブ後に推奨を取り消せない(復元時に古いバナー再出現) 取り消しはアーカイブ後も可能に ✅
[FYI] コメントの過大な主張・defaultMessage の日英混在・テストギャップ すべて修正 ✅

Test Coverage

  • admin infra: handler-recommend-sharing.test.ts 6 件 + overview 回帰 2 件(全 59 件パス・tsc クリーン)
  • classroom infra: 全 222 件パス
  • admin SPA: +2 件(lint + 42 件パス)
  • scratch-gui: banner/board/helper +8 件(フル lint クリーン)
  • headless Playwright(API スタブ): 6/6 — 通知ジャンプ → バナー → 共有ステップ → ボードマーク → 未グループ経路

残タスク

Related Issues

Refs #1106(前提: #1111 = PR #1113、パターン踏襲: #1110 = PR #1114

🤖 Generated with Claude Code

smalruby3-editor-bot Bot and others added 6 commits July 25, 2026 17:38
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>
@smalruby3-editor-bot
smalruby3-editor-bot Bot merged commit 329be50 into topic/classroom-notification-center Jul 25, 2026
21 checks passed
@smalruby3-editor-bot
smalruby3-editor-bot Bot deleted the feature/share-suggestion-1106 branch July 25, 2026 21:25
@github-actions

Copy link
Copy Markdown

@smalruby3-editor-bot

Copy link
Copy Markdown
Author

stg デプロイ・検証完了(2026-07-25)

ClassroomStack-stg / AdminStack-stg をデプロイし、integration テスト(49 件パス・教師フロー含む)+ 実 API のスモークで 3 EPIC の通しを確認:

検証データはクリーンアップ済み(取り下げ + アーカイブ、stg TTL 1 日)。

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.

0 participants