Components - Composants Svelte Réutilisables ============================================= Vue d'ensemble des composants Svelte interactifs de l'application. **Localisation** : ``frontend/src/components/`` Organisation ------------ .. code-block:: text components/ ├── dashboards/ # Dashboards spécifiques par rôle │ ├── AdminDashboard.svelte │ ├── SyndicDashboard.svelte │ ├── AccountantDashboard.svelte │ └── OwnerDashboard.svelte ├── admin/ # Composants admin │ └── SeedManager.svelte ├── BuildingList.svelte # Liste immeubles avec pagination ├── OwnerList.svelte # Liste copropriétaires ├── UnitList.svelte # Liste lots ├── ExpenseList.svelte # Liste charges ├── MeetingList.svelte # Liste assemblées ├── DocumentList.svelte # Liste documents ├── OrganizationList.svelte # Liste organisations (superadmin) ├── UserListAdmin.svelte # Liste utilisateurs (admin) ├── LoginForm.svelte # Formulaire authentification ├── Navigation.svelte # Navigation principale ├── Pagination.svelte # Composant pagination réutilisable ├── SyncStatus.svelte # Indicateur online/offline └── LanguageSelector.svelte # Sélecteur de langue Catégories de Composants ------------------------- Dashboards (par Rôle) ^^^^^^^^^^^^^^^^^^^^^ **AdminDashboard.svelte** Dashboard pour **SUPERADMIN** : gestion organisations, utilisateurs, abonnements. **Features** : - Stats organisations actives - Liste utilisateurs récents - Gestion abonnements (cloud vs self-hosted) - Seed manager (données de test) **SyndicDashboard.svelte** Dashboard pour **SYNDIC** : gestion quotidienne copropriétés. **Features** : - Stats immeubles gérés, copropriétaires, charges - Tâches urgentes (réparations, convocations AG) - Actions rapides (immeubles, owners, charges, assemblées) - Prochaine assemblée générale **Exemple Code** : .. code-block:: svelte

Bienvenue, {user?.firstName} 👋

Immeubles gérés

8

