このコミットが含まれているのは:
2026-07-14 18:39:24 +09:00
コミット d035da99ad
14個のファイルの変更188行の追加232行の削除
+34 -11
ファイルの表示
@@ -43,11 +43,27 @@ const originOf = (
): PostImportOrigin =>
row.provenance[field] ?? 'automatic'
const originalCreatedOrigin = (row: PostImportRow): PostImportOrigin =>
originOf (row, 'originalCreatedFrom') === 'manual'
|| originOf (row, 'originalCreatedBefore') === 'manual'
const changedOrigin = (
changed: boolean,
row: PostImportRow,
field: string,
): PostImportOrigin =>
changed ? 'manual' : originOf (row, field)
const originalCreatedOrigin = (
row: PostImportRow,
originalDraft: Draft,
draft: Draft,
): PostImportOrigin =>
originalDraft.originalCreatedFrom !== draft.originalCreatedFrom
|| originalDraft.originalCreatedBefore !== draft.originalCreatedBefore
? 'manual'
: 'automatic'
: (
originOf (row, 'originalCreatedFrom') === 'manual'
|| originOf (row, 'originalCreatedBefore') === 'manual'
? 'manual'
: 'automatic'
)
const buildDraft = (row: PostImportRow): Draft => ({
url: row.url,
@@ -78,6 +94,10 @@ const PostImportRowDialog: FC<Props> = (
if (!(row) || !(draft))
return null
const originalDraft = buildDraft (row)
const fieldOrigin = (field: keyof Draft): PostImportOrigin =>
changedOrigin (draft[field] !== originalDraft[field], row, field)
const update = <Key extends keyof Draft,> (
key: Key,
value: Draft[Key],
@@ -117,21 +137,21 @@ const PostImportRowDialog: FC<Props> = (
<DialogTextField
label="URL"
value={draft.url}
origin={originOf (row, 'url')}
origin={fieldOrigin ('url')}
warnings={row.fieldWarnings.url}
errors={groupedMessages (row.validationErrors.url, row.importErrors?.url)}
onChange={value => update ('url', value)}/>
<DialogTextField
label="タイトル"
value={draft.title}
origin={originOf (row, 'title')}
origin={fieldOrigin ('title')}
warnings={row.fieldWarnings.title}
errors={groupedMessages (row.validationErrors.title, row.importErrors?.title)}
onChange={value => update ('title', value)}/>
<DialogTextField
label="サムネール基底 URL"
value={draft.thumbnailBase}
origin={originOf (row, 'thumbnailBase')}
origin={fieldOrigin ('thumbnailBase')}
warnings={row.fieldWarnings.thumbnailBase}
errors={groupedMessages (
row.validationErrors.thumbnailBase,
@@ -139,7 +159,10 @@ const PostImportRowDialog: FC<Props> = (
)}
onChange={value => update ('thumbnailBase', value)}/>
<PostOriginalCreatedTimeField
labelAddon={<PostImportStatusBadge value={originalCreatedOrigin (row)}/>}
labelAddon={
<PostImportStatusBadge
value={originalCreatedOrigin (row, originalDraft, draft)}/>
}
originalCreatedFrom={draft.originalCreatedFrom || null}
setOriginalCreatedFrom={value => update ('originalCreatedFrom', value ?? '')}
originalCreatedBefore={draft.originalCreatedBefore || null}
@@ -155,7 +178,7 @@ const PostImportRowDialog: FC<Props> = (
<DialogTextField
label="動画時間"
value={draft.duration}
origin={originOf (row, 'duration')}
origin={fieldOrigin ('duration')}
errors={groupedMessages (
row.validationErrors.duration,
row.validationErrors.videoMs,
@@ -166,14 +189,14 @@ const PostImportRowDialog: FC<Props> = (
<DialogAreaField
label="タグ"
value={draft.tags}
origin={originOf (row, 'tags')}
origin={fieldOrigin ('tags')}
warnings={row.fieldWarnings.tags}
errors={groupedMessages (row.validationErrors.tags, row.importErrors?.tags)}
onChange={value => update ('tags', value)}/>
<DialogTextField
label="親投稿"
value={draft.parentPostIds}
origin={originOf (row, 'parentPostIds')}
origin={fieldOrigin ('parentPostIds')}
errors={groupedMessages (
row.validationErrors.parentPostIds,
row.importErrors?.parentPostIds,
+2 -18
ファイルの表示
@@ -1,7 +1,6 @@
import { Button } from '@/components/ui/button'
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'
@@ -71,10 +70,9 @@ const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
<div
className={cn (
'hidden items-center gap-4 rounded-lg border p-4 md:grid',
'md:grid-cols-[4rem_5rem_minmax(0,1fr)_auto_auto_auto]',
'md:grid-cols-[4rem_5rem_minmax(0,1fr)_auto_auto]',
toneClass (row),
'hover:bg-slate-50',
'dark:hover:bg-neutral-800',
'transition-shadow hover:shadow-sm',
)}>
<div className="space-y-1">
<div className="text-sm font-medium">#{row.sourceRow}</div>
@@ -96,13 +94,6 @@ const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
{summaryDate (row) || '日時未取得'}
{row.attributes.duration ? ` / ${ row.attributes.duration }` : ''}
</div>
{row.createdPostId && (
<PrefetchLink
to={`/posts/${ row.createdPostId }`}
className="inline-block text-xs text-sky-700 underline
dark:text-sky-300">
稿 #{row.createdPostId}
</PrefetchLink>)}
{warning && (
<div className="text-xs text-amber-700 dark:text-amber-200">
{warning}
@@ -145,13 +136,6 @@ const PostImportRowSummary: FC<Props> = ({ row, onEdit }) => {
<div className="flex flex-wrap gap-2">
<PostImportStatusBadge value={effectiveStatus}/>
</div>
{row.createdPostId && (
<PrefetchLink
to={`/posts/${ row.createdPostId }`}
className="inline-block text-xs text-sky-700 underline
dark:text-sky-300">
稿 #{row.createdPostId}
</PrefetchLink>)}
{error && (
<div className="text-xs text-red-700 dark:text-red-200">
{error}
+4 -14
ファイルの表示
@@ -2,22 +2,12 @@ import { cn } from '@/lib/utils'
import type { FC } from 'react'
import type { PostImportOrigin } from '@/lib/postImportSession'
type BadgeValue =
'ready'
| 'warning'
| 'error'
| 'pending'
| 'created'
| 'skipped'
| 'failed'
| PostImportOrigin
import type { PostImportBadgeValue } from '@/components/posts/import/postImportRowStatus'
type Props = {
value: BadgeValue }
value: PostImportBadgeValue }
const LABELS: Record<BadgeValue, string> = {
const LABELS: Record<PostImportBadgeValue, string> = {
ready: '登録可能',
warning: '警告',
error: '要修正',
@@ -28,7 +18,7 @@ const LABELS: Record<BadgeValue, string> = {
automatic: '自動取得',
manual: '手修正' }
const STYLES: Record<BadgeValue, string[]> = {
const STYLES: Record<PostImportBadgeValue, string[]> = {
ready: [
'border-emerald-300 bg-emerald-50 text-emerald-700',
'dark:border-emerald-900 dark:bg-emerald-950 dark:text-emerald-200'],
+7 -1
ファイルの表示
@@ -1,4 +1,5 @@
import type { PostImportRow } from '@/lib/postImportSession'
import type { PostImportOrigin,
PostImportRow } from '@/lib/postImportSession'
export type PostImportEffectiveStatus =
'created'
@@ -8,6 +9,11 @@ export type PostImportEffectiveStatus =
| 'warning'
| 'ready'
export type PostImportBadgeValue =
PostImportEffectiveStatus
| 'pending'
| PostImportOrigin
export const effectivePostImportStatus = (
row: PostImportRow,