Merge branch 'review/slice-3-recheck'
This commit is contained in:
@@ -87,3 +87,49 @@
|
||||
|
||||
- `docs/protocol.md` всё ещё писал, что у соискателя в `GET /staffing` «три сильных навыка»;
|
||||
API давно отдаёт все навыки (окно пула сравнивает целиком).
|
||||
|
||||
## Перепроверка среза 3. Штат (после 11–14)
|
||||
|
||||
- **Фазы:** 10–13
|
||||
- **Проверен на:** `52ace87`, 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 намеренно исторический — править не стал.
|
||||
|
||||
@@ -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. Штат | `52ace87` | [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) |
|
||||
|
||||
@@ -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<HTMLElement>('.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', () => {
|
||||
|
||||
@@ -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(() =>
|
||||
|
||||
Reference in New Issue
Block a user