github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/frontend/directeurs/src/components/equipiers/AddEquipier.vue (about) 1 <template> 2 <div> 3 <v-dialog v-model="showChoixRole" max-width="600px"> 4 <v-card> 5 <v-card-title class="headline">{{ 6 rattache 7 ? "Rattacher à un profil connu" 8 : "Créer un profil temporaire" 9 }}</v-card-title> 10 <v-card-text v-if="personneAjout != null"> 11 <span v-if="rattache" 12 >Le profil connu {{ personneAjout.personne.prenom }} 13 {{ personneAjout.personne.nom }} sera ajouté à votre équipe.</span 14 > 15 <span v-else> 16 Un profil temporaire au nom de 17 <b 18 >{{ personneAjout.personne.nom }} 19 {{ personneAjout.personne.prenom }}</b 20 > 21 va être crée. Il sera validé ultérieurement pour être ajouté à la 22 base de données. 23 </span> 24 <roles-field 25 v-model="rolesAjout" 26 :required="true" 27 label="Rôle du nouvel équipier" 28 ></roles-field> 29 </v-card-text> 30 <v-card-actions> 31 <v-spacer></v-spacer> 32 <v-btn class="success" :disabled="!isRolesValid" @click="valideAjout" 33 >Ajouter</v-btn 34 > 35 </v-card-actions> 36 </v-card> 37 </v-dialog> 38 39 <form-equipier 40 :withButtons="false" 41 :withDetails="false" 42 @dataChanged="launchSearch" 43 ref="formEquipier" 44 > 45 <template v-slot:title="{ tmpEquipier }"> 46 <v-container fluid pa-1 ma-0> 47 <v-layout row mx-0> 48 <v-flex xs="6" md="4"> 49 <span class="headline">Ajouter un équipier</span> 50 </v-flex> 51 <v-flex xs="6" md="8"> 52 <div class="text-right"> 53 <v-btn @click="creeEquipier(tmpEquipier)"> 54 <v-icon class="mr-1" color="success">{{ 55 $icons["mdi-plus-circle"] 56 }}</v-icon 57 >Vers un nouveau profil 58 </v-btn> 59 </div> 60 </v-flex> 61 </v-layout> 62 <v-layout row mt-2 mb-0> 63 <v-flex> 64 <v-alert class="ma-0" type="error" :value="!!errorEmptyNomPrenom" 65 >{{ errorEmptyNomPrenom }} 66 </v-alert> 67 </v-flex> 68 </v-layout> 69 </v-container> 70 </template> 71 </form-equipier> 72 <results-equipier 73 :items="searchResults" 74 class="m-5" 75 @rattache="rattacheEquipier" 76 ></results-equipier> 77 </div> 78 </template> 79 80 <script lang="ts"> 81 import Vue from "vue"; 82 import Component from "vue-class-component"; 83 import FormEquipier from "./FormEquipier.vue"; 84 import ResultsEquipier from "./ResultsEquipier.vue"; 85 import { C } from "../../logic/controller"; 86 import { 87 PatternsSimilarite, 88 ResultatRecherche, 89 EquipierDirecteur, 90 CreateEquipierIn, 91 Role, 92 Sexe, 93 Roles 94 } from "../../logic/types"; 95 import { EditFields, NullDate } from "@/logic/formatter"; 96 import RolesField from "./RolesField.vue"; 97 98 const DEBOUNCE = 300; // ms 99 100 // typesafe data 101 type CreateData = 102 | { mode: "rattache"; personne: ResultatRecherche } 103 | { mode: "cree"; personne: PatternsSimilarite }; 104 105 function nullPatterns(): PatternsSimilarite { 106 return { 107 nom: "", 108 prenom: "", 109 sexe: Sexe.SAucun, 110 date_naissance: NullDate, 111 mail: "", 112 nom_jeune_fille: "" 113 }; 114 } 115 116 const AddEquipierProps = Vue.extend({ 117 props: {} 118 }); 119 120 @Component({ 121 components: { FormEquipier, ResultsEquipier, RolesField } 122 }) 123 export default class AddEquipier extends AddEquipierProps { 124 errorEmptyNomPrenom = ""; 125 searchResults: ResultatRecherche[] = []; 126 timerLaunchSearch: number | null = null; 127 rolesAjout: NonNullable<Roles> = []; 128 129 personneAjout: CreateData = { mode: "cree", personne: nullPatterns() }; 130 showChoixRole = false; 131 132 $refs!: { 133 formEquipier: FormEquipier; 134 }; 135 136 get rattache() { 137 return this.personneAjout.mode == "rattache"; 138 } 139 140 launchSearch(dataSearch: PatternsSimilarite) { 141 if (this.timerLaunchSearch != null) { 142 clearTimeout(this.timerLaunchSearch); 143 this.timerLaunchSearch = null; 144 } 145 146 this.timerLaunchSearch = setTimeout(() => { 147 this.doSearch(dataSearch); 148 }, DEBOUNCE); 149 } 150 151 async doSearch(dataSearch: PatternsSimilarite) { 152 const data = await C.rechercheProfil(dataSearch); 153 if (data == undefined) return; 154 this.searchResults = data.propositions || []; 155 C.notifications.progress = false; 156 } 157 158 rattacheEquipier(personne: ResultatRecherche) { 159 this.personneAjout = { mode: "rattache", personne }; 160 this.showChoixRole = true; 161 } 162 creeEquipier(tmpEquipier: EquipierDirecteur) { 163 if (!tmpEquipier.nom || !tmpEquipier.prenom) { 164 this.errorEmptyNomPrenom = 165 "Merci de préciser au moins le nom et le prénom du nouvel équipier."; 166 setTimeout(() => { 167 this.errorEmptyNomPrenom = ""; 168 }, 3000); 169 return; 170 } 171 this.personneAjout = { 172 mode: "cree", 173 personne: JSON.parse(JSON.stringify(tmpEquipier)) 174 }; 175 176 this.showChoixRole = true; 177 } 178 179 get isRolesValid() { 180 return this.rolesAjout && this.rolesAjout.length > 0; 181 } 182 183 valideAjout() { 184 if (!this.isRolesValid || this.personneAjout == null) return; 185 this.showChoixRole = false; 186 const params: CreateEquipierIn = { 187 rattache: this.personneAjout.mode == "rattache", 188 roles: this.rolesAjout, 189 personne: nullPatterns(), 190 id_personne: 0 191 }; 192 if (this.personneAjout.mode == "rattache") { 193 params.id_personne = this.personneAjout.personne.id; 194 } else { 195 params.personne = this.personneAjout.personne; 196 } 197 this.$emit("ajoute-equipier", params); 198 this.$refs.formEquipier.reset(); 199 this.searchResults = []; 200 } 201 } 202 </script> 203 204 <style> 205 v-dialog { 206 height: 90%; 207 } 208 </style>