Shioriko/web/app/src/routes/Post/Posts.svelte

219 lines
8.7 KiB
Svelte
Raw Normal View History

2021-05-10 15:47:35 +00:00
<script>
2022-04-16 09:32:04 +00:00
import { getPostSearchTag, getTag, getTagAutocomplete } from "../../api.js";
2021-05-11 10:06:25 +00:00
import { Link, navigate } from "svelte-routing";
2022-04-15 19:20:14 +00:00
import TagLinkNumbered from "../../TagLinkNumbered.svelte";
2022-04-16 09:32:04 +00:00
import PostGallery from "../../components/Post/PostGallery.svelte";
2021-05-10 20:25:33 +00:00
import queryString from "query-string";
import Tags from "svelte-tags-input";
2022-04-15 19:20:14 +00:00
import { paginate } from "../../simple-pagination.js";
2021-05-10 02:45:40 +00:00
export let location;
2021-05-09 15:07:23 +00:00
2021-05-10 20:25:33 +00:00
let searchTerms = [];
2021-05-09 15:07:23 +00:00
let page = 1;
2022-04-14 17:12:07 +00:00
let totalPages = 1;
let pagination = [];
2021-05-09 15:07:23 +00:00
let posts = [];
2022-04-14 20:38:53 +00:00
let postCount = 0;
2022-04-14 17:12:07 +00:00
let tags = [];
2022-04-16 09:32:04 +00:00
let tagInfo = null;
2022-04-14 17:12:07 +00:00
let categorizedTags = {};
2021-05-11 10:06:25 +00:00
2021-05-09 15:07:23 +00:00
const getData = async () => {
2021-05-10 20:25:33 +00:00
const data = await getPostSearchTag({ page, q: searchTerms.join("+") });
2021-05-11 10:06:25 +00:00
if (data.posts) {
2022-04-14 17:12:07 +00:00
posts = data.posts;
2022-04-16 10:41:50 +00:00
tags = data.tags
.filter(
(x) =>
!searchTerms.includes(x.tagName) &&
!searchTerms.includes(x.tagType + ":" + x.tagName)
)
.sort((a, b) => b.postCount - a.postCount);
2022-04-14 17:12:07 +00:00
totalPages = data.totalPage;
2022-04-14 20:38:53 +00:00
postCount = data.postCount;
2022-04-14 17:12:07 +00:00
pagination = paginate(page, totalPages);
2021-05-11 10:06:25 +00:00
} else {
2022-04-14 17:12:07 +00:00
posts = [];
tags = [];
totalPages = 0;
2022-04-14 20:38:53 +00:00
postCount = 0;
2022-04-14 17:12:07 +00:00
pagination = paginate(page, totalPages);
2021-05-10 02:45:40 +00:00
}
2022-04-16 09:32:04 +00:00
2022-04-16 12:23:19 +00:00
if (searchTerms.filter(x => !x.startsWith("-")).length == 1) {
2022-04-16 09:32:04 +00:00
tagInfo = await getTag({ tag: searchTerms[0] });
}
2021-05-10 15:47:35 +00:00
};
2021-05-10 20:25:33 +00:00
let queryParams;
const onTagChange = (value) => {
searchTerms = value.detail.tags;
};
2022-04-16 12:23:19 +00:00
const onAutocomplete = async (tag) => {
const list = await getTagAutocomplete({ tag });
2021-09-10 18:56:42 +00:00
return list;
};
2021-05-11 11:06:48 +00:00
$: {
2021-05-10 15:47:35 +00:00
queryParams = queryString.parse(location.search);
2021-05-10 20:25:33 +00:00
if (queryParams.tags) {
searchTerms = queryParams.tags.split(" ");
} else {
searchTerms = [];
2022-04-16 09:32:04 +00:00
tagInfo = null;
2021-05-10 20:25:33 +00:00
}
2021-05-11 11:06:48 +00:00
posts = [];
2022-04-14 17:12:07 +00:00
page = 1;
2021-05-10 02:45:40 +00:00
getData();
2021-05-11 11:06:48 +00:00
}
2021-05-10 20:25:33 +00:00
const onSearch = (i) => {
if (searchTerms.length > 0) {
navigate(`/posts?tags=${searchTerms.join("+")}`);
} else {
navigate(`/posts`);
}
};
2021-05-09 15:07:23 +00:00
2022-04-14 17:12:07 +00:00
const changePage = (i) => {
2022-04-14 20:38:53 +00:00
if (i >= 1 && i <= totalPages) {
page = i;
getData();
}
};
2022-04-14 17:12:07 +00:00
</script>
2021-05-09 15:07:23 +00:00
2021-05-10 20:25:33 +00:00
<section class="section">
<div class="container">
<div class="block">
2022-04-14 20:38:53 +00:00
<div class="columns is-multiline">
<div class="column is-full">
<div class="block">
<form on:submit|preventDefault={onSearch}>
<div class="field has-addons">
<div class="control is-expanded">
<div class="control" id="tags">
<Tags
tags={searchTerms}
addKeys={[9, 32]}
on:tags={onTagChange}
autoComplete={onAutocomplete}
2022-04-16 12:23:19 +00:00
autoCompleteFilter={false}
2022-04-14 20:38:53 +00:00
/>
</div>
</div>
<div class="control">
<button
type="submit"
class="button is-primary"
>
Search
</button>
</div>
</div>
</form>
2021-05-10 20:25:33 +00:00
</div>
</div>
2022-04-14 17:12:07 +00:00
<div class="column is-one-third">
2022-04-16 09:32:04 +00:00
{#if tagInfo}
<div class="panel is-info">
<p class="panel-heading">
2022-04-16 10:41:50 +00:00
Tag:
2022-04-16 09:32:04 +00:00
{tagInfo.tagName.split("_").join(" ")}
</p>
{#if tagInfo.tagNote}
<div class="panel-block column ">
<div class="content pre-line">
{tagInfo.tagNote}
</div>
</div>
{/if}
<div class="panel-block column">
<Link
class="button is-primary"
to="/tags/{tagInfo.tagName}">View Tag</Link
>
</div>
</div>
{/if}
2022-04-14 17:12:07 +00:00
<div class="panel is-primary">
<div class="panel-heading">Tags</div>
<div class="panel-block column">
<div class="menu">
<ul class="menu-list">
{#each tags as tag (tag)}
2022-04-14 17:12:07 +00:00
<li>
<TagLinkNumbered
class=""
2022-04-14 20:38:53 +00:00
tag={tag.tagType +
":" +
tag.tagName}
num={tag.postCount}
2022-04-14 17:12:07 +00:00
/>
</li>
{/each}
</ul>
</div>
</div>
</div>
</div>
2022-04-14 20:38:53 +00:00
<div class="column is-two-thirds">
2022-04-14 17:12:07 +00:00
<div class="columns is-multiline">
2022-04-14 20:38:53 +00:00
<div class="column is-full">
2022-04-16 09:32:04 +00:00
<PostGallery {posts} />
2022-04-14 20:38:53 +00:00
</div>
2022-04-14 17:12:07 +00:00
<div class="column is-full">
<nav
class="pagination is-centered"
aria-label="pagination"
>
<a
href={null}
on:click={changePage(page - 1)}
2022-04-14 20:38:53 +00:00
class="pagination-previous"
class:is-disabled={page == 1}>Previous</a
2022-04-14 17:12:07 +00:00
>
<a
href={null}
on:click={changePage(page + 1)}
2022-04-14 20:38:53 +00:00
class="pagination-next"
class:is-disabled={page == totalPages}
>Next</a
2022-04-14 17:12:07 +00:00
>
<ul class="pagination-list">
{#each pagination as pageEntry}
{#if pageEntry == "..."}
<li>
<span
class="pagination-ellipsis"
>&hellip;</span
>
</li>
2021-05-11 11:06:48 +00:00
{:else}
2022-04-14 17:12:07 +00:00
<li>
<a
href={null}
on:click={() =>
2022-04-14 20:38:53 +00:00
changePage(pageEntry)}
2022-04-14 17:12:07 +00:00
class="pagination-link"
class:is-current={page ==
pageEntry}
aria-label="Goto page {pageEntry}"
>{pageEntry}</a
>
</li>
2021-05-11 11:06:48 +00:00
{/if}
2022-04-14 17:12:07 +00:00
{/each}
</ul>
</nav>
</div>
2021-05-11 10:06:25 +00:00
</div>
2022-04-14 17:12:07 +00:00
</div>
2021-05-11 10:06:25 +00:00
</div>
2021-05-10 20:25:33 +00:00
</div>
</div>
</section>