<?php
namespace EasyCorp\Bundle\EasyAdminBundle\Dto;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore;
use EasyCorp\Bundle\EasyAdminBundle\Config\Option\TextAlign;
use function Symfony\Component\String\u;
use Symfony\Component\Uid\Ulid;
/**
* @author Javier Eguiluz <[email protected]>
*/
final class FieldDto
{
private $fieldFqcn;
private $propertyName;
private $value;
private $formattedValue;
private $formatValueCallable;
private $label;
private $formType;
private $formTypeOptions;
private $sortable;
private $virtual;
private $permission;
private $textAlign;
private $help;
private $cssClass;
// how many columns the field takes when rendering
// (defined as Bootstrap 5 grid classes; e.g. 'col-md-6 col-xxl-3')
private $columns;
// same as $columns but used when the user doesn't define columns explicitly
private $defaultColumns;
private $translationParameters;
private $templateName;
private $templatePath;
/** @var AssetsDto */
private $assets;
private $customOptions;
private $doctrineMetadata;
/** @internal */
private $uniqueId;
private $displayedOn;
public function __construct()
{
$this->uniqueId = new Ulid();
$this->textAlign = TextAlign::LEFT;
$this->cssClass = '';
$this->columns = null;
$this->defaultColumns = '';
$this->templateName = 'crud/field/text';
$this->assets = new AssetsDto();
$this->translationParameters = [];
$this->formTypeOptions = KeyValueStore::new();
$this->customOptions = KeyValueStore::new();
$this->doctrineMetadata = KeyValueStore::new();
$this->displayedOn = KeyValueStore::new([
Crud::PAGE_INDEX => Crud::PAGE_INDEX,
Crud::PAGE_DETAIL => Crud::PAGE_DETAIL,
Crud::PAGE_EDIT => Crud::PAGE_EDIT,
Crud::PAGE_NEW => Crud::PAGE_NEW,
]);
}
public function __clone()
{
$this->uniqueId = new Ulid();
$this->assets = clone $this->assets;
$this->formTypeOptions = clone $this->formTypeOptions;
$this->customOptions = clone $this->customOptions;
$this->doctrineMetadata = clone $this->doctrineMetadata;
$this->displayedOn = clone $this->displayedOn;
}
public function getUniqueId(): string
{
return $this->uniqueId;
}
public function setUniqueId(string $uniqueId): void
{
$this->uniqueId = $uniqueId;
}
public function isFormDecorationField(): bool
{
return null !== u($this->getCssClass())->containsAny(['field-form_panel', 'field-form_tab']);
}
public function getFieldFqcn(): ?string
{
return $this->fieldFqcn;
}
/**
* @internal Don't use this method yourself. EasyAdmin uses it internally
* to set the field FQCN. It's OK to use getFieldFqcn() to get this value.
*/
public function setFieldFqcn(string $fieldFqcn): void
{
$this->fieldFqcn = $fieldFqcn;
}
public function getProperty(): string
{
return $this->propertyName;
}
public function setProperty(string $propertyName): void
{
$this->propertyName = $propertyName;
}
/**
* Returns the original unmodified value stored in the entity field.
*/
public function getValue()
{
return $this->value;
}
public function setValue($value): void
{
$this->value = $value;
}
/**
* Returns the value to be displayed for the field (it could be the
* same as the value stored in the field or not).
*/
public function getFormattedValue()
{
return $this->formattedValue;
}
public function setFormattedValue($formattedValue): void
{
$this->formattedValue = $formattedValue;
}
public function getFormatValueCallable(): ?callable
{
return $this->formatValueCallable;
}
public function setFormatValueCallable(?callable $callable): void
{
$this->formatValueCallable = $callable;
}
/**
* @return string|false|null
*/
public function getLabel()
{
return $this->label;
}
/**
* @param string|false|null $label
*/
public function setLabel($label): void
{
$this->label = $label;
}
public function getFormType(): ?string
{
return $this->formType;
}
public function setFormType(string $formTypeFqcn): void
{
$this->formType = $formTypeFqcn;
}
public function getFormTypeOptions(): array
{
return $this->formTypeOptions->all();
}
public function getFormTypeOption(string $optionName)
{
return $this->formTypeOptions->get($optionName);
}
public function setFormTypeOptions(array $formTypeOptions): void
{
foreach ($formTypeOptions as $optionName => $optionValue) {
$this->setFormTypeOption($optionName, $optionValue);
}
}
/**
* @param string $optionName You can use "dot" notation to set nested options (e.g. 'attr.class')
*/
public function setFormTypeOption(string $optionName, $optionValue): void
{
$this->formTypeOptions->set($optionName, $optionValue);
}
/**
* @param string $optionName You can use "dot" notation to set nested options (e.g. 'attr.class')
*/
public function setFormTypeOptionIfNotSet(string $optionName, $optionValue): void
{
$this->formTypeOptions->setIfNotSet($optionName, $optionValue);
}
public function isSortable(): ?bool
{
return $this->sortable;
}
public function setSortable(bool $isSortable): void
{
$this->sortable = $isSortable;
}
public function isVirtual(): ?bool
{
return $this->virtual;
}
public function setVirtual(bool $isVirtual): void
{
$this->virtual = $isVirtual;
}
public function getTextAlign(): string
{
return $this->textAlign;
}
public function setTextAlign(string $textAlign): void
{
$this->textAlign = $textAlign;
}
public function getPermission(): ?string
{
return $this->permission;
}
public function setPermission(string $permission): void
{
$this->permission = $permission;
}
public function getHelp(): ?string
{
return $this->help;
}
public function setHelp(string $help): void
{
$this->help = $help;
}
public function getCssClass(): string
{
return $this->cssClass;
}
public function setCssClass(string $cssClass): void
{
$this->cssClass = trim($cssClass);
}
public function getColumns(): ?string
{
return $this->columns;
}
public function setColumns(?string $columnCssClasses): void
{
$this->columns = $columnCssClasses;
}
public function getDefaultColumns(): string
{
return $this->defaultColumns;
}
public function setDefaultColumns(string $columnCssClasses): void
{
$this->defaultColumns = $columnCssClasses;
}
public function getTranslationParameters(): array
{
return $this->translationParameters;
}
public function setTranslationParameters(array $translationParameters): void
{
$this->translationParameters = $translationParameters;
}
public function getTemplateName(): ?string
{
return $this->templateName;
}
public function setTemplateName(?string $templateName): void
{
$this->templateName = $templateName;
}
public function getTemplatePath(): ?string
{
return $this->templatePath;
}
public function setTemplatePath(?string $templatePath): void
{
$this->templatePath = $templatePath;
}
public function getAssets(): AssetsDto
{
return $this->assets;
}
public function setAssets(AssetsDto $assets): void
{
$this->assets = $assets;
}
public function addWebpackEncoreAsset(AssetDto $assetDto): void
{
$this->assets->addWebpackEncoreAsset($assetDto);
}
public function addCssAsset(AssetDto $assetDto): void
{
$this->assets->addCssAsset($assetDto);
}
public function addJsAsset(AssetDto $assetDto): void
{
$this->assets->addJsAsset($assetDto);
}
public function addHtmlContentToHead(string $htmlContent): void
{
$this->assets->addHtmlContentToHead($htmlContent);
}
public function addHtmlContentToBody(string $htmlContent): void
{
$this->assets->addHtmlContentToBody($htmlContent);
}
public function getCustomOptions(): KeyValueStore
{
return $this->customOptions;
}
public function getCustomOption(string $optionName)
{
return $this->customOptions->get($optionName);
}
public function setCustomOptions(array $customOptions): void
{
$this->customOptions = KeyValueStore::new($customOptions);
}
public function setCustomOption(string $optionName, $optionValue): void
{
$this->customOptions->set($optionName, $optionValue);
}
public function getDoctrineMetadata(): KeyValueStore
{
return $this->doctrineMetadata;
}
public function setDoctrineMetadata(array $metadata): void
{
$this->doctrineMetadata = KeyValueStore::new($metadata);
}
public function getDisplayedOn(): KeyValueStore
{
return $this->displayedOn;
}
public function setDisplayedOn(KeyValueStore $displayedOn): void
{
$this->displayedOn = $displayedOn;
}
public function isDisplayedOn(string $pageName): bool
{
return $this->displayedOn->has($pageName);
}
}