From 20e4bca5e10db34eb870e69647fc0f42d948202a Mon Sep 17 00:00:00 2001 From: Rabi <134292357+Rabi94@users.noreply.github.com> Date: Thu, 21 May 2026 18:45:13 -0300 Subject: [PATCH 1/4] Fix referral closing timeline --- .../src/V1Referrals/CloseV1ReferralDrawer.tsx | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx b/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx index 8d4d53746..02bd8e631 100644 --- a/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx +++ b/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx @@ -20,6 +20,28 @@ interface CloseV1ReferralDrawerProps { onClose: () => void; } +function isSameLocalDate(left: Date, right: Date) { + return ( + left.getFullYear() === right.getFullYear() && + left.getMonth() === right.getMonth() && + left.getDate() === right.getDate() + ); +} + +function withCurrentLocalTimeIfToday(date: Date, now = new Date()) { + if (!isSameLocalDate(date, now)) return date; + + const dateWithCurrentTime = new Date(date); + dateWithCurrentTime.setHours( + now.getHours(), + now.getMinutes(), + now.getSeconds(), + now.getMilliseconds() + ); + + return dateWithCurrentTime; +} + export function CloseV1ReferralDrawer({ referralId, onClose, @@ -41,7 +63,11 @@ export function CloseV1ReferralDrawer({ const canSave = reason !== null && closedAtLocal !== null && !dateError; async function save() { - await closeReferral(referralId, reason!, closedAtLocal!); + await closeReferral( + referralId, + reason!, + withCurrentLocalTimeIfToday(closedAtLocal!) + ); onClose(); } From 954b001d9c6b75eea9d9ec399efce7585d2bfd92 Mon Sep 17 00:00:00 2001 From: Rabi <134292357+Rabi94@users.noreply.github.com> Date: Fri, 22 May 2026 12:36:01 -0300 Subject: [PATCH 2/4] Use date-time picker for referral close time --- .../src/V1Referrals/CloseV1ReferralDrawer.tsx | 87 +++++++++++++++---- 1 file changed, 70 insertions(+), 17 deletions(-) diff --git a/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx b/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx index 02bd8e631..68835b42c 100644 --- a/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx +++ b/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx @@ -28,18 +28,38 @@ function isSameLocalDate(left: Date, right: Date) { ); } -function withCurrentLocalTimeIfToday(date: Date, now = new Date()) { - if (!isSameLocalDate(date, now)) return date; - - const dateWithCurrentTime = new Date(date); - dateWithCurrentTime.setHours( - now.getHours(), - now.getMinutes(), - now.getSeconds(), - now.getMilliseconds() +function isSameLocalTime(left: Date, right: Date) { + return ( + left.getHours() === right.getHours() && + left.getMinutes() === right.getMinutes() && + left.getSeconds() === right.getSeconds() && + left.getMilliseconds() === right.getMilliseconds() + ); +} + +function withLocalTime(date: Date, time: Date) { + const dateWithTime = new Date(date); + dateWithTime.setHours( + time.getHours(), + time.getMinutes(), + time.getSeconds(), + time.getMilliseconds() ); - return dateWithCurrentTime; + return dateWithTime; +} + +function atStartOfLocalDay(date: Date) { + const dateAtStartOfDay = new Date(date); + dateAtStartOfDay.setHours(0, 0, 0, 0); + + return dateAtStartOfDay; +} + +function defaultCloseDateTimeForDate(date: Date, now = new Date()) { + return isSameLocalDate(date, now) + ? withLocalTime(date, now) + : atStartOfLocalDay(date); } export function CloseV1ReferralDrawer({ @@ -54,20 +74,52 @@ export function CloseV1ReferralDrawer({ closedAtLocal: Date | null; }>({ reason: null, - closedAtLocal: null, + closedAtLocal: new Date(), }); + const [timeWasEdited, setTimeWasEdited] = useState(false); const [dateError, setDateError] = useState(false); const { reason, closedAtLocal } = fields; const canSave = reason !== null && closedAtLocal !== null && !dateError; + function updateClosedAtLocal(date: Date | null) { + if (date === null) { + setFields({ ...fields, closedAtLocal: null }); + setTimeWasEdited(false); + return; + } + + if (!closedAtLocal) { + setFields({ + ...fields, + closedAtLocal: defaultCloseDateTimeForDate(date), + }); + return; + } + + const dateChanged = !isSameLocalDate(date, closedAtLocal); + const timeChanged = !isSameLocalTime(date, closedAtLocal); + + if (!dateChanged && timeChanged) { + setTimeWasEdited(true); + setFields({ ...fields, closedAtLocal: date }); + return; + } + + if (dateChanged && !timeWasEdited) { + setFields({ + ...fields, + closedAtLocal: defaultCloseDateTimeForDate(date), + }); + return; + } + + setFields({ ...fields, closedAtLocal: date }); + } + async function save() { - await closeReferral( - referralId, - reason!, - withCurrentLocalTimeIfToday(closedAtLocal!) - ); + await closeReferral(referralId, reason!, closedAtLocal!); onClose(); } @@ -112,9 +164,10 @@ export function CloseV1ReferralDrawer({ setFields({ ...fields, closedAtLocal: date })} + onChange={updateClosedAtLocal} onErrorChange={setDateError} disableFuture + includeTime textFieldProps={{ fullWidth: true, required: true }} /> From 33a10755249fc1f51e1fd2d72888741ccb787744 Mon Sep 17 00:00:00 2001 From: Rabi <134292357+Rabi94@users.noreply.github.com> Date: Mon, 25 May 2026 21:08:29 -0300 Subject: [PATCH 3/4] display just the date on referral timeline --- .../src/V1Referrals/CloseV1ReferralDrawer.tsx | 83 +------------------ .../src/V1Referrals/V1ReferralTimeline.tsx | 2 +- 2 files changed, 3 insertions(+), 82 deletions(-) diff --git a/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx b/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx index 68835b42c..8d4d53746 100644 --- a/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx +++ b/src/caretogether-pwa/src/V1Referrals/CloseV1ReferralDrawer.tsx @@ -20,48 +20,6 @@ interface CloseV1ReferralDrawerProps { onClose: () => void; } -function isSameLocalDate(left: Date, right: Date) { - return ( - left.getFullYear() === right.getFullYear() && - left.getMonth() === right.getMonth() && - left.getDate() === right.getDate() - ); -} - -function isSameLocalTime(left: Date, right: Date) { - return ( - left.getHours() === right.getHours() && - left.getMinutes() === right.getMinutes() && - left.getSeconds() === right.getSeconds() && - left.getMilliseconds() === right.getMilliseconds() - ); -} - -function withLocalTime(date: Date, time: Date) { - const dateWithTime = new Date(date); - dateWithTime.setHours( - time.getHours(), - time.getMinutes(), - time.getSeconds(), - time.getMilliseconds() - ); - - return dateWithTime; -} - -function atStartOfLocalDay(date: Date) { - const dateAtStartOfDay = new Date(date); - dateAtStartOfDay.setHours(0, 0, 0, 0); - - return dateAtStartOfDay; -} - -function defaultCloseDateTimeForDate(date: Date, now = new Date()) { - return isSameLocalDate(date, now) - ? withLocalTime(date, now) - : atStartOfLocalDay(date); -} - export function CloseV1ReferralDrawer({ referralId, onClose, @@ -74,50 +32,14 @@ export function CloseV1ReferralDrawer({ closedAtLocal: Date | null; }>({ reason: null, - closedAtLocal: new Date(), + closedAtLocal: null, }); - const [timeWasEdited, setTimeWasEdited] = useState(false); const [dateError, setDateError] = useState(false); const { reason, closedAtLocal } = fields; const canSave = reason !== null && closedAtLocal !== null && !dateError; - function updateClosedAtLocal(date: Date | null) { - if (date === null) { - setFields({ ...fields, closedAtLocal: null }); - setTimeWasEdited(false); - return; - } - - if (!closedAtLocal) { - setFields({ - ...fields, - closedAtLocal: defaultCloseDateTimeForDate(date), - }); - return; - } - - const dateChanged = !isSameLocalDate(date, closedAtLocal); - const timeChanged = !isSameLocalTime(date, closedAtLocal); - - if (!dateChanged && timeChanged) { - setTimeWasEdited(true); - setFields({ ...fields, closedAtLocal: date }); - return; - } - - if (dateChanged && !timeWasEdited) { - setFields({ - ...fields, - closedAtLocal: defaultCloseDateTimeForDate(date), - }); - return; - } - - setFields({ ...fields, closedAtLocal: date }); - } - async function save() { await closeReferral(referralId, reason!, closedAtLocal!); onClose(); @@ -164,10 +86,9 @@ export function CloseV1ReferralDrawer({ setFields({ ...fields, closedAtLocal: date })} onErrorChange={setDateError} disableFuture - includeTime textFieldProps={{ fullWidth: true, required: true }} /> diff --git a/src/caretogether-pwa/src/V1Referrals/V1ReferralTimeline.tsx b/src/caretogether-pwa/src/V1Referrals/V1ReferralTimeline.tsx index 7fee58705..3658c733a 100644 --- a/src/caretogether-pwa/src/V1Referrals/V1ReferralTimeline.tsx +++ b/src/caretogether-pwa/src/V1Referrals/V1ReferralTimeline.tsx @@ -77,7 +77,7 @@ export function ReferralTimeline({ > - {format(item.timestamp, 'M/d/yy h:mm a')} + {format(item.timestamp, 'M/d/yy')} {item.userId ? ( From 56325384b53c35688396617722b3ee76ff37be43 Mon Sep 17 00:00:00 2001 From: Rabi <134292357+Rabi94@users.noreply.github.com> Date: Mon, 25 May 2026 21:27:12 -0300 Subject: [PATCH 4/4] display date only except for child traking in family screen timeline --- .../src/Activities/ActivityTimeline.tsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/caretogether-pwa/src/Activities/ActivityTimeline.tsx b/src/caretogether-pwa/src/Activities/ActivityTimeline.tsx index 1ba3f28ec..25f761927 100644 --- a/src/caretogether-pwa/src/Activities/ActivityTimeline.tsx +++ b/src/caretogether-pwa/src/Activities/ActivityTimeline.tsx @@ -94,6 +94,20 @@ const composeNoteType = (activity: Activity): string | null => { return null; }; +const shouldShowTimelineTime = (item: MergedTimelineItem) => { + if (item.kind !== 'family-activity') return false; + + return item.activity instanceof ChildLocationChanged; +}; + +const formatTimelineTimestamp = (item: MergedTimelineItem) => { + if (shouldShowTimelineTime(item)) { + return format(item.timestamp, 'M/d/yy h:mm a'); + } + + return format(item.timestamp, 'M/d/yy'); +}; + function embedNotesInActivities(notes: Note[], activities: Activity[]) { // We only want to show each note once, on the most recent activity entry that is // linked to that particular note. The following stateful code works by pulling from the @@ -576,7 +590,7 @@ export function ActivityTimeline({ > - {format(item.timestamp, 'M/d/yy h:mm a')} + {formatTimelineTimestamp(item)} {item.userId ? (