Skip to content

Commit b39ec60

Browse files
authored
Merge pull request #6600 from yverhenne/improve-summary-section-in-mystudent.php
Tracking: #improve-option-summary-section-in-mystudent.php
2 parents 69c6e08 + 581252c commit b39ec60

File tree

2 files changed

+189
-24
lines changed

2 files changed

+189
-24
lines changed

main/mySpace/myStudents.php

Lines changed: 91 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,18 +1258,35 @@
12581258
}
12591259
}
12601260
$timeSpentLastWeek = api_time_to_hms($timeSeconds);
1261+
$detailsUrl = api_get_path(WEB_CODE_PATH)
1262+
.'mySpace/time_report_last_week.php?student='.$student_id
1263+
.'&start='.$startWeek.'&end='.$endWeek;
12611264
$timeContent = '<div class="text-center">';
12621265
$timeContent .= Display::return_icon('clock.png', get_lang('TimeSpentLastWeek'), [], ICON_SIZE_MEDIUM);
1263-
$timeContent .= ' '.$timeSpentLastWeek;
1266+
$timeContent .= '<div>'.$timeSpentLastWeek.'</div>';
1267+
$timeContent .= '<div>&nbsp;</div>';
1268+
$timeContent .= '<div><a href="'.$detailsUrl.'"'
1269+
.' onclick="window.open(this.href, \'timeReportDetails\','
1270+
.' \'width=800,height=600,scrollbars=yes\'); return false;">'
1271+
.get_lang('Details').'</a></div>';
1272+
$timeContent .= '<div>&nbsp;</div>';
1273+
$timeContent .= '<div>'
1274+
.'<a href="'.$detailsUrl.'&export=pdf">'
1275+
.Display::return_icon('pdf.png', get_lang('ExportPDF'), [], ICON_SIZE_MEDIUM)
1276+
.'</a> '
1277+
.'<a href="'.$detailsUrl.'&export=xls">'
1278+
.Display::return_icon('export_excel.png', get_lang('ExportAsXLS'), [], ICON_SIZE_MEDIUM)
1279+
.'</a></div>';
12641280
$timeContent .= '</div>';
12651281
$timePanel = Display::panel($timeContent, get_lang('TimeSpentInCoursesLastWeek'));
12661282

1267-
$donutContent = '<div class="easy-donut text-center">';
1268-
$donutContent .= '<div id="easypiechart-session-avg" class="easypiechart" data-percent="'.$avgSessionsProgress.'">';
1269-
$donutContent .= '<span class="percent">'.$avgSessionsProgress.'%</span>';
1270-
$donutContent .= '</div>';
1271-
$donutContent .= '</div>';
1272-
$donutPanel = Display::panel($donutContent, get_lang('AverageProgressInSessions'));
1283+
$avgProgressContent = '<div class="text-center">';
1284+
$avgProgressContent .= '<div id="avg-sessions-progress" class="easypiechart" data-percent="'.$avgSessionsProgress.'">';
1285+
$avgProgressContent .= '<span class="percent">'.$avgSessionsProgress.'%</span>';
1286+
$avgProgressContent .= '</div>';
1287+
$avgProgressContent .= '</div>';
1288+
$avgProgressContent .= "<script>\n $(function() {\n $('#avg-sessions-progress').easyPieChart({\n scaleColor: false,\n lineWidth: 8,\n barColor: '#3ba557',\n trackColor: '#f2f2f2'\n });\n });\n </script>";
1289+
$avgProgressPanel = Display::panel($avgProgressContent, get_lang('AverageProgressInSessions'));
12731290

12741291
$sessionBars = '';
12751292
foreach ($sessionProgressList as $item) {
@@ -1278,26 +1295,76 @@
12781295
$sessionBars .= '<div class="progress-bar progress-bar-success" role="progressbar" style="width: '.$item['progress'].'%;">'.$item['progress'].'%</div>';
12791296
$sessionBars .= '</div>';
12801297
}
1281-
$sessionBarsPanel = Display::panel($sessionBars);
1298+
$sessionBarsAccordion = Display::panelCollapse(
1299+
get_lang('ProgressionInSessions'),
1300+
$sessionBars,
1301+
'panel-session-progress',
1302+
[],
1303+
'accordion-session-progress',
1304+
'collapse-session-progress',
1305+
false,
1306+
true
1307+
);
12821308

