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)
64 lines
2.1 KiB
TypeScript
64 lines
2.1 KiB
TypeScript
import * as RemixIcons from "@remixicon/react";
|
|
import type { ComponentType, ReactNode } from "react";
|
|
|
|
const ICON_CLASS = "h-4 w-4";
|
|
|
|
const normalizeKey = (value: string) =>
|
|
value
|
|
.normalize("NFD")
|
|
.replace(/\p{Diacritic}/gu, "")
|
|
.toLowerCase()
|
|
.replace(/[^a-z0-9]/g, "");
|
|
|
|
export const getIconComponent = (
|
|
iconName: string
|
|
): ComponentType<{ className?: string }> | null => {
|
|
// Busca o ícone no objeto de ícones do Remix Icon
|
|
const icon = (RemixIcons as Record<string, unknown>)[iconName];
|
|
|
|
if (icon && typeof icon === "function") {
|
|
return icon as ComponentType<{ className?: string }>;
|
|
}
|
|
|
|
return null;
|
|
};
|
|
|
|
export const getConditionIcon = (condition: string): ReactNode => {
|
|
const key = normalizeKey(condition);
|
|
|
|
const registry: Record<string, ReactNode> = {
|
|
parcelado: <RemixIcons.RiLoader2Fill className={ICON_CLASS} aria-hidden />,
|
|
recorrente: <RemixIcons.RiRefreshLine className={ICON_CLASS} aria-hidden />,
|
|
avista: <RemixIcons.RiCheckLine className={ICON_CLASS} aria-hidden />,
|
|
vista: <RemixIcons.RiCheckLine className={ICON_CLASS} aria-hidden />,
|
|
};
|
|
|
|
return registry[key] ?? null;
|
|
};
|
|
|
|
export const getPaymentMethodIcon = (paymentMethod: string): ReactNode => {
|
|
const key = normalizeKey(paymentMethod);
|
|
|
|
const registry: Record<string, ReactNode> = {
|
|
dinheiro: (
|
|
<RemixIcons.RiMoneyDollarCircleLine className={ICON_CLASS} aria-hidden />
|
|
),
|
|
pix: <RemixIcons.RiPixLine className={ICON_CLASS} aria-hidden />,
|
|
boleto: <RemixIcons.RiBarcodeLine className={ICON_CLASS} aria-hidden />,
|
|
credito: (
|
|
<RemixIcons.RiMoneyDollarCircleLine className={ICON_CLASS} aria-hidden />
|
|
),
|
|
cartaodecredito: (
|
|
<RemixIcons.RiBankCardLine className={ICON_CLASS} aria-hidden />
|
|
),
|
|
cartaodedebito: (
|
|
<RemixIcons.RiBankCardLine className={ICON_CLASS} aria-hidden />
|
|
),
|
|
debito: <RemixIcons.RiBankCardLine className={ICON_CLASS} aria-hidden />,
|
|
prepagovrva: <RemixIcons.RiCouponLine className={ICON_CLASS} aria-hidden />,
|
|
transferenciabancaria: <RemixIcons.RiExchangeLine className={ICON_CLASS} aria-hidden />,
|
|
};
|
|
|
|
return registry[key] ?? null;
|
|
};
|