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

chap
Člen | 81
+
0
-

@PavelJanda jak to prosím vypadá s mým pokusem o fix validation scope – #571 ? Už to je problém otevřený skoro dva měsíce (nejprve v jiné větvi) … chtěl bych v tom pomoci jak to jde :) PS: jsem otravný viď, ale tento fix je pro mne poměrně důležitý.

theo
Člen | 57
+
0
-

@PavelJanda Sorry, sledoval jsem špatnou stránku :) Díky, je to perfektní, konečně i my Postgresisti můžeme na plno využít tenhle Datagrid.

Ivorius
Nette Blogger | 119
+
0
-

Nesetkal se někdo s tím, že by mu ublaboo (datagrid-instant-url-refresh) přepisovalo špatně url?

Mám např. url /admin/pages/?type=posts (což je v v modulu Pages – presenter Homepage – action(type) a render(type) – router správně zachycen na ( [<locale [a-z]{2}>/]admin/<module>/<presenter>[/<action>][/<id>] )

Jenže jakmile tam spustím componentu datagridu, tak se zavolá ajaxem grid-refreshState() a ta vrátí payloadem

state: {locale: "cs", grid-page: null, grid-per_page: 40, grid-sort: {created: "DESC"},…}

a následuje přepsání url adresy na něco takového: /admin/pages/?locale=cs&grid-per_page=40&grid-sort%5Bcreated%5D=DESC

Což jednak smaže type a navíc přidá locale (je @persistent), která je defaultní a standardně v url není.

Pokud type přidám do routeru, pak url zůstane správně /admin/pages/posts?locale=cs&grid-per_page=40&grid-sort%5Bcreated%5D=DESC, tzn. že to asi ořízne vše za otazníkem, což by ale asi nemělo?

andros
Člen | 145
+
0
-

Ahoj, prosím o radu. Jak správně v datagridu použít Nextras ORM ?

$grid->setDataSource($this->repository->findAll());

Toto očekává jako vstup: DataSource\IDataSource|array|\DibiFluent|\Dibi\Fluent|Nette\Database\Table\Selection|\Doctrine\ORM\QueryBuilder

Nextras ORM je: Nextras\Orm\Collection\ICollection

Díky za rady.

bohumir
Backer | 3
+
0
-

Ahoj, řešili jste někdo, jak udělat klikací celý řádek v gridu? Jde nám o to, že jsme v jiném gridu měli ikonu v action pro přesměrování na detail (např. kontaktu) a zároveň jsme měli v <tr data-href=„xxx“> a přes JS udělané přesměrování.

Děkuji za pomoc :-)

Rob Bob
Člen | 60
+
0
-

Jde nějak z presenteru zavolat obnovení samostatného snippetu „item detail“?

Pavel Janda
Člen | 977
+
0
-

@RobBob Určitě ano. Zkus vypozorovat ve třídě DataGrid, jak to funguje teď.

Rob Bob
Člen | 60
+
0
-

Tak to asi možné není, celý řádek + item detail je obalený v jedné snippetArea items, bylo by to potřeba rozdělit do dvou. Šlo mi o to, že jsem chtěl, aby po akci (ajaxový odkaz) v item detail zůstal item detail rozbalený a obnovil se pouze vnitřek, takto se obnoví celý řádek a item detail se pochopitelně zavře. Musel bych na to navěsit další JS handler, aby se opět zavolalo otevření item detail.

Pavel Janda
Člen | 977
+
0
-

@Člověk 10 měsíců starý dotaz, ale přeci si na něj dovolím odpovědět: Elasticsearch se již též dá použít jako data source: https://ublaboo.org/…data-source/. :)
Je to nástřel (byť funkční). Pokud by něco scházelo, PR i námitky přijímám.

Editoval Pavel Janda (10. 11. 2017 19:49)

monty
Člen | 66
+
0
-

Ahoj.

Mohu prosím jeden dotaz, nevím si rady…
Především díky Pavle za skvělou komponentu, vypadá moc hezky :)

