102 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\View\Page;
 | 
						|
 | 
						|
use Livewire\Attributes\On;
 | 
						|
use Livewire\Component;
 | 
						|
 | 
						|
class Modal extends Component
 | 
						|
{
 | 
						|
 | 
						|
    public ?string $component = null;
 | 
						|
    public array $props = [];
 | 
						|
    public string $key = '';
 | 
						|
    public array $actions = [];
 | 
						|
    public ?string $size = null;
 | 
						|
    public string $title = '';
 | 
						|
 | 
						|
    public function __construct()
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
    #[On('openModal')]
 | 
						|
    public function onOpenModal(string $component, string $title, array $props = [], array $actions = ['storeable', 'closeable'], string $size = "xl"): void
 | 
						|
    {
 | 
						|
        $this->component = $component;
 | 
						|
        $this->props = $props;
 | 
						|
        $this->size = $size;
 | 
						|
        $this->title = $title;
 | 
						|
        $this->key = md5(json_encode(['component' => $component, 'props' => $props]));
 | 
						|
        $this->actions = $this->parseActions($actions);
 | 
						|
    }
 | 
						|
 | 
						|
    public function parseActions(array $actions): array
 | 
						|
    {
 | 
						|
        return collect($actions)->map(function ($action) {
 | 
						|
            if ($action === 'closeable') {
 | 
						|
                return ['event' => 'closeModal', 'icon' => 'close', 'label' => 'Schließen'];
 | 
						|
            }
 | 
						|
 | 
						|
            if ($action === 'storeable') {
 | 
						|
                return ['event' => 'onStoreFromModal', 'icon' => 'save', 'label' => 'Speichern'];
 | 
						|
            }
 | 
						|
 | 
						|
            return $action;
 | 
						|
        })->toArray();
 | 
						|
    }
 | 
						|
 | 
						|
    #[On('closeModal')]
 | 
						|
    public function onCloseModal(): void
 | 
						|
    {
 | 
						|
        $this->reset();
 | 
						|
    }
 | 
						|
 | 
						|
    public function sizeClass(): string
 | 
						|
    {
 | 
						|
        if ($this->size === 'lg') {
 | 
						|
            return 'max-w-lg';
 | 
						|
        }
 | 
						|
 | 
						|
        if ($this->size === 'xl') {
 | 
						|
            return 'max-w-xl';
 | 
						|
        }
 | 
						|
 | 
						|
        return '';
 | 
						|
    }
 | 
						|
 | 
						|
    public function render()
 | 
						|
    {
 | 
						|
        return <<<'HTML'
 | 
						|
            <div>
 | 
						|
                @if($component)
 | 
						|
                <div class="fixed z-40 top-0 left-0 w-full h-full flex items-center justify-center p-6 bg-black/60 backdrop-blur-sm" @click.self="$dispatch('closeModal')">
 | 
						|
                    <div
 | 
						|
                        class="relative rounded-lg p-8 bg-zinc-800 shadow-2xl shadow-black border border-zinc-700 border-solid w-full max-h-full flex flex-col overflow-auto {{$this->sizeClass()}}"
 | 
						|
                    >
 | 
						|
                        <div class="flex">
 | 
						|
                            <h3 class="font-semibold text-primary-200 text-xl grow">{{$title}}</h3>
 | 
						|
                            <div class="flex space-x-6">
 | 
						|
                                @foreach ($this->actions as $action)
 | 
						|
                                <a x-tooltip.raw="{{$action['label']}}" href="#" @click.prevent="$dispatch('{{$action['event']}}')">
 | 
						|
                                    <x-ui::sprite :src="$action['icon']" class="text-zinc-400 w-6 h-6"></x-ui::sprite>
 | 
						|
                                </a>
 | 
						|
                                @endforeach
 | 
						|
                            </div>
 | 
						|
                        </div>
 | 
						|
                        <div class="text-primary-100 group is-popup grow flex flex-col mt-3">
 | 
						|
                            <div>
 | 
						|
                                @if ($component)
 | 
						|
                                @livewire($component, $props, key($key))
 | 
						|
                                @endif
 | 
						|
                            </div>
 | 
						|
                        </div>
 | 
						|
                    </div>
 | 
						|
                </div>
 | 
						|
                @else
 | 
						|
                <div></div>
 | 
						|
                @endif
 | 
						|
            </div>
 | 
						|
        HTML;
 | 
						|
    }
 | 
						|
}
 |