alchemy-devise 8.3.0 → 8.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd67a95b3b8acb62ea89b7234b435f88fac641446715bc55c6d0ba97768c37c2
4
- data.tar.gz: 66083de450b32ee439685bd643b5a15ad733d827271de44330a624aff372c4bc
3
+ metadata.gz: 9d09ae141f2a8fffa21c51258fa5d20d1b8b6d6b2dc93b5ace87d1be54e77652
4
+ data.tar.gz: d4671dc0ea62d25ddc2744025636e41fb3d447dc5a00a80c1106ab7298cd7a4e
5
5
  SHA512:
6
- metadata.gz: 7819848589227eb5be3deb2438547145fe968565cc9bbcd01b371f2312fa2de543c31e134611dedce6c67d5942116af268e111227626d18db832b65759729f35
7
- data.tar.gz: 5b868139b4b7b6b26c7b1fbeca32899b4aee323ecfc82aa8d8158b98ebcddf40a4bf39b0e3794cfe735b31b4169f5f96c771855ec31306f94bf17adb4a679978
6
+ metadata.gz: 3f2410f1c117abdfe91e7dc7b2b45ddf3a4a2428e08c78ed17cab964ecd60910a33dd1cd49f1805d58e701345549593a2f4dfdd75cc0823fba3c60e9c605df02
7
+ data.tar.gz: 6ad17f1c4cc4b7775185c6417e5d7cd7dc53ce768dc0dc0fe29f9d12db4b928a15c8bf93b394e940f0237ba818595d4f2534c41fabd8b2989e42068f691b9779
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 8.4.0 (2026-09-01)
4
+
5
+ <!-- Release notes generated using configuration in .github/release.yml at 8.4-stable -->
6
+
7
+ ## What's Changed
8
+ ### New Features
9
+ * feat: New login and signup screens by @tvdeyen in https://github.com/AlchemyCMS/alchemy-devise/pull/291
10
+ * feat(admin): Use primary action for add user button by @tvdeyen in https://github.com/AlchemyCMS/alchemy-devise/pull/292
11
+ * feat: Use `Alchemy::UserMethods` module by @tvdeyen in https://github.com/AlchemyCMS/alchemy-devise/pull/295
12
+ ### Dependencies
13
+ * 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
14
+ * 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
15
+ ### Other Changes
16
+ * chore: Update specs for Alchemy 8.4/main by @tvdeyen in https://github.com/AlchemyCMS/alchemy-devise/pull/290
17
+ * fix: Wrap toolbar buttons in container by @tvdeyen in https://github.com/AlchemyCMS/alchemy-devise/pull/294
18
+
19
+
20
+ **Full Changelog**: https://github.com/AlchemyCMS/alchemy-devise/compare/v8.3.0...v8.4.0
21
+
3
22
  ## 8.3.0 (2026-06-25)
4
23
 
5
24
  <!-- 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{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%);--form-right-column-width: 1.65fr}.login_signup_box alchemy-message{width:281px;margin-left:auto}.no-js .login_signup_box{display:none}.login_signup_box .message{margin-left:157px}.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);grid-column:2;grid-row:1}.login_signup_box .submit>a:hover alchemy-icon{transform:translateX(-2px);transition:transform var(--transition-duration)}
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:hsl(from var(--body-background-color) h s l/50%);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
- width: 250px;
15
- margin: 0 10px 1.5em 200px;
35
+ display: flex;
36
+ flex-direction: column;
37
+ align-items: center;
38
+ justify-content: center;
39
+ gap: var(--spacing-4);
40
+ background-color: hsl(from var(--body-background-color) h s l / 50%);
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: absolute;
25
- top: 50%;
26
- left: 50%;
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
- .message {
40
- margin-left: 157px;
64
+ alchemy-message {
65
+ margin-bottom: 1.5em;
41
66
  }
42
67
 
43
- .submit {
44
- > label {
45
- text-align: start;
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
- input[type="checkbox"] {
48
- margin: 0 var(--spacing-0) 0 0;
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
- grid-column: 2;
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
  }
@@ -69,7 +69,7 @@ module Alchemy
69
69
  def set_roles
70
70
  if can_update_role?
71
71
  @user_roles = User::ROLES.map do |role|
72
- [User.human_rolename(role), role]
72
+ [User.human_alchemy_rolename(role), role]
73
73
  end
74
74
  end
75
75
  end
@@ -26,19 +26,19 @@ module Alchemy
26
26
  private
27
27
 
28
28
  def member?
29
- @user.try(:has_role?, :member)
29
+ @user.try(:has_alchemy_role?, :member)
30
30
  end
31
31
 
32
32
  def author?
33
- @user.try(:has_role?, :author)
33
+ @user.try(:has_alchemy_role?, :author)
34
34
  end
35
35
 
36
36
  def editor?
37
- @user.try(:has_role?, :editor)
37
+ @user.try(:has_alchemy_role?, :editor)
38
38
  end
39
39
 
40
40
  def admin?
41
- @user.try(:has_role?, :admin)
41
+ @user.try(:has_alchemy_role?, :admin)
42
42
  end
43
43
  end
44
44
  end
@@ -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
- # Unlock all locked pages before destroy.
33
- before_destroy :unlock_pages!
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
- def human_rolename(role)
65
- Alchemy.t("user_roles.#{role}")
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
- # Returns true if the user ahs admin role
98
- def is_admin?
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
- # Returns true if the user has the given role.
105
- def has_role?(role)
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 :locked_pages, :pages_locked_by_me
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
- def human_roles_string
164
- alchemy_roles.map do |role|
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 has_role?("author") || has_role?("editor") || has_role?("admin")
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
- <%= render_message do %>
9
- <p>
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
- </p>
12
- <p><%= Alchemy.t('Please enter your email address') %></p>
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
- <small><%= Alchemy.version %></small>
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
- <%= render_message do %>
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">&nbsp;</span>
20
11
 
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 %>
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">&nbsp;</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
- <div class="submit">
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.human_roles_string %>
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
- <%= content_for :toolbar do %>
7
- <sl-tooltip content="<%= Alchemy.t(:back) %>">
8
- <%= link_to request.referer || alchemy.admin_dashboard_path, class: "icon_button" do %>
9
- <alchemy-icon name="arrow-left-s"></alchemy-icon>
10
- <% end %>
11
- </sl-tooltip>
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
- <%= render Alchemy::Admin::ToolbarButton.new(
7
- icon: :plus,
8
- label: Alchemy.t(:create_user),
9
- url: alchemy.new_admin_user_path,
10
- title: Alchemy.t(:create_user),
11
- hotkey: 'alt+n',
12
- tooltip_placement: "top-start",
13
- dialog_options: {
14
- title: Alchemy.t(:create_user),
15
- size: "460x530"
16
- },
17
- if_permitted_to: [:create, Alchemy::User]
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
- <%= alchemy_form_for [:admin, @user] do |f| %>
14
- <%= render 'fields', f: f %>
15
- <% end %>
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>
@@ -1,5 +1,5 @@
1
1
  module Alchemy
2
2
  module Devise
3
- VERSION = "8.3.0"
3
+ VERSION = "8.4.0"
4
4
  end
5
5
  end
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.3.0
4
+ version: 8.4.0
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.3.0
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.3.0
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.10
269
+ rubygems_version: 4.0.16
270
270
  specification_version: 4
271
271
  summary: Devise based user authentication for AlchemyCMS.
272
272
  test_files: []