Skip to content

Commit

Permalink
Fix #179: Add callable support to $bodyAttributes in DataColumn (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
vjik authored Aug 9, 2024
1 parent 645240c commit d13ddff
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
7 changes: 6 additions & 1 deletion src/Column/DataColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Yiisoft\Yii\DataView\Column;

use Yiisoft\Validator\RuleInterface;
use Yiisoft\Yii\DataView\Column\Base\DataContext;
use Yiisoft\Yii\DataView\Filter\Factory\FilterFactoryInterface;
use Yiisoft\Yii\DataView\Filter\Widget\FilterWidget;

Expand All @@ -21,6 +22,7 @@
* markup.
*
* @psalm-type FilterEmptyCallable = callable(mixed $value): bool
* @psalm-type BodyAttributesCallable = callable(array|object,DataContext): array
*/
final class DataColumn implements ColumnInterface
{
Expand All @@ -31,6 +33,9 @@ final class DataColumn implements ColumnInterface
public readonly mixed $filterEmpty;

/**
* @param array|callable $bodyAttributes
*
* @psalm-param array|BodyAttributesCallable $bodyAttributes
* @psalm-param bool|array<array-key,string|array<array-key,string>>|FilterWidget $filter
* @psalm-param RuleInterface[]|RuleInterface|null $filterValidation
* @psalm-param bool|FilterEmptyCallable|null $filterEmpty
Expand All @@ -43,7 +48,7 @@ public function __construct(
public readonly ?string $footer = null,
public readonly array $columnAttributes = [],
public readonly array $headerAttributes = [],
public readonly array $bodyAttributes = [],
public readonly mixed $bodyAttributes = [],
public readonly bool $withSorting = true,
public readonly mixed $content = null,
public readonly ?string $dateTimeFormat = null,
Expand Down
16 changes: 15 additions & 1 deletion src/Column/DataColumnRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
use Yiisoft\Yii\DataView\Filter\Widget\DropdownFilter;
use Yiisoft\Yii\DataView\Filter\Widget\TextInputFilter;

use function is_array;
use function is_callable;

/**
* @psalm-import-type FilterEmptyCallable from DataColumn
*/
Expand Down Expand Up @@ -169,6 +172,7 @@ public function makeFilter(ColumnInterface $column, MakeFilterContext $context):
public function renderBody(ColumnInterface $column, Cell $cell, DataContext $context): Cell
{
$this->checkColumn($column);
/** @var DataColumn $column This annotation need for IDE only */

$contentSource = $column->content;

Expand All @@ -182,8 +186,18 @@ public function renderBody(ColumnInterface $column, Cell $cell, DataContext $con
$content = '';
}

if (is_callable($column->bodyAttributes)) {
/** @var array $attributes Remove annotation after fix https://github.com/vimeo/psalm/issues/11062 */
$attributes = ($column->bodyAttributes)(
$context->data,
$context,
);
} else {
$attributes = $column->bodyAttributes;
}

return $cell
->addAttributes($column->bodyAttributes)
->addAttributes($attributes)
->content($content)
->encode(false);
}
Expand Down

0 comments on commit d13ddff

Please sign in to comment.