rails_material_admin 0.1.4 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -27
  3. data/app/helpers/admin_helper.rb +25 -0
  4. data/app/views/admin/sessions/new.html.slim +27 -24
  5. data/app/views/layouts/admin.html.slim +16 -5
  6. data/app/views/shared/_error_messages.html.slim +12 -7
  7. data/app/views/shared/_flash_messages.html.slim +14 -0
  8. data/app/views/shared/_header.html.slim +17 -13
  9. data/app/views/shared/_sidebar.html.slim +9 -8
  10. data/config/webpack/environment.js +5 -1
  11. data/lib/generators/crud/crud_generator.rb +4 -4
  12. data/lib/generators/material_admin/material_admin_generator.rb +15 -8
  13. data/lib/material_admin/version.rb +1 -1
  14. data/vendor/javascript/packs/admin.js +18 -12
  15. data/vendor/javascript/packs/admin_style.js +4 -2
  16. data/vendor/javascript/src/stylesheets/admin/shared/common.scss +41 -15
  17. data/vendor/javascript/src/stylesheets/admin/shared/overide.scss +84 -0
  18. data/vendor/javascript/src/stylesheets/shared/override.scss +0 -4
  19. data/vendor/rails_material_admin/css/plugins/bootstrap.min.scss +6 -6
  20. data/vendor/rails_material_admin/css/style.scss +33462 -8272
  21. data/vendor/rails_material_admin/js/app.js +404 -0
  22. data/vendor/rails_material_admin/js/bootstrap.min.js +4 -4
  23. data/vendor/rails_material_admin/js/dashboard.js +15 -16
  24. data/vendor/rails_material_admin/js/perfect-scrollbar.jquery.min.js +1569 -0
  25. data/vendor/rails_material_admin/js/sidebarmenu.js +52 -337
  26. data/vendor/rails_material_admin/js/sweetalert2.min.js +2 -0
  27. data/vendor/rails_material_admin/material_admin.js +8 -7
  28. metadata +8 -5
  29. data/vendor/rails_material_admin/js/custom.js +0 -113
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a87bb41e4c2b4a725920f9e6d2ff1bbe7767c8ce16f90502ff101c28d9fc4b0b
4
- data.tar.gz: 3c83b7ec816bef57067189e3d7118742275c7bd3a8719a27f31b9c84f2be6268
3
+ metadata.gz: 30f45ca5e4d9f67587182dac5886ac98d0fb575be7e678abbaab1acea81cec81
4
+ data.tar.gz: 23df68a00ad1c35c9992837ab57e2f1e98b325556262a3aaae9a96062444d792
5
5
  SHA512:
6
- metadata.gz: 4aed7707c8cd6942b282d44becb6d29a9aff564ade494e7ddea1fb33b6ade479b31536dc28f8597c044b9b109be6e309365060123e088e68fceaaf3615d52b81
7
- data.tar.gz: 598fc0f3b6175757f0f361c018b92310122ec2f94cc31ccc7ec8d15854d04e80233fe53f36e5b037368df7177f4713099d94b8b97ecca861c34067a45b9e0646
6
+ metadata.gz: 3c3d54ae2f3aa56b688c62fab3cff22c787663b6086b6509d84912adfa946fe8566858d5141464919aa7ee2b784a255cfbbe6d95c4d844b79cb615485d853858
7
+ data.tar.gz: c78896ab2cbc88e3721e27c4e52d173caddc996777c3d80fede6715b8f66ce57fe5a684ff70295b6e7d8134c3c2e8ee5fceef3058ad0ebe085ba5d6c5a630029
data/README.md CHANGED
@@ -1,38 +1,12 @@
1
1
  # MaterialAdmin
2
2
  Use rails webpacker to bundle the material admin template.
3
3
 
4
- https://www.wrappixel.com/demos/admin-templates/material-pro/Documentation/document.html
4
+ https://wrappixel.com/demos/admin-templates/materialpro-bootstrap-latest/material-pro/src/material/ui-scrollspy.html#list-item-2
5
5
 
6
6
  Easily install and set up admin quickly
7
7
 
8
8
  ## Prerequisite
9
9
  - Need set up your db first
