Class: Shadcn::Generators::AddGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Defined in:
lib/generators/shadcn/add/add_generator.rb

Overview

Generator for adding shadcn components to your application Usage: rails generate shadcn:add button rails generate shadcn:add button card dialog rails generate shadcn:add button --exclude-controllers

Constant Summary collapse

COMPONENT_FILES =

Map component names to their files

{
  "accordion" => { component: "accordion_component.rb", controller: "accordion_controller.js" },
  "alert" => { component: "alert_component.rb", controller: nil },
  "alert_dialog" => { component: "alert_dialog_component.rb", controller: "dialog_controller.js" },
  "aspect_ratio" => { component: "aspect_ratio_component.rb", controller: nil },
  "avatar" => { component: "avatar_component.rb", controller: "avatar_controller.js" },
  "badge" => { component: "badge_component.rb", controller: nil },
  "breadcrumb" => { component: "breadcrumb_component.rb", controller: nil },
  "button" => { component: "button_component.rb", controller: nil },
  "button_group" => { component: "button_group_component.rb", controller: nil },
  "calendar" => { component: "calendar_component.rb", controller: "calendar_controller.js" },
  "card" => { component: "card_component.rb", controller: nil },
  "carousel" => { component: "carousel_component.rb", controller: "carousel_controller.js" },
  "checkbox" => { component: "checkbox_component.rb", controller: "checkbox_controller.js" },
  "collapsible" => { component: "collapsible_component.rb", controller: "collapsible_controller.js" },
  "combobox" => { component: "combobox_component.rb", controller: "combobox_controller.js" },
  "command" => { component: "command_component.rb", controller: "command_controller.js" },
  "context_menu" => { component: "context_menu_component.rb", controller: "context_menu_controller.js" },
  "date_picker" => { component: "date_picker_component.rb", controller: "date_picker_controller.js" },
  "dialog" => { component: "dialog_component.rb", controller: "dialog_controller.js" },
  "drawer" => { component: "drawer_component.rb", controller: "drawer_controller.js" },
  "dropdown_menu" => { component: "dropdown_menu_component.rb", controller: "dropdown_controller.js" },
  "field" => { component: "field_component.rb", controller: nil },
  "hover_card" => { component: "hover_card_component.rb", controller: "hover_card_controller.js" },
  "input" => { component: "input_component.rb", controller: nil },
  "input_group" => { component: "input_group_component.rb", controller: nil },
  "input_otp" => { component: "input_otp_component.rb", controller: "input_otp_controller.js" },
  "kbd" => { component: "kbd_component.rb", controller: nil },
  "label" => { component: "label_component.rb", controller: nil },
  "menubar" => { component: "menubar_component.rb", controller: "menubar_controller.js" },
  "native_select" => { component: "native_select_component.rb", controller: nil },
  "navigation_menu" => { component: "navigation_menu_component.rb", controller: "navigation_menu_controller.js" },
  "pagination" => { component: "pagination_component.rb", controller: nil },
  "popover" => { component: "popover_component.rb", controller: "popover_controller.js" },
  "progress" => { component: "progress_component.rb", controller: nil },
  "radio_group" => { component: "radio_group_component.rb", controller: "radio_group_controller.js" },
  "resizable" => { component: "resizable_panel_group_component.rb", controller: "resizable_controller.js" },
  "scroll_area" => { component: "scroll_area_component.rb", controller: "scroll_area_controller.js" },
  "select" => { component: "select_component.rb", controller: "select_controller.js" },
  "separator" => { component: "separator_component.rb", controller: nil },
  "sheet" => { component: "sheet_component.rb", controller: "sheet_controller.js" },
  "sidebar" => { component: "sidebar_component.rb", controller: "sidebar_controller.js" },
  "skeleton" => { component: "skeleton_component.rb", controller: nil },
  "slider" => { component: "slider_component.rb", controller: "slider_controller.js" },
  "spinner" => { component: "spinner_component.rb", controller: nil },
  "switch" => { component: "switch_component.rb", controller: "switch_controller.js" },
  "table" => { component: "table_component.rb", controller: nil },
  "tabs" => { component: "tabs_component.rb", controller: "tabs_controller.js" },
  "textarea" => { component: "textarea_component.rb", controller: nil },
  "toast" => { component: "toast_component.rb", controller: "toast_controller.js" },
  "toggle" => { component: "toggle_component.rb", controller: "toggle_controller.js" },
  "toggle_group" => { component: "toggle_group_component.rb", controller: "toggle_group_controller.js" },
  "tooltip" => { component: "tooltip_component.rb", controller: "tooltip_controller.js" },
  "typography" => { component: "typography_component.rb", controller: nil }
}.freeze

Instance Method Summary collapse

Instance Method Details

#add_componentsObject



115
116
117
118
119
# File 'lib/generators/shadcn/add/add_generator.rb', line 115

def add_components
  @components_to_add.each do |component|
    add_component(component)
  end
end

#display_planObject



103
104
105
106
107
108
109
110
111
112
113
# File 'lib/generators/shadcn/add/add_generator.rb', line 103

def display_plan
  say ""
  say "Adding #{@components_to_add.length} component(s):", :green
  @components_to_add.each { |c| say "  - #{c}" }
  if include_controllers?
    controllers = @components_to_add.count { |c| COMPONENT_FILES[c][:controller] }
    say ""
    say "Including #{controllers} Stimulus controller(s)", :cyan if controllers > 0
  end
  say ""
end

#display_post_add_messageObject



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/generators/shadcn/add/add_generator.rb', line 121

def display_post_add_message
  say ""
  say "=" * 60, :green
  say "  Components added successfully!", :green
  say "=" * 60, :green
  say ""
  say "Components are now in your application:", :yellow
  say "  - Ruby components: #{options[:path]}/shadcn/"
  if include_controllers?
    say "  - Stimulus controllers: app/javascript/controllers/shadcn/"
  end
  say ""
  say "These local files will take precedence over the gem's components."
  say "You can now customize them as needed."
  say ""
  if include_controllers?
    say "Note: Register the controllers in your Stimulus application:", :cyan
    say ""
    say "  // In app/javascript/controllers/index.js"
    say "  import ShadcnDialog from \"./shadcn/dialog_controller\""
    say "  application.register(\"shadcn--dialog\", ShadcnDialog)"
    say ""
  end
end

#validate_componentsObject



89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/generators/shadcn/add/add_generator.rb', line 89

def validate_components
  if options[:list]
    display_available_components
    exit 0
  end

  if options[:all]
    @components_to_add = COMPONENT_FILES.keys
  else
    validate_requested_components
    @components_to_add = components
  end
end