diff --git a/app/DAL/Studies/AdminStudyLister.php b/app/DAL/Studies/AdminStudyLister.php index 6ec66cc..7a66df3 100644 --- a/app/DAL/Studies/AdminStudyLister.php +++ b/app/DAL/Studies/AdminStudyLister.php @@ -9,6 +9,6 @@ final class AdminStudyLister extends UserStudyListerBase { protected function buildQuery(?int $user_id = null): Builder { - return self::defaultSortQuery(Study::active()); + return self::applySortQuery(Study::active()); } } diff --git a/app/DAL/Studies/IUserStudyLister.php b/app/DAL/Studies/IUserStudyLister.php index 5ad91d8..39c3045 100644 --- a/app/DAL/Studies/IUserStudyLister.php +++ b/app/DAL/Studies/IUserStudyLister.php @@ -6,6 +6,12 @@ interface IUserStudyLister { + public function setPageSize(int $size): void; + + public function setSortColumn(string $column, string $dir): void; + + public function setSearchTerm(string $search): void; + public function all(?int $user_id = null): LengthAwarePaginator; public function pending(?int $user_id = null): LengthAwarePaginator; diff --git a/app/DAL/Studies/RadiologistStudyLister.php b/app/DAL/Studies/RadiologistStudyLister.php index 2350a59..f4d8cfc 100644 --- a/app/DAL/Studies/RadiologistStudyLister.php +++ b/app/DAL/Studies/RadiologistStudyLister.php @@ -11,7 +11,7 @@ protected function buildQuery(?int $user_id = null): Builder { $user_id = (int) ($user_id ?? auth()->id()); - return self::defaultSortQuery( + return self::applySortQuery( Study::active()->where('assigned_physician_id', $user_id) ); } diff --git a/app/DAL/Studies/ReferrerStudyLister.php b/app/DAL/Studies/ReferrerStudyLister.php index 0b4ad54..7b9cf1d 100644 --- a/app/DAL/Studies/ReferrerStudyLister.php +++ b/app/DAL/Studies/ReferrerStudyLister.php @@ -11,7 +11,7 @@ protected function buildQuery(?int $user_id = null): Builder { $user_id = (int) ($user_id ?? auth()->id()); - return self::defaultSortQuery( + return self::applySortQuery( Study::active()->where('referring_provider_id', $user_id) ); } diff --git a/app/DAL/Studies/TechnicianStudyLister.php b/app/DAL/Studies/TechnicianStudyLister.php index ac61e86..66d9419 100644 --- a/app/DAL/Studies/TechnicianStudyLister.php +++ b/app/DAL/Studies/TechnicianStudyLister.php @@ -18,6 +18,6 @@ protected function buildQuery(?int $user_id = null): Builder $query = $query->where('institute_id', $institute_id); } - return self::defaultSortQuery($query); + return self::applySortQuery($query); } } diff --git a/app/DAL/Studies/UserStudyListerBase.php b/app/DAL/Studies/UserStudyListerBase.php index a764b67..0b6f47c 100644 --- a/app/DAL/Studies/UserStudyListerBase.php +++ b/app/DAL/Studies/UserStudyListerBase.php @@ -8,13 +8,25 @@ abstract class UserStudyListerBase implements IUserStudyLister { + private ?int $pageSize = null; + + private ?string $sortColumn = null; + + private ?string $sortDir = null; + + private ?string $searchTerm = null; + protected static function reportCompleteQuery(Builder $query): Builder { return $query->where('report_status', '=', ReportStatus::Signed->value); } - protected static function defaultSortQuery(Builder $query): Builder + protected function applySortQuery(Builder $query): Builder { + if ($this->sortColumn) { + return $query->orderBy($this->sortColumn, $this->sortDir ?? 'ASC'); + } + return $query ->orderByDesc('study_priority') ->orderByDesc('received_at'); @@ -30,18 +42,54 @@ abstract protected function buildQuery(?int $user_id = null): Builder; public function all(?int $user_id = null): LengthAwarePaginator { return $this->buildQuery($user_id) - ->paginate(user_per_page($user_id)); + ->paginate($this->getPageSize($user_id)); } public function pending(?int $user_id = null): LengthAwarePaginator { return self::reportPendingQuery(self::buildQuery($user_id)) - ->paginate(user_per_page($user_id)); + ->paginate($this->getPageSize($user_id)); } public function completed(?int $user_id = null): LengthAwarePaginator { return self::reportCompleteQuery(self::buildQuery($user_id)) - ->paginate(user_per_page($user_id)); + ->paginate($this->getPageSize($user_id)); + } + + public function setPageSize(int $size): void + { + $this->pageSize = $size; + } + + public function setSortColumn(string $column, string $dir): void + { + $this->sortColumn = $column; + $this->sortDir = $dir; + } + + public function setSearchTerm(string $search): void + { + $this->searchTerm = $search; + } + + public function getPageSize(?int $user_id = null): int + { + return $this->pageSize ?? $this->getPageSize($user_id); + } + + public function applySearch(Builder $query): Builder + { + if ($this->searchTerm) { + $search = "%{$this->searchTerm}%"; + $query = $query->where(function ($query) use ($search) { + $query->orWhere('patient_name', 'like', $search); + $query->orWhere('patient_id', 'like', $search); + $query->orWhere('study_description', 'like', $search); + $query->orWhere('body_part_examined', 'like', $search); + }); + } + + return $query; } } diff --git a/app/Jobs/UpdatePersonalAccessToken.php b/app/Jobs/UpdatePersonalAccessToken.php new file mode 100644 index 0000000..c6a440e --- /dev/null +++ b/app/Jobs/UpdatePersonalAccessToken.php @@ -0,0 +1,22 @@ +personalAccessToken->getTable()) + ->where('id', $this->personalAccessToken->id) + ->update($this->newAttributes); + } +} diff --git a/app/Models/CustomPersonalAccessToken.php b/app/Models/CustomPersonalAccessToken.php new file mode 100644 index 0000000..a08073e --- /dev/null +++ b/app/Models/CustomPersonalAccessToken.php @@ -0,0 +1,53 @@ +id}::tokenable", 600, + function () { + return parent::tokenable()->first(); + }); + } + + public static function boot() + { + parent::boot(); + // When updating, cancel normal update and manually update + // the table asynchronously every hour. + static::updating(function (self $personalAccessToken) { + try { + Cache::remember('PersonalAccessToken::lastUsgeUpdate', 3600, function () use ($personalAccessToken) { + dispatch(new UpdatePersonalAccessToken($personalAccessToken, $personalAccessToken->getDirty())); + + return now(); + }); + } catch (Exception $e) { + Log::critical($e->getMessage()); + } + + return false; + }); + } +} diff --git a/resources/views/staff/studies/index.blade.php b/resources/views/staff/studies/index.blade.php index 6dfc896..1e901ff 100644 --- a/resources/views/staff/studies/index.blade.php +++ b/resources/views/staff/studies/index.blade.php @@ -97,7 +97,6 @@ class="d-flex justify-content-between align-items-start border-end pb-4 pb-sm-0