|
24 | 24 | <section class="exercise"> |
25 | 25 | <h1>{{exercise.title}}</h1> |
26 | 26 | <span>Créé le {{$moment(exercise.createdAt).format("DD/MM/YY à H:mm")}}</span> | <span>Mis à jour le {{$moment(exercise.updatedAt).format("DD/MM/YY à H:mm")}}</span> |
| 27 | + |
| 28 | + <div class="score__info"> |
| 29 | + <div v-if="$auth.loggedIn"> |
| 30 | + <h4 class="title--primary-color__light">Votre note</h4> |
| 31 | + <Rating :rating="rating" @rating="rate"/> |
| 32 | + </div> |
| 33 | + <div> |
| 34 | + <h4 class="title--primary-color__light">Moyenne de l'exercice</h4> |
| 35 | + <div class="avg-score" v-if="nbVotes !== 0"> |
| 36 | + <span>{{avgVote}}</span> |
| 37 | + <Icon theme="theme--primary-color" type="star"/> |
| 38 | + </div> |
| 39 | + <div v-else> |
| 40 | + <span>Pas encore évalué</span> |
| 41 | + </div> |
| 42 | + </div> |
| 43 | + </div> |
27 | 44 | <button v-if="isTheCreator || isAdmin || isSuperAdmin" @click="modifyExercise" |
28 | 45 | class="button--ternary-color-reverse">Modifier l'exercice |
29 | 46 | </button> |
|
38 | 55 |
|
39 | 56 | <script lang="ts"> |
40 | 57 | import {Component, Mixins} from "vue-property-decorator"; |
41 | | - import {Exercise} from "~/types"; |
| 58 | + import {Exercise, ExerciseMetrics} from "~/types"; |
42 | 59 | import Icon from "~/components/Symbols/Icon.vue"; |
43 | 60 | import hljs from 'highlight.js/lib/highlight'; |
44 | 61 | import javascript from 'highlight.js/lib/languages/javascript'; |
|
52 | 69 | import DetailsPanel from "~/components/Panel/Item/DetailsPanel.vue"; |
53 | 70 | import UserMixins from "~/components/Mixins/Api/UserMixins"; |
54 | 71 | import {AxiosError} from "axios"; |
| 72 | + import Rating from "~/components/Rating/Rating.vue"; |
55 | 73 |
|
56 | 74 | hljs.registerLanguage('javascript', javascript); |
57 | 75 | hljs.registerLanguage('css', css); |
|
62 | 80 |
|
63 | 81 | @Component({ |
64 | 82 | components: { |
| 83 | + Rating, |
65 | 84 | DetailsPanel, |
66 | 85 | PanelItem, |
67 | 86 | Panel, |
|
76 | 95 | } catch (e) { |
77 | 96 | const axiosError = e as AxiosError; |
78 | 97 |
|
79 | | - if(axiosError.response) { |
| 98 | + if (axiosError.response) { |
80 | 99 | const status: number = axiosError.response.status; |
81 | 100 |
|
82 | | - if(status === 404) { |
| 101 | + if (status === 404) { |
83 | 102 | error({statusCode: status, message: "Cet exercice est introuvable."}); |
84 | | - } else if(status === 410) { |
| 103 | + } else if (status === 410) { |
85 | 104 | error({statusCode: 410, message: "Cet exercice a été archivé."}); |
86 | | - } else if(status === 500) { |
87 | | - error({statusCode: status, message: "Une erreur est survenue depuis nos serveurs, veuillez-nous en excuser."}); |
| 105 | + } else if (status === 500) { |
| 106 | + error({ |
| 107 | + statusCode: status, |
| 108 | + message: "Une erreur est survenue depuis nos serveurs, veuillez-nous en excuser." |
| 109 | + }); |
88 | 110 | } |
89 | 111 | } else { |
90 | 112 | error({statusCode: 404, message: "Cet exercice est introuvable."}); |
|
113 | 135 | } |
114 | 136 | } |
115 | 137 |
|
| 138 | + get rating() { |
| 139 | + return this.exercise.vote ? this.exercise.vote : 0 |
| 140 | + } |
| 141 | +
|
| 142 | + get avgVote() { |
| 143 | +
|
| 144 | + const metrics: ExerciseMetrics | undefined = this.exercise.metrics; |
| 145 | +
|
| 146 | + if(metrics) { |
| 147 | + return metrics.avg_score |
| 148 | + } |
| 149 | +
|
| 150 | + return '-' |
| 151 | + } |
| 152 | +
|
| 153 | + get nbVotes() { |
| 154 | + const metrics: ExerciseMetrics | undefined = this.exercise.metrics; |
| 155 | +
|
| 156 | + if (metrics) { |
| 157 | + console.log(metrics); |
| 158 | + return metrics.votes |
| 159 | + } |
| 160 | +
|
| 161 | + return 0 |
| 162 | + } |
| 163 | +
|
| 164 | + private async rate(i: number) { |
| 165 | + if (this.$auth.loggedIn) { |
| 166 | + try { |
| 167 | + await this.$axios.$post('/api/vote_for_exercise', {exercise_id: this.exercise.id, score: i}); |
| 168 | + this.$displaySuccess('Merci pour votre retour !'); |
| 169 | + } catch (e) { |
| 170 | + const error = e as AxiosError; |
| 171 | +
|
| 172 | + if (error.response) { |
| 173 | + const status = error.response.status; |
| 174 | +
|
| 175 | + if (status === 400) { |
| 176 | + this.$displayError('Une erreur est survenue, vérifiez vos données'); |
| 177 | + } else if (status === 401) { |
| 178 | + this.$displayError('Vous devez vous connecter pour effectuer cette action !'); |
| 179 | + } else if (status === 403) { |
| 180 | + this.$displayError("Vous n'êtes pas autorisé à effectuer cette action !"); |
| 181 | + } else if (status === 500) { |
| 182 | + this.$displayError("Une erreur est survenue depuis nos serveurs, veuillez nous en excuser."); |
| 183 | + } else { |
| 184 | + this.$displayError("Une erreur est survenue."); |
| 185 | + } |
| 186 | + } else { |
| 187 | + this.$displayError("Une erreur est survenue."); |
| 188 | + } |
| 189 | + } |
| 190 | + } |
| 191 | + } |
| 192 | +
|
116 | 193 | modifyExercise() { |
117 | 194 | if (this.isAdmin || this.isSuperAdmin) { |
118 | 195 | this.$router.push('/administration/exercices/' + this.exercise.id) |
|
145 | 222 | #Exercise { |
146 | 223 |
|
147 | 224 | .exercise { |
148 | | - position: relative; |
| 225 | +
|
| 226 | + .score__info { |
| 227 | + display: flex; |
| 228 | +
|
| 229 | + h4 { |
| 230 | + margin-bottom: 5px; |
| 231 | + } |
| 232 | +
|
| 233 | + > div:not(:first-child) { |
| 234 | + margin-left: 35px; |
| 235 | + } |
| 236 | +
|
| 237 | + } |
| 238 | +
|
| 239 | + .avg-score { |
| 240 | + display: inline-block; |
| 241 | +
|
| 242 | + span { |
| 243 | + display: inline-block; |
| 244 | + } |
| 245 | +
|
| 246 | + svg { |
| 247 | + width: 25px; |
| 248 | + vertical-align: -6px; |
| 249 | + } |
| 250 | + } |
149 | 251 |
|
150 | 252 | button { |
151 | 253 | position: absolute; |
|
0 commit comments