From 608b6e4893600e8cabf3dedd6c78881bc1036d0c Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 21 Apr 2024 20:07:21 +0200 Subject: [PATCH] added reesearcher manager for secretary --- .../ResearchesService.java | 8 + .../ScientificPublications/Researcher.java | 3 +- frontend/public/i18n/EN.txt | 10 +- frontend/public/i18n/FR.txt | 6 + frontend/src/Apps/AboutUser.vue | 207 ++++++++++++++++++ .../ManageResearcherProfile.vue | 6 +- frontend/src/Apps/UsersList.vue | 20 +- .../ResearcherProfile.js | 8 + 8 files changed, 258 insertions(+), 10 deletions(-) create mode 100644 frontend/src/Apps/AboutUser.vue diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/ScientificPublications/ResearchesService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/ScientificPublications/ResearchesService.java index e7bea68..445cf41 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/ScientificPublications/ResearchesService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/ScientificPublications/ResearchesService.java @@ -114,6 +114,14 @@ public class ResearchesService { } public void deleteResearcher(Researcher researcher) { + articleRepo.findAll(); + for (Research r: articleRepo.findAll()) + { + if (r.getCoAuthors().contains(researcher)){ + r.getCoAuthors().remove(researcher); + articleRepo.save(r); + } + } researcherRepo.delete(researcher); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/ScientificPublications/Researcher.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/ScientificPublications/Researcher.java index 60f8328..259452b 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/ScientificPublications/Researcher.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/ScientificPublications/Researcher.java @@ -12,6 +12,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.hibernate.annotations.OnDelete; import ovh.herisson.Clyde.Tables.User; @@ -24,7 +25,7 @@ public class Researcher { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; - @OneToOne(cascade=CascadeType.REMOVE, optional=true) + @OneToOne private User user; private String orcidId; private String site; diff --git a/frontend/public/i18n/EN.txt b/frontend/public/i18n/EN.txt index 030c814..7e49b71 100644 --- a/frontend/public/i18n/EN.txt +++ b/frontend/public/i18n/EN.txt @@ -114,4 +114,12 @@ Confirm.Publish=Confirm Publishing Cancel.Publish=Cancel Publishing Years=Years Months=Months -By=By \ No newline at end of file +By=By +RegNo=RegNo +Address=Address +Country=Country +BirthDate=Birth Date +Researcher.Delete=Delete Researcher Profile +Researcher.Add=Create Researcher Profile +Confirm=Confirm +Cancel=Cancel diff --git a/frontend/public/i18n/FR.txt b/frontend/public/i18n/FR.txt index 72404ce..732f41d 100644 --- a/frontend/public/i18n/FR.txt +++ b/frontend/public/i18n/FR.txt @@ -115,3 +115,9 @@ Cancel.Publish=Annuler la Publication Years=Années Months=Mois By=par +RegNo=Matricule +Address=Adresse +Country=Pays +BirthDate=Date de Naissance +Confirm=Confirmer +Cancel=Annuler diff --git a/frontend/src/Apps/AboutUser.vue b/frontend/src/Apps/AboutUser.vue new file mode 100644 index 0000000..88e880f --- /dev/null +++ b/frontend/src/Apps/AboutUser.vue @@ -0,0 +1,207 @@ +<script setup> +import i18n from "../i18n.js"; +import {ref} from "vue"; +import {fetchAllResearchers} from "@/rest/ScientificPublications/ManageResearch.js"; +import {deleteResearcher, postResearcher} from "@/rest/ScientificPublications/ResearcherProfile.js"; +const props = defineProps(['user']) +const modifying =ref(false) +const toModify = Object.assign({},{}) +const toCreate = Object.assign({},{}) +const allResearcher = ref( await fetchAllResearchers()) +const researcher = ref() +const user = props.user +const isResearcher = ref(false) +const creating = ref(false) + +for (let i = 0; i < allResearcher.value.length; i++) { + if (user.regNo === allResearcher.value[i].user.regNo){ + researcher.value = allResearcher.value[i] + isResearcher.value = true + } +} + +function getPP(){ + if(user.profilePictureUrl === null){ + return "/Clyde.png" + } + return user.profilePictureUrl +} + +async function createResearcher(){ + toCreate.user = user + await postResearcher(toCreate) + creating.value = false + for (let i = 0; i < allResearcher.value.length; i++) { + if (user.regNo === allResearcher.value[i].user.regNo){ + researcher.value = allResearcher.value[i] + isResearcher.value = true + } + } + toCreate.value = Object.assign({},{}) +} + +async function deleteResearcherById(){ + isResearcher.value = false + await deleteResearcher(researcher.value.id) + allResearcher.value = await fetchAllResearchers() +} + +</script> + +<template> + <div class="body"> + <div class="container"> + <div class="profilPic"> + <img class="subContainer" :src=getPP()> + </div> + <div class = "globalInfos"> + <div class="infosContainer"> + <div> + {{i18n("RegNo")}} : {{user.regNo}} + </div> + <div> + {{i18n("name")}} : {{user.firstName}} {{user.lastName}} + </div> + <div> + Role : + <span v-if="!modifying"> {{i18n(user.role)}}</span> + <select v-else v-model="toModify.role"> + <option value="Student">{{i18n("Student")}}</option> + <option value="Teacher">{{i18n("Teacher")}}</option> + <option value="Secretary">{{i18n("Secretary")}}</option> + <option value="InscriptionService">{{i18n("InscriptionService")}}</option> + </select> + </div> + <div> + E-mail: {{user.email}} + </div> + <div> + {{i18n("Address")}} : + <span v-if="!modifying"> {{user.address}}</span> + <input v-else type="text" v-model="toModify.address"> + </div> + <div> + {{i18n("Country")}} : {{user.country}} + </div> + <div> + {{i18n("BirthDate")}} : {{user.birthDate.split("T")[0]}} + </div> + </div> + </div> + <div></div> + <button id="ModifyButton" @click="modifying= !modifying"> {{i18n("Modify.Data")}}</button> + <div></div> + <div> + <button v-if="isResearcher" id="deleteButton" @click="deleteResearcherById"> {{i18n("Researcher.Delete")}}</button> + <button v-else id="createButton" @click="creating = !creating"> {{i18n("Researcher.Add")}}</button> + </div> + <div v-if="creating"> + <button id="createButton" @click="createResearcher"> {{i18n("Confirm")}}</button> + <button id="deleteButton" @click="creating = !creating"> {{i18n("Cancel")}}</button> + </div> + <div v-if="creating" style="color: white"> + <ul> + <li> + Orcid : + <input type="text" v-model="toCreate.orcid"></li> + <li> + Site : + <input type="text" v-model="toCreate.site"></li> + <li> + {{i18n("Domain")}} : + <input type="text" v-model="toCreate.domain"></li> + </ul> + + + </div> + </div> + </div> +</template> + +<style scoped> +#ModifyButton{ + align-self: center; + text-align: center; + border: 2px solid black; + color: white; + font-size: xx-large; + background-color:rgba(191, 64, 191,0.5); + border-radius: 20px; +} +#ModifyButton:hover{ + background:rgba(191,64,191) +} + +.container{ + min-width:675px; + display:grid; + grid-template-columns:10vw 50vw; + grid-template-rows:200px auto; + column-gap:2.7%; + row-gap:45px; + grid-template-areas: + "profilPic globalInfos" + "minfos minfos"; +} + +.profilPic{ + grid-area:profilPic; +} + +.globalInfos { + grid-area:globalInfos; + align-self :center; + +} + +.body { + min-width:960px; + width:100%; + display:flex; + align-items:center; + justify-content:center; + margin-top:5%; +} + +.subContainer{ + width:100%; + background-color:rgb(50,50,50); + border-radius:20px; + border:4px solid black; +} + +.infosContainer { + border:2px solid black; + font-size:23px; + color:white; + background-color:rgb(50,50,50); + border-radius:10px; +} + +#deleteButton{ + align-self: center; + text-align: center; + border: 2px solid black; + color: white; + font-size: x-large; + background-color: red; + border-radius: 20px; +} +#deleteButton:hover{ + background: #ff2d55; +} +#createButton{ + align-self: center; + text-align: center; + border: 2px solid black; + color: white; + font-size: x-large; + background-color: #07bc0c; + border-radius: 20px +} +#createButton:hover{ + background: #4cd964; +} + + +</style> \ No newline at end of file diff --git a/frontend/src/Apps/ScientificPublications/ManageResearcherProfile.vue b/frontend/src/Apps/ScientificPublications/ManageResearcherProfile.vue index 82e2d03..7f0490e 100644 --- a/frontend/src/Apps/ScientificPublications/ManageResearcherProfile.vue +++ b/frontend/src/Apps/ScientificPublications/ManageResearcherProfile.vue @@ -58,7 +58,7 @@ function getPP(){ <div class="surrounded" v-else> {{i18n("To.Change.In.Options")}}</div> <div class="surrounded" v-if="!changing">Orcid : {{researcher.orcidId}}</div> - <div class="surrounded" v-else>Orcid : <input v-model="toModify.orcidId"> </input></div> + <div class="surrounded" v-else>Orcid : <input v-model="toModify.orcidId"> </div> <div class="surrounded" v-if="!changing">Email : {{researcher.user.email}}</div> <div class="surrounded" v-else> {{i18n("To.Change.In.Options")}}</div> @@ -66,10 +66,10 @@ function getPP(){ <div class="surrounded" v-if="!changing"> Site : <a :href=researcher.site style="color: #007aff"> {{researcher.site}}</a> </div> - <div class="surrounded" v-else>Site : <input v-model="toModify.site"></input></div> + <div class="surrounded" v-else>Site : <input v-model="toModify.site"></div> <div class="surrounded" v-if="!changing">{{i18n("Domain")}} : {{researcher.domain}}</div> - <div class="surrounded" v-else>Domain : <input v-model="toModify.domain"> </input></div> + <div class="surrounded" v-else>Domain : <input v-model="toModify.domain"></div> <div style="text-align: center; align-self: center" v-if="!changing"> <button class="modifyButton" @click="changing = !changing">{{i18n("Modify.Data")}}</button></div> <div v-else style="text-align: center; align-self: center"> diff --git a/frontend/src/Apps/UsersList.vue b/frontend/src/Apps/UsersList.vue index 59e60c4..a000495 100644 --- a/frontend/src/Apps/UsersList.vue +++ b/frontend/src/Apps/UsersList.vue @@ -1,20 +1,30 @@ <script setup> import i18n from "@/i18n.js" - import { reactive } from 'vue' import { getAllUsers } from '../rest/Users.js' + import {ref} from "vue"; + import AboutUser from "@/Apps/AboutUser.vue"; + const list = ref(true) + const targetRegNo =ref() + const users = await getAllUsers(); </script> <template style="margin-top:5%;"> - <div style="display:flex; justify-content:center; min-width:1140px;" v-for="item in users"> - <div class="bodu"> + <div v-if="list === false"> + <AboutUser :user=target /> + <button style="background-color:rgb(105,05,105);width:5%; margin-left: 10%;" @click="list = true;">Back</button> + </div> + <div style="display:flex; justify-content:center; min-width:1140px;" v-for="item in users" v-if="list"> + <div class="body"> <div class="container"> <div class="role"><a style="margin-left:30px">{{i18n(item.role)}}</a></div> <div class="surname"><a>{{item.lastName}}</a></div> <div class="firstname"><a>{{item.firstName}}</a></div> - <div class="infos"><button style="background-color:rgb(105,05,105);" >{{i18n("request.moreInfos")}} </button></div> + <div class="infos"> + <button style="background-color:rgb(105,05,105);" @click="list = false; target = item;">{{i18n("request.moreInfos")}} </button> + </div> </div> </div> </div> @@ -70,7 +80,7 @@ } - .bodu { + .body { margin-top:2%; width:66%; border:2px solid black; diff --git a/frontend/src/rest/ScientificPublications/ResearcherProfile.js b/frontend/src/rest/ScientificPublications/ResearcherProfile.js index 8e98605..1e2be8e 100644 --- a/frontend/src/rest/ScientificPublications/ResearcherProfile.js +++ b/frontend/src/rest/ScientificPublications/ResearcherProfile.js @@ -14,4 +14,12 @@ export async function fetchStats(id){ export async function fetchResearch(id){ return restGet("/research/" +id) +} + +export async function deleteResearcher(id){ + return restDelete("/researcher/" + id) +} + +export async function postResearcher(data){ + return restPost("/researcher", data) } \ No newline at end of file