Nový Nette DataGrid pro Bootstrap s možností vypsat strom

mesour
Nette Blogger | 236
+
+3
-

Verze 2.0.5 je venku :-)

Změny:

  • Opraveno množství chyb v DataSourcech. Hlavně Dibi a Array.
  • Opraven bug v defaultním filtru (mizení checkboxů po AJAXu)
  • Pro grid byly přidány eventy: onRenderRow, onRenderBody a onRenderHeader, takže je možné nastavit HTML attribut třeba pro <tr> nebo <thead>, <tbody>.
  • Přidána možnost nastavit column pro selection. Lze vrátit metodou $grid->getSelectionColumn().
  • Opravena chyba se zavíráním defaultních filtrů po vybrání checkboxu
  • Opravný bug v custom filtru
  • Přidána možnost nastavit rychlé volby pro výběr checkboxů u enableSelection()
  • Přidána většina nejdůležitějších testů pro DataSourcy

Rychlé volby pro selection checkboxy je možné vidět zde http://grid.mesour.com/version2/full/#…. Má také metodu addDivider. Výsledek se zobrazí po kliku na šipečku u main checkboxu v hlavičce gridu.

Zde je přehled všech onRender… eventů i s ukázkou dat, která přijdou v parametrech: http://grid.mesour.com/…on2/setting/#…

PS: Sandbox i API byly také aktualizovány.

Editoval mesour (7. 3. 2015 22:08)

FJP
Člen | 124
+
0
-

Ahoj, stáhl jsem si 2.0.5 ale pořád mi nejde filtrování.

Je možný, že to je pořadím scriptů?

		<script src="{$basePath}/3rd-party/jquery-2.1.3.min.js"></script>
		<script src="{$basePath}/3rd-party/bootstrap-3-2-0-dist/js/bootstrap.min.js"></script>
		<script src="{$basePath}/3rd-party/jquery.nette.js"></script>
		<script src="{$basePath}/3rd-party/jquery.ui.js"></script>
		<script src="{$basePath}/js/netteForms.js"></script>
		<script src="{$basePath}/js/main.js"></script>

Firebug hlásí ReferenceError: $ is not defined :

…iv').width()+(a.find(‚a‘).length*4))})};$(document).on(‚ready‘,function(){$('.tr…

mesour
Nette Blogger | 236
+
+1
-

FJP napsal(a):

Ahoj, stáhl jsem si 2.0.5 ale pořád mi nejde filtrování.

Je možný, že to je pořadím scriptů?

		<script src="{$basePath}/3rd-party/jquery-2.1.3.min.js"></script>
		<script src="{$basePath}/3rd-party/bootstrap-3-2-0-dist/js/bootstrap.min.js"></script>
		<script src="{$basePath}/3rd-party/jquery.nette.js"></script>
		<script src="{$basePath}/3rd-party/jquery.ui.js"></script>
		<script src="{$basePath}/js/netteForms.js"></script>
		<script src="{$basePath}/js/main.js"></script>

Firebug hlásí ReferenceError: $ is not defined :

…iv').width()+(a.find(‚a‘).length*4))})};$(document).on(‚ready‘,function(){$('.tr…

Ahoj, jj, jde o to, že je potřeba načítat jQuery už v hlavičce stránky, pokud požíváš defaultní renderování javascriptů gridu. Takhle to funguje už od počátku věků gridu :-)

FJP
Člen | 124
+
0
-

Čau čau,
grid mi jede neskutečně pomalu – ordering i custom filtr, spíš vůbec, chová se to divně. Nevíte čím to může být?

Většinou se kousne prohlížeč a vyhodí to chybu skriptu …/scripts/jquery.js:452

Používám NetteDbDataSource a v té konkrétní tabulce je cca 400 položek, stránka po 20. Přijde mi, že to by nemělo být až tak náročné.

EDIT: Ještě jedna věc – stalo se mi, že nefunguje btn status – odkaz se vygeneruje, ale nic se po kliknutí neděje. Tak jsem to musel pořešit vcelku prasácky následovně:

		$that = $this;
		$grid->addText('confirmed', 'Potvrzeno')
			->setCallback(function($row) use($that) {
				if($row['confirmed'])
					return '<a href="?termId=' . $that->termId . '&ident=' . $row['id'] . '&confirmed=0&do=changeConfirmed" class="btn btn-success"><b class="glyphicon glyphicon-ok-circle"></b></a>';
				else
					return '<a href="?termId=' . $that->termId . '&ident=' . $row['id'] . '&confirmed=1&do=changeConfirmed" class="btn btn-danger"><b class="glyphicon glyphicon-ban-circle"></b></a>';
			});

Editoval FJP (2. 4. 2015 8:20)

mertljara
Člen | 4
+
0
-

Ahoj, super grid.
možná blbý dotaz, ale jak lze prosím co nejjednodušeji zobrazit název v řádku přes cizí klíč místo id. používám NetteDbDataSource.
normálně $row->cizi_tabulka->name
díky moc.

FJP
Člen | 124
+
0
-

mertljara napsal(a):

Ahoj, super grid.
možná blbý dotaz, ale jak lze prosím co nejjednodušeji zobrazit název v řádku přes cizí klíč místo id. používám NetteDbDataSource.
normálně $row->cizi_tabulka->name
díky moc.

Myslím, že na to musíš použít callback.

mertljara
Člen | 4
+
0
-

callback me napadl, ale nejak se mi to nedari rozchodit :(

ruppy
Člen | 2
+
0
-

Na začátek, jsem lama a v php nedělám od dob stvoření kola.
Nicméně mám asi podobny problém.
S nette začínám a k php jsem se vrátil po x letech (nebojte neživím se tím :) Možná by chtělo trochu lepší tutoriál, dva dny jsem strávil na použití modelu, použití usermanager do teď moc nechápu.. jak si vytvořím třeba zkušební heslo do db přes ty všechny hashe, mixi a tak?). Grid jsem ale nakonec rozchodil vcelku snadno. Přidávání, editaci taky. Jen mám většinu sloupců v něm přes cizí klíč. Zkusil jsem dle jedné části zde na fóru
<?php protected function createComponentHomeGrid($name) {
$selection = $this->database->table(‚tasks‘)
->select(‚user.user_surname user_id, location.name location_id, category.cat_name category_id, subtext, lasttime, nexttime‘); ?>
funguje, spojí a vypíše, jen ale nefiltruje přes filter u těchto sloupců:(

Editoval ruppy (2. 4. 2015 0:04)

FJP
Člen | 124
+
0
-

mertljara napsal(a):

callback me napadl, ale nejak se mi to nedari rozchodit :(

Pošli kód

mertljara
Člen | 4
+
0
-

toto:

	$grid->addText('groups_id', 'Skupina')->setCallback(function($row)  {
			return $this->groupsRepository->get($row['groups_id'])->name;
		});

funguje to jak má, jen to přidává zbytečně dotazy do dtb pokaždý. to se mi moc nelibi. jediny co me napadlo je vytáhnout si jednou skupiny, hodit do pole a pak si to zobrazovat.

A nevím jak to zobrazit ve filtru aniž bych si musel delat vlastni sablonu

Editoval mertljara (2. 4. 2015 11:28)

mesour
Nette Blogger | 236
+
0
-

mertljara napsal(a):

toto:

	$grid->addText('groups_id', 'Skupina')->setCallback(function($row)  {
			return $this->groupsRepository->get($row['groups_id'])->name;
		});

funguje to jak má, jen to přidává zbytečně dotazy do dtb pokaždý. to se mi moc nelibi. jediny co me napadlo je vytáhnout si jednou skupiny, hodit do pole a pak si to zobrazovat.

A nevím jak to zobrazit ve filtru aniž bych si musel delat vlastni sablonu

Bohužel grid zatím nemá podporu zobrazování názvů z číselníků přes klíč. Takže u filtru je zatím potřeba mít minimálně vlastní formulář.

Je možné si data uložit jak píšeš, například do property presenteru a následně to pak použít v callbacku, asi takto.

$this->all_groups = $this->groupsRepository->getAllPairs(); // returns array where: ID => name

$grid->addText('groups_id', 'Skupina')->setCallback(function($row)  {
 	return $this->all_groups[$row['groups_id']];
	//tohle by fungovalo pro PHP >= 5.4
});
//pro PHP <= 5.3
$this->all_groups = $this->groupsRepository->getAllPairs();

$grid->addText('groups_id', 'Skupina')
	->setCallback(function($row, $that)  {
 		return $that->all_groups[$row['groups_id']];
	})
	->setCallbackArgs(array($this));

Editoval mesour (2. 4. 2015 14:17)

mertljara
Člen | 4
+
0
-

Díky za potvrzení a kód.
Filtr se tedy mrknu na vlastni šablonu.

Díky moc za super grid se super dokumentací.

rihot
Člen | 16
+
0
-

Ahoj,
je možnost nastavit při vykreslení určitý filter napr(id=1).

FJP
Člen | 124
+
0
-

Ahoj, jak můžu udělat z text column odkaz jinak než pomocí callbacku?

$lecturers = $this->context->people->getAllLectors();
		$grid->addText('lecturer_id', 'Lector')
			->setCallback(function($row) use ($lecturers) {
				if (array_key_exists($row['lecturer_id'], $lecturers))
					return '<a href="/www/administrace/people/edit/' . $row['lecturer_id'] . '">' . $lecturers[$row['lecturer_id']] . '</a>';
				else
					return $row['lecturer_id'];
			});

Je tam nevýhoda, že nelze použít nettí n:href.

Další pokus byl: V dokumentaci jsou fce setAttributes (už není v api) a setAttribute – ale tu jsem asi špatně pochopil, domníval jsem se, že funguje podobně jako u addButton (ale i tak bych nevěděl, jak tam vepsat id lektora – pouze id daného řádku jako $table_id.

FJP
Člen | 124
+
0
-

bezsebesam napsal(a):

svobodai napsal(a):

bezsebesam napsal(a):

svobodai napsal(a):

bezsebesam napsal(a):

Můžu se ještě připomenout s těmi ostatními dotazy, které jsem měl? Bylo to ohledně načtení dat z jiné tabulky přes cizí klíč, šířky sloupců a filtrů.

Ohledně načtení dat z jiné tabulky je to jednoduché pokud používáš NetteDatabase a pokud máš právně udělané tabulky viz database-selection.
Co se týče šířky sloupců tam to musíš řešit přes CSS.

Můžeš sem prosím hodit nějakou jednoduchou ukázku ohledně toho provázání tabulek? Díky.

Toto je kód v PHP

$selection = $this->database->table('PlayLists');
$selection->select(
	'PlayCount, Pieces.IdPiece IdPiece, Pieces.Name PieceName, Pieces.ISRC , Pieces.OZ ,Pieces.Interprets.Name InterpretName, ' .
	'Broadcasts.IdBroadcast IdBroadcast, Broadcasts.Name BroadcastName, ' .
	'Broadcasts.Stations.IdStation IdStation, Broadcasts.Stations.Name StationName, ' .
	'Broadcasts.Stations.Payers.IdPayer IdPayer, Broadcasts.Stations.Payers.Name PayerName');

a tomu odpovídající SQL

SELECT [PlayCount],[Pieces].[IdPiece]
[IdPiece], [Pieces].[Name] [PieceName], [Pieces].ISRC , [Pieces].OZ ,[Interprets].[Name]
[InterpretName], [Broadcasts].[IdBroadcast] [IdBroadcast], [Broadcasts].[Name] [BroadcastName],
[Stations].[IdStation] [IdStation], [Stations].[Name] [StationName], [Payers].[IdPayer] [IdPayer],
[Payers].[Name] [PayerName]
FROM [PlayLists]
LEFT JOIN [Pieces] ON [PlayLists].[Pieces_IdPiece] = [Pieces].[IdPiece]
LEFT JOIN [Interprets] ON [Pieces].[Interprets_IdInterpret] = [Interprets].[IdInterpret]
LEFT JOIN [Broadcasts] ON [PlayLists].[Broadcasts_IdBroadcast] = [Broadcasts].[IdBroadcast]
LEFT JOIN [Stations] ON [Broadcasts].[Stations_IdStation] = [Stations].[IdStation]
LEFT JOIN [Payers] ON [Stations].[Payers_IdPayer] = [Payers].[IdPayer]

To by asi šlo. Díky.
Mě jen zajímalo, jestli neexistuje něco, jako je v Grido metoda setColumn(), viz http://o5.github.io/…tion.cs.html#…

Trošku jsem se tebou inspiroval. Ale složený sql příkaz přes selection select se mi nepovedlo složit. Nakonec jsem to udělal takto:

$selection = $this->db->query('SELECT * FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();

Ale pohořel jsem na následující chybě: Found duplicate columns in database result set.
Lze to nějak obejít? V tabulce product_lang můžu mít víc stejných položek se stejným id jako v product. A „id“ měnit už nemůžu.

svobodai
Člen | 136
+
0
-

FJP napsal(a):

bezsebesam napsal(a):

svobodai napsal(a):

bezsebesam napsal(a):

svobodai napsal(a):

bezsebesam napsal(a):

Můžu se ještě připomenout s těmi ostatními dotazy, které jsem měl? Bylo to ohledně načtení dat z jiné tabulky přes cizí klíč, šířky sloupců a filtrů.

Ohledně načtení dat z jiné tabulky je to jednoduché pokud používáš NetteDatabase a pokud máš právně udělané tabulky viz database-selection.
Co se týče šířky sloupců tam to musíš řešit přes CSS.

Můžeš sem prosím hodit nějakou jednoduchou ukázku ohledně toho provázání tabulek? Díky.

Toto je kód v PHP

$selection = $this->database->table('PlayLists');
$selection->select(
	'PlayCount, Pieces.IdPiece IdPiece, Pieces.Name PieceName, Pieces.ISRC , Pieces.OZ ,Pieces.Interprets.Name InterpretName, ' .
	'Broadcasts.IdBroadcast IdBroadcast, Broadcasts.Name BroadcastName, ' .
	'Broadcasts.Stations.IdStation IdStation, Broadcasts.Stations.Name StationName, ' .
	'Broadcasts.Stations.Payers.IdPayer IdPayer, Broadcasts.Stations.Payers.Name PayerName');

a tomu odpovídající SQL

SELECT [PlayCount],[Pieces].[IdPiece]
[IdPiece], [Pieces].[Name] [PieceName], [Pieces].ISRC , [Pieces].OZ ,[Interprets].[Name]
[InterpretName], [Broadcasts].[IdBroadcast] [IdBroadcast], [Broadcasts].[Name] [BroadcastName],
[Stations].[IdStation] [IdStation], [Stations].[Name] [StationName], [Payers].[IdPayer] [IdPayer],
[Payers].[Name] [PayerName]
FROM [PlayLists]
LEFT JOIN [Pieces] ON [PlayLists].[Pieces_IdPiece] = [Pieces].[IdPiece]
LEFT JOIN [Interprets] ON [Pieces].[Interprets_IdInterpret] = [Interprets].[IdInterpret]
LEFT JOIN [Broadcasts] ON [PlayLists].[Broadcasts_IdBroadcast] = [Broadcasts].[IdBroadcast]
LEFT JOIN [Stations] ON [Broadcasts].[Stations_IdStation] = [Stations].[IdStation]
LEFT JOIN [Payers] ON [Stations].[Payers_IdPayer] = [Payers].[IdPayer]

To by asi šlo. Díky.
Mě jen zajímalo, jestli neexistuje něco, jako je v Grido metoda setColumn(), viz http://o5.github.io/…tion.cs.html#…

Trošku jsem se tebou inspiroval. Ale složený sql příkaz přes selection select se mi nepovedlo složit. Nakonec jsem to udělal takto:

$selection = $this->db->query('SELECT * FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();

Ale pohořel jsem na následující chybě: Found duplicate columns in database result set.
Lze to nějak obejít? V tabulce product_lang můžu mít víc stejných položek se stejným id jako v product. A „id“ měnit už nemůžu.

Myslím, že budeš muse vypsat v selectu, které sloupce se mají použít. Předpokládám, že máš v každé tabulce ID a to může být problém. budeš muset v select upravit product_lang.id as product_lang_id a pak v gridu budeš pracovat s tím názvem as

FJP
Člen | 124
+
0
-

svobodai napsal(a):
Myslím, že budeš muse vypsat v selectu, které sloupce se mají použít. Předpokládám, že máš v každé tabulce ID a to může být problém. budeš muset v select upravit product_lang.id as product_lang_id a pak v gridu budeš pracovat s tím názvem as

Pokrok :) díky. Akorát jsem nikde nenašel, jak tohle:

$selection = $this->db->query('SELECT product.id, product.code, product_lang.id AS product_lang_id, product_lang.title FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();

převést do selection, teď dostávám tenhle error:
Argument 1 passed to Mesour\DataGrid\NetteDbDataSource::__construct() must be an instance of Nette\Database\Table\Selection, array given, called in …

Editoval FJP (15. 4. 2015 12:20)

svobodai
Člen | 136
+
0
-

FJP napsal(a):

svobodai napsal(a):
Myslím, že budeš muse vypsat v selectu, které sloupce se mají použít. Předpokládám, že máš v každé tabulce ID a to může být problém. budeš muset v select upravit product_lang.id as product_lang_id a pak v gridu budeš pracovat s tím názvem as

Pokrok :) díky. Akorát jsem nikde nenašel, jak tohle:

$selection = $this->db->query('SELECT product.id, product.code, product_lang.id AS product_lang_id, product_lang.title FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();

převést do selection, teď dostávám tenhle error:
Argument 1 passed to Mesour\DataGrid\NetteDbDataSource::__construct() must be an instance of Nette\Database\Table\Selection, array given, called in …

je to třeba takhle

$selection = $this->database->table('product');
$selection->select(
  'product.id, product.code, ' .
  'product_lang.id product_lang_id, product_lang.title product_lang_title');

Hodně záleží jak máš navržené tabulky, protože se to tam joinuje automaticky na základě určitých pravidel. Když tak se podívej na NotORM nebo na dokumentaci NeteDatabase

Editoval svobodai (15. 4. 2015 12:29)

FJP
Člen | 124
+
0
-

svobodai napsal(a):

FJP napsal(a):

svobodai napsal(a):
Myslím, že budeš muse vypsat v selectu, které sloupce se mají použít. Předpokládám, že máš v každé tabulce ID a to může být problém. budeš muset v select upravit product_lang.id as product_lang_id a pak v gridu budeš pracovat s tím názvem as

Pokrok :) díky. Akorát jsem nikde nenašel, jak tohle:

$selection = $this->db->query('SELECT product.id, product.code, product_lang.id AS product_lang_id, product_lang.title FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();

převést do selection, teď dostávám tenhle error:
Argument 1 passed to Mesour\DataGrid\NetteDbDataSource::__construct() must be an instance of Nette\Database\Table\Selection, array given, called in …

je to třeba takhle

$selection = $this->database->table('product');
$selection->select(
  'product.id, product.code, ' .
  'product_lang.id product_lang_id, product_lang.title product_lang_title');

Hodně záleží jak máš navržené tabulky, protože se to tam joinuje automaticky na základě určitých pravidel. Když tak se podívej na NotORM nebo na dokumentaci NeteDatabase

No reference found for $product->product_lang … a přitom tam tu vazbu mám. Mohl bys mě prosím konkrétněji nasměrovat v té dokumentaci?

svobodai
Člen | 136
+
+1
-

FJP napsal(a):

svobodai napsal(a):

FJP napsal(a):

svobodai napsal(a):
Myslím, že budeš muse vypsat v selectu, které sloupce se mají použít. Předpokládám, že máš v každé tabulce ID a to může být problém. budeš muset v select upravit product_lang.id as product_lang_id a pak v gridu budeš pracovat s tím názvem as

Pokrok :) díky. Akorát jsem nikde nenašel, jak tohle:

$selection = $this->db->query('SELECT product.id, product.code, product_lang.id AS product_lang_id, product_lang.title FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();

převést do selection, teď dostávám tenhle error:
Argument 1 passed to Mesour\DataGrid\NetteDbDataSource::__construct() must be an instance of Nette\Database\Table\Selection, array given, called in …

je to třeba takhle

$selection = $this->database->table('product');
$selection->select(
  'product.id, product.code, ' .
  'product_lang.id product_lang_id, product_lang.title product_lang_title');

Hodně záleží jak máš navržené tabulky, protože se to tam joinuje automaticky na základě určitých pravidel. Když tak se podívej na NotORM nebo na dokumentaci NeteDatabase

No reference found for $product->product_lang … a přitom tam tu vazbu mám. Mohl bys mě prosím konkrétněji nasměrovat v té dokumentaci?

Jak by měly vypadat vbazby mezi tabulkami je popsané v Database table a potom Database Selection. Jinak ti určitě poradí strýček Google.

Editoval svobodai (15. 4. 2015 13:47)

FJP
Člen | 124
+
0
-

Ahoj,
udělal jsem si vlastní filtr form:

	protected function createComponentUserFilter() {
		$form = new Form;
		$form->addText('code', 'Kód')->setAttribute('placeholder', 'Kód');
		$form->addText('title_cs', 'Název ČJ')->setAttribute('placeholder', 'Název ČJ');
		$form->addCheckbox('accreditation', 'Akreditovaný')->setDefaultValue(false);
		$form->addCheckbox('certification', 'Certifikovaný')->setDefaultValue(false);
		$form->addCheckbox('is_new', 'Nový')->setDefaultValue(false);
		$form->addSelect('status_id', 'Status', $this->status)->setPrompt('Status');
		$form->addSubmit('filter', 'Filtrovat')->setAttribute('class', 'btn-sm');
		$form->addSubmit('reset', 'Reset')->setAttribute('class', 'btn-sm');
		return $form;
	}

trochu mě zlobí checkboxy – když jsou zaškrnuty, změny se projevují až po F5, jinak to šlape normálně.

mesour
Nette Blogger | 236
+
0
-

FJP napsal(a):

Ahoj,
udělal jsem si vlastní filtr form:

	// ...

trochu mě zlobí checkboxy – když jsou zaškrnuty, změny se projevují až po F5, jinak to šlape normálně.

Na ty checkboxy se podívám.

mesour
Nette Blogger | 236
+
+1
-

FJP napsal(a):

Ahoj, jak můžu udělat z text column odkaz jinak než pomocí callbacku?

$lecturers = $this->context->people->getAllLectors();
		$grid->addText('lecturer_id', 'Lector')
			->setCallback(function($row) use ($lecturers) {
				if (array_key_exists($row['lecturer_id'], $lecturers))
					return '<a href="/www/administrace/people/edit/' . $row['lecturer_id'] . '">' . $lecturers[$row['lecturer_id']] . '</a>';
				else
					return $row['lecturer_id'];
			});

Je tam nevýhoda, že nelze použít nettí n:href.

Další pokus byl: V dokumentaci jsou fce setAttributes (už není v api) a setAttribute – ale tu jsem asi špatně pochopil, domníval jsem se, že funguje podobně jako u addButton (ale i tak bych nevěděl, jak tam vepsat id lektora – pouze id daného řádku jako $table_id.

1.
Odkaz uděláš nejlíp tak, že použiješ Column\Text, který bude v callbacku vracet instanci Buttonu. V tom případě bys tam musel nějak dostat presenter, což bys musel i tak, když by jsi chtěl dělat link. Což je možné, ale přemýšlím, že by se na to dal upravit sloupec Actions, pak by jen Buttonu vždy stačilo pro každý řádek měnit text a link :-)

2.
Třeba classu podle ID řádku nastavíš přes onRender metody: http://grid.mesour.com/…on2/setting/#…. Ale pozor je tam vždy jen jedna instance sloupce. Takže to co změníš na jednom řádku se promítne do dalších následujících, pokud to neošetříš.

Editoval mesour (17. 4. 2015 15:35)

kralik
Člen | 230
+
0
-

Ahoj,
používáte někdo označování řádku přes $grid->onRenderRow[] v závislosti na hodnotě proměnné?
Snažím se jej použít, ale nedaří se mi.
Dostávám hlášku

<?php
Argument 1 passed to App\Presenters\HomePresenter::App\Presenters\{closure}() must be an instance of App\Presenters\Mesour\DataGrid\Render\Row, instance of Mesour\DataGrid\Render\Table\Row given
?>

Nemáte prosím někdo funkční řešení, na webu MesourGridu jsem nenašel.
Moc díky

Díky

mesour
Nette Blogger | 236
+
0
-

kralik napsal(a):

Ahoj,
používáte někdo označování řádku přes $grid->onRenderRow[] v závislosti na hodnotě proměnné?
Snažím se jej použít, ale nedaří se mi.
Dostávám hlášku

<?php
Argument 1 passed to App\Presenters\HomePresenter::App\Presenters\{closure}() must be an instance of App\Presenters\Mesour\DataGrid\Render\Row, instance of Mesour\DataGrid\Render\Table\Row given
?>

Nemáte prosím někdo funkční řešení, na webu MesourGridu jsem nenašel.
Moc díky

Díky

Ahoj někde tam máš špatný namespace, takže ti asi chybí alespoň „use Mesour;“. App\Presenters\Mesour\DataGrid\Render\Row je špatně, je to \Mesour\DataGrid\Render\Row, potom to půjde, protože Mesour\DataGrid\Render\Table\Row dědí od Redner\Row.

FJP
Člen | 124
+
0
-

mesour napsal(a):

FJP napsal(a):

Ahoj,
udělal jsem si vlastní filtr form:

	// ...

trochu mě zlobí checkboxy – když jsou zaškrnuty, změny se projevují až po F5, jinak to šlape normálně.

Na ty checkboxy se podívám.

Ahoj, nekoukal jsi na to?

mesour
Nette Blogger | 236
+
+1
-

Po delší prodlevě je v2.0.6 venku :-)

Změny:

  • Fixnutý default filter – otevření dropdownu se nyní ukládá do cookies přes JS → byl odstraněn zbytečný request na server
  • Trochu poupraveny default filtry, například skrytí při kliku kdekoliv na stránku
  • Přidán button pro reset default filtru
  • Pager se nyní zobrazuje jen pokud je více stránek než 1
  • Přidána metoda setDisabled pro DropDown a Button
  • Fixnutá hodnota 0 v defaultním filtru – 0 se nezobrazovala
  • Pro vlastní sloupce s filtrem a sortováním stačí pouze podědit od Columns\BaseOrdering nebo Columns\Filter. Columns\Filter je abstraktní a její potomci musejí mít metodu getTemplateFile.
  • Přidán strip_tags pro exportované hodnoty
  • Upraveny názvy JS a přesunuto do složky public/
  • Celé JS zrevidovány a trochu upraveny

Byl také přidán Travis CI: https://travis-ci.org/mesour/DataGrid

PS:
Zvažuji pro verzi 2.1.+ oddělit DropDown a Button jako samostatný composer package a DataGrid ho bude pouze požadovat. Stejně tak ArrayManager pro ArrayDataSource se bude nejspíš instalovat zvlášť.

DropDown a Button by pak mělo být možné použít i mimo Nette. Pro Nette tam bude pouze implementace Linku.

Dnes byl grid nainstalován po tisícé :-) Total downloads

Editoval mesour (6. 5. 2015 23:49)

mesour
Nette Blogger | 236
+
0
-

FJP napsal(a):

mesour napsal(a):

FJP napsal(a):

Ahoj,
udělal jsem si vlastní filtr form:

	// ...

trochu mě zlobí checkboxy – když jsou zaškrnuty, změny se projevují až po F5, jinak to šlape normálně.

Na ty checkboxy se podívám.

Ahoj, nekoukal jsi na to?

Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.

FJP
Člen | 124
+
0
-

mesour napsal(a):
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.

Supr, díky mrknu na to.

mesour napsal(a):
Odkaz uděláš nejlíp tak, že použiješ Column\Text, který bude v callbacku vracet instanci Buttonu. V tom
případě bys tam musel nějak dostat presenter

Mohl bys prosím nastínit, jak na to? Včetně dostání presenteru do sloupce. Nebo jestli to je někde v dokumentaci asi jsem to z toho nepochopil.

Editoval FJP (7. 5. 2015 17:05)

mesour
Nette Blogger | 236
+
+1
-

FJP napsal(a):

mesour napsal(a):
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.

Supr, díky mrknu na to.

mesour napsal(a):
Odkaz uděláš nejlíp tak, že použiješ Column\Text, který bude v callbacku vracet instanci Buttonu. V tom
případě bys tam musel nějak dostat presenter

Mohl bys prosím nastínit, jak na to? Včetně dostání presenteru do sloupce. Nebo jestli to je někde v dokumentaci asi jsem to z toho nepochopil.

Asi takto v PHP 5.4+. Můžu normálně použít this nebo přes use

$grid->addText('name', 'Name')
	->setCallback(function() {
        $button = new Components\Button(array(), $this);
        $button->setButtonClasses(''); // nastavím žádnou nebo vlastní classu
        // případně další nastavení
        return $button; // má metodu __toString, takže mohu vrátit instanci
    });

V PHP 5.3 takto:

$grid->addText('name', 'Name')
	->setCallback(function($data, $that) {
        $button = new Components\Button(array(), $that);
        $button->setButtonClasses(''); // nastavím žádnou nebo vlastní classu
        // případně další nastavení
        return $button; // má metodu __toString, takže mohu vrátit instanci
    })
    ->setCallbackArguments(array($this));

Jen pro info tak předběžně. Od verze 2.1 už asi Grid nebude podporovat PHP 5.3 ale pouze 5.4 a vyšší. Je to jen předpoklad, takže ještě přesné info napíši při vydání 2.1 :-)

kralik
Člen | 230
+
0
-

Ahoj,
lidi prosím nesetkali jste se s problémem při řazení s používáním NetteDatabase a MS SQL.
Při kliknutí v MesourDataGridu na sloupec pro řazení se objeví tato hláška.

<?php
SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]A column has been specified more than once in the order by list. Columns in the order by list must be unique.
?>

Query

<?php
SELECT [Actions].[Id],[Sector].[Name] [Sector],[Problems].[Id] [ProblemId],[Problems].[Subject]
[Subject],[Actions].[DescriptionCz],[Actions].[DescriptionEn],[Actions].[Pilot],
[Actions].[ALevel],[Actions].[WeekDeadline], [Status].[Id] [StatusId], [Status].[Name]
[Status],[Actions].[Created],[User].[SureName] [UserAddName], ABS([Workload].T20) [Nar]
FROM [Actions]
LEFT JOIN [Sector] ON [Actions].[Sector_Id] = [Sector].[Id]
LEFT JOIN [Problems] ON [Actions].[Problems] = [Problems].[Id]
LEFT JOIN [Status] ON [Actions].[Status] = [Status].[Id]
LEFT JOIN [User] ON [Actions].[AddUser] = [User].[Id]
LEFT JOIN [Workload] ON [Actions].[Workload_Id] = [Workload].[Id]
WHERE (YEAR([Actions].[DateDeadline]) = '2015') AND ([Actions].[Pilot] IN (1)) AND
([Actions].[Status] IN (1, 2))
ORDER BY [WeekDeadline], [WeekDeadline] ASC
?>

Zjistil jsem, že v QUERY je navíc v ORDER BY ten sloupec, na který se klikne pro řazení.

Query která je plně funkční

<?php
SELECT [Actions].[Id],[Sector].[Name] [Sector],[Problems].[Id] [ProblemId],[Problems].[Subject]
[Subject],[Actions].[DescriptionCz],[Actions].[DescriptionEn],[Actions].[Pilot],
[Actions].[ALevel],[Actions].[WeekDeadline], [Status].[Id] [StatusId], [Status].[Name]
[Status],[Actions].[Created],[User].[SureName] [UserAddName], ABS([Workload].T20) [Nar]
FROM [Actions]
LEFT JOIN [Sector] ON [Actions].[Sector_Id] = [Sector].[Id]
LEFT JOIN [Problems] ON [Actions].[Problems] = [Problems].[Id]
LEFT JOIN [Status] ON [Actions].[Status] = [Status].[Id]
LEFT JOIN [User] ON [Actions].[AddUser] = [User].[Id]
LEFT JOIN [Workload] ON [Actions].[Workload_Id] = [Workload].[Id]
WHERE (YEAR([Actions].[DateDeadline]) = '2015') AND ([Actions].[Pilot] IN (1)) AND
([Actions].[Status] IN (1, 2))
ORDER BY [WeekDeadline] ASC
?>

Asi to nebude problém v MesourDataGridu, ale někde v samotném Nette, ale zkoušel jsem různé verze 2.2.3, 2.2.9 i aktuální 2.3.2.
Verze PHP je 5.4.16.
Pokaždé se to chová stejně, tedy výše uvedená chyba.

Prosím poraďte.
Díky
Tom

EDIT: Zjistil jsem, že SqlBuilder.php složí správnou query „SELECT TOP 60 id,name,role,skupina,manufactory FROM [users] ORDER BY name ASC“, ale pravděpodobně JS někde v mesaour datagridu přidá do order ještě ten samý sloupec a tím způsobí chybu.

Bohužel jsem nenašel kde je funkce ketrá se volá pro ordering v mesouru.

Řešil jste někdo podobný bug?
Díky

Editoval kralik (26. 6. 2015 13:22)

FJP
Člen | 124
+
0
-

mesour napsal(a):
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.

Pustil jsem se do updatu a zjistil jsem, že checboxy se nyní nezobrazují a filtr vůbec nereaguje (cookies i cache jsem promazal, 2.0.5ka mi filtrovala ok). Stránkování, ordering etc. šlape dobře

Editoval FJP (12. 5. 2015 11:10)

mesour
Nette Blogger | 236
+
0
-

FJP napsal(a):

mesour napsal(a):
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.

Pustil jsem se do updatu a zjistil jsem, že checboxy se nyní nezobrazují a filtr vůbec nereaguje (cookies i cache jsem promazal, 2.0.5ka mi filtrovala ok). Stránkování, ordering etc. šlape dobře

A updatoval jsi JavaScripty? Právě, že přesně u checkboxů a filtru jsem měnil celou inicializaci a u stránkování a orderingu to zůstalo stejné.

kralik
Člen | 230
+
0
-

Zkouším aktuální verzi 2.0.6, ale nedaří se mi rozjet ordering.
S jedním sloupečkem máme stále problém stejně jako viz. výše UNIQUE.
Ostatní sice chybu nehlásí ale také se neprovede řazení.

Prosím kde může být chyba.
JS bych řekl, že mám, dle zdrojového kódu stránky.

Díky

FJP
Člen | 124
+
0
-

mesour napsal(a):

FJP napsal(a):

mesour napsal(a):
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.

Pustil jsem se do updatu a zjistil jsem, že checboxy se nyní nezobrazují a filtr vůbec nereaguje (cookies i cache jsem promazal, 2.0.5ka mi filtrovala ok). Stránkování, ordering etc. šlape dobře

A updatoval jsi JavaScripty? Právě, že přesně u checkboxů a filtru jsem měnil celou inicializaci a u stránkování a orderingu to zůstalo stejné.

Skripty by měly být ok. Hlásí to tuhle chybu: "":https://onedrive.live.com/redir?…

mesour
Nette Blogger | 236
+
0
-

FJP napsal(a):

Skripty by měly být ok. Hlásí to tuhle chybu: "":https://onedrive.live.com/redir?…

Jasně, byl tam bug. Díky za report :-) Je to opravené v dev-master.

Určitě jsi měl tu chybu na gridu, kde byl použitý custom filter form ne?

FJP
Člen | 124
+
0
-

mesour napsal(a):

FJP napsal(a):

Skripty by měly být ok. Hlásí to tuhle chybu: "":https://onedrive.live.com/redir?…

Jasně, byl tam bug. Díky za report :-) Je to opravené v dev-master.

Určitě jsi měl tu chybu na gridu, kde byl použitý custom filter form ne?

Taky díky, už to funguje ;) jj custom filter tam byl.

FJP
Člen | 124
+
0
-

Ad checkboxy: už tě asi musím pěkne trolit :) … když checkbox zaškrtnu a dám filtrovat, potom odškrtnu a kliknu opět na filtrovat – je znova označený.

Když dám tlačítko F5 odškrtnu a dám filtrovat, je to ok a checkbox se teprve teď odškrtne (dělá to firefox i chrome)

kralik
Člen | 230
+
0
-

Ahoj lidi,
podařilo se někomu rozjet filtrování?

Bohužel mě se rozjet filtrování nedaří.
Mám tím na mysli custom filter.

Dostávám chybu:

<?php
TypeError: mesour.dataGrid.gridUsers is undefined
<script>mesour.dataGrid["gridUsers"].filterValues = [];</script>
?>

Kód jsem vůči webu http://grid.mesour.com/version2/full/ kontroloval, ale nemůžu na to přijít.
Stáhnul jsem si i grid skrze composer a nic.

Díky za pomoc

mesour
Nette Blogger | 236
+
0
-

kralik napsal(a):

Ahoj lidi,
podařilo se někomu rozjet filtrování?

Bohužel mě se rozjet filtrování nedaří.
Mám tím na mysli custom filter.

