Skip to content

Commit

Permalink
grosse refonte: meilleur CRUD et meilleure gestion du offline - mais …
Browse files Browse the repository at this point in the history
…temps de chargement pas top

* ongoing

* flow total en ligne qui marche

* whole flow working again I think

* finito normalement

* remove zod

* still ongoing

* last changers

* on y est presque

* C BON

* v2
  • Loading branch information
arnaudambro authored Oct 10, 2024
1 parent 3998c64 commit 60af2bf
Show file tree
Hide file tree
Showing 57 changed files with 1,997 additions and 1,599 deletions.
Binary file modified .yarn/install-state.gz
Binary file not shown.
16 changes: 15 additions & 1 deletion app/components/UserNotEditable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,21 @@ export default function UserNtEditable({
user = null,
withCfei = false,
}: {
user: null | SerializeFrom<User>;
user:
| null
| SerializeFrom<User>
| Pick<
User,
| "nom_de_famille"
| "prenom"
| "telephone"
| "email"
| "addresse_ligne_1"
| "addresse_ligne_2"
| "code_postal"
| "ville"
| "numero_cfei"
>;
withCfei?: boolean;
}) {
return (
Expand Down
67 changes: 67 additions & 0 deletions app/db/carcasse-intermediaire.client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// import * as zodSchemas from "prisma/generated/zod";
import type { CarcasseIntermediaire } from "@prisma/client";
import dayjs from "dayjs";
import { SerializeFrom } from "@remix-run/node";

// Implementation
export function mergeCarcasseIntermediaireToJSON(
oldItem: SerializeFrom<CarcasseIntermediaire>,
newItem: FormData = new FormData(),
): SerializeFrom<CarcasseIntermediaire> {
if (newItem) {
for (const key of newItem?.keys() ?? []) {
if (newItem?.get(key) === undefined) {
newItem!.delete(key);
}
}
}
const mergedItem: SerializeFrom<CarcasseIntermediaire> = {
...oldItem,
...Object.fromEntries(newItem!),
};

// Explicitly handle each field, including optional ones
const result: SerializeFrom<CarcasseIntermediaire> = {
fei_numero__bracelet__intermediaire_id: mergedItem.fei_numero__bracelet__intermediaire_id,
fei_numero: mergedItem.fei_numero,
numero_bracelet: mergedItem.numero_bracelet,
fei_intermediaire_id: mergedItem.fei_intermediaire_id,
fei_intermediaire_user_id: mergedItem.fei_intermediaire_user_id,
fei_intermediaire_entity_id: mergedItem.fei_intermediaire_entity_id,
created_at: mergedItem.created_at,
updated_at: dayjs().toISOString(),
// Optional fields
prise_en_charge:
newItem?.get("prise_en_charge") === "true"
? true
: newItem?.get("prise_en_charge") === "false"
? false
: oldItem.prise_en_charge || null,
refus: mergedItem.refus || null,
commentaire: mergedItem.commentaire || null,
carcasse_check_finished_at: mergedItem.carcasse_check_finished_at
? dayjs(mergedItem.carcasse_check_finished_at).toISOString()
: null,
deleted_at: mergedItem.deleted_at ? dayjs(mergedItem.deleted_at).toISOString() : null,
};

// eslint-disable-next-line @typescript-eslint/no-unused-vars
// const zodCarcasseIntermediaireResult = zodSchemas.CarcasseIntermediaireSchema.parse(result);
// console.log({ zodCarcasseIntermediaireResult });

return result satisfies SerializeFrom<CarcasseIntermediaire>;
}

export function mergeCarcasseIntermediaire(
oldItem: SerializeFrom<CarcasseIntermediaire>,
newItem?: FormData,
): FormData {
const result = mergeCarcasseIntermediaireToJSON(oldItem, newItem);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function getFormData(object: Record<string, any>) {
const formData = new FormData();
Object.keys(object).forEach((key) => formData.append(key, object[key]));
return formData;
}
return getFormData(result) satisfies FormData;
}
206 changes: 82 additions & 124 deletions app/db/carcasse.client.ts
Original file line number Diff line number Diff line change
@@ -1,134 +1,92 @@
import { type Fei, type Carcasse, type CarcasseIntermediaire } from "@prisma/client";
import type { FeiWithRelations } from "./fei.server";
import type { CarcasseLoaderData } from "~/routes/api.loader.carcasse.$fei_numero.$numero_bracelet";
import type { CarcasseActionData } from "~/routes/api.action.carcasse.$numero_bracelet";
import type { SuiviCarcasseActionData } from "~/routes/api.action.carcasse-suivi.$numero_bracelet.$intermediaire_id";
// import * as zodSchemas from "prisma/generated/zod";
import { Prisma, type Carcasse } from "@prisma/client";
import { SerializeFrom } from "@remix-run/node";
import dayjs from "dayjs";

export function formatCarcasseOfflineActionReturn(
carcasseFormData: FormData,
originalCarcasse: CarcasseActionData["data"] | FeiWithRelations["Carcasses"][0] | null,
): CarcasseActionData {
const getFormValue = (key: keyof Carcasse) => {
const value = carcasseFormData.get(key);
return value !== null ? value.toString() : null;
export function mergeCarcasseToJSON(oldItem: SerializeFrom<Carcasse>, newItem?: FormData): SerializeFrom<Carcasse> {
if (newItem) {
for (const key of newItem?.keys() ?? []) {
if (newItem?.get(key) === undefined) {
newItem!.delete(key);
}
}
}
const mergedItem: SerializeFrom<Carcasse> = {
...oldItem,
...Object.fromEntries(newItem!),
};

const getFormArray = (key: keyof Carcasse) => {
return carcasseFormData.getAll(key).map(String);
};
console.log({
oldItem,
newItem: Object.fromEntries(newItem!),
mergedItem,
});

return {
ok: true,
error: "",
data: {
numero_bracelet: getFormValue("numero_bracelet")!,
fei_numero: getFormValue("fei_numero")!,
heure_mise_a_mort: getFormValue("heure_mise_a_mort") ?? originalCarcasse?.heure_mise_a_mort ?? null,
heure_evisceration: getFormValue("heure_evisceration") ?? originalCarcasse?.heure_evisceration ?? null,
espece: getFormValue("espece") ?? originalCarcasse?.espece ?? null,
categorie: getFormValue("categorie") ?? originalCarcasse?.categorie ?? null,
examinateur_carcasse_sans_anomalie: getFormValue("examinateur_carcasse_sans_anomalie") === "true",
examinateur_anomalies_carcasse:
getFormArray("examinateur_anomalies_carcasse").length > 0
? getFormArray("examinateur_anomalies_carcasse")
: originalCarcasse?.examinateur_anomalies_carcasse || [],
examinateur_anomalies_abats:
getFormArray("examinateur_anomalies_abats").length > 0
? getFormArray("examinateur_anomalies_abats")
: originalCarcasse?.examinateur_anomalies_abats || [],
examinateur_commentaire:
getFormValue("examinateur_commentaire") ?? originalCarcasse?.examinateur_commentaire ?? null,
examinateur_signed_at:
(getFormValue("examinateur_signed_at") as unknown as Date) ?? originalCarcasse?.examinateur_signed_at ?? null,
intermediaire_carcasse_refus_intermediaire_id:
getFormValue("intermediaire_carcasse_refus_intermediaire_id") ??
originalCarcasse?.intermediaire_carcasse_refus_intermediaire_id ??
null,
intermediaire_carcasse_refus_motif:
getFormValue("intermediaire_carcasse_refus_motif") ??
originalCarcasse?.intermediaire_carcasse_refus_motif ??
null,
intermediaire_carcasse_signed_at:
(getFormValue("intermediaire_carcasse_signed_at") as unknown as Date) ??
originalCarcasse?.intermediaire_carcasse_signed_at ??
null,
intermediaire_carcasse_commentaire:
getFormValue("intermediaire_carcasse_commentaire") ??
originalCarcasse?.intermediaire_carcasse_commentaire ??
null,
svi_carcasse_saisie: originalCarcasse?.svi_carcasse_saisie ?? null,
svi_carcasse_saisie_motif: originalCarcasse?.svi_carcasse_saisie_motif || [],
svi_carcasse_saisie_at: originalCarcasse?.svi_carcasse_saisie_at ?? null,
svi_carcasse_signed_at: originalCarcasse?.svi_carcasse_signed_at ?? null,
svi_carcasse_commentaire: originalCarcasse?.svi_carcasse_commentaire ?? null,
created_at: originalCarcasse?.created_at ?? new Date(),
updated_at: new Date(),
deleted_at: originalCarcasse?.deleted_at ?? null,
},
// Explicitly handle each field, including optional ones
const result = {
numero_bracelet: mergedItem.numero_bracelet,
fei_numero: mergedItem.fei_numero,
heure_mise_a_mort: mergedItem.heure_mise_a_mort || null,
heure_evisceration: mergedItem.heure_evisceration || null,
espece: mergedItem.espece || null,
categorie: mergedItem.categorie || null,
examinateur_carcasse_sans_anomalie:
newItem?.get("examinateur_carcasse_sans_anomalie") === "true"
? true
: newItem?.get("examinateur_carcasse_sans_anomalie") === "false"
? false
: mergedItem.examinateur_carcasse_sans_anomalie || null,
// prettier-ignore
examinateur_anomalies_carcasse: newItem?.getAll?.(Prisma.CarcasseScalarFieldEnum.examinateur_anomalies_carcasse)?.length
? newItem?.getAll(Prisma.CarcasseScalarFieldEnum.examinateur_anomalies_carcasse).map(String).filter(Boolean)
: (oldItem.examinateur_anomalies_carcasse ?? []),
examinateur_anomalies_abats: newItem?.getAll?.(Prisma.CarcasseScalarFieldEnum.examinateur_anomalies_abats)?.length
? newItem?.getAll(Prisma.CarcasseScalarFieldEnum.examinateur_anomalies_abats).map(String).filter(Boolean)
: (oldItem.examinateur_anomalies_abats ?? []),
examinateur_commentaire: mergedItem.examinateur_commentaire,
examinateur_signed_at: mergedItem.examinateur_signed_at
? dayjs(mergedItem.examinateur_signed_at).toISOString()
: null,
intermediaire_carcasse_refus_intermediaire_id: mergedItem.intermediaire_carcasse_refus_intermediaire_id || null,
intermediaire_carcasse_refus_motif: mergedItem.intermediaire_carcasse_refus_motif || null,
intermediaire_carcasse_signed_at: mergedItem.intermediaire_carcasse_signed_at
? dayjs(mergedItem.intermediaire_carcasse_signed_at).toISOString()
: null,
intermediaire_carcasse_commentaire: mergedItem.intermediaire_carcasse_commentaire || null,
svi_carcasse_saisie:
newItem?.get("svi_carcasse_saisie") === "true"
? true
: newItem?.get("svi_carcasse_saisie") === "false"
? false
: mergedItem.svi_carcasse_saisie || null,
svi_carcasse_saisie_motif: newItem?.getAll?.(Prisma.CarcasseScalarFieldEnum.svi_carcasse_saisie_motif)?.length
? newItem?.getAll(Prisma.CarcasseScalarFieldEnum.svi_carcasse_saisie_motif).map(String).filter(Boolean)
: (oldItem.svi_carcasse_saisie_motif ?? []),
svi_carcasse_saisie_at: mergedItem.svi_carcasse_saisie_at
? dayjs(mergedItem.svi_carcasse_saisie_at).toISOString()
: null,
svi_carcasse_signed_at: mergedItem.svi_carcasse_signed_at
? dayjs(mergedItem.svi_carcasse_signed_at).toISOString()
: null,
svi_carcasse_commentaire: mergedItem.svi_carcasse_commentaire || null,
created_at: mergedItem.created_at,
updated_at: dayjs().toISOString(),
deleted_at: mergedItem.deleted_at ? dayjs(mergedItem.deleted_at).toISOString() : null,
};
}

export function formatCarcasseOfflineLoaderReturn(carcasse: Carcasse, fei: Fei): CarcasseLoaderData {
return {
ok: true,
data: {
carcasse: {
...carcasse,
Fei: fei,
},
fei: fei,
},
error: "",
};
}
// const zodCarcasseResult = zodSchemas.CarcasseSchema.parse(result);
// console.log({ zodCarcasseResult });

export function formatSuiviCarcasseByIntermediaire(
carcasseIntermediaire: CarcasseIntermediaire,
): SuiviCarcasseActionData {
return {
ok: true,
data: {
...carcasseIntermediaire,
carcasse_check_finished_at: new Date(),
},
error: "",
};
return result;
}

export function insertSuiviCarcasseByIntermediaireInFei(
carcasseIntermediaire: CarcasseIntermediaire,
fei: FeiWithRelations,
): FeiWithRelations {
return {
...fei,
FeiIntermediaires: fei.FeiIntermediaires.map((intermediaire) => {
if (intermediaire.id !== carcasseIntermediaire.fei_intermediaire_id) {
return intermediaire;
}
const existingCarcasseIntermediaire = intermediaire.CarcasseIntermediaire.find(
(ci) =>
ci.fei_numero__bracelet__intermediaire_id === carcasseIntermediaire.fei_numero__bracelet__intermediaire_id,
);
if (existingCarcasseIntermediaire) {
return {
...intermediaire,
CarcasseIntermediaire: intermediaire.CarcasseIntermediaire.map((ci) => {
if (
ci.fei_numero__bracelet__intermediaire_id !== carcasseIntermediaire.fei_numero__bracelet__intermediaire_id
) {
return ci;
}
return {
...ci,
...carcasseIntermediaire,
};
}),
};
}
return {
...intermediaire,
CarcasseIntermediaire: [...intermediaire.CarcasseIntermediaire, carcasseIntermediaire],
};
}),
};
export function mergeCarcasse(oldItem: SerializeFrom<Carcasse>, newItem?: FormData): FormData {
const result = mergeCarcasseToJSON(oldItem, newItem);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function getFormData(object: Record<string, any>) {
const formData = new FormData();
Object.keys(object).forEach((key) => formData.append(key, object[key]));
return formData;
}
return getFormData(result) satisfies FormData;
}
25 changes: 0 additions & 25 deletions app/db/carcasse.server.ts

This file was deleted.

56 changes: 56 additions & 0 deletions app/db/fei-intermediaire.client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// import * as zodSchemas from "prisma/generated/zod";
import type { FeiIntermediaire } from "@prisma/client";
import { SerializeFrom } from "@remix-run/node";
import dayjs from "dayjs";

export function mergeFeiIntermediaireToJSON(
oldItem: SerializeFrom<FeiIntermediaire>,
newItem: FormData = new FormData(),
): SerializeFrom<FeiIntermediaire> {
if (newItem) {
for (const key of newItem?.keys() ?? []) {
if (newItem?.get(key) === undefined) {
newItem!.delete(key);
}
}
}
const mergedItem: SerializeFrom<FeiIntermediaire> = {
...oldItem,
...Object.fromEntries(newItem!),
};

console.log({ mergedItem });
// Explicitly handle each field, including optional ones
const result = {
id: mergedItem.id,
fei_numero: mergedItem.fei_numero,
fei_intermediaire_user_id: mergedItem.fei_intermediaire_user_id, // not an
fei_intermediaire_entity_id: mergedItem.fei_intermediaire_entity_id,
created_at: mergedItem.created_at,
updated_at: dayjs().toISOString(),

/* Optional fields */
fei_intermediaire_role: mergedItem.fei_intermediaire_role || null,
commentaire: mergedItem.commentaire || null,
received_at: mergedItem.received_at ? dayjs(mergedItem.received_at).toISOString() : null,
check_finished_at: mergedItem.check_finished_at ? dayjs().toISOString() : null,
handover_at: mergedItem.handover_at ? dayjs(mergedItem.handover_at).toISOString() : null,
deleted_at: mergedItem.deleted_at ? dayjs(mergedItem.deleted_at).toISOString() : null,
};

// const validatedFeiIntermediaireResult = zodSchemas.FeiIntermediaireSchema.parse(result);
// console.log({ validatedFeiIntermediaireResult });

return result;
}

export function mergeFeiIntermediaire(oldItem: SerializeFrom<FeiIntermediaire>, newItem?: FormData): FormData {
const result = mergeFeiIntermediaireToJSON(oldItem, newItem);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function getFormData(object: Record<string, any>) {
const formData = new FormData();
Object.keys(object).forEach((key) => formData.append(key, object[key]));
return formData;
}
return getFormData(result) satisfies FormData;
}
Loading

0 comments on commit 60af2bf

Please sign in to comment.