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 (