Dostávám chybu:

<?php
TypeError: mesour.dataGrid.gridUsers is undefined
<script>mesour.dataGrid["gridUsers"].filterValues = [];</script>
?>

Kód jsem vůči webu http://grid.mesour.com/version2/full/ kontroloval, ale nemůžu na to přijít.
Stáhnul jsem si i grid skrze composer a nic.

Díky za pomoc

Zkus si stáhnout dev-master.

kralik
Člen | 230
+
0
-

mesour napsal(a):

kralik napsal(a):

Ahoj lidi,
podařilo se někomu rozjet filtrování?

Bohužel mě se rozjet filtrování nedaří.
Mám tím na mysli custom filter.

Dostávám chybu:

<?php
TypeError: mesour.dataGrid.gridUsers is undefined
<script>mesour.dataGrid["gridUsers"].filterValues = [];</script>
?>

Kód jsem vůči webu http://grid.mesour.com/version2/full/ kontroloval, ale nemůžu na to přijít.
Stáhnul jsem si i grid skrze composer a nic.

Díky za pomoc

Zkus si stáhnout dev-master.

Ahoj,
ano dev-master pomohla, plně funkční.

Díky
Tom

kralik
Člen | 230
+
0
-

Ahoj,
chtěl bych požádat jak elegantně řešit (řešíte) inline editaci záznamu ID další tabulky.

