@@ -7,7 +7,6 @@ import FullCalendar from "@fullcalendar/react";
7
7
import timeGridPlugin from "@fullcalendar/timegrid" ;
8
8
import { EventInput } from "@fullcalendar/core" ;
9
9
import interactionPlugin from "@fullcalendar/interaction" ;
10
- import { useSuspenseQuery } from "@tanstack/react-query" ;
11
10
import { components } from "../../../../../api.gen" ;
12
11
import { QuestionnaireEntry } from "../../../../../components/questionnaire/calendar/QuestionnaireEntry" ;
13
12
import { EntityForm , EntryFormValues } from "../../../../../components/questionnaire/calendar/EntryForm" ;
@@ -42,44 +41,46 @@ function QuestionnaireEntries() {
42
41
const theme = useMantineTheme ( ) ;
43
42
const [ opened , { open, close } ] = useDisclosure ( ) ;
44
43
45
- const [ selectedStartTime , setSelectedStartTime ] = useState < string > ( ) ;
46
- const [ selectedEndTime , setSelectedEndTime ] = useState < string > ( ) ;
47
44
const [ selectedWeekday , setSelectedWeekday ] = useState < number > ( ) ;
45
+ const [ entryUpdatingId , setEntryUpdadingId ] = useState < number > ( ) ;
46
+ const [ entryDraft , setEntryDraft ] = useState < Partial < EntryFormValues > > ( ) ;
48
47
49
48
const createMutation = $api . useMutation ( "post" , "/entries" ) ;
50
- const { data : questionnaire , refetch } = useSuspenseQuery (
51
- $api . queryOptions ( "get" , "/questionnaires/{id}" , { params : { path : { id : p . id } } } )
52
- ) ;
49
+ const updateMutation = $api . useMutation ( "patch" , "/entries/{id}" ) ;
50
+ const { data : questionnaire , refetch } = $api . useSuspenseQuery ( "get" , "/questionnaires/{id}" , { params : { path : { id : p . id } } } ) ;
53
51
54
52
const events : ExtendedEvent [ ] =
55
- questionnaire . entries ?. map ( ( { startedAt, endedAt, weekday, carer, entryLanguages } ) => ( {
53
+ questionnaire . entries ?. map ( ( { startedAt, endedAt, weekday, carer, entryLanguages, id } ) => ( {
54
+ id : id . toString ( ) ,
56
55
start : getDateFromTimeAndWeekday ( startedAt , weekday ) ,
57
56
end : getDateFromTimeAndWeekday ( endedAt , weekday ) ,
58
57
title : carer . name ,
59
58
extendedProps : { entryLanguages } ,
60
59
backgroundColor : theme . colors [ theme . primaryColor ] [ 4 ] ,
61
60
} ) ) ?? [ ] ;
62
61
63
- const handleAddEntry = ( { entryLanguages, carer, ...rest } : EntryFormValues ) => {
62
+ const handleReset = ( ) => {
63
+ refetch ( ) ;
64
+ close ( ) ;
65
+ setSelectedWeekday ( undefined ) ;
66
+ setEntryUpdadingId ( undefined ) ;
67
+ } ;
68
+
69
+ const handleOnSave = ( { carer, ...rest } : EntryFormValues ) => {
64
70
if ( selectedWeekday === undefined ) return ;
65
71
66
- createMutation . mutate (
67
- {
68
- body : {
69
- ...rest ,
70
- carer : carer ! ,
71
- entryLanguages : entryLanguages . map ( ( { ratio, language : languageId } ) => ( { language : languageId ! , ratio } ) ) ,
72
- weekday : selectedWeekday ,
73
- questionnaire : questionnaire . id ,
74
- } ,
75
- } ,
76
- {
77
- onSuccess ( ) {
78
- refetch ( ) ;
79
- close ( ) ;
80
- } ,
81
- }
82
- ) ;
72
+ const entryRequest = {
73
+ ...rest ,
74
+ carer : carer ! ,
75
+ weekday : selectedWeekday ,
76
+ questionnaire : questionnaire . id ,
77
+ } ;
78
+
79
+ if ( ! entryUpdatingId ) {
80
+ createMutation . mutate ( { body : entryRequest } , { onSuccess : handleReset } ) ;
81
+ } else {
82
+ updateMutation . mutate ( { body : entryRequest , params : { path : { id : entryUpdatingId ?. toString ( ) } } } , { onSuccess : handleReset } ) ;
83
+ }
83
84
} ;
84
85
85
86
const handleSubmit = ( ) => {
@@ -89,11 +90,7 @@ function QuestionnaireEntries() {
89
90
return (
90
91
< >
91
92
< Modal opened = { opened } onClose = { close } size = "md" >
92
- < EntityForm
93
- onSave = { handleAddEntry }
94
- entry = { ! ! selectedStartTime && ! ! selectedEndTime ? { startedAt : selectedStartTime , endedAt : selectedEndTime } : undefined }
95
- actionLabel = { t . addEntityLabel }
96
- />
93
+ < EntityForm onSave = { handleOnSave } entry = { entryDraft } actionLabel = { t . addEntityLabel } />
97
94
</ Modal >
98
95
< form onSubmit = { handleSubmit } >
99
96
< Stack >
@@ -104,11 +101,24 @@ function QuestionnaireEntries() {
104
101
events = { events }
105
102
selectable
106
103
select = { ( args ) => {
107
- setSelectedStartTime ( getTime ( args . start ) ) ;
108
- setSelectedEndTime ( getTime ( args . end ) ) ;
104
+ setEntryDraft ( { startedAt : getTime ( args . start ) , endedAt : getTime ( args . end ) } ) ;
109
105
setSelectedWeekday ( args . start . getDay ( ) ) ;
110
106
open ( ) ;
111
107
} }
108
+ eventClick = { ( args ) => {
109
+ const { carer, entryLanguages, weekday, id } =
110
+ questionnaire . entries ?. find ( ( entry ) => entry . id . toString ( ) === args . event . id ) ?? { } ;
111
+
112
+ setEntryUpdadingId ( id ) ;
113
+ setEntryDraft ( {
114
+ carer : carer ?. id ,
115
+ startedAt : getTime ( args . event . start ! ) ,
116
+ endedAt : getTime ( args . event . end ! ) ,
117
+ entryLanguages : entryLanguages ?. map ( ( { language, ...rest } ) => ( { ...rest , language : language . id } ) ) ,
118
+ } ) ;
119
+ setSelectedWeekday ( weekday ) ;
120
+ open ( ) ;
121
+ } }
112
122
eventContent = { ( { event } ) => < QuestionnaireEntry event = { event } /> }
113
123
/>
114
124
< Group >
0 commit comments