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

Sami_
Člen | 13
+
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 | 370
+
+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 | 370
+
+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 | 13
+
+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 | 312
+
+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 | 600
+
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 | 133
+
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 | 133
+
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 | 600
+
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 | 948
+
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 | 948
+
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 | 364
+
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)