A teď k dotazu. Načítá se mi hrozně pomalu.
Cache by měla běžet. Při prvním načtení (tabulky, která má 3 záznamy) 7–9s, potom už „jenom“ 6–7s :)

Nevíte, v čem by mohl být háček? Dělám svůj první projekt v Nette a mám z toho všeho hlavu jako balón, takže díky za jakoukoliv radu :)

Peťa

Pavel Janda
Člen | 977
+
0
-

@monty Hoď projekt na github, ať se mrknem. :)

monty
Člen | 66
+
0
-

Pavel Janda napsal(a):

@monty Hoď projekt na github, ať se mrknem. :)

presenter
komponenta
šablona

Snad je to aspoň trochu přehledný :)

Pavel Janda
Člen | 977
+
0
-

@Montanus Hm, tady fakt není jediný důvod, proč by to jelo pomalu. Zkus zakomentovat: {control tagsGrid} – stále je to tak pomalé?

monty
Člen | 66
+
0
-

@PavelJanda Právě, že není…resp, žádná rychlovka to není 500 – 900ms, ale rozhodně ne 6 vteřin :)
Existuje nějaká možnost, jak přes Tracy zjistit, co přesně se jak dlouho načítá?

tagy(s gridem)
homepage

monty
Člen | 66
+
+1
-

Tak jsem web hodil z localu na server a zjistil jsem, že tam to běží o dost rychleji… 800ms – 1,5s.
Což tedy pořád není žádná sláva, ale taky to není ta původní věčnost :)
Takže za to může buď Wamp, nebo Windows :)

Editoval monty (13. 11. 2017 13:10)

sepo
Člen | 69
+
0
-

monty napsal(a):

ako máš nakonfigurovaný host pre DB ?
„localhost“ verzus „127.0.0.1“ ?

monty
Člen | 66
+
0
-

sepo napsal(a):

monty napsal(a):

ako máš nakonfigurovaný host pre DB ?
„localhost“ verzus „127.0.0.1“ ?

Ahoj.

Zkoušel jsem obojí, nehraje to roli, žádná změna :/
Ještě nějaký návrh? To, že je to tak strašidelně pomalý na localhostu není zase až tak zásadní, ale i na tom serveru to není zrovna rychlovka.

Pro srovnání – načítání TTFB
s gridem bez cache – 1,5s
s gridem z cache 1s
stránka bez gridu bez cache 700ms
stránka bez gridu z cache 300ms
sepo
Člen | 69
+
0
-

monty napsal(a):

a toto:
php-mysql-and-ipv6-still-slow

monty
Člen | 66
+
+1
-

@PavelJanda @sepo Zkusil jsem jednu věc…
Vyzkoušel jsem grid ještě v jiným projektu, co mi běží na localu a všechno se zdá být v pořádku.
Existuje možnost, jak zjistit detailnější výpis načítání jednotlivých tříd?
Už ale nevím, jak to víc ořezat, protože v aktuálním presenteru jsem zakázal všechno kromě gridu, presenter mi rozšiřuje přímo základní nette presenter a DI si předávám jen Database\Context.
Bootstrap mám totožný s druhým projektem…

hustý, tak sem na to přišel, je mi úplně blbý to vypustit, ale když už jsem to tady rozpoutal :>

Narozdíl od druhýho projektu jsem měl v configu u latte moc šikovný řádeček…
setTempDirectory(null)

Když jsem zkoušel odpoledne všechno možný, včetně manuálního vynucování cache v šabloně, protože se mi její funkce nějak nezdála, v temp se sice něco tvořilo, ale žádný pozitivní výsledek v načítaní to jinak nemělo…
…no tak už vím proč :D

Tak se mějte, díky za veškerou snahu.

Peťa

Editoval monty (13. 11. 2017 19:25)

pitr82
Člen | 121
+
0
-

@PavelJanda Ahoj,
jen takový dotaz.

Mám grid v komponentě.
při renderu používám standartní vykreslení:

