diff --git a/app/controllers/budget_categories_controller.rb b/app/controllers/budget_categories_controller.rb index fa6e22e403f..ef83da7d0d4 100644 --- a/app/controllers/budget_categories_controller.rb +++ b/app/controllers/budget_categories_controller.rb @@ -1,12 +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 @@ -23,13 +23,25 @@ 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) } + end + else + render :index, status: :unprocessable_entity + end end 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 + + 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 56077ee94f7..8355a97836d 100644 --- a/app/views/budget_categories/_allocation_progress.erb +++ b/app/views/budget_categories/_allocation_progress.erb @@ -1,26 +1,44 @@ <%# locals: (budget:) %> -
+
-
">
+ <% 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 eaa485aee15..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 83e85f8dc14..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", 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 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 5adee7c66fe..f40879de05f 100644 --- a/app/views/budget_categories/index.html.erb +++ b/app/views/budget_categories/index.html.erb @@ -21,14 +21,10 @@
<% 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.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..31a70c51fca --- /dev/null +++ b/app/views/budget_categories/update.turbo_stream.erb @@ -0,0 +1 @@ +<%= turbo_stream.replace dom_id(@budget, :allocation_progress), partial: "budget_categories/allocation_progress", locals: { budget: @budget } %>