Add breadcrumbs and UI consistency updates across backoffice templates

This commit is contained in:
2026-03-09 22:37:24 +01:00
parent 45f11f3564
commit b6a227febe
19 changed files with 298 additions and 153 deletions
+97
View File
@@ -68,4 +68,101 @@ class Quiz
return $this;
}
/**
* Get errors for all questions in the quiz.
* Returns an array where keys are question IDs and values are error messages.
* @return array<string, string>
*/
public function getQuestionErrors(): array
{
$errors = [];
// Check if any answer in the entire quiz has candidate relations
$hasCandidateRelations = false;
foreach ($this->questions as $question) {
foreach ($question->answers as $answer) {
if ($answer->candidates->count() > 0) {
$hasCandidateRelations = true;
break 2;
}
}
}
foreach ($this->questions as $question) {
$error = $this->getQuestionError($question, $hasCandidateRelations);
if ($error !== null) {
$errors[$question->id->toString()] = $error;
}
}
return $errors;
}
private function getQuestionError(Question $question, bool $hasCandidateRelations): ?string
{
if (0 === \count($question->answers)) {
return 'This question has no answers';
}
$correctAnswers = $question->answers->filter(static fn (Answer $answer): bool => $answer->isRightAnswer)->count();
if (0 === $correctAnswers) {
return 'This question has no correct answers';
}
if ($correctAnswers > 1) {
return 'This question has multiple correct answers';
}
// Only validate candidate-answer relations if at least one exists in the quiz
if ($hasCandidateRelations) {
$seasonCandidates = $this->season->candidates;
$candidateCounts = [];
// Count how many times each candidate appears in answers
foreach ($question->answers as $answer) {
foreach ($answer->candidates as $candidate) {
$candidateId = $candidate->id->toString();
if (!isset($candidateCounts[$candidateId])) {
$candidateCounts[$candidateId] = ['name' => $candidate->name, 'count' => 0];
}
$candidateCounts[$candidateId]['count']++;
}
}
// Check for missing and duplicate candidates
$missing = [];
$duplicates = [];
foreach ($seasonCandidates as $candidate) {
$candidateId = $candidate->id->toString();
$count = $candidateCounts[$candidateId]['count'] ?? 0;
if ($count === 0) {
$missing[] = $candidate->name;
} elseif ($count > 1) {
$duplicates[] = $candidate->name;
}
}
if (!empty($missing) || !empty($duplicates)) {
$errors = [];
if (!empty($missing)) {
// If all candidates are missing, show a special message
if (count($missing) === $seasonCandidates->count()) {
$errors[] = 'No candidates assigned to this question';
} else {
$errors[] = 'Missing candidates: ' . implode(', ', $missing);
}
}
if (!empty($duplicates)) {
$errors[] = 'Duplicate candidates: ' . implode(', ', $duplicates);
}
return implode('. ', $errors);
}
}
return null;
}
}