Skip to content

Quick start

Register a panel, one Resource class, and visit /admin.

This walkthrough registers an admin panel with one resource backed by a Core stream.

1. Define a stream

streams/posts.json:

{
    "id": "posts",
    "fields": [
        { "handle": "title", "type": "string", "required": true },
        { "handle": "body", "type": "string" }
    ]
}

2. Create a resource class

app/Ui/Posts/PostResource.php:

namespace App\Ui\Posts;

use Streams\Ui\Resources\Resource;
use Streams\Ui\Builders\Forms\Form;
use Streams\Ui\Builders\Tables\Table;
use Streams\Ui\Builders\Forms\Layouts\Field;
use Streams\Ui\Builders\Inputs\TextInput;
use Streams\Ui\Builders\Inputs\TextareaInput;
use Streams\Ui\Builders\Tables\Columns\TextColumn;
use Streams\Ui\Livewire\Pages\ListEntries;
use Streams\Ui\Livewire\Pages\CreateEntry;
use Streams\Ui\Livewire\Pages\EditEntry;

class PostResource extends Resource
{
    protected static ?string $stream = 'posts';

    public static function getPages(): array
    {
        return [
            'index' => ListEntries::route('/'),
            'create' => CreateEntry::route('/create'),
            'edit' => EditEntry::route('/{entry}/edit'),
        ];
    }

    public static function form(Form $form): Form
    {
        return $form->components([
            Field::make('title')->input(TextInput::make('title')),
            Field::make('body')->input(TextareaInput::make('body')),
        ]);
    }

    public static function table(Table $table): Table
    {
        return $table->columns([
            TextColumn::make('title'),
        ]);
    }
}

3. Register the panel

UI::panel(
    Panel::make('admin')
        ->default()
        ->path('admin')
        ->middleware(['web'])
        ->resources([PostResource::class])
);

4. Visit the panel

Open /admin/posts (resource slug derived from class name).

Related