mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-19 13:19:39 +02:00
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
This commit is contained in:
parent
763e222cdd
commit
a4874815a6
11 changed files with 75 additions and 21 deletions
|
@ -1,5 +1,5 @@
|
||||||
class ApplicationController < ActionController::Base
|
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
|
include Pagy::Backend
|
||||||
|
|
||||||
helper_method :require_upgrade?, :subscription_pending?
|
helper_method :require_upgrade?, :subscription_pending?
|
||||||
|
|
|
@ -25,6 +25,7 @@ class BudgetsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def budget_create_params
|
def budget_create_params
|
||||||
params.require(:budget).permit(:start_date)
|
params.require(:budget).permit(:start_date)
|
||||||
end
|
end
|
||||||
|
|
13
app/controllers/concerns/breadcrumbable.rb
Normal file
13
app/controllers/concerns/breadcrumbable.rb
Normal file
|
@ -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
|
|
@ -5,6 +5,8 @@ class PagesController < ApplicationController
|
||||||
@period = Period.from_key(params[:period], fallback: true)
|
@period = Period.from_key(params[:period], fallback: true)
|
||||||
@balance_sheet = Current.family.balance_sheet
|
@balance_sheet = Current.family.balance_sheet
|
||||||
@accounts = Current.family.accounts.active.with_attached_logo
|
@accounts = Current.family.accounts.active.with_attached_logo
|
||||||
|
|
||||||
|
@breadcrumbs = [ [ "Home", root_path ], [ "Dashboard", nil ] ]
|
||||||
end
|
end
|
||||||
|
|
||||||
def changelog
|
def changelog
|
||||||
|
|
|
@ -49,6 +49,7 @@ class TransactionsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def search_params
|
def search_params
|
||||||
cleaned_params = params.fetch(:q, {})
|
cleaned_params = params.fetch(:q, {})
|
||||||
.permit(
|
.permit(
|
||||||
|
|
|
@ -44,6 +44,17 @@
|
||||||
<% end %>
|
<% 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 %>
|
<%= 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 %>
|
<%= yield %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
@ -7,6 +7,12 @@
|
||||||
<main class="py-4 px-10 grow flex h-full overflow-y-auto">
|
<main class="py-4 px-10 grow flex h-full overflow-y-auto">
|
||||||
<div class="relative max-w-4xl mx-auto flex flex-col w-full h-full">
|
<div class="relative max-w-4xl mx-auto flex flex-col w-full h-full">
|
||||||
<div class="grow space-y-4 overflow-y-auto -mx-1 px-1 pb-12">
|
<div class="grow space-y-4 overflow-y-auto -mx-1 px-1 pb-12">
|
||||||
|
<% if content_for?(:breadcrumbs) %>
|
||||||
|
<%= yield :breadcrumbs %>
|
||||||
|
<% else %>
|
||||||
|
<%= render "layouts/shared/breadcrumbs", breadcrumbs: @breadcrumbs %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<% if content_for?(:page_title) %>
|
<% if content_for?(:page_title) %>
|
||||||
<h1 class="text-primary text-xl font-medium">
|
<h1 class="text-primary text-xl font-medium">
|
||||||
<%= content_for :page_title %>
|
<%= content_for :page_title %>
|
||||||
|
|
21
app/views/layouts/shared/_breadcrumbs.html.erb
Normal file
21
app/views/layouts/shared/_breadcrumbs.html.erb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
<%# locals: (breadcrumbs:) %>
|
||||||
|
|
||||||
|
<nav class="flex items-center gap-2 mb-6">
|
||||||
|
<button data-action="sidebar#toggle" class="w-9 h-9 inline-flex rounded-lg items-center justify-center hover:bg-gray-100 cursor-pointer">
|
||||||
|
<%= icon("panel-left", color: "gray") %>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<% breadcrumbs.each_with_index do |(name, path), index| %>
|
||||||
|
<% if index > 0 %>
|
||||||
|
<%= icon("chevron-right", color: "gray", size: "sm") %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if path.present? && index < breadcrumbs.size - 1 %>
|
||||||
|
<%= link_to name, path, class: "text-sm text-gray-500 font-medium" %>
|
||||||
|
<% elsif index == breadcrumbs.size - 1 %>
|
||||||
|
<span class="text-gray-900 font-medium text-sm"><%= name %></span>
|
||||||
|
<% else %>
|
||||||
|
<span class="text-sm text-gray-500 font-medium"><%= name %></span>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</nav>
|
11
app/views/layouts/shared/_page_header.html.erb
Normal file
11
app/views/layouts/shared/_page_header.html.erb
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<%# This partial renders the page header with title and optional subtitle %>
|
||||||
|
<header class="space-y-6">
|
||||||
|
<% if local_assigns[:title].present? %>
|
||||||
|
<div class="space-y-1">
|
||||||
|
<h1 class="text-3xl font-medium text-gray-900"><%= title %></h1>
|
||||||
|
<% if local_assigns[:subtitle].present? %>
|
||||||
|
<p class="text-gray-500"><%= subtitle %></p>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</header>
|
|
@ -1,23 +1,11 @@
|
||||||
|
<% content_for :page_header do %>
|
||||||
|
<div class="space-y-1 mb-6">
|
||||||
|
<h1 class="text-3xl font-medium text-gray-900">Welcome back, <%= Current.user.first_name %></h1>
|
||||||
|
<p class="text-gray-500">Here's what's happening with your money this week</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<div class="w-full space-y-6 pb-24">
|
<div class="w-full space-y-6 pb-24">
|
||||||
<header class="space-y-6">
|
|
||||||
<nav class="flex items-center gap-2">
|
|
||||||
<button data-action="sidebar#toggle" class="w-9 h-9 inline-flex rounded-lg items-center justify-center hover:bg-gray-100 cursor-pointer">
|
|
||||||
<%= icon("panel-left", color: "gray") %>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<span class="text-sm text-gray-500 font-medium">Home</span>
|
|
||||||
|
|
||||||
<%= icon("chevron-right", color: "gray", size: "sm") %>
|
|
||||||
|
|
||||||
<span class="text-gray-900 font-medium text-sm">Dashboard</span>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="space-y-1">
|
|
||||||
<h1 class="text-3xl font-medium text-gray-900">Welcome back, <%= Current.user.first_name %></h1>
|
|
||||||
<p class="text-gray-500">Here's what's happening with your money this week</p>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<section class="bg-white py-4 rounded-xl shadow-border-xs">
|
<section class="bg-white py-4 rounded-xl shadow-border-xs">
|
||||||
<%= render partial: "pages/dashboard/net_worth_chart", locals: { series: @balance_sheet.net_worth_series(period: @period), period: @period } %>
|
<%= render partial: "pages/dashboard/net_worth_chart", locals: { series: @balance_sheet.net_worth_series(period: @period), period: @period } %>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -103,7 +103,7 @@ class AccountsTest < ApplicationSystemTestCase
|
||||||
|
|
||||||
visit account_url(created_account)
|
visit account_url(created_account)
|
||||||
|
|
||||||
within "header" do
|
within "header:has(button[data-menu-target='button'])" do
|
||||||
find('button[data-menu-target="button"]').click
|
find('button[data-menu-target="button"]').click
|
||||||
click_on "Edit"
|
click_on "Edit"
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue