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

Pavel Janda
Člen | 977
+
0
-

@Ivorius To by se mi líbilo! Pošleš PR? :D
Pokud nezvládneš PR, založil bys, prosím, issue?

Pavel Janda
Člen | 977
+
0
-

@iNviNho Včera blbnul celý server, už by to mělo být vyřešené. Funguje?

sepo
Člen | 69
+
0
-

Pavel Janda napsal(a):

@iNviNho Včera blbnul celý server, už by to mělo být vyřešené. Funguje?

500

Ivorius
Nette Blogger | 119
+
0
-

Jak mohu nechat při použití nette database table (selection) jako Datasource vypsat např. uživatele u objednávky? Myslel jsem, že bude fungovat něco jako u doctriny

<?php $grid->addColumnText('user', 'Uživatel', 'user.login'); ?>

Ale vyhazuje to Cannot read an undeclared column user.login z ActiveRow

Cizí klíč u tabulky orders je nad sloupcem user_id ⇒ tabulka users. Discovered reflection.

Editoval Ivorius (7. 12. 2016 21:17)

Ivorius
Nette Blogger | 119
+
0
-

Jediné, co mi zatím funguje je

		$grid->addColumnText('user', 'Uživatel')
			->setRenderer(function ($item) {
				if ($item->user)
					return $item->user->login;
				else
					return null;
			});
Ivorius
Nette Blogger | 119
+
0
-

Pavel Janda napsal(a):

@Ivorius http://ublaboo.org/…/data-source#…

To jsem zkoušel jako první, ale říkal jsem si že to je určené pro relaci has many, kdežto já chci jen has one (tedy objednávka má jen jednoho reg. uživatele (nebo mít taky nemusí).

$grid->addColumnText('user', 'Uživatel', ':users.login');

Každopádně výsledek je No reference found for $orders->related(users)

Možná to nějak bude souviset s NDBT, třeba že do datasource předám jen Selection na tabulku orders?

Přidáno
Pokud zkusím
$grid->setDataSource($selection->select('orders.*,user.login AS login'));
tak funguje i
$grid->addColumnText('user', 'Uživatel', 'login');
ale nevím jestli je toto doporučený postup.

Editoval Ivorius (8. 12. 2016 10:01)

Pavel Janda
Člen | 977
+
0
-

@Ivorius Tohle mi přijde naprosto korektní: $grid->setDataSource($selection->select('orders.*,user.login AS login'));

sepo
Člen | 69
+
0
-

Pavel Janda napsal(a):

Nová verze – v5.0.0

  • Přibyla možnost zresetovat filtr jednoho sloupce přes malou ikonku v záhlaví cloupce

Ahoj

Toto sa na deme správa rozdielne pri gride na podstránke „overview“ a inak pri gride podstránke „filter“.
Na „overview“ sa dá reset vykonať na konkrétnom stĺpci, pri „filter“ sa resetuje celý filter cez všetky stĺpce. Čím to je ?

Pavel Janda
Člen | 977
+
0
-

@sepo Díky za report, fixnuto ve v5.0.1.

Web aktualizován.

sepo
Člen | 69
+
0
-

Pavel Janda napsal(a):

Nová verze – v5.0.0

Ahoj

pri zmene hide/show sa nemení popis u button-u, chcelo by to meniť popis u button-u „Show filter“ / „Hide filter“ podľa stavu.

Pavel Janda
Člen | 977
+
0
-

@sepo Dobrý nápad, pošleš PR? :)

sepo
Člen | 69
+
-1
-

Pavel Janda napsal(a):

@sepo Dobrý nápad, pošleš PR? :)

to je nad moje možnosti :-)

Ivorius
Nette Blogger | 119
+
0
-

Dá se nějak docílit toho, aby addColumnStatus nepřekládal své option?

exquis
Člen | 83
+
0
-

Ahoj, řeším podobný problém s datagridem a doctrinou:

  1. Při filtrování např. dle description nic nevyfiltruje
  2. Při řazení dle sloupce vyhodí výjimku „Cannot use object of type Hi5\System\Log as array“
public function createComponentHistorieAkci()
  {
      $Grid = new DataGrid();

      \DataGridTranslator::translate($Grid);

      $Grid->setItemsPerPageList(self::GRID_ITEMS_PER_PAGE);

      $Grid->setDataSource($this->EM->getRepository(Log::class)->findAll());
      $Grid->setDefaultSort(["date" => "DESC"]);

      $Grid->addExportCsv('Export do CSV', 'historie_akci.csv', 'windows-1250', ',');

      $Grid->addColumnDateTime("date", "Datum")->setSortable()->getElementPrototype("th")->addAttributes(["width" => "120px"])->setFilterDate();
      $Grid->addColumnText("description", "Popis")->setFilterText();

      return $Grid;
  }

