Ce projet est un template pour afficher une liste de rapports PDF et permettre leur téléchargement via un formulaire avec suivi de progression en temps réel.
auditcom-template/
├── index.html # Page principale (MODIFIABLE)
├── css/
│ ├── reset.css # Reset CSS (ne pas modifier)
│ └── style.css # Styles personnalisés (MODIFIABLE)
├── src/
│ ├── main.js # Logique principale (ne pas modifier)
│ ├── templating.js # Système de templating (ne pas modifier)
│ └── loadTemplate.js # Chargement des templates (ne pas modifier)
└── templates/
├── teamItem.html # Template pour chaque élément (MODIFIABLE)
└── messageItem.html # Template pour les messages (MODIFIABLE)
Vous pouvez modifier uniquement les fichiers suivants :
- ✅
index.html- Structure de la page principale - ✅
css/style.css- Styles personnalisés - ✅
templates/teamItem.html- Template pour chaque élément de la liste - ✅
templates/messageItem.html- Template pour les messages
Fichiers à ne pas modifier :
- ❌
src/main.js- Contient la logique de l'application - ❌
src/templating.js- Système de templating - ❌
src/loadTemplate.js- Chargement des templates - ❌
css/reset.css- Reset CSS de base
Ces IDs doivent absolument être présents et ne doivent pas être modifiés :
<!-- Conteneur pour la liste des éléments -->
<section id="teamList"></section>
<!-- Conteneur pour les messages de succès/erreur -->
<div id="messageContainer"></div>
<!-- Formulaire de téléchargement -->
<form id="downloadForm"></form>Utilisez data-bind-global pour afficher des métadonnées globales :
<!-- Affiche le nombre total de rapports -->
<h1 data-bind-global="count"></h1>Données disponibles :
count- Nombre total de rapports
Ce template définit la structure de chaque élément PDF dans la liste. Vous pouvez modifier le HTML et ajouter des classes CSS, mais vous devez conserver les attributs data-bind.
<template>
<article>
<!-- Logo de l'équipe -->
<img data-bind-attr-src="logoUrl" alt="Logo">
<!-- Nom de l'équipe -->
<h2 data-bind="teamName"></h2>
<!-- Date de téléversement (formatée automatiquement) -->
<p data-bind="uploadedAt"></p>
<!-- Auteur du document -->
<p data-bind="author"></p>
</article>
</template>Données disponibles :
logoUrl- URL complète du logo (construite automatiquement depuis l'API)teamName- Nom de l'équipe (affiche "—" si non fourni)uploadedAt- Date de téléversement (formatée automatiquement)author- Auteur du document PDF
Ce template définit l'affichage des messages (succès, erreur, chargement) avec barre de progression.
<template>
<aside data-bind-attr-class="messageClass" class="message">
<p data-bind="message"></p>
<div class="progress-container" data-bind-attr-style="progressContainerStyle">
<progress
data-bind-attr-value="progressValue"
data-bind-attr-max="progressMax"
class="progress-bar"
></progress>
<span class="progress-text" data-bind="progressPercent"></span>
</div>
</aside>
</template>data-bind="message"- Texte du message à afficherdata-bind-attr-class="messageClass"- Classe CSS (success,error, ouloading)data-bind-attr-style="progressContainerStyle"- Style pour afficher/masquer la barre de progressiondata-bind-attr-value="progressValue"- Valeur actuelle de progression (en bytes)data-bind-attr-max="progressMax"- Valeur maximale (Content-Length ou estimation)data-bind="progressPercent"- Texte de progression (pourcentage ou MB)
success: Fond vert, disparaît automatiquement après 5 secondeserror: Fond rouge, reste affiché jusqu'au prochain messageloading: Fond bleu, affiche une barre de progression avec pourcentage ou MB téléchargés
La barre de progression utilise l'élément HTML5 <progress> natif :
- Utilise le header
Content-Lengthde la réponse HTTP pour une progression précise - Affiche un pourcentage si
Content-Lengthest disponible - Affiche les MB téléchargés si
Content-Lengthn'est pas disponible - S'ajuste automatiquement si le fichier dépasse la taille annoncée
Le formulaire avec l'ID downloadForm est automatiquement connecté à l'API. Ajoutez les champs de obligatoires :
<form id="downloadForm">
<input type="text" name="lastName" placeholder="Nom">
<input type="text" name="firstName" placeholder="Prénom">
<input type="email" name="email" placeholder="Email">
<input type="checkbox" name="newsletterAgreement" id="consent">
<label for="consent">J'accepte de recevoir la newsletter</label>
<button type="submit">Télécharger</button>
</form>Comportement :
- Les données sont envoyées en JSON à l'API lors de la soumission
- Le champ
newsletterAgreementest automatiquement converti en"true"ou"false" - Le PDF est téléchargé automatiquement sous le nom
rapport-auditcom.pdf - Les messages s'affichent dans
#messageContainer - La progression du téléchargement est affichée en temps réel
Les modules JavaScript ES6 nécessitent un serveur HTTP. Ne pas ouvrir directement index.html avec file://.
Option 1 : Live Server (recommandé pour VS Code/Cursor)
- Installez l'extension "Live Server" par Ritwick Dey
- Clic droit sur
index.html→ "Open with Live Server"
Option 2 : Python
python3 -m http.server 8000Puis ouvrez http://localhost:8000
Option 3 : Node.js
npx serve -p 8000Puis ouvrez http://localhost:8000
Base URL : https://auditcom.onrender.com/api
Endpoints :
GET /pdfs- Récupère la liste des PDFs avec métadonnéesPOST /submit- Soumet le formulaire et retourne un PDF (streaming avec Content-Length)
- IDs obligatoires :
teamList,messageContainer,downloadFormdoivent être présents dansindex.html - Attributs
data-bind: Conservez les noms exacts des attributs dans les templates - Balise
<template>: Chaque template doit contenir une balise<template>à la racine - Serveur HTTP : Utilisez toujours un serveur HTTP local (pas
file://) - Content-Length : Le suivi de progression est plus précis si l'API envoie le header
Content-Length
Le système fonctionne automatiquement :
- Chargement : Les templates sont chargés au démarrage
- Remplissage global :
fillGlobals()remplit les éléments avecdata-bind-global - Remplissage des items :
fillTemplate()remplit chaque élément avec les données de l'API - Insertion : Les éléments sont ajoutés dans
#teamList - Messages : Les messages s'affichent automatiquement dans
#messageContainer
Le fichier css/style.css utilise des variables CSS pour faciliter la personnalisation :
:root {
--color-success-bg: #e8f5e9;
--color-error-bg: #ffebee;
--color-loading-bg: #e3f2fd;
/* ... autres variables */
}Vous pouvez modifier ces variables pour changer les couleurs, espacements, etc.
/* Liste des PDFs */
#teamList {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1rem;
padding: 2rem;
}
#teamList article {
border: 1px solid #ccc;
padding: 1rem;
border-radius: 8px;
}
/* Formulaire */
#downloadForm {
max-width: 500px;
margin: 2rem auto;
padding: 1rem;
display: flex;
flex-direction: column;
gap: 1rem;
}