diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index d460b1ac5..f5a3ae953 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -13,7 +13,7 @@ module Admin scope = scope.where(role: params[:role]) if params[:role].present? scope = apply_trial_filter(scope) if params[:trial_status].present? - @users = scope.order( + users = scope.order( Arel.sql( "CASE " \ "WHEN subscriptions.status = 'trialing' THEN 0 " \ @@ -23,14 +23,18 @@ module Admin ) ) - family_ids = @users.map(&:family_id).uniq + family_ids = users.map(&:family_id).uniq @accounts_count_by_family = Account.where(family_id: family_ids).group(:family_id).count @entries_count_by_family = Entry.joins(:account).where(accounts: { family_id: family_ids }).group("accounts.family_id").count - user_ids = @users.map(&:id).uniq + user_ids = users.map(&:id).uniq @last_login_by_user = Session.where(user_id: user_ids).group(:user_id).maximum(:created_at) @sessions_count_by_user = Session.where(user_id: user_ids).group(:user_id).count + @families_with_users = users.group_by(&:family).sort_by do |family, _users| + -(@entries_count_by_family[family.id] || 0) + end + @trials_expiring_in_7_days = Subscription .where(status: :trialing) .where(trial_ends_at: Time.current..7.days.from_now) diff --git a/app/views/admin/users/index.html.erb b/app/views/admin/users/index.html.erb index abc09a652..0c21d2060 100644 --- a/app/views/admin/users/index.html.erb +++ b/app/views/admin/users/index.html.erb @@ -43,80 +43,110 @@ - +
| <%= t(".table.user") %> | -<%= t(".table.trial_ends_at") %> | -<%= t(".table.family_accounts") %> | -<%= t(".table.family_transactions") %> | -<%= t(".table.role") %> | -||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
-
-
-
- <%= user.initials %>
-
-
-
- <%= user.display_name %> -<%= user.email %> -- <%= t(".table.last_login") %>: <%= @last_login_by_user[user.id]&.to_fs(:long) || t(".table.never") %> - <%= t(".table.session_count") %>: <%= number_with_delimiter(@sessions_count_by_user[user.id] || 0) %> - - |
- - <%= user.family.subscription&.trial_ends_at&.to_fs(:long) || t(".not_available") %> - | -- <%= number_with_delimiter(@accounts_count_by_family[user.family_id] || 0) %> - | -- <%= number_with_delimiter(@entries_count_by_family[user.family_id] || 0) %> - | -
- <% if user.id == Current.user.id %>
- <%= t(".you") %>
- <% else %>
- <%= form_with model: [:admin, user], method: :patch, class: "flex items-center justify-end gap-2" do |form| %>
- <%= form.select :role,
- options_for_select([
- [t(".roles.guest"), "guest"],
- [t(".roles.member", default: "Member"), "member"],
- [t(".roles.admin"), "admin"],
- [t(".roles.super_admin"), "super_admin"]
- ], user.role),
- {},
- class: "text-sm rounded-lg border border-primary bg-container text-primary px-2 py-1",
- onchange: "this.form.requestSubmit()" %>
- <% end %>
+
+ <% if @families_with_users.any? %>
+
+ <% @families_with_users.each do |family, users| %>
+
+
+
+
+
+
+ <%= family.name.presence || t(".unnamed_family") %> ++ <%= t(".family_summary", + members: users.size, + accounts: number_with_delimiter(@accounts_count_by_family[family.id] || 0), + transactions: number_with_delimiter(@entries_count_by_family[family.id] || 0)) %> + + |
| <%= t(".table.user") %> | +<%= t(".table.last_login") %> | +<%= t(".table.session_count") %> | +<%= t(".table.role") %> | +
|---|---|---|---|
|
+
+
+
+ <%= user.initials %>
+
+
+
+ <%= user.display_name %> +<%= user.email %> + |
+ + <%= @last_login_by_user[user.id]&.to_fs(:long) || t(".table.never") %> + | ++ <%= number_with_delimiter(@sessions_count_by_user[user.id] || 0) %> + | ++ <% if user.id == Current.user.id %> + <%= t(".you") %> + <% else %> + <%= form_with model: [:admin, user], method: :patch, class: "flex items-center justify-end gap-2", data: { controller: "auto-submit-form" } do |form| %> + <%= form.select :role, + options_for_select([ + [t(".roles.guest"), "guest"], + [t(".roles.member", default: "Member"), "member"], + [t(".roles.admin"), "admin"], + [t(".roles.super_admin"), "super_admin"] + ], user.role), + {}, + class: "text-sm rounded-lg border border-primary bg-container text-primary px-2 py-1", + data: { auto_submit_form_target: "auto" } %> + <% end %> + <% end %> + | +
<%= t(".no_users") %>
-<%= t(".no_users") %>
+