From ab6fdbbb6806e870362f44728f88f0c82831ff10 Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Fri, 18 Jul 2025 08:30:00 -0400 Subject: [PATCH] Component namespacing (#2463) * [claudesquad] update from 'component-namespacing' on 18 Jul 25 07:23 EDT * [claudesquad] update from 'component-namespacing' on 18 Jul 25 07:30 EDT * Update stimulus controller references to use namespace * Fix remaining tests --- .../alert.html.erb} | 0 .../{alert_component.rb => DS/alert.rb} | 2 +- .../button.html.erb} | 0 .../{button_component.rb => DS/button.rb} | 2 +- .../buttonish.rb} | 4 +-- .../dialog.html.erb} | 2 +- .../{dialog_component.rb => DS/dialog.rb} | 20 ++++++------- app/components/{ => DS}/dialog_controller.js | 0 .../disclosure.html.erb} | 0 .../disclosure.rb} | 2 +- .../filled_icon.html.erb} | 0 .../filled_icon.rb} | 2 +- .../link.html.erb} | 0 .../{link_component.rb => DS/link.rb} | 2 +- .../menu.html.erb} | 8 +++--- .../{menu_component.rb => DS/menu.rb} | 8 +++--- app/components/{ => DS}/menu_controller.js | 0 .../menu_item.html.erb} | 0 .../menu_item.rb} | 2 +- .../{tab_component.rb => DS/tab.rb} | 2 +- app/components/DS/tabs.html.erb | 18 ++++++++++++ .../{tabs_component.rb => DS/tabs.rb} | 6 ++-- .../{tabs/nav_component.rb => DS/tabs/nav.rb} | 4 +-- .../panel_component.rb => DS/tabs/panel.rb} | 2 +- app/components/{ => DS}/tabs_controller.js | 0 .../toggle.html.erb} | 0 .../{toggle_component.rb => DS/toggle.rb} | 2 +- app/components/UI/account_page.html.erb | 2 +- app/components/design_system_component.rb | 2 ++ app/components/tabs_component.html.erb | 18 ------------ app/helpers/application_helper.rb | 2 +- app/helpers/styled_form_builder.rb | 4 +-- app/views/accounts/_account.html.erb | 4 +-- .../accounts/_account_sidebar_tabs.html.erb | 8 +++--- app/views/accounts/_account_type.html.erb | 2 +- .../accounts/_accountable_group.html.erb | 4 +-- app/views/accounts/_empty.html.erb | 2 +- app/views/accounts/_form.html.erb | 2 +- app/views/accounts/_logo.html.erb | 2 +- app/views/accounts/index.html.erb | 2 +- app/views/accounts/new.html.erb | 2 +- app/views/accounts/new/_container.html.erb | 4 +-- app/views/accounts/show/_activity.html.erb | 2 +- app/views/accounts/show/_header.html.erb | 2 +- app/views/accounts/show/_menu.html.erb | 2 +- .../_budget_category.html.erb | 2 +- .../_confirm_button.html.erb | 2 +- .../budget_categories/_no_categories.html.erb | 4 +-- app/views/budget_categories/show.html.erb | 4 +-- app/views/budgets/_budget_donut.html.erb | 6 ++-- app/views/budgets/_budget_header.html.erb | 8 +++--- .../budgets/_over_allocation_warning.html.erb | 2 +- app/views/budgets/_picker.html.erb | 2 +- app/views/budgets/edit.html.erb | 2 +- app/views/budgets/show.html.erb | 4 +-- app/views/categories/_category.html.erb | 2 +- app/views/categories/_menu.html.erb | 2 +- app/views/categories/edit.html.erb | 2 +- app/views/categories/index.html.erb | 8 +++--- app/views/categories/new.html.erb | 2 +- app/views/category/deletions/new.html.erb | 6 ++-- app/views/category/dropdowns/_row.html.erb | 2 +- app/views/category/dropdowns/show.html.erb | 2 +- app/views/chats/_chat.html.erb | 2 +- app/views/chats/_chat_nav.html.erb | 4 +-- app/views/chats/_error.html.erb | 2 +- app/views/chats/index.html.erb | 2 +- app/views/credit_cards/_overview.html.erb | 2 +- app/views/credit_cards/edit.html.erb | 2 +- app/views/credit_cards/new.html.erb | 2 +- app/views/cryptos/edit.html.erb | 2 +- app/views/cryptos/new.html.erb | 2 +- app/views/depositories/edit.html.erb | 2 +- app/views/depositories/new.html.erb | 2 +- .../doorkeeper/authorizations/error.html.erb | 2 +- .../doorkeeper/authorizations/new.html.erb | 4 +-- .../_family_merchant.html.erb | 2 +- app/views/family_merchants/edit.html.erb | 2 +- app/views/family_merchants/index.html.erb | 4 +-- app/views/family_merchants/new.html.erb | 2 +- app/views/holdings/_cash.html.erb | 2 +- app/views/holdings/show.html.erb | 2 +- app/views/import/cleans/show.html.erb | 2 +- app/views/import/configurations/show.html.erb | 4 +-- app/views/import/confirms/_mappings.html.erb | 6 ++-- app/views/import/uploads/show.html.erb | 2 +- app/views/imports/_empty.html.erb | 2 +- app/views/imports/_failure.html.erb | 2 +- app/views/imports/_import.html.erb | 2 +- app/views/imports/_importing.html.erb | 4 +-- app/views/imports/_ready.html.erb | 2 +- app/views/imports/_revert_failure.html.erb | 2 +- app/views/imports/_success.html.erb | 2 +- app/views/imports/index.html.erb | 2 +- app/views/imports/new.html.erb | 2 +- app/views/investments/edit.html.erb | 2 +- app/views/investments/new.html.erb | 2 +- app/views/invitations/new.html.erb | 2 +- app/views/layouts/application.html.erb | 4 +-- app/views/layouts/imports.html.erb | 4 +-- .../layouts/shared/_confirm_dialog.html.erb | 4 +-- app/views/layouts/wizard.html.erb | 4 +-- app/views/loans/edit.html.erb | 2 +- app/views/loans/new.html.erb | 2 +- app/views/loans/tabs/_overview.html.erb | 2 +- app/views/mfa/backup_codes.html.erb | 2 +- app/views/onboardings/_logout.html.erb | 2 +- app/views/onboardings/goals.html.erb | 2 +- app/views/onboardings/trial.html.erb | 28 +++++++++---------- app/views/other_assets/edit.html.erb | 2 +- app/views/other_assets/new.html.erb | 2 +- app/views/other_liabilities/edit.html.erb | 2 +- app/views/other_liabilities/new.html.erb | 2 +- app/views/pages/dashboard.html.erb | 4 +-- .../pages/dashboard/_balance_sheet.html.erb | 2 +- .../pages/dashboard/_cashflow_sankey.html.erb | 4 +-- .../_no_accounts_graph_placeholder.html.erb | 4 +-- .../pages/redis_configuration_error.html.erb | 4 +-- app/views/plaid_items/_plaid_item.html.erb | 4 +-- app/views/properties/_form_alert.html.erb | 4 +-- app/views/properties/address.html.erb | 4 +-- app/views/properties/balances.html.erb | 4 +-- app/views/properties/edit.html.erb | 4 +-- app/views/properties/new.html.erb | 4 +-- app/views/properties/tabs/_overview.html.erb | 2 +- .../rule/conditions/_condition_group.html.erb | 2 +- app/views/rules/_category_rule_cta.html.erb | 4 +-- app/views/rules/_form.html.erb | 6 ++-- app/views/rules/_rule.html.erb | 2 +- app/views/rules/confirm.html.erb | 4 +-- app/views/rules/edit.html.erb | 2 +- app/views/rules/index.html.erb | 8 +++--- app/views/rules/new.html.erb | 2 +- app/views/settings/_settings_nav.html.erb | 4 +-- app/views/settings/api_keys/created.html.erb | 6 ++-- .../api_keys/created.turbo_stream.erb | 6 ++-- app/views/settings/api_keys/new.html.erb | 4 +-- app/views/settings/api_keys/show.html.erb | 18 ++++++------ app/views/settings/billings/show.html.erb | 6 ++-- app/views/settings/profiles/show.html.erb | 10 +++---- app/views/settings/securities/show.html.erb | 4 +-- app/views/subscriptions/upgrade.html.erb | 6 ++-- app/views/tag/deletions/new.html.erb | 6 ++-- app/views/tags/_tag.html.erb | 2 +- app/views/tags/edit.html.erb | 2 +- app/views/tags/index.html.erb | 6 ++-- app/views/tags/new.html.erb | 2 +- app/views/trades/_header.html.erb | 2 +- app/views/trades/_trade.html.erb | 2 +- app/views/trades/new.html.erb | 2 +- app/views/trades/show.html.erb | 2 +- app/views/transactions/_form.html.erb | 2 +- app/views/transactions/_transaction.html.erb | 2 +- .../transactions/bulk_updates/new.html.erb | 10 +++---- app/views/transactions/index.html.erb | 8 +++--- app/views/transactions/new.html.erb | 2 +- .../transactions/searches/_form.html.erb | 5 ++-- .../transactions/searches/_menu.html.erb | 8 +++--- .../filters/_merchant_filter.html.erb | 2 +- .../searches/filters/_tag_filter.html.erb | 2 +- app/views/transactions/show.html.erb | 6 ++-- app/views/transfer_matches/new.html.erb | 2 +- app/views/transfers/new.html.erb | 2 +- app/views/transfers/show.html.erb | 2 +- app/views/users/_user_menu.html.erb | 2 +- app/views/valuations/_valuation.html.erb | 2 +- app/views/valuations/confirm_create.html.erb | 2 +- app/views/valuations/confirm_update.html.erb | 2 +- app/views/valuations/new.html.erb | 4 +-- app/views/valuations/show.html.erb | 6 ++-- app/views/vehicles/edit.html.erb | 2 +- app/views/vehicles/new.html.erb | 2 +- app/views/vehicles/tabs/_overview.html.erb | 2 +- .../previews/alert_component_preview.rb | 2 +- .../previews/button_component_preview.rb | 6 ++-- .../previews/dialog_component_preview.rb | 4 +-- .../previews/disclosure_component_preview.rb | 2 +- .../previews/filled_icon_component_preview.rb | 4 +-- .../previews/link_component_preview.rb | 10 +++---- .../previews/menu_component_preview.rb | 6 ++-- .../previews/toggle_component_preview.rb | 2 +- test/system/accounts_test.rb | 2 +- 182 files changed, 322 insertions(+), 321 deletions(-) rename app/components/{alert_component.html.erb => DS/alert.html.erb} (100%) rename app/components/{alert_component.rb => DS/alert.rb} (97%) rename app/components/{button_component.html.erb => DS/button.html.erb} (100%) rename app/components/{button_component.rb => DS/button.rb} (95%) rename app/components/{buttonish_component.rb => DS/buttonish.rb} (96%) rename app/components/{dialog_component.html.erb => DS/dialog.html.erb} (92%) rename app/components/{dialog_component.rb => DS/dialog.rb} (77%) rename app/components/{ => DS}/dialog_controller.js (100%) rename app/components/{disclosure_component.html.erb => DS/disclosure.html.erb} (100%) rename app/components/{disclosure_component.rb => DS/disclosure.rb} (82%) rename app/components/{filled_icon_component.html.erb => DS/filled_icon.html.erb} (100%) rename app/components/{filled_icon_component.rb => DS/filled_icon.rb} (97%) rename app/components/{link_component.html.erb => DS/link.html.erb} (100%) rename app/components/{link_component.rb => DS/link.rb} (94%) rename app/components/{menu_component.html.erb => DS/menu.html.erb} (59%) rename app/components/{menu_component.rb => DS/menu.rb} (81%) rename app/components/{ => DS}/menu_controller.js (100%) rename app/components/{menu_item_component.html.erb => DS/menu_item.html.erb} (100%) rename app/components/{menu_item_component.rb => DS/menu_item.rb} (97%) rename app/components/{tab_component.rb => DS/tab.rb} (75%) create mode 100644 app/components/DS/tabs.html.erb rename app/components/{tabs_component.rb => DS/tabs.rb} (94%) rename app/components/{tabs/nav_component.rb => DS/tabs/nav.rb} (87%) rename app/components/{tabs/panel_component.rb => DS/tabs/panel.rb} (69%) rename app/components/{ => DS}/tabs_controller.js (100%) rename app/components/{toggle_component.html.erb => DS/toggle.html.erb} (100%) rename app/components/{toggle_component.rb => DS/toggle.rb} (95%) create mode 100644 app/components/design_system_component.rb delete mode 100644 app/components/tabs_component.html.erb diff --git a/app/components/alert_component.html.erb b/app/components/DS/alert.html.erb similarity index 100% rename from app/components/alert_component.html.erb rename to app/components/DS/alert.html.erb diff --git a/app/components/alert_component.rb b/app/components/DS/alert.rb similarity index 97% rename from app/components/alert_component.rb rename to app/components/DS/alert.rb index 47c348f8..22241133 100644 --- a/app/components/alert_component.rb +++ b/app/components/DS/alert.rb @@ -1,4 +1,4 @@ -class AlertComponent < ViewComponent::Base +class DS::Alert < DesignSystemComponent def initialize(message:, variant: :info) @message = message @variant = variant diff --git a/app/components/button_component.html.erb b/app/components/DS/button.html.erb similarity index 100% rename from app/components/button_component.html.erb rename to app/components/DS/button.html.erb diff --git a/app/components/button_component.rb b/app/components/DS/button.rb similarity index 95% rename from app/components/button_component.rb rename to app/components/DS/button.rb index 36600a3c..a253c04c 100644 --- a/app/components/button_component.rb +++ b/app/components/DS/button.rb @@ -2,7 +2,7 @@ # An extension to `button_to` helper. All options are passed through to the `button_to` helper with some additional # options available. -class ButtonComponent < ButtonishComponent +class DS::Button < DS::Buttonish attr_reader :confirm def initialize(confirm: nil, **opts) diff --git a/app/components/buttonish_component.rb b/app/components/DS/buttonish.rb similarity index 96% rename from app/components/buttonish_component.rb rename to app/components/DS/buttonish.rb index 4bbb2882..b83557b1 100644 --- a/app/components/buttonish_component.rb +++ b/app/components/DS/buttonish.rb @@ -1,4 +1,4 @@ -class ButtonishComponent < ViewComponent::Base +class DS::Buttonish < DesignSystemComponent VARIANTS = { primary: { container_classes: "text-inverse bg-inverse hover:bg-inverse-hover disabled:bg-gray-500 theme-dark:disabled:bg-gray-400", @@ -71,7 +71,7 @@ class ButtonishComponent < ViewComponent::Base end def call - raise NotImplementedError, "ButtonishComponent is an abstract class and cannot be instantiated directly." + raise NotImplementedError, "Buttonish is an abstract class and cannot be instantiated directly." end def container_classes(override_classes = nil) diff --git a/app/components/dialog_component.html.erb b/app/components/DS/dialog.html.erb similarity index 92% rename from app/components/dialog_component.html.erb rename to app/components/DS/dialog.html.erb index ac4cd07f..ca8f86b7 100644 --- a/app/components/dialog_component.html.erb +++ b/app/components/DS/dialog.html.erb @@ -1,7 +1,7 @@ <%= wrapper_element do %> <%= tag.dialog class: "w-full h-full bg-transparent theme-dark:backdrop:bg-alpha-black-900 backdrop:bg-overlay #{drawer? ? "lg:p-3" : "lg:p-1"}", **merged_opts do %> <%= tag.div class: dialog_outer_classes do %> - <%= tag.div class: dialog_inner_classes, data: { dialog_target: "content" } do %> + <%= tag.div class: dialog_inner_classes, data: { DS__dialog_target: "content" } do %>
<% if header? %> <%= header %> diff --git a/app/components/dialog_component.rb b/app/components/DS/dialog.rb similarity index 77% rename from app/components/dialog_component.rb rename to app/components/DS/dialog.rb index 94246872..3385003c 100644 --- a/app/components/dialog_component.rb +++ b/app/components/DS/dialog.rb @@ -1,9 +1,9 @@ -class DialogComponent < ViewComponent::Base +class DS::Dialog < DesignSystemComponent renders_one :header, ->(title: nil, subtitle: nil, hide_close_icon: false, **opts, &block) do content_tag(:header, class: "px-4 flex flex-col gap-2", **opts) do title_div = content_tag(:div, class: "flex items-center justify-between gap-2") do title = content_tag(:h2, title, class: class_names("font-medium text-primary", drawer? ? "text-lg" : "")) if title - close_icon = render ButtonComponent.new(variant: "icon", class: "ml-auto", icon: "x", tabindex: "-1", data: { action: "dialog#close" }) unless hide_close_icon + close_icon = render DS::Button.new(variant: "icon", class: "ml-auto", icon: "x", tabindex: "-1", data: { action: "DS--dialog#close" }) unless hide_close_icon safe_join([ title, close_icon ].compact) end @@ -19,16 +19,16 @@ class DialogComponent < ViewComponent::Base renders_many :actions, ->(cancel_action: false, **button_opts) do merged_opts = if cancel_action - button_opts.merge(type: "button", data: { action: "modal#close" }) + button_opts.merge(type: "button", data: { action: "DS--dialog#close" }) else button_opts end - render ButtonComponent.new(**merged_opts) + render DS::Button.new(**merged_opts) end renders_many :sections, ->(title:, **disclosure_opts, &block) do - render DisclosureComponent.new(title: title, align: :right, **disclosure_opts) do + render DS::Disclosure.new(title: title, align: :right, **disclosure_opts) do block.call end end @@ -99,11 +99,11 @@ class DialogComponent < ViewComponent::Base merged_opts = opts.dup data = merged_opts.delete(:data) || {} - data[:controller] = [ "dialog", "hotkey", data[:controller] ].compact.join(" ") - data[:dialog_auto_open_value] = auto_open - data[:dialog_reload_on_close_value] = reload_on_close - data[:action] = [ "mousedown->dialog#clickOutside", data[:action] ].compact.join(" ") - data[:hotkey] = "esc:dialog#close" + data[:controller] = [ "DS--dialog", "hotkey", data[:controller] ].compact.join(" ") + data[:DS__dialog_auto_open_value] = auto_open + data[:DS__dialog_reload_on_close_value] = reload_on_close + data[:action] = [ "mousedown->DS--dialog#clickOutside", data[:action] ].compact.join(" ") + data[:hotkey] = "esc:DS--dialog#close" merged_opts[:data] = data merged_opts diff --git a/app/components/dialog_controller.js b/app/components/DS/dialog_controller.js similarity index 100% rename from app/components/dialog_controller.js rename to app/components/DS/dialog_controller.js diff --git a/app/components/disclosure_component.html.erb b/app/components/DS/disclosure.html.erb similarity index 100% rename from app/components/disclosure_component.html.erb rename to app/components/DS/disclosure.html.erb diff --git a/app/components/disclosure_component.rb b/app/components/DS/disclosure.rb similarity index 82% rename from app/components/disclosure_component.rb rename to app/components/DS/disclosure.rb index 5aba01b2..d301d671 100644 --- a/app/components/disclosure_component.rb +++ b/app/components/DS/disclosure.rb @@ -1,4 +1,4 @@ -class DisclosureComponent < ViewComponent::Base +class DS::Disclosure < DesignSystemComponent renders_one :summary_content attr_reader :title, :align, :open, :opts diff --git a/app/components/filled_icon_component.html.erb b/app/components/DS/filled_icon.html.erb similarity index 100% rename from app/components/filled_icon_component.html.erb rename to app/components/DS/filled_icon.html.erb diff --git a/app/components/filled_icon_component.rb b/app/components/DS/filled_icon.rb similarity index 97% rename from app/components/filled_icon_component.rb rename to app/components/DS/filled_icon.rb index 1f903243..73113a0b 100644 --- a/app/components/filled_icon_component.rb +++ b/app/components/DS/filled_icon.rb @@ -1,4 +1,4 @@ -class FilledIconComponent < ViewComponent::Base +class DS::FilledIcon < DesignSystemComponent attr_reader :icon, :text, :hex_color, :size, :rounded, :variant VARIANTS = %i[default text surface container inverse].freeze diff --git a/app/components/link_component.html.erb b/app/components/DS/link.html.erb similarity index 100% rename from app/components/link_component.html.erb rename to app/components/DS/link.html.erb diff --git a/app/components/link_component.rb b/app/components/DS/link.rb similarity index 94% rename from app/components/link_component.rb rename to app/components/DS/link.rb index 4bbe10e5..209f86b0 100644 --- a/app/components/link_component.rb +++ b/app/components/DS/link.rb @@ -1,6 +1,6 @@ # An extension to `link_to` helper. All options are passed through to the `link_to` helper with some additional # options available. -class LinkComponent < ButtonishComponent +class DS::Link < DS::Buttonish attr_reader :frame VARIANTS = VARIANTS.reverse_merge( diff --git a/app/components/menu_component.html.erb b/app/components/DS/menu.html.erb similarity index 59% rename from app/components/menu_component.html.erb rename to app/components/DS/menu.html.erb index 00f19b2a..d4f0ea8d 100644 --- a/app/components/menu_component.html.erb +++ b/app/components/DS/menu.html.erb @@ -1,17 +1,17 @@ -<%= tag.div data: { controller: "menu", menu_placement_value: placement, menu_offset_value: offset, testid: testid } do %> +<%= tag.div data: { controller: "DS--menu", DS__menu_placement_value: placement, DS__menu_offset_value: offset, testid: testid } do %> <% if variant == :icon %> - <%= render ButtonComponent.new(variant: "icon", icon: icon_vertical ? "more-vertical" : "more-horizontal", data: { menu_target: "button" }) %> + <%= render DS::Button.new(variant: "icon", icon: icon_vertical ? "more-vertical" : "more-horizontal", data: { DS__menu_target: "button" }) %> <% elsif variant == :button %> <%= button %> <% elsif variant == :avatar %> - <% end %> -