Ajoute GET /upload/:id (morceaux reçus). Le client conserve la session
après échec et ne renvoie que les morceaux manquants.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Relance en une fois tous les fichiers en échec ; la barre de file reste
visible tant qu'il y en a et indique leur nombre.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- une zone de dépôt par cible à la place du menu déroulant, avec pastille
de catégorie sur chaque fichier quand il y a plusieurs cibles (#11)
- un seul sélecteur : le doublon « Parcourir un dossier » disparaît, les
dossiers passent par glisser-déposer (#10)
- bouton « Tout mettre en pause / Tout reprendre » à côté de « Tout annuler » (#13)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- bouton Pause/Reprendre par fichier (#6)
- bouton Réessayer sur les échecs (#7)
- noms de fichiers tronqués avec ellipse + titre au survol (#5)
- contenu pleine largeur (#4)
- cible figée à l'ajout, nouvelle tentative d'init sur 429 (#1, #3)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
`GET /` décide côté serveur, à chaque requête, laquelle des deux pages
servir : `public/login.html` (aucune session valide — juste le bouton
« Se connecter », aucune zone de dépôt dans le HTML) ou
`public/upload.html` (session valide — nom d'utilisateur injecté et
échappé, bouton « Se déconnecter »). Nouveau `src/routes/pages.ts`.
Simplifications côté page de dépôt, permises par cette garantie
serveur : plus de fetch `/auth/me` ni de bascule `authenticated` en
JS, plus de retrait/réinsertion de la zone de dépôt dans le DOM — elle
est toujours présente puisque la page n'est servie qu'aux sessions
valides. Une session qui expire en cours d'usage (401 sur /targets ou
/upload*) renvoie vers `/?login=expired`, qui affiche alors la vraie
page de connexion avec le message adapté.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>