10
- - Used js libraries
11
- ```json
12
- {
13
- "name": "MyProject",
14
- "private": true,
15
- "dependencies": {
16
- "@rails/webpacker": "5.1.1",
17
- "core-js": "3",
18
- "file-loader": "^6.0.0",
19
- "url-loader": "^4.1.0",
20
- "expose-loader": "^0.7.5",
21
- "resolve-url-loader": "^3.1.1",
22
- "jquery": "^3.5.1",
23
- "select2": "^4.0.13",
24
- "popper.js": "^1.16.1",
25
- "rails-ujs": "^5.2.4-2",
26
- "stimulus": "^1.1.1",
27
- "turbolinks": "^5.2.0",
28
- "datatables.net-bs4": "^1.10.21",
29
- "datatables.net-responsive-bs4": "^2.2.5"
30
- },
31
- "devDependencies": {
32
- "webpack-dev-server": "^3.11.0"
33
- }
34
- }
35
- ```
36
10
 
37
11
 
38
12
  ## Usage
@@ -17,4 +17,29 @@ module ApplicationHelper
17
17
  def sort_opt(model, column)
18
18
  { model: model, column: column }.to_json
19
19
  end
20
+
21
+ def sidebar_item_classes(c_names, *a_names)
22
+ class_names = 'sidebar-item'
23
+
24
+ if a_names.any?
25
+ class_names += ' selected' if controller_name.in?(c_names) && action_name.in?(a_names)
26
+ else
27
+ class_names += ' selected' if controller_name.in? c_names
28
+ end
29
+
30
+ class_names
31
+ end
32
+
33
+ def sidebar_item_link_classes(c_names, *a_names)
34
+ class_names = 'sidebar-link waves-effect waves-dark sidebar-link'
35
+
36
+ if a_names.any?
37
+ class_names += ' active' if controller_name.in?(c_names) && action_name.in?(a_names)
38
+ else
39
+ class_names += ' active' if controller_name.in? c_names
40
+ end
41
+
42
+ class_names
43
+ end
44
+
20
45
  end
@@ -1,30 +1,33 @@
1
- section#wrapper
2
- .login-register
3
- .login-box.card
4
- .card-body
5
- = form_for resource,
6
- as: resource_name,
7
- url: session_path(resource_name),
8
- html: { class: 'form-horizontal form-material' } do |f|
1
+ .auth-wrapper.d-flex.no-block.justify-content-center.align-items-center
2
+ .auth-box.p-4.bg-white.rounded
3
+ #loginform
4
+ .logo
5
+ h3.box-title.mb-3 Sign In
9
6
 
10
- h3.box-title.m-b-20 Sign In
7
+ .row
8
+ .col-12
9
+ = form_for resource,
10
+ as: resource_name,
11
+ url: session_path(resource_name),
12
+ html: { class: 'form-horizontal mt-3 form-material', id: 'loginform' } do |f|
11
13
 
12
- .form-group
13
- .col-xs-12
14
- = f.email_field :email, autofocus: true, autocomplete: "email", class: 'form-control'
14
+ .form-group.mb-3
15
+ .col-xs-12
16
+ = f.email_field :email, autofocus: true, autocomplete: "email", class: 'form-control', placeholder: 'Email'
15
17
 
16
- .form-group
17
- .col-xs-12
18
- = f.password_field :password, autocomplete: "current-password", class: 'form-control'
18
+ .form-group.mb-4
19
+ .col-xs-12
20
+ = f.password_field :password, autocomplete: "current-password", class: 'form-control', placeholder: 'Password'
19
21
 
20
- - if devise_mapping.rememberable?
21
- .form-group
22
- .d-flex.no-block.align-items-center
23
- .checkbox.checkbox-primary.p-t-0
24
- = f.check_box :remember_me
25
- = f.label :remember_me
22
+ - if devise_mapping.rememberable?
23
+ .form-group
24
+ .d-flex
25
+ div class="checkbox checkbox-info pt-0"
26
+ input id="checkbox-signup" type="checkbox" class="material-inputs chk-col-indigo"
27
+ label for="checkbox-signup" Remember me
28
+
29
+ .form-group.text-center.mt-4.mb-3
30
+ .col-xs-12
31
+ = f.submit "Log in", class: 'btn btn-info d-block w-100 waves-effect waves-light'
26
32
 
27
- .form-group.text-center.m-t-20
28
- .col-xs-12
29
- = f.submit "Log in", class: 'btn btn-info btn-lg btn-block text-uppercase waves-effect waves-light'
30
33
 
@@ -17,17 +17,28 @@ html xmlns:wb="http://open.weibo.com/wb"
17
17
  /! Preloader - style you can find in spinners.css
18
18
  // NOTE: Need fix for turbolinks.
19
19
  / .preloader
20
- / svg.circular viewbox=("25 25 50 50")
20
+ / svg.circular viewbox=("25 25 50 50")
21
21
  / circle.path cx="50" cy="50" fill="none" r="20" stroke-miterlimit="10" stroke-width="2" /
