commit21
This commit is contained in:
@@ -6,6 +6,7 @@ use App\Models\User;
|
||||
use App\Services\WorkflowNotices;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Inertia\Inertia;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
@@ -13,18 +14,41 @@ use Symfony\Component\HttpFoundation\Response;
|
||||
class WorkflowNoticeController extends Controller
|
||||
{
|
||||
public function index(Request $request, WorkflowNotices $notices): Response
|
||||
{
|
||||
return DB::transaction(function () use ($request, $notices) {
|
||||
if (DB::getDriverName() === 'pgsql' && DB::transactionLevel() === 1) {
|
||||
DB::statement('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY');
|
||||
}
|
||||
|
||||
return $this->page($request, $notices);
|
||||
});
|
||||
}
|
||||
|
||||
/** @return array<string,mixed> */
|
||||
private function filters(Request $request): array
|
||||
{
|
||||
return $request->validate(['view' => 'nullable|in:all,unread,tasks,outcomes', 'page' => 'nullable|integer|min:1|max:100000', 'search' => 'nullable|string|max:100']);
|
||||
}
|
||||
|
||||
private function page(Request $request, WorkflowNotices $notices): Response
|
||||
{
|
||||
$actor = $request->user('web');
|
||||
abort_unless($actor instanceof User, 403);
|
||||
$filter = $request->validate(['view' => 'nullable|in:all,unread,tasks,outcomes', 'page' => 'nullable|integer|min:1|max:100000']);
|
||||
$filter = $this->filters($request);
|
||||
$visible = collect($notices->visible($actor));
|
||||
$unread = $visible->whereNull('read_at')->count();
|
||||
$items = ($filter['view'] ?? 'all') === 'unread' ? $visible->whereNull('read_at')->values() : $visible;
|
||||
if (in_array($filter['view'] ?? '', ['tasks', 'outcomes'], true)) {
|
||||
$items = $visible->where('kind', $filter['view'] === 'tasks' ? 'task' : 'outcome')->values();
|
||||
}
|
||||
$page = (int) ($filter['page'] ?? 1);
|
||||
$search = trim($filter['search'] ?? '');
|
||||
if ($search !== '') {
|
||||
$items = $items->filter(fn ($notice) => mb_stripos($notice['reference'], $search) !== false)->values();
|
||||
}
|
||||
$page = min((int) ($filter['page'] ?? 1), max(1, (int) ceil($items->count() / 25)));
|
||||
Inertia::encryptHistory();
|
||||
$response = Inertia::render('workflow/notices', ['ready' => Schema::hasTable('workflow_notices'), 'unread' => $unread, 'view' => $filter['view'] ?? 'all',
|
||||
'search' => $search,
|
||||
'notices' => (new LengthAwarePaginator($items->slice(($page - 1) * 25, 25)->values(), $items->count(), 25, $page, ['path' => $request->url()]))->withQueryString()])->toResponse($request);
|
||||
$response->headers->set('Cache-Control', 'private, no-store, max-age=0');
|
||||
|
||||
@@ -35,9 +59,10 @@ class WorkflowNoticeController extends Controller
|
||||
{
|
||||
$actor = $request->user('web');
|
||||
abort_unless($actor instanceof User, 403);
|
||||
$filters = $this->filters($request);
|
||||
$notices->read($actor, $notice);
|
||||
|
||||
return redirect('/requisicoes/avisos');
|
||||
return redirect('/requisicoes/avisos'.($filters === [] ? '' : '?'.http_build_query($filters)));
|
||||
}
|
||||
|
||||
public function refresh(Request $request, int $requisition, WorkflowNotices $notices): Response
|
||||
|
||||
Reference in New Issue
Block a user