fix: ferme les votes sur les versions obsolètes dans PDF/Print

This commit is contained in:
2026-01-04 13:06:30 +04:00
parent e101f503d2
commit 2701957af8
5 changed files with 105 additions and 60 deletions
+4 -2
View File
@@ -46,7 +46,7 @@ const renderMarkdownToHtml = async content => {
} }
} }
export default function ExportPdfButton({versionData, size = 'medium', variant = 'outlined'}) { export default function ExportPdfButton({versionData, isOutdated = false, size = 'medium', variant = 'outlined'}) {
const [isExporting, setIsExporting] = useState(false) const [isExporting, setIsExporting] = useState(false)
const handleExportPdf = async () => { const handleExportPdf = async () => {
@@ -142,7 +142,8 @@ export default function ExportPdfButton({versionData, size = 'medium', variant =
const authorName = versionData.user_created?.split('-')[0] || 'Système' const authorName = versionData.user_created?.split('-')[0] || 'Système'
const createdAt = new Date(versionData.date_created) const createdAt = new Date(versionData.date_created)
const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000)) const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000))
const voteStatus = createdAt < threeDaysAgo ? 'fermé' : 'ouvert' const isExpired = createdAt < threeDaysAgo
const voteStatus = (isExpired || isOutdated) ? 'fermé' : 'ouvert'
const voteColor = voteStatus === 'ouvert' ? '#2e7d32' : '#d32f2f' const voteColor = voteStatus === 'ouvert' ? '#2e7d32' : '#d32f2f'
// Render markdown content to HTML // Render markdown content to HTML
@@ -251,6 +252,7 @@ export default function ExportPdfButton({versionData, size = 'medium', variant =
ExportPdfButton.propTypes = { ExportPdfButton.propTypes = {
versionData: PropTypes.object.isRequired, versionData: PropTypes.object.isRequired,
isOutdated: PropTypes.bool,
size: PropTypes.oneOf(['small', 'medium', 'large']), size: PropTypes.oneOf(['small', 'medium', 'large']),
variant: PropTypes.oneOf(['text', 'outlined', 'contained']) variant: PropTypes.oneOf(['text', 'outlined', 'contained'])
} }
+44 -3
View File
@@ -1,4 +1,4 @@
import {forwardRef, useRef, useState} from 'react' import {forwardRef, useRef, useState, useEffect} from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import Table from '@mui/material/Table' import Table from '@mui/material/Table'
import TableBody from '@mui/material/TableBody' import TableBody from '@mui/material/TableBody'
@@ -84,7 +84,8 @@ function rowContent({
setError, setError,
setIsErrorAlertOpen, setIsErrorAlertOpen,
setIsOpenComparison, setIsOpenComparison,
setVersionCompare setVersionCompare,
outdatedStatusMap
}) { }) {
const handleButtonClick = async versionId => { const handleButtonClick = async versionId => {
const version = await compareVersion({ const version = await compareVersion({
@@ -102,6 +103,8 @@ function rowContent({
} }
} }
const isOutdated = outdatedStatusMap[row.id] || false
return ( return (
<> <>
{columns.map(column => ( {columns.map(column => (
@@ -137,11 +140,13 @@ function rowContent({
/> />
<ExportPdfButton <ExportPdfButton
versionData={row} versionData={row}
isOutdated={isOutdated}
size='small' size='small'
variant='text' variant='text'
/> />
<PrintButton <PrintButton
versionData={row} versionData={row}
isOutdated={isOutdated}
size='small' size='small'
variant='text' variant='text'
/> />
@@ -182,6 +187,42 @@ export default function ListVersions({
dateTo: '', dateTo: '',
status: '' status: ''
}) })
const [outdatedStatusMap, setOutdatedStatusMap] = useState({})
// Fetch outdated status for all versions
useEffect(() => {
async function fetchOutdatedStatus() {
const statusMap = {}
await Promise.all(
data.map(async version => {
try {
const comparisonData = await compareVersion({
accessToken,
userId,
versionId: version.id,
countdownRef,
setError,
setIsErrorAlertOpen
})
if (comparisonData) {
statusMap[version.id] = comparisonData.outdated || false
}
} catch (error) {
console.warn(`Failed to fetch outdated status for version ${version.id}:`, error)
statusMap[version.id] = false
}
})
)
setOutdatedStatusMap(statusMap)
}
if (data.length > 0) {
fetchOutdatedStatus()
}
}, [data, accessToken, userId, countdownRef, setError, setIsErrorAlertOpen])
// Filter data based on search and filters // Filter data based on search and filters
const filteredData = filterVersions(data, searchTerm, filters) const filteredData = filterVersions(data, searchTerm, filters)
@@ -261,7 +302,7 @@ export default function ListVersions({
components={VirtuosoTableComponents} components={VirtuosoTableComponents}
fixedHeaderContent={fixedHeaderContent} fixedHeaderContent={fixedHeaderContent}
itemContent={(index, row) => rowContent({ itemContent={(index, row) => rowContent({
index, row, accessToken, userId, countdownRef, setError, setIsErrorAlertOpen, setIsOpenComparison, setVersionCompare index, row, accessToken, userId, countdownRef, setError, setIsErrorAlertOpen, setIsOpenComparison, setVersionCompare, outdatedStatusMap
})} })}
/> />
</Paper> </Paper>
+4 -2
View File
@@ -49,7 +49,7 @@ const renderMarkdownToHtml = async content => {
} }
} }
export default function PrintButton({versionData, size = 'medium', variant = 'outlined'}) { export default function PrintButton({versionData, isOutdated = false, size = 'medium', variant = 'outlined'}) {
const [isPrinting, setIsPrinting] = useState(false) const [isPrinting, setIsPrinting] = useState(false)
const [snackbar, setSnackbar] = useState({open: false, message: '', severity: 'success'}) const [snackbar, setSnackbar] = useState({open: false, message: '', severity: 'success'})
@@ -61,7 +61,8 @@ export default function PrintButton({versionData, size = 'medium', variant = 'ou
const authorName = versionData.user_created?.split('-')[0] || 'Système' const authorName = versionData.user_created?.split('-')[0] || 'Système'
const createdAt = new Date(versionData.date_created) const createdAt = new Date(versionData.date_created)
const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000)) const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000))
const voteStatus = createdAt < threeDaysAgo ? 'fermé' : 'ouvert' const isExpired = createdAt < threeDaysAgo
const voteStatus = (isExpired || isOutdated) ? 'fermé' : 'ouvert'
const voteColor = voteStatus === 'ouvert' ? '#2e7d32' : '#d32f2f' const voteColor = voteStatus === 'ouvert' ? '#2e7d32' : '#d32f2f'
// Render markdown content to HTML // Render markdown content to HTML
@@ -390,6 +391,7 @@ export default function PrintButton({versionData, size = 'medium', variant = 'ou
PrintButton.propTypes = { PrintButton.propTypes = {
versionData: PropTypes.object.isRequired, versionData: PropTypes.object.isRequired,
isOutdated: PropTypes.bool,
size: PropTypes.oneOf(['small', 'medium', 'large']), size: PropTypes.oneOf(['small', 'medium', 'large']),
variant: PropTypes.oneOf(['text', 'outlined', 'contained']) variant: PropTypes.oneOf(['text', 'outlined', 'contained'])
} }
+2 -4
View File
@@ -54,8 +54,7 @@ export default function VersionPage({session, versionId, viewMode}) {
setVersionData(version) setVersionData(version)
// If in comparison mode, also fetch comparison data // Fetch comparison data (needed for outdated status even if not in comparison mode)
if (viewMode === 'comparison') {
const comparison = await compareVersion({ const comparison = await compareVersion({
accessToken, accessToken,
userId, userId,
@@ -68,7 +67,6 @@ export default function VersionPage({session, versionId, viewMode}) {
if (comparison) { if (comparison) {
setVersionCompare({...comparison, versionId}) setVersionCompare({...comparison, versionId})
} }
}
} catch (error) { } catch (error) {
console.error('Failed to fetch version:', error) console.error('Failed to fetch version:', error)
setError('Impossible de charger cette version') setError('Impossible de charger cette version')
@@ -79,7 +77,7 @@ export default function VersionPage({session, versionId, viewMode}) {
} }
fetchVersionData() fetchVersionData()
}, [accessToken, userId, versionId, viewMode]) }, [accessToken, userId, versionId])
const handleBack = () => { const handleBack = () => {
router.push('/dashboard') router.push('/dashboard')
+2
View File
@@ -309,11 +309,13 @@ function VersionCard({
/> />
<ExportPdfButton <ExportPdfButton
versionData={version} versionData={version}
isOutdated={isOutdated}
size='small' size='small'
variant='text' variant='text'
/> />
<PrintButton <PrintButton
versionData={version} versionData={version}
isOutdated={isOutdated}
size='small' size='small'
variant='text' variant='text'
/> />