Tabulka akce: id,nazev,sektor_id (1,Test,1)
Tabulka sektor: id,nazev (1,Kuchyně)

Mám DataGrid s pohledem na Akce, tedy 1,Test, Kuchyně a chtěl bych inline editovat sloupec Sektor.
Aby jsem záznam rozklikl a objevil se select box s hodnotami pro výběr.

Toto by bylo super.

Řešíte to nějak?

Díky

fronty
Člen | 16
+
+1
-

Ahoj,

prvně velké díky @mesour za výborný plugin, vadila mi na něm ale absence podpory nette.ajax.js od @VojtěchDobeš, nad kterým mám postavených několik extensions, jako např. zobrazení loaderu, který chci zobrazovat i při přenačítání tabulky.
Řešením je úprava inicializace nette.ajax.js, prvně je potřeba odepnout defaultní handler a pak připnout handler z nette.ajax. Jednoduše místo:

<script>
$.nette.init();
</script>

inicializujte:

<script>
$.nette.init(function (ajaxHandler) {
	$(document)
		.off('click.mesour-ajax') // Unbind default handler
		.off('.nette') // Unbind previously binded .nette handler
		.on('click.nette', 'a.ajax,a.mesour-ajax', ajaxHandler); // Bind nette.ajax handler
});
</script>

