diff --git a/HISTORY.md b/HISTORY.md index 97d5000..a7c5bff 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,15 @@ # Bill Tracker β Changelog +## v0.34.2 + +### π§ Changed + +- **Bump** β `0.34.1.3` β `0.34.2` + +- **Subscription badge on Tracker** β The "S" subscription badge now appears consistently on all bill rows in the Tracker page. The reorder-mode row variant was missing the badge even though it showed the "AP" autopay badge β both badges now render in all row contexts. + +--- + ## v0.34.1.3 ### π Features @@ -16,6 +26,7 @@ - **Summary bill ordering** β Summary expenses now use the persisted bill order and support tracker-style drag/up/down reordering, while hiding reorder controls from printed/PDF summaries. - **Unified bill schedule editing** β Edit Bill now uses one canonical "Billing Schedule" field instead of separate Billing Cycle and Cycle Type controls. +- **Data page workflow tabs** β Data now groups tools into Sync & Match, Import Data, and Export & History tabs, with remembered collapsible cards and a compact status strip. ### π§ Changed @@ -35,6 +46,7 @@ - **Scheduled backup retention** β The database backup scheduler now starts with the server only when enabled in Admin settings and prunes only scheduled backups, keeping the configured default of 2 without deleting manual, imported, or pre-restore backups. - **Billing schedule migration** β Added migration v0.76 to backfill legacy billing-cycle values into `cycle_type`, normalize `cycle_day`, and derive the legacy `billing_cycle` value from the canonical schedule. +- **Subscription recommendations** β Possible subscription matches now list the bank account that produced the matching transaction activity. --- diff --git a/client/components/admin/BankSyncAdminCard.jsx b/client/components/admin/BankSyncAdminCard.jsx index 989c9f6..78186cf 100644 --- a/client/components/admin/BankSyncAdminCard.jsx +++ b/client/components/admin/BankSyncAdminCard.jsx @@ -161,12 +161,12 @@ export default function BankSyncAdminCard() {
Initial connect & backfill
- 44 days + 6 days- The first sync (and any manual backfill) always fetches the maximum 44 days of history + The first sync (and any manual backfill) always fetches the maximum 60 days of history to build a complete transaction picture. This is fixed β SimpleFIN Bridge enforces a - strict 45-day hard limit and will return an error for any request beyond it. + strict 60-day hard limit and will return possible errors.
diff --git a/client/components/data/BankSyncSection.jsx b/client/components/data/BankSyncSection.jsx index e21a57e..a4d8349 100644 --- a/client/components/data/BankSyncSection.jsx +++ b/client/components/data/BankSyncSection.jsx @@ -285,7 +285,7 @@ function AccountRow({ account, sourceId, expanded, onToggleExpand, onToggleMonit ); } -export default function BankSyncSection({ onConnectionChange }) { +export default function BankSyncSection({ onConnectionChange, cardProps = {} }) { const [enabled, setEnabled] = useState(null); const [syncDays, setSyncDays] = useState(90); const [connections, setConnections] = useState([]); @@ -494,7 +494,7 @@ export default function BankSyncSection({ onConnectionChange }) { if (enabled === null) { return ( -
{rows.length === 0 ? 'No imports yet.' : `${rows.length} import${rows.length === 1 ? '' : 's'}`}
diff --git a/client/components/data/ImportMyDataSection.jsx b/client/components/data/ImportMyDataSection.jsx
index 6a94d31..5667d2b 100644
--- a/client/components/data/ImportMyDataSection.jsx
+++ b/client/components/data/ImportMyDataSection.jsx
@@ -10,7 +10,7 @@ import {
} from '@/components/ui/alert-dialog';
import { SectionCard, CountPill, fmt, importErrorState } from './dataShared';
-export default function ImportMyDataSection({ onHistoryRefresh }) {
+export default function ImportMyDataSection({ onHistoryRefresh, cardProps = {} }) {
const fileRef = useRef(null);
const [file, setFile] = useState(null);
const [preview, setPreview] = useState({ status: 'idle', data: null, error: null });
@@ -69,7 +69,8 @@ export default function ImportMyDataSection({ onHistoryRefresh }) {
return (
<>
Loading⦠{subtitle} {summary} {subtitle} SimpleFIN {syncStatus} Last Sync
+ {simplefinConn?.last_sync_at ? new Date(simplefinConn.last_sync_at).toLocaleString([], { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) : 'β'}
+ Import History
+ {historyLoading ? 'Loadingβ¦' : `${history?.length || 0} record${(history?.length || 0) === 1 ? '' : 's'}`}
+
{TYPE_LABELS[recommendation.subscription_type] || 'Other'} Β· {recommendation.occurrence_count} charges Β· last seen {fmtDate(recommendation.last_seen_date)}
+ {recommendation.accounts.length > 1 ? 'Accounts' : 'Account'}: {recommendation.accounts.join(', ')}
+ {fmt(recommendation.expected_amount)}{title}
+ {subtitle && {title}
- {subtitle &&