diff --git a/src/app/(dashboard)/accounts/layout.tsx b/src/app/(dashboard)/accounts/layout.tsx index 15fb99f..5a1ca6c 100644 --- a/src/app/(dashboard)/accounts/layout.tsx +++ b/src/app/(dashboard)/accounts/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Contas" diff --git a/src/app/(dashboard)/budgets/layout.tsx b/src/app/(dashboard)/budgets/layout.tsx index ab0990a..7785525 100644 --- a/src/app/(dashboard)/budgets/layout.tsx +++ b/src/app/(dashboard)/budgets/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Orçamentos" diff --git a/src/app/(dashboard)/calendar/layout.tsx b/src/app/(dashboard)/calendar/layout.tsx index f25ece7..f53c330 100644 --- a/src/app/(dashboard)/calendar/layout.tsx +++ b/src/app/(dashboard)/calendar/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Calendário" diff --git a/src/app/(dashboard)/cards/layout.tsx b/src/app/(dashboard)/cards/layout.tsx index a0ac936..2d841e1 100644 --- a/src/app/(dashboard)/cards/layout.tsx +++ b/src/app/(dashboard)/cards/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Cartões" diff --git a/src/app/(dashboard)/categories/layout.tsx b/src/app/(dashboard)/categories/layout.tsx index 369c330..f3add03 100644 --- a/src/app/(dashboard)/categories/layout.tsx +++ b/src/app/(dashboard)/categories/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Categorias" diff --git a/src/app/(dashboard)/changelog/layout.tsx b/src/app/(dashboard)/changelog/layout.tsx index 25fc1c0..d4779c2 100644 --- a/src/app/(dashboard)/changelog/layout.tsx +++ b/src/app/(dashboard)/changelog/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Changelog" diff --git a/src/app/(dashboard)/inbox/layout.tsx b/src/app/(dashboard)/inbox/layout.tsx index 78c3dc9..78eda03 100644 --- a/src/app/(dashboard)/inbox/layout.tsx +++ b/src/app/(dashboard)/inbox/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Pré-Lançamentos" diff --git a/src/app/(dashboard)/insights/layout.tsx b/src/app/(dashboard)/insights/layout.tsx index 4e3a77e..c16f177 100644 --- a/src/app/(dashboard)/insights/layout.tsx +++ b/src/app/(dashboard)/insights/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Insights" diff --git a/src/app/(dashboard)/notes/layout.tsx b/src/app/(dashboard)/notes/layout.tsx index ec49120..048976e 100644 --- a/src/app/(dashboard)/notes/layout.tsx +++ b/src/app/(dashboard)/notes/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Anotações" diff --git a/src/app/(dashboard)/payers/layout.tsx b/src/app/(dashboard)/payers/layout.tsx index b98f945..5131b00 100644 --- a/src/app/(dashboard)/payers/layout.tsx +++ b/src/app/(dashboard)/payers/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Pagadores" diff --git a/src/app/(dashboard)/reports/card-usage/layout.tsx b/src/app/(dashboard)/reports/card-usage/layout.tsx index 3533594..305a744 100644 --- a/src/app/(dashboard)/reports/card-usage/layout.tsx +++ b/src/app/(dashboard)/reports/card-usage/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Uso de Cartões" diff --git a/src/app/(dashboard)/reports/card-usage/page.tsx b/src/app/(dashboard)/reports/card-usage/page.tsx index 993ff27..a6904cc 100644 --- a/src/app/(dashboard)/reports/card-usage/page.tsx +++ b/src/app/(dashboard)/reports/card-usage/page.tsx @@ -71,7 +71,7 @@ export default async function RelatorioCartoesPage({
-

Nenhum cartão selecionado

+

Nenhum cartão selecionado

Selecione um cartão para ver os detalhes de uso.

