From a4874815a64df1c5d1f9aee76c2baaae1fe7d222 Mon Sep 17 00:00:00 2001 From: Josh Pigford Date: Tue, 25 Feb 2025 10:14:07 -0600 Subject: [PATCH] Add breadcrumbs support across application (#1897) * Add breadcrumbs support across application Fixes #1896 * Potential fix for tests * Simplify breadcrumbs implementation Remove complex breadcrumbs logic from controllers and concern, replacing with a simpler default approach that sets a basic breadcrumb based on the current controller name * Refactor page header and breadcrumbs rendering Remove complex breadcrumbs helper method and update layout to use more flexible content_for approach for page headers and breadcrumbs * Add fallback breadcrumbs rendering to settings layout --- app/controllers/application_controller.rb | 2 +- app/controllers/budgets_controller.rb | 1 + app/controllers/concerns/breadcrumbable.rb | 13 ++++++++++ app/controllers/pages_controller.rb | 2 ++ app/controllers/transactions_controller.rb | 1 + app/views/layouts/application.html.erb | 11 ++++++++ app/views/layouts/settings.html.erb | 6 +++++ .../layouts/shared/_breadcrumbs.html.erb | 21 +++++++++++++++ .../layouts/shared/_page_header.html.erb | 11 ++++++++ app/views/pages/dashboard.html.erb | 26 +++++-------------- test/system/accounts_test.rb | 2 +- 11 files changed, 75 insertions(+), 21 deletions(-) create mode 100644 app/controllers/concerns/breadcrumbable.rb create mode 100644 app/views/layouts/shared/_breadcrumbs.html.erb create mode 100644 app/views/layouts/shared/_page_header.html.erb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 2951cbfd..be739d23 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,5 +1,5 @@ class ApplicationController < ActionController::Base - include Onboardable, Localize, AutoSync, Authentication, Invitable, SelfHostable, StoreLocation, Impersonatable + include Onboardable, Localize, AutoSync, Authentication, Invitable, SelfHostable, StoreLocation, Impersonatable, Breadcrumbable include Pagy::Backend helper_method :require_upgrade?, :subscription_pending? diff --git a/app/controllers/budgets_controller.rb b/app/controllers/budgets_controller.rb index 992dec44..9ec26e83 100644 --- a/app/controllers/budgets_controller.rb +++ b/app/controllers/budgets_controller.rb @@ -25,6 +25,7 @@ class BudgetsController < ApplicationController end private + def budget_create_params params.require(:budget).permit(:start_date) end diff --git a/app/controllers/concerns/breadcrumbable.rb b/app/controllers/concerns/breadcrumbable.rb new file mode 100644 index 00000000..38ebd889 --- /dev/null +++ b/app/controllers/concerns/breadcrumbable.rb @@ -0,0 +1,13 @@ +module Breadcrumbable + extend ActiveSupport::Concern + + included do + before_action :set_breadcrumbs + end + + private + # The default, unless specific controller or action explicitly overrides + def set_breadcrumbs + @breadcrumbs = [ [ "Home", root_path ], [ controller_name.titleize, nil ] ] + end +end diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 61d39322..0b2b26b4 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -5,6 +5,8 @@ class PagesController < ApplicationController @period = Period.from_key(params[:period], fallback: true) @balance_sheet = Current.family.balance_sheet @accounts = Current.family.accounts.active.with_attached_logo + + @breadcrumbs = [ [ "Home", root_path ], [ "Dashboard", nil ] ] end def changelog diff --git a/app/controllers/transactions_controller.rb b/app/controllers/transactions_controller.rb index a1e254c4..484c53a0 100644 --- a/app/controllers/transactions_controller.rb +++ b/app/controllers/transactions_controller.rb @@ -49,6 +49,7 @@ class TransactionsController < ApplicationController end private + def search_params cleaned_params = params.fetch(:q, {}) .permit( diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index ffdffa7f..13857d81 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -44,6 +44,17 @@ <% end %> <%= tag.div class: class_names("mx-auto w-full h-full", Current.user.show_sidebar? ? "max-w-4xl" : "max-w-5xl"), data: { sidebar_target: "content" } do %> + <% unless controller_path.start_with?('settings/') %> + <% if content_for?(:breadcrumbs) %> + <%= yield :breadcrumbs %> + <% else %> + <%= render "layouts/shared/breadcrumbs", breadcrumbs: @breadcrumbs %> + <% end %> + + <% if content_for?(:page_header) %> + <%= yield :page_header %> + <% end %> + <% end %> <%= yield %> <% end %> <% end %> diff --git a/app/views/layouts/settings.html.erb b/app/views/layouts/settings.html.erb index f8743333..e394b592 100644 --- a/app/views/layouts/settings.html.erb +++ b/app/views/layouts/settings.html.erb @@ -7,6 +7,12 @@
+ <% if content_for?(:breadcrumbs) %> + <%= yield :breadcrumbs %> + <% else %> + <%= render "layouts/shared/breadcrumbs", breadcrumbs: @breadcrumbs %> + <% end %> + <% if content_for?(:page_title) %>

<%= content_for :page_title %> diff --git a/app/views/layouts/shared/_breadcrumbs.html.erb b/app/views/layouts/shared/_breadcrumbs.html.erb new file mode 100644 index 00000000..e6604ba9 --- /dev/null +++ b/app/views/layouts/shared/_breadcrumbs.html.erb @@ -0,0 +1,21 @@ +<%# locals: (breadcrumbs:) %> + + \ No newline at end of file diff --git a/app/views/layouts/shared/_page_header.html.erb b/app/views/layouts/shared/_page_header.html.erb new file mode 100644 index 00000000..9c2e2726 --- /dev/null +++ b/app/views/layouts/shared/_page_header.html.erb @@ -0,0 +1,11 @@ +<%# This partial renders the page header with title and optional subtitle %> +
+ <% if local_assigns[:title].present? %> +
+

<%= title %>

+ <% if local_assigns[:subtitle].present? %> +

<%= subtitle %>

+ <% end %> +
+ <% end %> +
\ No newline at end of file diff --git a/app/views/pages/dashboard.html.erb b/app/views/pages/dashboard.html.erb index b9055b70..cc6ef589 100644 --- a/app/views/pages/dashboard.html.erb +++ b/app/views/pages/dashboard.html.erb @@ -1,23 +1,11 @@ +<% content_for :page_header do %> +
+

Welcome back, <%= Current.user.first_name %>

+

Here's what's happening with your money this week

+
+<% end %> +
-
- - -
-

Welcome back, <%= Current.user.first_name %>

-

Here's what's happening with your money this week

-
-
-
<%= render partial: "pages/dashboard/net_worth_chart", locals: { series: @balance_sheet.net_worth_series(period: @period), period: @period } %>
diff --git a/test/system/accounts_test.rb b/test/system/accounts_test.rb index 64c5a8bf..ff8d4500 100644 --- a/test/system/accounts_test.rb +++ b/test/system/accounts_test.rb @@ -103,7 +103,7 @@ class AccountsTest < ApplicationSystemTestCase visit account_url(created_account) - within "header" do + within "header:has(button[data-menu-target='button'])" do find('button[data-menu-target="button"]').click click_on "Edit" end