kept the mark as show or complete and cacle button stay after the user chose

This commit is contained in:
Naser Mansour 2026-01-09 19:40:51 +02:00
parent 773e1d3f7f
commit 0aa1b7f675
4 changed files with 82 additions and 56 deletions

View File

@ -116,7 +116,7 @@ class Consultation extends Model
*/ */
public function markAsCompleted(): void public function markAsCompleted(): void
{ {
if ($this->status !== ConsultationStatus::Approved) { if (! in_array($this->status, [ConsultationStatus::Approved, ConsultationStatus::NoShow])) {
throw new \InvalidArgumentException( throw new \InvalidArgumentException(
__('messages.invalid_status_transition', ['from' => $this->status->value, 'to' => 'completed']) __('messages.invalid_status_transition', ['from' => $this->status->value, 'to' => 'completed'])
); );
@ -131,7 +131,7 @@ class Consultation extends Model
*/ */
public function markAsNoShow(): void public function markAsNoShow(): void
{ {
if ($this->status !== ConsultationStatus::Approved) { if (! in_array($this->status, [ConsultationStatus::Approved, ConsultationStatus::Completed])) {
throw new \InvalidArgumentException( throw new \InvalidArgumentException(
__('messages.invalid_status_transition', ['from' => $this->status->value, 'to' => 'no_show']) __('messages.invalid_status_transition', ['from' => $this->status->value, 'to' => 'no_show'])
); );

View File

@ -384,37 +384,43 @@ new class extends Component
{{ __('common.edit') }} {{ __('common.edit') }}
</flux:button> </flux:button>
@if($consultation->status === \App\Enums\ConsultationStatus::Approved) @if(in_array($consultation->status, [\App\Enums\ConsultationStatus::Approved, \App\Enums\ConsultationStatus::Completed, \App\Enums\ConsultationStatus::NoShow]))
<flux:dropdown> <flux:dropdown>
<flux:button variant="outline" size="sm" icon="ellipsis-vertical" /> <flux:button variant="outline" size="sm" icon="ellipsis-vertical" />
<flux:menu> <flux:menu>
<flux:menu.item @if($consultation->status !== \App\Enums\ConsultationStatus::Completed)
wire:click="markCompleted({{ $consultation->id }})" <flux:menu.item
wire:confirm="{{ __('admin.confirm_mark_completed') }}" wire:click="markCompleted({{ $consultation->id }})"
icon="check-circle" wire:confirm="{{ __('admin.confirm_mark_completed') }}"
> icon="check-circle"
{{ __('admin.mark_completed') }} >
</flux:menu.item> {{ __('admin.mark_completed') }}
</flux:menu.item>
@endif
<flux:menu.item @if($consultation->status !== \App\Enums\ConsultationStatus::NoShow)
wire:click="markNoShow({{ $consultation->id }})" <flux:menu.item
wire:confirm="{{ __('admin.confirm_mark_no_show') }}" wire:click="markNoShow({{ $consultation->id }})"
icon="x-circle" wire:confirm="{{ __('admin.confirm_mark_no_show') }}"
> icon="x-circle"
{{ __('admin.mark_no_show') }} >
</flux:menu.item> {{ __('admin.mark_no_show') }}
</flux:menu.item>
@endif
<flux:menu.separator /> @if($consultation->status === \App\Enums\ConsultationStatus::Approved)
<flux:menu.separator />
<flux:menu.item <flux:menu.item
wire:click="cancel({{ $consultation->id }})" wire:click="cancel({{ $consultation->id }})"
wire:confirm="{{ __('admin.confirm_cancel_consultation') }}" wire:confirm="{{ __('admin.confirm_cancel_consultation') }}"
icon="trash" icon="trash"
variant="danger" variant="danger"
> >
{{ __('admin.cancel_consultation') }} {{ __('admin.cancel_consultation') }}
</flux:menu.item> </flux:menu.item>
@endif
</flux:menu> </flux:menu>
</flux:dropdown> </flux:dropdown>
@endif @endif

View File

@ -574,40 +574,46 @@ new class extends Component
</div> </div>
<!-- Status Actions --> <!-- Status Actions -->
@if($consultation->status === \App\Enums\ConsultationStatus::Approved) @if(in_array($consultation->status, [\App\Enums\ConsultationStatus::Approved, \App\Enums\ConsultationStatus::Completed, \App\Enums\ConsultationStatus::NoShow]))
<div class="bg-white rounded-lg p-6 border border-zinc-200"> <div class="bg-white rounded-lg p-6 border border-zinc-200">
<flux:heading size="lg" class="mb-4">{{ __('common.actions') }}</flux:heading> <flux:heading size="lg" class="mb-4">{{ __('common.actions') }}</flux:heading>
<div class="space-y-2"> <div class="space-y-2">
<flux:button @if($consultation->status !== \App\Enums\ConsultationStatus::Completed)
wire:click="markCompleted" <flux:button
wire:confirm="{{ __('admin.confirm_mark_completed') }}" wire:click="markCompleted"
variant="outline" wire:confirm="{{ __('admin.confirm_mark_completed') }}"
class="w-full" variant="outline"
icon="check-circle" class="w-full"
> icon="check-circle"
{{ __('admin.mark_completed') }} >
</flux:button> {{ __('admin.mark_completed') }}
</flux:button>
@endif
<flux:button @if($consultation->status !== \App\Enums\ConsultationStatus::NoShow)
wire:click="markNoShow" <flux:button
wire:confirm="{{ __('admin.confirm_mark_no_show') }}" wire:click="markNoShow"
variant="outline" wire:confirm="{{ __('admin.confirm_mark_no_show') }}"
class="w-full" variant="outline"
icon="x-circle" class="w-full"
> icon="x-circle"
{{ __('admin.mark_no_show') }} >
</flux:button> {{ __('admin.mark_no_show') }}
</flux:button>
@endif
<flux:button @if($consultation->status === \App\Enums\ConsultationStatus::Approved)
wire:click="cancel" <flux:button
wire:confirm="{{ __('admin.confirm_cancel_consultation') }}" wire:click="cancel"
variant="danger" wire:confirm="{{ __('admin.confirm_cancel_consultation') }}"
class="w-full" variant="danger"
icon="trash" class="w-full"
> icon="trash"
{{ __('admin.cancel_consultation') }} >
</flux:button> {{ __('admin.cancel_consultation') }}
</flux:button>
@endif
</div> </div>
</div> </div>
@endif @endif

View File

@ -189,14 +189,28 @@ test('admin can mark consultation as no-show', function () {
expect($consultation->fresh()->status)->toBe(ConsultationStatus::NoShow); expect($consultation->fresh()->status)->toBe(ConsultationStatus::NoShow);
}); });
test('cannot mark completed consultation as no-show', function () { test('admin can change completed consultation to no-show', function () {
$admin = User::factory()->admin()->create(); $admin = User::factory()->admin()->create();
$consultation = Consultation::factory()->completed()->create(); $consultation = Consultation::factory()->completed()->create();
$this->actingAs($admin); $this->actingAs($admin);
Volt::test('admin.consultations.index') Volt::test('admin.consultations.index')
->call('markNoShow', $consultation->id); ->call('markNoShow', $consultation->id)
->assertHasNoErrors();
expect($consultation->fresh()->status)->toBe(ConsultationStatus::NoShow);
});
test('admin can change no-show consultation to completed', function () {
$admin = User::factory()->admin()->create();
$consultation = Consultation::factory()->noShow()->create();
$this->actingAs($admin);
Volt::test('admin.consultations.index')
->call('markCompleted', $consultation->id)
->assertHasNoErrors();
expect($consultation->fresh()->status)->toBe(ConsultationStatus::Completed); expect($consultation->fresh()->status)->toBe(ConsultationStatus::Completed);
}); });