このコミットが含まれているのは:
@@ -38,6 +38,7 @@ const DraggableDroppableTagRow: FC<Props> = ({
|
||||
{ normal: { duration: .2, ease: 'easeOut' as const } },
|
||||
)
|
||||
const dndId = `tag-node:${ pathKey }`
|
||||
const dndDisabled = tag.category === 'nico'
|
||||
|
||||
const downPosRef = useRef<{ x: number; y: number } | null> (null)
|
||||
const armedRef = useRef (false)
|
||||
@@ -62,7 +63,8 @@ const DraggableDroppableTagRow: FC<Props> = ({
|
||||
const { attributes,
|
||||
listeners,
|
||||
setNodeRef: setDragRef,
|
||||
transform } = useDraggable ({ id: dndId,
|
||||
transform } = useDraggable ({ id: dndId,
|
||||
disabled: dndDisabled,
|
||||
data: { kind: 'tag',
|
||||
dndId,
|
||||
tagId: tag.id,
|
||||
@@ -70,8 +72,9 @@ const DraggableDroppableTagRow: FC<Props> = ({
|
||||
nestLevel } })
|
||||
|
||||
const { setNodeRef: setDropRef, isOver: over } = useDroppable ({
|
||||
id: dndId,
|
||||
data: { kind: 'tag', tagId: tag.id } })
|
||||
id: dndId,
|
||||
disabled: dndDisabled,
|
||||
data: { kind: 'tag', tagId: tag.id } })
|
||||
|
||||
const activeDragging = activeDndId === dndId
|
||||
const style: CSSProperties = { transform: CSS.Translate.toString (transform),
|
||||
|
||||
@@ -150,16 +150,17 @@ const buildFlatTagByCategory = (
|
||||
byCategory: TagByCategory,
|
||||
): TagByCategory => {
|
||||
const tagsTmp = { } as TagByCategory
|
||||
const seen = new Set<number> ()
|
||||
const seen = new Set<string> ()
|
||||
|
||||
for (const category of CATEGORIES)
|
||||
tagsTmp[category] = []
|
||||
|
||||
const visit = (tag: TagWithSections) => {
|
||||
if (seen.has (tag.id))
|
||||
const key = `${ tag.category }:${ tag.id }`
|
||||
if (seen.has (key))
|
||||
return
|
||||
|
||||
seen.add (tag.id)
|
||||
seen.add (key)
|
||||
tagsTmp[tag.category].push ({ ...tag, children: [] })
|
||||
|
||||
for (const child of tag.children ?? [])
|
||||
|
||||
@@ -86,7 +86,7 @@ const TagLink: FC<Props> = ({ tag,
|
||||
className={cn (
|
||||
'inline-flex min-w-0 max-w-full flex-nowrap items-stretch align-baseline',
|
||||
'gap-x-1 md:items-baseline')}>
|
||||
{(linkFlg && withWiki && isFullTag (tag)) && (
|
||||
{(linkFlg && withWiki && isFullTag (tag) && tag.category !== 'nico') && (
|
||||
<span className={markerWrapClass}>
|
||||
{(tag.materialId != null || tag.hasWiki || tag.hasDeerjikists)
|
||||
? (
|
||||
|
||||
@@ -28,15 +28,18 @@ export const fetchPost = async (id: string): Promise<Post> => await apiGet (`/po
|
||||
|
||||
|
||||
export const fetchPostChanges = async (
|
||||
{ post, tag, page, limit }: {
|
||||
post?: string
|
||||
tag?: string
|
||||
page: number
|
||||
limit: number }): Promise<{
|
||||
{ post, tag, externalTag, page, limit }: {
|
||||
post?: string
|
||||
tag?: string
|
||||
externalTag?: string
|
||||
page: number
|
||||
limit: number }): Promise<{
|
||||
versions: PostVersion[]
|
||||
count: number }> =>
|
||||
await apiGet ('/posts/versions', { params: { ...(post && { post }),
|
||||
...(tag && { tag }),
|
||||
...(externalTag && {
|
||||
external_tag: externalTag }),
|
||||
page, limit } })
|
||||
|
||||
|
||||
|
||||
@@ -128,6 +128,7 @@ const prefetchPostShow: Prefetcher = async (qc, url) => {
|
||||
const prefetchPostChanges: Prefetcher = async (qc, url) => {
|
||||
const id = url.searchParams.get ('id')
|
||||
const tag = url.searchParams.get ('tag')
|
||||
const externalTag = url.searchParams.get ('external_tag')
|
||||
const page = Number (url.searchParams.get ('page') || 1)
|
||||
const limit = Number (url.searchParams.get ('limit') || 20)
|
||||
|
||||
@@ -141,9 +142,11 @@ const prefetchPostChanges: Prefetcher = async (qc, url) => {
|
||||
await qc.prefetchQuery ({
|
||||
queryKey: postsKeys.changes ({ ...(id && { id }),
|
||||
...(tag && { tag }),
|
||||
...(externalTag && { externalTag }),
|
||||
page, limit }),
|
||||
queryFn: () => fetchPostChanges ({ ...(id && { id }),
|
||||
...(tag && { tag }),
|
||||
...(externalTag && { externalTag }),
|
||||
page, limit }) })
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,11 @@ export const postsKeys = {
|
||||
index: (p: FetchPostsParams) => ['posts', 'index', p] as const,
|
||||
show: (id: string) => ['posts', id] as const,
|
||||
related: (id: string) => ['related', id] as const,
|
||||
changes: (p: { post?: string; tag?: string; page: number; limit: number }) =>
|
||||
changes: (p: { post?: string
|
||||
tag?: string
|
||||
externalTag?: string
|
||||
page: number
|
||||
limit: number }) =>
|
||||
['posts', 'changes', p] as const }
|
||||
|
||||
export const gekanatorKeys = {
|
||||
|
||||
@@ -51,6 +51,7 @@ const PostHistoryPage: FC = () => {
|
||||
const query = new URLSearchParams (location.search)
|
||||
const id = query.get ('id')
|
||||
const tagId = query.get ('tag')
|
||||
const externalTagId = query.get ('external_tag')
|
||||
const page = Number (query.get ('page') ?? 1)
|
||||
const limit = Number (query.get ('limit') ?? 20)
|
||||
|
||||
@@ -66,9 +67,12 @@ const PostHistoryPage: FC = () => {
|
||||
const { data, isLoading: loading } = useQuery ({
|
||||
queryKey: postsKeys.changes ({ ...(id && { post: id }),
|
||||
...(tagId && { tag: tagId }),
|
||||
...(externalTagId && { externalTag: externalTagId }),
|
||||
page, limit }),
|
||||
queryFn: () => fetchPostChanges ({ ...(id && { post: id }),
|
||||
...(tagId && { tag: tagId }),
|
||||
...(externalTagId && {
|
||||
externalTag: externalTagId }),
|
||||
page, limit }) })
|
||||
const changes = data?.versions ?? []
|
||||
const totalPages = data ? Math.ceil (data.count / limit) : 0
|
||||
|
||||
@@ -406,11 +406,15 @@ const TagListPage: FC = () => {
|
||||
|
||||
<tbody>
|
||||
{results.map (row => (
|
||||
<tr key={row.id} className="even:bg-gray-100 dark:even:bg-gray-700">
|
||||
<tr
|
||||
key={`${ row.category }:${ row.id }`}
|
||||
className="even:bg-gray-100 dark:even:bg-gray-700">
|
||||
<td className="p-2">
|
||||
<TagLink
|
||||
tag={row}
|
||||
to={`/tags/${ encodeURIComponent (row.id) }`}
|
||||
to={row.category === 'nico'
|
||||
? `/tags/nico?name=${ encodeURIComponent (row.name) }`
|
||||
: `/tags/${ encodeURIComponent (row.id) }`}
|
||||
withCount={false}/>
|
||||
</td>
|
||||
<td className="p-2 text-right">{row.postCount}</td>
|
||||
@@ -429,7 +433,10 @@ const TagListPage: FC = () => {
|
||||
<td className="p-2">{dateString (row.createdAt)}</td>
|
||||
<td className="p-2">{dateString (row.updatedAt)}</td>
|
||||
<td className="p-2">
|
||||
<PrefetchLink to={`/posts/changes?tag=${ row.id }`}>
|
||||
<PrefetchLink
|
||||
to={row.category === 'nico'
|
||||
? `/posts/changes?external_tag=${ row.id }`
|
||||
: `/posts/changes?tag=${ row.id }`}>
|
||||
耕作履歴
|
||||
</PrefetchLink>
|
||||
</td>
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする