refactor(front): extract shared utils and rewire pages
This commit is contained in:
78
app/shared/utils/historyDisplayUtils.ts
Normal file
78
app/shared/utils/historyDisplayUtils.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
/**
|
||||
* History display utilities for edit pages.
|
||||
*
|
||||
* Extracted from pages/component/[id]/edit.vue, pieces/[id]/edit.vue,
|
||||
* product/[id]/edit.vue – each had an identical copy.
|
||||
*/
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Formatters
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const historyActionLabel = (action: string): string => {
|
||||
if (action === 'create') return 'Création'
|
||||
if (action === 'delete') return 'Suppression'
|
||||
return 'Modification'
|
||||
}
|
||||
|
||||
const historyDateFormatter = new Intl.DateTimeFormat('fr-FR', {
|
||||
dateStyle: 'medium',
|
||||
timeStyle: 'short',
|
||||
})
|
||||
|
||||
export const formatHistoryDate = (value: string): string => {
|
||||
const date = new Date(value)
|
||||
if (Number.isNaN(date.getTime())) return value
|
||||
return historyDateFormatter.format(date)
|
||||
}
|
||||
|
||||
export const formatHistoryValue = (value: unknown): string => {
|
||||
if (value === null || value === undefined || value === '') return '—'
|
||||
if (Array.isArray(value)) {
|
||||
if (value.length === 0) return '—'
|
||||
return value.map((item) => formatHistoryValue(item)).join(', ')
|
||||
}
|
||||
if (typeof value === 'object') {
|
||||
const maybeRecord = value as Record<string, unknown>
|
||||
const name = typeof maybeRecord.name === 'string' ? maybeRecord.name : null
|
||||
const id = typeof maybeRecord.id === 'string' ? maybeRecord.id : null
|
||||
if (name && id) return `${name} (#${id})`
|
||||
if (name) return name
|
||||
if (id) return `#${id}`
|
||||
try {
|
||||
return JSON.stringify(value)
|
||||
} catch {
|
||||
return String(value)
|
||||
}
|
||||
}
|
||||
return String(value)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Diff entries
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
interface DiffChange {
|
||||
from?: unknown
|
||||
to?: unknown
|
||||
}
|
||||
|
||||
export interface HistoryDiffEntry {
|
||||
field: string
|
||||
label: string
|
||||
fromLabel: string
|
||||
toLabel: string
|
||||
}
|
||||
|
||||
export const historyDiffEntries = (
|
||||
entry: { diff?: Record<string, DiffChange> | null },
|
||||
fieldLabels: Record<string, string>,
|
||||
): HistoryDiffEntry[] => {
|
||||
const diff = entry.diff ?? {}
|
||||
return Object.entries(diff).map(([field, change]) => ({
|
||||
field,
|
||||
label: fieldLabels[field] ?? field,
|
||||
fromLabel: formatHistoryValue(change?.from),
|
||||
toLabel: formatHistoryValue(change?.to),
|
||||
}))
|
||||
}
|
||||
Reference in New Issue
Block a user