From 57d07dd83ee32d6dd1cefebbf99aaae1feae4178 Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Tue, 4 Feb 2025 13:25:13 -0500 Subject: [PATCH 1/4] First pass --- app/controllers/budget_categories_controller.rb | 11 +++++++++-- app/views/budget_categories/_allocation_progress.erb | 2 +- .../_allocation_progress_overage.html.erb | 2 +- .../budget_categories/_budget_category_form.html.erb | 2 +- app/views/budget_categories/index.html.erb | 2 +- app/views/budget_categories/update.turbo_stream.erb | 5 +++++ 6 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 app/views/budget_categories/update.turbo_stream.erb diff --git a/app/controllers/budget_categories_controller.rb b/app/controllers/budget_categories_controller.rb index fa6e22e403f..938466c13c7 100644 --- a/app/controllers/budget_categories_controller.rb +++ b/app/controllers/budget_categories_controller.rb @@ -1,6 +1,7 @@ class BudgetCategoriesController < ApplicationController def index @budget = Current.family.budgets.find(params[:budget_id]) + @budget_categories = @budget.budget_categories.includes(:category) render layout: "wizard" end @@ -23,9 +24,15 @@ def show def update @budget_category = Current.family.budget_categories.find(params[:id]) - @budget_category.update!(budget_category_params) - redirect_to budget_budget_categories_path(@budget_category.budget) + if @budget_category.update(budget_category_params) + respond_to do |format| + format.turbo_stream + format.html { redirect_to budget_budget_categories_path(@budget_category.budget) } + end + else + render :index, status: :unprocessable_entity + end end private diff --git a/app/views/budget_categories/_allocation_progress.erb b/app/views/budget_categories/_allocation_progress.erb index 56077ee94f7..803133c4572 100644 --- a/app/views/budget_categories/_allocation_progress.erb +++ b/app/views/budget_categories/_allocation_progress.erb @@ -1,6 +1,6 @@ <%# locals: (budget:) %> -
+
">
diff --git a/app/views/budget_categories/_allocation_progress_overage.html.erb b/app/views/budget_categories/_allocation_progress_overage.html.erb index eaa485aee15..01b9b8cc8f7 100644 --- a/app/views/budget_categories/_allocation_progress_overage.html.erb +++ b/app/views/budget_categories/_allocation_progress_overage.html.erb @@ -1,6 +1,6 @@ <%# locals: (budget:) %> -
+
diff --git a/app/views/budget_categories/_budget_category_form.html.erb b/app/views/budget_categories/_budget_category_form.html.erb index 83e85f8dc14..9da937b134e 100644 --- a/app/views/budget_categories/_budget_category_form.html.erb +++ b/app/views/budget_categories/_budget_category_form.html.erb @@ -12,7 +12,7 @@
- <%= form_with model: [budget_category.budget, budget_category], data: { controller: "auto-submit-form", auto_submit_form_trigger_event_value: "blur", turbo_frame: :_top } do |f| %> + <%= form_with model: [budget_category.budget, budget_category], data: { controller: "auto-submit-form" } do |f| %>
<%= currency.symbol %> diff --git a/app/views/budget_categories/index.html.erb b/app/views/budget_categories/index.html.erb index 5adee7c66fe..71deb8f3cf4 100644 --- a/app/views/budget_categories/index.html.erb +++ b/app/views/budget_categories/index.html.erb @@ -28,7 +28,7 @@ <% end %>
- <% BudgetCategory::Group.for(@budget.budget_categories).sort_by(&:name).each do |group| %> + <% BudgetCategory::Group.for(@budget_categories).sort_by(&:name).each do |group| %>
<%= render "budget_categories/budget_category_form", budget_category: group.budget_category %> diff --git a/app/views/budget_categories/update.turbo_stream.erb b/app/views/budget_categories/update.turbo_stream.erb new file mode 100644 index 00000000000..e7d86a00b90 --- /dev/null +++ b/app/views/budget_categories/update.turbo_stream.erb @@ -0,0 +1,5 @@ +<% if @budget_category.budget.available_to_allocate.negative? %> + <%= turbo_stream.replace dom_id(@budget_category.budget, :allocation_progress_overage), partial: "budget_categories/allocation_progress_overage", locals: { budget: @budget_category.budget } %> +<% else %> + <%= turbo_stream.replace dom_id(@budget_category.budget, :allocation_progress), partial: "budget_categories/allocation_progress", locals: { budget: @budget_category.budget } %> +<% end %> From bc9d31518a85d1051baac9be4f75b91bd8377778 Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Tue, 4 Feb 2025 16:24:17 -0500 Subject: [PATCH 2/4] Fix null constraint bug for budget category assignment --- app/controllers/budget_categories_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/budget_categories_controller.rb b/app/controllers/budget_categories_controller.rb index 938466c13c7..64bf70936aa 100644 --- a/app/controllers/budget_categories_controller.rb +++ b/app/controllers/budget_categories_controller.rb @@ -37,6 +37,8 @@ def update private def budget_category_params - params.require(:budget_category).permit(:budgeted_spending) + params.require(:budget_category).permit(:budgeted_spending).tap do |params| + params[:budgeted_spending] = params[:budgeted_spending].presence || 0 + end end end From 80fe50d3885ae5be38e1bd19d852e314dbec7681 Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Tue, 4 Feb 2025 17:51:07 -0500 Subject: [PATCH 3/4] Fix autofocus reset when allocating budget --- .../budget_categories_controller.rb | 11 +++--- .../auto_submit_form_controller.js | 12 +++---- .../_allocation_progress.erb | 34 ++++++++++++++----- .../_allocation_progress_overage.html.erb | 25 -------------- .../_budget_category_form.html.erb | 3 +- app/views/budget_categories/index.html.erb | 6 +--- .../budget_categories/update.turbo_stream.erb | 6 +--- 7 files changed, 43 insertions(+), 54 deletions(-) delete mode 100644 app/views/budget_categories/_allocation_progress_overage.html.erb diff --git a/app/controllers/budget_categories_controller.rb b/app/controllers/budget_categories_controller.rb index 64bf70936aa..ef83da7d0d4 100644 --- a/app/controllers/budget_categories_controller.rb +++ b/app/controllers/budget_categories_controller.rb @@ -1,13 +1,12 @@ class BudgetCategoriesController < ApplicationController + before_action :set_budget + def index - @budget = Current.family.budgets.find(params[:budget_id]) @budget_categories = @budget.budget_categories.includes(:category) render layout: "wizard" end def show - @budget = Current.family.budgets.find(params[:budget_id]) - @recent_transactions = @budget.entries if params[:id] == BudgetCategory.uncategorized.id @@ -28,7 +27,7 @@ def update if @budget_category.update(budget_category_params) respond_to do |format| format.turbo_stream - format.html { redirect_to budget_budget_categories_path(@budget_category.budget) } + format.html { redirect_to budget_budget_categories_path(@budget) } end else render :index, status: :unprocessable_entity @@ -41,4 +40,8 @@ def budget_category_params params[:budgeted_spending] = params[:budgeted_spending].presence || 0 end end + + def set_budget + @budget = Current.family.budgets.find(params[:budget_id]) + end end diff --git a/app/javascript/controllers/auto_submit_form_controller.js b/app/javascript/controllers/auto_submit_form_controller.js index 817afb68829..18744c4d359 100644 --- a/app/javascript/controllers/auto_submit_form_controller.js +++ b/app/javascript/controllers/auto_submit_form_controller.js @@ -25,7 +25,7 @@ export default class extends Controller { } handleInput = (event) => { - const target = event.target + const target = event.target; clearTimeout(this.timeout); this.timeout = setTimeout(() => { @@ -34,18 +34,18 @@ export default class extends Controller { }; #debounceTimeout(element) { - if(element.dataset.autosubmitDebounceTimeout) { + if (element.dataset.autosubmitDebounceTimeout) { return Number.parseInt(element.dataset.autosubmitDebounceTimeout); } const type = element.type || element.tagName; switch (type.toLowerCase()) { - case 'input': - case 'textarea': + case "input": + case "textarea": return 500; - case 'select-one': - case 'select-multiple': + case "select-one": + case "select-multiple": return 0; default: return 500; diff --git a/app/views/budget_categories/_allocation_progress.erb b/app/views/budget_categories/_allocation_progress.erb index 803133c4572..8355a97836d 100644 --- a/app/views/budget_categories/_allocation_progress.erb +++ b/app/views/budget_categories/_allocation_progress.erb @@ -2,25 +2,43 @@
-
">
+ <% if budget.available_to_allocate.negative? %> +
+ <% else %> +
">
+ <% end %> -

- <%= number_to_percentage(budget.allocated_percent, precision: 0) %> set -

+ <% if budget.available_to_allocate.negative? %> +

> 100% set

+ <% else %> +

+ <%= number_to_percentage(budget.allocated_percent, precision: 0) %> set +

+ <% end %>

- <%= format_money(budget.allocated_spending_money) %> + "><%= format_money(budget.allocated_spending_money) %> / <%= format_money(budget.budgeted_spending_money) %>

-
+ <% if budget.available_to_allocate.negative? %> +
+ <% else %> +
+ <% end %>
- <%= format_money(budget.available_to_allocate_money) %> - left to allocate + <% if budget.available_to_allocate.negative? %> +

+ Budget exceeded by <%= format_money(budget.available_to_allocate_money.abs) %> +

+ <% else %> + <%= format_money(budget.available_to_allocate_money) %> + left to allocate + <% end %>
diff --git a/app/views/budget_categories/_allocation_progress_overage.html.erb b/app/views/budget_categories/_allocation_progress_overage.html.erb deleted file mode 100644 index 01b9b8cc8f7..00000000000 --- a/app/views/budget_categories/_allocation_progress_overage.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -<%# locals: (budget:) %> - -
-
-
- -

> 100% set

- -

- <%= format_money(budget.allocated_spending_money) %> - / - <%= format_money(budget.budgeted_spending_money) %> -

-
- -
-
-
- -
-

- Budget exceeded by <%= format_money(budget.available_to_allocate_money.abs) %> -

-
-
diff --git a/app/views/budget_categories/_budget_category_form.html.erb b/app/views/budget_categories/_budget_category_form.html.erb index 9da937b134e..770d6293ebc 100644 --- a/app/views/budget_categories/_budget_category_form.html.erb +++ b/app/views/budget_categories/_budget_category_form.html.erb @@ -12,7 +12,7 @@
- <%= form_with model: [budget_category.budget, budget_category], data: { controller: "auto-submit-form" } do |f| %> + <%= form_with model: [budget_category.budget, budget_category], data: { controller: "auto-submit-form preserve-focus" } do |f| %>
<%= currency.symbol %> @@ -20,6 +20,7 @@ class: "form-field__input text-right [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none", placeholder: "0", step: currency.step, + id: dom_id(budget_category, :budgeted_spending), min: 0, data: { auto_submit_form_target: "auto" } %>
diff --git a/app/views/budget_categories/index.html.erb b/app/views/budget_categories/index.html.erb index 71deb8f3cf4..f40879de05f 100644 --- a/app/views/budget_categories/index.html.erb +++ b/app/views/budget_categories/index.html.erb @@ -21,11 +21,7 @@
<% else %>
- <% if @budget.available_to_allocate.negative? %> - <%= render "budget_categories/allocation_progress_overage", budget: @budget %> - <% else %> - <%= render "budget_categories/allocation_progress", budget: @budget %> - <% end %> + <%= render "budget_categories/allocation_progress", budget: @budget %>
<% BudgetCategory::Group.for(@budget_categories).sort_by(&:name).each do |group| %> diff --git a/app/views/budget_categories/update.turbo_stream.erb b/app/views/budget_categories/update.turbo_stream.erb index e7d86a00b90..0448d3166d4 100644 --- a/app/views/budget_categories/update.turbo_stream.erb +++ b/app/views/budget_categories/update.turbo_stream.erb @@ -1,5 +1 @@ -<% if @budget_category.budget.available_to_allocate.negative? %> - <%= turbo_stream.replace dom_id(@budget_category.budget, :allocation_progress_overage), partial: "budget_categories/allocation_progress_overage", locals: { budget: @budget_category.budget } %> -<% else %> - <%= turbo_stream.replace dom_id(@budget_category.budget, :allocation_progress), partial: "budget_categories/allocation_progress", locals: { budget: @budget_category.budget } %> -<% end %> +<%= turbo_stream.replace dom_id(@budget, :allocation_progress), partial: "budget_categories/allocation_progress", locals: { budget: @budget } %> \ No newline at end of file From 315cbab907dbd70ebd0c0e54c36133cd4a51cd4d Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Tue, 4 Feb 2025 17:52:44 -0500 Subject: [PATCH 4/4] Lint fix --- app/views/budget_categories/update.turbo_stream.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/budget_categories/update.turbo_stream.erb b/app/views/budget_categories/update.turbo_stream.erb index 0448d3166d4..31a70c51fca 100644 --- a/app/views/budget_categories/update.turbo_stream.erb +++ b/app/views/budget_categories/update.turbo_stream.erb @@ -1 +1 @@ -<%= turbo_stream.replace dom_id(@budget, :allocation_progress), partial: "budget_categories/allocation_progress", locals: { budget: @budget } %> \ No newline at end of file +<%= turbo_stream.replace dom_id(@budget, :allocation_progress), partial: "budget_categories/allocation_progress", locals: { budget: @budget } %>