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