225 lines
6.2 KiB
Vue
225 lines
6.2 KiB
Vue
<!----------------------------------------------------
|
|
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);
|
|
const articleToDisplay = ref(Object)
|
|
const isResearcher = ref(false)
|
|
const filters = ref(null)
|
|
const researchList = ref(await fetchAllResearches())
|
|
|
|
|
|
const props = defineProps({
|
|
researchList:ref(),
|
|
manage:Boolean
|
|
});
|
|
|
|
if (typeof props.researchList !== 'undefined'){
|
|
researchList.value = props.researchList
|
|
}
|
|
watch(
|
|
() => props.researchList,
|
|
(newValue) => {
|
|
researchList.value = newValue
|
|
}
|
|
);
|
|
|
|
|
|
const openFilter = () => {
|
|
isFilterOpened.value = true;
|
|
};
|
|
const closeFilter = () => {
|
|
isFilterOpened.value = false;
|
|
};
|
|
const submitFilters = (receivedFilters)=>{
|
|
filters.value = receivedFilters
|
|
}
|
|
|
|
|
|
const openResearch = (article) => {
|
|
isResearchOpened.value = true;
|
|
articleToDisplay.value = article;
|
|
}
|
|
|
|
const closeResearch = () => {
|
|
isResearchOpened.value =false;
|
|
articleToDisplay.value = null;
|
|
}
|
|
|
|
|
|
function searchInList(list, searchInput) {
|
|
let retList = []
|
|
for (let i = 0; i < list.length; i++) {
|
|
let researcher = list[i].researcher.user.firstName + " " +list[i].researcher.user.lastName
|
|
if (isResearcher.value && (lDistance(researcher, searchInput) < 5 || researcher.toUpperCase().indexOf(searchInput.toUpperCase()) > -1)){
|
|
retList.push(list[i])
|
|
}
|
|
if (!isResearcher.value && (lDistance(list[i].title, searchInput) < 10 || list[i].title.toUpperCase().indexOf(searchInput.toUpperCase()) > -1)){
|
|
|
|
if (filters.value === null) {
|
|
retList.push(list[i])
|
|
continue;
|
|
}
|
|
if ( (filters.value.access.length === 0 || filters.value.access.includes(list[i].access))
|
|
&& ( filters.value.domain.length === 0|| filters.value.domain.includes(list[i].domain))
|
|
&& ( filters.value.paperType.length === 0 || filters.value.paperType.includes(list[i].paperType))
|
|
&& ( filters.value.year.length === 0|| filters.value.year.includes(list[i].releaseDate.split("-")[0]))
|
|
&& ( filters.value.month.length === 0|| filters.value.month.includes(list[i].releaseDate.split("-")[1]))
|
|
&& ( filters.value.language.length === 0|| filters.value.language.includes(list[i].language)))
|
|
{
|
|
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];
|
|
}
|
|
|
|
const emit = defineEmits(["modified"]);
|
|
|
|
</script>
|
|
|
|
<template>
|
|
<div id="researches">
|
|
<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="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">
|
|
<li id="researchLi" v-for="n in searchInList(researchList,input)">
|
|
<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)"> {{i18n("MoreInfo")}}</a>
|
|
<a v-else @click="openResearch(n)"> {{i18n("Modify.Research")}}</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
|
|
#researches{
|
|
width: 100%;
|
|
height: 100%;
|
|
overflow: scroll;
|
|
}
|
|
#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: 100%;
|
|
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;
|
|
}
|
|
|
|
#unToggledResearchButton{
|
|
align-self: center;
|
|
margin-left: 2px;
|
|
font-size:16px ;
|
|
color: white;
|
|
background: #2a1981;
|
|
border:2px solid black;
|
|
}
|
|
|
|
#unToggledResearchButton:hover{
|
|
background: #5ac8fa;
|
|
|
|
}
|
|
|
|
#toggledResearchButton {
|
|
align-self: center;
|
|
margin-left: 2px;
|
|
font-size: large;
|
|
color: white;
|
|
background: crimson;
|
|
border:2px solid black;
|
|
}
|
|
#toggledResearchButton:hover{
|
|
background: #ff2d55;
|
|
}
|
|
</style> |