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 )} -
- -