From 7a7994e8b6bf430eced80d5ebc4fc95ed93860cc Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Wed, 6 May 2026 19:10:08 +0200 Subject: [PATCH] Admin cockpit --- frontend/src/App.jsx | 176 +++++++++++++++++++++++++++++++++------- frontend/src/styles.css | 96 +++++++++++++++++++++- 2 files changed, 239 insertions(+), 33 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 75ec53f..9aa695b 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -101,7 +101,25 @@ function flattenProgramTree(node, depth = 0, rows = []) { return rows } -function ProgramReviewPanel({ selectedNode, reviewForm, onReviewChange, onSaveReview }) { +function flattenVisibleProgramTree(node, collapsedKeys, depth = 0, rows = []) { + if (!node) return rows + rows.push({ node, depth }) + if (!collapsedKeys.has(node.key)) { + ;(node.children || []).forEach((child) => flattenVisibleProgramTree(child, collapsedKeys, depth + 1, rows)) + } + return rows +} + +function collectCollapsibleProgramKeys(node, depth = 0, keys = []) { + if (!node) return keys + if (depth > 0 && node.children?.length) keys.push(node.key) + ;(node.children || []).forEach((child) => collectCollapsibleProgramKeys(child, depth + 1, keys)) + return keys +} + +function ProgramReviewPanel({ selectedNode, reviewForm, onReviewChange, onSaveReview, readOnly = false, onOpenValidation }) { + const [isFullscreen, setIsFullscreen] = useState(false) + if (!selectedNode) { return (
@@ -136,9 +154,10 @@ function ProgramReviewPanel({ selectedNode, reviewForm, onReviewChange, onSaveRe )} {selectedNode.url && ( -
+
+ {readOnly ? 'Cliquer pour inspecter en plein écran' : 'Cliquer pour valider en plein écran'} + )} {review.comment && ( @@ -149,30 +168,95 @@ function ProgramReviewPanel({ selectedNode, reviewForm, onReviewChange, onSaveRe )} -
- -