* Page builder foundation * Form builder document type * Dashboard builder document type * Report builder document type * Menu builder document type * Email builder document type * Query builder document type * Workflow builder document type * Reusable component registry * Form-field registry * Dashboard-widget registry * Hero, heading, and rich-content components * JSON document schema * Saved builder documents * Draft, published, and archived states * Document version history * Reusable builder templates * Component rendering service * Extensible BuilderComponent contract * Authenticated Builder REST endpoints * Administration navigation * Builder permissions * Module registration and test
25 lines
1.6 KiB
PHP
25 lines
1.6 KiB
PHP
<?php
|
|
namespace Modules\Builder\Services;
|
|
use InvalidArgumentException;
|
|
use Modules\Builder\Contracts\BuilderComponent;
|
|
use Modules\Builder\Components\ContentComponent;
|
|
use Modules\Builder\Components\HeadingComponent;
|
|
use Modules\Builder\Components\HeroComponent;
|
|
final class BuilderRegistry
|
|
{
|
|
private array $components=[];
|
|
private array $widgets=[];
|
|
private array $fields=[];
|
|
public function registerDefaults(): void
|
|
{
|
|
foreach ([HeroComponent::class, HeadingComponent::class, ContentComponent::class] as $component) $this->registerComponent(new $component());
|
|
foreach (['metric','chart','table','activity','calendar'] as $widget) $this->widgets[$widget]=['type'=>$widget,'label'=>str($widget)->headline()->toString()];
|
|
foreach (['text','textarea','email','number','select','checkbox','date','file'] as $field) $this->fields[$field]=['type'=>$field,'label'=>str($field)->headline()->toString()];
|
|
}
|
|
public function registerComponent(BuilderComponent $component): void { $this->components[$component->type()]=$component; }
|
|
public function component(string $type): BuilderComponent { return $this->components[$type] ?? throw new InvalidArgumentException("Unknown builder component [$type]."); }
|
|
public function components(): array { return array_map(fn(BuilderComponent $c)=>['type'=>$c->type(),'label'=>$c->label(),'category'=>$c->category(),'schema'=>$c->schema(),'defaults'=>$c->defaults()],array_values($this->components)); }
|
|
public function widgets(): array { return array_values($this->widgets); }
|
|
public function fields(): array { return array_values($this->fields); }
|
|
}
|