public function render()
	{
		$this->template->setFile(__DIR__ . '/MenuGrid.latte');
		$this->template->render();
	}

Pokud ale nechci použít šablonu, kde je jen definován control

Zkusil jsem použit :

public function render()
	{
		$this['mujGrid']->render();
	}

To ale vyhodí chybu.
U formlářu toto používám běžně …

Nette\InvalidStateException

Cannot send header after HTTP headers have been sent
pitr82
Člen | 121
+
0
-

Ahoj, @PavelJanda
je nějaká možnost jak v TREE-VIEW zobrazit i sloupce z jiné tabulky přes cizí klíč?

Používám Kdyby/Doctrine
i když to joinu, tak mi nic nezobrazí..

$grid->addColumnText('role', 'User role', 'role.name')
Pavel Janda
Člen | 977
+
0
-

@pitr82 A pokud nepoužiješ tree view, tak to jede? Nezdá se mi, že by na to mělo tree view nějaký dopad..

pitr82
Člen | 121
+
+1
-

Pavel Janda napsal(a):

@pitr82 A pokud nepoužiješ tree view, tak to jede? Nezdá se mi, že by na to mělo tree view nějaký dopad..

Sorry, měl jsem chybu v mapování klíče.

Samozřejmě to funguje :-)

cujan
Člen | 410
+
0
-

Caute, dá sa v gride nastavit poradové číslo riadka?

Pavel Janda
Člen | 977
+
0
-

@cujan No jasně. Přidej si jako první sloupec, ve kterém budeš v customRendereru vypisovat $i++. :)

cujan
Člen | 410
+
0
-

Pavel Janda napsal(a):

@cujan No jasně. Přidej si jako první sloupec, ve kterém budeš v customRendereru vypisovat $i++. :)

@PavelJanda a typ stlpca? text?

cujan
Člen | 410
+
0
-

A este jedna vec, potrebujem namapovat na idUser, meno z tabulky users, samozrejme FK mam na tabulku users z idUser na users.id

ale

$grid->addColumnText(‚idUser‘, ‚Meno‘,‚users.name‘);

hodi chybu

No reference found for $ekonomika->ref(users).

kde moze byt problem? rozhoduje aj nazov FK? Pouzivam Nette\Database…

Editoval cujan (21. 11. 2017 13:21)

Pavel Janda
Člen | 977
+
+1
-

@cujan

$rowNumber = 1;
$grid->addColumnText('rowNumber', '#')
	->setRenderer(function() use (& $rowNumber): int { // Intentionally &
		return $rowNumber++;
	});
Pavel Janda
Člen | 977
+
+1
-

@cujan Používáš Nette\Database, nebo Nette\Database\Table? To je rozdíl. :)

cujan
Člen | 410
+
0
-

@PavelJanda nette/database/table/

Pavel Janda
Člen | 977
+
0
-

@cujan
ActiveRow ti umožňuje šáhnout na referenci přes jiný než defaultní sloupec. Dělá se to tuším takto: $item->ref($referencedTable, $throughColumn).

Takže:
1, Buď může použít custom renderer a doplnit tam vlastní $throughColumn
2, Nebo mrkneš na stránky dokumentace, jak to lze udělat rafinovaně jednoduše: https://ublaboo.org/…/data-source#…

cujan
Člen | 410
+
0
-

Pavel Janda napsal(a):

@cujan
ActiveRow ti umožňuje šáhnout na referenci přes jiný než defaultní sloupec. Dělá se to tuším takto: $item->ref($referencedTable, $throughColumn).

Takže:
1, Buď může použít custom renderer a doplnit tam vlastní $throughColumn
2, Nebo mrkneš na stránky dokumentace, jak to lze udělat rafinovaně jednoduše: https://ublaboo.org/…/data-source#…

vdaka funguje…

cujan
Člen | 410
+
0
-

cujan napsal(a):

Pavel Janda napsal(a):

@cujan
ActiveRow ti umožňuje šáhnout na referenci přes jiný než defaultní sloupec. Dělá se to tuším takto: $item->ref($referencedTable, $throughColumn).

