diff --git a/config/widgets-themes.php b/config/widgets-themes.php index 00d3e2b4b..2240b67e1 100644 --- a/config/widgets-themes.php +++ b/config/widgets-themes.php @@ -20,6 +20,8 @@ 'sortableHeaderAscPrepend()' => ['
'], 'sortableHeaderDescPrepend()' => ['
'], 'filterCellAttributes()' => [['class' => 'align-top']], + 'filterCellInvalidClass()' => ['bg-danger bg-opacity-10'], + 'filterErrorsContainerAttributes()' => [['class' => 'text-danger mt-1']], 'addColumnRendererConfigs()' => [ [ ActionColumnRenderer::class => [ diff --git a/src/Column/Base/FilterContext.php b/src/Column/Base/FilterContext.php index 4ff8a4b68..e805632ae 100644 --- a/src/Column/Base/FilterContext.php +++ b/src/Column/Base/FilterContext.php @@ -11,12 +11,11 @@ final class FilterContext { private readonly UrlQueryReader $urlQueryReader; - /** - * @param string[] $errors - */ public function __construct( public readonly string $formId, public readonly Result $validationResult, + public readonly ?string $cellInvalidClass, + public readonly array $errorsContainerAttributes, ) { $this->urlQueryReader = new UrlQueryReader(); } diff --git a/src/Column/DataColumnRenderer.php b/src/Column/DataColumnRenderer.php index 7e13614cf..38c254c04 100644 --- a/src/Column/DataColumnRenderer.php +++ b/src/Column/DataColumnRenderer.php @@ -97,7 +97,9 @@ public function renderFilter(ColumnInterface $column, Cell $cell, FilterContext $errors = $context->validationResult->getAttributeErrorMessages($column->queryProperty); if (!empty($errors)) { - $content[] = Html::div()->content(...array_map(static fn(string $error) => Html::div($error), $errors)); + $cell = $cell->addClass($context->cellInvalidClass); + $content[] = Html::div(attributes: $context->errorsContainerAttributes) + ->content(...array_map(static fn(string $error) => Html::div($error), $errors)); } return $cell->content(...$content)->encode(false); diff --git a/src/GridView.php b/src/GridView.php index 9cac3ac11..982c8b421 100644 --- a/src/GridView.php +++ b/src/GridView.php @@ -78,6 +78,8 @@ final class GridView extends BaseListView private ?string $sortableLinkDescClass = null; private array $filterCellAttributes = []; + private ?string $filterCellInvalidClass = null; + private array $filterErrorsContainerAttributes = []; private RendererContainer $columnRendererContainer; @@ -116,6 +118,20 @@ public function filterCellAttributes(array $attributes): self return $new; } + public function filterCellInvalidClass(?string $class): self + { + $new = clone $this; + $new->filterCellInvalidClass = $class; + return $new; + } + + public function filterErrorsContainerAttributes(array $attributes): self + { + $new = clone $this; + $new->filterErrorsContainerAttributes = $attributes; + return $new; + } + public function enableMultiSort(bool $value = true): self { $new = clone $this; @@ -457,6 +473,8 @@ protected function renderItems(array $items, ValidationResult $filterValidationR $filterContext = new FilterContext( formId: Html::generateId(), validationResult: $filterValidationResult, + cellInvalidClass: $this->filterCellInvalidClass, + errorsContainerAttributes: $this->filterErrorsContainerAttributes, ); foreach ($columns as $i => $column) { $cell = $renderers[$i] instanceof FilterableColumnRendererInterface