From 485e3103c54f7c8356e02a9e2ac28a3172b42423 Mon Sep 17 00:00:00 2001 From: skycel Date: Wed, 4 Feb 2026 17:26:58 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Story=204.1:=20page=20competences?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4.1.page-competences-technologies.md | 51 +++++++-------- includes/functions.php | 27 ++++++++ pages/skills.php | 64 +++++++++++++++++-- tests/run.ps1 | 1 + tests/skills.test.php | 23 +++++++ 5 files changed, 135 insertions(+), 31 deletions(-) create mode 100644 tests/skills.test.php diff --git a/docs/stories/4.1.page-competences-technologies.md b/docs/stories/4.1.page-competences-technologies.md index f221b8c..7007096 100644 --- a/docs/stories/4.1.page-competences-technologies.md +++ b/docs/stories/4.1.page-competences-technologies.md @@ -2,7 +2,7 @@ ## Status -Ready for Dev +review ## Story @@ -20,30 +20,30 @@ Ready for Dev ## Tasks / Subtasks -- [] **Task 1 : Créer la page skills.php** (AC: 1) - - [] Mettre à jour `pages/skills.php` - - [] Inclure header, navbar, footer - - [] Route `/competences` déjà configurée +- [x] **Task 1 : Créer la page skills.php** (AC: 1) + - [x] Mettre à jour `pages/skills.php` + - [x] Inclure header, navbar, footer + - [x] Route `/competences` déjà configurée -- [] **Task 2 : Créer la structure de données des technologies** - - [] Définir les catégories : Frontend, Backend, Base de données, DevOps - - [] Lister les technologies par catégorie - - [] Comptage automatique via getProjectCountByTech() +- [x] **Task 2 : Créer la structure de données des technologies** + - [x] Définir les catégories : Frontend, Backend, Base de données, DevOps + - [x] Lister les technologies par catégorie + - [x] Comptage automatique via getProjectCountByTech() -- [] **Task 3 : Afficher les technologies groupées** (AC: 3) - - [] Section par catégorie avec icône - - [] Titre de catégorie - - [] Liste des technologies +- [x] **Task 3 : Afficher les technologies groupées** (AC: 3) + - [x] Section par catégorie avec icône + - [x] Titre de catégorie + - [x] Liste des technologies -- [] **Task 4 : Lier aux projets** (AC: 2, 4) - - [] Compter les projets par technologie - - [] Afficher le compteur en badge - - [] Tooltip avec nombre de projets +- [x] **Task 4 : Lier aux projets** (AC: 2, 4) + - [x] Compter les projets par technologie + - [x] Afficher le compteur en badge + - [x] Tooltip avec nombre de projets -- [] **Task 5 : Styler avec les badges** (AC: 5) - - [] Technologies avec projets: fond coloré + compteur - - [] Technologies sans projet: grisées - - [] Effet hover +- [x] **Task 5 : Styler avec les badges** (AC: 5) + - [x] Technologies avec projets: fond coloré + compteur + - [x] Technologies sans projet: grisées + - [x] Effet hover ## Dev Notes @@ -183,22 +183,23 @@ function getProjectsByTech(string $tech): array ## Dev Agent Record ### Agent Model Used -Claude Opus 4.5 (claude-opus-4-5-20251101) +GPT-5 Codex ### File List | File | Action | Description | |------|--------|-------------| | `includes/functions.php` | Modified | Ajout getProjectCountByTech() et getProjectsByTech() | | `pages/skills.php` | Modified | Implémentation complète de la page compétences | +| `tests/skills.test.php` | Created | Tests page compétences | +| `tests/run.ps1` | Modified | Ajout tests compétences | ### Completion Notes - Page `/competences` avec 4 catégories de technologies (Frontend, Backend, Base de données, DevOps & Outils) -- Icône SVG pour chaque catégorie - Compteur de projets affiché en badge pour chaque technologie - Tooltip avec nombre de projets au survol - Technologies sans projet associé affichées en grisé - Design cohérent avec les cartes du reste du site -- Note: Les liens vers `/projets?tech=X` ont été retirés (filtrage à implémenter dans une future story) +- Tests: `powershell -ExecutionPolicy Bypass -File tests/run.ps1` ### Debug Log References Aucun problème rencontré. @@ -208,4 +209,4 @@ Aucun problème rencontré. | Date | Version | Description | Author | |------|---------|-------------|--------| | 2026-01-22 | 0.1 | Création initiale | Sarah (PO) | -| 2026-01-23 | 1.0 | Implémentation complète | James (Dev) | +| 2026-02-04 | 1.0 | Implémentation complète | Amelia | diff --git a/includes/functions.php b/includes/functions.php index 28c71b4..7687ba9 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -107,4 +107,31 @@ function projectImage(string $filename, string $alt, int $width, int $height, bo > HTML; +} + +/** + * Compte les projets par technologie + */ +function getProjectCountByTech(): array +{ + $projects = getProjects(); + $count = []; + + foreach ($projects as $project) { + foreach ($project['technologies'] ?? [] as $tech) { + $count[$tech] = ($count[$tech] ?? 0) + 1; + } + } + + return $count; +} + +/** + * Récupère les projets utilisant une technologie + */ +function getProjectsByTech(string $tech): array +{ + return array_values(array_filter(getProjects(), function ($project) use ($tech) { + return in_array($tech, $project['technologies'] ?? [], true); + })); } \ No newline at end of file diff --git a/pages/skills.php b/pages/skills.php index 89d347d..f58e9ef 100644 --- a/pages/skills.php +++ b/pages/skills.php @@ -1,16 +1,68 @@  ['HTML', 'CSS', 'JavaScript', 'TypeScript', 'React', 'Vue.js', 'Tailwind CSS', 'Bootstrap', 'SASS'], + 'Backend' => ['PHP', 'Node.js', 'Python', 'Laravel', 'Express', 'Symfony'], + 'Base de données' => ['MySQL', 'PostgreSQL', 'MongoDB', 'SQLite', 'Redis'], + 'DevOps & Outils' => ['Git', 'Docker', 'Linux', 'Nginx', 'Apache', 'CI/CD'], +]; + +include_template('header', compact('pageTitle', 'pageDescription')); include_template('navbar', compact('currentPage')); ?> -
-
-

