Skip to content

Commit 4b0793f

Browse files
Review changes
1 parent 2513624 commit 4b0793f

File tree

5 files changed

+67
-3
lines changed

5 files changed

+67
-3
lines changed

app/controllers/admin_controller.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,24 @@ def check_competition_results
3636
@competition = competition_from_params
3737
end
3838

39+
def clear_results_submission
40+
# Just clear the "results_submitted_at" field to let the Delegate submit
41+
# the results again. We don't actually want to clear InboxResult and InboxPerson.
42+
@competition = competition_from_params
43+
44+
if @competition.results_submitted? && !@competition.results_posted?
45+
ActiveRecord::Base.transaction do
46+
@competition.update!(results_submitted_at: nil)
47+
@competition.tickets_competition_result.update!(status: TicketsCompetitionResult.statuses[:aborted])
48+
end
49+
render status: :ok, json: { success: true }
50+
else
51+
render status: :unprocessable_entity, json: {
52+
error: "Could not clear the results submission. Maybe results are already posted, or there is no submission.",
53+
}
54+
end
55+
end
56+
3957
# The order of this array has to follow the steps in which results have to be imported.
4058
RESULTS_POSTING_STEPS = %i[inbox_result inbox_person].freeze
4159

app/webpacker/components/Tickets/TicketWorkbenches/CompetitionResultActionerView/MiscActions/AbortProcess.jsx

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,48 @@
11
import React, { useState } from 'react';
22
import { Button, Confirm, Popup } from 'semantic-ui-react';
3+
import { useMutation, useQueryClient } from '@tanstack/react-query';
34
import { ticketsCompetitionResultStatuses } from '../../../../../lib/wca-data.js.erb';
5+
import clearResultsSubmission from '../../../api/competitionResult/clearResultsSubmission';
6+
import Loading from '../../../../Requests/Loading';
7+
import Errored from '../../../../Requests/Errored';
48

5-
export default function AbortProcess({ ticketDetails, updateStatus }) {
6-
const { ticket: { metadata: { status } } } = ticketDetails;
9+
export default function AbortProcess({ ticketDetails }) {
10+
const { ticket: { id, metadata: { status, competition_id: competitionId } } } = ticketDetails;
711
const [confirmAbort, setConfirmAbort] = useState();
812

13+
const queryClient = useQueryClient();
14+
const {
15+
mutate: clearResultsSubmissionMutate,
16+
isPending,
17+
isError,
18+
error,
19+
} = useMutation({
20+
mutationFn: clearResultsSubmission,
21+
onSuccess: () => queryClient.setQueryData(
22+
['ticket-details', id],
23+
(oldTicketDetails) => ({
24+
...oldTicketDetails,
25+
ticket: {
26+
...oldTicketDetails.ticket,
27+
metadata: {
28+
...oldTicketDetails.ticket.metadata,
29+
status: ticketsCompetitionResultStatuses.aborted,
30+
},
31+
},
32+
}),
33+
),
34+
});
35+
936
// Result Process can be aborted before the inbox results are merged.
1037
const canAbort = [
1138
ticketsCompetitionResultStatuses.submitted,
1239
ticketsCompetitionResultStatuses.locked_for_posting,
1340
ticketsCompetitionResultStatuses.warnings_verified,
1441
].includes(status);
1542

43+
if (isPending) return <Loading />;
44+
if (isError) return <Errored error={error} />;
45+
1646
return (
1747
<>
1848
<Popup
@@ -32,7 +62,10 @@ export default function AbortProcess({ ticketDetails, updateStatus }) {
3262
<Confirm
3363
open={confirmAbort}
3464
onCancel={() => setConfirmAbort(false)}
35-
onConfirm={() => updateStatus(ticketsCompetitionResultStatuses.aborted)}
65+
onConfirm={() => {
66+
setConfirmAbort(false);
67+
clearResultsSubmissionMutate({ competitionId });
68+
}}
3669
content="Are you sure you want to abort the process and allow Delegates to resubmit results?"
3770
/>
3871
</>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { fetchJsonOrError } from '../../../../lib/requests/fetchWithAuthenticityToken';
2+
import { clearResultsSubmissionUrl } from '../../../../lib/requests/routes.js.erb';
3+
4+
export default async function clearResultsSubmission({ competitionId }) {
5+
const { data } = await fetchJsonOrError(
6+
clearResultsSubmissionUrl(competitionId),
7+
{ method: 'POST' },
8+
);
9+
return data;
10+
}

app/webpacker/lib/requests/routes.js.erb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ export const adminPostingCompetitionsUrl = `<%= CGI.unescape(Rails.application.r
152152

153153
export const adminStartPostingUrl = `<%= CGI.unescape(Rails.application.routes.url_helpers.start_posting_path) %>`;
154154

155+
export const clearResultsSubmissionUrl = (competitionId) => `<%= CGI.unescape(Rails.application.routes.url_helpers.competition_clear_results_submission_path("${competitionId}")) %>`;
156+
155157
export const adminImportResultsUrl = (competitionId) => `<%= CGI.unescape(Rails.application.routes.url_helpers.competition_admin_import_results_path("${competitionId}")) %>`;
156158

157159
export const adminCheckUploadedResults = (competitionId) => `<%= CGI.unescape(Rails.application.routes.url_helpers.competition_admin_upload_results_edit_path("${competitionId}"))%>`;

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
# WRT views and action
126126
get '/admin/upload-results' => "admin#new_results", as: :admin_upload_results_edit
127127
get '/admin/check-existing-results' => "admin#check_competition_results", as: :admin_check_existing_results
128+
post '/admin/clear-submission' => "admin#clear_results_submission", as: :clear_results_submission
128129
get '/admin/import-results' => 'admin#import_results', as: :admin_import_results
129130
get '/admin/result-inbox-steps' => 'admin#result_inbox_steps', as: :admin_result_inbox_steps
130131
post '/admin/import-inbox-results' => 'admin#import_inbox_results', as: :admin_import_inbox_results

0 commit comments

Comments
 (0)