1
0
forked from PGL/Clyde
Clyde/frontend/src/Apps/ScientificPublications/ResearcherProfile.vue

271 lines
6.4 KiB
Vue
Raw Normal View History

2024-04-04 21:27:51 +02:00
<!----------------------------------------------------
File: ResearcherProfile.vue
Author: Maxime Bartha
Scope: Extension Publicatons scientifiquess
Description: Researcher Profile Page containing his articles and his statistics
----------------------------------------------------->
2024-03-29 15:32:08 +01:00
<script setup>
2024-04-05 09:44:41 +02:00
import { ref, reactive } from "vue";
2024-04-08 22:56:44 +02:00
import FilterComponent from "@/Apps/ScientificPublications/FilterComponent.vue";
2024-04-04 15:01:10 +02:00
const input = ref("");
const statsOf = ref("");
const statsBy = ref("");
2024-04-08 22:56:44 +02:00
const isFilterOpened = ref(false);
2024-04-05 09:44:41 +02:00
let chart;
2024-04-04 15:01:10 +02:00
2024-04-08 22:56:44 +02:00
const openModal = () => {
isFilterOpened.value = true;
};
const closeModal = () => {
isFilterOpened.value = false;
};
const submitHandler = ()=>{
//here you do whatever
}
const articleList = [
2024-04-08 22:56:44 +02:00
"First Article",
"The composition of the light",
"The composition of the sand",
"Fluctuation in universe beavers",
"The Potato War",
2024-04-08 11:02:59 +02:00
"The Potato War",
"The Potato War",
"The Potato War",
"The Potato War",
]
2024-04-04 21:27:51 +02:00
const jsonMockViewsByYears= [
{label: "2004", y:4},
{label: "2005", y:99},
{label: "2007", y:555},
{label: "2009", y:22},
{label: "2011", y:1666},
]
2024-04-04 15:01:10 +02:00
function searchInList(list, searchInput){
if (searchInput === "")
return list
let retList =[]
for (let i = 0; i < list.length; i++) {
console.log(list[i] + " et " + searchInput + " vaut " + lDistance(list[i], searchInput) )
2024-04-08 11:02:59 +02:00
if (lDistance(list[i], searchInput) < 10){
retList.push(list[i])
}
else if(list[i].toUpperCase().indexOf(searchInput.toUpperCase()) > -1){
retList.push(list[i])
2024-04-04 15:01:10 +02:00
}
}
return retList
2024-04-04 15:01:10 +02:00
}
2024-03-30 12:23:56 +01:00
function lDistance(s,t){
if (!s.length) return t.length;
if (!t.length) return s.length;
const arr = [];
for (let i = 0; i <= t.length; i++) {
arr[i] = [i];
for (let j = 1; j <= s.length; j++) {
arr[i][j] =
i === 0
? j
: Math.min(
arr[i - 1][j] + 1,
arr[i][j - 1] + 1,
arr[i - 1][j - 1] + (s[j - 1] === t[i - 1] ? 0 : 1)
);
}
}
return arr[t.length][s.length];
2024-04-08 22:56:44 +02:00
}
2024-04-05 09:44:41 +02:00
const options = reactive({
2024-04-04 15:01:10 +02:00
backgroundColor:null,
theme: "light2",
animationEnabled: true,
title: {
fontColor: "white",
2024-04-04 21:27:51 +02:00
text : "please select options",
2024-04-04 15:01:10 +02:00
},
data: [
{
type: "pie",
indexLabel: "{label} (#percent%)",
yValueFormatString: "#,##0",
indexLabelFontColor: "white",
toolTipContent:
"<span style='\"'color: {color};'\"'>{label}</span> {y}(#percent%)",
2024-04-05 09:44:41 +02:00
}]
});
function update(){
options.title = {
2024-04-04 16:14:19 +02:00
fontColor: "white",
text: statsOf.value + " By "+ statsBy.value,
}
2024-04-04 21:27:51 +02:00
if (statsOf.value === "views" && statsBy.value === "years") {
2024-04-05 09:44:41 +02:00
options.data[0].dataPoints = jsonMockViewsByYears;
2024-04-04 21:27:51 +02:00
}
2024-04-05 09:44:41 +02:00
options.title.text = statsOf.value + " By "+ statsBy.value;
chart.render()
2024-04-04 15:01:10 +02:00
}
2024-03-29 15:32:08 +01:00
</script>
<template>
2024-04-04 15:01:10 +02:00
<div id="main">
2024-04-08 22:56:44 +02:00
<FilterComponent :isOpen="isFilterOpened" @modal-close="closeModal" @submit="submitHandler" name="first-modal">
<template #header> Coucou </template>
</FilterComponent>
2024-04-04 15:01:10 +02:00
<div id="profilePicture">
<img src="/Clyde.png" />
2024-03-29 15:32:08 +01:00
</div>
2024-04-04 15:01:10 +02:00
<div id="researcherInfos">
<div class="surrounded">John Doe</div>
<div class="surrounded">Orcid : 12144-2144-12336-B</div>
<div class="surrounded">Email : John.Doe@umons.ac.be</div>
<div class="surrounded">
site :
<a href="http://localhost:5173" style="color: #007aff">here</a>
</div>
<div class="surrounded">Domain : physics, IT</div>
<div id="coAuthorList" class="surrounded">Co-authors list : D</div>
2024-03-29 15:32:08 +01:00
</div>
2024-04-04 15:01:10 +02:00
<div id="stats">
<div class="surrounded">
Stat type :
2024-04-05 09:44:41 +02:00
<select @change="update()" id="stats-select" v-model="statsOf">
2024-04-04 15:01:10 +02:00
<option value="views">Views</option>
<option value="co-authors">Co-authors</option>
<option value="articles">Articles</option>
<option value="language">Languages</option>
</select>
</div>
<div class="surrounded">
Class by:
2024-04-05 09:44:41 +02:00
<select @change="update()" id="classed-select" v-model="statsBy">
2024-04-04 15:01:10 +02:00
<option selected="selected" value="years">Years</option>
<option value="months">Months</option>
<option value="topics">Topics</option>
</select>
</div>
<div id="statsPie">
2024-04-05 09:44:41 +02:00
<CanvasJSChart :options="options" id=chart @chart-ref="c => chart = c "/>
2024-04-04 15:01:10 +02:00
</div>
2024-03-29 15:32:08 +01:00
</div>
2024-04-04 15:01:10 +02:00
<div id="articles">
2024-04-08 22:56:44 +02:00
<div id="search">
<input type="text" id="search-input" placeholder="search articles" v-model="input"/>
<button id="filterButton" @click="openModal"> Filters </button>
</div>
<ul id="articlesUL">
2024-04-08 11:02:59 +02:00
<li id="articleLi" v-for="n in searchInList(articleList,input)">{{n}}</li>
2024-04-04 15:01:10 +02:00
</ul>
2024-03-29 15:32:08 +01:00
</div>
</div>
</template>
<style scoped>
#main {
display: grid;
grid-template-columns: 22% auto;
grid-template-rows: 26% auto;
height: 100%;
width: 100%;
}
#profilePicture {
display: flex;
justify-content: center;
}
2024-04-04 15:01:10 +02:00
#profilePicture img {
2024-03-29 15:32:08 +01:00
align-self: center;
justify-self: center;
2024-04-04 15:01:10 +02:00
width: 60%;
2024-03-29 15:32:08 +01:00
}
#researcherInfos {
display: grid;
grid-template-columns: auto auto auto;
column-gap: 5px;
2024-04-04 15:01:10 +02:00
grid-template-rows: auto auto;
2024-03-29 15:32:08 +01:00
}
2024-04-04 15:01:10 +02:00
2024-03-29 15:32:08 +01:00
.surrounded {
2024-04-04 15:01:10 +02:00
border: 2px solid black;
color: white;
2024-03-29 15:32:08 +01:00
font-size: x-large;
align-self: center;
text-align: center;
background-color: rgba(255, 255, 255, 0.09);
2024-04-04 15:01:10 +02:00
border-radius: 20px;
margin-bottom: 10px;
2024-03-29 15:32:08 +01:00
}
2024-03-30 12:23:56 +01:00
.surrounded select {
margin-top: 2px;
margin-bottom: 2px;
border: 1px solid black;
color: white;
2024-04-04 15:01:10 +02:00
background-color: rgb(255, 255, 255, 0.1);
2024-03-30 12:23:56 +01:00
font-size: large;
}
2024-04-04 15:01:10 +02:00
#statsPie {
2024-03-30 12:23:56 +01:00
2024-03-29 15:32:08 +01:00
}
2024-04-08 22:56:44 +02:00
#search{
width: 100%;
height: 10%;
display: inline-flex;
2024-03-29 15:32:08 +01:00
}
2024-04-04 15:01:10 +02:00
#search-input {
2024-04-08 22:56:44 +02:00
margin-left: 25px;
width: 75%;
font-size: 16px;
padding: 12px 20px 12px 40px;
border: 1px solid #ddd;
2024-04-08 22:56:44 +02:00
height: 20px;
align-self: center;
}
2024-04-04 15:01:10 +02:00
2024-04-08 22:56:44 +02:00
#filterButton {
align-self: center;
margin-left: 2px;
font-size: xx-large;
color: white;
background: rgba(191, 64, 191,0.5);
border:2px solid black;
}
#filterButton:hover{
background: rgba(191, 64, 191);
}
#articlesUL {
list-style-type: none;
color: white;
2024-04-04 15:01:10 +02:00
padding: 12px;
2024-04-08 11:02:59 +02:00
margin: 5px;
height: 400px;
overflow: scroll;
}
2024-04-08 11:02:59 +02:00
#articleLi{
border: 2px solid black;
color: white;
font-size: x-large;
align-self: center;
text-align: left;
text-indent: 7px;
2024-04-04 15:01:10 +02:00
2024-04-08 11:02:59 +02:00
background-color: rgba(255, 255, 255, 0.09);
border-radius: 20px;
margin-bottom: 15px;
}
2024-04-05 09:44:41 +02:00
</style>