From c15ff0e4629eeed56a59e79cefdf66fb35451622 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Thu, 6 Aug 2026 12:19:33 +0200 Subject: remove observations and present mandatory candidates in the mass view --- src/graduation-common.ts | 258 ++++++----------------------------------------- 1 file changed, 29 insertions(+), 229 deletions(-) (limited to 'src/graduation-common.ts') diff --git a/src/graduation-common.ts b/src/graduation-common.ts index 2c0fb69..bb74dc1 100644 --- a/src/graduation-common.ts +++ b/src/graduation-common.ts @@ -29,14 +29,14 @@ class GraduationChange { change: string, reason: string, coach: string, - context: any, + context?: any, ) { this.date = date; this.studentId = studentId; this.change = change; this.reason = reason; this.coach = coach; - this.context = context; + this.context = context || {}; } dbFields() { @@ -61,46 +61,24 @@ class GraduationChange { ); } - static newObservationRequest() { - return new GraduationChange(new Date(), -1, "ObservationRequest", "", "", ""); + static newLevelChange(level: number, reason?: string, coach?: string) { + const ctx = { level: level }; + return new GraduationChange(new Date(), -1, "LevelChange", reason || "", coach || "", ctx); } - static newObservationStart() { - return new GraduationChange(new Date(), -1, "ObservationStart", "", "", ""); + static newGreenPointChange(mandatory: boolean, reason?: string, coach?: string) { + const ctx = { mandatory: mandatory }; + return new GraduationChange(new Date(), -1, "Grün", reason || "", coach || "", ctx); } - static newObservationEnd(reason: string, success: boolean) { - return new GraduationChange( - new Date(), - -1, - "ObservationEnd", - reason, - "", - JSON.stringify(success), - ); - } - - static newObservationChange(observation: Observation) { - return new GraduationChange( - observation.date, - -1, - "Observation", - "", - "", - JSON.stringify(observation.status), - ); - } - - static newGreenPointChange(reason: string, coach: string) { - return new GraduationChange(new Date(), -1, "Grün", reason, coach, ""); - } - - static newOrangePointChange(reason: string, coach: string) { - return new GraduationChange(new Date(), -1, "Orange", reason, coach, ""); + static newOrangePointChange(mandatory: boolean, reason?: string, coach?: string) { + const ctx = { mandatory: mandatory }; + return new GraduationChange(new Date(), -1, "Orange", reason || "", coach || "", ctx); } - static newRedPointChange(reason: string, coach: string) { - return new GraduationChange(new Date(), -1, "Rot", reason, coach, ""); + static newRedPointChange(mandatory: boolean, reason?: string, coach?: string) { + const ctx = { mandatory: mandatory }; + return new GraduationChange(new Date(), -1, "Rot", reason || "", coach || "", ctx); } } @@ -109,10 +87,8 @@ class Graduation { green: number; orange: number; red: number; + mandatory: number; level: number; - observationRequested: Date | null; - observation: ObservationPeriod | null; - pastObservations: Array; changes: Array; constructor( @@ -120,10 +96,8 @@ class Graduation { green: number, orange: number, red: number, + mandatory: number, level: number, - observationRequested: Date | null, - observation: ObservationPeriod | null, - pastObservations: Array, changes: Array, ) { this.student = student; @@ -131,9 +105,7 @@ class Graduation { this.orange = orange; this.red = red; this.level = level; - this.observationRequested = observationRequested; - this.observation = observation; - this.pastObservations = pastObservations; + this.mandatory = mandatory; this.changes = changes; student.graduation = this; @@ -143,10 +115,8 @@ class Graduation { let green = 0; let orange = 0; let red = 0; + let mandatory = 0; let level = 1; - let openObservationRequest = null; - let observationPeriod = null; - let pastObservations = []; // The parsing logic assumes that changes are ordered chronologically changes.sort((a, b) => a.date.valueOf() - b.date.valueOf()); @@ -165,39 +135,6 @@ class Graduation { red++; break; - case "ObservationRequest": - openObservationRequest = change.date; - break; - - case "ObservationStart": - console.assert(openObservationRequest === null, "No request for observation start"); - - observationPeriod = new ObservationPeriod(change.date); - openObservationRequest = null; - break; - - case "ObservationEnd": - if (observationPeriod === null) { - console.error("No active observation period"); - continue; - } - observationPeriod.finishPeriod(change.context.success); - if (change.context.success) { - level++; - } - pastObservations.push(observationPeriod); - observationPeriod = null; - break; - - case "Observation": - if (observationPeriod === null) { - console.error("No active observation period"); - continue; - } - const observation = Observation.fromChange(change); - observationPeriod.addObservation(observation); - break; - case "LevelChange": level = change.context.level; break; @@ -205,18 +142,12 @@ class Graduation { default: throw new Error(`Unexpected change: ${change}`); } + + if (change.context.mandatory) { + mandatory++; + } } - return new Graduation( - student, - green, - orange, - red, - level, - openObservationRequest, - observationPeriod, - pastObservations, - changes, - ); + return new Graduation(student, green, orange, red, mandatory, level, changes); } addChange(change: GraduationChange) { @@ -228,50 +159,6 @@ class Graduation { Graduation.from(this.student, changes); } - /** - * Request observation - */ - async requestObservation() { - const request = GraduationChange.newObservationRequest(); - this.observationRequested = request.date; - const db = await getGraduationDb(); - await db.saveEntry(JSON.stringify(request.dbFields())); - } - - /** - * Start an observation - */ - async startObservation() { - if (this.observationRequested === null) { - console.error("No observation requested"); - return; - } - this.observationRequested = null; - this.observation = new ObservationPeriod(new Date()); - return submitGraduationChange(this, GraduationChange.newObservationStart()); - } - - /** - * End an observation - */ - async endObservation(reason: string, success: boolean) { - if (this.observation === null) { - console.error("No active observation"); - return; - } - this.observation.end = new Date(); - this.pastObservations.push(this.observation); - this.observation = null; - return submitGraduationChange(this, GraduationChange.newObservationEnd(reason, success)); - } - - /** - * Return if the student is in observation. - */ - isObserved() { - return Boolean(this.observation); - } - /** * Return the URI of the icon representing the graduation level. */ @@ -285,83 +172,12 @@ class Graduation { getLevelName() { return LEVEL_NAMES[this.level - 1]; } -} - -class ObservationPeriod { - start: Date; - end: Date | null; - observations: Array; - success = false; - - constructor(start: Date) { - this.start = start; - this.end = null; - this.observations = []; - } - finishPeriod(success: boolean) { - this.end = new Date(); - this.success = success; - } - - ended() { - return Boolean(this.end); - } - - ready() { - if (this.observations.length < 10) return false; - - // at least 10 observation on different days - let days = new Map(); - for (const observation of this.observations) { - const d = observation.date; - days.set(`${d.getFullYear()}${d.getMonth()}${d.getDate()}`, true); - } - return days.size >= 10; - } - - getObservationsSums() { - let sums = Array(OBSERVATION_TYPES.length) - .fill(null) - .map(() => ({ yes: 0, no: 0 })); - for (const observation of this.observations) { - for (let i = 0; i < sums.length; i++) { - if (observation.status[i]) { - if (observation.status[i] === "yes") sums[i].yes++; - else sums[i].no++; - } - } - } - return sums; - } - - addObservation(observation: Observation) { - this.observations.push(observation); - } -} - -const OBSERVATION_TYPES = [ - "Arbeitet konzentriert an Aufgaben", - "Arbeitet zunehmend selbstständig", - "Führt das Logbuch zuverlässig", - "Bringt Material mit", - "Hält Regeln ein", - "Geht verantwortungsvoll mit Materialien und LernRaum um", - "Nimmt Rückmeldungen an und setzt sie um", -]; - -class Observation { - date: Date; - status: Array; - - constructor(date: Date, status: Array) { - console.assert(status.length == OBSERVATION_TYPES.length, "invalid observation status"); - this.date = date; - this.status = status; - } - - static fromChange(change: GraduationChange) { - return new Observation(change.date, JSON.parse(change.context)); + /** + * Return the combined value of all points. + */ + getNettoPoints(): number { + return this.green - this.orange - this.red; } } @@ -371,20 +187,4 @@ async function submitGraduationChange(graduation: Graduation, change: Graduation return db.saveEntry(JSON.stringify(change.dbFields())); } -async function submitObservation(graduation: Graduation, observation: Observation) { - if (graduation.observation === null) throw new Error("no active observation"); - graduation.observation.addObservation(observation); - await submitGraduationChange(graduation, GraduationChange.newObservationChange(observation)); -} - -export { - LEVEL_NAMES, - LEVEL_IMAGES, - GraduationChange, - Graduation, - submitGraduationChange, - submitObservation, - OBSERVATION_TYPES, - Observation, - ObservationPeriod, -}; +export { LEVEL_NAMES, LEVEL_IMAGES, GraduationChange, Graduation, submitGraduationChange }; -- cgit v1.2.3