feat: Implement faculty management routes and UI components

- Added a new route for managing faculties with a grid display of faculties.
- Created a detailed view for each faculty including metrics and recent activities.
- Introduced a new loader for fetching faculty data and associated plans and subjects.
- Enhanced the existing plans route to include a modal for plan details.
- Updated the login and index pages with improved UI and styling.
- Integrated a progress ring component to visualize the quality of plans.
- Applied a new font style across the application for consistency.
This commit is contained in:
2025-08-20 19:09:31 -06:00
parent b33a016ee2
commit 51faa98022
17 changed files with 1279 additions and 108 deletions

View File

@@ -13,6 +13,10 @@ import { Route as LoginRouteImport } from './routes/login'
import { Route as AuthenticatedRouteImport } from './routes/_authenticated'
import { Route as IndexRouteImport } from './routes/index'
import { Route as AuthenticatedPlanesRouteImport } from './routes/_authenticated/planes'
import { Route as AuthenticatedFacultadesRouteImport } from './routes/_authenticated/facultades'
import { Route as AuthenticatedPlanesPlanIdRouteImport } from './routes/_authenticated/planes/$planId'
import { Route as AuthenticatedFacultadFacultadIdRouteImport } from './routes/_authenticated/facultad/$facultadId'
import { Route as AuthenticatedPlanesPlanIdModalRouteImport } from './routes/_authenticated/planes/$planId/modal'
const LoginRoute = LoginRouteImport.update({
id: '/login',
@@ -33,30 +37,88 @@ const AuthenticatedPlanesRoute = AuthenticatedPlanesRouteImport.update({
path: '/planes',
getParentRoute: () => AuthenticatedRoute,
} as any)
const AuthenticatedFacultadesRoute = AuthenticatedFacultadesRouteImport.update({
id: '/facultades',
path: '/facultades',
getParentRoute: () => AuthenticatedRoute,
} as any)
const AuthenticatedPlanesPlanIdRoute =
AuthenticatedPlanesPlanIdRouteImport.update({
id: '/$planId',
path: '/$planId',
getParentRoute: () => AuthenticatedPlanesRoute,
} as any)
const AuthenticatedFacultadFacultadIdRoute =
AuthenticatedFacultadFacultadIdRouteImport.update({
id: '/facultad/$facultadId',
path: '/facultad/$facultadId',
getParentRoute: () => AuthenticatedRoute,
} as any)
const AuthenticatedPlanesPlanIdModalRoute =
AuthenticatedPlanesPlanIdModalRouteImport.update({
id: '/modal',
path: '/modal',
getParentRoute: () => AuthenticatedPlanesPlanIdRoute,
} as any)
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
'/login': typeof LoginRoute
'/planes': typeof AuthenticatedPlanesRoute
'/facultades': typeof AuthenticatedFacultadesRoute
'/planes': typeof AuthenticatedPlanesRouteWithChildren
'/facultad/$facultadId': typeof AuthenticatedFacultadFacultadIdRoute
'/planes/$planId': typeof AuthenticatedPlanesPlanIdRouteWithChildren
'/planes/$planId/modal': typeof AuthenticatedPlanesPlanIdModalRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
'/login': typeof LoginRoute
'/planes': typeof AuthenticatedPlanesRoute
'/facultades': typeof AuthenticatedFacultadesRoute
'/planes': typeof AuthenticatedPlanesRouteWithChildren
'/facultad/$facultadId': typeof AuthenticatedFacultadFacultadIdRoute
'/planes/$planId': typeof AuthenticatedPlanesPlanIdRouteWithChildren
'/planes/$planId/modal': typeof AuthenticatedPlanesPlanIdModalRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
'/': typeof IndexRoute
'/_authenticated': typeof AuthenticatedRouteWithChildren
'/login': typeof LoginRoute
'/_authenticated/planes': typeof AuthenticatedPlanesRoute
'/_authenticated/facultades': typeof AuthenticatedFacultadesRoute
'/_authenticated/planes': typeof AuthenticatedPlanesRouteWithChildren
'/_authenticated/facultad/$facultadId': typeof AuthenticatedFacultadFacultadIdRoute
'/_authenticated/planes/$planId': typeof AuthenticatedPlanesPlanIdRouteWithChildren
'/_authenticated/planes/$planId/modal': typeof AuthenticatedPlanesPlanIdModalRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
fullPaths: '/' | '/login' | '/planes'
fullPaths:
| '/'
| '/login'
| '/facultades'
| '/planes'
| '/facultad/$facultadId'
| '/planes/$planId'
| '/planes/$planId/modal'
fileRoutesByTo: FileRoutesByTo
to: '/' | '/login' | '/planes'
id: '__root__' | '/' | '/_authenticated' | '/login' | '/_authenticated/planes'
to:
| '/'
| '/login'
| '/facultades'
| '/planes'
| '/facultad/$facultadId'
| '/planes/$planId'
| '/planes/$planId/modal'
id:
| '__root__'
| '/'
| '/_authenticated'
| '/login'
| '/_authenticated/facultades'
| '/_authenticated/planes'
| '/_authenticated/facultad/$facultadId'
| '/_authenticated/planes/$planId'
| '/_authenticated/planes/$planId/modal'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
@@ -95,15 +157,72 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof AuthenticatedPlanesRouteImport
parentRoute: typeof AuthenticatedRoute
}
'/_authenticated/facultades': {
id: '/_authenticated/facultades'
path: '/facultades'
fullPath: '/facultades'
preLoaderRoute: typeof AuthenticatedFacultadesRouteImport
parentRoute: typeof AuthenticatedRoute
}
'/_authenticated/planes/$planId': {
id: '/_authenticated/planes/$planId'
path: '/$planId'
fullPath: '/planes/$planId'
preLoaderRoute: typeof AuthenticatedPlanesPlanIdRouteImport
parentRoute: typeof AuthenticatedPlanesRoute
}
'/_authenticated/facultad/$facultadId': {
id: '/_authenticated/facultad/$facultadId'
path: '/facultad/$facultadId'
fullPath: '/facultad/$facultadId'
preLoaderRoute: typeof AuthenticatedFacultadFacultadIdRouteImport
parentRoute: typeof AuthenticatedRoute
}
'/_authenticated/planes/$planId/modal': {
id: '/_authenticated/planes/$planId/modal'
path: '/modal'
fullPath: '/planes/$planId/modal'
preLoaderRoute: typeof AuthenticatedPlanesPlanIdModalRouteImport
parentRoute: typeof AuthenticatedPlanesPlanIdRoute
}
}
}
interface AuthenticatedPlanesPlanIdRouteChildren {
AuthenticatedPlanesPlanIdModalRoute: typeof AuthenticatedPlanesPlanIdModalRoute
}
const AuthenticatedPlanesPlanIdRouteChildren: AuthenticatedPlanesPlanIdRouteChildren =
{
AuthenticatedPlanesPlanIdModalRoute: AuthenticatedPlanesPlanIdModalRoute,
}
const AuthenticatedPlanesPlanIdRouteWithChildren =
AuthenticatedPlanesPlanIdRoute._addFileChildren(
AuthenticatedPlanesPlanIdRouteChildren,
)
interface AuthenticatedPlanesRouteChildren {
AuthenticatedPlanesPlanIdRoute: typeof AuthenticatedPlanesPlanIdRouteWithChildren
}
const AuthenticatedPlanesRouteChildren: AuthenticatedPlanesRouteChildren = {
AuthenticatedPlanesPlanIdRoute: AuthenticatedPlanesPlanIdRouteWithChildren,
}
const AuthenticatedPlanesRouteWithChildren =
AuthenticatedPlanesRoute._addFileChildren(AuthenticatedPlanesRouteChildren)
interface AuthenticatedRouteChildren {
AuthenticatedPlanesRoute: typeof AuthenticatedPlanesRoute
AuthenticatedFacultadesRoute: typeof AuthenticatedFacultadesRoute
AuthenticatedPlanesRoute: typeof AuthenticatedPlanesRouteWithChildren
AuthenticatedFacultadFacultadIdRoute: typeof AuthenticatedFacultadFacultadIdRoute
}
const AuthenticatedRouteChildren: AuthenticatedRouteChildren = {
AuthenticatedPlanesRoute: AuthenticatedPlanesRoute,
AuthenticatedFacultadesRoute: AuthenticatedFacultadesRoute,
AuthenticatedPlanesRoute: AuthenticatedPlanesRouteWithChildren,
AuthenticatedFacultadFacultadIdRoute: AuthenticatedFacultadFacultadIdRoute,
}
const AuthenticatedRouteWithChildren = AuthenticatedRoute._addFileChildren(