From da927c50ef1a4686455ff30b6ef79ef54267df83 Mon Sep 17 00:00:00 2001 From: TheDumbTechGuy Date: Sat, 1 Feb 2025 22:06:41 +0000 Subject: [PATCH] add configuration to control breadcrumb dispaly --- lib/plutonium/definition/base.rb | 9 +++++ .../definition/inheritable_config_attr.rb | 33 +++++++++++++++++++ lib/plutonium/ui/page/base.rb | 10 ++++++ lib/plutonium/ui/page/edit.rb | 2 ++ lib/plutonium/ui/page/index.rb | 2 ++ lib/plutonium/ui/page/interactive_action.rb | 2 ++ lib/plutonium/ui/page/new.rb | 2 ++ lib/plutonium/ui/page/show.rb | 2 ++ 8 files changed, 62 insertions(+) create mode 100644 lib/plutonium/definition/inheritable_config_attr.rb diff --git a/lib/plutonium/definition/base.rb b/lib/plutonium/definition/base.rb index 21a05ed8..86641eb8 100644 --- a/lib/plutonium/definition/base.rb +++ b/lib/plutonium/definition/base.rb @@ -26,6 +26,7 @@ module Definition class Base include DefineableProps include ConfigAttr + include InheritableConfigAttr include Actions include Sorting include Search @@ -64,6 +65,14 @@ class TextFilter < Plutonium::Query::Filters::Text; end :new_page_title, :new_page_description, :edit_page_title, :edit_page_description + # breadcrumbs + inheritable_config_attr :breadcrumbs, + :index_page_breadcrumbs, :new_page_breadcrumbs, + :edit_page_breadcrumbs, :show_page_breadcrumbs, + :interactive_action_page_breadcrumbs + # global default + breadcrumbs true + def initialize super end diff --git a/lib/plutonium/definition/inheritable_config_attr.rb b/lib/plutonium/definition/inheritable_config_attr.rb new file mode 100644 index 00000000..42500023 --- /dev/null +++ b/lib/plutonium/definition/inheritable_config_attr.rb @@ -0,0 +1,33 @@ +module Plutonium + module Definition + module InheritableConfigAttr + extend ActiveSupport::Concern + + class_methods do + def inheritable_config_attr(*names) + names.each do |name| + # Create the underlying class_attribute + attr_name = :"#{name}_config" + class_attribute attr_name, instance_reader: true, instance_accessor: false, default: nil + + # Define class-level method that acts as both getter/setter + define_singleton_method(name) do |value = :__not_set__| + if value == :__not_set__ + # Getter behavior + public_send(:"#{attr_name}") + else + # Setter behavior + public_send(:"#{attr_name}=", value) + end + end + + # Instance-level method + define_method(name) do + self.class.send(name) + end + end + end + end + end + end +end diff --git a/lib/plutonium/ui/page/base.rb b/lib/plutonium/ui/page/base.rb index 3db14d2b..5d749c31 100644 --- a/lib/plutonium/ui/page/base.rb +++ b/lib/plutonium/ui/page/base.rb @@ -43,9 +43,17 @@ def render_header end def render_breadcrumbs + return unless render_breadcrumbs? + Breadcrumbs() end + def render_breadcrumbs? + # Check specific page setting first, fall back to global setting + page_specific_setting = current_definition.send(:"#{page_type}_breadcrumbs") + page_specific_setting.nil? ? current_definition.breadcrumbs : page_specific_setting + end + def render_page_header return unless page_title @@ -106,6 +114,8 @@ def render_before_footer def render_after_footer end + + def page_type = raise NotImplementedError, "#{self.class}#page_type" end end end diff --git a/lib/plutonium/ui/page/edit.rb b/lib/plutonium/ui/page/edit.rb index 966f061a..1ba31fe2 100644 --- a/lib/plutonium/ui/page/edit.rb +++ b/lib/plutonium/ui/page/edit.rb @@ -17,6 +17,8 @@ def page_description def render_default_content render "resource_form" end + + def page_type = :edit_page end end end diff --git a/lib/plutonium/ui/page/index.rb b/lib/plutonium/ui/page/index.rb index 50820ba7..9247a3cf 100644 --- a/lib/plutonium/ui/page/index.rb +++ b/lib/plutonium/ui/page/index.rb @@ -21,6 +21,8 @@ def page_actions def render_default_content render "resource_table" end + + def page_type = :index_page end end end diff --git a/lib/plutonium/ui/page/interactive_action.rb b/lib/plutonium/ui/page/interactive_action.rb index 44cb985e..9dcebb4c 100644 --- a/lib/plutonium/ui/page/interactive_action.rb +++ b/lib/plutonium/ui/page/interactive_action.rb @@ -17,6 +17,8 @@ def page_description def render_default_content render "interactive_action_form" end + + def page_type = :interactive_action_page end end end diff --git a/lib/plutonium/ui/page/new.rb b/lib/plutonium/ui/page/new.rb index 1c79ba1d..2f732351 100644 --- a/lib/plutonium/ui/page/new.rb +++ b/lib/plutonium/ui/page/new.rb @@ -17,6 +17,8 @@ def page_description def render_default_content render "resource_form" end + + def page_type = :new_page end end end diff --git a/lib/plutonium/ui/page/show.rb b/lib/plutonium/ui/page/show.rb index 17b4eeff..8dd0c97b 100644 --- a/lib/plutonium/ui/page/show.rb +++ b/lib/plutonium/ui/page/show.rb @@ -21,6 +21,8 @@ def page_actions def render_default_content render "resource_details" end + + def page_type = :show_page end end end