diff --git a/frontend/src/views/settings/SettingsView.vue b/frontend/src/views/settings/SettingsView.vue index 650b8ff..64e7915 100644 --- a/frontend/src/views/settings/SettingsView.vue +++ b/frontend/src/views/settings/SettingsView.vue @@ -127,58 +127,59 @@ - - - - mdi-link-variant + + + mdi-link-variant SimpleFIN - {{ simpleFinConnections.length }} - - - Connect - - - Sync All - - - Re-sync All - - + {{ simpleFinConnections.length }} + + + mdi-bank + Plaid + {{ plaidConnections.length }} + + - -
+ + + +
+ + Connect + + + Sync All + + + Re-sync All + +
@@ -187,281 +188,269 @@ No SimpleFIN connections yet. Click Connect to add one. - - - {{ conn.institutionName }} - - - {{ conn.isActive ? 'Active' : 'Inactive' }} - - - {{ conn.isActive ? 'Disable' : 'Enable' }} - - - + + + +
+ {{ conn.institutionName }} + + {{ conn.isActive ? 'Active' : 'Inactive' }} + + + {{ conn.linkedAccounts.length }} account{{ conn.linkedAccounts.length !== 1 ? 's' : '' }} + + + Syncing... + +
+
+ +
+ + {{ conn.isActive ? 'Disable' : 'Enable' }} + + + Delete + + + + Last synced: {{ conn.lastSyncAt ? new Date(conn.lastSyncAt).toLocaleString() : 'Never' }} + +
+ + {{ conn.lastSyncError }} + - -
- Last synced: {{ conn.lastSyncAt ? new Date(conn.lastSyncAt).toLocaleString() : 'Never' }} - - Syncing... - - {{ conn.lastSyncError }} + + + + External Account + Type + Balance + Purrse Account + Enabled + Last Synced + + + + + {{ la.externalAccountName }} + {{ la.externalAccountType }} + {{ la.lastKnownBalance != null ? formatCurrency(la.lastKnownBalance) : '-' }} + + + + + + + {{ la.lastSyncAt ? new Date(la.lastSyncAt).toLocaleString() : 'Never' }} + + + + + + + + + + + + + +
+ mdi-key + API Credentials + Configured + Not configured
- - - - - External Account - Type - Balance - Purrse Account - Enabled - Last Synced - - - - - {{ la.externalAccountName }} - {{ la.externalAccountType }} - {{ la.lastKnownBalance != null ? formatCurrency(la.lastKnownBalance) : '-' }} - - - - - - - {{ la.lastSyncAt ? new Date(la.lastSyncAt).toLocaleString() : 'Never' }} - - - +

+ Enter your Plaid developer credentials. Get them from your Plaid dashboard. +

+ + + + + + + + + + + + + Save + + +
- - - - - - mdi-bank - Plaid - {{ plaidConnections.length }} - - - Connect - - - Sync All - - - - - -
-
- mdi-key - API Credentials - Configured - Not configured -
-

- Enter your Plaid developer credentials. Get them from your Plaid dashboard. -

- - - - - - - - - - - - - Save - - - +
+ + Connect + + + Sync All +
- - No Plaid connections yet. Configure your API credentials above, then click Connect. - - - {{ conn.institutionName }} - - - {{ conn.isActive ? 'Active' : 'Inactive' }} - - - {{ conn.isActive ? 'Disable' : 'Enable' }} - - - + + + +
+ {{ conn.institutionName }} + + {{ conn.isActive ? 'Active' : 'Inactive' }} + + + {{ conn.linkedAccounts.length }} account{{ conn.linkedAccounts.length !== 1 ? 's' : '' }} + + + Syncing... + +
+
+ +
+ + {{ conn.isActive ? 'Disable' : 'Enable' }} + + + Delete + + + + Last synced: {{ conn.lastSyncAt ? new Date(conn.lastSyncAt).toLocaleString() : 'Never' }} + +
+ + {{ conn.lastSyncError }} + - -
- Last synced: {{ conn.lastSyncAt ? new Date(conn.lastSyncAt).toLocaleString() : 'Never' }} - - Syncing... - - {{ conn.lastSyncError }} -
+ + + + External Account + Type + Balance + Purrse Account + Enabled + Last Synced + + + + + {{ la.externalAccountName }} + {{ la.externalAccountType }} + {{ la.lastKnownBalance != null ? formatCurrency(la.lastKnownBalance) : '-' }} + + + + + + + {{ la.lastSyncAt ? new Date(la.lastSyncAt).toLocaleString() : 'Never' }} + + + - - - - External Account - Type - Balance - Purrse Account - Enabled - Last Synced - - - - - {{ la.externalAccountName }} - {{ la.externalAccountType }} - {{ la.lastKnownBalance != null ? formatCurrency(la.lastKnownBalance) : '-' }} - - - - - - - {{ la.lastSyncAt ? new Date(la.lastSyncAt).toLocaleString() : 'Never' }} - - - - -
- -
-
-
- - +
+ +
+ + + + + @@ -840,7 +829,32 @@ import type { SyncConnection, LinkedAccountInfo, Account, SyncLogEntry, PlaidCre const authStore = useAuthStore() const router = useRouter() -const activeTab = ref('profile') +// UI state persistence +const SETTINGS_UI_KEY = 'purrse-settings-ui-state' + +function loadUiState(): Record | null { + try { + const stored = localStorage.getItem(SETTINGS_UI_KEY) + return stored ? JSON.parse(stored) : null + } catch { return null } +} + +function saveUiState() { + localStorage.setItem(SETTINGS_UI_KEY, JSON.stringify({ + settingsTab: activeTab.value, + providerTab: activeProviderTab.value, + expandedSimpleFin: expandedSimpleFinPanels.value, + expandedPlaid: expandedPlaidPanels.value + })) +} + +const _savedUiState = loadUiState() +const activeTab = ref(_savedUiState?.settingsTab || 'profile') +const activeProviderTab = ref(_savedUiState?.providerTab || 'simplefin') +const expandedSimpleFinPanels = ref(_savedUiState?.expandedSimpleFin || []) +const expandedPlaidPanels = ref(_savedUiState?.expandedPlaid || []) + +watch([activeTab, activeProviderTab, expandedSimpleFinPanels, expandedPlaidPanels], saveUiState, { deep: true }) // Profile const profile = ref(null)