fix(plan): readable audit descriptions, project labels, dashboard invalidation, view-only & sticky-column UI

Work-plan fixes from this session:
- Czech audit descriptions for plan entries/overrides (was empty '-')
- server-embedded project label on grid cells (was '-' past the 100-project cap)
- dashboard activity + audit-log cache invalidation on plan mutations
- read-only cells: no '+' on empty, keep hover on cells with a record
- view modal: Czech category + formatted dates
- sticky date column made opaque (no bleed-through on horizontal scroll)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
BOHA
2026-06-06 00:24:33 +02:00
parent 2f76fe0bc1
commit 4a9c283789
13 changed files with 2240 additions and 261 deletions

View File

@@ -156,7 +156,7 @@ export default async function planRoutes(app: FastifyInstance) {
entityType: "work_plan_entry",
entityId: (result.data as any).id,
newValues: result.data,
description: force ? "force-edit past date" : undefined,
description: result.description,
});
return success(reply, result.data, 201, "Plán vytvořen");
},
@@ -187,7 +187,7 @@ export default async function planRoutes(app: FastifyInstance) {
entityId: id,
oldValues: (result.oldData as any) ?? undefined,
newValues: result.data as Record<string, unknown>,
description: force ? "force-edit past date" : undefined,
description: result.description,
});
return success(reply, result.data, 200, "Plán aktualizován");
},
@@ -210,7 +210,7 @@ export default async function planRoutes(app: FastifyInstance) {
entityType: "work_plan_entry",
entityId: id,
oldValues: (result.oldData as any) ?? undefined,
description: force ? "force-edit past date" : undefined,
description: result.description,
});
return success(reply, { ok: true }, 200, "Plán smazán");
},
@@ -240,7 +240,7 @@ export default async function planRoutes(app: FastifyInstance) {
entityType: "work_plan_override",
entityId: (result.replacedData as any).id,
oldValues: result.replacedData as Record<string, unknown>,
description: "auto-soft-delete before replace",
description: result.replacedDescription,
});
}
await logAudit({
@@ -250,7 +250,7 @@ export default async function planRoutes(app: FastifyInstance) {
entityType: "work_plan_override",
entityId: (result.data as any).id,
newValues: result.data,
description: force ? "force-edit past date" : undefined,
description: result.description,
});
return success(reply, result.data, 201, "Přepsání dne vytvořeno");
},
@@ -281,7 +281,7 @@ export default async function planRoutes(app: FastifyInstance) {
entityId: id,
oldValues: (result.oldData as any) ?? undefined,
newValues: result.data,
description: force ? "force-edit past date" : undefined,
description: result.description,
});
return success(reply, result.data, 200, "Přepsání aktualizováno");
},
@@ -304,7 +304,7 @@ export default async function planRoutes(app: FastifyInstance) {
entityType: "work_plan_override",
entityId: id,
oldValues: (result.oldData as any) ?? undefined,
description: force ? "force-edit past date" : undefined,
description: result.description,
});
return success(reply, { ok: true }, 200, "Přepsání smazáno");
},