Čá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
HasIconse prostě nevykreslí. showInFilter()drží sám filtr. Po výměně filtru přessetFilter()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).