Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 60 additions & 16 deletions public/main/inc/lib/course.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

/**
Expand Down
22 changes: 18 additions & 4 deletions public/main/session/session_list.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
</style>
<script>
$(function() {
Expand Down Expand Up @@ -268,7 +280,9 @@
// Optional action: copy with session content
$copyWithContentJs = '';
if ($addSessionContent) {
$iconCopyWithContent = addslashes(Display::return_icon('copy.png', get_lang('Copy with session content')));
$iconCopyWithContent = addslashes(
Display::getMdiIcon('content-duplicate', 'ch-tool-icon', null, 22, get_lang('Copy with session content'))
);
$copyWithContentJs =
" + '&nbsp;<a onclick=\"if(!confirm(\\'{$confirmMsg}\\')) return false;\""
." href=\"session_list.php?copy_session_content=1&list_type={$listType}&action=copy&idChecked=' + options.rowId + '\">"
Expand Down Expand Up @@ -552,7 +566,7 @@ function resizeSessionsGrid() {
{reloadAfterSubmit:true, url: '<?php echo $deleteUrl; ?>' }, // del options
prmSearch
).navButtonAdd('#sessions_pager',{
caption:"<?php echo addslashes(Display::return_icon('copy.png', get_lang('Copy'))); ?>",
caption:"<?php echo addslashes(Display::getMdiIcon('content-duplicate', 'ch-tool-icon', null, 22, get_lang('Copy'))); ?>",
buttonicon:"ui-icon ui-icon-plus",
onClickButton: function(a) {
var list = $("#sessions").jqGrid('getGridParam', 'selarrrow');
Expand All @@ -563,7 +577,7 @@ function resizeSessionsGrid() {
}
}
}).navButtonAdd('#sessions_pager',{
caption:"<?php echo addslashes(Display::return_icon('save_pack.png', get_lang('Courses reports'))); ?>",
caption:"<?php echo addslashes(Display::getMdiIcon('archive-arrow-down', 'ch-tool-icon', null, 22, get_lang('Courses reports'))); ?>",
buttonicon:"ui-icon ui-icon-plus",
onClickButton: function(a) {
var list = $("#sessions").jqGrid('getGridParam', 'selarrrow');
Expand All @@ -575,7 +589,7 @@ function resizeSessionsGrid() {
},
position:"last"
}).navButtonAdd("#sessions_pager",{
caption:"<?php echo addslashes(Display::return_icon('export_csv.png', get_lang('Export courses reports complete'))); ?>",
caption:"<?php echo addslashes(Display::getMdiIcon('file-delimited-outline', 'ch-tool-icon', null, 22, get_lang('Export courses reports complete'))); ?>",
buttonicon:"ui-icon ui-icon-plus",
onClickButton: function(a) {
var list = $("#sessions").jqGrid("getGridParam", "selarrrow");
Expand Down
5 changes: 4 additions & 1 deletion src/CourseBundle/Component/CourseCopy/CourseBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -611,7 +611,10 @@ public function build(

// Always try to include documents referenced inside HTML (images, attachments, etc.).
if ($courseEntity instanceof CourseEntity) {
$this->restoreDocumentsFromList($courseEntity, $sessionEntity);
// Avoid pulling base documents into a session-only build (prevents duplicates on two-pass copy).
if ($withBaseContent || null === $sessionEntity) {
$this->restoreDocumentsFromList($courseEntity, $sessionEntity);
}
}

return $this->course;
Expand Down
Loading