Menu.vue 8.06 KB
Newer Older
1
<template>
Jérémie Passerat's avatar
Jérémie Passerat committed
2 3
  <div id="menuHaut" v-bind:class="darkMode ? 'dark' : ''">
    <DarkModeSwitch v-bind:style="{'margin-top': '10px', 'margin-left': '10px'}" @switched="onSwitched"/>
4 5 6 7
    <Choix_Mode_Variante v-bind:darkMode="darkMode" class="menuVariante" v-show="variante"></Choix_Mode_Variante>
    <span id="prout">{{ titrePage }}</span>
    <div class="notif" v-on:click="choixIconeNotification" v-show="isNotif === true"
         v-bind:style="[!variante ? {'margin-left': '90%'} : {'margin-left': '32%'}]"></div>
8
    <div class="circle" id="menuAuteur" v-on:click="isAffiche = !isAffiche"  v-bind:style="styleCircle">
9

10
    </div>
11
    <div class="menu" v-bind:class="darkMode ? 'menuDark' : ''"   v-show="isAffiche">
12 13
      <div v-if="etat !== 'Profil'" class="sous_menu" v-bind:class="darkMode ? 'sous_menuDark' : ''"  v-on:click="choixMenuAnnexe">Profil</div>
      <div v-else class="sous_menu"  v-bind:class="darkMode ? 'sous_menuDark' : ''" v-on:click="choixMenuAnnexe">Contenu</div>
14 15
      <div v-if="etat !== 'Mises à jour'"  v-bind:class="darkMode ? 'sous_menuDark' : ''" class="sous_menu" v-on:click="choixMenuAnnexe">Mises à jour</div>
      <div v-else class="sous_menu"  v-bind:class="darkMode ? 'sous_menuDark' : ''" v-on:click="choixMenuAnnexe">Contenu</div>
16 17 18 19 20

      <div v-if="etat !== 'Tags'"  class="sous_menu"  v-bind:class="darkMode ? 'sous_menuDark' : ''" v-on:click="choixMenuAnnexe">Tags</div>
      <div v-else class="sous_menu"  v-bind:class="darkMode ? 'sous_menuDark' : ''" v-on:click="choixMenuAnnexe">Contenu</div>
      <div v-if="etat !== 'Evaluations'"  class="sous_menu"   v-bind:class="darkMode ? 'sous_menuDark' : ''" v-on:click="evaluations">Evaluations</div>
      <div v-else class="sous_menu"  v-bind:class="darkMode ? 'sous_menuDark' : ''" v-on:click="choixMenuAnnexe">Contenu</div>
21
      <div class="sous_menu"  v-bind:class="darkMode ? 'sous_menuDark' : ''" v-on:click="choixMenuAnnexe">Deconnexion</div>
22 23 24 25 26
    </div>
  </div>
</template>

<script>
27
//[!isNotif ? {'margin-left': '94.75%'} : {'margin-left': '3%'}
28 29
import Choix_Mode_Variante from "./components/Choix_Mode_Variante";
import Service from "./service/Service";
Jérémie Passerat's avatar
Jérémie Passerat committed
30 31 32
import DarkModeSwitch from 'vue-dark-mode-switch'
import 'vue-dark-mode-switch/dist/vue-dark-mode-switch.css'

