Files
psu-schedule/shared/lessons.d.ts
Zakhar Timoshenko 10c85e3bb9 feat: read "Занятия в Полоцке" as a day's town, show it in all clients
- Parser 14 (server/places.js): "Занятия в Полоцке/Новополоцке/г. Новополоцк" over a day's first row is no longer a lesson but a note of the day for its column (`places`); lessons of that day get `place`. A lesson below the note in the same cell keeps its own subject.
- A town on its own line ("Новополоцк", "г.Новополоцк") or after a room ("246(Новополоцк)") becomes the lesson's `place` and leaves the subject and room. "История Полоцка" is not a town.
- API 14: `place` on lessons and `places` on days of /api/timetable, `place` in the directory. The day notes are shared by the server and the PWA (shared/places.js); the same note in every subgroup reads as the whole group's.
- Android, PWA and iOS: a "Занятия в Полоцке" card above the day's lessons (day pages, calendar, overview, week view, desk stand), "Полоцк" under the date in the week grid, "249Ж · Полоцк" on lesson cards, a "Город" row in details, the town in widgets, tile, reminders and change lists.
- Snapshot lines show the town and the day notes; tests for notes, towns in cells and the API.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 01:26:54 +03:00

47 lines
1.2 KiB
TypeScript

interface LessonLike {
day: number;
date: string | null;
start: string;
end: string | null;
subject: string;
teacher: string;
room: string;
place?: string;
type: string;
condition: string;
variant: "all" | "upper" | "lower";
groups: string[];
subgroups: { group: string; label: string }[];
}
export interface FieldChange {
field: string;
label: string;
from: string | number;
to: string | number;
}
export interface ScheduleDiff<L> {
added: L[];
removed: L[];
changed: { before: L; after: L; fields: FieldChange[] }[];
}
export interface PersonalPrefs {
subgroup?: string | null;
hidden?: string[];
}
export function lessonKey(lesson: LessonLike, group: string): string;
export function diffSchedules<L extends LessonLike>(
before: { lessons: L[] } | null | undefined,
after: { lessons: L[] } | null | undefined,
group: string,
): ScheduleDiff<L>;
export function changeCount(diff: ScheduleDiff<unknown> | null | undefined): number;
export function personalFilter(
lesson: LessonLike,
group: string,
prefs: PersonalPrefs | null | undefined,
): "shown" | "hidden" | "other-subgroup";
export function subgroupsOf(
schedule: { lessons: LessonLike[] } | null | undefined,
group: string,
): string[];