Takže:
1, Buď může použít custom renderer a doplnit tam vlastní $throughColumn
2, Nebo mrkneš na stránky dokumentace, jak to lze udělat rafinovaně jednoduše: https://ublaboo.org/…/data-source#…

vdaka funguje…

@PavelJanda
este jedna vec, ked idUser potrebujem tahat meno a priezviko ako to docielim, lebo stlpec s nazvom idUser mozem pridat do gridu iba raz…nie?

Pavel Janda
Člen | 977
+
+1
-

@cujan Pokud to chápu správně, potřebuješ vypsat hodnoty dvou sloupců do jednoho sloupce datagridu. Je to tak?
Buď si tedy udělej concat v query a dej tomu alias, který pak vypíšeš, nebo v custom rendereru vracej $item->ref(‚..‘)->name . ' ' . $item->ref(‚..‘)->anotherField.

marten_cz
Člen | 10
+
0
-

Lze nejak dostat export do multiAction? Jde mi o to, ze bych potreboval dat moznost si stahnout CSV, TSV,… Obe moznosti, jak filtrovane, tak vse. Nechci davat tlacitka vedle sebe, bylo by toho moc. Chtel bych pouzit addMultiAction a tam mit moznost tsv, csv,… Ale nedari se mi najit hezkou cestu. Krome toho si to udelat v presenteru… Neslo by toto zakomponovat? Nejde se k tomu nejak dobre dostat?

Pavel Janda
Člen | 977
+
0
-

@marten_cz A MultiAction nefunguje proč? Nebo co znamená, že to nefunguje?

marten_cz
Člen | 10
+
0
-

@PavelJanda Do MultiAction nelze dat export do CSV. Tedy aniz bych si ho musel napsat sam. Muzu pak udelat PR, ale at nedelam neco, co ma jine reseni.

Moje idea byla oddelit logiku exportu csv z handlu. Pak bych ji byl schopen pouzit i odjinud. Do multiaction pak muzu pridat ->addExportCsv. Vpodstate to same, co je ted primo na gridu. S tim, ze by to dostalo parametry z getu a nebylo vazano pouze na id exportu. Pak to muze fungovat i na formular, kde si uzivatel naklika format, v jakem chce export.

Nebo to nechces primo v gridu a resit si to mimo nej?

Pavel Janda
Člen | 977
+
0
-

@marten_cz Moc se mi nezdá, že je to celé kvůli tomu, že se ti nelíbí víc tlačítek vedle sebe. Být tebou extendnu šablonu datagridu a nahradím megajednoduše block exports… Teď vypadá takto:

<span n:block="exports">
	{foreach $exports as $export}{$export->render()}{/foreach}
</span>

Z toho můžeš klidně udělat dropdown. :) Obal to celé listem a jednotlivé exporty pak dej jako list-item. Simple, right?

andros
Člen | 145
+
0
-

Ahoj, řeším teď s gridem jeden problém a pořád nemůžu přijít na řešení. Proto bych Vás rád požádal o radu.
Mám tabulku do které mám joinem připojený další sloupec z jiné tabulky. např. seznam knih se sloupcem autor, který je navázán z jiné tabulky přes id. Pak mám inline editaci, včetně sloupce autor. Jenže abych mohl autora uložit DB, potřebuji po odeslání formuláře vědět i jeho id. Zároveň ale nechci, aby to id bylo možné editovat.

když chci editovat nějaký sloupec, udělám to jednoduše:

$grid->addInlineEdit()
			->onControlAdd[] = function ($container) {
			$container->addText('author', '');
		};

Jenže k autorovi, bych potřeboval i jeho id. Pokud id přidám jako další sloupec a nastavím jej jako setDefaultHide(), nezobrazí se mi hodnota v odeslaném formuláři.

Prosím, napadne někoho nějaké řešení ? Předem díky moc.

Pavel Janda
Člen | 977
+
0
-

