Class: MaterialAdminGenerator

Inherits:
Rails::Generators::NamedBase
  • Object
show all
Includes:
Rails::Generators::Actions
Defined in:
lib/generators/material_admin/material_admin_generator.rb

Constant Summary collapse

GEM_NAME =
'rails_material_admin'
GEM_PATH =
Gem.loaded_specs[GEM_NAME].full_gem_path
JS_PKGS =
'datatables.net-bs4 datatables.net-responsive-bs4'\
' expose-loader file-loader url-loader resolve-url-loader'\
' @rails/ujs @rails/activestorage'\
' stimulus turbolinks'\
' jquery popper.js select2'
WEBPACKER_DIR_PREFIX =

TODO: customize dir prefix

'javascript'

Instance Method Summary collapse

Instance Method Details

#add_gemsObject



23
24
25
26
27
28
29
30
31
# File 'lib/generators/material_admin/material_admin_generator.rb', line 23

def add_gems
  p 'Add gems...'

  gem 'slim'
  gem 'devise'
  gem 'kaminari'

  system('bundle install')
end

#at_endObject



250
251
252
253
# File 'lib/generators/material_admin/material_admin_generator.rb', line 250

def at_end
  p '****************************************************'
  p '****************************************************'
end

#create_base_controllerObject



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/generators/material_admin/material_admin_generator.rb', line 137

def create_base_controller
  p "Create base controller'"

  create_file "#{Rails.root}/app/controllers/#{layout_name}/base_controller.rb" do
    <<~dashboard_controller
      # frozen_string_literal: true

      class #{layout_name.camelize}::BaseController < ActionController::Base
        layout '#{layout_name}'

        before_action :authenticate_#{layout_name}!
      end
    dashboard_controller
  end
end

#create_dashboard_controllerObject



153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/generators/material_admin/material_admin_generator.rb', line 153

def create_dashboard_controller
  p 'Create dashboard controller...'

  create_file "#{Rails.root}/app/controllers/#{layout_name}/dashboard_controller.rb" do
    <<~dashboard_controller
      # frozen_string_literal: true

      class #{layout_name.camelize}::DashboardController < #{layout_name.camelize}::BaseController
        def index
        end
      end
    dashboard_controller
  end
end

#create_dashboard_viewObject



182
183
184
185
186
187
188
189
190
# File 'lib/generators/material_admin/material_admin_generator.rb', line 182

def create_dashboard_view
  p 'Create dashboard view...'

  create_file "#{Rails.root}/app/views/#{layout_name}/dashboard/index.html.slim" do
    <<~dashboard_page
      h1 Welcome come back🙂
    dashboard_page
  end
end

#create_helperObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/generators/material_admin/material_admin_generator.rb', line 67

def create_helper
  p "Create #{layout_name} layout helper..."

  create_file "#{Rails.root}/app/helpers/#{layout_name}_helper.rb" do
    <<~helper
      # frozen_string_literal: true

      module #{layout_name.camelize}Helper
        def body_id
          ctrl_name = controller_path.gsub(%r{^v\d+/}, '').tr('/', '-')
          [ctrl_name, action_name].map(&:dasherize).join('-')
        end

        def body_class
          controller_path.gsub(%r{^v\d+/}, '').tr('/', '-').dasherize
        end

        def body_data_controller
          @body_data_controller ||= controller_name.tr('_', '-').split('/').join('-')
        end
      end
    helper
  end
end

#create_js_manifestObject



92
93
94
95
96
97
98
99
# File 'lib/generators/material_admin/material_admin_generator.rb', line 92

def create_js_manifest
  p "Create #{layout_name} js manifest..."

  src = "#{GEM_PATH}/vendor/javascript/packs/admin.js"
  dest = "#{Rails.root}/app/#{WEBPACKER_DIR_PREFIX}/packs/#{layout_name}.js"

  FileUtils.cp src, dest
end

#create_layoutObject



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/generators/material_admin/material_admin_generator.rb', line 110

def create_layout
  p "Create #{layout_name} layout..."

  layout_html_path = "#{Rails.root}/app/views/layouts/#{layout_name}.html.erb"
  File.rename(layout_html_path, "#{options['layout_name']}.html.slim") if File.exist?(layout_html_path)

  src = "#{GEM_PATH}/app/views/layouts/admin.html.slim"
  dest = "#{Rails.root}/app/views/layouts/#{layout_name}.html.slim"

  FileUtils.cp src, dest

  src = "#{GEM_PATH}/app/views/layouts/unauthorized.html.slim"
  dest = "#{Rails.root}/app/views/layouts/unauthorized.html.slim"

  FileUtils.cp src, dest
end

#create_new_session_fileObject



192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/generators/material_admin/material_admin_generator.rb', line 192

