From c2f8d4987664bf59c02171c18770d55638e1ea6d Mon Sep 17 00:00:00 2001 From: Christian Beeznest Date: Mon, 26 Jan 2026 15:06:58 -0500 Subject: [PATCH] Session: Enable session duplication with session-specific content - refs BT#22254 --- public/main/inc/lib/course.lib.php | 76 +++++++++++++++---- public/main/session/session_list.php | 22 +++++- .../Component/CourseCopy/CourseBuilder.php | 5 +- 3 files changed, 82 insertions(+), 21 deletions(-) diff --git a/public/main/inc/lib/course.lib.php b/public/main/inc/lib/course.lib.php index 9574277da02..d16fdddbb76 100644 --- a/public/main/inc/lib/course.lib.php +++ b/public/main/inc/lib/course.lib.php @@ -4375,25 +4375,69 @@ public static function copy_course( bool $withBaseContent = true, bool $copySessionContent = false ) { - $course_info = api_get_course_info($source_course_code); - - if (!empty($course_info)) { - $cb = new CourseBuilder('', $course_info); - $course = $cb->build($source_session_id, $source_course_code, $withBaseContent); - $restorer = new CourseRestorer($course); - $restorer->copySessionContent = $copySessionContent; - $restorer->skip_content = $params; - $restorer->restore( - $destination_course_code, - $destination_session_id, - true, - $withBaseContent - ); + $courseInfo = api_get_course_info($source_course_code); - return true; + if (empty($courseInfo)) { + return false; } - return false; + $source_session_id = (int) $source_session_id; + $destination_session_id = (int) $destination_session_id; + + if (!is_array($params)) { + $params = []; + } + + // If there is no valid session on source or destination, session content copy does not make sense. + if ($source_session_id <= 0 || $destination_session_id <= 0) { + $copySessionContent = false; + } + + try { + // Copy base content (course-wide) into destination course base (session 0). + if ($withBaseContent) { + $cb = new CourseBuilder('', $courseInfo); + + // Build only base content snapshot (session 0). + $baseCourse = $cb->build(0, $source_course_code, true); + + $baseRestorer = new CourseRestorer($baseCourse); + $baseRestorer->copySessionContent = false; + $baseRestorer->skip_content = $params; + + // Restore into destination base (session 0). + $baseRestorer->restore( + $destination_course_code, + 0, + true, + true + ); + } + + // Copy session-specific content into destination session. + if ($copySessionContent) { + $cb = new CourseBuilder('', $courseInfo); + + // Build only session content snapshot (no base to avoid duplicates). + $sessionCourse = $cb->build($source_session_id, $source_course_code, false); + + $sessionRestorer = new CourseRestorer($sessionCourse); + $sessionRestorer->copySessionContent = true; + $sessionRestorer->skip_content = $params; + + // Restore into destination session (no base). + $sessionRestorer->restore( + $destination_course_code, + $destination_session_id, + true, + false + ); + } + + return true; + } catch (\Throwable $e) { + return false; + } } /** diff --git a/public/main/session/session_list.php b/public/main/session/session_list.php index cbe991680a6..07355c0c4e2 100644 --- a/public/main/session/session_list.php +++ b/public/main/session/session_list.php @@ -158,6 +158,18 @@ #session-table #gview_sessions .ui-jqgrid-pager { width: 100% !important; } +#sessions_pager .ui-pg-button.ui-state-hover .ch-tool-icon, +#sessions_pager .ui-pg-button:hover .ch-tool-icon, +#sessions_pager .ui-pg-button.ui-state-hover .mdi, +#sessions_pager .ui-pg-button:hover .mdi { + color: #fff !important; + -webkit-text-fill-color: #fff !important; +} +#sessions_pager .ui-pg-button.ui-state-hover svg, +#sessions_pager .ui-pg-button:hover svg { + fill: #fff !important; + stroke: #fff !important; +}