Skip to content
Extraits de code Groupes Projets
Valider 8bfed674 rédigé par Mohamed Lemine BAILLAHI's avatar Mohamed Lemine BAILLAHI
Parcourir les fichiers

Merge branch 'feature/VSN-871' into 'develop'

ameliorations for absence and cleave

Closes VSN-871

See merge request !223
parents 0576a201 61695554
Branches
Étiquettes v0.0.31
1 requête de fusion!223ameliorations for absence and cleave
Pipeline #19530 réussi avec l'étape
in 21 secondes
const endpointPrefix = 'http://localhost:8080/api/user';
const endpointPrefix = '/api/user';
export const userEndpoints = {
user: {
......
......@@ -71,7 +71,7 @@ interface BackendResponse {
interface Statistics {
leaveBalance: {
LEAVE_MALADIE: number;
LEAVE_PAYE: number;
LEAVE_PAID: number;
LEAVE_RTT: number;
};
totals: {
......
......@@ -101,7 +101,7 @@ export default function AbsenceOverview({ data }: AbsenceOverviewProps) {
{
type: 'Annuel',
used: 0,
total: statistics.leaveBalance.LEAVE_PAYE || 0,
total: statistics.leaveBalance.LEAVE_PAID || 0,
color: '#FF6B6B',
},
{
......
......@@ -9,7 +9,9 @@ const congeConfig: TabConfig<IDemandeAbsence> = {
newItemTitle: 'Nouvelle Demande',
initialData: INITIAL_LEAVE_DATA,
getItemCode: (conge: IDemandeAbsence) =>
`${conge.requestNumber} - ${conge.requestType} (${conge.type})`,
`${conge.requestNumber} - ${conge.requestType} (${
conge.requestType === 'Congé' ? conge.leaveType : conge.absenceType
})`,
};
export function useAbsenceTabs() {
......@@ -18,23 +20,29 @@ export function useAbsenceTabs() {
const handleSave = async (absence: IDemandeAbsence) => {
try {
let result;
if (absence.id) {
result = await updateAbsence(absence.id, absence);
} else {
result = await createAbsence(absence);
console.log('Create result in handleSave:', result);
}
// If the operation was successful, close the tab using handleCancel
if (result && result.success) {
tabManager.handleCancel(tabManager.activeTab, true);
} else {
}
// Return the result from the store directly
return result;
} catch (error) {
console.error('Failed to save absence:', error);
// Return a properly structured error response
return {
success: false,
......@@ -57,7 +65,6 @@ export function useAbsenceTabs() {
const result = await updateAbsence(absence.id, updatedAbsence);
return result;
} catch (error) {
console.error('Failed to approve absence:', error);
return absence;
}
};
......@@ -74,7 +81,6 @@ export function useAbsenceTabs() {
const result = await updateAbsence(absence.id, updatedAbsence);
return result;
} catch (error) {
console.error('Failed to reject absence:', error);
return absence;
}
};
......
......@@ -4,7 +4,7 @@ import { IDemandeAbsence } from '@/shared/types/leave';
export const absenceSchema = Yup.object().shape({
requestType: Yup.string()
.required('Le type de demande est requis'),
AbsenceType: Yup.string()
absenceType: Yup.string()
.when('requestType', {
is: 'Absence',
then: (schema) => schema.required('Le type d\'absence est requis'),
......@@ -17,8 +17,7 @@ export const absenceSchema = Yup.object().shape({
otherwise: (schema) => schema.notRequired(),
}),
startDate: Yup.date()
.required('La date de début est requise')
.max(new Date(), 'La date de début ne peut pas être dans le futur'),
.required('La date de début est requise'),
endDate: Yup.date()
.required('La date de fin est requise')
.min(Yup.ref('startDate'), 'La date de fin doit être postérieure à la date de début'),
......
......@@ -125,6 +125,8 @@ export default function AbsenceForm({
status: 'En attente' as const
};
const result = await onSave(submissionData, selectedFile);
if (result && result.success) {
......@@ -137,7 +139,7 @@ export default function AbsenceForm({
});
}
} catch (error: any) {
console.error('Form submission error:', error);
setSnackbar({
open: true,
message: error.message || 'Une erreur est survenue lors de la soumission',
......@@ -147,15 +149,58 @@ export default function AbsenceForm({
},
});
useEffect(() => {
if (updateTabContent && tabId && mode === "edit") {
const debouncedUpdate = setTimeout(() => {
const title = `REQ-${formik.values.id || tabId} - ${formik.values.requestType} (${formik.values.requestType === 'Congé'
? formik.values.leaveType || 'LEAVE_PAID'
: formik.values.absenceType || 'EXTERNAL_ASSIGNMENT'
})`;
updateTabContent(tabId, {
...formik.values,
title
});
}, 300);
return () => clearTimeout(debouncedUpdate);
}
}, [formik.values, updateTabContent, tabId, mode]);
useEffect(() => {
if (mode === 'add' && updateTabContent && tabId) {
const initialTitle = `REQ-${tabId} - ${formik.values.requestType} (${formik.values.requestType === 'Congé'
? formik.values.leaveType || 'LEAVE_PAID'
: formik.values.absenceType || 'EXTERNAL_ASSIGNMENT'
})`;
updateTabContent(tabId, {
...formik.values,
title: initialTitle
});
}
}, [mode, tabId, updateTabContent, formik.values.requestType]);
const handleTypeChange = (name: string, value: string) => {
formik.setFieldValue(name, value);
if (name === 'requestType') {
if (value === 'Absence') {
formik.setFieldValue('leaveType', null);
formik.setFieldValue('AbsenceType', 'EXTERNAL_ASSIGNMENT');
formik.setFieldValue('leaveType', '');
formik.setFieldValue('absenceType', 'EXTERNAL_ASSIGNMENT');
formik.setFieldTouched('absenceType', true, false);
} else {
formik.setFieldValue('AbsenceType', null);
formik.setFieldValue('leaveType', 'LEAVE_PAYE');
formik.setFieldValue('absenceType', '');
formik.setFieldValue('leaveType', 'LEAVE_PAID');
formik.setFieldTouched('leaveType', true, false);
}
if (updateTabContent && tabId) {
const newTitle = `REQ-${formik.values.id || tabId} - ${value} (${value === 'Congé' ? 'LEAVE_PAID' : 'EXTERNAL_ASSIGNMENT'
})`;
updateTabContent(tabId, {
...formik.values,
title: newTitle
});
}
}
};
......@@ -167,17 +212,13 @@ export default function AbsenceForm({
if (end >= start) {
const diffTime = Math.abs(end.getTime() - start.getTime());
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1;
formik.setFieldValue('daysCount', diffDays);
if (diffDays !== formik.values.daysCount) {
formik.setFieldValue('daysCount', diffDays, false);
}
}
}
}, [formik.values.startDate, formik.values.endDate]);
useEffect(() => {
if (updateTabContent && tabId && (mode !== "view")) {
updateTabContent(tabId, formik.values)
}
}, [formik.values, updateTabContent, tabId, mode]);
const handleFileUpload = (file: File) => {
setSelectedFile(file);
setSelectedFileName(file.name);
......@@ -235,6 +276,27 @@ export default function AbsenceForm({
);
};
const isFormValid = () => {
const errors = formik.errors;
const touched = formik.touched;
const values = formik.values;
return formik.isValid;
};
const renderActionButtons = () => (
<ConditionalComponent isValid={!isReadOnly}>
<ActionButtons
onSave={() => {
isFormValid();
formik.handleSubmit();
}}
onCancel={() => onClose(false)}
mode={mode}
/>
</ConditionalComponent>
);
return (
<LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={fr}>
<FormContainer titre={getFormTitle()}>
......@@ -308,13 +370,7 @@ export default function AbsenceForm({
</Box>
</Grid>
<Grid item xs={12}>
<ConditionalComponent isValid={!isReadOnly}>
<ActionButtons
onSave={formik.handleSubmit}
onCancel={() => onClose(false)}
mode={mode}
/>
</ConditionalComponent>
{renderActionButtons()}
</Grid>
</Grid>
</form>
......
......@@ -99,4 +99,5 @@ export interface IDemandeAbsence {
type?: LeaveType;
readOnly?: boolean;
disabled?: boolean;
title?: string;
}
\ No newline at end of file
0% ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter