Change all lists to use ajax data source and high perf datatable + improve all consuming listing queries + add indexes on numbers for perf improvment

This commit is contained in:
osaajani 2020-09-23 03:02:13 +02:00
parent 52ac5b459b
commit b98d5a22ef
34 changed files with 1238 additions and 767 deletions

View file

@ -35,62 +35,27 @@
</div>
<div class="panel-body">
<form method="GET">
<?php if (!$sendeds) { ?>
<p>Aucun SMS n'a été envoyé pour le moment.</p>
<?php } else { ?>
<div class="table-sendeds">
<table class="table table-bordered table-hover table-striped datatable" id="table-sendeds">
<thead>
<tr>
<th>De</th>
<th>À</th>
<th>Message</th>
<th>Date</th>
<th>Statut</th>
<?php if ($_SESSION['user']['admin']) { ?>
<th class="checkcolumn">&#10003;</th>
<?php } ?>
</tr>
</thead>
<tbody>
<?php foreach ($sendeds as $sended) { ?>
<tr>
<td class="no-wrap"><?php $this->s($sended['phone_name'] ?? 'Inconnu'); ?></td>
<td class="no-wrap">
<?php if ($sended['contact'] ?? false) { ?>
<?php echo \controllers\internals\Tool::phone_link($sended['destination']) . ' (' . $sended['contact'] . ')'; ?>
<?php } else { ?>
<?php echo \controllers\internals\Tool::phone_link($sended['destination']); ?>
<?php } ?>
</td>
<td><?php $this->s($sended['text']); ?></td>
<td><?php $this->s($sended['at']); ?></td>
<?php if ($sended['status'] == 'unknown') { ?>
<td>Inconnu</td>
<?php } elseif ($sended['status'] == 'delivered') { ?>
<td>Délivré</td>
<?php } elseif ($sended['status'] == 'failed') { ?>
<td>Échoué</td>
<?php } ?>
<?php if ($_SESSION['user']['admin']) { ?>
<td><input name="ids[]" type="checkbox" value="<?php $this->s($sended['id']); ?>"></td>
<?php } ?>
</tr>
<?php } ?>
</tbody>
</table>
<div class="table-sendeds">
<table class="table table-bordered table-hover table-striped datatable" id="table-sendeds">
<thead>
<tr>
<th>De</th>
<th>À</th>
<th>Message</th>
<th>Date</th>
<th>Statut</th>
<th class="checkcolumn">&#10003;</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div>
<div class="text-right col-xs-12 no-padding">
<strong>Action pour la séléction :</strong>
<button class="btn btn-default btn-confirm" type="submit" formaction="<?php echo \descartes\Router::url('Sended', 'delete', ['csrf' => $_SESSION['csrf']]); ?>"><span class="fa fa-trash-o"></span> Supprimer</button>
</div>
<div>
<?php if ($_SESSION['user']['admin']) { ?>
<div class="text-right col-xs-12 no-padding">
<strong>Action pour la séléction :</strong>
<button class="btn btn-default btn-confirm" type="submit" formaction="<?php echo \descartes\Router::url('Sended', 'delete', ['csrf' => $_SESSION['csrf']]); ?>"><span class="fa fa-trash-o"></span> Supprimer</button>
</div>
<?php } ?>
</div>
<?php } ?>
</div>
</div>
</form>
</div>
@ -100,21 +65,64 @@
</div>
</div>
<script>
jQuery(document).ready(function ()
{
jQuery('.action-dropdown a').on('click', function (e)
{
e.preventDefault();
var destination = jQuery(this).parents('.action-dropdown').attr('destination');
var url = jQuery(this).attr('href');
jQuery(destination).find('input:checked').each(function ()
{
url += '/' + jQuery(this).val();
});
window.location = url;
});
jQuery(document).ready(function ()
{
jQuery('.datatable').DataTable({
"pageLength": 25,
"bLengthChange": false,
"language": {
"url": HTTP_PWD + "/assets/js/datatables/french.json",
},
"columnDefs": [{
'targets': 'checkcolumn',
'orderable': false,
}],
});
"ajax": {
'url': '<?php echo \descartes\Router::url('Sended', 'list_json'); ?>',
'dataSrc': 'data',
},
"columns" : [
{data: 'phone_name', render: jQuery.fn.dataTable.render.text()},
{
data: 'destination',
render: function (data, type, row, meta) {
if (row.contact_name) {
return row.destination_formatted + ' (' + jQuery.fn.dataTable.render.text().display(row.contact_name) + ')';
}
return row.destination_formatted;
},
},
{data: 'text', render: jQuery.fn.dataTable.render.text()},
{data: 'at', render: jQuery.fn.dataTable.render.text()},
{
data: 'status',
render: function (data, type, row, meta) {
switch (data) {
case 'failed':
return 'Échec';
break;
case 'delivered':
return 'Délivré';
default:
return 'Inconnu';
}
},
},
{
data: 'id',
render: function (data, type, row, meta) {
return '<input name="ids[]" type="checkbox" value="' + data + '">';
},
},
],
"deferRender": true
});
});
</script>
<?php
$this->render('incs/footer');