Feat : reset scroll và check login

uat
Quy_FE 3 months ago
parent 20d1e5c553
commit 4c329ae25e
  1. 5
      src/_reducers/authentication/index.js
  2. 16
      src/_screens/criteria/criteria-manage/index.js
  3. 5
      src/_screens/criteria/criteria-setting/criteriaSetting.style.scss
  4. 38
      src/_screens/criteria/criteria-setting/index.js
  5. 2
      src/_screens/home/admin/adminHome.style.scss
  6. 16
      src/_screens/home/admin/index.js
  7. 2
      src/_screens/home/detail-grade/index.js
  8. 16
      src/_screens/home/headmaster/index.js
  9. 15
      src/_screens/home/teacher/index.js
  10. 10
      src/_screens/login/index.js

@ -6,7 +6,6 @@ const initialState = {
}; };
const authentication = (state = initialState, action) => { const authentication = (state = initialState, action) => {
if(action.payload?.user?.role !=="student"||action.payload?.user?.role !=="parent"){
switch (action.type) { switch (action.type) {
case TYPE_DISPATCH.LOGIN: case TYPE_DISPATCH.LOGIN:
return { return {
@ -19,10 +18,6 @@ const authentication = (state = initialState, action) => {
default: default:
return state; return state;
} }
}else{
alert('Bạn không có quyền truy cập');
return initialState;
}
}; };
export { authentication }; export { authentication };

@ -1,4 +1,4 @@
import { useEffect, useState } from "react"; import { useEffect, useRef, useState } from "react";
import Header from "../../../_components/Header"; import Header from "../../../_components/Header";
import { import {
renderIconSearchInput, renderIconSearchInput,
@ -40,6 +40,7 @@ export default function CriteriaManage() {
const [limitOnline] = useState(10); const [limitOnline] = useState(10);
const [offsetOnline, setOffsetOnline] = useState(0); const [offsetOnline, setOffsetOnline] = useState(0);
const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false); const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false);
const listRef = useRef(null);
const dispatch = useDispatch(); const dispatch = useDispatch();
const changeProvince = (item) => { const changeProvince = (item) => {
setProvinceSelect(item); setProvinceSelect(item);
@ -55,6 +56,15 @@ export default function CriteriaManage() {
setDistrictSelect(item); setDistrictSelect(item);
}; };
const scrollToTop = () => {
if (listRef.current) {
listRef.current.scrollTo({
top: 0,
behavior: 'smooth',
});
}
};
const handleSelectAll = () => { const handleSelectAll = () => {
if (listData?.every((item) => listIdSelected?.includes(item?.school_id))) { if (listData?.every((item) => listIdSelected?.includes(item?.school_id))) {
setListIdSelected((prev) => setListIdSelected((prev) =>
@ -141,6 +151,8 @@ export default function CriteriaManage() {
) { ) {
return; return;
} }
scrollToTop()
setOffsetOnline(0)
setLoadMoreOnline(true) setLoadMoreOnline(true)
setIsEndOnlineClasses(false) setIsEndOnlineClasses(false)
setIsFiltered(true); setIsFiltered(true);
@ -427,7 +439,7 @@ export default function CriteriaManage() {
onClick={handleSelectAll} onClick={handleSelectAll}
placement="right" placement="right"
/> />
<div onScroll={handleScroll} className="criteria-manage-list scrollbar-custom"> <div ref={listRef} onScroll={handleScroll} className="criteria-manage-list scrollbar-custom">
{listData?.map((item, index) => { {listData?.map((item, index) => {
return ( return (
<div className="criteria-manage-item"> <div className="criteria-manage-item">

@ -94,6 +94,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
gap: 32px; gap: 32px;
width: max-content;
.criteria-setting-item-detail-label { .criteria-setting-item-detail-label {
display: flex; display: flex;
@ -120,8 +121,8 @@
border-radius: 4px; border-radius: 4px;
padding: 0; padding: 0;
margin-right: 1px; margin-right: 1px;
height: 2.8rem; height: 2.4rem;
width: 60px; width: 40px;
font-size: 1.8rem; font-size: 1.8rem;
text-align: center; text-align: center;
color: var(--primary-color); color: var(--primary-color);

@ -160,13 +160,33 @@ export default function CriteriaSetting() {
return !isRead return !isRead
} }
const isSaveDisabled = () => { const isValid = () => {
if (criteriaTarget.assign.enable) {
if (!criteriaTarget.studentDone.enable) {
return ( return (
(criteriaTarget.assign.enable && !(criteriaTarget.assign.target1 &&
(!criteriaTarget.assign.target1 || !criteriaTarget.assign.target2)) || criteriaTarget.assign.target2 &&
(criteriaTarget.studentDone.enable && criteriaTarget.assign.target1 < criteriaTarget.assign.target2)
(!criteriaTarget.studentDone.target1 || !criteriaTarget.studentDone.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 }) => { const renderRightItem = ({ title, desc, valueName, unit, key, maxLengthInput }) => {
return ( return (
@ -206,8 +226,7 @@ export default function CriteriaSetting() {
const value = e.target.value; const value = e.target.value;
if (!/^[1-9]\d*$/.test(value) && value !== "") { if (!/^[1-9]\d*$/.test(value) && value !== "") {
return; return;
} }else if (!!maxLengthInput && e.target.value.length > maxLengthInput) {
if (!!maxLengthInput && value.length > maxLengthInput) {
return; return;
} }
setCriteriaTarget({ setCriteriaTarget({
@ -240,8 +259,7 @@ export default function CriteriaSetting() {
onChange={(e) => { onChange={(e) => {
if (!/^[1-9]\d*$/.test(e.target.value) && e.target.value !== "") { if (!/^[1-9]\d*$/.test(e.target.value) && e.target.value !== "") {
return; return;
} }else if (!!maxLengthInput && e.target.value.length > maxLengthInput) {
if (!!maxLengthInput && e.target.value.length > maxLengthInput) {
return; return;
} }
setCriteriaTarget({ setCriteriaTarget({
@ -322,7 +340,7 @@ export default function CriteriaSetting() {
Quay lại Quay lại
</PrimaryButton> </PrimaryButton>
{authentication?.user?.role === USER_ROLE.ADMIN && ( {authentication?.user?.role === USER_ROLE.ADMIN && (
<PrimaryButton onClick={saveCriteriaSetting} isDisabled={isSaveDisabled()}>Lưu</PrimaryButton> <PrimaryButton onClick={saveCriteriaSetting} isDisabled={isValid()}>Lưu</PrimaryButton>
)} )}
</div> </div>
</div> </div>

@ -7,7 +7,7 @@
overflow: auto; overflow: auto;
.admin-home-left-side { .admin-home-left-side {
width: 30%; min-width: 340px;
border-right: 1px solid #4d4d4d; border-right: 1px solid #4d4d4d;
.admin-home-form-select { .admin-home-form-select {

@ -9,7 +9,7 @@ import PrimaryButton from "../../../_components/Button/PrimaryButton";
import RateStar from "../../../_components/RateStar"; import RateStar from "../../../_components/RateStar";
import RootRadioGroup from "../../../_components/RootRadioGroup"; import RootRadioGroup from "../../../_components/RootRadioGroup";
import { LIST_TYPE_FILTER_ADMIN_HOME } from "../../../_constants/common"; 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 InputText from "../../../_components/Auth/InputText";
import { apiCaller, history } from "../../../_helpers"; import { apiCaller, history } from "../../../_helpers";
import { configConstants, PATH } from "../../../_constants"; import { configConstants, PATH } from "../../../_constants";
@ -42,6 +42,7 @@ export default function AdminHome() {
const [limitOnline] = useState(10); const [limitOnline] = useState(10);
const [offsetOnline, setOffsetOnline] = useState(0); const [offsetOnline, setOffsetOnline] = useState(0);
const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false); const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false);
const listRef = useRef(null);
const dispatch = useDispatch(); const dispatch = useDispatch();
const isFilterSchool = typeFilter === LIST_TYPE_FILTER_ADMIN_HOME[0]?.value; 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 () => { const getDataTeacher = async () => {
try { try {
setIsLoading(true); setIsLoading(true);
@ -186,6 +196,8 @@ export default function AdminHome() {
const handleSubmit = () => { const handleSubmit = () => {
if (isFilterSchool) { if (isFilterSchool) {
scrollToTop()
setOffsetOnline(0)
setLoadMoreOnline(true) setLoadMoreOnline(true)
setIsEndOnlineClasses(false) setIsEndOnlineClasses(false)
setIsSearched(true); setIsSearched(true);
@ -366,7 +378,7 @@ export default function AdminHome() {
</PrimaryButton> </PrimaryButton>
)} )}
</div> </div>
<div onScroll={handleScroll} className="admin-home-list-school admin-home-right-p-h scrollbar-custom"> <div ref={listRef} onScroll={handleScroll} className="admin-home-list-school admin-home-right-p-h scrollbar-custom">
{listSchool.map((item, index) => { {listSchool.map((item, index) => {
return ( return (
<div <div

@ -67,7 +67,9 @@ export default function DetailGrade() {
`${item?.student_done_per || 0}%`, `${item?.student_done_per || 0}%`,
item?.student_done_per_level || 0, item?.student_done_per_level || 0,
schoolName || '', schoolName || '',
//Huyện
"", "",
// Tỉnh
"", "",
!!month?.value !!month?.value
? month.value ? month.value

@ -1,4 +1,4 @@
import { useEffect, useState } from "react"; import { useEffect, useRef, useState } from "react";
import PrimaryButton from "../../../_components/Button/PrimaryButton"; import PrimaryButton from "../../../_components/Button/PrimaryButton";
import Header from "../../../_components/Header"; import Header from "../../../_components/Header";
import RateStar from "../../../_components/RateStar"; import RateStar from "../../../_components/RateStar";
@ -46,13 +46,25 @@ export default function HeadmasterHome() {
const [limitOnline] = useState(10); const [limitOnline] = useState(10);
const [offsetOnline, setOffsetOnline] = useState(0); const [offsetOnline, setOffsetOnline] = useState(0);
const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false); const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false);
const listRef = useRef(null);
const schoolName = !!schoolId const schoolName = !!schoolId
? !!school_name ? decodeURIComponent(school_name) : '' ? !!school_name ? decodeURIComponent(school_name) : ''
: `${authentication?.user?.organization_name}`; : `${authentication?.user?.organization_name}`;
const id = !!schoolId ? schoolId : authentication?.user?.organization_id; const id = !!schoolId ? schoolId : authentication?.user?.organization_id;
const scrollToTop = () => {
if (listRef.current) {
listRef.current.scrollTo({
top: 0,
behavior: 'smooth',
});
}
};
const changeSemester = (item) => { const changeSemester = (item) => {
scrollToTop()
setOffsetOnline(0)
setSemester(item); setSemester(item);
setMonth(getListMonthBySemester(item?.value)?.[0]); setMonth(getListMonthBySemester(item?.value)?.[0]);
}; };
@ -338,7 +350,7 @@ export default function HeadmasterHome() {
</div> </div>
</div> </div>
) : ( ) : (
<div onScroll={handleScroll} className="headmaster-home-list-teacher headmaster-home-right-p-h scrollbar-custom"> <div ref={listRef} onScroll={handleScroll} className="headmaster-home-list-teacher headmaster-home-right-p-h scrollbar-custom">
{!isLoading && !listTeacher?.length && ( {!isLoading && !listTeacher?.length && (
<p style={{fontSize: '1.8rem', fontWeight: 700}}> <p style={{fontSize: '1.8rem', fontWeight: 700}}>
Không giáo viên nào Không giáo viên nào

@ -15,7 +15,7 @@ import {
listAlphabet, listAlphabet,
PRIMARY_COLOR, PRIMARY_COLOR,
} from "../../../_constants/common"; } from "../../../_constants/common";
import { useEffect, useState } from "react"; import { useEffect, useState,useRef } from "react";
import { apiCaller, history } from "../../../_helpers"; import { apiCaller, history } from "../../../_helpers";
import { configConstants } from "../../../_constants"; import { configConstants } from "../../../_constants";
import { exportExcel } from "../../../_helpers/utils"; import { exportExcel } from "../../../_helpers/utils";
@ -41,12 +41,21 @@ export default function TeacherHome() {
const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false); const [isEndOnlineClasses, setIsEndOnlineClasses] = useState(false);
const [totalClass, setTotalClass] = useState(0) const [totalClass, setTotalClass] = useState(0)
const [totalAssign, settotalAssign] = useState(0) const [totalAssign, settotalAssign] = useState(0)
const listRef = useRef(null)
const teacherName = !!teacherId const teacherName = !!teacherId
? !!teacher_name ? decodeURIComponent(teacher_name) : '' ? !!teacher_name ? decodeURIComponent(teacher_name) : ''
: authentication?.user?.fullname; : authentication?.user?.fullname;
const id = !!teacherId ? teacherId : authentication?.user?.id; const id = !!teacherId ? teacherId : authentication?.user?.id;
const scrollToTop = () => {
if (listRef.current) {
listRef.current.scrollTo({
top: 0,
behavior: 'smooth',
});
}
};
const getData = async () => { const getData = async () => {
try { try {
setIsLoading(true); setIsLoading(true);
@ -88,6 +97,8 @@ export default function TeacherHome() {
}; };
const handleFilter = () => { const handleFilter = () => {
scrollToTop()
setOffsetOnline(0)
setLoadMoreOnline(true) setLoadMoreOnline(true)
setIsEndOnlineClasses(false) setIsEndOnlineClasses(false)
setListClass([]) setListClass([])
@ -270,7 +281,7 @@ export default function TeacherHome() {
<PrimaryButton onClick={handleExport}>Xuất excel</PrimaryButton> <PrimaryButton onClick={handleExport}>Xuất excel</PrimaryButton>
)} )}
</div> </div>
<div onScroll={handleScroll} className="teacher-home-list-class teacher-home-right-p-h scrollbar-custom"> <div ref={listRef} onScroll={handleScroll} className="teacher-home-list-class teacher-home-right-p-h scrollbar-custom">
{listClass?.map((item) => { {listClass?.map((item) => {
return ( return (
<div className="teacher-home-item-class" key={item?.class_id}> <div className="teacher-home-item-class" key={item?.class_id}>

@ -75,12 +75,20 @@ export default function Login() {
dataSubmit, dataSubmit,
); );
if (res?.status) { 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); handleLoginSuccess(res);
} }
} catch (err) { } catch (err) {
dispatch( dispatch(
alertActions.error({ alertActions.error({
message: err?.toString(), message: 'Bạn không có quyền truy cập',
}), }),
); );
} }

Loading…
Cancel
Save