diff --git a/src/Bundle/ChillMainBundle/Resources/public/chill/js/date.ts b/src/Bundle/ChillMainBundle/Resources/public/chill/js/date.ts index 233d802a0..f60d97d8e 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/chill/js/date.ts +++ b/src/Bundle/ChillMainBundle/Resources/public/chill/js/date.ts @@ -158,3 +158,18 @@ export const intervalISOToDays = (str: string | null): number | null => { return days; }; + +export function getTimezoneOffsetString(date: Date, timeZone: string): string { + const utcDate = new Date(date.toLocaleString("en-US", { timeZone: "UTC" })); + const tzDate = new Date(date.toLocaleString("en-US", { timeZone })); + const offsetMinutes = (utcDate.getTime() - tzDate.getTime()) / (60 * 1000); + + // Inverser le signe pour avoir la convention ±HH:MM + const sign = offsetMinutes <= 0 ? "+" : "-"; + const absMinutes = Math.abs(offsetMinutes); + const hours = String(Math.floor(absMinutes / 60)).padStart(2, "0"); + const minutes = String(absMinutes % 60).padStart(2, "0"); + + return `${sign}${hours}:${minutes}`; +} + diff --git a/src/Bundle/ChillMainBundle/Resources/public/types.ts b/src/Bundle/ChillMainBundle/Resources/public/types.ts index 38fc024f4..1884476bd 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/types.ts +++ b/src/Bundle/ChillMainBundle/Resources/public/types.ts @@ -8,9 +8,9 @@ export interface DateTime { } /** - * A date representation to use when we create an instance + * A date representation to use when we create or update a date */ -export interface DateTimeCreate { +export interface DateTimeWrite { /** * Must be a string in format Y-m-d\TH:i:sO */ diff --git a/src/Bundle/ChillPersonBundle/Resources/public/types.ts b/src/Bundle/ChillPersonBundle/Resources/public/types.ts index be7b5d6d6..524b117a9 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/types.ts +++ b/src/Bundle/ChillPersonBundle/Resources/public/types.ts @@ -11,7 +11,7 @@ import { Job, PrivateCommentEmbeddable, TranslatableString, - DateTimeCreate, + DateTimeWrite, SetGender, SetCenter, SetCivility, @@ -67,8 +67,8 @@ export interface PersonWrite { lastName: string; altNames: AltNameWrite[]; // address: number | null; - birthdate: DateTimeCreate | null; - deathdate: DateTimeCreate | null; + birthdate: DateTimeWrite | null; + deathdate: DateTimeWrite | null; phonenumber: string; mobilenumber: string; email: string; diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_api/OnTheFly.ts b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_api/OnTheFly.ts index 86f7d266a..fe018edc7 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_api/OnTheFly.ts +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_api/OnTheFly.ts @@ -72,6 +72,7 @@ export interface WritePersonViolationMap civility: { "{{ value }}": string | null; }; + birthdate: {}; } export const createPerson = async (person: PersonWrite): Promise => { return makeFetch( diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/PersonEdit.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/PersonEdit.vue index 6bd75de8a..a0ea60fed 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/PersonEdit.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/PersonEdit.vue @@ -140,6 +140,7 @@
- +
- +
+
+
+ + + +
+ + +
+
+ {{ err }} +
+
+
+
@@ -195,11 +223,13 @@
+
+
+
({ type: "person", firstName: "", @@ -436,12 +476,18 @@ const civility = computed({ const birthDate = computed({ get: () => (person.birthdate ? person.birthdate.datetime.split("T")[0] : ""), set: (value: string) => { - if (person.birthdate) { - person.birthdate.datetime = value + "T00:00:00+0100"; - } else { - person.birthdate = { datetime: value + "T00:00:00+0100" }; + const date = ISOToDate(value); + if (null === date) { + person.birthdate = null; + return; } - }, + const offset = getTimezoneOffsetString(date, Intl.DateTimeFormat().resolvedOptions().timeZone); + if (person.birthdate) { + person.birthdate.datetime = value + "T00:00:00" + offset; + } else { + person.birthdate = { datetime: value + "T00:00:00" + offset }; + } + } }); const phonenumber = computed({ get: () => person.phonenumber, @@ -586,6 +632,8 @@ async function postPerson(): Promise { if (isValidationException(e)) { console.log(e.byProperty); validationErrors.value = e.byProperty; + } else { + toast.error(trans(PERSON_EDIT_ERROR_WHILE_SAVING)); } } } diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index adab35966..324627e92 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -105,6 +105,8 @@ Administrative status: Situation administrative person: Identifiers: Identifiants +person_edit: + Error while saving: Erreur lors de l'enregistrement # dédoublonnage Old person: Doublon @@ -1547,7 +1549,7 @@ person_messages: center_id: "Identifiant du centre" center_type: "Type de centre" center_name: "Territoire" - phonenumber: "Téléphone" + phonenumber: "Téléphone fixe" mobilenumber: "Mobile" altnames: "Autres noms" email: "Courriel"