import React, { useState } from "react"; import { emptyReport, sampleReportSchema } from "@/provider/dummy/report"; import { Button, FormControl, FormLabel, Grid, Typography, FormGroup, FormControlLabel, Checkbox, Radio, InputLabel, Select, MenuItem, FormHelperText } from "@material-ui/core"; import { Actions } from "@/components"; import { Link as RouterLink } from "react-router-dom"; import { route } from "@/routing"; import { useTranslation } from "react-i18next"; import { MultiChoiceFieldDefinition, Report, ReportFieldDefinition, ReportFieldValues, SingleChoiceFieldDefinition } from "@/data/report"; import { TextField as TextFieldFormik } from "formik-material-ui"; import { Field, Form, Formik, useFormik, useFormikContext } from "formik"; import { Multilingual } from "@/data"; import { Transformer } from "@/serialization"; import api from "@/api"; import { useCurrentEdition } from "@/hooks"; import { Edition } from "@/data/edition"; import { Description as DescriptionIcon } from "@material-ui/icons"; import { DropzoneArea } from "material-ui-dropzone"; import { InternshipDocument } from "@/api/dto/internship-registration"; import { UploadType } from "@/api/upload"; import { InternshipPlanActions, InternshipReportActions, useDispatch } from "@/state/actions"; import { useSelector } from "react-redux"; import { AppState } from "@/state/reducer"; export type ReportFieldProps = { field: TField; } export const name = ({ id }: ReportFieldDefinition) => `field_${id}`; export const CustomField = ({ field, ...props }: ReportFieldProps) => { switch (field.type) { case "short-text": case "long-text": return case "checkbox": case "radio": return case "select": return } } CustomField.Text = ({ field }: ReportFieldProps) => { return <> } CustomField.Select = ({ field }: ReportFieldProps) => { const { t } = useTranslation(); const id = `custom-field-${field.id}`; const { values, setFieldValue } = useFormikContext(); const value = values[name(field)]; return { field.label.pl } } CustomField.Choice = ({ field }: ReportFieldProps) => { const { t } = useTranslation(); const { values, setFieldValue } = useFormikContext(); const value = values[name(field)]; const isSelected = field.type == 'radio' ? (checked: Multilingual) => value == checked : (checked: Multilingual) => (value || []).includes(checked) const handleChange = field.type == 'radio' ? (choice: Multilingual) => () => setFieldValue(name(field), choice, false) : (choice: Multilingual) => () => { const current = value || []; setFieldValue(name(field), !current.includes(choice) ? [ ...current, choice ] : current.filter((c: Multilingual) => c != choice), false); } const Component = field.type == 'radio' ? Radio : Checkbox; return { field.label.pl } { field.choices.map(choice => } label={ choice.pl } />) } } export type ReportFormValues = ReportFieldValues; const reportFormValuesTransformer: Transformer = { reverseTransform(subject: ReportFormValues, context: { report: Report }): Report { return { ...context.report, fields: subject }; }, transform(subject: Report, context: undefined): ReportFormValues { return subject.fields; } } export default function ReportForm() { const edition = useCurrentEdition() as Edition; const report = emptyReport; const schema = edition.schema; const dispatch = useDispatch(); const { t } = useTranslation(); const [file, setFile] = useState(); const document = useSelector(state => state.report.evaluation); const handleSubmit = async (values: ReportFormValues) => { if (!file) { return; } const result = reportFormValuesTransformer.reverseTransform(values, { report }); await api.report.save(result); let destination: InternshipDocument = document as any; if (!destination) { destination = await api.upload.create(UploadType.InternshipEvaluation); } await api.upload.upload(destination, file); }; return { ({ submitForm }) =>
{ t('forms.report.instructions') } setFile(files[0]) }/> { t('forms.report.dropzone-help') } { t('forms.report.report') } { schema.map(field => ) }
}
}