diff options
| author | erdgeist <erdgeist@erdgeist.org> | 2026-08-13 01:11:29 +0200 |
|---|---|---|
| committer | erdgeist <erdgeist@erdgeist.org> | 2026-08-13 01:11:29 +0200 |
| commit | 862edbf4d5fdb9a88f84bfa1d51ab8cc83896094 (patch) | |
| tree | 2b8d8082b3549f664ef6f4babff3be864af4aac8 /app/views/users | |
| parent | a06f35bc0085aa744aef5fe2f4c4c036338b469b (diff) | |
Give every admin page one horizontal gutter
by many views inside. The inner ones are gone
nodes#edit's becomes #body_field, which is what #edit_grid places in its
full-width row.
Rows now reach into the label band themselves rather than depending on a
page wrapper to do it. The label column plus its gap equals the escape, so
a row's content starts at the gutter on every page; #edit_grid's rows are
exempt because the grid already steps back.
share one left edge. #new_node's -118px was compensating for that 10px and
left the page 7px out once it went. standalone_action_bar was overridden
everywhere it appeared.
page_translations#edit no longer uses #edit_grid: it has no metadata column,
so the two-column template pushed its abstract into the empty half.
nodes#edit's lower action bar was inside #edit_grid, so it was a grid item
inheriting the escape and sat 125px left of the form above it.
Diffstat (limited to 'app/views/users')
| -rw-r--r-- | app/views/users/edit.html.erb | 106 | ||||
| -rw-r--r-- | app/views/users/new.html.erb | 56 | ||||
| -rw-r--r-- | app/views/users/show.html.erb | 24 |
3 files changed, 110 insertions, 76 deletions
diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 1763394d..8a5900ce 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb | |||
| @@ -8,67 +8,83 @@ | |||
| 8 | <% end %> | 8 | <% end %> |
| 9 | 9 | ||
| 10 | <%= form_for @user do |f| %> | 10 | <%= form_for @user do |f| %> |
| 11 | <div class="layout_row_label"><%= t("users.labels.login") %></div> | 11 | <div class="layout_row"> |
| 12 | <div class="layout_row_content"><%= f.text_field :login, :autocomplete => "username" %></div> | 12 | <div class="layout_row_label"><%= t("users.labels.login") %></div> |
| 13 | <div class="layout_row_content"><%= f.text_field :login, :autocomplete => "username" %></div> | ||
| 14 | </div> | ||
| 13 | 15 | ||
| 14 | <div class="layout_row_label"><%= t("users.labels.email") %></div> | 16 | <div class="layout_row"> |
| 15 | <div class="layout_row_content"><%= f.text_field :email %></div> | 17 | <div class="layout_row_label"><%= t("users.labels.email") %></div> |
| 18 | <div class="layout_row_content"><%= f.text_field :email %></div> | ||
| 19 | </div> | ||
| 16 | 20 | ||
| 17 | <div class="layout_row_label"><%= t("users.labels.password") %></div> | 21 | <div class="layout_row"> |
| 18 | <div class="layout_row_content"><%= f.password_field :password, :autocomplete => "new-password" %></div> | 22 | <div class="layout_row_label"><%= t("users.labels.password") %></div> |
| 23 | <div class="layout_row_content"><%= f.password_field :password, :autocomplete => "new-password" %></div> | ||
| 24 | </div> | ||
| 19 | 25 | ||
| 20 | <div class="layout_row_label"><%= t("users.labels.confirm") %></div> | 26 | <div class="layout_row"> |
| 21 | <div class="layout_row_content"><%= f.password_field :password_confirmation, :autocomplete => "new-password" %></div> | 27 | <div class="layout_row_label"><%= t("users.labels.confirm") %></div> |
| 28 | <div class="layout_row_content"><%= f.password_field :password_confirmation, :autocomplete => "new-password" %></div> | ||
| 29 | </div> | ||
| 22 | 30 | ||
| 23 | <% if current_user.is_admin? %> | 31 | <% if current_user.is_admin? %> |
| 24 | <div class="layout_row_label"><%= t("users.labels.roles") %></div> | 32 | <div class="layout_row"> |
| 25 | <div class="layout_row_content"> | 33 | <div class="layout_row_label"><%= t("users.labels.roles") %></div> |
| 26 | <% User::ROLES.each do |role| %> | 34 | <div class="layout_row_content"> |
| 27 | <label class="role_choice"> | 35 | <% User::ROLES.each do |role| %> |
| 28 | <%= check_box_tag "user[roles][]", role, @user.roles.include?(role), | 36 | <label class="role_choice"> |
| 29 | :id => "user_roles_#{role}" %> | 37 | <%= check_box_tag "user[roles][]", role, @user.roles.include?(role), |
| 30 | <%= t("users.roles.#{role}") %> | 38 | :id => "user_roles_#{role}" %> |
| 31 | <span class="field_hint"><%= t("users.role_hints.#{role}") %></span> | 39 | <%= t("users.roles.#{role}") %> |
| 32 | </label> | 40 | <span class="field_hint"><%= t("users.role_hints.#{role}") %></span> |
| 33 | <% end %> | 41 | </label> |
| 34 | <%= hidden_field_tag "user[roles][]", "" %> | 42 | <% end %> |
| 43 | <%= hidden_field_tag "user[roles][]", "" %> | ||
| 44 | </div> | ||
| 35 | </div> | 45 | </div> |
| 36 | <% end %> | 46 | <% end %> |
| 37 | 47 | ||
| 38 | <div class="layout_row_label"></div> | 48 | <div class="layout_row"> |
| 39 | <div class="layout_row_content"><%= submit_tag t(".update") %></div> | 49 | <div class="layout_row_label"></div> |
| 50 | <div class="layout_row_content"><%= submit_tag t(".update") %></div> | ||
| 51 | </div> | ||
| 40 | <% end %> | 52 | <% end %> |
| 41 | 53 | ||
| 42 | <% if @user == current_user %> | 54 | <% if @user == current_user %> |
| 43 | <div class="layout_row_label"><%= t(".second_factor") %></div> | 55 | <div class="layout_row"> |
| 44 | <div class="layout_row_content"> | 56 | <div class="layout_row_label"><%= t(".second_factor") %></div> |
| 45 | <% if current_user.otp_enrolled? %> | 57 | <div class="layout_row_content"> |
| 46 | <p><%= t(".enabled") %></p> | 58 | <% if current_user.otp_enrolled? %> |
| 47 | <%= form_tag otp_enrollment_path, :method => :delete, :class => "otp_form" do %> | 59 | <p><%= t(".enabled") %></p> |
| 48 | <%= password_field_tag :current_password, nil, :placeholder => t(".current_password"), :autocomplete => "current-password" %> | 60 | <%= form_tag otp_enrollment_path, :method => :delete, :class => "otp_form" do %> |
| 49 | <%= text_field_tag :code, nil, :placeholder => t(".current_code"), | 61 | <%= password_field_tag :current_password, nil, :placeholder => t(".current_password"), :autocomplete => "current-password" %> |
| 50 | :autocomplete => "one-time-code", :inputmode => "numeric" %> | 62 | <%= text_field_tag :code, nil, :placeholder => t(".current_code"), |
| 51 | <%= button_tag :type => "submit", :class => "action_button" do %> | 63 | :autocomplete => "one-time-code", :inputmode => "numeric" %> |
| 52 | <%= icon("shield-off", library: "tabler", "aria-hidden": true) %> <%= t(".disable_second_factor") %> | 64 | <%= button_tag :type => "submit", :class => "action_button" do %> |
| 65 | <%= icon("shield-off", library: "tabler", "aria-hidden": true) %> <%= t(".disable_second_factor") %> | ||
| 66 | <% end %> | ||
| 53 | <% end %> | 67 | <% end %> |
| 54 | <% end %> | 68 | <% else %> |
| 55 | <% else %> | 69 | <p><%= t(".not_enrolled") %></p> |
| 56 | <p><%= t(".not_enrolled") %></p> | 70 | <%= form_tag otp_enrollment_path, :method => :post, :class => "otp_form" do %> |
| 57 | <%= form_tag otp_enrollment_path, :method => :post, :class => "otp_form" do %> | 71 | <%= password_field_tag :current_password, nil, :placeholder => t(".current_password"), :autocomplete => "current-password"%> |
| 58 | <%= password_field_tag :current_password, nil, :placeholder => t(".current_password"), :autocomplete => "current-password"%> | 72 | <%= button_tag :type => "submit", :class => "action_button" do %> |
| 59 | <%= button_tag :type => "submit", :class => "action_button" do %> | 73 | <%= icon("shield-lock", library: "tabler", "aria-hidden": true) %> <%= t(".enable_second_factor") %> |
| 60 | <%= icon("shield-lock", library: "tabler", "aria-hidden": true) %> <%= t(".enable_second_factor") %> | 74 | <% end %> |
| 61 | <% end %> | 75 | <% end %> |
| 62 | <% end %> | 76 | <% end %> |
| 63 | <% end %> | 77 | </div> |
| 64 | </div> | 78 | </div> |
| 65 | <% elsif current_user.is_admin? && @user.otp_enrolled? %> | 79 | <% elsif current_user.is_admin? && @user.otp_enrolled? %> |
| 66 | <div class="layout_row_label"><%= t(".second_factor") %></div> | 80 | <div class="layout_row"> |
| 67 | <div class="layout_row_content"> | 81 | <div class="layout_row_label"><%= t(".second_factor") %></div> |
| 68 | <%= t(".enabled") %> | 82 | <div class="layout_row_content"> |
| 69 | <%= button_to t(".reset_second_factor"), reset_otp_user_path(@user), :method => :put, | 83 | <%= t(".enabled") %> |
| 70 | :form_class => "button_to destructive", | 84 | <%= button_to t(".reset_second_factor"), reset_otp_user_path(@user), :method => :put, |
| 71 | :form => { :data => { :confirm => t(".reset_confirm", :login => @user.login) } } %> | 85 | :form_class => "button_to destructive", |
| 86 | :form => { :data => { :confirm => t(".reset_confirm", :login => @user.login) } } %> | ||
| 87 | </div> | ||
| 72 | </div> | 88 | </div> |
| 73 | <% end %> | 89 | <% end %> |
| 74 | </div> | 90 | </div> |
diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb index 8d99fd92..13a238b5 100644 --- a/app/views/users/new.html.erb +++ b/app/views/users/new.html.erb | |||
| @@ -8,34 +8,44 @@ | |||
| 8 | 8 | ||
| 9 | <div id="admin_layout"> | 9 | <div id="admin_layout"> |
| 10 | <%= form_for @user do |f| %> | 10 | <%= form_for @user do |f| %> |
| 11 | <div id="content"> | 11 | <div class="layout_row"> |
| 12 | <div class="layout_row_label"><%= t("users.labels.login") %></div> | 12 | <div class="layout_row_label"><%= t("users.labels.login") %></div> |
| 13 | <div class="layout_row_content"><%= f.text_field :login %></div> | 13 | <div class="layout_row_content"><%= f.text_field :login %></div> |
| 14 | </div> | ||
| 14 | 15 | ||
| 15 | <div class="layout_row_label"><%= t("users.labels.email") %></div> | 16 | <div class="layout_row"> |
| 16 | <div class="layout_row_content"><%= f.text_field :email %></div> | 17 | <div class="layout_row_label"><%= t("users.labels.email") %></div> |
| 18 | <div class="layout_row_content"><%= f.text_field :email %></div> | ||
| 19 | </div> | ||
| 17 | 20 | ||
| 18 | <div class="layout_row_label"><%= t("users.labels.password") %></div> | 21 | <div class="layout_row"> |
| 19 | <div class="layout_row_content"><%= f.password_field :password %></div> | 22 | <div class="layout_row_label"><%= t("users.labels.password") %></div> |
| 23 | <div class="layout_row_content"><%= f.password_field :password %></div> | ||
| 24 | </div> | ||
| 20 | 25 | ||
| 21 | <div class="layout_row_label"><%= t("users.labels.confirm") %></div> | 26 | <div class="layout_row"> |
| 22 | <div class="layout_row_content"><%= f.password_field :password_confirmation %></div> | 27 | <div class="layout_row_label"><%= t("users.labels.confirm") %></div> |
| 28 | <div class="layout_row_content"><%= f.password_field :password_confirmation %></div> | ||
| 29 | </div> | ||
| 23 | 30 | ||
| 24 | <div class="layout_row_label"><%= t("users.labels.roles") %></div> | 31 | <div class="layout_row"> |
| 25 | <div class="layout_row_content"> | 32 | <div class="layout_row_label"><%= t("users.labels.roles") %></div> |
| 26 | <% User::ROLES.each do |role| %> | 33 | <div class="layout_row_content"> |
| 27 | <label class="role_choice"> | 34 | <% User::ROLES.each do |role| %> |
| 28 | <%= check_box_tag "user[roles][]", role, @user.roles.include?(role), | 35 | <label class="role_choice"> |
| 29 | :id => "user_roles_#{role}" %> | 36 | <%= check_box_tag "user[roles][]", role, @user.roles.include?(role), |
| 30 | <%= t("users.roles.#{role}") %> | 37 | :id => "user_roles_#{role}" %> |
| 31 | <span class="field_hint"><%= t("users.role_hints.#{role}") %></span> | 38 | <%= t("users.roles.#{role}") %> |
| 32 | </label> | 39 | <span class="field_hint"><%= t("users.role_hints.#{role}") %></span> |
| 33 | <% end %> | 40 | </label> |
| 34 | <%= hidden_field_tag "user[roles][]", "" %> | 41 | <% end %> |
| 42 | <%= hidden_field_tag "user[roles][]", "" %> | ||
| 43 | </div> | ||
| 35 | </div> | 44 | </div> |
| 36 | 45 | ||
| 37 | <div class="layout_row_label"></div> | 46 | <div class="layout_row"> |
| 38 | <div class="layout_row_content"><%= f.submit t("admin.common.create") %></div> | 47 | <div class="layout_row_label"></div> |
| 48 | <div class="layout_row_content"><%= f.submit t("admin.common.create") %></div> | ||
| 49 | </div> | ||
| 39 | <% end %> | 50 | <% end %> |
| 40 | </div> | ||
| 41 | </div> | 51 | </div> |
diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 2685a15b..9879e171 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | <div id="admin_layout"> | 1 | <div id="admin_layout"> |
| 2 | <h1><%= @user.login %></h1> | 2 | <h1><%= @user.login %></h1> |
| 3 | 3 | ||
| 4 | <div id="content"> | 4 | <div class="layout_row"> |
| 5 | <div class="layout_row_label"><%= t("admin.columns.actions") %></div> | 5 | <div class="layout_row_label"><%= t("admin.columns.actions") %></div> |
| 6 | <div class="layout_row_content info_group"> | 6 | <div class="layout_row_content info_group"> |
| 7 | <div class="info_group_items"> | 7 | <div class="info_group_items"> |
| @@ -12,25 +12,33 @@ | |||
| 12 | </div> | 12 | </div> |
| 13 | </div> | 13 | </div> |
| 14 | </div> | 14 | </div> |
| 15 | </div> | ||
| 15 | 16 | ||
| 17 | <div class="layout_row"> | ||
| 16 | <div class="layout_row_label"><%= t("users.labels.login") %></div> | 18 | <div class="layout_row_label"><%= t("users.labels.login") %></div> |
| 17 | <div class="layout_row_content"><%= @user.login %></div> | 19 | <div class="layout_row_content"><%= @user.login %></div> |
| 20 | </div> | ||
| 18 | 21 | ||
| 22 | <div class="layout_row"> | ||
| 19 | <div class="layout_row_label"><%= t("users.labels.email") %></div> | 23 | <div class="layout_row_label"><%= t("users.labels.email") %></div> |
| 20 | <div class="layout_row_content"><%= @user.email %></div> | 24 | <div class="layout_row_content"><%= @user.email %></div> |
| 25 | </div> | ||
| 21 | 26 | ||
| 27 | <div class="layout_row"> | ||
| 22 | <div class="layout_row_label"><%= t("users.labels.roles") %></div> | 28 | <div class="layout_row_label"><%= t("users.labels.roles") %></div> |
| 23 | <div class="layout_row_content"> | 29 | <div class="layout_row_content"> |
| 24 | <%= @user.roles.any? ? @user.role_labels.join(", ") : t("users.no_roles") %> | 30 | <%= @user.roles.any? ? @user.role_labels.join(", ") : t("users.no_roles") %> |
| 25 | </div> | 31 | </div> |
| 26 | </div> | 32 | </div> |
| 27 | 33 | ||
| 28 | <div class="layout_row_label"><%= t("users.labels.last_login") %></div> | 34 | <div class="layout_row"> |
| 29 | <div class="layout_row_content"> | 35 | <div class="layout_row_label"><%= t("users.labels.last_login") %></div> |
| 30 | <% if @user.last_login_at %> | 36 | <div class="layout_row_content"> |
| 31 | <%= admin_date(@user.last_login_at) %> | 37 | <% if @user.last_login_at %> |
| 32 | <% else %> | 38 | <%= admin_date(@user.last_login_at) %> |
| 33 | <%= t("users.never_signed_in") %> | 39 | <% else %> |
| 34 | <% end %> | 40 | <%= t("users.never_signed_in") %> |
| 41 | <% end %> | ||
| 42 | </div> | ||
| 35 | </div> | 43 | </div> |
| 36 | </div> | 44 | </div> |
