administration-zero 0.0.9 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +15 -0
- data/Gemfile.lock +1 -1
- data/README.md +4 -5
- data/lib/administration_zero/version.rb +1 -1
- data/lib/generators/admin/install/install_generator.rb +1 -2
- data/lib/generators/admin/install/templates/controllers/admin/application_controller.rb +6 -1
- data/lib/generators/admin/install/templates/controllers/admin/password_resets_controller.rb +3 -3
- data/lib/generators/admin/install/templates/controllers/admin/sessions_controller.rb +3 -5
- data/lib/generators/admin/install/templates/controllers/admin/users_controller.rb +4 -4
- data/lib/generators/admin/install/templates/erb/admin/application/_flash_messages.html.erb +8 -8
- data/lib/generators/admin/install/templates/erb/admin/application/_javascript_tags.html.erb +14 -0
- data/lib/generators/admin/install/templates/erb/admin/application/_page_header_breadcrumb.html.erb +2 -2
- data/lib/generators/admin/install/templates/erb/admin/application/_secondary_navbar.html.erb +1 -1
- data/lib/generators/admin/install/templates/erb/admin/password_resets/edit.html.erb +1 -1
- data/lib/generators/admin/install/templates/erb/admin/password_resets/new.html.erb +1 -1
- data/lib/generators/admin/install/templates/erb/admin/sessions/new.html.erb +1 -1
- data/lib/generators/admin/install/templates/erb/admin/user_mailer/password_reset.html.erb +14 -0
- data/lib/generators/admin/install/templates/erb/admin/user_mailer/{password_reset_provision.text.erb → password_reset.text.erb} +0 -0
- data/lib/generators/admin/install/templates/erb/admin/users/edit.html.erb +2 -2
- data/lib/generators/admin/install/templates/erb/admin/users/index.html.erb +3 -3
- data/lib/generators/admin/install/templates/erb/admin/users/new.html.erb +2 -2
- data/lib/generators/admin/install/templates/erb/admin/users/show.html.erb +4 -4
- data/lib/generators/admin/install/templates/helpers/admin/application_helper.rb +1 -1
- data/lib/generators/admin/install/templates/mailers/admin/application_mailer.rb +3 -0
- data/lib/generators/admin/install/templates/mailers/admin/user_mailer.rb +2 -2
- data/lib/generators/admin/install/templates/migrations/create_admin_users.rb.tt +2 -2
- data/lib/generators/admin/install/templates/models/admin/application_record.rb +3 -0
- data/lib/generators/admin/install/templates/models/admin/current.rb +1 -1
- data/lib/generators/admin/install/templates/models/admin/user.rb +10 -0
- data/lib/generators/admin/install/templates/seeds.rb +1 -1
- data/lib/generators/admin/install/templates/test_unit/application_system_test_case.rb +2 -2
- data/lib/generators/admin/install/templates/test_unit/controllers/admin/home_controller_test.rb +1 -1
- data/lib/generators/admin/install/templates/test_unit/controllers/admin/password_resets_controller_test.rb +1 -1
- data/lib/generators/admin/install/templates/test_unit/controllers/admin/sessions_controller_test.rb +1 -1
- data/lib/generators/admin/install/templates/test_unit/controllers/admin/users_controller_test.rb +5 -5
- data/lib/generators/admin/install/templates/test_unit/system/admin/sessions_test.rb +1 -1
- data/lib/generators/admin/install/templates/test_unit/system/admin/users_test.rb +9 -9
- data/lib/generators/admin/install/templates/test_unit/test_helper.rb +1 -1
- data/lib/generators/admin/scaffold/templates/erb/index.html.erb.tt +1 -1
- data/lib/generators/admin/scaffold/templates/functional_test.rb.tt +1 -1
- data/lib/generators/admin/scaffold/templates/system_test.rb.tt +1 -1
- metadata +8 -5
- data/lib/generators/admin/install/templates/erb/admin/user_mailer/password_reset_provision.html.erb +0 -11
- data/lib/generators/admin/install/templates/models/admin_user.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7acbcb69df24a8f4cc70e5679ddee87b6ae96a031fa16eefdbe364aca086127e
|
4
|
+
data.tar.gz: 494132b0b91cf59fde8afb705768824af1aa6ec7ccae6cbaa00aa1ff385595f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bab4269085274c79c172220c6f19e3e5c061f75f63e46efddc45dca0208f59aa8c78fa6b1c88862585fe1b4d9fef0b503bb531ff9d3bdda5bf64271052b5f2c7
|
7
|
+
data.tar.gz: fab03417c2685ece0c56a4d5d169ebdb6fb2c78d708987618074ae12120cb2fa3a183f3a72561e484e4b5e3b79ce888ed87ba0daf18a22bbcc59af3690a1d047
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
inherit_from: https://raw.githubusercontent.com/rails/rails/master/.rubocop.yml
|
2
|
+
|
3
|
+
Performance:
|
4
|
+
Exclude:
|
5
|
+
- 'test/**/*'
|
6
|
+
|
7
|
+
Style/FrozenStringLiteralComment:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
Style/StringLiterals:
|
11
|
+
Enabled: true
|
12
|
+
EnforcedStyle: double_quotes
|
13
|
+
Include:
|
14
|
+
- 'app/**/*'
|
15
|
+
- 'test/**/*'
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -11,6 +11,7 @@ The purpose of administration zero is to generate a pre-built administration pan
|
|
11
11
|
- [Sortable and filterable](https://github.com/activerecord-hackery/ransack)
|
12
12
|
- [Exportable data](https://github.com/westonganger/spreadsheet_architect)
|
13
13
|
- [Toastr for flash messages](https://getbootstrap.com/docs/5.1/components/toasts)
|
14
|
+
- Determine time zone automatically
|
14
15
|
- Easy authentication system
|
15
16
|
- Admin scaffolds
|
16
17
|
|
@@ -27,13 +28,13 @@ Then run `bundle install`
|
|
27
28
|
You'll need to create a model to be administrated, if you don't have one. for this example let's use the following:
|
28
29
|
|
29
30
|
```
|
30
|
-
|
31
|
+
rails generate model posts title:string body:text published:boolean
|
31
32
|
```
|
32
33
|
|
33
34
|
## Usage
|
34
35
|
|
35
36
|
```
|
36
|
-
|
37
|
+
rails generate admin:install
|
37
38
|
```
|
38
39
|
|
39
40
|
Then run `bundle install` again
|
@@ -44,13 +45,11 @@ Then run `rails db:migrate db:seed`, you can access the admin panel in `/admin`,
|
|
44
45
|
Now you're ready to generate your admin scaffolds.
|
45
46
|
|
46
47
|
```
|
47
|
-
|
48
|
+
rails generate admin:scaffold posts title:string body:text published:boolean
|
48
49
|
```
|
49
50
|
|
50
51
|
## Development
|
51
52
|
|
52
|
-
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
53
|
-
|
54
53
|
To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
55
54
|
|
56
55
|
## Contributing
|
@@ -21,12 +21,11 @@ module Admin
|
|
21
21
|
|
22
22
|
def create_models
|
23
23
|
directory "models/admin", "app/models/admin"
|
24
|
-
copy_file "models/admin_user.rb", "app/models/admin_user.rb"
|
25
24
|
copy_file "models/application_record.rb", "app/models/application_record.rb", force: true
|
26
25
|
end
|
27
26
|
|
28
27
|
def create_fixture_file
|
29
|
-
copy_file "test_unit/admin_users.yml", "test/fixtures/
|
28
|
+
copy_file "test_unit/admin_users.yml", "test/fixtures/admin/users.yml"
|
30
29
|
end
|
31
30
|
|
32
31
|
def create_controllers
|
@@ -1,10 +1,15 @@
|
|
1
1
|
class Admin::ApplicationController < ActionController::Base
|
2
2
|
include Pagy::Backend
|
3
3
|
|
4
|
+
before_action :set_time_zone
|
4
5
|
before_action :authenticate
|
5
6
|
|
7
|
+
def set_time_zone
|
8
|
+
Time.zone = cookies[:time_zone]
|
9
|
+
end
|
10
|
+
|
6
11
|
def authenticate
|
7
|
-
if admin_user =
|
12
|
+
if admin_user = Admin::User.find_by_id(session[:admin_user_id])
|
8
13
|
Admin::Current.user = admin_user
|
9
14
|
else
|
10
15
|
redirect_to admin_sign_in_path
|
@@ -12,8 +12,8 @@ class Admin::PasswordResetsController < Admin::ApplicationController
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def create
|
15
|
-
if @admin_user =
|
16
|
-
Admin::UserMailer.with(admin_user: @admin_user).
|
15
|
+
if @admin_user = Admin::User.find_by(email: params[:email])
|
16
|
+
Admin::UserMailer.with(admin_user: @admin_user).password_reset.deliver_later
|
17
17
|
redirect_to admin_sign_in_path, notice: "Check your email for reset instructions"
|
18
18
|
else
|
19
19
|
redirect_to new_admin_password_reset_path, alert: "Sorry, we didn't recognize that email address"
|
@@ -30,7 +30,7 @@ class Admin::PasswordResetsController < Admin::ApplicationController
|
|
30
30
|
|
31
31
|
private
|
32
32
|
def set_admin_user
|
33
|
-
@admin_user =
|
33
|
+
@admin_user = Admin::User.find_signed!(params[:token], purpose: :password_reset)
|
34
34
|
rescue
|
35
35
|
redirect_to new_admin_password_reset_path, alert: "That password reset link is invalid"
|
36
36
|
end
|
@@ -4,16 +4,14 @@ class Admin::SessionsController < Admin::ApplicationController
|
|
4
4
|
layout "admin/authentication"
|
5
5
|
|
6
6
|
def new
|
7
|
-
@admin_user =
|
7
|
+
@admin_user = Admin::User.new
|
8
8
|
end
|
9
9
|
|
10
10
|
def create
|
11
|
-
@admin_user =
|
11
|
+
@admin_user = Admin::User.find_by(email: params[:email])
|
12
12
|
|
13
13
|
if @admin_user && @admin_user.authenticate(params[:password])
|
14
|
-
session[:admin_user_id] = @admin_user.id
|
15
|
-
|
16
|
-
redirect_to admin_path
|
14
|
+
session[:admin_user_id] = @admin_user.id; redirect_to(admin_path)
|
17
15
|
else
|
18
16
|
redirect_to admin_sign_in_path(email_hint: params[:email]), alert: "That email or password is incorrect"
|
19
17
|
end
|
@@ -2,7 +2,7 @@ class Admin::UsersController < Admin::ApplicationController
|
|
2
2
|
before_action :set_admin_user, only: %i[ show edit update destroy ]
|
3
3
|
|
4
4
|
def index
|
5
|
-
@search =
|
5
|
+
@search = Admin::User.all.ransack(params[:q])
|
6
6
|
|
7
7
|
respond_to do |format|
|
8
8
|
format.html { @pagy, @admin_users = pagy(@search.result) }
|
@@ -14,14 +14,14 @@ class Admin::UsersController < Admin::ApplicationController
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def new
|
17
|
-
@admin_user =
|
17
|
+
@admin_user = Admin::User.new
|
18
18
|
end
|
19
19
|
|
20
20
|
def edit
|
21
21
|
end
|
22
22
|
|
23
23
|
def create
|
24
|
-
@admin_user =
|
24
|
+
@admin_user = Admin::User.new(admin_user_params)
|
25
25
|
|
26
26
|
if @admin_user.save
|
27
27
|
redirect_to @admin_user, notice: "User was successfully created."
|
@@ -45,7 +45,7 @@ class Admin::UsersController < Admin::ApplicationController
|
|
45
45
|
|
46
46
|
private
|
47
47
|
def set_admin_user
|
48
|
-
@admin_user =
|
48
|
+
@admin_user = Admin::User.find(params[:id])
|
49
49
|
end
|
50
50
|
|
51
51
|
def admin_user_params
|
@@ -1,11 +1,11 @@
|
|
1
|
-
<%
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
<% message = notice || alert %>
|
2
|
+
|
3
|
+
<% if message %>
|
4
|
+
<div class="position-fixed start-50 translate-middle-x" style="z-index: 1030; top: 8rem;">
|
5
|
+
<div class="toast hide text-center text-white bg-dark border-0" data-controller="flash-message">
|
6
|
+
<div class="toast-body">
|
7
|
+
<%= message %>
|
8
8
|
</div>
|
9
9
|
</div>
|
10
|
-
|
10
|
+
</div>
|
11
11
|
<% end %>
|
@@ -1,6 +1,20 @@
|
|
1
1
|
<!-- Tabler Core -->
|
2
2
|
<script src="https://unpkg.com/@tabler/core@1.0.0-beta9/dist/js/tabler.min.js"></script>
|
3
3
|
|
4
|
+
<!-- set time zone cookie -->
|
5
|
+
<script>
|
6
|
+
const { timeZone } = new Intl.DateTimeFormat().resolvedOptions();
|
7
|
+
setCookie("time_zone", timeZone);
|
8
|
+
|
9
|
+
function setCookie(name, value) {
|
10
|
+
const twentyYears = 20 * 365 * 24 * 60 * 60 * 1000;
|
11
|
+
const body = [ name, value ].map(encodeURIComponent).join("=");
|
12
|
+
const expires = new Date(Date.now() + twentyYears).toUTCString();
|
13
|
+
const cookie = `${body}; path=/; expires=${expires}`;
|
14
|
+
document.cookie = cookie;
|
15
|
+
}
|
16
|
+
</script>
|
17
|
+
|
4
18
|
<!-- bring back data-confirm -->
|
5
19
|
<script>
|
6
20
|
document.addEventListener("click", (event) => {
|
data/lib/generators/admin/install/templates/erb/admin/application/_secondary_navbar.html.erb
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><circle cx="9" cy="7" r="4"></circle><path d="M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path><path d="M21 21v-2a4 4 0 0 0 -3 -3.85"></path></svg>
|
20
20
|
</span>
|
21
21
|
<span class="nav-link-title">
|
22
|
-
|
22
|
+
Users
|
23
23
|
</span>
|
24
24
|
<% end %>
|
25
25
|
</li>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%= form_with(url: admin_password_reset_path, method: :patch, class: "card card-md") do |form| %>
|
2
2
|
<div class="card-body">
|
3
|
-
<
|
3
|
+
<h1 class="card-title text-center mb-4">Reset password</h1>
|
4
4
|
|
5
5
|
<%= hidden_field_tag :token, params[:token] %>
|
6
6
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%= form_with(url: admin_password_reset_path, class: "card card-md") do |form| %>
|
2
2
|
<div class="card-body">
|
3
|
-
<
|
3
|
+
<h1 class="card-title text-center mb-4">Forgot password</h1>
|
4
4
|
<p class="text-muted mb-4">Enter your email address and your password will be reset and emailed to you.</p>
|
5
5
|
<div class="mb-3">
|
6
6
|
<%= form.label :email, class: "form-label" %>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%= form_with(url: admin_sign_in_path, class: "card card-md") do |form| %>
|
2
2
|
<div class="card-body">
|
3
|
-
<
|
3
|
+
<h1 class="card-title text-center mb-4">Login to your account</h1>
|
4
4
|
<div class="mb-3">
|
5
5
|
<%= form.label :email, class: "form-label" %>
|
6
6
|
<%= form.email_field :email, value: params[:email_hint], placeholder: "Enter email", autofocus: true, required: true, autocomplete: "email", class:"form-control" %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
5
|
+
</head>
|
6
|
+
<body>
|
7
|
+
<p>Hey there,</p>
|
8
|
+
<p>Can't remember your password for <strong><%= @admin_user.email %></strong>? That's OK, it happens. Just hit the link below to set a new one.</p>
|
9
|
+
<p><%= link_to "Reset my password", edit_admin_password_reset_url(token: @signed_id) %></p>
|
10
|
+
<p>If you did not request a password reset you can safely ignore this email, it expires in 20 minutes. Only someone with access to this email account can reset your password.</p>
|
11
|
+
<hr>
|
12
|
+
<p>Have questions or need help? Just reply to this email and our support team will help you sort it out.</p>
|
13
|
+
</body>
|
14
|
+
</html>
|
File without changes
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%= render "page_header" do %>
|
2
|
-
<%= render "page_header_breadcrumb", title: "Editing
|
2
|
+
<%= render "page_header_breadcrumb", title: "Editing user" do %>
|
3
3
|
<li class="breadcrumb-item"><%= link_to "Admin", admin_path %></li>
|
4
|
-
<li class="breadcrumb-item"><%= link_to "
|
4
|
+
<li class="breadcrumb-item"><%= link_to "Users", admin_users_path %></li>
|
5
5
|
<li class="breadcrumb-item"><%= link_to @admin_user.email, @admin_user %></li>
|
6
6
|
<% end %>
|
7
7
|
<% end %>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<%= render "page_header" do %>
|
2
|
-
<%= render "page_header_breadcrumb", title: "
|
2
|
+
<%= render "page_header_breadcrumb", title: "Users" do %>
|
3
3
|
<li class="breadcrumb-item"><%= link_to "Admin", admin_path %></li>
|
4
4
|
<% end %>
|
5
5
|
|
6
6
|
<%= render "page_header_actions" do %>
|
7
7
|
<%= link_to "Filters", "#offcanvas_filters", "data-bs-toggle": "offcanvas", class: "btn btn-light" %>
|
8
|
-
<%= link_to "New
|
8
|
+
<%= link_to "New user", new_admin_user_path, class: "btn btn-primary" %>
|
9
9
|
<% end %>
|
10
10
|
<% end %>
|
11
11
|
|
@@ -41,7 +41,7 @@
|
|
41
41
|
<div class="card-footer d-flex align-items-center fs-5">
|
42
42
|
<div class="d-none d-md-block">
|
43
43
|
<div>Download: <%= link_to "CSV", admin_users_path(format: :csv, q: request.params[:q]) %></div>
|
44
|
-
|
44
|
+
<%= raw pagy_info(@pagy) %>
|
45
45
|
</div>
|
46
46
|
<div class="ms-auto">
|
47
47
|
<%= render "pagination", pagy: @pagy %>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%= render "page_header" do %>
|
2
|
-
<%= render "page_header_breadcrumb", title: "New
|
2
|
+
<%= render "page_header_breadcrumb", title: "New user" do %>
|
3
3
|
<li class="breadcrumb-item"><%= link_to "Admin", admin_path %></li>
|
4
|
-
<li class="breadcrumb-item"><%= link_to "
|
4
|
+
<li class="breadcrumb-item"><%= link_to "Users", admin_users_path %></li>
|
5
5
|
<% end %>
|
6
6
|
<% end %>
|
7
7
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
<%= render "page_header" do %>
|
2
2
|
<%= render "page_header_breadcrumb", title: @admin_user.email do %>
|
3
3
|
<li class="breadcrumb-item"><%= link_to "Admin", admin_path %></li>
|
4
|
-
<li class="breadcrumb-item"><%= link_to "
|
4
|
+
<li class="breadcrumb-item"><%= link_to "Users", admin_users_path %></li>
|
5
5
|
<% end %>
|
6
6
|
|
7
7
|
<%= render "page_header_actions" do %>
|
8
|
-
<%= link_to "Edit
|
9
|
-
<%= button_to "Delete
|
8
|
+
<%= link_to "Edit user", edit_admin_user_path(@admin_user), class: "btn btn-primary" %>
|
9
|
+
<%= button_to "Delete user", @admin_user, method: :delete, "data-confirm": "Are you sure?", form_class: "d-inline", class: "btn btn-light" %>
|
10
10
|
<% end %>
|
11
11
|
<% end %>
|
12
12
|
|
@@ -14,7 +14,7 @@
|
|
14
14
|
<div class="container-xl">
|
15
15
|
<div class="card">
|
16
16
|
<div class="card-header">
|
17
|
-
<h3 class="card-title">
|
17
|
+
<h3 class="card-title">User details</h3>
|
18
18
|
</div>
|
19
19
|
<div class="card-body">
|
20
20
|
<dl class="row">
|
@@ -2,7 +2,7 @@ module Admin::ApplicationHelper
|
|
2
2
|
include Pagy::Frontend
|
3
3
|
|
4
4
|
def title
|
5
|
-
content_for(:title) || Rails.application.class.to_s.split(
|
5
|
+
content_for(:title) || Rails.application.class.to_s.split("::").first
|
6
6
|
end
|
7
7
|
|
8
8
|
def active_nav_item(controller, actions = %w( index show new edit create update))
|
@@ -1,5 +1,5 @@
|
|
1
|
-
class Admin::UserMailer < ApplicationMailer
|
2
|
-
def
|
1
|
+
class Admin::UserMailer < Admin::ApplicationMailer
|
2
|
+
def password_reset
|
3
3
|
@admin_user = params[:admin_user]
|
4
4
|
@signed_id = @admin_user.signed_id(purpose: :password_reset, expires_in: 20.minutes)
|
5
5
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
2
2
|
def change
|
3
3
|
create_table :admin_users do |t|
|
4
|
-
t.string :email
|
5
|
-
t.string :password_digest
|
4
|
+
t.string :email, null: false
|
5
|
+
t.string :password_digest, null: false
|
6
6
|
|
7
7
|
t.timestamps
|
8
8
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Admin::User < Admin::ApplicationRecord
|
2
|
+
has_secure_password
|
3
|
+
|
4
|
+
validates :email, presence: true, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
|
5
|
+
validates :password, allow_nil: true, length: { minimum: 12 }, format: { with: /(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])/ }
|
6
|
+
|
7
|
+
before_validation do
|
8
|
+
self.email = email.try(:downcase).try(:strip)
|
9
|
+
end
|
10
|
+
end
|
@@ -6,4 +6,4 @@
|
|
6
6
|
# movies = Movie.create([{ name: "Star Wars" }, { name: "Lord of the Rings" }])
|
7
7
|
# Character.create(name: "Luke", movie: movies.first)
|
8
8
|
|
9
|
-
|
9
|
+
Admin::User.create(email: "admin@example.com", password: "Password9957", password_confirmation: "Password9957")
|
@@ -3,13 +3,13 @@ require "test_helper"
|
|
3
3
|
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
|
4
4
|
driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
|
5
5
|
|
6
|
-
def
|
6
|
+
def sign_in_admin_as(user)
|
7
7
|
visit admin_sign_in_url
|
8
8
|
fill_in :email, with: user.email
|
9
9
|
fill_in :password, with: "Secret1*3*5*"
|
10
10
|
click_on "Sign in"
|
11
11
|
assert_current_path admin_url
|
12
12
|
|
13
|
-
|
13
|
+
user
|
14
14
|
end
|
15
15
|
end
|
@@ -18,7 +18,7 @@ class Admin::PasswordResetsControllerTest < ActionDispatch::IntegrationTest
|
|
18
18
|
end
|
19
19
|
|
20
20
|
test "should send a password reset email" do
|
21
|
-
assert_enqueued_email_with Admin::UserMailer, :
|
21
|
+
assert_enqueued_email_with Admin::UserMailer, :password_reset, args: { admin_user: @admin_user } do
|
22
22
|
post admin_password_reset_url, params: { email: @admin_user.email }
|
23
23
|
end
|
24
24
|
|
data/lib/generators/admin/install/templates/test_unit/controllers/admin/users_controller_test.rb
CHANGED
@@ -2,7 +2,7 @@ require "test_helper"
|
|
2
2
|
|
3
3
|
class Admin::UsersControllerTest < ActionDispatch::IntegrationTest
|
4
4
|
setup do
|
5
|
-
@admin_user =
|
5
|
+
@admin_user = sign_in_admin_as(admin_users(:lazaro_nixon))
|
6
6
|
end
|
7
7
|
|
8
8
|
test "should get index" do
|
@@ -16,11 +16,11 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest
|
|
16
16
|
end
|
17
17
|
|
18
18
|
test "should create admin_user" do
|
19
|
-
assert_difference("
|
20
|
-
post admin_users_url, params: { admin_user: { email: "lazaronixon@hey.com", password: "Secret1*3*5*", password_confirmation: "Secret1*3*5*"} }
|
19
|
+
assert_difference("Admin::User.count") do
|
20
|
+
post admin_users_url, params: { admin_user: { email: "lazaronixon@hey.com", password: "Secret1*3*5*", password_confirmation: "Secret1*3*5*" } }
|
21
21
|
end
|
22
22
|
|
23
|
-
assert_redirected_to admin_user_url(
|
23
|
+
assert_redirected_to admin_user_url(Admin::User.last)
|
24
24
|
end
|
25
25
|
|
26
26
|
test "should show admin_user" do
|
@@ -39,7 +39,7 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest
|
|
39
39
|
end
|
40
40
|
|
41
41
|
test "should destroy admin_user" do
|
42
|
-
assert_difference("
|
42
|
+
assert_difference("Admin::User.count", -1) do
|
43
43
|
delete admin_user_url(@admin_user)
|
44
44
|
end
|
45
45
|
|
@@ -2,41 +2,41 @@ require "application_system_test_case"
|
|
2
2
|
|
3
3
|
class Admin::UsersTest < ApplicationSystemTestCase
|
4
4
|
setup do
|
5
|
-
@admin_user =
|
5
|
+
@admin_user = sign_in_admin_as(admin_users(:lazaro_nixon))
|
6
6
|
end
|
7
7
|
|
8
8
|
test "visiting the index" do
|
9
9
|
visit admin_users_url
|
10
|
-
assert_selector "h2", text: "
|
10
|
+
assert_selector "h2", text: "Users"
|
11
11
|
end
|
12
12
|
|
13
13
|
test "should create user" do
|
14
14
|
visit admin_users_url
|
15
|
-
click_on "New
|
15
|
+
click_on "New user"
|
16
16
|
|
17
17
|
fill_in "Email", with: "lazaronixon@hey.com"
|
18
18
|
fill_in "Password", with: "Secret1*3*5*"
|
19
19
|
fill_in "Password confirmation", with: "Secret1*3*5*"
|
20
|
-
click_on "Create
|
20
|
+
click_on "Create User"
|
21
21
|
|
22
22
|
assert_text "User was successfully created"
|
23
23
|
end
|
24
24
|
|
25
|
-
test "should update
|
25
|
+
test "should update user" do
|
26
26
|
visit admin_user_url(@admin_user)
|
27
|
-
click_on "Edit
|
27
|
+
click_on "Edit user"
|
28
28
|
|
29
29
|
fill_in "Email", with: @admin_user.email
|
30
30
|
fill_in "Password", with: "NewSecret1*3*5*"
|
31
31
|
fill_in "Password confirmation", with: "NewSecret1*3*5*"
|
32
|
-
click_on "Update
|
32
|
+
click_on "Update User"
|
33
33
|
|
34
34
|
assert_text "User was successfully updated"
|
35
35
|
end
|
36
36
|
|
37
|
-
test "should destroy
|
37
|
+
test "should destroy user" do
|
38
38
|
visit admin_user_url(@admin_user)
|
39
|
-
page.accept_confirm { click_on "Delete
|
39
|
+
page.accept_confirm { click_on "Delete user" }
|
40
40
|
|
41
41
|
assert_text "User was successfully destroyed"
|
42
42
|
end
|
@@ -10,7 +10,7 @@ class ActiveSupport::TestCase
|
|
10
10
|
fixtures :all
|
11
11
|
|
12
12
|
# Add more helper methods to be used by all tests here...
|
13
|
-
def
|
13
|
+
def sign_in_admin_as(user)
|
14
14
|
post(admin_sign_in_url, params: { email: user.email, password: "Secret1*3*5*" }); user
|
15
15
|
end
|
16
16
|
end
|
@@ -49,7 +49,7 @@
|
|
49
49
|
<div class="card-footer d-flex align-items-center fs-5">
|
50
50
|
<div class="d-none d-md-block">
|
51
51
|
<div>Download: <%%= link_to "CSV", <%= index_helper(type: :path) %>(format: :csv, q: request.params[:q]) %></div>
|
52
|
-
|
52
|
+
<%%= raw pagy_info(@pagy) %>
|
53
53
|
</div>
|
54
54
|
<div class="ms-auto">
|
55
55
|
<%%= render "pagination", pagy: @pagy %>
|
@@ -6,7 +6,7 @@ class <%= controller_class_name %>ControllerTest < ActionDispatch::IntegrationTe
|
|
6
6
|
|
7
7
|
<%- end -%>
|
8
8
|
setup do
|
9
|
-
@admin_user =
|
9
|
+
@admin_user = sign_in_admin_as admin_users(:lazaro_nixon)
|
10
10
|
@<%= singular_table_name %> = <%= fixture_name %>(:one)
|
11
11
|
end
|
12
12
|
|
@@ -2,7 +2,7 @@ require "application_system_test_case"
|
|
2
2
|
|
3
3
|
class <%= class_name.pluralize %>Test < ApplicationSystemTestCase
|
4
4
|
setup do
|
5
|
-
@admin_user =
|
5
|
+
@admin_user = sign_in_admin_as(admin_users(:lazaro_nixon))
|
6
6
|
@<%= singular_table_name %> = <%= fixture_name %>(:one)
|
7
7
|
end
|
8
8
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: administration-zero
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nixon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -19,6 +19,7 @@ extra_rdoc_files: []
|
|
19
19
|
files:
|
20
20
|
- ".documentation/screenshot.png"
|
21
21
|
- ".gitignore"
|
22
|
+
- ".rubocop.yml"
|
22
23
|
- CHANGELOG.md
|
23
24
|
- CODE_OF_CONDUCT.md
|
24
25
|
- Gemfile
|
@@ -51,8 +52,8 @@ files:
|
|
51
52
|
- lib/generators/admin/install/templates/erb/admin/password_resets/edit.html.erb
|
52
53
|
- lib/generators/admin/install/templates/erb/admin/password_resets/new.html.erb
|
53
54
|
- lib/generators/admin/install/templates/erb/admin/sessions/new.html.erb
|
54
|
-
- lib/generators/admin/install/templates/erb/admin/user_mailer/
|
55
|
-
- lib/generators/admin/install/templates/erb/admin/user_mailer/
|
55
|
+
- lib/generators/admin/install/templates/erb/admin/user_mailer/password_reset.html.erb
|
56
|
+
- lib/generators/admin/install/templates/erb/admin/user_mailer/password_reset.text.erb
|
56
57
|
- lib/generators/admin/install/templates/erb/admin/users/_form.html.erb
|
57
58
|
- lib/generators/admin/install/templates/erb/admin/users/edit.html.erb
|
58
59
|
- lib/generators/admin/install/templates/erb/admin/users/index.html.erb
|
@@ -63,10 +64,12 @@ files:
|
|
63
64
|
- lib/generators/admin/install/templates/helpers/admin/application_helper.rb
|
64
65
|
- lib/generators/admin/install/templates/images/admin/000m.jpg
|
65
66
|
- lib/generators/admin/install/templates/images/admin/logo.svg
|
67
|
+
- lib/generators/admin/install/templates/mailers/admin/application_mailer.rb
|
66
68
|
- lib/generators/admin/install/templates/mailers/admin/user_mailer.rb
|
67
69
|
- lib/generators/admin/install/templates/migrations/create_admin_users.rb.tt
|
70
|
+
- lib/generators/admin/install/templates/models/admin/application_record.rb
|
68
71
|
- lib/generators/admin/install/templates/models/admin/current.rb
|
69
|
-
- lib/generators/admin/install/templates/models/
|
72
|
+
- lib/generators/admin/install/templates/models/admin/user.rb
|
70
73
|
- lib/generators/admin/install/templates/models/application_record.rb
|
71
74
|
- lib/generators/admin/install/templates/seeds.rb
|
72
75
|
- lib/generators/admin/install/templates/test_unit/admin_users.yml
|
data/lib/generators/admin/install/templates/erb/admin/user_mailer/password_reset_provision.html.erb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
<p>Hey there,</p>
|
2
|
-
|
3
|
-
<p>Can't remember your password for <strong><%= @admin_user.email %></strong>? That's OK, it happens. Just hit the link below to set a new one.</p>
|
4
|
-
|
5
|
-
<p><%= link_to "Reset my password", edit_admin_password_reset_url(token: @signed_id) %></p>
|
6
|
-
|
7
|
-
<p>If you did not request a password reset you can safely ignore this email, it expires in 20 minutes. Only someone with access to this email account can reset your password.</p>
|
8
|
-
|
9
|
-
<hr>
|
10
|
-
|
11
|
-
<p>Have questions or need help? Just reply to this email and our support team will help you sort it out.</p>
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class AdminUser < ApplicationRecord
|
2
|
-
include SpreadsheetArchitect
|
3
|
-
|
4
|
-
has_secure_password
|
5
|
-
|
6
|
-
validates :email, presence: true, uniqueness: true
|
7
|
-
validates_format_of :email, with: /\A[^@\s]+@[^@\s]+\z/
|
8
|
-
|
9
|
-
validates_length_of :password, minimum: 12, allow_nil: true
|
10
|
-
validates_format_of :password, with: /(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])/, allow_nil: true, message: "might easily be guessed"
|
11
|
-
|
12
|
-
before_validation do
|
13
|
-
self.email = email.downcase.strip
|
14
|
-
end
|
15
|
-
end
|