|
|
@@ -1,5 +1,5 @@
|
|
|
|
import { useQuery } from '@tanstack/react-query'
|
|
|
|
import { useQuery } from '@tanstack/react-query'
|
|
|
|
import { useState } from 'react'
|
|
|
|
import { useEffect, useMemo, useState } from 'react'
|
|
|
|
import { Helmet } from 'react-helmet-async'
|
|
|
|
import { Helmet } from 'react-helmet-async'
|
|
|
|
import { useLocation, useNavigate } from 'react-router-dom'
|
|
|
|
import { useLocation, useNavigate } from 'react-router-dom'
|
|
|
|
|
|
|
|
|
|
|
@@ -17,49 +17,89 @@ import { postsKeys } from '@/lib/queryKeys'
|
|
|
|
import type { FC, FormEvent } from 'react'
|
|
|
|
import type { FC, FormEvent } from 'react'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const setIf = (qs: URLSearchParams, k: string, v: string | null) => {
|
|
|
|
|
|
|
|
const t = v?.trim ()
|
|
|
|
|
|
|
|
if (t)
|
|
|
|
|
|
|
|
qs.set (k, t)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export default (() => {
|
|
|
|
export default (() => {
|
|
|
|
|
|
|
|
const location = useLocation ()
|
|
|
|
|
|
|
|
|
|
|
|
const navigate = useNavigate ()
|
|
|
|
const navigate = useNavigate ()
|
|
|
|
|
|
|
|
|
|
|
|
const location = useLocation ()
|
|
|
|
const query = useMemo (() => new URLSearchParams (location.search),
|
|
|
|
const query = new URLSearchParams (location.search)
|
|
|
|
[location.search])
|
|
|
|
|
|
|
|
|
|
|
|
const page = Number (query.get ('page') ?? 1)
|
|
|
|
const page = Number (query.get ('page') ?? 1)
|
|
|
|
const limit = Number (query.get ('limit') ?? 20)
|
|
|
|
const limit = Number (query.get ('limit') ?? 20)
|
|
|
|
|
|
|
|
|
|
|
|
const [createdFrom, setCreatedFrom] =
|
|
|
|
const qURL = query.get ('url')
|
|
|
|
useState<string | null> (query.get ('created_from'))
|
|
|
|
const qTitle = query.get ('title')
|
|
|
|
const [createdTo, setCreatedTo] =
|
|
|
|
const qTags = query.get ('tags') ?? ''
|
|
|
|
useState<string | null> (query.get ('created_to'))
|
|
|
|
const qMatch: 'all' | 'any' = query.get ('match') === 'any' ? 'any' : 'all'
|
|
|
|
const [matchType, setMatchType] =
|
|
|
|
const qOriginalCreatedFrom = query.get ('original_created_from')
|
|
|
|
useState<'all' | 'any'> ((query.get ('match') as 'all' | 'any' | null) ?? 'all')
|
|
|
|
const qOriginalCreatedTo = query.get ('original_created_to')
|
|
|
|
const [originalCreatedFrom, setOriginalCreatedFrom] =
|
|
|
|
const qCreatedFrom = query.get ('created_from')
|
|
|
|
useState<string | null> (query.get ('original_created_from'))
|
|
|
|
const qCreatedTo = query.get ('created_to')
|
|
|
|
const [originalCreatedTo, setOriginalCreatedTo] =
|
|
|
|
const qUpdatedFrom = query.get ('updated_from')
|
|
|
|
useState<string | null> (query.get ('original_created_to'))
|
|
|
|
const qUpdatedTo = query.get ('updated_to')
|
|
|
|
const [tagsStr, setTagsStr] = useState (query.get ('tags') ?? '')
|
|
|
|
|
|
|
|
const [title, setTitle] = useState (query.get ('title') ?? '')
|
|
|
|
const [createdFrom, setCreatedFrom] = useState (qCreatedFrom)
|
|
|
|
const [updatedFrom, setUpdatedFrom] =
|
|
|
|
const [createdTo, setCreatedTo] = useState (qCreatedTo)
|
|
|
|
useState<string | null> (query.get ('updated_from'))
|
|
|
|
const [matchType, setMatchType] = useState (qMatch ?? 'all')
|
|
|
|
const [updatedTo, setUpdatedTo] =
|
|
|
|
const [originalCreatedFrom, setOriginalCreatedFrom] = useState (qOriginalCreatedFrom)
|
|
|
|
useState<string | null> (query.get ('updated_to'))
|
|
|
|
const [originalCreatedTo, setOriginalCreatedTo] = useState (qOriginalCreatedTo)
|
|
|
|
const [url, setURL] = useState (query.get ('url') ?? '')
|
|
|
|
const [tagsStr, setTagsStr] = useState (qTags)
|
|
|
|
|
|
|
|
const [title, setTitle] = useState (qTitle ?? '')
|
|
|
|
|
|
|
|
const [updatedFrom, setUpdatedFrom] = useState (qUpdatedFrom)
|
|
|
|
|
|
|
|
const [updatedTo, setUpdatedTo] = useState (qUpdatedTo)
|
|
|
|
|
|
|
|
const [url, setURL] = useState (qURL ?? '')
|
|
|
|
|
|
|
|
|
|
|
|
const keys = {
|
|
|
|
const keys = {
|
|
|
|
tags: tagsStr, match: matchType, page, limit,
|
|
|
|
tags: qTags, match: qMatch, page, limit,
|
|
|
|
...(url && { url }),
|
|
|
|
...(qURL && { url: qURL }),
|
|
|
|
...(title && { title }),
|
|
|
|
...(qTitle && { title: qTitle }),
|
|
|
|
...(originalCreatedFrom && { original_created_from: originalCreatedFrom }),
|
|
|
|
...(qOriginalCreatedFrom && { original_created_from: qOriginalCreatedFrom }),
|
|
|
|
...(originalCreatedTo && { original_created_to: originalCreatedTo }),
|
|
|
|
...(qOriginalCreatedTo && { original_created_to: qOriginalCreatedTo }),
|
|
|
|
...(createdFrom && { created_from: createdFrom }),
|
|
|
|
...(qCreatedFrom && { created_from: qCreatedFrom }),
|
|
|
|
...(createdTo && { created_to: createdTo }),
|
|
|
|
...(qCreatedTo && { created_to: qCreatedTo }),
|
|
|
|
...(updatedFrom && { updated_from: updatedFrom }),
|
|
|
|
...(qUpdatedFrom && { updated_from: qUpdatedFrom }),
|
|
|
|
...(updatedTo && { updated_to: updatedTo }) }
|
|
|
|
...(qUpdatedTo && { updated_to: qUpdatedTo }) }
|
|
|
|
const { data, /* isLoading: loading */ } = useQuery ({
|
|
|
|
const { data, isLoading: loading } = useQuery ({
|
|
|
|
queryKey: postsKeys.index (keys), queryFn: () => fetchPosts (keys) })
|
|
|
|
queryKey: postsKeys.index (keys),
|
|
|
|
|
|
|
|
queryFn: () => fetchPosts (keys) })
|
|
|
|
const results = data?.posts ?? []
|
|
|
|
const results = data?.posts ?? []
|
|
|
|
const totalPages = data ? Math.ceil (data.count / limit) : 0
|
|
|
|
const totalPages = data ? Math.ceil (data.count / limit) : 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
useEffect (() => {
|
|
|
|
|
|
|
|
setURL (qURL ?? '')
|
|
|
|
|
|
|
|
setTitle (qTitle ?? '')
|
|
|
|
|
|
|
|
setTagsStr (qTags ?? '')
|
|
|
|
|
|
|
|
setMatchType (qMatch ?? 'all')
|
|
|
|
|
|
|
|
setOriginalCreatedFrom (qOriginalCreatedFrom)
|
|
|
|
|
|
|
|
setOriginalCreatedTo (qOriginalCreatedTo)
|
|
|
|
|
|
|
|
setCreatedFrom (qCreatedFrom)
|
|
|
|
|
|
|
|
setCreatedTo (qCreatedTo)
|
|
|
|
|
|
|
|
setUpdatedFrom (qUpdatedFrom)
|
|
|
|
|
|
|
|
setUpdatedTo (qUpdatedTo)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
document.querySelector ('table')?.scrollIntoView ({ behavior: 'smooth' })
|
|
|
|
|
|
|
|
}, [location.search])
|
|
|
|
|
|
|
|
|
|
|
|
const search = async () => {
|
|
|
|
const search = async () => {
|
|
|
|
const qs = new URLSearchParams (location.search)
|
|
|
|
const qs = new URLSearchParams ()
|
|
|
|
|
|
|
|
setIf (qs, 'tags', tagsStr)
|
|
|
|
|
|
|
|
setIf (qs, 'url', url)
|
|
|
|
|
|
|
|
setIf (qs, 'title', title)
|
|
|
|
|
|
|
|
setIf (qs, 'original_created_from', originalCreatedFrom)
|
|
|
|
|
|
|
|
setIf (qs, 'original_created_to', originalCreatedTo)
|
|
|
|
|
|
|
|
setIf (qs, 'created_from', createdFrom)
|
|
|
|
|
|
|
|
setIf (qs, 'created_to', createdTo)
|
|
|
|
|
|
|
|
setIf (qs, 'updated_from', updatedFrom)
|
|
|
|
|
|
|
|
setIf (qs, 'updated_to', updatedTo)
|
|
|
|
|
|
|
|
qs.set ('match', matchType)
|
|
|
|
qs.set ('page', String ('1'))
|
|
|
|
qs.set ('page', String ('1'))
|
|
|
|
navigate (`${ location.pathname }?${ qs.toString () }`)
|
|
|
|
navigate (`${ location.pathname }?${ qs.toString () }`)
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -175,7 +215,7 @@ export default (() => {
|
|
|
|
</form>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{results.length > 0 && (
|
|
|
|
{loading ? 'Loading...' : (results.length > 0 ? (
|
|
|
|
<div className="mt-4">
|
|
|
|
<div className="mt-4">
|
|
|
|
<div className="overflow-x-auto">
|
|
|
|
<div className="overflow-x-auto">
|
|
|
|
<table className="w-full min-w-[1200px] table-fixed border-collapse">
|
|
|
|
<table className="w-full min-w-[1200px] table-fixed border-collapse">
|
|
|
@@ -241,6 +281,6 @@ export default (() => {
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<Pagination page={page} totalPages={totalPages}/>
|
|
|
|
<Pagination page={page} totalPages={totalPages}/>
|
|
|
|
</div>)}
|
|
|
|
</div>) : '結果ないよ(笑)')}
|
|
|
|
</MainArea>)
|
|
|
|
</MainArea>)
|
|
|
|
}) satisfies FC
|
|
|
|
}) satisfies FC
|
|
|
|