[PR #7420] [AI] Add option to 'Copy [budget] to future months' #33077

Open
opened 2026-04-18 09:00:42 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/actualbudget/actual/pull/7420
Author: @nikhilweee
Created: 4/8/2026
Status: 🔄 Open

Base: masterHead: copy-to-future-months


📝 Commits (8)

  • 4f0437f [AI] Add 'Copy to future months' budget option
  • 14be73f [AI] Rename release note to PR #7420
  • 1a8e865 Merge remote-tracking branch 'origin/master' into copy-to-future-months
  • 46d3c21 Merge branch 'master' into copy-to-future-months
  • ce63562 Merge branch 'master' into copy-to-future-months
  • 7010197 Merge branch 'master' into copy-to-future-months
  • 736fac7 [AI] Skip empty budget months in copyToFutureMonths
  • 3762f88 Merge branch 'master' into copy-to-future-months

📊 Changes

13 files changed (+183 additions, -0 deletions)

View changed files

📝 packages/desktop-client/src/budget/mutations.ts (+13 -0)
📝 packages/desktop-client/src/components/budget/envelope/BudgetMenu.tsx (+9 -0)
📝 packages/desktop-client/src/components/budget/envelope/EnvelopeBudgetComponents.tsx (+8 -0)
📝 packages/desktop-client/src/components/budget/tracking/BudgetMenu.tsx (+9 -0)
📝 packages/desktop-client/src/components/budget/tracking/TrackingBudgetComponents.tsx (+8 -0)
📝 packages/desktop-client/src/components/mobile/budget/BudgetCell.tsx (+8 -0)
📝 packages/desktop-client/src/components/modals/EnvelopeBudgetMenuModal.tsx (+2 -0)
📝 packages/desktop-client/src/components/modals/TrackingBudgetMenuModal.tsx (+2 -0)
📝 packages/desktop-client/src/modals/modalsSlice.ts (+2 -0)
📝 packages/loot-core/src/server/budget/actions.test.ts (+81 -0)
📝 packages/loot-core/src/server/budget/actions.ts (+30 -0)
📝 packages/loot-core/src/server/budget/app.ts (+5 -0)
upcoming-release-notes/7420.md (+6 -0)

📄 Description

Adds a new per-category budget menu option that copies the current month's budgeted amount to all future months that already exist in the budget. Only months with a non-zero budget value for the selected category are updated, months with no budget set are skipped. Works for both envelope and tracking budget types, and on both desktop (inline popover) and mobile (modal) views.

Description

I often find myself looking for a way to adjust the budget for multiple months at a time, and today there is no way to do so. The only option is to manually click on each month and copy paste values which is unsustainable. This PR adds an option to copy the current month's budget to future months.

None that I could find. Although similar issues discuss copying last month's budget to the current month.

Testing

In the budget view, after entering a value in the 'budget' column, click the dropdown and select 'copy to future months'. This should copy the value to all future months that already exist in the budget.

Checklist

  • Release notes added (see link above)
  • No obvious regressions in affected areas
  • Self-review has been performed - I understand what each change in the code does and why it is needed

Bundle Stats

Bundle Files count Total bundle size % Changed
desktop-client 34 12.93 MB → 12.94 MB (+2.08 kB) +0.02%
loot-core 1 4.85 MB → 4.85 MB (+583 B) +0.01%
api 1 3.88 MB → 3.88 MB (+570 B) +0.01%
cli 1 7.91 MB 0%
crdt 1 41.83 kB 0%
View detailed bundle stats

desktop-client

Total

Files count Total bundle size % Changed
34 12.93 MB → 12.94 MB (+2.08 kB) +0.02%
Changeset
File Δ Size
src/components/budget/tracking/BudgetMenu.tsx 📈 +560 B (+17.06%) 3.21 kB → 3.75 kB
src/components/budget/envelope/BudgetMenu.tsx 📈 +560 B (+17.06%) 3.21 kB → 3.75 kB
src/components/mobile/budget/BudgetCell.tsx 📈 +217 B (+4.12%) 5.14 kB → 5.35 kB
src/components/modals/TrackingBudgetMenuModal.tsx 📈 +116 B (+1.77%) 6.39 kB → 6.51 kB
src/components/modals/EnvelopeBudgetMenuModal.tsx 📈 +116 B (+1.77%) 6.4 kB → 6.51 kB
src/budget/mutations.ts 📈 +154 B (+1.22%) 12.37 kB → 12.52 kB
src/components/budget/tracking/TrackingBudgetComponents.tsx 📈 +201 B (+1.03%) 18.98 kB → 19.17 kB
src/components/budget/envelope/EnvelopeBudgetComponents.tsx 📈 +201 B (+0.69%) 28.38 kB → 28.58 kB
View detailed bundle breakdown

Added
No assets were added

Removed
No assets were removed

Bigger

Asset File Size % Changed
static/js/index.js 1.85 MB → 1.85 MB (+993 B) +0.05%
static/js/Value.js 4.34 MB → 4.34 MB (+915 B) +0.02%
static/js/narrow.js 363.68 kB → 363.89 kB (+217 B) +0.06%

Smaller
No assets were smaller

Unchanged

Asset File Size % Changed
static/js/BackgroundImage.js 121.09 kB 0%
static/js/FormulaEditor.js 814.39 kB 0%
static/js/PayeeRuleCountLabel.js 52.13 kB 0%
static/js/ReportRouter.js 1.18 MB 0%
static/js/ScheduleEditForm.js 136.13 kB 0%
static/js/TransactionEdit.js 185.13 kB 0%
static/js/TransactionList.js 82.8 kB 0%
static/js/ca.js 191.72 kB 0%
static/js/chart-theme.js 709.55 kB 0%
static/js/client.js 450.92 kB 0%
static/js/da.js 104.4 kB 0%
static/js/de.js 174.12 kB 0%
static/js/en-GB.js 8.2 kB 0%
static/js/en.js 176.5 kB 0%
static/js/es.js 181.54 kB 0%
static/js/extends.js 484.53 kB 0%
static/js/fr.js 176.79 kB 0%
static/js/indexeddb-main-thread-worker-e59fee74.js 13.46 kB 0%
static/js/it.js 165.68 kB 0%
static/js/nb-NO.js 151.58 kB 0%
static/js/nl.js 108.66 kB 0%
static/js/pl.js 88.34 kB 0%
static/js/pt-BR.js 193.49 kB 0%
static/js/resize-observer.js 18.06 kB 0%
static/js/th.js 178.91 kB 0%
static/js/theme.js 30.79 kB 0%
static/js/uk.js 212.28 kB 0%
static/js/useFormatList.js 7.62 kB 0%
static/js/wide.js 292 B 0%
static/js/workbox-window.prod.es5.js 7.33 kB 0%
static/js/zh-Hans.js 110.19 kB 0%

loot-core

Total

Files count Total bundle size % Changed
1 4.85 MB → 4.85 MB (+583 B) +0.01%
Changeset
File Δ Size
home/runner/work/actual/actual/packages/loot-core/src/server/budget/actions.ts 📈 +496 B (+4.27%) 11.35 kB → 11.84 kB
home/runner/work/actual/actual/packages/loot-core/src/server/budget/app.ts 📈 +87 B (+1.00%) 8.5 kB → 8.58 kB
View detailed bundle breakdown

Added

Asset File Size % Changed
kcab.worker.CP2XDW9c.js 0 B → 4.85 MB (+4.85 MB) -

Removed

Asset File Size % Changed
kcab.worker.CfHq3vDC.js 4.85 MB → 0 B (-4.85 MB) -100%

Bigger
No assets were bigger

Smaller
No assets were smaller

Unchanged
No assets were unchanged


api

Total

Files count Total bundle size % Changed
1 3.88 MB → 3.88 MB (+570 B) +0.01%
Changeset
File Δ Size
home/runner/work/actual/actual/packages/loot-core/src/server/budget/actions.ts 📈 +484 B (+4.28%) 11.05 kB → 11.52 kB
home/runner/work/actual/actual/packages/loot-core/src/server/budget/app.ts 📈 +86 B (+1.01%) 8.35 kB → 8.43 kB
View detailed bundle breakdown

Added
No assets were added

Removed
No assets were removed

Bigger

Asset File Size % Changed
index.js 3.88 MB → 3.88 MB (+570 B) +0.01%

Smaller
No assets were smaller

Unchanged
No assets were unchanged


cli

Total

Files count Total bundle size % Changed
1 7.91 MB 0%
View detailed bundle breakdown

Added
No assets were added

Removed
No assets were removed

Bigger
No assets were bigger

Smaller
No assets were smaller

Unchanged

Asset File Size % Changed
cli.js 7.91 MB 0%

crdt

Total

Files count Total bundle size % Changed
1 41.83 kB 0%
View detailed bundle breakdown

Added
No assets were added

Removed
No assets were removed

Bigger
No assets were bigger

Smaller
No assets were smaller

Unchanged

Asset File Size % Changed
index.js 41.83 kB 0%

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/actualbudget/actual/pull/7420 **Author:** [@nikhilweee](https://github.com/nikhilweee) **Created:** 4/8/2026 **Status:** 🔄 Open **Base:** `master` ← **Head:** `copy-to-future-months` --- ### 📝 Commits (8) - [`4f0437f`](https://github.com/actualbudget/actual/commit/4f0437f3476c636efeb6fb8ff61f465fca3f15bc) [AI] Add 'Copy to future months' budget option - [`14be73f`](https://github.com/actualbudget/actual/commit/14be73fca3b465d5d8d9bc984c1910b639fcc80c) [AI] Rename release note to PR #7420 - [`1a8e865`](https://github.com/actualbudget/actual/commit/1a8e8653869379fac90a9e91db8da62d2ffb580b) Merge remote-tracking branch 'origin/master' into copy-to-future-months - [`46d3c21`](https://github.com/actualbudget/actual/commit/46d3c21a90b98653cd97a86413ba8b6878f0a482) Merge branch 'master' into copy-to-future-months - [`ce63562`](https://github.com/actualbudget/actual/commit/ce6356243dbff391f06d7a5e624e9901d654939d) Merge branch 'master' into copy-to-future-months - [`7010197`](https://github.com/actualbudget/actual/commit/701019752a0fb40b0c6d1a9f6696b268d02b2dff) Merge branch 'master' into copy-to-future-months - [`736fac7`](https://github.com/actualbudget/actual/commit/736fac7d3ac44593c73c69196c941e2386b14ec9) [AI] Skip empty budget months in copyToFutureMonths - [`3762f88`](https://github.com/actualbudget/actual/commit/3762f8889d8dfd095f35ad6f8484794299ccdfab) Merge branch 'master' into copy-to-future-months ### 📊 Changes **13 files changed** (+183 additions, -0 deletions) <details> <summary>View changed files</summary> 📝 `packages/desktop-client/src/budget/mutations.ts` (+13 -0) 📝 `packages/desktop-client/src/components/budget/envelope/BudgetMenu.tsx` (+9 -0) 📝 `packages/desktop-client/src/components/budget/envelope/EnvelopeBudgetComponents.tsx` (+8 -0) 📝 `packages/desktop-client/src/components/budget/tracking/BudgetMenu.tsx` (+9 -0) 📝 `packages/desktop-client/src/components/budget/tracking/TrackingBudgetComponents.tsx` (+8 -0) 📝 `packages/desktop-client/src/components/mobile/budget/BudgetCell.tsx` (+8 -0) 📝 `packages/desktop-client/src/components/modals/EnvelopeBudgetMenuModal.tsx` (+2 -0) 📝 `packages/desktop-client/src/components/modals/TrackingBudgetMenuModal.tsx` (+2 -0) 📝 `packages/desktop-client/src/modals/modalsSlice.ts` (+2 -0) 📝 `packages/loot-core/src/server/budget/actions.test.ts` (+81 -0) 📝 `packages/loot-core/src/server/budget/actions.ts` (+30 -0) 📝 `packages/loot-core/src/server/budget/app.ts` (+5 -0) ➕ `upcoming-release-notes/7420.md` (+6 -0) </details> ### 📄 Description Adds a new per-category budget menu option that copies the current month's budgeted amount to all future months that already exist in the budget. Only months with a non-zero budget value for the selected category are updated, months with no budget set are skipped. Works for both envelope and tracking budget types, and on both desktop (inline popover) and mobile (modal) views. <!-- Thank you for submitting a pull request! Make sure to follow the instructions to write release notes for your PR — it should only take a minute or two: https://github.com/actualbudget/docs#writing-good-release-notes. Try running yarn generate:release-notes *before* pushing your PR for an interactive experience. --> ## Description <!-- What does this PR do? Why is it needed? Please give context on the "why?": why do we need this change? What problem is it solving for you?--> I often find myself looking for a way to adjust the budget for multiple months at a time, and today there is no way to do so. The only option is to manually click on each month and copy paste values which is unsustainable. This PR adds an option to copy the current month's budget to future months. ## Related issue(s) <!-- e.g. Fixes #123, Relates to #456 --> None that I could find. Although similar issues discuss copying last month's budget to the current month. ## Testing <!-- What did you test? How can we reproduce the issue you are fixing or how can we test the feature you built? --> In the budget view, after entering a value in the 'budget' column, click the dropdown and select 'copy to future months'. This should copy the value to all future months that already exist in the budget. ## Checklist - [x] Release notes added (see link above) - [x] No obvious regressions in affected areas - [x] Self-review has been performed - I understand what each change in the code does and why it is needed <!--- actual-bot-sections ---> <!--- bundlestats-action-comment key:combined start ---> ### Bundle Stats Bundle | Files count | Total bundle size | % Changed ------ | ----------- | ----------------- | --------- desktop-client | 34 | 12.93 MB → 12.94 MB (+2.08 kB) | +0.02% loot-core | 1 | 4.85 MB → 4.85 MB (+583 B) | +0.01% api | 1 | 3.88 MB → 3.88 MB (+570 B) | +0.01% cli | 1 | 7.91 MB | 0% crdt | 1 | 41.83 kB | 0% <details> <summary>View detailed bundle stats</summary> #### desktop-client **Total** Files count | Total bundle size | % Changed ----------- | ----------------- | --------- 34 | 12.93 MB → 12.94 MB (+2.08 kB) | +0.02% <details> <summary>Changeset</summary> File | Δ | Size ---- | - | ---- `src/components/budget/tracking/BudgetMenu.tsx` | 📈 +560 B (+17.06%) | 3.21 kB → 3.75 kB `src/components/budget/envelope/BudgetMenu.tsx` | 📈 +560 B (+17.06%) | 3.21 kB → 3.75 kB `src/components/mobile/budget/BudgetCell.tsx` | 📈 +217 B (+4.12%) | 5.14 kB → 5.35 kB `src/components/modals/TrackingBudgetMenuModal.tsx` | 📈 +116 B (+1.77%) | 6.39 kB → 6.51 kB `src/components/modals/EnvelopeBudgetMenuModal.tsx` | 📈 +116 B (+1.77%) | 6.4 kB → 6.51 kB `src/budget/mutations.ts` | 📈 +154 B (+1.22%) | 12.37 kB → 12.52 kB `src/components/budget/tracking/TrackingBudgetComponents.tsx` | 📈 +201 B (+1.03%) | 18.98 kB → 19.17 kB `src/components/budget/envelope/EnvelopeBudgetComponents.tsx` | 📈 +201 B (+0.69%) | 28.38 kB → 28.58 kB </details> <details> <summary>View detailed bundle breakdown</summary> <div> **Added** No assets were added **Removed** No assets were removed **Bigger** Asset | File Size | % Changed ----- | --------- | --------- static/js/index.js | 1.85 MB → 1.85 MB (+993 B) | +0.05% static/js/Value.js | 4.34 MB → 4.34 MB (+915 B) | +0.02% static/js/narrow.js | 363.68 kB → 363.89 kB (+217 B) | +0.06% **Smaller** No assets were smaller **Unchanged** Asset | File Size | % Changed ----- | --------- | --------- static/js/BackgroundImage.js | 121.09 kB | 0% static/js/FormulaEditor.js | 814.39 kB | 0% static/js/PayeeRuleCountLabel.js | 52.13 kB | 0% static/js/ReportRouter.js | 1.18 MB | 0% static/js/ScheduleEditForm.js | 136.13 kB | 0% static/js/TransactionEdit.js | 185.13 kB | 0% static/js/TransactionList.js | 82.8 kB | 0% static/js/ca.js | 191.72 kB | 0% static/js/chart-theme.js | 709.55 kB | 0% static/js/client.js | 450.92 kB | 0% static/js/da.js | 104.4 kB | 0% static/js/de.js | 174.12 kB | 0% static/js/en-GB.js | 8.2 kB | 0% static/js/en.js | 176.5 kB | 0% static/js/es.js | 181.54 kB | 0% static/js/extends.js | 484.53 kB | 0% static/js/fr.js | 176.79 kB | 0% static/js/indexeddb-main-thread-worker-e59fee74.js | 13.46 kB | 0% static/js/it.js | 165.68 kB | 0% static/js/nb-NO.js | 151.58 kB | 0% static/js/nl.js | 108.66 kB | 0% static/js/pl.js | 88.34 kB | 0% static/js/pt-BR.js | 193.49 kB | 0% static/js/resize-observer.js | 18.06 kB | 0% static/js/th.js | 178.91 kB | 0% static/js/theme.js | 30.79 kB | 0% static/js/uk.js | 212.28 kB | 0% static/js/useFormatList.js | 7.62 kB | 0% static/js/wide.js | 292 B | 0% static/js/workbox-window.prod.es5.js | 7.33 kB | 0% static/js/zh-Hans.js | 110.19 kB | 0% </div> </details> --- #### loot-core **Total** Files count | Total bundle size | % Changed ----------- | ----------------- | --------- 1 | 4.85 MB → 4.85 MB (+583 B) | +0.01% <details> <summary>Changeset</summary> File | Δ | Size ---- | - | ---- `home/runner/work/actual/actual/packages/loot-core/src/server/budget/actions.ts` | 📈 +496 B (+4.27%) | 11.35 kB → 11.84 kB `home/runner/work/actual/actual/packages/loot-core/src/server/budget/app.ts` | 📈 +87 B (+1.00%) | 8.5 kB → 8.58 kB </details> <details> <summary>View detailed bundle breakdown</summary> <div> **Added** Asset | File Size | % Changed ----- | --------- | --------- kcab.worker.CP2XDW9c.js | 0 B → 4.85 MB (+4.85 MB) | - **Removed** Asset | File Size | % Changed ----- | --------- | --------- kcab.worker.CfHq3vDC.js | 4.85 MB → 0 B (-4.85 MB) | -100% **Bigger** No assets were bigger **Smaller** No assets were smaller **Unchanged** No assets were unchanged </div> </details> --- #### api **Total** Files count | Total bundle size | % Changed ----------- | ----------------- | --------- 1 | 3.88 MB → 3.88 MB (+570 B) | +0.01% <details> <summary>Changeset</summary> File | Δ | Size ---- | - | ---- `home/runner/work/actual/actual/packages/loot-core/src/server/budget/actions.ts` | 📈 +484 B (+4.28%) | 11.05 kB → 11.52 kB `home/runner/work/actual/actual/packages/loot-core/src/server/budget/app.ts` | 📈 +86 B (+1.01%) | 8.35 kB → 8.43 kB </details> <details> <summary>View detailed bundle breakdown</summary> <div> **Added** No assets were added **Removed** No assets were removed **Bigger** Asset | File Size | % Changed ----- | --------- | --------- index.js | 3.88 MB → 3.88 MB (+570 B) | +0.01% **Smaller** No assets were smaller **Unchanged** No assets were unchanged </div> </details> --- #### cli **Total** Files count | Total bundle size | % Changed ----------- | ----------------- | --------- 1 | 7.91 MB | 0% <details> <summary>View detailed bundle breakdown</summary> <div> **Added** No assets were added **Removed** No assets were removed **Bigger** No assets were bigger **Smaller** No assets were smaller **Unchanged** Asset | File Size | % Changed ----- | --------- | --------- cli.js | 7.91 MB | 0% </div> </details> --- #### crdt **Total** Files count | Total bundle size | % Changed ----------- | ----------------- | --------- 1 | 41.83 kB | 0% <details> <summary>View detailed bundle breakdown</summary> <div> **Added** No assets were added **Removed** No assets were removed **Bigger** No assets were bigger **Smaller** No assets were smaller **Unchanged** Asset | File Size | % Changed ----- | --------- | --------- index.js | 41.83 kB | 0% </div> </details> </details> <!--- bundlestats-action-comment key:combined end ---> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-04-18 09:00:42 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#33077