Ještě hezčím řešením je v továrničce komponenty vypnutí CSS a JS, které jsou vkládány přímo do HTML <body>, což se mi minimálně v případě CSS vůbec nelíbí. Bootstrap styl zůstane zachován, ve vlastním CSS je potřeba si jen pohrát se zobrazováním ikon smyslu seřazení v hlavičce tabulky. Po vypnutí JS není potřeba odepínat defaultní .mesour-ajax handler. Odstaněním JS se zruší podpora pokročilejších funkcí gridu (drag'n'drop apod.), ale pro jednoduchý setříditelný a stránkovatelný grid to stačí.

<?php
Mesour\DataGrid\Grid::disableJsDraw();
Mesour\DataGrid\Grid::disableCssDraw();
?>
Phalanx
Člen | 310
+
0
-

Ahoj, chtěl bych se zeptat jak je možné udělat odkaz na jiný server v Actions. Potřebuju tam použít $row a setCallback u metody addButton není.

Ukázka: http://www.jinyserver.cz/{$row[‚identifier‘]}

V dokumentaci jsem řešení nenašel
http://grid.mesour.com/…umn/actions/

mesour
Nette Blogger | 236
+
0
-

Phalanx napsal(a):

Ahoj, chtěl bych se zeptat jak je možné udělat odkaz na jiný server v Actions. Potřebuju tam použít $row a setCallback u metody addButton není.