1283-
$sessionProgressHtml = '<div class="row session-progress-section">';
1284-
$sessionProgressHtml .= '<div class="col-md-6">'.$sessionBarsPanel.'</div>';
1285-
$sessionProgressHtml .= '<div class="col-md-6 text-center">';
1286-
$sessionProgressHtml .= $donutPanel;
1287-
$sessionProgressHtml .= $timePanel;
1288-
$sessionProgressHtml .= '</div>';
1309+
$sessionProgressHtml = '<div class="row session-progress-section" style="display:flex;flex-wrap:wrap;align-items:stretch;">';
1310+
$sessionProgressHtml .= '<div class="col-md-6 text-center" style="display:flex;"><div style="flex:1;">'.$avgProgressPanel.'</div></div>';
1311+
$sessionProgressHtml .= '<div class="col-md-6" style="display:flex;"><div style="flex:1;">'.$timePanel.'</div></div>';
12891312
$sessionProgressHtml .= '</div>';
1313+
$sessionProgressHtml .= $sessionBarsAccordion;
1314+
1315+
// Weekly time spent summary table - vertical layout displayed in 4 columns
1316+
$weeksToShow = 52;
1317+
$currentMonday = strtotime('monday this week');
1318+
$weekData = [];
1319+
for ($i = 1; $i <= $weeksToShow; $i++) {
1320+
$weekStart = strtotime('-'.$i.' week', $currentMonday);
1321+
$weekEnd = $weekStart + (6 * 86400);
1322+
$startDate = date('Y-m-d', $weekStart);
1323+
$endDate = date('Y-m-d', $weekEnd);
1324+
$reportWeek = Tracking::generateReport('time_report', [$student_id], $startDate, $endDate);
1325+
$weekSeconds = 0;
1326+
foreach ($reportWeek['rows'] as $reportRow) {
1327+
$parts = explode(':', $reportRow[6]);
1328+
if (count($parts) === 3) {
1329+
[$h, $m, $s] = array_map('intval', $parts);
1330+
$weekSeconds += ($h * 3600) + ($m * 60) + $s;
1331+
}
1332+
}
1333+
$label = date('Y', $weekStart).' - '.date('W', $weekStart);
1334+
$weekData[] = [
1335+
'label' => $label,
1336+
'time' => api_time_to_hms($weekSeconds),
1337+
];
1338+
}
1339+
1340+
$tablesHtml = '<div class="row">';
1341+
$tablesCount = 4;
1342+
$weeksPerTable = (int) ceil($weeksToShow / $tablesCount);
1343+
$index = 0;
1344+
for ($table = 0; $table < $tablesCount; $table++) {
1345+
$tableHtml = '<table class="table table-bordered table-condensed">';
1346+
$tableHtml .= '<thead><tr><th>'.get_lang('Week').'</th><th>'.get_lang('LatencyTimeSpent').'</th></tr></thead><tbody>';
1347+
for ($j = 0; $j < $weeksPerTable && $index < count($weekData); $j++, $index++) {
1348+
$label = Security::remove_XSS($weekData[$index]['label']);
1349+
$time = $weekData[$index]['time'];
1350+
$tableHtml .= '<tr><th class="text-center">'.$label.'</th><td class="text-right">'.$time.'</td></tr>';
1351+
}
1352+
$tableHtml .= '</tbody></table>';
1353+
$tablesHtml .= '<div class="col-md-3">'.$tableHtml.'</div>';
1354+
}
1355+
$tablesHtml .= '</div>';
1356+
$weeklySummaryPanel = Display::panelCollapse(
1357+
get_lang('WeeklyTimeSummary'),
1358+
$tablesHtml,
1359+
'panel-weekly-summary',
1360+
[],
1361+
'accordion-weekly-summary',
1362+
'collapse-weekly-summary',
1363+
false
1364+
);
1365+
1366+
$sessionProgressHtml .= $weeklySummaryPanel;
12901367
echo Display::panel($sessionProgressHtml, '', '', 'default', $sessionProgressHeading);
1291-
echo "<script>
1292-
$(function () {
1293-
$('#easypiechart-session-avg').easyPieChart({
1294-
scaleColor: false,
1295-
barColor: '#30a5ff',
1296-
lineWidth: 8,
1297-
trackColor: '#f2f2f2'
1298-
});
1299-
});
1300-
</script>";
13011368
}
13021369