diff --git a/src/app/(dashboard)/reports/category-trends/layout.tsx b/src/app/(dashboard)/reports/category-trends/layout.tsx index a224d3b..a5e6b89 100644 --- a/src/app/(dashboard)/reports/category-trends/layout.tsx +++ b/src/app/(dashboard)/reports/category-trends/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Tendências" diff --git a/src/app/(dashboard)/reports/establishments/layout.tsx b/src/app/(dashboard)/reports/establishments/layout.tsx index bd72f6f..3229542 100644 --- a/src/app/(dashboard)/reports/establishments/layout.tsx +++ b/src/app/(dashboard)/reports/establishments/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Top Estabelecimentos" diff --git a/src/app/(dashboard)/reports/installment-analysis/layout.tsx b/src/app/(dashboard)/reports/installment-analysis/layout.tsx index 3c1e076..eb28770 100644 --- a/src/app/(dashboard)/reports/installment-analysis/layout.tsx +++ b/src/app/(dashboard)/reports/installment-analysis/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Análise de Parcelas" diff --git a/src/app/(dashboard)/settings/layout.tsx b/src/app/(dashboard)/settings/layout.tsx index 7720d91..9f0bbec 100644 --- a/src/app/(dashboard)/settings/layout.tsx +++ b/src/app/(dashboard)/settings/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -
+
} title="Ajustes" diff --git a/src/app/(dashboard)/settings/page.tsx b/src/app/(dashboard)/settings/page.tsx index 4e404b4..5b1d9a0 100644 --- a/src/app/(dashboard)/settings/page.tsx +++ b/src/app/(dashboard)/settings/page.tsx @@ -67,7 +67,7 @@ export default async function Page() {
-

Preferências

+

Preferências

Personalize sua experiência no OpenMonetis ajustando as configurações de acordo com suas necessidades. @@ -92,7 +92,9 @@ export default async function Page() {

-

OpenMonetis Companion

+

+ OpenMonetis Companion +

Android @@ -114,7 +116,7 @@ export default async function Page() {
-

Alterar nome

+

Alterar nome

Atualize como seu nome aparece no OpenMonetis. Esse nome pode ser exibido em diferentes seções do app e em comunicações. @@ -130,7 +132,7 @@ export default async function Page() {

-

Alterar senha

+

Alterar senha

Defina uma nova senha para sua conta. Guarde-a em local seguro. @@ -146,7 +148,7 @@ export default async function Page() {

-

Passkeys

+

Passkeys

Passkeys permitem login sem senha, usando biometria (Face ID, Touch ID, Windows Hello) ou chaves de segurança. @@ -162,7 +164,7 @@ export default async function Page() {

-

Alterar e-mail

+

Alterar e-mail

Atualize o e-mail associado à sua conta. Você precisará confirmar os links enviados para o novo e também para o e-mail @@ -182,7 +184,7 @@ export default async function Page() {

-

+

Ações perigosas

diff --git a/src/app/(dashboard)/transactions/layout.tsx b/src/app/(dashboard)/transactions/layout.tsx index 2cbc7c0..2f68a21 100644 --- a/src/app/(dashboard)/transactions/layout.tsx +++ b/src/app/(dashboard)/transactions/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( -

+
} title="Lançamentos" diff --git a/src/app/(landing-page)/page.tsx b/src/app/(landing-page)/page.tsx index 0e767d1..75c57ee 100644 --- a/src/app/(landing-page)/page.tsx +++ b/src/app/(landing-page)/page.tsx @@ -120,13 +120,13 @@ export default async function Page() {
-
+
Projeto Open Source -

+

Suas finanças, do seu jeito

@@ -207,9 +207,7 @@ export default async function Page() { className="flex flex-col items-center text-center gap-1.5" > - - {value} - + {value} {label} @@ -229,7 +227,7 @@ export default async function Page() { Conheça as telas -

+

Veja o que você pode fazer

@@ -254,7 +252,7 @@ export default async function Page() { O que tem aqui -

+

Funcionalidades que importam

@@ -282,7 +280,7 @@ export default async function Page() { />

-

+

{feature.title}

@@ -298,7 +296,7 @@ export default async function Page() {

-

+

Também inclui

@@ -319,7 +317,7 @@ export default async function Page() { />
-

+

{feature.title}

@@ -346,7 +344,7 @@ export default async function Page() { Mobile -

+

Use o OpenMonetis no celular sem perder o fluxo

@@ -384,7 +382,7 @@ export default async function Page() { PWA instalável -

+

Leve o OpenMonetis para a tela inicial

@@ -430,7 +428,7 @@ export default async function Page() { Companion Android

-

+

Capture, envie e revise no mesmo fluxo

@@ -529,7 +527,7 @@ export default async function Page() { Stack técnica -

+

O que roda por baixo

@@ -556,7 +554,7 @@ export default async function Page() { />

-

+

{item.title}

@@ -582,7 +580,7 @@ export default async function Page() { Como usar -

+

Rode no seu computador

@@ -617,7 +615,7 @@ export default async function Page() { Para quem é? -

+

Feito para quem gosta de controle

@@ -644,7 +642,7 @@ export default async function Page() { />

-

{item.title}

+

{item.title}

{item.description}

@@ -664,7 +662,7 @@ export default async function Page() {
-

+

Pronto para testar?

@@ -715,7 +713,7 @@ export default async function Page() {

-

Projeto

+

Projeto

  • -

    Companion

    +

    Companion

    • ) : null} -

      {accountName}

      +

      + {accountName} +

      {(excludeFromBalance || excludeInitialBalanceFromIncome) && ( diff --git a/src/features/accounts/components/account-statement-card.tsx b/src/features/accounts/components/account-statement-card.tsx index 12b16d0..750a8db 100644 --- a/src/features/accounts/components/account-statement-card.tsx +++ b/src/features/accounts/components/account-statement-card.tsx @@ -68,7 +68,7 @@ export function AccountStatementCard({
    ) : null}
    -

    +

    {accountName}

    @@ -81,12 +81,12 @@ export function AccountStatementCard({ {/* Linha 2 — saldo final (hero) */}

    -

    +

    Saldo ao final do período

    - - PDF Protegido - + PDF Protegido
    ); } @@ -153,7 +151,7 @@ export function AttachmentGridItem({ -

    +

    {attachment.fileName}

    @@ -180,25 +178,21 @@ export function AttachmentGridItem({ {attachment.transactionName}
    - + {formatCurrency(amount)}
    {/* Footer: Tamanho + Botão Detalhes */}
    - + {formatBytes(attachment.fileSize)} diff --git a/src/features/attachments/components/attachment-preview.tsx b/src/features/attachments/components/attachment-preview.tsx index caed828..4466cdd 100644 --- a/src/features/attachments/components/attachment-preview.tsx +++ b/src/features/attachments/components/attachment-preview.tsx @@ -105,7 +105,7 @@ export function AttachmentPreview({ > - + {currentIndex + 1} / {attachments.length}
    @@ -113,7 +113,7 @@ export function BillPaymentDialog({
diff --git a/src/features/dashboard/components/category-breakdown/category-breakdown-widget-view.tsx b/src/features/dashboard/components/category-breakdown/category-breakdown-widget-view.tsx index 2b0228d..1c234f3 100644 --- a/src/features/dashboard/components/category-breakdown/category-breakdown-widget-view.tsx +++ b/src/features/dashboard/components/category-breakdown/category-breakdown-widget-view.tsx @@ -281,12 +281,12 @@ export function CategoryBreakdownWidgetView({
{category.percentageChange !== null ? ( {hasIncrease ? ( diff --git a/src/features/dashboard/components/category-history-widget.tsx b/src/features/dashboard/components/category-history-widget.tsx index 7e7edc1..a14960d 100644 --- a/src/features/dashboard/components/category-history-widget.tsx +++ b/src/features/dashboard/components/category-history-widget.tsx @@ -197,7 +197,9 @@ export function CategoryHistoryWidget({ data }: CategoryHistoryWidgetProps) { style={{ backgroundColor: color }} /> )} - {category.name} + + {category.name} +
- + {formatCurrency(value)}
diff --git a/src/features/dashboard/components/dashboard-metrics-cards.tsx b/src/features/dashboard/components/dashboard-metrics-cards.tsx index 30b03d6..ac80de0 100644 --- a/src/features/dashboard/components/dashboard-metrics-cards.tsx +++ b/src/features/dashboard/components/dashboard-metrics-cards.tsx @@ -116,13 +116,14 @@ const getPercentChange = (current: number, previous: number): string => { } const change = ((current - previous) / Math.abs(previous)) * 100; - return Number.isFinite(change) && Math.abs(change) < 1000000 - ? formatPercentage(change, { - maximumFractionDigits: 1, - minimumFractionDigits: 1, - signDisplay: "always", - }) - : "—"; + if (!Number.isFinite(change)) return "—"; + if (change > 999) return "+999%"; + if (change < -999) return "-999%"; + return formatPercentage(change, { + maximumFractionDigits: 2, + minimumFractionDigits: 2, + signDisplay: "always", + }); }; const getTrendBadgeClass = (trend: Trend, invertTrend: boolean): string => { @@ -159,7 +160,7 @@ export function DashboardMetricsCards({ metrics }: DashboardMetricsCardsProps) {
- + {label}
@@ -195,7 +196,7 @@ export function DashboardMetricsCards({ metrics }: DashboardMetricsCardsProps) {
no mês anterior diff --git a/src/features/dashboard/components/dashboard-welcome.tsx b/src/features/dashboard/components/dashboard-welcome.tsx index 32649b1..3bea253 100644 --- a/src/features/dashboard/components/dashboard-welcome.tsx +++ b/src/features/dashboard/components/dashboard-welcome.tsx @@ -1,17 +1,21 @@ import { formatCurrentDate, getGreeting } from "./welcome-widget"; -export function DashboardWelcome({ name }: { name?: string | null }) { +type DashboardWelcomeProps = { + name?: string | null; +}; + +export function DashboardWelcome({ name }: DashboardWelcomeProps) { const displayName = name && name.trim().length > 0 ? name : "Administrador"; const formattedDate = formatCurrentDate(); const greeting = getGreeting(); return (
-
-

+
+

{greeting}, {displayName}

-

{formattedDate}

+

{formattedDate}

); diff --git a/src/features/dashboard/components/goals-progress/goal-progress-item.tsx b/src/features/dashboard/components/goals-progress/goal-progress-item.tsx index 4ea14bc..9a7c2e0 100644 --- a/src/features/dashboard/components/goals-progress/goal-progress-item.tsx +++ b/src/features/dashboard/components/goals-progress/goal-progress-item.tsx @@ -44,8 +44,9 @@ export function GoalProgressItem({ {item.categoryName}

- de{" "} - + {" "} + de{" "} + {formatGoalProgressPercentage(percentageDelta, true)} diff --git a/src/features/dashboard/components/installment-analysis/installment-analysis-page.tsx b/src/features/dashboard/components/installment-analysis/installment-analysis-page.tsx index 093ce12..f60aebe 100644 --- a/src/features/dashboard/components/installment-analysis/installment-analysis-page.tsx +++ b/src/features/dashboard/components/installment-analysis/installment-analysis-page.tsx @@ -132,12 +132,12 @@ export function InstallmentAnalysisPage({ {/* Card de resumo principal */} -

+

Se você pagar tudo que está selecionado:

{selectedCount} {selectedCount === 1 ? "parcela" : "parcelas"}{" "} @@ -167,7 +167,7 @@ export function InstallmentAnalysisPage({ {/* Seção de Lançamentos Parcelados */} {data.installmentGroups.length > 0 && ( -

+
{data.installmentGroups.map((group) => ( ) : null}
- +

@@ -67,7 +70,7 @@ export function InstallmentExpenseListItem({ {" · Restante "} {" "} ({remainingInstallments})

diff --git a/src/features/dashboard/components/invoices/invoice-list-item.tsx b/src/features/dashboard/components/invoices/invoice-list-item.tsx index 5f7d3da..fcb0672 100644 --- a/src/features/dashboard/components/invoices/invoice-list-item.tsx +++ b/src/features/dashboard/components/invoices/invoice-list-item.tsx @@ -116,7 +116,10 @@ export function InvoiceListItem({ invoice, onPay }: InvoiceListItemProps) {

- +
))} @@ -144,7 +147,7 @@ export function InvoiceListItem({ invoice, onPay }: InvoiceListItemProps) { paymentTooltipLabel ? ( - + {paymentInfo.label} @@ -153,7 +156,9 @@ export function InvoiceListItem({ invoice, onPay }: InvoiceListItemProps) { ) : ( - {paymentInfo.label} + + {paymentInfo.label} + ) ) : null}
@@ -161,7 +166,10 @@ export function InvoiceListItem({ invoice, onPay }: InvoiceListItemProps) {
- +
@@ -130,7 +130,7 @@ export function InvoicePaymentDialog({
diff --git a/src/features/dashboard/components/my-accounts-widget.tsx b/src/features/dashboard/components/my-accounts-widget.tsx index eedddbe..4eff4c5 100644 --- a/src/features/dashboard/components/my-accounts-widget.tsx +++ b/src/features/dashboard/components/my-accounts-widget.tsx @@ -78,7 +78,7 @@ export function MyAccountsWidget({

Saldo Total

- +
{excludedAccountsCount > 0 ? ( @@ -137,7 +137,7 @@ export function MyAccountsWidget({
) : (
    - {displayedAccounts.map((account) => { + {displayedAccounts.map((account, index) => { const logoSrc = resolveLogoSrc(account.logo); return ( @@ -154,6 +154,7 @@ export function MyAccountsWidget({ fill sizes="38px" className="object-contain rounded-full" + priority={index === 0} /> ) : null}
@@ -199,7 +200,10 @@ export function MyAccountsWidget({
- +
); diff --git a/src/features/dashboard/components/payers-widget.tsx b/src/features/dashboard/components/payers-widget.tsx index d443918..fae2e57 100644 --- a/src/features/dashboard/components/payers-widget.tsx +++ b/src/features/dashboard/components/payers-widget.tsx @@ -83,10 +83,13 @@ export function PayersWidget({ payers }: PayersWidgetProps) {
- + {percentageChange !== null && ( 0 ? "text-destructive" : percentageChange < 0 diff --git a/src/features/dashboard/components/payment-overview-widget.tsx b/src/features/dashboard/components/payment-overview-widget.tsx index 2de4276..4a0bb7b 100644 --- a/src/features/dashboard/components/payment-overview-widget.tsx +++ b/src/features/dashboard/components/payment-overview-widget.tsx @@ -8,11 +8,15 @@ import { PaymentOverviewWidgetView } from "./payment-overview/payment-overview-w type PaymentOverviewWidgetProps = { paymentConditionsData: PaymentConditionsData; paymentMethodsData: PaymentMethodsData; + period: string; + adminPayerSlug: string | null; }; export function PaymentOverviewWidget({ paymentConditionsData, paymentMethodsData, + period, + adminPayerSlug, }: PaymentOverviewWidgetProps) { const { activeTab, handleTabChange } = usePaymentOverviewWidgetController(); @@ -22,6 +26,8 @@ export function PaymentOverviewWidget({ paymentConditionsData={paymentConditionsData} paymentMethodsData={paymentMethodsData} onTabChange={handleTabChange} + period={period} + adminPayerSlug={adminPayerSlug} /> ); } diff --git a/src/features/dashboard/components/payment-overview/payment-breakdown-list-item.tsx b/src/features/dashboard/components/payment-overview/payment-breakdown-list-item.tsx index 2f37786..c645fe4 100644 --- a/src/features/dashboard/components/payment-overview/payment-breakdown-list-item.tsx +++ b/src/features/dashboard/components/payment-overview/payment-breakdown-list-item.tsx @@ -1,3 +1,5 @@ +import { RiExternalLinkLine } from "@remixicon/react"; +import Link from "next/link"; import type { ReactNode } from "react"; import { formatPaymentBreakdownPercentage, @@ -17,6 +19,7 @@ export type PaymentBreakdownListItemData = { amount: number; transactions: number; percentage: number; + href?: string; }; type PaymentBreakdownListItemProps = { @@ -40,8 +43,21 @@ export function PaymentBreakdownListItem({
-

{item.title}

- + {item.href ? ( + + {item.title} + + + ) : ( +

{item.title}

+ )} +
diff --git a/src/features/dashboard/components/payment-overview/payment-conditions-widget.tsx b/src/features/dashboard/components/payment-overview/payment-conditions-widget.tsx index 189d398..73bbe60 100644 --- a/src/features/dashboard/components/payment-overview/payment-conditions-widget.tsx +++ b/src/features/dashboard/components/payment-overview/payment-conditions-widget.tsx @@ -1,6 +1,8 @@ import { RiCheckLine, RiSlideshowLine } from "@remixicon/react"; import type { PaymentConditionsData } from "@/features/dashboard/payments/payment-conditions-queries"; import { getConditionIcon } from "@/shared/utils/icons"; +import { formatPeriodForUrl } from "@/shared/utils/period"; +import { slugify } from "@/shared/utils/string"; import { PaymentBreakdownList, type PaymentBreakdownListItemData, @@ -8,6 +10,8 @@ import { type PaymentConditionsWidgetProps = { data: PaymentConditionsData; + period: string; + adminPayerSlug: string | null; }; const resolveConditionIcon = (condition: string) => @@ -15,16 +19,27 @@ const resolveConditionIcon = (condition: string) => export function PaymentConditionsWidget({ data, + period, + adminPayerSlug, }: PaymentConditionsWidgetProps) { const items: PaymentBreakdownListItemData[] = data.conditions.map( - (condition) => ({ - id: condition.condition, - title: condition.condition, - icon: resolveConditionIcon(condition.condition), - amount: condition.amount, - transactions: condition.transactions, - percentage: condition.percentage, - }), + (condition) => { + const params = new URLSearchParams({ + type: slugify("Despesa"), + condition: slugify(condition.condition), + periodo: formatPeriodForUrl(period), + }); + if (adminPayerSlug) params.set("payer", adminPayerSlug); + return { + id: condition.condition, + title: condition.condition, + icon: resolveConditionIcon(condition.condition), + amount: condition.amount, + transactions: condition.transactions, + percentage: condition.percentage, + href: `/transactions?${params.toString()}`, + }; + }, ); return ( diff --git a/src/features/dashboard/components/payment-overview/payment-methods-widget.tsx b/src/features/dashboard/components/payment-overview/payment-methods-widget.tsx index cf84b59..a056b47 100644 --- a/src/features/dashboard/components/payment-overview/payment-methods-widget.tsx +++ b/src/features/dashboard/components/payment-overview/payment-methods-widget.tsx @@ -1,6 +1,8 @@ import { RiBankCard2Line, RiMoneyDollarCircleLine } from "@remixicon/react"; import type { PaymentMethodsData } from "@/features/dashboard/payments/payment-methods-queries"; import { getPaymentMethodIcon } from "@/shared/utils/icons"; +import { formatPeriodForUrl } from "@/shared/utils/period"; +import { slugify } from "@/shared/utils/string"; import { PaymentBreakdownList, type PaymentBreakdownListItemData, @@ -8,6 +10,8 @@ import { type PaymentMethodsWidgetProps = { data: PaymentMethodsData; + period: string; + adminPayerSlug: string | null; }; const resolvePaymentMethodIcon = (paymentMethod: string) => @@ -15,15 +19,28 @@ const resolvePaymentMethodIcon = (paymentMethod: string) => ); -export function PaymentMethodsWidget({ data }: PaymentMethodsWidgetProps) { - const items: PaymentBreakdownListItemData[] = data.methods.map((method) => ({ - id: method.paymentMethod, - title: method.paymentMethod, - icon: resolvePaymentMethodIcon(method.paymentMethod), - amount: method.amount, - transactions: method.transactions, - percentage: method.percentage, - })); +export function PaymentMethodsWidget({ + data, + period, + adminPayerSlug, +}: PaymentMethodsWidgetProps) { + const items: PaymentBreakdownListItemData[] = data.methods.map((method) => { + const params = new URLSearchParams({ + type: slugify("Despesa"), + payment: slugify(method.paymentMethod), + periodo: formatPeriodForUrl(period), + }); + if (adminPayerSlug) params.set("payer", adminPayerSlug); + return { + id: method.paymentMethod, + title: method.paymentMethod, + icon: resolvePaymentMethodIcon(method.paymentMethod), + amount: method.amount, + transactions: method.transactions, + percentage: method.percentage, + href: `/transactions?${params.toString()}`, + }; + }); return ( void; + period: string; + adminPayerSlug: string | null; }; export function PaymentOverviewWidgetView({ @@ -23,6 +25,8 @@ export function PaymentOverviewWidgetView({ paymentConditionsData, paymentMethodsData, onTabChange, + period, + adminPayerSlug, }: PaymentOverviewWidgetViewProps) { return ( @@ -38,11 +42,19 @@ export function PaymentOverviewWidgetView({ - + - + ); diff --git a/src/features/dashboard/components/payment-status/payment-status-category-section.tsx b/src/features/dashboard/components/payment-status/payment-status-category-section.tsx index cb6942e..907f9c8 100644 --- a/src/features/dashboard/components/payment-status/payment-status-category-section.tsx +++ b/src/features/dashboard/components/payment-status/payment-status-category-section.tsx @@ -24,10 +24,7 @@ export function PaymentStatusCategorySection({
{title} - +
@@ -35,13 +32,13 @@ export function PaymentStatusCategorySection({
- + confirmados
- + pendentes
diff --git a/src/features/dashboard/components/purchases-by-category-widget.tsx b/src/features/dashboard/components/purchases-by-category-widget.tsx index 687a425..c2f53d4 100644 --- a/src/features/dashboard/components/purchases-by-category-widget.tsx +++ b/src/features/dashboard/components/purchases-by-category-widget.tsx @@ -178,7 +178,10 @@ export function PurchasesByCategoryWidget({
- +
); diff --git a/src/features/dashboard/components/recurring-expenses-widget.tsx b/src/features/dashboard/components/recurring-expenses-widget.tsx index 9b848f7..59b0868 100644 --- a/src/features/dashboard/components/recurring-expenses-widget.tsx +++ b/src/features/dashboard/components/recurring-expenses-widget.tsx @@ -45,7 +45,7 @@ export function RecurringExpensesWidget({ {expense.name}

- +
diff --git a/src/features/dashboard/components/top-establishments-widget.tsx b/src/features/dashboard/components/top-establishments-widget.tsx index bbddea3..e3742a7 100644 --- a/src/features/dashboard/components/top-establishments-widget.tsx +++ b/src/features/dashboard/components/top-establishments-widget.tsx @@ -48,7 +48,10 @@ export function TopEstablishmentsWidget({
- +
); diff --git a/src/features/dashboard/components/top-expenses-widget.tsx b/src/features/dashboard/components/top-expenses-widget.tsx index c0cf92d..fddf358 100644 --- a/src/features/dashboard/components/top-expenses-widget.tsx +++ b/src/features/dashboard/components/top-expenses-widget.tsx @@ -113,7 +113,10 @@ export function TopExpensesWidget({
- +
); diff --git a/src/features/inbox/components/inbox-details-dialog.tsx b/src/features/inbox/components/inbox-details-dialog.tsx index b7ae91a..0e5d84f 100644 --- a/src/features/inbox/components/inbox-details-dialog.tsx +++ b/src/features/inbox/components/inbox-details-dialog.tsx @@ -67,7 +67,7 @@ export function InboxDetailsDialog({
-

+

Notificação Original

{item.originalTitle && ( diff --git a/src/features/insights/components/insights-grid.tsx b/src/features/insights/components/insights-grid.tsx index 56dcd58..caa415e 100644 --- a/src/features/insights/components/insights-grid.tsx +++ b/src/features/insights/components/insights-grid.tsx @@ -82,7 +82,7 @@ export function InsightsGrid({ insights }: InsightsGridProps) {
- + {categoryConfig.title}
diff --git a/src/features/insights/components/insights-page.tsx b/src/features/insights/components/insights-page.tsx index 099dcae..90ebd93 100644 --- a/src/features/insights/components/insights-page.tsx +++ b/src/features/insights/components/insights-page.tsx @@ -301,7 +301,7 @@ function ErrorState({ return (
-

{title}

+

{title}

{error}

-

+

{formatCurrency(summary.paymentSplits.instant)}

diff --git a/src/features/payers/components/details/payer-history-card.tsx b/src/features/payers/components/details/payer-history-card.tsx index da83da0..82ff394 100644 --- a/src/features/payers/components/details/payer-history-card.tsx +++ b/src/features/payers/components/details/payer-history-card.tsx @@ -63,7 +63,7 @@ export function PayerHistoryCard({ data }: PagadorHistoryCardProps) { return ( - + Evolução (últimos 6 meses)

diff --git a/src/features/payers/components/details/payer-info-card.tsx b/src/features/payers/components/details/payer-info-card.tsx index 5a5a3ec..2213aa1 100644 --- a/src/features/payers/components/details/payer-info-card.tsx +++ b/src/features/payers/components/details/payer-info-card.tsx @@ -31,7 +31,7 @@ export function PagadorInfoCard({ payer }: PayerInfoCardProps) { return ( - + Detalhes do pagador @@ -106,7 +106,7 @@ export function PagadorInfoCard({ payer }: PayerInfoCardProps) { const resolveRoleLabel = (role: string | null) => { if (role === PAYER_ROLE_ADMIN) return "Administrador"; - return "Payer"; + return "Pagador"; }; type InfoItemProps = { diff --git a/src/features/payers/components/details/payer-leave-share-card.tsx b/src/features/payers/components/details/payer-leave-share-card.tsx index 6e5ecda..63c3f6c 100644 --- a/src/features/payers/components/details/payer-leave-share-card.tsx +++ b/src/features/payers/components/details/payer-leave-share-card.tsx @@ -53,7 +53,7 @@ export function PayerLeaveShareCard({ return ( - + Acesso Compartilhado

diff --git a/src/features/payers/components/details/payer-monthly-summary-card.tsx b/src/features/payers/components/details/payer-monthly-summary-card.tsx index 8b745d0..4b64fbf 100644 --- a/src/features/payers/components/details/payer-monthly-summary-card.tsx +++ b/src/features/payers/components/details/payer-monthly-summary-card.tsx @@ -51,7 +51,7 @@ export function PayerMonthlySummaryCard({ return ( - Totais do mês + Totais do mês

{periodLabel} - Despesas por forma de pagamento

@@ -65,7 +65,7 @@ export function PayerMonthlySummaryCard({
@@ -100,7 +100,7 @@ export function PayerMonthlySummaryCard({ totalBase > 0 ? Math.round((entry.value / totalBase) * 100) : 0; return (
- + {percent}% das despesas diff --git a/src/features/payers/components/details/payer-sharing-card.tsx b/src/features/payers/components/details/payer-sharing-card.tsx index f6b56ad..15908f8 100644 --- a/src/features/payers/components/details/payer-sharing-card.tsx +++ b/src/features/payers/components/details/payer-sharing-card.tsx @@ -84,7 +84,9 @@ export function PayerSharingCard({ return ( - Compartilhamentos + + Compartilhamentos +

Compartilhe o código abaixo com outra pessoa. Ela poderá adicioná-lo na página de pagadores usando a opção Adicionar por código para ter diff --git a/src/features/payers/components/payer-card.tsx b/src/features/payers/components/payer-card.tsx index 2298357..4be439c 100644 --- a/src/features/payers/components/payer-card.tsx +++ b/src/features/payers/components/payer-card.tsx @@ -42,9 +42,7 @@ export function PayerCard({ payer, onEdit, onRemove }: PayerCardProps) { {/* Nome e badges */}

-

- {payer.name} -

+

{payer.name}

{isAdmin ? ( ) : null} diff --git a/src/features/payers/components/payer-dialog.tsx b/src/features/payers/components/payer-dialog.tsx index 9fdd9e6..8c9d742 100644 --- a/src/features/payers/components/payer-dialog.tsx +++ b/src/features/payers/components/payer-dialog.tsx @@ -119,7 +119,7 @@ export function PayerDialog({ const payerId = payer?.id; if (mode === "update" && !payerId) { - const message = "Payer inválido."; + const message = "Pagador inválido."; setErrorMessage(message); toast.error(message); return; diff --git a/src/features/reports/components/cards/card-usage-chart.tsx b/src/features/reports/components/cards/card-usage-chart.tsx index 261d809..78e045d 100644 --- a/src/features/reports/components/cards/card-usage-chart.tsx +++ b/src/features/reports/components/cards/card-usage-chart.tsx @@ -142,7 +142,7 @@ export function CardUsageChart({ data, limit, card }: CardUsageChartProps) { Uso - + {formatCurrency(value, { maximumFractionDigits: 0, minimumFractionDigits: 0, @@ -154,7 +154,7 @@ export function CardUsageChart({ data, limit, card }: CardUsageChartProps) { % do Limite - + {formatPercentage(usagePercent, { maximumFractionDigits: 0, minimumFractionDigits: 0, diff --git a/src/features/reports/components/cards/cards-overview.tsx b/src/features/reports/components/cards/cards-overview.tsx index f6a2b1f..b2d6f80 100644 --- a/src/features/reports/components/cards/cards-overview.tsx +++ b/src/features/reports/components/cards/cards-overview.tsx @@ -67,11 +67,11 @@ export function CardsOverview({ data }: CardsOverviewProps) {

{card.title}

{card.isMoney ? ( ) : ( -

+

{formatPercentage(card.value, { maximumFractionDigits: 0, minimumFractionDigits: 0, @@ -83,7 +83,7 @@ export function CardsOverview({ data }: CardsOverviewProps) { ))}

-

Meus cartões

+

Meus cartões

{/* Cards list */}
@@ -116,7 +116,7 @@ export function CardsOverview({ data }: CardsOverviewProps) {
- + {card.name} {brandAsset && ( @@ -129,7 +129,7 @@ export function CardsOverview({ data }: CardsOverviewProps) { /> )}
-

+

{formatCurrency(card.currentUsage)} /{" "} {formatCurrency(card.limit)}

@@ -141,7 +141,7 @@ export function CardsOverview({ data }: CardsOverviewProps) { `[&>div]:${getUsageColor(card.usagePercent)}`, )} /> - + {formatPercentage(card.usagePercent, { maximumFractionDigits: 0, minimumFractionDigits: 0, diff --git a/src/features/reports/components/category-cell.tsx b/src/features/reports/components/category-cell.tsx index 82d0fb7..dd792b2 100644 --- a/src/features/reports/components/category-cell.tsx +++ b/src/features/reports/components/category-cell.tsx @@ -53,7 +53,9 @@ export function CategoryCell({ > {isIncrease && } {isDecrease && } - {formatPercentageChange(percentageChange)} + + {formatPercentageChange(percentageChange)} +
)}
diff --git a/src/features/reports/components/category-report-chart.tsx b/src/features/reports/components/category-report-chart.tsx index 51447fa..fe4b4d6 100644 --- a/src/features/reports/components/category-report-chart.tsx +++ b/src/features/reports/components/category-report-chart.tsx @@ -73,7 +73,7 @@ function AreaTooltip({ {entry.name}
- + {currencyFormatter.format(Number(entry.value))}
diff --git a/src/features/reports/components/category-table.tsx b/src/features/reports/components/category-table.tsx index ab76c22..9170a83 100644 --- a/src/features/reports/components/category-table.tsx +++ b/src/features/reports/components/category-table.tsx @@ -78,12 +78,12 @@ export function CategoryTable({ {periods.map((period) => ( {formatPeriodLabel(period)} ))} - +
Média @@ -100,7 +100,7 @@ export function CategoryTable({
- + Total @@ -128,7 +128,7 @@ export function CategoryTable({ /> {category.name} @@ -149,7 +149,7 @@ export function CategoryTable({ ); })} - + {(() => { const nonZeroCount = periods.filter( (p) => (category.monthlyData.get(p)?.amount ?? 0) > 0, @@ -178,10 +178,10 @@ export function CategoryTable({ ); })} - + {formatCurrency(sectionTotals.averageMonthlyTotal)} - + {formatCurrency(sectionTotals.grandTotal)} diff --git a/src/features/reports/components/establishments/highlights-cards.tsx b/src/features/reports/components/establishments/highlights-cards.tsx index 541c0d9..0cca1be 100644 --- a/src/features/reports/components/establishments/highlights-cards.tsx +++ b/src/features/reports/components/establishments/highlights-cards.tsx @@ -19,7 +19,7 @@ export function HighlightsCards({ summary }: HighlightsCardsProps) {

Mais Frequente

-

+

{summary.mostFrequent || "—"}

@@ -35,7 +35,7 @@ export function HighlightsCards({ summary }: HighlightsCardsProps) {

Maior Gasto Total

-

+

{summary.highestSpending || "—"}

diff --git a/src/features/reports/components/establishments/summary-cards.tsx b/src/features/reports/components/establishments/summary-cards.tsx index e869bd8..7c4c466 100644 --- a/src/features/reports/components/establishments/summary-cards.tsx +++ b/src/features/reports/components/establishments/summary-cards.tsx @@ -53,16 +53,14 @@ export function SummaryCards({ summary }: SummaryCardsProps) {
-

- {card.title} -

+

{card.title}

{card.isMoney ? ( ) : ( -

{card.value}

+

{card.value}

)}

{card.description} diff --git a/src/features/settings/components/api-tokens-form.tsx b/src/features/settings/components/api-tokens-form.tsx index 34aa16c..9ed686e 100644 --- a/src/features/settings/components/api-tokens-form.tsx +++ b/src/features/settings/components/api-tokens-form.tsx @@ -139,7 +139,7 @@ export function ApiTokensForm({ tokens }: ApiTokensFormProps) {

-

Dispositivos conectados

+

Dispositivos conectados

Gerencie os dispositivos que podem enviar notificações para o OpenMonetis. diff --git a/src/features/settings/components/changelog-tab.tsx b/src/features/settings/components/changelog-tab.tsx index b9151d3..84d4b22 100644 --- a/src/features/settings/components/changelog-tab.tsx +++ b/src/features/settings/components/changelog-tab.tsx @@ -32,7 +32,7 @@ export function ChangelogTab({ versions }: { versions: ChangelogVersion[] }) { {versions.map((version) => (

-

v{version.version}

+

v{version.version}

{version.date} diff --git a/src/features/settings/components/delete-account-form.tsx b/src/features/settings/components/delete-account-form.tsx index 9904877..7e1a193 100644 --- a/src/features/settings/components/delete-account-form.tsx +++ b/src/features/settings/components/delete-account-form.tsx @@ -84,7 +84,7 @@ export function DeleteAccountForm() {
-

Zerar conta

+

Zerar conta

Apaga todos os dados do OpenMonetis e deixa sua conta no estado inicial, mantendo seu login e credenciais de acesso. @@ -120,7 +120,7 @@ export function DeleteAccountForm() {

-

Deletar conta

+

Deletar conta

Remove seu usuário e todos os dados associados de forma permanente. diff --git a/src/features/settings/components/passkeys-form.tsx b/src/features/settings/components/passkeys-form.tsx index ab181d6..23dec11 100644 --- a/src/features/settings/components/passkeys-form.tsx +++ b/src/features/settings/components/passkeys-form.tsx @@ -197,7 +197,7 @@ export function PasskeysForm() {

-

Suas passkeys

+

Suas passkeys

Gerencie suas passkeys para login sem senha.

diff --git a/src/features/settings/components/preferences-form.tsx b/src/features/settings/components/preferences-form.tsx index b51d001..e46a8b4 100644 --- a/src/features/settings/components/preferences-form.tsx +++ b/src/features/settings/components/preferences-form.tsx @@ -145,7 +145,7 @@ export function PreferencesForm({ {/* Seção: Lançamentos */}
-

Lançamentos

+

Lançamentos

Configurações de exibição da tabela de movimentações.

diff --git a/src/features/settings/components/update-password-form.tsx b/src/features/settings/components/update-password-form.tsx index e8a3321..ebf73bd 100644 --- a/src/features/settings/components/update-password-form.tsx +++ b/src/features/settings/components/update-password-form.tsx @@ -131,7 +131,7 @@ export function UpdatePasswordForm({ authProvider }: UpdatePasswordFormProps) {
-

+

Alteração de senha não disponível

diff --git a/src/features/transactions/components/attachments/attachment-item.tsx b/src/features/transactions/components/attachments/attachment-item.tsx index 2f520e3..5b2cedc 100644 --- a/src/features/transactions/components/attachments/attachment-item.tsx +++ b/src/features/transactions/components/attachments/attachment-item.tsx @@ -54,6 +54,7 @@ function AttachmentPreview({

diff --git a/src/features/transactions/components/attachments/attachment-section.tsx b/src/features/transactions/components/attachments/attachment-section.tsx index 3fa89b5..4481bca 100644 --- a/src/features/transactions/components/attachments/attachment-section.tsx +++ b/src/features/transactions/components/attachments/attachment-section.tsx @@ -44,8 +44,10 @@ export function AttachmentSection({ } = useTransactionAttachments(transactionId); useEffect(() => { - onLoaded?.(items.length); - }, [items.length, onLoaded]); + if (!isLoading) { + onLoaded?.(items.length); + } + }, [items.length, isLoading, onLoaded]); const invalidateAttachments = () => { void queryClient.invalidateQueries({ diff --git a/src/features/transactions/components/dialogs/anticipate-installments-dialog/anticipate-installments-dialog.tsx b/src/features/transactions/components/dialogs/anticipate-installments-dialog/anticipate-installments-dialog.tsx index ca464ae..e1c7d5d 100644 --- a/src/features/transactions/components/dialogs/anticipate-installments-dialog/anticipate-installments-dialog.tsx +++ b/src/features/transactions/components/dialogs/anticipate-installments-dialog/anticipate-installments-dialog.tsx @@ -342,21 +342,21 @@ export function AnticipateInstallmentsDialog({ {/* Seção 3: Resumo */} {selectedIds.length > 0 && (
-

Resumo

+

Resumo

{selectedIds.length} parcela {selectedIds.length > 1 ? "s" : ""}
-
+
{Number(formState.discount) > 0 && (
Desconto
-
+
-{" "}
Total
-
+
diff --git a/src/features/transactions/components/dialogs/anticipate-installments-dialog/installment-selection-table.tsx b/src/features/transactions/components/dialogs/anticipate-installments-dialog/installment-selection-table.tsx index 322301d..eff3ad1 100644 --- a/src/features/transactions/components/dialogs/anticipate-installments-dialog/installment-selection-table.tsx +++ b/src/features/transactions/components/dialogs/anticipate-installments-dialog/installment-selection-table.tsx @@ -116,7 +116,7 @@ export function InstallmentSelectionTable({ {formatDate(inst.dueDate)} - + diff --git a/src/features/transactions/components/dialogs/mass-add-dialog.tsx b/src/features/transactions/components/dialogs/mass-add-dialog.tsx index 33d640b..533fd4e 100644 --- a/src/features/transactions/components/dialogs/mass-add-dialog.tsx +++ b/src/features/transactions/components/dialogs/mass-add-dialog.tsx @@ -279,7 +279,7 @@ export function MassAddDialog({
{/* Fixed Fields Section */}
-

Valores Padrão

+

Valores Padrão

{/* Transaction Type */}
@@ -452,7 +452,7 @@ export function MassAddDialog({ {/* Transactions Section */}
-

Lançamentos

+

Lançamentos

{transactions.map((transaction, index) => ( diff --git a/src/features/transactions/components/dialogs/transaction-details-dialog.tsx b/src/features/transactions/components/dialogs/transaction-details-dialog.tsx index 6ff5ce7..e392aed 100644 --- a/src/features/transactions/components/dialogs/transaction-details-dialog.tsx +++ b/src/features/transactions/components/dialogs/transaction-details-dialog.tsx @@ -88,7 +88,7 @@ export function TransactionDetailsDialog({

Resumo

-

+

{currencyFormatter.format(valorTotal)}

@@ -116,7 +116,7 @@ export function TransactionDetailsDialog({
-

+

Detalhes

    @@ -167,7 +167,7 @@ export function TransactionDetailsDialog({
-

+

Valores

    @@ -207,7 +207,7 @@ export function TransactionDetailsDialog({ {transaction.note ? (
    -

    +

    Notas

    @@ -218,7 +218,7 @@ export function TransactionDetailsDialog({ {attachmentCount !== 0 && (
    -

    +

    Anexos

    diff --git a/src/features/transactions/components/import/review-table.tsx b/src/features/transactions/components/import/review-table.tsx index f3d0bd5..dadcaed 100644 --- a/src/features/transactions/components/import/review-table.tsx +++ b/src/features/transactions/components/import/review-table.tsx @@ -131,7 +131,7 @@ export function ReviewTable({ aria-label={`Selecionar ${row.description}`} /> - + {formatDate(row.date)} @@ -204,7 +204,7 @@ export function ReviewTable({ } /> - +
    Valor Original
    -
    +
    @@ -92,7 +92,7 @@ export function AnticipationCard({ {Number(anticipation.discount) > 0 && (
    Desconto
    -
    +
    -
    @@ -110,7 +110,7 @@ export function AnticipationCard({ ? "Valor Final" : "Valor Total"} -
    +
    diff --git a/src/shared/components/money-values.tsx b/src/shared/components/money-values.tsx index 100e183..ead35be 100644 --- a/src/shared/components/money-values.tsx +++ b/src/shared/components/money-values.tsx @@ -20,9 +20,9 @@ function MoneyValues({ amount, className, showPositiveSign = false }: Props) { return ( +
    void }) {
    -

    +

    {item.title}

    diff --git a/src/shared/components/navigation/navbar/nav-dropdown.tsx b/src/shared/components/navigation/navbar/nav-dropdown.tsx index e288252..609eefa 100644 --- a/src/shared/components/navigation/navbar/nav-dropdown.tsx +++ b/src/shared/components/navigation/navbar/nav-dropdown.tsx @@ -42,7 +42,7 @@ export function NavDropdown({ items }: NavDropdownProps) { {item.icon} - {item.label} + {item.label} {item.description && ( {item.description} diff --git a/src/shared/components/navigation/navbar/nav-menu.tsx b/src/shared/components/navigation/navbar/nav-menu.tsx index 4116a6c..6c00239 100644 --- a/src/shared/components/navigation/navbar/nav-menu.tsx +++ b/src/shared/components/navigation/navbar/nav-menu.tsx @@ -42,7 +42,7 @@ export function NavMenu() { return ( <> {/* Desktop */} -