11"use client" ;
22
3- import { useState } from "react" ;
3+ import { useEffect , useRef , useState } from "react" ;
44import { Button } from "@/components/ui/button" ;
55import { updateScanReportTable } from "@/api/scanreports" ;
66import { Check , Save , X } from "lucide-react" ;
77import { toast } from "sonner" ;
88import { FormDataFilter } from "../form-components/FormikUtils" ;
9- import { Formik } from "formik" ;
9+ import { Formik , useFormikContext } from "formik" ;
1010import { FormField , FormItem , FormLabel , FormControl , FormMessage , FormDescription } from "@/components/ui/form" ;
1111import { FormikSelect } from "../form-components/FormikSelect" ;
1212import { useRouter } from "next/navigation" ;
@@ -31,6 +31,39 @@ interface FormData {
3131 death_table : boolean ;
3232}
3333
34+ function DeathDateModalController ( {
35+ deathDateFieldId,
36+ setIsDialogOpen,
37+ pendingRevertRef,
38+ } : {
39+ deathDateFieldId ?: number ;
40+ setIsDialogOpen : ( open : boolean ) => void ;
41+ pendingRevertRef : React . MutableRefObject < number | null | undefined > ;
42+ } ) {
43+ const { values, setFieldValue } = useFormikContext < FormData > ( ) ;
44+ const prevDateEventRef = useRef ( values . dateEvent ) ;
45+
46+ useEffect ( ( ) => {
47+ const prev = prevDateEventRef . current ;
48+ const next = values . dateEvent ;
49+ prevDateEventRef . current = next ;
50+
51+ if ( ! deathDateFieldId || next === prev ) return ;
52+
53+ if ( next === deathDateFieldId && ! values . death_table ) {
54+ pendingRevertRef . current = prev ?? null ;
55+ setIsDialogOpen ( true ) ;
56+ return ;
57+ }
58+
59+ if ( values . death_table && next !== deathDateFieldId ) {
60+ setFieldValue ( "death_table" , false ) ;
61+ }
62+ } , [ deathDateFieldId , values . dateEvent , values . death_table ] ) ;
63+
64+ return null ;
65+ }
66+
3467export function ScanReportTableUpdateForm ( {
3568 scanreportFields,
3669 scanreportTable,
@@ -46,13 +79,17 @@ export function ScanReportTableUpdateForm({
4679} ) {
4780 const router = useRouter ( ) ;
4881 const [ isDialogOpen , setIsDialogOpen ] = useState ( false ) ;
82+ const pendingDateEventRevertRef = useRef < number | null | undefined > ( undefined ) ;
4983 const canUpdate =
5084 permissions . includes ( "CanEdit" ) || permissions . includes ( "CanAdmin" ) ;
5185
5286 const fieldOptions = FormDataFilter < ScanReportField > ( scanreportFields ) ;
5387
5488 const initialPersonId = FormDataFilter < ScanReportField > ( personId ) ;
5589 const initialDateEvent = FormDataFilter < ScanReportField > ( dateEvent ) ;
90+ const deathDateField = scanreportFields . find (
91+ ( field ) => field . name ?. trim ( ) . toLowerCase ( ) === "death_date" ,
92+ ) ;
5693
5794 const handleSubmit = async ( data : FormData ) => {
5895 const submittingData = {
@@ -92,6 +129,11 @@ export function ScanReportTableUpdateForm({
92129 { ( { handleSubmit, values, setFieldValue } ) => (
93130 < form className = "w-full max-w-2xl" onSubmit = { handleSubmit } >
94131 < div className = "flex flex-col gap-5" >
132+ < DeathDateModalController
133+ deathDateFieldId = { deathDateField ?. id }
134+ setIsDialogOpen = { setIsDialogOpen }
135+ pendingRevertRef = { pendingDateEventRevertRef }
136+ />
95137
96138 < FormItem >
97139 < FormLabel > Person ID</ FormLabel >
@@ -134,7 +176,16 @@ export function ScanReportTableUpdateForm({
134176 < Tooltips
135177 content = "In the Carrot data standard, death data is provided in a separate file (e.g. death.csv). Mark Yes if this table contains that death data to be mapped to the OMOP Death table."
136178 />
137- < Dialog open = { isDialogOpen } onOpenChange = { setIsDialogOpen } >
179+ < Dialog
180+ open = { isDialogOpen }
181+ onOpenChange = { ( open ) => {
182+ setIsDialogOpen ( open ) ;
183+ if ( ! open && pendingDateEventRevertRef . current !== undefined ) {
184+ setFieldValue ( "dateEvent" , pendingDateEventRevertRef . current ) ;
185+ pendingDateEventRevertRef . current = undefined ;
186+ }
187+ } }
188+ >
138189 < DialogContent >
139190 < DialogHeader >
140191 < DialogTitle > Please Confirm Your Choice</ DialogTitle >
@@ -176,6 +227,7 @@ export function ScanReportTableUpdateForm({
176227 < Button
177228 type = "button"
178229 onClick = { ( ) => {
230+ pendingDateEventRevertRef . current = undefined ;
179231 setFieldValue ( "death_table" , true ) ;
180232 setIsDialogOpen ( false ) ;
181233 } }
0 commit comments