From 2888f8dcce8d593df8f81a635eaac94af4603829 Mon Sep 17 00:00:00 2001 From: N3WT DE COMPET Date: Sat, 17 May 2025 14:35:33 +0200 Subject: [PATCH] feat: gestion des no data dans les table [#33] --- Front-End/.babelrc | 2 +- Front-End/package.json | 2 +- .../src/app/[locale]/admin/directory/page.js | 23 ++++- .../src/app/[locale]/admin/structure/page.js | 99 ++++++++++--------- .../app/[locale]/admin/subscriptions/page.js | 35 ++++++- .../components/Inscription/FilesToUpload.js | 5 +- .../Structure/Configuration/ClassesSection.js | 8 ++ .../Configuration/SpecialitiesSection.js | 8 ++ .../Configuration/TeachersSection.js | 8 ++ .../Structure/Files/FilesGroupsManagement.js | 25 ++++- .../Structure/Files/ParentFilesSection.js | 18 +++- .../Tarification/DiscountsSection.js | 21 ++++ .../Structure/Tarification/FeesSection.js | 22 ++++- Front-End/src/components/Table.js | 85 ++++++++-------- 14 files changed, 258 insertions(+), 103 deletions(-) diff --git a/Front-End/.babelrc b/Front-End/.babelrc index b56ad8d..9fcef03 100644 --- a/Front-End/.babelrc +++ b/Front-End/.babelrc @@ -1,4 +1,4 @@ { "presets": ["next/babel"], "plugins": [] -} \ No newline at end of file +} diff --git a/Front-End/package.json b/Front-End/package.json index f4d16df..15a8fdc 100644 --- a/Front-End/package.json +++ b/Front-End/package.json @@ -41,4 +41,4 @@ "postcss": "^8.4.47", "tailwindcss": "^3.4.14" } -} \ No newline at end of file +} diff --git a/Front-End/src/app/[locale]/admin/directory/page.js b/Front-End/src/app/[locale]/admin/directory/page.js index 49bac3e..935e1d9 100644 --- a/Front-End/src/app/[locale]/admin/directory/page.js +++ b/Front-End/src/app/[locale]/admin/directory/page.js @@ -17,6 +17,7 @@ import { dissociateGuardian } from '@/app/actions/subscriptionAction'; import { useCsrfToken } from '@/context/CsrfContext'; import DjangoCSRFToken from '@/components/DjangoCSRFToken'; import logger from '@/utils/logger'; +import AlertMessage from '@/components/AlertMessage'; const roleTypeToLabel = (roleType) => { switch (roleType) { @@ -191,7 +192,7 @@ export default function Page() { setProfileRolesParent(profilesRoles); } const calculatedTotalPages = - count === 0 ? 1 : Math.ceil(count / page_size); + count === 0 ? count : Math.ceil(count / page_size); setTotalProfilesParent(count); setTotalProfilesParentPages(calculatedTotalPages); } @@ -204,7 +205,7 @@ export default function Page() { setProfileRolesSchool(profilesRoles); } const calculatedTotalPages = - count === 0 ? 1 : Math.ceil(count / page_size); + count === 0 ? count : Math.ceil(count / page_size); setTotalProfilesSchool(count); setTotalProfilesSchoolPages(calculatedTotalPages); } @@ -505,7 +506,7 @@ export default function Page() { id: 'parent', label: 'Parents', content: ( -
+
+ } /> ), @@ -522,7 +530,7 @@ export default function Page() { id: 'school', label: 'École', content: ( -
+
+ } /> ), diff --git a/Front-End/src/app/[locale]/admin/structure/page.js b/Front-End/src/app/[locale]/admin/structure/page.js index ab9c7e5..99fd0c3 100644 --- a/Front-End/src/app/[locale]/admin/structure/page.js +++ b/Front-End/src/app/[locale]/admin/structure/page.js @@ -14,7 +14,6 @@ import { fetchSpecialities, fetchTeachers, fetchClasses, - fetchSchedules, fetchRegistrationDiscounts, fetchTuitionDiscounts, fetchRegistrationFees, @@ -267,69 +266,77 @@ export default function Page() { id: 'Configuration', label: 'Classes', content: ( - +
+ +
), }, { id: 'Schedule', label: 'Emploi du temps', content: ( - - - +
+ + + +
), }, { id: 'Fees', label: 'Tarifs', content: ( - +
+ +
), }, { id: 'Files', label: 'Documents', content: ( - +
+ +
), }, ]; diff --git a/Front-End/src/app/[locale]/admin/subscriptions/page.js b/Front-End/src/app/[locale]/admin/subscriptions/page.js index b19e511..15a0e88 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/page.js @@ -51,6 +51,7 @@ import { NEXT_YEAR_FILTER, HISTORICAL_FILTER, } from '@/utils/constants'; +import AlertMessage from '@/components/AlertMessage'; export default function Page({ params: { locale } }) { const t = useTranslations('subscriptions'); @@ -136,7 +137,7 @@ export default function Page({ params: { locale } }) { setRegistrationFormsDataCurrentYear(registerForms); } const calculatedTotalPages = - count === 0 ? 1 : Math.ceil(count / page_size); + count === 0 ? count : Math.ceil(count / page_size); setTotalCurrentYear(count); setTotalCurrentSchoolYearPages(calculatedTotalPages); } @@ -156,7 +157,7 @@ export default function Page({ params: { locale } }) { setRegistrationFormsDataNextYear(registerForms); } const calculatedTotalPages = - count === 0 ? 1 : Math.ceil(count / page_size); + count === 0 ? count : Math.ceil(count / page_size); setTotalNextYear(count); setTotalNextSchoolYearPages(calculatedTotalPages); } @@ -177,7 +178,7 @@ export default function Page({ params: { locale } }) { } const calculatedTotalPages = - count === 0 ? 1 : Math.ceil(count / page_size); + count === 0 ? count : Math.ceil(count / page_size); setTotalHistorical(count); setTotalHistoricalPages(calculatedTotalPages); } @@ -692,6 +693,33 @@ export default function Page({ params: { locale } }) { }, ]; + let emptyMessage; + if (activeTab === CURRENT_YEAR_FILTER) { + emptyMessage = ( + + ); + } else if (activeTab === NEXT_YEAR_FILTER) { + emptyMessage = ( + + ); + } else if (activeTab === HISTORICAL_FILTER) { + emptyMessage = ( + + ); + } + if (isLoading) { return ; } @@ -802,6 +830,7 @@ export default function Page({ params: { locale } }) { : totalHistoricalPages } onPageChange={handlePageChange} + emptyMessage={emptyMessage} /> diff --git a/Front-End/src/components/Inscription/FilesToUpload.js b/Front-End/src/components/Inscription/FilesToUpload.js index 2f7f936..e148e8b 100644 --- a/Front-End/src/components/Inscription/FilesToUpload.js +++ b/Front-End/src/components/Inscription/FilesToUpload.js @@ -81,7 +81,7 @@ export default function FilesToUpload({ }, { name: 'Priorité', - transform: (row) => ( + transform: (row) => row.is_required ? ( @@ -94,8 +94,7 @@ export default function FilesToUpload({ Optionnel - ) - ), + ), }, { name: 'Statut', diff --git a/Front-End/src/components/Structure/Configuration/ClassesSection.js b/Front-End/src/components/Structure/Configuration/ClassesSection.js index 3675060..ea7e07b 100644 --- a/Front-End/src/components/Structure/Configuration/ClassesSection.js +++ b/Front-End/src/components/Structure/Configuration/ClassesSection.js @@ -16,6 +16,7 @@ import { FE_ADMIN_STRUCTURE_SCHOOLCLASS_MANAGEMENT_URL } from '@/utils/Url'; import { usePlanning } from '@/context/PlanningContext'; import { useClasses } from '@/context/ClassesContext'; import { useRouter } from 'next/navigation'; +import AlertMessage from '@/components/AlertMessage'; const ItemTypes = { TEACHER: 'teacher', @@ -544,6 +545,13 @@ const ClassesSection = ({ data={newClass ? [newClass, ...classes] : classes} columns={columns} renderCell={renderClassCell} + emptyMessage={ + + } /> + } /> + } /> setIsGroupModalOpen(true)} /> -
+
+ } + /> {/* Section Fichiers */} @@ -558,7 +569,17 @@ export default function FilesGroupsManagement({ setIsEditing(false); }} /> -
+
+ } + /> {/* Section Pièces à fournir */} diff --git a/Front-End/src/components/Structure/Files/ParentFilesSection.js b/Front-End/src/components/Structure/Files/ParentFilesSection.js index bda01a3..200af8b 100644 --- a/Front-End/src/components/Structure/Files/ParentFilesSection.js +++ b/Front-End/src/components/Structure/Files/ParentFilesSection.js @@ -10,6 +10,7 @@ import { useCsrfToken } from '@/context/CsrfContext'; import SectionHeader from '@/components/SectionHeader'; import ToggleSwitch from '@/components/ToggleSwitch'; import { useNotification } from '@/context/NotificationContext'; +import AlertMessage from '@/components/AlertMessage'; export default function ParentFilesSection({ parentFiles, @@ -49,7 +50,7 @@ export default function ParentFilesSection({ const handleSaveDocument = () => { if (!formData.name) { showNotification( - 'Veuillez saisir un nom de document pour valider l\'opération', + "Veuillez saisir un nom de document pour valider l'opération", 'error', 'Erreur' ); @@ -57,7 +58,7 @@ export default function ParentFilesSection({ } if (selectedGroups.length === 0) { showNotification( - 'Veuillez sélectionner au moins un dossier d\'inscription pour valider l\'opération', + "Veuillez sélectionner au moins un dossier d'inscription pour valider l'opération", 'error', 'Erreur' ); @@ -267,7 +268,11 @@ export default function ParentFilesSection({ setRemovePopupOnConfirm(() => () => { handleRemoveDocument(document.id) .then(() => { - showNotification('Le document "${document.name}" a été correctement supprimé.', 'success', 'Succès'); + showNotification( + 'Le document "${document.name}" a été correctement supprimé.', + 'success', + 'Succès' + ); setRemovePopupVisible(false); }) .catch((error) => { @@ -334,6 +339,13 @@ export default function ParentFilesSection({ editingDocumentId === 'new' ? [formData, ...parentFiles] : parentFiles } columns={columnsRequiredDocuments} + emptyMessage={ + + } /> + ); + } else { + emptyMessage = ( + + ); + } + return (
{!subscriptionMode && ( @@ -361,6 +381,7 @@ const DiscountsSection = ({ columns={columns} renderCell={renderDiscountCell} defaultTheme="bg-yellow-50" + emptyMessage={emptyMessage} /> + ); + } else { + emptyMessage = ( + + ); + } + return (
{!subscriptionMode && ( @@ -332,6 +351,7 @@ const FeesSection = ({ data={newFee ? [newFee, ...fees] : fees} columns={columns} renderCell={renderFeeCell} + emptyMessage={emptyMessage} /> { const handlePageChange = (newPage) => { onPageChange(newPage); @@ -35,49 +36,55 @@ const Table = ({
- {data?.map((row, rowIndex) => ( - { - if (isSelectable && onRowClick) { - if (selectedRows?.includes(row.id)) { - onRowClick({ deselected: true, row }); - } else { - onRowClick(row); - } - } - }} - > - {columns.map((column, colIndex) => ( - - {renderCell - ? renderCell(row, column.name) - : column.transform(row)} - - ))} + ? 'bg-emerald-200 text-white' + : rowIndex % 2 === 0 + ? `${defaultTheme}` + : 'bg-stone-50' + } + ${isSelectable ? 'hover:bg-emerald-100' : ''} + `} + onClick={() => { + if (isSelectable && onRowClick) { + if (selectedRows?.includes(row.id)) { + onRowClick({ deselected: true, row }); + } else { + onRowClick(row); + } + } + }} + > + {columns.map((column, colIndex) => ( + + ))} + + )) + ) : ( + + - ))} + )}
0 ? ( + data.map((row, rowIndex) => ( +
+ {renderCell + ? renderCell(row, column.name) + : column.transform(row)} +
{emptyMessage}
- {itemsPerPage > 0 && ( + {itemsPerPage > 0 && data && data.length > 0 && (