alchemy-devise 7.4.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +5 -4
- data/app/assets/builds/alchemy-devise.css +1 -1
- data/app/assets/stylesheets/alchemy-devise/login.scss +45 -19
- data/app/controllers/alchemy/admin/passwords_controller.rb +1 -1
- data/app/controllers/alchemy/admin/user_sessions_controller.rb +2 -2
- data/app/controllers/alchemy/admin/users_controller.rb +1 -1
- data/app/mailers/alchemy/notifications.rb +1 -1
- data/app/models/alchemy/user.rb +12 -4
- data/app/patches/controllers/alchemy/devise/base_controller_patch.rb +20 -0
- data/app/views/alchemy/admin/passwords/edit.html.erb +16 -9
- data/app/views/alchemy/admin/passwords/new.html.erb +17 -8
- data/app/views/alchemy/admin/user_sessions/_logo.html.erb +35 -0
- data/app/views/alchemy/admin/user_sessions/new.html.erb +22 -9
- data/app/views/alchemy/admin/users/_fields.html.erb +17 -11
- data/app/views/alchemy/admin/users/_resource_table.html.erb +2 -2
- data/app/views/alchemy/admin/users/index.html.erb +3 -8
- data/app/views/alchemy/admin/users/signup.html.erb +4 -2
- data/config/initializers/alchemy.rb +1 -13
- data/config/locales/de.yml +5 -0
- data/config/locales/en.yml +5 -0
- data/db/migrate/20251127170649_add_rememberable_column.rb +5 -0
- data/lib/alchemy/devise/configuration.rb +46 -0
- data/lib/alchemy/devise/engine.rb +3 -4
- data/lib/alchemy/devise/version.rb +1 -1
- data/lib/alchemy/devise.rb +24 -39
- data/lib/generators/alchemy/devise/install/templates/devise.rb.tt +3 -3
- metadata +36 -14
- data/app/assets/builds/alchemy-devise.css.map +0 -1
- data/app/controllers/alchemy/base_controller_extension.rb +0 -18
- data/app/views/alchemy/admin/users/_table.html.erb +0 -28
- data/app/views/alchemy/admin/users/_user.html.erb +0 -41
- /data/{lib → app/models}/alchemy/devise/ability.rb +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: aa739c92a801c881866bb6892e6173fdd1fd71cee618ec1f71e14fb8fb97308e
|
|
4
|
+
data.tar.gz: 7ab851553d4284cb21cfe6fe9042925008ad01209412c3587fd48b3adc267769
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 338681631406095227adee11ed992a8c6b9a32027cfa332792f4207e735df90f0dc289268c5b9c78382910f8615fcc070b9426f823886e8336fdadc37330ddea
|
|
7
|
+
data.tar.gz: b01851129e4b08a1535895d7aad2ea50038514a72ff988f82ae92d8a679e3b42b3168d801ae3b10356e3b4b9ec332578307754a2209637a8b9d9b038b33b3731
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 8.0.0 (2025-11-28)
|
|
4
|
+
|
|
5
|
+
- Enable rememberable module [#237](https://github.com/AlchemyCMS/alchemy-devise/pull/237) ([tvdeyen](https://github.com/tvdeyen))
|
|
6
|
+
- Use Alchemy::Configuration for config [#236](https://github.com/AlchemyCMS/alchemy-devise/pull/236) ([tvdeyen](https://github.com/tvdeyen))
|
|
7
|
+
- CI: Test Alchemy 8.0-stable branch [#234](https://github.com/AlchemyCMS/alchemy-devise/pull/234) ([tvdeyen](https://github.com/tvdeyen))
|
|
8
|
+
- Make `Alchemy::Devise::Ability` auto-loadable [#233](https://github.com/AlchemyCMS/alchemy-devise/pull/233) ([mamhoff](https://github.com/mamhoff))
|
|
9
|
+
- Login, Signup and Password reset forms improvements [#231](https://github.com/AlchemyCMS/alchemy-devise/pull/231) ([tvdeyen](https://github.com/tvdeyen))
|
|
10
|
+
- Test with Rails 8.0 [#230](https://github.com/AlchemyCMS/alchemy-devise/pull/230) ([tvdeyen](https://github.com/tvdeyen))
|
|
11
|
+
- New login screen with dark mode support [#229](https://github.com/AlchemyCMS/alchemy-devise/pull/229) ([tvdeyen](https://github.com/tvdeyen))
|
|
12
|
+
- Updates for Alchemy 8.0 [#228](https://github.com/AlchemyCMS/alchemy-devise/pull/228) ([mamhoff](https://github.com/mamhoff))
|
|
13
|
+
- Update puma requirement from ~> 6.0 to ~> 7.0 [#227](https://github.com/AlchemyCMS/alchemy-devise/pull/227) ([dependabot](https://github.com/apps/dependabot))
|
|
14
|
+
- Update rspec-rails requirement from ~> 7.1 to ~> 8.0 [#226](https://github.com/AlchemyCMS/alchemy-devise/pull/226) ([dependabot](https://github.com/apps/dependabot))
|
|
15
|
+
- Add support for Alchemy 8.0 [#225](https://github.com/AlchemyCMS/alchemy-devise/pull/225) ([tvdeyen](https://github.com/tvdeyen))
|
|
16
|
+
- Load Base Controller Extension when autoloading [#216](https://github.com/AlchemyCMS/alchemy-devise/pull/216) ([mamhoff](https://github.com/mamhoff))
|
|
17
|
+
|
|
3
18
|
## 7.4.1 (2025-02-12)
|
|
4
19
|
|
|
5
20
|
- Fix module icon for Alchemy 7.4 [#224](https://github.com/AlchemyCMS/alchemy-devise/pull/224) ([tvdeyen](https://github.com/tvdeyen))
|
data/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://github.com/AlchemyCMS/alchemy-devise/actions/workflows/ci.yml)
|
|
4
4
|
[](https://github.com/AlchemyCMS/alchemy-devise/actions/workflows/brakeman-analysis.yml)
|
|
5
5
|
|
|
6
|
-
[](http://badge.fury.io/rb/alchemy-devise) [](http://badge.fury.io/rb/alchemy-devise) [](https://codecov.io/gh/AlchemyCMS/alchemy-devise)
|
|
7
7
|
|
|
8
8
|
AlchemyCMS has no authentication in its core. So it is possible to bring your own authentication and use it to authorize users in AlchemyCMS. If you don't have your own authentication, you can use this gem.
|
|
9
9
|
|
|
@@ -42,14 +42,15 @@ Default Devise modules included in `Alchemy::User` model
|
|
|
42
42
|
- `:validatable`
|
|
43
43
|
- `:timeoutable`
|
|
44
44
|
- `:recoverable`
|
|
45
|
+
- `:rememberable`
|
|
45
46
|
|
|
46
|
-
If you want to add additional modules into the Alchemy user class append them to `Alchemy.devise_modules` in an initializer in your app.
|
|
47
|
+
If you want to add additional modules into the Alchemy user class append them to `Alchemy::Devise.config.devise_modules` in an initializer in your app.
|
|
47
48
|
|
|
48
49
|
### Register additional modules example
|
|
49
50
|
|
|
50
51
|
```ruby
|
|
51
52
|
# config/initializers/alchemy.rb
|
|
52
|
-
Alchemy.devise_modules << :registerable
|
|
53
|
+
Alchemy::Devise.config.devise_modules << :registerable
|
|
53
54
|
```
|
|
54
55
|
|
|
55
56
|
### Using old encryption
|
|
@@ -58,7 +59,7 @@ If your app uses an old encryption that needs the +devise-encryptable+ gem you a
|
|
|
58
59
|
|
|
59
60
|
```ruby
|
|
60
61
|
# config/initializers/alchemy.rb
|
|
61
|
-
Alchemy.devise_modules << :encryptable
|
|
62
|
+
Alchemy::Devise.config.devise_modules << :encryptable
|
|
62
63
|
```
|
|
63
64
|
|
|
64
65
|
## Testing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
body.user_sessions
|
|
1
|
+
body.user_sessions #errors,body.user_sessions .message.info,body.passwords #errors,body.passwords .message.info{border-color:rgba(0,0,0,0)}body.user_sessions #errors,body.passwords #errors{margin-left:157px}.logo-box{width:250px;margin:0 10px 1.5em 200px}.logo-box svg{width:200px;height:auto}.login_signup_box{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.login_signup_box alchemy-message{width:300px;margin-left:var(--form-left-column-width)}.no-js .login_signup_box{display:none}.login_signup_box .message{margin-left:157px}.login_signup_box .submit{display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-4);margin-left:var(--form-left-column-width);padding-left:var(--spacing-0)}.login_signup_box .submit.align-right{justify-content:end}.login_signup_box .submit>label{text-align:start}.login_signup_box .submit>label input[type=checkbox]{margin:0 var(--spacing-0) 0 0}.login_signup_box .submit>a{display:inline-flex;align-items:center;gap:var(--spacing-0)}.login_signup_box .submit>a:hover alchemy-icon{transform:translateX(-2px);transition:transform var(--transition-duration)}
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
body.user_sessions,
|
|
2
2
|
body.passwords {
|
|
3
|
-
background-color: var(--color-blue_dark);
|
|
4
|
-
color: var(--color-white);
|
|
5
|
-
|
|
6
|
-
a {
|
|
7
|
-
color: var(--color-white);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
3
|
#errors,
|
|
11
4
|
.message.info {
|
|
12
5
|
border-color: transparent;
|
|
@@ -17,18 +10,26 @@ body.passwords {
|
|
|
17
10
|
}
|
|
18
11
|
}
|
|
19
12
|
|
|
20
|
-
|
|
21
|
-
width:
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
.logo-box {
|
|
14
|
+
width: 250px;
|
|
15
|
+
margin: 0 10px 1.5em 200px;
|
|
16
|
+
|
|
17
|
+
svg {
|
|
18
|
+
width: 200px;
|
|
19
|
+
height: auto;
|
|
20
|
+
}
|
|
24
21
|
}
|
|
25
22
|
|
|
26
23
|
.login_signup_box {
|
|
27
24
|
position: absolute;
|
|
28
|
-
width: 450px;
|
|
29
25
|
top: 50%;
|
|
30
26
|
left: 50%;
|
|
31
|
-
transform: translate(-
|
|
27
|
+
transform: translate(-50%, -50%);
|
|
28
|
+
|
|
29
|
+
alchemy-message {
|
|
30
|
+
width: 300px;
|
|
31
|
+
margin-left: var(--form-left-column-width);
|
|
32
|
+
}
|
|
32
33
|
|
|
33
34
|
.no-js & {
|
|
34
35
|
display: none;
|
|
@@ -38,12 +39,37 @@ body.passwords {
|
|
|
38
39
|
margin-left: 157px;
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
.
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
.submit {
|
|
43
|
+
display: flex;
|
|
44
|
+
align-items: center;
|
|
45
|
+
justify-content: space-between;
|
|
46
|
+
gap: var(--spacing-4);
|
|
47
|
+
margin-left: var(--form-left-column-width);
|
|
48
|
+
padding-left: var(--spacing-0);
|
|
49
|
+
|
|
50
|
+
&.align-right {
|
|
51
|
+
justify-content: end;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
> label {
|
|
55
|
+
text-align: start;
|
|
56
|
+
|
|
57
|
+
input[type="checkbox"] {
|
|
58
|
+
margin: 0 var(--spacing-0) 0 0;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
> a {
|
|
63
|
+
display: inline-flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
gap: var(--spacing-0);
|
|
44
66
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
67
|
+
&:hover {
|
|
68
|
+
alchemy-icon {
|
|
69
|
+
transform: translateX(-2px);
|
|
70
|
+
transition: transform var(--transition-duration);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
48
74
|
}
|
|
49
75
|
}
|
|
@@ -13,7 +13,7 @@ module Alchemy
|
|
|
13
13
|
|
|
14
14
|
helper "Alchemy::Admin::Base"
|
|
15
15
|
|
|
16
|
-
layout Alchemy::Devise.layout
|
|
16
|
+
layout Alchemy::Devise.config.layout
|
|
17
17
|
|
|
18
18
|
def create
|
|
19
19
|
authenticate_user!
|
|
@@ -49,7 +49,7 @@ module Alchemy
|
|
|
49
49
|
|
|
50
50
|
# Overwriting the default of Devise
|
|
51
51
|
def after_sign_out_path_for(resource_or_scope)
|
|
52
|
-
if request.referer.blank? || request.referer.to_s
|
|
52
|
+
if request.referer.blank? || request.referer.to_s.include?("admin")
|
|
53
53
|
root_path
|
|
54
54
|
else
|
|
55
55
|
request.referer
|
data/app/models/alchemy/user.rb
CHANGED
|
@@ -17,7 +17,7 @@ module Alchemy
|
|
|
17
17
|
:tag_list
|
|
18
18
|
]
|
|
19
19
|
|
|
20
|
-
devise(*Alchemy.devise_modules)
|
|
20
|
+
devise(*Alchemy::Devise.config.devise_modules)
|
|
21
21
|
|
|
22
22
|
include Alchemy::Taggable
|
|
23
23
|
|
|
@@ -25,7 +25,7 @@ module Alchemy
|
|
|
25
25
|
|
|
26
26
|
has_many :folded_pages
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
validates :login, uniqueness: {case_sensitive: false}, presence: :login_required?
|
|
29
29
|
validates_presence_of :alchemy_roles
|
|
30
30
|
|
|
31
31
|
# Unlock all locked pages before destroy.
|
|
@@ -35,7 +35,7 @@ module Alchemy
|
|
|
35
35
|
scope :logged_in, -> { where("last_request_at > ?", logged_in_timeout.seconds.ago) }
|
|
36
36
|
scope :logged_out, -> { where("last_request_at is NULL or last_request_at <= ?", logged_in_timeout.seconds.ago) }
|
|
37
37
|
|
|
38
|
-
ROLES =
|
|
38
|
+
ROLES = Alchemy.config.user_roles
|
|
39
39
|
|
|
40
40
|
class << self
|
|
41
41
|
def ransackable_attributes(_auth_object = nil)
|
|
@@ -65,7 +65,7 @@ module Alchemy
|
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
def logged_in_timeout
|
|
68
|
-
|
|
68
|
+
Alchemy.config.get(:auto_logout_time).minutes.to_i
|
|
69
69
|
end
|
|
70
70
|
end
|
|
71
71
|
|
|
@@ -140,6 +140,14 @@ module Alchemy
|
|
|
140
140
|
alias_method :name, :fullname
|
|
141
141
|
alias_method :alchemy_display_name, :fullname
|
|
142
142
|
|
|
143
|
+
def email_required?
|
|
144
|
+
::Devise.authentication_keys.include?(:email)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def login_required?
|
|
148
|
+
::Devise.authentication_keys.include?(:login)
|
|
149
|
+
end
|
|
150
|
+
|
|
143
151
|
# Returns true if the last request not longer ago then the logged_in_time_out
|
|
144
152
|
def logged_in?
|
|
145
153
|
raise "Can not determine the records login state because there is no last_request_at column" if !respond_to?(:last_request_at)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
module Devise
|
|
3
|
+
module BaseControllerPatch
|
|
4
|
+
def self.prepended(base)
|
|
5
|
+
base.before_action(:store_user_request_time)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Stores the users request time.
|
|
11
|
+
def store_user_request_time
|
|
12
|
+
if alchemy_user_signed_in?
|
|
13
|
+
current_alchemy_user.store_request_time!
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
Alchemy::BaseController.prepend self
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
<% end %>
|
|
4
4
|
|
|
5
5
|
<div class="login_signup_box">
|
|
6
|
-
<%=
|
|
6
|
+
<%= render "alchemy/admin/user_sessions/logo" %>
|
|
7
7
|
<% if @user.errors.blank? %>
|
|
8
8
|
<%= render_message do %>
|
|
9
|
-
<
|
|
9
|
+
<p>
|
|
10
|
+
<strong><%= Alchemy.t('Password reset') %></strong>
|
|
11
|
+
</p>
|
|
10
12
|
<p><%= Alchemy.t('Please enter a new password') %></p>
|
|
11
13
|
<% end %>
|
|
12
14
|
<% else %>
|
|
@@ -16,13 +18,18 @@
|
|
|
16
18
|
<% end %>
|
|
17
19
|
<%= alchemy_form_for resource, as: resource_name, url: admin_update_password_path, method: 'patch' do |f| %>
|
|
18
20
|
<%= f.hidden_field :reset_password_token %>
|
|
19
|
-
<%= f.input :password, autofocus: true, label: Alchemy.t("New password")
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
<%= f.input :password, autofocus: true, label: Alchemy.t("New password"),
|
|
22
|
+
required: true, input_html: {autocomplete: "new-password"} %>
|
|
23
|
+
<%= f.input :password_confirmation, label: Alchemy.t("Confirm new password"),
|
|
24
|
+
required: true, input_html: {autocomplete: "new-password"} %>
|
|
25
|
+
<div class="submit">
|
|
26
|
+
<%= link_to alchemy.admin_login_path do %>
|
|
27
|
+
<%= render_icon("arrow-left-s", size: "1x") %>
|
|
28
|
+
<%= Alchemy.t(:login) %>
|
|
29
|
+
<% end %>
|
|
30
|
+
<button type="submit">
|
|
31
|
+
<%= Alchemy.t("Change password") %>
|
|
32
|
+
</button>
|
|
25
33
|
</div>
|
|
26
|
-
<%= f.submit Alchemy.t("Change password") %>
|
|
27
34
|
<% end %>
|
|
28
35
|
</div>
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
<% end %>
|
|
4
4
|
|
|
5
5
|
<div class="login_signup_box">
|
|
6
|
-
<%=
|
|
6
|
+
<%= render "alchemy/admin/user_sessions/logo" %>
|
|
7
7
|
<% if @user.errors.blank? %>
|
|
8
8
|
<%= render_message do %>
|
|
9
|
-
<
|
|
9
|
+
<p>
|
|
10
|
+
<strong><%= Alchemy.t('Password reset') %></strong>
|
|
11
|
+
</p>
|
|
10
12
|
<p><%= Alchemy.t('Please enter your email address') %></p>
|
|
11
13
|
<% end %>
|
|
12
14
|
<% else %>
|
|
@@ -17,12 +19,19 @@
|
|
|
17
19
|
<%= alchemy_form_for :user, url: admin_reset_password_path, html: {method: 'post'} do |f| %>
|
|
18
20
|
<%= f.input :email,
|
|
19
21
|
autofocus: true,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
required: true,
|
|
23
|
+
input_html: {
|
|
24
|
+
autocomplete: "email",
|
|
25
|
+
value: params[:email]
|
|
26
|
+
} %>
|
|
27
|
+
<div class="submit">
|
|
28
|
+
<%= link_to alchemy.admin_login_path do %>
|
|
29
|
+
<%= render_icon("arrow-left-s", size: "1x") %>
|
|
30
|
+
<%= Alchemy.t(:login) %>
|
|
31
|
+
<% end %>
|
|
32
|
+
<button type="submit">
|
|
33
|
+
<%= Alchemy.t("Send reset instructions") %>
|
|
34
|
+
</button>
|
|
25
35
|
</div>
|
|
26
|
-
<%= f.submit Alchemy.t("Send reset instructions"), input_html: {class: 'secondary'} %>
|
|
27
36
|
<% end %>
|
|
28
37
|
</div>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<div class="logo-box">
|
|
2
|
+
<svg
|
|
3
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
4
|
+
width="267"
|
|
5
|
+
height="91"
|
|
6
|
+
viewBox="0 0 267 91"
|
|
7
|
+
>
|
|
8
|
+
<path
|
|
9
|
+
d="M261.749 29.77h-9.812l-.72 2.738a193.53 193.53 0 0 0-.802 3.217c-.334-1.384-.604-2.5-.767-3.162l-.685-2.792H234.075c-1.102-.371-2.338-.564-3.705-.564-2.537 0-4.557.864-6.104 1.934-1.406-1.15-3.402-1.934-6.221-1.934-1.341 0-2.524.242-3.564.625l-.006-.061H201.334v4.17c-2.345-3.051-5.884-4.735-10.401-4.735-4.196 0-8.831 1.936-11.655 6.784-1.194-3.746-3.896-6.784-9.557-6.784-1.385 0-2.626.24-3.727.617v-12.19l-4.204.623-6.934 1.027-3.132.464v10.324a22.109 22.109 0 0 0-6.086-.864c-5.96 0-9.341 2.652-11.128 4.876-.108.133-.2.284-.303.422V17.633l-4.207.623-6.933 1.027-3.131.464v24.04l-5.118-18.709-.739-2.701H99.863l-.745 2.686L95.854 36.8 80.915 21.597a2.922 2.922 0 0 0-2.823-.776l-18.554 4.875a2.918 2.918 0 0 0-.634-.981L39.437 4.906a2.927 2.927 0 0 0-2.826-.777L9.797 11.173a2.92 2.92 0 0 0-2.073 2.054L.372 40.078a2.922 2.922 0 0 0 .735 2.818L20.6 62.705a2.921 2.921 0 0 0 2.822.774l9.259-2.43-3.051 11.1a2.921 2.921 0 0 0 .735 2.821l10.94 11.122a2.92 2.92 0 0 0 2.822.778l15.08-3.953a2.919 2.919 0 0 0 2.077-2.055l3.536-12.978.316.324a2.928 2.928 0 0 0 2.064.872c.254.001.508-.031.761-.098l20.839-5.48H103.275l.72-2.733.82-3.121h3.794l.822 3.122.718 2.732h24.059v-4.307c.07.092.133.194.207.282 1.729 2.119 5.001 4.643 10.76 4.643 2.735 0 4.945-.705 6.55-1.415v.797H180.119v-4.383c2.392 3.007 5.737 4.495 9.134 4.885-1.602 1.106-3.095 2.759-4.467 4.952-2.161 3.454-3.211 6.441-3.211 9.137 0 2.014.524 3.774 1.562 5.236 1.388 1.967 3.57 3.053 6.143 3.053.226 0 .384-.016.896-.073.142-.014.243-.025.312-.03 1.014-.043 2.078-.446 4.047-1.521.468-.248.973-.622 2.077-1.656.966 3.029 2.97 3.501 4.119 3.501 2.479 0 4.354-1.665 4.575-4.057.007-.045.041-.233.189-.649.774 1.335 2.059 2.415 4.188 2.415 2.658 0 4.791-2.088 6.555-4.378.065.155.132.312.203.47 1.794 4.082 4.646 4.694 6.185 4.694.76 0 1.52-.168 2.307-.503.228.213.463.419.726.605a6.818 6.818 0 0 0 3.993 1.302c2.273 0 4.515-.764 6.661-2.274 3.357-2.369 4.061-5.111 4.061-6.996 0-2.266-1.092-4.215-3.014-5.406a4.177 4.177 0 0 0 2.142-1.312c.918 1.27 1.794 2.475 2.303 3.129l1.917 2.468 2.74-1.503.268-.144c2.382-1.291 7.335-3.979 9.847-12.048l8.677-27.888 1.479-4.759h-4.984z"
|
|
10
|
+
fill="transparent"
|
|
11
|
+
/>
|
|
12
|
+
<path
|
|
13
|
+
fill="currentColor"
|
|
14
|
+
d="M102.705 26.102h8.626l9.245 33.793h-7.549l-1.541-5.856h-9.448l-1.541 5.856h-7.189l9.397-33.793zm.411 23.008h7.291c-1.282-5.857-2.925-12.841-3.594-16.487-.719 3.647-2.362 10.63-3.697 16.487zm27.472 10.786h-6.931V22.969l6.931-1.026v37.953zm22.187-1.748c-.977.409-3.545 2.364-7.549 2.364-6.883 0-10.682-4.314-10.682-13.405 0-9.554 3.953-14.176 11.143-14.176 2.878 0 5.239.719 6.163 1.079l-.822 5.083c-.666-.256-2.517-.822-4.365-.822-3.388 0-4.981 2.62-4.981 8.579 0 6.061 1.747 8.267 4.775 8.267 2.108 0 4.008-1.128 4.726-1.386l1.592 4.417zm2.671-35.179l6.931-1.026v14.943h.105c.717-.667 3.079-3.954 7.291-3.954 4.826 0 6.728 2.979 6.728 9.193v17.771h-6.934V43.819c0-3.801-.616-4.879-2.721-4.879-2.107 0-3.853 2.157-4.47 2.876v18.079h-6.931V22.969zm44.73 35.026c-.771.514-3.956 2.518-9.038 2.518-5.957 0-10.785-3.852-10.785-13.097 0-9.811 4.775-14.484 10.63-14.484 5.854 0 9.963 3.646 9.963 12.273 0 1.851-.257 3.339-.309 3.597h-13.401c.05 4.571 2.311 6.469 5.235 6.469 2.773 0 5.086-1.231 6.319-1.795l1.386 4.519zm-12.941-13.509h7.034c0-5.237-1.437-6.624-3.338-6.624-1.798 0-3.646 1.643-3.696 6.624zm17.82-10.989h6.107l.31 3.543c.772-.925 2.722-4.109 6.624-4.109 2.98 0 4.828 1.027 5.598 4.057.874-1.181 3.03-4.057 6.728-4.057 4.468 0 6.37 2.517 6.37 9.141v17.823h-6.883V42.637c0-2.311-.358-3.697-2.158-3.697-1.797 0-3.183 2.054-3.543 2.876v18.079h-6.625V42.637c0-2.311-.358-3.697-2.157-3.697-1.796 0-3.131 2.003-3.542 2.876v18.079h-6.828V33.497zm56.744 0l-8.679 27.887c-2.156 6.934-6.213 8.886-8.37 10.067-.718-.926-2.414-3.287-3.081-4.213.771-.668 4.467-2.566 5.546-6.778l-8.318-26.963h7.239c.771 3.132 3.545 14.688 4.314 19.002.821-4.417 3.545-15.87 4.367-19.002h6.982z"
|
|
15
|
+
/>
|
|
16
|
+
<g>
|
|
17
|
+
<path
|
|
18
|
+
fill="currentColor"
|
|
19
|
+
d="M193.986 68.011c.319 0 .667.193 1.031.578.897.95 1.506 1.125 2.353.546.367-.254.548-.633.508-1.05-.054-.799-.66-1.456-1.799-1.957-.818-.364-1.438-.541-1.896-.541-2.436.013-4.74 1.736-6.854 5.116-1.807 2.889-2.722 5.389-2.722 7.435 0 1.336.326 2.474.969 3.379.796 1.128 1.983 1.701 3.526 1.701.029 0 .213-.016.555-.054.268-.028.427-.045.47-.046.306 0 .867-.139 2.703-1.14.226-.117.704-.468 2.439-2.166 1.932-1.896 2.285-2.549 2.366-2.884.084-.275.01-.583-.22-.921-.238-.344-.523-.518-.838-.518a.786.786 0 0 0-.708.429c-.872 1.35-1.932 2.444-3.146 3.266-1.295.868-2.615 1.308-3.923 1.308-.778 0-1.671-.234-1.671-2.074 0-1.427.742-3.47 2.211-6.08 1.621-2.872 3.183-4.327 4.646-4.327zm30.25 10.553c-.354 0-.695.247-1.103.798-.301.408-.535.409-.654.408-.259-.01-1.135-.388-1.441-4.977l-.305-4.414c-.25-1.795-.915-2.704-1.979-2.704-.68 0-1.78.545-4.245 4.804a46.07 46.07 0 0 1-2.457 3.695c-.936 1.256-1.511 1.87-1.856 2.171-.082-.436-.124-.979-.124-1.635 0-.533.027-1.253.081-2.143.055-.995.089-1.633.101-1.925.039-2.004-.251-3.293-.885-3.941a1.569 1.569 0 0 0-1.157-.483c-1.114 0-2.453 1.26-4.214 3.968-.44.683-1.144 1.88-2.093 3.565.149-2.311.529-4.59 1.141-6.795.071-.267.054-.669-.433-1.089-.33-.287-.703-.436-1.107-.436-.863 0-1.277 1.173-1.539 2.19-.313 1.16-.526 2.592-.635 4.245-.119 1.754-.181 3.891-.181 6.36 0 .357.075.868.233 1.577.203.807.5 1.631 1.17 1.631.813 0 1.32-.423 1.381-1.157.113-1.165 1.095-3.422 2.918-6.71 1.54-2.804 2.334-3.953 2.701-4.42 0 .089 0 .194-.005.32-.15 3.265-.211 5.245-.182 5.886.105 2.516.823 3.792 2.139 3.792 1.21 0 2.685-1.261 4.636-3.968.255-.355 2.324-3.588 3.537-5.488.234-.37.414-.648.545-.854.012.086.021.184.031.293.052.55.064 1.329.038 2.328v2.002c.01 1.115.313 2.354.903 3.685.812 1.851 1.907 2.786 3.252 2.786.459 0 .972-.164 1.575-.502.819-.475 1.234-1.083 1.234-1.804.001-.652-.392-1.059-1.021-1.059zm6.628-4.902c-2.19 0-2.468-.365-2.475-.365 0-.874.821-2.04 2.372-3.37 1.809-1.556 2.828-1.882 3.366-1.882.036 0 .073.003.123.006.072.004.298.046.826.328.721.386.872.415 1.009.415.727 0 1.163-.494 1.163-1.324 0-.631-.425-1.187-1.268-1.647-.651-.35-1.201-.517-1.684-.517-1.572 0-3.401 1.039-5.592 3.175-2.195 2.138-3.262 3.892-3.262 5.361 0 .738.509 1.313 1.518 1.711.65.258 1.33.402 2.023.432l3.86.141c.473.023.891.157 1.28.407.556.367.619.737.619.983 0 .86-1.161 1.629-2.133 2.122-1.358.688-2.57 1.035-3.598 1.035-.625 0-.625-.247-.625-.444 0-.104.017-.197.054-.283.126-.3.213-.694.266-1.218l.035-.339-.312-.132c-.656-.279-1.311.032-1.813.841-.316.495-.47.93-.47 1.33 0 .904.4 1.646 1.192 2.199a3.557 3.557 0 0 0 2.134.712c1.598 0 3.218-.569 4.811-1.693 1.794-1.263 2.701-2.733 2.701-4.371.002-2.398-2.057-3.613-6.12-3.613z"
|
|
20
|
+
/>
|
|
21
|
+
</g>
|
|
22
|
+
<g fill-rule="evenodd" clip-rule="evenodd" fill="currentColor">
|
|
23
|
+
<path
|
|
24
|
+
d="M47.632 51.588L23.382 57.956 5.754 40.043 12.401 15.762 36.65 9.393 54.254 27.305z"
|
|
25
|
+
/>
|
|
26
|
+
<path
|
|
27
|
+
d="M57.42 79.029L43.781 82.603 33.888 72.543 37.632 58.91 51.244 55.334 61.138 65.395z"
|
|
28
|
+
/>
|
|
29
|
+
<path
|
|
30
|
+
d="M86.963 59.079L67.775 64.128 53.829 49.94 59.066 30.726 78.277 25.679 92.223 39.865z"
|
|
31
|
+
/>
|
|
32
|
+
</g>
|
|
33
|
+
</svg>
|
|
34
|
+
<small><%= Alchemy.version %></small>
|
|
35
|
+
</div>
|
|
@@ -3,17 +3,30 @@
|
|
|
3
3
|
<% end %>
|
|
4
4
|
|
|
5
5
|
<div class="login_signup_box">
|
|
6
|
-
<%=
|
|
6
|
+
<%= render "alchemy/admin/user_sessions/logo" %>
|
|
7
|
+
<%= render_message do %>
|
|
8
|
+
<p>
|
|
9
|
+
<strong><%= Alchemy.t('modules.user_sessions') %></strong>
|
|
10
|
+
</p>
|
|
11
|
+
<p><%= Alchemy.t('welcome_please_identify_notice') %></p>
|
|
12
|
+
<% end %>
|
|
7
13
|
<%= alchemy_form_for :user, url: {action: 'create'}, id: 'login', data: { turbo: false } do |f| %>
|
|
8
|
-
<%= f.input Devise.authentication_keys.first, autofocus: true
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
<%= f.input Devise.authentication_keys.first, autofocus: true, required: true,
|
|
15
|
+
input_html: {autocomplete: Devise.authentication_keys.first == :email ? "email" : "username"} %>
|
|
16
|
+
<%= f.input :password, required: true, input_html: {autocomplete: "current-password"} %>
|
|
17
|
+
<% if devise_mapping.rememberable? %>
|
|
18
|
+
<div class="input">
|
|
19
|
+
<span class="control-label"> </span>
|
|
20
|
+
|
|
21
|
+
<%= f.label :remember_me, class: "checkbox" do %>
|
|
22
|
+
<%= f.check_box :remember_me, checked: true %>
|
|
23
|
+
<%= Alchemy.t(:remember_me, scope: 'admin.login', days: Devise.remember_for.in_days.to_i) %>
|
|
24
|
+
<% end %>
|
|
25
|
+
</div>
|
|
26
|
+
<% end %>
|
|
15
27
|
<div class="submit">
|
|
16
|
-
|
|
28
|
+
<%= link_to Alchemy.t('Forgot your password?'), admin_new_password_path %>
|
|
29
|
+
<button type="submit"><%= Alchemy.t(:login) %></button>
|
|
17
30
|
</div>
|
|
18
31
|
<% end %>
|
|
19
32
|
</div>
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
<%= f.input :firstname %>
|
|
2
|
-
<%= f.input :lastname %>
|
|
3
|
-
<%= f.input :login, autofocus: true %>
|
|
4
|
-
<%= f.input :email %>
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
<%= f.input :firstname, input_html: {autocomplete: "given-name"} %>
|
|
2
|
+
<%= f.input :lastname, input_html: {autocomplete: "family-name"} %>
|
|
3
|
+
<%= f.input :login, autofocus: true, required: @user.login_required?, input_html: {autocomplete: "username"} %>
|
|
4
|
+
<%= f.input :email, required: @user.email_required?, input_html: {autocomplete: "email"} %>
|
|
5
|
+
<% if Alchemy::I18n.available_locales.many? %>
|
|
6
|
+
<div class="input select">
|
|
7
|
+
<%= f.label(:language) %>
|
|
8
|
+
<%= render Alchemy::Admin::LocaleSelect.new(f.field_name(:language)) %>
|
|
9
|
+
</div>
|
|
10
|
+
<% end %>
|
|
11
|
+
<%= f.input :password, required: while_signup?, input_html: {autocomplete: "new-password"} %>
|
|
12
|
+
<%= f.input :password_confirmation, required: while_signup?, input_html: {autocomplete: "new-password"} %>
|
|
11
13
|
<% if can_update_role? %>
|
|
12
14
|
<%= f.input :alchemy_roles,
|
|
13
15
|
collection: @user_roles,
|
|
@@ -27,4 +29,8 @@
|
|
|
27
29
|
</div>
|
|
28
30
|
<% end %>
|
|
29
31
|
<%= f.input :send_credentials, as: 'boolean' %>
|
|
30
|
-
|
|
32
|
+
<div class="submit align-right">
|
|
33
|
+
<button type="submit">
|
|
34
|
+
<%= Alchemy.t(:save) %>
|
|
35
|
+
</button>
|
|
36
|
+
</div>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
alchemy.edit_admin_user_path(user), {
|
|
9
9
|
title: Alchemy.t(:edit_user),
|
|
10
10
|
overflow: true,
|
|
11
|
-
size: "
|
|
11
|
+
size: "430x500"
|
|
12
12
|
},
|
|
13
13
|
title: Alchemy.t(:edit_user) %>
|
|
14
14
|
<% else %>
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
<%= user.human_roles_string %>
|
|
29
29
|
<% end %>
|
|
30
30
|
<% table.delete_button tooltip: Alchemy.t(:delete_user), confirm_message: Alchemy.t(:confirm_to_delete_user) %>
|
|
31
|
-
<% table.edit_button tooltip: Alchemy.t(:edit_user), dialog_size: "
|
|
31
|
+
<% table.edit_button tooltip: Alchemy.t(:edit_user), dialog_size: "430x500" %>
|
|
32
32
|
<% end %>
|
|
33
33
|
|
|
34
34
|
<%= paginate @users, theme: "alchemy" %>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<% end %>
|
|
4
4
|
|
|
5
5
|
<%= content_for :toolbar do %>
|
|
6
|
-
<%=
|
|
6
|
+
<%= render Alchemy::Admin::ToolbarButton.new(
|
|
7
7
|
icon: :plus,
|
|
8
8
|
label: Alchemy.t(:create_user),
|
|
9
9
|
url: alchemy.new_admin_user_path,
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
tooltip_placement: "top-start",
|
|
13
13
|
dialog_options: {
|
|
14
14
|
title: Alchemy.t(:create_user),
|
|
15
|
-
size: "
|
|
15
|
+
size: "430x500"
|
|
16
16
|
},
|
|
17
17
|
if_permitted_to: [:create, Alchemy::User]
|
|
18
18
|
) %>
|
|
@@ -22,12 +22,7 @@
|
|
|
22
22
|
<div id="archive_all" class="resources-table-wrapper">
|
|
23
23
|
<% if @users.any? %>
|
|
24
24
|
<%= render "alchemy/admin/resources/table_header" %>
|
|
25
|
-
|
|
26
|
-
<% if Alchemy::Admin.const_defined?(:Resource) %>
|
|
27
|
-
<%= render "resource_table" %>
|
|
28
|
-
<% else %>
|
|
29
|
-
<%= render "table" %>
|
|
30
|
-
<% end %>
|
|
25
|
+
<%= render "resource_table" %>
|
|
31
26
|
|
|
32
27
|
<%= paginate @users, theme: 'alchemy' %>
|
|
33
28
|
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
<% end %>
|
|
4
4
|
|
|
5
5
|
<div class="login_signup_box">
|
|
6
|
-
<%=
|
|
6
|
+
<%= render "alchemy/admin/user_sessions/logo" %>
|
|
7
7
|
<%= render_message do %>
|
|
8
|
-
<
|
|
8
|
+
<p>
|
|
9
|
+
<strong><%= Alchemy.t('Welcome to Alchemy') %></strong>
|
|
10
|
+
</p>
|
|
9
11
|
<p><%= Alchemy.t("Please Signup") %></p>
|
|
10
12
|
<% end %>
|
|
11
13
|
<%= alchemy_form_for [:admin, @user] do |f| %>
|
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
Rails.application.config.to_prepare do
|
|
4
|
-
require "alchemy/devise/ability"
|
|
5
|
-
|
|
6
|
-
alchemy_7_4 = Gem::Version.new("7.4.0.a")
|
|
7
|
-
|
|
8
|
-
icon = if Alchemy.gem_version.between? Gem::Version.new("7.1.0-b1"), alchemy_7_4
|
|
9
|
-
"group-line"
|
|
10
|
-
elsif Alchemy.gem_version > alchemy_7_4
|
|
11
|
-
"group"
|
|
12
|
-
else
|
|
13
|
-
"users"
|
|
14
|
-
end
|
|
15
|
-
|
|
16
4
|
Alchemy.register_ability(Alchemy::Devise::Ability)
|
|
17
5
|
|
|
18
6
|
Alchemy::Modules.register_module({
|
|
@@ -23,7 +11,7 @@ Rails.application.config.to_prepare do
|
|
|
23
11
|
name: "modules.users",
|
|
24
12
|
controller: "/alchemy/admin/users",
|
|
25
13
|
action: "index",
|
|
26
|
-
icon:
|
|
14
|
+
icon: "group"
|
|
27
15
|
}
|
|
28
16
|
})
|
|
29
17
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require "alchemy/configuration"
|
|
2
|
+
|
|
3
|
+
module Alchemy
|
|
4
|
+
module Devise
|
|
5
|
+
class Configuration < Alchemy::Configuration
|
|
6
|
+
# Layout for Alchemy Devise controllers
|
|
7
|
+
# Default is +alchemy/admin+
|
|
8
|
+
option :layout, :string, default: "alchemy/admin"
|
|
9
|
+
|
|
10
|
+
# Devise modules included in +Alchemy::User+ model
|
|
11
|
+
#
|
|
12
|
+
# === Default modules
|
|
13
|
+
#
|
|
14
|
+
# [
|
|
15
|
+
# :database_authenticatable,
|
|
16
|
+
# :trackable,
|
|
17
|
+
# :validatable,
|
|
18
|
+
# :timeoutable,
|
|
19
|
+
# :recoverable,
|
|
20
|
+
# :rememberable
|
|
21
|
+
# ]
|
|
22
|
+
#
|
|
23
|
+
# If you want to add additional modules into the Alchemy user class append
|
|
24
|
+
# them to this collection in an initializer in your app.
|
|
25
|
+
#
|
|
26
|
+
# === Example
|
|
27
|
+
#
|
|
28
|
+
# # config/initializers/alchemy.rb
|
|
29
|
+
# Alchemy::Devise.config.devise_modules << :registerable
|
|
30
|
+
#
|
|
31
|
+
# If your app uses an old encryption that needs the +devise-encryptable+ gem
|
|
32
|
+
# you also need to load the devise module.
|
|
33
|
+
#
|
|
34
|
+
# Alchemy::Devise.config.devise_modules << :encryptable
|
|
35
|
+
#
|
|
36
|
+
option :devise_modules, :collection, collection_class: Set, item_type: :symbol, default: [
|
|
37
|
+
:database_authenticatable,
|
|
38
|
+
:trackable,
|
|
39
|
+
:validatable,
|
|
40
|
+
:timeoutable,
|
|
41
|
+
:recoverable,
|
|
42
|
+
:rememberable
|
|
43
|
+
]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
require "alchemy_cms"
|
|
2
2
|
require "devise"
|
|
3
|
+
require "flickwerk"
|
|
3
4
|
|
|
4
5
|
module Alchemy
|
|
5
6
|
module Devise
|
|
6
7
|
class Engine < ::Rails::Engine
|
|
8
|
+
include Flickwerk
|
|
9
|
+
|
|
7
10
|
isolate_namespace Alchemy
|
|
8
11
|
engine_name "alchemy_devise"
|
|
9
12
|
|
|
@@ -16,10 +19,6 @@ module Alchemy
|
|
|
16
19
|
"alchemy-devise.css"
|
|
17
20
|
]
|
|
18
21
|
end
|
|
19
|
-
|
|
20
|
-
config.to_prepare do
|
|
21
|
-
require_relative "../../../app/controllers/alchemy/base_controller_extension"
|
|
22
|
-
end
|
|
23
22
|
end
|
|
24
23
|
end
|
|
25
24
|
end
|
data/lib/alchemy/devise.rb
CHANGED
|
@@ -1,48 +1,33 @@
|
|
|
1
|
+
require "alchemy/devise/configuration"
|
|
1
2
|
require "alchemy/devise/engine"
|
|
2
3
|
|
|
3
4
|
module Alchemy
|
|
4
|
-
# Devise modules included in +Alchemy::User+ model
|
|
5
|
-
#
|
|
6
|
-
# === Default modules
|
|
7
|
-
#
|
|
8
|
-
# [
|
|
9
|
-
# . :database_authenticatable,
|
|
10
|
-
# :trackable,
|
|
11
|
-
# :validatable,
|
|
12
|
-
# :timeoutable,
|
|
13
|
-
# :recoverable
|
|
14
|
-
# . ]
|
|
15
|
-
#
|
|
16
|
-
# If you want to add additional modules into the Alchemy user class append
|
|
17
|
-
# them to this collection in an initializer in your app.
|
|
18
|
-
#
|
|
19
|
-
# === Example
|
|
20
|
-
#
|
|
21
|
-
# # config/initializers/alchemy.rb
|
|
22
|
-
# Alchemy.devise_modules << :registerable
|
|
23
|
-
#
|
|
24
|
-
# If your app uses an old encryption that needs the +devise-encryptable+ gem
|
|
25
|
-
# you also need to load the devise module.
|
|
26
|
-
#
|
|
27
|
-
# Alchemy.devise_modules << :encryptable
|
|
28
|
-
#
|
|
29
|
-
def self.devise_modules
|
|
30
|
-
@devise_modules ||= [
|
|
31
|
-
:database_authenticatable,
|
|
32
|
-
:trackable,
|
|
33
|
-
:validatable,
|
|
34
|
-
:timeoutable,
|
|
35
|
-
:recoverable
|
|
36
|
-
]
|
|
37
|
-
end
|
|
38
|
-
|
|
39
5
|
module Devise
|
|
40
|
-
|
|
41
|
-
|
|
6
|
+
extend self
|
|
7
|
+
|
|
8
|
+
def deprecator
|
|
9
|
+
ActiveSupport::Deprecation.new("9.0", "Alchemy::Devise")
|
|
42
10
|
end
|
|
43
11
|
|
|
44
|
-
|
|
45
|
-
|
|
12
|
+
delegate :layout=, to: :config
|
|
13
|
+
deprecate "layout=": "Use `Alchemy::Devise.config.layout=` instead.",
|
|
14
|
+
deprecator: Alchemy::Devise.deprecator
|
|
15
|
+
|
|
16
|
+
delegate :layout, to: :config
|
|
17
|
+
deprecate layout: "Use `Alchemy::Devise.config.layout` instead.",
|
|
18
|
+
deprecator: Alchemy::Devise.deprecator
|
|
19
|
+
|
|
20
|
+
def config
|
|
21
|
+
@config ||= Alchemy::Devise::Configuration.new
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def configure(&blk)
|
|
25
|
+
yield config
|
|
46
26
|
end
|
|
47
27
|
end
|
|
28
|
+
|
|
29
|
+
extend self
|
|
30
|
+
|
|
31
|
+
deprecate devise_modules: "Alchemy::Devise.config.devise_modules", deprecator: Alchemy::Devise.deprecator
|
|
32
|
+
delegate :devise_modules, to: "Alchemy::Devise.config"
|
|
48
33
|
end
|
|
@@ -24,7 +24,7 @@ Devise.setup do |config|
|
|
|
24
24
|
# Configure the e-mail address which will be shown in Devise::Mailer,
|
|
25
25
|
# note that it will be overwritten if you use your own mailer class
|
|
26
26
|
# with default "from" parameter.
|
|
27
|
-
config.mailer_sender = Alchemy
|
|
27
|
+
config.mailer_sender = Alchemy.config.mailer.mail_from
|
|
28
28
|
|
|
29
29
|
# Configure the class responsible to send e-mails.
|
|
30
30
|
config.mailer = "Alchemy::Notifications"
|
|
@@ -188,7 +188,7 @@ Devise.setup do |config|
|
|
|
188
188
|
# ==> Configuration for :timeoutable
|
|
189
189
|
# The time you want to timeout the user session without activity. After this
|
|
190
190
|
# time the user will be asked for credentials again. Default is 30 minutes.
|
|
191
|
-
config.timeout_in = Rails.env.development? ? nil : Alchemy
|
|
191
|
+
config.timeout_in = Rails.env.development? ? nil : Alchemy.config.auto_logout_time.minutes
|
|
192
192
|
|
|
193
193
|
# ==> Configuration for :lockable
|
|
194
194
|
# Defines which strategy will be used to lock an account.
|
|
@@ -302,7 +302,7 @@ Devise.setup do |config|
|
|
|
302
302
|
# apps is `200 OK` and `302 Found` respectively, but new apps are generated with
|
|
303
303
|
# these new defaults that match Hotwire/Turbo behavior.
|
|
304
304
|
# Note: These might become the new default in future versions of Devise.
|
|
305
|
-
config.responder.error_status = :
|
|
305
|
+
config.responder.error_status = :unprocessable_content
|
|
306
306
|
config.responder.redirect_status = :see_other
|
|
307
307
|
|
|
308
308
|
# ==> Configuration for :registerable
|
metadata
CHANGED
|
@@ -1,28 +1,34 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: alchemy-devise
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 8.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Thomas von Deyen
|
|
8
8
|
bindir: bin
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: alchemy_cms
|
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
|
15
15
|
requirements:
|
|
16
|
-
- - "
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: 8.0.0.a
|
|
19
|
+
- - "<"
|
|
17
20
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: '
|
|
21
|
+
version: '9.0'
|
|
19
22
|
type: :runtime
|
|
20
23
|
prerelease: false
|
|
21
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
25
|
requirements:
|
|
23
|
-
- - "
|
|
26
|
+
- - ">="
|
|
24
27
|
- !ruby/object:Gem::Version
|
|
25
|
-
version:
|
|
28
|
+
version: 8.0.0.a
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '9.0'
|
|
26
32
|
- !ruby/object:Gem::Dependency
|
|
27
33
|
name: devise
|
|
28
34
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -37,6 +43,20 @@ dependencies:
|
|
|
37
43
|
- - "~>"
|
|
38
44
|
- !ruby/object:Gem::Version
|
|
39
45
|
version: '4.9'
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: flickwerk
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
requirements:
|
|
50
|
+
- - "~>"
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: 0.3.6
|
|
53
|
+
type: :runtime
|
|
54
|
+
prerelease: false
|
|
55
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - "~>"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: 0.3.6
|
|
40
60
|
- !ruby/object:Gem::Dependency
|
|
41
61
|
name: capybara
|
|
42
62
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -99,14 +119,14 @@ dependencies:
|
|
|
99
119
|
requirements:
|
|
100
120
|
- - "~>"
|
|
101
121
|
- !ruby/object:Gem::Version
|
|
102
|
-
version: '
|
|
122
|
+
version: '8.0'
|
|
103
123
|
type: :development
|
|
104
124
|
prerelease: false
|
|
105
125
|
version_requirements: !ruby/object:Gem::Requirement
|
|
106
126
|
requirements:
|
|
107
127
|
- - "~>"
|
|
108
128
|
- !ruby/object:Gem::Version
|
|
109
|
-
version: '
|
|
129
|
+
version: '8.0'
|
|
110
130
|
- !ruby/object:Gem::Dependency
|
|
111
131
|
name: simplecov
|
|
112
132
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -132,22 +152,21 @@ files:
|
|
|
132
152
|
- LICENSE
|
|
133
153
|
- README.md
|
|
134
154
|
- app/assets/builds/alchemy-devise.css
|
|
135
|
-
- app/assets/builds/alchemy-devise.css.map
|
|
136
155
|
- app/assets/stylesheets/alchemy-devise.scss
|
|
137
156
|
- app/assets/stylesheets/alchemy-devise/login.scss
|
|
138
157
|
- app/controllers/alchemy/admin/passwords_controller.rb
|
|
139
158
|
- app/controllers/alchemy/admin/user_sessions_controller.rb
|
|
140
159
|
- app/controllers/alchemy/admin/users_controller.rb
|
|
141
|
-
- app/controllers/alchemy/base_controller_extension.rb
|
|
142
160
|
- app/mailers/alchemy/notifications.rb
|
|
161
|
+
- app/models/alchemy/devise/ability.rb
|
|
143
162
|
- app/models/alchemy/user.rb
|
|
163
|
+
- app/patches/controllers/alchemy/devise/base_controller_patch.rb
|
|
144
164
|
- app/views/alchemy/admin/passwords/edit.html.erb
|
|
145
165
|
- app/views/alchemy/admin/passwords/new.html.erb
|
|
166
|
+
- app/views/alchemy/admin/user_sessions/_logo.html.erb
|
|
146
167
|
- app/views/alchemy/admin/user_sessions/new.html.erb
|
|
147
168
|
- app/views/alchemy/admin/users/_fields.html.erb
|
|
148
169
|
- app/views/alchemy/admin/users/_resource_table.html.erb
|
|
149
|
-
- app/views/alchemy/admin/users/_table.html.erb
|
|
150
|
-
- app/views/alchemy/admin/users/_user.html.erb
|
|
151
170
|
- app/views/alchemy/admin/users/edit.html.erb
|
|
152
171
|
- app/views/alchemy/admin/users/index.html.erb
|
|
153
172
|
- app/views/alchemy/admin/users/new.html.erb
|
|
@@ -165,13 +184,16 @@ files:
|
|
|
165
184
|
- app/views/alchemy/notifications/reset_password_instructions.es.text.erb
|
|
166
185
|
- app/views/alchemy/notifications/reset_password_instructions.ru.text.erb
|
|
167
186
|
- config/initializers/alchemy.rb
|
|
187
|
+
- config/locales/de.yml
|
|
188
|
+
- config/locales/en.yml
|
|
168
189
|
- config/routes.rb
|
|
169
190
|
- config/spring.rb
|
|
170
191
|
- db/migrate/20131015124700_create_alchemy_users.rb
|
|
171
192
|
- db/migrate/20131225232042_add_alchemy_roles_to_alchemy_users.rb
|
|
172
193
|
- db/migrate/20141209144532_add_indexes_to_alchemy_users.rb
|
|
194
|
+
- db/migrate/20251127170649_add_rememberable_column.rb
|
|
173
195
|
- lib/alchemy/devise.rb
|
|
174
|
-
- lib/alchemy/devise/
|
|
196
|
+
- lib/alchemy/devise/configuration.rb
|
|
175
197
|
- lib/alchemy/devise/engine.rb
|
|
176
198
|
- lib/alchemy/devise/test_support/factories.rb
|
|
177
199
|
- lib/alchemy/devise/version.rb
|
|
@@ -199,7 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
199
221
|
- !ruby/object:Gem::Version
|
|
200
222
|
version: '0'
|
|
201
223
|
requirements: []
|
|
202
|
-
rubygems_version: 3.
|
|
224
|
+
rubygems_version: 3.7.2
|
|
203
225
|
specification_version: 4
|
|
204
226
|
summary: Devise based user authentication for AlchemyCMS.
|
|
205
227
|
test_files: []
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../stylesheets/alchemy-devise/login.scss","../stylesheets/alchemy-devise/users.scss"],"names":[],"mappings":"AAAA,kCAEE,wCACA,yBAEA,sCACE,yBAGF,gHAEE,2BAGF,kDACE,kBAIJ,MACE,YACA,YACA,qBAGF,kBACE,kBACA,YACA,QACA,SACA,gCAEA,yBACE,aAGF,2BACE,kBAGF,wBACE,iBAGF,mCACE,yBACA,gCC5CF,0BACE,qBACA","file":"alchemy-devise.css"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
module Alchemy
|
|
2
|
-
module BaseControllerExtension
|
|
3
|
-
def self.prepended(base)
|
|
4
|
-
base.before_action(:store_user_request_time)
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
private
|
|
8
|
-
|
|
9
|
-
# Stores the users request time.
|
|
10
|
-
def store_user_request_time
|
|
11
|
-
if alchemy_user_signed_in?
|
|
12
|
-
current_alchemy_user.store_request_time!
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
Alchemy::BaseController.prepend Alchemy::BaseControllerExtension
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<table class="list" id="user_list">
|
|
2
|
-
<thead>
|
|
3
|
-
<tr>
|
|
4
|
-
<th class="icon"></th>
|
|
5
|
-
<th class="login">
|
|
6
|
-
<%= sort_link @query, :login, hide_indicator: true %>
|
|
7
|
-
</th>
|
|
8
|
-
<th class="name">
|
|
9
|
-
<%= sort_link @query, :firstname, hide_indicator: true %>
|
|
10
|
-
</th>
|
|
11
|
-
<th>
|
|
12
|
-
<%= sort_link @query, :lastname, hide_indicator: true %>
|
|
13
|
-
</th>
|
|
14
|
-
<th class="email">
|
|
15
|
-
<%= sort_link @query, :email, hide_indicator: true %>
|
|
16
|
-
</th>
|
|
17
|
-
<th><%= Alchemy::User.human_attribute_name('language') %></th>
|
|
18
|
-
<th>
|
|
19
|
-
<%= sort_link @query, :last_sign_in_at, hide_indicator: true %>
|
|
20
|
-
</th>
|
|
21
|
-
<th class="role"><%= Alchemy::User.human_attribute_name('roles') %></th>
|
|
22
|
-
<th class="tools"></th>
|
|
23
|
-
</tr>
|
|
24
|
-
</thead>
|
|
25
|
-
<tbody>
|
|
26
|
-
<%= render partial: "user", collection: @users %>
|
|
27
|
-
</tbody>
|
|
28
|
-
</table>
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
<tr class="<%= cycle('even', 'odd') %>">
|
|
2
|
-
<td class="icon">
|
|
3
|
-
<%= render_icon(:user, style: user.logged_in? ? 'solid' : 'regular') %>
|
|
4
|
-
</td>
|
|
5
|
-
<td class="login">
|
|
6
|
-
<% if can?(:edit, user) %>
|
|
7
|
-
<%= link_to_dialog user.login,
|
|
8
|
-
alchemy.edit_admin_user_path(user), {
|
|
9
|
-
title: Alchemy.t(:edit_user),
|
|
10
|
-
overflow: true,
|
|
11
|
-
size: '430x560'
|
|
12
|
-
},
|
|
13
|
-
title: Alchemy.t(:edit_user) %>
|
|
14
|
-
<% end %>
|
|
15
|
-
</td>
|
|
16
|
-
<td class="name"><%= user.firstname %></td>
|
|
17
|
-
<td><%= user.lastname %></td>
|
|
18
|
-
<td class="email"><%= user.email %></td>
|
|
19
|
-
<td><%= Alchemy.t(user.language, scope: 'translations', default: Alchemy.t(:unknown)) %></td>
|
|
20
|
-
<td><%= user.last_sign_in_at.present? ? l(user.last_sign_in_at, format: 'alchemy.default'.to_sym) : Alchemy.t(:unknown) %></td>
|
|
21
|
-
<td class="role"><%= user.human_roles_string %></td>
|
|
22
|
-
<td class="tools">
|
|
23
|
-
<% if can?(:destroy, user) %>
|
|
24
|
-
<%= delete_button alchemy.admin_user_path(user), {
|
|
25
|
-
message: Alchemy.t(:confirm_to_delete_user),
|
|
26
|
-
title: Alchemy.t(:delete_user),
|
|
27
|
-
icon: :minus
|
|
28
|
-
},
|
|
29
|
-
title: Alchemy.t(:delete_user) %>
|
|
30
|
-
<% end %>
|
|
31
|
-
<% if can?(:edit, user) %>
|
|
32
|
-
<%= link_to_dialog render_icon(:edit),
|
|
33
|
-
alchemy.edit_admin_user_path(user), {
|
|
34
|
-
title: Alchemy.t(:edit_user),
|
|
35
|
-
overflow: true,
|
|
36
|
-
size: '430x560'
|
|
37
|
-
},
|
|
38
|
-
title: Alchemy.t(:edit_user) %>
|
|
39
|
-
<% end %>
|
|
40
|
-
</td>
|
|
41
|
-
</tr>
|
|
File without changes
|