mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-29 07:53:23 +00:00
fix: gestion des codes retours
This commit is contained in:
@ -77,8 +77,7 @@ class ProfileView(APIView):
|
|||||||
|
|
||||||
return JsonResponse(profil_serializer.data, safe=False)
|
return JsonResponse(profil_serializer.data, safe=False)
|
||||||
|
|
||||||
|
return JsonResponse(profil_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
|
||||||
return JsonResponse(profil_serializer.errors, safe=False)
|
|
||||||
|
|
||||||
def put(self, request, _id):
|
def put(self, request, _id):
|
||||||
data=JSONParser().parse(request)
|
data=JSONParser().parse(request)
|
||||||
@ -88,7 +87,7 @@ class ProfileView(APIView):
|
|||||||
profil_serializer.save()
|
profil_serializer.save()
|
||||||
return JsonResponse("Updated Successfully", safe=False)
|
return JsonResponse("Updated Successfully", safe=False)
|
||||||
|
|
||||||
return JsonResponse(profil_serializer.errors, safe=False)
|
return JsonResponse(profil_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
def delete(self, request, _id):
|
def delete(self, request, _id):
|
||||||
return bdd.delete_object(Profile, _id)
|
return bdd.delete_object(Profile, _id)
|
||||||
|
|||||||
@ -6,7 +6,17 @@ import FeesManagement from '@/components/Structure/Tarification/FeesManagement';
|
|||||||
import DjangoCSRFToken from '@/components/DjangoCSRFToken';
|
import DjangoCSRFToken from '@/components/DjangoCSRFToken';
|
||||||
import useCsrfToken from '@/hooks/useCsrfToken';
|
import useCsrfToken from '@/hooks/useCsrfToken';
|
||||||
import { ClassesProvider } from '@/context/ClassesContext';
|
import { ClassesProvider } from '@/context/ClassesContext';
|
||||||
import { fetchSpecialities, fetchTeachers, fetchClasses, fetchSchedules, fetchRegistrationDiscounts, fetchTuitionDiscounts, fetchRegistrationFees, fetchTuitionFees } from '@/app/lib/schoolAction';
|
import { createDatas,
|
||||||
|
updateDatas,
|
||||||
|
removeDatas,
|
||||||
|
fetchSpecialities,
|
||||||
|
fetchTeachers,
|
||||||
|
fetchClasses,
|
||||||
|
fetchSchedules,
|
||||||
|
fetchRegistrationDiscounts,
|
||||||
|
fetchTuitionDiscounts,
|
||||||
|
fetchRegistrationFees,
|
||||||
|
fetchTuitionFees } from '@/app/lib/schoolAction';
|
||||||
import SidebarTabs from '@/components/SidebarTabs';
|
import SidebarTabs from '@/components/SidebarTabs';
|
||||||
|
|
||||||
export default function Page() {
|
export default function Page() {
|
||||||
@ -111,23 +121,7 @@ export default function Page() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleCreate = (url, newData, setDatas) => {
|
const handleCreate = (url, newData, setDatas) => {
|
||||||
return fetch(url, {
|
return createDatas(url, newData, csrfToken)
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'X-CSRFToken': csrfToken
|
|
||||||
},
|
|
||||||
body: JSON.stringify(newData),
|
|
||||||
credentials: 'include'
|
|
||||||
})
|
|
||||||
.then(response => {
|
|
||||||
if (!response.ok) {
|
|
||||||
return response.json().then(errorData => {
|
|
||||||
throw errorData;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return response.json();
|
|
||||||
})
|
|
||||||
.then(data => {
|
.then(data => {
|
||||||
setDatas(prevState => [...prevState, data]);
|
setDatas(prevState => [...prevState, data]);
|
||||||
return data;
|
return data;
|
||||||
@ -139,23 +133,7 @@ export default function Page() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleEdit = (url, id, updatedData, setDatas) => {
|
const handleEdit = (url, id, updatedData, setDatas) => {
|
||||||
return fetch(`${url}/${id}`, {
|
return updateDatas(url, id, updatedData, csrfToken)
|
||||||
method: 'PUT',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'X-CSRFToken': csrfToken
|
|
||||||
},
|
|
||||||
body: JSON.stringify(updatedData),
|
|
||||||
credentials: 'include'
|
|
||||||
})
|
|
||||||
.then(response => {
|
|
||||||
if (!response.ok) {
|
|
||||||
return response.json().then(errorData => {
|
|
||||||
throw errorData;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return response.json();
|
|
||||||
})
|
|
||||||
.then(data => {
|
.then(data => {
|
||||||
setDatas(prevState => prevState.map(item => item.id === id ? data : item));
|
setDatas(prevState => prevState.map(item => item.id === id ? data : item));
|
||||||
return data;
|
return data;
|
||||||
@ -167,22 +145,7 @@ export default function Page() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleDelete = (url, id, setDatas) => {
|
const handleDelete = (url, id, setDatas) => {
|
||||||
return fetch(`${url}/${id}`, {
|
return removeDatas(url, id, csrfToken)
|
||||||
method: 'DELETE',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'X-CSRFToken': csrfToken
|
|
||||||
},
|
|
||||||
credentials: 'include'
|
|
||||||
})
|
|
||||||
.then(response => {
|
|
||||||
if (!response.ok) {
|
|
||||||
return response.json().then(errorData => {
|
|
||||||
throw errorData;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return response.json();
|
|
||||||
})
|
|
||||||
.then(data => {
|
.then(data => {
|
||||||
setDatas(prevState => prevState.filter(item => item.id !== id));
|
setDatas(prevState => prevState.filter(item => item.id !== id));
|
||||||
return data;
|
return data;
|
||||||
|
|||||||
@ -58,4 +58,42 @@ export const fetchRegistrationFees = () => {
|
|||||||
export const fetchTuitionFees = () => {
|
export const fetchTuitionFees = () => {
|
||||||
return fetch(`${BE_SCHOOL_FEES_URL}/tuition`)
|
return fetch(`${BE_SCHOOL_FEES_URL}/tuition`)
|
||||||
.then(requestResponseHandler)
|
.then(requestResponseHandler)
|
||||||
|
};
|
||||||
|
|
||||||
|
export const createDatas = (url, newData, csrfToken) => {
|
||||||
|
return fetch(url, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRFToken': csrfToken
|
||||||
|
},
|
||||||
|
body: JSON.stringify(newData),
|
||||||
|
credentials: 'include'
|
||||||
|
})
|
||||||
|
.then(requestResponseHandler)
|
||||||
|
};
|
||||||
|
|
||||||
|
export const updateDatas = (url, id, updatedData, csrfToken) => {
|
||||||
|
return fetch(`${url}/${id}`, {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRFToken': csrfToken
|
||||||
|
},
|
||||||
|
body: JSON.stringify(updatedData),
|
||||||
|
credentials: 'include'
|
||||||
|
})
|
||||||
|
.then(requestResponseHandler)
|
||||||
|
};
|
||||||
|
|
||||||
|
export const removeDatas = (url, id, csrfToken) => {
|
||||||
|
return fetch(`${url}/${id}`, {
|
||||||
|
method: 'DELETE',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRFToken': csrfToken
|
||||||
|
},
|
||||||
|
credentials: 'include'
|
||||||
|
})
|
||||||
|
.then(requestResponseHandler)
|
||||||
};
|
};
|
||||||
@ -139,6 +139,11 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
|
|||||||
return choices;
|
return choices;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Récupération des messages d'erreur
|
||||||
|
const getError = (field) => {
|
||||||
|
return localErrors?.[field]?.[0];
|
||||||
|
};
|
||||||
|
|
||||||
const handleAddClass = () => {
|
const handleAddClass = () => {
|
||||||
setNewClass({ id: Date.now(), atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [] });
|
setNewClass({ id: Date.now(), atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [] });
|
||||||
setFormData({ atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [] });
|
setFormData({ atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [] });
|
||||||
@ -169,7 +174,11 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
|
|||||||
setLocalErrors({});
|
setLocalErrors({});
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
console.error(error);
|
console.error('Error:', error.message);
|
||||||
|
if (error.details) {
|
||||||
|
console.error('Form errors:', error.details);
|
||||||
|
setLocalErrors(error.details);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
setPopupMessage("Tous les champs doivent être remplis et valides");
|
setPopupMessage("Tous les champs doivent être remplis et valides");
|
||||||
@ -187,7 +196,11 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
|
|||||||
setLocalErrors({});
|
setLocalErrors({});
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
console.error(error);
|
console.error('Error:', error.message);
|
||||||
|
if (error.details) {
|
||||||
|
console.error('Form errors:', error.details);
|
||||||
|
setLocalErrors(error.details);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
setPopupMessage("Tous les champs doivent être remplis et valides");
|
setPopupMessage("Tous les champs doivent être remplis et valides");
|
||||||
@ -247,7 +260,7 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
|
|||||||
value={currentData.atmosphere_name}
|
value={currentData.atmosphere_name}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
placeholder="Nom d'ambiance"
|
placeholder="Nom d'ambiance"
|
||||||
errorMsg={localErrors && localErrors.atmosphere_name && Array.isArray(localErrors.atmosphere_name) ? localErrors.atmosphere_name[0] : ''}
|
errorMsg={getError('atmosphere_name')}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case 'TRANCHE D\'AGE':
|
case 'TRANCHE D\'AGE':
|
||||||
@ -257,7 +270,7 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
|
|||||||
value={currentData.age_range}
|
value={currentData.age_range}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
placeholder="Tranche d'âge (ex: 3-6)"
|
placeholder="Tranche d'âge (ex: 3-6)"
|
||||||
errorMsg={localErrors && localErrors.age_range && Array.isArray(localErrors.age_range) ? localErrors.age_range[0] : ''}
|
errorMsg={getError('age_range')}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
case 'NIVEAUX':
|
case 'NIVEAUX':
|
||||||
@ -267,7 +280,7 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
|
|||||||
options={allNiveaux}
|
options={allNiveaux}
|
||||||
selectedOptions={currentData.levels ? currentData.levels.map(levelId => allNiveaux.find(level => level.id === levelId)) : []}
|
selectedOptions={currentData.levels ? currentData.levels.map(levelId => allNiveaux.find(level => level.id === levelId)) : []}
|
||||||
onChange={handleMultiSelectChange}
|
onChange={handleMultiSelectChange}
|
||||||
errorMsg={localErrors && localErrors.levels && Array.isArray(localErrors.levels) ? localErrors.levels[0] : ''}
|
errorMsg={getError('levels')}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case 'CAPACITE':
|
case 'CAPACITE':
|
||||||
@ -278,7 +291,7 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
|
|||||||
value={currentData.number_of_students}
|
value={currentData.number_of_students}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
placeholder="Capacité"
|
placeholder="Capacité"
|
||||||
errorMsg={localErrors && localErrors.number_of_students && Array.isArray(localErrors.number_of_students) ? localErrors.number_of_students[0] : ''}
|
errorMsg={getError('number_of_students')}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
case 'ANNÉE SCOLAIRE' :
|
case 'ANNÉE SCOLAIRE' :
|
||||||
@ -290,7 +303,7 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
|
|||||||
choices={getSchoolYearChoices()}
|
choices={getSchoolYearChoices()}
|
||||||
callback={handleChange}
|
callback={handleChange}
|
||||||
selected={currentData.school_year || ''}
|
selected={currentData.school_year || ''}
|
||||||
errorMsg={localErrors && localErrors.school_year && Array.isArray(localErrors.school_year) ? localErrors.school_year[0] : ''}
|
errorMsg={getError('school_year')}
|
||||||
IconItem={null}
|
IconItem={null}
|
||||||
disabled={false}
|
disabled={false}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -16,6 +16,11 @@ const SpecialitiesSection = ({ specialities, setSpecialities, handleCreate, hand
|
|||||||
const [popupVisible, setPopupVisible] = useState(false);
|
const [popupVisible, setPopupVisible] = useState(false);
|
||||||
const [popupMessage, setPopupMessage] = useState("");
|
const [popupMessage, setPopupMessage] = useState("");
|
||||||
|
|
||||||
|
// Récupération des messages d'erreur
|
||||||
|
const getError = (field) => {
|
||||||
|
return localErrors?.[field]?.[0];
|
||||||
|
};
|
||||||
|
|
||||||
const handleAddSpeciality = () => {
|
const handleAddSpeciality = () => {
|
||||||
setNewSpeciality({ id: Date.now(), name: '', color_code: '' });
|
setNewSpeciality({ id: Date.now(), name: '', color_code: '' });
|
||||||
};
|
};
|
||||||
@ -39,11 +44,11 @@ const SpecialitiesSection = ({ specialities, setSpecialities, handleCreate, hand
|
|||||||
setNewSpeciality(null);
|
setNewSpeciality(null);
|
||||||
setLocalErrors({});
|
setLocalErrors({});
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch((error) => {
|
||||||
if (error && typeof error === 'object') {
|
console.error('Error:', error.message);
|
||||||
setLocalErrors(error);
|
if (error.details) {
|
||||||
} else {
|
console.error('Form errors:', error.details);
|
||||||
console.error(error);
|
setLocalErrors(error.details);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@ -61,11 +66,11 @@ const SpecialitiesSection = ({ specialities, setSpecialities, handleCreate, hand
|
|||||||
setEditingSpeciality(null);
|
setEditingSpeciality(null);
|
||||||
setLocalErrors({});
|
setLocalErrors({});
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch((error) => {
|
||||||
if (error && typeof error === 'object') {
|
console.error('Error:', error.message);
|
||||||
setLocalErrors(error);
|
if (error.details) {
|
||||||
} else {
|
console.error('Form errors:', error.details);
|
||||||
console.error(error);
|
setLocalErrors(error.details);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@ -111,7 +116,7 @@ const SpecialitiesSection = ({ specialities, setSpecialities, handleCreate, hand
|
|||||||
onTextChange={handleChange}
|
onTextChange={handleChange}
|
||||||
onColorChange={handleChange}
|
onColorChange={handleChange}
|
||||||
placeholder="Nom de la spécialité"
|
placeholder="Nom de la spécialité"
|
||||||
errorMsg={localErrors && localErrors.name && Array.isArray(localErrors.name) ? localErrors.name[0] : ''}
|
errorMsg={getError('name')}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case 'ACTIONS':
|
case 'ACTIONS':
|
||||||
|
|||||||
@ -98,6 +98,11 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
|
|||||||
const [popupVisible, setPopupVisible] = useState(false);
|
const [popupVisible, setPopupVisible] = useState(false);
|
||||||
const [popupMessage, setPopupMessage] = useState("");
|
const [popupMessage, setPopupMessage] = useState("");
|
||||||
|
|
||||||
|
// Récupération des messages d'erreur
|
||||||
|
const getError = (field) => {
|
||||||
|
return localErrors?.[field]?.[0];
|
||||||
|
};
|
||||||
|
|
||||||
const handleAddTeacher = () => {
|
const handleAddTeacher = () => {
|
||||||
setNewTeacher({ id: Date.now(), last_name: '', first_name: '', email: '', specialities: [], droit: 0 });
|
setNewTeacher({ id: Date.now(), last_name: '', first_name: '', email: '', specialities: [], droit: 0 });
|
||||||
setFormData({ last_name: '', first_name: '', email: '', specialities: [], droit: 0 });
|
setFormData({ last_name: '', first_name: '', email: '', specialities: [], droit: 0 });
|
||||||
@ -133,14 +138,22 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
|
|||||||
setTeachers([createdTeacher, ...teachers]);
|
setTeachers([createdTeacher, ...teachers]);
|
||||||
setNewTeacher(null);
|
setNewTeacher(null);
|
||||||
setLocalErrors({});
|
setLocalErrors({});
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('Error:', error.message);
|
||||||
|
if (error.details) {
|
||||||
|
console.error('Form errors:', error.details);
|
||||||
|
setLocalErrors(error.details);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
setLocalErrors({});
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch((error) => {
|
||||||
if (error && typeof error === 'object') {
|
console.error('Error:', error.message);
|
||||||
setLocalErrors(error);
|
if (error.details) {
|
||||||
} else {
|
console.error('Form errors:', error.details);
|
||||||
console.error(error);
|
setLocalErrors(error.details);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@ -165,9 +178,20 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
|
|||||||
setEditingTeacher(null);
|
setEditingTeacher(null);
|
||||||
setFormData({});
|
setFormData({});
|
||||||
})
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('Error:', error.message);
|
||||||
|
if (error.details) {
|
||||||
|
console.error('Form errors:', error.details);
|
||||||
|
setLocalErrors(error.details);
|
||||||
|
}
|
||||||
|
});
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch((error) => {
|
||||||
console.error(error);
|
console.error('Error:', error.message);
|
||||||
|
if (error.details) {
|
||||||
|
console.error('Form errors:', error.details);
|
||||||
|
setLocalErrors(error.details);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -184,8 +208,6 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
|
|||||||
parsedValue = checked ? 1 : 0;
|
parsedValue = checked ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(`handleChange - name: ${name}, parsedValue: ${parsedValue}, type: ${type}, checked: ${checked}`);
|
|
||||||
|
|
||||||
if (editingTeacher) {
|
if (editingTeacher) {
|
||||||
setFormData((prevData) => ({
|
setFormData((prevData) => ({
|
||||||
...prevData,
|
...prevData,
|
||||||
@ -237,7 +259,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
|
|||||||
value={currentData.last_name}
|
value={currentData.last_name}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
placeholder="Nom de l'enseignant"
|
placeholder="Nom de l'enseignant"
|
||||||
errorMsg={localErrors && localErrors.last_name && Array.isArray(localErrors.last_name) ? localErrors.last_name[0] : ''}
|
errorMsg={getError('last_name')}
|
||||||
/>
|
/>
|
||||||
<InputText
|
<InputText
|
||||||
name="first_name"
|
name="first_name"
|
||||||
@ -245,7 +267,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
|
|||||||
value={currentData.first_name}
|
value={currentData.first_name}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
placeholder="Prénom de l'enseignant"
|
placeholder="Prénom de l'enseignant"
|
||||||
errorMsg={localErrors && localErrors.first_name && Array.isArray(localErrors.firstname) ? localErrors.firstname[0] : ''}
|
errorMsg={getError('first_name')}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -256,7 +278,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
|
|||||||
value={currentData.email}
|
value={currentData.email}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
placeholder="Email de l'enseignant"
|
placeholder="Email de l'enseignant"
|
||||||
errorMsg={localErrors && localErrors.email && Array.isArray(localErrors.email) ? localErrors.email[0] : ''}
|
errorMsg={getError('email')}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case 'SPECIALITES':
|
case 'SPECIALITES':
|
||||||
|
|||||||
Reference in New Issue
Block a user