diff --git a/app/Http/Controllers/Admin/Manage/CuttingController.php b/app/Http/Controllers/Admin/Manage/CuttingController.php index 887cef6..f31e9bc 100644 --- a/app/Http/Controllers/Admin/Manage/CuttingController.php +++ b/app/Http/Controllers/Admin/Manage/CuttingController.php @@ -30,6 +30,7 @@ public function index(Request $request): Response return Inertia::render('admin/manage/cuttings/Index', [ 'cuttings' => $this->cuttingService->paginateForIndex($tableQuery, $request->user()), + 'inProgressCuttings' => $this->cuttingService->getInProgressCuttings($request->user()), 'filters' => $this->dataTableFilters($tableQuery), ]); } diff --git a/app/Services/Manage/CuttingService.php b/app/Services/Manage/CuttingService.php index 52d852a..2c39ad3 100644 --- a/app/Services/Manage/CuttingService.php +++ b/app/Services/Manage/CuttingService.php @@ -66,6 +66,34 @@ public function paginateForIndex(array $tableQuery, User $user): LengthAwarePagi }); } + /** + * @return Collection + */ + public function getInProgressCuttings(User $user): Collection + { + return Cutting::query() + ->with([ + 'createdBy.profile', + 'rejection.rejectedBy.profile', + 'materials.rawMaterialPrice.rawMaterial:id,name,unit', + 'results.productVariant.product:id,name', + 'results.productVariant:id,product_id,name', + ]) + ->where('status', CuttingStatus::IN_PROGRESS) + ->latest() + ->get() + ->each(function (Cutting $cutting) use ($user): void { + $actions = collect($cutting->status->availableActions()) + ->filter(fn (array $action) => $user->can($action['permission'])) + ->values() + ->all(); + + $cutting->setAttribute('available_actions', $actions); + $cutting->setAttribute('is_editable', $cutting->status->isEditable()); + }); + } + + /** * @return Collection */ diff --git a/resources/js/components/admin/manage/cuttings/CuttingInProgressSection.vue b/resources/js/components/admin/manage/cuttings/CuttingInProgressSection.vue new file mode 100644 index 0000000..9f3f62f --- /dev/null +++ b/resources/js/components/admin/manage/cuttings/CuttingInProgressSection.vue @@ -0,0 +1,118 @@ + + + diff --git a/resources/js/pages/admin/manage/cuttings/Index.vue b/resources/js/pages/admin/manage/cuttings/Index.vue index aed30b3..adeffe4 100644 --- a/resources/js/pages/admin/manage/cuttings/Index.vue +++ b/resources/js/pages/admin/manage/cuttings/Index.vue @@ -2,16 +2,18 @@ import { Head, Link } from '@inertiajs/vue3'; import { Plus } from '@lucide/vue'; import { computed, ref, watch } from 'vue'; +import CuttingInProgressSection from '@/components/admin/manage/cuttings/CuttingInProgressSection.vue'; import CuttingGroupedTable from '@/components/admin/manage/cuttings/CuttingGroupedTable.vue'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { useCan } from '@/composables/useCan'; import { useDataTableQuery, useDataTableQuerySync } from '@/composables/useDataTableQuery'; import AdminLayout from '@/layouts/AdminLayout.vue'; -import type { PaginatedCuttings } from '@/types/cutting'; +import type { PaginatedCuttings, CuttingListItem } from '@/types/cutting'; const props = defineProps<{ cuttings: PaginatedCuttings; + inProgressCuttings: CuttingListItem[]; filters: { search: string; sort?: string; @@ -73,6 +75,8 @@ watch( + +