3 Commits
Author SHA1 Message Date
legonzaur 429b8048a0 admon code for results
release-tag / release-image (push) Successful in 1m6s
2025-06-01 16:00:55 +02:00
legonzaur 75669682ab fix typo
release-tag / release-image (push) Successful in 59s
2025-06-01 15:31:25 +02:00
legonzaur 36c4ad1579 custom bouton valider 2025-06-01 14:28:09 +02:00
5 changed files with 69 additions and 12 deletions
+9 -8
View File
@@ -21,7 +21,7 @@
réaliser la distribution des œufs, réaliser la distribution des œufs,
</li> </li>
<li> <li>
être Référent d’un resultsproduit. être Référent d’un produit.
</li> </li>
<li> <li>
être Référent du local de distribution (si officiellement créé), Référent Impression, être Référent du local de distribution (si officiellement créé), Référent Impression,
@@ -102,7 +102,7 @@
<component :is="questionComponent" question-id="5.2" :results="results" /> <component :is="questionComponent" question-id="5.2" :results="results" />
</div> </div>
<div> <div>
5.3) On n’attend que le prise de conscience vienne de l’amapien. 5.3) On n’attend que la prise de conscience vienne de l’amapien.
<component :is="questionComponent" question-id="5.3" :results="results" /> <component :is="questionComponent" question-id="5.3" :results="results" />
</div> </div>
@@ -150,25 +150,26 @@
9) <b>Cas par cas :</b> Colette Payen-Vigne,Valérie Lambert, et Laura Math nous font par de leur 9) <b>Cas par cas :</b> Colette Payen-Vigne,Valérie Lambert, et Laura Math nous font par de leur
impossibilité de réaliser les permanences de distribution les vendredi soir. impossibilité de réaliser les permanences de distribution les vendredi soir.
<div> <div>
→ Valérie : Depuis 4 ans elle s’occupe des cerises en été et elle nous dit que ça occupe plus que 4 9.1) → Valérie : Depuis 4 ans elle s’occupe des cerises en été et elle nous dit que ça occupe plus
que 4
distributions, et donc qu’en terme d’engagement, elle fait sa part. distributions, et donc qu’en terme d’engagement, elle fait sa part.
<component :is="questionComponent" question-id="9-Valérie" :results="results" <component :is="questionComponent" question-id="9.1" :results="results"
:values="['Je suis ok avec ça.', 'Non, je ne suis pas d’accord.']" :values="['Je suis ok avec ça.', 'Non, je ne suis pas d’accord.']"
:colors="['#87E169', '#FF824B']" /> :colors="['#87E169', '#FF824B']" />
</div> </div>
<div> <div>
→ Laura : elle est référente Viande pour la ferme de Bellevue des produits, et nous dit avoir 9.2) → Laura : elle est référente Viande pour la ferme de Bellevue des produits, et nous dit avoir
trouver une organisation pour faire des permanences de distribution le vendredi soir. trouver une organisation pour faire des permanences de distribution le vendredi soir.
<component :is="questionComponent" question-id="9-Laura" :results="results" <component :is="questionComponent" question-id="9.2" :results="results"
:values="['Je suis ok avec ça.', 'Non, je ne suis pas d’accord.']" :values="['Je suis ok avec ça.', 'Non, je ne suis pas d’accord.']"
:colors="['#87E169', '#FF824B']" /> :colors="['#87E169', '#FF824B']" />
</div> </div>
<div> <div>
→ Colette : elle propose de distribuer les œufs de temps en temps, pour faire sa part. 9.3) → Colette : elle propose de distribuer les œufs de temps en temps, pour faire sa part.
<component :is="questionComponent" question-id="9-Colette" :results="results" <component :is="questionComponent" question-id="9.3" :results="results"
:values="['Je suis ok avec ça.', 'Non, je ne suis pas d’accord.']" :values="['Je suis ok avec ça.', 'Non, je ne suis pas d’accord.']"
:colors="['#87E169', '#FF824B']" /> :colors="['#87E169', '#FF824B']" />
</div> </div>
+7
View File
@@ -1,5 +1,8 @@
<template> <template>
<div class="emphased"> <div class="emphased">
<div>
<input class="hidden" checked ref="input" type="radio" value="unset" :name="questionId">
</div>
<RadioButton v-for="(val, index) in values" :key="index" :index="index" :question-id="questionId" :val="val" <RadioButton v-for="(val, index) in values" :key="index" :index="index" :question-id="questionId" :val="val"
:color="colors[index] ?? 'unset'" /> :color="colors[index] ?? 'unset'" />
</div> </div>
@@ -32,4 +35,8 @@ const { values = ["Très bien", "Bien", "Passable", "Insuffisant", "À rejeter"]
.emphased div:last-child { .emphased div:last-child {
border-right: 1px solid #444; border-right: 1px solid #444;
} }
.hidden {
display: none;
}
</style> </style>
+13 -1
View File
@@ -3,10 +3,11 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
const code = to.query.code; const code = to.query.code;
if (to.path === "/poll") { if (to.path === "/poll") {
console.log(`${runtimeConfig.public.apiBase}/check/${code}`)
const { error } = await useFetch(`${runtimeConfig.public.apiBase}/check/${code}`); const { error } = await useFetch(`${runtimeConfig.public.apiBase}/check/${code}`);
if (error.value && error.value.statusCode !== 200) { if (error.value && error.value.statusCode !== 200) {
if(error.value.statusCode == 403){ if(error.value.statusCode == 403){
return navigateTo({path:"/results", query:to.query}); return navigateTo({path:"/finished", query:to.query});
} }
throw createError({ throw createError({
statusCode: error.value.statusCode, statusCode: error.value.statusCode,
@@ -17,7 +18,18 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
return; return;
} }
if(to.path === "/finished"){
return
}
if(to.path === "/results"){ if(to.path === "/results"){
if(code != "fc6d9f50-68af-4df5-95d4-36745c2938c9"){
throw createError({
statusCode: 403,
statusMessage: "Invalid code",
message: "Vous ne pouvez pas accéder aux résultats avec ce code !"
});
}
return return
} }
+8
View File
@@ -0,0 +1,8 @@
<template>
<div>
Merci d'avoir voté !
<br />
L'organisateur du sondage vous communiquera les résultats prochainement.
</div>
</template>
+32 -3
View File
@@ -1,7 +1,8 @@
<template> <template>
<MainPoll :question-component="QuestionChoice" @submit="submitForm"> <MainPoll :question-component="QuestionChoice" @submit="submitForm">
<template #submit> <template #submit>
<button type="submit">Submit</button> <div id="error">{{ errorMessage }}</div>
<button id="form-submit" type="submit">Valider</button>
</template> </template>
</MainPoll> </MainPoll>
</template> </template>
@@ -15,16 +16,44 @@ const runtimeConfig = useRuntimeConfig()
const route = useRoute() const route = useRoute()
const errorMessage = ref("")
async function submitForm(e: Event) { async function submitForm(e: Event) {
const target = e.target const target = e.target
if (!target || !(target instanceof HTMLFormElement)) { if (!target || !(target instanceof HTMLFormElement)) {
throw Error("Form target not found") throw Error("Form target not found")
} }
const formObject = Object.fromEntries(new FormData(target))
const filtered = Object.keys(Object.fromEntries(Object.entries(formObject).filter(([key, value]) => value == "unset"
))).sort((a, b) => (Number(a) || Number(a[0])) - (Number(b) || Number(b[0])))
console.log(filtered)
if (filtered.length > 0) {
errorMessage.value = `Vous n'avez pas répondu à toutes les questions ! Veuillez répondre aux questions suivantes : ${filtered.join(", ")}`
return
}
await $fetch(`${runtimeConfig.public.apiBase}/vote/${route.query.code}`, { await $fetch(`${runtimeConfig.public.apiBase}/vote/${route.query.code}`, {
method: "POST", method: "POST",
body: Object.fromEntries(new FormData(target)) body: Object.fromEntries(new FormData(target))
}) })
navigateTo({ path: "/results", query: route.query }) navigateTo({ path: "/finished", query: route.query })
} }
</script> </script>
<style>
#form-submit {
cursor: pointer;
padding: .375rem .75rem;
border-width: 0px;
border-color: rgb(0, 0, 0);
border-radius: 5px;
background-color: rgb(17, 95, 239);
color: white;
font-size: 1em;
}
#error {
color: #E94A4D;
}
</style>