page fixes
This commit is contained in:
@@ -59,6 +59,13 @@ import type {
|
||||
ParentProfileRecord,
|
||||
ContactSubmitResponse,
|
||||
CompetitionScoresEditResponse,
|
||||
CompetitionWinnerAdminActionResponse,
|
||||
CompetitionWinnerAdminFormResponse,
|
||||
CompetitionWinnerAdminIndexResponse,
|
||||
CompetitionWinnerAdminPreviewResponse,
|
||||
CompetitionWinnerAdminScoresResponse,
|
||||
CompetitionWinnerAdminWinnersResponse,
|
||||
CompetitionWinnerExportQuizResponse,
|
||||
CompetitionScoresIndexResponse,
|
||||
ExamDraftAdminResponse,
|
||||
PublicCompetitionIndexResponse,
|
||||
@@ -992,6 +999,98 @@ export async function fetchCompetitionScoresDetail(
|
||||
return apiFetch<CompetitionScoresEditResponse>(`/api/v1/competition-scores/${id}${query}`)
|
||||
}
|
||||
|
||||
export async function fetchAdminCompetitionWinnersIndex(): Promise<CompetitionWinnerAdminIndexResponse> {
|
||||
return apiFetch<CompetitionWinnerAdminIndexResponse>('/api/v1/competition-winners')
|
||||
}
|
||||
|
||||
export async function fetchAdminCompetitionWinnerCreate(): Promise<CompetitionWinnerAdminFormResponse> {
|
||||
return apiFetch<CompetitionWinnerAdminFormResponse>('/api/v1/competition-winners/create')
|
||||
}
|
||||
|
||||
export async function fetchAdminCompetitionWinnerSettings(id: number): Promise<CompetitionWinnerAdminFormResponse> {
|
||||
return apiFetch<CompetitionWinnerAdminFormResponse>(`/api/v1/competition-winners/${id}/settings`)
|
||||
}
|
||||
|
||||
export async function saveAdminCompetitionWinner(
|
||||
payload: {
|
||||
title: string
|
||||
class_section_id?: number | null
|
||||
semester?: string | null
|
||||
school_year?: string | null
|
||||
start_date?: string | null
|
||||
end_date?: string | null
|
||||
winner_overrides?: Record<string, number | string | null>
|
||||
question_counts?: Record<string, number | string | null>
|
||||
prizes?: Record<string, Record<string, number | string | null>>
|
||||
},
|
||||
id?: number,
|
||||
): Promise<CompetitionWinnerAdminActionResponse> {
|
||||
return apiFetch<CompetitionWinnerAdminActionResponse>(id ? `/api/v1/competition-winners/${id}` : '/api/v1/competition-winners', {
|
||||
method: id ? 'PUT' : 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
})
|
||||
}
|
||||
|
||||
export async function fetchAdminCompetitionWinnerScores(
|
||||
id: number,
|
||||
classSectionId?: number | null,
|
||||
): Promise<CompetitionWinnerAdminScoresResponse> {
|
||||
const query = classSectionId ? `?class_section_id=${encodeURIComponent(String(classSectionId))}` : ''
|
||||
return apiFetch<CompetitionWinnerAdminScoresResponse>(`/api/v1/competition-winners/${id}/scores${query}`)
|
||||
}
|
||||
|
||||
export async function saveAdminCompetitionWinnerScores(
|
||||
id: number,
|
||||
payload: { class_section_id?: number | null; scores: Record<string, number | string> },
|
||||
): Promise<{ ok: boolean; message?: string; savedCount?: number }> {
|
||||
return apiFetch<{ ok: boolean; message?: string; savedCount?: number }>(
|
||||
`/api/v1/competition-winners/${id}/scores`,
|
||||
{
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
export async function fetchAdminCompetitionWinnerPreview(id: number): Promise<CompetitionWinnerAdminPreviewResponse> {
|
||||
return apiFetch<CompetitionWinnerAdminPreviewResponse>(`/api/v1/competition-winners/${id}/preview`)
|
||||
}
|
||||
|
||||
export async function fetchAdminCompetitionWinnerWinners(id: number): Promise<CompetitionWinnerAdminWinnersResponse> {
|
||||
return apiFetch<CompetitionWinnerAdminWinnersResponse>(`/api/v1/competition-winners/${id}/winners`)
|
||||
}
|
||||
|
||||
export async function publishAdminCompetitionWinner(id: number): Promise<CompetitionWinnerAdminActionResponse> {
|
||||
return apiFetch<CompetitionWinnerAdminActionResponse>(`/api/v1/competition-winners/${id}/publish`, {
|
||||
method: 'POST',
|
||||
})
|
||||
}
|
||||
|
||||
export async function lockAdminCompetitionWinner(id: number): Promise<CompetitionWinnerAdminActionResponse> {
|
||||
return apiFetch<CompetitionWinnerAdminActionResponse>(`/api/v1/competition-winners/${id}/lock`, {
|
||||
method: 'POST',
|
||||
})
|
||||
}
|
||||
|
||||
export async function unlockAdminCompetitionWinner(id: number): Promise<CompetitionWinnerAdminActionResponse> {
|
||||
return apiFetch<CompetitionWinnerAdminActionResponse>(`/api/v1/competition-winners/${id}/unlock`, {
|
||||
method: 'POST',
|
||||
})
|
||||
}
|
||||
|
||||
export async function exportAdminCompetitionWinnerQuiz(
|
||||
id: number,
|
||||
payload?: { class_section_id?: number | null; semester?: string | null; school_year?: string | null },
|
||||
): Promise<CompetitionWinnerExportQuizResponse> {
|
||||
return apiFetch<CompetitionWinnerExportQuizResponse>(`/api/v1/competition-winners/${id}/export-quiz`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload ?? {}),
|
||||
})
|
||||
}
|
||||
|
||||
export async function saveCompetitionScores(
|
||||
id: number,
|
||||
payload: { class_section_id?: number | null; scores: Record<string, number | string> },
|
||||
|
||||
@@ -1058,6 +1058,119 @@ export type CompetitionScoresIndexResponse = {
|
||||
hasClasses?: boolean
|
||||
}
|
||||
|
||||
export type CompetitionWinnerAdminCompetitionRow = CompetitionScoresIndexCompetitionRow & {
|
||||
semester?: string | null
|
||||
school_year?: string | null
|
||||
start_date?: string | null
|
||||
end_date?: string | null
|
||||
published_at?: string | null
|
||||
locked_at?: string | null
|
||||
}
|
||||
|
||||
export type CompetitionWinnerAdminIndexResponse = {
|
||||
ok: boolean
|
||||
competitions?: CompetitionWinnerAdminCompetitionRow[]
|
||||
sectionMap?: Record<string, string>
|
||||
message?: string
|
||||
}
|
||||
|
||||
export type CompetitionWinnerAdminClassSectionRow = {
|
||||
class_section_id?: number
|
||||
class_section_name?: string | null
|
||||
}
|
||||
|
||||
export type CompetitionWinnerAdminClassRow = {
|
||||
class_section_id: number
|
||||
class_section_name: string
|
||||
student_count: number
|
||||
auto_winners: number
|
||||
override_winners?: number | null
|
||||
final_winners: number
|
||||
question_count?: number | null
|
||||
prize_1?: number | null
|
||||
prize_2?: number | null
|
||||
prize_3?: number | null
|
||||
prize_4?: number | null
|
||||
prize_5?: number | null
|
||||
prize_6?: number | null
|
||||
}
|
||||
|
||||
export type CompetitionWinnerAdminFormResponse = {
|
||||
ok: boolean
|
||||
mode?: 'create' | 'edit'
|
||||
competition?: PublicCompetitionRow | null
|
||||
classSections?: CompetitionWinnerAdminClassSectionRow[]
|
||||
classRows?: CompetitionWinnerAdminClassRow[]
|
||||
defaultSemester?: string | null
|
||||
defaultSchoolYear?: string | null
|
||||
message?: string
|
||||
}
|
||||
|
||||
export type CompetitionWinnerAdminActionResponse = {
|
||||
ok: boolean
|
||||
id?: number
|
||||
message?: string
|
||||
}
|
||||
|
||||
export type CompetitionWinnerAdminScoresResponse = {
|
||||
ok: boolean
|
||||
competition?: PublicCompetitionRow
|
||||
students?: CompetitionScoreStudentRow[]
|
||||
scoreMap?: Record<string, number | string>
|
||||
classSections?: CompetitionWinnerAdminClassSectionRow[]
|
||||
activeClassSectionId?: number
|
||||
classSectionName?: string | null
|
||||
classSelectionLocked?: boolean
|
||||
classStudentCount?: number
|
||||
classAutoWinners?: number
|
||||
classOverrideWinners?: number | null
|
||||
classFinalWinners?: number
|
||||
classQuestionCount?: number | null
|
||||
classPrizeMap?: Record<string, number | null>
|
||||
message?: string
|
||||
}
|
||||
|
||||
export type CompetitionWinnerPreviewStudentRow = {
|
||||
student_id?: number
|
||||
name?: string | null
|
||||
score?: number | string | null
|
||||
rank?: number
|
||||
prize_amount?: number | string | null
|
||||
}
|
||||
|
||||
export type CompetitionWinnerAdminPreviewResponse = {
|
||||
ok: boolean
|
||||
competition?: PublicCompetitionRow
|
||||
classMap?: Record<string, string>
|
||||
classCounts?: Record<string, number>
|
||||
overrideMap?: Record<string, number>
|
||||
questionCounts?: Record<string, number>
|
||||
prizeMap?: Record<string, Record<string, number | null>>
|
||||
winnersCountByClass?: Record<string, number>
|
||||
rankedByClass?: Record<string, CompetitionWinnerPreviewStudentRow[]>
|
||||
topByClass?: Record<string, CompetitionWinnerPreviewStudentRow[]>
|
||||
message?: string
|
||||
}
|
||||
|
||||
export type CompetitionWinnerAdminWinnerRow = PublicCompetitionWinnerRow & {
|
||||
school_id?: string | null
|
||||
photo_consent?: number | boolean | null
|
||||
}
|
||||
|
||||
export type CompetitionWinnerAdminWinnersResponse = {
|
||||
ok: boolean
|
||||
competition?: PublicCompetitionRow
|
||||
rows?: CompetitionWinnerAdminWinnerRow[]
|
||||
sectionMap?: Record<string, string>
|
||||
message?: string
|
||||
}
|
||||
|
||||
export type CompetitionWinnerExportQuizResponse = {
|
||||
ok: boolean
|
||||
message?: string
|
||||
quizIndexes?: Record<string, number>
|
||||
}
|
||||
|
||||
export type CompetitionScoreStudentRow = {
|
||||
id?: number
|
||||
student_id?: number
|
||||
|
||||
Reference in New Issue
Block a user