From c3e4eba810137f46d6ffa6da6b55d7325ceeab0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Sun, 15 Sep 2024 18:00:33 +0400 Subject: [PATCH 1/7] Add react-virtuoso lib --- package.json | 3 ++- yarn.lock | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 22ce2d7..38324f9 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "next": "^14.2.3", "next-auth": "^5.0.0-beta.18", "react": "^18.3.1", - "react-dom": "^18.3.1" + "react-dom": "^18.3.1", + "react-virtuoso": "^4.10.2" }, "devDependencies": { "eslint-config-xo-nextjs": "^6.0.0", diff --git a/yarn.lock b/yarn.lock index e59dcb1..de18dc9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3115,6 +3115,11 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" +react-virtuoso@^4.10.2: + version "4.10.2" + resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-4.10.2.tgz#a27308a3c4cfeb24722032acc0b6a46055c26967" + integrity sha512-os6n9QKeKRF+8mnQR/vGy/xrFf6vXIzuaAVL54q5k2st2d5QIEwI+KDKaflMUmMvnDbPxf68bs+CF5bY3YI7qA== + react@^18.3.1: version "18.3.1" resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" From 034568eda151b0553917bf5bd4c998a90466b8fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Sun, 15 Sep 2024 18:01:38 +0400 Subject: [PATCH 2/7] Add listVersions to lib/directus --- lib/directus.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/lib/directus.js b/lib/directus.js index 0f80289..605cb5f 100644 --- a/lib/directus.js +++ b/lib/directus.js @@ -69,6 +69,39 @@ export async function handleSubmit({ } } +export async function listVersions({ + accessToken, + userId, + countdownRef, + setError, + setIsErrorAlertOpen +}) { + try { + await handleUserStatus(accessToken, userId) + + const versions = await directusClient.request( + withToken( + accessToken, + readContentVersions({ + sort: '-date_created' + }) + ) + ) + + return versions + } catch (error) { + console.log('error', error) + + if (error?.errors[0]?.message === 'Token expired.') { + countdownRef.current.startCountdown() + } else { + console.log(error?.errors[0]?.message) + setError(error?.errors[0]?.message) + setIsErrorAlertOpen(true) + } + } +} + export async function createVersion({ accessToken, userId, From bafbc9b8a3e673871886df8fe96dfd79c1a38b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Sun, 15 Sep 2024 18:02:30 +0400 Subject: [PATCH 3/7] Create ListVersions component --- components/versions/list-versions.js | 96 ++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 components/versions/list-versions.js diff --git a/components/versions/list-versions.js b/components/versions/list-versions.js new file mode 100644 index 0000000..21067f8 --- /dev/null +++ b/components/versions/list-versions.js @@ -0,0 +1,96 @@ + +import * as React from 'react' +import PropTypes from 'prop-types' +import Table from '@mui/material/Table' +import TableBody from '@mui/material/TableBody' +import TableCell from '@mui/material/TableCell' +import TableContainer from '@mui/material/TableContainer' +import TableHead from '@mui/material/TableHead' +import TableRow from '@mui/material/TableRow' +import Paper from '@mui/material/Paper' +import Button from '@mui/material/Button' +import {TableVirtuoso} from 'react-virtuoso' +import {Box, Typography} from '@mui/material' +import {formatDate} from '@/lib/format.js' + +const columns = [ + { + width: 200, + label: 'Version', + dataKey: 'name', + }, + { + width: 120, + label: 'Créée le', + dataKey: 'date_created', + numeric: true, + } +] + +const VirtuosoTableComponents = { + Scroller: React.forwardRef((props, ref) => ( + + )), + Table: props => ( + + ), + TableHead: React.forwardRef((props, ref) => ), + TableRow, + TableBody: React.forwardRef((props, ref) => ), +} + +function fixedHeaderContent() { + return ( + + {columns.map(column => ( + + {column.label} + + ))} + + ) +} + +function rowContent(_index, row) { + return ( + <> + {columns.map(column => ( + + {column.dataKey === 'date_created' ? formatDate(row[column.dataKey], 'Pp') : } + + ))} + + ) +} + +export default function ListVersions({collection, data}) { + return ( + + + {collection} + + + + + + ) +} + +ListVersions.propTypes = { + collection: PropTypes.oneOf(['titres', 'articles']).isRequired, + data: PropTypes.array.isRequired +} From 3cbca927c8ae9c5ce378588cada139bbb41707c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Sun, 15 Sep 2024 18:03:32 +0400 Subject: [PATCH 4/7] Create Loading component --- components/loading.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 components/loading.js diff --git a/components/loading.js b/components/loading.js new file mode 100644 index 0000000..54e3590 --- /dev/null +++ b/components/loading.js @@ -0,0 +1,15 @@ +import Box from '@mui/material/Box' +import CircularProgress from '@mui/material/CircularProgress' + +export function Loading() { + return ( + + + + ) +} From e1c46f53b95b8169430ed590b3b1786ec32c87bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Sun, 15 Sep 2024 18:02:57 +0400 Subject: [PATCH 5/7] Create GetVersions component --- components/versions/get-versions.js | 108 ++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 components/versions/get-versions.js diff --git a/components/versions/get-versions.js b/components/versions/get-versions.js new file mode 100644 index 0000000..da08d45 --- /dev/null +++ b/components/versions/get-versions.js @@ -0,0 +1,108 @@ +'use client' + +import {useState, useRef, useEffect} from 'react' +import PropTypes from 'prop-types' +import Grid from '@mui/material/Grid2' +import Typography from '@mui/material/Typography' +import Box from '@mui/material/Box' +import AuthAlert from '../auth-form/auth-alert.js' +import LogoutCountdown from '../session/logout-countdown.js' +import {Loading} from '../loading.js' +import ListVersions from './list-versions.js' +import {listVersions} from '@/lib/directus.js' + +export default function GetVersions({session}) { + const {accessToken, userId} = session.user + + const [versions, setVersions] = useState(null) + const [isErrorAlertOpen, setIsErrorAlertOpen] = useState(false) + const [error, setError] = useState('') + const countdownRef = useRef() + + useEffect(() => { + async function fetchVersions() { + const data = await listVersions({ + accessToken, userId, countdownRef, setError, setIsErrorAlertOpen + }) + setVersions(data) + } + + fetchVersions() + }, [accessToken, userId]) + + if (!versions) { + return ( + <> + {error && } + + + + ) + } + + const titres = versions?.filter(({collection}) => collection === 'titres') + const articles = versions?.filter(({collection}) => collection === 'articles') + + return ( + <> + {error && } + + + + + Liste des versions + + + 0 && articles.length === 0) || (articles.length > 0 && titres.length === 0) + ? 'center' + : 'flex-start' + } + > + {titres.length > 0 && ( + 0 ? 6 : 12}}> + + + )} + + {articles.length > 0 && ( + 0 ? 6 : 12}}> + + + )} + + + + + ) +} + +GetVersions.propTypes = { + session: PropTypes.object.isRequired +} From d23839b3e8e84499d126fb8af020a658459712db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Sun, 15 Sep 2024 18:04:04 +0400 Subject: [PATCH 6/7] Improve Sign component --- app/page.js | 10 +++++++++- components/session/sign.js | 12 ++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/page.js b/app/page.js index d0d50b3..4041ca6 100644 --- a/app/page.js +++ b/app/page.js @@ -2,6 +2,7 @@ import {createDirectus, rest, readItems} from '@directus/sdk' import Container from '@mui/material/Container' import Box from '@mui/material/Box' import Typography from '@mui/material/Typography' +import AdminPanelSettingsIcon from '@mui/icons-material/AdminPanelSettings' import {auth} from '../auth.js' import Konstitisyon from '@/components/konstitisyon/index.js' import Footer from '@/components/footer.js' @@ -11,6 +12,13 @@ import Create from '@/components/konstitisyon/create/index.js' const apiUrl = process.env.DIRECTUS_API_URL const appTitle = process.env.APP_TITLE +const navButton = { + title: 'Tableau de bord', + path: '/dashboard', + color: 'success', + icon: +} + async function getData() { if (!apiUrl) { throw new Error('DIRECTUS_API_URL is required') @@ -67,7 +75,7 @@ export default async function Page() { > {appTitle.toUpperCase()} - + {session && ( )} diff --git a/components/session/sign.js b/components/session/sign.js index d787fbe..d2a7a49 100644 --- a/components/session/sign.js +++ b/components/session/sign.js @@ -12,7 +12,6 @@ import Tooltip, {tooltipClasses} from '@mui/material/Tooltip' import LogoutIcon from '@mui/icons-material/Logout' import LoginIcon from '@mui/icons-material/Login' import PersonAddIcon from '@mui/icons-material/PersonAdd' -import AdminPanelSettingsIcon from '@mui/icons-material/AdminPanelSettings' import ConfirmationAlert from './confirmation-alert.js' const LightTooltip = styled(({className, ...props}) => ( @@ -26,7 +25,7 @@ const LightTooltip = styled(({className, ...props}) => ( }, })) -export default function Sign({session}) { +export default function Sign({session, navButton}) { const router = useRouter() const [isOpen, setIsOpen] = useState(false) @@ -45,9 +44,9 @@ export default function Sign({session}) { - - router.push('/dashboard')}> - + + router.push(navButton.path)}> + {navButton.icon} @@ -78,5 +77,6 @@ export default function Sign({session}) { } Sign.propTypes = { - session: PropTypes.object + session: PropTypes.object, + navButton: PropTypes.object.isRequired } From 039be335a2114973af02136bd9e7fcceedb70b1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Sun, 15 Sep 2024 18:04:54 +0400 Subject: [PATCH 7/7] Adapt Dashboard page --- app/dashboard/page.js | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/app/dashboard/page.js b/app/dashboard/page.js index b62fdce..1df65d8 100644 --- a/app/dashboard/page.js +++ b/app/dashboard/page.js @@ -1,5 +1,19 @@ import {redirect} from 'next/navigation' +import Box from '@mui/material/Box' +import Container from '@mui/material/Container' +import Typography from '@mui/material/Typography' +import HomeIcon from '@mui/icons-material/Home' import {auth} from '../../auth.js' +import GetVersions from '@/components/versions/get-versions.js' +import Footer from '@/components/footer.js' +import Sign from '@/components/session/sign.js' + +const navButton = { + title: 'Accueil', + path: '/', + color: 'success', + icon: +} export default async function DashboardPage() { const session = await auth() @@ -9,6 +23,26 @@ export default async function DashboardPage() { } return ( -
DashboardPage
+ + + + Tableau de bord + + + + +
+ ) }