Attendance - Add interface fullscreen to use in tablet - refs BT#18271

pull/4300/head
Christian 3 years ago
parent 6897e97217
commit 414a99720e
  1. 29
      main/attendance/attendance_controller.php
  2. 161
      main/attendance/attendance_sheet.php
  3. 106
      main/attendance/attendance_sheet_fullscreen.php
  4. 165
      main/attendance/attendance_signature.inc.php
  5. 14
      main/attendance/index.php
  6. 15
      main/attendance/layout.php

@ -294,6 +294,7 @@ class AttendanceController
$data['attendance_id'] = $attendance_id;
$groupId = isset($_REQUEST['group_id']) ? $_REQUEST['group_id'] : null;
$data['users_in_course'] = $attendance->get_users_rel_course($attendance_id, $groupId);
$data['faults'] = [];
$filter_type = 'today';
if (!empty($_REQUEST['filter'])) {
@ -402,11 +403,37 @@ class AttendanceController
);
}
$attendanceInfo = $attendance->get_attendance_by_id($attendance_id);
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
$func = isset($_REQUEST['func']) ? $_REQUEST['func'] : null;
$calendarId = isset($_REQUEST['calendar_id']) ? (int) $_REQUEST['calendar_id'] : null;
$fullScreen = ($func == 'fullscreen' && $calendarId > 0 && $allowSignature);
$data['edit_table'] = intval($edit);
$data['is_locked_attendance'] = $attendance->is_locked_attendance($attendance_id);
$data['allowSignature'] = $allowSignature;
$data['fullScreen'] = $fullScreen;
$data['attendanceName'] = $attendanceInfo['name'];
if ($fullScreen) {
$uinfo = api_get_user_info();
$data['calendarId'] = $calendarId;
$data['trainer'] = api_get_person_name($uinfo['firstname'], $uinfo['lastname']);
$attendanceCalendar = $attendance->get_attendance_calendar(
$attendance_id,
'calendar_id',
$calendarId,
$groupId
);
$data['attendanceCalendar'] = $attendanceCalendar[0];
$this->view->set_template('attendance_sheet_fullscreen');
} else {
$this->view->set_template('attendance_sheet');
}
$this->view->set_data($data);
$this->view->set_layout('layout');
$this->view->set_template('attendance_sheet');
$this->view->render();
}

