From 5879efc978a73ce5e010025ccf0aaeb0e9c07295 Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Sun, 18 Oct 2020 13:48:05 +0200 Subject: [PATCH] Fix multiple issues with forms --- src/api/dto/internship-registration.ts | 46 ++++++++++++++++++-------- src/api/index.ts | 2 ++ src/api/internship.ts | 5 +-- src/api/upload.ts | 23 +++++++++++++ src/forms/company.tsx | 12 +++++-- src/forms/internship.tsx | 10 +++--- src/forms/plan.tsx | 7 ++-- src/forms/student.tsx | 2 +- src/middleware.tsx | 8 ++--- src/pages/internship/proposal.tsx | 8 ++--- src/pages/user/profile.tsx | 2 +- src/state/reducer/edition.ts | 6 +++- 12 files changed, 96 insertions(+), 35 deletions(-) create mode 100644 src/api/upload.ts diff --git a/src/api/dto/internship-registration.ts b/src/api/dto/internship-registration.ts index 09659c6..b415db9 100644 --- a/src/api/dto/internship-registration.ts +++ b/src/api/dto/internship-registration.ts @@ -1,4 +1,4 @@ -import { Company, Identifiable, Internship, Mentor, Office } from "@/data"; +import { Address, Company, Identifiable, Internship, Mentor, Office } from "@/data"; import { momentSerializationTransformer, OneWayTransformer } from "@/serialization"; import { Nullable } from "@/helpers"; import { MentorDTO, mentorDtoTransformer } from "@/api/dto/mentor"; @@ -7,24 +7,34 @@ import { Moment } from "moment"; import { sampleStudent } from "@/provider/dummy"; export enum SubmissionState { - Draft, - Submitted, - Accepted, - Rejected, - Archival, + Draft = "Draft", + Submitted = "Submitted", + Accepted = "Accepted", + Rejected = "Rejected", + Archival = "Archival", +} + +export interface NewBranchOffice extends Address { } export interface InternshipRegistrationUpdateCompany { id: string, - branchOffice: Identifiable, + branchOffice: Identifiable | NewBranchOffice, +} + +export interface NewCompany { + nip: string; + name: string; + branchOffice: NewBranchOffice | null; } export interface InternshipRegistrationUpdate { - company: InternshipRegistrationUpdateCompany, + company: InternshipRegistrationUpdateCompany | NewCompany, start: string, end: string, type: number, mentor: MentorDTO, + hours: number, } export interface InternshipRegistrationDTO extends Identifiable { @@ -35,8 +45,11 @@ export interface InternshipRegistrationDTO extends Identifiable { mentor: MentorDTO, company: Company, branchAddress: Office, + declaredHours: number, } +const reference = (subject: Identifiable | null): Identifiable | null => subject && { id: subject.id }; + export interface InternshipInfoDTO { internshipRegistration: InternshipRegistrationDTO; } @@ -48,12 +61,17 @@ export const internshipRegistrationUpdateTransformer: OneWayTransformer): Promise { - const response = await axios.put(INTERNSHIP_ENDPOINT, internship); + const response = await axios.put(INTERNSHIP_REGISTRATION_ENDPOINT, internship); return true; } diff --git a/src/api/upload.ts b/src/api/upload.ts new file mode 100644 index 0000000..e27735a --- /dev/null +++ b/src/api/upload.ts @@ -0,0 +1,23 @@ +import { Identifiable } from "@/data"; +import { axios } from "@/api/index"; + +export enum UploadType { + Ipp = "IppScan", + DeanConsent = "DeanConsent", + Insurance = "NnwInsurance", +} + +const CREATE_DOCUMENT_ENDPOINT = '/document'; +const DOCUMENT_UPLOAD_ENDPOINT = '/document/:id/scan'; + +interface Document extends Identifiable { + description?: string; + type: UploadType; +} + +export async function create(type: UploadType, content: File) +{ + const response = await axios.post(CREATE_DOCUMENT_ENDPOINT, { type }); + + console.log(response.data); +} diff --git a/src/forms/company.tsx b/src/forms/company.tsx index 21a5300..246b1c2 100644 --- a/src/forms/company.tsx +++ b/src/forms/company.tsx @@ -103,7 +103,7 @@ export const BranchForm: React.FC = () => { onInputChange={ handleCityInput } onBlur={ ev => setFieldTouched("city", true) } inputValue={ values.city } - value={ values.office ? values.office : null } + value={ values.office ? values.office : values.city } freeSolo /> @@ -155,9 +155,15 @@ export const CompanyForm: React.FunctionComponent = () => { const canEdit = useMemo(() => !values.company, [values.company]); useEffect(() => { + if (!input || values.companyName == input) { + return; + } + (async () => { setCompanies(await api.companies.search(input)); })() + + setValues({ ...values, company: null, companyName: input }, true) }, [ input ]); const handleCompanyChange = (event: any, value: Company | string | null) => { @@ -194,7 +200,9 @@ export const CompanyForm: React.FunctionComponent = () => { renderOption={ company => } renderInput={ props => } - onChange={ handleCompanyChange } value={ values.company || values.companyName } + onChange={ handleCompanyChange } + value={ values.company || values.companyName } + inputValue={ input } freeSolo onInputChange={ (_, value) => setInput(value) } /> diff --git a/src/forms/internship.tsx b/src/forms/internship.tsx index 3ce409a..c36b3a3 100644 --- a/src/forms/internship.tsx +++ b/src/forms/internship.tsx @@ -97,7 +97,7 @@ const InternshipProgramForm = () => { renderOption={ (option: InternshipType) => } options={ types } disableClearable - value={ values.kind || undefined } + value={ values.kind || null as any } onChange={ (_, value) => setFieldValue("kind", value) } onBlur={ handleBlur } /> @@ -234,7 +234,7 @@ const converter: Transformer, InternshipFormValues, Interns nip: form.companyNip, offices: [], }, - hours: form.hours as number, + hours: form.hours ? form.hours : 0, type: form.kind as InternshipType, } } @@ -299,6 +299,8 @@ export const InternshipForm: React.FunctionComponent = () => { const internship = converter.reverseTransform(values, { internship: initialInternship as Internship }); const update = internshipRegistrationUpdateTransformer.transform(internship); + console.log(update); + api.internship.update(update); // history.push(route("home")) @@ -308,8 +310,8 @@ export const InternshipForm: React.FunctionComponent = () => { const { submitForm, validateForm } = useFormikContext(); const handleSubmitConfirmation = async () => { - const errors = await validateForm(); - + // const errors = await validateForm(); + const errors = {}; if (Object.keys(errors).length == 0) { setConfirmDialogOpen(true); } else { diff --git a/src/forms/plan.tsx b/src/forms/plan.tsx index 0c96203..1626d03 100644 --- a/src/forms/plan.tsx +++ b/src/forms/plan.tsx @@ -7,7 +7,9 @@ import { route } from "@/routing"; import React, { useState } from "react"; import { Plan } from "@/data"; import { useTranslation } from "react-i18next"; -import { InternshipPlanActions, useDispatch } from "@/state/actions"; +import { useDispatch } from "@/state/actions"; +import { UploadType } from "@/api/upload"; +import api from "@/api"; export const PlanForm = () => { const { t } = useTranslation(); @@ -18,7 +20,8 @@ export const PlanForm = () => { const history = useHistory(); const handleSubmit = () => { - dispatch({ type: InternshipPlanActions.Send, plan }); + api.upload.create(UploadType.Ipp, null as any); + // dispatch({ type: InternshipPlanActions.Send, plan }); history.push(route("home")) } diff --git a/src/forms/student.tsx b/src/forms/student.tsx index 189c3c4..efc4842 100644 --- a/src/forms/student.tsx +++ b/src/forms/student.tsx @@ -33,7 +33,7 @@ export const StudentForm = () => { /> - + skontaktuj siÄ™ z opiekunem }> diff --git a/src/middleware.tsx b/src/middleware.tsx index 166de95..621d234 100644 --- a/src/middleware.tsx +++ b/src/middleware.tsx @@ -5,21 +5,21 @@ import { Redirect } from "react-router-dom"; import React from "react"; import { UserState } from "@/state/reducer/user"; -export const isReadyMiddleware: Middleware = next => isLoggedInMiddleware(() => { +export const isReadyMiddleware: Middleware = Next => isLoggedInMiddleware(() => { const ready = useSelector(isReady); if (ready) { - return <>{ next() }; + return ; } return ; }) -export const isLoggedInMiddleware: Middleware = next => { +export const isLoggedInMiddleware: Middleware = Next => { const user = useSelector(state => state.user) as UserState; if (user.loggedIn) { - return <>{ next() }; + return ; } return ; diff --git a/src/pages/internship/proposal.tsx b/src/pages/internship/proposal.tsx index 939998b..1b3a814 100644 --- a/src/pages/internship/proposal.tsx +++ b/src/pages/internship/proposal.tsx @@ -115,10 +115,6 @@ export const InternshipProposalPreviewPage = () => { { proposal && } - - + + diff --git a/src/pages/user/profile.tsx b/src/pages/user/profile.tsx index 5ebc8ba..54bca0e 100644 --- a/src/pages/user/profile.tsx +++ b/src/pages/user/profile.tsx @@ -47,7 +47,7 @@ export const UserProfilePage = () => { - diff --git a/src/state/reducer/edition.ts b/src/state/reducer/edition.ts index 93847c2..43084d4 100644 --- a/src/state/reducer/edition.ts +++ b/src/state/reducer/edition.ts @@ -1,15 +1,19 @@ import { Edition } from "@/data/edition"; import { EditionAction, EditionActions } from "@/state/actions/edition"; import { editionSerializationTransformer, Serializable } from "@/serialization"; +import { LoginAction, LogoutAction, UserActions } from "@/state/actions"; export type EditionState = Serializable | null; const initialEditionState: EditionState = null; -const editionReducer = (state: EditionState = initialEditionState, action: EditionAction): EditionState => { +const editionReducer = (state: EditionState = initialEditionState, action: EditionAction | LogoutAction | LoginAction): EditionState => { switch (action.type) { case EditionActions.Set: return editionSerializationTransformer.transform(action.edition); + case UserActions.Login: + case UserActions.Logout: + return initialEditionState; } return state;