feat: 別名タグをサジェストに展開(#28) (#244)

#28 件数 0 件除外をついでに対応(フロントのみ;バックエンドは後で対応)

#28

Co-authored-by: miteruzo <miteruzo@naver.com>
Reviewed-on: #244
This commit was merged in pull request #244.
This commit is contained in:
2026-01-29 07:32:13 +09:00
parent 200d457d22
commit 01646ebcb7
5 changed files with 21 additions and 11 deletions
+2 -1
View File
@@ -60,7 +60,8 @@ export default (({ tags, setTags }: Props) => {
const { start, end, token } = getTokenAt (v, pos) const { start, end, token } = getTokenAt (v, pos)
setBounds ({ start, end }) setBounds ({ start, end })
const res = await axios.get (`${ API_BASE_URL }/tags/autocomplete`, { params: { q: token } }) const res = await axios.get (`${ API_BASE_URL }/tags/autocomplete`, { params: { q: token } })
setSuggestions (toCamel (res.data as any, { deep: true }) as Tag[]) const data = toCamel (res.data as any, { deep: true }) as Tag[]
setSuggestions (data.filter (t => t.postCount > 0))
setSuggestionsVsbl (suggestions.length > 0) setSuggestionsVsbl (suggestions.length > 0)
} }
+7
View File
@@ -91,6 +91,13 @@ export default (({ tag,
style={{ paddingLeft: `${ (nestLevel - 1) }rem` }}> style={{ paddingLeft: `${ (nestLevel - 1) }rem` }}>
</span>)} </span>)}
{tag.matchedAlias != null && (
<>
<span className={spanClass} {...props}>
{tag.matchedAlias}
</span>
<> </>
</>)}
{linkFlg {linkFlg
? ( ? (
<Link to={`/posts?${ (new URLSearchParams ({ tags: tag.name })).toString () }`} <Link to={`/posts?${ (new URLSearchParams ({ tags: tag.name })).toString () }`}
+3 -2
View File
@@ -1,4 +1,5 @@
import axios from 'axios' import axios from 'axios'
import toCamel from 'camelcase-keys'
import React, { useEffect, useState } from 'react' import React, { useEffect, useState } from 'react'
import { useNavigate, useLocation } from 'react-router-dom' import { useNavigate, useLocation } from 'react-router-dom'
@@ -31,8 +32,8 @@ export default (() => {
} }
const res = await axios.get (`${ API_BASE_URL }/tags/autocomplete`, { params: { q } }) const res = await axios.get (`${ API_BASE_URL }/tags/autocomplete`, { params: { q } })
const data = res.data as Tag[] const data = toCamel (res.data, { deep: true }) as Tag[]
setSuggestions (data) setSuggestions (data.filter (t => t.postCount > 0))
if (suggestions.length > 0) if (suggestions.length > 0)
setSuggestionsVsbl (true) setSuggestionsVsbl (true)
} }
+2 -2
View File
@@ -1,3 +1,4 @@
import TagLink from '@/components/TagLink'
import { cn } from '@/lib/utils' import { cn } from '@/lib/utils'
import type { FC } from 'react' import type { FC } from 'react'
@@ -22,8 +23,7 @@ export default (({ suggestions, activeIndex, onSelect }: Props) => {
className={cn ('px-3 py-2 cursor-pointer hover:bg-gray-300 dark:hover:bg-gray-700', className={cn ('px-3 py-2 cursor-pointer hover:bg-gray-300 dark:hover:bg-gray-700',
i === activeIndex && 'bg-gray-300 dark:bg-gray-700')} i === activeIndex && 'bg-gray-300 dark:bg-gray-700')}
onMouseDown={() => onSelect (tag)}> onMouseDown={() => onSelect (tag)}>
{tag.name} <TagLink tag={tag} linkFlg={false} withWiki={false}/>
{<span className="ml-2 text-sm text-gray-400">{tag.postCount}</span>}
</li>))} </li>))}
</ul>) </ul>)
}) satisfies FC<Props> }) satisfies FC<Props>
+7 -6
View File
@@ -44,12 +44,13 @@ export type SubMenuItem =
visible?: boolean } visible?: boolean }
export type Tag = { export type Tag = {
id: number id: number
name: string name: string
category: Category category: Category
postCount: number postCount: number
hasWiki: boolean hasWiki: boolean
children?: Tag[] } children?: Tag[]
matchedAlias?: string | null }
export type User = { export type User = {
id: number id: number