dořešilo se to nějak posledně?

Ivorius
Nette Blogger | 119
+
0
-

Nevíte proč se mi nedaří zprovoznit autosubmit na filtrech? Koukám se do konzole a vždycky to při výběru ze selectu vyhodí tuto js error

Snažím se to rozchodit v rámci webpacku – konfigurace a tam zřejmě bude zakopaný pes. Nevěděl by někdo jak na to?

iguana007
Člen | 970
+
0
-

exquis napsal(a):

Ahoj, řeším podobný problém s datagridem a doctrinou:

dořešilo se to nějak posledně?

Zde je moje reseni, ktere funguje: https://forum.nette.org/…any-datagrid?p=13

Josef Dohnal
Člen | 1
+
+1
-

http://ublaboo.org/ mi vrací 500. Používám často příklady. Dělá to jen mě?

flamengo
Člen | 135
+
0
-

@PavelJanda http://ublaboo.org/ nefunguje:

Server Error
We're sorry! The server encountered an internal error and was unable to complete your request. Please try again later.

Potřeboval bych nahlédnout do dokumentace.
Třeba toto od mé poslední verze nefunguje:

$td = $tr->getElementPrototype('td')
	->class('media-icon');

A určitě toho bude víc co jsem tak zběžne koukal.Předem díky.

Editoval flamengo (18. 12. 2016 17:11)

Pavel Janda
Člen | 977
+
0
-

@flamengo Na serveru došlo místo pro session. :P Fixed.

Editoval Pavel Janda (18. 12. 2016 18:51)

esorimer
Člen | 114
+
0
-

Zdravím,
dá se nějak udělat, aby byli (některé) sloupce ve všech řádkách v edit módu (bez klikání na „edit“ ikonku) a dali se všechny naráz uložit jedním tlačítkem? Třeba nějak přes vlastní templaty …

Pavel Janda
Člen | 977
+
0
-

@esorimer Ideální podporu pro tohle datagrid nemá. Ale pomocí custom šablon + JS bys měl asi kýženého efektu dosáhnout snadno. V šabloně si naházej data atributy (id) k inputům a tvoje tlačítko pak jenom triggeruje odeslání všech těchto dat na server. Uložíš a je to.

radas
Člen | 224
+
0
-

Ahoj,
používám verzi 5.0.1. A nedaří se mi nastavit třídu do jednotlivých buněk. Třída se zkrátka nepřidá.

$grid->addColumnText(...)
  ->getElementPrototype('td')
  ->addAttributes(['class' => 'danger']);

Ani podmíněně:

$grid->addColumnCallback('title', function($column, $item)
{
  if (strlen($item->offsetGet('title')) === 0)
    $column->addAttributes(['class' => 'danger']);
});

A dále mě trápí ještě jedna věc ohledně filtrování. Nevím, jestli dělám něco špatně. Problém je v tom, že chci filtrovat podle sloupce, který má nastaven alias.

$grid->addColumnText('item_default', 'Položka')
  ->setSortable()
  ->setFilterText();

Po odeslání filtru dojde k chybě „Unknown column ‚item_default‘ in ‚where clause‘“. Přitom třeba sortování funguje nad takovým sloupcem bez problému. Vím, že to je záležitost MySQL. Ale dá se to nějak v datagridu nastavit?

SELECT `id`, `item_cs` AS `item_default`
FROM `tree_multilang`
WHERE (`item_default` LIKE '%nehody%' COLLATE utf8_general_ci)
ORDER BY `id` ASC

Díky moc.

igor.pocta
Člen | 100
+
0
-

Ahoj,

měl bych několik otázek:

  1. Podporuje datagrid alternativní identifikátor? Např. Ramsey\Uuid\DegradedUuid
  2. Pokud ano, tak jak ho správně nastavit? Můj případ je následující:

Mám tabulku se stránkami, chci si vypsat grid se seznamem článků (např. sloupce Id a title). Nezobrazí to žádný (v patičce mám Items: 0 – 0 from 20 a v těle mi to píše No items found.)… Když se podívám na SQL debugger, vidím, že to vytváří následující dotaz:

SELECT p0_.id AS id_0, p0_.title AS title_1, ... FROM page p0_ WHERE p0_.id IN (Ramsey\Uuid\DegradedUuid, Ramsey\Uuid\DegradedUuid) ORDER BY p0_.id ASC

