@@ -19,27 +19,43 @@ import {
1919 Th ,
2020 Thead ,
2121 Tr ,
22+ useToast ,
2223 VStack ,
2324} from "@chakra-ui/react" ;
2425
2526import { useBackendContext } from "../../contexts/hooks/useBackendContext" ;
26- import type { Form } from "../../types/form " ;
27+ import { useRoleContext } from "../../contexts/hooks/useRoleContext.ts " ;
2728import { formatDateString } from "../../utils/dateUtils" ;
2829import { downloadCSV } from "../../utils/downloadCSV.ts" ;
29- import { formatDataWithLabels , getKeyByValue } from "./DataFormatter.tsx" ;
30+ import {
31+ formatDataWithLabels ,
32+ getKeyByValue , reverseLabelKeys ,
33+ } from "./DataFormatter.tsx" ;
34+ import { RequestFormPreview } from "./RequestFormPreview.tsx" ;
3035
3136export const FormPreview = ( {
32- formItem,
37+ formItemId,
38+ formItemTitle,
39+ formItemName,
40+ formItemDate,
3341 isOpen,
3442 onClose,
3543} : {
36- formItem : Form ;
44+ formItemId : number ;
45+ formItemTitle : string ;
46+ formItemName : string ;
47+ formItemDate : string ;
3748 isOpen : boolean ;
3849 onClose : ( ) => void ;
3950} ) => {
4051 const { backend } = useBackendContext ( ) ;
52+ const { role } = useRoleContext ( ) ;
53+
54+ const toast = useToast ( ) ;
4155
4256 const [ formData , setFormData ] = useState ( { } ) ;
57+ const [ newFormData , setNewFormData ] = useState ( { } ) ;
58+
4359 const [ newFormattedFormData , setNewFormattedFormData ] = useState ( { } ) ;
4460 const [ formattedFormData , setFormattedFormData ] = useState ( { } ) ;
4561 const [ isEditing , setIsEditing ] = useState ( false ) ;
@@ -48,35 +64,37 @@ export const FormPreview = ({
4864 useEffect ( ( ) => {
4965 const getData = async ( ) => {
5066 let endpoint = "" ;
51- console . log ( formItem )
5267
53- switch ( formItem . title ) {
68+ switch ( formItemTitle ) {
5469 case "Initial Screeners" :
55- endpoint = `/initialInterview/get-interview/${ formItem . id } ` ;
70+ endpoint = `/initialInterview/get-interview/${ formItemId } ` ;
5671 break ;
5772 case "Client Tracking Statistics (Intake Statistics)" :
58- endpoint = `/intakeStats/${ formItem . id } ` ;
73+ endpoint = `/intakeStats/${ formItemId } ` ;
5974 break ;
6075 case "Front Desk Monthly Statistics" :
61- endpoint = `/frontDesk/${ formItem . id } ` ;
76+ endpoint = `/frontDesk/${ formItemId } ` ;
6277 break ;
6378 case "Case Manager Monthly Statistics" :
64- endpoint = `/caseManagerMonthlyStats/${ formItem . id } ` ;
79+ endpoint = `/caseManagerMonthlyStats/${ formItemId } ` ;
6580 break ;
6681 default :
67- console . error ( "Unknown form title:" , formItem . title ) ;
82+ console . error ( "Unknown form title:" , formItemTitle ) ;
6883 setIsLoading ( false ) ;
6984 return ;
7085 }
7186
7287 try {
7388 setIsLoading ( true ) ;
89+
7490 const response = await backend . get ( endpoint ) ;
75- console . log ( response )
76- const data = await formatDataWithLabels ( response . data [ 0 ] , formItem . title ) ;
77- console . log ( data )
91+ const data = formatDataWithLabels ( response . data [ 0 ] , formItemTitle ) ;
92+
93+ console . log ( response . data [ 0 ] ) ;
7894
7995 setFormData ( response . data [ 0 ] ) ;
96+ setNewFormData ( response . data [ 0 ] ) ;
97+
8098 setFormattedFormData ( data ) ;
8199 setNewFormattedFormData ( data ) ;
82100 } catch ( error ) {
@@ -87,16 +105,61 @@ export const FormPreview = ({
87105 } ;
88106
89107 getData ( ) ;
90- } , [ backend , formItem ] ) ;
108+ } , [ backend , formItemTitle , formItemId ] ) ;
91109
92110 const handleSaveForm = async ( ) => {
93- // do the put requests and error handling
111+ let endpoint = "" ;
112+
113+ switch ( formItemTitle ) {
114+ case "Initial Screeners" :
115+ endpoint = `/initialInterview/` ;
116+ break ;
117+ case "Front Desk Monthly Statistics" :
118+ endpoint = `/frontDesk/` ;
119+ break ;
120+ case "Case Manager Monthly Statistics" :
121+ endpoint = `/caseManagerMonthlyStats/` ;
122+ break ;
123+ default :
124+ console . error ( "Unknown form title:" , formItemTitle ) ;
125+ return ;
126+ }
127+
128+ try {
129+ console . log ( reverseLabelKeys ( newFormattedFormData , formItemTitle ) )
130+ await backend . post ( endpoint , reverseLabelKeys ( newFormattedFormData , formItemTitle ) ) ;
131+ } catch ( error ) {
132+ console . error ( "Error updating form:" , error ) ;
133+
134+ toast ( {
135+ title : "Did Not Save Changes" ,
136+ description : `There was an error while saving changes` ,
137+ status : "error" ,
138+ duration : 9000 ,
139+ isClosable : true ,
140+ } ) ;
141+
142+ return ;
143+ }
144+
145+ toast ( {
146+ title : "Successfully submitted form" ,
147+ description : `${ formItemTitle } Form - ${ new Date ( ) . toLocaleString ( ) } ` ,
148+ status : "success" ,
149+ duration : 9000 ,
150+ isClosable : true ,
151+ } ) ;
152+
153+ onClose ( ) ;
154+ setFormattedFormData ( newFormattedFormData ) ;
155+ setFormData ( newFormData )
156+ setIsEditing ( false ) ;
94157 } ;
95158
96- const isDate = ( value : any ) => {
159+ const isDate = ( value : string ) => {
97160 return (
98- Object . prototype . toString . call ( value ) === "[object Date ]" ||
99- ( typeof value === "string" && ! isNaN ( Date . parse ( value ) ) )
161+ Object . prototype . toString . call ( value ) === "[object String ]" &&
162+ ! isNaN ( Date . parse ( value ) )
100163 ) ;
101164 } ;
102165
@@ -106,6 +169,8 @@ export const FormPreview = ({
106169 placement = "right"
107170 onClose = { ( ) => {
108171 onClose ( ) ;
172+ setNewFormattedFormData ( formattedFormData ) ;
173+ setNewFormData ( formData ) ;
109174 setIsEditing ( false ) ;
110175 } }
111176 size = "xl"
@@ -120,6 +185,8 @@ export const FormPreview = ({
120185 aria-label = "Close drawer"
121186 onClick = { ( ) => {
122187 onClose ( ) ;
188+ setNewFormattedFormData ( formattedFormData ) ;
189+ setNewFormData ( formData ) ;
123190 setIsEditing ( false ) ;
124191 } }
125192 variant = "ghost"
@@ -131,7 +198,8 @@ export const FormPreview = ({
131198 color = "gray.600"
132199 fontSize = "md"
133200 >
134- { formItem . name && `${ formItem . name } - ` } { formItem . title } { formatDateString ( formItem . date ) }
201+ { formItemName && `${ formItemName } - ` }
202+ { formItemTitle } { formatDateString ( formItemDate ) }
135203 </ Text >
136204 </ HStack >
137205 </ DrawerHeader >
@@ -149,6 +217,10 @@ export const FormPreview = ({
149217 />
150218 < Text > Loading...</ Text >
151219 </ VStack >
220+ ) : role === "user" &&
221+ formItemTitle ===
222+ "Client Tracking Statistics (Intake Statistics)" ? (
223+ RequestFormPreview ( )
152224 ) : (
153225 < VStack
154226 marginTop = "12px"
@@ -197,6 +269,7 @@ export const FormPreview = ({
197269 size = "lg"
198270 onClick = { ( ) => {
199271 setNewFormattedFormData ( formattedFormData ) ;
272+ setNewFormData ( formData ) ;
200273 setIsEditing ( false ) ;
201274 } }
202275 >
@@ -206,9 +279,7 @@ export const FormPreview = ({
206279 colorScheme = "blue"
207280 size = "lg"
208281 onClick = { ( ) => {
209- setFormattedFormData ( newFormattedFormData ) ;
210- handleSaveForm ( ) ;
211- setIsEditing ( false ) ;
282+ handleSaveForm ( ) . then ( ) ;
212283 } }
213284 >
214285 Save
@@ -246,17 +317,28 @@ export const FormPreview = ({
246317 < Td fontSize = "medium" > { key } </ Td >
247318 < Td fontSize = "medium" >
248319 { ! isEditing ? (
249- < > { value } </ >
320+ < >
321+ { isDate ( value )
322+ ? formatDateString ( value )
323+ : value }
324+ </ >
250325 ) : (
251326 < Input
252- value = { value ?? "" }
327+ value = { value }
253328 onChange = { ( event ) => {
254- const originalValue =
255- formattedFormData [ key ] ;
329+ const realKey = getKeyByValue (
330+ key ,
331+ formItemTitle
332+ ) ;
333+ const originalValue = formData [ realKey ] ;
256334
257335 // event.target.value is a string
258336 // it needs to be casted to match the type in the actual form
259- let newValue : any = event . target . value ;
337+ let newValue :
338+ | string
339+ | number
340+ | boolean
341+ | Date = event . target . value ;
260342
261343 if ( typeof originalValue === "number" ) {
262344 newValue = Number ( newValue ) ;
@@ -273,6 +355,15 @@ export const FormPreview = ({
273355 }
274356 }
275357
358+ if ( isNaN ( newValue ) ) {
359+ return ;
360+ }
361+
362+ setNewFormData ( ( prev ) => ( {
363+ ...prev ,
364+ [ realKey ] : newValue ,
365+ } ) ) ;
366+
276367 setNewFormattedFormData ( ( prev ) => ( {
277368 ...prev ,
278369 [ key ] : newValue ,
0 commit comments