このコミットが含まれているのは:
@@ -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}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
</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}>
|
||||||
次へ
|
次へ
|
||||||
|
|||||||
新しい課題から参照
ユーザをブロックする