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 handleExportPdf = async () => {
@@ -142,7 +142,8 @@ export default function ExportPdfButton({versionData, size = 'medium', variant =
const authorName = versionData.user_created?.split('-')[0] || 'Système'
const createdAt = new Date(versionData.date_created)
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'
// Render markdown content to HTML
@@ -251,6 +252,7 @@ export default function ExportPdfButton({versionData, size = 'medium', variant =
ExportPdfButton.propTypes = {
versionData: PropTypes.object.isRequired,
isOutdated: PropTypes.bool,
size: PropTypes.oneOf(['small', 'medium', 'large']),
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 Table from '@mui/material/Table'
import TableBody from '@mui/material/TableBody'
@@ -84,7 +84,8 @@ function rowContent({
setError,
setIsErrorAlertOpen,
setIsOpenComparison,
setVersionCompare
setVersionCompare,
outdatedStatusMap
}) {
const handleButtonClick = async versionId => {
const version = await compareVersion({
@@ -102,6 +103,8 @@ function rowContent({
}
}
const isOutdated = outdatedStatusMap[row.id] || false
return (
<>
{columns.map(column => (
@@ -137,11 +140,13 @@ function rowContent({
/>
<ExportPdfButton
versionData={row}
isOutdated={isOutdated}
size='small'
variant='text'
/>
<PrintButton
versionData={row}
isOutdated={isOutdated}
size='small'
variant='text'
/>
@@ -182,6 +187,42 @@ export default function ListVersions({
dateTo: '',
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
const filteredData = filterVersions(data, searchTerm, filters)
@@ -261,7 +302,7 @@ export default function ListVersions({
components={VirtuosoTableComponents}
fixedHeaderContent={fixedHeaderContent}
itemContent={(index, row) => rowContent({
index, row, accessToken, userId, countdownRef, setError, setIsErrorAlertOpen, setIsOpenComparison, setVersionCompare
index, row, accessToken, userId, countdownRef, setError, setIsErrorAlertOpen, setIsOpenComparison, setVersionCompare, outdatedStatusMap
})}
/>
</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 [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 createdAt = new Date(versionData.date_created)
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'
// Render markdown content to HTML
@@ -390,6 +391,7 @@ export default function PrintButton({versionData, size = 'medium', variant = 'ou
PrintButton.propTypes = {
versionData: PropTypes.object.isRequired,
isOutdated: PropTypes.bool,
size: PropTypes.oneOf(['small', 'medium', 'large']),
variant: PropTypes.oneOf(['text', 'outlined', 'contained'])
}
+2 -4
View File
@@ -54,8 +54,7 @@ export default function VersionPage({session, versionId, viewMode}) {
setVersionData(version)
// If in comparison mode, also fetch comparison data
if (viewMode === 'comparison') {
// Fetch comparison data (needed for outdated status even if not in comparison mode)
const comparison = await compareVersion({
accessToken,
userId,
@@ -68,7 +67,6 @@ export default function VersionPage({session, versionId, viewMode}) {
if (comparison) {
setVersionCompare({...comparison, versionId})
}
}
} catch (error) {
console.error('Failed to fetch version:', error)
setError('Impossible de charger cette version')
@@ -79,7 +77,7 @@ export default function VersionPage({session, versionId, viewMode}) {
}
fetchVersionData()
}, [accessToken, userId, versionId, viewMode])
}, [accessToken, userId, versionId])
const handleBack = () => {
router.push('/dashboard')
+2
View File
@@ -309,11 +309,13 @@ function VersionCard({
/>
<ExportPdfButton
versionData={version}
isOutdated={isOutdated}
size='small'
variant='text'
/>
<PrintButton
versionData={version}
isOutdated={isOutdated}
size='small'
variant='text'
/>