diff --git a/app/DAL/Studies/WorklistBase.php b/app/DAL/Studies/WorklistBase.php index 6e3e033..866ce2e 100644 --- a/app/DAL/Studies/WorklistBase.php +++ b/app/DAL/Studies/WorklistBase.php @@ -164,7 +164,7 @@ protected function getStudiesQuery(): Builder $q = Study::query(); } - return $q->with(['readingPhysician', 'dicomServer', 'assignedPhysicians', 'reports']); + return $q->with(['readingPhysician', 'dicomServer', 'assignedPhysicians', 'reports', 'lockingPhysician']); } protected function applySort(Builder $query): Builder diff --git a/app/DataTables/WorklistDataTable.php b/app/DataTables/WorklistDataTable.php index ebbac8a..b128bf1 100644 --- a/app/DataTables/WorklistDataTable.php +++ b/app/DataTables/WorklistDataTable.php @@ -23,7 +23,7 @@ class WorklistDataTable extends DataTable { const DATE_FORMAT_SHORT = 'd.m.Y H:i'; - const DATE_FORMAT_LONG = 'd/m/Y h:i A'; + const DATE_FORMAT_LONG = 'h:i A, d-M-Y (D)'; private static function renderDateColumn(Carbon|CarbonImmutable|null $dt): ?string { @@ -281,7 +281,7 @@ private function physicianColumn(Study $study): ?string [ 'src' => asset('imgs/assigned.png'), 'class' => 'msg-icon', - 'tip' => 'Assigned on ' . $study->assigned_at->format(self::DATE_FORMAT_LONG), + 'tip' => 'Assigned at ' . $study->assigned_at->format(self::DATE_FORMAT_LONG), ]); } @@ -290,7 +290,7 @@ private function physicianColumn(Study $study): ?string [ 'src' => asset('imgs/lock.png'), 'class' => 'ms-1 msg-icon', - 'tip' => 'Locked on ' . $study->locked_at->format(self::DATE_FORMAT_LONG), + 'tip' => sprintf("Locked by %s\n at %s", $study->lockingPhysician?->display_name ?? '', $study->locked_at->format(self::DATE_FORMAT_LONG)), ]); } @@ -318,6 +318,15 @@ private function renderCustomColumns(): array foreach (WorklistGuard::worklistColumns() as $col) { switch ($col) { + case WorklistColumn::PatientId: + $columns[$col->value] = static function (Study $study) { + if (me()->isRadiologist() || ! $study->canEditMetadata()) { + return $study->patient_id; + } + + return '' . $study->patient_id . ''; + }; + break; case WorklistColumn::PatientName: $columns[$col->value] = static function (Study $study) { if (me()->isRadiologist() || ! $study->canEditMetadata()) { @@ -385,12 +394,33 @@ private function renderCustomColumns(): array private function generateReportingButtons(Study $study): string { - if (me()->isRadiologist() && $study->canEditReport() && ! $study->hasReports()) { - // fresh untouched study, can edit report: take the rad directly to the edit page - return ''; + $hasReports = $study->hasReports(); + $img = $hasReports ? 'report.png' : 'inbox.png'; + + if (me()->isRadiologist()) { + if ($study->isLocked() && ! $study->isLockedBy()) { + // study was locked by someone else + return Blade::render('_partials._img-tooltip', + [ + 'src' => asset('imgs/lock.png'), + 'class' => 'msg-icon', + 'tip' => 'Study has been locked', + ] + ); + } + + if ($study->canEditReport() && ! $hasReports) { + // fresh untouched study, go directly to the edit page + return $this->renderImageLink( + $study->hash, $img, '', 'Report', route('staff.report.create', $study->hash), true + ); + } } - return $this->renderButton($study->hash, 'fa-eye', 'show-reports btn-outline', 'R'); + // fallback: show popup with report history + return $this->renderImageLink( + $study->hash, $img, 'show-reports', 'Report' + ); } private function renderButton(string $data_id, string $fa_icon, string $data_class, string $text, string $url = '#', bool $blank = false): string diff --git a/app/Models/Study.php b/app/Models/Study.php index 7a5d516..f8cf416 100644 --- a/app/Models/Study.php +++ b/app/Models/Study.php @@ -133,6 +133,11 @@ public function readingPhysician(): BelongsTo return $this->belongsTo(User::class, 'reading_physician_id'); } + public function lockingPhysician(): BelongsTo + { + return $this->belongsTo(User::class, 'locking_physician_id'); + } + public function assignedPhysicians(): BelongsToMany { return $this->belongsToMany(User::class, 'study_assignments');