Skip to content

Commit 0a80dd5

Browse files
committed
fix: 1101 correctifs saisie adresse plus validation (retours pr)
1 parent 7d717e1 commit 0a80dd5

4 files changed

Lines changed: 72 additions & 67 deletions

File tree

.talismanrc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,8 @@ fileignoreconfig:
275275
checksum: 8513c95ff253eb7ef038d5cdd5aff7d09b478c31409ea5644cd0081afbf6428e
276276
- filename: packages/frontend-usagers/src/components/address/search-address.vue
277277
checksum: e22412a54064dea24f7e200e9887726a4ef110f13570feea628c70c4fe2886a9
278+
- filename: packages/frontend-usagers/src/components/agrement/bilan/hebergements.vue
279+
checksum: 66638e3856d5d9d0820ada95cac2d6c377b475a545927cb24b52bf1a27afcfde
278280
- filename: packages/frontend-usagers/src/components/agrement/representants.vue
279281
checksum: 17c287f11e26438a1bccb79d81152c7662283823bc9355a62e4dba851e5f5556
280282
- filename: packages/frontend-usagers/src/components/customInput.vue

packages/frontend-usagers/src/components/agrement/bilan/hebergements.vue

Lines changed: 54 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
</div>
1616
<AgrementBilanHebergementDetail
1717
v-for="(hebergement, index) in paginatedHebergements"
18-
:key="`${hebergement.agrBilanAnnuelId}-${hebergement.adresseId}-${index}`"
18+
:key="`${hebergement.agrBilanAnnuelId}-${hebergement.agrBilanAnnuelId}-${index}`"
1919
:hebergement="hebergement"
20-
:statut="props.statut"
20+
:statut="props.statut || AGREMENT_STATUT.BROUILLON"
2121
@update="
2222
(updatedHebergement) =>
2323
handleHebergementUpdate(index, updatedHebergement)
@@ -58,7 +58,6 @@
5858
<div class="fr-mt-6v">
5959
<p class="fr-mb-0">Période</p>
6060
<AgrementBilanSelectMonths
61-
:default-selected="props.bilanHebergement?.mois"
6261
:modifiable="props.modifiable"
6362
@update:selected="handleMonths"
6463
/>
@@ -104,62 +103,58 @@
104103
</div>
105104
</template>
106105

