feat: creation d'un FormRenderer.js pour creer un formulaire dynamique [NEWTS-17]

This commit is contained in:
Luc SORIGNET
2025-08-31 12:26:04 +02:00
parent 482e8c1357
commit 9481a0132d
47 changed files with 324 additions and 130 deletions

View File

@ -1,6 +1,6 @@
'use client';
import React, { useState, useEffect } from 'react';
import SelectChoice from '@/components/SelectChoice';
import SelectChoice from '@/components/Form/SelectChoice';
import AcademicResults from '@/components/Grades/AcademicResults';
import Attendance from '@/components/Grades/Attendance';
import Remarks from '@/components/Grades/Remarks';
@ -9,7 +9,7 @@ import Homeworks from '@/components/Grades/Homeworks';
import SpecificEvaluations from '@/components/Grades/SpecificEvaluations';
import Orientation from '@/components/Grades/Orientation';
import GradesStatsCircle from '@/components/Grades/GradesStatsCircle';
import Button from '@/components/Button';
import Button from '@/components/Form/Button';
import logger from '@/utils/logger';
import {
FE_ADMIN_GRADES_STUDENT_COMPETENCIES_URL,
@ -29,7 +29,7 @@ import { useClasses } from '@/context/ClassesContext';
import { Award, FileText } from 'lucide-react';
import SectionHeader from '@/components/SectionHeader';
import GradesDomainBarChart from '@/components/Grades/GradesDomainBarChart';
import InputText from '@/components/InputText';
import InputText from '@/components/Form/InputText';
import dayjs from 'dayjs';
import { useCsrfToken } from '@/context/CsrfContext';

View File

@ -2,7 +2,7 @@
import React, { useState, useEffect } from 'react';
import { useSearchParams, useRouter } from 'next/navigation';
import Button from '@/components/Button';
import Button from '@/components/Form/Button';
import GradeView from '@/components/Grades/GradeView';
import {
fetchStudentCompetencies,

View File

@ -2,8 +2,8 @@
import React, { useState, useEffect } from 'react';
import Tab from '@/components/Tab';
import TabContent from '@/components/TabContent';
import Button from '@/components/Button';
import InputText from '@/components/InputText';
import Button from '@/components/Form/Button';
import InputText from '@/components/Form/InputText';
import CheckBox from '@/components/CheckBox'; // Import du composant CheckBox
import logger from '@/utils/logger';
import {

View File

@ -8,8 +8,8 @@ import { fetchClasse } from '@/app/actions/schoolAction';
import { useSearchParams } from 'next/navigation';
import logger from '@/utils/logger';
import { useClasses } from '@/context/ClassesContext';
import Button from '@/components/Button';
import SelectChoice from '@/components/SelectChoice';
import Button from '@/components/Form/Button';
import SelectChoice from '@/components/Form/SelectChoice';
import CheckBox from '@/components/CheckBox';
import {
fetchAbsences,

View File

@ -2,17 +2,17 @@
import React, { useState, useRef, useEffect } from 'react';
import { User, Mail } from 'lucide-react';
import InputTextIcon from '@/components/InputTextIcon';
import ToggleSwitch from '@/components/ToggleSwitch';
import Button from '@/components/Button';
import InputTextIcon from '@/components/Form/InputTextIcon';
import ToggleSwitch from '@/components/Form/ToggleSwitch';
import Button from '@/components/Form/Button';
import Table from '@/components/Table';
import FeesSection from '@/components/Structure/Tarification/FeesSection';
import DiscountsSection from '@/components/Structure/Tarification/DiscountsSection';
import SectionTitle from '@/components/SectionTitle';
import InputPhone from '@/components/InputPhone';
import InputPhone from '@/components/Form/InputPhone';
import CheckBox from '@/components/CheckBox';
import RadioList from '@/components/RadioList';
import SelectChoice from '@/components/SelectChoice';
import RadioList from '@/components/Form/RadioList';
import SelectChoice from '@/components/Form/SelectChoice';
import Loader from '@/components/Loader';
import { getCurrentSchoolYear, getNextSchoolYear } from '@/utils/Date';
import logger from '@/utils/logger';

View File

@ -40,8 +40,8 @@ import {
import DjangoCSRFToken from '@/components/DjangoCSRFToken';
import { useCsrfToken } from '@/context/CsrfContext';
import logger from '@/utils/logger';
import { PhoneLabel } from '@/components/PhoneLabel';
import FileUpload from '@/components/FileUpload';
import { PhoneLabel } from '@/components/Form/PhoneLabel';
import FileUpload from '@/components/Form/FileUpload';
import FilesModal from '@/components/Inscription/FilesModal';
import { getCurrentSchoolYear, getNextSchoolYear } from '@/utils/Date';
@ -250,7 +250,12 @@ export default function Page({ params: { locale } }) {
}, 500); // Debounce la recherche
return () => clearTimeout(timeoutId);
}
}, [searchTerm, selectedEstablishmentId, currentSchoolYearPage, itemsPerPage]);
}, [
searchTerm,
selectedEstablishmentId,
currentSchoolYearPage,
itemsPerPage,
]);
/**
* UseEffect to update page count of tab

View File

@ -1,8 +1,9 @@
'use client';
import { useTranslations } from 'next-intl';
import React from 'react';
import Button from '@/components/Button';
import Button from '@/components/Form/Button';
import Logo from '@/components/Logo'; // Import du composant Logo
import FormRenderer from '@/components/Form/FormRenderer';
export default function Home() {
const t = useTranslations('homePage');
@ -13,6 +14,7 @@ export default function Home() {
<h1 className="text-4xl font-bold mb-4">{t('welcomeParents')}</h1>
<p className="text-lg mb-8">{t('pleaseLogin')}</p>
<Button text={t('loginButton')} primary href="/users/login" />
<FormRenderer />
</div>
);
}

View File

@ -11,7 +11,7 @@ import {
CalendarDays,
} from 'lucide-react';
import StatusLabel from '@/components/StatusLabel';
import FileUpload from '@/components/FileUpload';
import FileUpload from '@/components/Form/FileUpload';
import { FE_PARENTS_EDIT_SUBSCRIPTION_URL } from '@/utils/Url';
import {
fetchChildren,

View File

@ -1,7 +1,7 @@
'use client';
import React, { useState } from 'react';
import Button from '@/components/Button';
import InputText from '@/components/InputText';
import Button from '@/components/Form/Button';
import InputText from '@/components/Form/InputText';
import logger from '@/utils/logger';
import { useNotification } from '@/context/NotificationContext';

View File

@ -3,9 +3,9 @@ import React, { useState } from 'react';
import DjangoCSRFToken from '@/components/DjangoCSRFToken';
import Logo from '@/components/Logo';
import { useRouter } from 'next/navigation';
import InputTextIcon from '@/components/InputTextIcon';
import InputTextIcon from '@/components/Form/InputTextIcon';
import Loader from '@/components/Loader'; // Importez le composant Loader
import Button from '@/components/Button'; // Importez le composant Button
import Button from '@/components/Form/Button'; // Importez le composant Button
import { User, KeySquare } from 'lucide-react'; // Importez directement les icônes nécessaires
import { FE_USERS_NEW_PASSWORD_URL, getRedirectUrlFromRole } from '@/utils/Url';
import { login } from '@/app/actions/authAction';
@ -35,11 +35,7 @@ export default function Page() {
logger.debug('Sign In Result', result);
if (result.error) {
showNotification(
result.error,
'error',
'Erreur'
);
showNotification(result.error, 'error', 'Erreur');
setIsLoading(false);
} else {
// On initialise le contexte establishement avec la session
@ -50,11 +46,7 @@ export default function Page() {
if (url) {
router.push(url);
} else {
showNotification(
'Type de rôle non géré',
'error',
'Erreur'
);
showNotification('Type de rôle non géré', 'error', 'Erreur');
}
});
setIsLoading(false);

View File

@ -3,9 +3,9 @@
import React, { useState } from 'react';
import DjangoCSRFToken from '@/components/DjangoCSRFToken';
import Logo from '@/components/Logo';
import InputTextIcon from '@/components/InputTextIcon';
import InputTextIcon from '@/components/Form/InputTextIcon';
import Loader from '@/components/Loader';
import Button from '@/components/Button';
import Button from '@/components/Form/Button';
import { User } from 'lucide-react';
import { FE_USERS_LOGIN_URL } from '@/utils/Url';
import { useCsrfToken } from '@/context/CsrfContext';
@ -25,25 +25,13 @@ export default function Page() {
.then((data) => {
logger.debug('Success:', data);
if (data.message !== '') {
showNotification(
data.message,
'success',
'Succès'
);
showNotification(data.message, 'success', 'Succès');
router.push(`${FE_USERS_LOGIN_URL}`);
} else {
if (data.errorMessage) {
showNotification(
data.errorMessage,
'error',
'Erreur'
);
showNotification(data.errorMessage, 'error', 'Erreur');
} else if (data.errorFields) {
showNotification(
data.errorFields.email,
'error',
'Erreur'
);
showNotification(data.errorFields.email, 'error', 'Erreur');
}
}
setIsLoading(false);

View File

@ -5,9 +5,9 @@ import React, { useState, useEffect } from 'react';
import DjangoCSRFToken from '@/components/DjangoCSRFToken';
import Logo from '@/components/Logo';
import { useSearchParams, useRouter } from 'next/navigation';
import InputTextIcon from '@/components/InputTextIcon';
import InputTextIcon from '@/components/Form/InputTextIcon';
import Loader from '@/components/Loader';
import Button from '@/components/Button';
import Button from '@/components/Form/Button';
import { FE_USERS_LOGIN_URL } from '@/utils/Url';
import { KeySquare } from 'lucide-react';
import { useCsrfToken } from '@/context/CsrfContext';
@ -33,21 +33,12 @@ export default function Page() {
resetPassword(uuid, data, csrfToken)
.then((data) => {
if (data.message !== '') {
logger.debug('Success:', data);
showNotification(
data.message,
'success',
'Succès'
);
showNotification(data.message, 'success', 'Succès');
router.push(`${FE_USERS_LOGIN_URL}`);
} else {
if (data.errorMessage) {
showNotification(
data.errorMessage,
'error',
'Erreur'
);
showNotification(data.errorMessage, 'error', 'Erreur');
} else if (data.errorFields) {
showNotification(
data.errorFields.password1 || data.errorFields.password2,

View File

@ -4,9 +4,9 @@ import React, { useState, useEffect } from 'react';
import DjangoCSRFToken from '@/components/DjangoCSRFToken';
import Logo from '@/components/Logo';
import { useSearchParams, useRouter } from 'next/navigation';
import InputTextIcon from '@/components/InputTextIcon';
import InputTextIcon from '@/components/Form/InputTextIcon';
import Loader from '@/components/Loader';
import Button from '@/components/Button';
import Button from '@/components/Form/Button';
import { User, KeySquare } from 'lucide-react';
import { FE_USERS_LOGIN_URL } from '@/utils/Url';
import { useCsrfToken } from '@/context/CsrfContext';
@ -36,22 +36,16 @@ export default function Page() {
.then((data) => {
logger.debug('Success:', data);
if (data.message !== '') {
showNotification(
data.message,
'success',
'Succès'
);
showNotification(data.message, 'success', 'Succès');
router.push(`${FE_USERS_LOGIN_URL}`);
} else {
if (data.errorMessage) {
showNotification(
data.errorMessage,
'error',
'Erreur'
);
showNotification(data.errorMessage, 'error', 'Erreur');
} else if (data.errorFields) {
showNotification(
data.errorFields.email || data.errorFields.password1 || data.errorFields.password2,
data.errorFields.email ||
data.errorFields.password1 ||
data.errorFields.password2,
'error',
'Erreur'
);