Adiciona sistema completo de preferências de usuário: - Cria tabela userPreferences no schema com campos disableMagnetlines, periodMonthsBefore e periodMonthsAfter - Implementa página de Ajustes com abas (Preferências, Alterar nome, Senha, E-mail, Deletar conta) - Adiciona componente PreferencesForm para configuração de magnetlines e períodos de exibição - Propaga periodPreferences para todos os componentes de lançamentos e calendário Refatora sistema de changelog: - Remove implementação anterior baseada em JSON estático - Adiciona nova página de changelog dinâmica em app/(dashboard)/changelog - Adiciona componente changelog-list.tsx - Remove arquivos obsoletos (changelog-notification, actions, data, utils, scripts) Adiciona controle de saldo inicial em contas: - Novo campo excludeInitialBalanceFromIncome em contas - Permite excluir saldo inicial do cálculo de receitas - Atualiza queries de lançamentos para respeitar esta configuração Melhorias adicionais: - Adiciona componente ui/accordion.tsx do shadcn/ui - Refatora formatPeriodLabel para displayPeriod centralizado - Propaga estabelecimentos para componentes de lançamentos - Remove variável DB_PROVIDER obsoleta do .env.example e documentação - Adiciona 6 migrações de banco de dados (0003-0008)
58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
import MonthPicker from "@/components/month-picker/month-picker";
|
|
import { BudgetsPage } from "@/components/orcamentos/budgets-page";
|
|
import { getUserId } from "@/lib/auth/server";
|
|
import { fetchUserPeriodPreferences } from "@/lib/user-preferences/period";
|
|
import { parsePeriodParam } from "@/lib/utils/period";
|
|
import { fetchBudgetsForUser } from "./data";
|
|
|
|
type PageSearchParams = Promise<Record<string, string | string[] | undefined>>;
|
|
|
|
type PageProps = {
|
|
searchParams?: PageSearchParams;
|
|
};
|
|
|
|
const getSingleParam = (
|
|
params: Record<string, string | string[] | undefined> | undefined,
|
|
key: string
|
|
) => {
|
|
const value = params?.[key];
|
|
if (!value) return null;
|
|
return Array.isArray(value) ? value[0] ?? null : value;
|
|
};
|
|
|
|
const capitalize = (value: string) =>
|
|
value.length === 0 ? value : value[0]?.toUpperCase() + value.slice(1);
|
|
|
|
export default async function Page({ searchParams }: PageProps) {
|
|
const userId = await getUserId();
|
|
const resolvedSearchParams = searchParams ? await searchParams : undefined;
|
|
const periodoParam = getSingleParam(resolvedSearchParams, "periodo");
|
|
|
|
const {
|
|
period: selectedPeriod,
|
|
monthName: rawMonthName,
|
|
year,
|
|
} = parsePeriodParam(periodoParam);
|
|
|
|
const periodLabel = `${capitalize(rawMonthName)} ${year}`;
|
|
|
|
const [{ budgets, categoriesOptions }, periodPreferences] = await Promise.all([
|
|
fetchBudgetsForUser(userId, selectedPeriod),
|
|
fetchUserPeriodPreferences(userId),
|
|
]);
|
|
|
|
return (
|
|
<main className="flex flex-col gap-6">
|
|
<MonthPicker />
|
|
<BudgetsPage
|
|
budgets={budgets}
|
|
categories={categoriesOptions}
|
|
selectedPeriod={selectedPeriod}
|
|
periodLabel={periodLabel}
|
|
periodPreferences={periodPreferences}
|
|
/>
|
|
</main>
|
|
);
|
|
}
|
|
|