Skip to content

Commit

Permalink
Merge pull request #3593 from MTES-MCT/fix/bulk-update
Browse files Browse the repository at this point in the history
Corrige la validation des données de la mise à jour en masse
  • Loading branch information
providenz authored Sep 23, 2024
2 parents 814a124 + 5115b8a commit 3d58c91
Showing 1 changed file with 77 additions and 14 deletions.
91 changes: 77 additions & 14 deletions front/src/admin/bulkProfilesUpdate/BulkprofilesUpdateAdmin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,11 @@ const validationSchema = z.object({
.string()
.transform((val, ctx) => {
try {
const parsed = JSON.parse(val);

return parsed;
return JSON.parse(val);
} catch (error) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "invalid json"
message: "Le json est invalide"
});
return z.never;
}
Expand Down Expand Up @@ -64,7 +62,7 @@ const validationSchema = z.object({
CollectorType.DeeeWastes,
CollectorType.OtherDangerousWastes,
CollectorType.OtherNonDangerousWastes,
CollectorType.DangerousWastes
CollectorType.NonDangerousWastes
])
),
wasteProcessorTypes: z.array(
Expand Down Expand Up @@ -120,9 +118,13 @@ export function BulkProfileUpdateAdmin() {
});
};

const { handleSubmit, formState, register } = useForm<
z.infer<typeof validationSchema>
>({ resolver: zodResolver(validationSchema) });
const {
handleSubmit,
formState: { errors },
register
} = useForm<z.infer<typeof validationSchema>>({
resolver: zodResolver(validationSchema)
});

return (
<div>
Expand All @@ -143,8 +145,9 @@ export function BulkProfileUpdateAdmin() {
type: "email",
...register("adminEmail", { required: true })
}}
state={errors?.adminEmail && "error"}
stateRelatedMessage={
(formState?.errors?.adminEmail?.message as string) ?? ""
(errors?.adminEmail?.message as string) ?? ""
}
/>

Expand All @@ -158,17 +161,16 @@ export function BulkProfileUpdateAdmin() {
rows: 10,
...register("companyUpdateRows", { required: true })
}}
stateRelatedMessage={
(formState?.errors?.companyUpdateRows?.message as string) ??
""
}
state={errors?.companyUpdateRows && "error"}
stateRelatedMessage="Veuillez vous référer au tableau d'erreurs"
/>
</div>
<Button disabled={loading}>Effectuer la mise à jour</Button>
</form>
)}
</div>
{loading && <div>Mise à jour des établissements en cours...</div>}
{errors?.companyUpdateRows && <ErrorsTable errors={errors} />}
{error && (
<Alert
className="fr-mt-3w"
Expand All @@ -190,6 +192,67 @@ type Props = {
data?: (CompanyPrivate | null)[];
};

const formatErrorMessage = (row, field) => {
const errorField = row?.[field];
if (!errorField) {
return null;
}

if (Array.isArray(errorField)) {
return errorField.map(err => err?.message).join(",");
}
return errorField?.message;
};
const formatRowErrors = errors => {
const ret: any[] = [];

errors?.companyUpdateRows?.forEach((row, index) => {
try {
ret.push([
index + 1,
formatErrorMessage(row, "companyTypes"),
formatErrorMessage(row, "collectorTypes"),
formatErrorMessage(row, "wasteProcessorTypes"),
formatErrorMessage(row, "wasteVehiclesTypes")
]);
} catch {
//continue
}
});

return ret;
};

const ErrorsTable = ({ errors }) => {
const tableHeaders = [
"index",
"companyTypes",
"collectorTypes",
"wasteProcessorTypes",
"wasteVehiclesTypes"
];
if (!errors?.companyUpdateRows || !Object.keys(errors?.companyUpdateRows)) {
return null;
}

if (Array.isArray(errors?.companyUpdateRows)) {
const f = formatRowErrors(errors) || [];

return (
<>
<h3 className="fr-h3 fr-mt-3w">Erreurs</h3>
<Table
colorVariant="pink-tuile"
headers={tableHeaders}
data={f}
fixed
/>
</>
);
}
return <h3 className="fr-h3 fr-mt-3w">Erreur - Json invalide</h3>;
};

const BulkUpdateCompaniesProfilesDigest = ({ data }: Props) => {
const tableHeaders = [
"Orgid",
Expand All @@ -210,7 +273,7 @@ const BulkUpdateCompaniesProfilesDigest = ({ data }: Props) => {
return (
<div>
<h3 className="fr-h3">Établissements mis à jour</h3>
<Table headers={tableHeaders} data={tableData} fixed />{" "}
<Table headers={tableHeaders} data={tableData} fixed />
</div>
);
};

0 comments on commit 3d58c91

Please sign in to comment.