diff --git a/app/Livewire/Datatable/UsersTable.php b/app/Livewire/Datatable/UsersTable.php index 93f9720..89273dd 100644 --- a/app/Livewire/Datatable/UsersTable.php +++ b/app/Livewire/Datatable/UsersTable.php @@ -2,9 +2,8 @@ namespace App\Livewire\Datatable; -use App\Enums\Gender; use App\Enums\UserStatus; -use App\Models\User; +use App\Models\Employee; use App\Traits\Datatable\WithAppendColumn; use App\Traits\Datatable\WithConfiguration; use App\Traits\Datatable\WithPrependColumn; @@ -18,74 +17,79 @@ class UsersTable extends DataTableComponent { use WithAppendColumn, WithConfiguration, WithPrependColumn; - protected $model = User::class; + protected $model = Employee::class; public function columns(): array { return [ Column::make('Nama Lengkap') - ->label(function ($row) { - return <<label( + fn ($row) => << -
{$row->employee?->full_name}
- {$row->employee?->code} +
{$row->full_name}
+ {$row->code} - HTML; - }) - ->searchable(function ($query, $searchTerm) { - $query->whereHas('employee', function ($query) use ($searchTerm) { - $query->where('full_name', 'like', "%{$searchTerm}%") - ->orWhere('code', 'like', "%{$searchTerm}%"); - }); - }) + HTML + ) + ->searchable( + fn ($query, $searchTerm) => $query->where('full_name', 'like', "%{$searchTerm}%") + ->orWhere('code', 'like', "%{$searchTerm}%") + ) ->html(), Column::make('Kredensial') - ->label(function ($row) { - return <<label( + fn ($row) => << -
{$row->email}
- {$row->username} +
{$row?->user?->email}
+ {$row?->user?->username} - HTML; - }) - ->searchable(function ($query, $searchTerm) { - $query->where('email', 'like', "%{$searchTerm}%") - ->orWhere('username', 'like', "%{$searchTerm}%"); - }) + HTML + ) + ->searchable( + fn ($query, $searchTerm) => $query->whereHas( + 'user', + fn ($q) => $q->where('email', 'like', "%{$searchTerm}%") + ->orWhere('username', 'like', "%{$searchTerm}%") + ) + ) ->html(), - Column::make('Nomor Telepon', 'employee.phone_number')->searchable(), + Column::make('Nomor Telepon', 'phone_number')->searchable(), - Column::make('Jenis Kelamin', 'employee.gender') + Column::make('Jenis Kelamin', 'gender') ->format(fn ($value) => Blade::render( - '' - .Gender::from($value)->label() + '' + .$value->label() .'' )) ->html(), - Column::make('Kode Referral', 'referralCode.code') - ->format(fn ($value) => Blade::render(''.$value.'')) + Column::make('Kode Referral', 'user.referralCode.code') + ->format( + fn ($value) => $value + ? Blade::render(''.$value.'') + : '' + ) ->html(), - Column::make('Gaji Pokok', 'employee.base_salary') + Column::make('Gaji Pokok', 'base_salary') ->searchable() ->sortable() ->format(fn ($value) => currency($value, 'Rp')), - Column::make('Alamat', 'employee.address')->searchable(), + Column::make('Alamat', 'address')->searchable(), Column::make('Tanggal') ->label(function ($row) { - $birthdate = formatDate($row->employee->birthdate); - $birthAgo = getAge($row->employee->birthdate); + $birthdate = formatDate($row->birthdate); + $birthAgo = getAge($row->birthdate); - $hireDate = formatDate($row->hire_date); - $openedAgo = timeAgo($row->hire_date); + $hireDate = formatDate($row?->user?->hire_date); + $openedAgo = timeAgo($row?->user?->hire_date); - $resigndate = formatDate($row->resign_date); - $resignAgo = timeAgo($row->resign_date); + $resigndate = formatDate($row?->user?->resign_date); + $resignAgo = timeAgo($row?->user?->resign_date); return << @@ -109,15 +113,17 @@ public function columns(): array }) ->html(), - Column::make('status') - ->format(fn ($value) => Blade::render(''.$value->label().'')) + Column::make('Status', 'user.status') + ->format( + fn ($value) => Blade::render(''.UserStatus::tryFrom($value)->label().'') + ) ->html(), Column::make('Aksi') ->label(function ($row) { $actions = ''; - if (auth()->id() !== $row->id) { + if (auth()->id() !== $row?->user?->id) { $actions .= view('components.datatables.edit', [ 'id' => $row->id, 'editRoute' => route('studio.master.user.edit', $row->id), @@ -137,7 +143,22 @@ public function columns(): array public function builder(): Builder { - return User::select('users.id', 'email', 'username', 'users.status', 'employee.code', 'employee.full_name', 'employee.phone_number', 'employee.base_salary', 'employee.address', 'employee.hire_date', 'employee.resign_date', 'employee.birthdate', 'employee.gender')->with(['employee', 'referralCode']); + return Employee::query() + ->select( + 'employees.id', + 'employees.user_id', + 'employees.code', + 'employees.full_name', + 'employees.phone_number', + 'employees.gender', + 'employees.birthdate', + 'employees.base_salary', + 'employees.address' + ) + ->with([ + 'user', + 'user.referralCode', + ]); } public function filters(): array @@ -145,12 +166,15 @@ public function filters(): array return [ MultiSelectFilter::make('Status') ->options( - collect(Userstatus::cases()) + collect(UserStatus::cases()) ->mapWithKeys(fn ($case) => [$case->value => $case->label()]) ->toArray() ) ->filter(function (Builder $builder, array $values) { - $builder->whereIn('users.status', $values); + $builder->whereHas( + 'user', + fn ($q) => $q->whereIn('status', $values) + ); }), ]; }