@andros $container->addHidden('id', $id)?

andros
Člen | 145
+
0
-

Pavel Janda napsal(a):

@andros $container->addHidden('id', $id)?

Tohle jsem zkoušel jako první, ale já potřebuji $item->id, jenže nemám $item.

$grid->addInlineEdit()
			->onControlAdd[] = function ($container) {
		$container->addHidden('id', $id)

Item mám až v:

$grid->getInlineEdit()->onSetDefaults[] = function ($container, $item) {

$container->setDefaults([
				'id' => $item->id
			]);

};

Něco dělám určitě špatně , ale co :(

Pavel Janda
Člen | 977
+
0
-

@andros I see. Tak si do toho prvního callbacku to ID nějak propašuj. :)

Čamo
Člen | 786
+
0
-

Zdravím,
narazil som na problém pri použití group by. Paginator s tým vôbec nepočíta. Raz zobrazí nadbytočné prázdne stránky inokedy nezobrazí paginator vôbec. Je to bug alebo sa to dá nejako riešiť?

Vyzerá to tak, že sa to tu už preberalo https://forum.nette.org/…any-datagrid?p=18 ale bez odpovede.

Editoval Čamo (1. 12. 2017 23:07)

andros
Člen | 145
+
0
-

Pavel Janda napsal(a):

@andros I see. Tak si do toho prvního callbacku to ID nějak propašuj. :)

@PavelJanda No právě :) Vůbec nemůžu přijít na to, jak :)

nocturne32
Člen | 21
+
0
-

Ahoj, jak funguje addColumnTitle (atd)? Já jen jestli by šlo udělat, abych do jedné metody mohl dát více sloupců z db. (něco jako addColumnMultipleText(‚key‘, ‚name‘, ‚COLUMNS‘))
Chtěl bych si přidat metodu, která mi bude vykreslovat něco takového:

(edit)

+----------------------------------+
|           Titulek článku         |  //link
|	  		   (autor)	 		   |  //pouze text
+----------------------------------+

Editoval nocturne32 (3. 12. 2017 16:52)

Pavel Janda
Člen | 977
+
0
-

@nocturne32 Úplně nerozumím tomu, čeho chceš dosáhnout, ale nepomohl by ti custom column template, případě custom renderer?

nocturne32
Člen | 21
+
0
-

Pavel Janda napsal(a):

@nocturne32 Úplně nerozumím tomu, čeho chceš dosáhnout, ale nepomohl by ti custom column template, případě custom renderer?

@PavelJanda Pardon, nepodíval jsem se jak vypadá můj příspěvek. Updatoval jsem to.

Editoval nocturne32 (3. 12. 2017 16:48)

Pavel Janda
Člen | 977
+
0
-

@nocturne32 No a můj příspěvek jsi si nepřečetl? :)
https://ublaboo.org/datagrid/column#…
https://ublaboo.org/…rid/template#…

nocturne32
Člen | 21
+
0
-

Pavel Janda napsal(a):

@nocturne32 No a můj příspěvek jsi si nepřečetl? :)
https://ublaboo.org/datagrid/column#…
https://ublaboo.org/…rid/template#…

Jej. Úplně mi tohle uniklo. Děkuju :)

igor.pocta
Člen | 100
+
0
-

Ahoj,

prosím poradíte? Když mám aktivní dva filtry a jeden zruším, tak se zruší oba. Na stránkách datagridu se ale zruší pouze ten požadovaný. Netuším, kde je chyba. Používám Doctrine2 jako zdroj a v několika případech používám i vlastní podmínky (setCondition).

Datagrid vypadá takto (zkusil jsem jak addFilterText, tak setFilterText a problém to nevyřešilo).

$grid->addColumnNumber('id', 'article.id');
$grid->addFilterText('id', 'article.id', 'article.id');
$grid->addColumnLink('title', 'article.title', 'Article:show', 'article.title');
$grid->addFilterText('title', 'article.title', 'article.title')
     ->setPlaceholder('article.placeholder');
// ...