Když to zaměním za standardní ID, tak to v tomhle stavu funguje. Už jsem na to narazil a raději to přepsal :)

  1. Naběhne mi stránka, pak se spustí nějaký ajaxový request na pozadí. Kdyý se dokončí, přepíše mi mojí URL adresu /page/show/(UUID) na /page/show/(NIC) a např. obnovení stránku skončí chybou, protože mu chybí vstupní parametr. Netušíte proč?

Mé nastavení gridu:

		/** @var QueryBuilder $qb */
    $qb = $this->_em->getRepository(Page::class)->createQueryBuilder('pr');

    /** @var DataGrid */
    $grid = new DataGrid($this, $name);
    $grid->setTranslator($this->translator);
    $grid->setDataSource($qb);
    $grid->setColumnsHideable();

    $p = $this;

    // ID
    $grid->addColumnText('id', 'pages.id')
        ->setAlign('center')
			->setDefaultHide()
        ->addAttributes(["width" => "8%"]);

    $grid->addColumnText('title', 'pages.title');
    return $grid;
}

Díky za nápady

Klobasa
Člen | 16
+
0
-

Ahoj,

je možné nastavit datagrid tak, aby vypisoval všechny řádky automaticky a uživatel neměl možnost měnit si počet zobrazených řádek?

Děkuji

Pavel Janda
Člen | 977
+
+1
-

@Klobasa Ano, viz http://ublaboo.org/datagrid/

Buď lze vypnout stránkování úplně ($grid->setPagination(FALSE);), nebo nastavit napevno: $grid->setItemsPerPageList([2000]);

Člověk
Člen | 1
+
+1
-

Ahoj Pavle,

chtěl bych se zeptat zda bude tvůj datagrid v blízké době podporovat Elasticsearch jakožto datasource? Elasticsearch je v poslední době nejen v Nette komunitě velice populární, takže si myslím, že je vhodné ho zařadit i do tvého datagridu :-)

Pavel Janda
Člen | 977
+
0
-

@Člověk Super nápad. Založíš issue na githubu? Do issue klidně sypej jakékoliv nápady k tomu datasource. Samozřejmě PR by byl nejlepší! :)

iNviNho
Člen | 352
+
0
-

Ahojte,

Ako som updatoval datagrid na dev-master nedokážem rozchodiť aby mi do td elementov tabuľky dopisovalo nasledovne atributy:

<?php
$grid->addColumnDateTime("parameter.odoslaneBaTo", "v PHA")
                ->getElementPrototype("td")
                ->addAttributes([
                    "data-editable" => "true",
                    "data-type" => "odoslaneBaTo"
                ]);

?>

Po dumpe:

Ublaboo\DataGrid\Column\ColumnDateTime #0586
align protected => "right" (5)
format protected => "j. n. Y" (7)
replacements protected => array ()
renderer protected => NULL
template protected => NULL
sortable protected => FALSE
translatable_header protected => TRUE
sortable_reset_pagination protected => FALSE
sortable_callback protected => NULL
sort protected => NULL
template_escaping protected => TRUE
header_escaping protected => FALSE
template_variables protected => array ()
editable_callback protected => NULL
editable_element protected => array (2)
0 => "textarea" (8)
1 => array (1)
class => "form-control" (12)
default_hide protected => FALSE
key protected => "parameter.odoslaneBaTo" (22)
name protected => "v PHA" (5)
grid protected => Ublaboo\DataGrid\DataGrid #24a7
column protected => "parameter.odoslaneBaTo" (22)

A výsledný element má iba

class="text-right col-parameter.prisloBa2"

Vôbec nerozumiem :-\

Skúsil som obnovu zo zálohy na staršiu verziu datagridu a už mi to opäť funguje :-\ Je možné v zistiť akú mám aktuálnu verziu? V composery je len dev-master ale to bolo pár mesiacov dozadu :-\

Editoval iNviNho (5. 1. 2017 16:28)

thirdknown
Člen | 26
+
0
-

Používám jako dataSource doctrine query builder.

<?php
$qb = $em->getRepository(Task::class)->createQueryBuilder(Task:class);
$grid->setDataSource($qb);
?>

Entitou zde je Task. Každý Task má „řešitele“ $worker:

<?php
/**
* @ManyToOne(targetEntity="App\Sign\Model\Actor")
* @JoinColumn(name="worker", referencedColumnName="id")
*/
public $worker;
?>