**AccountantDashboard.svelte** Dashboard pour **ACCOUNTANT** : consultation comptable, rapports financiers. **Features** : - Vue consolidée charges toutes copropriétés - Rapports financiers (revenus, dépenses, balance) - Export comptable (PDF, Excel) **OwnerDashboard.svelte** Dashboard pour **OWNER** : consultation personnelle. **Features** : - Mes lots (appartements, parkings, caves) - Mes charges à payer - Mes documents (PCN, PV assemblées) - Coordonnées syndic Composants Listes ^^^^^^^^^^^^^^^^^ **BuildingList.svelte** Liste immeubles avec pagination, création inline. **Features** : - ✅ Pagination (20 items par défaut) - ✅ Formulaire création inline - ✅ Affichage cartes (nom, adresse, nombre lots) - ✅ Authentification JWT automatique - ✅ Gestion erreurs **Props** : Aucune prop, composant standalone. **Exemple** : .. code-block:: svelte **OwnerList.svelte** Liste copropriétaires avec recherche. **Features** : - Liste complète copropriétaires - Recherche par nom, email - Affichage lots possédés - Coordonnées contact (GDPR protected) **UnitList.svelte** Liste lots d'un immeuble. **Features** : - Filtre par building_id - Affichage type (Apartment, Parking, Storage) - Quote-part millièmes - Assignation copropriétaire **ExpenseList.svelte** Liste charges avec filtres. **Features** : - Filtre par immeuble - Filtre par statut (Pending, Paid, Overdue) - Catégories (Maintenance, Repair, Insurance, Utilities, Management) - Marquage "Payé" - Total charges en attente **MeetingList.svelte** Liste assemblées générales. **Features** : - Filtres par immeuble - Statuts (Scheduled, Completed, Cancelled) - Téléchargement PV (PDF) - Ordre du jour **DocumentList.svelte** Liste documents partagés. **Features** : - Filtres par type (PCN, Règlement, Contrat, Facture, Other) - Upload documents - Téléchargement - Prévisualisation PDF inline (iframe) Composants Utilitaires ^^^^^^^^^^^^^^^^^^^^^^^ **Pagination.svelte** Composant pagination réutilisable pour toutes les listes. **Props** : .. code-block:: typescript interface Props { currentPage: number; totalPages: number; totalItems: number; perPage: number; onPageChange: (page: number) => void; } **Exemple** : .. code-block:: svelte **Rendu** : .. code-block:: text [<] [1] [2] [3] ... [10] [>] Affichage 21-40 sur 200 résultats **Navigation.svelte** Navigation principale avec détection rôle utilisateur. **Features** : - Menu adapté au rôle (superadmin, syndic, accountant, owner) - Indicateur utilisateur connecté - Bouton logout - Sélecteur de langue - Badge notifications (future) **Exemple** : .. code-block:: svelte **SyncStatus.svelte** Indicateur statut connexion online/offline. **Features** : - 🟢 En ligne / 🔴 Hors ligne - Bouton synchronisation manuelle - Badge modifications en attente **Exemple** : .. code-block:: svelte
{#if isOnline} 🟢 En ligne {:else} 🔴 Hors ligne {/if} {#if pendingCount > 0} {pendingCount} en attente {/if}
**LanguageSelector.svelte** Sélecteur de langue (nl, fr, de, en). **Features** : - Dropdown avec drapeaux - Persistance localStorage - Mise à jour dynamique traductions **Exemple** : .. code-block:: svelte Composants Formulaires ^^^^^^^^^^^^^^^^^^^^^^^ **LoginForm.svelte** Formulaire authentification JWT. **Features** : - Email + Password - Gestion erreurs (401, 500) - Stockage token localStorage - Redirection après login - Initialisation SyncService **Exemple** : .. code-block:: svelte
{#if error}

{error}

{/if}
Composants Admin ^^^^^^^^^^^^^^^^ **SeedManager.svelte** Composant génération données de test (dev/staging). **Features** : - Seed organisations + utilisateurs + immeubles - Seed complet (all entities) - Reset database - Logs generation **⚠️ Seulement pour environnements non-production !** **OrganizationList.svelte** Liste organisations (multi-tenant). **Features** : - CRUD organisations (superadmin only) - Stats utilisateurs par organisation - Désactivation/Activation compte **UserListAdmin.svelte** Liste utilisateurs plateforme. **Features** : - CRUD utilisateurs (superadmin only) - Changement rôle - Reset password - Blocage compte Patterns d'Utilisation ----------------------- Hydration Astro ^^^^^^^^^^^^^^^ Dans les pages Astro, charger composants Svelte avec directives client: .. code-block:: astro --- import BuildingList from '../components/BuildingList.svelte'; --- Communication Parent-Enfant ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Props Down** : .. code-block:: svelte **Events Up** : .. code-block:: svelte Stores Partagés ^^^^^^^^^^^^^^^ Pour état global (auth, preferences) : .. code-block:: svelte {#if isLoggedIn}

Bienvenue {user.firstName}

{/if} Styling avec Tailwind CSS -------------------------- Tous les composants utilisent Tailwind CSS : .. code-block:: svelte

{building.name}

📍 {building.address}

**Classes Personnalisées** : .. code-block:: css /* frontend/src/styles/global.css */ .btn-primary { @apply bg-primary-600 text-white px-4 py-2 rounded-lg hover:bg-primary-700; } Tests Composants ---------------- .. code-block:: typescript // tests/unit/BuildingList.test.ts import { render, screen } from '@testing-library/svelte'; import { vi } from 'vitest'; import BuildingList from '../src/components/BuildingList.svelte'; vi.mock('../src/lib/api', () => ({ api: { get: vi.fn(() => Promise.resolve({ data: [{ id: '1', name: 'Test Building' }], pagination: { current_page: 1, total_pages: 1 } })) } })); describe('BuildingList', () => { it('should render buildings', async () => { render(BuildingList); await screen.findByText('Test Building'); expect(screen.getByText('Test Building')).toBeInTheDocument(); }); }); Accessibilité (a11y) -------------------- Bonnes pratiques : .. code-block:: svelte
Performance ----------- **Lazy Loading** : .. code-block:: svelte {#if HeavyComponent} {/if} **Virtual Scrolling** : Pour listes > 1000 items, utiliser ``svelte-virtual-list``. Références ---------- - Pages Astro : ``frontend/src/pages/`` - Stores : ``frontend/src/stores/`` - Lib : ``frontend/src/lib/`` - Svelte Docs : https://svelte.dev/docs - Tailwind CSS : https://tailwindcss.com/docs