feat: add tag page
This commit is contained in:
parent
def757134a
commit
b5706dfb42
59
pages/tag/_tag.vue
Normal file
59
pages/tag/_tag.vue
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<template>
|
||||||
|
<section class="tags-page-wrapper">
|
||||||
|
<div class="tags-page__header">
|
||||||
|
<h2>
|
||||||
|
Tag: {{ $route.params.tag }}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
<div class="tags-page__content-wrapper">
|
||||||
|
<ListBlog :list-blogs="blogsByTag" />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { Vue, Component } from 'nuxt-property-decorator'
|
||||||
|
import ListBlog from '@/components/organisms/ListBlog.vue'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
components: {
|
||||||
|
ListBlog
|
||||||
|
},
|
||||||
|
async asyncData ({ $content, params }) {
|
||||||
|
/*
|
||||||
|
* Folder inside /content
|
||||||
|
*/
|
||||||
|
const path = 'blog'
|
||||||
|
const blog = await $content(path, { deep: true })
|
||||||
|
.only(['title', 'description', 'image', 'slug', 'published', 'tags'])
|
||||||
|
.sortBy('published', 'desc')
|
||||||
|
.fetch()
|
||||||
|
|
||||||
|
const blogsByTag = blog.filter((article) => {
|
||||||
|
const blogTags = article.tags.map(x => x.toLowerCase())
|
||||||
|
return blogTags.includes(params.tag)
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
blogsByTag
|
||||||
|
}
|
||||||
|
},
|
||||||
|
head () {
|
||||||
|
return {
|
||||||
|
title: `Blog Tagged - ${this.captialise(this.$route.params.tag)}`,
|
||||||
|
link: [
|
||||||
|
{
|
||||||
|
hid: 'canonical',
|
||||||
|
rel: 'canonical',
|
||||||
|
href: `${process.env.baseUrl}/tags/${this.$route.params.tag}`
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
export default class TagPage extends Vue {
|
||||||
|
captialise (text) {
|
||||||
|
return text.charAt(0).toUpperCase() + text.slice(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
62
pages/tag/index.vue
Normal file
62
pages/tag/index.vue
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div class="flex justify-center">
|
||||||
|
<h2
|
||||||
|
class="text-center text-3xl mb-4 uppercase bg-black text-white inline-block mx-auto px-2"
|
||||||
|
>
|
||||||
|
All Tags
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
<ul>
|
||||||
|
<li v-for="tag in tags" :key="tag" class="text-center mb-2">
|
||||||
|
<nuxt-link
|
||||||
|
:to="{ name: 'tags-tag', params: { tag: tag.toLowerCase() } }"
|
||||||
|
class="text-4xl hover:underline"
|
||||||
|
>
|
||||||
|
{{ tag }}
|
||||||
|
</nuxt-link>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { IContentDocument } from '@nuxt/content/types/content'
|
||||||
|
import { Vue, Component } from 'nuxt-property-decorator'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
name: 'TagListPage',
|
||||||
|
async asyncData ({ $content }) {
|
||||||
|
function onlyUnique (value: string, index: number, self: string[]) {
|
||||||
|
return self.indexOf(value) === index
|
||||||
|
}
|
||||||
|
const blog: IContentDocument[] = await $content('blog')
|
||||||
|
.only(['tags'])
|
||||||
|
.fetch<IContentDocument[]>()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tags của tất cả pài viết
|
||||||
|
*/
|
||||||
|
const tags = blog
|
||||||
|
.flatMap(blog => blog.tags)
|
||||||
|
.filter(onlyUnique)
|
||||||
|
|
||||||
|
return {
|
||||||
|
tags
|
||||||
|
}
|
||||||
|
},
|
||||||
|
head () {
|
||||||
|
return {
|
||||||
|
title: 'Article Tags - Learning Laravel and VueJS',
|
||||||
|
link: [
|
||||||
|
{
|
||||||
|
hid: 'canonical',
|
||||||
|
rel: 'canonical',
|
||||||
|
href: `${process.env.baseUrl}/tags`
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
export default class TagListPage extends Vue {}
|
||||||
|
</script>
|
Loading…
x
Reference in New Issue
Block a user