Compare commits
	
		
			17 Commits
		
	
	
		
			Schedule/m
			...
			ec2b975467
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ec2b975467 | |||
| 
						
						
							
						
						b8b193f344
	
				 | 
					
					
						|||
| 05359d64ac | |||
| 3d78851b29 | |||
| dbe28a7fed | |||
| bd7d2c2d51 | |||
| 91c7f42521 | |||
| bd27ffd3cb | |||
| 91ee3adbcd | |||
| c1b2742a8f | |||
| 2805fede4b | |||
| 951feed3c8 | |||
| 95054fa973 | |||
| 3af83a58d3 | |||
| 47c5c14862 | |||
| 9e0db361b8 | |||
| db895a6091 | 
@ -25,7 +25,7 @@ dependencies {
 | 
				
			|||||||
	implementation("com.kohlschutter.junixsocket:junixsocket-core:2.9.0")
 | 
						implementation("com.kohlschutter.junixsocket:junixsocket-core:2.9.0")
 | 
				
			||||||
	// implementation("org.springframework.session:spring-session-jdbc")
 | 
						// implementation("org.springframework.session:spring-session-jdbc")
 | 
				
			||||||
	developmentOnly("org.springframework.boot:spring-boot-devtools")
 | 
						developmentOnly("org.springframework.boot:spring-boot-devtools")
 | 
				
			||||||
	developmentOnly("org.springframework.boot:spring-boot-docker-compose")
 | 
						// developmentOnly("org.springframework.boot:spring-boot-docker-compose")
 | 
				
			||||||
	runtimeOnly("org.postgresql:postgresql")
 | 
						runtimeOnly("org.postgresql:postgresql")
 | 
				
			||||||
	testImplementation("org.springframework.boot:spring-boot-starter-test")
 | 
						testImplementation("org.springframework.boot:spring-boot-starter-test")
 | 
				
			||||||
	testImplementation("org.springframework.boot:spring-boot-testcontainers")
 | 
						testImplementation("org.springframework.boot:spring-boot-testcontainers")
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										15
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										15
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							@ -8,6 +8,7 @@
 | 
				
			|||||||
      "name": "clyde",
 | 
					      "name": "clyde",
 | 
				
			||||||
      "version": "0.0.0",
 | 
					      "version": "0.0.0",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@canvasjs/vue-charts": "^1.0.4",
 | 
				
			||||||
        "vite-plugin-top-level-await": "^1.4.1",
 | 
					        "vite-plugin-top-level-await": "^1.4.1",
 | 
				
			||||||
        "vue": "^3.4.15",
 | 
					        "vue": "^3.4.15",
 | 
				
			||||||
        "vue3-toastify": "^0.2.1"
 | 
					        "vue3-toastify": "^0.2.1"
 | 
				
			||||||
@ -29,6 +30,20 @@
 | 
				
			|||||||
        "node": ">=6.0.0"
 | 
					        "node": ">=6.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@canvasjs/charts": {
 | 
				
			||||||
 | 
					      "version": "3.7.45",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@canvasjs/charts/-/charts-3.7.45.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-FPMX8wn+PEHzAa/GLBsL5lWB81AzKZLw51t7SiSUjMbtUN5/OIrmDcwUTw+53/Bbdd9gm2LLmxAdZsQ75JI31g=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@canvasjs/vue-charts": {
 | 
				
			||||||
 | 
					      "version": "1.0.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@canvasjs/vue-charts/-/vue-charts-1.0.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-PzOA8xeb/f68a39uoFZNn843dGPU36bsqmbO5DWjP7k6FwkK5AeGkYa/H3RHC02Xc6mG68vg9aFNj2Fyqhu4UQ==",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@canvasjs/charts": "^3.7.5",
 | 
				
			||||||
 | 
					        "vue": ">=3.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@esbuild/aix-ppc64": {
 | 
					    "node_modules/@esbuild/aix-ppc64": {
 | 
				
			||||||
      "version": "0.19.12",
 | 
					      "version": "0.19.12",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@
 | 
				
			|||||||
    "preview": "vite preview"
 | 
					    "preview": "vite preview"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
 | 
					    "@canvasjs/vue-charts": "^1.0.4",
 | 
				
			||||||
    "vite-plugin-top-level-await": "^1.4.1",
 | 
					    "vite-plugin-top-level-await": "^1.4.1",
 | 
				
			||||||
    "vue": "^3.4.15",
 | 
					    "vue": "^3.4.15",
 | 
				
			||||||
    "vue3-toastify": "^0.2.1"
 | 
					    "vue3-toastify": "^0.2.1"
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										236
									
								
								frontend/src/Apps/ScientificPublications/ResearcherProfile.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										236
									
								
								frontend/src/Apps/ScientificPublications/ResearcherProfile.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,236 @@
 | 
				
			|||||||
 | 
					<!----------------------------------------------------
 | 
				
			||||||
 | 
						File:  ResearcherProfile.vue
 | 
				
			||||||
 | 
						Author: Maxime Bartha
 | 
				
			||||||
 | 
						Scope: Extension Publicatons scientifiquess
 | 
				
			||||||
 | 
						Description: Researcher Profile Page containing his articles and his statistics
 | 
				
			||||||
 | 
					----------------------------------------------------->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script setup>
 | 
				
			||||||
 | 
					import { ref, reactive } from "vue";
 | 
				
			||||||
 | 
					const input = ref("");
 | 
				
			||||||
 | 
					const statsOf = ref("");
 | 
				
			||||||
 | 
					const statsBy = ref("");
 | 
				
			||||||
 | 
					let chart;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const jsonMockViewsByYears= [
 | 
				
			||||||
 | 
					  {label: "2004", y:4},
 | 
				
			||||||
 | 
					  {label: "2005", y:99},
 | 
				
			||||||
 | 
					  {label: "2007", y:555},
 | 
				
			||||||
 | 
					  {label: "2009", y:22},
 | 
				
			||||||
 | 
					  {label: "2011", y:1666},
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function inputKeyUp() {
 | 
				
			||||||
 | 
					  let filter, ul, li, a, txtValue;
 | 
				
			||||||
 | 
					  filter = input.value.toUpperCase();
 | 
				
			||||||
 | 
					  if (document.getElementById("myUL") != null) {
 | 
				
			||||||
 | 
					    ul = document.getElementById("myUL");
 | 
				
			||||||
 | 
					    li = ul.getElementsByTagName("li");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Loop through all list items, and hide those who don't match the search query
 | 
				
			||||||
 | 
					    for (let i = 0; i < li.length; i++) {
 | 
				
			||||||
 | 
					      a = li[i].getElementsByTagName("a")[0];
 | 
				
			||||||
 | 
					      txtValue = a.textContent || a.innerText;
 | 
				
			||||||
 | 
					      if (txtValue.toUpperCase().indexOf(filter) > -1) {
 | 
				
			||||||
 | 
					        li[i].style.display = "";
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        li[i].style.display = "none";
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const options = reactive({
 | 
				
			||||||
 | 
					    backgroundColor:null,
 | 
				
			||||||
 | 
					    theme: "light2",
 | 
				
			||||||
 | 
					    animationEnabled: true,
 | 
				
			||||||
 | 
					    title: {
 | 
				
			||||||
 | 
					      fontColor: "white",
 | 
				
			||||||
 | 
					      text : "please select options",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    data: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        type: "pie",
 | 
				
			||||||
 | 
					        indexLabel: "{label} (#percent%)",
 | 
				
			||||||
 | 
					        yValueFormatString: "#,##0",
 | 
				
			||||||
 | 
					        indexLabelFontColor: "white",
 | 
				
			||||||
 | 
					        toolTipContent:
 | 
				
			||||||
 | 
					          "<span style='\"'color: {color};'\"'>{label}</span> {y}(#percent%)",
 | 
				
			||||||
 | 
					      }]
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update(){
 | 
				
			||||||
 | 
					      options.title = {
 | 
				
			||||||
 | 
					        fontColor: "white",
 | 
				
			||||||
 | 
					        text: statsOf.value + " By "+ statsBy.value,
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (statsOf.value === "views" && statsBy.value === "years") {
 | 
				
			||||||
 | 
					        options.data[0].dataPoints = jsonMockViewsByYears;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      options.title.text = statsOf.value + " By "+ statsBy.value;
 | 
				
			||||||
 | 
					      chart.render()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div id="main">
 | 
				
			||||||
 | 
					    <div id="profilePicture">
 | 
				
			||||||
 | 
					      <img src="/Clyde.png" />
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <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>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div id="stats">
 | 
				
			||||||
 | 
					      <div class="surrounded">
 | 
				
			||||||
 | 
					        Stat type :
 | 
				
			||||||
 | 
					        <select @change="update()" id="stats-select" v-model="statsOf">
 | 
				
			||||||
 | 
					          <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:
 | 
				
			||||||
 | 
					        <select @change="update()" id="classed-select" v-model="statsBy">
 | 
				
			||||||
 | 
					          <option selected="selected" value="years">Years</option>
 | 
				
			||||||
 | 
					          <option value="months">Months</option>
 | 
				
			||||||
 | 
					          <option value="topics">Topics</option>
 | 
				
			||||||
 | 
					        </select>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div id="statsPie">
 | 
				
			||||||
 | 
							  <CanvasJSChart :options="options" id=chart @chart-ref="c => chart = c "/>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div id="articles">
 | 
				
			||||||
 | 
					      <input
 | 
				
			||||||
 | 
					        type="text"
 | 
				
			||||||
 | 
					        id="search-input"
 | 
				
			||||||
 | 
					        @keyup="inputKeyUp()"
 | 
				
			||||||
 | 
					        placeholder="search articles"
 | 
				
			||||||
 | 
					        v-model="input"
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					      <ul id="myUL">
 | 
				
			||||||
 | 
					        <li><a href="#">Adele</a></li>
 | 
				
			||||||
 | 
					        <li><a href="#">Agnes</a></li>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <li><a href="#">Billy</a></li>
 | 
				
			||||||
 | 
					        <li><a href="#">Bob</a></li>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <li><a href="#">Calvin</a></li>
 | 
				
			||||||
 | 
					        <li><a href="#">Christina</a></li>
 | 
				
			||||||
 | 
					        <li><a href="#">Cindy</a></li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#profilePicture img {
 | 
				
			||||||
 | 
					  align-self: center;
 | 
				
			||||||
 | 
					  justify-self: center;
 | 
				
			||||||
 | 
					  width: 60%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#researcherInfos {
 | 
				
			||||||
 | 
					  display: grid;
 | 
				
			||||||
 | 
					  grid-template-columns: auto auto auto;
 | 
				
			||||||
 | 
					  column-gap: 5px;
 | 
				
			||||||
 | 
					  grid-template-rows: auto auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.surrounded {
 | 
				
			||||||
 | 
					  border: 2px solid black;
 | 
				
			||||||
 | 
					  color: white;
 | 
				
			||||||
 | 
					  font-size: x-large;
 | 
				
			||||||
 | 
					  align-self: center;
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					  background-color: rgba(255, 255, 255, 0.09);
 | 
				
			||||||
 | 
					  border-radius: 20px;
 | 
				
			||||||
 | 
					  margin-bottom: 10px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.surrounded select {
 | 
				
			||||||
 | 
					  margin-top: 2px;
 | 
				
			||||||
 | 
					  margin-bottom: 2px;
 | 
				
			||||||
 | 
					  border: 1px solid black;
 | 
				
			||||||
 | 
					  color: white;
 | 
				
			||||||
 | 
					  background-color: rgb(255, 255, 255, 0.1);
 | 
				
			||||||
 | 
					  font-size: large;
 | 
				
			||||||
 | 
					  align-self: center;
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#statsPie {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#articles {
 | 
				
			||||||
 | 
					  background-color: orange;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#search-input {
 | 
				
			||||||
 | 
					  width: 60%;
 | 
				
			||||||
 | 
					  font-size: 16px;
 | 
				
			||||||
 | 
					  padding: 12px 20px 12px 40px;
 | 
				
			||||||
 | 
					  border: 1px solid #ddd;
 | 
				
			||||||
 | 
					  margin-bottom: 12px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#myUL {
 | 
				
			||||||
 | 
					  list-style-type: none;
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  margin: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#myUL li a {
 | 
				
			||||||
 | 
					  border: 1px solid #ddd;
 | 
				
			||||||
 | 
					  /* Add a border to all links */
 | 
				
			||||||
 | 
					  margin-top: -1px;
 | 
				
			||||||
 | 
					  /* Prevent double borders */
 | 
				
			||||||
 | 
					  background-color: #f6f6f6;
 | 
				
			||||||
 | 
					  /* Grey background color */
 | 
				
			||||||
 | 
					  padding: 12px;
 | 
				
			||||||
 | 
					  /* Add some padding */
 | 
				
			||||||
 | 
					  text-decoration: none;
 | 
				
			||||||
 | 
					  /* Remove default text underline */
 | 
				
			||||||
 | 
					  font-size: 18px;
 | 
				
			||||||
 | 
					  /* Increase the font-size */
 | 
				
			||||||
 | 
					  color: black;
 | 
				
			||||||
 | 
					  /* Add a black text color */
 | 
				
			||||||
 | 
					  display: block;
 | 
				
			||||||
 | 
					  /* Make it into a block element to fill the whole list */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#myUL li a:hover:not(.header) {
 | 
				
			||||||
 | 
					  background-color: #eee;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#Chart{
 | 
				
			||||||
 | 
					    width: "100%";
 | 
				
			||||||
 | 
					    height: "100%";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@ -4,5 +4,8 @@ import 'https://kit.fontawesome.com/fb3bbd0a95.js'
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import { createApp } from 'vue'
 | 
					import { createApp } from 'vue'
 | 
				
			||||||
import App from './App.vue'
 | 
					import App from './App.vue'
 | 
				
			||||||
 | 
					import CanvasJSChart from '@canvasjs/vue-charts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
createApp(App).mount('#app')
 | 
					const app = createApp(App);
 | 
				
			||||||
 | 
					app.use(CanvasJSChart);
 | 
				
			||||||
 | 
					app.mount('#app');
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@ import Profil from "@/Apps/Profil.vue"
 | 
				
			|||||||
import Courses from "@/Apps/ManageCourses.vue"
 | 
					import Courses from "@/Apps/ManageCourses.vue"
 | 
				
			||||||
import Users from "@/Apps/UsersList.vue"
 | 
					import Users from "@/Apps/UsersList.vue"
 | 
				
			||||||
import Students from "@/Apps/StudentsList.vue"
 | 
					import Students from "@/Apps/StudentsList.vue"
 | 
				
			||||||
 | 
					import ResearcherProfile from "@/Apps/ScientificPublications/ResearcherProfile.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const apps = {
 | 
					const apps = {
 | 
				
			||||||
		'/login': LoginPage,
 | 
							'/login': LoginPage,
 | 
				
			||||||
@ -17,6 +18,7 @@ const apps = {
 | 
				
			|||||||
		'/manage-courses' : Courses,
 | 
							'/manage-courses' : Courses,
 | 
				
			||||||
		'/users-list' : Users,
 | 
							'/users-list' : Users,
 | 
				
			||||||
		'/students-list' : Students,
 | 
							'/students-list' : Students,
 | 
				
			||||||
 | 
							'/researcher-profile' : ResearcherProfile,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const appsList = {
 | 
					const appsList = {
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user