"use client"; import { closestCenter, DndContext, type DragEndEvent, KeyboardSensor, PointerSensor, useSensor, useSensors, } from "@dnd-kit/core"; import { arrayMove, SortableContext, useSortable, verticalListSortingStrategy, } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import { RiDragMove2Line } from "@remixicon/react"; import { useRouter } from "next/navigation"; import { useState, useTransition } from "react"; import { toast } from "sonner"; import { updatePreferencesAction } from "@/features/settings/actions"; import { ATTACHMENT_SIZE_OPTIONS, type AttachmentSizeOption, } from "@/features/transactions/attachments-config"; import { DEFAULT_LANCAMENTOS_COLUMN_ORDER, LANCAMENTOS_COLUMN_LABELS, } from "@/features/transactions/column-order"; import { Button } from "@/shared/components/ui/button"; import { Label } from "@/shared/components/ui/label"; import { Separator } from "@/shared/components/ui/separator"; import { Switch } from "@/shared/components/ui/switch"; import { ToggleGroup, ToggleGroupItem, } from "@/shared/components/ui/toggle-group"; interface PreferencesFormProps { statementNoteAsColumn: boolean; transactionsColumnOrder: string[] | null; attachmentMaxSizeMb: number; } function SortableColumnItem({ id }: { id: string }) { const { attributes, listeners, setNodeRef, transform, transition, isDragging, } = useSortable({ id }); const style = { transform: CSS.Transform.toString(transform), transition, }; const label = LANCAMENTOS_COLUMN_LABELS[id] ?? id; return (
{label}
); } export function PreferencesForm({ statementNoteAsColumn: initialExtratoNoteAsColumn, transactionsColumnOrder: initialColumnOrder, attachmentMaxSizeMb: initialAttachmentMaxSizeMb, }: PreferencesFormProps) { const router = useRouter(); const [isPending, startTransition] = useTransition(); const [statementNoteAsColumn, setExtratoNoteAsColumn] = useState( initialExtratoNoteAsColumn, ); const [columnOrder, setColumnOrder] = useState( initialColumnOrder && initialColumnOrder.length > 0 ? initialColumnOrder : DEFAULT_LANCAMENTOS_COLUMN_ORDER, ); const [attachmentMaxSizeMb, setAttachmentMaxSizeMb] = useState( (ATTACHMENT_SIZE_OPTIONS.includes( initialAttachmentMaxSizeMb as AttachmentSizeOption, ) ? initialAttachmentMaxSizeMb : 50) as AttachmentSizeOption, ); const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { distance: 8 } }), useSensor(KeyboardSensor), ); const handleColumnDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (over && active.id !== over.id) { setColumnOrder((items) => { const oldIndex = items.indexOf(active.id as string); const newIndex = items.indexOf(over.id as string); return arrayMove(items, oldIndex, newIndex); }); } }; const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); startTransition(async () => { const result = await updatePreferencesAction({ statementNoteAsColumn, transactionsColumnOrder: columnOrder, attachmentMaxSizeMb, }); if (result.success) { toast.success(result.message); router.refresh(); } else { toast.error(result.error); } }); }; return (
{/* Seção: Lançamentos */}

Lançamentos

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

Quando ativo, as anotações aparecem em uma coluna na tabela. Quando desativado, aparecem em um balão ao passar o mouse no ícone.

Arraste os itens para definir a ordem em que as colunas aparecem na tabela do extrato e dos lançamentos.

{columnOrder.map((id) => ( ))}

Configurações de upload de arquivos nos lançamentos.

Limite aplicado ao upload de PDFs e imagens.

{ if (val) setAttachmentMaxSizeMb(Number(val) as AttachmentSizeOption); }} className="flex flex-wrap gap-2 justify-start" > {ATTACHMENT_SIZE_OPTIONS.map((size) => ( {size} MB ))}
); }