ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid

Sami_
Člen | 15
+
0
-

Pavel Janda napsal(a):

Tak to možná zkuste uložit do session, to by mělo být celkem rychlé/snadné řešení.

Stále to samé. Data se načtou na 1 stranu Gridu a jakmile stranu přepnu, všechno zmizí.

Presenter

public function handleTest($data)
{
	$session = $this->getSession(__CLASS__);
	$session->objectsForTable = $this->myService->getObjectsFromData($data);
	$this['importGrid']->setDataSource($session->objectsForTable);
	$this['importGrid']->reload();
}

protected function createComponentImportGrid()
{
	$g = new DataGrid();
	$g->setDataSource($this->getSession(__CLASS__)->objectsForTrade); // inicializováno na []
	$g->addColumnDateTime('timeOpen', 'Čas otevření');
	return $g;
}

Nevím, jestli chyba není někde jinde, ale vůbec mě nenapadá kde

Editoval Sami_ (10. 3. 22:46)

Kamil Valenta
Člen | 402
+
+1
-

Když odstránkuješ, nevykoná se handleTest(), ale jen createComponentImportGrid() a v něm máš

$g->setDataSource([]);

takže je jasné, že se grid vyprázdní.
Dej si tam:

$g = new DataGrid();
$session = $this->getSession(__CLASS__);
$g->setDataSource($session->objectsForTable);
Kamil Valenta
Člen | 402
+
+1
-

Aha, ten příspěvek se změnil. Takže teď:

public function handleTest($data)
{
	$session = $this->getSession(__CLASS__);
	$session->objectsForTable = $this->myService->getObjectsFromData($data);
	//$this['importGrid']->setDataSource($session->objectsForTable);
	$this['importGrid']->reload();
}

protected function createComponentImportGrid()
{
	$g = new DataGrid();
	$g->setDataSource($this->getSession(__CLASS__)->objectsForTable); // inicializováno na []
	$g->addColumnDateTime('timeOpen', 'Čas otevření');
	return $g;
}

Pozor, jednou v session pracuješ s objectsForTable, ale pak saháš na objectsForTrade.

Sami_
Člen | 15
+
+1
-

Kamil Valenta napsal(a):

Když odstránkuješ, nevykoná se handleTest(), ale jen createComponentImportGrid() a v něm máš

$g->setDataSource([]);

takže je jasné, že se grid vyprázdní.
Dej si tam:

$g = new DataGrid();
$session = $this->getSession(__CLASS__);
$g->setDataSource($session->objectsForTable);

Mezitím mi to došlo a akorát jsem to šel opravit tady, už mi to jede! Moc dík za tvoji trpělivost!

jAkErCZ
Člen | 316
+
+1
-

Zdravím,
narazil jsem na divné chování při funkci addFilterSelect . Mám addColumnStatus ve kterém si vypisuji statusy.

"ublaboo/datagrid": "^6.6" - v6.8.1
$grid->addColumnStatus('status', 'Status')->setAlign('center')
               ->addOption('10', 'Založeno')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('20', 'Nabídka odeslána')
               ->setClass('btn-warning')
               ->endOption()
               ->addOption('25', 'Email: 9 věcí čeká')
               ->setClass('btn-secondary')
               ->endOption()
               ->addOption('30', 'Email: 9 věcí odesláno')
               ->setClass('btn-warning')
               ->endOption()
               ->addOption('35', 'Email: Jak si stojíme čeká')
               ->setClass('btn-secondary')
               ->endOption()
               ->addOption('40', 'Email: Jak si stojíme odesláno')
               ->setClass('btn-warning')
               ->endOption()
               ->addOption('50', 'Volání před zaměřením')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('60', 'Zaměření domluveno')
               ->setClass('btn-focus')
               ->endOption()
               ->addOption('70', 'Návrh SOD po zam. odeslán')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('80', 'Volání po zaměření')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('100', 'Smlouva')
               ->setClass('btn-success')
               ->endOption()
               ->addOption('101', 'Smlouva: Záloha uhrazena')
               ->setClass('btn-contract-success')
               ->endOption()
               ->addOption('102', 'Smlouva: Záloha neuhrazena')
               ->setClass('btn-contract-nosuccess')
               ->endOption()
               ->addOption('103', 'Zakázka ve výrobě')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('104', 'Zakázka skladem (BRN)')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('105', 'Zakázka skladem (TCE)')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('110', 'Zakázka dokončena')
               ->setClass('btn-success')
               ->endOption()
               ->addOption('duplicity', 'Duplicitní nabídka')
               ->setClass('btn-danger')
               ->endOption()
               ->addOption('postoped', 'Nabídka odložena')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('cancel', 'Nezobchodováno')
               ->setClass('btn-danger')
               ->endOption()
               ->onChange[] = [$this, 'changeStatus'];

