chore: Initial Commit

feat: Gestion des inscriptions [#1]
feat(frontend): Création des vues pour le paramétrage de l'école [#2]
feat: Gestion du login [#6]
fix: Correction lors de la migration des modèle [#8]
feat: Révision du menu principal [#9]
feat: Ajout d'un footer [#10]
feat: Création des dockers compose pour les environnements de
développement et de production [#12]
doc(ci): Mise en place de Husky et d'un suivi de version automatique [#14]
This commit is contained in:
Luc SORIGNET
2024-11-18 10:02:58 +01:00
committed by N3WT DE COMPET
commit af0cd1c840
228 changed files with 22694 additions and 0 deletions

View File

@ -0,0 +1,181 @@
import React, { useState, useEffect } from 'react';
import InputText from '@/components/InputText';
import SelectChoice from '@/components/SelectChoice';
import ResponsableInputFields from '@/components/Inscription/ResponsableInputFields';
import Loader from '@/components/Loader';
import Button from '@/components/Button';
import DjangoCSRFToken from '@/components/DjangoCSRFToken';
const niveaux = [
{ value:'1', label: 'TPS - Très Petite Section'},
{ value:'2', label: 'PS - Petite Section'},
{ value:'3', label: 'MS - Moyenne Section'},
{ value:'4', label: 'GS - Grande Section'},
];
export default function InscriptionFormShared({
initialData,
csrfToken,
onSubmit,
cancelUrl,
isLoading = false
}) {
const [formData, setFormData] = useState(() => ({
id: initialData?.id || '',
nom: initialData?.nom || '',
prenom: initialData?.prenom || '',
adresse: initialData?.adresse || '',
dateNaissance: initialData?.dateNaissance || '',
lieuNaissance: initialData?.lieuNaissance || '',
codePostalNaissance: initialData?.codePostalNaissance || '',
nationalite: initialData?.nationalite || '',
medecinTraitant: initialData?.medecinTraitant || '',
niveau: initialData?.niveau || ''
}));
const [responsables, setReponsables] = useState(() =>
initialData?.responsables || []
);
// Mettre à jour les données quand initialData change
useEffect(() => {
if (initialData) {
setFormData({
id: initialData.id || '',
nom: initialData.nom || '',
prenom: initialData.prenom || '',
adresse: initialData.adresse || '',
dateNaissance: initialData.dateNaissance || '',
lieuNaissance: initialData.lieuNaissance || '',
codePostalNaissance: initialData.codePostalNaissance || '',
nationalite: initialData.nationalite || '',
medecinTraitant: initialData.medecinTraitant || '',
niveau: initialData.niveau || ''
});
setReponsables(initialData.responsables || []);
}
}, [initialData]);
const updateFormField = (field, value) => {
setFormData(prev => ({...prev, [field]: value}));
};
const handleSubmit = (e) => {
e.preventDefault();
onSubmit({
eleve: {
...formData,
responsables
}
});
};
if (isLoading) return <Loader />;
return (
<div className="max-w-4xl mx-auto p-6">
<form onSubmit={handleSubmit} className="space-y-8">
<DjangoCSRFToken csrfToken={csrfToken}/>
{/* Section Élève */}
<div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
<h2 className="text-xl font-bold mb-4 text-gray-800">Informations de l'élève</h2>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<InputText
name="nom"
label="Nom"
value={formData.nom}
onChange={(e) => updateFormField('nom', e.target.value)}
required
/>
<InputText
name="prenom"
label="Prénom"
value={formData.prenom}
onChange={(e) => updateFormField('prenom', e.target.value)}
required
/>
<InputText
name="nationalite"
label="Nationalité"
value={formData.nationalite}
onChange={(e) => updateFormField('nationalite', e.target.value)}
/>
<InputText
name="dateNaissance"
type="date"
label="Date de Naissance"
value={formData.dateNaissance}
onChange={(e) => updateFormField('dateNaissance', e.target.value)}
required
/>
<InputText
name="lieuNaissance"
label="Lieu de Naissance"
value={formData.lieuNaissance}
onChange={(e) => updateFormField('lieuNaissance', e.target.value)}
/>
<InputText
name="codePostalNaissance"
label="Code Postal de Naissance"
value={formData.codePostalNaissance}
onChange={(e) => updateFormField('codePostalNaissance', e.target.value)}
/>
<div className="md:col-span-2">
<InputText
name="adresse"
label="Adresse"
value={formData.adresse}
onChange={(e) => updateFormField('adresse', e.target.value)}
/>
</div>
<InputText
name="medecinTraitant"
label="Médecin Traitant"
value={formData.medecinTraitant}
onChange={(e) => updateFormField('medecinTraitant', e.target.value)}
/>
<SelectChoice
name="niveau"
label="Niveau"
selected={formData.niveau}
callback={(e) => updateFormField('niveau', e.target.value)}
choices={niveaux}
required
/>
</div>
</div>
{/* Section Responsables */}
<div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
<h2 className="text-xl font-bold mb-4 text-gray-800">Responsables</h2>
<ResponsableInputFields
responsables={responsables}
onResponsablesChange={(id, field, value) => {
const updatedResponsables = responsables.map(resp =>
resp.id === id ? { ...resp, [field]: value } : resp
);
setReponsables(updatedResponsables);
}}
addResponsible={(e) => {
e.preventDefault();
setReponsables([...responsables, { id: Date.now() }]);
}}
deleteResponsable={(index) => {
const newArray = [...responsables];
newArray.splice(index, 1);
setReponsables(newArray);
}}
/>
</div>
{/* Boutons de contrôle */}
<div className="flex justify-end space-x-4">
<Button href={cancelUrl} text="Annuler" />
<Button type="submit" text="Valider" primary />
</div>
</form>
</div>
);
}