diff --git a/app/(dashboard)/anotacoes/layout.tsx b/app/(dashboard)/anotacoes/layout.tsx index 8e1c66b..885c29f 100644 --- a/app/(dashboard)/anotacoes/layout.tsx +++ b/app/(dashboard)/anotacoes/layout.tsx @@ -1,5 +1,5 @@ import PageDescription from "@/components/page-description"; -import { RiFileListLine } from "@remixicon/react"; +import { RiTodoLine } from "@remixicon/react"; export const metadata = { title: "Anotações | OpenSheets", @@ -13,7 +13,7 @@ export default function RootLayout({ return (
} + icon={} title="Notas" subtitle="Gerencie suas anotações e mantenha o controle sobre suas ideias e tarefas." /> diff --git a/app/(dashboard)/contas/data.ts b/app/(dashboard)/contas/data.ts index a5e1cc7..62a3631 100644 --- a/app/(dashboard)/contas/data.ts +++ b/app/(dashboard)/contas/data.ts @@ -18,8 +18,7 @@ export type AccountData = { }; export async function fetchAccountsForUser( - userId: string, - currentPeriod: string + userId: string ): Promise<{ accounts: AccountData[]; logoOptions: LogoOption[] }> { const [accountRows, logoOptions] = await Promise.all([ db @@ -50,14 +49,10 @@ export async function fetchAccountsForUser( and( eq(lancamentos.contaId, contas.id), eq(lancamentos.userId, userId), - eq(lancamentos.period, currentPeriod), eq(lancamentos.isSettled, true) ) ) - .leftJoin( - pagadores, - eq(lancamentos.pagadorId, pagadores.id) - ) + .leftJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .where( and( eq(contas.userId, userId), diff --git a/app/(dashboard)/contas/page.tsx b/app/(dashboard)/contas/page.tsx index 3101225..034caaf 100644 --- a/app/(dashboard)/contas/page.tsx +++ b/app/(dashboard)/contas/page.tsx @@ -5,14 +5,8 @@ import { fetchAccountsForUser } from "./data"; export default async function Page() { const userId = await getUserId(); const now = new Date(); - const currentPeriod = `${now.getFullYear()}-${String( - now.getMonth() + 1 - ).padStart(2, "0")}`; - const { accounts, logoOptions } = await fetchAccountsForUser( - userId, - currentPeriod - ); + const { accounts, logoOptions } = await fetchAccountsForUser(userId); return (
diff --git a/app/(dashboard)/dashboard/analise-parcelas/layout.tsx b/app/(dashboard)/dashboard/analise-parcelas/layout.tsx new file mode 100644 index 0000000..08e669b --- /dev/null +++ b/app/(dashboard)/dashboard/analise-parcelas/layout.tsx @@ -0,0 +1,23 @@ +import PageDescription from "@/components/page-description"; +import { RiSecurePaymentLine } from "@remixicon/react"; + +export const metadata = { + title: "Análise de Parcelas | OpenSheets", +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+ } + title="Análise de Parcelas" + subtitle="Quanto você gastaria pagando suas despesas parceladas à vista?" + /> + {children} +
+ ); +} diff --git a/app/(dashboard)/dashboard/analise-parcelas/page.tsx b/app/(dashboard)/dashboard/analise-parcelas/page.tsx index 65c73d5..1c6caa9 100644 --- a/app/(dashboard)/dashboard/analise-parcelas/page.tsx +++ b/app/(dashboard)/dashboard/analise-parcelas/page.tsx @@ -1,13 +1,13 @@ import { InstallmentAnalysisPage } from "@/components/dashboard/installment-analysis/installment-analysis-page"; -import { fetchInstallmentAnalysis } from "@/lib/dashboard/expenses/installment-analysis"; import { getUser } from "@/lib/auth/server"; +import { fetchInstallmentAnalysis } from "@/lib/dashboard/expenses/installment-analysis"; export default async function Page() { const user = await getUser(); const data = await fetchInstallmentAnalysis(user.id); return ( -
+
); diff --git a/app/(dashboard)/dashboard/page.tsx b/app/(dashboard)/dashboard/page.tsx index 7ee44bd..c6b555f 100644 --- a/app/(dashboard)/dashboard/page.tsx +++ b/app/(dashboard)/dashboard/page.tsx @@ -2,8 +2,8 @@ import { DashboardGrid } from "@/components/dashboard/dashboard-grid"; import { DashboardWelcome } from "@/components/dashboard/dashboard-welcome"; import { SectionCards } from "@/components/dashboard/section-cards"; import MonthPicker from "@/components/month-picker/month-picker"; -import { fetchDashboardData } from "@/lib/dashboard/fetch-dashboard-data"; import { getUser } from "@/lib/auth/server"; +import { fetchDashboardData } from "@/lib/dashboard/fetch-dashboard-data"; import { parsePeriodParam } from "@/lib/utils/period"; type PageSearchParams = Promise>; @@ -30,7 +30,7 @@ export default async function Page({ searchParams }: PageProps) { const data = await fetchDashboardData(user.id, selectedPeriod); return ( -
+
diff --git a/app/(dashboard)/layout.tsx b/app/(dashboard)/layout.tsx index d9529eb..e429549 100644 --- a/app/(dashboard)/layout.tsx +++ b/app/(dashboard)/layout.tsx @@ -1,11 +1,11 @@ import { SiteHeader } from "@/components/header-dashboard"; import { AppSidebar } from "@/components/sidebar/app-sidebar"; import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar"; -import { fetchDashboardNotifications } from "@/lib/dashboard/notifications"; import { getUserSession } from "@/lib/auth/server"; -import { parsePeriodParam } from "@/lib/utils/period"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { fetchDashboardNotifications } from "@/lib/dashboard/notifications"; import { fetchPagadoresWithAccess } from "@/lib/pagadores/access"; +import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { parsePeriodParam } from "@/lib/utils/period"; export default async function layout({ children, @@ -29,8 +29,8 @@ export default async function layout({ typeof periodoParam === "string" ? periodoParam : Array.isArray(periodoParam) - ? periodoParam[0] - : null; + ? periodoParam[0] + : null; const { period: currentPeriod } = parsePeriodParam( singlePeriodoParam ?? null ); diff --git a/components/anotacoes/notes-page.tsx b/components/anotacoes/notes-page.tsx index 5461f2e..52ec0a9 100644 --- a/components/anotacoes/notes-page.tsx +++ b/components/anotacoes/notes-page.tsx @@ -4,7 +4,7 @@ import { deleteNoteAction } from "@/app/(dashboard)/anotacoes/actions"; import { ConfirmActionDialog } from "@/components/confirm-action-dialog"; import { EmptyState } from "@/components/empty-state"; import { Button } from "@/components/ui/button"; -import { RiAddCircleLine, RiFileListLine } from "@remixicon/react"; +import { RiAddCircleLine, RiTodoLine } from "@remixicon/react"; import { useCallback, useMemo, useState } from "react"; import { toast } from "sonner"; import { Card } from "../ui/card"; @@ -117,7 +117,7 @@ export function NotesPage({ notes }: NotesPageProps) { {sortedNotes.length === 0 ? ( } + media={} title="Nenhuma anotação registrada" description="Crie anotações personalizadas para acompanhar lembretes, decisões ou observações financeiras importantes." /> diff --git a/components/contas/account-statement-card.tsx b/components/contas/account-statement-card.tsx index 9b302d5..3e63c48 100644 --- a/components/contas/account-statement-card.tsx +++ b/components/contas/account-statement-card.tsx @@ -101,13 +101,66 @@ export function AccountStatementCard({ - {/* Destaque Principal */} -
+ {/* Composição do Saldo */} +
} + tooltip="Saldo inicial cadastrado na conta somado aos lançamentos pagos anteriores a este mês." + /> + +
+ + {formatCurrency(totalIncomes)} + + } + tooltip="Total de receitas deste mês classificadas como pagas para esta conta." + /> + + {formatCurrency(totalExpenses)} + + } + tooltip="Total de despesas pagas neste mês (considerando divisão entre pagadores)." + /> + + = 0 + ? "text-emerald-600" + : "text-destructive" + )} + /> + } + tooltip="Diferença entre entradas e saídas do mês; positivo indica saldo crescente." + /> +
+ + {/* Saldo Atual - Destaque Principal */} + } tooltip="Saldo inicial do período + entradas - saídas realizadas neste mês." /> +
+ + {/* Informações da Conta */} +
+
- - {/* Movimentação do Período */} -
- - } - tooltip="Saldo inicial cadastrado na conta somado aos lançamentos pagos anteriores a este mês." - /> - - {formatCurrency(totalIncomes)} - - } - tooltip="Total de receitas deste mês classificadas como pagas para esta conta." - /> - - {formatCurrency(totalExpenses)} - - } - tooltip="Total de despesas pagas neste mês (considerando divisão entre pagadores)." - /> - = 0 - ? "text-emerald-600" - : "text-destructive" - )} - /> - } - tooltip="Diferença entre entradas e saídas do mês; positivo indica saldo crescente." - /> -
- - {/* Informações da Conta */} - ); diff --git a/components/dashboard/installment-analysis/installment-analysis-page.tsx b/components/dashboard/installment-analysis/installment-analysis-page.tsx index 1f86f95..9678674 100644 --- a/components/dashboard/installment-analysis/installment-analysis-page.tsx +++ b/components/dashboard/installment-analysis/installment-analysis-page.tsx @@ -3,14 +3,14 @@ import MoneyValues from "@/components/money-values"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; -import { useMemo, useState } from "react"; -import type { InstallmentAnalysisData } from "./types"; -import { InstallmentGroupCard } from "./installment-group-card"; import { RiCalculatorLine, RiCheckboxBlankLine, RiCheckboxLine, } from "@remixicon/react"; +import { useMemo, useState } from "react"; +import { InstallmentGroupCard } from "./installment-group-card"; +import type { InstallmentAnalysisData } from "./types"; type InstallmentAnalysisPageProps = { data: InstallmentAnalysisData; @@ -128,30 +128,17 @@ export function InstallmentAnalysisPage({ return (
- {/* Header */} -
-
- -
-
-

Análise de Parcelas

-

- Quanto você gastaria pagando tudo que está em aberto -

-
-
- {/* Card de resumo principal */} - - -

+ + +

Se você pagar tudo que está selecionado:

-

+

{selectedCount} {selectedCount === 1 ? "parcela" : "parcelas"}{" "} selecionadas

diff --git a/components/sidebar/nav-link.tsx b/components/sidebar/nav-link.tsx index 6f98af8..fc3f3d5 100644 --- a/components/sidebar/nav-link.tsx +++ b/components/sidebar/nav-link.tsx @@ -4,12 +4,12 @@ import { RiBankLine, RiCalendarEventLine, RiDashboardLine, - RiFileListLine, RiFundsLine, RiGroupLine, RiPriceTag3Line, RiSettingsLine, RiSparklingLine, + RiTodoLine, type RemixiconComponentType, } from "@remixicon/react"; @@ -129,7 +129,7 @@ export function createSidebarNavData(pagadores: PagadorLike[]): SidebarNavData { { title: "Anotações", url: "/anotacoes", - icon: RiFileListLine, + icon: RiTodoLine, }, { title: "Insights", diff --git a/lib/dashboard/widgets/widgets-config.tsx b/lib/dashboard/widgets/widgets-config.tsx index 55f6563..3610b0b 100644 --- a/lib/dashboard/widgets/widgets-config.tsx +++ b/lib/dashboard/widgets/widgets-config.tsx @@ -13,24 +13,24 @@ import { RecentTransactionsWidget } from "@/components/dashboard/recent-transact import { RecurringExpensesWidget } from "@/components/dashboard/recurring-expenses-widget"; import { TopEstablishmentsWidget } from "@/components/dashboard/top-establishments-widget"; import { TopExpensesWidget } from "@/components/dashboard/top-expenses-widget"; -import Link from "next/link"; import { RiArrowUpDoubleLine, RiBarChartBoxLine, RiBarcodeLine, RiBillLine, - RiCalculatorLine, RiExchangeLine, RiLineChartLine, RiMoneyDollarCircleLine, RiNumbersLine, RiPieChartLine, RiRefreshLine, + RiSecurePaymentLine, RiSlideshowLine, RiStore2Line, RiStore3Line, RiWallet3Line, } from "@remixicon/react"; +import Link from "next/link"; import type { ReactNode } from "react"; import type { DashboardData } from "./fetch-dashboard-data"; @@ -142,7 +142,7 @@ export const widgetsConfig: WidgetConfig[] = [ href="/dashboard/analise-parcelas" className="text-sm font-medium text-muted-foreground hover:text-primary transition-colors" > - + Análise ),