このコミットが含まれているのは:
2026-10-31 13:50:10 +09:00
コミット dba409c3e8
33個のファイルの変更、1490行の追加、236行の削除
+18 -1
ファイルの表示
@@ -26,7 +26,6 @@ const renderPage = (extra = '') => renderWithProviders (<>
</>, { route: `/ja/counts/posts?mode=details&timezone=UTC${extra}` })
beforeEach (() => {
vi.spyOn (HTMLCanvasElement.prototype, 'getContext').mockReturnValue (null)
fetchCounts.mockReset ().mockResolvedValue (detailResult)
fetchCountsDefinition.mockReset ().mockResolvedValue (postDefinition)
})
@@ -104,4 +103,22 @@ describe ('Counts execution and URL state', () => {
expect (await screen.findByRole ('alert')).toHaveTextContent ('73')
expect (screen.getByRole ('alert')).toHaveTextContent ('列数が上限')
})
it ('can execute after an initial column-limit failure with no execution timestamp', async () => {
fetchCounts.mockRejectedValueOnce ({ isAxiosError: true,
response: { status: 422, data: { error: 'too_many_columns', max_columns: 73 } } })
renderPage ()
await screen.findByRole ('alert')
execute ()
await screen.findByText ('Recorded title')
await waitFor (() => expect (currentParams ().get ('execution_at')).toBe (executionAt))
expect (fetchCounts).toHaveBeenCalledTimes (2)
})
it ('keeps the page heading and common site title consistent', async () => {
renderPage ()
await screen.findByText ('Recorded title')
await waitFor (() => expect (document.title).toContain ('広場集計 | '))
expect (screen.getByRole ('heading', { name: '広場集計' })).toBeInTheDocument ()
})
})
+4 -10
ファイルの表示
@@ -17,7 +17,7 @@ import SidebarComponent from '@/components/layout/SidebarComponent'
import { Button } from '@/components/ui/button'
import { countsRequestParams, countsDefinitionParams, countsExportPayload, fieldsForCounts, fetchCounts,
isCountsState, normaliseCountsParams, selectedCountColumns } from '@/lib/counts'
import { countsExportLabels } from '@/lib/countsDisplay'
import { countsErrorMessage, countsExportLabels } from '@/lib/countsDisplay'
import { isApiError } from '@/lib/api'
import { CountsDefinitionContext, countsAxisFields, countsAxisLabel,
visibleCountsResources, countsFieldLabel,
@@ -231,13 +231,7 @@ const CountsResourceContent = (
|| pending || fetching || placeholder
|| (!params.has ('execution_at') && !errorFlg)))
const failure = runError ? runFailure : queryError
const errorBody = isApiError (failure) ? failure.response?.data as {
error?: string; max_axes?: number; maxAxes?: number } : undefined
const errorCode = errorBody?.error
const failureMessage = errorCode === 'too_many_axes'
? label ('axisLimit', { max: errorBody?.maxAxes ?? errorBody?.max_axes ?? '' })
: (errorCode === 'private_condition' ? label ('privateCondition')
: label ('common:fetchError'))
const failureMessage = countsErrorMessage (failure, locale)
const columnLimit = runColumnLimit ?? tooManyColumns (queryError)
@@ -355,7 +349,7 @@ const CountsResourceContent = (
resource={resource} applied={params}
conditionLabels={errorFlg ? undefined : data?.conditionLabels}
conditionLabelsParams={resultParams.toString ()}
pending={running || fetching || !params.has ('execution_at')}
pending={running || fetching}
open={open} setOpen={setOpen}
reorder={value => update ('order', value)}
displayJSON={enabled => update ('nested_json', enabled ? '1' : '0')}
@@ -381,7 +375,7 @@ const CountsResourceContent = (
<p>{label ('columnLimit.title')}</p>
<p>{label ('columnLimit.message', { max: columnLimit })}</p>
</div> : ((definitionError || errorFlg || runError)
&& <p role="alert">{failureMessage}</p>)}
&& <p role="alert" lang={failureMessage.language}>{failureMessage.text}</p>)}
<div className="relative flex min-h-0 flex-1 flex-col overflow-hidden"
aria-busy={waiting}>
<div inert={waiting} className="flex min-h-0 flex-1 flex-col">