Skip to content
This repository was archived by the owner on Apr 12, 2023. It is now read-only.

Commit ec37ee3

Browse files
committed
Laster ned midlertidig lagret data
1 parent 04fc1e2 commit ec37ee3

File tree

3 files changed

+141
-56
lines changed

3 files changed

+141
-56
lines changed

components/ActivitySelector.tsx

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,51 +3,50 @@ import { ChangeEvent, Dispatch, SetStateAction, useEffect, useState } from "reac
33
import { Button, Heading, Modal, Panel, TextField } from "@navikt/ds-react";
44
import { addDays, format } from "date-fns";
55
import Spacer from "./Spacer";
6+
import { ActivityType, SavedDates } from "../models/Data";
67

78
export type ActivitySelectorProps = {
89
startDate: Date;
910
endDate: Date;
10-
savedDates: {
11-
[key: number]: { type: string, hours: number };
12-
};
13-
setSavedDates: Dispatch<SetStateAction<{ [p: number]: { type: string, hours: number } }>>;
11+
savedDates: SavedDates;
12+
setSavedDates: Dispatch<SetStateAction<{ [p: number]: { type: ActivityType | null, hours: number | null } }>>;
1413
}
1514

1615
export default function ActivitySelector(props: ActivitySelectorProps) {
1716

1817
const [open, setOpen] = useState(false);
1918
const [selectedDate, setSelectedDate] = useState<Date | null>(null);
20-
const [selectedType, setSelectedType] = useState<string>('');
21-
const [selectedHours, setSelectedHours] = useState<string | null>(null);
19+
const [selectedType, setSelectedType] = useState<ActivityType | null>(null);
20+
const [selectedHours, setSelectedHours] = useState<number | null>(null);
2221
const { startDate, savedDates, setSavedDates } = props;
2322

2423
useEffect(() => {
2524
Modal.setAppElement("#__next");
2625
}, []);
2726

2827
const dateSelected = (date: Date) => {
29-
setSelectedType(savedDates[date.getTime()]?.type || '');
30-
setSelectedHours(savedDates[date.getTime()]?.hours.toString());
28+
setSelectedType(savedDates[date.getTime()]?.type);
29+
setSelectedHours(savedDates[date.getTime()]?.hours);
3130
setSelectedDate(date);
3231
setOpen(true);
3332
}
3433

35-
const dateTypeSelected = (type: string) => {
34+
const dateTypeSelected = (type: ActivityType | null) => {
3635
setSelectedType(type);
37-
setSelectedHours("0");
36+
setSelectedHours(0);
3837
}
3938

4039
const updateHours = (event: ChangeEvent<HTMLInputElement>) => {
41-
setSelectedHours(event.target.value);
40+
setSelectedHours(Number.parseFloat(event.target.value));
4241
}
4342

4443
const saveDate = () => {
4544
if (selectedDate == null) {
4645
return;
4746
}
4847

49-
const hoursNUmber = Number(selectedHours);
50-
if (isNaN(+hoursNUmber) || hoursNUmber < 0 || hoursNUmber > 24) {
48+
const hoursNumber = Number(selectedHours);
49+
if (isNaN(+hoursNumber) || hoursNumber < 0 || hoursNumber > 24) {
5150
return;
5251
}
5352

@@ -56,7 +55,7 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
5655

5756
// Delete object if its type is empty
5857
// Else save
59-
if (selectedType == '') {
58+
if (selectedType == null) {
6059
const state = { ...savedDates };
6160
delete state[key];
6261
setSavedDates(state);
@@ -65,7 +64,7 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
6564
...savedDates,
6665
[key]: {
6766
type: selectedType,
68-
hours: hoursNUmber
67+
hours: hoursNumber
6968
}
7069
});
7170
}
@@ -81,13 +80,13 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
8180
const currentData = savedDates[currentDate.getTime()];
8281

8382
let addClass = styles.none;
84-
if (currentData?.type == 'work') addClass = styles.work;
85-
else if (currentData?.type == 'illness') addClass = styles.illness;
86-
else if (currentData?.type == 'measures') addClass = styles.measures;
87-
else if (currentData?.type == 'vacation') addClass = styles.vacation;
83+
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;
8887

8988
let hours = <></>;
90-
if (currentData?.type == 'work') {
89+
if (currentData?.type == ActivityType.WORK) {
9190
hours = <div className={styles.workHours}>{currentData.hours}t</div>;
9291
}
9392

@@ -118,10 +117,10 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
118117
for (const key in savedDates) {
119118
const currentData = savedDates[key];
120119

121-
if (currentData.type == 'work') workHours += currentData.hours;
122-
else if (currentData.type == 'illness') illnessDays += 1;
123-
else if (currentData.type == 'measures') measuresDays += 1;
124-
else if (currentData.type == 'vacation') vacationDays += 1;
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;
125124
}
126125

127126
let summaryWork = <></>
@@ -201,42 +200,42 @@ export default function ActivitySelector(props: ActivitySelectorProps) {
201200
<div>
202201
<button
203202
type="button"
204-
className={styles.activityTypeButton + ' ' + styles.work + ' ' + ((selectedType == 'work') ? styles.selected : '')}
205-
onClick={() => dateTypeSelected('work')}>
203+
className={styles.activityTypeButton + ' ' + styles.work + ' ' + ((selectedType == ActivityType.WORK) ? styles.selected : '')}
204+
onClick={() => dateTypeSelected(ActivityType.WORK)}>
206205
Arbeid
207206
</button>
208207
{
209-
(selectedType == 'work') ? hoursInput : ''
208+
(selectedType == ActivityType.WORK) ? hoursInput : ''
210209
}
211210
</div>
212211
<div>
213212
<button
214213
type="button"
215-
className={styles.activityTypeButton + ' ' + styles.illness + ' ' + ((selectedType == 'illness') ? styles.selected : '')}
216-
onClick={() => dateTypeSelected('illness')}>
214+
className={styles.activityTypeButton + ' ' + styles.illness + ' ' + ((selectedType == ActivityType.ILLNESS) ? styles.selected : '')}
215+
onClick={() => dateTypeSelected(ActivityType.ILLNESS)}>
217216
Syk
218217
</button>
219218
</div>
220219
<div>
221220
<button
222221
type="button"
223-
className={styles.activityTypeButton + ' ' + styles.measures + ' ' + ((selectedType == 'measures') ? styles.selected : '')}
224-
onClick={() => dateTypeSelected('measures')}>
222+
className={styles.activityTypeButton + ' ' + styles.measures + ' ' + ((selectedType == ActivityType.MEASURES) ? styles.selected : '')}
223+
onClick={() => dateTypeSelected(ActivityType.MEASURES)}>
225224
Tiltak
226225
</button>
227226
</div>
228227
<div>
229228
<button
230-
className={styles.activityTypeButton + ' ' + styles.vacation + ' ' + ((selectedType == 'vacation') ? styles.selected : '')}
231-
onClick={() => dateTypeSelected('vacation')}>
229+
className={styles.activityTypeButton + ' ' + styles.vacation + ' ' + ((selectedType == ActivityType.VACATION) ? styles.selected : '')}
230+
onClick={() => dateTypeSelected(ActivityType.VACATION)}>
232231
Fravær/ferie
233232
</button>
234233
</div>
235234
<div>
236235
<button
237236
type="button"
238-
className={styles.activityTypeButton + ' ' + styles.none + ' ' + ((selectedType == '') ? styles.selected : '')}
239-
onClick={() => dateTypeSelected('')}>
237+
className={styles.activityTypeButton + ' ' + styles.none + ' ' + ((selectedType == null) ? styles.selected : '')}
238+
onClick={() => dateTypeSelected(null)}>
240239
Ingenting
241240
</button>
242241
</div>

models/Data.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
export type Data = {
2+
id: string;
3+
questionWork: boolean | null;
4+
questionMeasures: boolean | null;
5+
questionIllness: boolean | null;
6+
questionVacation: boolean | null;
7+
days: Day[];
8+
questionProceed: boolean | null;
9+
}
10+
11+
export type Day = {
12+
date: Date;
13+
type: ActivityType;
14+
hours: number | null;
15+
}
16+
17+
export type LoadedData = {
18+
id: string;
19+
questionWork: boolean | null;
20+
questionMeasures: boolean | null;
21+
questionIllness: boolean | null;
22+
questionVacation: boolean | null;
23+
days: LoadedDay[];
24+
questionProceed: boolean | null;
25+
}
26+
27+
export type LoadedDay = {
28+
date: string;
29+
type: string;
30+
hours: number | null;
31+
}
32+
33+
export enum ActivityType {
34+
WORK,
35+
ILLNESS,
36+
MEASURES,
37+
VACATION
38+
}
39+
40+
export type SavedDates = {
41+
[key: number]: { type: ActivityType, hours: number | null };
42+
}

src/pages/form.tsx

Lines changed: 65 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ import Receipt from "../../components/Receipt";
99
import CancelButton from "../../components/CancelButton";
1010
import { format, getISOWeek } from "date-fns";
1111
import { Dispatch, FormEventHandler, SetStateAction, useState } from "react";
12+
import { ActivityType, Data, Day, LoadedData, SavedDates } from "../../models/Data";
13+
14+
type InitialState = {
15+
currentId: string;
16+
loadedData: LoadedData;
17+
}
1218

1319
export type CommonFormProps = {
1420
startDate: Date;
@@ -21,10 +27,8 @@ export type CommonFormProps = {
2127
setQuestionIllness: Dispatch<SetStateAction<boolean | null>>;
2228
questionVacation: boolean | null;
2329
setQuestionVacation: Dispatch<SetStateAction<boolean | null>>;
24-
savedDates: {
25-
[key: number]: { type: string, hours: number };
26-
};
27-
setSavedDates: Dispatch<SetStateAction<{ [p: number]: { type: string, hours: number } }>>;
30+
savedDates: SavedDates;
31+
setSavedDates: Dispatch<SetStateAction<SavedDates>>;
2832
questionProceed: boolean | null;
2933
setQuestionProceed: Dispatch<SetStateAction<boolean | null>>;
3034
questionConsent: boolean;
@@ -36,30 +40,69 @@ export type CommonFormProps = {
3640
error: string;
3741
}
3842

39-
export default function Page() {
43+
export async function getServerSideProps() {
44+
// TODO: Get ID from the earliest meldekort and set it as currentId
45+
const currentId = "5";
46+
47+
// Default values for initial state
48+
let loadedData: LoadedData = {
49+
id: currentId,
50+
questionWork: null,
51+
questionMeasures: null,
52+
questionIllness: null,
53+
questionVacation: null,
54+
days: [],
55+
questionProceed: null
56+
}
4057

41-
// JavaScript Dates are internally in UTC
42-
// We have to add time (12:00) so as the date itself is not changed when converted from/to CET
43-
const startDate = new Date(2022, 11, 5, 12, 0);
44-
const endDate = new Date(2022, 11, 18, 12, 0);
58+
const response = await fetch(process.env.DP_RAPP_API_URL + '/api/v1/get/' + currentId);
59+
if (response.ok) {
60+
loadedData = await response.json();
61+
}
4562

46-
const startDateStr = format(startDate, "dd.MM.yy");
47-
const endDateStr = format(endDate, "dd.MM.yy");
63+
return {
64+
props: {
65+
currentId,
66+
loadedData
67+
},
68+
};
69+
}
4870

49-
const maxStep = 4;
71+
export default function Page(props: InitialState) {
5072

73+
// Service variables
74+
const maxStep = 4;
5175
const [currentStep, setCurrentStep] = useState<number>(1);
5276
const [showLoader, setShowLoader] = useState<boolean>(false);
5377
const [showReceipt, setShowReceipt] = useState<boolean>(false);
54-
const [questionWork, setQuestionWork] = useState<boolean | null>(null);
55-
const [questionMeasures, setQuestionMeasures] = useState<boolean | null>(null);
56-
const [questionIllness, setQuestionIllness] = useState<boolean | null>(null);
57-
const [questionVacation, setQuestionVacation] = useState<boolean | null>(null);
58-
const [savedDates, setSavedDates] = useState<{ [key: number]: { type: string, hours: number } }>({});
59-
const [questionProceed, setQuestionProceed] = useState<boolean | null>(null);
60-
const [questionConsent, setQuestionConsent] = useState<boolean>(false);
6178
const [error, setError] = useState<string>('');
6279

80+
const { currentId, loadedData } = props;
81+
82+
// Use loaded data as initial state
83+
const loadedSavedDates: SavedDates = {}
84+
loadedData?.days.forEach((day) => {
85+
// @ts-ignore
86+
loadedSavedDates[Date.parse(day.date + " 12:00:00")] = { type: ActivityType[day.type], hours: day.hours }
87+
});
88+
89+
const [questionWork, setQuestionWork] = useState<boolean | null>(loadedData.questionWork);
90+
const [questionMeasures, setQuestionMeasures] = useState<boolean | null>(loadedData.questionMeasures);
91+
const [questionIllness, setQuestionIllness] = useState<boolean | null>(loadedData.questionIllness);
92+
const [questionVacation, setQuestionVacation] = useState<boolean | null>(loadedData.questionVacation);
93+
const [savedDates, setSavedDates] = useState<SavedDates>(loadedSavedDates);
94+
const [questionProceed, setQuestionProceed] = useState<boolean | null>(loadedData.questionProceed);
95+
const [questionConsent, setQuestionConsent] = useState<boolean>(false); // Always false initially, user must check it every time
96+
97+
// TODO: Get dates from the earliest meldekort and use these dates
98+
// JavaScript Dates are internally in UTC
99+
// We have to add time (12:00) so as the date itself is not changed when converted from/to CET
100+
const startDate = new Date(2022, 11, 5, 12, 0);
101+
const endDate = new Date(2022, 11, 18, 12, 0);
102+
103+
const startDateStr = format(startDate, "dd.MM.yy");
104+
const endDateStr = format(endDate, "dd.MM.yy");
105+
63106
const prevStep = () => {
64107
if (currentStep > 1) {
65108
setCurrentStep(currentStep - 1);
@@ -80,7 +123,7 @@ export default function Page() {
80123
setShowLoader(true);
81124

82125
// Prepare dates
83-
const days = [];
126+
const days: Day[] = [];
84127
for (const key in savedDates) {
85128
days.push({
86129
date: new Date(+key),
@@ -90,7 +133,8 @@ export default function Page() {
90133
}
91134

92135
// Collect data in one object
93-
const data = {
136+
const data: Data = {
137+
id: currentId,
94138
questionWork,
95139
questionMeasures,
96140
questionIllness,

0 commit comments

Comments
 (0)