From eca793ce0083a68add3bbc2e75ac0b72e15137ba Mon Sep 17 00:00:00 2001 From: Sebastian Fischer Date: Sat, 30 Nov 2024 18:06:48 +0100 Subject: [PATCH] [TASK] Restructure grid column All extending properties from the grid column are moved from the class to the override property and the access in the templates are aligned. The processing of the values is moved to BeforeContainerPreviewIsRenderedListener --- ...foreContainerPreviewIsRenderedListener.php | 41 +++++++++++--- Classes/Xclass/ContainerGridColumn.php | 53 ++----------------- .../Partials/PageLayout/Grid/Column.html | 2 +- .../PageLayout/Grid/ColumnHeader.html | 8 +-- 4 files changed, 43 insertions(+), 61 deletions(-) diff --git a/Classes/EventListener/BeforeContainerPreviewIsRenderedListener.php b/Classes/EventListener/BeforeContainerPreviewIsRenderedListener.php index 83dbe16..a255886 100644 --- a/Classes/EventListener/BeforeContainerPreviewIsRenderedListener.php +++ b/Classes/EventListener/BeforeContainerPreviewIsRenderedListener.php @@ -15,6 +15,8 @@ namespace Evoweb\EwCollapsibleContainer\EventListener; +use B13\Container\Backend\Grid\ContainerGridColumn as BaseContainerGridColum; +use B13\Container\Backend\Grid\ContainerGridColumnItem; use B13\Container\Events\BeforeContainerPreviewIsRenderedEvent; use Evoweb\EwCollapsibleContainer\Xclass\ContainerGridColumn; use TYPO3\CMS\Core\Attribute\AsEventListener; @@ -25,25 +27,48 @@ class BeforeContainerPreviewIsRenderedListener #[AsEventListener('collapsible-container-beforepreview', BeforeContainerPreviewIsRenderedEvent::class)] public function __invoke(BeforeContainerPreviewIsRenderedEvent $event): void { - $grid = $event->getGrid(); $record = $event->getItem()->getRecord(); - /** @var ContainerGridColumn $columnObject */ - foreach ($grid->getColumns() as $columnObject) { - $this->setColumnCollapsedState((int)$record['uid'], $columnObject); + /** @var ContainerGridColumn $column */ + foreach ($event->getGrid()->getColumns() as $column) { + $countOfHiddenItems = $this->getCountOfHiddenItems($column); + $column->setOverride([ + 'countOfHiddenItems' => $countOfHiddenItems, + 'collapsed' => $this->getColumnCollapsed((int)$record['uid'], $column), + 'showMinItemsWarning' => $this->getShowMinItemsWarning($column, $countOfHiddenItems) + ]); } } - protected function setColumnCollapsedState(int $recordUid, ContainerGridColumn $column): void + protected function getCountOfHiddenItems(ContainerGridColumn $columnObject): int + { + return count( + array_filter( + $columnObject->getItems(), + fn (ContainerGridColumnItem $item) => ($item->getRecord()['hidden'] ?? 0) > 0 + ) + ); + } + + protected function getColumnCollapsed(int $recordUid, ContainerGridColumn $columnObject): bool { $backendUser = $this->getBackendUser(); - $collapseId = $recordUid . ContainerGridColumn::CONTAINER_COL_POS_DELIMITER . $column->getColumnNumber(); + $collapseId = $recordUid + . BaseContainerGridColum::CONTAINER_COL_POS_DELIMITER + . $columnObject->getColumnNumber(); if (isset($backendUser->uc['moduleData']['list']['containerExpanded'][$collapseId])) { $collapsed = $backendUser->uc['moduleData']['list']['containerExpanded'][$collapseId] > 0; } else { - $collapsed = (bool)($column->getDefinition()['collapsed'] ?? false); + $collapsed = (bool)($columnObject->getDefinition()['collapsed'] ?? false); } - $column->setCollapsed($collapsed); + return $collapsed; + } + + protected function getShowMinItemsWarning(ContainerGridColumn $columnObject, int $hiddenItemCount): bool + { + $itemCount = count($columnObject->getItems()); + $minItems = (int)($columnObject->getDefinition()['minitems'] ?? 0); + return $itemCount > 0 && ($itemCount - $hiddenItemCount) < $minItems; } protected function getBackendUser(): BackendUserAuthentication diff --git a/Classes/Xclass/ContainerGridColumn.php b/Classes/Xclass/ContainerGridColumn.php index 6bd3b2a..4fc5e4d 100644 --- a/Classes/Xclass/ContainerGridColumn.php +++ b/Classes/Xclass/ContainerGridColumn.php @@ -15,62 +15,19 @@ namespace Evoweb\EwCollapsibleContainer\Xclass; -use B13\Container\Backend\Grid\ContainerGridColumnItem; use B13\Container\Backend\Grid\ContainerGridColumn as BaseContainerGridColumn; -use B13\Container\Domain\Model\Container; -use TYPO3\CMS\Backend\View\PageLayoutContext; class ContainerGridColumn extends BaseContainerGridColumn { - protected bool $collapsed = false; + protected array $override = []; - protected int $minItems = 0; - - public function __construct( - PageLayoutContext $context, - array $columnDefinition, - Container $container, - ?string $newContentUrl, - bool $skipNewContentElementWizard - ) { - parent::__construct( - $context, - $columnDefinition, - $container, - $newContentUrl, - $skipNewContentElementWizard - ); - $this->minItems = (int)($columnDefinition['minitems'] ?? 0); - } - - public function getCollapsed(): bool - { - return $this->collapsed; - } - - public function setCollapsed(bool $collapsed): void - { - $this->collapsed = $collapsed; - } - - public function hasShowMinItemsWarning(): bool - { - return count($this->items) > 0 - && (count($this->items) - $this->getCountOfHiddenItems()) < $this->getMinItems(); - } - - public function getMinItems(): int + public function setOverride(array $override): void { - return $this->minItems; + $this->override = $override; } - public function getCountOfHiddenItems(): int + public function getDefinition(): array { - return count( - array_filter( - $this->items, - fn (ContainerGridColumnItem $item) => ($item->getRecord()['hidden'] ?? 0) > 0 - ) - ); + return array_merge($this->definition, $this->override); } } diff --git a/Resources/Private/Partials/PageLayout/Grid/Column.html b/Resources/Private/Partials/PageLayout/Grid/Column.html index ec94b62..caebd1d 100644 --- a/Resources/Private/Partials/PageLayout/Grid/Column.html +++ b/Resources/Private/Partials/PageLayout/Grid/Column.html @@ -7,7 +7,7 @@ {f:if(condition: column.unassigned, then: 't3-grid-cell-unassigned')} {f:if(condition: '!{column.active} && !{column.unused}', then: 't3-grid-cell-restricted')} {f:if(condition: '!{column.active} && {hideRestrictedColumns} && !{column.unused}', then: 't3-grid-cell-hidden')} - {f:if(condition: column.collapsed, then: 'collapsed')} + {f:if(condition: column.definition.collapsed, then: 'collapsed')} {column.title} - - + + - + - +