広場投稿追加画面の刷新 (#399) #413
@@ -87,7 +87,7 @@ class PostCreatePlan
|
|||||||
end
|
end
|
||||||
raise Tag::SectionLiteralParseError.new(raw_name, raw_name) if name.include?('[') || name.include?(']')
|
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
|
end
|
||||||
|
|
||||||
def build_default_tag_specs direct_tag_specs
|
def build_default_tag_specs direct_tag_specs
|
||||||
@@ -254,4 +254,11 @@ class PostCreatePlan
|
|||||||
end
|
end
|
||||||
end
|
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
|
end
|
||||||
|
|||||||
@@ -126,7 +126,6 @@ class PostImportPreviewer
|
|||||||
validate_basic_data(attributes, validation_errors)
|
validate_basic_data(attributes, validation_errors)
|
||||||
validate_preview_tags(merged_tags(tag_sources, provenance['tags']),
|
validate_preview_tags(merged_tags(tag_sources, provenance['tags']),
|
||||||
validation_errors,
|
validation_errors,
|
||||||
field_warnings,
|
|
||||||
known_tags)
|
known_tags)
|
||||||
validate_parents(attributes['parent_post_ids'], validation_errors, existing_parent_ids)
|
validate_parents(attributes['parent_post_ids'], validation_errors, existing_parent_ids)
|
||||||
attributes.delete('url')
|
attributes.delete('url')
|
||||||
@@ -450,7 +449,7 @@ class PostImportPreviewer
|
|||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_preview_tags raw, errors, field_warnings, known_tags
|
def validate_preview_tags raw, errors, known_tags
|
||||||
names = raw.to_s.split
|
names = raw.to_s.split
|
||||||
return if names.empty?
|
return if names.empty?
|
||||||
if names.any? { _1.downcase.start_with?('nico:') }
|
if names.any? { _1.downcase.start_with?('nico:') }
|
||||||
@@ -462,11 +461,6 @@ class PostImportPreviewer
|
|||||||
existing = parsed.filter_map { known_tags[_1] }
|
existing = parsed.filter_map { known_tags[_1] }
|
||||||
deprecated = existing.select(&:deprecated?).map(&:name)
|
deprecated = existing.select(&:deprecated?).map(&:name)
|
||||||
errors[:tags] = ["廃止済みタグがあります: #{ deprecated.join(' ') }"] if deprecated.present?
|
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
|
rescue Tag::SectionLiteralParseError
|
||||||
errors[:tags] = ['タグ区間の記法が不正です.']
|
errors[:tags] = ['タグ区間の記法が不正です.']
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ const PostImportTagLinks: FC<Props> = ({ tags }) => {
|
|||||||
return null
|
return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-wrap gap-2">
|
<div className="flex flex-wrap text-xs gap-x-1">
|
||||||
{tags.map (tag => {
|
{tags.map (tag => {
|
||||||
const key = `${ tag.category }:${ tag.name }:${ tag.sectionLiterals?.join ('|') ?? '' }`
|
const key = `${ tag.category }:${ tag.name }:${ tag.sectionLiterals?.join ('|') ?? '' }`
|
||||||
return (
|
return (
|
||||||
@@ -21,6 +21,7 @@ const PostImportTagLinks: FC<Props> = ({ tags }) => {
|
|||||||
tag={{
|
tag={{
|
||||||
name: tag.name,
|
name: tag.name,
|
||||||
category: tag.category }}
|
category: tag.category }}
|
||||||
|
linkFlg={false}
|
||||||
withWiki={false}
|
withWiki={false}
|
||||||
withCount={false}/>
|
withCount={false}/>
|
||||||
{tag.sectionLiterals?.map (literal => (
|
{tag.sectionLiterals?.map (literal => (
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
const POST_NEW_REVIEW_PATH_PREFIX = '/posts/new?urls='
|
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 ()
|
const textEncoder = new TextEncoder ()
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ export const UnsavedChangesGuardProvider: FC<PropsWithChildren> = ({ children })
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
const confirmed = await dialogue.confirm ({
|
const confirmed = await dialogue.confirm ({
|
||||||
title: '変更が破棄してページ移動しますか?',
|
title: '変更を破棄してページ移動しますか?',
|
||||||
confirmText: '変更を破棄して移動',
|
confirmText: '変更を破棄して移動',
|
||||||
variant: 'danger' })
|
variant: 'danger' })
|
||||||
if (!(confirmed))
|
if (!(confirmed))
|
||||||
|
|||||||
新しい課題から参照
ユーザをブロックする