From 4cd94ae0052e40823a544643b28655b3d2bb39d9 Mon Sep 17 00:00:00 2001 From: Brian Hogg Date: Mon, 16 Dec 2024 09:19:01 -0500 Subject: [PATCH 1/4] Fix start date error (#2811) * Check if there is a start date before showing the course opens message. --- .changelogs/fix_start-date-error.yml | 5 +++++ templates/content-single-course-before.php | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .changelogs/fix_start-date-error.yml diff --git a/.changelogs/fix_start-date-error.yml b/.changelogs/fix_start-date-error.yml new file mode 100644 index 0000000000..730fe362b8 --- /dev/null +++ b/.changelogs/fix_start-date-error.yml @@ -0,0 +1,5 @@ +significance: patch +type: fixed +links: + - "#2810" +entry: Avoid showing course opens message if no Course Start Date has been set. diff --git a/templates/content-single-course-before.php b/templates/content-single-course-before.php index 5ffbb9c667..95c7b82434 100644 --- a/templates/content-single-course-before.php +++ b/templates/content-single-course-before.php @@ -17,7 +17,7 @@ if ( 'yes' === $course->get( 'time_period' ) ) { // If the start date hasn't passed yet. - if ( ! $course->has_date_passed( 'start_date' ) ) { + if ( $course->get( 'start_date' ) && ! $course->has_date_passed( 'start_date' ) ) { llms_add_notice( $course->get( 'course_opens_message' ), 'notice' ); @@ -30,4 +30,3 @@ llms_print_notices(); do_action( 'lifterlms_single_course_before_summary' ); - From 85976a0f140f4c16e109a72d1899b2c05d3a83be Mon Sep 17 00:00:00 2001 From: Brian Hogg Date: Mon, 16 Dec 2024 09:38:28 -0500 Subject: [PATCH 2/4] Additional lesson preview accessibility (#2828) * Adding screen reader text. Marking link as disabled. --- .changelogs/lesson-preview-accessibility.yml | 6 ++++++ assets/js/app/llms-lesson-preview.js | 7 ++++++- packages/llms-e2e-test-utils/src/import-course.js | 6 +++--- templates/course/lesson-preview.php | 6 ++++-- 4 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 .changelogs/lesson-preview-accessibility.yml diff --git a/.changelogs/lesson-preview-accessibility.yml b/.changelogs/lesson-preview-accessibility.yml new file mode 100644 index 0000000000..6b63b33f17 --- /dev/null +++ b/.changelogs/lesson-preview-accessibility.yml @@ -0,0 +1,6 @@ +significance: patch +type: fixed +links: + - "#2827" +entry: Improved accessibility of the lessons listing on a course page, when a + lesson is restricted. diff --git a/assets/js/app/llms-lesson-preview.js b/assets/js/app/llms-lesson-preview.js index dd6ca7974d..c872dc7eb4 100644 --- a/assets/js/app/llms-lesson-preview.js +++ b/assets/js/app/llms-lesson-preview.js @@ -109,7 +109,12 @@ LLMS.LessonPreview = { */ get_tooltip: function( msg ) { var $el = $( '
' ); - $el.append( '
' + msg + '
' ); + $el.append( + $('
', { + 'class': 'llms-tooltip-content', + 'aria-hidden': 'true' + }).text( msg ) + ); return $el; }, diff --git a/packages/llms-e2e-test-utils/src/import-course.js b/packages/llms-e2e-test-utils/src/import-course.js index 11485743f5..691fee1864 100644 --- a/packages/llms-e2e-test-utils/src/import-course.js +++ b/packages/llms-e2e-test-utils/src/import-course.js @@ -2,7 +2,7 @@ import { clickAndWait } from './click-and-wait'; // External dependencies. -import { visitAdminPage } from '@wordpress/e2e-test-utils'; +import { visitAdminPage, clickButton } from '@wordpress/e2e-test-utils'; /** * Import a course JSON file @@ -28,7 +28,7 @@ export async function importCourse( await visitAdminPage( 'admin.php', 'page=llms-import' ); // Upload button - await page.click( '.llms-setting-group.top button.llms-button-primary' ); + await clickButton('Upload'); const inputSelector = 'input[name="llms_import"]'; await page.waitForSelector( inputSelector ); @@ -37,7 +37,7 @@ export async function importCourse( fileUpload.uploadFile( file ); await page.waitForTimeout( 1000 ); - await clickAndWait( '#llms-import-file-submit' ); + await clickButton( 'Import' ); if ( navigate ) { await clickAndWait( '.llms-admin-notice.notice-success a' ); diff --git a/templates/course/lesson-preview.php b/templates/course/lesson-preview.php index 15ed7cd36f..3aa2ca8c19 100644 --- a/templates/course/lesson-preview.php +++ b/templates/course/lesson-preview.php @@ -19,11 +19,10 @@ defined( 'ABSPATH' ) || exit; $restrictions = llms_page_restricted( $lesson->get( 'id' ), get_current_user_id() ); -$data_msg = $restrictions['is_restricted'] ? ' data-tooltip-msg="' . esc_html( strip_tags( llms_get_restriction_message( $restrictions ) ) ) . '"' : ''; ?> From b684f6b99540374afb12e6e058d3bcbd36ca5ccd Mon Sep 17 00:00:00 2001 From: Brian Hogg Date: Mon, 16 Dec 2024 10:08:19 -0500 Subject: [PATCH 3/4] Fix for daylight savings and leap years when scheduling engagements (#2800) * Use datetime vs. adding seconds to account for daylight savings and leap years. --- ...daylight-savings-when-scheduling-engagements.yml | 5 +++++ includes/class.llms.engagements.php | 13 +------------ 2 files changed, 6 insertions(+), 12 deletions(-) create mode 100644 .changelogs/fix_daylight-savings-when-scheduling-engagements.yml diff --git a/.changelogs/fix_daylight-savings-when-scheduling-engagements.yml b/.changelogs/fix_daylight-savings-when-scheduling-engagements.yml new file mode 100644 index 0000000000..262d512fdd --- /dev/null +++ b/.changelogs/fix_daylight-savings-when-scheduling-engagements.yml @@ -0,0 +1,5 @@ +significance: patch +type: fixed +links: + - "#2799" +entry: Fix for daylight savings and leap years when scheduling engagements. diff --git a/includes/class.llms.engagements.php b/includes/class.llms.engagements.php index 8481809cd1..9c44b485e2 100644 --- a/includes/class.llms.engagements.php +++ b/includes/class.llms.engagements.php @@ -104,7 +104,6 @@ private function add_actions() { } add_action( 'deleted_post', array( $this, 'unschedule_delayed_engagements' ), 20, 2 ); - } /** @@ -208,7 +207,6 @@ private function get_engagements( $trigger_type, $related_post_id = '' ) { * @param int $related_post_id WP_Post ID of the related post. */ return apply_filters( 'lifterlms_get_engagements', $results, $trigger_type, $related_post_id ); - } /** @@ -249,7 +247,6 @@ protected function get_trigger_hooks() { * @param string[] $hooks List of hook names. */ return apply_filters( 'lifterlms_engagement_actions', $hooks ); - } /** @@ -405,7 +402,6 @@ private function parse_hook( $action, $args ) { $parsed['related_post_id'] = $related_post_id; return $parsed; - } /** @@ -450,7 +446,6 @@ private function parse_hook_find_trigger_type( $action, $related_post_id ) { } return $trigger_type; - } /** @@ -485,7 +480,6 @@ public function maybe_trigger_engagement() { $this->trigger_engagement( $handler, $engagement->delay ); } - } /** @@ -570,7 +564,6 @@ private function parse_engagement( $engagement, $trigger_data ) { ); return $parsed; - } /** @@ -594,7 +587,7 @@ private function trigger_engagement( $data, $delay ) { if ( $delay ) { as_schedule_single_action( - time() + ( DAY_IN_SECONDS * $delay ), + current_datetime()->modify( "+{$delay} days" )->getTimestamp(), $data['handler_action'], array( $data['handler_args'] ), ! empty( $data['handler_args'][3] ) ? $this->get_delayed_group_id( $data['handler_args'][3] ) : null @@ -616,7 +609,6 @@ private function trigger_engagement( $data, $delay ) { remove_filter( 'llms_skip_engagement_processing_checks', '__return_true' ); } - } /** @@ -640,7 +632,6 @@ public function unschedule_delayed_engagements( $post_id, $post = null ) { if ( 'llms_engagement' === $post_type ) { as_unschedule_all_actions( '', array(), $this->get_delayed_group_id( $post_id ) ); } - } /** @@ -660,7 +651,5 @@ public function log( $log ) { if ( $this->debug ) { llms_log( $log, 'engagements' ); } - } - } From 0c6e64b33a90e31b9f2d873517bbcebc3d971a83 Mon Sep 17 00:00:00 2001 From: Brian Hogg Date: Mon, 16 Dec 2024 10:16:39 -0500 Subject: [PATCH 4/4] Additional quiz attempt key check (#2825) * Adding additional check for attempt fetching. --- .changelogs/additional-attempt-check.yml | 5 +++++ includes/class.llms.ajax.handler.php | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 .changelogs/additional-attempt-check.yml diff --git a/.changelogs/additional-attempt-check.yml b/.changelogs/additional-attempt-check.yml new file mode 100644 index 0000000000..b7dc830ca4 --- /dev/null +++ b/.changelogs/additional-attempt-check.yml @@ -0,0 +1,5 @@ +significance: patch +type: fixed +links: + - "#2824" +entry: Adds additional check for valid quiz attempt key when ending or exiting a quiz. diff --git a/includes/class.llms.ajax.handler.php b/includes/class.llms.ajax.handler.php index 3085e0579e..ed7baa4b62 100644 --- a/includes/class.llms.ajax.handler.php +++ b/includes/class.llms.ajax.handler.php @@ -947,6 +947,10 @@ public static function quiz_end( $request, $attempt = null ) { $attempt = $student->quizzes()->get_attempt_by_key( sanitize_text_field( $request['attempt_key'] ) ); + if ( ! $attempt ) { + $err->add( 404, __( 'The requested attempt could not be found.', 'lifterlms' ) ); + return $err; + } } // Record the attempt's completion.