From 6871fe879691afe1fd279b1703eda2c5b231f863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Pocrnji=C4=8D?= Date: Tue, 6 Jan 2026 18:45:48 +0100 Subject: [PATCH] Phone view updated with shadcn-vue components --- app/Http/Controllers/PhoneViewController.php | 124 ++- resources/js/Pages/Phone/Case/Index.vue | 712 ++++++++--------- resources/js/Pages/Phone/Index.vue | 777 +++++++++++++------ 3 files changed, 963 insertions(+), 650 deletions(-) diff --git a/app/Http/Controllers/PhoneViewController.php b/app/Http/Controllers/PhoneViewController.php index 320d63c..25df4d4 100644 --- a/app/Http/Controllers/PhoneViewController.php +++ b/app/Http/Controllers/PhoneViewController.php @@ -13,8 +13,12 @@ public function __construct(protected ReferenceDataCache $referenceCache) {} public function index(Request $request) { $userId = $request->user()->id; + $search = $request->input('search'); + $clientFilter = $request->input('client'); + $perPage = $request->integer('per_page', 15); + $perPage = max(1, min(100, $perPage)); - $jobs = FieldJob::query() + $query = FieldJob::query() ->where('assigned_user_id', $userId) ->whereNull('completed_at') ->whereNull('cancelled_at') @@ -23,32 +27,78 @@ public function index(Request $request) $q->with([ 'type:id,name', 'account', - 'clientCase.person' => function ($pq) { - $pq->with(['addresses', 'phones']); - }, + 'clientCase.person.address.type', + 'clientCase.person.phones', 'clientCase.client:id,uuid,person_id', 'clientCase.client.person:id,full_name', ]); }, ]) - ->orderByDesc('assigned_at') - ->limit(100) - ->get(); + ->orderByDesc('assigned_at'); + + // Apply client filter + if ($clientFilter) { + $query->whereHas('contract.clientCase.client', function ($q) use ($clientFilter) { + $q->where('uuid', $clientFilter); + }); + } + + // Apply search filter + if ($search) { + $query->where(function ($q) use ($search) { + $q->whereHas('contract', function ($cq) use ($search) { + $cq->where('reference', 'ilike', '%'.$search.'%') + ->orWhereHas('clientCase.person', function ($pq) use ($search) { + $pq->where('full_name', 'ilike', '%'.$search.'%'); + }) + ->orWhereHas('clientCase.client.person', function ($pq) use ($search) { + $pq->where('full_name', 'ilike', '%'.$search.'%'); + }); + }); + }); + } + + $jobs = $query->paginate($perPage)->withQueryString(); + + // Get unique clients for filter dropdown + $clients = \App\Models\Client::query() + ->whereHas('clientCases.contracts.fieldJobs', function ($q) use ($userId) { + $q->where('assigned_user_id', $userId) + ->whereNull('completed_at') + ->whereNull('cancelled_at'); + }) + ->with(['person:id,full_name']) + ->get(['uuid', 'person_id']) + ->map(fn ($c) => [ + 'uuid' => (string) $c->uuid, + 'name' => (string) optional($c->person)->full_name, + ]) + ->sortBy('name', SORT_NATURAL | SORT_FLAG_CASE) + ->values(); return Inertia::render('Phone/Index', [ 'jobs' => $jobs, + 'clients' => $clients, 'view_mode' => 'assigned', + 'filters' => [ + 'search' => $search, + 'client' => $clientFilter, + ], ]); } public function completedToday(Request $request) { $userId = $request->user()->id; + $search = $request->input('search'); + $clientFilter = $request->input('client'); + $perPage = $request->integer('per_page', 15); + $perPage = max(1, min(100, $perPage)); $start = now()->startOfDay(); $end = now()->endOfDay(); - $jobs = FieldJob::query() + $query = FieldJob::query() ->where('assigned_user_id', $userId) ->whereNull('cancelled_at') ->whereBetween('completed_at', [$start, $end]) @@ -57,21 +107,63 @@ public function completedToday(Request $request) $q->with([ 'type:id,name', 'account', - 'clientCase.person' => function ($pq) { - $pq->with(['addresses', 'phones']); - }, + 'clientCase.person.address.type', + 'clientCase.person.phones', 'clientCase.client:id,uuid,person_id', 'clientCase.client.person:id,full_name', ]); }, ]) - ->orderByDesc('completed_at') - ->limit(100) - ->get(); + ->orderByDesc('completed_at'); + + // Apply client filter + if ($clientFilter) { + $query->whereHas('contract.clientCase.client', function ($q) use ($clientFilter) { + $q->where('uuid', $clientFilter); + }); + } + + // Apply search filter + if ($search) { + $query->where(function ($q) use ($search) { + $q->whereHas('contract', function ($cq) use ($search) { + $cq->where('reference', 'ilike', '%'.$search.'%') + ->orWhereHas('clientCase.person', function ($pq) use ($search) { + $pq->where('full_name', 'ilike', '%'.$search.'%'); + }) + ->orWhereHas('clientCase.client.person', function ($pq) use ($search) { + $pq->where('full_name', 'ilike', '%'.$search.'%'); + }); + }); + }); + } + + $jobs = $query->paginate($perPage)->withQueryString(); + + // Get unique clients for filter dropdown + $clients = \App\Models\Client::query() + ->whereHas('clientCases.contracts.fieldJobs', function ($q) use ($userId, $start, $end) { + $q->where('assigned_user_id', $userId) + ->whereNull('cancelled_at') + ->whereBetween('completed_at', [$start, $end]); + }) + ->with(['person:id,full_name']) + ->get(['uuid', 'person_id']) + ->map(fn ($c) => [ + 'uuid' => (string) $c->uuid, + 'name' => (string) optional($c->person)->full_name, + ]) + ->sortBy('name', SORT_NATURAL | SORT_FLAG_CASE) + ->values(); return Inertia::render('Phone/Index', [ 'jobs' => $jobs, + 'clients' => $clients, 'view_mode' => 'completed-today', + 'filters' => [ + 'search' => $search, + 'client' => $clientFilter, + ], ]); } @@ -81,7 +173,7 @@ public function showCase(\App\Models\ClientCase $clientCase, Request $request) $completedMode = $request->boolean('completed'); // Eager load case with person details - $case = $clientCase->load('person.addresses', 'person.phones', 'person.emails', 'person.bankAccounts'); + $case = $clientCase->load('person.address.type', 'person.phones', 'person.emails', 'person.bankAccounts'); // Query contracts based on field jobs $contractsQuery = FieldJob::query() @@ -131,7 +223,7 @@ public function showCase(\App\Models\ClientCase $clientCase, Request $request) ->unique(); return Inertia::render('Phone/Case/Index', [ - 'client' => $case->client->load('person.addresses', 'person.phones', 'person.emails', 'person.bankAccounts'), + 'client' => $case->client->load('person.address.type', 'person.phones', 'person.emails', 'person.bankAccounts'), 'client_case' => $case, 'contracts' => $contracts, 'documents' => $documents, diff --git a/resources/js/Pages/Phone/Case/Index.vue b/resources/js/Pages/Phone/Case/Index.vue index e1314ba..0c2c8bf 100644 --- a/resources/js/Pages/Phone/Case/Index.vue +++ b/resources/js/Pages/Phone/Case/Index.vue @@ -1,20 +1,60 @@