22
22
 
23
23
  /! Main wrapper - style you can find in pages.scss
24
- #main-wrapper
24
+ #main-wrapper[
25
+ data-theme="light"
26
+ data-layout="vertical"
27
+ data-navbarbg="skin1"
28
+ data-sidebartype="full"
29
+ data-sidebar-position="fixed"
30
+ data-header-position="fixed"
31
+ data-boxed-layout="full"
32
+ ]
25
33
  = render 'admin/shared/header'
26
34
  = render 'admin/shared/sidebar'
27
-
28
- .page-wrapper
35
+
36
+ .page-wrapper style="display: block;"
37
+ = yield :breadcrumb
38
+
29
39
  .container-fluid
30
- = yield :breadcrumb
40
+ = yield :error_messages
41
+
31
42
  .row
32
43
  = yield
33
44
 
@@ -1,8 +1,13 @@
1
- - if resource.errors.any?
1
+ - targets = Array(target).select { |ele| ele.errors.any? }
2
+
3
+ - if targets.any?
2
4
  #error_explanation
3
- h2
4
- = I18n.t("errors.messages.not_saved", count: resource.errors.count, resource: resource.class.model_name.human.downcase)
5
- ul
6
- - resource.errors.full_messages.each do |message|
7
- li
8
- = message
5
+ div [
6
+ class="alert customize-alert alert-dismissible alert-light-danger text-danger fade show"
7
+ role="alert"
8
+ ]
9
+ button.btn-close aria-label="Close" data-bs-dismiss="alert" type="button"
10
+
11
+ - targets.map(&:errors).map(&:messages).map(&:values).flatten.each do |message|
12
+ | #{message}
13
+
@@ -0,0 +1,14 @@
1
+ - if flash.any?
2
+ - flash.each do |name, msg|
3
+ - if [String, Array].include?(msg.class)
4
+ - message = msg.is_a?(Array) ? msg.join('<br>').html_safe : msg
5
+
6
+ div [
7
+ class="alert customize-alert alert-dismissible alert-light-#{name.to_s == 'notice' ? 'success' : 'danger'} text-danger fade show"
8
+ role="alert"
9
+ ]
10
+ button.btn-close aria-label="Close" data-bs-dismiss="alert" type="button"
11
+
12
+ .d-flex.align-items-center.font-weight-medium
13
+ i.text-danger.fill-white.feather-sm.me-2 data-feather="info" = message
14
+
@@ -1,9 +1,11 @@
1
1
  /! Topbar header - style you can find in pages.scss
2
- header.topbar
3
- nav.navbar.top-navbar.navbar-expand-md.navbar-light
4
- /! Logo
5
- .navbar-header
6
- a.navbar-brand href="/" tppabs="https://wrappixel.com/demos/admin-templates/material-pro/material/index.html"
2
+ header.topbar data-navbarbg="skin1"
3
+ nav.navbar.top-navbar.navbar-expand-md.navbar-dark
4
+ .navbar-header data-logobg='skin1'
5
+ a.nav-link.nav-toggler.d-block.d-md-none.text-muted.waves-effect.waves-dark href="javascript:void(0)"
6
+ i.mdi.mdi-menu
7
+
8
+ a.navbar-brand href="/admin" tppabs="https://wrappixel.com/demos/admin-templates/material-pro/material/index.html"
7
9
  /! Logo icon
8
10
  b
9
11
  /! You can put here icon as well // <i class="wi wi-sunset"></i> //
@@ -11,14 +13,16 @@ header.topbar
11
13
  / img.dark-logo alt="homepage" src="../assets/images/logo-icon.png" /
12
14
  /! Light Logo icon
13
15
  / img.light-logo alt="homepage" src="../assets/images/logo-light-icon.png" /
14
- / = image_tag nil, width: 45, class: 'light-logo'
15
- span.inline-block.ml10 Logo
16
- .navbar-collapse
17
- ul.navbar-nav.mr-auto.mt-md-0
18
- li.nav-item
19
- a.nav-link.nav-toggler.hidden-md-up.text-muted.waves-effect.waves-dark href="javascript:void(0)"
20
- i.mdi.mdi-menu
16
+ = image_tag asset_pack_path('media/images/logo-light-icon.png'), class: 'light-logo'
17
+ span.logo-text
18
+ .inline-block.ml10 Logo
19
+
20
+ a.topbartoggler.d-block.d-md-none.waves-effect.waves-light href="javascript:void(0)" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"
21
+ i.ti-more
22
+
23
+ .navbar-collapse.collapse data-navbarbg="skin1"
24
+ ul.navbar-nav.me-auto
21
25
  li.nav-item
