diff --git a/backend/app/services/post_create_plan.rb b/backend/app/services/post_create_plan.rb index ea4712b..5001178 100644 --- a/backend/app/services/post_create_plan.rb +++ b/backend/app/services/post_create_plan.rb @@ -87,7 +87,7 @@ class PostCreatePlan end raise Tag::SectionLiteralParseError.new(raw_name, raw_name) if name.include?('[') || name.include?(']') - [TagName.canonicalise(name).first, category&.to_sym, sections] + [resolved_tag_name(name), category&.to_sym, sections] end def build_default_tag_specs direct_tag_specs @@ -254,4 +254,11 @@ class PostCreatePlan end end end + + def resolved_tag_name name + tag_name = TagName.includes(:canonical).find_by(name:) + return name if tag_name.nil? + + (tag_name.canonical || tag_name).name + end end diff --git a/backend/app/services/post_import_previewer.rb b/backend/app/services/post_import_previewer.rb index 1d349a4..96cfdbe 100644 --- a/backend/app/services/post_import_previewer.rb +++ b/backend/app/services/post_import_previewer.rb @@ -3,14 +3,14 @@ require 'timeout' class PostImportPreviewer FIELDS = [ - 'title', - 'thumbnail_base', - 'original_created_from', - 'original_created_before', - 'video_ms', - 'duration', - 'tags', - 'parent_post_ids'].freeze + 'title', + 'thumbnail_base', + 'original_created_from', + 'original_created_before', + 'video_ms', + 'duration', + 'tags', + 'parent_post_ids'].freeze FETCH_WARNING_FIELDS = ['url', 'title', 'thumbnail_base'].freeze TITLE_FETCH_WARNING = 'タイトルを取得できませんでした.'.freeze THUMBNAIL_FETCH_WARNING = 'サムネールを取得できませんでした.'.freeze @@ -126,7 +126,6 @@ class PostImportPreviewer validate_basic_data(attributes, validation_errors) validate_preview_tags(merged_tags(tag_sources, provenance['tags']), validation_errors, - field_warnings, known_tags) validate_parents(attributes['parent_post_ids'], validation_errors, existing_parent_ids) attributes.delete('url') @@ -450,7 +449,7 @@ class PostImportPreviewer [] end - def validate_preview_tags raw, errors, field_warnings, known_tags + def validate_preview_tags raw, errors, known_tags names = raw.to_s.split return if names.empty? if names.any? { _1.downcase.start_with?('nico:') } @@ -462,11 +461,6 @@ class PostImportPreviewer existing = parsed.filter_map { known_tags[_1] } deprecated = existing.select(&:deprecated?).map(&:name) errors[:tags] = ["廃止済みタグがあります: #{ deprecated.join(' ') }"] if deprecated.present? - known = existing.reject(&:deprecated?).map(&:name) - new_tags = parsed.uniq - known - if new_tags.present? - add_field_warning!(field_warnings, 'tags', "新規タグを作成します: #{ new_tags.join(' ') }") - end rescue Tag::SectionLiteralParseError errors[:tags] = ['タグ区間の記法が不正です.'] end diff --git a/frontend/src/components/posts/import/PostImportRowSummary.tsx b/frontend/src/components/posts/import/PostImportRowSummary.tsx index 9e1cb76..4cbfbf1 100644 --- a/frontend/src/components/posts/import/PostImportRowSummary.tsx +++ b/frontend/src/components/posts/import/PostImportRowSummary.tsx @@ -16,10 +16,10 @@ import type { FC } from 'react' import type { PostImportRow } from '@/lib/postImportTypes' type Props = { - row: PostImportRow + row: PostImportRow displayNumber?: number - onEdit?: () => void - onRetry?: () => void + onEdit?: () => void + onRetry?: () => void onToggleSkip?: (checked: boolean) => void rowMessages?: string[] editDisabled?: boolean @@ -75,123 +75,123 @@ const PostImportRowSummary: FC = ( return ( <> -
-
-
#{rowNumber}
-
- -
-
- {String (row.attributes.title ?? '')} -
-
- {row.url} -
- -
- {summaryDate (row)} -
- {showDuration && ( -
- 動画時間 {duration} -
)} - {warning && ( -
- {warning} -
)} - -
-
- {displayStatus != null && } -
-
-
- {skipControl} - {showActions && editVisible && ( - )} - {showActions && retryAllowed && ( - )} -
-
-
+
+
+
#{rowNumber}
+
+ +
+
+ {String (row.attributes.title ?? '')} +
+
+ {row.url} +
+ +
+ {summaryDate (row)} +
+ {showDuration && ( +
+ 動画時間 {duration} +
)} + {warning && ( +
+ {warning} +
)} + +
+
+ {displayStatus != null && } +
+
+
+ {skipControl} + {showActions && editVisible && ( + )} + {showActions && retryAllowed && ( + )} +
+
+
-
-
#{rowNumber}
-
- -
-
- {String (row.attributes.title ?? '')} -
-
- {row.url} -
-
- {displayStatus != null && } -
- -
- {summaryDate (row)} -
- {showDuration && ( -
- 動画時間 {duration} -
)} - {warning && ( -
- {warning} -
)} - - {skipControl} -
-
- {showActions && (editVisible || retryAllowed) && ( -
- {editVisible && ( - )} - {retryAllowed && ( - )} -
)} -
+
+
#{rowNumber}
+
+ +
+
+ {String (row.attributes.title ?? '')} +
+
+ {row.url} +
+
+ {displayStatus != null && } +
+ +
+ {summaryDate (row)} +
+ {showDuration && ( +
+ 動画時間 {duration} +
)} + {warning && ( +
+ {warning} +
)} + + {skipControl} +
+
+ {showActions && (editVisible || retryAllowed) && ( +
+ {editVisible && ( + )} + {retryAllowed && ( + )} +
)} +
) } diff --git a/frontend/src/components/posts/import/PostImportTagLinks.tsx b/frontend/src/components/posts/import/PostImportTagLinks.tsx index 7303f72..2900d29 100644 --- a/frontend/src/components/posts/import/PostImportTagLinks.tsx +++ b/frontend/src/components/posts/import/PostImportTagLinks.tsx @@ -12,7 +12,7 @@ const PostImportTagLinks: FC = ({ tags }) => { return null return ( -
+
{tags.map (tag => { const key = `${ tag.category }:${ tag.name }:${ tag.sectionLiterals?.join ('|') ?? '' }` return ( @@ -21,6 +21,7 @@ const PostImportTagLinks: FC = ({ tags }) => { tag={{ name: tag.name, category: tag.category }} + linkFlg={false} withWiki={false} withCount={false}/> {tag.sectionLiterals?.map (literal => ( diff --git a/frontend/src/lib/postNewQueryState.ts b/frontend/src/lib/postNewQueryState.ts index f5990cc..86bcb4e 100644 --- a/frontend/src/lib/postNewQueryState.ts +++ b/frontend/src/lib/postNewQueryState.ts @@ -1,5 +1,5 @@ const POST_NEW_REVIEW_PATH_PREFIX = '/posts/new?urls=' -const MAX_POST_NEW_REVIEW_TARGET_BYTES = 4096 +const MAX_POST_NEW_REVIEW_TARGET_BYTES = 6_144 const textEncoder = new TextEncoder () diff --git a/frontend/src/lib/useUnsavedChangesGuard.tsx b/frontend/src/lib/useUnsavedChangesGuard.tsx index 81c8eb6..422d259 100644 --- a/frontend/src/lib/useUnsavedChangesGuard.tsx +++ b/frontend/src/lib/useUnsavedChangesGuard.tsx @@ -96,7 +96,7 @@ export const UnsavedChangesGuardProvider: FC = ({ children }) try { const confirmed = await dialogue.confirm ({ - title: '変更が破棄してページ移動しますか?', + title: '変更を破棄してページ移動しますか?', confirmText: '変更を破棄して移動', variant: 'danger' }) if (!(confirmed))