records(fn (?string $search, ?string $sortColumn, ?string $sortDirection, int|string $page, int|string $recordsPerPage) => $service->paginate( search: $search, sortColumn: $sortColumn, sortDirection: $sortDirection, page: (int) $page, perPage: (int) $recordsPerPage, )) ->columns([ TextColumn::make('customer_code')->label('Kode')->sortable(), TextColumn::make('name')->label('Nama')->searchable()->sortable(), TextColumn::make('address')->label('Alamat')->limit(40), TextColumn::make('phone')->label('Telepon'), TextColumn::make('notes')->label('Catatan')->limit(30), ]) ->headerActions([ CreateAction::make() ->schema(fn (Schema $schema): Schema => $schema->components(self::customerFormSchema())) ->using(function (array $data): void { app(CustomerService::class)->create($data); }), ]) ->recordActions([ EditAction::make() ->schema(fn (Schema $schema): Schema => $schema->components(self::customerFormSchema())) ->fillForm(fn (array $record): array => $record) ->action(function (array $data, array $record): void { app(CustomerService::class)->update($record['id'], $data); }), Action::make('hapus') ->label('Hapus') ->color('danger') ->icon('heroicon-o-trash') ->requiresConfirmation() ->modalDescription('Yakin menghapus pelanggan ini?') ->action(function (array $record): void { app(CustomerService::class)->delete($record['id']); }), ]) ->paginated([10, 25, 50]); } /** * @return list */ private static function customerFormSchema(): array { return [ TextInput::make('customer_code')->label('Kode')->default(fn () => app(CustomerService::class)->nextCode())->required()->maxLength(20), TextInput::make('name')->label('Nama Pelanggan')->required()->maxLength(150), TextInput::make('address')->label('Alamat')->maxLength(255), TextInput::make('phone')->label('Telepon')->tel()->maxLength(30), Textarea::make('notes')->label('Catatan')->columnSpanFull(), ]; } public function content(Schema $schema): Schema { return $schema ->components([ EmbeddedTable::make(), ]); } }