import * as icon from '@mdi/js'; import Head from 'next/head' import React from 'react' import axios from 'axios'; import type { ReactElement } from 'react' import LayoutAuthenticated from '../layouts/Authenticated' import SectionMain from '../components/SectionMain' import SectionTitleLineWithButton from '../components/SectionTitleLineWithButton' import BaseIcon from "../components/BaseIcon"; import { getPageTitle } from '../config' import Link from "next/link"; import { hasPermission } from "../helpers/userPermissions"; import { fetchWidgets } from '../stores/roles/rolesSlice'; import { WidgetCreator } from '../components/WidgetCreator/WidgetCreator'; import { SmartWidget } from '../components/SmartWidget/SmartWidget'; import { useAppDispatch, useAppSelector } from '../stores/hooks'; import { useTranslation } from 'react-i18next'; const Dashboard = () => { const dispatch = useAppDispatch(); const { t } = useTranslation('common'); const [isTranslationMounted, setIsTranslationMounted] = React.useState(false); const translate = (key: string, fallback: string): string => ( isTranslationMounted ? String(t(key, { defaultValue: fallback })) : fallback ); const iconsColor = useAppSelector((state) => state.style.iconsColor); const corners = useAppSelector((state) => state.style.corners); const cardsStyle = useAppSelector((state) => state.style.cardsStyle); const loadingMessage = translate('pages.dashboard.loading', 'Loading...'); const [users, setUsers] = React.useState(loadingMessage); const [roles, setRoles] = React.useState(loadingMessage); const [permissions, setPermissions] = React.useState(loadingMessage); const [schools, setSchools] = React.useState(loadingMessage); const [students, setStudents] = React.useState(loadingMessage); const [guardians, setGuardians] = React.useState(loadingMessage); const [student_guardians, setStudent_guardians] = React.useState(loadingMessage); const [teachers, setTeachers] = React.useState(loadingMessage); const [courses, setCourses] = React.useState(loadingMessage); const [grades, setGrades] = React.useState(loadingMessage); const [classes, setClasses] = React.useState(loadingMessage); const [subjects, setSubjects] = React.useState(loadingMessage); const [enrollments, setEnrollments] = React.useState(loadingMessage); const [assessments, setAssessments] = React.useState(loadingMessage); const [attendance, setAttendance] = React.useState(loadingMessage); const [invoices, setInvoices] = React.useState(loadingMessage); const [payments, setPayments] = React.useState(loadingMessage); const [employees, setEmployees] = React.useState(loadingMessage); const [products, setProducts] = React.useState(loadingMessage); const [books, setBooks] = React.useState(loadingMessage); const [book_loans, setBook_loans] = React.useState(loadingMessage); const [widgetsRole, setWidgetsRole] = React.useState({ role: { value: '', label: '' }, }); const { currentUser } = useAppSelector((state) => state.auth); const { isFetchingQuery } = useAppSelector((state) => state.openAi); const { rolesWidgets, loading } = useAppSelector((state) => state.roles); const organizationId = currentUser?.schools?.id; async function loadData() { const entities = ['users','roles','permissions','schools','students','guardians','student_guardians','teachers','courses','grades','classes','subjects','enrollments','assessments','attendance','invoices','payments','employees','products','books','book_loans',]; const fns = [setUsers,setRoles,setPermissions,setSchools,setStudents,setGuardians,setStudent_guardians,setTeachers,setCourses,setGrades,setClasses,setSubjects,setEnrollments,setAssessments,setAttendance,setInvoices,setPayments,setEmployees,setProducts,setBooks,setBook_loans,]; const requests = entities.map((entity, index) => { if(hasPermission(currentUser, `READ_${entity.toUpperCase()}`)) { return axios.get(`/${entity.toLowerCase()}/count`); } else { fns[index](null); return Promise.resolve({data: {count: null}}); } }); Promise.allSettled(requests).then((results) => { results.forEach((result, i) => { if (result.status === 'fulfilled') { fns[i](result.value.data.count); } else { fns[i](result.reason.message); } }); }); } async function getWidgets(roleId) { await dispatch(fetchWidgets(roleId)); } React.useEffect(() => { setIsTranslationMounted(true); }, []); React.useEffect(() => { if (!currentUser) return; loadData().then(); setWidgetsRole({ role: { value: currentUser?.app_role?.id, label: currentUser?.app_role?.name } }); }, [currentUser]); React.useEffect(() => { if (!currentUser || !widgetsRole?.role?.value) return; getWidgets(widgetsRole?.role?.value || '').then(); }, [widgetsRole?.role?.value]); return ( <> {getPageTitle(translate('pages.dashboard.overview', 'Overview'))} {''} {hasPermission(currentUser, 'CREATE_ROLES') && } {!!rolesWidgets.length && hasPermission(currentUser, 'CREATE_ROLES') && (

{translate('pages.dashboard.roleWidgets', '{{role}}\'s widgets').replace('{{role}}', widgetsRole?.role?.label || translate('entities.users', 'Users'))}

)}
{(isFetchingQuery || loading) && (
{' '} {translate('pages.dashboard.loadingWidgets', 'Loading widgets...')}
)} { rolesWidgets && rolesWidgets.map((widget) => ( ))}
{!!rolesWidgets.length &&
}
{hasPermission(currentUser, 'READ_USERS') &&
{translate('entities.users', 'Users')}
{users}
} {hasPermission(currentUser, 'READ_ROLES') &&
{translate('entities.roles', 'Roles')}
{roles}
} {hasPermission(currentUser, 'READ_PERMISSIONS') &&
{translate('entities.permissions', 'Permissions')}
{permissions}
} {hasPermission(currentUser, 'READ_SCHOOLS') &&
{translate('entities.schools', 'Schools')}
{schools}
} {hasPermission(currentUser, 'READ_STUDENTS') &&
{translate('entities.students', 'Students')}
{students}
} {hasPermission(currentUser, 'READ_GUARDIANS') &&
{translate('entities.guardians', 'Guardians')}
{guardians}
} {hasPermission(currentUser, 'READ_STUDENT_GUARDIANS') &&
{translate('entities.studentGuardians', 'Student guardians')}
{student_guardians}
} {hasPermission(currentUser, 'READ_TEACHERS') &&
{translate('entities.teachers', 'Teachers')}
{teachers}
} {hasPermission(currentUser, 'READ_COURSES') &&
{translate('entities.courses', 'Courses')}
{courses}
} {hasPermission(currentUser, 'READ_GRADES') &&
{translate('entities.grades', 'Grades')}
{grades}
} {hasPermission(currentUser, 'READ_CLASSES') &&
{translate('entities.classes', 'Classes')}
{classes}
} {hasPermission(currentUser, 'READ_SUBJECTS') &&
{translate('entities.subjects', 'Subjects')}
{subjects}
} {hasPermission(currentUser, 'READ_ENROLLMENTS') &&
{translate('entities.enrollments', 'Enrollments')}
{enrollments}
} {hasPermission(currentUser, 'READ_ASSESSMENTS') &&
{translate('entities.assessments', 'Assessments')}
{assessments}
} {hasPermission(currentUser, 'READ_ATTENDANCE') &&
{translate('entities.attendance', 'Attendance')}
{attendance}
} {hasPermission(currentUser, 'READ_INVOICES') &&
{translate('entities.invoices', 'Invoices')}
{invoices}
} {hasPermission(currentUser, 'READ_PAYMENTS') &&
{translate('entities.payments', 'Payments')}
{payments}
} {hasPermission(currentUser, 'READ_EMPLOYEES') &&
{translate('entities.employees', 'Employees')}
{employees}
} {hasPermission(currentUser, 'READ_PRODUCTS') &&
{translate('entities.products', 'Products')}
{products}
} {hasPermission(currentUser, 'READ_BOOKS') &&
{translate('entities.books', 'Books')}
{books}
} {hasPermission(currentUser, 'READ_BOOK_LOANS') &&
{translate('entities.bookLoans', 'Book loans')}
{book_loans}
}
) } Dashboard.getLayout = function getLayout(page: ReactElement) { return {page} } export default Dashboard