components([ TextInput::make('name') ->label('Nama') ->placeholder('John Doe') ->autocomplete(false) ->autofocus() ->required() ->maxLength(100), TextInput::make('email') ->label('Alamat Surel') ->placeholder('johndoe@simedkom.purwakartakab.co.id') ->autocomplete(false) ->required() ->maxLength(254) ->unique(ignoreRecord: true) ->email(), TextInput::make('username') ->label('Nama Pengguna') ->placeholder('johndoe') ->autocomplete(false) ->required() ->minLength(5) ->maxLength(20) ->regex('/^[a-zA-Z0-9_.-]+$/') ->unique(ignoreRecord: true), Select::make('roles') ->label('Peran') ->relationship('roles', 'name', fn ($query) => $query->where('name', '!=', 'Developer')) ->multiple() ->preload() ->searchable() ->required(), Hidden::make('password') ->default(fn ($record) => $record ? null : config('auth.password_default')), ]) ->columns(1); } public static function table(Table $table): Table { return $table ->recordTitleAttribute('name') ->columns([ TextColumn::make('name') ->label('Nama') ->searchable(), TextColumn::make('email') ->label('Alamat Surel') ->searchable(), TextColumn::make('username') ->label('Nama Pengguna') ->searchable(), ToggleColumn::make('is_active') ->label('Status') ->getStateUsing(fn (User $record) => $record->is_active === IsActive::ACTIVE) ->updateStateUsing(function (User $record, bool $state) { $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->save(); if ($record->is_active === IsActive::INACTIVE) { DB::table('sessions') ->where('user_id', $record->id) ->delete(); } }), TextColumn::make('roles.name') ->label('Peran') ->getStateUsing(fn (User $record) => $record->roles->pluck('name', 'id')->toArray()) ->badge() ->sortable(), ...TimestampColumns::make(), ]) ->filters([ TrashedFilter::make()->native(false), ]) ->recordActions([ EditAction::make() ->modalWidth(Width::Large), DeleteAction::make(), ForceDeleteAction::make(), RestoreAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ ...DefaultBulkActions::make('Pengguna'), ]), ]) ->emptyStateIcon(Heroicon::UserGroup) ->emptyStateDescription('Setelah Anda membubat data pertama, maka akan muncul disini.') ->defaultSort('created_at', 'desc') ->deferFilters(false); } public static function getPages(): array { return [ 'index' => ManageUsers::route('/'), ]; } public static function getRecordRouteBindingEloquentQuery(): Builder { return parent::getRecordRouteBindingEloquentQuery() ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } public static function getEloquentQuery(): Builder { return static::getModel()::query()->withoutDeveloper(); } }