diff --git a/frontend/.gitignore b/frontend/.gitignore index 7b8da95..afcae07 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -40,3 +40,6 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# Assets DSFR copiés par le postinstall (régénérés depuis node_modules) +/public/dsfr diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index 05e726d..e558d6b 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -12,6 +12,8 @@ const eslintConfig = defineConfig([ "out/**", "build/**", "next-env.d.ts", + // Assets DSFR vendorisés (minifiés) — à ne pas linter. + "public/**", ]), ]); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1f7173e..d79ec61 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,6 +8,7 @@ "name": "frontend", "version": "0.1.0", "dependencies": { + "@codegouvfr/react-dsfr": "^1.32.4", "@tanstack/react-query": "^5.90.21", "axios": "^1.13.6", "lucide-react": "^0.577.0", @@ -370,6 +371,29 @@ "specificity": "bin/cli.js" } }, + "node_modules/@codegouvfr/react-dsfr": { + "version": "1.32.4", + "resolved": "https://registry.npmjs.org/@codegouvfr/react-dsfr/-/react-dsfr-1.32.4.tgz", + "integrity": "sha512-yhjPqPObB3BsehZTRhJZ9qXwBRT2RZl0cn6hG838MlkPntTE5H5w0vU05KmKcdDBnQ0wDV59G7nnZrpKZQlNuA==", + "license": "MIT", + "dependencies": { + "tsafe": "^1.8.5", + "yargs-parser": "^21.1.1" + }, + "bin": { + "copy-dsfr-to-public": "bin/copy-dsfr-to-public.js", + "only-include-used-icons": "bin/only-include-used-icons.js", + "react-dsfr": "bin/react-dsfr.js" + }, + "peerDependencies": { + "@gouvfr/dsfr-chart": "^1.0.0" + }, + "peerDependenciesMeta": { + "@gouvfr/dsfr-chart": { + "optional": true + } + } + }, "node_modules/@csstools/color-helpers": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", @@ -8001,6 +8025,12 @@ "typescript": ">=4.8.4" } }, + "node_modules/tsafe": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/tsafe/-/tsafe-1.8.12.tgz", + "integrity": "sha512-nFRqW0ttu/2o6XTXsHiVZWJBCOaxhVqZLg7dgs3coZNsCMPXPfwz+zPHAQA+70fNnVJLAPg1EgGIqK9Q84tvAw==", + "license": "MIT" + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -8964,6 +8994,15 @@ "dev": true, "license": "ISC" }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 5b8a183..3cf254e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,9 +7,11 @@ "build": "next build", "start": "next start", "lint": "eslint", - "test": "vitest run" + "test": "vitest run", + "postinstall": "node scripts/copy-dsfr.mjs" }, "dependencies": { + "@codegouvfr/react-dsfr": "^1.32.4", "@tanstack/react-query": "^5.90.21", "axios": "^1.13.6", "lucide-react": "^0.577.0", diff --git a/frontend/scripts/copy-dsfr.mjs b/frontend/scripts/copy-dsfr.mjs new file mode 100644 index 0000000..c84fade --- /dev/null +++ b/frontend/scripts/copy-dsfr.mjs @@ -0,0 +1,19 @@ +// Copie les assets du Système de Design de l'État (DSFR) vers public/dsfr, +// pour les servir en statique (CSS, JS, polices Marianne, icônes). +// Lancé automatiquement après `npm install` (script postinstall). +import { cpSync, rmSync, existsSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import { dirname, join } from "node:path"; + +const root = join(dirname(fileURLToPath(import.meta.url)), ".."); +const src = join(root, "node_modules", "@codegouvfr", "react-dsfr", "dsfr"); +const dest = join(root, "public", "dsfr"); + +if (!existsSync(src)) { + console.warn("[copy-dsfr] Source DSFR introuvable, étape ignorée."); + process.exit(0); +} + +rmSync(dest, { recursive: true, force: true }); +cpSync(src, dest, { recursive: true }); +console.log("[copy-dsfr] Assets DSFR copiés vers public/dsfr."); diff --git a/frontend/src/app/(admin)/admin/contenus/page.tsx b/frontend/src/app/(admin)/admin/contenus/page.tsx index 340d0a8..a103f3b 100644 --- a/frontend/src/app/(admin)/admin/contenus/page.tsx +++ b/frontend/src/app/(admin)/admin/contenus/page.tsx @@ -1,13 +1,10 @@ 'use client'; import { useEffect, useState } from 'react'; -import { Plus, Edit2, Trash2 } from 'lucide-react'; import api from '@/lib/api'; import type { Feed } from '@/types'; -import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import Input from '@/components/ui/Input'; -import Badge from '@/components/ui/Badge'; import Modal from '@/components/ui/Modal'; import toast from 'react-hot-toast'; @@ -90,92 +87,107 @@ export default function AdminContenusPage() { return (
+
Gérez les articles et ressources de la plateforme
Chargement…
) : feeds.length === 0 ? ( -Aucun article
- -Aucun article pour le moment.
+ +- /{feed.slug} · Ordre: {feed.ordre} -
-| Titre | +Slug | +Ordre | +Statut | +Actions | +
|---|---|---|---|---|
| {feed.titre} | +/{feed.slug} | +{feed.ordre} | ++ + {feed.est_publie ? 'Publié' : 'Brouillon'} + + | +
+
|
+