このコミットが含まれているのは:
@@ -4,6 +4,7 @@ import FieldWarning from '@/components/common/FieldWarning'
|
||||
import FormField from '@/components/common/FormField'
|
||||
import PostImportStatusBadge from '@/components/posts/import/PostImportStatusBadge'
|
||||
import ThumbnailPreview from '@/components/posts/import/ThumbnailPreview'
|
||||
import { effectivePostImportStatus } from '@/components/posts/import/postImportRowStatus'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { Dialog,
|
||||
DialogContent,
|
||||
@@ -42,6 +43,12 @@ const originOf = (
|
||||
): PostImportOrigin =>
|
||||
row.provenance[field] ?? 'automatic'
|
||||
|
||||
const originalCreatedOrigin = (row: PostImportRow): PostImportOrigin =>
|
||||
originOf (row, 'originalCreatedFrom') === 'manual'
|
||||
|| originOf (row, 'originalCreatedBefore') === 'manual'
|
||||
? 'manual'
|
||||
: 'automatic'
|
||||
|
||||
const buildDraft = (row: PostImportRow): Draft => ({
|
||||
url: row.url,
|
||||
title: String (row.attributes.title ?? ''),
|
||||
@@ -102,8 +109,7 @@ const PostImportRowDialog: FC<Props> = (
|
||||
url={draft.thumbnailBase}
|
||||
className="h-28 w-28"/>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<PostImportStatusBadge value={row.status}/>
|
||||
<PostImportStatusBadge value={row.importStatus ?? 'pending'}/>
|
||||
<PostImportStatusBadge value={effectivePostImportStatus (row)}/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -133,7 +139,7 @@ const PostImportRowDialog: FC<Props> = (
|
||||
)}
|
||||
onChange={value => update ('thumbnailBase', value)}/>
|
||||
<PostOriginalCreatedTimeField
|
||||
labelAddon={<PostImportStatusBadge value={originOf (row, 'originalCreatedFrom')}/>}
|
||||
labelAddon={<PostImportStatusBadge value={originalCreatedOrigin (row)}/>}
|
||||
originalCreatedFrom={draft.originalCreatedFrom || null}
|
||||
setOriginalCreatedFrom={value => update ('originalCreatedFrom', value ?? '')}
|
||||
originalCreatedBefore={draft.originalCreatedBefore || null}
|
||||
|
||||
@@ -4,6 +4,7 @@ import { cn } from '@/lib/utils'
|
||||
import PrefetchLink from '@/components/PrefetchLink'
|
||||
import PostImportStatusBadge from '@/components/posts/import/PostImportStatusBadge'
|
||||
import ThumbnailPreview from '@/components/posts/import/ThumbnailPreview'
|
||||
import { effectivePostImportStatus } from '@/components/posts/import/postImportRowStatus'
|
||||
|
||||
import type { FC } from 'react'
|
||||
|
||||
@@ -14,7 +15,7 @@ type Props = {
|
||||
onEdit: () => void }
|
||||
|
||||
const toneClass = (row: PostImportRow): string[] => {
|
||||
const value = row.importStatus ?? row.status
|
||||
const value = effectivePostImportStatus (row)
|
||||
switch (value)
|
||||
{
|
||||
case 'created':
|
||||
@@ -63,7 +64,7 @@ const summaryDate = (row: PostImportRow): string =>
|
||||
const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
|
||||
const error = summaryError (row)
|
||||
const warning = error == null ? summaryWarning (row) : null
|
||||
const importStatus = row.importStatus ?? 'pending'
|
||||
const effectiveStatus = effectivePostImportStatus (row)
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -77,7 +78,6 @@ const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
|
||||
)}>
|
||||
<div className="space-y-1">
|
||||
<div className="text-sm font-medium">#{row.sourceRow}</div>
|
||||
<PostImportStatusBadge value={row.status}/>
|
||||
</div>
|
||||
<ThumbnailPreview
|
||||
url={String (row.attributes.thumbnailBase ?? '')}
|
||||
@@ -113,12 +113,7 @@ const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
|
||||
</div>)}
|
||||
</div>
|
||||
<div className="space-y-1">
|
||||
<PostImportStatusBadge value={importStatus}/>
|
||||
</div>
|
||||
<div className="space-y-1">
|
||||
{error
|
||||
? <PostImportStatusBadge value="error"/>
|
||||
: (warning ? <PostImportStatusBadge value="warning"/> : <PostImportStatusBadge value="ready"/>)}
|
||||
<PostImportStatusBadge value={effectiveStatus}/>
|
||||
</div>
|
||||
<div className="flex justify-end">
|
||||
<Button
|
||||
@@ -148,9 +143,7 @@ const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
|
||||
{row.url}
|
||||
</div>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<PostImportStatusBadge value={row.status}/>
|
||||
<PostImportStatusBadge value={importStatus}/>
|
||||
{warning && <PostImportStatusBadge value="warning"/>}
|
||||
<PostImportStatusBadge value={effectiveStatus}/>
|
||||
</div>
|
||||
{row.createdPostId && (
|
||||
<PrefetchLink
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -151,26 +151,21 @@ const PostImportSourcePage: FC<Props> = ({ user }) => {
|
||||
}}/>)}
|
||||
</FormField>
|
||||
<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 => (
|
||||
<div
|
||||
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">
|
||||
<li key={`${ issue.sourceRow }-${ issue.message }-${ issue.url }`}>
|
||||
<div>{issue.sourceRow} 行目: {issue.message}</div>
|
||||
<div className="mt-1 break-all font-mono text-xs">{issue.url}</div>
|
||||
</div>))}
|
||||
</div>
|
||||
<div className="break-all font-mono text-xs">{issue.url}</div>
|
||||
</li>))}
|
||||
</ul>
|
||||
|
||||
<div className="flex flex-wrap items-center justify-between gap-3 text-sm
|
||||
text-neutral-600 dark:text-neutral-300">
|
||||
<div>入力件数 {lineCount} / {MAX_ROWS}</div>
|
||||
<div className="flex items-center justify-between gap-3">
|
||||
<div className="text-sm text-neutral-600 dark:text-neutral-300">
|
||||
入力行数 {lineCount} / {MAX_ROWS}
|
||||
</div>
|
||||
|
||||
<div className="flex justify-end">
|
||||
<Button
|
||||
type="button"
|
||||
className="shrink-0"
|
||||
onClick={preview}
|
||||
disabled={loading}>
|
||||
次へ
|
||||
|
||||
新しい課題から参照
ユーザをブロックする