alchemy-devise 8.3.0 → 8.4.1
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 +31 -0
- data/app/assets/builds/alchemy-devise.css +1 -1
- data/app/assets/stylesheets/alchemy-devise/login.scss +80 -20
- data/app/controllers/alchemy/admin/passwords_controller.rb +1 -0
- data/app/controllers/alchemy/admin/user_sessions_controller.rb +1 -0
- data/app/controllers/alchemy/admin/users_controller.rb +1 -1
- data/app/models/alchemy/devise/ability.rb +4 -4
- data/app/models/alchemy/user.rb +19 -49
- data/app/views/alchemy/admin/passwords/edit.html.erb +26 -26
- data/app/views/alchemy/admin/passwords/new.html.erb +28 -27
- data/app/views/alchemy/admin/user_sessions/_logo.html.erb +3 -3
- data/app/views/alchemy/admin/user_sessions/new.html.erb +23 -22
- data/app/views/alchemy/admin/users/_resource_table.html.erb +1 -1
- data/app/views/alchemy/admin/users/edit.html.erb +13 -6
- data/app/views/alchemy/admin/users/index.html.erb +15 -13
- data/app/views/alchemy/admin/users/signup.html.erb +9 -5
- data/lib/alchemy/devise/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9d93b11ac9b4d82e39ec5edaf499a157c979650c8b0f216e83096c0eaec35fee
|
|
4
|
+
data.tar.gz: 79f9bef20385ec3087e1d511b5703a54bb05ade4121e68de4de82cd99281838b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: db1fe1c10b41be58963417888d579fed0c1483d3d57b39f213b9904393533b40c374332ecc6b41e9ac9303ac94ef7a0e25dab5ff8f2afcf04f7674ee2d4de653
|
|
7
|
+
data.tar.gz: ae65df4a2cc41142fba04013e481969a2b035843da7775065734a4f23d703bd06dd90d0d9c15b8e823f22239d268f1a45e2f61141d237778be0082f9742abf83
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 8.4.1 (2026-09-23)
|
|
4
|
+
|
|
5
|
+
<!-- Release notes generated using configuration in .github/release.yml at 8.4-stable -->
|
|
6
|
+
|
|
7
|
+
## What's Changed
|
|
8
|
+
### Other Changes
|
|
9
|
+
* [8.4-stable] Merge pull request #306 from AlchemyCMS/fix-login-css-relative-color by @alchemycms-bot[bot] in https://github.com/AlchemyCMS/alchemy-devise/pull/307
|
|
10
|
+
* [8.4-stable] Merge pull request #309 from AlchemyCMS/fix/apply-csp-to-devise-controllers by @alchemycms-bot[bot] in https://github.com/AlchemyCMS/alchemy-devise/pull/310
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
**Full Changelog**: https://github.com/AlchemyCMS/alchemy-devise/compare/v8.4.0...v8.4.1
|
|
14
|
+
|
|
15
|
+
## 8.4.0 (2026-09-01)
|
|
16
|
+
|
|
17
|
+
<!-- Release notes generated using configuration in .github/release.yml at 8.4-stable -->
|
|
18
|
+
|
|
19
|
+
## What's Changed
|
|
20
|
+
### New Features
|
|
21
|
+
* feat: New login and signup screens by @tvdeyen in https://github.com/AlchemyCMS/alchemy-devise/pull/291
|
|
22
|
+
* feat(admin): Use primary action for add user button by @tvdeyen in https://github.com/AlchemyCMS/alchemy-devise/pull/292
|
|
23
|
+
* feat: Use `Alchemy::UserMethods` module by @tvdeyen in https://github.com/AlchemyCMS/alchemy-devise/pull/295
|
|
24
|
+
### Dependencies
|
|
25
|
+
* chore(deps-dev): update simplecov-cobertura requirement from ~> 3.0 to ~> 4.0 by @dependabot[bot] in https://github.com/AlchemyCMS/alchemy-devise/pull/286
|
|
26
|
+
* chore(deps-dev): bump sass from 1.101.0 to 1.102.0 by @dependabot[bot] in https://github.com/AlchemyCMS/alchemy-devise/pull/293
|
|
27
|
+
### Other Changes
|
|
28
|
+
* chore: Update specs for Alchemy 8.4/main by @tvdeyen in https://github.com/AlchemyCMS/alchemy-devise/pull/290
|
|
29
|
+
* fix: Wrap toolbar buttons in container by @tvdeyen in https://github.com/AlchemyCMS/alchemy-devise/pull/294
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
**Full Changelog**: https://github.com/AlchemyCMS/alchemy-devise/compare/v8.3.0...v8.4.0
|
|
33
|
+
|
|
3
34
|
## 8.3.0 (2026-06-25)
|
|
4
35
|
|
|
5
36
|
<!-- Release notes generated using configuration in .github/release.yml at main -->
|
|
@@ -1 +1 @@
|
|
|
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{
|
|
1
|
+
body.signup,body.user_sessions,body.passwords{background-image:url("https://picsum.photos/1920/1200.webp?grayscale");background-size:cover;background-position:center}body.signup #errors,body.signup .message.info,body.user_sessions #errors,body.user_sessions .message.info,body.passwords #errors,body.passwords .message.info{border-color:rgba(0,0,0,0)}body.signup #errors,body.user_sessions #errors,body.passwords #errors{margin-left:157px}body.signup #main_content,body.user_sessions #main_content,body.passwords #main_content{padding-top:var(--spacing-2);display:flex;flex-direction:column;justify-content:center}body.signup::after,body.user_sessions::after,body.passwords::after{content:"Image from Unsplash";position:absolute;bottom:var(--spacing-2);right:var(--spacing-2);font-size:var(--font-size_small);color:var(--body-background-color)}.logo-box{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--spacing-4);background-color:color-mix(in srgb, var(--body-background-color) 50%, transparent);backdrop-filter:blur(5px);border-radius:var(--border-radius_large);box-shadow:var(--dialog-box-shadow);padding:var(--spacing-4);margin-bottom:var(--spacing-6);text-shadow:0 0 2px var(--body-background-color)}.logo-box svg{width:200px;height:auto}.login_signup_box{position:relative;max-width:450px;margin:auto;--form-right-column-width: 1.65fr}.no-js .login_signup_box{display:none}.login_signup_box alchemy-message{margin-bottom:1.5em}.login_signup_box .panel{--panel-background-color: var(--body-background-color);width:100%;max-width:100%;margin:0;box-shadow:var(--dialog-box-shadow);border-radius:var(--border-radius_large);border-color:rgba(0,0,0,0)}@media(max-width: 500px){.login_signup_box .input,.login_signup_box .submit{grid-template-columns:1fr}.login_signup_box .input label,.login_signup_box .submit label{text-align:start;margin-bottom:var(--spacing-1)}}.login_signup_box .submit>a{display:inline-flex;align-items:center;gap:var(--spacing-0);width:fit-content}.login_signup_box .submit>a:hover alchemy-icon{transform:translateX(-2px);transition:transform var(--transition-duration)}@media(min-width: 501px){.login_signup_box .submit{grid-template-columns:var(--form-left-column-width) minmax(254px, var(--form-right-column-width))}.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{grid-column:2;grid-row:1}}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
body.signup,
|
|
1
2
|
body.user_sessions,
|
|
2
3
|
body.passwords {
|
|
4
|
+
background-image: url("https://picsum.photos/1920/1200.webp?grayscale");
|
|
5
|
+
background-size: cover;
|
|
6
|
+
background-position: center;
|
|
7
|
+
|
|
3
8
|
#errors,
|
|
4
9
|
.message.info {
|
|
5
10
|
border-color: transparent;
|
|
@@ -8,11 +13,37 @@ body.passwords {
|
|
|
8
13
|
#errors {
|
|
9
14
|
margin-left: 157px;
|
|
10
15
|
}
|
|
16
|
+
|
|
17
|
+
#main_content {
|
|
18
|
+
padding-top: var(--spacing-2);
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: column;
|
|
21
|
+
justify-content: center;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
&::after {
|
|
25
|
+
content: "Image from Unsplash";
|
|
26
|
+
position: absolute;
|
|
27
|
+
bottom: var(--spacing-2);
|
|
28
|
+
right: var(--spacing-2);
|
|
29
|
+
font-size: var(--font-size_small);
|
|
30
|
+
color: var(--body-background-color);
|
|
31
|
+
}
|
|
11
32
|
}
|
|
12
33
|
|
|
13
34
|
.logo-box {
|
|
14
|
-
|
|
15
|
-
|
|
35
|
+
display: flex;
|
|
36
|
+
flex-direction: column;
|
|
37
|
+
align-items: center;
|
|
38
|
+
justify-content: center;
|
|
39
|
+
gap: var(--spacing-4);
|
|
40
|
+
background-color: color-mix(in srgb, var(--body-background-color) 50%, transparent);
|
|
41
|
+
backdrop-filter: blur(5px);
|
|
42
|
+
border-radius: var(--border-radius_large);
|
|
43
|
+
box-shadow: var(--dialog-box-shadow);
|
|
44
|
+
padding: var(--spacing-4);
|
|
45
|
+
margin-bottom: var(--spacing-6);
|
|
46
|
+
text-shadow: 0 0 2px var(--body-background-color);
|
|
16
47
|
|
|
17
48
|
svg {
|
|
18
49
|
width: 200px;
|
|
@@ -21,40 +52,47 @@ body.passwords {
|
|
|
21
52
|
}
|
|
22
53
|
|
|
23
54
|
.login_signup_box {
|
|
24
|
-
position:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
transform: translate(-50%, -50%);
|
|
55
|
+
position: relative;
|
|
56
|
+
max-width: 450px;
|
|
57
|
+
margin: auto;
|
|
28
58
|
--form-right-column-width: 1.65fr;
|
|
29
59
|
|
|
30
|
-
alchemy-message {
|
|
31
|
-
width: 281px;
|
|
32
|
-
margin-left: auto;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
60
|
.no-js & {
|
|
36
61
|
display: none;
|
|
37
62
|
}
|
|
38
63
|
|
|
39
|
-
|
|
40
|
-
margin-
|
|
64
|
+
alchemy-message {
|
|
65
|
+
margin-bottom: 1.5em;
|
|
41
66
|
}
|
|
42
67
|
|
|
43
|
-
.
|
|
44
|
-
|
|
45
|
-
|
|
68
|
+
.panel {
|
|
69
|
+
--panel-background-color: var(--body-background-color);
|
|
70
|
+
width: 100%;
|
|
71
|
+
max-width: 100%;
|
|
72
|
+
margin: 0;
|
|
73
|
+
box-shadow: var(--dialog-box-shadow);
|
|
74
|
+
border-radius: var(--border-radius_large);
|
|
75
|
+
border-color: transparent;
|
|
76
|
+
}
|
|
46
77
|
|
|
47
|
-
|
|
48
|
-
|
|
78
|
+
@media (max-width: 500px) {
|
|
79
|
+
.input,
|
|
80
|
+
.submit {
|
|
81
|
+
grid-template-columns: 1fr;
|
|
82
|
+
|
|
83
|
+
label {
|
|
84
|
+
text-align: start;
|
|
85
|
+
margin-bottom: var(--spacing-1);
|
|
49
86
|
}
|
|
50
87
|
}
|
|
88
|
+
}
|
|
51
89
|
|
|
90
|
+
.submit {
|
|
52
91
|
> a {
|
|
53
92
|
display: inline-flex;
|
|
54
93
|
align-items: center;
|
|
55
94
|
gap: var(--spacing-0);
|
|
56
|
-
|
|
57
|
-
grid-row: 1;
|
|
95
|
+
width: fit-content;
|
|
58
96
|
|
|
59
97
|
&:hover {
|
|
60
98
|
alchemy-icon {
|
|
@@ -64,4 +102,26 @@ body.passwords {
|
|
|
64
102
|
}
|
|
65
103
|
}
|
|
66
104
|
}
|
|
105
|
+
|
|
106
|
+
@media (min-width: 501px) {
|
|
107
|
+
.submit {
|
|
108
|
+
grid-template-columns: var(--form-left-column-width) minmax(
|
|
109
|
+
254px,
|
|
110
|
+
var(--form-right-column-width)
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
> label {
|
|
114
|
+
text-align: start;
|
|
115
|
+
|
|
116
|
+
input[type="checkbox"] {
|
|
117
|
+
margin: 0 var(--spacing-0) 0 0;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
> a {
|
|
122
|
+
grid-column: 2;
|
|
123
|
+
grid-row: 1;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
67
127
|
}
|
|
@@ -26,19 +26,19 @@ module Alchemy
|
|
|
26
26
|
private
|
|
27
27
|
|
|
28
28
|
def member?
|
|
29
|
-
@user.try(:
|
|
29
|
+
@user.try(:has_alchemy_role?, :member)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
def author?
|
|
33
|
-
@user.try(:
|
|
33
|
+
@user.try(:has_alchemy_role?, :author)
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def editor?
|
|
37
|
-
@user.try(:
|
|
37
|
+
@user.try(:has_alchemy_role?, :editor)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def admin?
|
|
41
|
-
@user.try(:
|
|
41
|
+
@user.try(:has_alchemy_role?, :admin)
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
end
|
data/app/models/alchemy/user.rb
CHANGED
|
@@ -21,18 +21,19 @@ module Alchemy
|
|
|
21
21
|
devise(*Alchemy::Devise.config.devise_modules)
|
|
22
22
|
|
|
23
23
|
include Alchemy::Taggable
|
|
24
|
+
include Alchemy::UserMethods
|
|
24
25
|
|
|
25
26
|
attr_accessor :send_credentials
|
|
26
27
|
|
|
27
28
|
has_many :folded_pages
|
|
28
29
|
|
|
29
30
|
validates :login, uniqueness: {case_sensitive: false}, presence: :login_required?
|
|
30
|
-
validates_presence_of :alchemy_roles
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
scope :admins, -> {
|
|
33
|
+
Alchemy::Deprecation.warn("#{name}.admins is deprecated. Please use #{name}.alchemy_admins instead.")
|
|
34
|
+
alchemy_admins
|
|
35
|
+
}
|
|
34
36
|
|
|
35
|
-
scope :admins, -> { where(arel_table[:alchemy_roles].matches("%admin%")) }
|
|
36
37
|
scope :logged_in, -> { where("last_request_at > ?", logged_in_timeout.seconds.ago) }
|
|
37
38
|
scope :logged_out, -> { where("last_request_at is NULL or last_request_at <= ?", logged_in_timeout.seconds.ago) }
|
|
38
39
|
|
|
@@ -61,9 +62,8 @@ module Alchemy
|
|
|
61
62
|
]
|
|
62
63
|
end
|
|
63
64
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
end
|
|
65
|
+
deprecate human_rolename: :human_alchemy_rolename, deprecator: Alchemy::Deprecation
|
|
66
|
+
alias_method :human_rolename, :human_alchemy_rolename
|
|
67
67
|
|
|
68
68
|
def logged_in_timeout
|
|
69
69
|
Alchemy.config.get(:auto_logout_time).minutes.to_i
|
|
@@ -73,53 +73,26 @@ module Alchemy
|
|
|
73
73
|
def role_symbols
|
|
74
74
|
alchemy_roles.map(&:to_sym)
|
|
75
75
|
end
|
|
76
|
+
deprecate :role_symbols, deprecator: Alchemy::Deprecation
|
|
76
77
|
|
|
77
78
|
def role
|
|
78
79
|
alchemy_roles.first
|
|
79
80
|
end
|
|
80
|
-
|
|
81
|
-
def alchemy_roles
|
|
82
|
-
read_attribute(:alchemy_roles).split(" ")
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def alchemy_roles=(roles_string)
|
|
86
|
-
if roles_string.is_a? Array
|
|
87
|
-
write_attribute(:alchemy_roles, roles_string.join(" "))
|
|
88
|
-
elsif roles_string.is_a? String
|
|
89
|
-
write_attribute(:alchemy_roles, roles_string)
|
|
90
|
-
end
|
|
91
|
-
end
|
|
81
|
+
deprecate :role, deprecator: Alchemy::Deprecation
|
|
92
82
|
|
|
93
83
|
def add_role(role)
|
|
94
84
|
self.alchemy_roles = alchemy_roles.push(role.to_s).uniq
|
|
95
85
|
end
|
|
86
|
+
deprecate add_role: :"alchemy_roles=", deprecator: Alchemy::Deprecation
|
|
96
87
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
has_role? "admin"
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
alias_method :admin?, :is_admin?
|
|
88
|
+
alias_method :is_admin?, :alchemy_admin?
|
|
89
|
+
deprecate is_admin?: :alchemy_admin?, deprecator: Alchemy::Deprecation
|
|
103
90
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
alchemy_roles.include? role.to_s
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
# Calls unlock on all locked pages
|
|
110
|
-
def unlock_pages!
|
|
111
|
-
pages_locked_by_me.map(&:unlock!)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
# Returns all pages locked by user.
|
|
115
|
-
#
|
|
116
|
-
# A page gets locked, if the user requests to edit the page.
|
|
117
|
-
#
|
|
118
|
-
def pages_locked_by_me
|
|
119
|
-
Page.locked_by(self).order(:updated_at)
|
|
120
|
-
end
|
|
91
|
+
alias_method :has_role?, :has_alchemy_role?
|
|
92
|
+
deprecate has_role?: :has_alchemy_role?, deprecator: Alchemy::Deprecation
|
|
121
93
|
|
|
122
|
-
alias_method :
|
|
94
|
+
alias_method :human_roles_string, :human_alchemy_roles
|
|
95
|
+
deprecate human_roles_string: :human_alchemy_roles, deprecator: Alchemy::Deprecation
|
|
123
96
|
|
|
124
97
|
# Returns the firstname and lastname as a string
|
|
125
98
|
#
|
|
@@ -160,11 +133,8 @@ module Alchemy
|
|
|
160
133
|
!logged_in?
|
|
161
134
|
end
|
|
162
135
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
self.class.human_rolename(role)
|
|
166
|
-
end.to_sentence
|
|
167
|
-
end
|
|
136
|
+
alias_method :pages_locked_by_me, :locked_pages
|
|
137
|
+
deprecate pages_locked_by_me: :locked_pages, deprecator: Alchemy::Deprecation
|
|
168
138
|
|
|
169
139
|
def store_request_time!
|
|
170
140
|
update_column(:last_request_at, Time.now)
|
|
@@ -173,7 +143,7 @@ module Alchemy
|
|
|
173
143
|
# Delivers a welcome mail depending from user's role.
|
|
174
144
|
#
|
|
175
145
|
def deliver_welcome_mail
|
|
176
|
-
if
|
|
146
|
+
if has_alchemy_role?("author") || has_alchemy_role?("editor") || has_alchemy_role?("admin")
|
|
177
147
|
Notifications.alchemy_user_created(self).deliver_later
|
|
178
148
|
else
|
|
179
149
|
Notifications.member_created(self).deliver_later
|
|
@@ -2,32 +2,32 @@
|
|
|
2
2
|
<%= stylesheet_link_tag "alchemy-devise" %>
|
|
3
3
|
<% end %>
|
|
4
4
|
|
|
5
|
+
<% content_for(:main_menu_style) { 'collapsed-menu' } %>
|
|
6
|
+
|
|
5
7
|
<div class="login_signup_box">
|
|
6
|
-
<%= render "alchemy/admin/user_sessions/logo" %>
|
|
7
|
-
<% if @user.errors.blank? %>
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
<strong><%= Alchemy.t('Password reset') %></strong>
|
|
11
|
-
</p>
|
|
12
|
-
<p><%= Alchemy.t('Please enter a new password') %></p>
|
|
13
|
-
<% end %>
|
|
14
|
-
<% else %>
|
|
15
|
-
<%= render "devise/shared/error_messages", resource: resource %>
|
|
16
|
-
<% end %>
|
|
17
|
-
<%= alchemy_form_for resource, as: resource_name, url: admin_update_password_path, method: 'patch' do |f| %>
|
|
18
|
-
<%= f.hidden_field :reset_password_token %>
|
|
19
|
-
<%= f.input :password, autofocus: true, label: Alchemy.t("New password"),
|
|
20
|
-
required: true, input_html: {autocomplete: "new-password"} %>
|
|
21
|
-
<%= f.input :password_confirmation, label: Alchemy.t("Confirm new password"),
|
|
22
|
-
required: true, input_html: {autocomplete: "new-password"} %>
|
|
23
|
-
<div class="submit">
|
|
24
|
-
<%= link_to alchemy.admin_login_path do %>
|
|
25
|
-
<%= render_icon("arrow-left-s", size: "1x") %>
|
|
26
|
-
<%= Alchemy.t(:login) %>
|
|
27
|
-
<% end %>
|
|
28
|
-
<button type="submit">
|
|
29
|
-
<%= Alchemy.t("Change password") %>
|
|
30
|
-
</button>
|
|
31
|
-
</div>
|
|
8
|
+
<%= render "alchemy/admin/user_sessions/logo" do %>
|
|
9
|
+
<% if @user.errors.blank? %>
|
|
10
|
+
<strong><%= Alchemy.t('Please enter a new password') %></strong>
|
|
11
|
+
<% end %>
|
|
32
12
|
<% end %>
|
|
13
|
+
|
|
14
|
+
<div class="panel">
|
|
15
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
|
16
|
+
<%= alchemy_form_for resource, as: resource_name, url: admin_update_password_path, method: 'patch' do |f| %>
|
|
17
|
+
<%= f.hidden_field :reset_password_token %>
|
|
18
|
+
<%= f.input :password, autofocus: true, label: Alchemy.t("New password"),
|
|
19
|
+
required: true, input_html: {autocomplete: "new-password"} %>
|
|
20
|
+
<%= f.input :password_confirmation, label: Alchemy.t("Confirm new password"),
|
|
21
|
+
required: true, input_html: {autocomplete: "new-password"} %>
|
|
22
|
+
<div class="submit">
|
|
23
|
+
<%= link_to alchemy.admin_login_path do %>
|
|
24
|
+
<%= render_icon("arrow-left-s", size: "1x") %>
|
|
25
|
+
<%= Alchemy.t(:login) %>
|
|
26
|
+
<% end %>
|
|
27
|
+
<button type="submit">
|
|
28
|
+
<%= Alchemy.t("Change password") %>
|
|
29
|
+
</button>
|
|
30
|
+
</div>
|
|
31
|
+
<% end %>
|
|
32
|
+
</div>
|
|
33
33
|
</div>
|
|
@@ -2,34 +2,35 @@
|
|
|
2
2
|
<%= stylesheet_link_tag "alchemy-devise" %>
|
|
3
3
|
<% end %>
|
|
4
4
|
|
|
5
|
+
<% content_for(:main_menu_style) { 'collapsed-menu' } %>
|
|
6
|
+
|
|
5
7
|
<div class="login_signup_box">
|
|
6
|
-
<%= render "alchemy/admin/user_sessions/logo" %>
|
|
7
|
-
<% if @user.errors.blank? %>
|
|
8
|
-
<%= render_message do %>
|
|
9
|
-
<p>
|
|
8
|
+
<%= render "alchemy/admin/user_sessions/logo" do %>
|
|
9
|
+
<% if @user.errors.blank? %>
|
|
10
10
|
<strong><%= Alchemy.t('Password reset') %></strong>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
<% end %>
|
|
14
|
-
<% else %>
|
|
15
|
-
<%= render "devise/shared/error_messages", resource: resource %>
|
|
16
|
-
<% end %>
|
|
17
|
-
<%= alchemy_form_for :user, url: admin_reset_password_path, html: {method: 'post'} do |f| %>
|
|
18
|
-
<%= f.input :email,
|
|
19
|
-
autofocus: true,
|
|
20
|
-
required: true,
|
|
21
|
-
input_html: {
|
|
22
|
-
autocomplete: "email",
|
|
23
|
-
value: params[:email]
|
|
24
|
-
} %>
|
|
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("Send reset instructions") %>
|
|
32
|
-
</button>
|
|
33
|
-
</div>
|
|
11
|
+
<strong><%= Alchemy.t('Please enter your email address') %></strong>
|
|
12
|
+
<% end %>
|
|
34
13
|
<% end %>
|
|
14
|
+
|
|
15
|
+
<div class="panel">
|
|
16
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
|
17
|
+
<%= alchemy_form_for :user, url: admin_reset_password_path, html: {method: 'post'} do |f| %>
|
|
18
|
+
<%= f.input :email,
|
|
19
|
+
autofocus: true,
|
|
20
|
+
required: true,
|
|
21
|
+
input_html: {
|
|
22
|
+
autocomplete: "email",
|
|
23
|
+
value: params[:email]
|
|
24
|
+
} %>
|
|
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("Send reset instructions") %>
|
|
32
|
+
</button>
|
|
33
|
+
</div>
|
|
34
|
+
<% end %>
|
|
35
|
+
</div>
|
|
35
36
|
</div>
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
fill="currentColor"
|
|
14
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
15
|
/>
|
|
16
|
-
<g>
|
|
16
|
+
<g fill="currentColor">
|
|
17
17
|
<path
|
|
18
|
-
fill="currentColor"
|
|
19
18
|
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
19
|
/>
|
|
20
|
+
<text x="94" y="83"><%= Alchemy.version %></text>
|
|
21
21
|
</g>
|
|
22
22
|
<g fill-rule="evenodd" clip-rule="evenodd" fill="currentColor">
|
|
23
23
|
<path
|
|
@@ -31,5 +31,5 @@
|
|
|
31
31
|
/>
|
|
32
32
|
</g>
|
|
33
33
|
</svg>
|
|
34
|
-
|
|
34
|
+
<%= yield %>
|
|
35
35
|
</div>
|
|
@@ -2,31 +2,32 @@
|
|
|
2
2
|
<%= stylesheet_link_tag "alchemy-devise" %>
|
|
3
3
|
<% end %>
|
|
4
4
|
|
|
5
|
+
<% content_for(:main_menu_style) { 'collapsed-menu' } %>
|
|
6
|
+
|
|
5
7
|
<div class="login_signup_box">
|
|
6
|
-
<%= render "alchemy/admin/user_sessions/logo" %>
|
|
7
|
-
|
|
8
|
-
<p>
|
|
9
|
-
<strong><%= Alchemy.t('modules.user_sessions') %></strong>
|
|
10
|
-
</p>
|
|
11
|
-
<p><%= Alchemy.t('welcome_please_identify_notice') %></p>
|
|
8
|
+
<%= render "alchemy/admin/user_sessions/logo" do %>
|
|
9
|
+
<strong><%= Alchemy.t('welcome_please_identify_notice') %></strong>
|
|
12
10
|
<% end %>
|
|
13
|
-
<%= alchemy_form_for :user, url: {action: 'create'}, id: 'login', data: { turbo: false } do |f| %>
|
|
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
11
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
12
|
+
<div class="panel">
|
|
13
|
+
<%= alchemy_form_for :user, url: {action: 'create'}, id: 'login', data: { turbo: false } do |f| %>
|
|
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 %>
|
|
27
|
+
<div class="submit">
|
|
28
|
+
<%= link_to Alchemy.t('Forgot your password?'), admin_new_password_path %>
|
|
29
|
+
<button type="submit"><%= Alchemy.t(:login) %></button>
|
|
25
30
|
</div>
|
|
26
31
|
<% end %>
|
|
27
|
-
|
|
28
|
-
<%= link_to Alchemy.t('Forgot your password?'), admin_new_password_path %>
|
|
29
|
-
<button type="submit"><%= Alchemy.t(:login) %></button>
|
|
30
|
-
</div>
|
|
31
|
-
<% end %>
|
|
32
|
+
</div>
|
|
32
33
|
</div>
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
<%= user.last_sign_in_at.present? ? l(user.last_sign_in_at, format: :"alchemy.default") : Alchemy.t(:unknown) %>
|
|
26
26
|
<% end %>
|
|
27
27
|
<% table.column :role, header: Alchemy::User.human_attribute_name(:alchemy_roles) do |user| %>
|
|
28
|
-
<%= user.
|
|
28
|
+
<%= user.human_alchemy_roles %>
|
|
29
29
|
<% end %>
|
|
30
30
|
<% table.delete_button tooltip: Alchemy.t(:delete_user), confirm_message: Alchemy.t(:confirm_to_delete_user) %>
|
|
31
31
|
<% table.edit_button tooltip: Alchemy.t(:edit_user), dialog_size: "460x530" %>
|
|
@@ -3,12 +3,19 @@
|
|
|
3
3
|
<%= render "fields", f: f, user_roles: @user_roles %>
|
|
4
4
|
<% end %>
|
|
5
5
|
<% else %>
|
|
6
|
-
|
|
7
|
-
<
|
|
8
|
-
<%=
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
<% content_for :toolbar do %>
|
|
7
|
+
<div class="toolbar_buttons">
|
|
8
|
+
<sl-tooltip content="<%= Alchemy.t(:back) %>">
|
|
9
|
+
<%= render Alchemy::Admin::ToolbarButton.new(
|
|
10
|
+
label: Alchemy.t(:back),
|
|
11
|
+
primary: true,
|
|
12
|
+
icon: "arrow-left-s",
|
|
13
|
+
url: request.referer || alchemy.admin_dashboard_path,
|
|
14
|
+
skip_permission_check: true,
|
|
15
|
+
dialog: false
|
|
16
|
+
) %>
|
|
17
|
+
</sl-tooltip>
|
|
18
|
+
</div>
|
|
12
19
|
<% end %>
|
|
13
20
|
|
|
14
21
|
<div class="panel">
|
|
@@ -3,19 +3,21 @@
|
|
|
3
3
|
<% end %>
|
|
4
4
|
|
|
5
5
|
<%= content_for :toolbar do %>
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
6
|
+
<div class="toolbar_buttons">
|
|
7
|
+
<%= render Alchemy::Admin::ToolbarButton.new(
|
|
8
|
+
icon: :plus,
|
|
9
|
+
label: Alchemy.t(:create_user),
|
|
10
|
+
primary: true,
|
|
11
|
+
url: alchemy.new_admin_user_path,
|
|
12
|
+
hotkey: 'alt+n',
|
|
13
|
+
tooltip_placement: "top-start",
|
|
14
|
+
dialog_options: {
|
|
15
|
+
title: Alchemy.t(:create_user),
|
|
16
|
+
size: "460x530"
|
|
17
|
+
},
|
|
18
|
+
if_permitted_to: [:create, Alchemy::User]
|
|
19
|
+
) %>
|
|
20
|
+
</div>
|
|
19
21
|
<%= render "alchemy/admin/partials/search_form" %>
|
|
20
22
|
<% end %>
|
|
21
23
|
|
|
@@ -2,15 +2,19 @@
|
|
|
2
2
|
<%= stylesheet_link_tag "alchemy-devise" %>
|
|
3
3
|
<% end %>
|
|
4
4
|
|
|
5
|
+
<% content_for(:main_menu_style) { 'collapsed-menu' } %>
|
|
6
|
+
|
|
5
7
|
<div class="login_signup_box">
|
|
6
|
-
<%= render "alchemy/admin/user_sessions/logo" %>
|
|
7
|
-
<%= render_message do %>
|
|
8
|
+
<%= render "alchemy/admin/user_sessions/logo" do %>
|
|
8
9
|
<p>
|
|
9
10
|
<strong><%= Alchemy.t('Welcome to Alchemy') %></strong>
|
|
10
11
|
</p>
|
|
11
12
|
<p><%= Alchemy.t("Please Signup") %></p>
|
|
12
13
|
<% end %>
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
|
|
15
|
+
<div class="panel">
|
|
16
|
+
<%= alchemy_form_for [:admin, @user] do |f| %>
|
|
17
|
+
<%= render 'fields', f: f %>
|
|
18
|
+
<% end %>
|
|
19
|
+
</div>
|
|
16
20
|
</div>
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: alchemy-devise
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 8.
|
|
4
|
+
version: 8.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Thomas von Deyen
|
|
@@ -15,7 +15,7 @@ dependencies:
|
|
|
15
15
|
requirements:
|
|
16
16
|
- - ">="
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: 8.
|
|
18
|
+
version: 8.4.0.a
|
|
19
19
|
- - "<"
|
|
20
20
|
- !ruby/object:Gem::Version
|
|
21
21
|
version: '9.0'
|
|
@@ -25,7 +25,7 @@ dependencies:
|
|
|
25
25
|
requirements:
|
|
26
26
|
- - ">="
|
|
27
27
|
- !ruby/object:Gem::Version
|
|
28
|
-
version: 8.
|
|
28
|
+
version: 8.4.0.a
|
|
29
29
|
- - "<"
|
|
30
30
|
- !ruby/object:Gem::Version
|
|
31
31
|
version: '9.0'
|
|
@@ -266,7 +266,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
266
266
|
- !ruby/object:Gem::Version
|
|
267
267
|
version: '0'
|
|
268
268
|
requirements: []
|
|
269
|
-
rubygems_version: 4.0.
|
|
269
|
+
rubygems_version: 4.0.20
|
|
270
270
|
specification_version: 4
|
|
271
271
|
summary: Devise based user authentication for AlchemyCMS.
|
|
272
272
|
test_files: []
|