WIP learning calendar plugin BT#14608

- Add new table "learning_calendar_control_point"
- Add jqplot
- Add multiple users to a calendar
pull/2606/head
Julio Montoya 8 years ago
parent ed4f27fc5c
commit 3f1c90bd37
  1. 108
      main/admin/usergroup_users.php
  2. 5
      main/inc/ajax/usergroup.ajax.php
  3. 9
      main/mySpace/myStudents.php
  4. 137
      plugin/learning_calendar/LearningCalendarPlugin.php
  5. 7
      plugin/learning_calendar/lang/english.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;

@ -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:

@ -438,6 +438,14 @@ if (api_is_drh() && !api_is_platform_admin()) {
}
}
$pluginCalendar = api_get_plugin_setting('learning_calendar', 'enabled') === 'true';
if ($pluginCalendar) {
$htmlHeadXtra[] = api_get_js('jqplot/jquery.jqplot.js');
$htmlHeadXtra[] = api_get_js('jqplot/plugins/jqplot.dateAxisRenderer.js');
$htmlHeadXtra[] = api_get_css(api_get_path(WEB_LIBRARY_PATH).'javascript/jqplot/jquery.jqplot.css');
}
Display::display_header($nameTools);
$token = Security::get_token();
@ -1837,7 +1845,6 @@ 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);

@ -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,9 @@ class LearningCalendarPlugin extends Plugin
public function getCalendarsEventsByDate($calendarInfo, $start, $end, $type = 0, $getCount = false)
{
if (empty($calendarInfo)) {
if ($getCount) {
return 0;
}
return [];
}
@ -503,9 +519,11 @@ class LearningCalendarPlugin extends Plugin
];
Database::insert('learning_calendar_user', $params);
return true;
}
return true;
return false;
}
/**
@ -795,7 +813,37 @@ 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><script>
$(document).ready(function(){
  var cosPoints = '.$listToString.';
  var plot1 = $.jqplot(\'control_point_chart\', [cosPoints], { 
     series:[{showMarker:true, markerOptions:{style:\'square\'}}],
      axes:{
        xaxis:{
          label: "'.$date.'",
renderer: $.jqplot.DateAxisRenderer,
tickOptions:{formatString: "%Y-%m-%d"},
tickInterval: \'30 day\'
        },
yaxis:{
          label: "'.$controlPoint.'",
max: "100"
        }
      }
  });
});
</script>';
}
$html = Display::panel($html, $this->get_lang('LearningCalendar'));
@ -973,7 +1021,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 +1037,87 @@ 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]);
}
}

@ -14,3 +14,10 @@ $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';

Loading…
Cancel
Save