33 34 35 36
export default {
  name: "Menu",
  data: function () {
    return {
37
      isAffiche: false,
38 39
      isNotif: false,
      isRecu: false,
40
      isPropose: false,
41
      styleCircle: {},
Jérémie Passerat's avatar
Jérémie Passerat committed
42
      darkMode: false,
43
      titrePage: "",
44
      roblox: "https://www.google.com/url?sa=i&url=https%3A%2F%2Feducation.roblox.com%2F&psig=AOvVaw2WUZcaXl4Wpn3dLXhgO41R&ust=1626436473301000&source=images&cd=vfe&ved=0CAoQjRxqFwoTCIjmoJWC5fECFQAAAAAdAAAAABAD"
45 46
    }
  },
47 48 49 50 51 52 53 54 55 56
  props: {
    // Permet de déterminer si on est dans le mode mise à jour ou pas
    etat: {},
    // Booléen pour savoir si la variante du menu Banque/Panier est active ou pas
    variante: {},
    // Auteur connecté
    auteur: {},
    // Booléen permettant le recalcul des notifications
    recalculerNotif: {}
  },
57
  methods: {
58 59 60 61
    /**
     * @vuese
     * Gestion du clic sur un des éléments du menu 'auteur' (en haut à droite)
     */
62
    choixMenuAnnexe: function (e) {
63 64 65 66 67 68 69
      const menuClique = e.target.innerText
      if (menuClique !== 'Contenu'){
        this.titrePage = menuClique
      } else {
        this.titrePage = "OpenQuizz - Bienvenue " + this.auteur
      }
      this.$emit("menu_choisi", {choix: menuClique})
70 71
      this.isAffiche = false
    },
72 73 74 75
    /**
     * @vuese
     * Gestion du clic sur le menu des évaluations. Sera, a terme, intégré dans choisMenuAnnexe.
     */
76 77 78
    evaluations: function () {
      alert("Gestion des évaluations (a venir)")
    },
79 80 81 82
    /**
     * @vuese
     * Gestion du clic sur l'icone de notification
     */
83 84 85 86
    choixIconeNotification: function () {
      this.$emit("menu_choisi", {choix: "Mises à jour", isRecu: this.isRecu, isPropose: this.isPropose})
      this.isAffiche = false
    },
87 88 89 90
    /**
     * @vuese
     * Fonction de calcul de présence de notification dans le cadre des mises à jour recues (de contenu perso ou de contenu tiers)
     */
91 92 93 94
    publicationsRecues: function () {
      let that = this
      Service.getPublicationsRecues(this.auteur).then(function (response) {
        let contenusRecu = response.data
95

96 97


98 99
        for (let i = 0; i < contenusRecu.length; i++) {

100

101 102 103 104 105
          if (contenusRecu[i].etat === "enCours") {
            that.isNotif = contenusRecu.length !== 0
            that.isRecu = that.isNotif
          }
        }
106
        that.majTiers()
107
        that.changerStyle()
108 109
      })
    },
110 111 112 113
    /**
     * @vuese
     * Fonction de calcul de présence de notification dans le cadre des mises à jour proposées (dont l'état n'est plus en cours)
     */
114 115 116 117
    publicationsProposees: function () {
      let that = this
      Service.getPublicationsProposees(this.auteur).then(function (response) {
        let contenusPropose = response.data
118

119

120
        for (let i = 0; i < contenusPropose.length; i++) {
121

122 123 124 125 126
          if (contenusPropose[i].etat !== "enCours") {
            that.isNotif = true
            that.isPropose = that.isNotif
          }
        }
127 128
        that.changerStyle()

129
      })
130
    },
131 132 133 134
    /**
     * @vuese
     * (A construire) Fonction de calcul du nombre de maj tiers disponibles
     */
135
    majTiers: function () {
136
      let that = this
137
      Service.isMajTiersDisponible(this.auteur).then(function (response) {
138

139 140 141 142
        if (response.data === "True") {
          that.isNotif = true
          that.isRecu = that.isNotif
        }
143 144
        that.changerStyle()

145
      })
146
    },
Jérémie Passerat's avatar
Jérémie Passerat committed
147 148 149 150
    /**
     * @vuese
     * Fonction qui petmet d'affecter les bonnes marges pour le menu d'en haut à droite
     */
151
    changerStyle: function () {
152

153

154 155 156 157
      if (this.isNotif){
        this.styleCircle["margin-left"] = "3%"
      }
      else if (this.variante){
158
        this.styleCircle["margin-left"] = "38.87%"
159 160 161 162 163
      }
      else {
        this.styleCircle["margin-left"] = "94.75%"

      }
Jérémie Passerat's avatar
Jérémie Passerat committed
164 165 166 167
    },
    onSwitched: function (isSwitched) {
      this.darkMode = isSwitched
      this.$emit("darkTheme", {active: isSwitched})
168 169
    }
  },
170
  components: {
Jérémie Passerat's avatar
Jérémie Passerat committed
171 172
    Choix_Mode_Variante,
    DarkModeSwitch
173 174
  },
  watch: {
175 176 177 178
    /**
     * @vuese
     * Dès que l'auteur est trasmis à cette page, on calcule ses opportunités de maj et on configure la notification en fonction
     */
179
    auteur: function () {
180
      this.isNotif = false
181 182
      this.publicationsRecues()
      this.publicationsProposees()
183

184
      this.changerStyle()
185
      this.titrePage = "OpenQuizz - Bienvenue " + this.auteur
186
    },
187 188 189 190
    /**
     * @vuese
     * Recalcul des opportunités de maj et on configure la notification en fonction après action dans le menu maj (fonctionne actuellement pas)
     */
191 192 193
    recalculerNotif: function () {
      this.isNotif = false
      this.publicationsRecues()
194
      this.changerStyle()
195 196 197
    },
    variante: function () {
      this.changerStyle()
198 199
    }
  }
200 201 202 203 204 205 206
}
</script>

<style scoped>

#menuHaut{
  display: flex;
207
  background-color: white;
208
  justify-content: center;
209
}
210 211
.circle {
  border: 1px solid yellow;
212 213
  margin-top: 0.25%;
  margin-bottom: 0.25%;
214 215 216 217
  border-radius: 50%;
  display: flex; /* or inline-flex */
  align-items: center;
  justify-content: center;
218 219 220 221 222 223
  height: 37.5px;
  width: 37.5px;

  background: gold url(assets/img/person2.png);
  background-size: cover;

224
}
225

226 227 228
.menuVariante{
  margin-top: 1%;
  z-index: 1;
229

230
}
231

232 233 234 235 236
.menu{
  height: 200px;
  width: 100px;
  background: white;
  border: thin solid black;
237
  margin-top: 46px;
Jérémie Passerat's avatar
Jérémie Passerat committed
238
  margin-left: 94.75%;
239
  position: fixed;
240 241 242 243
  display: flex;
  flex-direction: column;
  text-align: center;
  vertical-align: middle;
244

245
  z-index: 5;
246
}
247

248 249 250 251 252 253 254
.notif {
  border: thin solid black;
  border-radius: 30%;
  height: 30px;
  width: 30px;
  margin-top: 1.5%;
  z-index: 1;
255
  margin-left: 90%;
256 257
  background-image: url(assets/img/cloche.png);
  background-size: cover;
258

259
}
260

261 262 263 264
.sous_menu{
  flex-basis: 20%;
  border: thin solid black;
  line-height: 36px;
265
  z-index: 1;
266

267
}
268

269 270
#prout {

271 272 273 274 275
  display: flex;
  position: absolute;
  margin-top: 0.5%;
  margin-bottom: 0.1%;
}
Jérémie Passerat's avatar
Jérémie Passerat committed
276

277
.dark, .menuDark, .sous_menuDark {
Jérémie Passerat's avatar
Jérémie Passerat committed
278 279
  background-color: #111 !important;
  color: #eee;
280
  border-color: white !important;
Jérémie Passerat's avatar
Jérémie Passerat committed
281
}
282
</style>