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,
</li>
<li>
être Référent d’un resultsproduit.
être Référent d’un produit.
</li>
<li>
ê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" />
</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" />
</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
impossibilité de réaliser les permanences de distribution les vendredi soir.
<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.
<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.']"
:colors="['#87E169', '#FF824B']" />
</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.
<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.']"
:colors="['#87E169', '#FF824B']" />
</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.']"
:colors="['#87E169', '#FF824B']" />
</div>
+7
View File
@@ -1,5 +1,8 @@
<template>
<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"
:color="colors[index] ?? 'unset'" />
</div>
@@ -32,4 +35,8 @@ const { values = ["Très bien", "Bien", "Passable", "Insuffisant", "À rejeter"]
.emphased div:last-child {
border-right: 1px solid #444;
}
.hidden {
display: none;
}
</style>
+13 -1
View File
@@ -3,10 +3,11 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
const code = to.query.code;
if (to.path === "/poll") {
console.log(`${runtimeConfig.public.apiBase}/check/${code}`)
const { error } = await useFetch(`${runtimeConfig.public.apiBase}/check/${code}`);
if (error.value && error.value.statusCode !== 200) {
if(error.value.statusCode == 403){
return navigateTo({path:"/results", query:to.query});
return navigateTo({path:"/finished", query:to.query});
}
throw createError({
statusCode: error.value.statusCode,
@@ -17,7 +18,18 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
return;
}
if(to.path === "/finished"){
return
}
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
}
+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>
<MainPoll :question-component="QuestionChoice" @submit="submitForm">
<template #submit>
<button type="submit">Submit</button>
<div id="error">{{ errorMessage }}</div>
<button id="form-submit" type="submit">Valider</button>
</template>
</MainPoll>
</template>
@@ -15,16 +16,44 @@ const runtimeConfig = useRuntimeConfig()
const route = useRoute()
const errorMessage = ref("")
async function submitForm(e: Event) {
const target = e.target
if (!target || !(target instanceof HTMLFormElement)) {
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}`, {
method: "POST",
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>