Compare commits
2 Commits
54d19eb888
...
219165aacf
Author | SHA1 | Date | |
---|---|---|---|
219165aacf | |||
f081b7206f |
@ -1,5 +1,12 @@
|
||||
package ovh.herisson.Clyde.EndPoints.ScientificPublications;
|
||||
|
||||
/******************************************************
|
||||
* @file StatController.java
|
||||
* @author Bartha Maxime
|
||||
* @scope Publications Scientifiques
|
||||
*
|
||||
* Api class for handling statistics
|
||||
******************************************************/
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
@ -1,5 +1,12 @@
|
||||
package ovh.herisson.Clyde.Repositories.ScientificPublications;
|
||||
|
||||
/******************************************************
|
||||
* @file ResearchRepository.java
|
||||
* @author Bartha Maxime
|
||||
* @scope Publications Scientifiques
|
||||
*
|
||||
* Repository handling communication with Reseach table
|
||||
******************************************************/
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import ovh.herisson.Clyde.Tables.ScientificPublications.Research;
|
||||
|
@ -1,5 +1,12 @@
|
||||
package ovh.herisson.Clyde.Repositories.ScientificPublications;
|
||||
|
||||
/******************************************************
|
||||
* @file ResearcherRepository.java
|
||||
* @author Bartha Maxime
|
||||
* @scope Publications Scientifiques
|
||||
*
|
||||
* Repository handling communication with Reseacher table
|
||||
******************************************************/
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import ovh.herisson.Clyde.Tables.ScientificPublications.Research;
|
||||
|
@ -1,5 +1,12 @@
|
||||
package ovh.herisson.Clyde.Repositories.ScientificPublications;
|
||||
|
||||
/******************************************************
|
||||
* @file StatsRepository.java
|
||||
* @author Bartha Maxime
|
||||
* @scope Publications Scientifiques
|
||||
*
|
||||
* Repository handling communication with Reseach table for making statistics
|
||||
******************************************************/
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import ovh.herisson.Clyde.Tables.ScientificPublications.Research;
|
||||
|
@ -1,5 +1,12 @@
|
||||
package ovh.herisson.Clyde.Services.ScientificPublications;
|
||||
|
||||
/******************************************************
|
||||
* @file ResearchesService.java
|
||||
* @author Bartha Maxime
|
||||
* @scope Publications Scientifiques
|
||||
*
|
||||
* Service for managing researcher and researches
|
||||
******************************************************/
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ovh.herisson.Clyde.Repositories.ScientificPublications.ResearchRepository;
|
||||
@ -130,39 +137,6 @@ public class ResearchesService {
|
||||
}
|
||||
researcherRepo.save(researcher);
|
||||
}
|
||||
|
||||
|
||||
//Co Author part
|
||||
public boolean saveCoAuthors(Iterable<Long> researchersId, Research research) {
|
||||
|
||||
if (researchersId == null) return false;
|
||||
|
||||
ArrayList<Researcher> toAdd = new ArrayList<>();
|
||||
for (long researcherId : researchersId){
|
||||
Researcher researcher= researcherRepo.findById(researcherId);
|
||||
if (researcher== null){
|
||||
return false;
|
||||
}
|
||||
if (!toAdd.contains(researcher))
|
||||
{
|
||||
toAdd.add(researcher);
|
||||
}
|
||||
}
|
||||
research.getCoAuthors().addAll(toAdd);
|
||||
articleRepo.save(research);
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean deleteCoAuthor(Research research,Researcher coAuthor) {
|
||||
|
||||
if (!research.getCoAuthors().contains(coAuthor))
|
||||
return false;
|
||||
|
||||
research.getCoAuthors().remove(coAuthor);
|
||||
articleRepo.save(research);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Other stuff
|
||||
|
||||
public Research addView(Research research) {
|
||||
@ -188,12 +162,9 @@ public class ResearchesService {
|
||||
}
|
||||
}
|
||||
|
||||
if (research.getAccess() == Access.Restricted && (
|
||||
user.getRole() == Role.Secretary ||
|
||||
user.getRole() == Role.Teacher || user.getRole() == Role.InscriptionService))
|
||||
return false; // if the access is restricted only the staff member (above) can access the research
|
||||
return research.getAccess() != Access.Restricted || (user.getRole() != Role.Secretary &&
|
||||
user.getRole() != Role.Teacher && user.getRole() != Role.InscriptionService);
|
||||
// if the access is restricted only the staff member (above) can access the research
|
||||
|
||||
return true;
|
||||
// if the researcher is the author or one of the co-authors of the research will return false
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,19 @@
|
||||
package ovh.herisson.Clyde.Services.ScientificPublications;
|
||||
|
||||
/******************************************************
|
||||
* @file StatisticsService
|
||||
* @author Bartha Maxime
|
||||
* @scope Publications Scientifiques
|
||||
*
|
||||
* Service for managing statistics
|
||||
******************************************************/
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ovh.herisson.Clyde.Repositories.ScientificPublications.ResearchRepository;
|
||||
import ovh.herisson.Clyde.Repositories.ScientificPublications.ResearcherRepository;
|
||||
import ovh.herisson.Clyde.Repositories.ScientificPublications.StatsRepository;
|
||||
import ovh.herisson.Clyde.Tables.ScientificPublications.Research;
|
||||
import ovh.herisson.Clyde.Tables.ScientificPublications.Researcher;
|
||||
|
||||
import java.security.Key;
|
||||
import java.util.*;
|
||||
|
||||
@Service
|
||||
|
@ -6,7 +6,6 @@ package ovh.herisson.Clyde.Tables.ScientificPublications;
|
||||
* @scope Extension Publications scientifiques
|
||||
*
|
||||
* Research entity
|
||||
*
|
||||
******************************************************/
|
||||
import jakarta.persistence.*;
|
||||
import lombok.Getter;
|
||||
|
@ -6,7 +6,6 @@ package ovh.herisson.Clyde.Tables.ScientificPublications;
|
||||
* @scope Extension Publications scientifiques
|
||||
*
|
||||
* Researcher entity
|
||||
*
|
||||
******************************************************/
|
||||
import jakarta.persistence.*;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
@ -54,3 +54,64 @@ Curriculum=curriculum
|
||||
Credits=Credits
|
||||
InscriptionService=I.S.
|
||||
faculty=Faculty
|
||||
Year=Year
|
||||
Access=Access
|
||||
Access.Restricted=Restricted
|
||||
Access.OpenSource=OpenSource
|
||||
Access.Private=Private
|
||||
Language=Language
|
||||
Month=Month
|
||||
Month.01=january
|
||||
Month.02=february
|
||||
Month.03=march
|
||||
Month.04=april
|
||||
Month.05=may
|
||||
Month.06=june
|
||||
Month.07=july
|
||||
Month.08=august
|
||||
Month.09=september
|
||||
Month.10=october
|
||||
Month.11=november
|
||||
Month.12=december
|
||||
Domain=Domain
|
||||
PaperType=PaperType
|
||||
Submit=Submit
|
||||
Search.Researches=Search For Researches
|
||||
Search.Researchers=Search For Researchers
|
||||
Filters=Filters
|
||||
Toggle.Researcher=Toggle Researcher Search
|
||||
Untoggle.Researcher=Toggle Research Search
|
||||
MoreInfo=More Info
|
||||
Modify.Research=Modify Research
|
||||
To.Change.In.Options=To change in regular account options
|
||||
Modify.Data=Modify Data
|
||||
Confirm.Changes=Confirm Changes
|
||||
Cancel.Changes=Cancel Changes
|
||||
Post.Research=Post a new Research
|
||||
Summary=Summary
|
||||
Title=Title
|
||||
Views=Number of Views
|
||||
See.Research=See Research
|
||||
SeeBibTex=See BibTex
|
||||
Author=Author
|
||||
CoAuthors=Co-Authors
|
||||
ReleaseDate=ReleaseDate
|
||||
Article.Id=Article Id
|
||||
Delete.Research=Delete Research
|
||||
Here=Here
|
||||
Stat.Type=Stat Type
|
||||
Researches=Researches
|
||||
Please.Select.Option=Please Select an Option
|
||||
Class.By=Class By
|
||||
PaperType.Article=Article
|
||||
PaperType.Book=Book
|
||||
PaperType.Book.Chapter=Book Chapter
|
||||
PaperType.Paper=Paper
|
||||
Research.Pdf=Research Pdf
|
||||
BibTex.Pdf=BibTex Pdf
|
||||
CoAuthors.List=Co-Author List
|
||||
Confirm.Publish=Confirm Publishing
|
||||
Cancel.Publish=Cancel Publishing
|
||||
Years=Years
|
||||
Months=Months
|
||||
By=By
|
@ -54,3 +54,64 @@ Curriculum=Cursus
|
||||
Credits=Credits
|
||||
InscriptionService=S.I.
|
||||
faculty=Faculté
|
||||
Year=Année
|
||||
Access=Accès
|
||||
Access.Restricted=Restreint
|
||||
Access.OpenSource=Libre
|
||||
Access.Private=Privé
|
||||
Language=Langue
|
||||
Month=Mois
|
||||
Month.01=janvier
|
||||
Month.02=fevrier
|
||||
Month.03=mars
|
||||
Month.04=avril
|
||||
Month.05=mai
|
||||
Month.06=juin
|
||||
Month.07=juillet
|
||||
Month.08=août
|
||||
Month.09=septembre
|
||||
Month.10=octobre
|
||||
Month.11=novembre
|
||||
Month.12=decembre
|
||||
Domain=Domaine
|
||||
PaperType=Type de recherche
|
||||
Submit=Envoyer
|
||||
Search.Researches=Chercher Par Recherche
|
||||
Search.Researchers=Chercher Par Chercheur
|
||||
Filters=Filtres
|
||||
Toggle.Researcher=Activer la recherche par chercheur
|
||||
Untoggle.Researcher=Désactiver la recherche par chercheur
|
||||
MoreInfo=Plus d'info
|
||||
Modify.Research=Modifer l'article
|
||||
To.Change.In.Options=À changer dans les options
|
||||
Modify.Data=Modifier
|
||||
Confirm.Changes=Confirmer les Changements
|
||||
Cancel.Changes=Abandonner les Changements
|
||||
Post.Research=Poster un nouvel article
|
||||
Summary=Résumé
|
||||
Title=Titre
|
||||
Views=Nombre de Vues
|
||||
See.Research=Ouvrir l'article
|
||||
SeeBibTex=Ouvrir le BibTex
|
||||
Author=Autheur
|
||||
CoAuthors=Co-Autheurs
|
||||
ReleaseDate=Date de Parution
|
||||
Article.Id=Id de l'article
|
||||
Delete.Research=Supprimer l'article
|
||||
Here=Ici
|
||||
Stat.Type=Type de Stat
|
||||
Researches=Recherches
|
||||
Please.Select.Option=Selectionnez des Options
|
||||
Class.By=Classifer Par
|
||||
PaperType.Article=Article
|
||||
PaperType.Book=Livre
|
||||
PaperType.Book.Chapter=Chapitre de Livre
|
||||
PaperType.Paper=Papier
|
||||
Research.Pdf=Pdf de la Recherche
|
||||
BibTex.Pdf=BibTex de la Recherche
|
||||
CoAuthors.List=Liste des Co-Autheurs
|
||||
Confirm.Publish=Confirmer la Publication
|
||||
Cancel.Publish=Annuler la Publication
|
||||
Years=Années
|
||||
Months=Mois
|
||||
By=par
|
||||
|
@ -7,12 +7,19 @@
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
import {onClickOutside} from '@vueuse/core'
|
||||
import i18n from "@/i18n.js";
|
||||
const yearList = ref([])
|
||||
const yearCheckedList = ref([])
|
||||
const monthList = ref([])
|
||||
const monthCheckedList = ref([])
|
||||
const accessList = ref([])
|
||||
const accessCheckedList = ref([])
|
||||
const languageList = ref([])
|
||||
const languageCheckedList = ref([])
|
||||
const domainList = ref([])
|
||||
const domainCheckedList = ref([])
|
||||
const paperTypeList = ref([])
|
||||
const paperTypCheckedList = ref([])
|
||||
|
||||
const filters = Object.assign({},{
|
||||
year:[],
|
||||
@ -23,6 +30,7 @@ const filters = Object.assign({},{
|
||||
paperType:[],
|
||||
})
|
||||
|
||||
|
||||
const props = defineProps({
|
||||
isOpen: Boolean,
|
||||
allArticles: ref([Object])
|
||||
@ -30,6 +38,12 @@ const props = defineProps({
|
||||
|
||||
|
||||
function submit(){
|
||||
filters.paperType = paperTypCheckedList.value
|
||||
filters.year = yearCheckedList.value
|
||||
filters.month = monthCheckedList.value
|
||||
filters.access = accessCheckedList.value
|
||||
filters.language = languageCheckedList.value
|
||||
filters.domain = domainCheckedList.value
|
||||
emit("modal-close")
|
||||
emit("submit", filters)
|
||||
}
|
||||
@ -53,37 +67,6 @@ for (let i=0;i< props.allArticles.length;i++) {
|
||||
|
||||
if (!paperTypeList.value.includes(r.paperType) && r.paperType !== null) paperTypeList.value.push(r.paperType);
|
||||
}
|
||||
function monthToString(month){
|
||||
|
||||
switch (month){
|
||||
case "01":
|
||||
return "january"
|
||||
case "02":
|
||||
return "february"
|
||||
case "03":
|
||||
return "march"
|
||||
case "04":
|
||||
return "april"
|
||||
case "05":
|
||||
return "may"
|
||||
case "06":
|
||||
return "june"
|
||||
case "07":
|
||||
return "july"
|
||||
case "08":
|
||||
return "august"
|
||||
case "09":
|
||||
return "september"
|
||||
case "10":
|
||||
return "november"
|
||||
case "11":
|
||||
return "october"
|
||||
case "12":
|
||||
return "december"
|
||||
default:
|
||||
return "unknown"
|
||||
}
|
||||
}
|
||||
const emit = defineEmits(["modal-close", "submit"]);
|
||||
|
||||
const target = ref(null)
|
||||
@ -96,15 +79,15 @@ onClickOutside(target, ()=>emit('modal-close'))
|
||||
<div class="modal-wrapper">
|
||||
<div class="modal-container" ref="target">
|
||||
<div id="filterGrid">
|
||||
<div> Year :<ul class="checkers"> <li v-for="n in yearList"> <input type="checkbox" :value=n v-model="filters.year"> {{n}} </li> </ul> </div>
|
||||
<div class="vl"> Access :<ul class="checkers"> <li v-for="n in accessList"> <input type="checkbox" :value=n v-model="filters.access"> {{n}} </li> </ul> </div>
|
||||
<div class="vl"> Language :<ul class="checkers"> <li v-for="n in languageList"> <input type="checkbox" :value=n v-model="filters.language"> {{n}} </li> </ul> </div>
|
||||
<div> Month :<ul class="checkers"> <li v-for="n in monthList"> <input type="checkbox" :value=n v-model="filters.month"> {{monthToString(n)}} </li> </ul> </div>
|
||||
<div class="vl"> Domain :<ul class="checkers"> <li v-for="n in domainList"> <input type="checkbox" :value=n v-model="filters.domain"> {{n}} </li> </ul> </div>
|
||||
<div class="vl"> PaperType :<ul class="checkers"> <li v-for="n in paperTypeList"> <input type="checkbox" :value=n v-model="filters.paperType"> {{n}} </li> </ul> </div>
|
||||
<div> {{i18n("Year")}} :<ul class="checkers"> <li v-for="n in yearList"> <input type="checkbox" :value=n v-model="yearCheckedList"> {{n}} </li> </ul> </div>
|
||||
<div class="vl"> {{i18n("Access")}}:<ul class="checkers"> <li v-for="n in accessList"> <input type="checkbox" :value=n v-model="accessCheckedList"> {{i18n("Access."+n)}} </li> </ul> </div>
|
||||
<div class="vl"> {{i18n("Language")}} :<ul class="checkers"> <li v-for="n in languageList"> <input type="checkbox" :value=n v-model="languageCheckedList"> {{n}} </li> </ul> </div>
|
||||
<div> {{i18n("Month")}} :<ul class="checkers"> <li v-for="n in monthList"> <input type="checkbox" :value=n v-model="monthCheckedList"> {{i18n("Month." + n)}} </li> </ul> </div>
|
||||
<div class="vl"> {{i18n("Domain")}} :<ul class="checkers"> <li v-for="n in domainList"> <input type="checkbox" :value=n v-model="domainCheckedList"> {{n}} </li> </ul> </div>
|
||||
<div class="vl"> {{i18n("PaperType")}} :<ul class="checkers"> <li v-for="n in paperTypeList"> <input type="checkbox" :value=n v-model="paperTypCheckedList"> {{n}} </li> </ul> </div>
|
||||
</div>
|
||||
<div id="submit">
|
||||
<button @click.stop="submit">Submit</button>
|
||||
<button @click.stop="submit">{{i18n("Submit")}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,8 +1,15 @@
|
||||
<!----------------------------------------------------
|
||||
File: ListResearches.vue
|
||||
Author: Maxime Bartha
|
||||
Scope: Extension Publicatons scientifiquess
|
||||
Description: Listing of the researches with filters
|
||||
----------------------------------------------------->
|
||||
<script setup>
|
||||
import {ref, watch} from "vue";
|
||||
import FilterComponent from "@/Apps/ScientificPublications/FilterComponent.vue";
|
||||
import ArticleComponent from "@/Apps/ScientificPublications/ResearchComponent.vue";
|
||||
import {fetchAllResearches} from "@/rest/ScientificPublications/ManageResearch.js";
|
||||
import i18n from "../../i18n.js";
|
||||
const input = ref("")
|
||||
const isFilterOpened = ref(false);
|
||||
const isResearchOpened = ref(false);
|
||||
@ -36,7 +43,6 @@ const closeFilter = () => {
|
||||
};
|
||||
const submitFilters = (receivedFilters)=>{
|
||||
filters.value = receivedFilters
|
||||
console.log(filters.value)
|
||||
}
|
||||
|
||||
|
||||
@ -107,11 +113,11 @@ const emit = defineEmits(["modified"]);
|
||||
<FilterComponent :isOpen="isFilterOpened" :allArticles="researchList" @modal-close="closeFilter" @submit="submitFilters"></FilterComponent>
|
||||
<ArticleComponent :article="articleToDisplay" :isOpen="isResearchOpened" :manage="props.manage" @modal-close="closeResearch" @modified="emit('modified')"></ArticleComponent>
|
||||
<div id="search">
|
||||
<input v-if="!isResearcher" type="text" id="search-input" placeholder="search for researches" v-model="input"/>
|
||||
<input v-else type="text" id="search-input" placeholder="search for researcher" v-model="input"/>
|
||||
<button v-if="!isResearcher" id="filterButton" @click="openFilter"> Filters </button>
|
||||
<button v-if="!isResearcher" id="unToggledResearchButton" @click="isResearcher = !isResearcher"> Toggle Researcher Search</button>
|
||||
<button v-if="isResearcher" id="toggledResearchButton" @click="isResearcher = !isResearcher"> UnToggle Researcher Search</button>
|
||||
<input v-if="!isResearcher" type="text" id="search-input" :placeholder="i18n('Search.Researches')" v-model="input"/>
|
||||
<input v-else type="text" id="search-input" :placeholder="i18n('Search.Researchers')" v-model="input"/>
|
||||
<button v-if="!isResearcher" id="filterButton" @click="openFilter"> {{i18n("Filters")}} </button>
|
||||
<button v-if="!isResearcher" id="unToggledResearchButton" @click="isResearcher = !isResearcher"> {{i18n("Toggle.Researcher")}}</button>
|
||||
<button v-if="isResearcher" id="toggledResearchButton" @click="isResearcher = !isResearcher"> {{i18n("Untoggle.Researcher")}}</button>
|
||||
</div>
|
||||
<div id="researches">
|
||||
<ul id="researchUL">
|
||||
@ -119,8 +125,8 @@ const emit = defineEmits(["modified"]);
|
||||
<div class="vl"> {{n.title}}</div>
|
||||
<div class="vl"> <a :href="'#/researcher-profile?id=' + n.researcher.id"> {{ n.researcher.user.firstName +" "+ n.researcher.user.lastName }}</a>
|
||||
</div>
|
||||
<a v-if="!manage" @click="openResearch(n)"> MoreInfo </a>
|
||||
<a v-else @click="openResearch(n)"> Modify Research</a></li>
|
||||
<a v-if="!manage" @click="openResearch(n)"> {{i18n("MoreInfo")}}</a>
|
||||
<a v-else @click="openResearch(n)"> {{i18n("Modify.Research")}}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@ -216,7 +222,4 @@ a{
|
||||
#toggledResearchButton:hover{
|
||||
background: #ff2d55;
|
||||
}
|
||||
|
||||
|
||||
|
||||
</style>
|
@ -1,77 +1,27 @@
|
||||
<!----------------------------------------------------
|
||||
File: ManageResearchesProfile.vue
|
||||
Author: Maxime Bartha
|
||||
Scope: Extension Publicatons scientifiquess
|
||||
Description: Managing Researcher Profile page
|
||||
----------------------------------------------------->
|
||||
<script setup>
|
||||
import { ref} from "vue";
|
||||
import FilterComponent from "@/Apps/ScientificPublications/FilterComponent.vue";
|
||||
import ArticleComponent from "@/Apps/ScientificPublications/ResearchComponent.vue";
|
||||
import {fetchResearches, } from "@/rest/ScientificPublications/ResearcherProfile.js";
|
||||
import {getSelf, patchProfile} from "@/rest/ScientificPublications/ManageResearcherProfile.js";
|
||||
import ResearchPostComponent from "@/Apps/ScientificPublications/ResearchPostComponent.vue";
|
||||
import ListResearches from "@/Apps/ScientificPublications/ListResearches.vue";
|
||||
import i18n from "../../i18n.js";
|
||||
const input = ref("");
|
||||
const isFilterOpened = ref(false);
|
||||
const isResearchOpened = ref(false);
|
||||
const isPostResearchOpened = ref(false);
|
||||
const articleToDisplay = ref()
|
||||
const changing = ref(false);
|
||||
|
||||
let toModify= Object.assign({}, {});
|
||||
|
||||
const researcher = ref(await getSelf());
|
||||
const researchList = ref(await fetchResearches(researcher.value.id));
|
||||
//todo get the filters
|
||||
|
||||
const openFilter = () => {
|
||||
isFilterOpened.value = true;
|
||||
};
|
||||
const closeFilter = () => {
|
||||
isFilterOpened.value = false;
|
||||
};
|
||||
const submitFilters = ()=>{
|
||||
}
|
||||
const openResearch = (article) => {
|
||||
isResearchOpened.value = true;
|
||||
articleToDisplay.value = article;
|
||||
}
|
||||
|
||||
const closeResearch = () => {
|
||||
isResearchOpened.value =false;
|
||||
articleToDisplay.value = null;
|
||||
}
|
||||
|
||||
function openPostResearch(){
|
||||
isPostResearchOpened.value = true
|
||||
}
|
||||
|
||||
|
||||
function searchInList(list, searchInput) {
|
||||
let retList = []
|
||||
for (let i = 0; i < list.length; i++) {
|
||||
if (lDistance(list[i].title, searchInput) < 10 || list[i].title.toUpperCase().indexOf(searchInput.toUpperCase()) > -1){
|
||||
retList.push(list[i])
|
||||
}
|
||||
}
|
||||
return retList
|
||||
}
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
function cancelChanges(){
|
||||
changing.value = false
|
||||
toModify= Object.assign({}, {});
|
||||
@ -91,42 +41,40 @@ async function modifiedResearch(){
|
||||
</script>
|
||||
|
||||
<template> <div class="body"><div id="main">
|
||||
<FilterComponent :isOpen="isFilterOpened" :allArticles="researchList" @modal-close="closeFilter" @submit="submitFilters()"></FilterComponent>
|
||||
<ArticleComponent :article="articleToDisplay" :isOpen="isResearchOpened" :manage="true" @modal-close="closeResearch" @modified="modifiedResearch" ></ArticleComponent>
|
||||
<ResearchPostComponent :researcher="researcher" :isOpen="isPostResearchOpened" @modal-close="isPostResearchOpened = false" @posted="modifiedResearch"></ResearchPostComponent>
|
||||
<div id="profilePicture">
|
||||
<img src="/Clyde.png" />
|
||||
</div>
|
||||
<div id="researcherInfos">
|
||||
<div class="surrounded" v-if="!changing">{{researcher.user.lastName}} {{researcher.user.firstName}}</div>
|
||||
<div class="surrounded" v-else> To Be changed in manage (simple) Profile</div>
|
||||
<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-if="!changing">Email : {{researcher.user.email}}</div>
|
||||
<div class="surrounded" v-else> To Be changed in manage (simple) Profile</div>
|
||||
<div class="surrounded" v-else> {{i18n("To.Change.In.Options")}}</div>
|
||||
|
||||
<div class="surrounded" v-if="!changing">
|
||||
site : <a :href=researcher.site style="color: #007aff"> {{researcher.site}}</a>
|
||||
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-if="!changing">Domain : {{researcher.domain}}</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 style="text-align: center; align-self: center" v-if="!changing"> <button class="modifyButton" @click="changing = !changing">Modify Data</button></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">
|
||||
<button id="confirmButton" @click="confirmChanges">Confirm Changes</button>
|
||||
<button id="cancelButton" @click="cancelChanges">Cancel Changes</button>
|
||||
<button id="confirmButton" @click="confirmChanges"> {{i18n("Confirm.Changes")}}</button>
|
||||
<button id="cancelButton" @click="cancelChanges"> {{i18n("Cancel.Changes")}}</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="postArticle" style="text-align: center">
|
||||
<button class="modifyButton" @click="openPostResearch">Post a Research</button>
|
||||
<button class="modifyButton" @click="openPostResearch">{{i18n("Post.Research")}}</button>
|
||||
|
||||
|
||||
</div>
|
||||
<div id="researches"> <ListResearches :research-list="researchList" :manage="true" @modified="modifiedResearch"></ListResearches> </div>
|
||||
<div> <ListResearches :research-list="researchList" :manage="true" @modified="modifiedResearch"></ListResearches> </div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -187,6 +135,7 @@ async function modifiedResearch(){
|
||||
font-size: xx-large;
|
||||
background-color:rgba(191, 64, 191,0.5);
|
||||
border-radius: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.modifyButton:hover{
|
||||
@ -219,61 +168,9 @@ async function modifiedResearch(){
|
||||
background: #4cd964;
|
||||
}
|
||||
|
||||
#search{
|
||||
width: 100%;
|
||||
height: 10%;
|
||||
display: inline-flex;
|
||||
}
|
||||
#search-input {
|
||||
margin-left: 25px;
|
||||
width: 75%;
|
||||
font-size: 16px;
|
||||
padding: 12px 20px 12px 40px;
|
||||
border: 1px solid #ddd;
|
||||
height: 20px;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
|
||||
#researchUL {
|
||||
list-style-type: none;
|
||||
color: white;
|
||||
padding: 12px;
|
||||
margin: 5px;
|
||||
height: 400px;
|
||||
overflow: scroll;
|
||||
}
|
||||
#researchLi{
|
||||
display: grid;
|
||||
grid-template-columns: auto auto auto;
|
||||
border: 2px solid black;
|
||||
color: white;
|
||||
font-size: x-large;
|
||||
text-align: center;
|
||||
text-indent: 7px;
|
||||
background-color: rgba(255, 255, 255, 0.09);
|
||||
border-radius: 18px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
a{
|
||||
color:#007aff;
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.vl {
|
||||
border-right: 2px solid black;
|
||||
}
|
||||
</style>
|
@ -2,13 +2,14 @@
|
||||
File: ResearchComponent.vue
|
||||
Author: Maxime Bartha
|
||||
Scope: Extension Publicatons scientifiquess
|
||||
Description: Pop Up summarizing
|
||||
Description: Pop Up summarizing a research infos
|
||||
----------------------------------------------------->
|
||||
|
||||
<script setup xmlns="http://www.w3.org/1999/html">
|
||||
import {ref } from "vue";
|
||||
import {onClickOutside} from '@vueuse/core'
|
||||
import {patchArticle, deleteArticle, addView} from "@/rest/ScientificPublications/ManageResearch.js";
|
||||
import i18n from "../../i18n.js";
|
||||
|
||||
const restURL = import.meta.env.VITE_CLYDE_MODE === 'container' ? "http://localhost:8000": import.meta.env.DEV ? "http://localhost:5173" : "https://clyde.herisson.ovh/api"
|
||||
const props = defineProps({
|
||||
@ -71,40 +72,40 @@ async function articleClicked(){
|
||||
<div class="modal-wrapper">
|
||||
<div class="modal-container" ref="target">
|
||||
<div ><ul>
|
||||
<li>Article Id : {{article.id}}</li>
|
||||
<li>Title : {{article.title}}</li>
|
||||
<li>Author : {{article.researcher.user.lastName + " " + article.researcher.user.firstName}}</li>
|
||||
<li> Co Authors : <ul id="coAuthors" v-for="n in article.coAuthors"> <li id="coAuthorsLi"> {{n.user.firstName}} {{n.user.lastName}}, </li></ul></li>
|
||||
<li>Summary : {{article.summary}}</li>
|
||||
<li>ReleaseDate: {{format(article.releaseDate)}}</li>
|
||||
<li>Language : {{article.language}}</li>
|
||||
<li>PaperType : {{article.paperType}}</li>
|
||||
<li>Domain : {{article.domain}}</li>
|
||||
<li>Views : {{article.views}}</li>
|
||||
<li>Access : {{article.access}}</li>
|
||||
<li>{{i18n("Article.Id")}} : {{article.id}}</li>
|
||||
<li>{{i18n("Title")}} : {{article.title}}</li>
|
||||
<li>{{i18n("Author")}} : {{article.researcher.user.lastName + " " + article.researcher.user.firstName}}</li>
|
||||
<li>{{i18n("CoAuthors")}} : <ul id="coAuthors" v-for="n in article.coAuthors"> <li id="coAuthorsLi"> {{n.user.firstName}} {{n.user.lastName}}, </li></ul></li>
|
||||
<li>{{i18n("Summary")}} : {{article.summary}}</li>
|
||||
<li>{{i18n("ReleaseDate")}} : {{format(article.releaseDate)}}</li>
|
||||
<li>{{i18n("Language")}} : {{article.language}}</li>
|
||||
<li>{{i18n("PaperType")}} : {{article.paperType}}</li>
|
||||
<li>{{i18n("Domain")}} : {{article.domain}}</li>
|
||||
<li>{{i18n("Views")}} : {{article.views}}</li>
|
||||
<li>{{i18n("Access")}} : {{i18n(article.access)}}</li>
|
||||
</ul>
|
||||
<div id="downloads" v-if="article.pdfLocation !== null && !manage">
|
||||
<a :href=downloadPdf() @click.stop="articleClicked" target="_blank">See Research</a>
|
||||
<a v-if="article.bibTexLocation !== null" :href=downloadBibTex() @click.stop="emit('modal-close')" target="_blank">See bibTex</a> </div>
|
||||
<a :href=downloadPdf() @click.stop="articleClicked" target="_blank">{{i18n("See.Research")}}</a>
|
||||
<a v-if="article.bibTexLocation !== null" :href=downloadBibTex() @click.stop="emit('modal-close')" target="_blank">{{i18n("See.BibTex")}}</a> </div>
|
||||
</div>
|
||||
<div v-if="manage">
|
||||
<div>
|
||||
<ul>
|
||||
<li>Title : <input v-model="toModify.title"></li>
|
||||
<li>Language : <input v-model="toModify.language"></li>
|
||||
<li>Summary : <input v-model="toModify.summary"></li>
|
||||
<li>Domain : <input v-model="toModify.domain"></li>
|
||||
<li>Access :
|
||||
<li>{{i18n("Title")}} : <input v-model="toModify.title"></li>
|
||||
<li>{{i18n("Language")}} : <input v-model="toModify.language"></li>
|
||||
<li>{{i18n("Summary")}} : <input v-model="toModify.summary"></li>
|
||||
<li>{{i18n("Domain")}} : <input v-model="toModify.domain"></li>
|
||||
<li>{{i18n("Access")}} :
|
||||
<select id="classed-select" v-model="toModify.access">
|
||||
<option value="OpenSource">OpenSource</option>
|
||||
<option value="Restricted">Restricted</option>
|
||||
<option value="Private">Private</option>
|
||||
<option value="OpenSource">{{i18n("Access.OpenSource")}}</option>
|
||||
<option value="Restricted">{{i18n("Access.Restricted")}}</option>
|
||||
<option value="Private">{{i18n("Access.Private")}}</option>
|
||||
</select></li>
|
||||
</ul>
|
||||
</div>
|
||||
<button id="confirmButton" @click="confirmChanges">Confirm Changes</button>
|
||||
<button id="cancelButton" @click="cancelChanges">Cancel Changes</button>
|
||||
<button id="deleteButton" @click="deleteThisArticle">Delete Research </button>
|
||||
<button id="confirmButton" @click="confirmChanges"> {{i18n("Confirm.Changes")}}</button>
|
||||
<button id="cancelButton" @click="cancelChanges">{{i18n("Cancel.Changes")}}</button>
|
||||
<button id="deleteButton" @click="deleteThisArticle">{{i18n("Delete.Research")}} </button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,8 +1,15 @@
|
||||
<!----------------------------------------------------
|
||||
File: ResearchPostComponent.vue
|
||||
Author: Maxime Bartha
|
||||
Scope: Extension Publicatons scientifiquess
|
||||
Description: pop up for posting a research
|
||||
----------------------------------------------------->
|
||||
<script setup>
|
||||
|
||||
import { ref } from "vue";
|
||||
import {onClickOutside} from '@vueuse/core'
|
||||
import {uploadFile, postResearch, fetchAllResearchers} from "@/rest/ScientificPublications/ManageResearch.js";
|
||||
import i18n from "../../i18n.js";
|
||||
const allResearcher = ref(await fetchAllResearchers())
|
||||
|
||||
const coAuthors = ref([])
|
||||
@ -61,34 +68,34 @@ onClickOutside(target, ()=>emit('modal-close'))
|
||||
<div class="modal-container" ref="target">
|
||||
<div ><ul>
|
||||
|
||||
<li>Title : <input v-model="toPost.title"></li>
|
||||
<li>Summary : <input v-model="toPost.summary"></li>
|
||||
<li>Language : <input v-model="toPost.language"></li>
|
||||
<li>Domain : <input v-model="toPost.domain"></li>
|
||||
<li>PaperType : <select id="classed-select" v-model="toPost.paperType">
|
||||
<option value="Article">Article</option>
|
||||
<option value="Book">Book</option>
|
||||
<option value="BookChapter">Book Chapter</option>
|
||||
<option value="Paper">Paper</option>
|
||||
<li>{{i18n("Title")}} : <input v-model="toPost.title"></li>
|
||||
<li>{{i18n("Summary")}} : <input v-model="toPost.summary"></li>
|
||||
<li>{{i18n("Language")}} : <input v-model="toPost.language"></li>
|
||||
<li>{{i18n("Domain")}} : <input v-model="toPost.domain"></li>
|
||||
<li>{{i18n("PaperType")}} : <select id="classed-select" v-model="toPost.paperType">
|
||||
<option value="Article">{{i18n("PaperType.Article")}}</option>
|
||||
<option value="Book">{{i18n("PaperType.Book")}}</option>
|
||||
<option value="BookChapter">{{i18n("PaperType.Book.Chapter")}}</option>
|
||||
<option value="Paper">{{i18n("PaperType.Paper")}}Paper</option>
|
||||
</select></li>
|
||||
<li>Access : <select id="classed-select" v-model="toPost.access">
|
||||
<option value="OpenSource">OpenSource</option>
|
||||
<option value="Restricted">Restricted</option>
|
||||
<option value="Private">Private</option>
|
||||
<li>{{i18n("Access")}} : <select id="classed-select" v-model="toPost.access">
|
||||
<option value="OpenSource">{{i18n("Access.OpenSource")}}</option>
|
||||
<option value="Restricted">{{i18n("Access.Restricted")}}</option>
|
||||
<option value="Private">{{i18n("Access.Private")}}</option>
|
||||
</select></li>
|
||||
|
||||
|
||||
<li> Research Pdf :
|
||||
<li> {{i18n("Research.Pdf")}} :
|
||||
<form novalidate enctype="multipart/form-data" class="inputBox">
|
||||
<input type="file" @change="uploadResearchPdf($event.target.files);" accept="application/pdf">
|
||||
</form></li>
|
||||
<li> Research BibTex :
|
||||
<li> {{i18n("BibTex.Pdf")}}
|
||||
<form novalidate enctype="multipart/form-data" class="inputBox">
|
||||
<input type="file" @change="uploadBibTex($event.target.files);" accept=".bib">
|
||||
</form></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="CoAuthorList"> Co-Authors List:
|
||||
<div id="CoAuthorList"> {{i18n("CoAuthors.List")}} :
|
||||
<ul style="list-style-type: none;" v-for="n in allResearcher">
|
||||
<li v-if="n.id !== props.researcher.id"> <input type="checkbox" :value=n v-model="coAuthors"> {{n.id}} : {{n.user.firstName}} {{n.user.lastName}}</li>
|
||||
</ul>
|
||||
@ -96,14 +103,12 @@ onClickOutside(target, ()=>emit('modal-close'))
|
||||
</div>
|
||||
<div></div>
|
||||
<div>
|
||||
<button id="confirmButton" @click="postNewResearch">Confirm Publish</button>
|
||||
<button id="cancelButton" @click="cancelPost">Cancel Publish</button>
|
||||
<button id="confirmButton" @click="postNewResearch">{{i18n("Confirm.Publish")}}</button>
|
||||
<button id="cancelButton" @click="cancelPost">{{i18n("Cancel.Publish")}}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
@ -132,12 +137,6 @@ onClickOutside(target, ()=>emit('modal-close'))
|
||||
margin-top: 9px;
|
||||
}
|
||||
|
||||
#coAuthorList{
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#downloads button {
|
||||
align-self: center;
|
||||
margin-left: 2px;
|
||||
|
@ -7,17 +7,12 @@
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive } from "vue";
|
||||
import FilterComponent from "@/Apps/ScientificPublications/FilterComponent.vue";
|
||||
import ArticleComponent from "@/Apps/ScientificPublications/ResearchComponent.vue";
|
||||
import {fetchResearcher, fetchResearches, fetchStats, fetchResearch} from "@/rest/ScientificPublications/ResearcherProfile.js";
|
||||
import {getFile, addView} from "@/rest/ScientificPublications/ManageResearch.js";
|
||||
import {fetchResearcher, fetchResearches, fetchStats} from "@/rest/ScientificPublications/ResearcherProfile.js";
|
||||
import ListResearches from "@/Apps/ScientificPublications/ListResearches.vue";
|
||||
import i18n from "../../i18n.js";
|
||||
const input = ref("");
|
||||
const statsOf = ref("");
|
||||
const statsBy = ref("");
|
||||
const isFilterOpened = ref(false);
|
||||
const isResearchOpened = ref(false);
|
||||
const articleToDisplay = ref(Object)
|
||||
let chart;
|
||||
|
||||
const researcherId = window.location.href.split("=")[1]
|
||||
@ -27,29 +22,6 @@ const researchList = ref(await fetchResearches(researcherId));
|
||||
const researcher = ref(await fetchResearcher(researcherId));
|
||||
const stats = ref(await fetchStats(researcherId))
|
||||
|
||||
const closeFilter = () => {
|
||||
isFilterOpened.value = false;
|
||||
};
|
||||
const submitFilters = ()=>{
|
||||
}
|
||||
|
||||
const closeResearch = () => {
|
||||
isResearchOpened.value =false;
|
||||
articleToDisplay.value = null;
|
||||
}
|
||||
|
||||
const downloadBibTex = (research) => {
|
||||
getFile(research.bibTexLocation)
|
||||
}
|
||||
|
||||
async function downloadArticle (research) {
|
||||
await addView(research.pdfLocation)
|
||||
await getFile(research.pdfLocation)
|
||||
articleToDisplay.value = await fetchResearch(articleToDisplay.value.id)
|
||||
stats.value = await fetchStats(researcher.value.id)
|
||||
update()
|
||||
}
|
||||
|
||||
function downloadCoAuthors(){
|
||||
let coAuthors = []
|
||||
for (let i in researchList.value) {
|
||||
@ -69,7 +41,7 @@ const options = reactive({
|
||||
animationEnabled: true,
|
||||
title: {
|
||||
fontColor: "white",
|
||||
text : "please select options",
|
||||
text : i18n("Please.Select.Option"),
|
||||
},
|
||||
data: [
|
||||
{
|
||||
@ -93,15 +65,13 @@ function update(){
|
||||
options.data[0].dataPoints = stats.value[index]
|
||||
|
||||
|
||||
options.title.text = statsOf.value + " By "+ statsBy.value;
|
||||
options.title.text = i18n(statsOf.value) +" "+ i18n("By") +" " + i18n(statsBy.value);
|
||||
chart.render();
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div id="main">
|
||||
<FilterComponent :isOpen="isFilterOpened" :allArticles="researchList" @modal-close="closeFilter" @submit="submitFilters()"></FilterComponent>
|
||||
<ArticleComponent :article="articleToDisplay" :isOpen="isResearchOpened" :manage="false" @modal-close="closeResearch" @downloadPdf="downloadArticle(articleToDisplay)" @downloadBibTex="downloadBibTex(articleToDisplay)"></ArticleComponent>
|
||||
<div id="profilePicture">
|
||||
<img src="/Clyde.png" />
|
||||
</div>
|
||||
@ -110,26 +80,26 @@ function update(){
|
||||
<div class="surrounded">Orcid : {{researcher.orcidId}}</div>
|
||||
<div class="surrounded">Email : {{researcher.user.email}}</div>
|
||||
<div class="surrounded">
|
||||
site : <a :href=researcher.site style="color: #007aff"> {{researcher.site}}</a>
|
||||
Site : <a :href=researcher.site style="color: #007aff"> {{researcher.site}}</a>
|
||||
</div>
|
||||
<div class="surrounded">Domain : {{researcher.domain}}</div>
|
||||
<div id="coAuthorList" class="surrounded">Co-authors list : <a :href=downloadCoAuthors() download="coAuthors.json"> here </a></div>
|
||||
<div class="surrounded">{{i18n("Domain")}} : {{researcher.domain}}</div>
|
||||
<div id="coAuthorList" class="surrounded">Co-authors list : <a :href=downloadCoAuthors() download="coAuthors.json">{{i18n("Here")}}</a></div>
|
||||
</div>
|
||||
<div id="stats">
|
||||
<div class="surrounded">
|
||||
Stat type :
|
||||
{{i18n("Stat.Type")}} :
|
||||
<select @change="update()" id="stats-select" v-model="statsOf">
|
||||
<option value="views">Views</option>
|
||||
<option value="researches">Researches</option>
|
||||
<option value="languages">Languages</option>
|
||||
<option value="Views">{{i18n("Views")}}</option>
|
||||
<option value="Researches">{{i18n("Researches")}}</option>
|
||||
<option value="Languages">{{i18n("Language")}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="surrounded">
|
||||
Class by:
|
||||
{{i18n("Class.By")}} :
|
||||
<select @change="update()" id="classed-select" v-model="statsBy">
|
||||
<option value="years">Years</option>
|
||||
<option value="months">Months</option>
|
||||
<option value="topics">Topics</option>
|
||||
<option value="Years">{{i18n("Years")}}</option>
|
||||
<option value="Months">{{i18n("Months")}}</option>
|
||||
<option value="Topics">{{i18n("Domain")}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div id="statsPie">
|
||||
|
Loading…
Reference in New Issue
Block a user