Class: Voidable::Generators::InstallGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Defined in:
lib/generators/voidable/install/install_generator.rb

Instance Method Summary collapse

Instance Method Details

#add_js_importObject



89
90
91
92
93
94
95
# File 'lib/generators/voidable/install/install_generator.rb', line 89

def add_js_import
  js_entrypoint = "app/javascript/application.js"
  return unless File.exist?(js_entrypoint)
  return if File.read(js_entrypoint).include?("@voidable/ui")
  prepend_to_file js_entrypoint, "import \"@voidable/ui\";\nimport \"@voidable/ui-hotwire\";\n\n"
  say "Added Voidable imports to application.js", :green
end

#create_initializerObject



10
11
12
# File 'lib/generators/voidable/install/install_generator.rb', line 10

def create_initializer
  template "initializer.rb.tt", "config/initializers/voidable.rb"
end

#create_layoutObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/generators/voidable/install/install_generator.rb', line 27

def create_layout
  copy_file "_settings_menu.html.erb", "app/views/layouts/_settings_menu.html.erb"

  case options[:layout]
  when "sidebar"
    template "application_sidebar.html.erb.tt", "app/views/layouts/application.html.erb", force: true
  when "switching"
    template "application_topbar.html.erb.tt", "app/views/layouts/application.html.erb", force: true
    template "topbar.html.erb.tt", "app/views/layouts/topbar.html.erb"
    template "sidebar.html.erb.tt", "app/views/layouts/sidebar.html.erb"
  else
    template "application_topbar.html.erb.tt", "app/views/layouts/application.html.erb", force: true
  end
  say "Created Voidable application layout (#{options[:layout]})", :green
end

#create_layout_assetsObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/generators/voidable/install/install_generator.rb', line 43

def create_layout_assets
  copy_file "voidable-layout.js", "app/assets/javascripts/voidable-layout.js"
  copy_file "voidable-devise.css", "app/assets/stylesheets/voidable-devise.css"

  assets_init = "config/initializers/assets.rb"
  if File.exist?(assets_init) && !File.read(assets_init).include?("javascripts")
    append_to_file assets_init, <<~RUBY

      # Voidable layout scripts
      Rails.application.config.assets.paths << Rails.root.join("app/assets/javascripts")
    RUBY
  end

  case options[:layout]
  when "sidebar"
    copy_file "voidable-layout-sidebar.css", "app/assets/stylesheets/voidable-layout.css", force: true
  when "switching"
    copy_file "voidable-layout-topbar.css", "app/assets/stylesheets/voidable-layout-topbar.css"
    copy_file "voidable-layout-sidebar.css", "app/assets/stylesheets/voidable-layout-sidebar.css"
  else
    copy_file "voidable-layout-topbar.css", "app/assets/stylesheets/voidable-layout.css", force: true
  end
  say "Created Voidable layout assets", :green
end

#install_devise_viewsObject



105
106
107
108
109
# File 'lib/generators/voidable/install/install_generator.rb', line 105

def install_devise_views
  return unless defined?(Devise)
  generate "voidable:devise_views"
  say "Installed Voidable-styled Devise views", :green
end

#pin_packagesObject



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/generators/voidable/install/install_generator.rb', line 14

def pin_packages
  importmap = "config/importmap.rb"
  return unless File.exist?(importmap)
  return if File.read(importmap).include?("@voidable/ui")
  append_to_file importmap, <<~RUBY

    # Voidable UI
    pin "@voidable/ui", to: "https://ga.jspm.io/npm:@voidable/ui@0.0.1/dist/ui.js"
    pin "@voidable/ui-hotwire", to: "https://ga.jspm.io/npm:@voidable/ui-hotwire@0.0.1/dist/hotwire.js"
  RUBY
  say "Pinned @voidable/ui and @voidable/ui-hotwire in importmap", :green
end

#setup_layout_switchingObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/generators/voidable/install/install_generator.rb', line 68

def setup_layout_switching
  return unless options[:layout] == "switching"

  template "settings_controller.rb.tt", "app/controllers/settings_controller.rb"

  route 'post "toggle_layout", to: "settings#toggle_layout"'

  inject_into_class "app/controllers/application_controller.rb", "ApplicationController", <<-RUBY

  layout :resolve_layout

  private

  def resolve_layout
    cookies[:layout] || "topbar"
  end
  RUBY

  say "Configured layout switching (topbar/sidebar toggle)", :green
end