%PDF- %PDF-
| Direktori : /www/loslex/test/vendor/wire-elements/modal/src/ |
| Current File : /www/loslex/test/vendor/wire-elements/modal/src/Modal.php |
<?php
namespace LivewireUI\Modal;
use Exception;
use Illuminate\Contracts\Routing\UrlRoutable;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Collection;
use Illuminate\Support\Reflector;
use Illuminate\View\View;
use Livewire\Component;
use Livewire\Mechanisms\ComponentRegistry;
use ReflectionClass;
class Modal extends Component
{
public ?string $activeComponent;
public array $components = [];
public function resetState(): void
{
$this->components = [];
$this->activeComponent = null;
}
public function openModal($component, $arguments = [], $modalAttributes = []): void
{
$requiredInterface = \LivewireUI\Modal\Contracts\ModalComponent::class;
$componentClass = app(ComponentRegistry::class)->getClass($component);
$reflect = new ReflectionClass($componentClass);
if ($reflect->implementsInterface($requiredInterface) === false) {
throw new Exception("[{$componentClass}] does not implement [{$requiredInterface}] interface.");
}
$id = md5($component.serialize($arguments));
$arguments = collect($arguments)
->merge($this->resolveComponentProps($arguments, new $componentClass()))
->all();
$this->components[$id] = [
'name' => $component,
'attributes' => $arguments, // Deprecated
'arguments' => $arguments,
'modalAttributes' => array_merge([
'closeOnClickAway' => $componentClass::closeModalOnClickAway(),
'closeOnEscape' => $componentClass::closeModalOnEscape(),
'closeOnEscapeIsForceful' => $componentClass::closeModalOnEscapeIsForceful(),
'dispatchCloseEvent' => $componentClass::dispatchCloseEvent(),
'destroyOnClose' => $componentClass::destroyOnClose(),
'maxWidth' => $componentClass::modalMaxWidth(),
'maxWidthClass' => $componentClass::modalMaxWidthClass(),
], $modalAttributes),
];
$this->activeComponent = $id;
$this->dispatch('activeModalComponentChanged', id: $id);
}
public function resolveComponentProps(array $attributes, Component $component): Collection
{
return $this->getPublicPropertyTypes($component)
->intersectByKeys($attributes)
->map(function ($className, $propName) use ($attributes) {
$resolved = $this->resolveParameter($attributes, $propName, $className);
return $resolved;
});
}
protected function resolveParameter($attributes, $parameterName, $parameterClassName)
{
$parameterValue = $attributes[$parameterName];
if ($parameterValue instanceof UrlRoutable) {
return $parameterValue;
}
if(enum_exists($parameterClassName)){
$enum = $parameterClassName::tryFrom($parameterValue);
if($enum !== null){
return $enum;
}
}
$instance = app()->make($parameterClassName);
if (! $model = $instance->resolveRouteBinding($parameterValue)) {
throw (new ModelNotFoundException())->setModel(get_class($instance), [$parameterValue]);
}
return $model;
}
public function getPublicPropertyTypes($component): Collection
{
return collect($component->all())
->map(function ($value, $name) use ($component) {
return Reflector::getParameterClassName(new \ReflectionProperty($component, $name));
})
->filter();
}
public function destroyComponent($id): void
{
unset($this->components[$id]);
}
public function getListeners(): array
{
return [
'openModal',
'destroyComponent',
];
}
public function render(): View
{
if (config('wire-elements-modal.include_js', true)) {
$jsPath = __DIR__.'/../public/modal.js';
}
if (config('wire-elements-modal.include_css', false)) {
$cssPath = __DIR__.'/../public/modal.css';
}
return view('wire-elements-modal::modal', [
'jsPath' => $jsPath ?? null,
'cssPath' => $cssPath ?? null,
]);
}
}