def create_new_session_file
  p 'Create sign_in template...'

  dir = "#{Rails.root}/app/views/#{layout_name}/sessions/"

  FileUtils.mkdir_p(dir) unless File.directory?(dir)

  FileUtils.cp(
    "#{GEM_PATH}/app/views/#{layout_name}/sessions/new.html.slim",
    "#{Rails.root}/app/views/#{layout_name}/sessions/new.html.slim"
  )
end

#create_partialsObject



127
128
129
130
131
132
133
134
135
# File 'lib/generators/material_admin/material_admin_generator.rb', line 127

def create_partials
  p "Create #{layout_name} shared partials..."

  dest = "#{Rails.root}/app/views/#{layout_name}/shared"

  FileUtils.mkdir_p(dest) unless File.directory?(dest)

  FileUtils.copy_entry("#{GEM_PATH}/app/views/shared", dest)
end

#create_sessions_controllerObject



168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/generators/material_admin/material_admin_generator.rb', line 168

def create_sessions_controller
  p "Create #{layout_name} sessions controller..."

  create_file "#{Rails.root}/app/controllers/#{layout_name}/sessions_controller.rb" do
    <<~sessions_controller
      # frozen_string_literal: true

      class Admin::SessionsController < Devise::SessionsController
        layout 'unauthorized'
      end
    sessions_controller
  end
end

#create_style_manifestObject



101
102
103
104
105
106
107
108
# File 'lib/generators/material_admin/material_admin_generator.rb', line 101

def create_style_manifest
  p "Create #{layout_name} style js manifest..."

  src = "#{GEM_PATH}/vendor/javascript/packs/admin_style.js"
  dest = "#{Rails.root}/app/#{WEBPACKER_DIR_PREFIX}/packs/#{layout_name}_style.js"

  FileUtils.cp src, dest
end

#import_filesObject



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/generators/material_admin/material_admin_generator.rb', line 33

def import_files
  p 'Import material admin theme files...'

  webpacker_dir = "#{Rails.root}/app/#{WEBPACKER_DIR_PREFIX}"

  FileUtils.mkdir_p("#{webpacker_dir}/vendor") unless File.directory?("#{webpacker_dir}/vendor")

  FileUtils.copy_entry("#{GEM_PATH}/vendor/#{GEM_NAME}", "#{webpacker_dir}/vendor/#{GEM_NAME}/")

  # p 'Import package.json...'

  # FileUtils.cp "#{GEM_PATH}/package.json", "#{Rails.root}/package.json"

  p 'Import js source files...'

  FileUtils.copy_entry("#{GEM_PATH}/vendor/javascript", webpacker_dir)

  p 'Import datatable files...'

  FileUtils.cp(
    "#{GEM_PATH}/app/controllers/concerns/datatable_decorator.rb",
    "#{Rails.root}/app/controllers/concerns/datatable_decorator.rb"
  )

  FileUtils.cp(
    "#{GEM_PATH}/app/helpers/datatables_helper.rb",
    "#{Rails.root}/app/helpers/datatables_helper.rb"
  )
end

#init_dbObject



205
206
207
208
209
210
211
212
213
214
215
# File 'lib/generators/material_admin/material_admin_generator.rb', line 205

def init_db
  p 'Init db...'

  system('rake db:drop db:create')

  p 'Init devise...'
  system('rails g devise:install')
  system("rails generate model #{layout_name}")
  system("rails generate devise #{layout_name}")
  system('rake db:migrate')
end

#modify_webpacker_environment_fileObject



217
218
219
220
221
222
223
224
# File 'lib/generators/material_admin/material_admin_generator.rb', line 217

def modify_webpacker_environment_file
  p 'Overwrite config webpack environment js file'

  src = "#{GEM_PATH}/config/webpack/environment.js"
  dest = "#{Rails.root}/config/webpack/environment.js"

  FileUtils.cp src, dest
end

#need_modifyObject



226
227
228
229
# File 'lib/generators/material_admin/material_admin_generator.rb', line 226

def need_modify
  p '****************************************************'
  p '****************************************************'
end

#prompt_confit_routeObject



231
232
233
234
235
236
237
238
239
240
241
242
243
# File 'lib/generators/material_admin/material_admin_generator.rb', line 231

def prompt_confit_route
  puts "Need change the devise default route to:\n"
  routes = <<~routes
    devise_for :#{layout_name},
      path: '#{layout_name}',
      controllers: { sessions: '#{layout_name}/sessions' }

    namespace :#{layout_name} do
      root 'dashboard#index'
    end
  routes
  puts routes
end

#prompt_extract_cssObject



245
246
247
248
# File 'lib/generators/material_admin/material_admin_generator.rb', line 245

def prompt_extract_css
  puts "Need set extract_css to true in webpacker.yml\n"
  p 'extract_css: true'
end

#yarn_installObject



63
64
65
# File 'lib/generators/material_admin/material_admin_generator.rb', line 63

def yarn_install
  system("yarn add #{JS_PKGS}")
end