feat(admin+classroom): 共有推奨フラグ + 先生UI共有促しバナー (#1106)#1115
Merged
smalruby3-editor-bot[bot] merged 6 commits intoJul 25, 2026
Merged
Conversation
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
Bot
merged commit Jul 25, 2026
329be50
into
topic/classroom-notification-center
21 checks passed
|
🚀 Preview deployed: https://smalruby.jp/smalruby3-editor/feature/share-suggestion-1106/ |
Author
stg デプロイ・検証完了(2026-07-25)ClassroomStack-stg / AdminStack-stg をデプロイし、integration テスト(49 件パス・教師フロー含む)+ 実 API のスモークで 3 EPIC の通しを確認:
検証データはクリーンアップ済み(取り下げ + アーカイブ、stg TTL 1 日)。 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
EPIC #1106 の実装。Admin が「有益」と判断した課題に共有推奨フラグを立て、作成した先生の編集画面(課題詳細)に「この課題、みんなの課題に共有しませんか?」バナーを出して既存の共有フローへ誘導する。通知は #1111 のお知らせセンター(
share_suggestion・クリックで該当課題の詳細へジャンプ)。公開はあくまで CC BY 同意を伴う先生本人の共有操作のみ(Admin による代理公開はしない = 著作権上の制約に対応)。Changes Made
POST/DELETE /admin/classrooms/{id}/recommend-sharing(audit 付き・冪等・通知→印付けの順・中身の無い課題は 400・取り消しはアーカイブ後も可能)classroom-overview.tsが課題コンテンツをrow.contentで読んでいたが、classroom item の実フィールド名はassignment(contentは SharedAssignments 側の名前)。実データに対して richness が常に 0 → score>=3 の候補ゼロだった。回帰テストでフィールド名を pinrecommendedForSharingフラグrecommendedForSharing(boolean のみ。By は非公開)hasAssignmentゲート付き)→ CTA でボードの共有ステップ(既存フロー)を開くpickShareSuggestionGroup。未グループのレガシー課題でも動く)verify-share-suggestion.mjs(スタブ式・6 チェック。未グループ経路含む)設計判断(各コミットメッセージに詳細 D19〜D23)
敵対レビュー(実施済み・対応済み)
selectedGroupnull の経路(未グループ課題・一覧からの直接オープン)で無反応 +shareTargetが残って誤発火pickShareSuggestionGroup+ ユニットテスト 4 件・E2E シナリオ追加) ✅hasAssignmentでゲートされておらず、中身の無い課題で共有が行き止まりTest Coverage
handler-recommend-sharing.test.ts6 件 + overview 回帰 2 件(全 59 件パス・tsc クリーン)残タスク
Related Issues
Refs #1106(前提: #1111 = PR #1113、パターン踏襲: #1110 = PR #1114)
🤖 Generated with Claude Code