From 8339e8b114cd7e646a8ea44ae20fdfaf9b50b42f Mon Sep 17 00:00:00 2001 From: Tomasz Cyrankowski Date: Wed, 29 Apr 2020 13:28:49 +0200 Subject: [PATCH] Allow to filter UUID column with like and support for format UUID column --- Grid/Column/UuidColumn.php | 62 ++++++++++++++++++++++++++++++++++---- Grid/Source/Entity.php | 4 +++ 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/Grid/Column/UuidColumn.php b/Grid/Column/UuidColumn.php index f9defd59..0cedd519 100644 --- a/Grid/Column/UuidColumn.php +++ b/Grid/Column/UuidColumn.php @@ -4,24 +4,74 @@ class UuidColumn extends Column { + protected const FORMAT_SHORT = 'short'; + protected const FORMAT_FULL = 'full'; + + protected static $formats = [ + self::FORMAT_FULL, + self::FORMAT_SHORT, + ]; + + protected static $availableOperators = [ + self::OPERATOR_EQ, + self::OPERATOR_LIKE, + ]; + + protected $format; + public function __initialize(array $params) { parent::__initialize($params); + $this->setFormat($this->getParam('format') ?? self::FORMAT_SHORT); + $this->setDefaultOperator($this->getParam('defaultOperator') ?? self::OPERATOR_LIKE); $this->setOperators($this->getParam('operators', [ self::OPERATOR_EQ, + self::OPERATOR_LIKE, ])); } - public function getType() + public function isQueryValid($query) { - return 'uuid'; + return true; } - public function isQueryValid($query) + public function renderCell($value, $row, $router) + { + $value = $this->getDisplayedValue($value); + + if (is_callable($this->callback)) { + return call_user_func($this->callback, $value, $row, $router); + } + + return $value; + } + + public function getDisplayedValue($value): string { - $isValid = uuid_is_valid($query); + if ($this->format === self::FORMAT_SHORT) { + return (string) substr($value, 0, 8); + } - return $isValid === true ? true : false; + return (string) $value; + } + + public function setFormat($format) + { + if (in_array($format, self::$formats, true)) { + $this->format = $format; + } + + return $this; + } + + public function getFormat() + { + return $this->format; + } + + public function getType() + { + return 'uuid'; } -} \ No newline at end of file +} diff --git a/Grid/Source/Entity.php b/Grid/Source/Entity.php index a6bb4770..59323df5 100644 --- a/Grid/Source/Entity.php +++ b/Grid/Source/Entity.php @@ -15,6 +15,7 @@ use APY\DataGridBundle\Grid\Column\Column; use APY\DataGridBundle\Grid\Column\JoinColumn; +use APY\DataGridBundle\Grid\Column\UuidColumn; use APY\DataGridBundle\Grid\Row; use APY\DataGridBundle\Grid\Rows; use Doctrine\ORM\NoResultException; @@ -438,6 +439,9 @@ public function execute($columns, $page = 0, $limit = 0, $maxResults = null, $gr $columnForFilter = (!$column instanceof JoinColumn) ? $column : $columnsById[$filter->getColumnName()]; $fieldName = $this->getFieldName($columnForFilter, false); + if ($columnForFilter instanceof UuidColumn) { + $fieldName = sprintf('CAST(%s as TEXT)', $fieldName); + } $bindIndexPlaceholder = "?$bindIndex"; if( in_array($filter->getOperator(), array(Column::OPERATOR_LIKE,Column::OPERATOR_RLIKE,Column::OPERATOR_LLIKE,Column::OPERATOR_NLIKE,))){