Add export button
This commit is contained in:
parent
09550adeb3
commit
f6b0d7bc2f
@ -40,7 +40,15 @@ export const uploadStudents = (payload: FormData) =>
|
|||||||
payload,
|
payload,
|
||||||
)
|
)
|
||||||
|
|
||||||
export const deleteStudent = (payload: Number) =>
|
export const deleteStudent = (index: number) =>
|
||||||
axiosInstance.delete(
|
axiosInstance.delete(
|
||||||
'http://127.0.0.1:5000/api/coordinator/students/'+payload.toString()+'/',
|
`http://127.0.0.1:5000/api/coordinator/students/${index}/`,
|
||||||
|
)
|
||||||
|
|
||||||
|
export const downloadStudents = () =>
|
||||||
|
axiosInstance.post(
|
||||||
|
'http://127.0.0.1:5000/api/coordinator/students/download/',
|
||||||
|
{
|
||||||
|
responseType: 'blob',
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
import React, { useEffect, useState } from 'react'
|
import React, { useEffect, useState } from 'react'
|
||||||
import { useMutation, useQuery } from 'react-query'
|
import { useMutation, useQuery } from 'react-query'
|
||||||
import { useNavigate } from 'react-router-dom'
|
import { useNavigate } from 'react-router-dom'
|
||||||
import { getStudents, uploadStudents, deleteStudent } from '../../api/students'
|
import {
|
||||||
|
getStudents,
|
||||||
|
uploadStudents,
|
||||||
|
deleteStudent,
|
||||||
|
downloadStudents,
|
||||||
|
} from '../../api/students'
|
||||||
import classNames from 'classnames'
|
import classNames from 'classnames'
|
||||||
|
|
||||||
const Students = () => {
|
const Students = () => {
|
||||||
@ -38,6 +43,21 @@ const Students = () => {
|
|||||||
getStudents({ page, per_page: perPage, mode }),
|
getStudents({ page, per_page: perPage, mode }),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const { mutate: mutateDownload } = useMutation(
|
||||||
|
'downloadStudents',
|
||||||
|
() => downloadStudents(),
|
||||||
|
{
|
||||||
|
onSuccess: (res) => {
|
||||||
|
const url = window.URL.createObjectURL(new Blob([res.data]))
|
||||||
|
const link = document.createElement('a')
|
||||||
|
link.href = url
|
||||||
|
link.setAttribute('download', 'students_list.csv')
|
||||||
|
document.body.appendChild(link)
|
||||||
|
link.click()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
const { mutate: mutateUpload } = useMutation(
|
const { mutate: mutateUpload } = useMutation(
|
||||||
'uploadStudents',
|
'uploadStudents',
|
||||||
(payload: FormData) => uploadStudents(payload),
|
(payload: FormData) => uploadStudents(payload),
|
||||||
@ -46,6 +66,14 @@ const Students = () => {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const { mutate: mutateDelete } = useMutation(
|
||||||
|
'deleteStudent',
|
||||||
|
(index: number) => deleteStudent(index),
|
||||||
|
{
|
||||||
|
onSuccess: () => refetchStudents(),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
const handleOnChange = (event: any) => {
|
const handleOnChange = (event: any) => {
|
||||||
const file = event.target.files[0]
|
const file = event.target.files[0]
|
||||||
const payload = new FormData()
|
const payload = new FormData()
|
||||||
@ -60,7 +88,7 @@ const Students = () => {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className="flex items-center justify-between flex-col gap-3 md:flex-row md:gap-0">
|
<div className="flex items-center justify-between flex-col gap-3 md:flex-row md:gap-0">
|
||||||
<div>
|
<div className="flex gap-3">
|
||||||
<button
|
<button
|
||||||
className="btn btn-success btn-xs md:btn-md"
|
className="btn btn-success btn-xs md:btn-md"
|
||||||
onClick={() => navigate('/coordinator/add-student')}
|
onClick={() => navigate('/coordinator/add-student')}
|
||||||
@ -68,7 +96,7 @@ const Students = () => {
|
|||||||
Dodaj nowego studenta
|
Dodaj nowego studenta
|
||||||
</button>
|
</button>
|
||||||
<label
|
<label
|
||||||
className="ml-4 btn btn-success btn-xs md:btn-md btn-outline"
|
className="btn btn-success btn-xs md:btn-md btn-outline"
|
||||||
htmlFor="file"
|
htmlFor="file"
|
||||||
>
|
>
|
||||||
Importuj
|
Importuj
|
||||||
@ -81,6 +109,12 @@ const Students = () => {
|
|||||||
className="hidden"
|
className="hidden"
|
||||||
onChange={handleOnChange}
|
onChange={handleOnChange}
|
||||||
/>
|
/>
|
||||||
|
<button
|
||||||
|
className="btn btn-xs md:btn-md"
|
||||||
|
onClick={() => mutateDownload()}
|
||||||
|
>
|
||||||
|
Eksportuj
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
<select className="select select-xs md:select-md select-bordered mr-3">
|
<select className="select select-xs md:select-md select-bordered mr-3">
|
||||||
@ -135,7 +169,9 @@ const Students = () => {
|
|||||||
<td>{index}</td>
|
<td>{index}</td>
|
||||||
<td>{group === null ? 'Nie' : 'Tak'}</td>
|
<td>{group === null ? 'Nie' : 'Tak'}</td>
|
||||||
<td>{mode ? 'stacjonarny' : 'niestacjonarny'}</td>
|
<td>{mode ? 'stacjonarny' : 'niestacjonarny'}</td>
|
||||||
<td><button onClick={() => deleteStudent(index).then(() => refetchStudents())}>X</button></td>
|
<td>
|
||||||
|
<button onClick={() => mutateDelete(index)}>X</button>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
Loading…
Reference in New Issue
Block a user