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