Browse Source

Merge branch '1.11.x' of github.com:chamilo/chamilo-lms into 1.11.x

Yannick Warnier 6 years ago
parent
commit
79602b8f8b

+ 81 - 27
main/admin/usergroup_users.php

@@ -29,7 +29,7 @@ if (api_get_plugin_setting('learning_calendar', 'enabled') === 'true') {
 $htmlHeadXtra[] = api_get_jqgrid_js();
 $action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : null;
 $userId = isset($_GET['user_id']) ? (int) $_GET['user_id'] : 0;
-$calendarId = isset($_GET['calendar_id']) ? (int) $_GET['calendar_id'] : 0;
+$calendarId = isset($_REQUEST['calendar_id']) ? (int) $_REQUEST['calendar_id'] : 0;
 
 // setting breadcrumbs
 $interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')];
@@ -37,23 +37,16 @@ $interbreadcrumb[] = ['url' => '#', 'name' => $userGroupInfo['name']];
 
 switch ($action) {
     case 'add_calendar':
-        $calendars = $calendarPlugin->getCalendars(0, 1000, '');
-        if (empty($calendars)) {
-            echo Display::return_message(get_lang('NoData'), 'warning');
-            exit;
-        }
-        $userInfo = api_get_user_info($userId);
-        $calendars = array_column($calendars, 'title', 'id');
-        $calendars = array_map('strip_tags', $calendars);
-
         $form = new FormValidator(
             'add_calendar',
             'post',
             api_get_self().'?id='.$id.'&user_id='.$userId.'&action=add_calendar'
         );
+
+        $userInfo = api_get_user_info($userId);
         $form->addHeader($userInfo['complete_name']);
-        $form->addSelect('calendar_id', get_lang('Calendar'), $calendars, ['disable_js' => true]);
-        $form->addButtonSave(get_lang('Save'));
+        $calendarPlugin->getAddUserToCalendarForm($form);
+        $form->addButtonSave(get_lang('Add'));
         $form->display();
 
         if ($form->validate()) {
@@ -68,15 +61,6 @@ switch ($action) {
         exit;
         break;
     case 'edit_calendar':
-        $calendars = $calendarPlugin->getCalendars(0, 1000, '');
-        if (empty($calendars)) {
-            echo Display::return_message(get_lang('Nodata'));
-            exit;
-        }
-
-        $calendars = array_column($calendars, 'title', 'id');
-        $calendars = array_map('strip_tags', $calendars);
-
         $form = new FormValidator(
             'add_calendar',
             'post',
@@ -84,9 +68,9 @@ switch ($action) {
         );
         $userInfo = api_get_user_info($userId);
         $form->addHeader($userInfo['complete_name']);
-        $form->addSelect('calendar_id', get_lang('Calendar'), $calendars, ['disable_js' => true]);
-        $form->addButtonSave(get_lang('Update'));
+        $calendarPlugin->getAddUserToCalendarForm($form);
         $form->setDefaults(['calendar_id' => $calendarId]);
+        $form->addButtonSave(get_lang('Update'));
         $form->display();
 
         if ($form->validate()) {
@@ -103,6 +87,30 @@ switch ($action) {
     case 'delete':
         $res = $usergroup->delete_user_rel_group($_GET['user_id'], $_GET['id']);
         Display::addFlash(Display::return_message(get_lang('Deleted'), 'confirmation'));
+        header('Location: '.api_get_self().'?id='.$id);
+        exit;
+        break;
+    case 'create_control_point':
+        $value = isset($_GET['value']) ? (int) $_GET['value'] : 0;
+        $calendarPlugin->addControlPoint($userId, $value);
+        Display::addFlash(
+            Display::return_message($calendarPlugin->get_lang('ControlPointAdded'), 'confirmation')
+        );
+        header('Location: '.api_get_self().'?id='.$id);
+        exit;
+    case 'add_multiple_users_to_calendar':
+        $userList = isset($_REQUEST['user_list']) ? explode(',', $_REQUEST['user_list']) : 0;
+        foreach ($userList as $userId) {
+            $isAdded = $calendarPlugin->addUserToCalendar($calendarId, $userId);
+            if (!$isAdded) {
+                $isAdded = $calendarPlugin->updateUserToCalendar($calendarId, $userId);
+            }
+        }
+
+        Display::addFlash(
+            Display::return_message(get_lang('Added'), 'confirmation')
+        );
+
         header('Location: '.api_get_self().'?id='.$id);
         exit;
         break;
@@ -194,18 +202,23 @@ $urlStats = api_get_path(WEB_CODE_PATH);
 
 //$addCalendar = '<a href="'.$urlStats.'mySpace/myStudents.php?student=\'+options.rowId+\'">'.Display::return_icon('agenda.png', get_lang('Agenda'), '', ICON_SIZE_SMALL).'</a>';
 
+$reportingIcon = Display::return_icon('stats.png', get_lang('Reporting'), '', ICON_SIZE_SMALL);
+$controlPoint = Display::return_icon('add.png', get_lang('ControlPoint'), '', ICON_SIZE_SMALL);
+
 //return \'<a href="session_edit.php?page=resume_session.php&id=\'+options.rowId+\'">'.Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL).'</a>'.
 // With this function we can add actions to the jgrid
 $action_links = '
 function action_formatter(cellvalue, options, rowObject) {
+    var value = rowObject[5];
     return \''.
-    '&nbsp;<a href="'.$urlStats.'mySpace/myStudents.php?student=\'+options.rowId+\'">'.Display::return_icon('stats.png', get_lang('Reporting'), '', ICON_SIZE_SMALL).'</a>'.
-    ' <a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;"  href="?id='.$id.'&action=delete&user_id=\'+options.rowId+\'">'.$deleteIcon.'</a>\';
+    '&nbsp;<a href="'.$urlStats.'admin/usergroup_users.php?action=create_control_point&value=\'+value+\'&id='.$id.'&user_id=\'+options.rowId+\'">'.$controlPoint.'</a>'.
+    '&nbsp;<a href="'.$urlStats.'mySpace/myStudents.php?student=\'+options.rowId+\'">'.$reportingIcon.'</a>'.
+    ' <a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."\'".')) return false;" href="?id='.$id.'&action=delete&user_id=\'+options.rowId+\'">'.$deleteIcon.'</a>\';
 }
 
 function extra_formatter(cellvalue, options, rowObject) {
     var calendarName = rowObject[1];
-    var calendarId = rowObject[3];
+    var calendarId = rowObject[7];
     
     if (calendarName == "") {          
         return \'<a href="'.
@@ -224,6 +237,15 @@ function extra_formatter(cellvalue, options, rowObject) {
 
 $deleteUrl = api_get_path(WEB_AJAX_PATH).'usergroup.ajax.php?a=delete_user_in_usergroup&group_id='.$id;
 
+$form = new FormValidator(
+    'add_multiple_calendar',
+    'post',
+    api_get_self().'?id='.$id.'&action=add_multiple_users_to_calendar'
+);
+$calendarPlugin->getAddUserToCalendarForm($form);
+$form->addHidden('user_list', '');
+$form->addButtonSave(get_lang('Add'));
+
 ?>
 <script>
 $(function() {
@@ -248,9 +270,41 @@ $(function() {
         { height:280, reloadAfterSubmit:false }, // add options
         { reloadAfterSubmit:false, url: "<?php echo $deleteUrl; ?>" }, // del options
         { width:500 } // search options
-    );
+    )
+    .navButtonAdd('#usergroups_pager',{
+        caption:"<?php echo addslashes($calendarPlugin->get_lang('UpdateCalendar')); ?>",
+        buttonicon:"ui-icon ui-icon-plus",
+        onClickButton: function(a) {
+            var userIdList = $("#usergroups").jqGrid('getGridParam', 'selarrrow');
+            if (userIdList.length) {
+                $(".modal-body #add_multiple_calendar_user_list").val(userIdList);
+                $('#myModal').modal();
+            } else {
+                alert("<?php echo addslashes(get_lang('SelectStudents')); ?>");
+            }
+        },
+        position:"last"
+    });
 });
 </script>
+
+<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="myModalLabel">
+                    <?php echo $calendarPlugin->get_lang('AddMultipleUsersToCalendar'); ?>
+                </h4>
+            </div>
+            <div class="modal-body">
+                <?php echo $form->display(); ?>
+            </div>
+        </div>
+    </div>
+</div>
+
 <?php
 
 $usergroup->showGroupTypeSetting = true;

+ 8 - 3
main/auth/my_progress.php

@@ -10,7 +10,6 @@ $cidReset = true;
 require_once __DIR__.'/../inc/global.inc.php';
 
 $this_section = SECTION_TRACKING;
-
 $nameTools = get_lang('MyProgress');
 
 api_block_anonymous_users();
@@ -23,9 +22,15 @@ $(function() {
         autoPlayPause: 2000
     })
 });
-
 </script>";
 
+$pluginCalendar = api_get_plugin_setting('learning_calendar', 'enabled') === 'true';
+
+if ($pluginCalendar) {
+    $plugin = LearningCalendarPlugin::create();
+    $plugin->setJavaScript($htmlHeadXtra);
+}
+
 if (api_get_configuration_value('block_my_progress_page')) {
     api_not_allowed(true);
 }
@@ -33,7 +38,7 @@ if (api_get_configuration_value('block_my_progress_page')) {
 $user_id = api_get_user_id();
 $courseUserList = CourseManager::get_courses_list_by_user_id($user_id);
 $dates = $issues = '';
-$sessionId = isset($_GET['session_id']) ? intval($_GET['session_id']) : 0;
+$sessionId = isset($_GET['session_id']) ? (int) $_GET['session_id'] : 0;
 $courseCode = isset($_GET['course']) ? Security::remove_XSS($_GET['course']) : null;
 
 if (!empty($courseUserList)) {

+ 2 - 2
main/document/document_quota.php

@@ -47,7 +47,7 @@ $used_quota_bytes = $quota_bytes;
 if (!empty($session_list)) {
     foreach ($session_list as $session_data) {
         $quota_percentage = 0;
-        $quota_bytes = intval(DocumentManager::documents_total_space($course_id, null, $session_data['id']));
+        $quota_bytes = DocumentManager::documents_total_space($course_id, null, $session_data['id']);
         if (!empty($quota_bytes)) {
             $quota_percentage = round($quota_bytes / $total_quota_bytes, 2) * 100;
         }
@@ -67,7 +67,7 @@ if (!empty($group_list)) {
     foreach ($group_list as $group_data) {
         $quota_percentage = 0;
         $my_group_id = $group_data['id'];
-        $quota_bytes = intval(DocumentManager::documents_total_space($course_id, $my_group_id, 0));
+        $quota_bytes = DocumentManager::documents_total_space($course_id, $my_group_id, 0);
         if (!empty($quota_bytes)) {
             $quota_percentage = round($quota_bytes / $total_quota_bytes, 2) * 100;
         }

+ 6 - 12
main/exercise/MultipleAnswerTrueFalseDegreeCertainty.php

@@ -530,7 +530,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
             'DegreeOfCertaintyVerySure',
         ];
         $html .= '<ul class="chart-legend">';
-        foreach ($legendTitle as $i => $item){
+        foreach ($legendTitle as $i => $item) {
             $html .= '<li><i class="fa fa-square square_color'.$i.'" aria-hidden="true"></i> '.get_lang($item).'</li>';
         }
         $html .= '</ul>';
@@ -601,8 +601,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
         $returnHeight = false,
         $groupCategoriesByBracket = false,
         $numberOfQuestions = 0
-    )
-    {
+    ) {
         $topAndBottomMargin = 10;
         $colorList = [
             self::LEVEL_DARKRED,
@@ -643,11 +642,9 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
             strpos($title, 'votre dernier résultat à ce test') > 0
         ) ? 100 : 80;
 
-
         $html .= '<div class="row-chart">';
         $html .= '<h4 class="chart-title">'.$titleDisplay.'</h4>';
 
-
         $nbResponsesInc = 0;
         if (isset($scoreList[4])) {
             $nbResponsesInc += (int) $scoreList[4];
@@ -670,7 +667,6 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
         $IgnoranceAnswers = sprintf(get_lang('IgnoranceAnswersX'), $nbResponsesIng);
         $CorrectAnswers = sprintf(get_lang('CorrectAnswersX'), $nbResponsesCor);
 
-
         $html .= '<div class="chart-grid">';
 
         $explainHistoList = null;
@@ -693,17 +689,17 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
             }
             $sizeBar = ($scoreOnBottom * $sizeRatio * 2).'px;';
 
-            if ($i == 0 ) {
+            if ($i == 0) {
                 $html .= '<div class="item">';
                 $html .= '<div class="panel-certaint" style="min-height:'.$verticalLineHeight.'px; position: relative;">';
                 $html .= '<div class="answers-title">'.$IncorrectAnswers.'</div>';
                 $html .= '<ul class="certaint-list-two">';
-            } else if($i == 3){
+            } elseif ($i == 3) {
                 $html .= '<div class="item">';
                 $html .= '<div class="panel-certaint" style="height:'.$verticalLineHeight.'px;  position: relative;">';
                 $html .= '<div class="answers-title">'.$CorrectAnswers.'</div>';
                 $html .= '<ul class="certaint-list-two">';
-            } else if($i==2){
+            } elseif ($i == 2) {
                 $html .= '<div class="item">';
                 $html .= '<div class="panel-certaint" style="height:'.$verticalLineHeight.'px;  position: relative;">';
                 $html .= '<div class="answers-title">'.$IgnoranceAnswers.'</div>';
@@ -727,7 +723,6 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
         $html .= '</div>';
         $html .= '</div>';
 
-
         if ($returnHeight) {
             return [$html, $verticalLineHeight];
         } else {
@@ -760,8 +755,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
         $returnHeight = false,
         $groupCategoriesByBracket = false,
         $numberOfQuestions = 0
-    )
-    {
+    ) {
         $topAndBottomMargin = 10;
         $colorList = [
             self::LEVEL_DARKRED,

+ 4 - 1
main/inc/ajax/usergroup.ajax.php

@@ -13,8 +13,11 @@ switch ($action) {
         if ($isAllowedToEdit) {
             $userGroup = new UserGroup();
             $userId = isset($_REQUEST['id']) ? $_REQUEST['id'] : 0;
+            $userIdList = explode(',', $userId);
             $groupId = isset($_REQUEST['group_id']) ? $_REQUEST['group_id'] : 0;
-            $userGroup->delete_user_rel_group($userId, $groupId);
+            foreach ($userIdList as $userId) {
+                $userGroup->delete_user_rel_group($userId, $groupId);
+            }
         }
         break;
     default:

+ 8 - 7
main/inc/lib/document.lib.php

@@ -2996,9 +2996,10 @@ class DocumentManager
     {
         $TABLE_ITEMPROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
         $TABLE_DOCUMENT = Database::get_course_table(TABLE_DOCUMENT);
-        $session_id = intval($session_id);
-        $group_id = intval($group_id);
-        $course_id = intval($course_id);
+
+        $session_id = (int) $session_id;
+        $group_id = (int) $group_id;
+        $course_id = (int) $course_id;
 
         if (!$course_id) {
             $course_id = api_get_course_int_id();
@@ -3019,9 +3020,9 @@ class DocumentManager
                 INNER JOIN $TABLE_DOCUMENT AS docs
                 ON (docs.id = props.ref AND props.c_id = docs.c_id)
                 WHERE
-                    props.c_id 	= $course_id AND
-                    docs.c_id 	= $course_id AND
-                    props.tool 	= '".TOOL_DOCUMENT."' AND
+                    props.c_id = $course_id AND
+                    docs.c_id = $course_id AND
+                    props.tool = '".TOOL_DOCUMENT."' AND
                     props.visibility <> 2
                     $group_condition
                     $session_condition
@@ -3031,7 +3032,7 @@ class DocumentManager
         if ($result && Database::num_rows($result) != 0) {
             $row = Database::fetch_row($result);
 
-            return $row[0];
+            return (int) $row[0];
         } else {
             return 0;
         }

+ 1 - 1
main/inc/lib/internationalization.lib.php

@@ -492,7 +492,7 @@ function api_get_local_time(
     }
 
     if (is_numeric($time)) {
-        $time = intval($time);
+        $time = (int) $time;
         if ($return_null_if_invalid_date) {
             if (strtotime(date('d-m-Y H:i:s', $time)) !== (int) $time) {
                 return null;

+ 5 - 2
main/inc/lib/pear/HTML/QuickForm/Rule/MinText.php

@@ -14,9 +14,12 @@ class Html_Quickform_Rule_MinText extends HTML_QuickForm_Rule
      * @param int $count The minimum number of characters that the text should contain
      * @return boolean True if text has the minimum number of chars required
      */
-    function validate($text, $count)
+    public function validate($text, $count)
     {
-        $checkMinText = create_function('$a,$b', 'return strlen(utf8_decode($a)) >= $b;');
+        $checkMinText = function($a, $b) {
+            return strlen(utf8_decode($a)) >= $b;
+        };
+
         return $checkMinText($text, $count);
     }
 }

+ 7 - 2
main/mySpace/myStudents.php

@@ -438,6 +438,13 @@ if (api_is_drh() && !api_is_platform_admin()) {
     }
 }
 
+$pluginCalendar = api_get_plugin_setting('learning_calendar', 'enabled') === 'true';
+
+if ($pluginCalendar) {
+    $plugin = LearningCalendarPlugin::create();
+    $plugin->setJavaScript($htmlHeadXtra);
+}
+
 Display::display_header($nameTools);
 $token = Security::get_token();
 
@@ -1837,9 +1844,7 @@ if ($allow && (api_is_drh() || api_is_platform_admin())) {
     $table->display();
 }
 
-$pluginCalendar = api_get_plugin_setting('learning_calendar', 'enabled') === 'true';
 if ($pluginCalendar) {
-    $plugin = LearningCalendarPlugin::create();
     echo $plugin->getUserStatsPanel($student_id, $courses_in_session);
 }
 

+ 166 - 3
plugin/learning_calendar/LearningCalendarPlugin.php

@@ -108,8 +108,21 @@ class LearningCalendarPlugin extends Plugin
         ";
         Database::query($sql);
 
+        $sql = "
+            CREATE TABLE IF NOT EXISTS learning_calendar_control_point(
+              id int not null AUTO_INCREMENT primary key,
+              user_id int(11) not null,
+              control_date date not null,
+              control_value int not null,
+              created_at datetime not null,
+              updated_at datetime not null
+            )
+        ";
+        Database::query($sql);
+
         $extraField = new ExtraField('lp_item');
         $params = [
+            'display_text' => $this->get_lang('LearningCalendarOneDayMarker'),
             'variable' => 'calendar',
             'visible_to_self' => 1,
             'changeable' => 1,
@@ -240,6 +253,10 @@ class LearningCalendarPlugin extends Plugin
     public function getCalendarsEventsByDate($calendarInfo, $start, $end, $type = 0, $getCount = false)
     {
         if (empty($calendarInfo)) {
+            if ($getCount) {
+                return 0;
+            }
+
             return [];
         }
 
@@ -503,9 +520,11 @@ class LearningCalendarPlugin extends Plugin
             ];
 
             Database::insert('learning_calendar_user', $params);
+
+            return true;
         }
 
-        return true;
+        return false;
     }
 
     /**
@@ -779,6 +798,19 @@ class LearningCalendarPlugin extends Plugin
         return 0;
     }
 
+    /**
+     * @param array $htmlHeadXtra
+     */
+    public function setJavaScript(&$htmlHeadXtra)
+    {
+        $htmlHeadXtra[] = api_get_js('jqplot/jquery.jqplot.js');
+        $htmlHeadXtra[] = api_get_js('jqplot/plugins/jqplot.dateAxisRenderer.js');
+        $htmlHeadXtra[] = api_get_js('jqplot/plugins/jqplot.canvasOverlay.js');
+        $htmlHeadXtra[] = api_get_js('jqplot/plugins/jqplot.pointLabels.js');
+
+        $htmlHeadXtra[] = api_get_css(api_get_path(WEB_LIBRARY_PATH).'javascript/jqplot/jquery.jqplot.css');
+    }
+
     /**
      * @param int   $userId
      * @param array $courseAndSessionList
@@ -795,7 +827,54 @@ class LearningCalendarPlugin extends Plugin
             $html .= '<br />';
             $html .= $this->get_lang('NumberDaysAccumulatedInLp').$stats['completed'];
             $html .= '<br />';
-            $html .= $this->get_lang('NumberDaysInRetard').' '.$stats['diff'];
+            $html .= $this->get_lang('NumberDaysInRetard').' '.($stats['completed'] - $stats['user_event_count']);
+        }
+
+        $controlList = $this->getControlPointsToPlot($userId);
+
+        if (!empty($controlList)) {
+            $listToString = json_encode($controlList);
+            $date = $this->get_lang('Date');
+            $controlPoint = $this->get_lang('NumberOfDays');
+
+            $html .= '<div id="control_point_chart"></div>';
+            $html .= '<script>
+                $(document).ready(function(){
+                    var cosPoints = '.$listToString.';
+                    var plot1 = $.jqplot(\'control_point_chart\', [cosPoints], {  
+                        //animate: !$.jqplot.use_excanvas,                      
+                        series:[{
+                            showMarker:true,
+                            pointLabels: { show:true },
+                        }],
+                        axes:{
+                            xaxis:{
+                                label: "'.$date.'",
+                                renderer: $.jqplot.DateAxisRenderer,
+                                tickOptions:{formatString: "%Y-%m-%d"},
+                                tickInterval: \'30 day\',                                
+                            },
+                            yaxis:{
+                                label: "'.$controlPoint.'",
+                                max: 20,
+                                min: -20,    
+                            }
+                        },
+                        canvasOverlay: {
+                            show: true,
+                            objects: [{
+                                horizontalLine: {
+                                    name: \'0 mark\',
+                                    y: 0,
+                                    lineWidth: 2,
+                                    color: \'rgb(f, f, f)\',
+                                    shadow: false
+                                }
+                            }]
+                        },                     
+                  });
+                });
+            </script>';
         }
 
         $html = Display::panel($html, $this->get_lang('LearningCalendar'));
@@ -973,7 +1052,7 @@ class LearningCalendarPlugin extends Plugin
     /**
      * @param array $calendarInfo
      */
-    public function protectCalendar($calendarInfo = [])
+    public function protectCalendar(array $calendarInfo)
     {
         $allow = api_is_platform_admin() || api_is_teacher();
 
@@ -989,4 +1068,88 @@ class LearningCalendarPlugin extends Plugin
             }
         }
     }
+
+    /**
+     * @param int $userId
+     *
+     * @return array
+     */
+    public function getControlPoints($userId)
+    {
+        $userId = (int) $userId;
+        $sql = "SELECT control_date, control_value FROM learning_calendar_control_point 
+                WHERE user_id = $userId ORDER BY control_date";
+        $result = Database::query($sql);
+        $list = Database::store_result($result, 'ASSOC');
+
+        return $list;
+    }
+
+    /**
+     * @param int $userId
+     *
+     * @return array
+     */
+    public function getControlPointsToPlot($userId)
+    {
+        $list = $this->getControlPoints($userId);
+        $points = [];
+        foreach ($list as $item) {
+            $points[] = [$item['control_date'], $item['control_value']];
+        }
+
+        return $points;
+    }
+
+    /**
+     * @param int $userId
+     * @param int $value
+     */
+    public function addControlPoint($userId, $value)
+    {
+        $userId = (int) $userId;
+        $value = (int) $value;
+        $local = api_get_local_time();
+        $date = substr($local, 0, 10);
+
+        $sql = "SELECT id FROM learning_calendar_control_point 
+                WHERE user_id = $userId AND control_date = '$date'";
+        $result = Database::query($sql);
+
+        if (Database::num_rows($result)) {
+            $params = [
+                'control_value' => $value,
+                'updated_at' => api_get_utc_datetime(),
+            ];
+            $data = Database::fetch_array($result);
+            $id = $data['id'];
+            Database::update('learning_calendar_control_point', $params, ['id = ?' => $id]);
+        } else {
+            $params = [
+                'user_id' => $userId,
+                'control_date' => $date,
+                'control_value' => $value,
+                'created_at' => api_get_utc_datetime(),
+                'updated_at' => api_get_utc_datetime(),
+            ];
+            Database::insert('learning_calendar_control_point', $params);
+        }
+    }
+
+    /**
+     * @param FormValidator $form
+     */
+    public function getAddUserToCalendarForm(FormValidator &$form)
+    {
+        $calendars = $this->getCalendars(0, 1000, '');
+
+        if (empty($calendars)) {
+            echo Display::return_message(get_lang('NoData'), 'warning');
+            exit;
+        }
+        $calendars = array_column($calendars, 'title', 'id');
+        $calendars = array_map('strip_tags', $calendars);
+
+        $form->addSelect('calendar_id', get_lang('Calendar'), $calendars, ['disable_js' => true]);
+    }
 }

+ 1 - 1
plugin/learning_calendar/README.md

@@ -1,2 +1,2 @@
-## Learning path calendar
+## Learning calendar
 

+ 1 - 1
plugin/learning_calendar/ajax.php

@@ -17,7 +17,7 @@ switch ($action) {
             exit;
         }
         $endDate = isset($_REQUEST['end_date']) ? $_REQUEST['end_date'] : '';
-        if (empty($endDate)) {
+        if ($startDate == $endDate) {
             // One day
             $plugin->toogleDayType($calendarId, $startDate);
         } else {

+ 6 - 0
plugin/learning_calendar/lang/english.php

@@ -14,3 +14,9 @@ $strings['EventTypeTaken'] = 'Taken';
 $strings['EventTypeExam'] = 'Exam';
 $strings['EventTypeFree'] = 'Free';
 $strings['CourseHoursDuration'] = 'Course hours duration';
+$strings['LearningCalendarOneDayMarker'] = 'Learning calendar one day marker';
+$strings['ControlPointAdded'] = 'Control point added';
+$strings['NumberOfDays'] = 'Number of days';
+$strings['Date'] = 'Date';
+$strings['AddMultipleUsersToCalendar'] = 'Add multiple users to a calendar';
+$strings['UpdateCalendar'] = 'Update calendar';

+ 10 - 10
plugin/learning_calendar/view/calendar.tpl

@@ -37,16 +37,16 @@
             customDayRenderer: function(e) {
                 $(e).parent().css('background-color', 'green');
             },
-            clickDay: function(e) {
-                var dateString = moment(e.date).format("YYYY-MM-DD");
-                $.ajax({
-                    type: "GET",
-                    url: "{{ ajax_url }}&a=toggle_day&start_date="+dateString+"&end_date=",
-                    success: function(returnValue) {
-                        getEvents(e);
-                    }
-                });
-            },
+            {#clickDay: function(e) {#}
+                {#var dateString = moment(e.date).format("YYYY-MM-DD");#}
+                {#$.ajax({#}
+                    {#type: "GET",#}
+                    {#url: "{{ ajax_url }}&a=toggle_day&start_date="+dateString+"&end_date=",#}
+                    {#success: function(returnValue) {#}
+                        {#getEvents(e);#}
+                    {#}#}
+                {#});#}
+            {#},#}
             selectRange: function(e) {
                 var startString = moment(e.startDate).format("YYYY-MM-DD");
                 var endString = moment(e.endDate).format("YYYY-MM-DD");