このコミットが含まれているのは:
2026-10-18 23:31:17 +09:00
コミット 112d75c3bb
5個のファイルの変更、35行の追加、5行の削除
+6
ファイルの表示
@@ -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,
+4
ファイルの表示
@@ -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": "(未公証)",
+2
ファイルの表示
@@ -21,6 +21,8 @@
"confirmTag": "タグ『{{name}}』を版 {{version}} に差戻します.\nよろしいですか?",
"restoreScope": "名称・別名は現在表示中の言語だけを差し戻します。全言語の名称は復元しません。",
"nameChanges": {
"currentReference": "現行名・参考",
"noNameRecord": "この版には名称記録なし",
"otherLanguages": "他言語情報",
"changed": "(異動あり)",
"uncertified": "(未公証)",
+18 -5
ファイルの表示
@@ -68,7 +68,7 @@ const snapshotNames = (names: TagVersion['names']): Record<string, TagNameSnapsh
const renderPrimaryName = (
snapshot: TagNameSnapshot,
snapshot: Pick<TagNameSnapshot, 'name' | 'autoGenerated'>,
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 && (
<div>
{renderPrimaryName (change.currentNameReference, language, label)}
<span className="ml-2 text-sm">{label ('nameChanges.currentReference')}</span>
</div>)}
<div className="text-sm">{label ('nameChanges.noNameRecord')}</div>
</>)
: renderDiff ({ current, prev: previous },
snapshot => renderPrimaryName (snapshot, language, label), primaryEqual)
const toggle = otherLanguages.length > 0 && (
<div className="mt-2 text-sm">
<button type="button" className="text-left"
aria-expanded={expanded} aria-controls={rowIds.join (' ')}
onClick={() => setExpanded (value => !value)}>
onClick={() => setExpansion ({ language, expanded: !expanded })}>
{label ('nameChanges.otherLanguages')}
{otherChanges.length > 0 && label ('nameChanges.changed')}
<span aria-hidden="true" className="ml-1">{expanded ? '▲' : '▼'}</span>
+5
ファイルの表示
@@ -378,12 +378,17 @@ export type TagNameChange = {
current: TagNameSnapshot | null
prev: TagNameSnapshot | null }
export type CurrentNameReference = {
name: string
autoGenerated: boolean }
export type TagVersion = {
tagId: number
versionNo: number
eventType: 'create' | 'update' | 'discard' | 'restore'
names?: Record<string, TagNameSnapshot> | string | null
nameChanges?: TagNameChange[]
currentNameReference?: CurrentNameReference | null
name: { current: string | null; prev: string | null }
category: { current: Category; prev: Category | null }
deprecatedAt: { current: string | null; prev: string | null }