22
- a.nav-link.sidebartoggler.hidden-sm-down.text-muted.waves-effect.waves-dark href="javascript:void(0)"
26
+ a.nav-link.sidebartoggler.d-none.d-md-block.waves-effect.waves-dark href="javascript:void(0)"
23
27
  i.ti-menu
24
28
 
@@ -1,15 +1,14 @@
1
1
  /! ==============================================================
2
2
  /! Left Sidebar - style you can find in sidebar.scss
3
3
  /! ==============================================================
4
- aside.left-sidebar
5
- /! Sidebar scroll
6
- .scroll-sidebar
7
- /! Sidebar navigation
4
+ aside.left-sidebar data-sidebarbg='skin6'
5
+ .scroll-sidebar.ps-container.ps-theme-default.ps-active-y
6
+ /! Sidebar scroll
8
7
  nav.sidebar-nav
9
- ul#sidebarnav
8
+ ul#sidebarnav.in
10
9
  / li.nav-small-cap Project title
11
- li
12
- = link_to '#' do
10
+ li class=sidebar_item_classes('users')
11
+ = link_to '#', class: sidebar_item_link_classes('users') do
13
12
  i.fa.fa-user
14
13
  span.hide-menu Menu
15
14
 
@@ -19,5 +18,7 @@ aside.left-sidebar
19
18
  / i.ti-settings
20
19
  / a.link data-toggle="tooltip" href="" title="Email"
21
20
  / i.mdi.mdi-gmail
22
- a.link data-toggle="tooltip" href=destroy_admin_session_path title="Logout" data-method="DELETE"
21
+ = link_to destroy_admin_session_path, title: 'Logout', method: :delete, data: { toggle: 'tooltip' } do
23
22
  i.mdi.mdi-power
23
+ / a.link data-toggle="tooltip" href=destroy_admin_session_path title="Logout" data-method="DELETE"
24
+
@@ -10,7 +10,11 @@ environment.loaders.append('expose-loader', {
10
10
  test: require.resolve('jquery'),
11
11
  use: [{
12
12
  loader: 'expose-loader',
13
- options: '$'
13
+ options: {
14
+ exposes: {
15
+ globalName: '$',
16
+ }
17
+ }
14
18
  }]
15
19
  })
16
20
 
@@ -71,6 +71,9 @@ class CrudGenerator < Rails::Generators::NamedBase
71
71
 
72
72
  create_file "#{Rails.root}/app/views/#{layout_name}/#{resource}/_form.html.slim" do
73
73
  <<~html
74
+ = content_for :error_messages do
75
+ = render 'admin/shared/error_messages', target: @#{name}
76
+
74
77
  .col-lg-12
75
78
  .card
76
79
  .card-body
@@ -108,9 +111,6 @@ class CrudGenerator < Rails::Generators::NamedBase
108
111
  # frozen_string_literal: true
109
112
 
110
113
  class #{layout_name.camelize}::#{resource.camelize}Controller < #{layout_name.camelize}::BaseController
111
-
112
- include DatatableDecorator
113
-
114
114
  def index
115
115
  respond_to do |format|
116
116
  format.html
@@ -144,7 +144,7 @@ class CrudGenerator < Rails::Generators::NamedBase
144
144
 
145
145
  @total_rows = #{resource}.count
146
146
 
147
- @rows = users.page(dt[:page]).per(dt[:per_page])
147
+ @rows = #{resource}.page(dt[:page]).per(dt[:per_page])
148
148
  @rows = @rows.order(search_obj[:order])
149
149
  end
150
150
  end
@@ -8,8 +8,12 @@ class MaterialAdminGenerator < Rails::Generators::NamedBase
8
8
  JS_PKGS =
9
9
  'datatables.net-bs4 datatables.net-responsive-bs4'\
10
10
  ' expose-loader file-loader url-loader resolve-url-loader'\
11
- ' rails-ujs stimulus turbolinks'\
12
- ' jquery popper.js select2'
11
+ ' @rails/ujs @rails/activestorage'\
12
+ ' stimulus turbolinks'\
13
+ ' jquery popper.js select2 @popperjs/core'
14
+ ESLINT_JS_PKGS =
15
+ 'eslint prettier eslint-plugin-prettier eslint-config-prettier'\
16
+ ' stylelint stylelint-config-prettier stylelint-config-recommended stylelint-scss'
13
17
 
