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.
- checksums.yaml +4 -4
- data/README.md +1 -27
- data/app/helpers/admin_helper.rb +25 -0
- data/app/views/admin/sessions/new.html.slim +27 -24
- data/app/views/layouts/admin.html.slim +16 -5
- data/app/views/shared/_error_messages.html.slim +12 -7
- data/app/views/shared/_flash_messages.html.slim +14 -0
- data/app/views/shared/_header.html.slim +17 -13
- data/app/views/shared/_sidebar.html.slim +9 -8
- data/config/webpack/environment.js +5 -1
- data/lib/generators/crud/crud_generator.rb +4 -4
- data/lib/generators/material_admin/material_admin_generator.rb +15 -8
- data/lib/material_admin/version.rb +1 -1
- data/vendor/javascript/packs/admin.js +18 -12
- data/vendor/javascript/packs/admin_style.js +4 -2
- data/vendor/javascript/src/stylesheets/admin/shared/common.scss +41 -15
- data/vendor/javascript/src/stylesheets/admin/shared/overide.scss +84 -0
- data/vendor/javascript/src/stylesheets/shared/override.scss +0 -4
- data/vendor/rails_material_admin/css/plugins/bootstrap.min.scss +6 -6
- data/vendor/rails_material_admin/css/style.scss +33462 -8272
- data/vendor/rails_material_admin/js/app.js +404 -0
- data/vendor/rails_material_admin/js/bootstrap.min.js +4 -4
- data/vendor/rails_material_admin/js/dashboard.js +15 -16
- data/vendor/rails_material_admin/js/perfect-scrollbar.jquery.min.js +1569 -0
- data/vendor/rails_material_admin/js/sidebarmenu.js +52 -337
- data/vendor/rails_material_admin/js/sweetalert2.min.js +2 -0
- data/vendor/rails_material_admin/material_admin.js +8 -7
- metadata +8 -5
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30f45ca5e4d9f67587182dac5886ac98d0fb575be7e678abbaab1acea81cec81
|
4
|
+
data.tar.gz: 23df68a00ad1c35c9992837ab57e2f1e98b325556262a3aaae9a96062444d792
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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://
|
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
|
data/app/helpers/admin_helper.rb
CHANGED
@@ -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
|
-
|
2
|
-
.
|
3
|
-
|
4
|
-
.
|
5
|
-
|
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
|
-
|
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
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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 :
|
40
|
+
= yield :error_messages
|
41
|
+
|
31
42
|
.row
|
32
43
|
= yield
|
33
44
|
|
@@ -1,8 +1,13 @@
|
|
1
|
-
-
|
1
|
+
- targets = Array(target).select { |ele| ele.errors.any? }
|
2
|
+
|
3
|
+
- if targets.any?
|
2
4
|
#error_explanation
|
3
|
-
|
4
|
-
=
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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-
|
4
|
-
|
5
|
-
|
6
|
-
|
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
|
-
|
15
|
-
span.
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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.
|
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
|
-
|
6
|
-
|
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
|
-
|
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
|
+
|
@@ -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 =
|
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
|
12
|
-
'
|
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,23 +1,29 @@
|
|
1
1
|
import 'core-js/stable'
|
2
2
|
import 'regenerator-runtime/runtime'
|
3
3
|
|
4
|
-
import { Application } from
|
5
|
-
import { definitionsFromContext } from
|
4
|
+
import { Application } from 'stimulus'
|
5
|
+
import { definitionsFromContext } from 'stimulus/webpack-helpers'
|
6
6
|
|
7
|
-
import Rails from 'rails
|
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/
|
14
|
+
import '../vendor/rails_material_admin/material_admin'
|
15
15
|
|
16
|
-
import '../
|
17
|
-
|
16
|
+
import bootstrap from '../vendor/rails_material_admin/js/bootstrap.min'
|
17
|
+
window.bootstrap = bootstrap
|
18
18
|
|
19
|
-
|
20
|
-
|
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/
|
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';
|