File "QuickCreatePlugin.php"

Full Path: /home/tecassol/public_html/tecas-solar.ma/vendor/awcodes/filament-quick-create/src/QuickCreatePlugin.php
File size: 6.88 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace Awcodes\FilamentQuickCreate;

use Closure;
use Filament\Contracts\Plugin;
use Filament\Facades\Filament;
use Filament\Panel;
use Filament\Support\Concerns\EvaluatesClosures;
use Filament\View\PanelsRenderHook;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Str;
use Livewire\Livewire;

class QuickCreatePlugin implements Plugin
{
    use EvaluatesClosures;

    protected Closure $getResourcesUsing;

    protected array $excludes = [];

    protected array $includes = [];

    protected bool $sort = true;

    protected bool | Closure | null $shouldUseSlideOver = null;

    protected string | Closure $sortBy = 'label';

    protected bool | Closure $hidden = false;

    protected bool | Closure | null $rounded = null;

    protected string | Closure | null $renderUsingHook = null;

    protected bool | Closure | null $hiddenIcons = null;

    protected string | Closure | null $label = null;

    protected bool | Closure $shouldUseModal = false;

    protected string | array | Closure | null $keyBindings = null;

    protected bool | Closure | null $createAnother = null;

    public function boot(Panel $panel): void
    {
        Livewire::component('quick-create-menu', Components\QuickCreateMenu::class);
        $this->getResourcesUsing(fn () => $panel->getResources());
    }

    public function excludes(array $resources): static
    {
        $this->excludes = $resources;

        return $this;
    }

    public function includes(array $resources): static
    {
        $this->includes = $resources;

        return $this;
    }

    public function rounded(bool | Closure $condition = true): static
    {
        $this->rounded = $condition;

        return $this;
    }

    public static function get(): static
    {
        return filament(app(static::class)->getId());
    }

    public function getId(): string
    {
        return 'filament-quick-create';
    }

    public function getExcludes(): array
    {
        return $this->evaluate($this->excludes);
    }

    public function getIncludes(): array
    {
        return $this->evaluate($this->includes);
    }

    public function getResources(): array
    {
        $resources = filled($this->getIncludes())
            ? $this->getIncludes()
            : $this->evaluate($this->getResourcesUsing);

        $list = collect($resources)
            ->filter(function ($item) {
                return ! in_array($item, $this->getExcludes());
            })
            ->map(function ($resourceName): ?array {
                $resource = app($resourceName);

                if (Filament::hasTenancy() && ! Filament::getTenant()) {
                    return null;
                }

                if ($resource->canCreate()) {
                    $actionName = 'create_' . Str::of($resource->getModel())->replace('\\', '')->snake();

                    return [
                        'resource_name' => $resourceName,
                        'label' => Str::ucfirst($resource->getModelLabel()),
                        'model' => $resource->getModel(),
                        'icon' => $resource->getNavigationIcon(),
                        'action_name' => $actionName,
                        'action' => ! $resource->hasPage('create') || $this->shouldUseModal() ? 'mountAction(\'' . $actionName . '\')' : null,
                        'url' => $resource->hasPage('create') && ! $this->shouldUseModal() ? $resource::getUrl('create') : null,
                        'navigation' => $resource->getNavigationSort(),
                    ];
                }

                return null;
            })
            ->when($this->isSortable(), fn ($collection) => $collection->sortBy($this->sortBy))
            ->values()
            ->toArray();

        return array_filter($list);
    }

    public function getResourcesUsing(Closure $callback): static
    {
        $this->getResourcesUsing = $callback;

        return $this;
    }

    public function isSortable(): bool
    {
        return $this->evaluate($this->sort);
    }

    public function isRounded(): bool
    {
        return $this->evaluate($this->rounded) ?? true;
    }

    public static function make(): static
    {
        return app(static::class);
    }

    public function register(Panel $panel): void
    {
        $panel
            ->renderHook(
                name: $this->getRenderHook(),
                hook: fn (): string => Blade::render("@livewire('quick-create-menu')")
            );
    }

    public function shouldUseSlideOver(): bool
    {
        return $this->evaluate($this->shouldUseSlideOver) ?? false;
    }

    public function slideOver(bool $condition = true): static
    {
        $this->shouldUseSlideOver = $condition;

        return $this;
    }

    public function sort(bool | Closure $condition = true): static
    {
        $this->sort = $condition;

        return $this;
    }

    public function sortBy(string | Closure $sortBy = 'label'): static
    {
        if (! in_array($sortBy, ['label', 'navigation'])) {
            $sortBy = 'label';
        }
        $this->sortBy = $sortBy;

        return $this;
    }

    public function hidden(bool | Closure $hidden = true): static
    {
        $this->hidden = $hidden;

        return $this;
    }

    public function shouldBeHidden(): bool
    {
        return $this->evaluate($this->hidden) ?? false;
    }

    public function renderUsingHook(string | Closure $panelHook): static
    {
        $this->renderUsingHook = $panelHook;

        return $this;
    }

    public function getRenderHook(): string
    {
        return $this->evaluate($this->renderUsingHook) ?? PanelsRenderHook::USER_MENU_BEFORE;
    }

    public function hiddenIcons(bool | Closure $condition = true): static
    {
        $this->hiddenIcons = $condition;

        return $this;
    }

    public function shouldHideIcons(): bool
    {
        return $this->evaluate($this->hiddenIcons) ?? false;
    }

    public function label(string | Closure $label): static
    {
        $this->label = $label;

        return $this;
    }

    public function getLabel(): ?string
    {
        return $this->evaluate($this->label) ?? null;
    }

    public function shouldUseModal(): bool
    {
        return $this->evaluate($this->shouldUseModal) ?? false;
    }

    public function alwaysShowModal(bool | Closure $condition = true): static
    {
        $this->shouldUseModal = $condition;

        return $this;
    }

    public function keyBindings(string | array | Closure | null $bindings): static
    {
        $this->keyBindings = $bindings;

        return $this;
    }

    public function getKeyBindings(): ?array
    {
        return collect($this->evaluate($this->keyBindings))->toArray();
    }

    public function createAnother(bool | Closure $condition = true): static
    {
        $this->createAnother = $condition;

        return $this;
    }

    public function canCreateAnother(): ?bool
    {
        return $this->evaluate($this->createAnother);
    }
}