このコミットが含まれているのは:
2026-07-13 01:31:45 +09:00
コミット 97b132e5ab
4個のファイルの変更48行の追加30行の削除
+9 -3
ファイルの表示
@@ -4,6 +4,7 @@ import FieldWarning from '@/components/common/FieldWarning'
import FormField from '@/components/common/FormField' import FormField from '@/components/common/FormField'
import PostImportStatusBadge from '@/components/posts/import/PostImportStatusBadge' import PostImportStatusBadge from '@/components/posts/import/PostImportStatusBadge'
import ThumbnailPreview from '@/components/posts/import/ThumbnailPreview' import ThumbnailPreview from '@/components/posts/import/ThumbnailPreview'
import { effectivePostImportStatus } from '@/components/posts/import/postImportRowStatus'
import { Button } from '@/components/ui/button' import { Button } from '@/components/ui/button'
import { Dialog, import { Dialog,
DialogContent, DialogContent,
@@ -42,6 +43,12 @@ const originOf = (
): PostImportOrigin => ): PostImportOrigin =>
row.provenance[field] ?? 'automatic' row.provenance[field] ?? 'automatic'
const originalCreatedOrigin = (row: PostImportRow): PostImportOrigin =>
originOf (row, 'originalCreatedFrom') === 'manual'
|| originOf (row, 'originalCreatedBefore') === 'manual'
? 'manual'
: 'automatic'
const buildDraft = (row: PostImportRow): Draft => ({ const buildDraft = (row: PostImportRow): Draft => ({
url: row.url, url: row.url,
title: String (row.attributes.title ?? ''), title: String (row.attributes.title ?? ''),
@@ -102,8 +109,7 @@ const PostImportRowDialog: FC<Props> = (
url={draft.thumbnailBase} url={draft.thumbnailBase}
className="h-28 w-28"/> className="h-28 w-28"/>
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">
<PostImportStatusBadge value={row.status}/> <PostImportStatusBadge value={effectivePostImportStatus (row)}/>
<PostImportStatusBadge value={row.importStatus ?? 'pending'}/>
</div> </div>
</div> </div>
@@ -133,7 +139,7 @@ const PostImportRowDialog: FC<Props> = (
)} )}
onChange={value => update ('thumbnailBase', value)}/> onChange={value => update ('thumbnailBase', value)}/>
<PostOriginalCreatedTimeField <PostOriginalCreatedTimeField
labelAddon={<PostImportStatusBadge value={originOf (row, 'originalCreatedFrom')}/>} labelAddon={<PostImportStatusBadge value={originalCreatedOrigin (row)}/>}
originalCreatedFrom={draft.originalCreatedFrom || null} originalCreatedFrom={draft.originalCreatedFrom || null}
setOriginalCreatedFrom={value => update ('originalCreatedFrom', value ?? '')} setOriginalCreatedFrom={value => update ('originalCreatedFrom', value ?? '')}
originalCreatedBefore={draft.originalCreatedBefore || null} originalCreatedBefore={draft.originalCreatedBefore || null}
+5 -12
ファイルの表示
@@ -4,6 +4,7 @@ import { cn } from '@/lib/utils'
import PrefetchLink from '@/components/PrefetchLink' import PrefetchLink from '@/components/PrefetchLink'
import PostImportStatusBadge from '@/components/posts/import/PostImportStatusBadge' import PostImportStatusBadge from '@/components/posts/import/PostImportStatusBadge'
import ThumbnailPreview from '@/components/posts/import/ThumbnailPreview' import ThumbnailPreview from '@/components/posts/import/ThumbnailPreview'
import { effectivePostImportStatus } from '@/components/posts/import/postImportRowStatus'
import type { FC } from 'react' import type { FC } from 'react'
@@ -14,7 +15,7 @@ type Props = {
onEdit: () => void } onEdit: () => void }
const toneClass = (row: PostImportRow): string[] => { const toneClass = (row: PostImportRow): string[] => {
const value = row.importStatus ?? row.status const value = effectivePostImportStatus (row)
switch (value) switch (value)
{ {
case 'created': case 'created':
@@ -63,7 +64,7 @@ const summaryDate = (row: PostImportRow): string =>
const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => { const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
const error = summaryError (row) const error = summaryError (row)
const warning = error == null ? summaryWarning (row) : null const warning = error == null ? summaryWarning (row) : null
const importStatus = row.importStatus ?? 'pending' const effectiveStatus = effectivePostImportStatus (row)
return ( return (
<> <>
@@ -77,7 +78,6 @@ const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
)}> )}>
<div className="space-y-1"> <div className="space-y-1">
<div className="text-sm font-medium">#{row.sourceRow}</div> <div className="text-sm font-medium">#{row.sourceRow}</div>
<PostImportStatusBadge value={row.status}/>
</div> </div>
<ThumbnailPreview <ThumbnailPreview
url={String (row.attributes.thumbnailBase ?? '')} url={String (row.attributes.thumbnailBase ?? '')}
@@ -113,12 +113,7 @@ const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
</div>)} </div>)}
</div> </div>
<div className="space-y-1"> <div className="space-y-1">
<PostImportStatusBadge value={importStatus}/> <PostImportStatusBadge value={effectiveStatus}/>
</div>
<div className="space-y-1">
{error
? <PostImportStatusBadge value="error"/>
: (warning ? <PostImportStatusBadge value="warning"/> : <PostImportStatusBadge value="ready"/>)}
</div> </div>
<div className="flex justify-end"> <div className="flex justify-end">
<Button <Button
@@ -148,9 +143,7 @@ const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
{row.url} {row.url}
</div> </div>
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">
<PostImportStatusBadge value={row.status}/> <PostImportStatusBadge value={effectiveStatus}/>
<PostImportStatusBadge value={importStatus}/>
{warning && <PostImportStatusBadge value="warning"/>}
</div> </div>
{row.createdPostId && ( {row.createdPostId && (
<PrefetchLink <PrefetchLink
+24
ファイルの表示
@@ -0,0 +1,24 @@
import type { PostImportRow } from '@/lib/postImportSession'
export type PostImportEffectiveStatus =
'created'
| 'skipped'
| 'failed'
| 'error'
| 'warning'
| 'ready'
export const effectivePostImportStatus = (
row: PostImportRow,
): PostImportEffectiveStatus => {
switch (row.importStatus)
{
case 'created':
case 'skipped':
case 'failed':
return row.importStatus
default:
return row.status
}
}
+9 -14
ファイルの表示
@@ -151,26 +151,21 @@ const PostImportSourcePage: FC<Props> = ({ user }) => {
}}/>)} }}/>)}
</FormField> </FormField>
<FieldError messages={messages}/> <FieldError messages={messages}/>
<div className="space-y-2"> <ul className="space-y-2 text-sm text-red-700 dark:text-red-300">
{sourceIssues.map (issue => ( {sourceIssues.map (issue => (
<div <li key={`${ issue.sourceRow }-${ issue.message }-${ issue.url }`}>
key={`${ issue.sourceRow }-${ issue.message }-${ issue.url }`}
className="rounded-md border border-red-300 bg-red-50 p-3 text-sm
text-red-700 dark:border-red-900 dark:bg-red-950
dark:text-red-200">
<div>{issue.sourceRow} : {issue.message}</div> <div>{issue.sourceRow} : {issue.message}</div>
<div className="mt-1 break-all font-mono text-xs">{issue.url}</div> <div className="break-all font-mono text-xs">{issue.url}</div>
</div>))} </li>))}
</div> </ul>
<div className="flex flex-wrap items-center justify-between gap-3 text-sm <div className="flex items-center justify-between gap-3">
text-neutral-600 dark:text-neutral-300"> <div className="text-sm text-neutral-600 dark:text-neutral-300">
<div> {lineCount} / {MAX_ROWS}</div> {lineCount} / {MAX_ROWS}
</div> </div>
<div className="flex justify-end">
<Button <Button
type="button" type="button"
className="shrink-0"
onClick={preview} onClick={preview}
disabled={loading}> disabled={loading}>