Files
lucent-laravel/src/Schema/Ui/Datetime.php
T
2023-10-02 23:10:49 +03:00

74 lines
1.9 KiB
PHP

<?php
namespace Lucent\Schema\Ui;
use Carbon\Carbon;
use Lucent\Schema\FieldInfo;
use Lucent\Schema\FieldInterface;
use Lucent\Schema\FieldType;
use Lucent\Schema\Nullable;
use Lucent\Schema\Validator\MinMaxInterface;
use Lucent\Schema\Validator\RequiredInterface;
class Datetime implements FieldInterface, RequiredInterface, MinMaxInterface
{
public FieldInfo $info;
public function __construct(
public string $name,
public string $label,
public bool $required = false,
public bool $nullable = false,
public ?Carbon $min = null,
public ?Carbon $max = null,
public string $default = "",
public bool $readonly = false,
public string $optionsFrom = "",
public string $optionsField = "",
public bool $optionsSuggest = false,
public string $group = "",
)
{
$this->info = new FieldInfo("datetime", "Datetime", FieldType::STRING);
}
public function format(array $input, array $output): array
{
$value = $input[$this->name] ?? null;
if (empty($value)) {
$newValue = (new Nullable($this->nullable, null, ""))->value();
} else {
$date = Carbon::parse($value);
$dateFormatted = $date->toJSON();
$newValue = (new Nullable($this->nullable, $dateFormatted, ""))->value();
}
$output[$this->name] = $newValue;
return $output;
}
public function failRequired(mixed $value): bool
{
return empty(trim($value));
}
public function failMin(mixed $value): bool
{
if (empty($this->value)) {
return false;
}
return $value->lessThanOrEqualTo($this->min);
}
public function failMax(mixed $value): bool
{
if (empty($this->value)) {
return false;
}
return $value->greaterThan($this->max);
}
}