diff --git a/backend/app/coordinator/routes/groups.py b/backend/app/coordinator/routes/groups.py index 393ff3f..07d1902 100644 --- a/backend/app/coordinator/routes/groups.py +++ b/backend/app/coordinator/routes/groups.py @@ -39,14 +39,16 @@ def create_group(data: dict) -> dict: project_supervisor_id = data['project_supervisor_id'] # can assign a new group to project_supervisor - result = db.session.query(ProjectSupervisor.count_groups - db.func.count(ProjectSupervisor.id)). \ - join(Group).filter(ProjectSupervisor.id == project_supervisor_id). \ - group_by(ProjectSupervisor.id).scalar() - if result is None: - abort(400, "Project Supervisor doesnt exist") - elif result <= 0: - abort(400, "Can't create new group, project supervisor achieved a limit of groups") + # nie działa to poprawnie + # result = db.session.query(ProjectSupervisor.count_groups - db.func.count(ProjectSupervisor.id)). \ + # join(Group).filter(ProjectSupervisor.id == project_supervisor_id). \ + # group_by(ProjectSupervisor.id).scalar() + + # if result is None: + # abort(400, "Project Supervisor doesnt exist") + # elif result <= 0: + # abort(400, "Can't create new group, project supervisor achieved a limit of groups") group = Group(name=name, project_supervisor_id=project_supervisor_id) diff --git a/frontend/src/api/groups.ts b/frontend/src/api/groups.ts new file mode 100644 index 0000000..d95445e --- /dev/null +++ b/frontend/src/api/groups.ts @@ -0,0 +1,50 @@ +import axiosInstance from './axiosInstance' +import { Leader } from './leaders' +import { Student } from './students' + +type OrderType = 'asc' | 'desc' + +interface GroupResponse { + max_pages: number + groups: Group[] +} + +export interface Group { + id: number + name: string + project_supervisor: Leader + points_for_first_term: number + points_for_second_term: number +} + +export interface GroupPost { + name: string + project_supervisor_id: number + students: number[] +} + +export const getGroups = ( + params: Partial<{ + name: string + page: number + per_page: number + }> = {}, +) => + axiosInstance.get( + 'http://127.0.0.1:5000/api/coordinator/groups', + { params }, + ) + +export const createGroup = (payload: Group) => + axiosInstance.post('http://127.0.0.1:5000/api/coordinator/groups/', payload) + +export const uploadGroups = (payload: FormData) => + axiosInstance.post( + 'http://127.0.0.1:5000/api/coordinator/groups/upload/', + payload, + ) + +export const deleteGroup = (payload: Number) => + axiosInstance.delete( + 'http://127.0.0.1:5000/api/coordinator/groups/'+payload.toString()+'/', + ) diff --git a/frontend/src/views/coordinator/AddGroup.tsx b/frontend/src/views/coordinator/AddGroup.tsx index bf47710..1426a1a 100644 --- a/frontend/src/views/coordinator/AddGroup.tsx +++ b/frontend/src/views/coordinator/AddGroup.tsx @@ -1,9 +1,11 @@ import { useState } from 'react' import { Controller, useForm } from 'react-hook-form' -import { useQuery } from 'react-query' +import { useQuery, useMutation } from 'react-query' import { getStudents } from '../../api/students' import InputError from '../../components/InputError' import Select from 'react-select' +import { getLeaders } from '../../api/leaders' +import { createGroup, Group } from '../../api/groups' type SelectValue = { value: string | number @@ -20,13 +22,25 @@ const AddGroup = () => { control, } = useForm<{ name: string - supervisor: any + project_supervisor_id: any students: any }>({ mode: 'onBlur', }) - + const { mutate: mutateCreateGroup } = useMutation( + 'createStudent', + (payload: any) => createGroup(payload), + { + onSuccess: () => { + reset() + setIsAlertVisible(true) + }, + }, + ) const onSubmit = (data: any) => { + data.project_supervisor_id = data.project_supervisor_id.value + data.students = data.students.map((st: any) => st.value) + mutateCreateGroup(data) console.log(data) } @@ -49,16 +63,26 @@ const AddGroup = () => { }, ) - const supervisorOptions = [ - { value: '1', label: 'Patryk Żywica' }, - { value: '2', label: 'Krzysztof Krzywdziński' }, - { value: '3', label: 'Krzysztof Dyczkowski' }, - { value: '4', label: 'Rafał Witkowski' }, - { value: '5', label: 'Wojciech Wawrzyniak' }, - { value: '6', label: 'Marcin Witkowski' }, - ] + const [leadersOptions, setLeadersOptions] = useState([]) - if (areStudentsLoading) { + const { isLoading: areLeadersLoading } = useQuery( + 'project_supervisors', + () => getLeaders({ per_page: 1000 }), + { + onSuccess: (data) => { + setLeadersOptions( + data?.data.project_supervisors.map(({ id, first_name, last_name }) => { + return { + value: id, + label: `${first_name} ${last_name}`, + } + }), + ) + }, + }, + ) + + if (areStudentsLoading || areLeadersLoading) { return <>Ładowanie } return ( @@ -87,16 +111,16 @@ const AddGroup = () => { )}
-