class MaterialAdminGenerator

Constants

ESLINT_JS_PKGS
GEM_NAME
GEM_PATH
JS_PKGS
WEBPACKER_DIR_PREFIX

TODO: customize dir prefix

Public Instance Methods

add_gems() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 26
def add_gems
  p 'Add gems...'

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

  system('bundle install')
end
at_end() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 256
def at_end
  p '****************************************************'
  p '****************************************************'
end
create_base_controller() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 141
  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}'

          include DatatableDecorator

          before_action :authenticate_#{layout_name}!
        end
      dashboard_controller
    end
  end
create_dashboard_controller() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 159
  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_view() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 188
  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_helper() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 71
  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_manifest() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 96
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_layout() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 114
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_file() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 198
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_partials() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 131
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_controller() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 174
  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_manifest() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 105
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_files() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 36
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_db() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 211
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_file() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 223
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_modify() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 232
def need_modify
  p '****************************************************'
  p '****************************************************'
end
prompt_confit_route() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 237
  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_css() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 251
def prompt_extract_css
  puts "Need set extract_css to true in webpacker.yml\n"
  p 'extract_css: true'
end
yarn_install() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 66
def yarn_install
  system("yarn add #{JS_PKGS}")
  system("yarn add #{ESLINT_JS_PKGS} --dev")
end

Private Instance Methods

layout_name() click to toggle source
# File lib/generators/material_admin/material_admin_generator.rb, line 263
def layout_name
  options['layout_name']
end