137 lines
5.4 KiB
PHP
137 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Datatable;
|
|
|
|
use App\Enums\OutletStatus;
|
|
use App\Models\Outlet;
|
|
use App\Traits\Datatable\WithAppendColumn;
|
|
use App\Traits\Datatable\WithConfiguration;
|
|
use App\Traits\Datatable\WithPrependColumn;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Support\Facades\Blade;
|
|
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
|
use Rappasoft\LaravelLivewireTables\Views\Column;
|
|
use Rappasoft\LaravelLivewireTables\Views\Columns\ArrayColumn;
|
|
use Rappasoft\LaravelLivewireTables\Views\Filters\MultiSelectFilter;
|
|
|
|
class OutletsTable extends DataTableComponent
|
|
{
|
|
use WithAppendColumn, WithConfiguration, WithPrependColumn;
|
|
|
|
protected $model = Outlet::class;
|
|
|
|
public function columns(): array
|
|
{
|
|
return [
|
|
Column::make('Name', 'name')->searchable(),
|
|
|
|
Column::make('Nomor Telepon', 'phone_number')->searchable(),
|
|
|
|
Column::make('Alamat')
|
|
->label(function ($row) {
|
|
return <<<HTML
|
|
<div>
|
|
<div>{$row->landmark}</div>
|
|
<div>{$row->address}</div>
|
|
</div>
|
|
HTML;
|
|
})
|
|
->searchable(function ($query, $searchTerm) {
|
|
$query->orWhere('landmark', 'like', "%{$searchTerm}%")
|
|
->orWhere('address', 'like', "%{$searchTerm}%");
|
|
})
|
|
->html(),
|
|
|
|
ArrayColumn::make('Jam Buka', 'opening_hours')
|
|
->data(fn ($value, $row) => normalizeOpeningHours($row->opening_hours))
|
|
->outputFormat(
|
|
fn ($index, $value) => "<span class='flex items-center gap-2 py-1 text-xs'>
|
|
<span class='font-semibold'>".ucfirst($index).': </span>
|
|
<span>'
|
|
.(($value['open'] === null && $value['close'] === null)
|
|
? 'Tutup'
|
|
: "{$value['open']} - {$value['close']}")
|
|
.'</span>
|
|
</span>'
|
|
)
|
|
->flexCol(['class' => 'gap-2 flex-wrap']),
|
|
|
|
ArrayColumn::make('Fasilitas', 'facilities')
|
|
->data(fn ($value, $row) => $row->facilities)
|
|
->outputFormat(fn ($index, $value) => Blade::render('<flux:badge color="zinc" dot>'.$value.'</flux:badge>'))
|
|
->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 <<<HTML
|
|
<div class="flex flex-col text-xs text-gray-700 dark:text-gray-300 gap-0.5">
|
|
<div>
|
|
<span class="font-medium text-gray-900 dark:text-white">Tgl Buka:</span>
|
|
<span>{$openedDate}</span>
|
|
<span class="text-gray-500">({$openedAgo})</span>
|
|
</div>
|
|
<div>
|
|
<span class="font-medium text-gray-900 dark:text-white">Tgl Tutup:</span>
|
|
<span>{$closedDate}</span>
|
|
<span class="text-gray-500">({$closedAgo})</span>
|
|
</div>
|
|
</div>
|
|
HTML;
|
|
})
|
|
->searchable(function ($query, $searchTerm) {
|
|
$query->orWhere('landmark', 'like', "%{$searchTerm}%")
|
|
->orWhere('address', 'like', "%{$searchTerm}%");
|
|
})
|
|
->html(),
|
|
|
|
Column::make('Status', 'status')
|
|
->format(fn ($value) => Blade::render('<flux:badge color="'.$value->color().'" dot>'.$value->label().'</flux:badge>'))
|
|
->html(),
|
|
|
|
Column::make('Aksi')
|
|
->label(function ($row) {
|
|
$actions = '';
|
|
|
|
$actions .= view('components.datatables.edit', [
|
|
'id' => $row->id,
|
|
'editRoute' => route('studio.master.outlet.edit', $row->id),
|
|
])->render();
|
|
|
|
$actions .= view('components.datatables.delete', [
|
|
'id' => $row->id,
|
|
'deleteRoute' => route('studio.master.outlet.delete', $row->id),
|
|
])->render();
|
|
|
|
return $actions;
|
|
})
|
|
->html(),
|
|
];
|
|
}
|
|
|
|
public function builder(): Builder
|
|
{
|
|
return Outlet::select('id', 'name', 'phone_number', 'landmark', 'address', 'opening_hours', 'facilities', 'opened_date', 'closed_date', 'status');
|
|
}
|
|
|
|
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);
|
|
}),
|
|
];
|
|
}
|
|
}
|