diff --git a/docs/phases/03-staffing/reviewed.md b/docs/phases/03-staffing/reviewed.md index ab98fb7..5980f58 100644 --- a/docs/phases/03-staffing/reviewed.md +++ b/docs/phases/03-staffing/reviewed.md @@ -87,3 +87,49 @@ - `docs/protocol.md` всё ещё писал, что у соискателя в `GET /staffing` «три сильных навыка»; API давно отдаёт все навыки (окно пула сравнивает целиком). + +## Перепроверка среза 3. Штат (после 11–14) + +- **Фазы:** 10–13 +- **Проверен на:** `PLACEHOLDER`, 2026-08-21 +- **Пути:** `src/HSchool.People/Staffing.cs`, `src/HSchool.People/ApplicantPool.cs`, + `src/HSchool.Content/SubjectDef` и `defs/staffing`, `src/HSchool.Server/Api/SchoolEndpoints.cs` + (staffing/hire/subjects), `src/HSchool.Server/mods/core/defs/{subjects,positions,rooms,staffing,traits}`, + `src/HSchool.Client/src/ui/{managementPanel,mapEditor,applicantsDialog,gameScreen}.ts`, + `src/HSchool.Client/src/net/api.ts`, `docs/protocol.md` (staffing), + `tests/HSchool.People.Tests/{StaffingTests,ApplicantPoolTests,RosterGeneratorTests}.cs`, + `tests/HSchool.AppHost.Tests/StaffingApiTests.cs`, + `tests/HSchool.Content.Tests/{VanillaCoreTests,PeopleDefTests}.cs`, + `src/HSchool.Client/src/ui/{managementPanel,mapEditor,gameScreen}.test.ts` +- **Итог:** перепроверка после дрейфа с `cf1403e` (notices, class teachers, summons, + `PrincipalPosition`). Обещания фаз 10–13 целы. Дописаны 2 клиентских якоря. Код среза не чинился. + +Что подтверждено: + +- Нет `PETeacher`; кабинет — `defaultSeats` без учительской должности; слоты у столовой, + медкабинета, кабинета директора и библиотеки. Неизвестный навык роняет каталог. + Старт — суббота 31 марта 2012. `GET /api/catalog` отдаёт предметы. +- Пул 32; те же шесть обещаний фазы 11 в `ApplicantPoolTests` / `RosterGeneratorTests.NewSchool_HasNoStaff`. +- Фонд, деление часов, `MaxWeeklyHours` → непокрытость, предел 100 000 в момент действия, + `GET /staffing` со снимка, hire/assign через мейлбокс. Девять `StaffingApiTests` зелёные. + `PrimarySchool` на ванили — трое (`teachersShort`). +- Экран: Обзор / Управление у владельца, деньги, непокрытые, окно пула (имя, ставка, навыки), + штат, назначение с карточки, отказ по пределу текстом, `t(...)`. + +Дрейф с прошлой проверки (не регрессия среза 3): + +- В `Staffing` появилась константа `PrincipalPosition` (вызовы директора). +- Во «Управлении» — классные руководители и вкладка правил; `SchoolEndpoints` / `protocol.md` + разрослись notices и class-teacher API. + +Дописано: + +- `GameScreen` — у владельца видны вкладки «Обзор» и «Управление» рядом с часами. +- `ManagementPanel` payroll-тест — в строке пула имя, ставка и навык, не только отказ по пределу. + +Исправлено: ничего. + +Открытое: + +- Дизайн среза 3 всё ещё пишет «классное руководство — не сейчас»; это закрыл срез 12, док + среза 3 намеренно исторический — править не стал. diff --git a/docs/phases/reviewed.md b/docs/phases/reviewed.md index b6fe08d..ddeaeb0 100644 --- a/docs/phases/reviewed.md +++ b/docs/phases/reviewed.md @@ -22,7 +22,7 @@ | --- | --- | --- | | Срез 1. Оболочка и карта | `5a0d75b` | [01-shell](01-shell/reviewed.md) | | Срез 2. Люди | `c3d17ca` | [02-people](02-people/reviewed.md) | -| Срез 3. Штат | `cf1403e` | [03-staffing](03-staffing/reviewed.md) | +| Срез 3. Штат | `PLACEHOLDER` | [03-staffing](03-staffing/reviewed.md) | | Срез 4. Расписание | `01ef277` | [04-schedule](04-schedule/reviewed.md) | | Срез 5. Жизнь школы | `1118c59` | [05-ai](05-ai/reviewed.md) | | Срез 6. Фундамент | `1c63357` | [06-foundation](06-foundation/reviewed.md) | diff --git a/src/HSchool.Client/src/ui/gameScreen.test.ts b/src/HSchool.Client/src/ui/gameScreen.test.ts index 9a23b92..e9823b0 100644 --- a/src/HSchool.Client/src/ui/gameScreen.test.ts +++ b/src/HSchool.Client/src/ui/gameScreen.test.ts @@ -134,6 +134,27 @@ describe('GameScreen speed buttons', () => { expect((manageTab as HTMLElement).hidden).toBe(true); expect((screen.element.querySelector('.clock__controls') as HTMLElement).hidden).toBe(true); }); + + it('shows Overview and Management mode tabs for the owner', () => { + const screen = new GameScreen({ + onLeave: () => {}, + onSetRunning: () => {}, + onSetSpeed: () => {}, + onSkip: () => {}, + }); + + document.body.append(screen.element); + screen.show(school()); + + const tabs = [...screen.element.querySelectorAll('.mode-tab')]; + expect(tabs).toHaveLength(2); + expect(tabs[0]?.textContent).toBe(t('modeOverview')); + expect(tabs[1]?.textContent).toBe(t('modeManage')); + expect(tabs[0]?.hidden).toBe(false); + expect(tabs[1]?.hidden).toBe(false); + expect(tabs[0]?.classList.contains('mode-tab--active')).toBe(true); + expect(screen.element.querySelector('.clockbar')).not.toBeNull(); + }); }); describe('GameScreen location tree', () => { diff --git a/src/HSchool.Client/src/ui/managementPanel.test.ts b/src/HSchool.Client/src/ui/managementPanel.test.ts index e9c7f4c..3cc03ea 100644 --- a/src/HSchool.Client/src/ui/managementPanel.test.ts +++ b/src/HSchool.Client/src/ui/managementPanel.test.ts @@ -110,7 +110,7 @@ function staffing(): Staffing { isParent: true, hourlyWageAsk: 12, monthlyBase: 2_000, - skills: [], + skills: [{ id: 'Mathematics', label: 'Math', value: '78' }], traits: [], }, ], @@ -191,6 +191,10 @@ describe('ManagementPanel payroll cap', () => { throw new Error('applicant row is missing'); } + expect(row.textContent).toContain('Sidorova Anna'); + expect(row.textContent).toContain(formatMoney(12)); + expect(row.textContent).toContain('Math'); + row.click(); await vi.waitFor(() => expect(fetchPerson).toHaveBeenCalled()); await vi.waitFor(() =>