@ -18,7 +18,6 @@ $isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(
api_get_course_info()
) || api_is_drh();
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
$token = Security::get_token();
if (api_is_allowed_to_edit(null, true) ||
@ -279,6 +278,14 @@ if (api_is_allowed_to_edit(null, true) ||
['class' => 'img_lock', 'id' => 'datetime_column_'.$calendar['id']]
);
$iconFullScreen = '';
if ($allowSignature) {
$iconFullScreen = Display::url(
Display::return_icon('expand.png', get_lang('seeForTablet'), [], ICON_SIZE_SMALL),
api_get_self().'?'.api_get_cidreq().'&action=attendance_sheet_list&func=fullscreen&attendance_id='.$attendance_id.'&calendar_id='.$calendar['id']
);
}
if (!empty($calendar['done_attendance'])) {
$datetime = '<div class="blue">'.$date.' - '.$time.'</div>';
}
@ -293,7 +300,10 @@ if (api_is_allowed_to_edit(null, true) ||
$result .= '<th>';
$result .= '<div class="date-attendance">'.$datetime.'&nbsp;';
if (api_is_allowed_to_edit(null, true)) {
$result .= '<span id="attendance_lock" style="cursor:pointer">'.(!$is_locked_attendance || api_is_platform_admin() ? $img_lock : '').'</span>';
if (!empty($iconFullScreen)) {
$result .= '<span class="attendance-fullscreen">'.$iconFullScreen.'</span>&nbsp;';
}
$result .= '<span class="attendance_lock" style="cursor:pointer">'.(!$is_locked_attendance || api_is_platform_admin() ? $img_lock : '').'</span>';
}
if ($is_locked_attendance == false) {
@ -530,151 +540,6 @@ if (api_is_allowed_to_edit(null, true) ||
}
if ($allowSignature) {
?>
<div id="sign_popup" style="display: none">
<div id="signature_area" class="well">
<canvas width="400px"></canvas>
</div>
<span id="save_controls">
<button id="sign_popup_save" class="btn btn-primary" type="submit">
<em class="fa fa-save"></em> <?php echo get_lang('Save'); ?>
</button>
<button id="sign_popup_clean" class="btn btn-default" type="submit">
<em class="fa fa-eraser"></em> <?php echo get_lang('Clean'); ?>
</button>
</span>
<span id="remove_controls" clase="hidden">
<button id="sign_popup_remove" class="btn btn-danger" type="submit">
<em class="fa fa-remove"></em> <?php echo get_lang('Remove'); ?>
</button>
</span>
<span id="close_controls" style="display: none">
<span id="sign_results"></span>
<hr />
<button id="sign_popup_close" class="btn btn-default" type="submit">
<?php echo get_lang('Close'); ?>
</button>
</span>
<span class="loading" style="display: none"><em class="fa fa-spinner"></em></span>
<input type="hidden" id="sign-selected" />
</div>
<script>
var imageFormat = 'image/png';
var canvas = document.querySelector("#signature_area canvas");
var signaturePad = new SignaturePad(canvas);
var urlAjax = "<?php echo api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?'.api_get_cidreq(); ?>";
var attendance_id = "<?php echo $attendance_id; ?>";
$(function() {
$("#sign_popup_close").on("click", function() {
$("#sign_popup").dialog("close");
$('#loading').hide();
$('#save_controls').show();
$('#close_controls').hide();
$('#signature_area').show();
});
$("#sign_popup_clean").on("click", function() {
signaturePad.clear();
});
$("#sign_popup_remove").on("click", function() {
var selected = $("#sign-selected").val();
$.ajax({
beforeSend: function(result) {
$('#loading').show();
},
type: "POST",
url: urlAjax,
data: "a=remove_attendance_sign&selected="+selected+"&attendance_id="+attendance_id,
success: function(data) {
location.reload();
},
});
});
$("#sign_popup_save").on("click", function() {
if (signaturePad.isEmpty()) {
alert('<?php echo get_lang('ProvideASignatureFirst'); ?>');
return false;
}
var selected = $("#sign-selected").val();
var dataURL = signaturePad.toDataURL(imageFormat);
$.ajax({
beforeSend: function(result) {
$('#loading').show();
},
type: "POST",
url: urlAjax,
data: "a=sign_attendance&selected="+selected+"&file="+dataURL+"&attendance_id="+attendance_id,
success: function(data) {
$('#loading').hide();
$('#save_controls').hide();
$('#close_controls').show();
$('#signature_area').hide();
signaturePad.clear();
if (1 == data) {
$('#sign_results').html('<?php echo get_lang('Saved'); ?>');
} else {
$('#sign_results').html('<?php echo get_lang('Error'); ?>');
}
$('#sign_popup_close').hide();
location.reload();
},
});
});
$(".attendance-sign").on("click", function() {
$("#sign-selected").val($(this).attr("id"));
$("#sign_popup").dialog({
autoOpen: false,
width: 500,
height: 'auto',
close: function(){
}
});
$("#sign_popup").dialog("open");
$("#save_controls").show();
$("#remove_controls").hide();
$('#signature_area').show();
$('#signature_area').html("<canvas width='400px'></canvas>");
canvas = document.querySelector("#signature_area canvas");
signaturePad = new SignaturePad(canvas);
});
$(".attendance-sign-view").on("click", function() {
var selected = $(this).attr("id");
$('#loading').show();
$.ajax({
beforeSend: function(result) {
$('#signature_area').html("<em class='fa fa-spinner'></em>");
},
type: "POST",
url: urlAjax,
data: "a=get_attendance_sign&selected="+selected,
success: function(sign) {
$('#loading').hide();
$('#signature_area').show();
$('#signature_area').html("<img src='"+sign+"' />");
},
});
$("#sign_popup").dialog({
autoOpen: false,
width: 500,
height: 'auto',
close: function(){
}
});
$("#sign-selected").val(selected);
$("#sign_popup").dialog("open");
$("#save_controls").hide();
$("#remove_controls").show();
});
});
</script>
<?php
include_once 'attendance_signature.inc.php';
}
?>

@ -0,0 +1,106 @@
<header id="cm-header">
<!-- Topbar -->
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-3">
<div class="logo">
<a href="<?php echo api_get_path(WEB_PATH); ?>"><?php echo return_logo(); ?></a>
</div>
</div>
<div class="col-xs-12 col-md-9">
<div class="row">
<div class="col-sm-4">
</div>
<div class="col-sm-3">
</div>
<div class="col-sm-5">
<ol class="header-ol">
<?php echo returnNotificationMenu(); ?>
</ol>
</div>
</div>
</div>
</div>
</div>
<!-- Fixed navbar -->
<nav class="navbar navbar-default"></nav>
<div class="nav-tools">
</div>
</header>
<div class="container-fluid">
<h2><?php echo Display::page_header(get_lang('AttendanceSheetReport')); ?></h2>
<h3><?php echo $attendanceName; ?> <span class="label label-default"><?php echo $attendanceCalendar['date']; ?></span></h3>
<div class="well mt-2"><?php echo get_lang('Trainer').' : '.$trainer; ?></div>
<?php if (!empty($users_in_course)) { ?>
<div class="input-group">
<input type="text" id="search-user" onkeyup="searchUser()" placeholder="<?php echo get_lang('SearchUser'); ?>">
</div>
<form method="post" action="index.php?action=attendance_sheet_add&<?php echo api_get_cidreq().$param_filter; ?>&attendance_id=<?php echo $attendance_id; ?>" >
<table id="table-user-calendar" class="table table-hover">
<thead>
<tr>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<?php foreach ($users_in_course as $user) {
$attendance = new Attendance();
$signature = $attendance->getSignature($user['user_id'], $calendarId);
$signed = !empty($signature); ?>
<tr>
<td>
<?php
if ($signed) {
echo Display::return_icon('checkbox_on.png', get_lang('Presence'), null, ICON_SIZE_TINY);
} else {
echo Display::return_icon('checkbox_off.png', get_lang('Presence'), null, ICON_SIZE_TINY);
} ?>
</td>
<td><?php echo api_get_person_name($user['firstname'], $user['lastname']); ?></td>
<td>
<?php
if ($signed) {
echo '<div class="list-data">
<span class="item"></span>
<a id="sign-'.$user['user_id'].'-'.$calendarId.'" class="btn btn-primary attendance-sign-view" href="javascript:void(0)">
<em class="fa fa-search"></em> '.get_lang('SignView').'
</a>
</div>';
} else {
echo '<input type="hidden" name="check_presence['.$calendarId.'][]" value="'.$user['user_id'].'" />';
echo '<div class="list-data">
<span class="item"></span>
<a id="sign-'.$user['user_id'].'-'.$calendarId.'" class="btn btn-primary attendance-sign" href="javascript:void(0)">
<em class="fa fa-pencil"></em> '.get_lang('Sign').'
</a>
</div>';
} ?>
</td>
</tr>
<?php
} ?>
</tbody>
</table>
</form>
<?php } ?>
</div>
<?php
if ($allowSignature) {
include_once 'attendance_signature.inc.php';
}

@ -0,0 +1,165 @@
<div id="sign_popup" style="display: none">
<div id="signature_area" class="well">
<canvas width="400px"></canvas>
</div>
<span id="save_controls">
<button id="sign_popup_save" class="btn btn-primary" type="submit">
<em class="fa fa-save"></em> <?php echo get_lang('Save'); ?>
</button>
<button id="sign_popup_clean" class="btn btn-default" type="submit">
<em class="fa fa-eraser"></em> <?php echo get_lang('Clean'); ?>
</button>
</span>
<span id="remove_controls" clase="hidden">
<button id="sign_popup_remove" class="btn btn-danger" type="submit">
<em class="fa fa-remove"></em> <?php echo get_lang('Remove'); ?>
</button>
</span>
<span id="close_controls" style="display: none">
<span id="sign_results"></span>
<hr />
<button id="sign_popup_close" class="btn btn-default" type="submit">
<?php echo get_lang('Close'); ?>
</button>
</span>
<span class="loading" style="display: none"><em class="fa fa-spinner"></em></span>
<input type="hidden" id="sign-selected" />
</div>
<script>
var imageFormat = 'image/png';
var canvas = document.querySelector("#signature_area canvas");
var signaturePad = new SignaturePad(canvas);
var urlAjax = "<?php echo api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?'.api_get_cidreq(); ?>";
var attendance_id = "<?php echo $attendance_id; ?>";
$(function() {
$("#sign_popup_close").on("click", function() {
$("#sign_popup").dialog("close");
$('#loading').hide();
$('#save_controls').show();
$('#close_controls').hide();
$('#signature_area').show();
});
$("#sign_popup_clean").on("click", function() {
signaturePad.clear();
});
$("#sign_popup_remove").on("click", function() {
var selected = $("#sign-selected").val();
$.ajax({
beforeSend: function(result) {
$('#loading').show();
},
type: "POST",
url: urlAjax,
data: "a=remove_attendance_sign&selected="+selected+"&attendance_id="+attendance_id,
success: function(data) {
location.reload();
},
});
});
$("#sign_popup_save").on("click", function() {
if (signaturePad.isEmpty()) {
alert('<?php echo get_lang('ProvideASignatureFirst'); ?>');
return false;
}
var selected = $("#sign-selected").val();
var dataURL = signaturePad.toDataURL(imageFormat);
$.ajax({
beforeSend: function(result) {
$('#loading').show();
},
type: "POST",
url: urlAjax,
data: "a=sign_attendance&selected="+selected+"&file="+dataURL+"&attendance_id="+attendance_id,
success: function(data) {
$('#loading').hide();
$('#save_controls').hide();
$('#close_controls').show();
$('#signature_area').hide();
signaturePad.clear();
if (1 == data) {
$('#sign_results').html('<?php echo get_lang('Saved'); ?>');
} else {
$('#sign_results').html('<?php echo get_lang('Error'); ?>');
}
$('#sign_popup_close').hide();
location.reload();
},
});
});
$(".attendance-sign").on("click", function() {
$("#sign-selected").val($(this).attr("id"));
$("#sign_popup").dialog({
autoOpen: false,
width: 500,
height: 'auto',
close: function(){
}
});
$("#sign_popup").dialog("open");
$("#save_controls").show();
$("#remove_controls").hide();
$('#signature_area').show();
$('#signature_area').html("<canvas width='400px'></canvas>");
canvas = document.querySelector("#signature_area canvas");
signaturePad = new SignaturePad(canvas);
});
$(".attendance-sign-view").on("click", function() {
var selected = $(this).attr("id");
$('#loading').show();
$.ajax({
beforeSend: function(result) {
$('#signature_area').html("<em class='fa fa-spinner'></em>");
},
type: "POST",
url: urlAjax,
data: "a=get_attendance_sign&selected="+selected,
success: function(sign) {
$('#loading').hide();
$('#signature_area').show();
$('#signature_area').html("<img src='"+sign+"' />");
},
});
$("#sign_popup").dialog({
autoOpen: false,
width: 500,
height: 'auto',
close: function(){
}
});
$("#sign-selected").val(selected);
$("#sign_popup").dialog("open");
$("#save_controls").hide();
$("#remove_controls").show();
});
});
function searchUser() {
// Declare variables
var input, filter, table, tr, td, i, txtValue;
input = document.getElementById("search-user");
filter = input.value.toUpperCase();
table = document.getElementById("table-user-calendar");
tr = table.getElementsByTagName("tr");
// Loop through all table rows, and hide those who don\'t match the search query
for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td")[1];
if (td) {
txtValue = td.textContent || td.innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
</script>

@ -94,7 +94,7 @@ if (!empty($attendance_id)) {
$htmlHeadXtra[] = '<script>
$(function() {
$("table th img").click(function() {
$("table th .attendance_lock img").click(function() {
var col_id = this.id;
var col_split = col_id.split("_");
var calendar_id = col_split[2];
@ -192,6 +192,18 @@ $(function() {
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
if ($allowSignature) {
$htmlHeadXtra[] = api_get_asset('signature_pad/signature_pad.umd.js');
$htmlHeadXtra[] = '<style>
#search-user {
background-image: url("/main/img/icons/22/sn-search.png");
background-position: 10px 12px;
background-repeat: no-repeat;
width: 100%;
font-size: 16px;
padding: 12px 20px 12px 40px;
border: 1px solid #ddd;
margin: 12px 0px;
}
</style>';
}
$student_param = '';

@ -14,7 +14,14 @@ api_protect_course_script(true);
// Header
$tool = TOOL_ATTENDANCE;
Display::display_header('');
$func = isset($_REQUEST['func']) ? $_REQUEST['func'] : null;
if ('fullscreen' === $func) {
$htmlHeadXtra[] = api_get_css_asset('bootstrap/dist/css/bootstrap.min.css');
Display::display_reduced_header();
} else {
Display::display_header('');
}
// Introduction section
Display::display_introduction_section($tool);
@ -26,4 +33,8 @@ Event::event_access_tool($tool);
echo $content;
// Footer
Display::display_footer();
if ('fullscreen' === $func) {
Display::display_reduced_footer();
} else {
Display::display_footer();
}

Loading…
Cancel
Save