A potom klasicky

$grid->addFilterSelect('status', 'Status:', ['' => 'Všichny statusy', 'Statusy' => $this->projectRepository->getOrderStates()])->setAttribute('class', 'select2');

A problém nastává tehdy jakmile vyfiltruji nějaký status který má ID (10,20,30) tak mi grid vrátí Žádné položky nenalezeny ale když dám F5 a grid se znovu načte z parametry už mi to vrátí všechny statusy odpovídající tomu danému ID. Ale pokud ve filtru vyberu status který má název ( duplicity,postoped,cancel) grid mi normálně vrátí ty řádky aniž bych musel znovu načítat F5.

Proč se tomu tak děje?

Editoval jAkErCZ (11. 3. 10:50)

MW
Člen | 606
+
0
-

Zdravím a prosím o radu.

Mám jako zdroj array.

Potřebuji rozchodit itemsDetail:

$datagrid->setDataSource(array...));

	$datagrid->setItemsPerPageList([20, 50, 100]);

	$datagrid->addColumnText('id', 'ID');
	$datagrid->addColumnText('email', 'E-mail')
		->setSortable()
		->setFilterText();

	$datagrid->setItemsDetail();

	$datagrid->setTemplateFile(__DIR__ . '/Templates/kontakty_template.latte');

	return $datagrid;

kontakty_template.latte

{extends $originalTemplate}

{block detail}
	<p>Lorem ipsum</p>
	<button class="btn btn-default btn-secondary btn-sm">Just a button</button>
{/block}

výsledek po kliknutí na detail:

<tr class="row-item-detail item-detail-grid-grid-id-1 loaded toggled" id="snippet-grid-grid-item-1-detail">
																	</tr>

tedy prázdné

Dělám něco špatně. Vše vč. stránkování, filtru funguje

Edit: pokud to nastavím stejně a jako source je DB, tak to jede. Tedy je nejaký problém assoc array jako datasource ??

Tady jsem našel to bylo i reportované. Víte prosím někdo, jak to opravit?
https://github.com/…d/issues/817

Díky moc!

Editoval MW (29. 3. 19:54)

d@rkWolf
Člen | 136
+
0
-

@MW jo, s array datasource detail nefunguje, taky sem na to narazil, i když mě nefungoval ani s DB, protože používám zajaxovanou celou stránku a s tím to nefunguje vůbec(překreslí to místo jednoho řádku celý grid a nechá jen ten detail-ostatní řádky zmizí)

d@rkWolf
Člen | 136
+
0
-

Nedělal někdo s TreeView a Sortable? Je to funkční? Já furt narážím na problém s řazením, pokud se něco posune mezi úrovněmi(změní se parent). V tu chvíli mi docela pravděpodobně nastavává situace, kdy zanořená položka má stejnou hodnotu pozice jako jiná ve vyšší úrovni a jak je přesunu k sobě, celé se to zblázní.

Není někde nebo nemáte někdo nějakou funkční implementaci? V demo kódu to akorát vyhazuje alert hlášku s id, prevId, nextId pozicemi.

