Commit 1f56a98d authored by Jérémie Passerat's avatar Jérémie Passerat

Intégration totale de la notation

parent 2e091278
...@@ -26,7 +26,8 @@ ...@@ -26,7 +26,8 @@
"vue-js-modal": "^2.0.0-rc.6", "vue-js-modal": "^2.0.0-rc.6",
"vue-js-popover": "^1.2.1", "vue-js-popover": "^1.2.1",
"vue-showdown": "^3.1.0", "vue-showdown": "^3.1.0",
"vue-simplemde": "^2.0.0" "vue-simplemde": "^2.0.0",
"vue-star-rating": "^1.7.0"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-babel": "~4.5.0",
...@@ -19606,6 +19607,14 @@ ...@@ -19606,6 +19607,14 @@
"simplemde": "*" "simplemde": "*"
} }
}, },
"node_modules/vue-star-rating": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/vue-star-rating/-/vue-star-rating-1.7.0.tgz",
"integrity": "sha512-2qdONqnIlvFzJoallfr7VuFRB6hBzYgBVEbXC3yYZz2TfMhx36WtYQ5p7JRjW+pzZx2PGQYZ75UFoBE0jwIANw==",
"dependencies": {
"vue": "^2.3.3"
}
},
"node_modules/vue-style-loader": { "node_modules/vue-style-loader": {
"version": "4.1.3", "version": "4.1.3",
"resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
...@@ -36682,6 +36691,14 @@ ...@@ -36682,6 +36691,14 @@
"simplemde": "*" "simplemde": "*"
} }
}, },
"vue-star-rating": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/vue-star-rating/-/vue-star-rating-1.7.0.tgz",
"integrity": "sha512-2qdONqnIlvFzJoallfr7VuFRB6hBzYgBVEbXC3yYZz2TfMhx36WtYQ5p7JRjW+pzZx2PGQYZ75UFoBE0jwIANw==",
"requires": {
"vue": "^2.3.3"
}
},
"vue-style-loader": { "vue-style-loader": {
"version": "4.1.3", "version": "4.1.3",
"resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
...@@ -39,7 +39,8 @@ ...@@ -39,7 +39,8 @@
"vue-js-modal": "^2.0.0-rc.6", "vue-js-modal": "^2.0.0-rc.6",
"vue-js-popover": "^1.2.1", "vue-js-popover": "^1.2.1",
"vue-showdown": "^3.1.0", "vue-showdown": "^3.1.0",
"vue-simplemde": "^2.0.0" "vue-simplemde": "^2.0.0",
"vue-star-rating": "^1.7.0"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-babel": "~4.5.0",
......
...@@ -29,7 +29,7 @@ import Contenu from "./Contenu"; ...@@ -29,7 +29,7 @@ import Contenu from "./Contenu";
import Menu from "./Menu"; import Menu from "./Menu";
import Maj from "./Maj"; import Maj from "./Maj";
import Profil from "./Profil"; import Profil from "./Profil";
import Tags from "./Tags"; import Tags from "./GererTags";
import NewContenu from "./NewContenu"; import NewContenu from "./NewContenu";
import ImporterFichier from "./ImporterFichier"; import ImporterFichier from "./ImporterFichier";
// import Service from "./service/Service"; // import Service from "./service/Service";
......
...@@ -24,9 +24,9 @@ ...@@ -24,9 +24,9 @@
<tbody> <tbody>
<tr v-for="(item, index) in contenusRecu" :key="index"> <tr v-for="(item, index) in contenusRecu" :key="index">
<td :id="JSON.stringify(item._id)" v-on:click="consulterContenuMaj(item)">{{item.titre}}</td> <td :id="'maj' + JSON.stringify(item._id)" v-on:click="consulterContenuMaj(item)">{{item.titre}}</td>
<b-popover :target="JSON.stringify(item._id)" v-on:show="rechercherTexte(item.idContenuEnCours)" triggers="hover" placement="bottom"> <b-popover :target="'maj' + JSON.stringify(item._id)" v-on:show="rechercherTexteMaj(item)" triggers="hover" placement="bottom">
<p id="beautiful" v-html="texteDuContenu"></p> <p id="beautiful" v-html="texteDuContenuMaj"></p>
</b-popover> </b-popover>
<td>{{ item.auteurDemande }}</td> <td>{{ item.auteurDemande }}</td>
...@@ -66,8 +66,8 @@ ...@@ -66,8 +66,8 @@
<tr v-for="(item, index) in contenusPropose" :key="index"> <tr v-for="(item, index) in contenusPropose" :key="index">
<td :id="JSON.stringify(item._id)" v-on:click="consulterContenuMaj(item)">{{item.titre}}</td> <td :id="JSON.stringify(item._id)" v-on:click="consulterContenuMaj(item)">{{item.titre}}</td>
<b-popover :target="JSON.stringify(item._id)" v-on:show="rechercherTexte(item.idContenuEnCours)" triggers="hover" placement="bottom"> <b-popover :target="JSON.stringify(item._id)" v-on:show="rechercherTexteMaj(item.idContenuEnCours)" triggers="hover" placement="bottom">
<p v-html="texteDuContenu"></p> <p v-html="texteDuContenuMaj"></p>
</b-popover> </b-popover>
<td>{{ item.auteurContenu }}</td> <td>{{ item.auteurContenu }}</td>
<td>1</td> <td>1</td>
...@@ -258,16 +258,32 @@ export default { ...@@ -258,16 +258,32 @@ export default {
* @vuese * @vuese
* Récupération et mise en forme du texte associé au contenu * Récupération et mise en forme du texte associé au contenu
*/ */
rechercherTexte: function (id) { rechercherTexteMaj: function (item) {
let that = this let that = this
Service.recupererTexteContenuEnCours(JSON.stringify(id)).then( let idContenu = null
function (response) { if (Object.prototype.hasOwnProperty.call(item, 'idContenuEnCours')){
let showdown = require('showdown'), idContenu = item.idContenuEnCours
converter = new showdown.Converter() Service.recupererTexteContenuEnCours(JSON.stringify(idContenu)).then(
function (response) {
let showdown = require('showdown'),
converter = new showdown.Converter()
that.texteDuContenuMaj = converter.makeHtml(response.data)
}
)
} else {
idContenu = item._id
Service.recupererTexteContenu(JSON.stringify(idContenu)).then(
function (response) {
let showdown = require('showdown'),
converter = new showdown.Converter()
that.texteDuContenuMaj = converter.makeHtml(response.data)
}
)
}
that.texteDuContenu = converter.makeHtml(response.data)
}
)
}, },
/** /**
* @vuese * @vuese
...@@ -290,7 +306,7 @@ export default { ...@@ -290,7 +306,7 @@ export default {
detailContenu: false, detailContenu: false,
contenuChoisi: null, contenuChoisi: null,
contenuCliqueProvenance: '', contenuCliqueProvenance: '',
texteDuContenu: '' texteDuContenuMaj: ''
} }
}, },
watch: { watch: {
......
...@@ -268,11 +268,12 @@ export default { ...@@ -268,11 +268,12 @@ export default {
border-radius: 30%; border-radius: 30%;
height: 30px; height: 30px;
width: 30px; width: 30px;
margin-top: 1.5%;
z-index: 1; z-index: 1;
margin-left: 90%; margin-left: 90%;
background-image: url(assets/img/cloche.png); background-image: url(assets/img/cloche.png);
background-size: cover; background-size: cover;
margin-top: 0.5%;
margin-bottom: 0.5%;
} }
......
<template>
<div>
Bienvenue sur la page ou vous pourrez ajouter les tags nécessaires à accoler à la question que vous venez de créer
</div>
</template>
<script>
export default {
name: "AjouterTags"
}
</script>
<style scoped>
</style>
\ No newline at end of file
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<option>auteur</option> <option>auteur</option>
<option>type / source</option> <option>type / source</option>
<option>date</option> <option>date</option>
<option>note / popularité</option> <option>note</option>
</select> </select>
</form> </form>
</div> </div>
......
...@@ -27,6 +27,11 @@ ...@@ -27,6 +27,11 @@
<br v-show="(contenuCliqueProvenance === 'banque' <br v-show="(contenuCliqueProvenance === 'banque'
|| contenuCliqueProvenance === 'perso') || contenuCliqueProvenance === 'perso')
&& versionMax > 1"> && versionMax > 1">
<p v-if="contenuCliqueProvenance!=='en-cours'">Type du contenu : {{ typeContenu }}</p>
<p v-if="contenuCliqueProvenance!=='en-cours'">Source du contenu : {{sourceContenu}}</p>
<p v-if="contenuCliqueProvenance!=='en-cours'">Note du contenu (v {{versionChoisie}}) : {{noteContenu}}</p>
<p v-if="contenuCliqueProvenance!=='en-cours'">Popularite du contenu : {{populariteContenu}}</p>
<p> Voici l'intérieur de votre contenu dans sa version {{versionChoisie}} : </p> <p> Voici l'intérieur de votre contenu dans sa version {{versionChoisie}} : </p>
<span contenteditable="false" v-html="formatterMarkdown()"> <span contenteditable="false" v-html="formatterMarkdown()">
</span> </span>
...@@ -75,7 +80,7 @@ export default { ...@@ -75,7 +80,7 @@ export default {
this.$emit("actionContenu", {action: action, contenu: this.contenuClique, texte: this.contenu, version: this.versionChoisie}) this.$emit("actionContenu", {action: action, contenu: this.contenuClique, texte: this.contenu, version: this.versionChoisie})
}else }else
this.$emit("actionContenu", {action: action, contenu: this.contenuClique, texte: this.contenu}) this.$emit("actionContenu", {action: action, contenu: this.contenuClique, texte: this.contenu})
}, },
/** /**
* @vuese * @vuese
...@@ -87,7 +92,7 @@ export default { ...@@ -87,7 +92,7 @@ export default {
this.$emit("retour_arriere") this.$emit("retour_arriere")
} else { } else {
// Permet de revenir à Volet_Base // Permet de revenir à Volet_Base
this.$emit("retour_arriere", {panierChoisi: this.contenuCliqueProvenance !== 'banque'}) this.$emit("retour_arriere", {panierChoisi: this.contenuCliqueProvenance !== 'banque'})
} }
}, },
/** /**
...@@ -102,6 +107,32 @@ export default { ...@@ -102,6 +107,32 @@ export default {
// alert(response.data) // alert(response.data)
} }
) )
},
calculerNoteDetailContenu: function() {
if(this.versionMax !== 0){
if (parseInt(this.versionChoisie) !== this.versionMax){
for (let it in this.contenuClique.historique){
if (this.contenuClique.historique[it].numero === parseInt(this.versionChoisie)){
if (this.contenuClique.historique[it].note === 0){
return 0
}
return (this.contenuClique.historique[it].note / this.contenuClique.historique[it].nbreNotes).toFixed(2)
}
}
return -1
} else {
if (this.contenuClique.versionEnCours.note === 0){
return 0
}
return (this.contenuClique.versionEnCours.note / this.contenuClique.versionEnCours.nbreNotes).toFixed(2)
}
/* return 0
}*/
} else {
return 0
}
} }
}, },
data: function () { data: function () {
...@@ -110,8 +141,15 @@ export default { ...@@ -110,8 +141,15 @@ export default {
versionMax: 1, versionMax: 1,
versionChoisie: 1, versionChoisie: 1,
isContenuRefuse :false, isContenuRefuse :false,
titreContenu: '' titreContenu: '',
typeContenu: '',
sourceContenu: '',
populariteContenu: 0,
noteContenu: 0
} }
},
computed: {
}, },
watch: { watch: {
/** /**
...@@ -122,9 +160,12 @@ export default { ...@@ -122,9 +160,12 @@ export default {
let that = this let that = this
this.titreContenu = this.contenuClique.titre this.titreContenu = this.contenuClique.titre
this.populariteContenu = this.contenuClique.popularite
this.isContenuRefuse = false this.isContenuRefuse = false
this.noteContenu = this.calculerNoteDetailContenu()
if (Object.prototype.hasOwnProperty.call(this.contenuClique, 'refuse')){ if (Object.prototype.hasOwnProperty.call(this.contenuClique, 'refuse')){
this.isContenuRefuse = true this.isContenuRefuse = true
} }
...@@ -138,12 +179,24 @@ export default { ...@@ -138,12 +179,24 @@ export default {
} }
else if (this.contenuCliqueProvenance === 'maj'){ else if (this.contenuCliqueProvenance === 'maj'){
Service.recupererTexteContenuEnCours(JSON.stringify(this.contenuClique.idContenuEnCours)).then( if (Object.prototype.hasOwnProperty.call(this.contenuClique, 'idContenuEnCours')){
function (response) {
that.contenu = response.data Service.recupererTexteContenuEnCours(JSON.stringify(this.contenuClique.idContenuEnCours)).then(
// alert(response.data) function (response) {
} that.contenu = response.data
) // alert(response.data)
}
)} else {
Service.recupererTexteContenu(JSON.stringify(this.contenuClique._id)).then(
function (response) {
that.contenu = response.data
/* let showdown = require('showdown'),
converter = new showdown.Converter()
that.texteDuContenuMaj = converter.makeHtml(response.data)*/
}
)
}
} }
else { else {
if (this.contenuCliqueProvenance === 'perso' || this.contenuCliqueProvenance === 'banque'){ if (this.contenuCliqueProvenance === 'perso' || this.contenuCliqueProvenance === 'banque'){
...@@ -158,8 +211,11 @@ export default { ...@@ -158,8 +211,11 @@ export default {
} }
) )
} }
},
versionChoisie: function () {
this.noteContenu = this.calculerNoteDetailContenu()
} }
}, }
} }
</script> </script>
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
<Filtre_Tag v-show="filtre_choisi === 'tags officiels' || filtre_choisi === 'tags libres' " v-bind:filtreChoisi="filtre_choisi" @creer_filtre="creer_filtre"/> <Filtre_Tag v-show="filtre_choisi === 'tags officiels' || filtre_choisi === 'tags libres' " v-bind:filtreChoisi="filtre_choisi" @creer_filtre="creer_filtre"/>
<Filtre_Auteur v-bind:panierChoisi="panierChoisi" v-show="filtre_choisi === 'auteur'" v-bind:auteur="auteur" @creer_filtre="creer_filtre"/> <Filtre_Auteur v-bind:panierChoisi="panierChoisi" v-show="filtre_choisi === 'auteur'" v-bind:auteur="auteur" @creer_filtre="creer_filtre"/>
<Filtre_Date v-show="filtre_choisi === 'date' " @creer_filtre="creer_filtre"/> <Filtre_Date v-show="filtre_choisi === 'date' " @creer_filtre="creer_filtre"/>
<Filtre_Note_Popularite v-show="filtre_choisi === 'note / popularité' " @creer_filtre="creer_filtre"/> <Filtre_Note_Popularite v-show="filtre_choisi === 'note' " @creer_filtre="creer_filtre" v-bind:deconnexion="deconnexion"/>
<Filtre_Type_Source v-show="filtre_choisi === 'type / source'" @creer_filtre="creer_filtre"/> <Filtre_Type_Source v-show="filtre_choisi === 'type / source'" @creer_filtre="creer_filtre" v-bind:deconnexion="deconnexion"/>
</div> </div>
</template> </template>
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
import Filtre_Tag from "../components/filtres/Filtre_Tag"; import Filtre_Tag from "../components/filtres/Filtre_Tag";
import Filtre_Auteur from "../components/filtres/Filtre_Auteur"; import Filtre_Auteur from "../components/filtres/Filtre_Auteur";
import Filtre_Date from "../components/filtres/Filtre_Date"; import Filtre_Date from "../components/filtres/Filtre_Date";
import Filtre_Note_Popularite from "../components/filtres/Filtre_Note_Popularite"; import Filtre_Note_Popularite from "./filtres/Filtre_Note";
import Filtre_Type_Source from "../components/filtres/Filtre_Type_Source"; import Filtre_Type_Source from "../components/filtres/Filtre_Type_Source";
...@@ -38,7 +38,9 @@ export default { ...@@ -38,7 +38,9 @@ export default {
// auteur // auteur
auteur: {}, auteur: {},
// mode panier enclenché ou non // mode panier enclenché ou non
panierChoisi: {} panierChoisi: {},
// Signal de deconnexion
deconnexion: {}
}, },
methods: { methods: {
/** /**
......
...@@ -13,7 +13,9 @@ export default { ...@@ -13,7 +13,9 @@ export default {
name: "Detail_Filtre", name: "Detail_Filtre",
props: { props: {
// Variable de stockage des nouveaux filtres // Variable de stockage des nouveaux filtres
nouveau_filtre: {} nouveau_filtre: {},
// Signal de deconnexion
deconnexion: {}
}, },
methods: { methods: {
/** /**
...@@ -49,6 +51,30 @@ export default { ...@@ -49,6 +51,30 @@ export default {
*/ */
filtreDejaPresent: function(nomFiltre) { filtreDejaPresent: function(nomFiltre) {
return this.filtres_Choisis.filter(filtre => filtre.filtre === nomFiltre).length > 0 return this.filtres_Choisis.filter(filtre => filtre.filtre === nomFiltre).length > 0
},
/**
* @vuese
* Il n'est pas possible de cumuler plusieurs filtres de note qui se gêneraient, donc une fonction pour gérer ça
* Si on ajoute un filtre Borne -> on supprime les filtres noteMin et noteMax
* Et inversement, si on ajoute un filtre min ou max, on supprime l'éventuel filtre borne
*/
gererFiltreNote: function (typeFiltre) {
switch(typeFiltre){
case "noteMin":
this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteMin')
this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteBorne')
break
case "noteMax":
this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteMax')
this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteBorne')
break
case "noteBorne":
this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteMin')
this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteMax')
break
default:
break
}
} }
}, },
watch: { watch: {
...@@ -57,6 +83,7 @@ export default { ...@@ -57,6 +83,7 @@ export default {
* Fonction de traitement dès qu'on réceptionne un nouveau filtre * Fonction de traitement dès qu'on réceptionne un nouveau filtre
*/ */
nouveau_filtre: function(newVal) { // watch it nouveau_filtre: function(newVal) { // watch it
if (this.filtres_Choisis.length > 0){ if (this.filtres_Choisis.length > 0){
if (this.filtreDejaPresent(newVal.filtre.filtre)){ if (this.filtreDejaPresent(newVal.filtre.filtre)){
return return
...@@ -67,12 +94,21 @@ export default { ...@@ -67,12 +94,21 @@ export default {
if (newVal.filtre.filtre === "Toutes les périodes"){ if (newVal.filtre.filtre === "Toutes les périodes"){
return return
} }
} else if (newVal.filtre.type === "noteMin" || newVal.filtre.type === "noteMax" || newVal.filtre.type === "noteBorne"){
this.gererFiltreNote(newVal.filtre.type)
} }
} }
this.filtres_Choisis.push(newVal.filtre) this.filtres_Choisis.push(newVal.filtre)
// si les écueils ci dessus sont évités, on ajoute le filtre et on envoie l'array maj à Volet_Base, qui gère l'affichage des contenus // si les écueils ci dessus sont évités, on ajoute le filtre et on envoie l'array maj à Volet_Base, qui gère l'affichage des contenus
this.$emit("filtresChoisis", {filtres: this.filtres_Choisis}) this.$emit("filtresChoisis", {filtres: this.filtres_Choisis})
},
/**
* @vuese
* A la deconnexion, on vide les filtres
*/
deconnexion: function () {
this.filtres_Choisis = []
} }
} }
, data: function () { , data: function () {
......
<template> <template>
<div > <div >
<div id="titreContenu"> <div id="titreContenu">
<!-- <select v-show="(contenuCliqueProvenance === 'banque' <!-- <select v-show="(contenuCliqueProvenance === 'banque'
|| contenuCliqueProvenance === 'perso') || contenuCliqueProvenance === 'perso')
&& versionMax > 1" v-model="versionChoisie" v-on:change="changerVersion" >--> && versionMax > 1" v-model="versionChoisie" v-on:change="changerVersion" >-->
<div id="typeEtSource">
Type : {{contenuClique.type}}<br>
<label>Titre du contenu : </label><br> Source : {{contenuClique.source}}
<select v-show="contenuCliqueProvenance === 'perso' && versionMax > 1" v-model="versionChoisie" v-on:change="changerVersion" > </div>
<option v-for="i in versionMax" v-bind:key="i"> {{i}}</option> <div id="notePopularite">
</select> Note de la version : {{noteContenu}}<br>
<input type="text" placeholder="titre du contenu" v-model="titreContenu"> Popularité : {{contenuClique.popularite}}<br>
</div>
<button v-on:click="actionContenu('supprimer')">Supprimer</button> <div id="modifTitre">
<button v-show="contenuCliqueProvenance !== 'maj' && contenuCliqueProvenance === 'en-cours' && <div id="changerTitre">
<label>Titre du contenu : </label><br>
<select v-show="contenuCliqueProvenance === 'perso' && versionMax > 1" v-model="versionChoisie" v-on:change="changerVersion" >
<option v-for="i in versionMax" v-bind:key="i"> {{i}}</option>
</select>
<input type="text" id="titreDuContenu" placeholder="titre du contenu" v-model="titreContenu">
</div>
<div id="voirNote">
<button v-show="contenuCliqueProvenance === 'tiers' && !notePresente" id="noterContenu">{{ messageNoter }}</button>
<b-popover target="noterContenu" triggers="click" placement="bottom">
<star-rating @rating-selected ="setRating" v-model="rating" :read-only="notePresente" :show-rating="false" :increment=0.5 :star-size=25 />
</b-popover>
<star-rating v-show="notePresente" @rating-selected ="setRating" v-model="rating" :read-only="notePresente"
:show-rating="false" :increment=0.5 :star-size=25 />
</div>
</div>
<div id="actionsContenu">
<button v-on:click="actionContenu('supprimer')">Supprimer</button>
<button v-show="contenuCliqueProvenance !== 'maj' && contenuCliqueProvenance === 'en-cours' &&
contenuClique.origine === 'tiers' && contenuClique.anonyme !== 'oui'" v-on:click="actionContenu('publier')">Publier le contenu</button> contenuClique.origine === 'tiers' && contenuClique.anonyme !== 'oui'" v-on:click="actionContenu('publier')">Publier le contenu</button>
<button v-show="contenuCliqueProvenance !== 'maj' && contenuCliqueProvenance === 'en-cours' && <button v-show="contenuCliqueProvenance !== 'maj' && contenuCliqueProvenance === 'en-cours' &&
(contenuClique.origine === 'perso' || contenuClique.anonyme === 'oui')" v-on:click="actionContenu('validerModification')">Valider la modification</button> (contenuClique.origine === 'perso' || contenuClique.anonyme === 'oui')" v-on:click="actionContenu('validerModification')">Valider la modification</button>
</div>
</div> </div>
<br> <br>
<div class="mavonEditor"> <div class="mavonEditor">
<mavon-editor :language="'fr'" style="position: static; height: 78vh; margin-top: -0.5%" v-model="texteDuContenu"/> <mavon-editor :language="'fr'" style="position: static; height: 79vh; margin-top: -0.5%" v-model="texteDuContenu"/>
</div> </div>
<div class="markdown"> <div class="markdown">
<br> <br>
...@@ -30,16 +53,21 @@ ...@@ -30,16 +53,21 @@
<button id="retourArriere" v-on:click="action('arriere')"> revenir en arrière</button> <button id="retourArriere" v-on:click="action('arriere')"> revenir en arrière</button>
</div> </div>
<star-rating v-show="false"/>
</div> </div>
</template> </template>
<script> <script>
import Service from "@/service/Service"; import Service from "@/service/Service";
import StarRating from 'vue-star-rating'
export default { export default {
name: "Modifier_Contenu", name: "Modifier_Contenu",
components: {
StarRating
},
props: { props: {
// le texte du contenu cliqué // le texte du contenu cliqué
texteDuContenu: {}, texteDuContenu: {},
...@@ -58,7 +86,12 @@ export default { ...@@ -58,7 +86,12 @@ export default {
versionChoisie: 0, versionChoisie: 0,
titreContenu: '', titreContenu: '',
isContenuRefuse: false, isContenuRefuse: false,
versionMax: 0 versionMax: 0,
rating: 0,
notePresente: false,
messageNoter: "noter",
populariteContenu: 0,
noteContenu: 0,
} }
}, },
methods: { methods: {
...@@ -81,7 +114,7 @@ export default { ...@@ -81,7 +114,7 @@ export default {
}, },
changerVersion: function () { changerVersion: function () {
let that = this let that = this
Service.recupererTexteVersionContenu(JSON.stringify(this.contenuClique._id), this.versionChoisie).then( Service.recupererTexteVersionContenu(JSON.stringify(this.contenuClique._id), this.versionChoisie).then(
function (response) { function (response) {
that.texteDuContenu = response.data that.texteDuContenu = response.data
} }
...@@ -94,6 +127,21 @@ export default { ...@@ -94,6 +127,21 @@ export default {
// @arg le texte associé au contenu (sert potentiellement à rien) // @arg le texte associé au contenu (sert potentiellement à rien)
this.$emit("actionContenu", {action: action, contenu: this.contenuClique, texte: this.texteDuContenu}) this.$emit("actionContenu", {action: action, contenu: this.contenuClique, texte: this.texteDuContenu})
},
setRating: function () {
let that = this
let data={id_contenu: JSON.stringify(this.contenuClique._id), note: this.rating, auteur: this.auteur, version: this.contenuClique.version}
Service.noterContenu(data).then(function (response) {
document.getElementById('noterContenu').click()
that.notePresente = true
that.messageNoter = "Voir votre note"
let notes = JSON.parse(response.data)
that.$emit("majMoyenne", {id: that.contenuClique._id, note: notes[0], nbreNotes: notes[1], notePerso: that.rating})
})
} }
},/*, },/*,
...@@ -105,20 +153,53 @@ export default { ...@@ -105,20 +153,53 @@ export default {
texteDuContenu: function () { texteDuContenu: function () {
// this.titreContenu // this.titreContenu
} }
}*/ }*/computed: {
calculerNoteContenu: function() {
if (parseInt(this.versionChoisie) !== this.versionMax){
for (let it in this.contenuClique.historique){
if (this.contenuClique.historique[it].numero === parseInt(this.versionChoisie)){
if (this.contenuClique.historique[it].note === 0){
return 0
}
return (this.contenuClique.historique[it].note / this.contenuClique.historique[it].nbreNotes).toFixed(2)
}
}
return -1
} else {
if (this.contenuClique.versionEnCours.note === 0){
return 0
}
return (this.contenuClique.versionEnCours.note / this.contenuClique.versionEnCours.nbreNotes).toFixed(2)
}
}
},
watch: { watch: {
contenuClique: function () { contenuClique: function () {
console.log(this.contenuClique)
this.titreContenu = this.contenuClique.titre this.titreContenu = this.contenuClique.titre
this.noteContenu = this.calculerNoteContenu
this.isContenuRefuse = Object.prototype.hasOwnProperty.call(this.contenuClique, 'refuse'); this.isContenuRefuse = Object.prototype.hasOwnProperty.call(this.contenuClique, 'refuse');
if (this.contenuCliqueProvenance === 'perso'){ if (this.contenuCliqueProvenance === 'perso'){
this.versionMax = this.contenuClique.versionEnCours.numero this.versionMax = this.contenuClique.versionEnCours.numero
this.versionChoisie = this.versionMax this.versionChoisie = this.versionMax
}
let that = this
Service.recupererNoteContenu(JSON.stringify(this.contenuClique._id), this.auteur, this.contenuClique.version).then(function (result) {
let nombre = result.data
if (nombre !== '-1'){
nombre = JSON.parse(nombre)
that.rating = nombre.note
that.notePresente = true
} }
})
},
versionChoisie: function () {
this.noteContenu = this.calculerNoteContenu
} }
} }
} }
...@@ -134,6 +215,10 @@ button { ...@@ -134,6 +215,10 @@ button {
width: auto; width: auto;
} }
#titreDuContenu {
margin-left: 5px;
}
#validerModif { #validerModif {
margin-right: 5px; margin-right: 5px;
margin-bottom: 5px; margin-bottom: 5px;
...@@ -142,10 +227,46 @@ button { ...@@ -142,10 +227,46 @@ button {
#titreContenu { #titreContenu {
text-align: center; text-align: center;
align-content: center; align-content: center;
margin: 0 auto 0; display: flex;
margin: 0 auto -15px;
}
#typeEtSource, #notePopularite {
margin-top: 10px;
flex-basis: 12.5%;
margin-bottom: 10px;
}
#actionsContenu {
margin-top: 20px;
flex-basis: 25%;
}
#modifTitre {
margin-top: 5px;
flex-basis: 50%;
margin-right: 5px;
display: flex;
justify-content: center;
margin-bottom: 5px;
}
#noterContenu {
margin-left: 5px;
}
#changerTitre {
align-items: center;
position: absolute;
} }
#modifTitre{ #voirNote {
margin-top: -35px; margin-left: 400px;
margin-top: 24px;
align-items: inherit;
position: relative
} }
</style> </style>
\ No newline at end of file
This diff is collapsed.
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
<div id="contenu"> <div id="contenu">
<div id = "detailFiltre"> <div id = "detailFiltre">
<Detail_Filtre v-bind:nouveau_filtre="nouveau_filtre" @filtresChoisis="filtresChoisis"/> <Detail_Filtre v-bind:nouveau_filtre="nouveau_filtre" @filtresChoisis="filtresChoisis" v-bind:deconnexion="deconnexion"/>
</div> </div>
<div id = "detailContenu"> <div id = "detailContenu">
<Detail_Contenu v-bind:modeFiltre="modeFiltre" v-bind:panierChoisi="panierChoisi" v-bind:filtre_choisi="filtre_choisi" <Detail_Contenu v-bind:modeFiltre="modeFiltre" v-bind:panierChoisi="panierChoisi" v-bind:filtre_choisi="filtre_choisi"
v-bind:auteur="auteur" @creer_filtre="creer_filtre"/> v-bind:auteur="auteur" @creer_filtre="creer_filtre" v-bind:deconnexion="deconnexion"/>
</div> </div>
<Choix_Mode v-show="!variante" v-bind:darktheme="darktheme" @mode_choisi="ajusterMode" v-bind:razModeVariante="razModeVariante" /> <Choix_Mode v-show="!variante" v-bind:darktheme="darktheme" @mode_choisi="ajusterMode" v-bind:razModeVariante="razModeVariante" />
</div> </div>
...@@ -36,7 +36,9 @@ export default { ...@@ -36,7 +36,9 @@ export default {
// mode filtre enclenché ou non // mode filtre enclenché ou non
modeFiltre: {}, modeFiltre: {},
// Signal d'activation ou non du theme sombre // Signal d'activation ou non du theme sombre
darktheme: {} darktheme: {},
// Signal de deconnexion
deconnexion: {}
}, },
methods: { methods: {
......
...@@ -23,7 +23,12 @@ export default { ...@@ -23,7 +23,12 @@ export default {
} }
}, },
props: ['auteur', 'panierChoisi'], props: {
// l'auteur en cours
auteur: {},
// le mode panier est-il activé ou non?
panierChoisi: {}
},
computed: { computed: {
filteredList: function () { filteredList: function () {
if (!this.panierChoisi){ if (!this.panierChoisi){
...@@ -34,6 +39,10 @@ export default { ...@@ -34,6 +39,10 @@ export default {
} }
}, },
watch:{ watch:{
/**
* @vuese
* Dès que l'auteur est connu, on charge toues les auteurs disponibles en bd
*/
auteur: function () { auteur: function () {
let that = this let that = this
Service.recupererAuteursExistants().then(function (reponse) { Service.recupererAuteursExistants().then(function (reponse) {
......
...@@ -23,6 +23,7 @@ export default { ...@@ -23,6 +23,7 @@ export default {
methods: { methods: {
choixDate: function () { choixDate: function () {
this.$emit("creer_filtre", {filtre: this.date, type: 'date'}) this.$emit("creer_filtre", {filtre: this.date, type: 'date'})
// this.date = 'Toutes les périodes'
} }
}, },
data: function () { data: function () {
......
<template>
<div>
<span>selectionner une note minimale</span><br>
<select id="choixNoteMin" v-model="noteMin" @change="choixNoteMin">
<option>>0.5</option>
<option>>1.5</option>
<option>>2.5</option>
<option>>3.5</option>
<option>>4.5</option>
</select>
<p>ou </p>
<span>selectionner une note maximale</span><br>
<select id="choixNoteMax" v-model="noteMax" @change="choixNoteMax">
<option>&lt;0.5</option>
<option>&lt;1.5</option>
<option>&lt;2.5</option>
<option>&lt;3.5</option>
<option>&lt;4.5</option>
</select>
<p>ou </p>
<span>selectionner une plage de notes</span><br>
<label>Borne min </label>
<input v-model="borneInf" type="text"/>
<label> Borne max </label>
<input v-model="borneSup" type="text"/><br>
<button v-on:click="validerPlage"></button>
</div>
</template>
<script>
export default {
name: "Filtre_Note_Popularite",
data: function () {
return {
noteMin: 0,
noteMax: 5,
borneInf: 0,
borneSup: 5
}
},
methods:{
choixNoteMin: function () {
let vraieNoteMin = parseFloat(this.noteMin.substring(1))
let vraieNoteMax = 5
if (this.noteMax !== 5)
vraieNoteMax = parseFloat(this.noteMax.substring(1))
if (vraieNoteMin >= vraieNoteMax){
alert ("note min : " + vraieNoteMin + " note max : " + vraieNoteMax)
alert ('error')
} else {
this.$emit("creer_filtre", {filtre: this.noteMin, type: "noteMin"})
}
this.noteMin = ""
},
choixNoteMax: function () {
let vraieNoteMin = 0
if (this.noteMin !== 0)
vraieNoteMin = parseFloat(this.noteMin.substring(1))
let vraieNoteMax = parseFloat(this.noteMax.substring(1))
if (vraieNoteMin >= vraieNoteMax){
alert ("note min : " + vraieNoteMin + " note max : " + vraieNoteMax)
alert ('error')
} else {
this.$emit("creer_filtre", {filtre: this.noteMax, type: "noteMax"})
}
this.noteMax = ""
},
validerPlage: function () {
this.$emit("creer_filtre", {filtre: this.borneInf + " - " + this.borneSup, type: "noteBorne"})
this.borneInf = 0
this.borneSup = 5
}
},
props: {
// Signal de deconnexion
deconnexion: {}
},
watch: {
/**
* @vuese
* A la deconnexion, on vide l'affichage des notes
*/
deconnexion: function () {
this.noteMin = ""
this.noteMax = ""
}
}
}
</script>
<style scoped>
input {
width: 20px;
margin-left: 2px;
}
button {
padding: 0;
border: none;
background: none;
}
</style>
\ No newline at end of file
<template>
<div>
<p> (Modalités du filtre à définir ultérieurement)</p>
<div id="selectionnerNote"><span>selectionner une "note"</span></div>
<br>
ou
<br>
<br>
<div id="selectionnerPopularité"><span>selectionner une popularité</span></div>
</div>
</template>
<script>
export default {
name: "Filtre_Note_Popularite"
}
</script>
<style scoped>
</style>
\ No newline at end of file
...@@ -50,7 +50,10 @@ ...@@ -50,7 +50,10 @@
export default { export default {
name: "Filtre_Tag", name: "Filtre_Tag",
props: ['filtreChoisi'], props: {
// permet de déterminer si on est en mode tag_libre ou tag_fixe
filtreChoisi: {}
},
methods: { methods: {
naviguer: function (e) { naviguer: function (e) {
if (e.offsetX > e.target.offsetLeft) { if (e.offsetX > e.target.offsetLeft) {
......
...@@ -4,18 +4,15 @@ ...@@ -4,18 +4,15 @@
<div id="selectionnerType"> <div id="selectionnerType">
<span>selectionner un type</span><br><br> <span>selectionner un type</span><br><br>
<select id="type" name="type" size="1" v-model="type" v-on:change="choixType()"> <select id="type" name="type" size="1" v-model="type" v-on:change="choixType()">
<option>type1</option> <option>quiz</option>
<option>type2</option>
<option>type3</option>
</select> </select>
</div> </div>
<div id="selectionnerSource"> <div id="selectionnerSource">
<br> <span>selectionner une source</span><br><br> <br> <span>selectionner une source</span><br><br>
<select id="source" name="source" size="1" v-model="source" v-on:change="choixSource()"> <select id="source" name="source" size="1" v-model="source" v-on:change="choixSource()">
<option>source1</option> <option>markdown</option>
<option>source2</option> <option>moodle</option>
<option>source3</option>
</select> </select>
</div> </div>
...@@ -34,13 +31,25 @@ export default { ...@@ -34,13 +31,25 @@ export default {
methods: { methods: {
choixType: function () { choixType: function () {
this.$emit("creer_filtre", {filtre: this.type, type: 'type'}) this.$emit("creer_filtre", {filtre: this.type, type: 'type'})
this.type = ""
}, },
choixSource: function () { choixSource: function () {
this.$emit("creer_filtre", {filtre: this.source, type: 'source'}) this.$emit("creer_filtre", {filtre: this.source, type: 'source'})
this.source = ""
} }
},
props: {
// Signal de deconnexion
deconnexion: {}
},
watch: {
deconnexion: function () {
this.type = ""
this.source = ""
}
} }
} }
......
...@@ -70,8 +70,8 @@ export default { ...@@ -70,8 +70,8 @@ export default {
return axios.delete(urlBase + contenus + "deletePerso/" + idContenu, this.getHeader(localStorage.token)) return axios.delete(urlBase + contenus + "deletePerso/" + idContenu, this.getHeader(localStorage.token))
}, },
supprimerTiers(auteur, id_tiers) { supprimerTiers(auteur, id_tiers, note) {
return axios.delete(urlBase + contenus + "deleteTiers?auteur=" + auteur + "&id_tiers=" + id_tiers, this.getHeader(localStorage.token)) return axios.delete(urlBase + contenus + "deleteTiers?auteur=" + auteur + "&id_tiers=" + id_tiers + "&note=" + note, this.getHeader(localStorage.token))
}, },
creerNouveauContenu(data) { creerNouveauContenu(data) {
...@@ -102,7 +102,15 @@ export default { ...@@ -102,7 +102,15 @@ export default {
recupererTexteVersionContenu(idContenu, version){ recupererTexteVersionContenu(idContenu, version){
return axios.get(urlBase + contenus + "getTexteVersionContenu/" + idContenu + "/" + version, this.getHeader(localStorage.token)) return axios.get(urlBase + contenus + "getTexteVersionContenu/" + idContenu + "/" + version, this.getHeader(localStorage.token))
}, },
incrementerPopularite(data){
return axios.patch(urlBase + contenus + "incrementerPopularite", data, this.getHeader(localStorage.token))
},
noterContenu(data){
return axios.patch(urlBase + contenus + "noterContenu", data, this.getHeader(localStorage.token))
},
recupererNoteContenu(idContenu, auteur, version){
return axios.get(urlBase + contenus + "recupererNote?auteur=" + auteur + "&version=" + version + "&id_contenu=" + idContenu, this.getHeader(localStorage.token))
},
// gestion des en-cours // gestion des en-cours
creerEnCours(data) { creerEnCours(data) {
return axios.post(urlBase + en_cours + "newEnCours", data, this.getHeader(localStorage.token)) return axios.post(urlBase + en_cours + "newEnCours", data, this.getHeader(localStorage.token))
...@@ -118,6 +126,7 @@ export default { ...@@ -118,6 +126,7 @@ export default {
return axios.get(urlBase + en_cours + "getTexteContenuEnCours/" + idContenu, this.getHeader(localStorage.token)) return axios.get(urlBase + en_cours + "getTexteContenuEnCours/" + idContenu, this.getHeader(localStorage.token))
}, },
// gestion des demandes de publication // gestion des demandes de publication
getPublicationsRecues(auteur) { getPublicationsRecues(auteur) {
...@@ -134,5 +143,6 @@ export default { ...@@ -134,5 +143,6 @@ export default {
}, },
supprimerDemandePublication(idDemandePublication) { supprimerDemandePublication(idDemandePublication) {
return axios.delete(urlBase + demande_pub + "demandePublication/" + idDemandePublication, this.getHeader(localStorage.token)) return axios.delete(urlBase + demande_pub + "demandePublication/" + idDemandePublication, this.getHeader(localStorage.token))
}, }
} }
\ No newline at end of file
...@@ -2,7 +2,7 @@ import Login from "../Login.vue"; ...@@ -2,7 +2,7 @@ import Login from "../Login.vue";
import {mount} from "@vue/test-utils"; import {mount} from "@vue/test-utils";
import { shallowMount } from '@vue/test-utils' import { shallowMount } from '@vue/test-utils'
import Service from "../service/Service"; import Service from "../service/Service";
import Tags from "../Tags"; import Tags from "../GererTags";
// Rien a tester dans Index.vue, car c'est juste un "aggrégateur" pour d'autres composants. // Rien a tester dans Index.vue, car c'est juste un "aggrégateur" pour d'autres composants.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment