WIP #8 filtering

This commit is contained in:
Dr Masroor Ehsan 2025-01-20 14:33:01 +06:00
parent 58b7dde5ec
commit 15949214d4
3 changed files with 110 additions and 72 deletions

View File

@ -53,33 +53,7 @@ public function dataTable(QueryBuilder $query): EloquentDataTable
$rawColumns[] = $column; $rawColumns[] = $column;
} }
// Apply status filter $this->applyFilters($dataTable);
if (($status = strtolower($this->request()->get('status'))) && $status !== 'all') {
$dataTable->filter(function ($query) use ($status) {
switch ($status) {
case 'unread':
$query->where('report_status', '<', ReportStatus::Finalized->value);
break;
case 'read':
$query->where('report_status', '>=', ReportStatus::Finalized->value);
break;
case 'progress':
$query->whereNotNull('locked_at');
break;
}
});
}
// Apply date range filters
$this->filterDateRange($dataTable, 'study_date',
$this->request()->get('study_from'),
$this->request()->get('study_to'));
$this->filterDateRange($dataTable, 'received_at',
$this->request()->get('receive_from'),
$this->request()->get('receive_to'));
$this->filterModalities($dataTable, $this->request()->get('modality'));
$dataTable $dataTable
->orderColumn(WorklistColumn::PatientName->value, sprintf('%s $1', WorklistColumn::PatientName->value)) ->orderColumn(WorklistColumn::PatientName->value, sprintf('%s $1', WorklistColumn::PatientName->value))
@ -89,44 +63,6 @@ public function dataTable(QueryBuilder $query): EloquentDataTable
return $dataTable; return $dataTable;
} }
private function filterModalities(QueryDataTable $dataTable, ?string $request): void
{
if (blank($request)) {
return;
}
$modalities = collect(explode(',', $request))
->filter()
->each(fn ($m) => strtoupper($m))
->unique();
$dataTable->filter(function ($query) use ($modalities) {
$query->whereIn('modality', $modalities->toArray());
});
}
private function filterDateRange(QueryDataTable $dataTable, string $column, ?string $from, ?string $to): void
{
if (blank($from)) {
return;
}
$start = Carbon::parse($from);
$end = filled($to) ? Carbon::parse($to) : Carbon::today();
if ($start->eq($end)) {
$dataTable->filter(function ($query) use ($column, $start) {
$query->whereDate($column, $start);
});
} else {
$dataTable->filter(function ($query) use ($column, $start, $end) {
$query
->whereDate($column, '>=', $start)
->whereDate($column, '<=', $end);
});
}
}
/** /**
* Get the query source of dataTable. * Get the query source of dataTable.
*/ */
@ -291,6 +227,84 @@ protected function filename(): string
return Str::slug(implode(' ', $parts), '_'); return Str::slug(implode(' ', $parts), '_');
} }
private function applyFilters(QueryDataTable $dataTable)
{
$status = strtolower($this->request()->get('status'));
$studyFrom = $this->request()->get('study_from');
$studyTo = $this->request()->get('study_to');
$receiveFrom = $this->request()->get('receive_from');
$receiveTo = $this->request()->get('receive_to');
$assignFrom = $this->request()->get('assign_from');
$assignTo = $this->request()->get('assign_to');
$readFrom = $this->request()->get('read_from');
$readTo = $this->request()->get('read_to');
$modality = $this->request()->get('modality');
$dataTable->filter(
function ($query) use ($status, $studyFrom, $studyTo, $receiveFrom, $receiveTo, $modality, $assignFrom, $assignTo, $readFrom, $readTo) {
$this->filterStatus($query, $status);
$this->filterDateRange($query, 'study_date', $studyFrom, $studyTo);
$this->filterDateRange($query, 'received_at', $receiveFrom, $receiveTo);
$this->filterDateRange($query, 'assigned_at', $assignFrom, $assignTo);
$this->filterDateRange($query, 'read_at', $readFrom, $readTo);
$this->filterModalities($query, $modality);
}
);
}
private function filterStatus($query, ?string $status): void
{
if (blank($status)) {
return;
}
switch ($status) {
case 'unread':
$query->where('report_status', '<', ReportStatus::Finalized->value);
break;
case 'read':
$query->where('report_status', '>=', ReportStatus::Finalized->value);
break;
case 'progress':
$query->whereNotNull('locked_at');
break;
}
}
private function filterModalities($query, ?string $request): void
{
if (blank($request)) {
return;
}
$modalities = collect(explode(',', $request))
->filter()
->each(fn ($m) => strtoupper($m))
->unique()
->toArray();
$query->whereIn('modality', $modalities);
}
private function filterDateRange($query, string $column, ?string $from, ?string $to): void
{
if (blank($from)) {
return;
}
$start = Carbon::parse($from);
$end = filled($to) ? Carbon::parse($to) : null;
if (is_null($end) || $start->eq($end)) {
$query->whereDate($column, '=', $start);
} else {
$query
->whereDate($column, '>=', $start)
->whereDate($column, '<=', $end);
}
}
private function columTitle(string $str): string private function columTitle(string $str): string
{ {
return Str::of($str)->slug()->replace('-', ' ')->title()->toString(); return Str::of($str)->slug()->replace('-', ' ')->title()->toString();

View File

@ -51,7 +51,7 @@
@section('page-script') @section('page-script')
@vite([ @vite([
//'resources/assets/js/forms-pickers.js', 'resources/assets/js/cards-actions.js',
'resources/assets/js/ui-popover.js' 'resources/assets/js/ui-popover.js'
]) ])
@ -99,10 +99,11 @@
<script type="text/javascript"> <script type="text/javascript">
$(function () { $(function () {
let _status, _study_from, _study_to, _receive_from, _receive_to, _modality, _read_by = null; let _status, _study_from, _study_to, _receive_from, _receive_to, _assign_from, _assign_to, _read_from,
_read_to, _modality, _read_by = null;
function resetParams() { function resetParams() {
_status, _study_from, _study_to, _receive_from, _receive_to, _modality, _read_by = null; _status, _study_from, _study_to, _receive_from, _receive_to, _assign_from, _assign_to, _read_from, _read_to, _modality, _read_by = null;
} }
function generateUrl() { function generateUrl() {
@ -112,6 +113,10 @@ function generateUrl() {
if (_study_to) url.searchParams.set('study_to', _study_to); if (_study_to) url.searchParams.set('study_to', _study_to);
if (_receive_from) url.searchParams.set('receive_from', _receive_from); if (_receive_from) url.searchParams.set('receive_from', _receive_from);
if (_receive_to) url.searchParams.set('receive_to', _receive_to); if (_receive_to) url.searchParams.set('receive_to', _receive_to);
if (_assign_from) url.searchParams.set('assign_from', _assign_from);
if (_assign_to) url.searchParams.set('assign_to', _assign_to);
if (_read_from) url.searchParams.set('read_from', _read_from);
if (_read_to) url.searchParams.set('read_to', _read_to);
if (_modality) url.searchParams.set('modality', _modality); if (_modality) url.searchParams.set('modality', _modality);
if (_read_by) url.searchParams.set('read_by', _read_by); if (_read_by) url.searchParams.set('read_by', _read_by);
return url.toString(); return url.toString();
@ -134,6 +139,8 @@ function (givenDate) {
const fp_study = $('#study_date_range').flatpickr(date_range_config); const fp_study = $('#study_date_range').flatpickr(date_range_config);
const fp_receive = $('#receive_date_range').flatpickr(date_range_config); const fp_receive = $('#receive_date_range').flatpickr(date_range_config);
const fp_assign = $('#assign_date_range').flatpickr(date_range_config);
const fp_read = $('#read_date_range').flatpickr(date_range_config);
$('#search_button').on('click', function () { $('#search_button').on('click', function () {
resetParams(); resetParams();
@ -150,6 +157,18 @@ function (givenDate) {
_receive_to = formatDate(receive_range[1]); _receive_to = formatDate(receive_range[1]);
} }
const assign_range = fp_assign.selectedDates;
if (assign_range.length == 2) {
_assign_from = formatDate(assign_range[0]);
_assign_to = formatDate(assign_range[1]);
}
const read_range = fp_read.selectedDates;
if (read_range.length == 2) {
_read_from = formatDate(read_range[0]);
_read_to = formatDate(read_range[1]);
}
const modalityArray = []; const modalityArray = [];
@foreach ($modalities as $modality) @foreach ($modalities as $modality)
if ($('#chk_{{ $modality }}').is(':checked')) { if ($('#chk_{{ $modality }}').is(':checked')) {
@ -198,7 +217,7 @@ function formatDate(date) {
@endsection @endsection
@section('content') @section('content')
@include('staff.worklist.partials._stats') {{-- @include('staff.worklist.partials._stats') --}}
@include('staff.worklist.partials._filter-panel', compact('modalities')) @include('staff.worklist.partials._filter-panel', compact('modalities'))
@include('staff.worklist.partials._nav-top') @include('staff.worklist.partials._nav-top')

View File

@ -21,6 +21,11 @@
@include('staff.worklist.partials._date-range', ['id' => 'receive_date_range', 'label' => 'Receive Date']) @include('staff.worklist.partials._date-range', ['id' => 'receive_date_range', 'label' => 'Receive Date'])
</div> </div>
<div class="row g-2">
@include('staff.worklist.partials._date-range', ['id' => 'assign_date_range', 'label' => 'Assigned Date'])
@include('staff.worklist.partials._date-range', ['id' => 'read_date_range', 'label' => 'Report Date'])
</div>
<div class="row g-2"> <div class="row g-2">
<div class="col-md p-2"> <div class="col-md p-2">
<small class="text-light fw-medium d-block">Study Modalities</small> <small class="text-light fw-medium d-block">Study Modalities</small>