Produkty Objednávky Zákazníci Dokumentace
Nepřihlášen Uživatel 1 Uživatel 2 Uživatel 3
Část III · Enum sloupce

8.3. Volba částí – showInCell a showInFilter

Bez zásahu se vykreslí všechno, co case umí. showInCell() a showInFilter() tu sadu nahradí – buňka a nabídka filtru se nastavují každá zvlášť.

Ukázka

Dvě hodnoty, každá vypsaná několikrát v jiné podobě. Stav – pilulka má navíc jinou podobu v buňce a jinou v nabídce svého filtru.

Zdrojový kód

php app/Modules/AdminModule/Components/Docs/Columns/EnumPartsGridControl/EnumPartsGridControl.php
<?php

declare(strict_types=1);

namespace App\Components\Docs\Columns\EnumPartsGridControl;

use App\Enum\OrderShipping;
use App\Enum\OrderStatus;
use Xart\Grid\Button\ButtonManager;
use Xart\Grid\Column\ColumnManager;
use Xart\Grid\Column\Enum\GridEnum;
use Xart\Grid\Control\GridControl;
use Xart\Grid\DataOutput\Row;
use Xart\Grid\DataSource\DataSource;
use Xart\Grid\DataSource\SQL\SQLDataSource;

/**
 * Dokumentace, kapitola 8.3 – Volba částí (showInCell a showInFilter).
 *
 * Dvě hodnoty, každá vypsaná několikrát v jiné podobě. Dotaz proto vrací týž sloupec pod několika
 * aliasy – grid nedovolí přidat jeden alias dvakrát.
 */
class EnumPartsGridControl extends GridControl
{
    public function createDataSource(): DataSource
    {
        return new SQLDataSource(__DIR__ . '/EnumPartsGridControl.sql');
    }


    public function columns(ColumnManager $cm): void
    {
        $cm->add('number', 'Číslo');

        // Bez showInCell(): vykreslí se všechno, co case umí – u OrderShipping barva a zkratka.
        $cm->addEnum('shipping', 'Doprava', OrderShipping::class);

        // Textový slot je jeden: Short vyhrává, Label ho přebije na plný popisek.
        $cm->addEnum('shipping_short', 'Doprava – zkratka', OrderShipping::class)
            ->showInCell(GridEnum::Short);

        $cm->addEnum('shipping_label', 'Doprava – popisek', OrderShipping::class)
            ->showInCell(GridEnum::Label);

        // Výchozí podoba stavu: ikona a popisek v barevné pilulce.
        $cm->addEnum('status', 'Stav', OrderStatus::class);

        // Sloupec jen s ikonou – popisek zůstane v titulku buňky a v exportu.
        $cm->addEnum('status_icon', 'Stav – ikona', OrderStatus::class)
            ->showInCell(GridEnum::Icon);

        // Jiná podoba v buňce (pilulka s popiskem) a jiná v nabídce filtru (jen barevný chip).
        $cm->addEnum('status_badge', 'Stav – pilulka', OrderStatus::class)
            ->showInCell(GridEnum::Badge, GridEnum::Label)
            ->showInFilter(GridEnum::Color);
    }


    public function buttons(ButtonManager $bm): void
    {
    }


    public function rows(Row $row): void
    {
    }


    public function render(): void
    {
        $this->template->render(__DIR__ . '/EnumPartsGridControl.latte');
    }
}
sql app/Modules/AdminModule/Components/Docs/Columns/EnumPartsGridControl/EnumPartsGridControl.sql
SELECT
    o.id,
    o.number,
    o.shipping,
    o.shipping AS shipping_short,
    o.shipping AS shipping_label,
    o.status,
    o.status AS status_icon,
    o.status AS status_badge
FROM `order` o

Části

$cm->addEnum('status', 'Stav', OrderStatus::class)
	->showInCell(GridEnum::Badge, GridEnum::Label)
	->showInFilter(GridEnum::Color);
  • GridEnum::Icon – ikona, vždy před textem,
  • GridEnum::Color – podklad přes celou buňku,
  • GridEnum::Badge – pilulka kolem ikony a textu,
  • GridEnum::Short – zkratka jako text,
  • GridEnum::Label – plný popisek jako text.

Short a Label sdílí jeden slot

Textový slot je jeden: Short vyhrává, ale case bez zkratky spadne na popisek; samotný Label vynutí popisek vždy. Bez obou se text nezobrazí – to je právě sloupec Stav – ikona, kde nese informaci jen ikona a popisek zůstává v titulku buňky, v aria-label a v exportu.

Na co si dát pozor

  • Volání nahrazuje, nepřidává. showInCell(GridEnum::Icon) znamená „jen ikonu“, ne „ikonu navíc“. showInCell() bez argumentů znamená „nic“ – buňka zůstane vizuálně prázdná (popisek dál v titulku a v exportu).
  • Část, kterou case neumí, se nedodělá. Vyžádaná ikona u enumu bez HasIcon se prostě nevykreslí.
  • showInFilter() drží sám filtr. Po výměně filtru přes setFilter() se nastavení nemá kam propsat a nedělá nic – volejte ho až po ní.
  • Jeden alias jde přidat jen jednou. Když chcete touž hodnotu vypsat dvakrát jinak, vraťte ji z dotazu pod dvěma aliasy (jako v ukázce).