Fix registration approve/reject endpoints and display
continuous-integration/drone/push Build is passing Details

- Fix approve/reject API URLs (add /competitions prefix, send empty JSON body)
- Fix pending count in HUD (use pending_registrations field)
- Fix registration name display (show member names for individuals)
- Add pending_registrations to Competition type
master
Guillermo Pages 1 week ago
parent c9f153c345
commit ff96b5807c

@ -343,7 +343,7 @@ export default function CompetitionDetailComponent({
<div>
<p className="text-xs text-slate-500">Registrations</p>
<p className="text-sm font-medium text-slate-800">
{competition.registration_count ?? 0} pending
{competition.pending_registrations ?? 0} pending
</p>
</div>
</div>

@ -82,7 +82,10 @@ function RegistrationRow({
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2">
<h4 className="font-semibold text-slate-800 truncate">
{registration.team_name || registration.display_name}
{registration.team_name ||
registration.members?.map((m) => m.display_name).join(', ') ||
registration.display_name ||
'Unknown'}
</h4>
<span className={`inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full ${config.bgColor} ${config.textColor}`}>
<StatusIcon className="w-3 h-3" />
@ -90,12 +93,15 @@ function RegistrationRow({
</span>
</div>
<div className="flex flex-wrap items-center gap-2 mt-1 text-sm text-slate-600">
{registration.members && registration.members.length > 0 && (
<span>
{registration.members.map((m) => m.display_name).join(', ')}
</span>
{/* Show member names below only for teams (individuals already have member name as title) */}
{registration.team_name && registration.members && registration.members.length > 0 && (
<>
<span>
{registration.members.map((m) => m.display_name).join(', ')}
</span>
<span className="text-slate-400"></span>
</>
)}
<span className="text-slate-400"></span>
<span>{formatDate(registration.created_at)}</span>
</div>
{registration.notes && (

@ -491,7 +491,7 @@ export async function listRegistrations(
}
/**
* POST /competitions/{competition_id}/registrations/{registration_id}/approve
* POST /competitions/registrations/{registration_id}/approve
* Approve a registration
*/
export async function approveRegistration(
@ -499,11 +499,14 @@ export async function approveRegistration(
registrationId: number
): Promise<CompetitionApiResult<{ participant_id: number }>> {
try {
// Note: competitionId is kept for API consistency but not used in URL
void competitionId;
const response = await apiFetch(
`/competitions/${competitionId}/registrations/${registrationId}/approve`,
`/competitions/registrations/${registrationId}/approve`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({}),
}
);
@ -514,7 +517,7 @@ export async function approveRegistration(
}
/**
* POST /competitions/{competition_id}/registrations/{registration_id}/reject
* POST /competitions/registrations/{registration_id}/reject
* Reject a registration
*/
export async function rejectRegistration(
@ -522,11 +525,14 @@ export async function rejectRegistration(
registrationId: number
): Promise<CompetitionApiResult<void>> {
try {
// Note: competitionId is kept for API consistency but not used in URL
void competitionId;
const response = await apiFetch(
`/competitions/${competitionId}/registrations/${registrationId}/reject`,
`/competitions/registrations/${registrationId}/reject`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({}),
}
);

@ -87,6 +87,7 @@ export interface Competition {
stages?: CompetitionStage[];
participant_count?: number;
registration_count?: number;
pending_registrations?: number;
}
export interface CreateCompetitionRequest {

Loading…
Cancel
Save