Skip to content

Commit 831d146

Browse files
Exercise: Add pending corrections indicator to exercise list view - refs #3480
Author: @christianbeeznest
1 parent 940701f commit 831d146

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

public/main/exercise/exercise.class.php

+19
Original file line numberDiff line numberDiff line change
@@ -8792,6 +8792,13 @@ public static function exerciseGridResource(
87928792

87938793
$repo = Container::getQuizRepository();
87948794

8795+
$trackEExerciseRepo = Container::getTrackEExerciseRepository();
8796+
$pendingCorrections = $trackEExerciseRepo->getPendingCorrectionsByExercise($courseId);
8797+
$pendingAttempts = [];
8798+
foreach ($pendingCorrections as $correction) {
8799+
$pendingAttempts[$correction['exerciseId']] = $correction['pendingCount'];
8800+
}
8801+
87958802
// 2. Get query builder from repo.
87968803
$qb = $repo->getResourcesByCourse($course, $session);
87978804

@@ -9027,6 +9034,18 @@ public static function exerciseGridResource(
90279034
$url .= Display::div($embeddableIcon, ['class' => 'pull-right']);
90289035
}
90299036

9037+
$pendingCount = $pendingAttempts[$exerciseId] ?? 0;
9038+
if ($pendingCount > 0) {
9039+
$pendingIcon = Display::getMdiIcon(
9040+
ActionIcon::ALERT->value,
9041+
'ch-tool-icon',
9042+
null,
9043+
ICON_SIZE_SMALL,
9044+
get_lang('Pending attempts') . ": $pendingCount"
9045+
);
9046+
$url .= " $pendingIcon";
9047+
}
9048+
90309049
$currentRow['title'] = $url.$lp_blocked;
90319050
$rowi = $exerciseEntity->getQuestions()->count();
90329051
if ($allowToEditBaseCourse || $allowToEditSession) {

src/CoreBundle/Repository/TrackEExerciseRepository.php

+17
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,21 @@ public function delete(TrackEExercise $track): void
2222
$this->getEntityManager()->remove($track);
2323
$this->getEntityManager()->flush();
2424
}
25+
26+
/**
27+
* Get exercises with pending corrections grouped by exercise ID.
28+
*/
29+
public function getPendingCorrectionsByExercise(int $courseId): array
30+
{
31+
$qb = $this->createQueryBuilder('te');
32+
33+
$qb->select('IDENTITY(te.quiz) AS exerciseId, COUNT(te.exeId) AS pendingCount')
34+
->where('te.status = :status')
35+
->andWhere('te.course = :courseId')
36+
->setParameter('status', 'incomplete')
37+
->setParameter('courseId', $courseId)
38+
->groupBy('te.quiz');
39+
40+
return $qb->getQuery()->getResult();
41+
}
2542
}

0 commit comments

Comments
 (0)