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>