feat(user): fitur user dan employee
-crud -membuat fungsi untuk generate kode pegawai di model Employee -menyesuaikan migrasi users dan employees -menyesuaikan value seeder dengan migrasi baru
This commit is contained in:
parent
ab9e19d27b
commit
c2e2b85070
141
app/Livewire/Datatable/UsersTable.php
Normal file
141
app/Livewire/Datatable/UsersTable.php
Normal file
@ -0,0 +1,141 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Datatable;
|
||||
|
||||
use App\Enums\Gender;
|
||||
use App\Enums\UserStatus;
|
||||
use App\Models\User;
|
||||
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\Filters\MultiSelectFilter;
|
||||
|
||||
class UsersTable extends DataTableComponent
|
||||
{
|
||||
use WithAppendColumn, WithConfiguration, WithPrependColumn;
|
||||
|
||||
protected $model = User::class;
|
||||
|
||||
public function columns(): array
|
||||
{
|
||||
return [
|
||||
Column::make('Nama Lengkap')
|
||||
->label(function ($row) {
|
||||
return <<<HTML
|
||||
<div>
|
||||
<div>{$row->employee?->full_name}</div>
|
||||
<span class="text-xs text-gray-400">{$row->employee?->code}</span>
|
||||
</div>
|
||||
HTML;
|
||||
})
|
||||
->searchable(function ($query, $searchTerm) {
|
||||
$query->whereHas('employee', function ($query) use ($searchTerm) {
|
||||
$query->where('full_name', 'like', "%{$searchTerm}%")
|
||||
->orWhere('code', 'like', "%{$searchTerm}%");
|
||||
});
|
||||
})
|
||||
->html(),
|
||||
Column::make('Nomor Telepon', 'employee.phone_number')->searchable(),
|
||||
|
||||
Column::make('Email', 'email')->searchable(),
|
||||
|
||||
Column::make('Nama Pengguna', 'username')->searchable(),
|
||||
|
||||
Column::make('Jenis Kelamin', 'employee.gender')
|
||||
->format(fn ($value) => Blade::render(
|
||||
'<flux:badge color="'.Gender::from($value)->color().'">'
|
||||
.Gender::from($value)->label()
|
||||
.'</flux:badge>'
|
||||
))
|
||||
->html(),
|
||||
|
||||
Column::make('Gaji Pokok', 'employee.base_salary')
|
||||
->searchable()
|
||||
->sortable()
|
||||
->format(fn ($value) => formatCurrency($value)),
|
||||
|
||||
Column::make('Alamat', 'employee.address')->searchable(),
|
||||
|
||||
Column::make('Tanggal')
|
||||
->label(function ($row) {
|
||||
$birthdate = formatDate($row->employee->birthdate);
|
||||
$birthAgo = getAge($row->employee->birthdate);
|
||||
|
||||
$hireDate = formatDate($row->hire_date);
|
||||
$openedAgo = timeAgo($row->hire_date);
|
||||
|
||||
$resigndate = formatDate($row->resign_date);
|
||||
$resignAgo = timeAgo($row->resign_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 Lahir:</span>
|
||||
<span>{$birthdate}</span>
|
||||
<span class="text-gray-500">({$birthAgo})</span>
|
||||
</div>
|
||||
<div>
|
||||
<span class="font-medium text-gray-900 dark:text-white">Tgl Bergabung:</span>
|
||||
<span>{$hireDate}</span>
|
||||
<span class="text-gray-500">({$openedAgo})</span>
|
||||
</div>
|
||||
<div>
|
||||
<span class="font-medium text-gray-900 dark:text-white">Tgl Resign:</span>
|
||||
<span>{$resigndate}</span>
|
||||
<span class="text-gray-500">({$resignAgo})</span>
|
||||
</div>
|
||||
</div>
|
||||
HTML;
|
||||
})
|
||||
->html(),
|
||||
|
||||
Column::make('status')
|
||||
->format(fn ($value) => Blade::render('<flux:badge color="'.$value->color().'">'.$value->label().'</flux:badge>'))
|
||||
->html(),
|
||||
|
||||
Column::make('Aksi')
|
||||
->label(function ($row) {
|
||||
$actions = '';
|
||||
|
||||
if (auth()->id() !== $row->id) {
|
||||
$actions .= view('components.datatables.edit', [
|
||||
'id' => $row->id,
|
||||
'editRoute' => route('studio.master.user.edit', $row->id),
|
||||
])->render();
|
||||
|
||||
$actions .= view('components.datatables.delete', [
|
||||
'id' => $row->id,
|
||||
'deleteRoute' => route('studio.master.user.delete', $row->id),
|
||||
])->render();
|
||||
}
|
||||
|
||||
return $actions;
|
||||
})
|
||||
->html(),
|
||||
];
|
||||
}
|
||||
|
||||
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');
|
||||
}
|
||||
|
||||
public function filters(): array
|
||||
{
|
||||
return [
|
||||
MultiSelectFilter::make('Status')
|
||||
->options(
|
||||
collect(Userstatus::cases())
|
||||
->mapWithKeys(fn ($case) => [$case->value => $case->label()])
|
||||
->toArray()
|
||||
)
|
||||
->filter(function (Builder $builder, array $values) {
|
||||
$builder->whereIn('users.status', $values);
|
||||
}),
|
||||
];
|
||||
}
|
||||
}
|
||||
150
app/Livewire/Forms/UserForm.php
Normal file
150
app/Livewire/Forms/UserForm.php
Normal file
@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use App\Enums\Gender;
|
||||
use App\Enums\UserStatus;
|
||||
use App\Models\Employee;
|
||||
use App\Models\User;
|
||||
use App\Rules\PhoneNumber;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Livewire\Form;
|
||||
|
||||
class UserForm extends Form
|
||||
{
|
||||
public ?User $user = null;
|
||||
|
||||
public string $full_name = '';
|
||||
|
||||
public string $username = '';
|
||||
|
||||
public string $email = '';
|
||||
|
||||
public string $phone_number = '';
|
||||
|
||||
public string $base_salary = '';
|
||||
|
||||
public string $birthdate = '';
|
||||
|
||||
public string $hire_date = '';
|
||||
|
||||
public string $address = '';
|
||||
|
||||
public string $gender = '';
|
||||
|
||||
public string $status = '1';
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'full_name' => ['required', 'string', 'max:100'],
|
||||
'username' => ['required', 'alpha_dash', 'min:5', 'max:20', Rule::unique('users', 'username')->ignore($this->user)],
|
||||
'email' => ['required', 'email', 'max:100', Rule::unique('users', 'email')->ignore($this->user)],
|
||||
'phone_number' => ['required', 'string', new PhoneNumber],
|
||||
'base_salary' => ['required', 'regex:/^[0-9.]+$/', 'max:999999999'],
|
||||
'birthdate' => ['required', 'date', 'before:'.Carbon::now()->subYears(18)->format('Y-m-d')],
|
||||
'hire_date' => ['required', 'date'],
|
||||
'address' => ['required', 'string'],
|
||||
'gender' => ['required', Rule::in(Gender::cases())],
|
||||
'status' => ['required', Rule::in(UserStatus::cases())],
|
||||
];
|
||||
}
|
||||
|
||||
public function validationAttributes(): array
|
||||
{
|
||||
return [
|
||||
'full_name' => 'nama lengkap',
|
||||
'username' => 'nama pengguna',
|
||||
'phone_number' => 'nomor telepon',
|
||||
'base_salary' => 'gaji pokok',
|
||||
'birthdate' => 'tanggal lahir',
|
||||
'hire_date' => 'tanggal bergabung',
|
||||
'address' => 'alamat',
|
||||
'gender' => 'jenis kelamin',
|
||||
];
|
||||
}
|
||||
|
||||
public function setUser(User $user)
|
||||
{
|
||||
$this->user = $user;
|
||||
$employee = $user->employee;
|
||||
|
||||
$this->full_name = $employee->full_name;
|
||||
$this->username = $user->username;
|
||||
$this->email = $user->email;
|
||||
$this->phone_number = $employee->phone_number;
|
||||
$this->base_salary = $employee->base_salary;
|
||||
$this->birthdate = $employee->birthdate->toDateString();
|
||||
$this->hire_date = $employee->hire_date->toDateString();
|
||||
$this->address = $employee->address;
|
||||
$this->gender = $employee->gender->value;
|
||||
$this->status = $user->status->value;
|
||||
}
|
||||
|
||||
public function store()
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
$data = $this->all();
|
||||
|
||||
if ($data['status'] != UserStatus::ACTIVE) {
|
||||
$data['resign_date'] = now();
|
||||
} else {
|
||||
$data['resign_date'] = null;
|
||||
}
|
||||
|
||||
DB::transaction(function () use ($data) {
|
||||
$user = User::create([
|
||||
...$data,
|
||||
'password' => Hash::make(config('myconfig.password_default')),
|
||||
'status' => $data['status'],
|
||||
]);
|
||||
|
||||
Employee::create([
|
||||
'user_id' => $user->id,
|
||||
'full_name' => $data['full_name'],
|
||||
'code' => Employee::generateEmployeeCode(),
|
||||
'phone_number' => $data['phone_number'],
|
||||
'base_salary' => replaceCurrency($data['base_salary']),
|
||||
'birthdate' => $data['birthdate'],
|
||||
'hire_date' => $data['hire_date'],
|
||||
'address' => $data['address'],
|
||||
'gender' => $data['gender'],
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
public function update()
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
$data = $this->all();
|
||||
|
||||
if ($data['status'] == UserStatus::SUSPENDED->value) {
|
||||
$data['closed_date'] = now()->toDateString();
|
||||
} else {
|
||||
$data['closed_date'] = null;
|
||||
}
|
||||
|
||||
DB::transaction(function () use ($data) {
|
||||
$this->user->update([
|
||||
...$data,
|
||||
'status' => $data['status'],
|
||||
]);
|
||||
|
||||
$this->user->employee->update([
|
||||
'user_id' => $this->user->id,
|
||||
'full_name' => $data['full_name'],
|
||||
'phone_number' => $data['phone_number'],
|
||||
'base_salary' => replaceCurrency($data['base_salary']),
|
||||
'birthdate' => $data['birthdate'],
|
||||
'hire_date' => $data['hire_date'],
|
||||
'address' => $data['address'],
|
||||
'gender' => $data['gender'],
|
||||
]);
|
||||
});
|
||||
}
|
||||
}
|
||||
38
app/Livewire/Studio/Master/User/Create.php
Normal file
38
app/Livewire/Studio/Master/User/Create.php
Normal file
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Studio\Master\User;
|
||||
|
||||
use App\Livewire\Forms\UserForm;
|
||||
use App\Traits\WithUpdatedData;
|
||||
use Flux\Flux;
|
||||
use Livewire\Attributes\Title;
|
||||
use Livewire\Component;
|
||||
|
||||
#[Title('Tambah Pegawai')]
|
||||
class Create extends Component
|
||||
{
|
||||
use WithUpdatedData;
|
||||
|
||||
public UserForm $form;
|
||||
|
||||
public function save()
|
||||
{
|
||||
$this->form->store();
|
||||
|
||||
Flux::toast(
|
||||
heading: 'Berhasil',
|
||||
text: 'Pegawai berhasil ditambahkan.',
|
||||
variant: 'success',
|
||||
duration: 3000
|
||||
);
|
||||
|
||||
$this->redirectRoute('studio.master.user.index', navigate: true);
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.studio.master.user.form', [
|
||||
'pageTitle' => 'Tambah Pegawai',
|
||||
]);
|
||||
}
|
||||
}
|
||||
46
app/Livewire/Studio/Master/User/Edit.php
Normal file
46
app/Livewire/Studio/Master/User/Edit.php
Normal file
@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Studio\Master\User;
|
||||
|
||||
use App\Livewire\Forms\UserForm;
|
||||
use App\Models\User;
|
||||
use App\Traits\WithUpdatedData;
|
||||
use Flux\Flux;
|
||||
use Livewire\Attributes\Title;
|
||||
use Livewire\Component;
|
||||
|
||||
#[Title('Ubah Pegawai')]
|
||||
class Edit extends Component
|
||||
{
|
||||
use WithUpdatedData;
|
||||
|
||||
public UserForm $form;
|
||||
|
||||
public function mount(User $user)
|
||||
{
|
||||
$this->form->setUser($user);
|
||||
}
|
||||
|
||||
public function save()
|
||||
{
|
||||
$this->form->update();
|
||||
|
||||
$this->dispatch('refreshDatatable');
|
||||
|
||||
Flux::toast(
|
||||
heading: 'Berhasil',
|
||||
text: 'Pegawai berhasil diperbarui.',
|
||||
variant: 'success',
|
||||
duration: 3000
|
||||
);
|
||||
|
||||
$this->redirectRoute('studio.master.user.index', navigate: true);
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.studio.master.user.form', [
|
||||
'pageTitle' => 'Ubah Pegawai',
|
||||
]);
|
||||
}
|
||||
}
|
||||
37
app/Livewire/Studio/Master/User/Index.php
Normal file
37
app/Livewire/Studio/Master/User/Index.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Studio\Master\User;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Traits\WithConfirmation;
|
||||
use Flux\Flux;
|
||||
use Livewire\Attributes\Title;
|
||||
use Livewire\Component;
|
||||
|
||||
#[Title('Pegawai')]
|
||||
class Index extends Component
|
||||
{
|
||||
use WithConfirmation;
|
||||
|
||||
public function delete(User $user)
|
||||
{
|
||||
$user->delete();
|
||||
|
||||
$this->dispatch('refreshDatatable');
|
||||
|
||||
Flux::toast(
|
||||
heading: 'Berhasil',
|
||||
text: 'Pegawai berhasil dihapus.',
|
||||
variant: 'success',
|
||||
);
|
||||
|
||||
Flux::modals()->close();
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.studio.master.user.index', [
|
||||
'pageTitle' => 'Pegawai',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -26,6 +26,27 @@ protected function casts(): array
|
||||
];
|
||||
}
|
||||
|
||||
public static function generateEmployeeCode(): string
|
||||
{
|
||||
$prefix = 'EMP';
|
||||
$year = date('Y');
|
||||
|
||||
$lastEmployee = self::where('code', 'like', "$prefix$year%")
|
||||
->orderBy('code', 'desc')
|
||||
->first();
|
||||
|
||||
if ($lastEmployee) {
|
||||
$lastNumber = (int) substr($lastEmployee->code, strlen($prefix) + 4);
|
||||
$newNumber = $lastNumber + 1;
|
||||
} else {
|
||||
$newNumber = 1;
|
||||
}
|
||||
|
||||
$numberFormatted = str_pad($newNumber, 4, '0', STR_PAD_LEFT);
|
||||
|
||||
return $prefix.$year.$numberFormatted;
|
||||
}
|
||||
|
||||
public function user(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(User::class);
|
||||
|
||||
@ -16,11 +16,10 @@ public function up(): void
|
||||
$table->id();
|
||||
$table->string('email', 100)->unique();
|
||||
$table->string('username', 20)->unique();
|
||||
$table->string('phone_number', 20);
|
||||
$table->string('password', 97);
|
||||
$table->enum('status', [UserStatus::values()])->default(UserStatus::ACTIVE)->comment(UserStatus::comment());
|
||||
$table->timestamp('last_login_at')->nullable();
|
||||
$table->timestamp('last_password_change_at')->nullable();
|
||||
$table->enum('status', [UserStatus::values()])->default(UserStatus::ACTIVE);
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
|
||||
@ -16,15 +16,16 @@ public function up(): void
|
||||
Schema::create('employees', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
|
||||
$table->string('code', 50)->unique();
|
||||
$table->string('full_name', 100);
|
||||
$table->enum('gender', [Gender::values()]);
|
||||
$table->string('code', 20)->unique();
|
||||
$table->string('phone_number', 20);
|
||||
$table->unsignedInteger('base_salary')->default(0);
|
||||
$table->enum('gender', [Gender::values()])->comment(Gender::comment());
|
||||
$table->text('address');
|
||||
$table->date('birthdate');
|
||||
$table->date('hire_date');
|
||||
$table->date('resign_date')->nullable();
|
||||
$table->enum('status', [EmploymentStatus::values()])->default(EmploymentStatus::PERMANENT);
|
||||
$table->unsignedInteger('base_salary')->default(0);
|
||||
$table->text('address');
|
||||
$table->enum('status', [EmploymentStatus::values()])->default(EmploymentStatus::PERMANENT)->comment(EmploymentStatus::comment());
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
|
||||
@ -19,7 +19,6 @@ public function run(): void
|
||||
$user = User::create([
|
||||
'email' => 'project.pangestuyoga@gmail.com',
|
||||
'username' => 'pangestu',
|
||||
'phone_number' => '082121495806',
|
||||
'password' => Hash::make(config('myconfig.password_default')),
|
||||
]);
|
||||
|
||||
@ -27,12 +26,12 @@ public function run(): void
|
||||
'user_id' => $user->id,
|
||||
'code' => '0001',
|
||||
'full_name' => 'Yoga Pangestu',
|
||||
'phone_number' => '082121495806',
|
||||
'gender' => Gender::MALE,
|
||||
'address' => 'Kp. Bakan Sampeu',
|
||||
'birthdate' => '2005-03-13',
|
||||
'hire_date' => now(),
|
||||
'status' => EmploymentStatus::PERMANENT,
|
||||
'base_salary' => 0,
|
||||
'address' => 'Kp. Bakan Sampeu',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,6 +17,10 @@ class="px-2 hidden dark:flex" />
|
||||
<flux:navlist.item icon="home-modern" href="{{ route('studio.master.outlet.index') }}"
|
||||
:current="request()->routeIs('studio.master.outlet.*')" wire:navigate.hover>Outlet
|
||||
</flux:navlist.item>
|
||||
|
||||
<flux:navlist.item icon="users" href="{{ route('studio.master.user.index') }}"
|
||||
:current="request()->routeIs('studio.master.user.*')" wire:navigate.hover>Pegawai
|
||||
</flux:navlist.item>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
109
resources/views/livewire/studio/master/user/form.blade.php
Normal file
109
resources/views/livewire/studio/master/user/form.blade.php
Normal file
@ -0,0 +1,109 @@
|
||||
<flux:main>
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<flux:heading size="xl">{{ $pageTitle }}</flux:heading>
|
||||
</div>
|
||||
<div>
|
||||
<flux:button href="{{ route('studio.master.user.index') }}" wire:navigate.hover class="text-sm">
|
||||
Kembali
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-6">
|
||||
<div class="flex flex-col gap-4">
|
||||
<div class="flex flex-col lg:flex-row gap-4">
|
||||
<div class="w-full lg:w-3/4 space-y-4">
|
||||
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2 items-start">
|
||||
<div class="col-span-1 lg:col-span-2">
|
||||
<flux:card class="space-y-6 p-6">
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<div class="md:col-span-2">
|
||||
<flux:input label="Nama Lengkap" placeholder="Masukkan nama lengkap"
|
||||
wire:model.live.debounce.500ms="form.full_name" autofocus autocomplete="off"
|
||||
clearable />
|
||||
</div>
|
||||
|
||||
<flux:input label="Nama Pengguna" placeholder="Masukkan nama pengguna"
|
||||
wire:model.live.debounce.500ms="form.username" autofocus autocomplete="off"
|
||||
clearable />
|
||||
|
||||
<flux:input label="Email" placeholder="Masukkan email"
|
||||
wire:model.live.debounce.500ms="form.email" autofocus autocomplete="off"
|
||||
clearable />
|
||||
<flux:input label="Nomor Telepon" placeholder="Masukkan nomor telepon"
|
||||
mask="9999 9999 99999" wire:model.live.debounce.500ms="form.phone_number"
|
||||
autocomplete="off" clearable />
|
||||
|
||||
<flux:field>
|
||||
<flux:label>Gaji Pokok</flux:label>
|
||||
|
||||
<flux:input.group>
|
||||
<flux:input.group.prefix>Rp</flux:input.group.prefix>
|
||||
|
||||
<flux:input placeholder="Masukkan gaji pokok"
|
||||
x-mask:dynamic="$money($input, ',')"
|
||||
wire:model.live.debounce.500ms="form.base_salary" autocomplete="off"
|
||||
clearable />
|
||||
</flux:input.group>
|
||||
|
||||
<flux:error name="form.base_salary" />
|
||||
</flux:field>
|
||||
|
||||
<flux:date-picker label="Tanggal Lahir" with-today
|
||||
wire:model.live.debounce.500ms="form.birthdate" autocomplete="off" clearable
|
||||
locale="id-ID" selectable-header />
|
||||
|
||||
<flux:date-picker label="Tanggal Bergabung" with-today
|
||||
wire:model.live.debounce.500ms="form.hire_date" autocomplete="off" clearable
|
||||
locale="id-ID" selectable-header />
|
||||
|
||||
<div class="md:col-span-2">
|
||||
<flux:textarea label="Alamat" placeholder="Masukkan alamat lengkap"
|
||||
wire:model.live.debounce.500ms="form.address" autocomplete="off"
|
||||
rows="2" />
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full lg:w-1/3 space-y-4">
|
||||
<flux:card class="space-y-6 p-6">
|
||||
<div class="space-y-3">
|
||||
<flux:radio.group wire:model.live="form.gender" variant="buttons" class="w-full *:flex-1"
|
||||
label="Jenis Kelamin">
|
||||
@foreach (\App\Enums\Gender::cases() as $gender)
|
||||
<flux:radio value="{{ $gender->value }}" icon="{{ $gender->icon() }}">
|
||||
{{ $gender->label() }}
|
||||
</flux:radio>
|
||||
@endforeach
|
||||
</flux:radio.group>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<flux:card class="space-y-6 p-6">
|
||||
<div class="space-y-2">
|
||||
<flux:radio.group wire:model.live="form.status" variant="buttons" label="Status"
|
||||
class="w-full *:flex-1">
|
||||
@foreach (\App\Enums\UserStatus::cases() as $status)
|
||||
<flux:radio value="{{ $status->value }}" icon="{{ $status->icon() }}">
|
||||
{{ $status->label() }}
|
||||
</flux:radio>
|
||||
@endforeach
|
||||
</flux:radio.group>
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-start">
|
||||
<flux:button variant="primary" class="sm:w-auto cursor-pointer" wire:click="save">
|
||||
Simpan
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</flux:main>
|
||||
19
resources/views/livewire/studio/master/user/index.blade.php
Normal file
19
resources/views/livewire/studio/master/user/index.blade.php
Normal file
@ -0,0 +1,19 @@
|
||||
<flux:main>
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<flux:heading size="xl">{{ $pageTitle }}</flux:heading>
|
||||
</div>
|
||||
<div>
|
||||
<flux:button href="{{ route('studio.master.user.create') }}" variant="primary" wire:navigate.hover
|
||||
class="text-sm">
|
||||
Tambah
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-6">
|
||||
<livewire:datatable.users-table />
|
||||
</div>
|
||||
|
||||
@include('components.confirmation.delete')
|
||||
</flux:main>
|
||||
@ -6,6 +6,9 @@
|
||||
use App\Livewire\Studio\Master\Outlet\Create as OutletCreate;
|
||||
use App\Livewire\Studio\Master\Outlet\Edit as OutletEdit;
|
||||
use App\Livewire\Studio\Master\Outlet\Index as OutletIndex;
|
||||
use App\Livewire\Studio\Master\User\Create as UserCreate;
|
||||
use App\Livewire\Studio\Master\User\Edit as UserEdit;
|
||||
use App\Livewire\Studio\Master\User\Index as UserIndex;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::get('/', function () {
|
||||
@ -36,4 +39,13 @@
|
||||
Route::get('outlets/{outlet}/edit', OutletEdit::class)->name('edit');
|
||||
Route::get('outlets/{outlet}/delete', OutletCreate::class)->name('delete');
|
||||
});
|
||||
|
||||
Route::prefix('master')
|
||||
->as('studio.master.user.')
|
||||
->group(function () {
|
||||
Route::get('users', UserIndex::class)->name('index');
|
||||
Route::get('users/create', UserCreate::class)->name('create');
|
||||
Route::get('users/{user}/edit', UserEdit::class)->name('edit');
|
||||
Route::get('users/{user}/delete', UserCreate::class)->name('delete');
|
||||
});
|
||||
});
|
||||
|
||||
Loading…
Reference in New Issue
Block a user