authorizeAbility($request, 'displays.view'); $owner = $this->ownerRef($request); $organization = $this->organization($request); $screens = DisplayScreen::owned($owner) ->where('organization_id', $organization->id) ->orderBy('name') ->paginate(20); return view('qms.displays.index', compact('screens', 'organization')); } public function show(Request $request, DisplayScreen $display): View { $this->authorizeAbility($request, 'displays.view'); $this->authorizeOwner($request, $display); $display->load('branch'); return view('qms.displays.show', compact('display')); } public function create(Request $request): View { $this->authorizeAbility($request, 'displays.manage'); $owner = $this->ownerRef($request); $organization = $this->organization($request); return view('qms.displays.create', [ 'organization' => $organization, 'branches' => Branch::owned($owner)->where('organization_id', $organization->id)->orderBy('name')->get(), 'queues' => ServiceQueue::owned($owner)->where('organization_id', $organization->id)->orderBy('name')->get(), 'layouts' => config('qms.display_layouts'), ]); } public function store(Request $request): RedirectResponse { $this->authorizeAbility($request, 'displays.manage'); $owner = $this->ownerRef($request); $organization = $this->organization($request); $validated = $this->validatedDisplay($request); $screen = DisplayScreen::create([ 'owner_ref' => $owner, 'organization_id' => $organization->id, 'branch_id' => $validated['branch_id'], 'name' => $validated['name'], 'layout' => $validated['layout'], 'service_queue_ids' => $validated['queue_ids'] ?? [], 'is_active' => true, ]); AuditLogger::record($owner, 'display.created', $organization->id, $owner, DisplayScreen::class, $screen->id); return redirect()->route('qms.displays.show', $screen) ->with('success', 'Display created. URL: '.route('qms.display.public', $screen->access_token)); } public function edit(Request $request, DisplayScreen $display): View { $this->authorizeAbility($request, 'displays.manage'); $this->authorizeOwner($request, $display); $owner = $this->ownerRef($request); return view('qms.displays.edit', [ 'display' => $display, 'branches' => Branch::owned($owner)->where('organization_id', $display->organization_id)->orderBy('name')->get(), 'queues' => ServiceQueue::owned($owner)->where('organization_id', $display->organization_id)->orderBy('name')->get(), 'layouts' => config('qms.display_layouts'), ]); } public function update(Request $request, DisplayScreen $display): RedirectResponse { $this->authorizeAbility($request, 'displays.manage'); $this->authorizeOwner($request, $display); $validated = $this->validatedDisplay($request); $display->update([ 'name' => $validated['name'], 'branch_id' => $validated['branch_id'], 'layout' => $validated['layout'], 'service_queue_ids' => $validated['queue_ids'] ?? [], 'is_active' => $request->boolean('is_active', $display->is_active), ]); AuditLogger::record($this->ownerRef($request), 'display.updated', $display->organization_id, $this->ownerRef($request), DisplayScreen::class, $display->id); return redirect()->route('qms.displays.show', $display)->with('success', 'Display updated.'); } /** * @return array */ protected function validatedDisplay(Request $request): array { return $request->validate([ 'name' => ['required', 'string', 'max:255'], 'branch_id' => ['required', 'exists:queue_branches,id'], 'layout' => ['required', 'string', 'in:'.implode(',', array_keys(config('qms.display_layouts')))], 'queue_ids' => ['nullable', 'array'], 'queue_ids.*' => ['integer', 'exists:queue_service_queues,id'], ]); } }