adrema/app/Form/Data/FieldCollection.php

140 lines
3.3 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 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();
}
}