diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 91defe4..fbd68fa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,7 @@ name: Build on: pull_request: branches: - - main + - develop types: - opened - synchronize diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9584fb1..c2f2f16 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,7 +3,7 @@ name: Test on: pull_request: branches: - - main + - develop types: - opened - synchronize diff --git a/.github/workflows/validate-version.yml b/.github/workflows/validate-version.yml index 6ed9cf1..ac38beb 100644 --- a/.github/workflows/validate-version.yml +++ b/.github/workflows/validate-version.yml @@ -3,7 +3,7 @@ name: Validate Version File on: pull_request: branches: - - main + - develop types: [opened, synchronize, reopened] paths-ignore: - '.github/workflows/**' diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index f818496..db4ed63 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -11,21 +11,18 @@ ### Improvements -- Added the tab icon next to each view title so the active workspace has clearer visual context. -- Simplified retirement setup by removing employer match handling from retirement elections to reduce complexity, as it's not an amount taken out of your paycheck generally -- Improved Key Metrics view accuracy - - Remaining-for-spending totals now match between Key Metrics and Pay Breakdown in yearly mode. - - The Bills metric was reworked as Recurring Expenses and now reflects the total of custom allocations, bills, deductions, and loan payments. -- Improved account deletion behavior so linked items are handled more intelligently across all supported item types. -- Reduced icon width to look cleaner, and replaced a few icons to make more sense in context -- Reduced built application size by around 100MB +- Plans now save automatically when closed, but can still be saved via shortcut or menubar task + - Note: If it's a new plan or demo plan that hasn't been saved yet it will still prompt to save +- Reworked the view mode selector to take up less space, and no longer have an unnecessary favorites modal associated with it +- Added a Pay Details button to Key Metrics screen as well +- Increase icon line width for visibility +- Reorganized the plan header to make it less cluttered +- Header actions now switch between full buttons on wider windows and compact dropdowns on smaller screens ### Bug Fixes -- Fixed deduction amount rounding/display inconsistencies (for example 9.30 no longer drifting to 9.31). -- Fixed edit-form amount formatting so trailing zeros are preserved more consistently when editing existing bill and deduction values. -- Added tighter decimal precision handling in amount entry fields to match what the UI can reliably display. -- Fixed history overlay behavior for legacy entries so edits no longer appear as misleading empty-to-value changes. -- Fixed a history overlay deletion bug where deleting an Initial tracked state row could delete the wrong item in stacked history. -- Fixed tax settings history to actually break out the line item changes done \ No newline at end of file +- Fixed demo generation immediately causing pay breakdown to go into the negative if random Gross Income is on the lower end +- Fixed off-center "Add Loan Payment" button when no loan items were added yet +- Fixed new plan creation starting with only two view modes visible after exiting Setup Wizard +- Fixed focused header action borders clipping near the sticky tab header edge \ No newline at end of file diff --git a/app_updates/v0.4.1-fixes.md b/app_updates/v0.4.1-fixes.md deleted file mode 100644 index faa4477..0000000 --- a/app_updates/v0.4.1-fixes.md +++ /dev/null @@ -1,28 +0,0 @@ -Few things needing fixing/updating across the app: - -- Key Metrics - - [x] Employer contributions are being counted towards "Your savings rate" on Key Metrics screen - - [x] Final "remaining for spending" amount is not aligning between Key Metrics and final Pay Breakdown "All that remains for spending" amount (Yearly view mode) - - [x] Need to rebrand "Bills" metric card as "Recurring Expenses", and then also include benefits Deductions and Loan payments into it, since right now it's only showing total "bill" items - - [x] Icons for metric cards not aligned with text -- Account editor - - [x] When deleting an account with items associated with it, the app isn't picking up Savings contributions or Loans to be migrated to another account. - - [x] Deleting an account should be more dynamic in picking up the associated items with the account, checking all items linked with that "account id" instead of using if/else statements to determine the items to delete -- Bills view - - [x] Some rounding issues when setting up a Deduction. Tried adding one for "9.30" but it kept showing as "9.31" once saved. When going to edit screen, it is showing "9.3". - - [x] In Bill items, amount saved as "9.30" is working fine and shows as "9.30", but when going back to edit it appears as "9.3" (missing final 0 in formatting). - - [x] Need to limit amount entry decimal spaces to maybe 3, as that's the max that shows in the UI anyway when item is saved. -- Savings view - - [x] Get rid of the employer match logic from Retirement plans, since it doesn't add much and I think makes it confusing. Employer match doesn't count against your pay, so it shouldn't really be dealt with here. -- All views - - [x] Add the tab Icon into the Tab View next to the view title header - - [x] If a user has a plan from before the log was available, then editing existing items shows weird data in the first entry since the app thinks the item is 'new' perhaps -- App optimizations - - Want to try and optimize the code so that the builds aren't so large (currently over 200MB) - - Chunking warnings in the build - ``` - (!) Some chunks are larger than 500 kB after minification. Consider: - - Using dynamic import() to code-split the application - - Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks - - Adjust chunk size limit for this warning via build.chunkSizeWarningLimit. - ``` \ No newline at end of file diff --git a/electron/main.ts b/electron/main.ts index 83ebf1c..08ca066 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -931,6 +931,16 @@ function createApplicationMenu() { } }, }, + { + label: 'Copy Plan', + accelerator: isMac ? 'Cmd+Shift+C' : 'Ctrl+Shift+C', + click: () => { + const focusedWindow = BrowserWindow.getFocusedWindow(); + if (focusedWindow) { + sendMenuEvent(focusedWindow, MENU_EVENTS.copyPlan); + } + }, + }, { type: 'separator' }, { label: 'Close Window', @@ -998,7 +1008,7 @@ function createApplicationMenu() { }, }, { - label: 'Pay Options', + label: 'Pay Details', accelerator: isMac ? 'Cmd+Shift+P' : 'Ctrl+Shift+P', click: () => { const focusedWindow = BrowserWindow.getFocusedWindow(); @@ -1202,7 +1212,7 @@ function createApplicationMenu() { } /** - * Handle closing a window with unsaved changes check + * Handle closing a window by attempting save-first behavior when unsaved changes exist. */ async function handleCloseWindow(window: BrowserWindow) { try { @@ -1211,23 +1221,21 @@ async function handleCloseWindow(window: BrowserWindow) { ); if (hasUnsaved) { - const result = await dialog.showMessageBox(window, { - type: 'warning', + // Show "Do you want to save?" dialog for unsaved plans + const response = dialog.showMessageBoxSync(window, { + type: 'question', buttons: ['Save', "Don't Save", 'Cancel'], defaultId: 0, cancelId: 2, - title: 'Unsaved Changes', - message: 'You have unsaved changes', - detail: 'Do you want to save your plan before closing this window?', + title: 'Save Plan?', + message: 'This plan has unsaved changes. Do you want to save before closing?', }); - if (result.response === 2) { - // Cancel + if (response === 2) { + // User clicked Cancel, don't close return; - } - - if (result.response === 0) { - // Save + } else if (response === 0) { + // User clicked Save, attempt to save const saveSuccess = await window.webContents.executeJavaScript( `(async () => { if (typeof window.__requestSaveBeforeClose === 'function') { @@ -1242,10 +1250,14 @@ async function handleCloseWindow(window: BrowserWindow) { ); if (!saveSuccess) { - // Save failed or user canceled save dialog + dialog.showErrorBox( + 'Save Failed', + 'Could not save this plan. Please use File > Save (or Cmd/Ctrl+S) and try again.' + ); return; } } + // If response === 1, user clicked "Don't Save" - proceed to close without saving } // Always save window state (size and active tab) even if content wasn't saved @@ -1273,6 +1285,7 @@ async function handleCloseWindow(window: BrowserWindow) { console.error('Error checking unsaved changes:', error); dialog.showErrorBox('Close Error', 'Unable to verify save state. The window was not closed to prevent data loss.'); } + } // Save all window states before quitting diff --git a/index.html b/index.html index 4c75618..b4bf63b 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,10 @@ +