From f4e7108119d53a6b70f6e8af1fb6296b90f957bb Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Mon, 16 Mar 2026 01:14:40 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20melhora=20os=20dialogs=20e=20detalhes?= =?UTF-8?q?=20de=20lan=C3=A7amentos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dialogs/transaction-details-dialog.tsx | 260 ++++++------ .../basic-fields-section.tsx | 4 +- .../transaction-dialog/payer-section.tsx | 2 +- .../payment-method-section.tsx | 392 +++++++----------- .../split-settlement-section.tsx | 4 +- .../transaction-dialog/transaction-dialog.tsx | 124 +++--- .../components/page/transactions-page.tsx | 1 + 7 files changed, 350 insertions(+), 437 deletions(-) diff --git a/src/features/transactions/components/dialogs/transaction-details-dialog.tsx b/src/features/transactions/components/dialogs/transaction-details-dialog.tsx index 4561597..8e02acb 100644 --- a/src/features/transactions/components/dialogs/transaction-details-dialog.tsx +++ b/src/features/transactions/components/dialogs/transaction-details-dialog.tsx @@ -7,17 +7,15 @@ import { formatPeriod, } from "@/features/transactions/formatting-helpers"; import { TransactionTypeBadge } from "@/shared/components/transaction-type-badge"; +import { Badge } from "@/shared/components/ui/badge"; import { Button } from "@/shared/components/ui/button"; -import { - CardContent, - CardDescription, - CardHeader, -} from "@/shared/components/ui/card"; import { Dialog, DialogClose, DialogContent, + DialogDescription, DialogFooter, + DialogHeader, DialogTitle, } from "@/shared/components/ui/dialog"; import { Separator } from "@/shared/components/ui/separator"; @@ -30,12 +28,14 @@ interface TransactionDetailsDialogProps { open: boolean; onOpenChange: (open: boolean) => void; transaction: TransactionItem | null; + onEdit?: (transaction: TransactionItem) => void; } export function TransactionDetailsDialog({ open, onOpenChange, transaction, + onEdit, }: TransactionDetailsDialogProps) { if (!transaction) return null; @@ -54,139 +54,163 @@ export function TransactionDetailsDialog({ ? valorParcela * (totalParcelas - parcelaAtual) : 0; + const isBoleto = transaction.paymentMethod === "Boleto"; + + const handleEdit = () => { + onOpenChange(false); + onEdit?.(transaction); + }; + return ( - -
- -
- - #{transaction.id} - - - {formatDate(transaction.purchaseDate)} - -
-
+ + + {transaction.name} + + {formatDate(transaction.purchaseDate)} + + - -
-
    - +
    +
    +
      + - + + Forma de Pagamento + + + {getPaymentMethodIcon(transaction.paymentMethod)} + {transaction.paymentMethod} + + + + + + + +
    • + Tipo de Transação + +
    • + + +
    • + Responsável + {transaction.pagadorName} +
    • + +
    • + Status + + {transaction.isSettled ? "Pago" : "Pendente"} + +
    • + + {isBoleto && transaction.dueDate && ( + + )} + + {transaction.isDivided && (
    • - - Forma de Pagamento - - - {getPaymentMethodIcon(transaction.paymentMethod)} - - {transaction.paymentMethod} - - + Divisão + Dividido
    • + )} - + {transaction.note && ( +
    • + Notas + {transaction.note} +
    • + )} +
    - - -
  • - - Tipo de Transação - - + {isInstallment && ( +
  • +
  • + )} + + + {isInstallment && ( + )} -
  • - Responsável - - {transaction.pagadorName} - -
  • - + {transaction.recurrenceCount && ( + )} - {transaction.note && ( - - )} -
+ {!isInstallment && } -
    - {isInstallment && ( -
  • - -
  • - )} - - - - {isInstallment && ( - - )} - - {transaction.recurrenceCount && ( - - )} - - {!isInstallment && } - -
  • - Total da Compra - - {currencyFormatter.format(valorTotal)} - -
  • -
-
- - - - - - -
+
  • + Total da Compra + + {currencyFormatter.format(valorTotal)} + +
  • + +
    + + + {onEdit && !transaction.readonly && ( + + )} + + + +
    ); @@ -201,7 +225,7 @@ function DetailRow({ label, value }: DetailRowProps) { return (
  • {label} - {value} + {value}
  • ); } diff --git a/src/features/transactions/components/dialogs/transaction-dialog/basic-fields-section.tsx b/src/features/transactions/components/dialogs/transaction-dialog/basic-fields-section.tsx index 0eb36d1..ac5eb41 100644 --- a/src/features/transactions/components/dialogs/transaction-dialog/basic-fields-section.tsx +++ b/src/features/transactions/components/dialogs/transaction-dialog/basic-fields-section.tsx @@ -16,14 +16,14 @@ export function BasicFieldsSection({ return (
    - + onFieldChange("name", value)} estabelecimentos={estabelecimentos} placeholder="Ex.: Restaurante do Zé" - maxLength={20} + maxLength={60} required />
    diff --git a/src/features/transactions/components/dialogs/transaction-dialog/payer-section.tsx b/src/features/transactions/components/dialogs/transaction-dialog/payer-section.tsx index 3191858..a778806 100644 --- a/src/features/transactions/components/dialogs/transaction-dialog/payer-section.tsx +++ b/src/features/transactions/components/dialogs/transaction-dialog/payer-section.tsx @@ -44,7 +44,7 @@ export function PayerSection({ > {formState.payerId && diff --git a/src/features/transactions/components/dialogs/transaction-dialog/payment-method-section.tsx b/src/features/transactions/components/dialogs/transaction-dialog/payment-method-section.tsx index b170a96..465590d 100644 --- a/src/features/transactions/components/dialogs/transaction-dialog/payment-method-section.tsx +++ b/src/features/transactions/components/dialogs/transaction-dialog/payment-method-section.tsx @@ -44,7 +44,7 @@ function InlinePeriodPicker({ @@ -82,7 +82,6 @@ export function PaymentMethodSection({ "Transferência bancária", ].includes(formState.paymentMethod); - // Filtrar contas apenas do tipo "Pré-Pago | VR/VA" quando forma de pagamento for "Pré-Pago | VR/VA" const filteredContaOptions = formState.paymentMethod === "Pré-Pago | VR/VA" ? accountOptions.filter( @@ -90,270 +89,159 @@ export function PaymentMethodSection({ ) : accountOptions; + const hasSecondaryColumn = isCartaoSelected || showContaSelect; + return ( - <> +
    {!isUpdateMode ? ( -
    -
    + + onFieldChange("paymentMethod", value)} + - - - {formState.paymentMethod && ( - + {formState.paymentMethod && ( + + )} + + + + {PAYMENT_METHODS.map((method) => ( + + + + ))} + + +
    + ) : null} + + {isCartaoSelected ? ( +
    + + -
    - - {isCartaoSelected ? ( -
    - - - {formState.cardId ? ( - onFieldChange("period", value)} - /> - ) : null} -
    - ) : null} - - {!isCartaoSelected && showContaSelect ? ( -
    - - -
    + + + {formState.cardId ? ( + onFieldChange("period", value)} + /> ) : null}
    ) : null} - {isUpdateMode ? ( -
    - {isCartaoSelected ? ( -
    + + onFieldChange("cardId", value)} - > - - - {formState.cardId && - (() => { - const selectedOption = cardOptions.find( - (opt) => opt.value === formState.cardId, - ); - return selectedOption ? ( - - ) : null; - })()} - - - - {cardOptions.length === 0 ? ( -
    -

    - Nenhum cartão cadastrado -

    -
    - ) : ( - cardOptions.map((option) => ( - - - - )) - )} -
    - - {formState.cardId ? ( - onFieldChange("period", value)} - /> - ) : null} -
    - ) : null} - - {!isCartaoSelected && showContaSelect ? ( -
    - - -
    - ) : null} + +
    ) : null} - +
    ); } diff --git a/src/features/transactions/components/dialogs/transaction-dialog/split-settlement-section.tsx b/src/features/transactions/components/dialogs/transaction-dialog/split-settlement-section.tsx index 0edac5a..8930c1a 100644 --- a/src/features/transactions/components/dialogs/transaction-dialog/split-settlement-section.tsx +++ b/src/features/transactions/components/dialogs/transaction-dialog/split-settlement-section.tsx @@ -21,7 +21,7 @@ export function SplitAndSettlementSection({

    Dividir lançamento

    - Selecione para atribuir parte do valor a outro pagador. + Atribuir parte do valor a outro pagador.

    Marcar como pago

    - Indica que o lançamento já foi pago ou recebido. + Indica que o valor já foi pago.

    - +
    + - + - {!isUpdateMode ? ( - ) : null} - - - - - {showDueDate ? ( - - ) : null} - 0 - } - > - - - Condições e anotações - - - {!isUpdateMode ? ( - - ) : null} + + {showDueDate ? ( + + ) : null} + + {isUpdateMode ? ( - - + ) : ( + + + + Condições e anotações + + + + + + + )} +
    {errorMessage ? ( -

    {errorMessage}

    +

    {errorMessage}

    ) : null} - +