schema([ Forms\Components\TextInput::make('operator')->label(__('label.seed_box_record.operator')), Forms\Components\TextInput::make('bandwidth')->label(__('label.seed_box_record.bandwidth'))->integer(), Forms\Components\TextInput::make('ip_begin')->label(__('label.seed_box_record.ip_begin')), Forms\Components\TextInput::make('ip_end')->label(__('label.seed_box_record.ip_end')), Forms\Components\TextInput::make('ip')->label(__('label.seed_box_record.ip'))->helperText(__('label.seed_box_record.ip_help')), Forms\Components\Textarea::make('comment')->label(__('label.comment')), ])->columns(1); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('id'), Tables\Columns\TextColumn::make('typeText')->label(__('label.seed_box_record.type')), Tables\Columns\TextColumn::make('uid')->searchable(), Tables\Columns\TextColumn::make('user.username')->label(__('label.username'))->searchable(), Tables\Columns\TextColumn::make('operator')->label(__('label.seed_box_record.operator'))->searchable(), Tables\Columns\TextColumn::make('bandwidth')->label(__('label.seed_box_record.bandwidth')), Tables\Columns\TextColumn::make('ip') ->label(__('label.seed_box_record.ip')) ->searchable(true, function (Builder $query, $search) { try { $ip = IP::create($search); $ipNumeric = $ip->numeric(); return $query->orWhere(function (Builder $query) use ($ipNumeric) { return $query->where('ip_begin_numeric', '<=', $ipNumeric)->where('ip_end_numeric', '>=', $ipNumeric); }); } catch (\Exception $exception) { do_log("Invalid IP: $search, error: " . $exception->getMessage()); } }) ->formatStateUsing(fn ($record) => $record->ip ?: sprintf('%s ~ %s', $record->ip_begin, $record->ip_end)), Tables\Columns\TextColumn::make('comment')->label(__('label.comment')), Tables\Columns\BadgeColumn::make('status') ->colors([ 'success' => SeedBoxRecord::STATUS_ALLOWED, 'warning' => SeedBoxRecord::STATUS_UNAUDITED, 'danger' => SeedBoxRecord::STATUS_DENIED, ]) ->formatStateUsing(fn ($record) => $record->statusText) ->label(__('label.seed_box_record.status')), ]) ->filters([ Tables\Filters\Filter::make('uid') ->form([ Forms\Components\TextInput::make('uid') ->label('UID') ->placeholder('UID') , ])->query(function (Builder $query, array $data) { return $query->when($data['uid'], fn (Builder $query, $uid) => $query->where("uid", $uid)); }) , Tables\Filters\SelectFilter::make('type')->options(SeedBoxRecord::listTypes('text'))->label(__('label.seed_box_record.type')), Tables\Filters\SelectFilter::make('status')->options(SeedBoxRecord::listStatus('text'))->label(__('label.seed_box_record.status')), ]) ->actions([ Tables\Actions\EditAction::make(), Tables\Actions\Action::make('audit') ->label(__('admin.resources.seed_box_record.toggle_status')) ->form([ Forms\Components\Radio::make('status')->options(SeedBoxRecord::listStatus('text')) ->inline()->label(__('label.seed_box_record.status'))->required() ]) ->action(function (SeedBoxRecord $record, array $data) { $rep = new SeedBoxRepository(); try { $rep->updateStatus($record, $data['status']); } catch (\Exception $exception) { Filament::notify('danger', class_basename($exception)); } }) , ]) ->bulkActions([ Tables\Actions\DeleteBulkAction::make(), ]); } public static function getRelations(): array { return [ // ]; } public static function getPages(): array { return [ 'index' => Pages\ListSeedBoxRecords::route('/'), 'create' => Pages\CreateSeedBoxRecord::route('/create'), 'edit' => Pages\EditSeedBoxRecord::route('/{record}/edit'), ]; } }