diff --git a/app/controllers/web/admin/career_member_users_controller.rb b/app/controllers/web/admin/career_member_users_controller.rb index 87aa85074..8d2a5c3bf 100644 --- a/app/controllers/web/admin/career_member_users_controller.rb +++ b/app/controllers/web/admin/career_member_users_controller.rb @@ -1,43 +1,53 @@ # frozen_string_literal: true class Web::Admin::CareerMemberUsersController < Web::Admin::ApplicationController - # TODO: удобнее здесь выводить members before_action only: %i[index archived finished lost] do query = { s: 'created_at desc' }.merge(params.permit![:q] || {}) - @q = User.permitted.includes(:careers, :career_members).ransack(query) - @users = @q.result + @q = Career::Member.joins(:user, :career).merge(User.permitted).ransack(query) + @career_members = @q.result @careers = Career.all end def index - @users_with_active_career = @users - .only_active_career_members - .page(params[:page]) - .per(20) + @active_career_members = @career_members + .active + .page(params[:page]) + .per(20) + + @users = prepare_data(@active_career_members) + @back_to_page = admin_career_member_users_path end def archived - @users_with_archived_career = @users - .only_archived_career_members - .page(params[:page]) - .per(20) + @archived_career_members = @career_members + .archived + .page(params[:page]) + .per(20) + + @users = prepare_data(@archived_career_members) + @back_to_page = archived_admin_career_member_users_path end def finished - @users_with_finished_career = @users - .only_finished_career_members - .page(params[:page]) - .per(20) + @finished_career_members = @career_members + .finished + .page(params[:page]) + .per(20) + + @users = prepare_data(@finished_career_members) end def lost - @users_lost_career = @users - .only_active_career_members - .with_career_step_members - .includes(career_members: :career_step_members) - .merge(Career::Step::Member.active.where(created_at: ..1.week.ago)) - .page(params[:page]) - .per(20) + @lost_career_members = @career_members + .active + .joins(:career_step_members) + .includes(:career_step_members) + .merge(Career::Step::Member.active.where(created_at: ..1.week.ago)) + .page(params[:page]) + .per(20) + + @users = prepare_data(@lost_career_members) + @back_to_page = lost_admin_career_member_users_path end def show @@ -45,10 +55,10 @@ def show @career_members = @user.career_members.includes(:career, :career_step_members) @progress = @career_members.each_with_object({}) do |member, acc| acc[member.id] = {} - acc[member.id][:career_name] = member.career + acc[member.id][:career] = member.career acc[member.id][:last_activity_at] = member.career_step_members.active.last&.created_at acc[member.id][:progress] = member.progress_by_finished_steps - acc[member.id][:current_step] = member.current_item.career_step.name + acc[member.id][:current_step] = member.current_item&.career_step&.name end @back_to_page = admin_career_member_user_path(@user) end @@ -77,4 +87,16 @@ def create def career_member_params params.require(:career_member).permit(:user_id, :career_id) end + + def prepare_data(career_members) + career_members.each_with_object({}) do |member, acc| + acc[member.id] = {} + acc[member.id][:last_name] = member.user.last_name + acc[member.id][:first_name] = member.user.first_name + acc[member.id][:email] = member.user.email + acc[member.id][:careers] = member.user.careers + acc[member.id][:current_step] = member.current_item&.career_step&.name + acc[member.id][:progress] = member.progress_by_finished_steps + end + end end diff --git a/app/models/career/member.rb b/app/models/career/member.rb index f8a155229..a14659e6d 100644 --- a/app/models/career/member.rb +++ b/app/models/career/member.rb @@ -67,4 +67,12 @@ def finished_steps_count career_step_members.finished.count end end + + def self.ransackable_attributes(_auth_object = nil) + %w[created_at finished_at state updated_at user_id] + end + + def self.ransackable_associations(_auth_object = nil) + %w[user career] + end end diff --git a/app/views/web/admin/career_member_users/_search_form.html.slim b/app/views/web/admin/career_member_users/_search_form.html.slim index 033cfcd41..29801d810 100644 --- a/app/views/web/admin/career_member_users/_search_form.html.slim +++ b/app/views/web/admin/career_member_users/_search_form.html.slim @@ -1,8 +1,8 @@ .p-3.mb-3.bg-light = search_form_for q, default_filter_form_options(url: url_for) do |f| - = f.input :last_name_or_first_name_cont, placeholder: "#{han('user', :last_name)}/#{han('user', :first_name)}", label: false - = f.input :email_cont, placeholder: han('user', :email), label: false - = f.input :careers_slug_eq, prompt: t('.careers'), label: false, as: :select_with_search, collection: @careers.map { |career| [career.name, career.slug] } + = f.input :user_last_name_or_user_first_name_cont, placeholder: "#{han('user', :last_name)}/#{han('user', :first_name)}", label: false + = f.input :user_email_cont, placeholder: han('user', :email), label: false + = f.input :career_slug_eq, prompt: t('.careers'), label: false, as: :select_with_search, collection: @careers.map { |career| [career.name, career.slug] } .col.d-flex.align-self-end = f.button :submit, t('submit'), class: 'btn-primary me-2 flex-grow-1' = link_to t('reset'), url_for, class: 'btn btn-outline-primary' diff --git a/app/views/web/admin/career_member_users/_users.html.slim b/app/views/web/admin/career_member_users/_users.html.slim index 92f68068a..ceb441da2 100644 --- a/app/views/web/admin/career_member_users/_users.html.slim +++ b/app/views/web/admin/career_member_users/_users.html.slim @@ -1,32 +1,43 @@ -- if users.empty? +- if career_members.empty? = render 'web/shared/empty_list' - else table.table.table-striped thead tr - th = sort_link(q, 'last_name') - th = sort_link(q, 'first_name') - th = sort_link(q, 'email') + th = sort_link(q, 'user_last_name') + th = sort_link(q, 'user_first_name') + th = sort_link(q, 'user_email') + th = t('.current_step') th = han('career', 'name') th = han('career/member', 'created_at') - - unless @users_with_finished_career.nil? + - unless @finished_career_members.nil? th = han('career/member', 'finished_at') - if show_progress th = t('.progress') th = t('actions') tbody - - users.each do |user| - tr - td = user.last_name - td = user.first_name - td = user.email - td = render 'careers', careers: user.careers - td = show_date_if(user.career_members.last.created_at, :without_time) - - unless @users_with_finished_career.nil? - td = show_date_if(user.career_members.last.finished_at, :without_time) - - if show_progress - td = user.active_career_member.progress_by_finished_steps - td - = link_to admin_career_member_user_path(user), class: 'btn btn-outline-primary btn-sm', title: t('.show') do - span.bi.bi-eye-fill + - career_members.each do |career_member| + - let users[career_member.id] do |user| + tr + td = user[:last_name] + td = user[:first_name] + td = user[:email] + td = user[:current_step] || t('.not_started') + td = render 'careers', careers: user[:careers] + td = show_date_if(career_member.created_at, :without_time) + - unless @finished_career_members.nil? + td = show_date_if(career_member.finished_at, :without_time) + - if show_progress + td = user[:progress] + td + .btn-group[role='group' aria-label="#{t('action_buttons')}"] + = link_to admin_career_member_user_path(career_member.user), class: 'btn btn-outline-primary btn-sm', title: t('.show') do + span.bi.bi-eye-fill + + - if career_member.may_archive? + = link_to archive_admin_career_member_path(career_member.career, career_member, back_to: @back_to_page), class: 'btn btn-outline-danger btn-sm', method: :patch, data: { confirm: t('.confirm') }, title: t('.archive') do + span.bi.bi.bi-trash3 + - if career_member.may_activate? + = link_to activate_admin_career_member_path(career_member.career, career_member, back_to: @back_to_page), method: :patch, class: 'btn btn-outline-success btn-sm', data: { confirm: t('.confirm_activate') }, title: t('.restore') do + span.bi.bi-arrow-counterclockwise diff --git a/app/views/web/admin/career_member_users/archived.html.slim b/app/views/web/admin/career_member_users/archived.html.slim index 5faaabbb0..3551018a5 100644 --- a/app/views/web/admin/career_member_users/archived.html.slim +++ b/app/views/web/admin/career_member_users/archived.html.slim @@ -5,6 +5,6 @@ = render 'menu' -= render 'users', users: @users_with_archived_career, q: @q, show_progress: false += render 'users', career_members: @archived_career_members, users: @users, q: @q, show_progress: false -= paginate @users_with_archived_career += paginate @archived_career_members diff --git a/app/views/web/admin/career_member_users/finished.html.slim b/app/views/web/admin/career_member_users/finished.html.slim index 27d71eb8b..1a9d48f94 100644 --- a/app/views/web/admin/career_member_users/finished.html.slim +++ b/app/views/web/admin/career_member_users/finished.html.slim @@ -5,6 +5,6 @@ = render 'menu' -= render 'users', users: @users_with_finished_career, q: @q, show_progress: false += render 'users', career_members: @finished_career_members, users: @users, q: @q, show_progress: false -= paginate @users_with_finished_career += paginate @finished_career_members diff --git a/app/views/web/admin/career_member_users/index.html.slim b/app/views/web/admin/career_member_users/index.html.slim index d8e1e37b3..e1651d480 100644 --- a/app/views/web/admin/career_member_users/index.html.slim +++ b/app/views/web/admin/career_member_users/index.html.slim @@ -7,6 +7,6 @@ h2 = t('.users_active_career') -= render 'users', users: @users_with_active_career, q: @q, show_progress: true += render 'users', career_members: @active_career_members, users: @users, q: @q, show_progress: true -= paginate @users_with_active_career += paginate @active_career_members diff --git a/app/views/web/admin/career_member_users/lost.html.slim b/app/views/web/admin/career_member_users/lost.html.slim index 47e6b40fe..54af74079 100644 --- a/app/views/web/admin/career_member_users/lost.html.slim +++ b/app/views/web/admin/career_member_users/lost.html.slim @@ -5,6 +5,6 @@ = render 'menu' -= render 'users', users: @users_lost_career, q: @q, show_progress: true += render 'users', career_members: @lost_career_members, users: @users, q: @q, show_progress: true -= paginate @users_lost_career += paginate @lost_career_members diff --git a/app/views/web/admin/career_member_users/show.html.slim b/app/views/web/admin/career_member_users/show.html.slim index 4064ba4bf..492b2da03 100644 --- a/app/views/web/admin/career_member_users/show.html.slim +++ b/app/views/web/admin/career_member_users/show.html.slim @@ -34,18 +34,18 @@ table.table.table-striped - @career_members.each do |career_member| - let @progress[career_member.id] do |member| tr - td = member[:career_name].name + td = member[:career].name td = career_member.aasm(:state).human_state td = member[:current_step] td = member[:progress] td = show_date_if(member[:last_activity_at], :without_time) td .btn-group[role='group' aria-label="#{t('action_buttons')}"] - = link_to admin_career_path(member[:career_name]), class: 'btn btn-outline-primary btn-sm', title: t('.show') do + = link_to admin_career_path(member[:career]), class: 'btn btn-outline-primary btn-sm', title: t('.show') do span.bi.bi-eye-fill - if career_member.may_archive? - = link_to archive_admin_career_member_path(member[:career_name], career_member, back_to: @back_to_page), class: 'btn btn-outline-danger btn-sm', method: :patch, data: { confirm: t('.confirm') }, title: t('.archive') do + = link_to archive_admin_career_member_path(member[:career], career_member, back_to: @back_to_page), class: 'btn btn-outline-danger btn-sm', method: :patch, data: { confirm: t('.confirm') }, title: t('.archive') do span.bi.bi.bi-trash3 - if career_member.may_activate? - = link_to activate_admin_career_member_path(member[:career_name], career_member, back_to: @back_to_page), method: :patch, class: 'btn btn-outline-success btn-sm', data: { confirm: t('.confirm_activate') }, title: t('.restore') do + = link_to activate_admin_career_member_path(member[:career], career_member, back_to: @back_to_page), method: :patch, class: 'btn btn-outline-success btn-sm', data: { confirm: t('.confirm_activate') }, title: t('.restore') do span.bi.bi-arrow-counterclockwise diff --git a/config/locales/admin/en.yml b/config/locales/admin/en.yml index d2acd7bea..bb66325eb 100644 --- a/config/locales/admin/en.yml +++ b/config/locales/admin/en.yml @@ -46,6 +46,10 @@ en: list: List new: Assign a student a career track users: + current_step: Current step + not_started: Not started + confirm: Are you sure you want to remove the user from the career track? + confirm_activate: Are you sure you want to restore the user to the career track progress: All/Finished no_date: Not finished show: User profile diff --git a/config/locales/admin/ru.yml b/config/locales/admin/ru.yml index c4360e2da..7039a12fc 100644 --- a/config/locales/admin/ru.yml +++ b/config/locales/admin/ru.yml @@ -47,6 +47,10 @@ ru: users_finished_career: Закончили КТ users_archived_career: Архив users: + current_step: Текущий шаг + not_started: Не стартовал + confirm: Вы уверенны что хотите убрать пользоваеля из карьерного трека + confirm_activate: Вы уверенны что хотите востонавить пользователя в карьерный трек progress: Всего/Пройденно show: Профиль пользователя no_date: Не завершен