fix: ferme les votes sur les versions obsolètes dans PDF/Print
This commit is contained in:
@@ -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'])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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'])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,20 +54,18 @@ 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,
|
versionId,
|
||||||
versionId,
|
countdownRef,
|
||||||
countdownRef,
|
setError,
|
||||||
setError,
|
setIsErrorAlertOpen
|
||||||
setIsErrorAlertOpen
|
})
|
||||||
})
|
|
||||||
|
|
||||||
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)
|
||||||
@@ -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')
|
||||||
|
|||||||
@@ -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'
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user