13031370
echo MyStudents::getBlockForSkills(
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?php
2+
/* For licensing terms, see /license.txt */
3+
4+
require_once __DIR__.'/../inc/global.inc.php';
5+
api_block_anonymous_users(true);
6+
if (api_is_student()) {
7+
api_not_allowed(true);
8+
}
9+
10+
$studentId = isset($_GET['student']) ? (int) $_GET['student'] : 0;
11+
if (empty($studentId)) {
12+
api_not_allowed(true);
13+
}
14+
15+
$start = isset($_GET['start']) ? $_GET['start'] : '';
16+
$end = isset($_GET['end']) ? $_GET['end'] : '';
17+
18+
if (empty($start) || empty($end)) {
19+
$aLastWeek = get_last_week();
20+
$start = date('Y-m-d', $aLastWeek[0]);
21+
$end = date('Y-m-d', $aLastWeek[6]);
22+
}
23+
24+
$report = Tracking::generateReport('time_report', [$studentId], $start, $end);
25+
$rows = [];
26+
if (!empty($report)) {
27+
$rows = $report['rows'];
28+
array_unshift($rows, $report['headers']);
29+
}
30+
31+
$export = isset($_GET['export']) ? $_GET['export'] : '';
32+
if ($export === 'xls') {
33+
Export::arrayToXls($rows, 'time_report');
34+
exit;
35+
} elseif ($export === 'pdf') {
36+
$params = ['filename' => 'time_report'];
37+
Export::export_table_pdf($rows, $params);
38+
exit;
39+
}
40+
41+
$table = '';
42+
if (!empty($rows)) {
43+
$headers = array_shift($rows);
44+
$colors = ['#cce5ff', '#ffe5b4'];
45+
$colorIndex = 0;
46+
47+
// Group entries by starting date (column index 4)
48+
$grouped = [];
49+
foreach ($rows as $row) {
50+
$dateKey = substr($row[4], 0, 10);
51+
$grouped[$dateKey][] = $row;
52+
}
53+
54+
$table = '<table class="data_table" style="border-collapse:collapse;border:1px solid #ccc;">';
55+
$table .= '<tr>';
56+
foreach ($headers as $header) {
57+
$table .= '<th style="border:1px solid #ccc;padding-left:5px;">'.htmlspecialchars($header).'</th>';
58+
}
59+
$table .= '</tr>';
60+
61+
foreach ($grouped as $day => $dayRows) {
62+
$totalSeconds = 0;
63+
foreach ($dayRows as $row) {
64+
$table .= '<tr style="background-color:'.$colors[$colorIndex].'">';
65+
foreach ($row as $cell) {
66+
$table .= '<td style="border:1px solid #ccc;padding-left:5px;">'.htmlspecialchars($cell).'</td>';
67+
}
68+
$table .= '</tr>';
69+
70+
$parts = explode(':', $row[6]);
71+
if (count($parts) === 3) {
72+
$totalSeconds += ($parts[0] * 3600) + ($parts[1] * 60) + $parts[2];
73+
}
74+
}
75+
76+
$table .= '<tr style="background-color:'.$colors[$colorIndex].';font-weight:bold;">'
77+
.'<td colspan="'.(count($headers) - 1).'" style="text-align:right;border:1px solid #ccc;padding-left:5px;">'.get_lang('Total').'</td>'
78+
.'<td style="border:1px solid #ccc;padding-left:5px;">'.gmdate('H:i:s', $totalSeconds).'</td>'
79+
.'</tr>';
80+
81+
$colorIndex = 1 - $colorIndex;
82+
}
83+
84+
$table .= '</table>';
85+
}
86+
87+
$nameTools = get_lang('TimeReport');
88+
Display::display_header($nameTools);
89+
$baseUrl = api_get_self().'?student='.$studentId.'&start='.$start.'&end='.$end;
90+
echo '<div>'
91+
.'<a href="'.$baseUrl.'&export=pdf">'
92+
.Display::return_icon('pdf.png', get_lang('ExportPDF'), [], ICON_SIZE_MEDIUM)
93+
.'</a> '
94+
.'<a href="'.$baseUrl.'&export=xls">'
95+
.Display::return_icon('export_excel.png', get_lang('ExportAsXLS'), [], ICON_SIZE_MEDIUM)
96+
.'</a></div>';
97+
echo $table;
98+
Display::display_footer();

0 commit comments

Comments
 (0)