14
18
  # TODO: Warning! Add reset project.
15
19
 
@@ -38,9 +42,9 @@ class MaterialAdminGenerator < Rails::Generators::NamedBase
38
42
 
39
43
  FileUtils.copy_entry("#{GEM_PATH}/vendor/#{GEM_NAME}", "#{webpacker_dir}/vendor/#{GEM_NAME}/")
40
44
 
41
- p 'Import package.json...'
45
+ # p 'Import package.json...'
42
46
 
43
- FileUtils.cp "#{GEM_PATH}/package.json", "#{Rails.root}/package.json"
47
+ # FileUtils.cp "#{GEM_PATH}/package.json", "#{Rails.root}/package.json"
44
48
 
45
49
  p 'Import js source files...'
46
50
 
@@ -59,6 +63,11 @@ class MaterialAdminGenerator < Rails::Generators::NamedBase
59
63
  )
60
64
  end
61
65
 
66
+ def yarn_install
67
+ system("yarn add #{JS_PKGS}")
68
+ system("yarn add #{ESLINT_JS_PKGS} --dev")
69
+ end
70
+
62
71
  def create_helper
63
72
  p "Create #{layout_name} layout helper..."
64
73
 
@@ -129,10 +138,6 @@ class MaterialAdminGenerator < Rails::Generators::NamedBase
129
138
  FileUtils.copy_entry("#{GEM_PATH}/app/views/shared", dest)
130
139
  end
131
140
 
132
- def yarn_install
133
- system("yarn add #{JS_PKGS}")
134
- end
135
-
136
141
  def create_base_controller
137
142
  p "Create base controller'"
138
143
 
@@ -143,6 +148,8 @@ class MaterialAdminGenerator < Rails::Generators::NamedBase
143
148
  class #{layout_name.camelize}::BaseController < ActionController::Base
144
149
  layout '#{layout_name}'
145
150
 
151
+ include DatatableDecorator
152
+
146
153
  before_action :authenticate_#{layout_name}!
147
154
  end
148
155
  dashboard_controller
@@ -1,3 +1,3 @@
1
1
  module MaterialAdmin
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.8'
3
3
  end
@@ -1,23 +1,29 @@
1
1
  import 'core-js/stable'
2
2
  import 'regenerator-runtime/runtime'
3
3
 
4
- import { Application } from "stimulus";
5
- import { definitionsFromContext } from "stimulus/webpack-helpers"
4
+ import { Application } from 'stimulus'
5
+ import { definitionsFromContext } from 'stimulus/webpack-helpers'
6
6
 
7
- import Rails from 'rails-ujs';
8
- import Turbolinks from 'turbolinks';
7
+ import Rails from '@rails/ujs'
8
+ import Turbolinks from 'turbolinks'
9
9
 
10
- import 'datatables.net';
11
- import 'datatables.net-responsive-bs4';
12
- import 'select2';
10
+ import 'datatables.net'
11
+ import 'datatables.net-responsive-bs4'
12
+ import 'select2'
13
13
 
14
- import '../vendor/material_admin/material_admin';
14
+ import '../vendor/rails_material_admin/material_admin'
15
15
 
16
- import '../src/javascripts/lib/utils_datatables.js';
17
- import '../src/javascripts/admin/common/scaffold.js';
16
+ import bootstrap from '../vendor/rails_material_admin/js/bootstrap.min'
17
+ window.bootstrap = bootstrap
18
18
 
19
- Rails.start();
20
- Turbolinks.start();
19
+ import Swal from '../vendor/rails_material_admin/js/sweetalert2.min'
20
+ window.Swal = Swal
21
+
22
+ import '../src/javascripts/lib/utils_datatables.js'
23
+ import '../src/javascripts/admin/common/scaffold.js'
24
+
25
+ Rails.start()
26
+ Turbolinks.start()
21
27
 
22
28
  const application = Application.start()
23
29
  // const context = require.context("../src/javascripts/admin/controllers/", true, /\.js$/)
@@ -1,5 +1,7 @@
1
+ import 'select2/dist/css/select2.css'
2
+
1
3
  import '../../../node_modules/datatables.net-bs4/css/dataTables.bootstrap4.css';
2
- import '../vendor/material_admin/material_admin.scss';
4
+ import '../vendor/rails_material_admin/material_admin.scss';
3
5
  import '../src/stylesheets/shared/atom.scss';
4
- import '../src/stylesheets/shared/override.scss';
6
+ import '../src/stylesheets/admin/shared/override.scss';
5
7
  import '../src/stylesheets/admin/shared/common.scss';