From 4c0830abbf5159f42a1bb896268f6ef4f1d9a553 Mon Sep 17 00:00:00 2001 From: Quy_FE Date: Fri, 18 Apr 2025 09:53:38 +0700 Subject: [PATCH 1/9] =?UTF-8?q?Fix=20:=20l=E1=BB=97i=20ph=C3=A2n=20quy?= =?UTF-8?q?=E1=BB=81n,=20th=C3=AAm=20m=E1=BB=9Bi=20limit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 1 - src/_components/Header/index.js | 4 ++- src/_reducers/authentication/index.js | 2 +- src/_screens/home/headmaster/index.js | 50 +++++++++++++++++++++++++-- 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/App.js b/src/App.js index 0077d92..6e19634 100644 --- a/src/App.js +++ b/src/App.js @@ -44,7 +44,6 @@ function App() { dispatch(alertActions?.clear()); }); }, []); - // console.log("authen: ", authentication); return (
diff --git a/src/_components/Header/index.js b/src/_components/Header/index.js index cd2a912..9216f79 100644 --- a/src/_components/Header/index.js +++ b/src/_components/Header/index.js @@ -4,6 +4,8 @@ import { configConstants } from "../../_constants"; export default function Header({ icon, title, subtitles = [] }) { const authentication = useSelector((state) => state.authentication); + + const fullName = authentication?.user?.role==="organization_admin"?`Hiệu trưởng ${authentication?.user?.fullname}`:authentication?.user?.fullname return (
@@ -21,7 +23,7 @@ export default function Header({ icon, title, subtitles = [] }) {

-

{authentication?.user?.fullname}

+

{fullName}

{ - if(action.payload?.user?.role !=="student"){ + if(action.payload?.user?.role !=="student"||action.payload?.user?.role !=="parent"){ switch (action.type) { case TYPE_DISPATCH.LOGIN: return { diff --git a/src/_screens/home/headmaster/index.js b/src/_screens/home/headmaster/index.js index 058f321..81d8b84 100644 --- a/src/_screens/home/headmaster/index.js +++ b/src/_screens/home/headmaster/index.js @@ -42,10 +42,14 @@ export default function HeadmasterHome() { const [listTeacher, setListTeacher] = useState([]); const [isLoading, setIsLoading] = useState(false); const [criteriaSchool, setCriteriaSchool] = useState(); + const [isLoadMoreOnline, setLoadMoreOnline] = useState(true); + const [limitOnline] = useState(10); + const [offsetOnline, setOffsetOnline] = useState(0); + const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false); const schoolName = !!schoolId ? !!school_name ? decodeURIComponent(school_name) : '' - : `Hiệu trưởng ${authentication?.user?.organization_name}`; + : `${authentication?.user?.organization_name}`; const id = !!schoolId ? schoolId : authentication?.user?.organization_id; const changeSemester = (item) => { @@ -148,6 +152,48 @@ export default function HeadmasterHome() { } } + const handleScroll = (e) => { + if ( + e.target.scrollHeight - e.target.scrollTop < e.target.clientHeight + 5 && + isLoadMoreOnline && + !isLoading + ) { + onLoadMoreClasses(); + } + }; + + // Load More Classes for Teacher + const onLoadMoreClasses = async () => { + let offsetOnlineMore = offsetOnline + limitOnline; + let listNext = []; + setIsLoading(true); + try { + if (!isEndOnlineClasses) { + const endPoint = `/report/api_report/teacherByOrganizationId?organization_id=${id}&limit=${limitOnline}&offset=${offsetOnlineMore}`; + const res = await apiCaller(endPoint, "GET"); + + if (res?.status) { + listNext = res?.data; + setOffsetOnline(offsetOnline + limitOnline); + if (res?.data?.length < limitOnline) { + setLoadMoreOnline(false); + if (res?.data?.length == 0) setLoadMoreOnline(false); + setIsEndOnlineClasses(true); + } + } + } else { + setIsEndOnlineClasses(true); + } + + let listPrev = listTeacher; + setListTeacher(listPrev?.concat(listNext)); + } catch (e) { + } finally { + setIsLoading(false); + } + }; + + const getDataCriteriaSchool = async () => { try { setIsLoading(true); @@ -292,7 +338,7 @@ export default function HeadmasterHome() {
) : ( -
+
{!isLoading && !listTeacher?.length && (

Không có giáo viên nào From 20d1e5c55335a1d862a4c91358f6f8ef4ab4dac2 Mon Sep 17 00:00:00 2001 From: Quy_FE Date: Fri, 18 Apr 2025 11:10:43 +0700 Subject: [PATCH 2/9] =?UTF-8?q?Feat=20:=20Xu=E1=BA=A5t=20execl=20ds=20l?= =?UTF-8?q?=E1=BB=9Bp,=20fix=20l=E1=BB=97i=20l=E1=BB=8Dc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../criteria/criteria-manage/index.js | 2 ++ src/_screens/home/admin/index.js | 2 ++ src/_screens/home/teacher/index.js | 28 +++++++++++-------- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/_screens/criteria/criteria-manage/index.js b/src/_screens/criteria/criteria-manage/index.js index 8244f88..c87b870 100644 --- a/src/_screens/criteria/criteria-manage/index.js +++ b/src/_screens/criteria/criteria-manage/index.js @@ -141,6 +141,8 @@ export default function CriteriaManage() { ) { return; } + setLoadMoreOnline(true) + setIsEndOnlineClasses(false) setIsFiltered(true); getDataCriteria(true); }; diff --git a/src/_screens/home/admin/index.js b/src/_screens/home/admin/index.js index 61f5449..b36fb5a 100644 --- a/src/_screens/home/admin/index.js +++ b/src/_screens/home/admin/index.js @@ -186,6 +186,8 @@ export default function AdminHome() { const handleSubmit = () => { if (isFilterSchool) { + setLoadMoreOnline(true) + setIsEndOnlineClasses(false) setIsSearched(true); getData(); return; diff --git a/src/_screens/home/teacher/index.js b/src/_screens/home/teacher/index.js index a3ffe54..3163aa5 100644 --- a/src/_screens/home/teacher/index.js +++ b/src/_screens/home/teacher/index.js @@ -39,6 +39,8 @@ export default function TeacherHome() { const [limitOnline] = useState(10); const [offsetOnline, setOffsetOnline] = useState(0); const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false); + const [totalClass, setTotalClass] = useState(0) + const [totalAssign, settotalAssign] = useState(0) const teacherName = !!teacherId ? !!teacher_name ? decodeURIComponent(teacher_name) : '' @@ -60,6 +62,8 @@ export default function TeacherHome() { const res = await apiCaller(endPoint, "GET"); if (res?.status) { + setTotalClass(res?.total_class); + settotalAssign(res?.total_assign); setCriteria(res?.criteria_teacher); setListClass(res?.data); } @@ -84,6 +88,9 @@ export default function TeacherHome() { }; const handleFilter = () => { + setLoadMoreOnline(true) + setIsEndOnlineClasses(false) + setListClass([]) getData(); }; @@ -96,9 +103,9 @@ export default function TeacherHome() { "Tiêu chí giao bài", "Tỷ lệ học sinh làm bài", "Tiêu chí tỷ lệ học sinh làm bài", - // "Trường", - // "Huyện", - // "Tỉnh", + "Trường", + "Huyện", + "Tỉnh", "Tháng", "học kỳ", "Niên khóa", @@ -111,9 +118,9 @@ export default function TeacherHome() { item?.assign_number_level || 0, `${item?.student_done_per || 0}%`, item?.student_done_per_level || 0, - // "Trường", - // "Huyện", - // "Tỉnh", + item?.organization_name || '', + item?.organization_district ||'', + item?.organization_province ||'', !!month?.value ? month.value : getListMonthBySemester(semester.value) @@ -156,7 +163,6 @@ export default function TeacherHome() { try { if (!isEndOnlineClasses) { let queryParams = [] - if(!!semester?.value){ queryParams.push(`&semester=${semester?.value}`) } @@ -164,8 +170,8 @@ export default function TeacherHome() { queryParams.push(`month=${month?.value}`) } const endPoint = - `/api_exercise_report/teacher_report_summary?teacher_id=${id}&year=${schoolYear?.value}${queryParams.length ? `${queryParams.join("&")}` : ""} - &limit=${limitOnline}&offset=${offsetOnlineMore}`; + `/api_exercise_report/teacher_report_summary?teacher_id=${id}&year=${schoolYear?.value.trim()}&limit=${limitOnline}&offset=${offsetOnlineMore}` + + (queryParams.length > 0 ? `&${queryParams.join("&")}` : ""); const res = await apiCaller(endPoint, "GET"); if (res?.status) { concatListSide = res?.data; @@ -224,13 +230,13 @@ export default function TeacherHome() {

{"Tổng số lớp: "} - {listClass?.length} + {totalClass}
{"Tổng số lần giao: "} - {countAss(listClass)} + {totalAssign}
From 4c329ae25e050d8eeb59f1f0d86426894def61ab Mon Sep 17 00:00:00 2001 From: Quy_FE Date: Fri, 18 Apr 2025 15:11:53 +0700 Subject: [PATCH 3/9] =?UTF-8?q?Feat=20:=20reset=20scroll=20v=C3=A0=20check?= =?UTF-8?q?=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/_reducers/authentication/index.js | 5 --- .../criteria/criteria-manage/index.js | 16 ++++++- .../criteriaSetting.style.scss | 5 ++- .../criteria/criteria-setting/index.js | 42 +++++++++++++------ src/_screens/home/admin/adminHome.style.scss | 2 +- src/_screens/home/admin/index.js | 16 ++++++- src/_screens/home/detail-grade/index.js | 2 + src/_screens/home/headmaster/index.js | 16 ++++++- src/_screens/home/teacher/index.js | 15 ++++++- src/_screens/login/index.js | 10 ++++- 10 files changed, 100 insertions(+), 29 deletions(-) diff --git a/src/_reducers/authentication/index.js b/src/_reducers/authentication/index.js index c99ffed..f66ef61 100644 --- a/src/_reducers/authentication/index.js +++ b/src/_reducers/authentication/index.js @@ -6,7 +6,6 @@ const initialState = { }; const authentication = (state = initialState, action) => { - if(action.payload?.user?.role !=="student"||action.payload?.user?.role !=="parent"){ switch (action.type) { case TYPE_DISPATCH.LOGIN: return { @@ -19,10 +18,6 @@ const authentication = (state = initialState, action) => { default: return state; } - }else{ - alert('Bạn không có quyền truy cập'); - return initialState; - } }; export { authentication }; diff --git a/src/_screens/criteria/criteria-manage/index.js b/src/_screens/criteria/criteria-manage/index.js index c87b870..50594fc 100644 --- a/src/_screens/criteria/criteria-manage/index.js +++ b/src/_screens/criteria/criteria-manage/index.js @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import Header from "../../../_components/Header"; import { renderIconSearchInput, @@ -40,6 +40,7 @@ export default function CriteriaManage() { const [limitOnline] = useState(10); const [offsetOnline, setOffsetOnline] = useState(0); const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false); + const listRef = useRef(null); const dispatch = useDispatch(); const changeProvince = (item) => { setProvinceSelect(item); @@ -55,6 +56,15 @@ export default function CriteriaManage() { setDistrictSelect(item); }; + const scrollToTop = () => { + if (listRef.current) { + listRef.current.scrollTo({ + top: 0, + behavior: 'smooth', + }); + } + }; + const handleSelectAll = () => { if (listData?.every((item) => listIdSelected?.includes(item?.school_id))) { setListIdSelected((prev) => @@ -141,6 +151,8 @@ export default function CriteriaManage() { ) { return; } + scrollToTop() + setOffsetOnline(0) setLoadMoreOnline(true) setIsEndOnlineClasses(false) setIsFiltered(true); @@ -427,7 +439,7 @@ export default function CriteriaManage() { onClick={handleSelectAll} placement="right" /> -
+
{listData?.map((item, index) => { return (
diff --git a/src/_screens/criteria/criteria-setting/criteriaSetting.style.scss b/src/_screens/criteria/criteria-setting/criteriaSetting.style.scss index 71a5f57..cc5cb9f 100644 --- a/src/_screens/criteria/criteria-setting/criteriaSetting.style.scss +++ b/src/_screens/criteria/criteria-setting/criteriaSetting.style.scss @@ -94,6 +94,7 @@ display: flex; align-items: center; gap: 32px; + width: max-content; .criteria-setting-item-detail-label { display: flex; @@ -120,8 +121,8 @@ border-radius: 4px; padding: 0; margin-right: 1px; - height: 2.8rem; - width: 60px; + height: 2.4rem; + width: 40px; font-size: 1.8rem; text-align: center; color: var(--primary-color); diff --git a/src/_screens/criteria/criteria-setting/index.js b/src/_screens/criteria/criteria-setting/index.js index ba85337..f063b49 100644 --- a/src/_screens/criteria/criteria-setting/index.js +++ b/src/_screens/criteria/criteria-setting/index.js @@ -160,13 +160,33 @@ export default function CriteriaSetting() { return !isRead } - const isSaveDisabled = () => { - return ( - (criteriaTarget.assign.enable && - (!criteriaTarget.assign.target1 || !criteriaTarget.assign.target2)) || - (criteriaTarget.studentDone.enable && - (!criteriaTarget.studentDone.target1 || !criteriaTarget.studentDone.target2)) - ); + const isValid = () => { + if (criteriaTarget.assign.enable) { + if (!criteriaTarget.studentDone.enable) { + return ( + !(criteriaTarget.assign.target1 && + criteriaTarget.assign.target2 && + criteriaTarget.assign.target1 < criteriaTarget.assign.target2) + ); + } else { + return ( + !(criteriaTarget.assign.target1 && + criteriaTarget.assign.target2 && + criteriaTarget.assign.target1 < criteriaTarget.assign.target2 && + criteriaTarget.studentDone.target1 != null && + criteriaTarget.studentDone.target2 != null && + criteriaTarget.studentDone.target1 < criteriaTarget.studentDone.target2) + ); + } + } else if (criteriaTarget.studentDone.enable) { + return ( + !(criteriaTarget.studentDone.target1 != null && + criteriaTarget.studentDone.target2 != null && + criteriaTarget.studentDone.target1 < criteriaTarget.studentDone.target2) + ); + } else { + return true; + } }; const renderRightItem = ({ title, desc, valueName, unit, key, maxLengthInput }) => { return ( @@ -206,8 +226,7 @@ export default function CriteriaSetting() { const value = e.target.value; if (!/^[1-9]\d*$/.test(value) && value !== "") { return; - } - if (!!maxLengthInput && value.length > maxLengthInput) { + }else if (!!maxLengthInput && e.target.value.length > maxLengthInput) { return; } setCriteriaTarget({ @@ -240,8 +259,7 @@ export default function CriteriaSetting() { onChange={(e) => { if (!/^[1-9]\d*$/.test(e.target.value) && e.target.value !== "") { return; - } - if (!!maxLengthInput && e.target.value.length > maxLengthInput) { + }else if (!!maxLengthInput && e.target.value.length > maxLengthInput) { return; } setCriteriaTarget({ @@ -322,7 +340,7 @@ export default function CriteriaSetting() { Quay lại {authentication?.user?.role === USER_ROLE.ADMIN && ( - Lưu + Lưu )}
diff --git a/src/_screens/home/admin/adminHome.style.scss b/src/_screens/home/admin/adminHome.style.scss index 218abf9..5d62491 100644 --- a/src/_screens/home/admin/adminHome.style.scss +++ b/src/_screens/home/admin/adminHome.style.scss @@ -7,7 +7,7 @@ overflow: auto; .admin-home-left-side { - width: 30%; + min-width: 340px; border-right: 1px solid #4d4d4d; .admin-home-form-select { diff --git a/src/_screens/home/admin/index.js b/src/_screens/home/admin/index.js index b36fb5a..2d3f71d 100644 --- a/src/_screens/home/admin/index.js +++ b/src/_screens/home/admin/index.js @@ -9,7 +9,7 @@ import PrimaryButton from "../../../_components/Button/PrimaryButton"; import RateStar from "../../../_components/RateStar"; import RootRadioGroup from "../../../_components/RootRadioGroup"; import { LIST_TYPE_FILTER_ADMIN_HOME } from "../../../_constants/common"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import InputText from "../../../_components/Auth/InputText"; import { apiCaller, history } from "../../../_helpers"; import { configConstants, PATH } from "../../../_constants"; @@ -42,6 +42,7 @@ export default function AdminHome() { const [limitOnline] = useState(10); const [offsetOnline, setOffsetOnline] = useState(0); const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false); + const listRef = useRef(null); const dispatch = useDispatch(); const isFilterSchool = typeFilter === LIST_TYPE_FILTER_ADMIN_HOME[0]?.value; @@ -77,6 +78,15 @@ export default function AdminHome() { } }; + const scrollToTop = () => { + if (listRef.current) { + listRef.current.scrollTo({ + top: 0, + behavior: 'smooth', + }); + } + }; + const getDataTeacher = async () => { try { setIsLoading(true); @@ -186,6 +196,8 @@ export default function AdminHome() { const handleSubmit = () => { if (isFilterSchool) { + scrollToTop() + setOffsetOnline(0) setLoadMoreOnline(true) setIsEndOnlineClasses(false) setIsSearched(true); @@ -366,7 +378,7 @@ export default function AdminHome() { )}
-
+
{listSchool.map((item, index) => { return (
{ + if (listRef.current) { + listRef.current.scrollTo({ + top: 0, + behavior: 'smooth', + }); + } + }; + const changeSemester = (item) => { + scrollToTop() + setOffsetOnline(0) setSemester(item); setMonth(getListMonthBySemester(item?.value)?.[0]); }; @@ -338,7 +350,7 @@ export default function HeadmasterHome() {
) : ( -
+
{!isLoading && !listTeacher?.length && (

Không có giáo viên nào diff --git a/src/_screens/home/teacher/index.js b/src/_screens/home/teacher/index.js index 3163aa5..8853394 100644 --- a/src/_screens/home/teacher/index.js +++ b/src/_screens/home/teacher/index.js @@ -15,7 +15,7 @@ import { listAlphabet, PRIMARY_COLOR, } from "../../../_constants/common"; -import { useEffect, useState } from "react"; +import { useEffect, useState,useRef } from "react"; import { apiCaller, history } from "../../../_helpers"; import { configConstants } from "../../../_constants"; import { exportExcel } from "../../../_helpers/utils"; @@ -41,12 +41,21 @@ export default function TeacherHome() { const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false); const [totalClass, setTotalClass] = useState(0) const [totalAssign, settotalAssign] = useState(0) + const listRef = useRef(null) const teacherName = !!teacherId ? !!teacher_name ? decodeURIComponent(teacher_name) : '' : authentication?.user?.fullname; const id = !!teacherId ? teacherId : authentication?.user?.id; + const scrollToTop = () => { + if (listRef.current) { + listRef.current.scrollTo({ + top: 0, + behavior: 'smooth', + }); + } + }; const getData = async () => { try { setIsLoading(true); @@ -88,6 +97,8 @@ export default function TeacherHome() { }; const handleFilter = () => { + scrollToTop() + setOffsetOnline(0) setLoadMoreOnline(true) setIsEndOnlineClasses(false) setListClass([]) @@ -270,7 +281,7 @@ export default function TeacherHome() { Xuất excel )}

-
+
{listClass?.map((item) => { return (
diff --git a/src/_screens/login/index.js b/src/_screens/login/index.js index d1ba479..ddb214a 100644 --- a/src/_screens/login/index.js +++ b/src/_screens/login/index.js @@ -75,12 +75,20 @@ export default function Login() { dataSubmit, ); if (res?.status) { + if(res.data_user.role === "student"||res.data_user.role === "parent"){ + dispatch({ + type: TYPE_DISPATCH.RESET_AUTHENTICATION, + }); + persistor.purge(); + window.location.href = PATH.login; + return false + } handleLoginSuccess(res); } } catch (err) { dispatch( alertActions.error({ - message: err?.toString(), + message: 'Bạn không có quyền truy cập', }), ); } From 48c61436100db7d1a50201dc606758ca80d7b727 Mon Sep 17 00:00:00 2001 From: Quy_FE Date: Fri, 18 Apr 2025 16:18:39 +0700 Subject: [PATCH 4/9] =?UTF-8?q?fix=20:=20s=E1=BB=ADa=20l=E1=BB=97i=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/_screens/login/index.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/_screens/login/index.js b/src/_screens/login/index.js index ddb214a..6b01fcc 100644 --- a/src/_screens/login/index.js +++ b/src/_screens/login/index.js @@ -79,16 +79,21 @@ export default function Login() { dispatch({ type: TYPE_DISPATCH.RESET_AUTHENTICATION, }); - persistor.purge(); - window.location.href = PATH.login; - return false + dispatch( + alertActions.error({ + message: 'Bạn không có quyền truy cập', + }), + ); + return false + // persistor.purge(); + // window.location.href = PATH.login; } handleLoginSuccess(res); } } catch (err) { dispatch( alertActions.error({ - message: 'Bạn không có quyền truy cập', + message: err.toString() }), ); } From b888e82d8834481338605c015331ae9fad27be0e Mon Sep 17 00:00:00 2001 From: Quy_FE Date: Fri, 18 Apr 2025 17:14:49 +0700 Subject: [PATCH 5/9] =?UTF-8?q?Feat=20:=20thay=20=C4=91=E1=BB=95i=20v?= =?UTF-8?q?=E1=BB=8B=20tr=C3=AD=20endpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/_components/Header/index.js | 2 +- src/_screens/criteria/criteria-manage/index.js | 6 +++--- src/_screens/home/admin/index.js | 7 ++++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/_components/Header/index.js b/src/_components/Header/index.js index 9216f79..663dafe 100644 --- a/src/_components/Header/index.js +++ b/src/_components/Header/index.js @@ -5,7 +5,7 @@ import { configConstants } from "../../_constants"; export default function Header({ icon, title, subtitles = [] }) { const authentication = useSelector((state) => state.authentication); - const fullName = authentication?.user?.role==="organization_admin"?`Hiệu trưởng ${authentication?.user?.fullname}`:authentication?.user?.fullname + const fullName = authentication?.user?.role==="organization_admin"?`Hiệu trưởng ${authentication?.user?.organization_name}`:authentication?.user?.fullname return (
diff --git a/src/_screens/criteria/criteria-manage/index.js b/src/_screens/criteria/criteria-manage/index.js index 50594fc..fe2c19c 100644 --- a/src/_screens/criteria/criteria-manage/index.js +++ b/src/_screens/criteria/criteria-manage/index.js @@ -334,9 +334,9 @@ export default function CriteriaManage() { } addParam('school_name', searchText); - const endPoint = `/report/api_report/getOrganizationAndCriteria${ - queryParams.length ? `?${queryParams.join("&")}` : "" - }&limit=${limitOnline}&offset=${offsetOnlineMore}`; + const endPoint = `/report/api_report/getOrganizationAndCriteria?limit=${limitOnline}&offset=${offsetOnlineMore}${ + queryParams.length ? `&${queryParams.join("&")}` : "" + }`; const res = await apiCaller(endPoint, "GET"); if (res?.status) { diff --git a/src/_screens/home/admin/index.js b/src/_screens/home/admin/index.js index 2d3f71d..78f16c1 100644 --- a/src/_screens/home/admin/index.js +++ b/src/_screens/home/admin/index.js @@ -283,9 +283,10 @@ export default function AdminHome() { if(!!searchTextSchool){ queryParams.push(`name_school_find=${searchTextSchool}`) } - const endPoint = `/api_organization/get_organization${ - queryParams.length ? `?${queryParams.join("&")}` : "" - }&limit=${limitOnline}&offset=${offsetOnlineMore}`; + const endPoint = `/api_organization/get_organization?limit=${limitOnline}&offset=${offsetOnlineMore} + ${ + queryParams.length ? `&${queryParams.join("&")}` : "" + }`; const res = await apiCaller(endPoint, "GET"); if (res?.status) { From a4d4169148dca60379aa76fc71bb8e60df56b780 Mon Sep 17 00:00:00 2001 From: Quy_FE Date: Mon, 21 Apr 2025 09:20:46 +0700 Subject: [PATCH 6/9] =?UTF-8?q?feat=20:=20scroll=20danh=20s=C3=A1ch=20kh?= =?UTF-8?q?=E1=BB=91i?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/_components/Header/index.js | 6 +- .../home/detail-grade/detailGrade.style.scss | 2 +- src/_screens/home/detail-grade/index.js | 92 ++++++++++++++++--- src/_screens/home/headmaster/index.js | 14 +-- 4 files changed, 93 insertions(+), 21 deletions(-) diff --git a/src/_components/Header/index.js b/src/_components/Header/index.js index 663dafe..43db49e 100644 --- a/src/_components/Header/index.js +++ b/src/_components/Header/index.js @@ -4,8 +4,10 @@ import { configConstants } from "../../_constants"; export default function Header({ icon, title, subtitles = [] }) { const authentication = useSelector((state) => state.authentication); - - const fullName = authentication?.user?.role==="organization_admin"?`Hiệu trưởng ${authentication?.user?.organization_name}`:authentication?.user?.fullname + const { fullname, organization_name, role } = authentication?.user || {}; + const hasFullName = fullname || organization_name; + + const fullName = role === "organization_admin" ? `Hiệu trưởng ${hasFullName}` : fullname; return (
diff --git a/src/_screens/home/detail-grade/detailGrade.style.scss b/src/_screens/home/detail-grade/detailGrade.style.scss index 428fac2..fa02897 100644 --- a/src/_screens/home/detail-grade/detailGrade.style.scss +++ b/src/_screens/home/detail-grade/detailGrade.style.scss @@ -34,7 +34,7 @@ .arrow-button{ display: flex; justify-content: space-between; - width: 70%; + width: 100%; } .detail-grade-list-class { diff --git a/src/_screens/home/detail-grade/index.js b/src/_screens/home/detail-grade/index.js index bbfa69b..f3e8a2d 100644 --- a/src/_screens/home/detail-grade/index.js +++ b/src/_screens/home/detail-grade/index.js @@ -7,7 +7,7 @@ import { renderIconHome } from "../../../_components/renderIcon"; import { apiCaller, history } from "../../../_helpers"; import { useParams } from "react-router-dom"; import { useSelector } from "react-redux"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { defaultMonthYearSemester, getListMonthBySemester, LIST_SCHOOL_YEAR, LIST_SEMESTER } from "../../../_constants/common"; import { configConstants } from "../../../_constants"; import { exportExcel } from "../../../_helpers/utils"; @@ -29,6 +29,11 @@ export default function DetailGrade() { const [month, setMonth] = useState(grade?.filterGrade?.month); const [listClass, setListClass] = useState([]); const [isLoading, setIsLoading] = useState(false); + const [isLoadMoreOnline, setLoadMoreOnline] = useState(true); + const [limitOnline] = useState(10); + const [offsetOnline, setOffsetOnline] = useState(0); + const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false); + const listRef = useRef(null); const schoolName = !!school_name ? decodeURIComponent(school_name) : ''; const gradeName = !!grade_name ? decodeURIComponent(grade_name) : ''; @@ -37,8 +42,21 @@ export default function DetailGrade() { setSemester(item); setMonth(getListMonthBySemester(item?.value)?.[0]); }; + const scrollToTop = () => { + if (listRef.current) { + listRef.current.scrollTo({ + top: 0, + behavior: 'smooth', + }); + } + }; const handleFilter = () => { + setOffsetOnline(0) + setLoadMoreOnline(true) + setIsEndOnlineClasses(false) + setIsFiltered(true); + scrollToTop() getData(); }; @@ -66,11 +84,9 @@ export default function DetailGrade() { item?.assign_number_level || 0, `${item?.student_done_per || 0}%`, item?.student_done_per_level || 0, - schoolName || '', - //Huyện - "", - // Tỉnh - "", + item?.organization_name || '', + item?.organization_district ||'', + item?.organization_province ||'', !!month?.value ? month.value : getListMonthBySemester(semester.value) @@ -120,6 +136,60 @@ export default function DetailGrade() { getData(); }, []) + + const handleScroll = (e) => { + if ( + e.target.scrollHeight - e.target.scrollTop < e.target.clientHeight + 5 && + isLoadMoreOnline && + !isLoading + ) { + onLoadMoreClasses(); + } + }; + + // Load More Classes for Teacher + const onLoadMoreClasses = async () => { + let offsetOnlineMore = offsetOnline + limitOnline; + let listNext = []; + setIsLoading(true); + try { + if (!isEndOnlineClasses) { + const endPoint = `/report/api_report/getListClassInGradeOrganization?school_id=${ + schoolId + }&grade_id=${ + gradeId + }${ + !!schoolYear?.value ? `&year=${schoolYear?.value}` : "" + }${ + !!semester?.value ? `&semester=${semester?.value}` : "" + }${ + !!month?.value ? `&month=${month?.value}` : "" + }&limit=${limitOnline}&offset=${offsetOnlineMore}`; + const res = await apiCaller(endPoint, "GET"); + console.log('res',res); + + if (res?.status) { + listNext = res?.data; + setOffsetOnline(offsetOnline + limitOnline); + if (res?.data?.length < limitOnline) { + setLoadMoreOnline(false); + if (res?.data?.length == 0) setLoadMoreOnline(false); + setIsEndOnlineClasses(true); + } + } + } else { + setIsEndOnlineClasses(true); + } + + let listPrev = listClass; + setListClass(listPrev?.concat(listNext)); + } catch (e) { + } finally { + setIsLoading(false); + } + }; + + return (
- {/*
- {}}>{'<'} - {}}>{'>'} -
*/}
{!!listClass?.length && Xuất excel}
-
+
{!isLoading && !listClass?.length && (

Không có lớp nào @@ -210,6 +276,10 @@ export default function DetailGrade() { ); })}

+ {/*
+ {}}>{'<'} + {}}>{'>'} +
*/}
diff --git a/src/_screens/home/headmaster/index.js b/src/_screens/home/headmaster/index.js index 2b0f9de..cba9273 100644 --- a/src/_screens/home/headmaster/index.js +++ b/src/_screens/home/headmaster/index.js @@ -63,8 +63,11 @@ export default function HeadmasterHome() { }; const changeSemester = (item) => { - scrollToTop() setOffsetOnline(0) + setLoadMoreOnline(true) + setIsEndOnlineClasses(false) + setIsFiltered(true); + scrollToTop() setSemester(item); setMonth(getListMonthBySemester(item?.value)?.[0]); }; @@ -89,12 +92,9 @@ export default function HeadmasterHome() { item?.criteria_teacher?.assign_number_level || 0, item?.criteria_teacher?.student_done_per_level || 0, item?.criteria_teacher?.criteria_level || 0, - //trường - "", - // Huyện - "", - // Tỉnh - "", + item?.organization_name || '', + item?.organization_district ||'', + item?.organization_province ||'', !!month?.value ? month.value : getListMonthBySemester(semester.value) From daff2332c2d61ea5420a781eb1ea4c67e2b6f3f2 Mon Sep 17 00:00:00 2001 From: Quy_FE Date: Mon, 21 Apr 2025 11:32:49 +0700 Subject: [PATCH 7/9] feat : export execl --- src/_screens/home/detail-grade/index.js | 9 +++++---- src/_screens/home/headmaster/index.js | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/_screens/home/detail-grade/index.js b/src/_screens/home/detail-grade/index.js index f3e8a2d..aac1753 100644 --- a/src/_screens/home/detail-grade/index.js +++ b/src/_screens/home/detail-grade/index.js @@ -85,8 +85,8 @@ export default function DetailGrade() { `${item?.student_done_per || 0}%`, item?.student_done_per_level || 0, item?.organization_name || '', - item?.organization_district ||'', - item?.organization_province ||'', + item?.district ||'', + item?.province ||'', !!month?.value ? month.value : getListMonthBySemester(semester.value) @@ -167,8 +167,9 @@ export default function DetailGrade() { }&limit=${limitOnline}&offset=${offsetOnlineMore}`; const res = await apiCaller(endPoint, "GET"); console.log('res',res); - - if (res?.status) { + if(res){ + setIsEndOnlineClasses(true); + }else if (res?.status) { listNext = res?.data; setOffsetOnline(offsetOnline + limitOnline); if (res?.data?.length < limitOnline) { diff --git a/src/_screens/home/headmaster/index.js b/src/_screens/home/headmaster/index.js index cba9273..7204803 100644 --- a/src/_screens/home/headmaster/index.js +++ b/src/_screens/home/headmaster/index.js @@ -93,8 +93,8 @@ export default function HeadmasterHome() { item?.criteria_teacher?.student_done_per_level || 0, item?.criteria_teacher?.criteria_level || 0, item?.organization_name || '', - item?.organization_district ||'', - item?.organization_province ||'', + item?.district ||'', + item?.province ||'', !!month?.value ? month.value : getListMonthBySemester(semester.value) From 87b55b0e0175e820f8536ba3f24c858d7a696a83 Mon Sep 17 00:00:00 2001 From: Quy_FE Date: Mon, 21 Apr 2025 13:23:18 +0700 Subject: [PATCH 8/9] =?UTF-8?q?feat=20:=20l=E1=BB=97i=20m=C3=A0n=20h=C3=AC?= =?UTF-8?q?nh=20tr=E1=BA=AFng?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/App.js b/src/App.js index 6e19634..154a90e 100644 --- a/src/App.js +++ b/src/App.js @@ -22,6 +22,7 @@ import DetailRoomEducation from "./_screens/home/detail-room-education"; import EducationDepartmentHome from "./_screens/home/education-department"; import { Alert } from "./_components/Alert"; import OutstandingTeacher from "./_screens/home/outstanding-teacher"; +import { TYPE_DISPATCH } from "./_constants/common"; function App() { const dispatch = useDispatch(); @@ -44,6 +45,14 @@ function App() { dispatch(alertActions?.clear()); }); }, []); + + useEffect(() => { + if(authentication?.user?.role === "student"||authentication?.user?.role === "parent") + dispatch({ + type: TYPE_DISPATCH.RESET_AUTHENTICATION, + }); + }, []) + return (
From 62fac2ec8a40e0480f8f7693ab59fb45adabb0d9 Mon Sep 17 00:00:00 2001 From: Quy_FE Date: Wed, 23 Apr 2025 08:45:17 +0700 Subject: [PATCH 9/9] =?UTF-8?q?Feat=20:=20t=E1=BB=91i=20=C6=B0u=20handleSc?= =?UTF-8?q?roll?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/_screens/criteria/criteria-manage/index.js | 4 +++- src/_screens/home/admin/index.js | 5 +++-- src/_screens/home/detail-grade/index.js | 4 ++-- src/_screens/home/headmaster/index.js | 4 +++- src/_screens/home/teacher/index.js | 4 +++- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/_screens/criteria/criteria-manage/index.js b/src/_screens/criteria/criteria-manage/index.js index fe2c19c..fc1c69c 100644 --- a/src/_screens/criteria/criteria-manage/index.js +++ b/src/_screens/criteria/criteria-manage/index.js @@ -339,7 +339,9 @@ export default function CriteriaManage() { }`; const res = await apiCaller(endPoint, "GET"); - if (res?.status) { + if (!res){ + setIsEndOnlineClasses(true); + } else { listNext = res?.data; setOffsetOnline(offsetOnline + limitOnline); if (res?.data?.length < limitOnline) { diff --git a/src/_screens/home/admin/index.js b/src/_screens/home/admin/index.js index 78f16c1..bf5c74e 100644 --- a/src/_screens/home/admin/index.js +++ b/src/_screens/home/admin/index.js @@ -288,8 +288,9 @@ export default function AdminHome() { queryParams.length ? `&${queryParams.join("&")}` : "" }`; const res = await apiCaller(endPoint, "GET"); - - if (res?.status) { + if(!res){ + setIsEndOnlineClasses(true); + } else { concatListSide = res?.data; setOffsetOnline(offsetOnline + limitOnline); if (res?.data?.length < limitOnline) { diff --git a/src/_screens/home/detail-grade/index.js b/src/_screens/home/detail-grade/index.js index aac1753..fbe0a0d 100644 --- a/src/_screens/home/detail-grade/index.js +++ b/src/_screens/home/detail-grade/index.js @@ -167,9 +167,9 @@ export default function DetailGrade() { }&limit=${limitOnline}&offset=${offsetOnlineMore}`; const res = await apiCaller(endPoint, "GET"); console.log('res',res); - if(res){ + if(!res){ setIsEndOnlineClasses(true); - }else if (res?.status) { + } else { listNext = res?.data; setOffsetOnline(offsetOnline + limitOnline); if (res?.data?.length < limitOnline) { diff --git a/src/_screens/home/headmaster/index.js b/src/_screens/home/headmaster/index.js index 7204803..5188c80 100644 --- a/src/_screens/home/headmaster/index.js +++ b/src/_screens/home/headmaster/index.js @@ -184,7 +184,9 @@ export default function HeadmasterHome() { const endPoint = `/report/api_report/teacherByOrganizationId?organization_id=${id}&limit=${limitOnline}&offset=${offsetOnlineMore}`; const res = await apiCaller(endPoint, "GET"); - if (res?.status) { + if (!res){ + setIsEndOnlineClasses(true); + } else { listNext = res?.data; setOffsetOnline(offsetOnline + limitOnline); if (res?.data?.length < limitOnline) { diff --git a/src/_screens/home/teacher/index.js b/src/_screens/home/teacher/index.js index 8853394..1306247 100644 --- a/src/_screens/home/teacher/index.js +++ b/src/_screens/home/teacher/index.js @@ -184,7 +184,9 @@ export default function TeacherHome() { `/api_exercise_report/teacher_report_summary?teacher_id=${id}&year=${schoolYear?.value.trim()}&limit=${limitOnline}&offset=${offsetOnlineMore}` + (queryParams.length > 0 ? `&${queryParams.join("&")}` : ""); const res = await apiCaller(endPoint, "GET"); - if (res?.status) { + if (!res){ + setIsEndOnlineClasses(true); + } else { concatListSide = res?.data; setOffsetOnline(offsetOnline + limitOnline); if (res?.data?.length < limitOnline) {