diff --git a/app/Livewire/Datatable/Studio/Master/OutletsTable.php b/app/Livewire/Datatable/Studio/Master/OutletsTable.php deleted file mode 100644 index ca0a3fd..0000000 --- a/app/Livewire/Datatable/Studio/Master/OutletsTable.php +++ /dev/null @@ -1,146 +0,0 @@ -searchable(), - - Column::make('Nomor Telepon', 'phone_number')->searchable(), - - Column::make('Alamat') - ->label(function ($row) { - return << -
{$row->landmark}
-
{$row->address}
- - HTML; - }) - ->searchable(function ($query, $searchTerm) { - $query->orWhere('landmark', 'like', "%{$searchTerm}%") - ->orWhere('address', 'like', "%{$searchTerm}%"); - }) - ->html(), - - ArrayColumn::make('Jam Operasioanl') - ->data( - fn ($value, $row) => $row->openingHours - ->mapWithKeys(fn ($hour) => [ - Str::lower(Day::from($hour->day->value)->label()) => [ - 'open' => formatTime($hour->open_time), - 'close' => formatTime($hour->close_time), - ], - ]) - ) - ->outputFormat( - fn ($index, $value) => " - ".Str::ucfirst($index).': - '.( - ($value['open'] === null && $value['close'] === null) - ? 'Tutup' - : "{$value['open']} - {$value['close']}" - ).' - ' - ) - ->flexCol(['class' => 'gap-2 flex-wrap']), - - ArrayColumn::make('Fasilitas') - ->data(fn ($value, $row) => $row->facilities->pluck('name')->toArray()) - ->outputFormat(fn ($index, $value) => Blade::render(''.$value.'')) - ->flexRow(['class' => 'gap-2 flex-wrap']), - - Column::make('Tanggal Operasi') - ->label(function ($row) { - $openedDate = formatDate($row->opened_date); - $openedAgo = timeAgo($row->opened_date); - - $closedDate = formatDate($row->closed_date); - $closedAgo = timeAgo($row->closed_date); - - return << -
- Tgl Buka: - {$openedDate} - ({$openedAgo}) -
-
- Tgl Tutup: - {$closedDate} - ({$closedAgo}) -
- - HTML; - }) - ->html(), - - Column::make('Status', 'status') - ->format(fn ($value) => Blade::render(''.$value->label().'')) - ->html(), - - Column::make('Aksi') - ->label(function ($row) { - $actions = ''; - - if (auth()->user()->can('update outlet')) { - $actions .= view('components.datatables.edit', [ - 'id' => $row->hash, - 'editRoute' => route('studio.master.outlet.edit', $row->hash), - ])->render(); - } - - if (auth()->user()->can('delete outlet')) { - $actions .= view('components.datatables.delete', [ - 'id' => $row->hash, - 'deleteRoute' => route('studio.master.outlet.delete', $row->hash), - ])->render(); - } - - return $actions; - }) - ->html(), - ]; - } - - public function builder(): Builder - { - return Outlet::select('id', 'name', 'phone_number', 'landmark', 'address', 'opened_date', 'closed_date', 'status')->with(['openingHours', 'facilities']); - } - - public function filters(): array - { - return [ - MultiSelectFilter::make('Status') - ->options( - collect(OutletStatus::cases()) - ->mapWithKeys(fn ($case) => [$case->value => $case->label()]) - ->toArray() - ) - ->filter(function (Builder $builder, array $values) { - $builder->whereIn('status', $values); - }), - ]; - } -} diff --git a/app/Livewire/Forms/Studio/Master/OutletForm.php b/app/Livewire/Forms/Studio/Master/OutletForm.php index 85fd2c3..2296ee8 100644 --- a/app/Livewire/Forms/Studio/Master/OutletForm.php +++ b/app/Livewire/Forms/Studio/Master/OutletForm.php @@ -78,7 +78,9 @@ public function validationAttributes(): array 'address' => 'alamat', 'landmark' => 'patokan', 'maps_url' => 'tautan google maps', + 'opening_hours' => 'jam beroperasi', 'opening_hours.*' => 'jam beroperasi', + 'facilities' => 'fasilitas', 'facilities.*' => 'fasilitas', 'opened_date' => 'tanggal buka', 'featured_image' => 'gambar utama', diff --git a/app/Livewire/Studio/Master/Outlet/Create.php b/app/Livewire/Studio/Master/Outlet/Create.php index 3a31b5e..2b44c7d 100644 --- a/app/Livewire/Studio/Master/Outlet/Create.php +++ b/app/Livewire/Studio/Master/Outlet/Create.php @@ -36,8 +36,6 @@ public function save() $this->form->store(); - $this->dispatch('refreshDatatable'); - $this->toast('Outlet berhasil ditambahkan.'); $this->redirectRoute('studio.master.outlet.index', navigate: true); diff --git a/app/Livewire/Studio/Master/Outlet/Edit.php b/app/Livewire/Studio/Master/Outlet/Edit.php index 975cc34..cc5fed0 100644 --- a/app/Livewire/Studio/Master/Outlet/Edit.php +++ b/app/Livewire/Studio/Master/Outlet/Edit.php @@ -34,11 +34,9 @@ public function save() $this->form->update(); - $this->dispatch('refreshDatatable'); + $this->redirectRoute('studio.master.outlet.index', navigate: true); $this->toast('Outlet berhasil diperbarui.'); - - $this->redirectRoute('studio.master.outlet.index', navigate: true); } public function render() diff --git a/app/Livewire/Studio/Master/Outlet/Index.php b/app/Livewire/Studio/Master/Outlet/Index.php index 6e28efe..3ffd48c 100644 --- a/app/Livewire/Studio/Master/Outlet/Index.php +++ b/app/Livewire/Studio/Master/Outlet/Index.php @@ -2,17 +2,67 @@ namespace App\Livewire\Studio\Master\Outlet; +use App\Enums\Day; use App\Models\Outlet; +use App\Traits\WithCloseModal; use App\Traits\WithConfirmation; +use App\Traits\WithMediaHandler; use App\Traits\WithToast; use Flux\Flux; +use Illuminate\Support\Str; use Livewire\Attributes\Title; use Livewire\Component; #[Title('Outlet')] class Index extends Component { - use WithConfirmation, WithToast; + use WithCloseModal, WithConfirmation, WithMediaHandler, WithToast; + + public array $outlets = []; + + public ?string $imageUrl = null; + + public function mount() + { + $this->outlets = Outlet::with(['openingHours', 'facilities']) + ->latest() + ->get() + ->map(fn ($outlet) => [ + 'hash' => $outlet->hash, + 'name' => $outlet->name, + 'phone_number' => $outlet->phone_number, + 'landmark' => $outlet->landmark, + 'address' => $outlet->address, + 'status' => [ + 'label' => $outlet->status->label(), + 'color' => $outlet->status->color(), + ], + 'opening_hours' => $outlet->openingHours->mapWithKeys(fn ($hour) => [ + Str::ucfirst(Str::lower(Day::from($hour->day->value)->label())) => [ + 'open' => formatTime($hour->open_time), + 'close' => formatTime($hour->close_time), + 'is_closed' => $hour->open_time === null && $hour->close_time === null, + ], + ])->toArray(), + 'facilities' => $outlet->facilities->pluck('name')->toArray(), + 'opened_date' => formatDate($outlet->opened_date), + 'opened_ago' => timeAgo($outlet->opened_date), + 'closed_date' => $outlet->closed_date ? formatDate($outlet->closed_date) : null, + 'closed_ago' => $outlet->closed_date ? timeAgo($outlet->closed_date) : null, + 'edit_route' => route('studio.master.outlet.edit', $outlet->hash), + 'delete_route' => route('studio.master.outlet.delete', $outlet->hash), + 'image' => $this->mapMediaCollection($outlet->getMedia('featured_image'))[0]['temporaryUrl'], + 'images' => collect($this->mapMediaCollection($outlet->getMedia('images')))->map(fn ($image) => $image['temporaryUrl']), + ]) + ->toArray(); + } + + public function openImage(string $imageUrl) + { + $this->imageUrl = $imageUrl; + + Flux::modal('image-modal')->show(); + } public function delete(Outlet $outlet) { diff --git a/app/Traits/WithCloseModal.php b/app/Traits/WithCloseModal.php index 89e3493..f404d3c 100644 --- a/app/Traits/WithCloseModal.php +++ b/app/Traits/WithCloseModal.php @@ -10,7 +10,10 @@ public function closeModal(string $modalName, ?bool $isCloseAll = false) { $this->resetErrorBag(); $this->resetValidation(); - $this->reset('form'); + + if (isset($this->form)) { + $this->reset('form'); + } if ($isCloseAll) { Flux::modals()->close(); diff --git a/resources/views/livewire/studio/master/outlet/form.blade.php b/resources/views/livewire/studio/master/outlet/form.blade.php index 310cdce..2f8b728 100644 --- a/resources/views/livewire/studio/master/outlet/form.blade.php +++ b/resources/views/livewire/studio/master/outlet/form.blade.php @@ -170,7 +170,26 @@ class="mt-3 text-sm font-medium text-red-500 dark:text-red-400"> class="cursor-pointer" /> @endif + + @error("form.facilities.$index") + + @enderror @endforeach + + @error('form.facilities') + + @enderror + + Tambah Fasilitas diff --git a/resources/views/livewire/studio/master/outlet/index.blade.php b/resources/views/livewire/studio/master/outlet/index.blade.php index 2f6b896..dba2b23 100644 --- a/resources/views/livewire/studio/master/outlet/index.blade.php +++ b/resources/views/livewire/studio/master/outlet/index.blade.php @@ -14,8 +14,129 @@ class="text-sm">
- +
+ @foreach ($outlets as $outlet) + +
+
+ +
+ {{ $outlet['name'] }} + + {{ $outlet['status']['label'] }} + +
+
+
+ +
+
+ + {{ $outlet['phone_number'] }} +
+ +
+ +
+
{{ $outlet['landmark'] }}
+
{{ $outlet['address'] }}
+
+
+
+ +
+

+ + Jam Operasional +

+
+ @foreach ($outlet['opening_hours'] as $day => $time) +
+ {{ $day }}: + + {{ $time['is_closed'] ? 'Tutup' : "{$time['open']} - {$time['close']}" }} + +
+ @endforeach +
+
+ +
+

+ + Fasilitas +

+
+ @foreach ($outlet['facilities'] as $facility) + {{ $facility }} + @endforeach +
+
+ +
+
+
+ Tgl Buka: + {{ $outlet['opened_date'] }} + ({{ $outlet['opened_ago'] }}) +
+ @if ($outlet['closed_date']) +
+ Tgl Tutup: + {{ $outlet['closed_date'] }} + ({{ $outlet['closed_ago'] }}) +
+ @endif +
+
+ +
+

+ + Gambar +

+ + @foreach ($outlet['images'] as $key => $value) + + @endforeach + +
+ + + +
+ @if (auth()->user()->can('update outlet')) + + + + @endif + + @if (auth()->user()->can('delete outlet')) + + + + + + + @endif +
+
+ @endforeach +
@include('components.confirmation.delete') + + +
+ Outlet Image +
+
+