diff --git a/templates/learning-area/index.php b/templates/learning-area/index.php
index f19c720945..c8dec90381 100644
--- a/templates/learning-area/index.php
+++ b/templates/learning-area/index.php
@@ -63,11 +63,15 @@
$tutor_is_public_course = Course_List::is_public( $tutor_course_id );
$tutor_is_course_instructor = tutor_utils()->has_user_course_content_access( $current_user_id, $tutor_course_id );
-$tutor_is_started_quiz = tutor_utils()->is_started_quiz( $tutor_current_content_id );
-if ( tutor()->quiz_post_type === $tutor_current_post_type && $tutor_is_started_quiz ) {
- tutor_load_template( 'learning-area.quiz.attempt' );
- wp_footer();
- exit;
+$tutor_is_started_quiz = false;
+if ( tutor()->quiz_post_type === $tutor_current_post_type ) {
+ $tutor_is_started_quiz = tutor_utils()->is_started_quiz( $tutor_current_content_id );
+
+ if ( $tutor_is_started_quiz ) {
+ tutor_load_template( 'learning-area.quiz.attempt' );
+ wp_footer();
+ exit;
+ }
}
$attempt_id = Input::get( 'attempt_id', 0, Input::TYPE_INT );
diff --git a/templates/learning-area/quiz/attempt.php b/templates/learning-area/quiz/attempt.php
index a248b0f04e..31777b9a0f 100644
--- a/templates/learning-area/quiz/attempt.php
+++ b/templates/learning-area/quiz/attempt.php
@@ -14,6 +14,7 @@
use Tutor\Quiz;
use Tutor\Models\QuizModel;
+use TUTOR\Icon;
use Tutor\Components\Button;
use Tutor\Components\ConfirmationModal;
use Tutor\Components\Constants\Size;
@@ -21,21 +22,36 @@
global $tutor_is_started_quiz;
-$quiz_attempt_info = tutor_utils()->quiz_attempt_info( $tutor_is_started_quiz->attempt_info );
+// Quiz attempt data.
+$quiz_attempt_info = tutor_utils()->quiz_attempt_info( $tutor_is_started_quiz->attempt_info );
+$quiz_attempt_info['date_time_now'] = date( 'Y-m-d H:i:s', tutor_time() ); // phpcs:ignore WordPress.DateTime.RestrictedFunctions.date_date
-$quiz_attempt_info['date_time_now'] = date( 'Y-m-d H:i:s', tutor_time() );//phpcs:ignore
-$time_limit_seconds = tutor_utils()->avalue_dot( 'time_limit.time_limit_seconds', $quiz_attempt_info );
-$remaining_time_secs = ( strtotime( $tutor_is_started_quiz->attempt_started_at ) + $time_limit_seconds ) - strtotime( $quiz_attempt_info['date_time_now'] );
-$remaining_time_context = tutor_utils()->seconds_to_time_context( $remaining_time_secs );
-$quiz_when_time_expires = tutor_utils()->get_option( 'quiz_when_time_expires', 'auto_abandon' );
-$has_time_limit = $time_limit_seconds > 0;
-$questions = tutor_utils()->get_random_questions_by_quiz();
-$question_layout_view = tutor_utils()->get_quiz_option( $tutor_is_started_quiz->quiz_id, 'question_layout_view' );
-$question_layout_view = $question_layout_view ? $question_layout_view : 'single_question';
-$feedback_mode = tutor_utils()->get_quiz_option( $tutor_is_started_quiz->quiz_id, 'feedback_mode', '' );
-$reveal_wait_ms = 1000 * (int) tutor_utils()->get_option( 'quiz_answer_display_time' );
-$is_linear_layout = in_array( $question_layout_view, array( 'single_question', 'question_pagination' ), true );
-$show_previous_button = (bool) tutor_utils()->get_option( 'quiz_previous_button_enabled', true );
+// Time limit calculations.
+$time_limit_seconds = (int) tutor_utils()->avalue_dot( 'time_limit.time_limit_seconds', $quiz_attempt_info );
+$has_time_limit = $time_limit_seconds > 0;
+$remaining_time_secs = $has_time_limit
+ ? ( strtotime( $tutor_is_started_quiz->attempt_started_at ) + $time_limit_seconds ) - strtotime( $quiz_attempt_info['date_time_now'] )
+ : 0;
+$remaining_time_context = tutor_utils()->seconds_to_time_context( $remaining_time_secs );
+
+// Quiz settings.
+$quiz_when_time_expires = tutor_utils()->get_option( 'quiz_when_time_expires', 'auto_abandon' );
+$reveal_wait_ms = 1000 * (int) tutor_utils()->get_option( 'quiz_answer_display_time' );
+$show_previous_button = (bool) tutor_utils()->get_option( 'quiz_previous_button_enabled', true );
+
+// Quiz layout.
+$question_layout_view = tutor_utils()->get_quiz_option( $tutor_is_started_quiz->quiz_id, 'question_layout_view' );
+$feedback_mode = tutor_utils()->get_quiz_option( $tutor_is_started_quiz->quiz_id, 'feedback_mode', '' );
+$is_linear_layout = in_array( $question_layout_view, array( 'single_question', 'question_pagination' ), true );
+$is_pagination_layout = 'question_pagination' === $question_layout_view;
+
+// Pagination style — only applies to question_pagination layout.
+$supported_pagination_styles = array( 'shape', 'radio', 'number' );
+$pagination_style = tutor_utils()->get_quiz_option( $tutor_is_started_quiz->quiz_id, 'question_pagination_style', 'number' );
+
+// Questions and attempts.
+$questions = tutor_utils()->get_random_questions_by_quiz();
+$hide_question_number_overview = (bool) tutor_utils()->get_quiz_option( $tutor_is_started_quiz->quiz_id, 'hide_question_number_overview', false );
$reveal_question_types = array( 'true_false', 'single_choice', 'multiple_choice' );
$quiz_answers = array();
@@ -124,6 +140,7 @@ class="tutor-quiz tutor-quiz-submission"
'has_time_limit' => $has_time_limit,
'form_id' => $form_id,
'modal_id' => $modal_id,
+ 'total_questions' => count( $questions ),
)
);
?>
@@ -133,24 +150,27 @@ class="tutor-quiz-questions"
data-question-layout-view=""
x-cloak
>
-
-
diff --git a/templates/learning-area/quiz/progress-bar.php b/templates/learning-area/quiz/progress-bar.php
index da8da58a0e..4a2164315e 100644
--- a/templates/learning-area/quiz/progress-bar.php
+++ b/templates/learning-area/quiz/progress-bar.php
@@ -10,15 +10,19 @@
defined( 'ABSPATH' ) || exit;
+use TUTOR\Icon;
use Tutor\Components\Button;
use Tutor\Components\Constants\Variant;
-use TUTOR\Icon;
+
+global $tutor_is_started_quiz;
$remaining_time_secs = isset( $remaining_time_secs ) ? (int) $remaining_time_secs : 0;
$quiz_when_time_expires = $quiz_when_time_expires ?? 'auto_abandon';
$form_id = $form_id ?? '';
$modal_id = $modal_id ?? '';
$has_time_limit = isset( $has_time_limit ) ? (bool) $has_time_limit : $remaining_time_secs > 0;
+$total_questions = isset( $total_questions ) ? (int) $total_questions : 0;
+$quiz_title = get_the_title( $tutor_is_started_quiz->quiz_id );
?>
@@ -30,24 +34,66 @@ class="tutor-quiz-progress"
hasLimit: ,
expiresAction: '',
formId: '',
+ totalQuestions: ,
})"
x-init="init()"
>