Les parents avaient accès au lien "Emploi du temps" dans la navigation,
mais le dashboard n'affichait aucune donnée réelle : la section EDT
restait un placeholder vide ("L'emploi du temps sera disponible...").
Cette implémentation connecte le dashboard parent aux vrais endpoints API
(GET /api/me/children/{childId}/schedule/day|week/{date} et le résumé
multi-enfants), affiche le ScheduleWidget avec le prochain cours mis en
évidence (AC1), permet de cliquer sur chaque enfant dans le résumé pour
voir son EDT détaillé (AC2), et met en cache les endpoints parent dans le
Service Worker pour le mode offline (AC5).
Le handler backend est optimisé pour ne résoudre que l'enfant demandé
(via childId optionnel dans la query) au lieu de tous les enfants à chaque
appel, et les fonctions utilitaires dupliquées (formatSyncDate, timezone)
sont factorisées.
125 lines
2.7 KiB
TypeScript
125 lines
2.7 KiB
TypeScript
import { sveltekit } from '@sveltejs/kit/vite';
|
|
import { SvelteKitPWA } from '@vite-pwa/sveltekit';
|
|
import { defineConfig } from 'vitest/config';
|
|
|
|
export default defineConfig({
|
|
plugins: [
|
|
sveltekit(),
|
|
SvelteKitPWA({
|
|
srcDir: 'src',
|
|
mode: 'development',
|
|
strategies: 'generateSW',
|
|
scope: '/',
|
|
base: '/',
|
|
manifest: {
|
|
name: 'Classeo',
|
|
short_name: 'Classeo',
|
|
description: 'Application de gestion scolaire',
|
|
theme_color: '#3b82f6',
|
|
background_color: '#ffffff',
|
|
display: 'standalone',
|
|
start_url: '/',
|
|
categories: ['education'],
|
|
icons: [
|
|
{
|
|
src: 'pwa-192x192.png',
|
|
sizes: '192x192',
|
|
type: 'image/png'
|
|
},
|
|
{
|
|
src: 'pwa-512x512.png',
|
|
sizes: '512x512',
|
|
type: 'image/png'
|
|
},
|
|
{
|
|
src: 'pwa-512x512.png',
|
|
sizes: '512x512',
|
|
type: 'image/png',
|
|
purpose: 'any maskable'
|
|
}
|
|
],
|
|
shortcuts: [
|
|
{
|
|
name: 'Mon emploi du temps',
|
|
short_name: 'EDT',
|
|
url: '/dashboard/schedule',
|
|
description: 'Consulter mon emploi du temps'
|
|
}
|
|
]
|
|
},
|
|
workbox: {
|
|
globPatterns: ['**/*.{js,css,html,ico,png,svg,webp,woff,woff2}'],
|
|
runtimeCaching: [
|
|
{
|
|
urlPattern: /\/api\/me\/schedule\//,
|
|
handler: 'NetworkFirst',
|
|
options: {
|
|
cacheName: 'schedule-v1',
|
|
expiration: {
|
|
maxEntries: 90,
|
|
maxAgeSeconds: 30 * 24 * 60 * 60
|
|
},
|
|
networkTimeoutSeconds: 5,
|
|
cacheableResponse: {
|
|
statuses: [0, 200]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
urlPattern: /\/api\/me\/children\/.*\/schedule\//,
|
|
handler: 'NetworkFirst',
|
|
options: {
|
|
cacheName: 'parent-schedule-v1',
|
|
expiration: {
|
|
maxEntries: 180,
|
|
maxAgeSeconds: 30 * 24 * 60 * 60
|
|
},
|
|
networkTimeoutSeconds: 5,
|
|
cacheableResponse: {
|
|
statuses: [0, 200]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
devOptions: {
|
|
enabled: false,
|
|
type: 'module',
|
|
navigateFallback: '/'
|
|
}
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
}) as any
|
|
],
|
|
test: {
|
|
include: ['src/**/*.{test,spec}.{js,ts}', 'tests/**/*.{test,spec}.{js,ts}'],
|
|
globals: true,
|
|
environment: 'jsdom',
|
|
server: {
|
|
deps: {
|
|
inline: [/svelte/]
|
|
}
|
|
},
|
|
alias: {
|
|
$lib: '/src/lib',
|
|
$app: '/node_modules/@sveltejs/kit/src/runtime/app'
|
|
}
|
|
},
|
|
resolve: {
|
|
conditions: ['browser']
|
|
},
|
|
server: {
|
|
host: '0.0.0.0',
|
|
port: 5173,
|
|
strictPort: true,
|
|
// Autorise les sous-domaines pour le multi-tenant (dev + prod)
|
|
allowedHosts: ['.classeo.local', '.classeo.fr', 'localhost']
|
|
},
|
|
preview: {
|
|
host: '0.0.0.0',
|
|
port: 4173,
|
|
strictPort: true,
|
|
// Autorise les sous-domaines pour les tests E2E multi-tenant
|
|
allowedHosts: ['.classeo.local', '.classeo.fr', 'localhost']
|
|
}
|
|
});
|