From c0ad0826d0ee511d619939000c4b91290d8efc0a Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Mon, 11 Jan 2021 23:03:25 +0100 Subject: [PATCH] Reporting api stuff --- src/api/dto/edition.ts | 85 ++++++++++++++++++- src/api/dto/internship-registration.ts | 53 +++++++++--- src/api/index.ts | 4 +- src/api/report.ts | 8 ++ src/components/fileinfo.tsx | 2 +- src/data/common.ts | 6 ++ src/data/edition.ts | 2 + src/data/report.ts | 10 +-- src/forms/report.tsx | 29 ++++--- src/management/api/field.ts | 14 +++ src/management/api/index.ts | 4 +- src/management/edition/internship/list.tsx | 6 +- src/management/edition/ipp/list.tsx | 2 +- src/management/edition/manage.tsx | 3 - src/management/main.tsx | 6 +- .../{edition => }/report/fields/edit.tsx | 2 +- .../{edition => }/report/fields/form.tsx | 6 +- .../{edition => }/report/fields/list.tsx | 71 ++++++++++++---- src/management/routing.tsx | 4 +- src/pages/main.tsx | 21 ++++- src/pages/steps/plan.tsx | 5 +- src/provider/dummy/report.ts | 21 +++-- src/state/actions/plan.ts | 1 + src/state/actions/report.ts | 6 ++ src/state/reducer/plan.ts | 1 + src/state/reducer/report.ts | 3 + 26 files changed, 295 insertions(+), 80 deletions(-) create mode 100644 src/api/report.ts create mode 100644 src/management/api/field.ts rename src/management/{edition => }/report/fields/edit.tsx (98%) rename src/management/{edition => }/report/fields/form.tsx (95%) rename src/management/{edition => }/report/fields/list.tsx (54%) diff --git a/src/api/dto/edition.ts b/src/api/dto/edition.ts index ece5a0f..cb0cebd 100644 --- a/src/api/dto/edition.ts +++ b/src/api/dto/edition.ts @@ -5,6 +5,7 @@ import { Edition } from "@/data/edition"; import moment from "moment-timezone"; import { Subset } from "@/helpers"; import { InternshipTypeDTO, internshipTypeDtoTransformer } from "@/api/dto/type"; +import { ReportFieldDefinition, ReportFieldType } from "@/data/report"; export interface ProgramEntryDTO extends Identifiable { description: string; @@ -18,6 +19,7 @@ export interface EditionDTO extends Identifiable { course: CourseDTO, availableSubjects: ProgramEntryDTO[], availableInternshipTypes: InternshipTypeDTO[], + reportSchema: FieldDefinitionDTO[], } export interface EditionTeaserDTO extends Identifiable { @@ -26,6 +28,83 @@ export interface EditionTeaserDTO extends Identifiable { courseName: string, } +export enum FieldDefinitionDTOType { + LongText = "LongText", + ShortText = "ShortText", + Select = "Select", + Radial = "Radial", + Checkbox = "Checkbox", +} + +export const fieldDefinitionDtoTypeTransformer: Transformer = { + transform(dto: FieldDefinitionDTOType, context?: unknown) { + switch (dto) { + case FieldDefinitionDTOType.LongText: + return "long-text" + case FieldDefinitionDTOType.ShortText: + return "short-text"; + case FieldDefinitionDTOType.Select: + return "select"; + case FieldDefinitionDTOType.Radial: + return "radio"; + case FieldDefinitionDTOType.Checkbox: + return "checkbox"; + } + }, + reverseTransform(type: ReportFieldType, context?: unknown) { + switch (type) { + case "short-text": + return FieldDefinitionDTOType.ShortText; + case "long-text": + return FieldDefinitionDTOType.LongText; + case "checkbox": + return FieldDefinitionDTOType.Checkbox; + case "radio": + return FieldDefinitionDTOType.Radial; + case "select": + return FieldDefinitionDTOType.Select; + } + } +} + +export interface FieldDefinitionDTO extends Identifiable { + label: string; + labelEng: string; + description: string; + descriptionEng: string; + fieldType: FieldDefinitionDTOType; + choices: string[]; +} + +export const fieldDefinitionDtoTransformer: Transformer = { + transform(dto: FieldDefinitionDTO, context?: unknown): ReportFieldDefinition { + return { + ...dto, + choices: (dto.choices || []).map(choice => JSON.parse(choice)), + description: { + pl: dto.description, + en: dto.descriptionEng, + }, + label: { + pl: dto.label, + en: dto.labelEng, + }, + type: fieldDefinitionDtoTypeTransformer.transform(dto.fieldType), + } + }, + reverseTransform(subject: ReportFieldDefinition, context?: unknown): FieldDefinitionDTO { + return { + ...subject, + choices: "choices" in subject && subject.choices.map(choice => JSON.stringify(choice)) || [], + description: subject.description.pl, + descriptionEng: subject.description.en, + fieldType: fieldDefinitionDtoTypeTransformer.reverseTransform(subject.type), + label: subject.label.pl, + labelEng: subject.label.en, + } + } +} + export const editionTeaserDtoTransformer: OneWayTransformer> = { transform(subject: EditionTeaserDTO, context?: undefined): Subset { return subject && { @@ -48,7 +127,8 @@ export const editionDtoTransformer: Transformer = { course: courseDtoTransformer.reverseTransform(subject.course), reportingStart: subject.reportingStart.toISOString(), availableSubjects: subject.program.map(entry => programEntryDtoTransformer.reverseTransform(entry)), - availableInternshipTypes: subject.types.map(entry => internshipTypeDtoTransformer.reverseTransform(entry)) + availableInternshipTypes: subject.types.map(entry => internshipTypeDtoTransformer.reverseTransform(entry)), + reportSchema: subject.schema.map(entry => fieldDefinitionDtoTransformer.reverseTransform(entry)), }; }, transform(subject: EditionDTO, context: undefined): Edition { @@ -63,7 +143,8 @@ export const editionDtoTransformer: Transformer = { reportingStart: moment(subject.reportingStart), reportingEnd: moment(subject.reportingStart).add(1, 'month'), program: (subject.availableSubjects || []).map(entry => programEntryDtoTransformer.transform(entry)), - types: (subject.availableInternshipTypes || []).map(entry => internshipTypeDtoTransformer.transform(entry)) + types: (subject.availableInternshipTypes || []).map(entry => internshipTypeDtoTransformer.transform(entry)), + schema: (subject.reportSchema || []).map(entry => fieldDefinitionDtoTransformer.transform(entry)), }; } } diff --git a/src/api/dto/internship-registration.ts b/src/api/dto/internship-registration.ts index b3310dc..829f308 100644 --- a/src/api/dto/internship-registration.ts +++ b/src/api/dto/internship-registration.ts @@ -1,4 +1,4 @@ -import { Address, Company, Identifiable, Internship, Mentor, Office, Student } from "@/data"; +import { Address, Company, Identifiable, Internship, Mentor, Office, Stateful } from "@/data"; import { momentSerializationTransformer, OneWayTransformer, Transformer } from "@/serialization"; import { Nullable } from "@/helpers"; import { MentorDTO, mentorDtoTransformer } from "@/api/dto/mentor"; @@ -9,6 +9,12 @@ import { UploadType } from "@/api/upload"; import { ProgramEntryDTO, programEntryDtoTransformer } from "@/api/dto/edition"; import { StudentDTO } from "@/api/dto/student"; import { SubmissionStatus } from "@/state/reducer/submission"; +import { Report } from "@/data/report"; + +export interface StatefulDTO { + state: SubmissionState; + changeStateComment: string; +} export enum SubmissionState { Draft = "Draft", @@ -47,6 +53,21 @@ export const submissionStateDtoTransformer: Transformer = { + reverseTransform(subject: Stateful, context: undefined): StatefulDTO { + return { + changeStateComment: subject.comment, + state: submissionStateDtoTransformer.reverseTransform(subject.state, context), + }; + }, + transform(subject: StatefulDTO, context: undefined): Stateful { + return { + comment: subject.changeStateComment, + state: submissionStateDtoTransformer.transform(subject.state), + } + } +} + export interface NewBranchOffice extends Address { } @@ -71,30 +92,30 @@ export interface InternshipRegistrationUpdate { subjects: string[], } -export interface InternshipRegistrationDTO extends Identifiable { +export interface InternshipRegistrationDTO extends Identifiable, StatefulDTO { start: string; end: string; type: InternshipTypeDTO, - state: SubmissionState, mentor: MentorDTO, company: Company, branchAddress: Office, declaredHours: number, subjects: { subject: ProgramEntryDTO }[], submissionDate: string, - changeStateComment: string; } -export interface InternshipDocument extends Identifiable { +export interface InternshipDocument extends Identifiable, Stateful { description: null, type: UploadType, - state: SubmissionStatus, } -export interface InternshipDocumentDTO extends Identifiable { - description: null, - type: UploadType, - state: SubmissionState, +export interface InternshipDocumentDTO extends Identifiable, StatefulDTO { + description: null; + type: UploadType; +} + +export interface InternshipReportDTO extends StatefulDTO, Identifiable { + value: string; } const reference = (subject: Identifiable | null): Identifiable | null => subject && { id: subject.id }; @@ -103,6 +124,16 @@ export interface InternshipInfoDTO extends Identifiable { internshipRegistration: InternshipRegistrationDTO; documentation: InternshipDocumentDTO[], student: StudentDTO, + report: InternshipReportDTO, +} + +export const internshipReportDtoTransformer: OneWayTransformer = { + transform(subject: InternshipReportDTO, context?: unknown): Report { + return { + fields: JSON.parse(subject.value), + ...statefulDtoTransformer.transform(subject), + } + } } export const internshipRegistrationUpdateTransformer: OneWayTransformer, Nullable> = { @@ -151,7 +182,7 @@ export const internshipDocumentDtoTransformer: OneWayTransformer { { fileinfo =>
- +