Ukázka: http://www.jinyserver.cz/{$row[‚identifier‘]}

V dokumentaci jsem řešení nenašel
http://grid.mesour.com/…umn/actions/

Ahoj link má metodu setUseNetteLink nebo konstantu USE_NETTE_LINK. Tím pádem se pak link nepřekládá pomocí metody link na presenteru.

mesour
Nette Blogger | 236
+
0
-

fronty napsal(a):

Ahoj,

prvně velké díky @mesour za výborný plugin, vadila mi na něm ale absence podpory nette.ajax.js od @VojtěchDobeš, nad kterým mám postavených několik extensions, jako např. zobrazení loaderu, který chci zobrazovat i při přenačítání tabulky.
Řešením je úprava inicializace nette.ajax.js, prvně je potřeba odepnout defaultní handler a pak připnout handler z nette.ajax. Jednoduše místo:

<script>
$.nette.init();
</script>

inicializujte:

<script>
$.nette.init(function (ajaxHandler) {
	$(document)
		.off('click.mesour-ajax') // Unbind default handler
		.off('.nette') // Unbind previously binded .nette handler
		.on('click.nette', 'a.ajax,a.mesour-ajax', ajaxHandler); // Bind nette.ajax handler
});
</script>

Ještě hezčím řešením je v továrničce komponenty vypnutí CSS a JS, které jsou vkládány přímo do HTML <body>, což se mi minimálně v případě CSS vůbec nelíbí. Bootstrap styl zůstane zachován, ve vlastním CSS je potřeba si jen pohrát se zobrazováním ikon smyslu seřazení v hlavičce tabulky. Po vypnutí JS není potřeba odepínat defaultní .mesour-ajax handler. Odstaněním JS se zruší podpora pokročilejších funkcí gridu (drag'n'drop apod.), ale pro jednoduchý setříditelný a stránkovatelný grid to stačí.

<?php
Mesour\DataGrid\Grid::disableJsDraw();
Mesour\DataGrid\Grid::disableCssDraw();
?>

Ahoj. nette.ajax.js je v plánu zapracovat, jen jsem se k tomu zatím nedostal a zatím nebudu slibovat, kdy se dostanu.

mesour
Nette Blogger | 236
+
0
-

kralik napsal(a):

Ahoj,
chtěl bych požádat jak elegantně řešit (řešíte) inline editaci záznamu ID další tabulky.

Tabulka akce: id,nazev,sektor_id (1,Test,1)
Tabulka sektor: id,nazev (1,Kuchyně)

Mám DataGrid s pohledem na Akce, tedy 1,Test, Kuchyně a chtěl bych inline editovat sloupec Sektor.
Aby jsem záznam rozklikl a objevil se select box s hodnotami pro výběr.

Toto by bylo super.

Řešíte to nějak?

Díky

Tohle už mám udělané v nové plánované verzi 2.2. Zapracuji i do současné verze, viz komnetář pod tímto. Bude to pak fungovat tak, že na DataSourcu se nastaví přes metodu setRelation relace na daný sloupec + tabulka a tak. Grid pak už sám pozná, že se jedná o relaci, zobrazí správně data z číselníku a rovnou funguje i inline editace. Funguje to pak i pro ArrayDataSource.

