mirror of
https://github.com/felipegcoutinho/openmonetis.git
synced 2026-05-09 02:51:46 +00:00
Adiciona splitGroupId para vincular as duas shares de um lançamento dividido (schema + índice + migration 0026). Habilita: - Edição de par dividido com escolha de escopo (apenas este lado ou ambos) via novo SplitPairDialog e updateTransactionSplitPairAction - Filtro "Somente divididos" (isDivided) na tabela de lançamentos - Visibilidade de anexos para pessoas com acesso compartilhado via payerShares; upload e detach em massa expandem para shares irmãs - Cópia independente de anexos no fluxo "Importar para Minha Conta" (novo fileKey, novo userId, S3 CopyObject) com seção read-only "Anexos que serão copiados" no dialog de importação - Ícone de clipe na tabela de lançamentos da página da pessoa via EXISTS em fetchPagadorLancamentos Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
105 lines
2.6 KiB
TypeScript
105 lines
2.6 KiB
TypeScript
"use client";
|
|
|
|
import { useState } from "react";
|
|
import { Button } from "@/shared/components/ui/button";
|
|
import {
|
|
Dialog,
|
|
DialogContent,
|
|
DialogDescription,
|
|
DialogFooter,
|
|
DialogHeader,
|
|
DialogTitle,
|
|
} from "@/shared/components/ui/dialog";
|
|
import { Label } from "@/shared/components/ui/label";
|
|
import { RadioGroup, RadioGroupItem } from "@/shared/components/ui/radio-group";
|
|
|
|
export type SplitPairScope = "current" | "both";
|
|
|
|
type SplitPairDialogProps = {
|
|
open: boolean;
|
|
onOpenChange: (open: boolean) => void;
|
|
onConfirm: (scope: SplitPairScope) => void;
|
|
};
|
|
|
|
export function SplitPairDialog({
|
|
open,
|
|
onOpenChange,
|
|
onConfirm,
|
|
}: SplitPairDialogProps) {
|
|
const [scope, setScope] = useState<SplitPairScope>("current");
|
|
|
|
const handleConfirm = () => {
|
|
onConfirm(scope);
|
|
onOpenChange(false);
|
|
};
|
|
|
|
return (
|
|
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
<DialogContent className="sm:max-w-md">
|
|
<DialogHeader>
|
|
<DialogTitle>Editar lançamento dividido</DialogTitle>
|
|
<DialogDescription>
|
|
Este lançamento está dividido com outra pessoa. Escolha o que deseja
|
|
editar:
|
|
</DialogDescription>
|
|
</DialogHeader>
|
|
|
|
<RadioGroup
|
|
value={scope}
|
|
onValueChange={(v) => setScope(v as SplitPairScope)}
|
|
>
|
|
<div className="space-y-4">
|
|
<div className="flex items-start space-x-3">
|
|
<RadioGroupItem
|
|
value="current"
|
|
id="split-current"
|
|
className="mt-0.5"
|
|
/>
|
|
<div className="flex-1">
|
|
<Label
|
|
htmlFor="split-current"
|
|
className="text-sm cursor-pointer font-medium"
|
|
>
|
|
Apenas este lançamento
|
|
</Label>
|
|
<p className="text-xs text-muted-foreground">
|
|
Aplica a alteração somente neste lado da divisão
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="flex items-start space-x-3">
|
|
<RadioGroupItem value="both" id="split-both" className="mt-0.5" />
|
|
<div className="flex-1">
|
|
<Label
|
|
htmlFor="split-both"
|
|
className="text-sm cursor-pointer font-medium"
|
|
>
|
|
Atualizar os dois lançamentos
|
|
</Label>
|
|
<p className="text-xs text-muted-foreground">
|
|
Aplica nome, data, categoria e outros campos compartilhados
|
|
nos dois lados da divisão
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</RadioGroup>
|
|
|
|
<DialogFooter>
|
|
<Button
|
|
type="button"
|
|
variant="outline"
|
|
onClick={() => onOpenChange(false)}
|
|
>
|
|
Cancelar
|
|
</Button>
|
|
<Button type="button" onClick={handleConfirm}>
|
|
Confirmar
|
|
</Button>
|
|
</DialogFooter>
|
|
</DialogContent>
|
|
</Dialog>
|
|
);
|
|
}
|