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>