diff --git a/src/roles/teacher/feedback/hooks/useProgress.jsx b/src/roles/teacher/feedback/hooks/useProgress.jsx index 3a689b8..2c6cbd9 100644 --- a/src/roles/teacher/feedback/hooks/useProgress.jsx +++ b/src/roles/teacher/feedback/hooks/useProgress.jsx @@ -92,7 +92,7 @@ const useProgress = () => { const getClassTopic = async (id) => { setLoadingModal(true); try { - const classes = await progressService.getTopicByClass(id, '', '', '', 1000); + const classes = await progressService.getTopicByClass(id); setSelected(classes.payload.data); } catch (err) { console.log(err); diff --git a/src/roles/teacher/feedback/hooks/useProgressClass.jsx b/src/roles/teacher/feedback/hooks/useProgressClass.jsx index 9389238..197d170 100644 --- a/src/roles/teacher/feedback/hooks/useProgressClass.jsx +++ b/src/roles/teacher/feedback/hooks/useProgressClass.jsx @@ -78,12 +78,30 @@ const useProgressClass = (progressId) => { .replace(/\./g, ':') + ' WIB'; } + const handleDownloadCSV = async () => { + try { + const response = await progressService.getCsvProgress(); + + const blob = new Blob([response], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + const downloadUrl = URL.createObjectURL(blob); + + const link = document.createElement('a'); + link.href = downloadUrl; + link.download = `progress ${name}-${topic}.csv`; + link.click(); + + URL.revokeObjectURL(downloadUrl); + } catch (error) { + console.error('Error downloading file:', error); + alert('Gagal mengunduh file'); + } + } + return { progress, section, topic, name, - nisn, loading, error, @@ -94,7 +112,8 @@ const useProgressClass = (progressId) => { handlePageChange, handleLimitsChange, handleSearchChange, - formatLocalDate + formatLocalDate, + handleDownloadCSV }; }; diff --git a/src/roles/teacher/feedback/hooks/useProgressStudent.jsx b/src/roles/teacher/feedback/hooks/useProgressStudent.jsx index 4b2bf03..8da119c 100644 --- a/src/roles/teacher/feedback/hooks/useProgressStudent.jsx +++ b/src/roles/teacher/feedback/hooks/useProgressStudent.jsx @@ -20,6 +20,13 @@ const useProgressStudent = (monitoringId) => { const [totalPages, setTotalPages] = useState(0); const [totalData, setTotalData] = useState(null); + + const [idMonitoring, setIdMonitoring] = useState(null); + const [showFeedback, setShowFeedback] = useState(false); + const [feedback, setFeedback] = useState(""); + const [successFeedback, setSuccessFeedback] = useState(false); + const [loadingFeedback, setLoadingFeedback] = useState(false); + const fetchData = async () => { setLoading(true); try { @@ -28,7 +35,8 @@ const useProgressStudent = (monitoringId) => { setProgress(data.payload.levels); setTotalPages(data.payload.totalPages); setTotalData(data.payload.totalItems); - + + setIdMonitoring(data.payload.ID_MONITORING); setSection(data.payload.NAME_SECTION) setTopic(data.payload.NAME_TOPIC) setName(data.payload.NAME_USERS) @@ -76,7 +84,33 @@ const useProgressStudent = (monitoringId) => { .replace(/\./g, ':') + ' WIB'; } - const downloadPDF = () => { + const handleShowFeedback = () => { + setSuccessFeedback(false); + setShowFeedback(true); + } + + const handleCloseFeedback = () => { + setShowFeedback(false); + setFeedback(''); + setSuccessFeedback(false); + } + + const handleSubmitFeedback = async (e) => { + e.preventDefault(); + setLoadingFeedback(true); + setSuccessFeedback(false); + try { + await progressService.postFeedback(idMonitoring, feedback); + setSuccessFeedback(true); + setFeedback(''); + setLoadingFeedback(false); + } catch (err) { + // setError(err.message); + console.log(err.message); + } + }; + + const handleDownloadCSV = () => { const doc = new jsPDF(); const pageWidth = doc.internal.pageSize.getWidth(); @@ -122,7 +156,16 @@ const useProgressStudent = (monitoringId) => { handleLimitsChange, handleSearchChange, formatLocalDate, - downloadPDF + handleDownloadCSV, + + feedback, + setFeedback, + loadingFeedback, + successFeedback, + handleSubmitFeedback, + showFeedback, + handleShowFeedback, + handleCloseFeedback, }; }; diff --git a/src/roles/teacher/feedback/services/serviceProgress.jsx b/src/roles/teacher/feedback/services/serviceProgress.jsx index 251b396..5f774f0 100644 --- a/src/roles/teacher/feedback/services/serviceProgress.jsx +++ b/src/roles/teacher/feedback/services/serviceProgress.jsx @@ -30,9 +30,9 @@ const getStudentById = async (id) => { } }; -const getTopicByClass = async (id, search, sort, page, limit) => { +const getTopicByClass = async (id) => { try { - const response = await axiosInstance.get(`/monitoring/class/${id}?search=${search}&sort=${sort}&page=${page}&limit=${limit}`); + const response = await axiosInstance.get(`/monitoring/class/${id}`); return response.data; } catch (error) { console.error('Error fetching progress:', error); @@ -52,7 +52,7 @@ const fetchDataStudentProgress = async (id, search, sort, page, limit) => { const fetchDataClassProgress = async (dataId, search, sort, page, limit) => { try { - const response = await axiosInstance.get(`/monitoring/class?search=${search}&sort=${sort}&page=${page}&limit=${limit}`, dataId); + const response = await axiosInstance.post(`/monitoring/class?search=${search}&sort=${sort}&page=${page}&limit=${limit}`, dataId); return response.data; } catch (error) { console.error('Error fetching progress:', error); @@ -60,11 +60,39 @@ const fetchDataClassProgress = async (dataId, search, sort, page, limit) => { } }; +const postFeedback = async (id, feedback) => { + try { + const response = await axiosInstance.post(`/monitoring/feedback/${id}`, feedback); + return response.data; + } catch (error) { + console.error('Error post feedback:', error); + throw error; + } +}; + +const getCsvProgress = async () => { + const configs = { + headers: { + Authorization: localStorage.getItem('token') + }, + responseType: 'blob', + }; + try { + const response = await axiosInstance.get(`/monitoring/class/csv`, configs); + return response.data; + } catch (error) { + console.error(`Error get file:`, error); + throw error; + } +}; + export default{ fetchDataStudent, fetchDataClass, getStudentById, getTopicByClass, fetchDataStudentProgress, - fetchDataClassProgress + fetchDataClassProgress, + getCsvProgress, + postFeedback }; diff --git a/src/roles/teacher/feedback/views/ClassFeedback.jsx b/src/roles/teacher/feedback/views/ClassFeedback.jsx index 720a6d7..166cc18 100644 --- a/src/roles/teacher/feedback/views/ClassFeedback.jsx +++ b/src/roles/teacher/feedback/views/ClassFeedback.jsx @@ -8,12 +8,10 @@ const ClassFeedback = () => { const { progressId } = useParams(); const { progress, + name, section, topic, - name, - nisn, loading, - error, totalPages, totalData, @@ -22,7 +20,8 @@ const ClassFeedback = () => { handlePageChange, handleLimitsChange, handleSearchChange, - formatLocalDate + formatLocalDate, + handleDownloadCSV } = useProgressClass(progressId); return (
@@ -33,12 +32,12 @@ const ClassFeedback = () => { Monitoring Progress - Progress Details + Class Progress Details - @@ -46,7 +45,7 @@ const ClassFeedback = () => {
-

{nisn} - {name}

+

{name}

{section} / {topic}
@@ -63,11 +62,11 @@ const ClassFeedback = () => { - - + + @@ -75,7 +74,7 @@ const ClassFeedback = () => { {loading?( - - - + + )) ):( - diff --git a/src/roles/teacher/feedback/views/Feedback.jsx b/src/roles/teacher/feedback/views/Feedback.jsx index 09df39e..cbef5f2 100644 --- a/src/roles/teacher/feedback/views/Feedback.jsx +++ b/src/roles/teacher/feedback/views/Feedback.jsx @@ -41,8 +41,8 @@ const Feedback = () => { return (
-

Learning Progress

-

Follow student activity closely and monitor their English learning journey.

+

Feedback

+

Make students more enthusiastic with feedback from you.

@@ -206,13 +206,13 @@ const Feedback = () => { - + Select Topic {loadingModal?( -
+
@@ -238,7 +238,9 @@ const Feedback = () => { ))} ):( -

No Progress from this class

+
+

No Progress from this class

+
) )} diff --git a/src/roles/teacher/feedback/views/StudentFeedback.jsx b/src/roles/teacher/feedback/views/StudentFeedback.jsx index a27ff8a..fa93171 100644 --- a/src/roles/teacher/feedback/views/StudentFeedback.jsx +++ b/src/roles/teacher/feedback/views/StudentFeedback.jsx @@ -1,9 +1,11 @@ import React from 'react'; -import { Table, Row, Col, Button, Form, Dropdown, DropdownButton, Breadcrumb, Spinner } from 'react-bootstrap'; +import { Table, Row, Col, Button, Form, Modal, Breadcrumb, Spinner } from 'react-bootstrap'; import { Link, useParams } from 'react-router-dom'; import useProgressStudent from '../hooks/useProgressStudent'; import TablePaginate from '../../../../components/ui/TablePaginate'; +import successIllustration from '../../../../assets/images/illustration/successModal.png' + const StudentFeedback = () => { const { progressId } = useParams(); const { @@ -23,7 +25,16 @@ const StudentFeedback = () => { handleLimitsChange, handleSearchChange, formatLocalDate, - downloadPDF + handleDownloadCSV, + + feedback, + setFeedback, + loadingFeedback, + successFeedback, + handleSubmitFeedback, + showFeedback, + handleShowFeedback, + handleCloseFeedback, } = useProgressStudent(progressId); return (
@@ -38,7 +49,10 @@ const StudentFeedback = () => {
- + @@ -133,6 +147,42 @@ const StudentFeedback = () => { + + + {successFeedback?( + +

Feedback sent!

+ +

Thank you for letting us know. We’ll investigate the issue and work on resolving it promptly.

+ +
+ ):( + <> + + Feedback + + +
+ + What insights or comments would you like to share with the student? + setFeedback(e.target.value)} + required + /> + + + +
+ + ) + } +
); };
NoNISNNISN Full Name Level ScoreFeedback Start Exercise Finish Exercise
+ @@ -88,18 +87,18 @@ const ClassFeedback = () => { progress.length > 0?( progress.map((data, index) => (
{index + 1}{data.NISN}{data.NISN} {data.NAME_USERS} {data.NAME_LEVEL} {data.SCORE}{data.FEEDBACK_STUDENT ?? '-'} {formatLocalDate(data.STUDENT_START)} {formatLocalDate(data.STUDENT_FINISH)}
+

Empty Data