github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/frontend/bv/src/pages/equipier/App.vue (about) 1 <template> 2 <base-app :title="title"> 3 <success 4 v-if="output" 5 :output="output" 6 :position="successPosition" 7 ></success> 8 <error v-if="output" :output="output"></error> 9 10 <b-modal 11 v-model="showCharte" 12 size="xl" 13 title="Charte d’engagement bénévole" 14 scrollable 15 header-bg-variant="secondary" 16 footer-bg-variant="secondary" 17 > 18 <charte :sexe="equipier ? equipier.sexe : 'M'"></charte> 19 <template v-slot:modal-footer> 20 <btn variant="success" @click="updateCharte($event, true)" 21 >J'approuve cette charte</btn 22 > 23 <btn 24 variant="warning" 25 class="text-right" 26 @click="updateCharte($event, false)" 27 >J'émets des réserves</btn 28 > 29 </template> 30 </b-modal> 31 32 <b-modal 33 title="Documents manquants" 34 v-model="showPiecesManquantes" 35 hide-footer 36 size="lg" 37 > 38 Merci d'ajouter les documents manquants (<span 39 v-html="piecesManquantes.join(', ')" 40 ></span 41 >) ! 42 </b-modal> 43 44 <b-container class="my-2 mb-4"> 45 <transition name="fade" mode="out-in" duration="400"> 46 <b-row 47 style="min-height: 50vh;" 48 v-if="initialLoading || serverData == null" 49 > 50 <b-col class="align-self-center"> 51 <b-progress 52 :value="100" 53 variant="secondary" 54 :animated="serverData != null" 55 class="mt-3" 56 ></b-progress> 57 </b-col> 58 </b-row> 59 <div v-else> 60 <b-alert variant="info" show> 61 Bienvenu{{ equipier && equipier.sexe == "F" ? "e" : "" }} 62 <b>{{ equipier ? equipier.prenom : "" }}</b 63 >, et merci pour ton engagement avec l'ACVE !<br /> 64 Ce formulaire te permet de remplir directement les informations et 65 documents nécessaires à Jeunesse et Sport. 66 <br /> 67 Merci de vérifier que tout est à jour... 68 </b-alert> 69 70 <b-alert :show="showJoomeo"> 71 Tu peux retrouver les 72 <b-link :href="joomeo.space_url">photos du séjour sur Joomeo</b-link 73 >, en utilisant ces identifiants : 74 <b-row class="my-2"> 75 <b-col class="text-center" 76 >Identifiant : <b>{{ joomeo.login }}</b> 77 </b-col> 78 <b-col class="text-center" 79 >Mot de passe : <b>{{ joomeo.password }}</b> 80 </b-col> 81 </b-row> 82 </b-alert> 83 84 <form-equipier 85 v-model="equipier" 86 :camp="camp" 87 ref="formEquipier" 88 ></form-equipier> 89 90 <documents></documents> 91 92 <b-row> 93 <b-col> 94 <b-button variant="info" @click="showCharte = true" 95 >Afficher la charte d'engagement</b-button 96 > 97 </b-col> 98 <b-col></b-col> 99 <b-col> 100 <btn block variant="accent" @click="save" 101 >Enregistrer mon profil</btn 102 > 103 </b-col> 104 </b-row> 105 </div> 106 </transition> 107 </b-container> 108 </base-app> 109 </template> 110 111 <script lang="ts"> 112 import Vue from "vue"; 113 import Component from "vue-class-component"; 114 import BaseApp from "../../BaseApp.vue"; 115 import Success from "../../shared/notifications/Success.vue"; 116 import Error from "../../shared/notifications/Error.vue"; 117 import FormEquipier from "./FormEquipier.vue"; 118 import Charte from "./Charte.vue"; 119 import Documents from "./Documents.vue"; 120 import Btn from "../../shared/Btn.vue"; 121 122 import { 123 NotificationContent, 124 EquipierEquipier, 125 DataEquipier, 126 PublicDocument, 127 OptionnalBool, 128 DatasJoomeo 129 } from "@/shared/logic/types"; 130 import Cookies from "js-cookie"; 131 132 import { 133 BaseController, 134 UrlServerBase, 135 devMode 136 } from "../../shared/logic/controller"; 137 import axios, { AxiosResponse } from "axios"; 138 import { ControllerDocument } from "../../shared/logic/controller"; 139 import { scrollToError, ValidEvent } from "../../shared/utils"; 140 import { HACCP, DOCUMENTS } from "../../shared/logic/enums"; 141 import { C } from "./controller"; 142 import { SuccesPosition } from "@/shared/utils"; 143 144 @Component({ 145 components: { BaseApp, Error, Success, FormEquipier, Documents, Btn, Charte } 146 }) 147 export default class App extends Vue { 148 output = C.notifications; 149 controller: ControllerDocument = C; 150 showPiecesManquantes = false; 151 initialLoading = true; 152 153 successPosition = SuccesPosition.TopRight; 154 155 showCharte = false; 156 157 joomeo: DatasJoomeo = { 158 space_url: "", 159 login: "", 160 password: "" 161 }; 162 163 $refs!: { 164 formEquipier: FormEquipier; 165 }; 166 167 C = C; 168 get serverData(): DataEquipier | null { 169 return C.data; 170 } 171 172 get showJoomeo() { 173 return !!this.joomeo.login; 174 } 175 176 get title() { 177 if (this.serverData == null) return "Equipier"; 178 return "Equipier - " + this.serverData.camp.label; 179 } 180 181 get equipier() { 182 if (this.serverData == null) return null; 183 return this.serverData.equipier; 184 } 185 186 get camp() { 187 if (this.serverData == null) return null; 188 return this.serverData.camp; 189 } 190 191 get piecesManquantes(): string[] { 192 return C.pieces 193 .filter(p => !p.optionnel) // contraintes bloquantes uniquement 194 .filter(p => (p.docs || []).length == 0) // doc nons remplis 195 .map(p => `<b>${p.contrainte.nom}</b>`); 196 } 197 198 async mounted() { 199 // on lance la requête Joomeo séparément 200 C.loadJoomeo().then(v => { 201 if (v === undefined) return; 202 this.joomeo = v; 203 }); 204 await C.loadDatas(); 205 this.initialLoading = false; 206 } 207 208 async save(event: ValidEvent) { 209 const isValid = await this.$refs.formEquipier.validate(); 210 if (!isValid) return; 211 if (this.piecesManquantes.length > 0) { 212 this.showPiecesManquantes = true; 213 return; 214 } 215 await C.saveEquipier(event); 216 let showCharte = true; 217 // on n'affiche pas la charte si elle a déjà été remplie 218 if (C.data != null && C.data.equipier.charte != OptionnalBool.OBPeutEtre) { 219 showCharte = false; 220 } 221 this.showCharte = showCharte; 222 } 223 224 async updateCharte(event: ValidEvent, accepte: boolean) { 225 await C.updateCharte( 226 event, 227 accepte ? OptionnalBool.OBOui : OptionnalBool.OBNon 228 ); 229 this.showCharte = false; 230 } 231 } 232 </script> 233 234 <style></style>