Skip to content

Commit 1f5109b

Browse files
authored
Merge pull request #61 from CodeandoMexico/issue57
Adding tags filtera to blog section
2 parents ee89c7c + 53ad385 commit 1f5109b

File tree

5 files changed

+78
-8
lines changed

5 files changed

+78
-8
lines changed

src/components/MenuTagsBlog.svelte

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<script>
2+
export let activeTag;
3+
export let handleTags;
4+
export let tags;
5+
</script>
6+
7+
{#each tags as tag}
8+
<a
9+
href={null}
10+
class={activeTag === tag ? 'text-cmxgreen' : null}
11+
on:click={() => handleTags(tag)}
12+
>
13+
{tag.toUpperCase()}
14+
</a>
15+
{/each}
16+
17+
<style>
18+
a {
19+
display: inline-block;
20+
text-transform: uppercase;
21+
font-weight: 700;
22+
line-height: 2.5;
23+
}
24+
a:not(:last-child) {
25+
padding-right: 15px;
26+
}
27+
a:hover {
28+
cursor: pointer;
29+
text-decoration: underline;
30+
}
31+
</style>

src/lib/utilities.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const interfaceElement = [
2+
{ tags: [''] }
3+
];
4+
5+
export function getFlatArrayUnrepeated(elements = interfaceElement) {
6+
let unrepeated = [];
7+
const setToLowerCase = (item = '') => item.toLowerCase();
8+
9+
elements.forEach(item => {
10+
unrepeated = [...new Set([...unrepeated, ...new Set(item?.tags?.map(setToLowerCase))])]
11+
})
12+
13+
return unrepeated;
14+
}

src/routes/blog/+page.server.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import client from '$lib/apiClient'
2+
import { getFlatArrayUnrepeated } from '$lib/utilities';
23
import { readSingleton, readItems } from '@directus/sdk'
34

45
export async function load() {
@@ -20,9 +21,13 @@ export async function load() {
2021
sort: ['-date_published'],
2122
}))
2223

24+
const tags = getFlatArrayUnrepeated(posts);
25+
tags.unshift('todos');
26+
2327
return {
2428
blog,
25-
posts
29+
posts,
30+
tags,
2631
}
2732
}
2833

src/routes/blog/+page.svelte

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,27 @@
22
import { updateMenuSelector } from '@/lib/menuSelectorUpdater.js';
33
import ArticleCard from "@/components/Cards/ArticleCard.svelte";
44
import BlogHero from "@/components/BlogHero.svelte";
5+
import MenuTagsBlog from "@/components/MenuTagsBlog.svelte";
56
export let data
6-
const { blog, posts } = data
7+
const { blog, posts, tags } = data
8+
let filteredPosts = [...posts]
9+
let activeTag = "todos"
10+
11+
const handleTags = (tag = "") => {
12+
tag = tag.toLocaleLowerCase()
13+
activeTag = tag
14+
filteredPosts = tag === "todos"
15+
? [...posts]
16+
: posts.filter(post => post.tags.map((tagItem = '') => tagItem.toLowerCase()).includes(tag))
17+
}
718
819
updateMenuSelector({url: '/blog', color: 'text-cmxgreen'})
920
</script>
1021
<div class="container my-20 pt-hero mx-auto">
1122

1223
<div class="container m-auto px-3">
1324
<div class="my-7">
14-
<h1 class="text-5xl text-cmxblack font-bold">Blog</h1>
25+
<h1 class="text-5xl text-cmxgreen font-bold">Blog</h1>
1526
</div>
1627
<BlogHero
1728
slug={blog.highlight_post.slug}
@@ -23,9 +34,16 @@
2334
content={blog.highlight_post.content}
2435
/>
2536
</div>
37+
<div class="container mx-auto px-3 pt-16 pb-12 text-center">
38+
<MenuTagsBlog
39+
activeTag={activeTag}
40+
handleTags={handleTags}
41+
tags={tags}
42+
/>
43+
</div>
2644
<div class="container m-auto p-3">
2745
<div class="md:grid grid-cols-3 gap-5">
28-
{#each posts as post}
46+
{#each filteredPosts as post}
2947
<ArticleCard
3048
slug={post.slug}
3149
title={post.title}

src/routes/blog/[slug]/+page.svelte

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
<script>
2+
import { browser } from '$app/environment';
23
import { updateMenuSelector } from '@/lib/menuSelectorUpdater.js';
34
import { onDestroy } from 'svelte';
45
import ReadingTime from '@/components/ReadingTime.svelte';
56
import HumanDate from '@/components/HumanDate.svelte';
6-
export let data
7-
const { post } = data
7+
export let data;
8+
const { post } = data;
9+
let title = '';
810
911
updateMenuSelector({url: '/blog', color: 'text-cmxgreen'})
10-
const title = document.title
12+
if (browser) { title = document.title }
1113
1214
onDestroy(() => {
13-
document.title = title
15+
if (browser) { document.title = title }
1416
})
1517
</script>
1618

0 commit comments

Comments
 (0)