diff --git a/app/DataTables/WorklistDataTable.php b/app/DataTables/WorklistDataTable.php index 6cf8bb5..e99d1e9 100644 --- a/app/DataTables/WorklistDataTable.php +++ b/app/DataTables/WorklistDataTable.php @@ -609,6 +609,27 @@ private function generateActionButtons(Study $study): string case WorklistButton::Audit: $btns[] = $this->renderImageLink($study->hash, 'audit.png', 'show-audit', 'Audit Trail'); break; + case WorklistButton::Bookmark: + if ($study->isBookmarkedBy()) { + $btns[] = Blade::render('staff.worklist.partials.bookmarks._delete', + [ + 'study_id' => $study->id, + 'user_id' => me()->id, + 'url' => route('staff.bookmark.delete'), + 'img' => asset('imgs/bookmark-delete.png'), + 'tip' => 'Remove bookmark', + ]); + } else { + $btns[] = Blade::render('staff.worklist.partials.bookmarks._create', + [ + 'study_id' => $study->id, + 'user_id' => me()->id, + 'url' => route('staff.bookmark.create'), + 'img' => asset('imgs/bookmark.png'), + 'tip' => 'Bookmark study', + ]); + } + break; } } diff --git a/app/Domain/ACL/Permission.php b/app/Domain/ACL/Permission.php index 81853a4..70f4d71 100644 --- a/app/Domain/ACL/Permission.php +++ b/app/Domain/ACL/Permission.php @@ -26,4 +26,5 @@ enum Permission: string case UnassignRadiologist = 'unassign_radiologist'; case AccessAllWorklists = 'access_all_worklists'; case AuditLogView = 'audit_log_view'; + case BookmarkCreate = 'bookmark_create'; } diff --git a/app/Http/Controllers/Staff/BookmarkController.php b/app/Http/Controllers/Staff/BookmarkController.php index b162693..08b1724 100644 --- a/app/Http/Controllers/Staff/BookmarkController.php +++ b/app/Http/Controllers/Staff/BookmarkController.php @@ -10,13 +10,16 @@ class BookmarkController extends Controller { public function create(BookmarkCrudRequest $request) { - return StudyBookmark::create($request->validated()); + StudyBookmark::create($request->validated()); + + return redirect()->route('staff.worklist.index'); } - public function delete(StudyBookmark $studyBookmark) + public function delete(BookmarkCrudRequest $request) { + $studyBookmark = StudyBookmark::where($request->validated())->firstOrFail(); $studyBookmark->delete(); - return response()->json(); + return redirect()->route('staff.worklist.index'); } } diff --git a/app/Http/Requests/BookmarkCrudRequest.php b/app/Http/Requests/BookmarkCrudRequest.php index 1369beb..1a658ae 100644 --- a/app/Http/Requests/BookmarkCrudRequest.php +++ b/app/Http/Requests/BookmarkCrudRequest.php @@ -9,8 +9,8 @@ class BookmarkCrudRequest extends FormRequest public function rules(): array { return [ - 'study_id' => ['required', 'exists:studies'], - 'user_id' => ['required', 'exists:users'], + 'study_id' => ['required', 'exists:studies,id'], + 'user_id' => ['required', 'exists:users,id'], ]; } diff --git a/app/Models/Study.php b/app/Models/Study.php index f61fb8e..6b45321 100644 --- a/app/Models/Study.php +++ b/app/Models/Study.php @@ -443,6 +443,11 @@ public function isReadBy(User|int|null $user = null): bool return $this->reading_physician_id === me($user)->id; } + public function isBookmarkedBy(User|int|null $user = null): bool + { + return $this->bookmarkedByUsers()->where('user_id', me($user)->id)->exists(); + } + /** * Returns true if study has been locked by the given user or is unlocked. Returns false if the study was locked by another user. */ diff --git a/app/Services/ACL/WorklistButton.php b/app/Services/ACL/WorklistButton.php index 0825814..2066456 100644 --- a/app/Services/ACL/WorklistButton.php +++ b/app/Services/ACL/WorklistButton.php @@ -11,4 +11,5 @@ enum WorklistButton: string case Assign = 'assign'; case Report = 'report'; case Audit = 'audit'; + case Bookmark = 'bookmark'; } diff --git a/app/Services/ACL/WorklistGuard.php b/app/Services/ACL/WorklistGuard.php index ccfdbab..16b923f 100644 --- a/app/Services/ACL/WorklistGuard.php +++ b/app/Services/ACL/WorklistGuard.php @@ -58,6 +58,7 @@ public static function worklistButtons(Study $study, User|int|null $usr = null): WorklistButton::StudyMetadata, WorklistButton::Notes, // WorklistButton::Audit, + WorklistButton::Bookmark, ]); } @@ -75,6 +76,10 @@ public static function worklistButtons(Study $study, User|int|null $usr = null): $buttons->push(WorklistButton::Audit); } + if (may(Permission::BookmarkCreate)) { + $buttons->push(WorklistButton::Bookmark); + } + return $buttons; } } diff --git a/database/seeders/RoleSeeder.php b/database/seeders/RoleSeeder.php index df693c9..1a90702 100644 --- a/database/seeders/RoleSeeder.php +++ b/database/seeders/RoleSeeder.php @@ -34,6 +34,7 @@ public function run(): void Permission::StudyNotesCreate, Permission::StudyNotesView, Permission::AttachmentDownload, + Permission::BookmarkCreate, ]); $tech->givePermissionTo([ @@ -49,6 +50,7 @@ public function run(): void Permission::StudyArchive, Permission::ReportDownload, Permission::AuditLogView, + Permission::BookmarkCreate, ]); $adm->givePermissionTo(SpatiePermission::all()); diff --git a/resources/imgs/bookmark-delete.png b/resources/imgs/bookmark-delete.png new file mode 100644 index 0000000..a18504a Binary files /dev/null and b/resources/imgs/bookmark-delete.png differ diff --git a/resources/imgs/bookmark.png b/resources/imgs/bookmark.png new file mode 100644 index 0000000..a6d79fb Binary files /dev/null and b/resources/imgs/bookmark.png differ diff --git a/resources/views/staff/worklist/partials/bookmarks/_create.blade.php b/resources/views/staff/worklist/partials/bookmarks/_create.blade.php new file mode 100644 index 0000000..3bd2b0a --- /dev/null +++ b/resources/views/staff/worklist/partials/bookmarks/_create.blade.php @@ -0,0 +1,7 @@ +@php + $form_id = 'bm-creat-' . $study_id; +@endphp + + @include('_partials._img-tooltip', ['src' => $img, 'class' => $class ?? 'msg-icon', 'tip' => $tip]) + @include('staff.worklist.partials.bookmarks._form', ['form_id' => $form_id, 'url' => $url, 'study_id' => $study_id, 'user_id' => $user_id, 'delete' => false]) + diff --git a/resources/views/staff/worklist/partials/bookmarks/_delete.blade.php b/resources/views/staff/worklist/partials/bookmarks/_delete.blade.php new file mode 100644 index 0000000..e25defa --- /dev/null +++ b/resources/views/staff/worklist/partials/bookmarks/_delete.blade.php @@ -0,0 +1,7 @@ +@php + $form_id = 'bm-del_' . $study_id; +@endphp + + @include('_partials._img-tooltip', ['src' => $img, 'class' => $class ?? 'msg-icon', 'tip' => $tip]) + @include('staff.worklist.partials.bookmarks._form', ['form_id' => $form_id, 'url' => $url, 'study_id' => $study_id, 'user_id' => $user_id, 'delete' => true]) + diff --git a/resources/views/staff/worklist/partials/bookmarks/_form.blade.php b/resources/views/staff/worklist/partials/bookmarks/_form.blade.php new file mode 100644 index 0000000..e8028f7 --- /dev/null +++ b/resources/views/staff/worklist/partials/bookmarks/_form.blade.php @@ -0,0 +1,8 @@ +
diff --git a/routes/web.php b/routes/web.php index a0ec46c..75abe74 100644 --- a/routes/web.php +++ b/routes/web.php @@ -89,7 +89,7 @@ Route::group(['prefix' => 'bookmark', 'as' => 'bookmark.'], function () { Route::post('/', [BookmarkController::class, 'create'])->name('create'); - Route::delete('{hashid}', [BookmarkController::class, 'delete'])->name('delete'); + Route::delete('/', [BookmarkController::class, 'delete'])->name('delete'); }); });