# Admin Package
The Admin package provides a complete admin panel with Livewire modals, form components, global search, and an extensible menu system.
## Installation
```bash
composer require host-uk/core-admin
```
## Features
### Admin Menu System
Extensible navigation menu with automatic discovery:
```php
icon('newspaper')
->priority(30)
->children([
MenuItemBuilder::make('Posts')
->route('admin.blog.posts.index')
->icon('document-text'),
MenuItemBuilder::make('Categories')
->route('admin.blog.categories.index')
->icon('folder'),
])
->build(),
];
}
}
```
Register in your module's Boot.php:
```php
public function onAdmin(AdminPanelBooting $event): void
{
$event->menu(new BlogMenuProvider());
}
```
[Learn more about Admin Menus →](/patterns-guide/admin-menus)
### Livewire Modals
Full-page modal system for admin interfaces:
```php
post = $post;
$this->title = $post?->title;
$this->content = $post?->content;
}
public function save(): void
{
$validated = $this->validate([
'title' => 'required|max:255',
'content' => 'required',
]);
if ($this->post) {
$this->post->update($validated);
} else {
Post::create($validated);
}
$this->dispatch('post-saved');
$this->closeModal();
}
public function render()
{
return view('blog::admin.post-editor');
}
}
```
Open modals from any admin page:
```blade
New Post
Edit Post
```
### Form Components
Pre-built form components with validation:
```blade
Save Post
Cancel
```
### Global Search
Search across all admin content:
```php
orWhere('content', 'like', "%{$query}%")
->limit(5)
->get()
->map(fn ($post) => new SearchResult(
title: $post->title,
description: $post->excerpt,
url: route('admin.blog.posts.edit', $post),
icon: 'document-text',
type: 'Post',
))
->toArray();
}
public function getSearchableTypes(): array
{
return ['posts'];
}
}
```
Register provider:
```php
// config/core-admin.php
'search' => [
'providers' => [
\Mod\Blog\Search\PostSearchProvider::class,
],
],
```
### Dashboard Widgets
Add widgets to the admin dashboard:
```php
Post::count(),
'publishedPosts' => Post::published()->count(),
'draftPosts' => Post::draft()->count(),
]);
}
}
```
Register widget:
```php
public function onAdmin(AdminPanelBooting $event): void
{
$event->widget(new PostStatsWidget(), priority: 10);
}
```
### Settings Pages
Add custom settings pages:
```php
postsPerPage = config('blog.posts_per_page', 10);
$this->enableComments = config('blog.comments_enabled', true);
}
public function save(): void
{
ConfigService::set('blog.posts_per_page', $this->postsPerPage);
ConfigService::set('blog.comments_enabled', $this->enableComments);
$this->dispatch('settings-saved');
}
public function render()
{
return view('blog::admin.settings');
}
}
```
Register settings page:
```php
public function onAdmin(AdminPanelBooting $event): void
{
$event->settings('blog', BlogSettings::class);
}
```
## Components Reference
### Input
```blade
```
### Textarea
```blade
```
### Select
```blade
```
### Checkbox
```blade
```
### Toggle
```blade
```
### Button
```blade
Save Changes
```
### Form Group
```blade
```
## Layouts
### Admin App Layout
```blade