Skip to main content

Competitions

Manage co-curricular competitions — add participants, record results.

Get Competitions

GET /teacher/co-curricular/get-competition
{
"data": {
"competitions": [
{
"id": "uuid",
"name": "State Level Science Fair",
"category": "SCIENCE",
"level": "STATE",
"date": "2024-03-15",
"venue": "Delhi Public School",
"status": "COMPLETED"
}
]
}
}

Get List by Type

GET /teacher/co-curricular/get-list?type={category}

Categories: SCIENCE, SPORTS, CULTURAL, ART, QUIZ, TECHNICAL

Add Competition

POST /teacher/co-curricular/add-competition
{
"data": {
"name": "Inter-School Debate",
"category": "CULTURAL",
"level": "DISTRICT",
"date": "2024-05-20",
"venue": "City Hall"
}
}

Update Competition

PUT /teacher/co-curricular/update-competition

Get Class-Wise Participants

GET /teacher/co-curricular/get-class-wise-participants?competitionId={uuid}

Add Results

POST /teacher/co-curricular/add-results/{competitionId}
{
"data": {
"results": [
{ "studentId": "uuid", "position": "First" },
{ "studentId": "uuid", "position": "Second" }
]
}
}

UI — Competition Card

class CompetitionCard extends StatelessWidget {
final Competition competition;

@override
Widget build(BuildContext context) {
return Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: double.infinity,
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: _categoryColor(competition.category).withOpacity(0.1),
borderRadius: const BorderRadius.vertical(top: Radius.circular(12)),
),
child: Row(
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: _categoryColor(competition.category),
borderRadius: BorderRadius.circular(4),
),
child: Text(competition.category,
style: const TextStyle(color: Colors.white, fontSize: 10)),
),
const SizedBox(width: 8),
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(4),
),
child: Text(competition.level, style: const TextStyle(fontSize: 10)),
),
],
),
),
Padding(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(competition.name, style: const TextStyle(fontWeight: FontWeight.bold)),
Text('${competition.date} • ${competition.venue}'),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: () => _viewParticipants(competition),
child: const Text('View Participants'),
),
ElevatedButton(
onPressed: () => _addResults(competition),
child: const Text('Add Results'),
),
],
),
],
),
),
],
),
);
}
}