Skip to content

Commit d0c094a

Browse files
adminl-scherer
authored andcommitted
feat: front usager etape 1 sur 4 (#1084)
1 parent abe7aad commit d0c094a

8 files changed

Lines changed: 434 additions & 253 deletions

File tree

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,50 @@
11
<template>
2-
<textarea
3-
v-model="comment"
4-
class="fr-input answer__form__textare"
5-
name="textarea"
6-
rows="4"
7-
placeholder="Votre commentaire..."
8-
></textarea>
2+
<DsfrInputGroup
3+
name="commentaire"
4+
label="Commentaire"
5+
:model-value="commentaireValue"
6+
:label-visible="true"
7+
:is-textarea="true"
8+
:is-valid="commentaireMeta.valid"
9+
:error-message="commentaireErrorMessage"
10+
hint="Votre commentaire..."
11+
@update:model-value="onCommentaireChange"
12+
/>
913
</template>
1014

1115
<script setup>
12-
import { ref } from "vue";
13-
const comment = ref("");
16+
import { useForm, useField } from "vee-validate";
17+
import * as yup from "yup";
1418
15-
function getComment() {
16-
return comment.value;
19+
const props = defineProps({
20+
initCommentaire: { type: String, default: "" },
21+
});
22+
23+
const validationSchema = yup.object({
24+
commentaire: yup
25+
.string()
26+
.max(1000, "Le commentaire ne doit pas dépasser 1000 caractères.")
27+
.nullable(),
28+
});
29+
30+
const { handleSubmit } = useForm({
31+
validationSchema,
32+
initialValues: { commentaire: props.initCommentaire },
33+
});
34+
35+
const {
36+
value: commentaireValue,
37+
errorMessage: commentaireErrorMessage,
38+
handleChange: onCommentaireChange,
39+
meta: commentaireMeta,
40+
} = useField("commentaire");
41+
42+
async function getComment() {
43+
let result = null;
44+
await handleSubmit((values) => {
45+
result = values.commentaire;
46+
})();
47+
return result;
1748
}
1849
defineExpose({ getComment });
1950
</script>

packages/frontend-usagers/src/components/agrement/coordonnees.vue

Lines changed: 88 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,35 @@
66
organismeStore.organismeCourant.typeOrganisme === 'personne_physique'
77
"
88
ref="personnePhysiqueRef"
9+
:init-organisme="props.initOrganisme"
10+
:init-agrement="props.initAgrement"
911
/>
1012
<hr class="fr-my-2w" />
1113
<AgrementPersonneMorale
1214
v-if="
1315
organismeStore.organismeCourant.typeOrganisme === 'personne_morale'
1416
"
1517
ref="personneMoraleRef"
18+
:init-organisme="props.initOrganisme"
19+
:init-agrement="props.initAgrement"
1620
/>
1721
</div>
1822

1923
<hr class="fr-mt-4w" />
2024

21-
<AgrementCommentaire ref="commentaireRef" class="fr-my-2w" />
25+
<AgrementCommentaire
26+
ref="commentaireRef"
27+
:init-commentaire="props.initAgrement.commentaire"
28+
class="fr-my-2w"
29+
/>
30+
31+
<DsfrFileUpload
32+
v-model="fileProcesVerbal"
33+
label="Dernier procès verbal d'assemblée générale"
34+
:modifiable="true"
35+
/>
36+
37+
<hr class="fr-mt-4w" />
2238

2339
<DsfrAlert
2440
v-if="personnePhysiqueError"
@@ -40,65 +56,103 @@
4056
{{ personneMoraleError }}
4157
</DsfrAlert>
4258

43-
<div v-if="props.showButtons">
44-
<UtilsNavigationButtons
45-
:show-buttons="props.showButtons"
46-
@next="onNext"
47-
/>
48-
</div>
59+
<DsfrButton @click.prevent="onNext">Suivant</DsfrButton>
4960
</div>
5061
</template>
5162

5263
<script setup>
5364
import { ref } from "vue";
5465
5566
const props = defineProps({
67+
initAgrement: { type: Object, required: true },
68+
initOrganisme: { type: Object, required: true },
5669
modifiable: { type: Boolean, default: true },
57-
showButtons: { type: Boolean, default: true },
5870
});
59-
const emit = defineEmits(["next"]);
71+
const emit = defineEmits(["next", "update"]);
6072
6173
const toaster = useToaster();
62-
const agrementStore = useAgrementStore();
6374
const organismeStore = useOrganismeStore();
6475
6576
const personnePhysiqueRef = ref();
6677
const personneMoraleRef = ref();
6778
const commentaireRef = ref();
6879
const personnePhysiqueError = ref("");
6980
const personneMoraleError = ref("");
81+
const fileProcesVerbal = ref(null);
7082
71-
// Validation et sauvegarde de l’étape
7283
async function saveAgrement() {
84+
let commentaire;
85+
if (commentaireRef.value?.getComment) {
86+
commentaire = await commentaireRef.value.getComment();
87+
}
88+
89+
const agrementValues = {
90+
...(fileProcesVerbal.value ? { procesVerbal: fileProcesVerbal.value } : {}),
91+
...(commentaire ? { commentaire } : {}),
92+
};
93+
94+
emit("update", agrementValues);
95+
}
96+
97+
async function validatePersonne(ref, saveMethod, errorRef, errorMsg) {
98+
if (ref.value?.[saveMethod]) {
99+
const data = await ref.value[saveMethod]();
100+
if (!data) {
101+
errorRef.value = errorMsg;
102+
return null;
103+
} else {
104+
try {
105+
if (saveMethod === "savePersonneMorale") {
106+
await organismeStore.updatePersonneMorale({
107+
...organismeStore.organismeCourant.personneMorale,
108+
...data,
109+
});
110+
} else if (saveMethod === "savePersonnePhysique") {
111+
await organismeStore.updatePersonnePhysique({
112+
...organismeStore.organismeCourant.personnePhysique,
113+
...data,
114+
});
115+
}
116+
return data;
117+
} catch (err) {
118+
errorRef.value =
119+
"Erreur lors de la sauvegarde : " +
120+
(err?.message || "Erreur inconnue.");
121+
return null;
122+
}
123+
}
124+
}
125+
return null;
126+
}
127+
128+
async function saveCoordonneesStep() {
73129
personnePhysiqueError.value = "";
74130
personneMoraleError.value = "";
75131
let valid = true;
76132
77-
if (personnePhysiqueRef.value?.validateAndSave) {
78-
const ok = await personnePhysiqueRef.value.validateAndSave();
79-
if (!ok) {
80-
personnePhysiqueError.value =
81-
"Veuillez corriger les erreurs dans le formulaire de la personne physique.";
82-
valid = false;
83-
}
133+
const personnePhysiqueData = await validatePersonne(
134+
personnePhysiqueRef,
135+
"savePersonnePhysique",
136+
personnePhysiqueError,
137+
"Veuillez corriger les erreurs dans le formulaire de la personne physique.",
138+
);
139+
if (personnePhysiqueRef.value && !personnePhysiqueData) {
140+
valid = false;
141+
return;
84142
}
85143
86-
if (personneMoraleRef.value?.validateAndSave) {
87-
const ok = await personneMoraleRef.value.validateAndSave();
88-
if (!ok) {
89-
personneMoraleError.value =
90-
"Veuillez corriger les erreurs dans le formulaire de la personne morale.";
91-
valid = false;
92-
}
144+
const personneMoraleData = await validatePersonne(
145+
personneMoraleRef,
146+
"savePersonneMorale",
147+
personneMoraleError,
148+
"Veuillez corriger les erreurs dans le formulaire de la personne morale.",
149+
);
150+
if (personneMoraleRef.value && !personneMoraleData) {
151+
valid = false;
152+
return;
93153
}
94154
95-
if (commentaireRef.value?.getComment()) {
96-
const commentaire = commentaireRef.value.getComment();
97-
await agrementStore.postAgrement({
98-
agrement: { commentaire: commentaire || "" },
99-
organismeId: organismeStore.organismeCourant?.organismeId,
100-
});
101-
}
155+
saveAgrement();
102156
103157
if (!valid) {
104158
return toaster.error({
@@ -108,16 +162,12 @@ async function saveAgrement() {
108162
});
109163
}
110164
111-
toaster.success({
112-
titleTag: "h2",
113-
description: "Les informations ont été enregistrées avec succès.",
114-
});
115165
emit("next");
116166
}
117167
118168
function onNext() {
119-
saveAgrement();
169+
saveCoordonneesStep();
120170
}
121171
122-
defineExpose({ saveAgrement });
172+
defineExpose({ saveCoordonneesStep });
123173
</script>

0 commit comments

Comments
 (0)