Browse Source

Add config "allow_user_session_collapsable" see BT#15126

Add collapsable option when showing the course list
inside a session in userportal.php
Julio Montoya 6 years ago
parent
commit
c1cdf0a8d3

+ 44 - 2
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 = '<i class="fa fa-folder-open"></i>';
+        if ($collapsed == 1) {
+            $link = $collapsableLink.'&session_id='.$sessionId.'&value=0';
+            $image = '<i class="fa fa-folder"></i>';
+        }
+
+        $link = Display::url(
+            $image,
+            $link
+        );
+
+        return ['collapsed' => $collapsed, 'collapsable_link' => $link];
+    }
+
     /**
      * @param int $id
      *

+ 23 - 3
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,
             ];
         }
 

+ 35 - 11
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'],

+ 6 - 1
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

+ 13 - 1
main/template/default/user_portal/classic_session.tpl

@@ -2,8 +2,8 @@
 
 {% for row in session %}
     <div class="panel panel-default">
+        {% set collapsable = '' %}
         {% if not row.show_simple_session_info %}
-            {% set collapsable = '' %}
             {% if row.course_list_session_style %} {# If not style then no show header #}
                 <div class="panel-heading">
                     {% if row.course_list_session_style == 1 or row.course_list_session_style == 2 %} {# Session link #}
@@ -38,8 +38,20 @@
                             </a>
                         </div>
                     {% endif %}
+                    {% if row.collapsable_link %}
+                        <div class="pull-right">
+                            {{ row.collapsable_link }}
+                        </div>
+                    {% endif %}
                 </div>
             {% endif %}
+
+            {% if row.collapsable_link %}
+                {% if row.collapsed == 1 %}
+                    {% set collapsable = 'collapse' %}
+                {% endif %}
+            {% endif %}
+
             <div class="session panel-body {{ collapsable }}" id="collapse_{{ row.id }}">
                 <div class="row">
                     <div class="col-md-12">

+ 0 - 1
main/template/default/user_portal/grid_courses_with_category.tpl

@@ -88,7 +88,6 @@
                                             </div>
                                         {% endif %}
                                     {% endif %}
-
                                 </div>
                             </div>
                         </div>

+ 13 - 0
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 = '' %}
     <div id="session-{{ item.id }}" class="session panel panel-default">
         {% if row.course_list_session_style %} {# If not style then no show header #}
             <div class="panel-heading">
@@ -155,8 +156,20 @@
                         </a>
                     </div>
                 {% endif %}
+                {% if row.collapsable_link %}
+                    <div class="pull-right">
+                       {{ row.collapsable_link }}
+                    </div>
+                {% endif %}
             </div>
         {% endif %}
+
+        {% if row.collapsable_link %}
+            {% if row.collapsed == 1 %}
+                {% set collapsable = 'collapse' %}
+            {% endif %}
+        {% endif %}
+
         <div class="session panel-body {{ collapsable }}" id="collapse_{{ row.id }}">
             {% if row.show_description %}
                 {{ row.description }}

+ 22 - 0
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';