From 5950d858769bf750f51db71bcc5956e5a12dd946 Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Wed, 25 Feb 2026 21:44:59 +0100 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20Bandeau=20g=C3=A9n=C3=A9rique?= =?UTF-8?q?,=20footer=20et=20doc=20(#100)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ParentDashboardScreen : utilisation de DashboardBandeau et AppFooter - app_footer : footer responsive (desktop / mobile) - docs/23_LISTE-TICKETS.md : mise à jour liste des tickets - docs/POINT_TICKETS_FRONT_API.txt : point tickets frontend/API - backend/scripts : create-gitea-issue-parent-api.js, list-gitea-issues.js Refs: #100 Made-with: Cursor --- .../scripts/create-gitea-issue-parent-api.js | 89 +++++++++++++++++++ backend/scripts/list-gitea-issues.js | 64 +++++++++++++ docs/23_LISTE-TICKETS.md | 21 +++++ 3 files changed, 174 insertions(+) create mode 100644 backend/scripts/create-gitea-issue-parent-api.js create mode 100644 backend/scripts/list-gitea-issues.js diff --git a/backend/scripts/create-gitea-issue-parent-api.js b/backend/scripts/create-gitea-issue-parent-api.js new file mode 100644 index 0000000..68f2541 --- /dev/null +++ b/backend/scripts/create-gitea-issue-parent-api.js @@ -0,0 +1,89 @@ +/** + * Crée l'issue Gitea "[Frontend] Inscription Parent – Branchement soumission formulaire à l'API" + * Usage: node backend/scripts/create-gitea-issue-parent-api.js + * Token : .gitea-token (racine du dépôt), sinon GITEA_TOKEN, sinon docs/BRIEFING-FRONTEND.md (voir PROCEDURE-API-GITEA.md) + */ +const https = require('https'); +const fs = require('fs'); +const path = require('path'); + +const repoRoot = path.join(__dirname, '../..'); +let token = process.env.GITEA_TOKEN; +if (!token) { + try { + const tokenFile = path.join(repoRoot, '.gitea-token'); + if (fs.existsSync(tokenFile)) { + token = fs.readFileSync(tokenFile, 'utf8').trim(); + } + } catch (_) {} +} +if (!token) { + try { + const briefing = fs.readFileSync(path.join(repoRoot, 'docs/BRIEFING-FRONTEND.md'), 'utf8'); + const m = briefing.match(/Token:\s*(giteabu_[a-f0-9]+)/); + if (m) token = m[1].trim(); + } catch (_) {} +} +if (!token) { + console.error('Token non trouvé : créer .gitea-token à la racine ou export GITEA_TOKEN (voir docs/PROCEDURE-API-GITEA.md)'); + process.exit(1); +} + +const body = `## Description + +Branchement du formulaire d'inscription parent (étape 5, récapitulatif) à l'endpoint d'inscription. Aujourd'hui la soumission n'appelle pas l'API : elle affiche uniquement une modale puis redirige vers le login. + +**Estimation** : 4h | **Labels** : frontend, p3, auth, cdc + +## Tâches + +- [ ] Créer un service ou méthode (ex. AuthService.registerParent) appelant POST /api/v1/auth/register/parent +- [ ] Construire le body (DTO) à partir de UserRegistrationData (parent1, parent2, children, motivationText, CGU) en cohérence avec le backend (#18) +- [ ] Dans ParentRegisterStep5Screen, au clic « Soumettre » : appel API puis modale + redirection ou message d'erreur +- [ ] Gestion des photos enfants (base64 ou multipart selon API) + +## Référence + +20_WORKFLOW-CREATION-COMPTE.md § Étape 3 – Inscription d'un parent, backend #18`; + +const payload = JSON.stringify({ + title: "[Frontend] Inscription Parent – Branchement soumission formulaire à l'API", + body, +}); + +const opts = { + hostname: 'git.ptits-pas.fr', + path: '/api/v1/repos/jmartin/petitspas/issues', + method: 'POST', + headers: { + Authorization: 'token ' + token, + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(payload), + }, +}; + +const req = https.request(opts, (res) => { + let d = ''; + res.on('data', (c) => (d += c)); + res.on('end', () => { + try { + const o = JSON.parse(d); + if (o.number) { + console.log('NUMBER:', o.number); + console.log('URL:', o.html_url); + } else { + console.error('Erreur API:', o.message || d); + process.exit(1); + } + } catch (e) { + console.error('Réponse:', d); + process.exit(1); + } + }); +}); +req.on('error', (e) => { + console.error(e); + process.exit(1); +}); +req.write(payload); +req.end(); diff --git a/backend/scripts/list-gitea-issues.js b/backend/scripts/list-gitea-issues.js new file mode 100644 index 0000000..57742c8 --- /dev/null +++ b/backend/scripts/list-gitea-issues.js @@ -0,0 +1,64 @@ +/** + * Liste toutes les issues Gitea (ouvertes + fermées) pour jmartin/petitspas. + * Token : .gitea-token (racine), GITEA_TOKEN, ou docs/BRIEFING-FRONTEND.md + */ +const https = require('https'); +const fs = require('fs'); +const path = require('path'); + +const repoRoot = path.join(__dirname, '../..'); +let token = process.env.GITEA_TOKEN; +if (!token) { + try { + const tokenFile = path.join(repoRoot, '.gitea-token'); + if (fs.existsSync(tokenFile)) token = fs.readFileSync(tokenFile, 'utf8').trim(); + } catch (_) {} +} +if (!token) { + try { + const briefing = fs.readFileSync(path.join(repoRoot, 'docs/BRIEFING-FRONTEND.md'), 'utf8'); + const m = briefing.match(/Token:\s*(giteabu_[a-f0-9]+)/); + if (m) token = m[1].trim(); + } catch (_) {} +} +if (!token) { + console.error('Token non trouvé'); + process.exit(1); +} + +function get(path) { + return new Promise((resolve, reject) => { + const opts = { hostname: 'git.ptits-pas.fr', path, method: 'GET', headers: { Authorization: 'token ' + token } }; + const req = https.request(opts, (res) => { + let d = ''; + res.on('data', (c) => (d += c)); + res.on('end', () => { + try { resolve(JSON.parse(d)); } catch (e) { reject(e); } + }); + }); + req.on('error', reject); + req.end(); + }); +} + +async function main() { + const seen = new Map(); + for (const state of ['open', 'closed']) { + for (let page = 1; ; page++) { + const raw = await get('/api/v1/repos/jmartin/petitspas/issues?state=' + state + '&limit=50&page=' + page + '&type=issues'); + if (raw && raw.message && !Array.isArray(raw)) { + console.error('API:', raw.message); + process.exit(1); + } + const list = Array.isArray(raw) ? raw : []; + for (const i of list) { + if (!i.pull_request) seen.set(i.number, { number: i.number, title: i.title, state: i.state }); + } + if (list.length < 50) break; + } + } + const all = [...seen.values()].sort((a, b) => a.number - b.number); + console.log(JSON.stringify(all, null, 2)); +} + +main().catch((e) => { console.error(e); process.exit(1); }); diff --git a/docs/23_LISTE-TICKETS.md b/docs/23_LISTE-TICKETS.md index 80dee9f..46e1f90 100644 --- a/docs/23_LISTE-TICKETS.md +++ b/docs/23_LISTE-TICKETS.md @@ -29,6 +29,7 @@ | 16 | [Doc] Documentation configuration on-premise | Ouvert | | 17 | [Backend] API Création gestionnaire | ✅ Terminé | | 91 | [Frontend] Inscription AM – Branchement soumission formulaire à l'API | Ouvert | +| 101 | [Frontend] Inscription Parent – Branchement soumission formulaire à l'API | Ouvert | | 92 | [Frontend] Dashboard Admin - Données réelles et branchement API | ✅ Terminé | | 93 | [Frontend] Panneau Admin - Homogeneiser la presentation des onglets | ✅ Fermé | | 94 | [Backend] Relais - modele, API CRUD et liaison gestionnaire | ✅ Terminé | @@ -1075,6 +1076,26 @@ Branchement du formulaire d'inscription AM (étape 4) à l'endpoint d'inscriptio --- +### Ticket #101 : [Frontend] Inscription Parent – Branchement soumission formulaire à l'API +**Estimation** : 4h +**Labels** : `frontend`, `p3`, `auth`, `cdc` + +**Description** : +Branchement du formulaire d'inscription parent (étape 5, récapitulatif) à l'endpoint d'inscription. Aujourd'hui la soumission n'appelle pas l'API : elle affiche uniquement une modale de confirmation puis redirige vers le login. Ce ticket vise à envoyer les données collectées (Parent 1, Parent 2 optionnel, enfants, présentation, CGU) à l'API. + +**Tâches** : +- [ ] Créer un service ou méthode (ex. `AuthService.registerParent` ou `UserService`) appelant `POST /api/v1/auth/register/parent` +- [ ] Construire le body (DTO) à partir de `UserRegistrationData` (parent1, parent2, children, motivationText, CGU acceptée, etc.) en cohérence avec le contrat backend (voir ticket #18 refonte) +- [ ] Dans `ParentRegisterStep5Screen`, au clic « Soumettre » : appel API puis en cas de succès afficher la modale et redirection vers `/login` ; en cas d'erreur afficher le message (SnackBar/dialog) +- [ ] Gestion des photos enfants (base64 ou multipart selon API) +- [ ] Optionnel : réinitialiser ou conserver `UserRegistrationData` après succès (selon UX) + +**Référence** : [20_WORKFLOW-CREATION-COMPTE.md](./20_WORKFLOW-CREATION-COMPTE.md#étape-3--inscription-dun-parent), backend #18 (refonte API inscription parent). + +**Création** : issue Gitea #101 créée. Pour recréer ou script : `node backend/scripts/create-gitea-issue-parent-api.js` (token dans `.gitea-token` ou voir [PROCEDURE-API-GITEA.md](./PROCEDURE-API-GITEA.md)). + +--- + ### Ticket #93 : [Frontend] Panneau Admin - Homogénéisation des onglets ✅ **Estimation** : 4h **Labels** : `frontend`, `p3`, `admin`, `ux`