From 112d75c3bb1679ade7d114f4fb8a86ab10e1756f Mon Sep 17 00:00:00 2001 From: miteruzo Date: Sun, 18 Oct 2026 23:31:17 +0900 Subject: [PATCH] #428 --- .../controllers/tag_versions_controller.rb | 6 +++++ frontend/src/locales/ain-Kana/history.json | 4 ++++ frontend/src/locales/ja/history.json | 2 ++ frontend/src/pages/tags/TagHistoryPage.tsx | 23 +++++++++++++++---- frontend/src/types.ts | 5 ++++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/backend/app/controllers/tag_versions_controller.rb b/backend/app/controllers/tag_versions_controller.rb index cc8c1d6..e1169e9 100644 --- a/backend/app/controllers/tag_versions_controller.rb +++ b/backend/app/controllers/tag_versions_controller.rb @@ -36,6 +36,11 @@ class TagVersionsController < ApplicationController def serialise_versions rows, language_code rows = rows.to_a + tag_ids = rows.map(&:tag_id).uniq + current_names_by_tag_id = TagName.where(tag_id: tag_ids, language_code:, primary_flg: true) + .pluck(:tag_id, :name, :auto_generated).to_h do |id, name, automatic| + [id, { name:, auto_generated: automatic }] + end user_ids = rows.map(&:created_by_user_id).compact.uniq users_by_id = User.where(id: user_ids).pluck(:id, :name).to_h parent_ids = rows.flat_map do |row| @@ -69,6 +74,7 @@ class TagVersionsController < ApplicationController event_type: row.event_type, names: row.names, name_changes: name_changes(row.names, row.attributes['prev_names']), + current_name_reference: current_names_by_tag_id[row.tag_id], name: { current: current_names['name'], prev: previous_names['name'] }, category: { current: row.category, prev: row.attributes['prev_category'] }, deprecated_at: { current: row.deprecated_at&.iso8601, diff --git a/frontend/src/locales/ain-Kana/history.json b/frontend/src/locales/ain-Kana/history.json index 7170554..c155dd4 100644 --- a/frontend/src/locales/ain-Kana/history.json +++ b/frontend/src/locales/ain-Kana/history.json @@ -8,6 +8,8 @@ "nameChanges.certified", "nameChanges.otherLanguages", "nameChanges.changed", + "nameChanges.currentReference", + "nameChanges.noNameRecord", "nameChanges.uncertified" ], "exportPath": "export_path", @@ -32,6 +34,8 @@ "confirmTag": "シロシ「{{name}}」 ウェㇽソン {{version}} ウン アホシピレ ヤ?\nピㇼカ ヤ?", "restoreScope": "名称・別名は現在表示中の言語だけを差し戻します。全言語の名称は復元しません。", "nameChanges": { + "currentReference": "現行名・参考", + "noNameRecord": "この版には名称記録なし", "otherLanguages": "他言語情報", "changed": "(異動あり)", "uncertified": "(未公証)", diff --git a/frontend/src/locales/ja/history.json b/frontend/src/locales/ja/history.json index b61935b..46578e0 100644 --- a/frontend/src/locales/ja/history.json +++ b/frontend/src/locales/ja/history.json @@ -21,6 +21,8 @@ "confirmTag": "タグ『{{name}}』を版 {{version}} に差戻します.\nよろしいですか?", "restoreScope": "名称・別名は現在表示中の言語だけを差し戻します。全言語の名称は復元しません。", "nameChanges": { + "currentReference": "現行名・参考", + "noNameRecord": "この版には名称記録なし", "otherLanguages": "他言語情報", "changed": "(異動あり)", "uncertified": "(未公証)", diff --git a/frontend/src/pages/tags/TagHistoryPage.tsx b/frontend/src/pages/tags/TagHistoryPage.tsx index 69b07d0..06442ee 100644 --- a/frontend/src/pages/tags/TagHistoryPage.tsx +++ b/frontend/src/pages/tags/TagHistoryPage.tsx @@ -68,7 +68,7 @@ const snapshotNames = (names: TagVersion['names']): Record, language: string, label: (key: string) => ReactNode, ) => ( @@ -124,7 +124,6 @@ const TagVersionRows = ({ change, children }: { const language = localeLanguage (locale) const { message, label } = useUITranslation ('history') const { i18n } = useTranslation ('history') - const [expanded, setExpanded] = useState (false) const panelId = useId () const names = snapshotNames (change.names) const nameChanges = (change.nameChanges ?? []).map (entry => ({ @@ -144,6 +143,9 @@ const TagVersionRows = ({ change, children }: { ? selected.prev : ((change.nameChanges != null && change.name.prev === change.name.current) ? current : legacyName (change.name.prev)) + const missingNameRecord = current?.name == null && previous?.name == null + const [expansion, setExpansion] = useState ({ language, expanded: missingNameRecord }) + const expanded = expansion.language === language ? expansion.expanded : missingNameRecord const otherLanguages = [...new Set ([...Object.keys (names), ...nameChanges.map (entry => entry.languageCode)])] .filter (code => code !== language).sort () @@ -151,13 +153,24 @@ const TagVersionRows = ({ change, children }: { const rowIds = otherLanguages.map ((_, index) => `${panelId}-${index}`) const primaryEqual = (prev: TagNameSnapshot | null, next: TagNameSnapshot | null) => prev?.name === next?.name && prev?.autoGenerated === next?.autoGenerated - const primary = renderDiff ({ current, prev: previous }, - snapshot => renderPrimaryName (snapshot, language, label), primaryEqual) + const primary = + missingNameRecord + ? ( + <> + {change.currentNameReference != null && ( +
+ {renderPrimaryName (change.currentNameReference, language, label)} + {label ('nameChanges.currentReference')} +
)} +
{label ('nameChanges.noNameRecord')}
+ ) + : renderDiff ({ current, prev: previous }, + snapshot => renderPrimaryName (snapshot, language, label), primaryEqual) const toggle = otherLanguages.length > 0 && (