diff --git a/src/Column/ActionColumnRenderer.php b/src/Column/ActionColumnRenderer.php index 27fc8662c..2daeaae3c 100644 --- a/src/Column/ActionColumnRenderer.php +++ b/src/Column/ActionColumnRenderer.php @@ -10,7 +10,6 @@ use Yiisoft\Yii\DataView\Column\Base\Cell; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; use Yiisoft\Yii\DataView\Column\Base\DataContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; use function is_bool; use function is_callable; @@ -73,7 +72,7 @@ public function renderColumn(ColumnInterface $column, Cell $cell, GlobalContext return $cell->addAttributes($column->columnAttributes); } - public function renderHeader(ColumnInterface $column, Cell $cell, HeaderContext $context): Cell + public function renderHeader(ColumnInterface $column, Cell $cell, GlobalContext $context): Cell { return $cell ->content($column->header ?? $context->translate('Actions')) diff --git a/src/Column/Base/GlobalContext.php b/src/Column/Base/GlobalContext.php index 4690bfef1..d599d0009 100644 --- a/src/Column/Base/GlobalContext.php +++ b/src/Column/Base/GlobalContext.php @@ -5,28 +5,79 @@ namespace Yiisoft\Yii\DataView\Column\Base; use Stringable; -use Yiisoft\Data\Reader\ReadableDataInterface; +use Yiisoft\Arrays\ArrayHelper; +use Yiisoft\Data\Paginator\PageToken; +use Yiisoft\Data\Reader\Sort; +use Yiisoft\Html\Html; +use Yiisoft\Html\Tag\A; use Yiisoft\Translator\TranslatorInterface; +use Yiisoft\Yii\DataView\BaseListView; +use Yiisoft\Data\Reader\OrderHelper; +use Yiisoft\Yii\DataView\UrlConfig; +use Yiisoft\Yii\DataView\UrlParametersFactory; + +use function call_user_func_array; +use function count; /** - * `GlobalContext` provides shared context for all columns in a grid. + * `GlobalContext` provides context for rendering and handling grid column headers, footers and container cells. + * + * @psalm-import-type UrlCreator from BaseListView */ final class GlobalContext { /** - * Creates a new global context instance. - * - * @param ReadableDataInterface $dataReader Data reader for accessing grid data. - * @param array $pathArguments URL path arguments for link generation. - * @psalm-param array $pathArguments - * @param array $queryParameters URL query parameters for link generation. - * @param TranslatorInterface $translator Translator service for internationalizing grid content. - * @param string $translationCategory Category used for translations within the grid. + * Creates a new context instance. + * + * @param Sort|null $originalSort Original sort configuration before any modifications. + * @param Sort|null $sort Current sort configuration that reflects the active sort state. + * @param array $orderProperties Map of field names to their sort properties. + * @param string|null $sortableHeaderClass CSS class for sortable headers. + * @param string|Stringable $sortableHeaderPrepend Content to prepend to sortable headers. + * @param string|Stringable $sortableHeaderAppend Content to append to sortable headers. + * @param string|null $sortableHeaderAscClass CSS class for ascending sort headers. + * @param string|Stringable $sortableHeaderAscPrepend Content to prepend to ascending sort headers. + * @param string|Stringable $sortableHeaderAscAppend Content to append to ascending sort headers. + * @param string|null $sortableHeaderDescClass CSS class for descending sort headers. + * @param string|Stringable $sortableHeaderDescPrepend Content to prepend to descending sort headers. + * @param string|Stringable $sortableHeaderDescAppend Content to append to descending sort headers. + * @param array $sortableLinkAttributes HTML attributes for sort links. + * @param string|null $sortableLinkAscClass CSS class for ascending sort links. + * @param string|null $sortableLinkDescClass CSS class for descending sort links. + * @param PageToken|null $pageToken Current page token for pagination. + * @param int|null $pageSize Number of items per page. + * @param bool $multiSort Whether multiple column sorting is enabled. + * @param UrlConfig $urlConfig URL configuration settings. + * @param UrlCreator|null $urlCreator Callback for creating sort URLs. + * @param TranslatorInterface $translator Translator service for header content. + * @param string $translationCategory Category for header translations. + * + * @internal + * + * @psalm-param array $orderProperties + * @psalm-param UrlCreator|null $urlCreator */ public function __construct( - public readonly ReadableDataInterface $dataReader, - public readonly array $pathArguments, - public readonly array $queryParameters, + private readonly ?Sort $originalSort, + private readonly ?Sort $sort, + private readonly array $orderProperties, + private readonly ?string $sortableHeaderClass, + private readonly string|Stringable $sortableHeaderPrepend, + private readonly string|Stringable $sortableHeaderAppend, + private readonly ?string $sortableHeaderAscClass, + private readonly string|Stringable $sortableHeaderAscPrepend, + private readonly string|Stringable $sortableHeaderAscAppend, + private readonly ?string $sortableHeaderDescClass, + private readonly string|Stringable $sortableHeaderDescPrepend, + private readonly string|Stringable $sortableHeaderDescAppend, + public readonly array $sortableLinkAttributes, + public readonly ?string $sortableLinkAscClass, + public readonly ?string $sortableLinkDescClass, + private readonly ?PageToken $pageToken, + private readonly int|null $pageSize, + private readonly bool $multiSort, + private readonly UrlConfig $urlConfig, + private $urlCreator, private readonly TranslatorInterface $translator, private readonly string $translationCategory, ) { @@ -37,10 +88,146 @@ public function __construct( * * @param string|Stringable $id Message ID to translate. * - * @return string Translated message in the current language. + * @return string Translated message. */ public function translate(string|Stringable $id): string { return $this->translator->translate($id, category: $this->translationCategory); } + + /** + * Prepare a sortable header cell with appropriate styling and links. + * + * @param Cell $cell The header cell to prepare. + * @param string $property The property name for sorting. + * + * @psalm-return list{Cell,?A,string,string} + * + * @return array Array containing: + * - Modified cell + * - Sort link (or null) + * - Content to prepend + * - Content to append + */ + public function prepareSortable(Cell $cell, string $property): array + { + $originalProperty = $property; + $property = $this->orderProperties[$property] ?? ''; + if ( + $property === '' + || $this->sort === null + || $this->originalSort === null + || !$this->sort->hasFieldInConfig($property) + ) { + return [$cell, null, '', '']; + } + + $linkAttributes = []; + $propertyOrder = $this->sort->getOrder()[$property] ?? null; + if ($propertyOrder === null) { + $cell = $cell->addClass($this->sortableHeaderClass); + $prepend = $this->sortableHeaderPrepend; + $append = $this->sortableHeaderAppend; + } else { + $cell = $cell->addClass( + $propertyOrder === 'asc' ? $this->sortableHeaderAscClass : $this->sortableHeaderDescClass + ); + $prepend = $propertyOrder === 'asc' ? $this->sortableHeaderAscPrepend : $this->sortableHeaderDescPrepend; + $append = $propertyOrder === 'asc' ? $this->sortableHeaderAscAppend : $this->sortableHeaderDescAppend; + Html::addCssClass( + $linkAttributes, + $propertyOrder === 'asc' ? $this->sortableLinkAscClass : $this->sortableLinkDescClass, + ); + } + $url = $this->urlCreator === null ? '#' : call_user_func_array( + $this->urlCreator, + UrlParametersFactory::create( + $this->pageToken, + $this->pageSize, + $this->getLinkSortValue($this->originalSort, $this->sort, $property, $originalProperty), + $this->urlConfig, + ) + ); + + return [ + $cell, + A::tag()->attributes($linkAttributes)->url($url), + (string) $prepend, + (string) $append, + ]; + } + + /** + * Get the sort value for a link based on the current sort state. + * + * @param Sort $originalSort Original sort configuration. + * @param Sort $sort Current sort configuration. + * @param string $property Property name for sorting. + * @param string $originalProperty Original property name before an override. + * + * @return string|null Sort value for the link or `null` if unchanged. + */ + private function getLinkSortValue( + Sort $originalSort, + Sort $sort, + string $property, + string $originalProperty + ): ?string { + $originalOrder = $originalSort->getOrder(); + $order = $sort->getOrder(); + + if (isset($order[$property])) { + if ($this->multiSort) { + if ($order[$property] === 'asc') { + $order[$property] = 'desc'; + } elseif (!empty($originalOrder) && count($order) === 1) { + $order[$property] = 'asc'; + } else { + unset($order[$property]); + } + } elseif (isset($originalOrder[$property])) { + if ($order[$property] === $originalOrder[$property]) { + $order = [$property => $originalOrder[$property] === 'asc' ? 'desc' : 'asc']; + } else { + unset($order[$property]); + } + } elseif ($order[$property] === 'asc') { + $order = [$property => 'desc']; + } else { + unset($order[$property]); + } + } elseif ($this->multiSort) { + $order[$property] = 'asc'; + } else { + $order = [$property => 'asc']; + } + + if ($this->isEqualOrders($order, $originalOrder)) { + return null; + } + + $resultOrder = $sort->withOrder($order)->getOrder(); + if (empty($resultOrder)) { + return null; + } + + return OrderHelper::arrayToString( + ArrayHelper::renameKey($resultOrder, $property, $originalProperty) + ); + } + + /** + * Compare two sort orders for equality. + * + * @param array $a First sort order. + * @param array $b Second sort order. + * + * @return bool Whether the sort orders are equal. + */ + private function isEqualOrders(array $a, array $b): bool + { + ksort($a); + ksort($b); + return $a === $b; + } } diff --git a/src/Column/Base/HeaderContext.php b/src/Column/Base/HeaderContext.php deleted file mode 100644 index 9e3b66a67..000000000 --- a/src/Column/Base/HeaderContext.php +++ /dev/null @@ -1,233 +0,0 @@ - $orderProperties - * @psalm-param UrlCreator|null $urlCreator - */ - public function __construct( - private readonly ?Sort $originalSort, - private readonly ?Sort $sort, - private readonly array $orderProperties, - private readonly ?string $sortableHeaderClass, - private readonly string|Stringable $sortableHeaderPrepend, - private readonly string|Stringable $sortableHeaderAppend, - private readonly ?string $sortableHeaderAscClass, - private readonly string|Stringable $sortableHeaderAscPrepend, - private readonly string|Stringable $sortableHeaderAscAppend, - private readonly ?string $sortableHeaderDescClass, - private readonly string|Stringable $sortableHeaderDescPrepend, - private readonly string|Stringable $sortableHeaderDescAppend, - public readonly array $sortableLinkAttributes, - public readonly ?string $sortableLinkAscClass, - public readonly ?string $sortableLinkDescClass, - private readonly ?PageToken $pageToken, - private readonly int|null $pageSize, - private readonly bool $multiSort, - private readonly UrlConfig $urlConfig, - private $urlCreator, - private readonly TranslatorInterface $translator, - private readonly string $translationCategory, - ) { - } - - /** - * Translate a message using the header's translation category. - * - * @param string|Stringable $id Message ID to translate. - * - * @return string Translated message. - */ - public function translate(string|Stringable $id): string - { - return $this->translator->translate($id, category: $this->translationCategory); - } - - /** - * Prepare a sortable header cell with appropriate styling and links. - * - * @param Cell $cell The header cell to prepare. - * @param string $property The property name for sorting. - * - * @psalm-return list{Cell,?A,string,string} - * - * @return array Array containing: - * - Modified cell - * - Sort link (or null) - * - Content to prepend - * - Content to append - */ - public function prepareSortable(Cell $cell, string $property): array - { - $originalProperty = $property; - $property = $this->orderProperties[$property] ?? ''; - if ( - $property === '' - || $this->sort === null - || $this->originalSort === null - || !$this->sort->hasFieldInConfig($property) - ) { - return [$cell, null, '', '']; - } - - $linkAttributes = []; - $propertyOrder = $this->sort->getOrder()[$property] ?? null; - if ($propertyOrder === null) { - $cell = $cell->addClass($this->sortableHeaderClass); - $prepend = $this->sortableHeaderPrepend; - $append = $this->sortableHeaderAppend; - } else { - $cell = $cell->addClass( - $propertyOrder === 'asc' ? $this->sortableHeaderAscClass : $this->sortableHeaderDescClass - ); - $prepend = $propertyOrder === 'asc' ? $this->sortableHeaderAscPrepend : $this->sortableHeaderDescPrepend; - $append = $propertyOrder === 'asc' ? $this->sortableHeaderAscAppend : $this->sortableHeaderDescAppend; - Html::addCssClass( - $linkAttributes, - $propertyOrder === 'asc' ? $this->sortableLinkAscClass : $this->sortableLinkDescClass, - ); - } - $url = $this->urlCreator === null ? '#' : call_user_func_array( - $this->urlCreator, - UrlParametersFactory::create( - $this->pageToken, - $this->pageSize, - $this->getLinkSortValue($this->originalSort, $this->sort, $property, $originalProperty), - $this->urlConfig, - ) - ); - - return [ - $cell, - A::tag()->attributes($linkAttributes)->url($url), - (string) $prepend, - (string) $append, - ]; - } - - /** - * Get the sort value for a link based on the current sort state. - * - * @param Sort $originalSort Original sort configuration. - * @param Sort $sort Current sort configuration. - * @param string $property Property name for sorting. - * @param string $originalProperty Original property name before an override. - * - * @return string|null Sort value for the link or `null` if unchanged. - */ - private function getLinkSortValue( - Sort $originalSort, - Sort $sort, - string $property, - string $originalProperty - ): ?string { - $originalOrder = $originalSort->getOrder(); - $order = $sort->getOrder(); - - if (isset($order[$property])) { - if ($this->multiSort) { - if ($order[$property] === 'asc') { - $order[$property] = 'desc'; - } elseif (!empty($originalOrder) && count($order) === 1) { - $order[$property] = 'asc'; - } else { - unset($order[$property]); - } - } elseif (isset($originalOrder[$property])) { - if ($order[$property] === $originalOrder[$property]) { - $order = [$property => $originalOrder[$property] === 'asc' ? 'desc' : 'asc']; - } else { - unset($order[$property]); - } - } elseif ($order[$property] === 'asc') { - $order = [$property => 'desc']; - } else { - unset($order[$property]); - } - } elseif ($this->multiSort) { - $order[$property] = 'asc'; - } else { - $order = [$property => 'asc']; - } - - if ($this->isEqualOrders($order, $originalOrder)) { - return null; - } - - $resultOrder = $sort->withOrder($order)->getOrder(); - if (empty($resultOrder)) { - return null; - } - - return OrderHelper::arrayToString( - ArrayHelper::renameKey($resultOrder, $property, $originalProperty) - ); - } - - /** - * Compare two sort orders for equality. - * - * @param array $a First sort order. - * @param array $b Second sort order. - * - * @return bool Whether the sort orders are equal. - */ - private function isEqualOrders(array $a, array $b): bool - { - ksort($a); - ksort($b); - return $a === $b; - } -} diff --git a/src/Column/CheckboxColumnRenderer.php b/src/Column/CheckboxColumnRenderer.php index b1f5e8f63..8f60951fd 100644 --- a/src/Column/CheckboxColumnRenderer.php +++ b/src/Column/CheckboxColumnRenderer.php @@ -8,7 +8,6 @@ use Yiisoft\Yii\DataView\Column\Base\Cell; use Yiisoft\Yii\DataView\Column\Base\DataContext; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; use function array_key_exists; @@ -24,7 +23,7 @@ public function renderColumn(ColumnInterface $column, Cell $cell, GlobalContext return $cell->addAttributes($column->columnAttributes); } - public function renderHeader(ColumnInterface $column, Cell $cell, HeaderContext $context): ?Cell + public function renderHeader(ColumnInterface $column, Cell $cell, GlobalContext $context): ?Cell { $header = $column->header; if ($header === null) { diff --git a/src/Column/ColumnRendererInterface.php b/src/Column/ColumnRendererInterface.php index 4939d7cd8..2fd96691f 100644 --- a/src/Column/ColumnRendererInterface.php +++ b/src/Column/ColumnRendererInterface.php @@ -7,7 +7,6 @@ use Yiisoft\Yii\DataView\Column\Base\Cell; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; use Yiisoft\Yii\DataView\Column\Base\DataContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; /** * Interface for column renderers that handle the visual presentation of grid columns. @@ -77,11 +76,11 @@ public function renderColumn(ColumnInterface $column, Cell $cell, GlobalContext * @param ColumnInterface $column The column definition to render. * @psalm-param TColumn $column * @param Cell $cell The header cell to configure. - * @param HeaderContext $context Header-specific rendering context. + * @param GlobalContext $context Global grid rendering context. * * @return Cell|null The configured header cell, or `null` if no header should be shown. */ - public function renderHeader(ColumnInterface $column, Cell $cell, HeaderContext $context): ?Cell; + public function renderHeader(ColumnInterface $column, Cell $cell, GlobalContext $context): ?Cell; /** * Configures a data row cell. diff --git a/src/Column/DataColumnRenderer.php b/src/Column/DataColumnRenderer.php index e6dd1cbf1..952517fd6 100644 --- a/src/Column/DataColumnRenderer.php +++ b/src/Column/DataColumnRenderer.php @@ -18,7 +18,6 @@ use Yiisoft\Yii\DataView\Column\Base\DataContext; use Yiisoft\Yii\DataView\Column\Base\FilterContext; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; use Yiisoft\Yii\DataView\Column\Base\MakeFilterContext; use Yiisoft\Yii\DataView\Filter\Factory\EqualsFilterFactory; use Yiisoft\Yii\DataView\Filter\Factory\FilterFactoryInterface; @@ -82,7 +81,7 @@ public function renderColumn(ColumnInterface $column, Cell $cell, GlobalContext ->addClass($column->columnClass); } - public function renderHeader(ColumnInterface $column, Cell $cell, HeaderContext $context): Cell + public function renderHeader(ColumnInterface $column, Cell $cell, GlobalContext $context): Cell { /** @var DataColumn $column This annotation is for IDE only */ diff --git a/src/Column/RadioColumnRenderer.php b/src/Column/RadioColumnRenderer.php index 651a9853d..fdc0c68da 100644 --- a/src/Column/RadioColumnRenderer.php +++ b/src/Column/RadioColumnRenderer.php @@ -9,7 +9,6 @@ use Yiisoft\Yii\DataView\Column\Base\Cell; use Yiisoft\Yii\DataView\Column\Base\DataContext; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; use function array_key_exists; @@ -25,7 +24,7 @@ public function renderColumn(ColumnInterface $column, Cell $cell, GlobalContext return $cell->addAttributes($column->columnAttributes); } - public function renderHeader(ColumnInterface $column, Cell $cell, HeaderContext $context): ?Cell + public function renderHeader(ColumnInterface $column, Cell $cell, GlobalContext $context): ?Cell { $header = $column->header; if ($header === null) { diff --git a/src/Column/SerialColumnRenderer.php b/src/Column/SerialColumnRenderer.php index 689b47d9e..d661053fa 100644 --- a/src/Column/SerialColumnRenderer.php +++ b/src/Column/SerialColumnRenderer.php @@ -8,7 +8,6 @@ use Yiisoft\Yii\DataView\Column\Base\Cell; use Yiisoft\Yii\DataView\Column\Base\DataContext; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; /** * `SerialColumnRenderer` handles the rendering of sequential row number columns in a grid. @@ -22,7 +21,7 @@ public function renderColumn(ColumnInterface $column, Cell $cell, GlobalContext return $cell->addAttributes($column->columnAttributes); } - public function renderHeader(ColumnInterface $column, Cell $cell, HeaderContext $context): Cell + public function renderHeader(ColumnInterface $column, Cell $cell, GlobalContext $context): Cell { return $cell->content($column->header ?? '#'); } diff --git a/src/GridView.php b/src/GridView.php index e284305f7..0615d617b 100644 --- a/src/GridView.php +++ b/src/GridView.php @@ -19,7 +19,6 @@ use Yiisoft\Yii\DataView\Column\Base\FilterContext; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; use Yiisoft\Yii\DataView\Column\Base\DataContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; use Yiisoft\Yii\DataView\Column\Base\MakeFilterContext; use Yiisoft\Yii\DataView\Column\Base\RendererContainer; use Yiisoft\Yii\DataView\Column\ColumnInterface; @@ -740,13 +739,6 @@ protected function renderItems( $filtersForm = ''; $dataReader = $this->getDataReader(); - $globalContext = new GlobalContext( - $dataReader, - $this->urlConfig->getArguments(), - $this->urlConfig->getQueryParameters(), - $this->translator, - $this->translationCategory, - ); if ($preparedDataReader instanceof PaginatorInterface) { $pageToken = $preparedDataReader->isOnFirstPage() ? null : $preparedDataReader->getToken(); @@ -759,6 +751,31 @@ protected function renderItems( $pageSize = null; } + $globalContext = new GlobalContext( + $this->getSort($dataReader), + $this->getSort($preparedDataReader), + $this->getOrderProperties(), + $this->sortableHeaderClass, + $this->sortableHeaderPrepend, + $this->sortableHeaderAppend, + $this->sortableHeaderAscClass, + $this->sortableHeaderAscPrepend, + $this->sortableHeaderAscAppend, + $this->sortableHeaderDescClass, + $this->sortableHeaderDescPrepend, + $this->sortableHeaderDescAppend, + $this->sortableLinkAttributes, + $this->sortableLinkAscClass, + $this->sortableLinkDescClass, + $this->keepPageOnSort ? $pageToken : null, + $pageSize, + $this->multiSort, + $this->urlConfig, + $this->urlCreator, + $this->translator, + $this->translationCategory, + ); + $tags = []; $hasFilters = false; $filterContext = new FilterContext( @@ -821,33 +838,9 @@ protected function renderItems( } if ($this->isHeaderEnabled) { - $headerContext = new HeaderContext( - $this->getSort($dataReader), - $this->getSort($preparedDataReader), - $this->getOrderProperties(), - $this->sortableHeaderClass, - $this->sortableHeaderPrepend, - $this->sortableHeaderAppend, - $this->sortableHeaderAscClass, - $this->sortableHeaderAscPrepend, - $this->sortableHeaderAscAppend, - $this->sortableHeaderDescClass, - $this->sortableHeaderDescPrepend, - $this->sortableHeaderDescAppend, - $this->sortableLinkAttributes, - $this->sortableLinkAscClass, - $this->sortableLinkDescClass, - $this->keepPageOnSort ? $pageToken : null, - $pageSize, - $this->multiSort, - $this->urlConfig, - $this->urlCreator, - $this->translator, - $this->translationCategory, - ); $tags = []; foreach ($columns as $i => $column) { - $cell = $renderers[$i]->renderHeader($column, new Cell($this->headerCellAttributes), $headerContext); + $cell = $renderers[$i]->renderHeader($column, new Cell($this->headerCellAttributes), $globalContext); $tags[] = $cell === null ? Html::th(' ')->encode(false) : Html::th(attributes: $cell->getAttributes()) diff --git a/tests/Column/Base/GlobalContextTest.php b/tests/Column/Base/GlobalContextTest.php index 36a82f6af..9f5aef9fe 100644 --- a/tests/Column/Base/GlobalContextTest.php +++ b/tests/Column/Base/GlobalContextTest.php @@ -5,79 +5,162 @@ namespace Yiisoft\Yii\DataView\Tests\Column\Base; use PHPUnit\Framework\TestCase; -use Stringable; -use Yiisoft\Data\Reader\Iterable\IterableDataReader; -use Yiisoft\Yii\DataView\Column\Base\GlobalContext; +use Yiisoft\Data\Reader\Sort; +use Yiisoft\Html\Tag\A; +use Yiisoft\Yii\DataView\Column\Base\Cell; use Yiisoft\Yii\DataView\Tests\Support\Mock; -use Yiisoft\Yii\DataView\Tests\Support\TestTrait; +use Yiisoft\Yii\DataView\Tests\Support\TestHelper; /** * @covers \Yiisoft\Yii\DataView\Column\Base\GlobalContext + * @covers \Yiisoft\Yii\DataView\Column\Base\Cell + * @covers \Yiisoft\Yii\DataView\UrlConfig + * @covers \Yiisoft\Yii\DataView\UrlParametersFactory */ final class GlobalContextTest extends TestCase { - use TestTrait; + public function testTranslate(): void + { + $translator = Mock::translator('en'); + + $headerContext = TestHelper::createGlobalContext(translator: $translator); - private array $data = [ - ['id' => 1, 'name' => 'John'], - ['id' => 2, 'name' => 'Mary'], - ]; + $result = $headerContext->translate('test.message'); - public function testConstructor(): void + $this->assertSame('test.message', $result); + } + + public function testTranslateWithStringable(): void { - $dataReader = new IterableDataReader($this->data); $translator = Mock::translator('en'); - $pathArguments = ['id' => 123]; - $queryParameters = ['sort' => 'name']; - $translationCategory = 'app'; - - $context = new GlobalContext( - $dataReader, - $pathArguments, - $queryParameters, - $translator, - $translationCategory + + $headerContext = TestHelper::createGlobalContext(translator: $translator); + + $stringable = new class () { + public function __toString(): string + { + return 'Stringable Message'; + } + }; + + $result = $headerContext->translate($stringable); + + $this->assertSame('Stringable Message', $result); + } + + public function testPrepareSortableWithEmptyProperty(): void + { + $cell = new Cell(); + $headerContext = TestHelper::createGlobalContext(); + + $result = $headerContext->prepareSortable($cell, 'nonexistent'); + + $this->assertSame($cell, $result[0]); + $this->assertNull($result[1]); + $this->assertSame('', $result[2]); + $this->assertSame('', $result[3]); + } + + public function testPrepareSortableWithNullSort(): void + { + $cell = new Cell(); + $headerContext = TestHelper::createGlobalContext( + sort: null, + originalSort: null ); - $this->assertSame($dataReader, $context->dataReader); - $this->assertSame($pathArguments, $context->pathArguments); - $this->assertSame($queryParameters, $context->queryParameters); + $result = $headerContext->prepareSortable($cell, 'name'); + + $this->assertSame($cell, $result[0]); + $this->assertNull($result[1]); + $this->assertSame('', $result[2]); + $this->assertSame('', $result[3]); } - public function testTranslateWithString(): void + public function testPrepareSortableWithPropertyNotInConfig(): void { - $translator = Mock::translator('en'); + $sort = Sort::any(); + $cell = new Cell(); + $headerContext = TestHelper::createGlobalContext( + sort: $sort, + originalSort: $sort, + orderProperties: ['name' => 'name'] + ); + + $result = $headerContext->prepareSortable($cell, 'age'); - $context = new GlobalContext( - new IterableDataReader($this->data), - [], - [], - $translator, - 'app' + $this->assertSame($cell, $result[0]); + $this->assertNull($result[1]); + $this->assertSame('', $result[2]); + $this->assertSame('', $result[3]); + } + + public function testPrepareSortableWithNoOrder(): void + { + $sort = Sort::any(['name' => []]); + $cell = new Cell(); + $headerContext = TestHelper::createGlobalContext( + sort: $sort, + originalSort: $sort, + orderProperties: ['name' => 'name'], + sortableHeaderClass: 'sortable', + sortableHeaderPrepend: '↕', + sortableHeaderAppend: '!' ); - $this->assertSame('test.message', $context->translate('test.message')); + $result = $headerContext->prepareSortable($cell, 'name'); + + $this->assertInstanceOf(Cell::class, $result[0]); + $this->assertStringContainsString('sortable', $result[0]->getAttributes()['class']); + $this->assertInstanceOf(A::class, $result[1]); + $this->assertSame('↕', $result[2]); + $this->assertSame('!', $result[3]); } - public function testTranslateWithStringable(): void + public function testPrepareSortableWithAscOrder(): void { - $stringable = new class () implements Stringable { - public function __toString(): string - { - return 'test.stringable'; - } - }; + $sort = Sort::any(['name' => []])->withOrder(['name' => 'asc']); + $cell = new Cell(); + $headerContext = TestHelper::createGlobalContext( + sort: $sort, + originalSort: $sort, + orderProperties: ['name' => 'name'], + sortableHeaderAscClass: 'asc', + sortableHeaderAscPrepend: '↑', + sortableHeaderAscAppend: '!', + sortableLinkAscClass: 'link-asc' + ); - $translator = Mock::translator('en'); + $result = $headerContext->prepareSortable($cell, 'name'); - $context = new GlobalContext( - new IterableDataReader($this->data), - [], - [], - $translator, - 'app' + $this->assertInstanceOf(Cell::class, $result[0]); + $this->assertStringContainsString('asc', $result[0]->getAttributes()['class']); + $this->assertInstanceOf(A::class, $result[1]); + $this->assertSame('↑', $result[2]); + $this->assertSame('!', $result[3]); + } + + public function testPrepareSortableWithDescOrder(): void + { + $sort = Sort::any(['name' => []])->withOrder(['name' => 'desc']); + $cell = new Cell(); + + $headerContext = TestHelper::createGlobalContext( + sort: $sort, + originalSort: $sort, + orderProperties: ['name' => 'name'], + sortableHeaderDescClass: 'desc', + sortableHeaderDescPrepend: '↓', + sortableHeaderDescAppend: '!', + sortableLinkDescClass: 'link-desc' ); - $this->assertSame('test.stringable', $context->translate($stringable)); + $result = $headerContext->prepareSortable($cell, 'name'); + + $this->assertInstanceOf(Cell::class, $result[0]); + $this->assertStringContainsString('desc', $result[0]->getAttributes()['class']); + $this->assertInstanceOf(A::class, $result[1]); + $this->assertSame('↓', $result[2]); + $this->assertSame('!', $result[3]); } } diff --git a/tests/Column/Base/HeaderContextTest.php b/tests/Column/Base/HeaderContextTest.php deleted file mode 100644 index d5dbaaa06..000000000 --- a/tests/Column/Base/HeaderContextTest.php +++ /dev/null @@ -1,237 +0,0 @@ -createHeaderContext(translator: $translator); - - $result = $headerContext->translate('test.message'); - - $this->assertSame('test.message', $result); - } - - public function testTranslateWithStringable(): void - { - $translator = Mock::translator('en'); - - $headerContext = $this->createHeaderContext(translator: $translator); - - $stringable = new class () { - public function __toString(): string - { - return 'Stringable Message'; - } - }; - - $result = $headerContext->translate($stringable); - - $this->assertSame('Stringable Message', $result); - } - - public function testPrepareSortableWithEmptyProperty(): void - { - $cell = new Cell(); - $headerContext = $this->createHeaderContext(); - - $result = $headerContext->prepareSortable($cell, 'nonexistent'); - - $this->assertSame($cell, $result[0]); - $this->assertNull($result[1]); - $this->assertSame('', $result[2]); - $this->assertSame('', $result[3]); - } - - public function testPrepareSortableWithNullSort(): void - { - $cell = new Cell(); - $headerContext = $this->createHeaderContext( - sort: null, - originalSort: null - ); - - $result = $headerContext->prepareSortable($cell, 'name'); - - $this->assertSame($cell, $result[0]); - $this->assertNull($result[1]); - $this->assertSame('', $result[2]); - $this->assertSame('', $result[3]); - } - - public function testPrepareSortableWithPropertyNotInConfig(): void - { - $sort = Sort::any(); - $cell = new Cell(); - $headerContext = $this->createHeaderContext( - sort: $sort, - originalSort: $sort, - orderProperties: ['name' => 'name'] - ); - - $result = $headerContext->prepareSortable($cell, 'age'); - - $this->assertSame($cell, $result[0]); - $this->assertNull($result[1]); - $this->assertSame('', $result[2]); - $this->assertSame('', $result[3]); - } - - public function testPrepareSortableWithNoOrder(): void - { - $sort = Sort::any(['name' => []]); - $cell = new Cell(); - $headerContext = $this->createHeaderContext( - sort: $sort, - originalSort: $sort, - orderProperties: ['name' => 'name'], - sortableHeaderClass: 'sortable', - sortableHeaderPrepend: '↕', - sortableHeaderAppend: '!' - ); - - $result = $headerContext->prepareSortable($cell, 'name'); - - $this->assertInstanceOf(Cell::class, $result[0]); - $this->assertStringContainsString('sortable', $result[0]->getAttributes()['class']); - $this->assertInstanceOf(A::class, $result[1]); - $this->assertSame('↕', $result[2]); - $this->assertSame('!', $result[3]); - } - - public function testPrepareSortableWithAscOrder(): void - { - $sort = Sort::any(['name' => []])->withOrder(['name' => 'asc']); - $cell = new Cell(); - $headerContext = $this->createHeaderContext( - sort: $sort, - originalSort: $sort, - orderProperties: ['name' => 'name'], - sortableHeaderAscClass: 'asc', - sortableHeaderAscPrepend: '↑', - sortableHeaderAscAppend: '!', - sortableLinkAscClass: 'link-asc' - ); - - $result = $headerContext->prepareSortable($cell, 'name'); - - $this->assertInstanceOf(Cell::class, $result[0]); - $this->assertStringContainsString('asc', $result[0]->getAttributes()['class']); - $this->assertInstanceOf(A::class, $result[1]); - $this->assertSame('↑', $result[2]); - $this->assertSame('!', $result[3]); - } - - public function testPrepareSortableWithDescOrder(): void - { - $sort = Sort::any(['name' => []])->withOrder(['name' => 'desc']); - $cell = new Cell(); - $headerContext = $this->createHeaderContext( - sort: $sort, - originalSort: $sort, - orderProperties: ['name' => 'name'], - sortableHeaderDescClass: 'desc', - sortableHeaderDescPrepend: '↓', - sortableHeaderDescAppend: '!', - sortableLinkDescClass: 'link-desc' - ); - - $result = $headerContext->prepareSortable($cell, 'name'); - - $this->assertInstanceOf(Cell::class, $result[0]); - $this->assertStringContainsString('desc', $result[0]->getAttributes()['class']); - $this->assertInstanceOf(A::class, $result[1]); - $this->assertSame('↓', $result[2]); - $this->assertSame('!', $result[3]); - } - - private function createHeaderContext( - ?Sort $sort = null, - ?Sort $originalSort = null, - array $orderProperties = ['name' => 'name'], - ?string $sortableHeaderClass = null, - string|Stringable $sortableHeaderPrepend = '', - string|Stringable $sortableHeaderAppend = '', - ?string $sortableHeaderAscClass = null, - string|Stringable $sortableHeaderAscPrepend = '', - string|Stringable $sortableHeaderAscAppend = '', - ?string $sortableHeaderDescClass = null, - string|Stringable $sortableHeaderDescPrepend = '', - string|Stringable $sortableHeaderDescAppend = '', - array $sortableLinkAttributes = [], - ?string $sortableLinkAscClass = null, - ?string $sortableLinkDescClass = null, - ?PageToken $pageToken = null, - ?int $pageSize = null, - bool $multiSort = false, - ?TranslatorInterface $translator = null - ): HeaderContext { - if ($sort === null) { - $sort = Sort::any(); - } - - if ($originalSort === null) { - $originalSort = Sort::any(); - } - - if ($translator === null) { - $translator = Mock::translator('en'); - } - - $urlConfig = new UrlConfig( - pageParameterName: 'page', - previousPageParameterName: 'prev', - pageSizeParameterName: 'per-page', - sortParameterName: 'sort' - ); - - $urlCreator = fn(): string => '#'; - - return new HeaderContext( - originalSort: $originalSort, - sort: $sort, - orderProperties: $orderProperties, - sortableHeaderClass: $sortableHeaderClass, - sortableHeaderPrepend: $sortableHeaderPrepend, - sortableHeaderAppend: $sortableHeaderAppend, - sortableHeaderAscClass: $sortableHeaderAscClass, - sortableHeaderAscPrepend: $sortableHeaderAscPrepend, - sortableHeaderAscAppend: $sortableHeaderAscAppend, - sortableHeaderDescClass: $sortableHeaderDescClass, - sortableHeaderDescPrepend: $sortableHeaderDescPrepend, - sortableHeaderDescAppend: $sortableHeaderDescAppend, - sortableLinkAttributes: $sortableLinkAttributes, - sortableLinkAscClass: $sortableLinkAscClass, - sortableLinkDescClass: $sortableLinkDescClass, - pageToken: $pageToken, - pageSize: $pageSize, - multiSort: $multiSort, - urlConfig: $urlConfig, - urlCreator: $urlCreator, - translator: $translator, - translationCategory: 'grid' - ); - } -} diff --git a/tests/Column/CheckboxColumnRendererTest.php b/tests/Column/CheckboxColumnRendererTest.php index 2eec6e977..4595754ec 100644 --- a/tests/Column/CheckboxColumnRendererTest.php +++ b/tests/Column/CheckboxColumnRendererTest.php @@ -11,10 +11,10 @@ use Yiisoft\Yii\DataView\Column\Base\Cell; use Yiisoft\Yii\DataView\Column\Base\DataContext; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; use Yiisoft\Yii\DataView\Column\CheckboxColumn; use Yiisoft\Yii\DataView\Column\CheckboxColumnRenderer; use Yiisoft\Yii\DataView\Tests\Support\Mock; +use Yiisoft\Yii\DataView\Tests\Support\TestHelper; use Yiisoft\Yii\DataView\UrlConfig; final class CheckboxColumnRendererTest extends TestCase @@ -32,13 +32,7 @@ protected function setUp(): void ['id' => 1, 'name' => 'John'], ['id' => 2, 'name' => 'Mary'], ]); - $this->globalContext = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: Mock::translator('en'), - translationCategory: 'test' - ); + $this->globalContext = TestHelper::createGlobalContext(); } public function testRenderColumn(): void @@ -52,7 +46,7 @@ public function testRenderHeaderWithoutHeaderAndSingleSelection(): void { $column = new CheckboxColumn(multiple: false); $sort = Sort::any(); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: $sort, sort: $sort, orderProperties: ['test' => 'test'], @@ -84,7 +78,7 @@ public function testRenderHeaderWithoutHeaderAndMultipleSelection(): void { $column = new CheckboxColumn(multiple: true); $sort = Sort::any(); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: $sort, sort: $sort, orderProperties: ['test' => 'test'], @@ -120,7 +114,7 @@ public function testRenderHeaderWithCustomHeader(): void headerAttributes: ['class' => 'header-class'] ); $sort = Sort::any(); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: $sort, sort: $sort, orderProperties: ['test' => 'test'], diff --git a/tests/Column/DataColumnRendererTest.php b/tests/Column/DataColumnRendererTest.php index d32ff7aa4..0a3e973f8 100644 --- a/tests/Column/DataColumnRendererTest.php +++ b/tests/Column/DataColumnRendererTest.php @@ -16,13 +16,13 @@ use Yiisoft\Yii\DataView\Column\Base\Cell; use Yiisoft\Yii\DataView\Column\Base\DataContext; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; use Yiisoft\Yii\DataView\Column\Base\FilterContext; use Yiisoft\Yii\DataView\Column\Base\MakeFilterContext; use Yiisoft\Yii\DataView\Column\DataColumn; use Yiisoft\Yii\DataView\Column\DataColumnRenderer; use Yiisoft\Yii\DataView\Filter\Factory\LikeFilterFactory; use Yiisoft\Yii\DataView\Tests\Support\Mock; +use Yiisoft\Yii\DataView\Tests\Support\TestHelper; use Yiisoft\Yii\DataView\Tests\Support\TestTrait; use Yiisoft\Yii\DataView\UrlConfig; use Yiisoft\Validator\Rule\Number; @@ -53,15 +53,8 @@ public function testRenderColumn(): void $column = new DataColumn('test'); $cell = new Cell(); - $translator = Mock::translator('en'); - $context = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: $translator, - translationCategory: 'test' - ); + $context = TestHelper::createGlobalContext(); $renderer = new DataColumnRenderer( $this->filterFactoryContainer, @@ -79,7 +72,7 @@ public function testRenderHeader(): void $sort = Sort::any(); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: $sort, sort: $sort, orderProperties: ['test' => 'test'], @@ -375,7 +368,7 @@ public function testRenderHeaderWithoutProperty(): void $translator = Mock::translator('en'); $sort = Sort::any(); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: $sort, sort: $sort, orderProperties: [], @@ -416,7 +409,7 @@ public function testRenderHeaderWithoutHeaderAndProperty(): void $translator = Mock::translator('en'); $sort = Sort::any(); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: $sort, sort: $sort, orderProperties: [], @@ -477,15 +470,8 @@ public function testRenderFooterWithContent(): void { $column = new DataColumn(footer: 'Total: 100'); $cell = new Cell(); - $translator = Mock::translator('en'); - $context = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: $translator, - translationCategory: 'test' - ); + $context = TestHelper::createGlobalContext(); $renderer = new DataColumnRenderer( $this->filterFactoryContainer, @@ -500,15 +486,8 @@ public function testRenderFooterWithoutContent(): void { $column = new DataColumn(); $cell = new Cell(); - $translator = Mock::translator('en'); - $context = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: $translator, - translationCategory: 'test' - ); + $context = TestHelper::createGlobalContext(); $renderer = new DataColumnRenderer( $this->filterFactoryContainer, @@ -640,7 +619,7 @@ public function testRenderHeaderWithSortingDisabled(): void $translator = Mock::translator('en'); $sort = Sort::any(); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: $sort, sort: $sort, orderProperties: ['test' => 'test'], @@ -683,7 +662,7 @@ public function testRenderHeaderWithSorting(): void $translator = Mock::translator('en'); $sort = Sort::only(['test']); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: $sort, sort: $sort, orderProperties: ['test' => 'test'], @@ -728,7 +707,7 @@ public function testRenderHeaderWithAscendingSort(): void $translator = Mock::translator('en'); $sort = Sort::only(['test'])->withOrder(['test' => 'asc']); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: $sort, sort: $sort, orderProperties: ['test' => 'test'], @@ -773,7 +752,7 @@ public function testRenderHeaderWithDescendingSort(): void $translator = Mock::translator('en'); $sort = Sort::only(['test'])->withOrder(['test' => 'desc']); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: $sort, sort: $sort, orderProperties: ['test' => 'test'], diff --git a/tests/Column/RadioColumnRendererTest.php b/tests/Column/RadioColumnRendererTest.php index f36847bd8..61013ff42 100644 --- a/tests/Column/RadioColumnRendererTest.php +++ b/tests/Column/RadioColumnRendererTest.php @@ -10,10 +10,10 @@ use Yiisoft\Yii\DataView\Column\Base\Cell; use Yiisoft\Yii\DataView\Column\Base\DataContext; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; use Yiisoft\Yii\DataView\Column\RadioColumn; use Yiisoft\Yii\DataView\Column\RadioColumnRenderer; use Yiisoft\Yii\DataView\Tests\Support\Mock; +use Yiisoft\Yii\DataView\Tests\Support\TestHelper; use Yiisoft\Yii\DataView\UrlConfig; final class RadioColumnRendererTest extends TestCase @@ -36,15 +36,8 @@ public function testRenderColumn(): void columnAttributes: ['class' => 'test-column'] ); $cell = new Cell(); - $translator = Mock::translator('en'); - $context = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: $translator, - translationCategory: 'test' - ); + $context = TestHelper::createGlobalContext(); $renderer = new RadioColumnRenderer(); $result = $renderer->renderColumn($column, $cell, $context); @@ -58,7 +51,7 @@ public function testRenderHeaderWithNullHeader(): void $cell = new Cell(); $translator = Mock::translator('en'); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: null, sort: null, orderProperties: [], @@ -98,7 +91,7 @@ public function testRenderHeaderWithCustomAttributes(): void $cell = new Cell(); $translator = Mock::translator('en'); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: null, sort: null, orderProperties: [], @@ -225,15 +218,8 @@ public function testRenderFooterWithContent(): void footer: 'Footer content' ); $cell = new Cell(); - $translator = Mock::translator('en'); - $context = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: $translator, - translationCategory: 'test' - ); + $context = TestHelper::createGlobalContext(); $renderer = new RadioColumnRenderer(); $result = $renderer->renderFooter($column, $cell, $context); @@ -245,15 +231,8 @@ public function testRenderFooterWithoutContent(): void { $column = new RadioColumn(); $cell = new Cell(); - $translator = Mock::translator('en'); - $context = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: $translator, - translationCategory: 'test' - ); + $context = TestHelper::createGlobalContext(); $renderer = new RadioColumnRenderer(); $result = $renderer->renderFooter($column, $cell, $context); @@ -341,15 +320,8 @@ public function testRenderColumnWithInvisibleColumn(): void visible: false ); $cell = new Cell(); - $translator = Mock::translator('en'); - $context = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: $translator, - translationCategory: 'test' - ); + $context = TestHelper::createGlobalContext(); $renderer = new RadioColumnRenderer(); $result = $renderer->renderColumn($column, $cell, $context); @@ -413,7 +385,7 @@ public function testRenderHeaderWithEmptyAttributes(): void $cell = new Cell(); $translator = Mock::translator('en'); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: null, sort: null, orderProperties: [], @@ -456,15 +428,8 @@ public function testRenderColumnWithMultipleAttributes(): void ] ); $cell = new Cell(); - $translator = Mock::translator('en'); - $context = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: $translator, - translationCategory: 'test' - ); + $context = TestHelper::createGlobalContext(); $renderer = new RadioColumnRenderer(); $result = $renderer->renderColumn($column, $cell, $context); @@ -488,7 +453,7 @@ public function testRenderHeaderWithHtmlSpecialChars(): void $cell = new Cell(); $translator = Mock::translator('en'); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: null, sort: null, orderProperties: [], @@ -528,15 +493,8 @@ public function testRenderFooterWithColumnAttributes(): void columnAttributes: ['class' => 'column-class'] ); $cell = new Cell(); - $translator = Mock::translator('en'); - $context = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: $translator, - translationCategory: 'test' - ); + $context = TestHelper::createGlobalContext(); $renderer = new RadioColumnRenderer(); $result = $renderer->renderFooter($column, $cell, $context); @@ -587,15 +545,8 @@ public function testRenderFooterWithHtmlContent(): void footer: 'Total: 42' ); $cell = new Cell(); - $translator = Mock::translator('en'); - $context = new GlobalContext( - dataReader: $this->dataReader, - pathArguments: [], - queryParameters: [], - translator: $translator, - translationCategory: 'test' - ); + $context = TestHelper::createGlobalContext(); $renderer = new RadioColumnRenderer(); $result = $renderer->renderFooter($column, $cell, $context); @@ -611,7 +562,7 @@ public function testRenderHeaderWithAttributesButNoContent(): void $cell = new Cell(); $translator = Mock::translator('en'); - $context = new HeaderContext( + $context = new GlobalContext( originalSort: null, sort: null, orderProperties: [], diff --git a/tests/Support/TestHelper.php b/tests/Support/TestHelper.php new file mode 100644 index 000000000..af9109c63 --- /dev/null +++ b/tests/Support/TestHelper.php @@ -0,0 +1,83 @@ + 'name'], + ?string $sortableHeaderClass = null, + string|Stringable $sortableHeaderPrepend = '', + string|Stringable $sortableHeaderAppend = '', + ?string $sortableHeaderAscClass = null, + string|Stringable $sortableHeaderAscPrepend = '', + string|Stringable $sortableHeaderAscAppend = '', + ?string $sortableHeaderDescClass = null, + string|Stringable $sortableHeaderDescPrepend = '', + string|Stringable $sortableHeaderDescAppend = '', + array $sortableLinkAttributes = [], + ?string $sortableLinkAscClass = null, + ?string $sortableLinkDescClass = null, + ?PageToken $pageToken = null, + ?int $pageSize = null, + bool $multiSort = false, + ?TranslatorInterface $translator = null + ): GlobalContext { + if ($sort === null) { + $sort = Sort::any(); + } + + if ($originalSort === null) { + $originalSort = Sort::any(); + } + + if ($translator === null) { + $translator = Mock::translator('en'); + } + + $urlConfig = new UrlConfig( + pageParameterName: 'page', + previousPageParameterName: 'prev', + pageSizeParameterName: 'per-page', + sortParameterName: 'sort' + ); + + $urlCreator = fn(): string => '#'; + + return new GlobalContext( + originalSort: $originalSort, + sort: $sort, + orderProperties: $orderProperties, + sortableHeaderClass: $sortableHeaderClass, + sortableHeaderPrepend: $sortableHeaderPrepend, + sortableHeaderAppend: $sortableHeaderAppend, + sortableHeaderAscClass: $sortableHeaderAscClass, + sortableHeaderAscPrepend: $sortableHeaderAscPrepend, + sortableHeaderAscAppend: $sortableHeaderAscAppend, + sortableHeaderDescClass: $sortableHeaderDescClass, + sortableHeaderDescPrepend: $sortableHeaderDescPrepend, + sortableHeaderDescAppend: $sortableHeaderDescAppend, + sortableLinkAttributes: $sortableLinkAttributes, + sortableLinkAscClass: $sortableLinkAscClass, + sortableLinkDescClass: $sortableLinkDescClass, + pageToken: $pageToken, + pageSize: $pageSize, + multiSort: $multiSort, + urlConfig: $urlConfig, + urlCreator: $urlCreator, + translator: $translator, + translationCategory: 'grid' + ); + } +} diff --git a/tests/Support/TestRenderer.php b/tests/Support/TestRenderer.php index e0ed18d68..56e8b7db1 100644 --- a/tests/Support/TestRenderer.php +++ b/tests/Support/TestRenderer.php @@ -7,7 +7,6 @@ use Yiisoft\Yii\DataView\Column\Base\Cell; use Yiisoft\Yii\DataView\Column\Base\DataContext; use Yiisoft\Yii\DataView\Column\Base\GlobalContext; -use Yiisoft\Yii\DataView\Column\Base\HeaderContext; use Yiisoft\Yii\DataView\Column\ColumnInterface; use Yiisoft\Yii\DataView\Column\ColumnRendererInterface; @@ -37,7 +36,7 @@ public function renderColumn(ColumnInterface $column, Cell $cell, GlobalContext return $cell; } - public function renderHeader(ColumnInterface $column, Cell $cell, HeaderContext $context): ?Cell + public function renderHeader(ColumnInterface $column, Cell $cell, GlobalContext $context): ?Cell { return $cell; }