Chtěl jsem to použít místo jsTree, co sem měl dříve, ale asi na něj zase dojde, protože mi teď přesunování připomíná řešení rubikovy kostky :-(

Editoval d@rkWolf (30. 3. 0:19)

MW
Člen | 606
+
0
-

d@rkWolf napsal(a):

@MW jo, s array datasource detail nefunguje, taky sem na to narazil, i když mě nefungoval ani s DB, protože používám zajaxovanou celou stránku a s tím to nefunguje vůbec(překreslí to místo jednoho řádku celý grid a nechá jen ten detail-ostatní řádky zmizí)

Tak hint je skutečně tady:

ArrayDataSource.php line:94

public function filterOne(array $condition): IDataSource
	{
		foreach ($this->data as $item) {
			foreach ($condition as $key => $value) {
				if ($item[$key] =**=**= $value) {
					$this->setData([$item]);
					return $this;
				}
			}
		}
		$this->setData([]);
		return $this;
	}

Je to jiný datový typ. Po odmazání jenoho „=“ to funguje.

H0w4rd
Člen | 81
+
0
-

Nepsal jste někdo prosím export do Excelu, který by bylo možné poskytnout?
Vím, jak na to, ale nechtěl bych vynalézat kolo :)

Nezabýval jste se někdo nějakým lepším nastylováním? Bez urážky, datagrid je skvělý, ale jeho základní vzhled vůbec neoslní. Lidi se rozhodují na základě emocí a vzhled je to, co nejvíc prodává, bohužel.

PS: Při filtrování s nejnovější verzí Nette Forms to hází
Nette\Forms\Container::getValues() invoked but the form is not valid.
viz https://forum.nette.org/…innem-inputu
Prosím přijmi pull request https://github.com/…2813a629c159

Editoval H0w4rd (3. 4. 13:17)

mt
Člen | 2
+
0
-

Zdravim, jak bych se mohl dostat k paginator datum? Mam na jednom projektu velkou databazi a pri nacitani gridu padam na pamet. Potreboval bych tedy implementovat strankovani pro nacitani z databaze. A nevim jak se co nejjednodusseji dostat k paginator datum a co bude pripadne potreba jeste upravit.

Pavel Janda
Člen | 951
+
0
-

@H0w4rd Ahoj!

  1. Nevím o ničem, co by existovalo někde veřejně např. v gistu. Pokud bys export do excelu připravil a zveřejnil jako OS, bylo by to megasuper! Já sám s tím asi moc nepomohu, už jsou to roky, co jsem se o něco podobného snažil. Ale komunita by to, podle mě, moc moc ocenila.
  2. Hodně lidí si styly upravuje, to je jasné. Já už leta používám AdminLTE v nějaké konkrétní verzi, kam datagrid s defaultními styly celkem, myslím, pasuje. Ale už kdysi jsem chtěl připravit styly pro AdminLTE, Material Design, nejnovější Bootstrap a pod. Kdybys vykopnul nějaké téma, cool, super! Budem rádi. Souhlasím, že by to chtělo zase po čase nějaký facelift.

@mt Nejsem si jistý, jestli to správně chápu. Potreboval bych tedy implementovat strankovani pro nacitani z databaze. → tohle se děje, jinak by datagrid fungovat pořádně ani nemohl.. Z databáze se vždy vytahuje max X (třeba 20) položek z databáze. Nebo tím myslíš něco jiného?

mt
Člen | 2
+
0
-

@PavelJanda Uz jsem pokrocil, mam problem s tim ze musim pouzivat pouze sql dotazy a pouzival jsem array datasource. Ted jsem zacal pouzivat Nette database source ale ten ma problemy s parsovanim naseho komplikovaneho postgresql dotazu.Myslim si ze problem je v parsovani selectu v left joinu.

Pavel Janda
Člen | 951
+
0
-

