1
- import {
2
- Button ,
3
- formatDate ,
4
- getDateFromTimeAndWeekday ,
5
- Group ,
6
- Stack ,
7
- useMantineTheme ,
8
- useDisclosure ,
9
- Modal ,
10
- getTime ,
11
- notifications ,
12
- } from "@quassel/ui" ;
1
+ import { Button , Group , Stack , notifications } from "@quassel/ui" ;
13
2
import { createFileRoute , Link , useNavigate } from "@tanstack/react-router" ;
14
3
import { i18n } from "../../../../../stores/i18n" ;
15
4
import { useStore } from "@nanostores/react" ;
16
5
import { $api } from "../../../../../stores/api" ;
17
- import FullCalendar from "@fullcalendar/react" ;
18
- import timeGridPlugin from "@fullcalendar/timegrid" ;
19
- import { EventInput } from "@fullcalendar/core" ;
20
- import interactionPlugin from "@fullcalendar/interaction" ;
21
- import { components } from "../../../../../api.gen" ;
22
- import { QuestionnaireEntry } from "../../../../../components/questionnaire/calendar/QuestionnaireEntry" ;
23
- import { EntityForm , EntryFormValues } from "../../../../../components/questionnaire/calendar/EntryForm" ;
24
- import { useState } from "react" ;
6
+ import { EntryFormValues } from "../../../../../components/questionnaire/calendar/EntryForm" ;
25
7
import { useQueryClient } from "@tanstack/react-query" ;
26
-
27
- export type ExtendedEvent = EventInput & {
28
- extendedProps : { entryLanguages : components [ "schemas" ] [ "EntryLanguageResponseDto" ] [ ] ; weeklyRecurring ?: number } ;
29
- } ;
30
-
31
- const calendarBaseConfig : FullCalendar [ "props" ] = {
32
- allDaySlot : false ,
33
- headerToolbar : false ,
34
- slotMinTime : { hour : 5 } ,
35
- slotMaxTime : { hour : 23 } ,
36
- slotDuration : { hour : 1 } ,
37
- firstDay : 1 ,
38
- dayHeaderContent : ( { date } ) => formatDate ( date , "dddd" ) ,
39
- locale : "de" ,
40
- expandRows : true ,
41
- } ;
8
+ import { EntryCalendar } from "../../../../../components/questionnaire/calendar/EntryCalendar" ;
42
9
43
10
const messages = i18n ( "questionnaireEntries" , {
44
11
formAction : "Continue" ,
@@ -56,17 +23,10 @@ function QuestionnaireEntries() {
56
23
57
24
const c = useQueryClient ( ) ;
58
25
59
- const theme = useMantineTheme ( ) ;
60
- const [ opened , { open, close } ] = useDisclosure ( ) ;
61
-
62
- const [ selectedWeekday , setSelectedWeekday ] = useState < number > ( ) ;
63
- const [ entryUpdatingId , setEntryUpdadingId ] = useState < number > ( ) ;
64
- const [ entryDraft , setEntryDraft ] = useState < Partial < EntryFormValues > > ( ) ;
65
-
66
26
const createMutation = $api . useMutation ( "post" , "/entries" ) ;
67
27
const updateMutation = $api . useMutation ( "patch" , "/entries/{id}" ) ;
68
28
const deleteMutation = $api . useMutation ( "delete" , "/entries/{id}" ) ;
69
- const { data : questionnaire , refetch } = $api . useSuspenseQuery ( "get" , "/questionnaires/{id}" , { params : { path : { id : p . id } } } ) ;
29
+ const { data : questionnaire } = $api . useSuspenseQuery ( "get" , "/questionnaires/{id}" , { params : { path : p } } ) ;
70
30
71
31
const participantId = questionnaire . participant ?. id ;
72
32
@@ -86,58 +46,34 @@ function QuestionnaireEntries() {
86
46
} ,
87
47
} ) ;
88
48
89
- const events : ExtendedEvent [ ] =
90
- questionnaire . entries ?. map ( ( { startedAt, endedAt, weekday, carer, entryLanguages, id, weeklyRecurring } ) => ( {
91
- id : id . toString ( ) ,
92
- start : getDateFromTimeAndWeekday ( startedAt , weekday ) ,
93
- end : getDateFromTimeAndWeekday ( endedAt , weekday ) ,
94
- title : carer . name ,
95
- extendedProps : { entryLanguages, weeklyRecurring } ,
96
- backgroundColor : carer . color ?? theme . colors [ theme . primaryColor ] [ 4 ] ,
97
- borderColor : carer . color ?? theme . colors [ theme . primaryColor ] [ 4 ] ,
98
- } ) ) ?? [ ] ;
99
-
100
- const reset = ( ) => {
101
- refetch ( ) ;
102
- close ( ) ;
103
- setSelectedWeekday ( undefined ) ;
104
- setEntryUpdadingId ( undefined ) ;
49
+ const reloadEntries = ( ) => {
50
+ c . invalidateQueries ( $api . queryOptions ( "get" , "/questionnaires/{id}" , { params : { path : p } } ) ) ;
105
51
} ;
106
52
107
- const handleCreate = ( { carer, ...rest } : EntryFormValues ) => {
108
- if ( selectedWeekday === undefined ) return ;
109
-
53
+ const handleCreate = ( { carer, ...rest } : EntryFormValues , weekday : number ) => {
110
54
const entryRequest = {
111
55
...rest ,
112
56
carer : carer ! ,
113
- weekday : selectedWeekday ,
57
+ weekday,
114
58
questionnaire : questionnaire . id ,
115
59
} ;
116
60
117
- createMutation . mutate ( { body : entryRequest } , { onSuccess : reset } ) ;
61
+ return createMutation . mutateAsync ( { body : entryRequest } , { onSuccess : reloadEntries } ) ;
118
62
} ;
119
63
120
- const handleUpdate = ( id : number , { carer, ...rest } : Partial < EntryFormValues > , weekday ? : number ) => {
64
+ const handleUpdate = ( id : number , { carer, ...rest } : Partial < EntryFormValues > , weekday : number ) => {
121
65
const entryRequest = {
122
66
...rest ,
123
67
carer : carer ! ,
124
68
weekday,
125
69
questionnaire : questionnaire . id ,
126
70
} ;
127
71
128
- updateMutation . mutate ( { body : entryRequest , params : { path : { id : id . toString ( ) } } } , { onSuccess : reset } ) ;
72
+ return updateMutation . mutateAsync ( { body : entryRequest , params : { path : { id : id . toString ( ) } } } , { onSuccess : reloadEntries } ) ;
129
73
} ;
130
74
131
75
const handleDelete = ( id : number ) => {
132
- deleteMutation . mutate ( { params : { path : { id : id . toString ( ) } } } , { onSuccess : reset } ) ;
133
- } ;
134
-
135
- const handleOnSave = ( entry : EntryFormValues | Partial < EntryFormValues > ) => {
136
- if ( ! entryUpdatingId ) {
137
- handleCreate ( entry as EntryFormValues ) ;
138
- } else {
139
- handleUpdate ( entryUpdatingId , entry ) ;
140
- }
76
+ return deleteMutation . mutateAsync ( { params : { path : { id : id . toString ( ) } } } , { onSuccess : reloadEntries } ) ;
141
77
} ;
142
78
143
79
const handleSubmit = ( ) => {
@@ -146,53 +82,19 @@ function QuestionnaireEntries() {
146
82
147
83
return (
148
84
< >
149
- < Modal opened = { opened } onClose = { close } size = "md" >
150
- < EntityForm
151
- onAddCarer = { ( name ) => createCarerMutation . mutateAsync ( { body : { name, participant : participantId } } ) . then ( ( { id } ) => id ) }
152
- onAddLanguage = { ( name ) => createLanguageMutation . mutateAsync ( { body : { name, participant : participantId } } ) . then ( ( { id } ) => id ) }
153
- onSave = { handleOnSave }
154
- onDelete = { entryUpdatingId ? ( ) => handleDelete ( entryUpdatingId ) : undefined }
155
- entry = { entryDraft }
156
- carers = { carers ?? [ ] }
157
- languages = { languages ?? [ ] }
158
- actionLabel = { t . addEntityLabel }
159
- />
160
- </ Modal >
161
85
< form onSubmit = { handleSubmit } >
162
86
< Stack >
163
- < FullCalendar
164
- { ...calendarBaseConfig }
165
- plugins = { [ timeGridPlugin , interactionPlugin ] }
166
- editable
167
- events = { events }
168
- selectable
169
- select = { ( { start, end } ) => {
170
- setEntryDraft ( { startedAt : getTime ( start ) , endedAt : getTime ( end ) } ) ;
171
- setSelectedWeekday ( start . getDay ( ) ) ;
172
- open ( ) ;
173
- } }
174
- eventClick = { ( args ) => {
175
- const { carer, entryLanguages, id, weeklyRecurring } =
176
- questionnaire . entries ?. find ( ( entry ) => entry . id . toString ( ) === args . event . id ) ?? { } ;
177
-
178
- setEntryDraft ( {
179
- carer : carer ?. id ,
180
- startedAt : getTime ( args . event . start ! ) ,
181
- endedAt : getTime ( args . event . end ! ) ,
182
- entryLanguages : entryLanguages ?. map ( ( { language, ...rest } ) => ( { ...rest , language : language . id } ) ) ,
183
- weeklyRecurring,
184
- } ) ;
185
- setEntryUpdadingId ( id ) ;
186
- open ( ) ;
187
- } }
188
- eventResize = { ( { event : { id, start, end } } ) => {
189
- handleUpdate ( parseInt ( id ) , { startedAt : getTime ( start ! ) , endedAt : getTime ( end ! ) } ) ;
190
- } }
191
- eventDrop = { ( { event : { id, start, end } } ) => {
192
- handleUpdate ( parseInt ( id ) , { startedAt : getTime ( start ! ) , endedAt : getTime ( end ! ) } , start ! . getDay ( ) ) ;
193
- } }
194
- eventContent = { ( { event } ) => < QuestionnaireEntry event = { event } /> }
87
+ < EntryCalendar
88
+ entries = { questionnaire . entries ?? [ ] }
89
+ onAddEntry = { handleCreate }
90
+ onUpdateEntry = { handleUpdate }
91
+ onDeleteEntry = { handleDelete }
92
+ carers = { carers ?? [ ] }
93
+ languages = { languages ?? [ ] }
94
+ onAddCarer = { ( name ) => createCarerMutation . mutateAsync ( { body : { name, participant : participantId } } ) . then ( ( { id } ) => id ) }
95
+ onAddLanguage = { ( name ) => createLanguageMutation . mutateAsync ( { body : { name, participant : participantId } } ) . then ( ( { id } ) => id ) }
195
96
/>
97
+
196
98
< Group >
197
99
< Link to = "/questionnaire/$id/period" params = { p } >
198
100
< Button variant = "light" > { t . backAction } </ Button >
0 commit comments