Yield generated for 4fe86699-ab7a-4ada-96cc-5689912c2420
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

125 lines
2.6 KiB

<template>
<div>
<div v-if="isLoading" class="article-preview">Loading articles...</div>
<div v-else>
<div v-if="articles.length === 0" class="article-preview">
No articles are here... yet.
</div>
<RwvArticlePreview
v-for="(article, index) in articles"
:article="article"
:key="article.title + index"
/>
<VPagination :pages="pages" :currentPage.sync="currentPage" />
</div>
</div>
</template>
<script>
import { mapGetters } from "vuex";
import RwvArticlePreview from "./VArticlePreview";
import VPagination from "./VPagination";
import { FETCH_ARTICLES } from "../store/actions.type";
export default {
name: "RwvArticleList",
components: {
RwvArticlePreview,
VPagination
},
props: {
type: {
type: String,
required: false,
default: "all"
},
author: {
type: String,
required: false
},
tag: {
type: String,
required: false
},
favorited: {
type: String,
required: false
},
itemsPerPage: {
type: Number,
required: false,
default: 10
}
},
data() {
return {
currentPage: 1
};
},
computed: {
listConfig() {
const { type } = this;
const filters = {
offset: (this.currentPage - 1) * this.itemsPerPage,
limit: this.itemsPerPage
};
if (this.author) {
filters.author = this.author;
}
if (this.tag) {
filters.tag = this.tag;
}
if (this.favorited) {
filters.favorited = this.favorited;
}
return {
type,
filters
};
},
pages() {
if (this.isLoading || this.articlesCount <= this.itemsPerPage) {
return [];
}
return [
...Array(Math.ceil(this.articlesCount / this.itemsPerPage)).keys()
].map(e => e + 1);
},
...mapGetters(["articlesCount", "isLoading", "articles"])
},
watch: {
currentPage(newValue) {
this.listConfig.filters.offset = (newValue - 1) * this.itemsPerPage;
this.fetchArticles();
},
type() {
this.resetPagination();
this.fetchArticles();
},
author() {
this.resetPagination();
this.fetchArticles();
},
tag() {
this.resetPagination();
this.fetchArticles();
},
favorited() {
this.resetPagination();
this.fetchArticles();
}
},
mounted() {
this.fetchArticles();
},
methods: {
fetchArticles() {
this.$store.dispatch(FETCH_ARTICLES, this.listConfig);
},
resetPagination() {
this.listConfig.offset = 0;
this.currentPage = 1;
}
}
};
</script>