@mt Pokud řešíte nějaký sožitější SQL dotaz, doporučuji poohlédnout se po něčem přímočařejším, paříklad Dibi. Nebo pokud nemáte jinou možnost než použít nette database, můžete zkusit data source, který vám umožní psát přímo SQL.

Petr Parolek
Člen | 371
+
0
-

H0w4rd napsal(a):

Nepsal jste někdo prosím export do Excelu, který by bylo možné poskytnout?
Vím, jak na to, ale nechtěl bych vynalézat kolo :)

Nezabýval jste se někdo nějakým lepším nastylováním? Bez urážky, datagrid je skvělý, ale jeho základní vzhled vůbec neoslní. Lidi se rozhodují na základě emocí a vzhled je to, co nejvíc prodává, bohužel.

PS: Při filtrování s nejnovější verzí Nette Forms to hází
Nette\Forms\Container::getValues() invoked but the form is not valid.
viz https://forum.nette.org/…innem-inputu
Prosím přijmi pull request https://github.com/…2813a629c159

Ahoj, můžeš se inspirrat např. tu https://github.com/…tService.php

svatekr@gmail.com
Člen | 1
+
0
-

Ublaboo je mi moc sympatické. Zkouším co umí. Do svého cvičného projektu jsem chtěl vložit sloupec s hodnocením hvězdičkama. Kdyby to někoho zajímalo, vymyslel jsem to takto:

