diff --git a/main/inc/lib/sessionmanager.lib.php b/main/inc/lib/sessionmanager.lib.php index efa5c8fa63..a47e1a66bd 100755 --- a/main/inc/lib/sessionmanager.lib.php +++ b/main/inc/lib/sessionmanager.lib.php @@ -6851,8 +6851,8 @@ SQL; */ public static function getUserSession($userId, $sessionId) { - $userId = intval($userId); - $sessionId = intval($sessionId); + $userId = (int) $userId; + $sessionId = (int) $sessionId; if (empty($userId) || empty($sessionId)) { return false; @@ -9123,6 +9123,48 @@ SQL; return $courseIds; } + /** + * @param int $userId + * @param int $sessionId + * @param ExtraFieldValue $extraFieldValue + * @param string $collapsableLink + * + * @return array + */ + public static function getCollapsableData($userId, $sessionId, $extraFieldValue, $collapsableLink) + { + $collapsed = 0; + + // Get default collapsed value in extra field + $value = $extraFieldValue->get_values_by_handler_and_field_variable($sessionId, 'collapsed'); + if (!empty($value) && isset($value['value'])) { + $collapsed = $value['value']; + } + + $userRelSession = Sessionmanager::getUserSession($userId, $sessionId); + if ($userRelSession) { + if (isset($userRelSession['collapsed']) && $userRelSession['collapsed'] != '') { + $collapsed = $userRelSession['collapsed']; + } + } else { + return ['collapsed' => '', 'collapsable_link' => '']; + } + + $link = $collapsableLink.'&session_id='.$sessionId.'&value=1'; + $image = ''; + if ($collapsed == 1) { + $link = $collapsableLink.'&session_id='.$sessionId.'&value=0'; + $image = ''; + } + + $link = Display::url( + $image, + $link + ); + + return ['collapsed' => $collapsed, 'collapsable_link' => $link]; + } + /** * @param int $id * diff --git a/main/inc/lib/usermanager.lib.php b/main/inc/lib/usermanager.lib.php index fd044c51bd..75853e2fb1 100755 --- a/main/inc/lib/usermanager.lib.php +++ b/main/inc/lib/usermanager.lib.php @@ -3040,8 +3040,8 @@ class UserManager // sessions, BT#14115) but executing a similar query twice and grouping // the results afterwards in PHP takes about 1/1000th of the time // (0.1s + 0.0s) for the same set of data, so we do it this way... - $dqlStudent = $dql." WHERE scu.user = :user AND url.accessUrlId = :url "; - $dqlCoach = $dql." WHERE s.generalCoach = :user AND url.accessUrlId = :url "; + $dqlStudent = $dql.' WHERE scu.user = :user AND url.accessUrlId = :url '; + $dqlCoach = $dql.' WHERE s.generalCoach = :user AND url.accessUrlId = :url '; // Default order $order = 'ORDER BY sc.name, s.name'; @@ -3071,7 +3071,7 @@ class UserManager if ($orderSetting == 'asc') { // Put null values at the end // https://stackoverflow.com/questions/12652034/how-can-i-order-by-null-in-dql - $order = " ORDER BY _isFieldNull asc, s.accessEndDate asc"; + $order = ' ORDER BY _isFieldNull asc, s.accessEndDate asc'; } break; } @@ -3109,6 +3109,10 @@ class UserManager $sessionData[$row['id']] = $row; } + $collapsable = api_get_configuration_value('allow_user_session_collapsable'); + $extraField = new ExtraFieldValue('session'); + $collapsableLink = api_get_path(WEB_PATH).'user_portal.php?action=collapse_session'; + $categories = []; foreach ($sessionData as $row) { $session_id = $row['id']; @@ -3170,6 +3174,7 @@ class UserManager 'date_end' => $categoryEnd, ]; + $visibility = api_get_session_visibility( $session_id, null, @@ -3220,6 +3225,19 @@ class UserManager } } + $collapsed = ''; + $collapsedAction = ''; + if ($collapsable) { + $collapsableData = Sessionmanager::getCollapsableData( + $user_id, + $session_id, + $extraField, + $collapsableLink + ); + $collapsed = $collapsableData['collapsed']; + $collapsedAction = $collapsableData['collapsable_link']; + } + $categories[$row['session_category_id']]['sessions'][] = [ 'session_name' => $row['name'], 'session_id' => $row['id'], @@ -3228,6 +3246,8 @@ class UserManager 'coach_access_start_date' => $row['coach_access_start_date'] ? $row['coach_access_start_date']->format('Y-m-d H:i:s') : null, 'coach_access_end_date' => $row['coach_access_end_date'] ? $row['coach_access_end_date']->format('Y-m-d H:i:s') : null, 'courses' => $courseList, + 'collapsed' => $collapsed, + 'collapsable_link' => $collapsedAction, ]; } diff --git a/main/inc/lib/userportal.lib.php b/main/inc/lib/userportal.lib.php index 6bcf0b3df6..7a534d3b20 100755 --- a/main/inc/lib/userportal.lib.php +++ b/main/inc/lib/userportal.lib.php @@ -1339,15 +1339,10 @@ class IndexManager if ($specialCourses) { if ($categoryCodeFilter) { - $specialCourses = self::filterByCategory( - $specialCourses, - $categoryCodeFilter - ); + $specialCourses = self::filterByCategory($specialCourses, $categoryCodeFilter); } $this->tpl->assign('courses', $specialCourses); - $specialCourseList = $this->tpl->fetch( - $this->tpl->get_template($coursesWithoutCategoryTemplate) - ); + $specialCourseList = $this->tpl->fetch($this->tpl->get_template($coursesWithoutCategoryTemplate)); $courseCompleteList = array_merge($courseCompleteList, $specialCourses); } @@ -1385,6 +1380,14 @@ class IndexManager $sessions_with_category = ''; $sessions_with_no_category = ''; + + $collapsable = api_get_configuration_value('allow_user_session_collapsable'); + $collapsableLink = ''; + if ($collapsable) { + $collapsableLink = api_get_path(WEB_PATH).'user_portal.php?action=collapse_session'; + } + + $extraFieldValue = new ExtraFieldValue('session'); if ($showSessions) { $coursesListSessionStyle = api_get_configuration_value('courses_list_session_title_link'); $coursesListSessionStyle = $coursesListSessionStyle === false ? 1 : $coursesListSessionStyle; @@ -1558,7 +1561,6 @@ class IndexManager ]; $session_box = Display::getSessionTitleBox($session_id); $coachId = $session_box['id_coach']; - $extraFieldValue = new ExtraFieldValue('session'); $imageField = $extraFieldValue->get_values_by_handler_and_field_variable( $session_id, 'image' @@ -1567,9 +1569,8 @@ class IndexManager $params['category_id'] = $session_box['category_id']; $params['title'] = $session_box['title']; $params['id_coach'] = $coachId; - $params['coach_url'] = api_get_path( - WEB_AJAX_PATH - ).'user_manager.ajax.php?a=get_user_popup&user_id='.$coachId; + $params['coach_url'] = api_get_path(WEB_AJAX_PATH). + 'user_manager.ajax.php?a=get_user_popup&user_id='.$coachId; $params['coach_name'] = !empty($session_box['coach']) ? $session_box['coach'] : null; $params['coach_avatar'] = UserManager::getUserPicture( $coachId, @@ -1579,6 +1580,18 @@ class IndexManager $params['image'] = isset($imageField['value']) ? $imageField['value'] : null; $params['duration'] = isset($session_box['duration']) ? ' '.$session_box['duration'] : null; $params['show_actions'] = SessionManager::cantEditSession($session_id); + + if ($collapsable) { + $collapsableData = Sessionmanager::getCollapsableData( + $user_id, + $session_id, + $extraFieldValue, + $collapsableLink + ); + $params['collapsed'] = $collapsableData['collapsed']; + $params['collapsable_link'] = $collapsableData['collapsable_link']; + } + $params['show_description'] = $session_box['show_description'] == 1 && $portalShowDescription; $params['description'] = $session_box['description']; $params['visibility'] = $session_box['visibility']; @@ -1722,6 +1735,17 @@ class IndexManager $sessionParams[0]['is_old'] = $markAsOld; $sessionParams[0]['is_future'] = $markAsFuture; + if ($collapsable) { + $collapsableData = Sessionmanager::getCollapsableData( + $user_id, + $session_id, + $extraFieldValue, + $collapsableLink + ); + $sessionParams[0]['collapsable_link'] = $collapsableData['collapsable_link']; + $sessionParams[0]['collapsed'] = $collapsableData['collapsed']; + } + if ($showSimpleSessionInfo) { $sessionParams[0]['subtitle'] = self::getSimpleSessionDetails( $session_box['coach'], diff --git a/main/install/configuration.dist.php b/main/install/configuration.dist.php index e051f0d1e4..9589ed56fa 100755 --- a/main/install/configuration.dist.php +++ b/main/install/configuration.dist.php @@ -1049,7 +1049,12 @@ VALUES (2, 13, 'session_courses_read_only_mode', 'Lock Course In Session', 1, 1, // Add collapsable option for user course categories // ALTER TABLE user_course_category ADD collapsed TINYINT(1) DEFAULT NULL; -// $_configuration['allow_user_course_category_collapsable'] = true; +// $_configuration['allow_user_course_category_collapsable'] = false; + +// Add collapsable option when showing the course list inside a session in userportal.php +// ALTER TABLE session_rel_user ADD collapsed TINYINT(1) DEFAULT NULL; +// Create a new session extra field called "collapsed" (checkbox yes/no - option) +// $_configuration['allow_user_session_collapsable'] = false; // ------ Custom DB changes (keep this at the end) // Add user activation by confirmation email diff --git a/main/template/default/user_portal/classic_session.tpl b/main/template/default/user_portal/classic_session.tpl index 81a96a056d..a2a70b5615 100644 --- a/main/template/default/user_portal/classic_session.tpl +++ b/main/template/default/user_portal/classic_session.tpl @@ -2,8 +2,8 @@ {% for row in session %}
+ {% set collapsable = '' %} {% if not row.show_simple_session_info %} - {% set collapsable = '' %} {% if row.course_list_session_style %} {# If not style then no show header #}
{% if row.course_list_session_style == 1 or row.course_list_session_style == 2 %} {# Session link #} @@ -38,8 +38,20 @@
{% endif %} + {% if row.collapsable_link %} +
+ {{ row.collapsable_link }} +
+ {% endif %}
{% endif %} + + {% if row.collapsable_link %} + {% if row.collapsed == 1 %} + {% set collapsable = 'collapse' %} + {% endif %} + {% endif %} +
diff --git a/main/template/default/user_portal/grid_courses_with_category.tpl b/main/template/default/user_portal/grid_courses_with_category.tpl index 9d72149d98..b12b211341 100644 --- a/main/template/default/user_portal/grid_courses_with_category.tpl +++ b/main/template/default/user_portal/grid_courses_with_category.tpl @@ -88,7 +88,6 @@
{% endif %} {% endif %} -
diff --git a/main/template/default/user_portal/grid_session.tpl b/main/template/default/user_portal/grid_session.tpl index a12440c6ed..a17515e3d0 100644 --- a/main/template/default/user_portal/grid_session.tpl +++ b/main/template/default/user_portal/grid_session.tpl @@ -120,6 +120,7 @@ {% set session_image = 'window_list.png'|img(32, row.title) %} {% for row in session %} + {% set collapsable = '' %}
{% if row.course_list_session_style %} {# If not style then no show header #}
@@ -155,8 +156,20 @@
{% endif %} + {% if row.collapsable_link %} +
+ {{ row.collapsable_link }} +
+ {% endif %}
{% endif %} + + {% if row.collapsable_link %} + {% if row.collapsed == 1 %} + {% set collapsable = 'collapse' %} + {% endif %} + {% endif %} +
{% if row.show_description %} {{ row.description }} diff --git a/user_portal.php b/user_portal.php index f97d359e66..42e0a95459 100755 --- a/user_portal.php +++ b/user_portal.php @@ -36,6 +36,28 @@ api_block_anonymous_users(); // Only users who are logged in can proceed. $userId = api_get_user_id(); +$collapsable = api_get_configuration_value('allow_user_session_collapsable'); +if ($collapsable) { + $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; + $sessionId = isset($_REQUEST['session_id']) ? $_REQUEST['session_id'] : ''; + $value = isset($_REQUEST['value']) ? (int) $_REQUEST['value'] : ''; + switch ($action) { + case 'collapse_session': + if (!empty($sessionId)) { + $userRelSession = SessionManager::getUserSession($userId, $sessionId); + if ($userRelSession) { + $table = Database::get_main_table(TABLE_MAIN_SESSION_USER); + $sql = "UPDATE $table SET collapsed = $value WHERE id = ".$userRelSession['id']; + Database::query($sql); + Display::addFlash(Display::return_message(get_lang('Updated'))); + } + header('Location: user_portal.php'); + exit; + } + break; + } +} + /* Constants and CONFIGURATION parameters */ $load_dirs = api_get_setting('show_documents_preview'); $displayMyCourseViewBySessionLink = api_get_setting('my_courses_view_by_session') === 'true';