Add invoice dialog and enhance Cashflow, Clients, Invoices, and Net Worth pages

- Introduced AddInvoiceDialog component for creating new invoices with client selection and form validation.
- Updated CashflowPage to include dialogs for adding income, expenses, and transactions, improving user interaction.
- Enhanced ClientsPage with a dialog for adding new clients, streamlining client management.
- Improved InvoicesPage with a dialog for creating new invoices, facilitating better invoice management.
- Updated NetWorthPage to include dialogs for adding assets and liabilities, enhancing financial tracking capabilities.
This commit is contained in:
2025-12-07 11:44:50 -05:00
parent 1761931a73
commit d3f5df403d
5 changed files with 214 additions and 72 deletions

View File

@@ -1,8 +1,11 @@
import {useState} from 'react';
import {Card, CardContent} from '@/components/ui/card';
import {Button} from '@/components/ui/button';
import {useAppSelector} from '@/store';
import AddClientDialog from '@/components/dialogs/AddClientDialog';
export default function ClientsPage() {
const [dialogOpen, setDialogOpen] = useState(false);
const {clients, invoices} = useAppSelector(state => state.invoices);
const getClientStats = (clientId: string) => {
@@ -29,7 +32,7 @@ export default function ClientsPage() {
<div><span className="text-muted-foreground">Outstanding</span> <span className="font-medium">{fmt(totalOutstanding)}</span></div>
</div>
</div>
<Button size="sm">Add Client</Button>
<Button size="sm" onClick={() => setDialogOpen(true)}>Add Client</Button>
</div>
{/* Clients Grid */}
@@ -64,12 +67,14 @@ export default function ClientsPage() {
})}
{/* Add client card */}
<Card className="card-elevated border-dashed cursor-pointer hover:bg-accent/50 transition-colors">
<Card className="card-elevated border-dashed cursor-pointer hover:bg-accent/50 transition-colors" onClick={() => setDialogOpen(true)}>
<CardContent className="p-4 flex items-center justify-center h-full min-h-[100px]">
<span className="text-sm text-muted-foreground">+ Add Client</span>
</CardContent>
</Card>
</div>
<AddClientDialog open={dialogOpen} onOpenChange={setDialogOpen} />
</div>
);
}