OPD medicine list: move DataTable to server-side ajax
This commit is contained in:
parent
c3bc8f89b8
commit
7ea22378f5
|
|
@ -1936,6 +1936,89 @@ class Opd_prescription extends BaseController
|
||||||
$scope = 'all';
|
$scope = 'all';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$query = $this->request->getGet();
|
||||||
|
$isDataTableRequest = is_array($query) && array_key_exists('draw', $query);
|
||||||
|
if ($isDataTableRequest) {
|
||||||
|
$draw = max(1, (int) ($query['draw'] ?? 1));
|
||||||
|
$start = max(0, (int) ($query['start'] ?? 0));
|
||||||
|
$length = (int) ($query['length'] ?? 25);
|
||||||
|
if ($length < 1 || $length > 500) {
|
||||||
|
$length = 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
$searchValue = '';
|
||||||
|
if (isset($query['search']) && is_array($query['search'])) {
|
||||||
|
$searchValue = trim((string) ($query['search']['value'] ?? ''));
|
||||||
|
}
|
||||||
|
|
||||||
|
$orderField = 'use_count';
|
||||||
|
$orderDir = 'desc';
|
||||||
|
$allowedOrderFields = ['id', 'item_name', 'use_count', 'last_used_at', 'genericname', 'company_name'];
|
||||||
|
if (isset($query['order'][0]) && is_array($query['order'][0])) {
|
||||||
|
$orderColIndex = (int) ($query['order'][0]['column'] ?? -1);
|
||||||
|
$orderDirCandidate = strtolower(trim((string) ($query['order'][0]['dir'] ?? 'desc')));
|
||||||
|
if (in_array($orderDirCandidate, ['asc', 'desc'], true)) {
|
||||||
|
$orderDir = $orderDirCandidate;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($orderColIndex >= 0 && isset($query['columns'][$orderColIndex]) && is_array($query['columns'][$orderColIndex])) {
|
||||||
|
$candidate = trim((string) ($query['columns'][$orderColIndex]['data'] ?? ''));
|
||||||
|
if (in_array($candidate, $allowedOrderFields, true)) {
|
||||||
|
$orderField = $candidate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$rows = $this->getOpdMedicineRows($filter, $scope, $showAll);
|
||||||
|
$recordsTotal = count($rows);
|
||||||
|
|
||||||
|
if ($searchValue !== '') {
|
||||||
|
$needle = mb_strtolower($searchValue);
|
||||||
|
$rows = array_values(array_filter($rows, static function (array $row) use ($needle): bool {
|
||||||
|
$haystack = [
|
||||||
|
(string) ($row['id'] ?? ''),
|
||||||
|
(string) ($row['item_name'] ?? ''),
|
||||||
|
(string) ($row['genericname'] ?? ''),
|
||||||
|
(string) ($row['company_name'] ?? ''),
|
||||||
|
(string) ($row['last_used_at'] ?? ''),
|
||||||
|
];
|
||||||
|
foreach ($haystack as $value) {
|
||||||
|
if (mb_stripos($value, $needle) !== false) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
$recordsFiltered = count($rows);
|
||||||
|
|
||||||
|
usort($rows, static function (array $a, array $b) use ($orderField, $orderDir): int {
|
||||||
|
$numericFields = ['id', 'use_count'];
|
||||||
|
if (in_array($orderField, $numericFields, true)) {
|
||||||
|
$cmp = ((int) ($a[$orderField] ?? 0)) <=> ((int) ($b[$orderField] ?? 0));
|
||||||
|
} else {
|
||||||
|
$cmp = strcasecmp((string) ($a[$orderField] ?? ''), (string) ($b[$orderField] ?? ''));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($cmp === 0) {
|
||||||
|
$cmp = strcasecmp((string) ($a['item_name'] ?? ''), (string) ($b['item_name'] ?? ''));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $orderDir === 'desc' ? -$cmp : $cmp;
|
||||||
|
});
|
||||||
|
|
||||||
|
$pageRows = array_slice($rows, $start, $length);
|
||||||
|
|
||||||
|
return $this->response->setJSON([
|
||||||
|
'draw' => $draw,
|
||||||
|
'recordsTotal' => $recordsTotal,
|
||||||
|
'recordsFiltered' => $recordsFiltered,
|
||||||
|
'data' => $pageRows,
|
||||||
|
'active_filter' => $filter,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
return $this->response->setJSON([
|
return $this->response->setJSON([
|
||||||
'rows' => $this->getOpdMedicineRows($filter, $scope, $showAll),
|
'rows' => $this->getOpdMedicineRows($filter, $scope, $showAll),
|
||||||
'active_filter' => $filter,
|
'active_filter' => $filter,
|
||||||
|
|
|
||||||
|
|
@ -285,62 +285,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadList() {
|
function loadList() {
|
||||||
var url = '<?= base_url('Opd_prescription/opd_medicince_data') ?>';
|
initMedMasterDataTable();
|
||||||
var query = [];
|
if (medMasterDataTable) {
|
||||||
if (activeListFilter !== 'all') {
|
medMasterDataTable.ajax.reload(null, true);
|
||||||
query.push('filter=' + encodeURIComponent(activeListFilter));
|
|
||||||
}
|
}
|
||||||
if (query.length) {
|
|
||||||
url += '?' + query.join('&');
|
|
||||||
}
|
|
||||||
|
|
||||||
apiGet(url, function(data) {
|
|
||||||
var rows = (data && data.rows) ? data.rows : [];
|
|
||||||
var $tb = $('#tbl_med_master tbody');
|
|
||||||
$tb.empty();
|
|
||||||
if (!rows.length) {
|
|
||||||
$tb.html('<tr><td colspan="9" class="text-muted">No medicine found</td></tr>');
|
|
||||||
if ($.fn.dataTable.isDataTable('#tbl_med_master')) {
|
|
||||||
$('#tbl_med_master').DataTable().clear().destroy();
|
|
||||||
medMasterDataTable = null;
|
|
||||||
}
|
|
||||||
if (activeListFilter === 'generic_issue') {
|
|
||||||
setMsg('normal', 'No record found with Generic/Salt issue.');
|
|
||||||
} else if (activeListFilter === 'generic_same_name') {
|
|
||||||
setMsg('normal', 'No record found where Generic/Salt is same as Medicine Name.');
|
|
||||||
} else if (activeListFilter === 'company_blank') {
|
|
||||||
setMsg('normal', 'No record found with blank Company Name.');
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
rows.forEach(function(row) {
|
|
||||||
var medId = parseInt(row.id || 0, 10);
|
|
||||||
var isFav = parseInt(row.is_favorite || 0, 10) === 1;
|
|
||||||
var favBtn = '<button type="button" class="btn btn-sm ' + (isFav ? 'btn-warning' : 'btn-outline-warning') + ' btn-med-fav" data-id="' + medId + '">' + (isFav ? '★' : '☆') + '</button>';
|
|
||||||
$tb.append('<tr id="med_row_' + (row.id || 0) + '">'
|
|
||||||
+ '<td>' + (row.id || 0) + '</td>'
|
|
||||||
+ '<td>' + favBtn + '</td>'
|
|
||||||
+ '<td>' + $('<div>').text(row.item_name || '').html() + '</td>'
|
|
||||||
+ '<td>' + parseInt(row.use_count || 0, 10) + '</td>'
|
|
||||||
+ '<td>' + $('<div>').text(row.last_used_at || '').html() + '</td>'
|
|
||||||
+ '<td>' + $('<div>').text(row.genericname || '').html() + '</td>'
|
|
||||||
+ '<td>' + $('<div>').text(row.company_name || '').html() + '</td>'
|
|
||||||
+ '<td><button type="button" class="btn btn-sm btn-outline-primary btn-med-edit" data-id="' + (row.id || 0) + '">Edit</button></td>'
|
|
||||||
+ '<td><button type="button" class="btn btn-sm btn-outline-danger btn-med-remove" data-id="' + (row.id || 0) + '">Remove</button></td>'
|
|
||||||
+ '</tr>');
|
|
||||||
});
|
|
||||||
|
|
||||||
initMedMasterDataTable();
|
|
||||||
|
|
||||||
if (activeListFilter === 'generic_issue') {
|
|
||||||
setMsg('normal', rows.length + ' record(s) with unclear Generic/Salt data.');
|
|
||||||
} else if (activeListFilter === 'generic_same_name') {
|
|
||||||
setMsg('normal', rows.length + ' record(s) where Generic/Salt matches Medicine Name.');
|
|
||||||
} else if (activeListFilter === 'company_blank') {
|
|
||||||
setMsg('normal', rows.length + ' record(s) with blank/unclear Company Name.');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function initMedMasterDataTable() {
|
function initMedMasterDataTable() {
|
||||||
|
|
@ -348,21 +296,124 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($.fn.dataTable.isDataTable('#tbl_med_master')) {
|
if (medMasterDataTable) {
|
||||||
$('#tbl_med_master').DataTable().clear().destroy();
|
return;
|
||||||
medMasterDataTable = null;
|
}
|
||||||
|
|
||||||
|
function esc(value) {
|
||||||
|
return $('<div>').text(value || '').html();
|
||||||
}
|
}
|
||||||
|
|
||||||
medMasterDataTable = $('#tbl_med_master').DataTable({
|
medMasterDataTable = $('#tbl_med_master').DataTable({
|
||||||
|
processing: true,
|
||||||
|
serverSide: true,
|
||||||
paging: true,
|
paging: true,
|
||||||
searching: true,
|
searching: true,
|
||||||
ordering: true,
|
ordering: true,
|
||||||
info: true,
|
info: true,
|
||||||
pageLength: 25,
|
pageLength: 25,
|
||||||
|
ajax: {
|
||||||
|
url: '<?= base_url('Opd_prescription/opd_medicince_data') ?>',
|
||||||
|
type: 'GET',
|
||||||
|
data: function(d) {
|
||||||
|
d.filter = activeListFilter;
|
||||||
|
d.scope = 'all';
|
||||||
|
d.show_all = 1;
|
||||||
|
},
|
||||||
|
dataSrc: function(json) {
|
||||||
|
var total = parseInt((json && json.recordsFiltered) || 0, 10);
|
||||||
|
if (!total) {
|
||||||
|
if (activeListFilter === 'generic_issue') {
|
||||||
|
setMsg('normal', 'No record found with Generic/Salt issue.');
|
||||||
|
} else if (activeListFilter === 'generic_same_name') {
|
||||||
|
setMsg('normal', 'No record found where Generic/Salt is same as Medicine Name.');
|
||||||
|
} else if (activeListFilter === 'company_blank') {
|
||||||
|
setMsg('normal', 'No record found with blank Company Name.');
|
||||||
|
} else {
|
||||||
|
setMsg('normal', 'No medicine found.');
|
||||||
|
}
|
||||||
|
} else if (activeListFilter === 'generic_issue') {
|
||||||
|
setMsg('normal', total + ' record(s) with unclear Generic/Salt data.');
|
||||||
|
} else if (activeListFilter === 'generic_same_name') {
|
||||||
|
setMsg('normal', total + ' record(s) where Generic/Salt matches Medicine Name.');
|
||||||
|
} else if (activeListFilter === 'company_blank') {
|
||||||
|
setMsg('normal', total + ' record(s) with blank/unclear Company Name.');
|
||||||
|
} else {
|
||||||
|
setMsg('normal', '');
|
||||||
|
}
|
||||||
|
return (json && json.data) ? json.data : [];
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
setMsg('err', 'Unable to load medicine list. Try Refresh.');
|
||||||
|
}
|
||||||
|
},
|
||||||
order: [[3, 'desc'], [2, 'asc']],
|
order: [[3, 'desc'], [2, 'asc']],
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
data: 'id',
|
||||||
|
render: function(data) {
|
||||||
|
return parseInt(data || 0, 10);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data: 'is_favorite',
|
||||||
|
render: function(data, type, row) {
|
||||||
|
var medId = parseInt((row && row.id) || 0, 10);
|
||||||
|
var isFav = parseInt(data || 0, 10) === 1;
|
||||||
|
return '<button type="button" class="btn btn-sm ' + (isFav ? 'btn-warning' : 'btn-outline-warning') + ' btn-med-fav" data-id="' + medId + '">' + (isFav ? '★' : '☆') + '</button>';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data: 'item_name',
|
||||||
|
render: function(data) {
|
||||||
|
return esc(data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data: 'use_count',
|
||||||
|
render: function(data) {
|
||||||
|
return parseInt(data || 0, 10);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data: 'last_used_at',
|
||||||
|
render: function(data) {
|
||||||
|
return esc(data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data: 'genericname',
|
||||||
|
render: function(data) {
|
||||||
|
return esc(data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data: 'company_name',
|
||||||
|
render: function(data) {
|
||||||
|
return esc(data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data: 'id',
|
||||||
|
render: function(data) {
|
||||||
|
var medId = parseInt(data || 0, 10);
|
||||||
|
return '<button type="button" class="btn btn-sm btn-outline-primary btn-med-edit" data-id="' + medId + '">Edit</button>';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data: 'id',
|
||||||
|
render: function(data) {
|
||||||
|
var medId = parseInt(data || 0, 10);
|
||||||
|
return '<button type="button" class="btn btn-sm btn-outline-danger btn-med-remove" data-id="' + medId + '">Remove</button>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
columnDefs: [
|
columnDefs: [
|
||||||
{ orderable: false, targets: [1, 7, 8] },
|
{ orderable: false, targets: [1, 7, 8] },
|
||||||
],
|
],
|
||||||
|
language: {
|
||||||
|
emptyTable: 'No medicine found'
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user