107-
<script setup>
106+
<script setup lang="ts">
108107
import { computed, ref, watch } from "vue";
108+
import type { BilanHebergementDto } from "@vao/shared-bridge/src/dto/agrement.dto";
109+
import type { AdresseDto } from "@vao/shared-bridge/src/dto/adresse.dto";
109110
import SearchAddress from "@/components/address/search-address.vue";
110111
import { useField, useForm } from "vee-validate";
111112
import { useToaster } from "@vao/shared-ui";
112-
import { normalizeAdresse } from "@vao/shared-bridge";
113+
import { normalizeAdresse, AGREMENT_STATUT } from "@vao/shared-bridge";
113114
import * as yup from "yup";
114115
115116
const log = logger("components/AgrementBilanHebergements");
116117
117-
const props = defineProps({
118-
bilanHebergement: {
119-
type: Array,
120-
required: false,
121-
default: () => [],
122-
},
123-
statut: {
124-
type: String,
125-
required: false,
126-
default: "BROUILLON",
127-
},
128-
modifiable: { type: Boolean, required: false, default: false },
129-
});
118+
const props = defineProps<{
119+
bilanHebergement?: BilanHebergementDto[];
120+
statut?: string;
121+
modifiable?: boolean;
122+
}>();
130123
131124
const toaster = useToaster();
132125
133-
const localHebergements = ref([...props.bilanHebergement]);
126+
const localHebergements = ref<BilanHebergementDto[]>([
127+
...(props.bilanHebergement ?? []),
128+
]);
134129
135-
const isFirstLoad = ref(true);
130+
const isFirstLoad = ref<boolean>(true);
136131
137132
watch(
138133
() => props.bilanHebergement,
139134
(newBilanHebergement) => {
140135
if (isFirstLoad.value) {
141-
localHebergements.value = [...newBilanHebergement];
136+
localHebergements.value = [...(newBilanHebergement ?? [])];
142137
isFirstLoad.value = false;
143138
}
144139
},
145140
{ immediate: true, deep: true },
146141
);
147142
148143
const ITEMS_PER_PAGE = 10;
149-
const currentPage = ref(0);
144+
const currentPage = ref<number>(0);
150145
151-
const showForm = ref(false);
146+
const showForm = ref<boolean>(false);
152147
153-
function toggleForm() {
148+
function toggleForm(): void {
154149
showForm.value = !showForm.value;
155150
}
156151
157-
const totalPages = computed(() => {
152+
const totalPages = computed<number>(() => {
158153
return Math.ceil(localHebergements.value.length / ITEMS_PER_PAGE);
159154
});
160155
161-
const pages = computed(() => {
162-
const pageArray = [];
156+
const pages = computed<{ title: string; href: string; label: string }[]>(() => {
157+
const pageArray: { title: string; href: string; label: string }[] = [];
163158
for (let i = 1; i <= totalPages.value; i++) {
164159
pageArray.push({
165160
title: `Lien vers la page ${i}`,
@@ -170,18 +165,21 @@ const pages = computed(() => {
170165
return pageArray;
171166
});
172167
173-
const paginatedHebergements = computed(() => {
168+
const paginatedHebergements = computed<BilanHebergementDto[]>(() => {
174169
const start = currentPage.value * ITEMS_PER_PAGE;
175170
const end = start + ITEMS_PER_PAGE;
176171
return localHebergements.value.slice(start, end);
177172
});
178173
179-
function handleHebergementUpdate(index, updatedHebergement) {
174+
function handleHebergementUpdate(
175+
index: number,
176+
updatedHebergement: BilanHebergementDto,
177+
): void {
180178
const actualIndex = currentPage.value * ITEMS_PER_PAGE + index;
181179
localHebergements.value[actualIndex] = { ...updatedHebergement };
182180
}
183181
184-
function handleHebergementDelete(index) {
182+
function handleHebergementDelete(index: number): void {
185183
const actualIndex = currentPage.value * ITEMS_PER_PAGE + index;
186184
localHebergements.value.splice(actualIndex, 1);
187185
@@ -216,62 +214,65 @@ const {
216214
errorMessage: nomHebergementErrorMessage,
217215
handleChange: onNomHebergementChange,
218216
meta: nomHebergementMeta,
219-
} = useField("nomHebergement");
217+
} = useField<string>("nomHebergement");
220218
221219
const {
222220
value: nbJours,
223221
errorMessage: nbJoursErrorMessage,
224222
handleChange: onNbJoursChange,
225223
meta: nbJoursMeta,
226-
} = useField("nbJours");
224+
} = useField<number>("nbJours");
227225
228226
const { value: adresse, errorMessage: adresseErrorMessage } =
229-
useField("adresse");
227+
useField<any>("adresse");
230228
231229
const {
232230
value: periode,
233231
errorMessage: periodeErrorMessage,
234232
meta: periodeMeta,
235-
} = useField("periode");
233+
} = useField<string[]>("periode");
236234
237-
function handleMonths(monthsArray) {
235+
function handleMonths(monthsArray: string[]): void {
238236
periode.value = monthsArray;
239237
}
240238
241-
const selectedAdresseObject = ref(null);
239+
const selectedAdresseObject = ref<AdresseDto | { label: string } | null>(null);
242240
243-
function onAdresseSelect(selectedAddress) {
244-
adresse.value = selectedAddress.label;
241+
function onAdresseSelect(
242+
selectedAddress: AdresseDto | { label: string },
243+
): void {
244+
adresse.value = selectedAddress.label || "";
245245
selectedAdresseObject.value = selectedAddress;
246246
}
247247
248248
const onSubmitAddSejour = handleSubmit(
249-
(values) => {
250-
const adresseObject = selectedAdresseObject.value
251-
? selectedAdresseObject.value
252-
: { label: values.adresse };
249+
(values: Record<string, any>) => {
250+
const adresseObject: AdresseDto | { label: string } =
251+
selectedAdresseObject.value
252+
? selectedAdresseObject.value
253+
: { label: values.adresse };
253254
254-
let adresseNorm;
255+
let adresseNorm: AdresseDto;
255256
try {
256257
adresseNorm = normalizeAdresse(adresseObject);
257258
} catch (e) {
258259
log.w("Erreur de normalisation de l'adresse :", e);
259260
toaster.error({
260-
titleTag: "Erreur sur l'adresse",
261261
description: "L'adresse saisie est incomplète ou invalide.",
262262
});
263263
return;
264264
}
265265
266266
const agrBilanAnnuelId =
267-
props.bilanHebergement[0]?.agrBilanAnnuelId || null;
267+
(props.bilanHebergement && props.bilanHebergement[0]?.agrBilanAnnuelId) ||
268+
null;
268269
269-
const newHebergement = {
270+
const newHebergement: BilanHebergementDto = {
271+
agrBilanAnnuelId,
270272
nomHebergement: values.nomHebergement,
271273
adresse: adresseNorm,
272274
nbJours: parseInt(values.nbJours),
273-
mois: values.periode.map((m) => parseInt(m)),
274-
agrBilanAnnuelId,
275+
mois: values.periode.map((m: string) => parseInt(m)),
275276
};
276277
277278
localHebergements.value.push(newHebergement);
@@ -285,19 +286,19 @@ const onSubmitAddSejour = handleSubmit(
285286
description: "Le séjour a été ajouté avec succès.",
286287
});
287288
},
288-
(errors) => {
289+
(errors: any) => {
289290
console.warn("Erreurs de validation :", errors);
290291
},
291292
);
292293
293-
function validateHebergements() {
294+
function validateHebergements(): boolean {
294295
let isValid = true;
295-
const errors = [];
296+
const errors: string[] = [];
296297
297298
localHebergements.value.forEach((hebergement, index) => {
298299
if (
299300
!hebergement.nomHebergement ||
300-
hebergement.nomHebergement.trim() === ""
301+
hebergement.nomHebergement?.trim?.() === ""
301302
) {
302303
errors.push(`Hébergement ${index + 1}: Le nom est obligatoire`);
303304
isValid = false;
@@ -340,7 +341,7 @@ function validateHebergements() {
340341
return isValid;
341342
}
342343
343-
function getHebergements() {
344+
function getHebergements(): BilanHebergementDto[] {
344345
return localHebergements.value;
345346
}
346347

packages/frontend-usagers/src/components/agrement/bilan/sejours.vue

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,24 @@
4040
</DsfrTabs>
4141
</template>
4242

43-
<script setup>
44-
import { TitleWithIcon } from "@vao/shared-ui";
43+
<script setup lang="ts">
44+
import { TitleWithIcon, useToaster } from "@vao/shared-ui";
4545
4646
const props = defineProps({
4747
initAgrement: { type: Object, required: true },
4848
cdnUrl: { type: String, required: true },
4949
modifiable: { type: Boolean, default: true },
5050
});
5151
52+
const toaster = useToaster();
53+
5254
const initialSelectedIndex = 0;
5355
54-
const selectedTabIndex = ref(initialSelectedIndex);
55-
const asc = ref(true);
56-
const sejourDetailsRefs = ref([]);
56+
const selectedTabIndex = ref<number>(initialSelectedIndex);
57+
const asc = ref<boolean>(true);
58+
const sejourDetailsRefs = ref<any[]>([]);
5759
58-
function setSejourDetailsRef(el, idx) {
60+
function setSejourDetailsRef(el: any, idx: number) {
5961
sejourDetailsRefs.value[idx] = el;
6062
}
6163
@@ -74,9 +76,9 @@ const tabTitles = computed(() => {
7476
});
7577
7678
const bilanAnnuelByYear = computed(() => {
77-
const result = {};
79+
const result: Record<number, any> = {};
7880
const data = props.initAgrement?.agrementBilanAnnuel || [];
79-
data.forEach((bilan) => {
81+
data.forEach((bilan: any) => {
8082
const year = bilan.annee;
8183
if (!result[year]) {
8284
result[year] = {
@@ -106,7 +108,7 @@ const bilanAnnuelByYear = computed(() => {
106108
return result;
107109
});
108110
109-
const selectTab = async (idx) => {
111+
const selectTab = async (idx: number) => {
110112
asc.value = selectedTabIndex.value < idx;
111113
};
112114
@@ -119,7 +121,7 @@ async function validateAllYears() {
119121
const result = await ref.validateForm();
120122
if (!result || result === false) {
121123
allValid = false;
122-
} else if (typeof result === "object" && "annee" in result) {
124+
} else if (result?.annee) {
123125
allResults.push(result);
124126
}
125127
} else {

packages/shared-bridge/src/utils/normalizeAdresse.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ export function normalizeAdresse(
2626

2727
// Vérifie que les champs obligatoires sont présents
2828
if (
29-
adresse.label == null ||
30-
adresse.codeInsee == null ||
31-
adresse.codePostal == null ||
32-
adresse.departement == null
29+
!adresse.label ||
30+
!adresse.codeInsee ||
31+
!adresse.codePostal ||
32+
!adresse.departement
3333
) {
3434
throw new Error("normalizeAdresse: adresse is missing required fields");
3535
}

0 commit comments

Comments
 (0)