1
1
import styles from "./ActivitySelector.module.css" ;
2
- import { ChangeEvent , Dispatch , SetStateAction , useEffect , useState } from "react" ;
2
+ import {
3
+ ChangeEvent ,
4
+ Dispatch ,
5
+ SetStateAction ,
6
+ useEffect ,
7
+ useState ,
8
+ } from "react" ;
3
9
import { Button , Heading , Modal , Panel , TextField } from "@navikt/ds-react" ;
4
10
import { addDays , format } from "date-fns" ;
5
11
import Spacer from "./Spacer" ;
@@ -10,10 +16,9 @@ export type ActivitySelectorProps = {
10
16
endDate : Date ;
11
17
savedDates : SavedDates ;
12
18
setSavedDates : Dispatch < SetStateAction < SavedDates > > ;
13
- }
19
+ } ;
14
20
15
21
export default function ActivitySelector ( props : ActivitySelectorProps ) {
16
-
17
22
const [ open , setOpen ] = useState ( false ) ;
18
23
const [ selectedDate , setSelectedDate ] = useState < Date | null > ( null ) ;
19
24
const [ selectedType , setSelectedType ] = useState < ActivityType | null > ( null ) ;
@@ -29,16 +34,16 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
29
34
setSelectedHours ( savedDates [ date . getTime ( ) ] ?. hours ) ;
30
35
setSelectedDate ( date ) ;
31
36
setOpen ( true ) ;
32
- }
37
+ } ;
33
38
34
39
const dateTypeSelected = ( type : ActivityType | null ) => {
35
40
setSelectedType ( type ) ;
36
41
setSelectedHours ( 0 ) ;
37
- }
42
+ } ;
38
43
39
44
const updateHours = ( event : ChangeEvent < HTMLInputElement > ) => {
40
45
setSelectedHours ( Number . parseFloat ( event . target . value ) ) ;
41
- }
46
+ } ;
42
47
43
48
const saveDate = ( ) => {
44
49
if ( selectedDate == null ) {
@@ -50,7 +55,6 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
50
55
return ;
51
56
}
52
57
53
-
54
58
const key = selectedDate . getTime ( ) ;
55
59
56
60
// Delete object if its type is empty
@@ -64,13 +68,12 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
64
68
...savedDates ,
65
69
[ key ] : {
66
70
type : selectedType ,
67
- hours : hoursNumber
68
- }
71
+ hours : hoursNumber ,
72
+ } ,
69
73
} ) ;
70
74
}
71
-
72
75
setOpen ( false ) ;
73
- }
76
+ } ;
74
77
75
78
// Building day grid
76
79
const days = [ ] ;
@@ -81,9 +84,12 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
81
84
82
85
let addClass = styles . none ;
83
86
if ( currentData ?. type == ActivityType . WORK ) addClass = styles . work ;
84
- else if ( currentData ?. type == ActivityType . ILLNESS ) addClass = styles . illness ;
85
- else if ( currentData ?. type == ActivityType . MEASURES ) addClass = styles . measures ;
86
- else if ( currentData ?. type == ActivityType . VACATION ) addClass = styles . vacation ;
87
+ else if ( currentData ?. type == ActivityType . ILLNESS )
88
+ addClass = styles . illness ;
89
+ else if ( currentData ?. type == ActivityType . MEASURES )
90
+ addClass = styles . measures ;
91
+ else if ( currentData ?. type == ActivityType . VACATION )
92
+ addClass = styles . vacation ;
87
93
88
94
let hours = < > </ > ;
89
95
if ( currentData ?. type == ActivityType . WORK ) {
@@ -94,66 +100,25 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
94
100
< div key = { currentDate . getTime ( ) } >
95
101
< button
96
102
type = "button"
97
- className = { styles . activityGridButton + ' ' + addClass }
98
- onClick = { ( ) => dateSelected ( currentDate ) } >
103
+ className = { styles . activityGridButton + " " + addClass }
104
+ onClick = { ( ) => dateSelected ( currentDate ) }
105
+ >
99
106
{ currentDateStr }
100
107
</ button >
101
108
{ hours }
102
109
</ div >
103
110
) ;
104
111
}
105
112
106
- const hoursInput = < TextField label = "Antall timer"
107
- type = "number"
108
- step = "0.5"
109
- value = { selectedHours || 0 }
110
- onChange = { updateHours } />
111
-
112
- // Summary
113
- let workHours = 0 ;
114
- let illnessDays = 0 ;
115
- let measuresDays = 0 ;
116
- let vacationDays = 0 ;
117
- for ( const key in savedDates ) {
118
- const currentData = savedDates [ key ] ;
119
-
120
- if ( currentData . type == ActivityType . WORK ) workHours += ( currentData . hours || 0 ) ;
121
- else if ( currentData . type == ActivityType . ILLNESS ) illnessDays += 1 ;
122
- else if ( currentData . type == ActivityType . MEASURES ) measuresDays += 1 ;
123
- else if ( currentData . type == ActivityType . VACATION ) vacationDays += 1 ;
124
- }
125
-
126
- let summaryWork = < > </ >
127
- if ( workHours > 0 ) {
128
- summaryWork = < div className = { styles . summaryLine + ' ' + styles . work } >
129
- < div > Arbeid</ div >
130
- < div > { workHours } { ( workHours == 1 ) ? 'time' : 'timer' } </ div >
131
- </ div >
132
- }
133
-
134
- let summaryIllness = < > </ >
135
- if ( illnessDays > 0 ) {
136
- summaryIllness = < div className = { styles . summaryLine + ' ' + styles . illness } >
137
- < div > Syk</ div >
138
- < div > { illnessDays } { ( illnessDays == 1 ) ? 'dag' : 'dager' } </ div >
139
- </ div >
140
- }
141
-
142
- let summaryMeasures = < > </ >
143
- if ( measuresDays > 0 ) {
144
- summaryMeasures = < div className = { styles . summaryLine + ' ' + styles . measures } >
145
- < div > Tiltak</ div >
146
- < div > { measuresDays } { ( measuresDays == 1 ) ? 'dag' : 'dager' } </ div >
147
- </ div >
148
- }
149
-
150
- let summaryVacation = < > </ >
151
- if ( vacationDays > 0 ) {
152
- summaryVacation = < div className = { styles . summaryLine + ' ' + styles . vacation } >
153
- < div > Fravær/ferie</ div >
154
- < div > { vacationDays } { ( vacationDays == 1 ) ? 'dag' : 'dager' } </ div >
155
- </ div >
156
- }
113
+ const hoursInput = (
114
+ < TextField
115
+ label = "Antall timer"
116
+ type = "number"
117
+ step = "0.5"
118
+ value = { selectedHours || 0 }
119
+ onChange = { updateHours }
120
+ />
121
+ ) ;
157
122
158
123
return (
159
124
< div className = { styles . container } >
@@ -165,31 +130,19 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
165
130
< div > fre</ div >
166
131
< div > lør</ div >
167
132
< div > søn</ div >
168
- {
169
- days
170
- }
133
+ { days }
171
134
</ div >
172
135
173
136
< Spacer />
174
137
175
- {
176
- Object . keys ( savedDates ) . length !== 0 &&
177
- < div className = { styles . summary } >
178
- < div className = { styles . summaryHeader } > Sammenlagt for meldeperioden:</ div >
179
- { summaryWork }
180
- { summaryIllness }
181
- { summaryMeasures }
182
- { summaryVacation }
183
- </ div >
184
- }
185
-
186
-
187
138
< Modal
188
139
open = { open }
189
140
aria-label = "Modal demo"
190
141
closeButton = { true }
191
142
shouldCloseOnOverlayClick = { false }
192
- onClose = { ( ) => setOpen ( ( x ) => ! x ) }
143
+ onClose = { ( ) => {
144
+ setOpen ( ( x ) => ! x ) ;
145
+ } }
193
146
aria-labelledby = "modal-heading"
194
147
>
195
148
< Modal . Content >
@@ -200,42 +153,75 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
200
153
< div >
201
154
< button
202
155
type = "button"
203
- className = { styles . activityTypeButton + ' ' + styles . work + ' ' + ( ( selectedType == ActivityType . WORK ) ? styles . selected : '' ) }
204
- onClick = { ( ) => dateTypeSelected ( ActivityType . WORK ) } >
156
+ className = {
157
+ styles . activityTypeButton +
158
+ " " +
159
+ styles . work +
160
+ " " +
161
+ ( selectedType == ActivityType . WORK ? styles . selected : "" )
162
+ }
163
+ onClick = { ( ) => dateTypeSelected ( ActivityType . WORK ) }
164
+ >
205
165
Arbeid
206
166
</ button >
207
- {
208
- ( selectedType == ActivityType . WORK ) ? hoursInput : ''
209
- }
167
+ { selectedType == ActivityType . WORK ? hoursInput : "" }
210
168
</ div >
211
169
< div >
212
170
< button
213
171
type = "button"
214
- className = { styles . activityTypeButton + ' ' + styles . illness + ' ' + ( ( selectedType == ActivityType . ILLNESS ) ? styles . selected : '' ) }
215
- onClick = { ( ) => dateTypeSelected ( ActivityType . ILLNESS ) } >
172
+ className = {
173
+ styles . activityTypeButton +
174
+ " " +
175
+ styles . illness +
176
+ " " +
177
+ ( selectedType == ActivityType . ILLNESS ? styles . selected : "" )
178
+ }
179
+ onClick = { ( ) => dateTypeSelected ( ActivityType . ILLNESS ) }
180
+ >
216
181
Syk
217
182
</ button >
218
183
</ div >
219
184
< div >
220
185
< button
221
186
type = "button"
222
- className = { styles . activityTypeButton + ' ' + styles . measures + ' ' + ( ( selectedType == ActivityType . MEASURES ) ? styles . selected : '' ) }
223
- onClick = { ( ) => dateTypeSelected ( ActivityType . MEASURES ) } >
187
+ className = {
188
+ styles . activityTypeButton +
189
+ " " +
190
+ styles . measures +
191
+ " " +
192
+ ( selectedType == ActivityType . MEASURES ? styles . selected : "" )
193
+ }
194
+ onClick = { ( ) => dateTypeSelected ( ActivityType . MEASURES ) }
195
+ >
224
196
Tiltak
225
197
</ button >
226
198
</ div >
227
199
< div >
228
200
< button
229
- className = { styles . activityTypeButton + ' ' + styles . vacation + ' ' + ( ( selectedType == ActivityType . VACATION ) ? styles . selected : '' ) }
230
- onClick = { ( ) => dateTypeSelected ( ActivityType . VACATION ) } >
201
+ className = {
202
+ styles . activityTypeButton +
203
+ " " +
204
+ styles . vacation +
205
+ " " +
206
+ ( selectedType == ActivityType . VACATION ? styles . selected : "" )
207
+ }
208
+ onClick = { ( ) => dateTypeSelected ( ActivityType . VACATION ) }
209
+ >
231
210
Fravær/ferie
232
211
</ button >
233
212
</ div >
234
213
< div >
235
214
< button
236
215
type = "button"
237
- className = { styles . activityTypeButton + ' ' + styles . none + ' ' + ( ( selectedType == null ) ? styles . selected : '' ) }
238
- onClick = { ( ) => dateTypeSelected ( null ) } >
216
+ className = {
217
+ styles . activityTypeButton +
218
+ " " +
219
+ styles . none +
220
+ " " +
221
+ ( selectedType == null ? styles . selected : "" )
222
+ }
223
+ onClick = { ( ) => dateTypeSelected ( null ) }
224
+ >
239
225
Ingenting
240
226
</ button >
241
227
</ div >
@@ -244,13 +230,17 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
244
230
< Button variant = "secondary" onClick = { ( ) => setOpen ( false ) } >
245
231
Avbryt
246
232
</ Button >
247
- < Button variant = "primary" onClick = { ( ) => saveDate ( ) } >
233
+ < Button
234
+ variant = "primary"
235
+ onClick = { ( ) => {
236
+ saveDate ( ) ;
237
+ } }
238
+ >
248
239
Lagre
249
240
</ Button >
250
241
</ Panel >
251
242
</ Modal . Content >
252
243
</ Modal >
253
-
254
244
</ div >
255
245
) ;
256
246
}
0 commit comments