From be95910ac2f2706589c83df80b1193ccc2b46539 Mon Sep 17 00:00:00 2001 From: null Date: Sat, 6 Jun 2026 23:53:53 -0500 Subject: [PATCH] feat: admin UX cleanup, bills page reordering, subscriptions page cadence sort + in-place edits, summary polish --- .../components/admin/BackupManagementCard.jsx | 23 +- client/components/admin/CleanupPanel.jsx | 10 +- client/components/admin/LoginModeCard.jsx | 28 +- client/components/admin/UsersTable.jsx | 37 ++- client/pages/BillsPage.jsx | 102 ++++++- client/pages/DataPage.jsx | 34 ++- client/pages/SubscriptionsPage.jsx | 285 +++++++++++++----- client/pages/SummaryPage.jsx | 36 ++- 8 files changed, 438 insertions(+), 117 deletions(-) diff --git a/client/components/admin/BackupManagementCard.jsx b/client/components/admin/BackupManagementCard.jsx index 8747e38..282c10b 100644 --- a/client/components/admin/BackupManagementCard.jsx +++ b/client/components/admin/BackupManagementCard.jsx @@ -16,6 +16,7 @@ import { AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, } from '@/components/ui/alert-dialog'; import { SectionHeading, Toggle, formatDateTime, BackupTypeBadge } from './adminShared'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; const DEFAULT_SETTINGS = { enabled: false, @@ -181,9 +182,16 @@ export default function BackupManagementCard() { Admin-only SQLite backup, import, download, restore, and schedule controls.

- - {settings.last_error ? 'Attention' : 'Ready'} - + + + + + {settings.last_error ? 'Attention' : 'Ready'} + + + {settings.last_error || 'Backup system is operational'} + + @@ -304,7 +312,14 @@ export default function BackupManagementCard() { setSchedule('time', e.target.value)} />
- + + + + + + Number of scheduled backups to retain — older ones are auto-deleted + + setSchedule('retention_count', e.target.value)} />
diff --git a/client/components/admin/CleanupPanel.jsx b/client/components/admin/CleanupPanel.jsx index 68ba7dc..b9f4f97 100644 --- a/client/components/admin/CleanupPanel.jsx +++ b/client/components/admin/CleanupPanel.jsx @@ -6,6 +6,7 @@ import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Input } from '@/components/ui/input'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { FieldRow, Toggle, formatDateTime } from './adminShared'; export default function CleanupPanel() { @@ -103,7 +104,14 @@ export default function CleanupPanel() {

- Auto + + + + Auto + + Cleanup runs automatically at 6:00 AM daily + + diff --git a/client/components/admin/LoginModeCard.jsx b/client/components/admin/LoginModeCard.jsx index 84f57ca..7156c2c 100644 --- a/client/components/admin/LoginModeCard.jsx +++ b/client/components/admin/LoginModeCard.jsx @@ -1,6 +1,7 @@ import React, { useState, useEffect } from 'react'; import { toast } from 'sonner'; import { api } from '@/api'; +import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Label } from '@/components/ui/label'; @@ -13,6 +14,7 @@ import { AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, } from '@/components/ui/alert-dialog'; import { LogIn, UserCheck, ShieldCheck } from 'lucide-react'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; export default function LoginModeCard({ users, onModeChange }) { const [modeData, setModeData] = useState(null); @@ -88,13 +90,25 @@ export default function LoginModeCard({ users, onModeChange }) { Choose how users access this app.

- - {currentMode === 'single' ? 'No Login' : 'Require Login'} - + + + + + {currentMode === 'single' ? 'No Login' : 'Require Login'} + + + + {currentMode === 'single' + ? 'Anyone who opens the app is automatically signed in' + : 'Users must authenticate to access the app'} + + + diff --git a/client/components/admin/UsersTable.jsx b/client/components/admin/UsersTable.jsx index ab692fd..2c74c27 100644 --- a/client/components/admin/UsersTable.jsx +++ b/client/components/admin/UsersTable.jsx @@ -6,6 +6,7 @@ import { Button, buttonVariants } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, @@ -107,12 +108,28 @@ export default function UsersTable({ users, onRefresh, currentUser }) {
{user.username} - {user.is_default_admin && default admin} + {user.is_default_admin && ( + + + + default admin + + Initial admin account created during setup + + + )}
- {user.role} + + + + {user.role} + + {user.role === 'admin' ? 'Full access including admin panel' : 'Standard user — no admin access'} + + setSubSearch(e.target.value)} + placeholder="Search subscriptions…" + className="h-8 pl-8 pr-8 text-sm" + /> + {subSearch && ( +
+ + + )} diff --git a/client/pages/SummaryPage.jsx b/client/pages/SummaryPage.jsx index 171fcae..9c99ede 100644 --- a/client/pages/SummaryPage.jsx +++ b/client/pages/SummaryPage.jsx @@ -491,15 +491,36 @@ export default function SummaryPage() {
-
1st
+ + + +
1st
+
+ Cash on hand for bills due on the 1st–14th +
+
{fmt(starting.first_amount)}
-
15th
+ + + +
15th
+
+ Cash on hand for bills due on the 15th–31st +
+
{fmt(starting.fifteenth_amount)}
-
Other
+ + + +
Other
+
+ Additional funds not tied to a specific pay period +
+
{fmt(starting.other_amount)}
@@ -669,7 +690,14 @@ export default function SummaryPage() {
{fmt(summary.expense_total)}
-
Result
+ + + +
Result
+
+ Starting balance minus total planned expenses +
+
{fmt(summary.result)}