Phase 6: Plan-Ansicht — solution list + weekly grid view
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 27s
CI / test-go-edu-search (push) Successful in 29s
CI / test-python-klausur (push) Failing after 3m18s
CI / test-python-agent-core (push) Successful in 20s
CI / test-nodejs-website (push) Successful in 23s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 27s
CI / test-go-edu-search (push) Successful in 29s
CI / test-python-klausur (push) Failing after 3m18s
CI / test-python-agent-core (push) Successful in 20s
CI / test-nodejs-website (push) Successful in 23s
Frontend additions in studio-v2:
- types.ts adds TimetableSolution, TimetableLesson, SolutionStatus,
CreateTimetableSolution mirroring the Go models.
- lib/stundenplan/api.ts adds solutionsApi with list/get/create/remove/
lessons. Solve trigger is POST /timetable/solutions — school-service
forwards to the solver-service over the Docker network.
- _components/plan/SolutionList: table of past solves with status
badges, hard/soft score, Anzeigen + Loeschen buttons, and a
'Neuen Plan generieren' trigger. Auto-polls every 4 s while any
solution is pending/running, clears the interval otherwise.
- _components/plan/PlanView: Mo–Fr × period weekly grid. Three
perspectives (Klasse / Lehrer / Raum) toggleable via test-id'd
buttons; selector below lists every unique resource with at least
one lesson. Cells colour-coded by tt_subject.color.
- _components/plan/PlanHub orchestrates list + view; default tab in
page.tsx switches from 'klassen' to 'plan'.
Tests:
- mockSchoolApi helper extracted to e2e/_helpers.ts so the spec file
stays under 500 LOC. Helper now also mocks /solutions GET/POST/DELETE
and /solutions/:id/lessons; solutions kept in a closure so POST
appears in the next GET.
- 8 new tests across two suites: SolutionList empty state, list
render, completed-vs-failed Anzeigen visibility, solve trigger;
PlanView placeholder when no selection, grid render, perspective
switching.
- Existing Klassen CRUD tests now click the Klassen tab first
(Plan is the new default landing tab).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@ import type {
|
||||
SubjectPreferredPeriod, SubjectDoubleLesson,
|
||||
ClassMaxHoursDay, ClassNoGaps,
|
||||
RoomRequiresType, RoomUnavailable,
|
||||
TimetableSolution, TimetableLesson, CreateTimetableSolution,
|
||||
} from '@/app/stundenplan/types'
|
||||
|
||||
const TOKEN_KEY = 'bp_stundenplan_jwt'
|
||||
@@ -138,3 +139,16 @@ export const classNoGapsApi = constraintApi<ClassNoGaps, Omit<ClassNoGaps, 'id'
|
||||
|
||||
export const roomRequiresTypeApi = constraintApi<RoomRequiresType, Omit<RoomRequiresType, 'id' | 'created_by_user_id' | 'created_at'>>('room/requires-type')
|
||||
export const roomUnavailableApi = constraintApi<RoomUnavailable, Omit<RoomUnavailable, 'id' | 'created_by_user_id' | 'created_at'>>('room/unavailable')
|
||||
|
||||
// ---------- Solutions ----------
|
||||
|
||||
export const solutionsApi = {
|
||||
list: () => apiFetch<TimetableSolution[]>('/timetable/solutions'),
|
||||
get: (id: string) => apiFetch<TimetableSolution>(`/timetable/solutions/${id}`),
|
||||
create: (data: CreateTimetableSolution) =>
|
||||
apiFetch<TimetableSolution>('/timetable/solutions', { method: 'POST', body: JSON.stringify(data) }),
|
||||
remove: (id: string) =>
|
||||
apiFetch<void>(`/timetable/solutions/${id}`, { method: 'DELETE' }),
|
||||
lessons: (id: string) =>
|
||||
apiFetch<TimetableLesson[]>(`/timetable/solutions/${id}/lessons`),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user