V gridu zobrazuji první jméno „řešitele“. To jde.
Ale už nejde filtrování:

<?php
$grid->addColumnText('worker_name', 'Řešitel', 'worker.firstName');
$grid->addFilterText('worker_name', 'Řešitel', 'worker.firstName');
?>

Pro filtrování dostávám:
Doctrine\ORM\Query\QueryException
[Semantical Error] line 0, col 63 near ‚worker.firstName‘: Error: ‚worker‘ is not defined.
apod.

Hledal jsem, co dělám špatně, zkoušel jsem různé kompinace addFilterText(), bohužel jsem na nic nepřišel.

Můžu poprosit o pomoc, co je špatně? Díky.

flamengo
Člen | 135
+
0
-

@PavelJanda Kód z dokumentace:

$th = $grid->addColumnText('name', 'Name')
    ->getElementPrototype('td'); // Or element element <th> via Column::getElementPrototype('th')
$th->data('foo', 'bar');
$th->class('super-column')

$grid->addColumnText('name', 'Name')
    ->addAttributes(['class' => 'text-center']);

nefunguje :( Dle composer.json „ublaboo/datagrid“: „^5.0“

Přidávat css třídy buňkám v tabulce je pro mne opravdu základní funkce, bez toho je pro mne bohužel grid nepoužitelný a musím se vrátit na starou verzi, co jsem měl upravenou.

A jak multisort? někde jsem četl, že to bylo dodáno do verze 5, ale také mi to nefunguje.

$grid->setMultiSortEnabled($enabled = TRUE);
$grid->setDefaultSort(['name' => 'ASC', 'id' => 'ASC']);

Nebo najde někde v dokumentaci popis jak nastavit?

Kdyžtak předem díky.

Editoval flamengo (7. 1. 2017 15:25)

Pavel Janda
Člen | 977
+
+1
-

@iNviNho @flamengo Atributy a elementy th/td jsou fixnuté zatím v neotagované verzi, ještě dnes otestuji a releasnu.

@flamengo Co znamená, že nefunguje? Máš aktuální assety?

sevca79
Člen | 55
+
0
-

Ahoj,
umí tvůj datagrid filtrování od-do z datumu a času? Né jen po celých dnech??
případně díky za navedení..
díky…

Pavel Janda
Člen | 977
+
0
-

@sevca79 Momentálně to neumí. Musela by zvolit jiná JS knihovna a přidat FitlerDateTime.

Právě z toho důvodu teď vymýšlím způsob, jak nechat uživatele používat vlastní třídy filtrů (tím pádem vlastní JS knihovny, vlastní filtrování). Nějaká geniální nápad? :)

Pavel Janda
Člen | 977
+
0
-

@thirdknown Pravděpodobně ti tam chybí leftJoin('task.worker').

Twinity
Člen | 2
+
0
-

Dá se nastavit action na základě nějaký podmínky?
Jakože každý řádek by měl přístupnou jinou action. Nikde nic takovýho nemůžu najít…

Pavel Janda
Člen | 977
+
0
-

@Twinity Jo

Edit: :D DataGrid::allowRowsAction(), pohledám link do docu
Edit2: http://ublaboo.org/datagrid/row#…

Editoval Pavel Janda (13. 1. 2017 15:21)

igor.pocta
Člen | 100
+
0
-

Funguje správně přidání atributů?

Mám nastaveno tohle a nikam se ta šířka nepropsala :/

$dataGrid->addColumnText('title', 'grid.title')
			->addAttributes(["width" => "8%"])
            ->setFilterText('title')
            ->setCondition(function ($qb, $value) {
                /** @var QueryBuilder $qb */
                $qb->andWhere($qb->expr()->like('tr.title', $qb->expr()->literal('%' . $value . '%')));
            });
Pavel Janda
Člen | 977
+
0
-

@igor.pocta V nějnovějším tagu je to fixnuté. Nechceš to napsat spíš takto?

->addAttributes(["style" => "width: 8%;"])

Editoval Pavel Janda (14. 1. 2017 12:27)

igor.pocta
Člen | 100
+
+1
-

Pavel Janda napsal(a):

@igor.pocta V nějnovějším tagu je to fixnuté. Nechceš to napsat spíš takto?

->addAttributes(["style" => "width: 8%;"])

Paráda, díky moc :)

chap
Člen | 81
+
0
-

Ahoj, jsou prosím někde dostupné lokalizace – en, cs, de?

Pavel Janda
Člen | 977
+
+1
-

