このコミットが含まれているのは:
@@ -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,
|
||||
|
||||
@@ -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": "(未公証)",
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
"confirmTag": "タグ『{{name}}』を版 {{version}} に差戻します.\nよろしいですか?",
|
||||
"restoreScope": "名称・別名は現在表示中の言語だけを差し戻します。全言語の名称は復元しません。",
|
||||
"nameChanges": {
|
||||
"currentReference": "現行名・参考",
|
||||
"noNameRecord": "この版には名称記録なし",
|
||||
"otherLanguages": "他言語情報",
|
||||
"changed": "(異動あり)",
|
||||
"uncertified": "(未公証)",
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 }
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする