diff --git a/backend/reviews/admin.py b/backend/reviews/admin.py index 1549a6d329..cb22c3bf78 100644 --- a/backend/reviews/admin.py +++ b/backend/reviews/admin.py @@ -33,7 +33,7 @@ from grants.models import Grant, GrantReimbursement, GrantReimbursementCategory from participants.models import Participant from reviews.models import AvailableScoreOption, ReviewSession, UserReview -from submissions.models import Submission, SubmissionTag +from submissions.models import Submission, SubmissionTag, SubmissionType from users.admin_mixins import ConferencePermissionMixin from users.models import User @@ -602,6 +602,7 @@ def _review_proposals_recap_view(self, request, review_session): grants=grants, review_session_id=review_session_id, audience_levels=conference.audience_levels.all(), + submission_types=SubmissionType.objects.all(), review_session_repr=str(review_session), all_statuses=[choice for choice in Submission.STATUS], title="Recap", diff --git a/backend/reviews/templates/proposals-recap.html b/backend/reviews/templates/proposals-recap.html index f22ba08e20..3f254a2756 100644 --- a/backend/reviews/templates/proposals-recap.html +++ b/backend/reviews/templates/proposals-recap.html @@ -205,56 +205,61 @@ }); const filterWithReviewsSelect = document.querySelector('#filter-with-n-reviews'); - filterWithReviewsSelect.addEventListener('change', e => { - e.preventDefault(); + const filterByStatusInputs = [...document.querySelectorAll('input[name="filter-by-status"]')]; + const filterByTypeInputs = [...document.querySelectorAll('input[name="filter-by-type"]')]; + + const applyFilters = () => { + const reviewsFilterValue = filterWithReviewsSelect.value; - const filterValue = parseInt(e.target.value, 10); + const visibleStatuses = filterByStatusInputs.filter( + input => input.checked + ).map( + input => input.value + ); + + const visibleTypes = filterByTypeInputs.filter( + input => input.checked + ).map( + input => parseInt(input.value, 10) + ); document.querySelectorAll('.proposal-item').forEach( proposalRow => { - if (e.target.value === 'all') { - proposalRow.classList.remove('hidden') - return; - } - const proposalId = parseInt(proposalRow.id.split('-')[1], 10); const proposalData = submissionsById[proposalId]; - const numOfVotes = proposalData.numOfVotes; - if (numOfVotes === filterValue) { + const reviewsMatch = reviewsFilterValue === 'all' || proposalData.numOfVotes === parseInt(reviewsFilterValue, 10); + const statusMatch = visibleStatuses.includes(proposalData.originalStatus); + const typeMatch = visibleTypes.includes(proposalData.typeId); + + if (reviewsMatch && statusMatch && typeMatch) { proposalRow.classList.remove('hidden') } else { proposalRow.classList.add('hidden') } } - ) + ); + }; + + filterWithReviewsSelect.addEventListener('change', e => { + e.preventDefault(); + applyFilters(); }); - const filterByStatusInputs = [...document.querySelectorAll('input[name="filter-by-status"]')]; filterByStatusInputs.forEach( filterByStatusInput => { filterByStatusInput.addEventListener('change', e => { e.preventDefault(); + applyFilters(); + }); + } + ); - const filterValue = e.target.value; - const visibleStatuses = filterByStatusInputs.filter( - input => input.checked - ).map( - input => input.value - ); - - document.querySelectorAll('.proposal-item').forEach( - proposalRow => { - const proposalId = parseInt(proposalRow.id.split('-')[1], 10); - const proposalData = submissionsById[proposalId]; - - if (visibleStatuses.includes(proposalData.originalStatus)) { - proposalRow.classList.remove('hidden') - } else { - proposalRow.classList.add('hidden') - } - } - ); + filterByTypeInputs.forEach( + filterByTypeInput => { + filterByTypeInput.addEventListener('change', e => { + e.preventDefault(); + applyFilters(); }); } ); @@ -352,6 +357,17 @@