diff --git a/app/controllers/api/reports_controller.rb b/app/controllers/api/reports_controller.rb index 75b3fbed262..e8908afdb38 100644 --- a/app/controllers/api/reports_controller.rb +++ b/app/controllers/api/reports_controller.rb @@ -8,5 +8,9 @@ def index @reports = @reports.where(user_id: params[:user_id]) if params[:user_id].present? @reports = @reports.limit(params[:limit].to_i) if params[:limit].present? @reports = @reports.joins(:user).where(users: { company_id: params[:company_id] }) if params[:company_id] + return unless params[:target] == 'unchecked_reports' + return head :forbidden unless current_user.admin_or_mentor? + + @reports = @reports.includes(:checks).unchecked.not_wip end end diff --git a/app/controllers/users/reports_controller.rb b/app/controllers/users/reports_controller.rb index b74fd4aeb90..85b908e2f33 100644 --- a/app/controllers/users/reports_controller.rb +++ b/app/controllers/users/reports_controller.rb @@ -2,6 +2,8 @@ class Users::ReportsController < ApplicationController before_action :set_user + before_action :set_target + before_action :require_admin_or_mentor_login, if: -> { params[:target] == 'unchecked_reports' } before_action :set_reports before_action :set_report before_action :set_export @@ -30,13 +32,21 @@ def set_user end def set_reports - @reports = user.reports.list.page(params[:page]) + @reports = if @target == 'unchecked_reports' + @user.reports.unchecked.not_wip.list.page(params[:page]) + else + @user.reports.list.page(params[:page]) + end end def set_report @report = @reports[0] end + def set_target + @target = params[:target] || 'all_reports' + end + def user @user ||= User.find(params[:user_id]) end diff --git a/app/helpers/page_tabs/users_helper.rb b/app/helpers/page_tabs/users_helper.rb index 3959c4eea04..95b85f151d5 100644 --- a/app/helpers/page_tabs/users_helper.rb +++ b/app/helpers/page_tabs/users_helper.rb @@ -4,10 +4,11 @@ module PageTabs module UsersHelper def user_page_tabs(user, active_tab:) comment_count = user.comments.without_private_comment.length + unchecked_report_badge = current_user.admin_or_mentor? ? Cache.user_unchecked_report_count(user) : nil tabs = [] tabs << { name: 'プロフィール', link: user_path(user) } tabs << { name: 'ポートフォリオ', link: user_portfolio_path(user) } - tabs << { name: '日報', link: user_reports_path(user), count: user.reports.length } + tabs << { name: '日報', link: user_reports_path(user), count: user.reports.length, badge: unchecked_report_badge } tabs << { name: 'コメント', link: user_comments_path(user), count: comment_count } tabs << { name: '提出物', link: user_products_path(user), count: user.products.length } tabs << { name: '質問', link: user_questions_path(user), count: user.questions.length } diff --git a/app/javascript/components/Reports.jsx b/app/javascript/components/Reports.jsx index 278a3b732d9..afb77ea0c0f 100644 --- a/app/javascript/components/Reports.jsx +++ b/app/javascript/components/Reports.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react' +import React, { useState } from 'react' import useSWR from 'swr' import fetcher from '../fetcher' import LoadingListPlaceholder from './LoadingListPlaceholder' @@ -9,7 +9,6 @@ import UnconfirmedLink from './UnconfirmedLink' import usePage from './hooks/usePage' export default function Reports({ - all = false, userId = '', practices = false, unchecked = false, @@ -22,26 +21,14 @@ export default function Reports({ const { page, setPage } = usePage() const [userPracticeId, setUserPracticeId] = useState('') - useEffect(() => { - setUserPracticeId(userPracticeId) - }, [userPracticeId]) + let reportsUrl = `/api/reports.json?page=${page}` + if (userId) reportsUrl += `&user_id=${userId}` + if (companyId) reportsUrl += `&company_id=${companyId}` + const pid = userPracticeId || practiceId + if (pid) reportsUrl += `&practice_id=${pid}` + if (unchecked) reportsUrl += `&target=unchecked_reports` - const { data, error } = useSWR( - practices - ? `/api/reports.json?user_id=${userId}&page=${page}&practice_id=${userPracticeId}` - : unchecked - ? `/api/reports/unchecked.json?page=${page}&user_id=${userId}` - : userId !== '' - ? `/api/reports.json?page=${page}&user_id=${userId}` - : practiceId !== '' - ? `/api/reports.json?page=${page}&practice_id=${practiceId}` - : companyId !== '' - ? `/api/reports.json?page=${page}&company_id=${companyId}` - : all === true - ? `/api/reports.json?page=${page}&practice_id=${userPracticeId}` - : console.log('data_fetched!'), - fetcher - ) + const { data, error } = useSWR(reportsUrl, fetcher) if (error) return <>エラーが発生しました。 if (!data) { diff --git a/app/views/reports/_report_body.html.slim b/app/views/reports/_report_body.html.slim index d0d0c54fc62..d14663a35d8 100644 --- a/app/views/reports/_report_body.html.slim +++ b/app/views/reports/_report_body.html.slim @@ -14,7 +14,7 @@ = report.user.unchecked_report_message(count, report.user) ul.card-body-main-actions__items li.card-body-main-actions__item - = link_to user_reports_path(report.user), class: "card-body-main-actions__action a-button is-sm #{report.user.user_report_count_class(count)} is-block", target: '_blank', rel: 'noopener' do + = link_to user_reports_path(report.user, target: 'unchecked_reports'), class: "card-body-main-actions__action a-button is-sm #{report.user.user_report_count_class(count)} is-block", target: '_blank', rel: 'noopener' do | #{report.user.login_name}さんの日報一覧へ - else .card-body-main-actions.p-0 diff --git a/app/views/users/reports/index.html.slim b/app/views/users/reports/index.html.slim index 3c7ba361aae..f80663e0794 100644 --- a/app/views/users/reports/index.html.slim +++ b/app/views/users/reports/index.html.slim @@ -4,4 +4,13 @@ = render 'users/page_title', user: @user = user_page_tabs(@user, active_tab: '日報') -= react_component('Reports', userId: @user.id, practices: @current_user_practice.sorted_practices) +- if admin_or_mentor_login? + nav.tab-nav(class="#{mentor_login? ? 'is-only-mentor' : ''}") + .container + ul.tab-nav__items + - targets = %w[all_reports unchecked_reports] + - targets.each do |target| + li.tab-nav__item + = link_to t("target.#{target}"), user_reports_path(@user, target:), class: (@target == target ? ['is-active'] : []) << 'tab-nav__item-link' + += react_component('Reports', userId: @user.id, practices: @current_user_practice.sorted_practices, unchecked: (@target == 'unchecked_reports')) diff --git a/config/locales/ja.yml b/config/locales/ja.yml index f4fd2bfcd32..8087352569b 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -467,6 +467,8 @@ ja: rails_course: Rails front_end_course: フロントエンド other_courses: その他 + all_reports: 全て + unchecked_reports: 未チェック invitation_role: adviser: アドバイザー trainee: 研修生(%{payment_method})