<?php
namespace Nellapp\Bundle\SDKBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\MappedSuperclass;
use Nellapp\Bundle\SDKBundle\CustomizableView\AbstractCustomizableViewManager;
use Nellapp\Bundle\SDKBundle\CustomizableView\Model\AbstractColumnDefinition;
use Nellapp\Bundle\SDKBundle\CustomizableView\Model\Column;
use Symfony\Component\Validator\Constraints as Assert;
#[MappedSuperclass]
abstract class AbstractCustomView
{
const DEFAULT_VIEW_NAME = '__DEFAULT__';
#[ORM\Column(type: 'string', nullable: false)]
#[Assert\NotBlank()]
private ?string $name = null;
/** @var Column[] $columns */
#[ORM\Column(type: "json", nullable: true)]
private array $columns = [];
/** @var ?array $filters */
#[ORM\Column(type: 'json', nullable: true)]
private ?array $filters = null;
#[ORM\Column(type: 'boolean', nullable: false)]
private ?bool $active = false;
#[ORM\Column(type: 'string', nullable: true)]
private ?string $sortKey = null;
#[ORM\Column(type: 'string', nullable: true)]
#[Assert\Choice(choices: ['asc', 'desc'])]
private ?string $sortDirection = null;
/**
* @param bool $active
* @param AbstractColumnDefinition[] $columnsDef
*/
public function __construct(
array $columnsDef,
bool $active = true,
)
{
$count = 0;
foreach ($columnsDef as $def) {
$this->columns[$def->getKey()] = new Column($def, $count, $active);
$count++;
}
$this->orderColumns();
}
abstract function getId();
/**
* @return Column[]
*/
public function getActiveColumns(): array
{
if ($this->hasColumnDeserialized()) {
$activeColumns = [];
foreach ($this->getColumns() as $column) {
if ($column->isActive()) {
$activeColumns[$column->getColumnDefinition()->getKey()] = $column;
}
}
return $activeColumns;
}
throw new \LogicException(
'You must deserialize Columns before accessing it. Use ' .
AbstractCustomizableViewManager::class .
' for deserialization.'
);
}
/**
* @return AbstractColumnDefinition[]
*/
public function getActiveColumnsDefs(): array
{
if ($this->hasColumnDeserialized()) {
$activeColumnsDefs = [];
foreach ($this->getColumns() as $column) {
if ($column->isActive()) {
$activeColumnsDefs[] = $column->getColumnDefinition();
}
}
return $activeColumnsDefs;
}
throw new \LogicException(
'You must deserialize Columns before accessing it. Use ' .
AbstractCustomizableViewManager::class .
' for deserialization.'
);
}
public function getColumnDefByKey(string $key): ?AbstractColumnDefinition
{
if ($this->hasColumnDeserialized()) {
foreach ($this->columns as $column) {
if ($column->getColumnDefinition()->getKey() === $key) {
return $column->getColumnDefinition();
}
}
return null;
}
throw new \LogicException(
'You must deserialize Columns before accessing it. Use ' .
AbstractCustomizableViewManager::class .
' for deserialization.'
);
}
private function orderColumns(): void
{
if ($this->hasColumnDeserialized()) {
uasort($this->columns, function (Column $columnA, Column $columnB): int {
if ($columnA->getOrder() > $columnB->getOrder()) {
return 1;
} else if ($columnA->getOrder() < $columnB->getOrder()) {
return -1;
}
return 0;
});
return;
}
throw new \LogicException(
'You must deserialize Columns before accessing it. Use ' .
AbstractCustomizableViewManager::class .
' for deserialization.'
);
}
public function isNewView(): bool
{
if ($this->name === self::DEFAULT_VIEW_NAME) {
return true;
}
return false;
}
public function setNewView(): self
{
$this->name = self::DEFAULT_VIEW_NAME;
return $this;
}
/**
* @return array
*/
public function getColumns(): array
{
return $this->columns;
}
public function hasColumnDeserialized(): bool
{
if (!empty($this->columns) && !$this->columns[array_key_first($this->columns)] instanceof Column) {
return false;
}
return true;
}
/**
* @param Column[] $columns
* @return $this
*/
public function setColumns(array $columns): self
{
$this->columns = $columns;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(?string $name): AbstractCustomView
{
$this->name = $name;
return $this;
}
public function getActive(): ?bool
{
return $this->active;
}
public function setActive(?bool $active): AbstractCustomView
{
$this->active = $active;
return $this;
}
public function getFilters(): ?array
{
return $this->filters;
}
public function setFilters(?array $filters): AbstractCustomView
{
$this->filters = $filters;
return $this;
}
public function getSortKey(): ?string
{
return $this->sortKey;
}
public function setSortKey(?string $sortKey): AbstractCustomView
{
$this->sortKey = $sortKey;
return $this;
}
public function getSortDirection(): ?string
{
return $this->sortDirection;
}
public function setSortDirection(?string $sortDirection): AbstractCustomView
{
$this->sortDirection = $sortDirection;
return $this;
}
}