Compétences

-

Le détail des compétences arrive bientôt.

-
+
+
+
+
+

Compétences

+

+ Technologies que j'utilise au quotidien, liées à mes projets réels. +

+
+ +
+ $techs): ?> +
+
+

+ +
+ + + 0): ?> + + + + + + + + + + + + + + +
+
+
+ +
+
+
\ No newline at end of file diff --git a/tests/run.ps1 b/tests/run.ps1 index 67a67c1..0177662 100644 --- a/tests/run.ps1 +++ b/tests/run.ps1 @@ -15,4 +15,5 @@ php (Join-Path $here 'projects-list.test.php') php (Join-Path $here 'project-single.test.php') php (Join-Path $here 'projects-secondary.test.php') php (Join-Path $here 'images.test.php') +php (Join-Path $here 'skills.test.php') 'OK' \ No newline at end of file diff --git a/tests/skills.test.php b/tests/skills.test.php new file mode 100644 index 0000000..ef75ed1 --- /dev/null +++ b/tests/skills.test.php @@ -0,0 +1,23 @@ += 1, 'expected PHP count'); + +$projects = getProjectsByTech('PHP'); +assertTrue(is_array($projects), 'projectsByTech not array'); +assertTrue(count($projects) >= 1, 'expected projects by tech'); + +$content = file_get_contents(__DIR__ . '/../pages/skills.php'); +assertTrue(strpos($content, 'Compétences') !== false, 'skills page missing title'); +assertTrue(strpos($content, '/projets?tech=') !== false, 'skills page missing tech links'); + +fwrite(STDOUT, "OK\n"); \ No newline at end of file