From b3fdd3a4a564dc467f06753beccd5809ad972c3e Mon Sep 17 00:00:00 2001 From: Min Ji Choi Date: Mon, 18 May 2026 11:27:02 -0600 Subject: [PATCH] DBC22-6284: Added internal notes changes in event history --- src/frontend/app/events/History/Version.jsx | 9 +++- .../app/events/History/preprocessors.jsx | 22 +++++++++- src/webapp/apps/events/serializers.py | 43 ++++++++++++++++++- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/frontend/app/events/History/Version.jsx b/src/frontend/app/events/History/Version.jsx index 690bf88e..2d4a197e 100644 --- a/src/frontend/app/events/History/Version.jsx +++ b/src/frontend/app/events/History/Version.jsx @@ -30,10 +30,11 @@ const GROUPING = { end_time: 'timing', ongoing: 'timing', schedules: 'timing', - link: 'external' + link: 'external', + notes: 'internal', } -const GROUP_ORDER = ['location', 'details', 'impacts', 'delays', 'restrictions', 'conditions', 'timing', 'schedule', 'additional', 'external']; +const GROUP_ORDER = ['location', 'details', 'impacts', 'delays', 'restrictions', 'conditions', 'timing', 'schedule', 'additional', 'external', 'internal']; const GROUPS = { start: { @@ -80,6 +81,10 @@ const GROUPS = { label: 'Additional details external site', preprocessor: funcs.external, }, + internal: { + label: 'Internal Notes', + preprocessor: funcs.internal, + }, }; function group(data) { diff --git a/src/frontend/app/events/History/preprocessors.jsx b/src/frontend/app/events/History/preprocessors.jsx index 0a31e8e5..30e48651 100644 --- a/src/frontend/app/events/History/preprocessors.jsx +++ b/src/frontend/app/events/History/preprocessors.jsx @@ -185,8 +185,28 @@ export function external(event, diff) { return [{ label: `${verb} more information link`, icon, verb, previous, current }]; } +export function internal(event, diff) { + const items = []; + diff.add?.forEach((add) => { + items.push({ label: 'Added internal note', icon: faPlus, verb: 'Added', current: add.text }); + }); + diff.remove?.forEach((remove) => { + items.push({ label: 'Removed internal note', icon: faMinus, verb: 'Removed', previous: remove.text }); + }); + diff.change?.forEach((change) => { + items.push({ + label: 'Updated internal note', + icon: faArrowsRotate, + verb: 'Updated', + previous: change.previous, + current: change.current, + }); + }); + return items; +} + export default { - location, details, impacts, delays, restrictions, timing, schedule, conditions, additional, external + location, details, impacts, delays, restrictions, timing, schedule, conditions, additional, external, internal }; function getTypeOfChange(current, previous) { diff --git a/src/webapp/apps/events/serializers.py b/src/webapp/apps/events/serializers.py index d4e6018e..6d3335f2 100644 --- a/src/webapp/apps/events/serializers.py +++ b/src/webapp/apps/events/serializers.py @@ -235,8 +235,49 @@ def get_id(self): return f'{EVENT_PREFIX}-{int(event.id.split('-')[-1]) + 1}' +def notes_diff_for_event_version(event): + ''' + Return note add/update/remove changes that occurred between the prior + event version and this one (by last_updated timestamp). + ''' + prior = event.prior() if event.version > 0 else None + start = prior.last_updated if prior else None + end = event.last_updated + + qs = Note.objects.filter(event=str(event.id), last_updated__lte=end) + if start: + qs = qs.filter(last_updated__gt=start) + + result = {} + for note in qs.order_by('id', 'version'): + if note.deleted: + prior_note = note.prior() + result.setdefault('remove', []).append({ + 'id': note.id, + 'text': prior_note.text if prior_note else note.text, + }) + elif note.version == 0: + result.setdefault('add', []).append({'id': note.id, 'text': note.text}) + else: + prior_note = note.prior() + if prior_note and prior_note.text != note.text: + result.setdefault('change', []).append({ + 'id': note.id, + 'previous': prior_note.text, + 'current': note.text, + }) + + return result + + class EventHistorySerializer(EventSerializer, HistorySerializer): - pass + + def get_diff(self, obj): + changes = obj.diff() + notes_diff = notes_diff_for_event_version(obj) + if notes_diff: + changes['internal'] = notes_diff + return changes class EventDiffSerializer(EventSerializer, HistorySerializer):