このコミットが含まれているのは:
@@ -1,6 +1,7 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
|
||||
import { fetchPostChanges, fetchPosts, toggleViewedFlg, updatePost } from '@/lib/posts'
|
||||
import { fetchPostChanges, fetchPosts, switchPostFilterLocale, toggleViewedFlg, updatePost }
|
||||
from '@/lib/posts'
|
||||
|
||||
import type { FetchPostsParams } from '@/types'
|
||||
|
||||
@@ -34,6 +35,21 @@ describe ('posts API functions', () => {
|
||||
vi.clearAllMocks ()
|
||||
})
|
||||
|
||||
it ('switches current tag names without adding identity state to the URL', async () => {
|
||||
api.apiGet.mockResolvedValueOnce ({ tags: 'シロシ not:nico:shared' })
|
||||
const path = await switchPostFilterLocale ({
|
||||
location: { pathname: '/ja/counts/posts',
|
||||
search: '?tags=source+not%3Anico%3Ashared&match=any', hash: '#table' },
|
||||
params: {}, locale: 'ja', targetLocale: 'ain-Kana' })
|
||||
expect (api.apiGet).toHaveBeenCalledWith ('/posts/tag_filters', {
|
||||
locale: 'ja', params: { tags: 'source not:nico:shared', target_locale: 'ain-Kana' } })
|
||||
const url = new URL (path, 'https://example.test')
|
||||
expect (url.pathname).toBe ('/ain-Kana/counts/posts')
|
||||
expect (Object.fromEntries (url.searchParams)).toEqual ({
|
||||
tags: 'シロシ not:nico:shared', match: 'any' })
|
||||
expect (url.hash).toBe ('#table')
|
||||
})
|
||||
|
||||
it ('maps post search parameters to backend snake_case names', async () => {
|
||||
api.apiGet.mockResolvedValueOnce ({ posts: [], count: 0 })
|
||||
|
||||
|
||||
+4
-18
@@ -1,5 +1,4 @@
|
||||
import { apiDelete, apiGet, apiPost, apiPut } from '@/lib/api'
|
||||
import { queryRecordParams, setQueryRecords } from '@/lib/queryState'
|
||||
import { switchLocalePath } from '@/lib/locales'
|
||||
|
||||
import type { LocaleCode } from '@/lib/locales'
|
||||
@@ -8,7 +7,7 @@ import type { FetchPostsParams, Post, PostVersion } from '@/types'
|
||||
|
||||
|
||||
export const fetchPosts = async (
|
||||
{ url, title, tags, tagReferences, match, createdFrom, createdTo, updatedFrom, updatedTo,
|
||||
{ url, title, tags, match, createdFrom, createdTo, updatedFrom, updatedTo,
|
||||
originalCreatedFrom, originalCreatedTo, page, limit, order }: FetchPostsParams,
|
||||
locale: LocaleCode = 'ja',
|
||||
): Promise<{
|
||||
@@ -18,7 +17,6 @@ export const fetchPosts = async (
|
||||
...(url && { url }),
|
||||
...(title && { title }),
|
||||
...(tags && { tags }),
|
||||
...(tagReferences && queryRecordParams (new URLSearchParams (tagReferences), 'tag_refs')),
|
||||
...(match && { match }),
|
||||
...(createdFrom && { created_from: createdFrom }),
|
||||
...(createdTo && { created_to: createdTo }),
|
||||
@@ -39,21 +37,9 @@ export const switchPostFilterLocale = async (
|
||||
if (tags == null || tags.trim () === '')
|
||||
return switchLocalePath (location, targetLocale)
|
||||
|
||||
const { references } = await apiGet<{ references: {
|
||||
name: string
|
||||
tagId?: number
|
||||
externalTagId?: number
|
||||
negative?: boolean
|
||||
missing?: boolean }[] }> ('/posts/tag_filters', {
|
||||
locale, params: { tags, target_locale: targetLocale,
|
||||
...queryRecordParams (query, 'tag_refs') } })
|
||||
query.set ('tags', references.map (reference => reference.name).join (' '))
|
||||
setQueryRecords (query, 'tag_refs', references.map (reference => ({
|
||||
name: reference.name,
|
||||
negative: reference.negative,
|
||||
...(reference.tagId != null && { tag_id: reference.tagId }),
|
||||
...(reference.externalTagId != null && { external_tag_id: reference.externalTagId }),
|
||||
...(reference.missing && { missing: true }) })))
|
||||
const result = await apiGet<{ tags: string }> ('/posts/tag_filters', {
|
||||
locale, params: { tags, target_locale: targetLocale } })
|
||||
query.set ('tags', result.tags)
|
||||
return switchLocalePath ({ ...location, search: `?${query}` }, targetLocale)
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ import { getHelpArticle,
|
||||
import { localeFromPath, localeLanguage, unlocalisedPath } from '@/lib/locales'
|
||||
import { fetchPost, fetchPosts, fetchPostChanges } from '@/lib/posts'
|
||||
import { helpKeys, postsKeys, tagsKeys, wikiKeys } from '@/lib/queryKeys'
|
||||
import { queryRecordParams } from '@/lib/queryState'
|
||||
import { isCountsPath } from '@/lib/routeLocales'
|
||||
import { fetchNicoTags, fetchTag, fetchTagChanges, fetchTags } from '@/lib/tags'
|
||||
import { fetchWikiAutolinkCandidates,
|
||||
@@ -178,8 +177,6 @@ const prefetchPostsIndex: Prefetcher = async (qc, url, locale) => {
|
||||
|
||||
const keys = {
|
||||
tags, match: m, page, limit, url: qURL, title,
|
||||
...(url.searchParams.has ('tag_refs') && {
|
||||
tagReferences: new URLSearchParams (queryRecordParams (url.searchParams, 'tag_refs')).toString () }),
|
||||
originalCreatedFrom, originalCreatedTo, createdFrom, createdTo,
|
||||
updatedFrom, updatedTo, order }
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@ const schemas: Record<string, string[]> = {
|
||||
conditions: ['field', 'operator', 'value', 'end', 'blank', 'input', 'values', 'grain', 'value_type'],
|
||||
condition_values: ['condition', 'value', 'value_type'],
|
||||
drill: ['field', 'grain', 'value', 'value_type'],
|
||||
tag_refs: ['name', 'tag_id', 'external_tag_id', 'negative', 'missing'],
|
||||
column_order: ['value', 'value_type'],
|
||||
measures: ['key', 'axis', 'value', 'value_type'] }
|
||||
|
||||
@@ -24,8 +23,8 @@ export const queryRecords = (params: URLSearchParams, key: string): QueryRecord[
|
||||
const index = Number (parts[0])
|
||||
const record = indexed.get (index) ?? { }
|
||||
const field = parts[1]
|
||||
record[field] = ['blank', 'negative', 'missing', 'values'].includes (field)
|
||||
? value === '1' : (['tag_id', 'external_tag_id', 'axis', 'condition'].includes (field)
|
||||
record[field] = ['blank', 'values'].includes (field)
|
||||
? value === '1' : (['axis', 'condition'].includes (field)
|
||||
? Number (value) : value)
|
||||
indexed.set (index, record)
|
||||
}
|
||||
@@ -59,7 +58,7 @@ export const setQueryRecords = (
|
||||
params.set (`${key}.${index}.value_type`, value == null ? 'null' : typeof value)
|
||||
if (value == null) continue
|
||||
params.set (name, typeof value === 'boolean'
|
||||
? (['blank', 'negative', 'missing', 'values'].includes (field)
|
||||
? (['blank', 'values'].includes (field)
|
||||
? (value ? '1' : '0') : String (value))
|
||||
: String (value))
|
||||
}
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする