From ac7c220bb19a303216db110370ece20382d4d431 Mon Sep 17 00:00:00 2001 From: BOHA Date: Mon, 8 Jun 2026 19:46:49 +0200 Subject: [PATCH] =?UTF-8?q?fix(odin):=20gate=20Ulo=C5=BEit=20on=20invoices?= =?UTF-8?q?.create=20+=20correct=20invoice=20invalidation=20key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Final review caught two minor issues: - saveInvoice invalidated ["received-invoices"], which matches no query (the received list/stats are keyed ["invoices","received",…]); use ["invoices"] so the list/stats actually refresh after an import. - The Save button hit /received-invoices (requires invoices.create) while Odin is gated only on ai.use; disable Uložit (with a hint) when the user lacks invoices.create so the UI never offers a 403 action. Dormant today (ai.use is admin-only and admin bypasses checks) but correct going forward. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/admin/components/odin/InvoiceReviewCard.tsx | 10 +++++++++- src/admin/components/odin/OdinChat.tsx | 8 +++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/admin/components/odin/InvoiceReviewCard.tsx b/src/admin/components/odin/InvoiceReviewCard.tsx index 9f53f5e..3a9137a 100644 --- a/src/admin/components/odin/InvoiceReviewCard.tsx +++ b/src/admin/components/odin/InvoiceReviewCard.tsx @@ -7,6 +7,7 @@ import type { ReviewInvoice, EditableField } from "./types"; interface InvoiceReviewCardProps { inv: ReviewInvoice; busy: boolean; + canSave: boolean; onChange: (uid: string, field: EditableField, value: string) => void; onSave: (inv: ReviewInvoice) => void; onDiscard: (uid: string) => void; @@ -17,6 +18,7 @@ const fieldCols = { xs: "1fr", sm: "1fr 1fr" }; export default function InvoiceReviewCard({ inv, busy, + canSave, onChange, onSave, onDiscard, @@ -96,7 +98,13 @@ export default function InvoiceReviewCard({ {/* Actions */} -