fix: clean action log — no UUID/ID duplicates, smart expanded row

This commit is contained in:
root 2026-05-28 10:22:31 +00:00
parent a5b9dc1153
commit bb439a4d93
2 changed files with 20 additions and 12 deletions

View File

@ -301,24 +301,31 @@ export const ActionLogPanel = ({ orderGroupId = null }) => {
</td> </td>
)} )}
</tr> </tr>
{expandedId === log.id && ( {expandedId === log.id && (() => {
const hasChange = log.old_value && log.new_value && log.old_value !== log.new_value;
const isDriverAction = log.action === "driver_assigned" || log.action === "driver_removed";
const detailEntries = (log.details && typeof log.details === "object")
? Object.entries(log.details).filter(([k]) => k !== "source" && k !== "driver_name" && k !== "driver_id")
: [];
return (
<tr className="bg-[var(--color-surface-strong)]"> <tr className="bg-[var(--color-surface-strong)]">
<td colSpan={orderGroupId ? 4 : 5} className="py-2 px-3"> <td colSpan={orderGroupId ? 4 : 5} className="py-2 px-3">
<div className="space-y-1 text-xs"> <div className="space-y-1 text-xs">
{log.old_value && ( {hasChange && !isDriverAction && (
<div><span className="text-[var(--color-text-muted)]">Было:</span> {resolveName(log.old_value)}</div> <div><span className="text-[var(--color-text-muted)]">Было:</span> {resolveName(log.old_value)} <span className="text-[var(--color-text-muted)]">Стало:</span> {resolveName(log.new_value)}</div>
)} )}
{log.new_value && ( {isDriverAction && log.details?.driver_name && !log.old_value && (
<div><span className="text-[var(--color-text-muted)]">Стало:</span> {resolveName(log.new_value)}</div> <div><span className="text-[var(--color-text-muted)]">Водитель:</span> {log.details.driver_name}</div>
)} )}
{log.details && typeof log.details === "object" && ( {isDriverAction && log.old_value && (
<div><span className="text-[var(--color-text-muted)]">Было:</span> {resolveName(log.old_value)} <span className="text-[var(--color-text-muted)]">Стало:</span> {log.details?.driver_name || resolveName(log.new_value)}</div>
)}
{detailEntries.length > 0 && (
<div className="space-y-0.5"> <div className="space-y-0.5">
{Object.entries(log.details) {detailEntries.map(([k, v]) => (
.filter(([k]) => k !== "source")
.map(([k, v]) => (
<div key={k}> <div key={k}>
<span className="text-[var(--color-text-muted)]"> <span className="text-[var(--color-text-muted)]">
{{driver_name: "Водитель", driver_id: "ID", problem_type: "Тип проблемы", delivery_date_source: "Источник даты"}[k] || k}: {{problem_type: "Тип проблемы", delivery_date_source: "Источник даты"}[k] || k}:
</span> {UUID_RE.test(String(v)) ? resolveName(String(v)) : String(v)} </span> {UUID_RE.test(String(v)) ? resolveName(String(v)) : String(v)}
</div> </div>
))} ))}
@ -336,7 +343,8 @@ export const ActionLogPanel = ({ orderGroupId = null }) => {
</div> </div>
</td> </td>
</tr> </tr>
)} );
})()}
</React.Fragment> </React.Fragment>
))} ))}
</tbody> </tbody>

View File

@ -274,7 +274,7 @@ export const assignDriverToOrderGroup = async ({
const driverName = data?.assigned_driver?.name || driverId || "—"; const driverName = data?.assigned_driver?.name || driverId || "—";
const oldDriverName = currentGroup?.assigned_driver?.name || currentGroup?.assigned_driver_id || ""; const oldDriverName = currentGroup?.assigned_driver?.name || currentGroup?.assigned_driver_id || "";
const logPayload = driverId const logPayload = driverId
? { orderGroupId, action: "driver_assigned", oldValue: oldDriverName || undefined, newValue: driverName, details: { driver_id: driverId, driver_name: driverName } } ? { orderGroupId, action: "driver_assigned", oldValue: oldDriverName || undefined, newValue: driverName, details: { driver_name: driverName } }
: { orderGroupId, action: "driver_removed", oldValue: oldDriverName, newValue: "Снят", details: { driver_name: oldDriverName } }; : { orderGroupId, action: "driver_removed", oldValue: oldDriverName, newValue: "Снят", details: { driver_name: oldDriverName } };
await logAction(logPayload).catch(() => {}); await logAction(logPayload).catch(() => {});