/home/edulekha/crm.edulekha.com/application/views/admin/staff/timesheets.php
<?php defined('BASEPATH') or exit('No direct script access allowed'); ?>
<?php init_head(); ?>
<div id="wrapper">
<div class="content">
<?php if (! isset($view_all)) { ?>
<?php $this->load->view('admin/staff/stats'); ?>
<?php } ?>
<div class="row">
<div class="col-md-12">
<div class="panel_s">
<div class="panel-body">
<?php if (staff_can('view-timesheets', 'reports')) { ?>
<a href="<?= site_url($this->uri->uri_string() . (! isset($view_all) ? '?view=all' : '')); ?>"
class="btn btn-primary tw-capitalize"><i class="fa-regular fa-clock"></i>
<?= isset($view_all) ? _l('my_timesheets') : _l('view_members_timesheets');
?>
</a>
<hr />
<?php } ?>
<canvas id="timesheetsChart" style="max-height:400px;" width="350" height="350"></canvas>
<hr />
<div class="clearfix"></div>
<div class="row">
<div class="col-md-5ths">
<div class="select-placeholder">
<select name="range" id="range" class="selectpicker" data-width="100%">
<option value="today" selected>
<?= _l('today'); ?>
</option>
<option value="this_month">
<?= _l('staff_stats_this_month_total_logged_time'); ?>
</option>
<option value="last_month">
<?= _l('staff_stats_last_month_total_logged_time'); ?>
</option>
<option value="this_week">
<?= _l('staff_stats_this_week_total_logged_time'); ?>
</option>
<option value="last_week">
<?= _l('staff_stats_last_week_total_logged_time'); ?>
</option>
<option value="period">
<?= _l('period_datepicker'); ?>
</option>
</select>
</div>
<div class="row mtop15">
<div class="col-md-12 period hide">
<?= render_date_input('period-from'); ?>
</div>
<div class="col-md-12 period hide">
<?= render_date_input('period-to'); ?>
</div>
</div>
</div>
<?php if (isset($view_all)) { ?>
<div class="col-md-5ths">
<div class="select-placeholder">
<select name="staff_id" id="staff_id" class="selectpicker" data-width="100%">
<option value="">
<?= _l('all_staff_members'); ?>
</option>
<option
value="<?= get_staff_user_id(); ?>">
<?= e(get_staff_full_name(get_staff_user_id())); ?>
</option>
<?php foreach ($staff_members_with_timesheets as $staff) { ?>
<option
value="<?= e($staff['staff_id']); ?>">
<?= e(get_staff_full_name($staff['staff_id'])); ?>
</option>
<?php } ?>
</select>
</div>
</div>
<?php } ?>
<div class="col-md-5ths">
<div class="select-placeholder">
<select id="clientid" name="clientid" data-live-search="true" data-width="100%"
class="ajax-search"
data-empty-title="<?= _l('client'); ?>"
data-none-selected-text="<?= _l('client'); ?>">
</select>
</div>
</div>
<div class="col-md-5ths">
<div class="select-placeholder projects-wrapper">
<div id="project_ajax_search_wrapper">
<select
data-empty-title="<?= _l('project'); ?>"
multiple="true" name="project_id[]" id="project_id"
class="projects ajax-search" data-live-search="true" data-width="100%">
</select>
</div>
</div>
</div>
<div class="col-md-5ths">
<a href="#" id="apply_filters_timesheets"
class="btn btn-primary pull-left"><?= _l('apply'); ?></a>
</div>
<div class="mtop10 hide relative pull-right" id="group_by_tasks_wrapper">
<span><?= _l('group_by_task'); ?></span>
<div class="onoffswitch">
<input type="checkbox" name="group_by_task" class="onoffswitch-checkbox"
id="group_by_task">
<label class="onoffswitch-label" for="group_by_task"></label>
</div>
</div>
<div class="col-md-12">
<hr class="no-mtop" />
</div>
</div>
<div class="clearfix"></div>
<table class="table table-timesheets-report">
<thead>
<tr>
<?php if (isset($view_all)) { ?>
<th><?= _l('staff_member'); ?>
</th>
<?php } ?>
<th><?= _l('project_timesheet_task'); ?>
</th>
<th><?= _l('timesheet_tags'); ?>
</th>
<?php if (get_option('round_off_task_timer_option') == 0) { ?>
<th class="t-start-time">
<?= _l('project_timesheet_start_time'); ?>
</th>
<th class="t-end-time">
<?= _l('project_timesheet_end_time'); ?>
</th>
<?php } ?>
<th width="150px;">
<?= _l('note'); ?>
</th>
<th><?= _l('task_relation'); ?>
</th>
<th><?= _l('time_h'); ?>
</th>
<th><?= _l('time_decimal'); ?>
</th>
</tr>
</thead>
<tbody></tbody>
<tfoot>
<tr>
<?php if (isset($view_all)) { ?>
<td></td>
<?php } ?>
<td></td>
<td></td>
<?php if (get_option('round_off_task_timer_option') == 0) { ?>
<td></td>
<td></td>
<?php } ?>
<td></td>
<td></td>
<td class="total_logged_time_timesheets_staff_h"></td>
<td class="total_logged_time_timesheets_staff_d"></td>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<?php init_tail(); ?>
<script>
var staff_member_select = $('select[name="staff_id"]');
$(function() {
init_ajax_projects_search();
var ctx = document.getElementById("timesheetsChart");
var chartOptions = {
type: 'bar',
data: {
labels: [],
datasets: [{
label: '',
data: [],
backgroundColor: [],
borderColor: [],
borderWidth: 1
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
tooltips: {
enabled: true,
mode: 'single',
callbacks: {
label: function(tooltipItems, data) {
return decimalToHM(tooltipItems.yLabel);
}
}
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
min: 0,
userCallback: function(label, index, labels) {
return decimalToHM(label);
},
}
}]
},
}
};
var timesheetsTable = $('.table-timesheets-report');
$('#apply_filters_timesheets').on('click', function(e) {
e.preventDefault();
timesheetsTable.DataTable().ajax.reload();
});
$('body').on('change', '#group_by_task', function() {
<?php if (get_option('round_off_task_timer_option') == 0) { ?>
var tApi = timesheetsTable.DataTable();
var visible = $(this).prop('checked') == false;
var tEndTimeIndex = $('.t-end-time').index();
var tStartTimeIndex = $('.t-start-time').index();
if (tEndTimeIndex == -1 && tStartTimeIndex == -1) {
tStartTimeIndex = $(this).attr('data-start-time-index');
tEndTimeIndex = $(this).attr('data-end-time-index');
} else {
$(this).attr('data-start-time-index', tStartTimeIndex);
$(this).attr('data-end-time-index', tEndTimeIndex);
}
tApi.column(tEndTimeIndex).visible(visible, false).columns.adjust();
tApi.column(tStartTimeIndex).visible(visible, false).columns.adjust();
tApi.ajax.reload();
<?php } else { ?>
timesheetsTable.DataTable().ajax.reload();
<?php } ?>
});
var timesheetsChart;
var Timesheets_ServerParams = {};
Timesheets_ServerParams['range'] = '[name="range"]';
Timesheets_ServerParams['period-from'] = '[name="period-from"]';
Timesheets_ServerParams['period-to'] = '[name="period-to"]';
Timesheets_ServerParams['staff_id'] = '[name="staff_id"]';
Timesheets_ServerParams['project_id'] = 'select#project_id';
Timesheets_ServerParams['clientid'] = 'select#clientid';
Timesheets_ServerParams['group_by_task'] = '[name="group_by_task"]:checked';
initDataTable('.table-timesheets-report', window.location.href, undefined, undefined,
Timesheets_ServerParams, [
<?php if (isset($view_all)) {
echo 3;
} else {
echo 2;
} ?>
, 'desc'
]);
init_ajax_project_search_by_customer_id();
$('#clientid').on('change', function() {
var projectAjax = $('select#project_id');
var clonedProjectsAjaxSearchSelect = projectAjax.html('').clone();
var projectsWrapper = $('.projects-wrapper');
projectAjax.selectpicker('destroy').remove();
projectAjax = clonedProjectsAjaxSearchSelect;
$('#project_ajax_search_wrapper').append(clonedProjectsAjaxSearchSelect);
init_ajax_project_search_by_customer_id();
});
timesheetsTable.on('init.dt', function() {
var $dtFilter = $('body').find('.dataTables_filter');
var $gr = $('#group_by_tasks_wrapper').clone()
$('#group_by_tasks_wrapper').remove();
$gr.removeClass('hide');
$gr.find('span').css('position', 'absolute');
$gr.find('span').css('top', '1px');
$gr.find('span').css((isRTL == 'true' ? 'right' : 'left'), '-110px');
$dtFilter.before($gr, '<div class="clearfix"></div>');
$dtFilter.addClass('mtop15');
});
timesheetsTable.on('draw.dt', function() {
var TimesheetsTable = $(this).DataTable();
var logged_time = TimesheetsTable.ajax.json().logged_time;
var chartResponse = TimesheetsTable.ajax.json().chart;
var chartType = TimesheetsTable.ajax.json().chart_type;
$(this).find('tfoot').addClass('bold');
$(this).find('tfoot td.total_logged_time_timesheets_staff_h').html(
"<?= _l('total_logged_hours_by_staff'); ?>: " +
logged_time.total_logged_time_h);
$(this).find('tfoot td.total_logged_time_timesheets_staff_d').html(
"<?= _l('total_logged_hours_by_staff'); ?>: " +
logged_time.total_logged_time_d);
if (typeof(timesheetsChart) !== 'undefined') {
timesheetsChart.destroy();
}
if (chartType != 'month') {
chartOptions.data.labels = chartResponse.labels;
} else {
chartOptions.data.labels = [];
for (var i in chartResponse.labels) {
chartOptions.data.labels.push(moment(chartResponse.labels[i]).format("MMM Do YY"));
}
}
chartOptions.data.datasets[0].data = [];
chartOptions.data.datasets[0].backgroundColor = [];
chartOptions.data.datasets[0].borderColor = [];
for (var i in chartResponse.data) {
chartOptions.data.datasets[0].data.push(chartResponse.data[i]);
if (chartResponse.data[i] == 0) {
chartOptions.data.datasets[0].backgroundColor.push('rgba(167, 167, 167, 0.6)');
chartOptions.data.datasets[0].borderColor.push('rgba(167, 167, 167, 1)');
} else {
chartOptions.data.datasets[0].backgroundColor.push('rgba(132, 197, 41, 0.6)');
chartOptions.data.datasets[0].borderColor.push('rgba(132, 197, 41, 1)');
}
}
var selected_staff_member = staff_member_select.val();
var selected_staff_member_name = staff_member_select.find('option:selected').text();
chartOptions.data.datasets[0].label = $('select[name="range"] option:selected').text() + (
selected_staff_member != '' && selected_staff_member != undefined ? ' - ' +
selected_staff_member_name : '');
setTimeout(function() {
timesheetsChart = new Chart(ctx, chartOptions);
}, 30);
do_timesheets_title();
});
});
function do_timesheets_title() {
var _temp;
var range = $('select[name="range"]');
var _range_heading = range.find('option:selected').text();
if (range.val() != 'period') {
_temp = _range_heading;
} else {
_temp = _range_heading + ' (' + $('input[name="period-from"]').val() + ' - ' + $('input[name="period-to"]')
.val() + ') ';
}
$('head title').html(_temp + (staff_member_select.find('option:selected').text() != '' ? ' - ' +
staff_member_select
.find('option:selected').text() : ''));
}
</script>
</body>
</html>