From f73d9e8ea688441411f80a6e70a33566882ce86a Mon Sep 17 00:00:00 2001 From: "smalruby3-editor-bot[bot]" <297607354+smalruby3-editor-bot[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 11:20:28 +0000 Subject: [PATCH 1/9] =?UTF-8?q?refactor(classroom):=20=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E4=BD=9C=E6=88=90/=E8=AA=B2=E9=A1=8C=E4=BD=9C?= =?UTF-8?q?=E6=88=90/=E5=86=8D=E5=88=A9=E7=94=A8/=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E8=A8=AD=E5=AE=9A=E3=82=92=E7=94=BB=E9=9D=A2=E9=81=B7?= =?UTF-8?q?=E7=A7=BB=E3=81=AB=E7=B5=B1=E4=B8=80=EF=BC=88#1108=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 現在の画面上にモーダルっぽい popover を出すトグル UI をやめ、課題詳細→ Google Classroom に共有 と同じ「画面遷移+キャンセル/実行で戻る」基本レイアウト (パンくず+タイトル+フォーム+フッター: プライマリー右下/キャンセル左下)に統一: - クラス一覧「クラスを作る」: popover → 画面遷移(クラス一覧 > クラスを作る) - クラス設定: インラインカード置換 → 画面遷移(クラス一覧 > 設定)。減員警告・ アーカイブ確認の挙動は維持 - 課題一覧「課題を作る」「課題を再利用」: popover → 画面遷移。サブビュー中は 上部アクションバーを隠し、パンくずに現在地を出す(「課題一覧」で戻る) - 不要になった boardPopover 経由の inline form / inline settings を除去 data-testid は維持。unit テスト(class-list 12 + board 19 = 31)green。lint/prettier 通過。 実機で 4 画面が画面遷移・フッター統一・ヘッダ非表示になることを確認。 Co-Authored-By: Claude Opus 4.8 --- .../teacher-assignment-board.jsx | 227 +++++++++---- .../classroom-modal/teacher-class-list.jsx | 315 ++++++++++-------- packages/scratch-gui/src/locales/ja-Hira.js | 1 + packages/scratch-gui/src/locales/ja.js | 1 + 4 files changed, 346 insertions(+), 198 deletions(-) diff --git a/packages/scratch-gui/src/components/classroom-modal/teacher-assignment-board.jsx b/packages/scratch-gui/src/components/classroom-modal/teacher-assignment-board.jsx index 55609d212bc..e1b30ffc765 100644 --- a/packages/scratch-gui/src/components/classroom-modal/teacher-assignment-board.jsx +++ b/packages/scratch-gui/src/components/classroom-modal/teacher-assignment-board.jsx @@ -389,6 +389,58 @@ const TeacherAssignmentBoard = ({ [onUpdateGroupTopics, group.groupId], ); + // 画面遷移サブビュー(#1108): 作成/再利用/共有/合言葉/カタログ。開いている間は + // 上部アクションバーを隠し、パンくずに現在地を出す。「課題一覧」で元に戻る。 + const subView = showInlineCreate + ? 'create' + : showReuse + ? 'reuse' + : shared && shared.shareTarget + ? 'share' + : shared && shared.showPasscodeImport + ? 'passcode' + : shared && shared.showCatalog + ? 'catalog' + : null; + // 各 id の descriptor は元の使用箇所と一致させる(react-intl は同一 id で + // defaultMessage/description の不一致を許さない)。 + const subViewMessages = { + create: { + defaultMessage: 'Create an assignment', + description: 'Button on the board to create a new assignment', + id: 'gui.classroom.board.create', + }, + reuse: { + defaultMessage: 'Reuse an assignment', + description: 'Button on the board to reuse (duplicate) an existing assignment', + id: 'gui.classroom.board.reuse', + }, + share: { + defaultMessage: 'Share this assignment', + description: 'Share step title', + id: 'gui.classroom.shared.shareStepTitle', + }, + passcode: { + defaultMessage: 'Import by passcode', + description: 'Passcode import step title', + id: 'gui.classroom.shared.passcodeImportTitle', + }, + catalog: { + defaultMessage: 'Find in みんなの課題', + description: 'Button that opens the shared assignment catalog', + id: 'gui.classroom.shared.openCatalog', + }, + }; + const handleBoardHome = useCallback(() => { + setShowInlineCreate(false); + setShowReuse(false); + if (shared) { + if (shared.shareTarget) shared.handleCloseShareForm(); + if (shared.showPasscodeImport) shared.handleClosePasscodeImport(); + if (shared.showCatalog) shared.handleCloseCatalog(); + } + }, [shared]); + return (
- {!(shared && (shared.shareTarget || shared.showPasscodeImport)) && ( + {!subView && (

{formatClassLabel(group)}

- +
+
+ + +
- ) : null} - {showReuse ? ( -
-
+ ) : showReuse ? ( + // 課題を再利用(#1108: popover → 画面遷移。コピーは候補ごと、キャンセル左) +
+
+ +
+

+

+
-
    {reuseCandidates.map((c) => ( @@ -637,8 +716,24 @@ const TeacherAssignmentBoard = ({ ))}
+
+ + +
- ) : null} + ) : ( +
{topics.map((topic) => (
+
+ ); + } + + // クラス設定(#1108: インラインカード → 画面遷移) + if (settingsGroup) { + return ( +
+ + +
+
{formatClassLabel(settingsGroup)}
+ +
+
+ ); + } + + return ( +
+ +

+ +

+

+ +

+ + + {onShowGoogleCourses ? ( + ) : null} - {activeGroups.length === 0 && !showCreateForm ? ( + {activeGroups.length === 0 ? (

) : null}

    - {activeGroups.map((group) => - settingsGroupId === group.groupId ? ( -
  • - -
  • - ) : ( - - ), - )} + {activeGroups.map((group) => ( + + ))}
{archivedGroups.length > 0 ? (
@@ -764,29 +826,18 @@ const TeacherClassList = ({ {showArchived ? (
    - {archivedGroups.map((group) => - settingsGroupId === group.groupId ? ( -
  • - -
  • - ) : ( - - ), - )} + {archivedGroups.map((group) => ( + + ))}
) : null}
diff --git a/packages/scratch-gui/src/locales/ja-Hira.js b/packages/scratch-gui/src/locales/ja-Hira.js index d6bb7bf5c04..1d57534abb1 100644 --- a/packages/scratch-gui/src/locales/ja-Hira.js +++ b/packages/scratch-gui/src/locales/ja-Hira.js @@ -221,6 +221,7 @@ export default { 'gui.classroom.breadcrumbs.assignmentDetail': 'かだいしょうさい', 'gui.classroom.breadcrumbs.shareGc': 'Google Classroom に きょうゆう', 'gui.classroom.board.createNamePlaceholder': 'かだいめい(れい: ねこをうごかそう)', + 'gui.classroom.board.createNameLabel': 'かだいめい:', 'gui.classroom.board.createSubmit': 'つくる', 'gui.classroom.board.reuse': 'かだいをさいりよう', 'gui.classroom.board.reuseHint': 'つくったかだいをこのクラスにふくせい:', diff --git a/packages/scratch-gui/src/locales/ja.js b/packages/scratch-gui/src/locales/ja.js index dbed6fb8647..9206e66fb37 100644 --- a/packages/scratch-gui/src/locales/ja.js +++ b/packages/scratch-gui/src/locales/ja.js @@ -217,6 +217,7 @@ export default { 'gui.classroom.breadcrumbs.assignmentDetail': '課題詳細', 'gui.classroom.breadcrumbs.shareGc': 'Google Classroom に共有', 'gui.classroom.board.createNamePlaceholder': '課題名(例: ねこを動かそう)', + 'gui.classroom.board.createNameLabel': '課題名:', 'gui.classroom.board.createSubmit': '作成', 'gui.classroom.board.reuse': '課題を再利用', 'gui.classroom.board.reuseHint': '作成済みの課題をこのクラスに複製:', From 629de4c40672656179ca80447f43b674a926b5d9 Mon Sep 17 00:00:00 2001 From: "smalruby3-editor-bot[bot]" <297607354+smalruby3-editor-bot[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 11:23:04 +0000 Subject: [PATCH 2/9] =?UTF-8?q?refactor(classroom):=20=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=88=E7=94=BB=E9=9D=A2=E3=81=AE=E3=83=95?= =?UTF-8?q?=E3=83=83=E3=82=BF=E3=83=BC=E3=82=92=E5=9F=BA=E6=9C=AC=E3=83=9D?= =?UTF-8?q?=E3=83=AA=E3=82=B7=E3=83=BC=E3=81=AB=E7=B5=B1=E4=B8=80=EF=BC=88?= =?UTF-8?q?#1108=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Google Classroom からインポート画面のフッターを、右寄せ(インポートのみ)から 基本ポリシー(キャンセル左下 / インポート右下)に統一。キャンセルは戻る(クラス 一覧)と同じ挙動。 Co-Authored-By: Claude Opus 4.8 --- .../classroom-teacher-modal.css | 28 +++++++++++++++++++ .../teacher-google-courses-phase.jsx | 16 ++++++++++- packages/scratch-gui/src/locales/ja-Hira.js | 1 + packages/scratch-gui/src/locales/ja.js | 1 + 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/components/classroom-teacher-modal/classroom-teacher-modal.css b/packages/scratch-gui/src/components/classroom-teacher-modal/classroom-teacher-modal.css index 9f818ae70fd..5353f7c6756 100644 --- a/packages/scratch-gui/src/components/classroom-teacher-modal/classroom-teacher-modal.css +++ b/packages/scratch-gui/src/components/classroom-teacher-modal/classroom-teacher-modal.css @@ -308,6 +308,34 @@ text-align: right; } +/* 基本ポリシーのフッター(#1108): キャンセル左 / プライマリー右。 */ +.main-footer-split { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5rem; + margin-top: 1rem; +} + +.secondary-footer-button { + padding: 0.6rem 1.2rem; + border: 1px solid #d9d9d9; + border-radius: 4px; + background-color: white; + color: #575e75; + font-size: 0.9rem; + cursor: pointer; +} + +.secondary-footer-button:hover:not(:disabled) { + background-color: #f2f2f2; +} + +.secondary-footer-button:disabled { + opacity: 0.5; + cursor: default; +} + .auth-hint-overlay { position: absolute; top: 0; diff --git a/packages/scratch-gui/src/components/classroom-teacher-modal/teacher-google-courses-phase.jsx b/packages/scratch-gui/src/components/classroom-teacher-modal/teacher-google-courses-phase.jsx index eb53b4f90c6..851009ed40a 100644 --- a/packages/scratch-gui/src/components/classroom-teacher-modal/teacher-google-courses-phase.jsx +++ b/packages/scratch-gui/src/components/classroom-teacher-modal/teacher-google-courses-phase.jsx @@ -169,7 +169,21 @@ const TeacherGoogleCoursesPhase = ({ onSelect={onSelectGoogleCourse} /> )} -
+ {/* フッターを基本ポリシーに統一(#1108): キャンセル左 / インポート右 */} +
+ + {/* フッター(レビュー指摘): 通常は キャンセル左 / アーカイブ・保存 右 + (アーカイブは保存の左)。アーカイブ押下中は キャンセル・保存を隠し + 「アーカイブしない / アーカイブする」のみ表示。 */} +
{confirmingArchive ? ( - - ) : null} - - - + + + + + ) : ( + + +
+ + +
+
+ )}
); @@ -425,19 +444,22 @@ const ClassCard = ({ /> )} - + {/* アーカイブ済みは「元に戻す」だけ。設定ボタンは出さない(レビュー指摘)。 */} + {isArchived ? null : ( + + )} ); }; diff --git a/packages/scratch-gui/src/components/classroom-modal/teacher-evaluation.jsx b/packages/scratch-gui/src/components/classroom-modal/teacher-evaluation.jsx index 351d9dc8fda..d3b4a7a8495 100644 --- a/packages/scratch-gui/src/components/classroom-modal/teacher-evaluation.jsx +++ b/packages/scratch-gui/src/components/classroom-modal/teacher-evaluation.jsx @@ -416,6 +416,22 @@ const TeacherEvaluation = ({ />
+ {/* 左下にキャンセル(クラス一覧へ戻る)を追加(レビュー指摘)。 */} +
+ + +
); }; diff --git a/packages/scratch-gui/src/locales/ja-Hira.js b/packages/scratch-gui/src/locales/ja-Hira.js index f57ba251e12..40aea9384e4 100644 --- a/packages/scratch-gui/src/locales/ja-Hira.js +++ b/packages/scratch-gui/src/locales/ja-Hira.js @@ -209,6 +209,7 @@ export default { 'gui.classroom.evaluation.exportCsv': 'ひょうかCSV', 'gui.classroom.evaluation.exportAuditCsv': 'けんしょうようCSV', 'gui.classroom.evaluation.returnComments': 'コメントをへんきゃく', + 'gui.classroom.evaluation.cancel': 'キャンセル', 'gui.classroom.teacherDetail.descriptionTab': 'せつめい', 'gui.classroom.teacherDetail.previewTitle': 'せいとにみえるないよう(プレビュー)', 'gui.classroom.breadcrumbs.evaluation': 'ひょうか', diff --git a/packages/scratch-gui/src/locales/ja.js b/packages/scratch-gui/src/locales/ja.js index 4ff22923f30..90c78224389 100644 --- a/packages/scratch-gui/src/locales/ja.js +++ b/packages/scratch-gui/src/locales/ja.js @@ -205,6 +205,7 @@ export default { 'gui.classroom.evaluation.exportCsv': '評価CSV', 'gui.classroom.evaluation.exportAuditCsv': '検証用CSV', 'gui.classroom.evaluation.returnComments': 'コメントを返却', + 'gui.classroom.evaluation.cancel': 'キャンセル', 'gui.classroom.teacherDetail.descriptionTab': '説明', 'gui.classroom.teacherDetail.previewTitle': '生徒に見える内容(プレビュー)', 'gui.classroom.breadcrumbs.evaluation': '評価', diff --git a/packages/scratch-gui/test/unit/components/teacher-class-list.test.jsx b/packages/scratch-gui/test/unit/components/teacher-class-list.test.jsx index 0fb8de979e4..ddf1bcf1c8b 100644 --- a/packages/scratch-gui/test/unit/components/teacher-class-list.test.jsx +++ b/packages/scratch-gui/test/unit/components/teacher-class-list.test.jsx @@ -249,17 +249,29 @@ describe('TeacherClassList — archived classes section (issue #1051)', () => { expect(byTestId('classroom-class-settings-archive-confirm-message')).not.toBeInTheDocument(); }); - test('unarchiving from settings stays immediate (no confirmation)', () => { - const onUpdateGroup = jest.fn(); - renderList({ - groups: [group({ groupId: 'g2', status: 'archived' })], - onUpdateGroup, - }); + test('pressing Archive hides cancel/save and shows only archive yes/no (review feedback)', () => { + renderList(); + fireEvent.click(byTestId('classroom-class-settings-open-g1')); + expect(byTestId('classroom-class-settings-cancel')).toBeInTheDocument(); + expect(byTestId('classroom-class-settings-save')).toBeInTheDocument(); - fireEvent.click(byTestId('classroom-show-archived')); - fireEvent.click(byTestId('classroom-class-settings-open-g2')); fireEvent.click(byTestId('classroom-class-settings-archive')); + // Only the archive yes/no buttons remain. + expect(byTestId('classroom-class-settings-cancel')).not.toBeInTheDocument(); + expect(byTestId('classroom-class-settings-save')).not.toBeInTheDocument(); + expect(byTestId('classroom-class-settings-archive-cancel')).toBeInTheDocument(); + expect(byTestId('classroom-class-settings-archive')).toBeInTheDocument(); - expect(onUpdateGroup).toHaveBeenCalledWith('g2', { status: 'active' }); + // "Keep the class" restores cancel/save. + fireEvent.click(byTestId('classroom-class-settings-archive-cancel')); + expect(byTestId('classroom-class-settings-cancel')).toBeInTheDocument(); + expect(byTestId('classroom-class-settings-save')).toBeInTheDocument(); + }); + + test('archived classes have no settings button — only restore (review feedback)', () => { + renderList({ groups: [group({ groupId: 'g2', status: 'archived' })] }); + fireEvent.click(byTestId('classroom-show-archived')); + expect(byTestId('classroom-class-settings-open-g2')).not.toBeInTheDocument(); + expect(byTestId('classroom-class-restore-g2')).toBeInTheDocument(); }); }); From 8cb986acf012fd39140ee7ef1c66bd5f80889015 Mon Sep 17 00:00:00 2001 From: "smalruby3-editor-bot[bot]" <297607354+smalruby3-editor-bot[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 12:42:23 +0000 Subject: [PATCH 4/9] =?UTF-8?q?fix(classroom):=20=E8=A9=95=E4=BE=A1?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=AE=E3=82=AD=E3=83=A3=E3=83=B3=E3=82=BB?= =?UTF-8?q?=E3=83=AB=E3=82=92=E3=82=A2=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=83=9C=E3=82=BF=E3=83=B3=E8=A1=8C=E3=81=AE=E5=B7=A6=E7=AB=AF?= =?UTF-8?q?=E3=81=AB=E6=8F=83=E3=81=88=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit キャンセルが別行の左下に出て他ボタンと位置がずれていた(レビュー指摘)。 アクションボタン行(.button-row)の先頭に移し、margin-right:auto で左端に寄せて 右寄せの他ボタンと同じ行に揃える。 Co-Authored-By: Claude Opus 4.8 --- .../classroom-modal/classroom-modal.css | 6 ++++ .../classroom-modal/teacher-evaluation.jsx | 30 ++++++++----------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/packages/scratch-gui/src/components/classroom-modal/classroom-modal.css b/packages/scratch-gui/src/components/classroom-modal/classroom-modal.css index f22bce4157e..06971f2dfa1 100644 --- a/packages/scratch-gui/src/components/classroom-modal/classroom-modal.css +++ b/packages/scratch-gui/src/components/classroom-modal/classroom-modal.css @@ -566,6 +566,12 @@ gap: 0.5rem; } +/* 評価画面: キャンセルをアクションボタン行の左端に置く(右寄せの他ボタンと + 同じ行で左に離す。レビュー指摘)。 */ +.eval-cancel { + margin-right: auto; +} + /* 共有設定ステップ(#1109): 公開範囲の選択カード + 合言葉の表示。 */ .share-mode-row { display: flex; diff --git a/packages/scratch-gui/src/components/classroom-modal/teacher-evaluation.jsx b/packages/scratch-gui/src/components/classroom-modal/teacher-evaluation.jsx index d3b4a7a8495..7bcd634fbf2 100644 --- a/packages/scratch-gui/src/components/classroom-modal/teacher-evaluation.jsx +++ b/packages/scratch-gui/src/components/classroom-modal/teacher-evaluation.jsx @@ -353,8 +353,20 @@ const TeacherEvaluation = ({
)} - {/* Actions */} + {/* Actions(左端にキャンセル、他ボタンは右寄せ。レビュー指摘で同一行に揃える) */}
+
- {/* 左下にキャンセル(クラス一覧へ戻る)を追加(レビュー指摘)。 */} -
- - -
); }; From 4bdb6df5e3043700b2a11db73cf34e997d65b35f Mon Sep 17 00:00:00 2001 From: "smalruby3-editor-bot[bot]" <297607354+smalruby3-editor-bot[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 13:10:30 +0000 Subject: [PATCH 5/9] =?UTF-8?q?fix(classroom):=20=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E4=BD=9C=E6=88=90=E3=83=95=E3=82=A9=E3=83=BC=E3=83=A0?= =?UTF-8?q?=E3=82=92=E8=A8=AD=E5=AE=9AUI=E3=81=AB=E5=90=88=E3=82=8F?= =?UTF-8?q?=E3=81=9B=E3=81=A6=E6=9E=A0=E4=BB=98=E3=81=8D=EF=BC=8B=E5=85=A5?= =?UTF-8?q?=E5=8A=9B=E3=82=92=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit クラスを作る画面のフォームに枠が無く、中央の年度/セクション/人数の入力が ブラウザ既定の枠のままで浮いて見えた(レビュー指摘)。設定画面と同じ .class-settings-form(紫の枠 + .class-settings-form input の統一スタイル)に 包み、タイトルは枠の外・上に出す。name/課題名の .input 直指定を外して 枠内スタイルに一本化。 実機で枠色 #855cd6・全入力の枠が name と一致することを確認。テスト 18 件 green。 Co-Authored-By: Claude Opus 4.8 --- .../classroom-modal/teacher-class-list.jsx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/scratch-gui/src/components/classroom-modal/teacher-class-list.jsx b/packages/scratch-gui/src/components/classroom-modal/teacher-class-list.jsx index 9cb35d9f456..7f2290938cb 100644 --- a/packages/scratch-gui/src/components/classroom-modal/teacher-class-list.jsx +++ b/packages/scratch-gui/src/components/classroom-modal/teacher-class-list.jsx @@ -573,11 +573,8 @@ const TeacherClassList = ({ ]} /> -
+
+ {/* 設定画面と同じ枠付きフォーム(.class-settings-form)に揃える。 */}
+
- + + ); } From 0d4e237ebfa62aa31d6f49f9fed7b8a8764e30d4 Mon Sep 17 00:00:00 2001 From: "smalruby3-editor-bot[bot]" <297607354+smalruby3-editor-bot[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 13:32:57 +0000 Subject: [PATCH 6/9] =?UTF-8?q?feat(classroom):=20=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E4=BD=9C=E6=88=90=E3=81=AB=E5=85=B1=E5=90=8C=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E8=80=85=E3=81=AE=E8=AA=AC=E6=98=8E=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=EF=BC=88=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC=E6=8C=87?= =?UTF-8?q?=E6=91=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit クラスを作る画面に短い説明を追加し、共同管理者とは何か・あとから設定で 追加できることを先生に伝える: 「共同管理者(クラスを一緒に管理する先生)は、あとから「設定」で追加できます。」 Co-Authored-By: Claude Opus 4.8 --- .../src/components/classroom-modal/teacher-class-list.jsx | 7 +++++++ packages/scratch-gui/src/locales/ja-Hira.js | 2 ++ packages/scratch-gui/src/locales/ja.js | 2 ++ 3 files changed, 11 insertions(+) diff --git a/packages/scratch-gui/src/components/classroom-modal/teacher-class-list.jsx b/packages/scratch-gui/src/components/classroom-modal/teacher-class-list.jsx index 7f2290938cb..548ab6da179 100644 --- a/packages/scratch-gui/src/components/classroom-modal/teacher-class-list.jsx +++ b/packages/scratch-gui/src/components/classroom-modal/teacher-class-list.jsx @@ -651,6 +651,13 @@ const TeacherClassList = ({ value={assignmentName} onChange={handleAssignmentNameChange} /> +

+ +

+ )} {shared && shared.lastImported ? ( diff --git a/packages/scratch-gui/src/locales/ja-Hira.js b/packages/scratch-gui/src/locales/ja-Hira.js index 3e4b156180c..08f84f426b8 100644 --- a/packages/scratch-gui/src/locales/ja-Hira.js +++ b/packages/scratch-gui/src/locales/ja-Hira.js @@ -230,6 +230,8 @@ export default { 'gui.classroom.board.reuseCopy': 'このクラスにふくせい', 'gui.classroom.board.yearLabel': '{year}ねんど', 'gui.classroom.board.create': 'かだいをつくる', + 'gui.classroom.board.hint': + 'このクラスのかだいをさくせい・かんりします。かだいをひらくとていしゅつじょうきょうのかくにんやひょうかができます。', 'gui.classroom.board.topicLabel': 'トピック', 'gui.classroom.board.noTopic': '(トピックなし)', 'gui.classroom.board.newTopicPlaceholder': 'あたらしいトピック', diff --git a/packages/scratch-gui/src/locales/ja.js b/packages/scratch-gui/src/locales/ja.js index 934b23d83f5..2504c6baecc 100644 --- a/packages/scratch-gui/src/locales/ja.js +++ b/packages/scratch-gui/src/locales/ja.js @@ -226,6 +226,7 @@ export default { 'gui.classroom.board.reuseCopy': 'このクラスに複製', 'gui.classroom.board.yearLabel': '{year}年度', 'gui.classroom.board.create': '課題を作る', + 'gui.classroom.board.hint': 'このクラスの課題を作成・管理します。課題を開くと提出状況の確認や評価ができます。', 'gui.classroom.board.topicLabel': 'トピック', 'gui.classroom.board.noTopic': '(トピックなし)', 'gui.classroom.board.newTopicPlaceholder': '新しいトピック', From 44cbb249b38888b8cbc06335cd04e8e9c090cebf Mon Sep 17 00:00:00 2001 From: "smalruby3-editor-bot[bot]" <297607354+smalruby3-editor-bot[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 14:00:02 +0000 Subject: [PATCH 8/9] =?UTF-8?q?fix(classroom):=20=E8=AA=B2=E9=A1=8C?= =?UTF-8?q?=E3=81=AE=E5=86=8D=E5=88=A9=E7=94=A8=E3=81=8B=E3=82=89=E3=82=A2?= =?UTF-8?q?=E3=83=BC=E3=82=AB=E3=82=A4=E3=83=96=E6=B8=88=E3=81=BF=E3=81=AE?= =?UTF-8?q?=E3=82=AF=E3=83=A9=E3=82=B9=E3=83=BB=E8=AA=B2=E9=A1=8C=E3=82=92?= =?UTF-8?q?=E9=99=A4=E5=A4=96=EF=BC=88=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 再利用の候補・クラスフィルタにアーカイブ済みが混じっていた。以下を対象外に: - アーカイブ済みの課題(classroom.status === 'archived') - アーカイブ済みのクラス(組)に属する課題 - クラスフィルタのドロップダウンからアーカイブ済みのクラスを除外 unit テスト追加(3種の除外を検証)。lint/prettier 通過。 Co-Authored-By: Claude Opus 4.8 --- .../teacher-assignment-board.jsx | 11 +++++-- .../teacher-assignment-board.test.jsx | 30 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/components/classroom-modal/teacher-assignment-board.jsx b/packages/scratch-gui/src/components/classroom-modal/teacher-assignment-board.jsx index f142f5fb422..1e367152c3b 100644 --- a/packages/scratch-gui/src/components/classroom-modal/teacher-assignment-board.jsx +++ b/packages/scratch-gui/src/components/classroom-modal/teacher-assignment-board.jsx @@ -362,8 +362,15 @@ const TeacherAssignmentBoard = ({ [allClassrooms, onReuseAssignment, group], ); - // Reuse picker: every assignment (any class), newest first, filterable. + // 再利用の対象はアクティブなクラス・課題のみ(レビュー指摘)。アーカイブ済みの + // クラス(組)に属する課題や、アーカイブ済みの課題は候補・フィルタから除外する。 + const activeGroupIds = new Set( + (allGroups || []).filter((g) => g.status !== 'archived').map((g) => g.groupId), + ); + const reuseGroups = (allGroups || []).filter((g) => g.status !== 'archived'); + // Reuse picker: active assignments (of active classes), newest first, filterable. const reuseCandidates = (allClassrooms || []) + .filter((c) => c.status !== 'archived' && activeGroupIds.has(c.groupId)) .filter((c) => !reuseFilterGroupId || c.groupId === reuseFilterGroupId) .sort((a, b) => String(b.sortDate || b.createdAt || '').localeCompare(String(a.sortDate || a.createdAt || '')), @@ -694,7 +701,7 @@ const TeacherAssignmentBoard = ({ id: 'gui.classroom.board.reuseFilterAll', })} - {(allGroups || []).map((g) => ( + {reuseGroups.map((g) => ( diff --git a/packages/scratch-gui/test/unit/components/teacher-assignment-board.test.jsx b/packages/scratch-gui/test/unit/components/teacher-assignment-board.test.jsx index 93dc0a782ed..5d71610bf7c 100644 --- a/packages/scratch-gui/test/unit/components/teacher-assignment-board.test.jsx +++ b/packages/scratch-gui/test/unit/components/teacher-assignment-board.test.jsx @@ -199,3 +199,33 @@ describe('TeacherAssignmentBoard — retention notice (issue #1052)', () => { expect(byTestId('classroom-board-expiry-c1')).not.toBeInTheDocument(); }); }); + +describe('TeacherAssignmentBoard — reuse excludes archived (review feedback)', () => { + test('reuse candidates and the class filter exclude archived classes and assignments', () => { + const allGroups = [ + { groupId: 'g1', name: 'A', year: 2026, status: 'active', topics: [] }, + { groupId: 'gArch', name: 'B', year: 2026, status: 'archived', topics: [] }, + ]; + const allClassrooms = [ + { classroomId: 'active1', groupId: 'g1', assignmentName: 'A課題', status: 'active' }, + { classroomId: 'archAssign', groupId: 'g1', assignmentName: 'アーカイブ課題', status: 'archived' }, + { classroomId: 'inArchGroup', groupId: 'gArch', assignmentName: 'アーカイブ組の課題', status: 'active' }, + ]; + renderBoard({ + group: { groupId: 'g1', name: 'A', year: 2026, topics: [] }, + allGroups, + allClassrooms, + }); + fireEvent.click(byTestId('classroom-board-reuse')); + + // Only the active assignment of an active class is a candidate. + expect(byTestId('classroom-board-reuse-copy-active1')).toBeInTheDocument(); + expect(byTestId('classroom-board-reuse-copy-archAssign')).not.toBeInTheDocument(); + expect(byTestId('classroom-board-reuse-copy-inArchGroup')).not.toBeInTheDocument(); + + // The class filter lists only the active class. + const values = [...byTestId('classroom-board-reuse-filter').options].map((o) => o.value); + expect(values).toContain('g1'); + expect(values).not.toContain('gArch'); + }); +}); From 08f4d8c2a4f3cea304a4f799f9f5eca2d96ba280 Mon Sep 17 00:00:00 2001 From: "smalruby3-editor-bot[bot]" <297607354+smalruby3-editor-bot[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 14:23:34 +0000 Subject: [PATCH 9/9] =?UTF-8?q?fix(classroom):=20=E8=AA=B2=E9=A1=8C?= =?UTF-8?q?=E4=B8=80=E8=A6=A7=E3=81=AE=E3=82=A2=E3=82=AF=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E4=B8=A6=E3=81=B3=E6=9B=BF=E3=81=88=E3=81=A8=E3=81=BF?= =?UTF-8?q?=E3=82=93=E3=81=AA=E3=81=AE=E8=AA=B2=E9=A1=8C=E3=82=BF=E3=83=96?= =?UTF-8?q?=E3=81=AE=E8=A6=8B=E3=81=9F=E7=9B=AE=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 人間レビュー指摘の対応: - 課題一覧のアクションボタンを 課題を作る → 課題を再利用 → みんなの課題からさがす → 合言葉で取り込み → 全課題の提出物をダウンロード の順に並び替え(ダウンロードを末尾へ移動)。 - みんなの課題カタログの「閉じる」ボタンのラベルを「キャンセル」に変更。 - すべて / 自分の投稿 タブの見た目を課題詳細の 説明 / メンバー タブに統一。 アクティブタブに detailTab を常に適用したうえで detailTabActive を 重ねるように classNames 化し、透明背景・下線・太字がベーススタイルから 外れて既定ボタン見た目になっていた不整合を解消。 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../shared-assignment-catalog.jsx | 13 ++++-- .../teacher-assignment-board.jsx | 40 ++++++++++--------- packages/scratch-gui/src/locales/ja-Hira.js | 2 +- packages/scratch-gui/src/locales/ja.js | 2 +- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/packages/scratch-gui/src/components/classroom-modal/shared-assignment-catalog.jsx b/packages/scratch-gui/src/components/classroom-modal/shared-assignment-catalog.jsx index 73f89e5a798..e4847c06596 100644 --- a/packages/scratch-gui/src/components/classroom-modal/shared-assignment-catalog.jsx +++ b/packages/scratch-gui/src/components/classroom-modal/shared-assignment-catalog.jsx @@ -4,6 +4,7 @@ * manage the caller's own posts (unlist / republish). Supplement URLs open * behind an explicit confirmation that names the external domain (D4). */ +import classNames from 'classnames'; import PropTypes from 'prop-types'; import React, { useCallback, useState } from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -390,8 +391,8 @@ const SharedAssignmentCatalog = ({ group, isLoading, shared }) => { @@ -399,7 +400,9 @@ const SharedAssignmentCatalog = ({ group, isLoading, shared }) => {
- {onDownloadClassAll ? ( - - ) : null} + {/* 並び順(レビュー指摘): 作る → 再利用 → みんなの課題からさがす → + 合言葉で取り込み → 全課題の提出物をダウンロード。 */} {shared ? ( ) : null} + {onDownloadClassAll ? ( + + ) : null}
)} diff --git a/packages/scratch-gui/src/locales/ja-Hira.js b/packages/scratch-gui/src/locales/ja-Hira.js index 08f84f426b8..82068659ee6 100644 --- a/packages/scratch-gui/src/locales/ja-Hira.js +++ b/packages/scratch-gui/src/locales/ja-Hira.js @@ -422,7 +422,7 @@ export default { 'gui.classroom.shared.passcodeImportBtn': 'このクラスにとりこむ', 'gui.classroom.shared.openCatalog': 'みんなのかだいからさがす', 'gui.classroom.shared.catalogTitle': 'みんなのかだい — ぜんこくのせんせいがきょうゆうしたかだい', - 'gui.classroom.shared.catalogClose': 'とじる', + 'gui.classroom.shared.catalogClose': 'キャンセル', 'gui.classroom.shared.tabAll': 'すべて', 'gui.classroom.shared.tabMine': 'じぶんのとうこう', 'gui.classroom.shared.filterAllLevels': 'すべてのがっこうしゅ', diff --git a/packages/scratch-gui/src/locales/ja.js b/packages/scratch-gui/src/locales/ja.js index 2504c6baecc..40e0fbde79c 100644 --- a/packages/scratch-gui/src/locales/ja.js +++ b/packages/scratch-gui/src/locales/ja.js @@ -413,7 +413,7 @@ export default { 'gui.classroom.shared.passcodeImportBtn': 'このクラスに取り込む', 'gui.classroom.shared.openCatalog': 'みんなの課題からさがす', 'gui.classroom.shared.catalogTitle': 'みんなの課題 — 全国の先生が共有した課題', - 'gui.classroom.shared.catalogClose': '閉じる', + 'gui.classroom.shared.catalogClose': 'キャンセル', 'gui.classroom.shared.tabAll': 'すべて', 'gui.classroom.shared.tabMine': '自分の投稿', 'gui.classroom.shared.filterAllLevels': 'すべての学校種',