$grid->addColumnText('vote', 'Hlasování')
    ->addCellAttributes(['width' => '15%'])
    ->setRenderer(function (Katalog $item) use ($voteSelectFacade) {
        $rating = $voteSelectFacade->getRate($item->getId());
        $rates = [1, 2, 3, 4, 5];
        foreach ($rates as $rate) {
            $highLight = $rate <= $rating ? ' text-warning' : '';
            $farFas = $rate <= $rating ? 'fas' : 'far';
            $i[$rate] = Html::el('i', ['class' => $farFas . ' fa-star' . $highLight]);

            $el[$rate] = Html::el('a', ['class' => 'ajax'])
                ->href($this->link("Vote!", $item->getId(), $rate))
                ->setHtml($i[$rate]);
        }

        return Html::el('div')

K tomu ještě nějaké styly:

<style>
    .col-vote a .far, .col-vote a .fas {
        color: gray;
    }
    .col-vote a:hover .far, .col-vote a:hover .fas {
        font-weight: 900;
        color: #ffda6a !important;
    }
</style>

Výsledek je k vidění na http://katalogy.rudolfsvatek.cz. Případné kritické komentáře ohledně SEO katalogů přezíravě ignoruji ;-) – jde spíš o cvičný projekt, kde zkouším spojení Nette, Doctrine2 a Ublaboo.

Editoval svatekr@gmail.com (11. 4. 20:12)

theo
Člen | 53
+
0
-

Snažím se provést update aplikace na současnou verzi Datagridu a narazil jsem na tento problém:

V minulosti bylo možné nastavit přes setDefaultPerPage() metodou výchozí počet položek na stránku. Jedna z možností která tam byla (a zákazník na ni bohužel trvá) je i hodnota all pro zobrazení všech hodnot najednou. Bohužel deklarace této metody se změnila na setDefaultPerPage(int $count), což je sice hezké z hlediska předvidatelnosti hodnot a typové kontroly, ale prakticky to znemožňuje nastavit hodnotu all. Přitom ve zbytku kódu tato logika zůstala zachována, neboť v $itemsPerPageList zůstala ve výčtu výchozích hodnot.

Je to doopravdy rozbité (tak to aspoň podle mě vypadá), nebo jsem jen nepochopil jak to použít?

jikki
Člen | 64
+
0
-

Ahoj,

na předchozí stránce jsem se dočetl, že Ublaboo 6.8.0 by mělo již fungovat s Nette/Forms 3.1.3. Dělal jsem update z 6.2.x na 6.8.0, zkoušel jsme i poslední 6.8.1. Ale při filtrování stále vyhazuje varování:

User Warning
Nette\Forms\Container::getValues() invoked but the form is not valid.

Je tam nějaké jiné řešení, než se vrátit v Nette/Forms 3.0.x ?

Díky moc

jikki
Člen | 64
+
0
-

jikki napsal(a):

Ahoj,

na předchozí stránce jsem se dočetl, že Ublaboo 6.8.0 by mělo již fungovat s Nette/Forms 3.1.3. Dělal jsem update z 6.2.x na 6.8.0, zkoušel jsme i poslední 6.8.1. Ale při filtrování stále vyhazuje varování:

User Warning
Nette\Forms\Container::getValues() invoked but the form is not valid.

Je tam nějaké jiné řešení, než se vrátit v Nette/Forms 3.0.x ?

Díky moc

Ahoj,

Nedalo mi to a znova si s tím hraji. Updatoval jsem vše na poslední verzi Nette/Forms 3.1.3 a Ublaboo 6.8.1.
Zjistil jsem, že filtrování mi v některých tabulkách funguje a jiných ne. Rozdíl byl InlineAdd. Pokud má tabulka InlineAdd, tak filtrování háže výše zmíněnou chybu. Bez InlineAdd funguje filtr v pořádku.
Snad to pomůže autorům udělat opravu.

Díky moc

d@rkWolf
Člen | 136
+
0
-

Zdravím – dá se nějak zablokovat sortování pro určitý řádek v Tree View? Potřeboval bych, aby byla 1.pozice neměnná, aby s ní nešlo hýbat, ani nic dostat před ni. Totálně mi to narušuje fungování systému, protože posunutí čehokoliv nad(nebo pod? jak chcete) „kořen stromu“ je absurdní.

Pavel Janda
Člen | 951
+
0
-

@jikki Mohl bys, pls, poslat PR? Díky

jikki
Člen | 64
+
0
-

Pavel Janda napsal(a):

@jikki Mohl bys, pls, poslat PR? Díky

@PavelJanda Zdá se že PR někdo už vydal a to tak, že potlačil zobrazení toho warningu.

MW
Člen | 606
+
0
-

Zdravím, prosím o radu.

pokud gridu nastavím defaultFilter

$datagrid->setDefaultFilter(['rokdokl' => date('Y')], false);

Tak grid naskočí s defaultním filtrem, ale tlačítkem „Resetovat filter“ se tato hodnota nesmaže ani s parametrem false.

Jak na to prosím? Filtry jinak fungují.

Díky!

dTTb
Člen | 26
+
0
-

Ahoj, narazil sem na drobny bug. Pokud mam jako datasource array/ArrayHash tak big inline editing nefunguje – po kliku na edit tlacitko se v odpovedi neposle cast snippets, cimz nedojde k vykresleni edit formu…
Pri zmene datasource na Nette\Database\Table\Selection editace funguje normalne.

Testovano na ublaboo/datagrid v6.6.1 a v6.7.1.

Pavel Janda
Člen | 951
+
0
-

@dTTb Mohl bys, pls, poslat PR? Díkes! 👍

dTTb
Člen | 26
+
+1
-

@PavelJanda Kdyz prijdu na to jak to fixnout, tak jo.

MW
Člen | 606
+
0
-

Zdravím,

prosím, máte někdo nějaký vzor implementace tlačítka s otevřením modálního okna s dalšími daty?

Hlavně asi řeším, jak si poslat na řádce nějaké ID s pak v handle dotáhnout a vypsat data k dané položce.

Moc prosím o vzor.

Díky!!

TJ00
Člen | 1
+
0
-

Zdravím, snažím se v gridu, který má datasource array, přidat ItemsDetail, ale nic se neděje – ani žádný error.

př.:

$grid->setDataSource([['id' => 1, 'text' => 'TEST']]);

$grid->addColumnText('text', 'Text');

$grid->setItemsDetail(function() { return 'Lorem Ipsum'; });

Mohl by to být bug?