@chap Myslíš již od někoho napsané? Já můžu poskytnout CS překlady. EN je by default. DE by se dala udělat. Super nápad, přidám jich pár na web.

flamengo
Člen | 135
+
0
-

@PavelJanda Tak jsem prubnul verzi 5.0.6, bohužel zase něco nefunguje, nebo prostě něco dělám špatně :(

  1. Paginator nekouká na filtr, takže při aktivním filtru zobrazuje neaktuální stránkování. Vlastně se stránkování vůbec nezmění a to ani, když dám v prohlížeči F5.
  2. Po filtrování nefunguje reload?

V tabulce mám tlačítko aktivní/neaktivní. Po kliknutí na fajfku/křížek se změní stav třeba článku. Poté dojde na reload ceného gridu. Normálně to funguje. Jakmile ale použiji filtr, tak se po změně grid znova nenačte, nechápu.

public function handleEnabled($id)
{
	$this->model->enable($id);
	$this->flashMessage('blablabla', 'info');
	if($this->isAjax()){
		$this->redrawControl('flashes');
		$this->getComponent('grid')->reload();
	}
	else{
		$this->redirect('this');
	}
}

Předem díky za reakci.

Pavel Janda
Člen | 977
+
0
-

@flamengo Vypadá to, že máš rozbitý celý JavaScript. Bohužel v tomhle směru nevím, kde hledat příčinu. Zkus odebrat všechny JS knihovny a pak postupně přidávat..

flamengo
Člen | 135
+
0
-

@PavelJanda Díky, zkusím to nahodit na čisté instalaci, ale musí to chvílu počkat. Času málo, práce hodně. Kdybych na to nekápnul, zkusím zas napsat.

sevca79
Člen | 55
+
0
-

ahoj,
jak prosím vyřešit to, když používám jako datasource NetteDatabaseDataSource a v dotazu používám GROUP BY, tak mi to poté v paginatoru vyhazuje nesmyslný celkový počet položek.
Resp. ten SELECT count(*), který se poté pošle do paginatoru je víceřádkový (kvůli tomu GROUP BY) a vrací mi to první řádek z toho

jak prosím docílit toho aby to zobrazovalo správně

prostě když teď mám něco jako

...
$query = "SELECT * FROM login_log GROUP BY username";
$datasource= new \Ublaboo\NetteDatabaseDataSource\NetteDatabaseDataSource($this->database, $query);
$grid->setDataSource($datasource);
...

tak mi paginator zobrazuje něco jako Položek: 0 – 7 z 3

předem děkuji za radu ;)

CZechBoY
Člen | 3608
+
0
-

@sevca79 Tak řešení bude nejspíš negroupovat žejo. Proč vlastně groupuješ když chceš zjistit celkový počet záznamů, který grid potom vypíše?

sevca79
Člen | 55
+
0
-

@CZechBoY To mě taky napadlo..tohle byl jen jednoduchej příklad pro představu a možnost úpravy paginatoru..Možná mi poradíš jak zefektnivnit db dotaz, i když to nepatří do týhle diskuse..není to úplně přesně to co mám, ale taky zjednodušeně
mám tabulku uživatelů, organizací a vztahovou tabulku mezi nimi např
users(id, username) , organizations(id, name) , users_organizations_relationships(user_id, organization_id), kdy každý uživatel může být ve vztahu s více organizacemi
a chci zobrazit seznam uživatelů a na každým řádku mít i seznam organizací..ve výsledku aby mi to vracelo něco jako
users.id | users.username | org1,org2,org3

což sem řešil přes dotaz

SELECT users.id, users.username, GROUP_CONCAT(organizations.name) FROM users
LEFT JOIN users_organizations_relationships ON users_organizations_relationships.user_id=users.id
LEFT JOIN organizations ON organizations.id=users_organizations_relationships.organization_id
GROUP BY users.id

což u tohoto grupování mi to vrací ten nepěkný count(*) do paginatoru..

nejsem moc zběhlý ani v sql, takže možná na ten výpis jdu přes špatnej dotaz a půjde se na to dotázat jistě i jinak

dík za rady ;)

CZechBoY
Člen | 3608
+
0
-

@sevca79 Tak do paginatoru pošleš celkovej počet uživatelů, ne? Jednoduchý řešení, teda pokud to jde :D

sevca79
Člen | 55
+
0
-

no právě na to se ptám..pač nevím jak to tam poslat :) včetně toho, aby se to upravovalo, když nastavím nějaký filter, atd…
prosím prosím tedy o nějakou radu
děkuji