Editoval mesour (7. 7. 2015 14:12)

mesour
Nette Blogger | 236
+
+1
-

Zdravím všechny, jen pro info. Plánuji verzi 2.2.0 Už je skoro připravená, chybí mi pouze udělat sloupec Template, zapracovat SubGridy a udělat deprecated classu dědící od Nette\…\Control.

Jde o to, že od verze 2.2 už nebude grid vůbec závislý na Nette a bude rozdělený na více composer balíčků. Pro link a session přibudou nějaké bridge, časem pak minimálně ještě pro Symphony, ale půjde použít i na čistém PHP 5.4+ s ext json. Pak plánuji ještě (bug fixy a menší nové nejnutnější featury) verze 2.1.x minimálně ještě půl roku, možná rok, ale to se ještě uvidí, v každém případě dám včas vědět, jak to přesně bude.

Snad na každé části gridu bude něco vylepšené, přidané a někde i opravené maličkosti, kterých si doteď ani nikdo nevšiml nebo o nich nenapsal.

Ještě bych se chtěl omluvit všem za aktivitu v poslední době. Dost mě už urgujete i na mailu a já prostě nestíhám občas ani všem odepisovat, za to se omlouvám. Mám ale všechny maily označené a zpětně odpovím na všechny. Měl jsem teď takové hodně hektické období, ale už se to pomalu uklidnilo, takže v průběhu července už bych to chtěl zase trochu posunout. Neříkám, že do konce července vyjde nová desetinková verze, ale alespoň nějaké opravy a menší nové featury na současné verzi by teoreticky mohly přijít, ale nic neslibuji :-)

Hlavně tedy budu jako první zapracovávat podporu nette.ajax.js od @VojtěchDobeš a podporu relací na číselníky pro editaci a vykreslení do sloupce Text.

Díky všem za trpělivost :)

Editoval mesour (7. 7. 2015 14:18)

jEhLa
Člen | 70
+
0
-

Ve verzi 2.0.6 asi stejná chyba:
https://forum.nette.org/…vypsat-strom?p=6

FJP napsal(a):

Ahoj,

čučím do toho jako vůl… vidíte někdo chybu? Filtrování vůbec nechce reagovat. Díky za pomoc.

	protected function createComponentUsersDataGrid($name) {
		$selection = $this->context->users->findAll();
		$source = new NetteDbDataSource($selection);

		$table_id = 'id';

		$grid = new Grid($this, $name);

		$grid->setLocale('cs');
		$grid->setPrimaryKey($table_id);
		$grid->setDataSource($source);

		$grid->enableFilter($this['userFilter']); // here set your form component

		$filter_values = $grid->getFilterValues(); // get values from filter

		// using custom filtering
		if (empty($filter_values) === FALSE) {
			if (isset($filter_values['name_surname']) && !empty($filter_values['name_surname'])) {
				$source->where('CONCAT(first_name, " ", last_name) LIKE ?', '%' . $filter_values['name_surname'] . '%');
			}
			if (isset($filter_values['email']) && !empty($filter_values['email'])) {
				$source->where('email LIKE ?', '%' . $filter_values['email'] . '%');
			}
			if (isset($filter_values['id']) && !empty($filter_values['id'])) {
				$source->where('id = ?', $filter_values['id']);
			}
		}

		(...)

	}

	protected function createComponentUserFilter() {
		$form = new Form;
		$form->addText('id', 'ID')->setAttribute('placeholder', 'ID');
		$form->addText('name_surname', 'Jméno, příjmení')->setAttribute('placeholder', 'Jméno, příjmení');
		$form->addText('email', 'E-mail')->setAttribute('placeholder', 'E-mail');
		$form->addSubmit('filter', 'Filtrovat');
		$form->addSubmit('reset', 'Reset');
		return $form;
	}

A u defaultního filtru se mi nerozbalují dropdowny a nereaguje ani tlačítko RESET.

Po použití defaultního filtru, nedojde k vyhledání. Ani následně filter nejde znovu otevřít. Nefunguje RESET.

Když jsem si zkusil udělat UserFilter, neodesílá se ajaxem a proměnná $filter_values zůstává prázdným polem.

mesour
Nette Blogger | 236
+
0
-

jEhLa napsal(a):

Ve verzi 2.0.6 asi stejná chyba:
https://forum.nette.org/…vypsat-strom?p=6

FJP napsal(a):

Ahoj,

čučím do toho jako vůl… vidíte někdo chybu? Filtrování vůbec nechce reagovat. Díky za pomoc.

	protected function createComponentUsersDataGrid($name) {
		$selection = $this->context->users->findAll();
		$source = new NetteDbDataSource($selection);

		$table_id = 'id';

		$grid = new Grid($this, $name);

		$grid->setLocale('cs');
		$grid->setPrimaryKey($table_id);
		$grid->setDataSource($source);

		$grid->enableFilter($this['userFilter']); // here set your form component

		$filter_values = $grid->getFilterValues(); // get values from filter

		// using custom filtering
		if (empty($filter_values) === FALSE) {
			if (isset($filter_values['name_surname']) && !empty($filter_values['name_surname'])) {
				$source->where('CONCAT(first_name, " ", last_name) LIKE ?', '%' . $filter_values['name_surname'] . '%');
			}
			if (isset($filter_values['email']) && !empty($filter_values['email'])) {
				$source->where('email LIKE ?', '%' . $filter_values['email'] . '%');
			}
			if (isset($filter_values['id']) && !empty($filter_values['id'])) {
				$source->where('id = ?', $filter_values['id']);
			}
		}

		(...)

	}

	protected function createComponentUserFilter() {
		$form = new Form;
		$form->addText('id', 'ID')->setAttribute('placeholder', 'ID');
		$form->addText('name_surname', 'Jméno, příjmení')->setAttribute('placeholder', 'Jméno, příjmení');
		$form->addText('email', 'E-mail')->setAttribute('placeholder', 'E-mail');
		$form->addSubmit('filter', 'Filtrovat');
		$form->addSubmit('reset', 'Reset');
		return $form;
	}

A u defaultního filtru se mi nerozbalují dropdowny a nereaguje ani tlačítko RESET.

Po použití defaultního filtru, nedojde k vyhledání. Ani následně filter nejde znovu otevřít. Nefunguje RESET.

Když jsem si zkusil udělat UserFilter, neodesílá se ajaxem a proměnná $filter_values zůstává prázdným polem.

Použij dev-master viz: https://forum.nette.org/…vypsat-strom?p=7