diff --git a/src/components/planning/PlanningDetailsModal.tsx b/src/components/planning/PlanningDetailsModal.tsx index 91d94ef..8ff1a4d 100644 --- a/src/components/planning/PlanningDetailsModal.tsx +++ b/src/components/planning/PlanningDetailsModal.tsx @@ -1,4 +1,4 @@ -import { Card, Col, List, Modal, Row } from "antd"; +import { Card, Col, Modal, Row } from "antd"; import moment from "moment"; import React from "react"; import { studentsPlannedInDay } from "../../helpers/filters"; @@ -111,10 +111,6 @@ class PlanningDetailsModal extends React.Component @@ -132,7 +128,7 @@ class PlanningDetailsModal extends React.Component {student.internship.startDate.format("DD/MM/YY")} - {student.internship.endDate.format("DD/MM/YY")}   - ({internshipAmountOfDays} {singleOrPlural(internshipAmountOfDays, "dag", "dagen")}) + ({student.internshipNumberOfDays} {singleOrPlural(student.internshipNumberOfDays, "dag", "dagen")}) } diff --git a/src/components/students/StudentsPage.tsx b/src/components/students/StudentsPage.tsx index 44f5e1b..bebd9c8 100644 --- a/src/components/students/StudentsPage.tsx +++ b/src/components/students/StudentsPage.tsx @@ -1,9 +1,11 @@ import { Col, notification, Row } from "antd"; import React from "react"; +import { Department } from "../../models/Department"; import { Education } from "../../models/Education"; import { School } from "../../models/School"; import { Student } from "../../models/Student"; import { AnyRouteComponentProps } from "../../routes"; +import { DepartmentsRepository } from "../../services/repositories/DepartmentsRepository"; import { EducationsRepository } from "../../services/repositories/EducationsRepository"; import { SchoolsRepository } from "../../services/repositories/SchoolsRepository"; import { StudentsRepository } from "../../services/repositories/StudentsRepository"; @@ -22,6 +24,8 @@ interface IStudentsPageState { isFetchingSchools: boolean; educations: Education[]; isFetchingEducations: boolean; + departments: Department[]; + isFetchingDepartments: boolean; } export default class StudentsPage extends React.Component { @@ -41,6 +45,8 @@ export default class StudentsPage extends React.Component { return; }; @@ -75,6 +81,13 @@ export default class StudentsPage extends React.Component { + this.setState({ + isFetchingDepartments: false, + departments, + }); + }); } public componentWillUnmount(): void { @@ -96,6 +109,8 @@ export default class StudentsPage extends React.Component diff --git a/src/components/students/StudentsTable.module.scss b/src/components/students/StudentsTable.module.scss new file mode 100644 index 0000000..0bb1680 --- /dev/null +++ b/src/components/students/StudentsTable.module.scss @@ -0,0 +1,3 @@ +.studentInternshipModalFooter { + text-align: right; +} \ No newline at end of file diff --git a/src/components/students/StudentsTable.tsx b/src/components/students/StudentsTable.tsx index 44445df..3a5e2fc 100644 --- a/src/components/students/StudentsTable.tsx +++ b/src/components/students/StudentsTable.tsx @@ -1,12 +1,15 @@ -import { Button, Col, Popconfirm, Row, Spin, Table, Tooltip, Modal } from "antd"; +import { Button, Col, Modal, notification, Popconfirm, Row, Spin, Table, Tooltip } from "antd"; import { ColumnFilterItem, ColumnProps } from "antd/lib/table"; import React from "react"; import { emptyFilterOptionValue, exactMatchOrDefaultOptionFilter, hasElementWithId } from "../../helpers/filters"; import { stringSorter } from "../../helpers/sorters"; +import { Department } from "../../models/Department"; import { Education } from "../../models/Education"; import { School } from "../../models/School"; import { Student } from "../../models/Student"; +import { StudentsRepository } from "../../services/repositories/StudentsRepository"; import styles from "../DataTable.module.scss"; +import specificStyles from "./StudentsTable.module.scss"; interface IStudentsTableProps { isLoading: boolean; @@ -15,6 +18,8 @@ interface IStudentsTableProps { isLoadingSchools: boolean; educations: Education[]; isLoadingEducations: boolean; + departments: Department[]; + isLoadingDepartments: boolean; deleteStudent: (student: Student) => Promise; onAddStudentRequest: () => void; onEditStudentRequest: (student: Student) => void; @@ -23,6 +28,7 @@ interface IStudentsTableProps { interface IStudentTableState { isPlanningDetailsOpen: boolean; selectedStudentPlanningDetails: Student | undefined; + isDeletingInternship: boolean; } class StudentsTable extends React.Component { @@ -33,6 +39,7 @@ class StudentsTable extends React.Component selectedStudent !== undefined + ? this.handleDeleteInternshipForStudent(selectedStudent) + : {}; const columns = this.getTableColumns(); + const departmentsNameForStudent = selectedStudent !== undefined + ? this.getDepartmentNameForStudent(selectedStudent) + : undefined; return ( - - heh - + {selectedStudent !== undefined && selectedStudent.internship !== undefined && + + + + + + )} + > +

+ Van {selectedStudent.internship.startDate.format("DD/MM/YYYY")} tot en met {selectedStudent.internship.endDate.format("DD/MM/YYYY")} +   + ({selectedStudent.internshipNumberOfDays} {selectedStudent.internshipNumberOfDays === 1 ? "dag" : "dagen"}) + {departmentsNameForStudent !== undefined && + +  in {departmentsNameForStudent} + + } + . +

+
+ } ); } @@ -142,6 +174,21 @@ class StudentsTable extends React.Component { + this.setState({ + isPlanningDetailsOpen: false, + selectedStudentPlanningDetails: undefined, + }); + }) + .catch(() => { + notification.error({ + message: "Kon stage niet verwijderen, probeer later opnieuw", + }); + }); + } + private generateTableRowKey(record: Student, index: number): string { return record.id || index.toString(); } @@ -160,10 +207,21 @@ class StudentsTable extends React.Component studentsDepartmentId === d.id); + if (department === undefined) { + return undefined; + } + return department.name; + } + private getTableColumns(): Array> { return [ { diff --git a/src/models/Student.ts b/src/models/Student.ts index 0f072bd..fa6bdb2 100644 --- a/src/models/Student.ts +++ b/src/models/Student.ts @@ -19,6 +19,12 @@ export class Student extends ModelBase { return `${this.firstName} ${this.lastName}`; } + public get internshipNumberOfDays(): number { + return this.internship !== undefined + ? this.internship.endDate.diff(this.internship.startDate, "days") + 1 + : 0; + } + constructor( public firstName: string, public lastName: string | undefined, diff --git a/src/services/repositories/StudentsRepository.ts b/src/services/repositories/StudentsRepository.ts index 140d287..f50cfe1 100644 --- a/src/services/repositories/StudentsRepository.ts +++ b/src/services/repositories/StudentsRepository.ts @@ -94,6 +94,19 @@ export class StudentsRepository { await studentDocRef.update(student.getEntity("update")); } + public static async removeInternshipForStudent(student: Student): Promise { + if (student.id === undefined) { + return Promise.reject(Error("Student should have an id")); + } + + const studentDocRef = FirestoreRefs.getStudentDocRef(student.id); + + student.isPlanned = false; + student.internship = undefined; + + await studentDocRef.update(student.getEntity("update")); + } + public static async updateStudent(student: Student, doNotUpdateTimestamp: boolean = false): Promise { if (student.id === undefined) { return Promise.reject(Error("Student should have an id"));