docs(changelog) : update changelog

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-03-24 09:10:29 +01:00
parent 2410ebb7dc
commit a76f25321a

View File

@@ -3,7 +3,8 @@
<header class="space-y-2"> <header class="space-y-2">
<h1 class="text-3xl font-bold text-base-content">Changelog</h1> <h1 class="text-3xl font-bold text-base-content">Changelog</h1>
<p class="text-sm text-base-content/70"> <p class="text-sm text-base-content/70">
Historique des modifications et nouvelles fonctionnalités de l'application. Historique des modifications et nouvelles fonctionnalités de
l'application.
</p> </p>
</header> </header>
@@ -17,7 +18,9 @@
<h2 class="text-xl font-bold text-base-content"> <h2 class="text-xl font-bold text-base-content">
{{ release.version }} {{ release.version }}
</h2> </h2>
<span class="badge badge-ghost text-xs">{{ release.date }}</span> <span class="badge badge-ghost text-xs">{{
release.date
}}</span>
</div> </div>
<ul class="space-y-2"> <ul class="space-y-2">
@@ -41,243 +44,603 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { useHead } from '#imports' import { useHead } from "#imports";
useHead({ title: 'Changelog' }) useHead({ title: "Changelog" });
type ChangeType = 'feat' | 'fix' | 'perf' | 'chore' type ChangeType = "feat" | "fix" | "perf" | "chore";
interface Change { interface Change {
type: ChangeType type: ChangeType;
text: string text: string;
} }
interface Release { interface Release {
version: string version: string;
date: string date: string;
changes: Change[] changes: Change[];
} }
const badgeClass = (type: ChangeType) => { const badgeClass = (type: ChangeType) => {
const map: Record<ChangeType, string> = { const map: Record<ChangeType, string> = {
feat: 'badge-primary', feat: "badge-primary",
fix: 'badge-error', fix: "badge-error",
perf: 'badge-warning', perf: "badge-warning",
chore: 'badge-ghost', chore: "badge-ghost",
} };
return map[type] ?? 'badge-ghost' return map[type] ?? "badge-ghost";
} };
const releases: Release[] = [ const releases: Release[] = [
{ {
version: 'v1.10.0', version: "v1.9.2",
date: '2026-03-23', date: "2026-03-23",
changes: [ changes: [
{ type: 'feat', text: 'Serveur MCP (Model Context Protocol) : l\'application expose désormais un serveur MCP permettant l\'intégration avec des assistants IA — outils CRUD complets pour toutes les entités, recherche inventaire, historique, commentaires, champs personnalisés, documents, slots et structure machine' }, {
{ type: 'feat', text: 'Types de documents : classification des documents par type (Plan, Photo, Fiche technique, Notice, Certificat, Facture, Bon de commande, Autre) avec filtre dédié sur la page documents, sélection du type à l\'upload et possibilité de modifier le type après upload' }, type: "feat",
{ type: 'feat', text: 'Filtre sites multi-sélection sur le Parc Machines : remplacement du menu déroulant par des cases à cocher permettant de filtrer sur un ou plusieurs sites simultanément' }, text: "Serveur MCP (Model Context Protocol) : l'application expose désormais un serveur MCP permettant l'intégration avec des assistants IA — outils CRUD complets pour toutes les entités, recherche inventaire, historique, commentaires, champs personnalisés, documents, slots et structure machine",
{ type: 'feat', text: 'Tri alphabétique automatique des machines sur le Parc Machines' }, },
{ type: 'feat', text: 'Recherche par nom OU référence sur les catalogues : la recherche dans les catalogues pièces, composants et produits cherche désormais dans le nom et la référence simultanément (extension Doctrine OR search)' }, {
{ type: 'feat', text: 'Quantité sur les slots pièces : ajout d\'un champ quantité éditable directement depuis la page d\'édition d\'un composant' }, type: "feat",
{ type: 'feat', text: 'Lien rapide vers la catégorie depuis la page d\'édition d\'un composant' }, text: "Types de documents : classification des documents par type (Plan, Photo, Fiche technique, Notice, Certificat, Facture, Bon de commande, Autre) avec filtre dédié sur la page documents, sélection du type à l'upload et possibilité de modifier le type après upload",
{ type: 'feat', text: 'Redirection vers la page d\'édition après création d\'un composant, d\'une pièce ou d\'un produit' }, },
{ type: 'fix', text: 'Correction de la suppression de fournisseurs sur les pièces, composants et produits : la suppression est maintenant persistée correctement' }, {
{ type: 'fix', text: 'Correction de la création de composants : les sélections de pièces, produits et sous-composants sont maintenant sauvegardées, et les slots squelette sont correctement initialisés' }, type: "feat",
{ type: 'fix', text: 'Correction de la perte de données lors de la sauvegarde d\'une catégorie (champs personnalisés et structure)' }, text: "Filtre sites multi-sélection sur le Parc Machines : remplacement du menu déroulant par des cases à cocher permettant de filtrer sur un ou plusieurs sites simultanément",
{ type: 'fix', text: 'Correction de la suppression de composants depuis la fiche machine (utilisation du linkId au lieu du composantId)' }, },
{ type: 'fix', text: 'Amélioration de l\'envoi des fournisseurs en PATCH : le tableau est toujours envoyé pour éviter les pertes' }, {
{ type: 'fix', text: 'Filtrage serveur des options dans les sélecteurs de slots au lieu du filtrage client' }, type: "feat",
{ type: 'fix', text: 'Page d\'édition pièce : rester sur la page après sauvegarde au lieu de rediriger' }, text: "Tri alphabétique automatique des machines sur le Parc Machines",
{ type: 'fix', text: 'Messages d\'erreur 409 (conflit) : extraction du champ d\'erreur pour un message compréhensible' }, },
{ type: 'perf', text: 'Suppression des chargements catalogue redondants sur la page d\'édition composant' }, {
type: "feat",
text: "Recherche par nom OU référence sur les catalogues : la recherche dans les catalogues pièces, composants et produits cherche désormais dans le nom et la référence simultanément (extension Doctrine OR search)",
},
{
type: "feat",
text: "Quantité sur les slots pièces : ajout d'un champ quantité éditable directement depuis la page d'édition d'un composant",
},
{
type: "feat",
text: "Lien rapide vers la catégorie depuis la page d'édition d'un composant",
},
{
type: "feat",
text: "Redirection vers la page d'édition après création d'un composant, d'une pièce ou d'un produit",
},
{
type: "fix",
text: "Correction de la suppression de fournisseurs sur les pièces, composants et produits : la suppression est maintenant persistée correctement",
},
{
type: "fix",
text: "Correction de la création de composants : les sélections de pièces, produits et sous-composants sont maintenant sauvegardées, et les slots squelette sont correctement initialisés",
},
{
type: "fix",
text: "Correction de la perte de données lors de la sauvegarde d'une catégorie (champs personnalisés et structure)",
},
{
type: "fix",
text: "Correction de la suppression de composants depuis la fiche machine (utilisation du linkId au lieu du composantId)",
},
{
type: "fix",
text: "Amélioration de l'envoi des fournisseurs en PATCH : le tableau est toujours envoyé pour éviter les pertes",
},
{
type: "fix",
text: "Filtrage serveur des options dans les sélecteurs de slots au lieu du filtrage client",
},
{
type: "fix",
text: "Page d'édition pièce : rester sur la page après sauvegarde au lieu de rediriger",
},
{
type: "fix",
text: "Messages d'erreur 409 (conflit) : extraction du champ d'erreur pour un message compréhensible",
},
{
type: "perf",
text: "Suppression des chargements catalogue redondants sur la page d'édition composant",
},
], ],
}, },
{ {
version: 'v1.9.1', version: "v1.9.1",
date: '2026-03-16', date: "2026-03-16",
changes: [ changes: [
{ type: 'feat', text: 'Normalisation JSON → tables relationnelles : les structures des composants (pièces, produits, sous-composants) et les squelettes des catégories sont désormais stockés dans des tables dédiées au lieu de colonnes JSON, améliorant la fiabilité et les performances des requêtes' }, {
{ type: 'feat', text: 'Synchronisation des catégories (ModelType Sync) : la modification d\'une catégorie (ajout/suppression de slots ou champs personnalisés) peut être propagée automatiquement à tous les éléments existants de cette catégorie, avec prévisualisation des changements avant application' }, type: "feat",
{ type: 'feat', text: 'Sélection interactive des items dans les slots : sur la page d\'édition d\'un composant, il est maintenant possible de choisir directement la pièce, le produit ou le sous-composant assigné à chaque emplacement du squelette via des sélecteurs avec recherche' }, text: "Normalisation JSON → tables relationnelles : les structures des composants (pièces, produits, sous-composants) et les squelettes des catégories sont désormais stockés dans des tables dédiées au lieu de colonnes JSON, améliorant la fiabilité et les performances des requêtes",
{ type: 'feat', text: 'Endpoints PATCH pour les slots composant : modification de la quantité et de l\'item sélectionné sur les slots pièce, produit et sous-composant' }, },
{ type: 'feat', text: 'Table de relation pièce ↔ produit (PieceProductSlot) avec versioning pour le suivi des modifications de structure' }, {
{ type: 'feat', text: 'Gestion des champs personnalisés sur les catégories : synchronisation automatique des définitions de champs (ajout, modification, suppression) lors de la sauvegarde d\'une catégorie' }, type: "feat",
{ type: 'feat', text: 'Suite de tests étendue : 219 tests couvrant les stratégies de synchronisation, le contrôleur de sync et les nouvelles entités' }, text: "Synchronisation des catégories (ModelType Sync) : la modification d'une catégorie (ajout/suppression de slots ou champs personnalisés) peut être propagée automatiquement à tous les éléments existants de cette catégorie, avec prévisualisation des changements avant application",
{ type: 'fix', text: 'Correction de l\'affichage des sélections pré-existantes dans les slots : les pièces, produits et sous-composants déjà assignés sont maintenant correctement affichés à l\'ouverture de la page d\'édition (correction du cache catalogue)' }, },
{ type: 'fix', text: 'Fallback position/orderIndex sur index de tableau dans les stratégies de sync pour éviter les erreurs quand le champ est absent' }, {
type: "feat",
text: "Sélection interactive des items dans les slots : sur la page d'édition d'un composant, il est maintenant possible de choisir directement la pièce, le produit ou le sous-composant assigné à chaque emplacement du squelette via des sélecteurs avec recherche",
},
{
type: "feat",
text: "Endpoints PATCH pour les slots composant : modification de la quantité et de l'item sélectionné sur les slots pièce, produit et sous-composant",
},
{
type: "feat",
text: "Table de relation pièce ↔ produit (PieceProductSlot) avec versioning pour le suivi des modifications de structure",
},
{
type: "feat",
text: "Gestion des champs personnalisés sur les catégories : synchronisation automatique des définitions de champs (ajout, modification, suppression) lors de la sauvegarde d'une catégorie",
},
{
type: "feat",
text: "Suite de tests étendue : 219 tests couvrant les stratégies de synchronisation, le contrôleur de sync et les nouvelles entités",
},
{
type: "fix",
text: "Correction de l'affichage des sélections pré-existantes dans les slots : les pièces, produits et sous-composants déjà assignés sont maintenant correctement affichés à l'ouverture de la page d'édition (correction du cache catalogue)",
},
{
type: "fix",
text: "Fallback position/orderIndex sur index de tableau dans les stratégies de sync pour éviter les erreurs quand le champ est absent",
},
], ],
}, },
{ {
version: 'v1.9.0', version: "v1.9.0",
date: '2026-03-09', date: "2026-03-09",
changes: [ changes: [
{ type: 'feat', text: 'Gestion des champs personnalisés sur les machines : ajout, modification et suppression de définitions de champs directement depuis la fiche machine' }, {
{ type: 'feat', text: 'Refonte UI globale : amélioration du styling, des layouts et du responsive sur l\'ensemble des composants et pages' }, type: "feat",
{ type: 'feat', text: 'Suite de tests API complète : 167 tests couvrant toutes les entités, la sécurité et les validations' }, text: "Gestion des champs personnalisés sur les machines : ajout, modification et suppression de définitions de champs directement depuis la fiche machine",
{ type: 'feat', text: 'Endpoint /api/health pour le monitoring applicatif' }, },
{ type: 'fix', text: 'Sécurité renforcée : désactivation de la migration de session sur le firewall API, durcissement des accès documents et sessions' }, {
{ type: 'fix', text: 'Confirmation de suppression avec impact sur le catalogue produits (documents, liaisons machines en cascade)' }, type: "feat",
{ type: 'fix', text: 'Correction du débordement des dropdowns dans les DataTable' }, text: "Refonte UI globale : amélioration du styling, des layouts et du responsive sur l'ensemble des composants et pages",
{ type: 'perf', text: 'Refactoring massif du frontend : extraction de 15+ composables et composants partagés, réduction de la taille des fichiers' }, },
{ type: 'chore', text: 'Extraction de CuidEntityTrait et abstraction du subscriber d\'audit côté backend' }, {
{ type: 'chore', text: 'Ajout de DAMA DoctrineTestBundle pour l\'isolation des tests par transaction' }, type: "feat",
text: "Suite de tests API complète : 167 tests couvrant toutes les entités, la sécurité et les validations",
},
{
type: "feat",
text: "Endpoint /api/health pour le monitoring applicatif",
},
{
type: "fix",
text: "Sécurité renforcée : désactivation de la migration de session sur le firewall API, durcissement des accès documents et sessions",
},
{
type: "fix",
text: "Confirmation de suppression avec impact sur le catalogue produits (documents, liaisons machines en cascade)",
},
{
type: "fix",
text: "Correction du débordement des dropdowns dans les DataTable",
},
{
type: "perf",
text: "Refactoring massif du frontend : extraction de 15+ composables et composants partagés, réduction de la taille des fichiers",
},
{
type: "chore",
text: "Extraction de CuidEntityTrait et abstraction du subscriber d'audit côté backend",
},
{
type: "chore",
text: "Ajout de DAMA DoctrineTestBundle pour l'isolation des tests par transaction",
},
], ],
}, },
{ {
version: 'v1.8.1', version: "v1.8.1",
date: '2026-03-05', date: "2026-03-05",
changes: [ changes: [
{ type: 'feat', text: 'Composant DataTable générique avec tri, recherche, pagination et filtres server-side — toutes les pages catalogue migrées vers ce composant partagé' }, {
{ type: 'feat', text: 'Messages d\'erreur humanisés : les erreurs backend sont traduites en messages compréhensibles pour l\'utilisateur final' }, type: "feat",
{ type: 'feat', text: 'Modal d\'ajout d\'entités aux machines : ajout direct de composants, pièces et produits depuis la fiche machine' }, text: "Composant DataTable générique avec tri, recherche, pagination et filtres server-side toutes les pages catalogue migrées vers ce composant partagé",
{ type: 'feat', text: 'Filtres SearchFilter ipartial sur les noms de types de modèles et commentaires côté API' }, },
{ type: 'feat', text: 'Suppression du système TypeMachine (squelettes machines) : les champs personnalisés sont désormais liés directement à chaque machine' }, {
{ type: 'feat', text: 'Simplification de la création de machines : plus besoin de sélectionner un squelette, ajout direct des entités' }, type: "feat",
{ type: 'fix', text: 'Suppression catalogue pièces/composants : confirmation avec liste des éléments supprimés en cascade (documents, liaisons machine, champs personnalisés) au lieu de bloquer la suppression' }, text: "Messages d'erreur humanisés : les erreurs backend sont traduites en messages compréhensibles pour l'utilisateur final",
{ type: 'fix', text: 'Affichage des catégories sur les pages d\'édition (produit, composant, pièce) : correction de « Catégorie inconnue » causée par un import obsolète dans ModelType' }, },
{ type: 'fix', text: 'Recherche insensible à la casse sur les commentaires et documents (partial → ipartial)' }, {
{ type: 'chore', text: 'Suppression des pages squelettes machines (/machine-skeleton, /type) et composants associés' }, type: "feat",
text: "Modal d'ajout d'entités aux machines : ajout direct de composants, pièces et produits depuis la fiche machine",
},
{
type: "feat",
text: "Filtres SearchFilter ipartial sur les noms de types de modèles et commentaires côté API",
},
{
type: "feat",
text: "Suppression du système TypeMachine (squelettes machines) : les champs personnalisés sont désormais liés directement à chaque machine",
},
{
type: "feat",
text: "Simplification de la création de machines : plus besoin de sélectionner un squelette, ajout direct des entités",
},
{
type: "fix",
text: "Suppression catalogue pièces/composants : confirmation avec liste des éléments supprimés en cascade (documents, liaisons machine, champs personnalisés) au lieu de bloquer la suppression",
},
{
type: "fix",
text: "Affichage des catégories sur les pages d'édition (produit, composant, pièce) : correction de « Catégorie inconnue » causée par un import obsolète dans ModelType",
},
{
type: "fix",
text: "Recherche insensible à la casse sur les commentaires et documents (partial → ipartial)",
},
{
type: "chore",
text: "Suppression des pages squelettes machines (/machine-skeleton, /type) et composants associés",
},
], ],
}, },
{ {
version: 'v1.8.0', version: "v1.8.0",
date: '2026-03-03', date: "2026-03-03",
changes: [ changes: [
{ type: 'feat', text: 'Stockage des documents sur le système de fichiers au lieu de Base64 en base de données, avec endpoints dédiés pour servir et télécharger les fichiers' }, {
{ type: 'feat', text: 'Pagination serveur sur la page Documents avec recherche, tri (date/nom/taille), filtre par rattachement et sélecteur d\'éléments par page' }, type: "feat",
{ type: 'feat', text: 'Compression PDF automatique à l\'upload via Ghostscript, avec commande pour compresser les PDFs existants' }, text: "Stockage des documents sur le système de fichiers au lieu de Base64 en base de données, avec endpoints dédiés pour servir et télécharger les fichiers",
{ type: 'feat', text: 'Champ description sur les pièces et composants, visible dans les catalogues avec popover au survol' }, },
{ type: 'feat', text: 'Commande de migration app:migrate-documents-to-filesystem pour migrer les documents existants (Base64 → fichiers)' }, {
{ type: 'fix', text: 'Normalisation des documents : fileUrl et downloadUrl toujours exposés dans l\'API' }, type: "feat",
{ type: 'fix', text: 'Édition de squelettes machines : correction du conflit UniqueEntity et de l\'interférence du désérialiseur' }, text: "Pagination serveur sur la page Documents avec recherche, tri (date/nom/taille), filtre par rattachement et sélecteur d'éléments par page",
{ type: 'fix', text: 'Sites : ajout de l\'opération PATCH et correction de la migration de contrainte' }, },
{ type: 'chore', text: 'Réorganisation de la navbar avec nouvelles icônes Lucide' }, {
type: "feat",
text: "Compression PDF automatique à l'upload via Ghostscript, avec commande pour compresser les PDFs existants",
},
{
type: "feat",
text: "Champ description sur les pièces et composants, visible dans les catalogues avec popover au survol",
},
{
type: "feat",
text: "Commande de migration app:migrate-documents-to-filesystem pour migrer les documents existants (Base64 → fichiers)",
},
{
type: "fix",
text: "Normalisation des documents : fileUrl et downloadUrl toujours exposés dans l'API",
},
{
type: "fix",
text: "Édition de squelettes machines : correction du conflit UniqueEntity et de l'interférence du désérialiseur",
},
{
type: "fix",
text: "Sites : ajout de l'opération PATCH et correction de la migration de contrainte",
},
{
type: "chore",
text: "Réorganisation de la navbar avec nouvelles icônes Lucide",
},
], ],
}, },
{ {
version: 'v1.7.0', version: "v1.7.0",
date: '2026-03-02', date: "2026-03-02",
changes: [ changes: [
{ type: 'feat', text: 'Système de commentaires / tickets : possibilité de laisser des commentaires sur les fiches (machines, pièces, composants, produits, catégories, squelettes) avec résolution par les gestionnaires' }, {
{ type: 'feat', text: 'Page commentaires centralisée (/comments) avec filtres par statut, type d\'entité, pagination et liens cliquables vers les fiches' }, type: "feat",
{ type: 'feat', text: 'Badge notifications : compteur de commentaires ouverts sur l\'avatar utilisateur et dans le menu profil (polling 60s)' }, text: "Système de commentaires / tickets : possibilité de laisser des commentaires sur les fiches (machines, pièces, composants, produits, catégories, squelettes) avec résolution par les gestionnaires",
{ type: 'feat', text: 'Contrôle d\'accès par rôles : ROLE_ADMIN, ROLE_GESTIONNAIRE, ROLE_VIEWER avec permissions granulaires sur toutes les pages' }, },
{ type: 'feat', text: 'Journal d\'audit étendu : suivi des opérations sur machines, fournisseurs, types de modèles, documents et conversions' }, {
{ type: 'feat', text: 'Commande app:init-profile-passwords pour l\'initialisation en masse des mots de passe et rôles' }, type: "feat",
{ type: 'fix', text: 'Toggle switch pour les champs personnalisés booléens (remplace les checkboxes)' }, text: "Page commentaires centralisée (/comments) avec filtres par statut, type d'entité, pagination et liens cliquables vers les fiches",
{ type: 'fix', text: 'Recherche fournisseur : filtrage côté client au lieu d\'appels API debounce' }, },
{ type: 'fix', text: 'Prévention des doublons de noms de fournisseurs et de références de pièces (contraintes unique)' }, {
{ type: 'fix', text: 'Correction de la création de squelettes machines : pagination, duplication, champs personnalisés' }, type: "feat",
text: "Badge notifications : compteur de commentaires ouverts sur l'avatar utilisateur et dans le menu profil (polling 60s)",
},
{
type: "feat",
text: "Contrôle d'accès par rôles : ROLE_ADMIN, ROLE_GESTIONNAIRE, ROLE_VIEWER avec permissions granulaires sur toutes les pages",
},
{
type: "feat",
text: "Journal d'audit étendu : suivi des opérations sur machines, fournisseurs, types de modèles, documents et conversions",
},
{
type: "feat",
text: "Commande app:init-profile-passwords pour l'initialisation en masse des mots de passe et rôles",
},
{
type: "fix",
text: "Toggle switch pour les champs personnalisés booléens (remplace les checkboxes)",
},
{
type: "fix",
text: "Recherche fournisseur : filtrage côté client au lieu d'appels API debounce",
},
{
type: "fix",
text: "Prévention des doublons de noms de fournisseurs et de références de pièces (contraintes unique)",
},
{
type: "fix",
text: "Correction de la création de squelettes machines : pagination, duplication, champs personnalisés",
},
], ],
}, },
{ {
version: 'v1.6.1', version: "v1.6.1",
date: '2026-02-12', date: "2026-02-12",
changes: [ changes: [
{ type: 'feat', text: 'Suivi d\'audit étendu : enregistrement des opérations CRUD sur les machines, fournisseurs, catégories (ModelType) et documents' }, {
{ type: 'feat', text: 'Traçabilité des conversions de catégories dans le journal d\'activité (action « convert » avec direction, nombre et noms des éléments)' }, type: "feat",
{ type: 'feat', text: 'Endpoint historique machine : GET /api/machines/{id}/history' }, text: "Suivi d'audit étendu : enregistrement des opérations CRUD sur les machines, fournisseurs, catégories (ModelType) et documents",
},
{
type: "feat",
text: "Traçabilité des conversions de catégories dans le journal d'activité (action « convert » avec direction, nombre et noms des éléments)",
},
{
type: "feat",
text: "Endpoint historique machine : GET /api/machines/{id}/history",
},
], ],
}, },
{ {
version: 'v1.6.0', version: "v1.6.0",
date: '2026-02-12', date: "2026-02-12",
changes: [ changes: [
{ type: 'feat', text: 'Conversion bidirectionnelle des catégories : possibilité de convertir une catégorie de pièce en catégorie de composant (et inversement) avec transfert automatique de tous les éléments, documents, champs personnalisés et fournisseurs' }, {
{ type: 'feat', text: 'Vérification des conditions de blocage avant conversion : liaisons machines, templates de type machine, sous-composants dans la structure, collisions de noms' }, type: "feat",
{ type: 'feat', text: 'Bouton « Convertir » sur les listes de catégories pièce et composant avec modale de confirmation détaillée' }, text: "Conversion bidirectionnelle des catégories : possibilité de convertir une catégorie de pièce en catégorie de composant (et inversement) avec transfert automatique de tous les éléments, documents, champs personnalisés et fournisseurs",
{ type: 'chore', text: 'Passage php-cs-fixer sur l\'ensemble des contrôleurs et entités du backend' }, },
{
type: "feat",
text: "Vérification des conditions de blocage avant conversion : liaisons machines, templates de type machine, sous-composants dans la structure, collisions de noms",
},
{
type: "feat",
text: "Bouton « Convertir » sur les listes de catégories pièce et composant avec modale de confirmation détaillée",
},
{
type: "chore",
text: "Passage php-cs-fixer sur l'ensemble des contrôleurs et entités du backend",
},
], ],
}, },
{ {
version: 'v1.5.0', version: "v1.5.0",
date: '2026-02-11', date: "2026-02-11",
changes: [ changes: [
{ type: 'feat', text: 'Page de journal d\'activité globale avec filtres par entité, par acteur et pagination serveur' }, {
{ type: 'feat', text: 'Suivi d\'audit : enregistrement des noms de fournisseurs et des modifications de champs personnalisés' }, type: "feat",
{ type: 'feat', text: 'Préservation de l\'état des listes dans l\'URL (page courante, recherche, tri, direction, filtres) — le retour navigateur restaure exactement la position précédente' }, text: "Page de journal d'activité globale avec filtres par entité, par acteur et pagination serveur",
{ type: 'feat', text: 'Boutons « Retour » sur toutes les pages de création et d\'édition utilisent désormais l\'historique du navigateur au lieu de liens fixes' }, },
{ type: 'feat', text: 'Première lettre automatiquement en majuscule lors de la création de catégories et de composants' }, {
{ type: 'feat', text: 'Les types de catégories dans les tableaux des catalogues sont maintenant cliquables (lien vers la fiche d\'édition)' }, type: "feat",
{ type: 'feat', text: 'Application des couleurs de marque Malio sur l\'ensemble du thème (navbar, boutons, badges)' }, text: "Suivi d'audit : enregistrement des noms de fournisseurs et des modifications de champs personnalisés",
{ type: 'feat', text: 'Page changelog accessible depuis le footer' }, },
{ type: 'fix', text: 'Correction des filtres de tri et de recherche cassés sur les catalogues composants, pièces et produits' }, {
{ type: 'fix', text: 'Correction du filtre par rattachement (site, machine, composant, pièce) sur la page documents' }, type: "feat",
{ type: 'fix', text: 'Correction de l\'affichage des champs personnalisés sur les pages d\'édition (condition de concurrence)' }, text: "Préservation de l'état des listes dans l'URL (page courante, recherche, tri, direction, filtres) — le retour navigateur restaure exactement la position précédente",
{ type: 'fix', text: 'Plafonnement de la pagination à 200 éléments par page pour éviter les erreurs mémoire en production' }, },
{ type: 'perf', text: 'Cache intelligent sur les composables usePieces et useComposants : les données déjà chargées ne sont plus re-téléchargées inutilement' }, {
{ type: 'perf', text: 'Réduction des appels API bloquants sur les pages d\'édition' }, type: "feat",
text: "Boutons « Retour » sur toutes les pages de création et d'édition utilisent désormais l'historique du navigateur au lieu de liens fixes",
},
{
type: "feat",
text: "Première lettre automatiquement en majuscule lors de la création de catégories et de composants",
},
{
type: "feat",
text: "Les types de catégories dans les tableaux des catalogues sont maintenant cliquables (lien vers la fiche d'édition)",
},
{
type: "feat",
text: "Application des couleurs de marque Malio sur l'ensemble du thème (navbar, boutons, badges)",
},
{
type: "feat",
text: "Page changelog accessible depuis le footer",
},
{
type: "fix",
text: "Correction des filtres de tri et de recherche cassés sur les catalogues composants, pièces et produits",
},
{
type: "fix",
text: "Correction du filtre par rattachement (site, machine, composant, pièce) sur la page documents",
},
{
type: "fix",
text: "Correction de l'affichage des champs personnalisés sur les pages d'édition (condition de concurrence)",
},
{
type: "fix",
text: "Plafonnement de la pagination à 200 éléments par page pour éviter les erreurs mémoire en production",
},
{
type: "perf",
text: "Cache intelligent sur les composables usePieces et useComposants : les données déjà chargées ne sont plus re-téléchargées inutilement",
},
{
type: "perf",
text: "Réduction des appels API bloquants sur les pages d'édition",
},
], ],
}, },
{ {
version: 'v1.4.0', version: "v1.4.0",
date: '2026-02-04', date: "2026-02-04",
changes: [ changes: [
{ type: 'perf', text: 'Optimisation de la sérialisation API : ajout de groupes dédiés pour CustomFieldValue et CustomField, réduisant significativement la taille des réponses' }, {
{ type: 'perf', text: 'Pages d\'édition machines/composants/pièces : chargement parallèle des données au lieu de séquentiel' }, type: "perf",
text: "Optimisation de la sérialisation API : ajout de groupes dédiés pour CustomFieldValue et CustomField, réduisant significativement la taille des réponses",
},
{
type: "perf",
text: "Pages d'édition machines/composants/pièces : chargement parallèle des données au lieu de séquentiel",
},
], ],
}, },
{ {
version: 'v1.3.0', version: "v1.3.0",
date: '2026-01-28', date: "2026-01-28",
changes: [ changes: [
{ type: 'feat', text: 'Refactoring complet du frontend : découpage des méga-composants en modules réutilisables (7 chantiers F1-F7)' }, {
{ type: 'feat', text: 'Page détail machine découpée de 2989 à 219 lignes avec 2 composables et 7 sous-composants' }, type: "feat",
{ type: 'feat', text: 'Page création machine découpée de 1231 à 196 lignes avec 1 composable et 5 sous-composants' }, text: "Refactoring complet du frontend : découpage des méga-composants en modules réutilisables (7 chantiers F1-F7)",
{ type: 'feat', text: 'Extraction de 4 modules utilitaires partagés (champs personnalisés, affichage produits, documents, fournisseurs)' }, },
{ type: 'feat', text: 'Fusion des composables dupliqués : 3 composables d\'historique et 3 composables de types fusionnés en versions génériques' }, {
{ type: 'feat', text: 'Remplacement de confirm() natif par une modale DaisyUI personnalisée sur l\'ensemble de l\'application' }, type: "feat",
{ type: 'feat', text: 'Extraction de la navbar dans un composant AppNavbar dédié' }, text: "Page détail machine découpée de 2989 à 219 lignes avec 2 composables et 7 sous-composants",
{ type: 'feat', text: 'Suite de 54 tests unitaires avec Vitest couvrant les utilitaires et composables' }, },
{ type: 'perf', text: 'Optimisations API : helper extractCollection partagé, invalidation de cache ciblée' }, {
{ type: 'chore', text: 'Migration des composables JavaScript vers TypeScript strict' }, type: "feat",
{ type: 'chore', text: 'Activation de règles ESLint strictes et suppression de 19 console.log de débogage' }, text: "Page création machine découpée de 1231 à 196 lignes avec 1 composable et 5 sous-composants",
},
{
type: "feat",
text: "Extraction de 4 modules utilitaires partagés (champs personnalisés, affichage produits, documents, fournisseurs)",
},
{
type: "feat",
text: "Fusion des composables dupliqués : 3 composables d'historique et 3 composables de types fusionnés en versions génériques",
},
{
type: "feat",
text: "Remplacement de confirm() natif par une modale DaisyUI personnalisée sur l'ensemble de l'application",
},
{
type: "feat",
text: "Extraction de la navbar dans un composant AppNavbar dédié",
},
{
type: "feat",
text: "Suite de 54 tests unitaires avec Vitest couvrant les utilitaires et composables",
},
{
type: "perf",
text: "Optimisations API : helper extractCollection partagé, invalidation de cache ciblée",
},
{
type: "chore",
text: "Migration des composables JavaScript vers TypeScript strict",
},
{
type: "chore",
text: "Activation de règles ESLint strictes et suppression de 19 console.log de débogage",
},
], ],
}, },
{ {
version: 'v1.2.0', version: "v1.2.0",
date: '2026-01-21', date: "2026-01-21",
changes: [ changes: [
{ type: 'feat', text: 'Système de suivi d\'historique (audit) avec enregistrement automatique des modifications sur toutes les entités' }, {
{ type: 'feat', text: 'Interface dédiée à l\'historique sur les fiches produits, pièces et composants' }, type: "feat",
{ type: 'feat', text: 'Modale d\'éléments liés sur les pages de gestion des catégories avec navigation directe vers la fiche d\'édition' }, text: "Système de suivi d'historique (audit) avec enregistrement automatique des modifications sur toutes les entités",
{ type: 'feat', text: 'Possibilité d\'ajouter des champs personnalisés en mode restreint sur les catégories' }, },
{
type: "feat",
text: "Interface dédiée à l'historique sur les fiches produits, pièces et composants",
},
{
type: "feat",
text: "Modale d'éléments liés sur les pages de gestion des catégories avec navigation directe vers la fiche d'édition",
},
{
type: "feat",
text: "Possibilité d'ajouter des champs personnalisés en mode restreint sur les catégories",
},
], ],
}, },
{ {
version: 'v1.1.1', version: "v1.1.1",
date: '2026-01-14', date: "2026-01-14",
changes: [ changes: [
{ type: 'feat', text: 'Compression automatique des fichiers PDF à l\'upload via qpdf, réduisant l\'espace de stockage' }, {
{ type: 'chore', text: 'Ajout de qpdf dans l\'image Docker pour le support de la compression PDF' }, type: "feat",
text: "Compression automatique des fichiers PDF à l'upload via qpdf, réduisant l'espace de stockage",
},
{
type: "chore",
text: "Ajout de qpdf dans l'image Docker pour le support de la compression PDF",
},
], ],
}, },
{ {
version: 'v1.1.0', version: "v1.1.0",
date: '2026-01-07', date: "2026-01-07",
changes: [ changes: [
{ type: 'fix', text: 'Recherche insensible à la casse sur l\'ensemble des filtres de toutes les entités (machines, composants, pièces, produits)' }, {
{ type: 'chore', text: 'Réinitialisation des migrations vers un schéma initial unique avec guide de déploiement' }, type: "fix",
{ type: 'chore', text: 'Mise à jour des fixtures avec les données courantes de la base' }, text: "Recherche insensible à la casse sur l'ensemble des filtres de toutes les entités (machines, composants, pièces, produits)",
},
{
type: "chore",
text: "Réinitialisation des migrations vers un schéma initial unique avec guide de déploiement",
},
{
type: "chore",
text: "Mise à jour des fixtures avec les données courantes de la base",
},
], ],
}, },
{ {
version: 'v1.0.0', version: "v1.0.0",
date: '2025-12-15', date: "2025-12-15",
changes: [ changes: [
{ type: 'feat', text: 'Gestion complète des machines : création, édition, vue détaillée avec liaisons composants et pièces' }, {
{ type: 'feat', text: 'Catalogues composants, pièces et produits avec recherche serveur, tri et pagination' }, type: "feat",
{ type: 'feat', text: 'Système de catégories (types) avec squelettes de champs personnalisés et drag & drop pour réordonner' }, text: "Gestion complète des machines : création, édition, vue détaillée avec liaisons composants et pièces",
{ type: 'feat', text: 'Upload de documents avec prévisualisation PDF et images, miniatures dans les tableaux' }, },
{ type: 'feat', text: 'Gestion des fournisseurs multiples avec résolution automatique des noms' }, {
{ type: 'feat', text: 'Exigences produit sur les pièces : support de liaisons multiples' }, type: "feat",
{ type: 'feat', text: 'Sélections de composants sur les pièces avec recherche dynamique' }, text: "Catalogues composants, pièces et produits avec recherche serveur, tri et pagination",
{ type: 'feat', text: 'Système de sessions utilisateurs avec authentification par cookie' }, },
{ type: 'feat', text: 'Mémorisation des préférences de tri par catalogue (cookies)' }, {
{ type: 'feat', text: 'Formatage automatique des contacts et des montants en format français' }, type: "feat",
{ type: 'feat', text: 'Protection contre les suppressions : affichage des dépendances bloquantes avant confirmation' }, text: "Système de catégories (types) avec squelettes de champs personnalisés et drag & drop pour réordonner",
{ type: 'chore', text: 'Infrastructure Docker complète avec PostgreSQL, PHP 8.4, API Platform et pgAdmin' }, },
{
type: "feat",
text: "Upload de documents avec prévisualisation PDF et images, miniatures dans les tableaux",
},
{
type: "feat",
text: "Gestion des fournisseurs multiples avec résolution automatique des noms",
},
{
type: "feat",
text: "Exigences produit sur les pièces : support de liaisons multiples",
},
{
type: "feat",
text: "Sélections de composants sur les pièces avec recherche dynamique",
},
{
type: "feat",
text: "Système de sessions utilisateurs avec authentification par cookie",
},
{
type: "feat",
text: "Mémorisation des préférences de tri par catalogue (cookies)",
},
{
type: "feat",
text: "Formatage automatique des contacts et des montants en format français",
},
{
type: "feat",
text: "Protection contre les suppressions : affichage des dépendances bloquantes avant confirmation",
},
{
type: "chore",
text: "Infrastructure Docker complète avec PostgreSQL, PHP 8.4, API Platform et pgAdmin",
},
], ],
}, },
] ];
</script> </script>