145 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Form\Data;
 | 
						|
 | 
						|
use App\Form\Contracts\Filterable;
 | 
						|
use App\Form\Enums\SpecialType;
 | 
						|
use App\Form\Fields\Field;
 | 
						|
use App\Form\Fields\NamiField;
 | 
						|
use App\Form\Models\Form;
 | 
						|
use Illuminate\Support\Collection;
 | 
						|
use stdClass;
 | 
						|
 | 
						|
/**
 | 
						|
 * @extends Collection<int, Field>
 | 
						|
 */
 | 
						|
class FieldCollection extends Collection
 | 
						|
{
 | 
						|
 | 
						|
    public function forMembers(): self
 | 
						|
    {
 | 
						|
        return $this->filter(fn ($field) => $field->forMembers === true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function withNamiType(): self
 | 
						|
    {
 | 
						|
        return $this->filter(fn ($field) => $field->namiType !== null);
 | 
						|
    }
 | 
						|
 | 
						|
    public function noNamiType(): self
 | 
						|
    {
 | 
						|
        return $this->filter(fn ($field) => $field->namiType === null);
 | 
						|
    }
 | 
						|
 | 
						|
    public function noNamiField(): self
 | 
						|
    {
 | 
						|
        return $this->filter(fn ($field) => !is_a($field, NamiField::class));
 | 
						|
    }
 | 
						|
 | 
						|
    public function hasNamiField(): bool
 | 
						|
    {
 | 
						|
        return $this->first(fn ($field) => is_a($field, NamiField::class)) !== null;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return stdClass
 | 
						|
     */
 | 
						|
    public function getMailRecipient(): ?stdClass
 | 
						|
    {
 | 
						|
        $email = $this->findBySpecialType(SpecialType::EMAIL)?->value;
 | 
						|
 | 
						|
        return $this->getFullname() && $email
 | 
						|
            ? (object) [
 | 
						|
                'name' => $this->getFullname(),
 | 
						|
                "email" => $email,
 | 
						|
            ] : null;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getFullname(): ?string
 | 
						|
    {
 | 
						|
        $firstname = $this->findBySpecialType(SpecialType::FIRSTNAME)?->value;
 | 
						|
        $lastname = $this->findBySpecialType(SpecialType::LASTNAME)?->value;
 | 
						|
 | 
						|
        return $firstname && $lastname ? "$firstname $lastname" : null;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param array<string, mixed> $input
 | 
						|
     */
 | 
						|
    public static function fromRequest(Form $form, array $input): self
 | 
						|
    {
 | 
						|
        return $form->getFields()->map(function ($field) use ($input) {
 | 
						|
            $field->value = array_key_exists($field->key, $input) ? $input[$field->key] : $field->default();
 | 
						|
            return $field;
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public function find(Field $givenField): ?Field
 | 
						|
    {
 | 
						|
        return $this->findByKey($givenField->key);
 | 
						|
    }
 | 
						|
 | 
						|
    public function findByKey(string $key): ?Field
 | 
						|
    {
 | 
						|
        return $this->first(fn ($field) => $field->key === $key);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array<string, mixed>
 | 
						|
     */
 | 
						|
    public function present(): array
 | 
						|
    {
 | 
						|
        $attributes = collect([]);
 | 
						|
 | 
						|
        foreach ($this as $field) {
 | 
						|
            $attributes = $attributes->merge($field->present());
 | 
						|
        }
 | 
						|
 | 
						|
        return $attributes->toArray();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array<int, string>
 | 
						|
     */
 | 
						|
    public function names(): array
 | 
						|
    {
 | 
						|
        return $this->map(fn ($field) => $field->name)->toArray();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array<int, string>
 | 
						|
     */
 | 
						|
    public function presentValues(): array
 | 
						|
    {
 | 
						|
        return $this->map(fn ($field) => $field->presentRaw())->toArray();
 | 
						|
    }
 | 
						|
 | 
						|
    private function findBySpecialType(SpecialType $specialType): ?Field
 | 
						|
    {
 | 
						|
        return $this->first(fn ($field) => $field->specialType === $specialType);
 | 
						|
    }
 | 
						|
 | 
						|
    public function searchables(): self
 | 
						|
    {
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    public function sortables(): self
 | 
						|
    {
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    public function filterables(): self
 | 
						|
    {
 | 
						|
        return $this->filter(fn ($field) => $field instanceof Filterable);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array<int, string>
 | 
						|
     */
 | 
						|
    public function getKeys(): array
 | 
						|
    {
 | 
						|
        return $this->map(fn ($field) => $field->key)->toArray();
 | 
						|
    }
 | 
						|
}
 |