diff --git a/app/Http/Resources/MutationResource.php b/app/Http/Resources/MutationResource.php index 31cb2a3..308f5c5 100644 --- a/app/Http/Resources/MutationResource.php +++ b/app/Http/Resources/MutationResource.php @@ -13,6 +13,13 @@ class MutationResource extends BaseResource */ public function toArray(Request $request): array { - return parent::toArray($request); + $data = parent::toArray($request); + + $data['can'] = [ + 'update' => $request->user()?->can('update', $this->resource) ?? false, + 'void' => $request->user()?->can('void', $this->resource) ?? false, + ]; + + return $data; } } diff --git a/app/Policies/MutationPolicy.php b/app/Policies/MutationPolicy.php index dd29e07..28f5b17 100644 --- a/app/Policies/MutationPolicy.php +++ b/app/Policies/MutationPolicy.php @@ -24,8 +24,9 @@ class MutationPolicy public function update(User $user, Mutation $mutation): bool { $dynamic = $mutation->ledger->dynamic; + $isOwner = $dynamic->participants()->where('user_id', $user->id)->where('role', 'owner')->exists(); - return $dynamic->participants()->where('user_id', $user->id)->where('role', 'owner')->exists(); + return $isOwner && $mutation->status === 'pending'; } /** @@ -34,7 +35,8 @@ class MutationPolicy public function void(User $user, Mutation $mutation): bool { $dynamic = $mutation->ledger->dynamic; + $isOwner = $dynamic->participants()->where('user_id', $user->id)->where('role', 'owner')->exists(); - return $dynamic->participants()->where('user_id', $user->id)->where('role', 'owner')->exists(); + return $isOwner && $mutation->status !== 'voided'; } } diff --git a/resources/js/components/MutationList.vue b/resources/js/components/MutationList.vue index 30f62c8..68f5ebe 100644 --- a/resources/js/components/MutationList.vue +++ b/resources/js/components/MutationList.vue @@ -17,13 +17,16 @@ const props = defineProps<{ created_at: string; chat: any; media?: Array<{ id: number; url: string; mime_type: string }>; + can: { + update: boolean; + void: boolean; + }; }>; participants?: Array<{ id: number; name: string; pivot?: { role: string }; }>; - isOwner: boolean; }>(); const emit = defineEmits<{ @@ -167,25 +170,25 @@ function getAmountClass(amount: number): string {