learndb/src/FormatDetail.svelte

85 wiersze
2.8 KiB
Svelte

2022-05-08 12:02:37 +00:00
<script>
2024-11-24 13:14:00 +00:00
import { run } from 'svelte/legacy';
2022-05-08 12:02:37 +00:00
import ItemCard from "./ItemCard.svelte"
2022-05-30 11:18:19 +00:00
import SearchForm from "./SearchForm.svelte"
2022-06-03 17:54:19 +00:00
import { formats } from "./formats.js"
2022-07-10 15:01:35 +00:00
import { io_getItemsForTopicAndFormat } from "../db/jsonlines";
2024-11-24 13:14:00 +00:00
let { format, alltopics } = $props();
let items = $state([]);
let filteredItems = $state([]);
2022-05-30 11:18:19 +00:00
2024-11-24 13:14:00 +00:00
let query = $state({
2022-05-30 11:18:19 +00:00
text: "",
topic: "",
level: "",
2022-06-03 13:35:57 +00:00
tag: "",
2022-05-30 11:18:19 +00:00
sortby: "rating"
2024-11-24 13:14:00 +00:00
});
2022-05-08 12:02:37 +00:00
2024-11-24 13:14:00 +00:00
run(() => {
items = io_getItemsForTopicAndFormat(format, query?.topic)
});
2022-05-30 11:18:19 +00:00
function handleQueryChanged(event){
2022-06-03 13:35:57 +00:00
// console.log("queryChanged: ", event.detail);
2022-05-30 11:18:19 +00:00
query = event.detail;
}
2024-11-24 13:14:00 +00:00
run(() => {
filteredItems = items.filter(item => {
if(query.text && !item.name.toLowerCase().includes(query.text.toLowerCase())){ return false; }
if(query.topic && !item.topics.includes(query.topic)){ return false; }
if(query.level && item.difficulty != query.level){ return false; }
if(query.tag && !(item.tags || []).includes(query.tag)){ return false; }
return true;
}).sort((a,b) => {
if(query.sortby == 'rating') { return (a.rating - b.rating) };
if(query.sortby == 'year') { return (a.year - b.year)};
if(query.sortby == 'name') { return a.name.localeCompare(b.name)};
});
});
function capitalize(str){
return str.charAt(0).toUpperCase() + str.slice(1)
}
2022-05-08 12:02:37 +00:00
</script>
<!-- <div class="md:flex md:items-center md:justify-between mb-8">
2022-05-08 12:02:37 +00:00
<div class="flex-1 min-w-0">
<h2 class="text-2xl font-bold leading-7 text-secondary sm:text-3xl sm:truncate">
{formats.find((f) => f.id === format).name}
</h2>
2022-05-08 12:02:37 +00:00
</div>
</div> -->
<div class="my-2 flex flex-row">
<sl-breadcrumb class="flex-grow">
<sl-breadcrumb-item href="#/formats" class="title">All Formats</sl-breadcrumb-item>
<sl-breadcrumb-item href={"#/format/" + format}>
{capitalize(format)}
</sl-breadcrumb-item>
</sl-breadcrumb>
2022-12-26 01:04:11 +00:00
<a href="https://github.com/learn-awesome/learndb" rel="noreferrer" target="_blank" class="underline text-primary hover:font-bold px-2">
Help us improve this taxonomy
</a>
2022-05-08 12:02:37 +00:00
</div>
2022-05-30 11:18:19 +00:00
<SearchForm {alltopics} on:queryChanged={handleQueryChanged} hideFormat={true}/>
{#if format == 'book'}
2022-05-30 13:21:32 +00:00
<div class="mt-12 grid gap-5 grid-cols-2 sm:grid-cols-3 md:grid-cols-2 lg:grid-cols-4 xl:grid-cols-5 justify-items-center">
2022-05-30 11:18:19 +00:00
{#each filteredItems as item}
<ItemCard {item} displayType={format}/>
{/each}
</div>
{:else}
2022-06-09 08:41:32 +00:00
<div class="mt-12 mx-auto gap-5 flex flex-wrap justify-center">
2022-05-30 11:18:19 +00:00
{#each filteredItems as item}
<ItemCard {item} displayType={format}/>
{/each}
</div>
{/if}