Class: Nanoui::Generators::ComponentGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Defined in:
lib/generators/nanoui/component_generator.rb

Constant Summary collapse

COMPONENT_ORDER =
%w[
  button
  input
  label
  card
  checkbox
  radio
  switch
  select
  badge
  alert
  dialog
  dropdown
  tooltip
  toast
  table
  tabs
  accordion
  progress
  navbar
  sidebar
  breadcrumb
  avatar
  skeleton
  stat
  empty
  timeline
  checklist
  copy
  code
  upload
  container
].freeze
LAYOUT_COMPONENTS =
%w[container].freeze
GROUPS =
{
  "essentials" => %w[button input label card badge alert],
  "forms" => %w[button input label checkbox radio switch select badge alert upload],
  "overlays" => %w[dialog dropdown tooltip toast],
  "data" => %w[table tabs accordion progress],
  "navigation" => %w[navbar sidebar breadcrumb],
  "feedback" => %w[avatar skeleton],
  "dashboard" => %w[stat empty timeline checklist],
  "utilities" => %w[copy code],
  "layout" => %w[container],
}.freeze
CONTROLLER_FILES =

Maps a component name to the Stimulus controller files it installs. Most components ship with a same-named controller, but ‘table` ships with the richer `data_table` controller for sort + pagination behavior.

{
  "dialog" => %w[dialog],
  "dropdown" => %w[dropdown],
  "tooltip" => %w[tooltip],
  "toast" => %w[toast],
  "tabs" => %w[tabs],
  "accordion" => %w[accordion],
  "switch" => %w[switch],
  "navbar" => %w[navbar],
  "sidebar" => %w[sidebar],
  "copy" => %w[copy],
  "upload" => %w[upload],
  "table" => %w[data_table],
}.freeze
STIMULUS_COMPONENTS =
CONTROLLER_FILES.keys.freeze

Instance Method Summary collapse

Instance Method Details

#copy_component_cssObject



91
92
93
94
95
96
97
# File 'lib/generators/nanoui/component_generator.rb', line 91

def copy_component_css
  @resolved.each do |name|
    subfolder = LAYOUT_COMPONENTS.include?(name) ? "layout" : "components"
    copy_file "css/#{subfolder}/#{name}.css",
              "app/assets/stylesheets/nanoui/#{subfolder}/#{name}.css"
  end
end

#copy_stimulus_controllersObject



99
100
101
102
103
104
105
106
# File 'lib/generators/nanoui/component_generator.rb', line 99

def copy_stimulus_controllers
  @resolved.each do |name|
    CONTROLLER_FILES.fetch(name, []).each do |controller|
      copy_file "js/controllers/#{controller}_controller.js",
                "app/javascript/controllers/nanoui_#{controller}_controller.js"
    end
  end
end


108
109
110
111
112
113
114
115
116
117
# File 'lib/generators/nanoui/component_generator.rb', line 108

def print_summary
  say ""
  say "NanoUI components installed:", :green
  @resolved.each do |name|
    parts = ["CSS"]
    parts << "Stimulus" if STIMULUS_COMPONENTS.include?(name)
    say "#{name} (#{parts.join(", ")})"
  end
  say ""
end

#resolve_componentsObject



79
80
81
82
83
84
85
86
87
88
89
# File 'lib/generators/nanoui/component_generator.rb', line 79

def resolve_components
  @resolved = if options[:all]
                GROUPS.values.flatten.uniq
              elsif options[:group]
                GROUPS.fetch(options[:group]) { abort "Unknown group: #{options[:group]}" }
              else
                components
              end

  abort "Specify components, --group, or --all" if @resolved.empty?
end