ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- Pavel Janda
- Člen | 977
@H0w4rd
Ublaboo\DataGrid\DataSource\NetteDatabaseTableDataSource
neimplementuje Ublaboo\DataGrid\AggregationFunction\IAggregatable
,
můžeš poslat PR s implementací a testy. :)
- H0w4rd
- Člen | 96
Hmm, to je zvlastni, ze to dosud nikdo nepotreboval.
Mam jiny zahadny problem.
U me na lokalu to funguje, kdyz to nahraju na server (stejna verze php, stejna
konfigurace), tak u vsech tlacitek je href=„#“ a tim padem zadne
nefunguje.
Je mi jasne, ze nemas kristalovou kouli, ale nenapada te neco? Protoze ja
naprosto netusim, co se deje.
<?php
$grid->addToolbarButton("add", "Přidat")
->setIcon("plus-circle")
->setClass("btn btn-xs btn-default open-in-fancybox");
$grid->addAction("edit", "")
->setIcon("edit")
->setTitle("Editovat záznam")
->setClass("btn btn-xs btn-default open-in-fancybox");
$grid->addAction("active", "", "switch!")
->setIcon(function($row) { return $row->not_deleted ? "times-circle" : "check-circle"; })
->setTitle(function($row) { return $row->not_deleted ? "Zneplatit záznam" : "Obnovit záznam"; })
->setClass("btn btn-xs btn-default ajax")
->setConfirm(function($row)
{
return "Opravdu chcete " . ($row->not_deleted ? "zneplatnit" : "obnovit") . " záznam?";
});
?>
Vygenerovane HTML v radku vpravo:
<?php
<td class="col-action">
<a class="btn btn-xs btn-default open-in-fancybox" title="Editovat záznam" href="#">
<span class="fa fa-edit">
</span>
</a>
<a class="btn btn-xs btn-default ajax" data-datagrid-confirm="Opravdu chcete zneplatnit záznam?" title="Zneplatit záznam" href="#">
<span class="fa fa-times-circle">
</span>
</a>
</td>
?>
Editoval H0w4rd (4. 3. 2018 18:09)
- Pavel Janda
- Člen | 977
@H0w4rd Hm, to už někdo (v nějakém issue na githubu, tuším)
zmínil a já nemám nejmenší ponětí, o co jde. Ale jelikož se to chová
na localu správně a na produkci ne, nepovažuju to za problém datagridu.
Co s tím: Mohl bys rozjet u sebe produkční prostředí a vystopovat, proč
se to tam dostane? Mně se to ještě nestalo.. Díky.
- H0w4rd
- Člen | 96
Hmm, vyresil jsem to zatim tak, ze jsem pridal
$grid->addColumnText(„actions“, „Akce“) a v latte jsem definoval
obsah a nasazel si tam ty ikony rucne.
Ale kazdopadne je to divne, vyzkousim to nasadit jeste na jiny server.
Pavel Janda napsal(a):
@H0w4rd
Ublaboo\DataGrid\DataSource\NetteDatabaseTableDataSource
neimplementujeUblaboo\DataGrid\AggregationFunction\IAggregatable
, můžeš poslat PR s implementací a testy. :)
Mohl bych poprosit, potreboval bych jenom nakopnout, proste jak zacit, pak to snad napisu :)
- Pavel Janda
- Člen | 977
@H0w4rd Ve třídě
Ublaboo\DataGrid\AggregationFunction\FunctionSum
je potřeba
implementovat stav, kdy přijde v argumentu instance třídy
Ublaboo\DataGrid\DataSource\NetteDatabaseTableDataSource
a pak
v třídě přidat implementaci interface
Ublaboo\DataGrid\AggregationFunction\IAggregatable
(stejně, jako
například Ublaboo\DataGrid\DataSource\DibiFluentDataSource
).
- Zdenal
- Člen | 21
Ahoj @PavelJanda prosím tě nevíš kde by mohl být problém? Když si chci datagrid rozjet přes webpack. Nainstaluji vše přes npm a nefunguje mi ajax filtrace, ale například třídění ve sloupci funguje ajaxove. Hazi to chybu Uncaught ReferenceError: Nette is not defined. A tato chyba se objevuje u souboru nette.ajax.js
Editoval Zdenal (5. 3. 2018 21:07)
- d@rkWolf
- Člen | 167
Zdravím, neporadil by někdo, jak vyřešit kolizi Nette-ajax-history Vojty Dobeše a Ublaboo datagridu? Mám zajaxovaný back-end aplikace, mám to nastaveno podle návodu u history.ajax a ajaxové požadavky na filtrování apod. od datagridu refreshují celou stránku, načež ovládací prvky ztrácí focus.
Viz. z návodu pro history.ajax:
To correctly update UI, use snippets. If you plan to ajaxify whole application, consider adding this snippet to your beforeRender() method in BasePresenter.
<?php
if ($this->isAjax()) {
$this->redrawControl('title');
$this->redrawControl('content');
}
?>
And app/@layout.latte might be upgraded accordingly:
<?php
{snippet content}
{include content}
{/snippet}
?>
Chtělo by to něco, jako je data atribut data-ajax-off=„history“, jenže na požadavky prováděné Datagridem, ne na odkaz.
- Croc
- Člen | 270
zdravím, potřeboval bych poradit s následujícím:
Potřebuji vytvořit akci a stažení dokumentu z nějaké řádku
(id_attachment
není primary key řádku).
$grid->addAction('download', '', 'download!', function ($item) {return (array) array('id' => $item->id_attachment);})
->setIcon('download')
->setClass('btn btn-xs btn-primary ajax');
Dostávám chybu:
Argument 4 passed to Ublaboo\DataGrid\DataGrid::addAction() must be of the type array or null, object given
Je nějaká jiná možnost, jak dostat do url parametru volání akce hodnotu nějakého sloupce?
Moc děkuju, už si nevím rady…
Editoval Croc (7. 3. 2018 13:40)
- r2294743
- Člen | 16
Měl bych dotaz ohledně překleslování. Při obnovení stránky se mi správně přepíše status, ale ajaxem se nic neprovede.
Předem děkuji za pomoc
<?php
public function createComponentGuestList($name)
{
$grid = new DataGrid($this, $name);
$id = $this->getParameter('id');
$grid->setDataSource($this->pluginFacade->getGuestList($id));
$grid->addColumnStatus('status', 'Status')
->setSortable()
->addOption("paid", 'Paid')
->setClass('btn-success')
->endOption()
->addOption("unpaid", 'Unpaid')
->setClass('btn-danger')
->endOption()
->onChange[] = [$this, "changeStatus"];
$grid->addFilterMultiSelect('status', 'Status:', [
"paid" => 'Paid',
"unpaid" => 'Unpaid'
]);
}
public function changeStatus($id, $status)
{
$this->pluginFacade->changeUserPaidEvent($id, $status);
$this->flashMessage("Status was updated to $status.", 'success');
if ($this->isAjax()) {
$this->redrawControl('flashes');
$this['guestList']->redrawControl($id);
} else {
$this->redirect('this');
}
}
function renderView($event){
$this->template->event = $this->pluginFacade->getEvent($event);
}
?>
- petr.pavel
- Člen | 535
@jAkErCZ: Šlo by takto?
<?php
public function actionAcces($configureId)
{
/** @var DataGrid $grid */
$grid = $this->getComponent('grid');
$grid->setDataSource(
$this->repo->findByConfigureId($configureId)
);
);
}
public function createComponentGrid($name)
{
$grid = new DataGrid($this, $name);
...
return $grid;
}
?>
P.S. Zakládejte nové vlákno. Budete mít větší šanci, že si vás někdo všimne.
Editoval petr.pavel (9. 3. 2018 19:36)
- Čamo
- Člen | 798
Zdravím,
nevie niekto či existuje spôsob ako naštýlovať pozadie bunky v datagride?
Potreboval by som zafarbiť background ale iba na základe podmienky.
Je tam metoda
->addAttributes(['style' => 'background-color: red'])
ale tá
podfarbí celý stlpec a nedá sa to dať do podmienky.
Editoval Čamo (11. 3. 2018 19:22)
- Pavel Janda
- Člen | 977
@MW Pro yarn jsem snad nic nedělal. Můžete někdo poslat PR nebo nějaký užitečný odkaz, jak vše dostat na yarn?
- MW
- Člen | 626
Já jsem právě našel Ublaboo na
Yarnu, tak práve řeším, jestli jsou tam správně nastavené
závislosti.
Také o Yarnu toho moc nevím, a přecházím z Boweru. Na Boweru si to
natáhlo všechny balíky najednou..
Díky
- Ivorius
- Nette Blogger | 119
@H0w4rd Tohle by ti mělo pomoci https://github.com/…rid/pull/628 – Taky jsem s tím bojoval. Chyba se totiž vyskytuje jen v produkčním modu (tedy na serveru nebo na localu pokud si to zapneš) a to v tom případě, že chceš zavolat signál parent komponenty. Jenže k tomu nikdy nedojde, protože nette vrátí v produkčním modu v url # namísto #error a projde to tedy podmínkou.
- MW
- Člen | 626
Pavel Janda napsal(a):
@MW Pro yarn jsem snad nic nedělal. Můžete někdo poslat PR nebo nějaký užitečný odkaz, jak vše dostat na yarn?
Podařilo se tam prosím nějak dostat ty závislosti? Koukal jsem i na NPM a také tam nejsou. Jen ten Bower je má. Nebo co použít pro ty JS závislosti ? Moc díky za info.
- Dark0ne
- Člen | 47
Zdravím,
používám TreeView (https://ublaboo.org/…id/tree-view) a nějak si nemůžu poradit s jedním problémem:
Tento Grid jsem použil k vytvoření stromové struktury kategorie produktů, což je v pohodě. Nyní chci však v této stromové struktuře mít i produkty samotné (ne jen jejich kategorie a podkategorie). Narážím tedy na problém, že chci data i z jiné tabulky navázané jen pomocí cizího klíče.
Pro ilustraci něco takového:
- Obývací pokoj (tabulka typ kategorie)
-- Sedačky (tabulka typ kategorie)
-- Sedačka Lana AA4 (tabulka produkt)
Je toto řešitelné prostředky datagridu? Případně mohl by mne někdo navést, jak na to?
Děkuji za rady.
- Petr Parolek
- Člen | 455
Ahoj, netuším, jestli problém přímo souvisí s datagridem. Dnes jsem aktulizoval Nette Componet Model na 2.4.0 a začalo mi házet:
User Deprecated Nette\ComponentModel\Component::__construct() argument $parent is deprecated, use $parent->addComponent() instead.
Ukázku jsem oprášil na https://github.com/…der-datagrid , kde se taky problé projevuje.
Prosím, víte o nějakém řešení nebo jsem narazil na bug?
Editoval ppar (21. 3. 2018 21:58)
- Petr Parolek
- Člen | 455
Vyřešeno: https://github.com/…d/issues/631
<?php
$grid = new DataGrid();
$this->addComponent($grid, $name);
?>
- Shampoo
- Člen | 38
Ahoj,
řeším následující problém.
Pro filtrování hodnot ve sloupci datagridu používám SelectBox. Problém
nicméně je, že filter hledá podřetězce.
příklad hodnot:
- test
- test1
- test2
- test1
- test3
Pokud zvolím filter test, tak dostanu úplně
všechny hodnoty, což není cílem.
Je možné nějak zařídit, aby filterSelect hledal
přesnou shodu?
filterText má např. metodu setSplitWordsSearch(FALSE), ale tu použít nemůžu.
Díky za rady.
- Pavel Janda
- Člen | 977
@Shampoo FilterText::setExactSearch(true)
Edit: Aha, ty mluvíš o selectboxu. Fakt selectbox vyhledává %value%? To se mi nezdá. V kódu to tak není.. Viz FilterSelect.php:
public function getCondition()
{
return [$this->column => $this->getValue()];
}
Editoval Pavel Janda (22. 3. 2018 13:00)
- Jarek92
- Člen | 91
Ahoj, řešil prosím někdo následující problém? Upgradoval jsem nette na nejnovější a začala mi Tracy házet varování:
User Deprecated
Replace deprecated Nette\Object with trait Nette\SmartObject in
/var/www/clients/client4/web5/web/vendor/ublaboo/datagrid/src/DataModel.php:25
Kód komponenty: (vyhazuje na řádku 66)
63: $grid = new \Ublaboo\DataGrid\DataGrid();
64: $this->addComponent($grid, $name);
65: $this->setLogs();
66: $grid->setDataSource($this->logs);
Je nějaké jiné řešení, než downgradovat zpět na dřívější verzi Nette?
- Petr Parolek
- Člen | 455
Jarek92 napsal(a):
Ahoj, řešil prosím někdo následující problém? Upgradoval jsem nette na nejnovější a začala mi Tracy házet varování:
User Deprecated
Replace deprecated Nette\Object with trait Nette\SmartObject in /var/www/clients/client4/web5/web/vendor/ublaboo/datagrid/src/DataModel.php:25Kód komponenty: (vyhazuje na řádku 66)
63: $grid = new \Ublaboo\DataGrid\DataGrid(); 64: $this->addComponent($grid, $name); 65: $this->setLogs(); 66: $grid->setDataSource($this->logs);
Je nějaké jiné řešení, než downgradovat zpět na dřívější verzi Nette?
Použij nejnovější verzi gridu
Editoval ppar (22. 3. 2018 15:56)
- Pavel Janda
- Člen | 977
@pitr82 Je, ve větvi bootstrap-4
. S ofiko releasem
čekám už několik měsíců na https://github.com/…/issues/1135
:/ . Viz github issue: https://github.com/…d/issues/416
- Shampoo
- Člen | 38
Pavel Janda napsal(a):
@Shampoo
FilterText::setExactSearch(true)
Edit: Aha, ty mluvíš o selectboxu. Fakt selectbox vyhledává %value%? To se mi nezdá. V kódu to tak není.. Viz FilterSelect.php:
public function getCondition() { return [$this->column => $this->getValue()]; }
Heleď, já fakt netuším, ale prostě mi to takhle funguje defaultně…
- Pavel Janda
- Člen | 977
@monty Podobně, jak navrhuje @H0w4rd, udělal bych si filtr typu select se dvěma hodnotami – 0 a 1, pak přidal vlastní šablonku a select vykreslil jen jako checkbox.. Trošku praseúprava, ale rychlá a určtiě funkční bez nutnosti implementovat nový typ filtru do všech datasourců. Filtr typu checkbox implementován by-default není.
- cujan
- Člen | 410
@PavelJanda nevies mi nahodou pomoct…dost preslapujem na
mieste…
caute taham data z dvoch tabuliek prepojenych cez cudzi kluc…
clenKurzu(id,idOsoba, idKurz)
kurz(id, idNazovKurzu,…)
dokazem si ku osobe vytiahnut prislusne udaje o kurze z tabulky kurz…len nazov kurzu potrebujem tahat z tretej tabulky nazovKurzu(id, nazov…) ktora je cudzim klucom prepojena s tabulkou kurz…ako nato?
<?php
public function create() {
$grid = new DataGrid();
$grid->setDataSource($this->clenoviaKurzuManager->getRecords());
$grid->addColumnText('idKurz', 'Nazov kurzu','kurz.idNazovKurzu');
$grid->addColumnDateTime('zaciatok_kurzu', 'Zaciatok','kurz.zaciatok_kurzu');
$grid->addColumnDateTime('koniec_kurzu', 'koniec','kurz.koniec_kurzu');
$grid->addColumnDateTime('cislo_protokolu', 'cislo protokolu','kurz.cislo_protokolu');
return $grid;
}
?>
Editoval cujan (27. 3. 2018 10:35)
- cujan
- Člen | 410
no cize tento select mi vracia co potrebujem
<?php
SELECT pilcik_db.kurz.idNazovKurzu, pilcik_db.kurz.zaciatok_kurzu, pilcik_db.nazovKurzu.nazov FROM pilcik_db.clenoviaKurzu inner join pilcik_db.kurz on ((kurz.id = clenoviaKurzu.idKurz) and clenoviaKurzu.idClen = 10 ) inner join pilcik_db.nazovKurzu ON nazovKurzu.id = kurz.idNazovKurzu;
?>
uz len ho potrebujem namapovat na ublaboo
cujan napsal(a):
@PavelJanda nevies mi nahodou pomoct…dost preslapujem na mieste…
caute taham data z dvoch tabuliek prepojenych cez cudzi kluc…
clenKurzu(id,idOsoba, idKurz)
kurz(id, idNazovKurzu,…)dokazem si ku osobe vytiahnut prislusne udaje o kurze z tabulky kurz…len nazov kurzu potrebujem tahat z tretej tabulky nazovKurzu(id, nazov…) ktora je cudzim klucom prepojena s tabulkou kurz…ako nato?
<?php public function create() { $grid = new DataGrid(); $grid->setDataSource($this->clenoviaKurzuManager->getRecords()); $grid->addColumnText('idKurz', 'Nazov kurzu','kurz.idNazovKurzu'); $grid->addColumnDateTime('zaciatok_kurzu', 'Zaciatok','kurz.zaciatok_kurzu'); $grid->addColumnDateTime('koniec_kurzu', 'koniec','kurz.koniec_kurzu'); $grid->addColumnDateTime('cislo_protokolu', 'cislo protokolu','kurz.cislo_protokolu'); return $grid; } ?>
- Dark0ne
- Člen | 47
Zdravím,
mám datagrid na obrazovce s GET parametrem detail?id=21
. Tento
parametr se mi však při akcích datagridu ztrácí a v podstatě ihned se
přesměruje na něco takového detail?exeGrid-per_page=20
. Co
udělat pro to, aby id parametr zůstal v URL?
Díky za rady
Editoval Dark0ne (27. 3. 2018 18:40)
- Čamo
- Člen | 798
Zdravím,
narazil som dnes na problém s funkciou setDefaultSort().
Ublaboo používam s Nextras ORM.
Problém je v tom, že ak je na stlpci volaná metóda
setSortable() tak setDefaultSort() sa vôbec
neprejavý. Ak setSortable() odstránim tak setDefaultSort() funguje. Nechápem
prečo sa to deje.
$grid->setDefaultSort(['closed' => 'DESC'], FALSE); // Does not work with setSortable()
$grid->addColumnDateTime('closed', "$cDomain.date")
->setRenderer( function ( $item ) use ( $cDomain ) {
/** @var Task $item */
return $item->closed->format( 'j. n. Y' );
})
->setTemplateEscaping( FALSE )
->setSortable() // Has to be removed if I want defaultSort()
->setFilterDate()
->setCondition( function ($fluent, $value) {
/** @var \Nextras\Orm\Mapper\Dbal\DbalCollection $fluent */
$start = DateTime::createFromFormat( 'j. n. Y', $value)->setTime( 0, 0, 0 );
$end = DateTime::createFromFormat( 'j. n. Y', $value)->setTime( 23, 59, 59 );
$fluent->getQueryBuilder()
->from('tasks', 'tasks')
->andWhere( 'tasks.closed > %dt', $start )
->andWhere( 'tasks.closed < %dt', $end );
});
EDIT: Hmm tak to vyzerá, že workaround pre default sort vyzerá asi takto:
if( ! $grid->sort )
{
$collection = $collection->orderBy( ['closed' => 'DESC'] );
}
Editoval Čamo (28. 3. 2018 12:25)
- kralik
- Člen | 230
Ahoj,
datagrid funguje super.
Jenže nyní potřebuji do projektu přidat nette.ajax.js.
Nalinkoval jsem si https://github.com/…ette.ajax.js
a bohužel mi přestal fungovat $grid->addColumnStatus.
Při změně, výběru položky, nedojde k „redirectu“.
Po manuálním refreshi je u položky nová hodnota, ale k refreshi nedojde
automaticky.
Prosím nesetkali jste se s tímto někdo?
Předem díky
- MW
- Člen | 626
Zdravím a moc prosím o nasměrování.
mám rozdělaný jeden projekt, kde mám i tento grid. Teď jej budu rozšiřovat a potřebuji Boostrap ver.4. Zároveň jsem chtěl přejít z Boweru na Yarn, jak jsem zmínil před časem, ale nedaří se, tak prosím o radu:
- Jaké jsou skutečně potřeba JSka, je to aktuální dle Boweru? Myslím ty závislosti.
- Na Yarnu je nějaký jednoduchý, asi automatizovaně převzatý, packages.json, kde nejsou závislosti. Chystají se ? Na Yarnu asi nejsou všechny.
- Není Yarn špatná cesta? Nebo jaký systém pro správu JS budeš používat dále?
- Grid mám poslední verze, jak prosím přechodím grid na BS4?
Moc díky !
- Isigarek
- Člen | 74
MW napsal(a):
Zdravím a moc prosím o nasměrování.
mám rozdělaný jeden projekt, kde mám i tento grid. Teď jej budu rozšiřovat a potřebuji Boostrap ver.4. Zároveň jsem chtěl přejít z Boweru na Yarn, jak jsem zmínil před časem, ale nedaří se, tak prosím o radu:
- Jaké jsou skutečně potřeba JSka, je to aktuální dle Boweru? Myslím ty závislosti.
- Na Yarnu je nějaký jednoduchý, asi automatizovaně převzatý, packages.json, kde nejsou závislosti. Chystají se ? Na Yarnu asi nejsou všechny.
- Není Yarn špatná cesta? Nebo jaký systém pro správu JS budeš používat dále?
- Grid mám poslední verze, jak prosím přechodím grid na BS4?
Moc díky !
Možný přechod vidím tím, že si upravíš šablonu pro datagrid viz. jeho dokumentace. https://ublaboo.org/…rid/template
- Pavel Janda
- Člen | 977
@MW @Isigarek Podpora pro bs 4 je ready ve větvi
boostrap-4
. Bohužel se s mergnutím do 5.x
čeká
ještě na jednu knihovnu (bootstrap-select), která stále nmá podporu bs4 ve
stable verzi. Ale možná to tam už prdnu, ať to lze všechno používat (tedy
krom toho bootstrap-select).
- andros
- Člen | 145
Ahoj,
snažím se vytvořit sloupec, který zobrazí celkovou cenu (počet ks *
cena/ks). To řeším takto:
$grid->addColumnNumber('totalPrice', 'Celkem')
->setRenderer(function($orderItem):float {
return $orderItem->price * $orderItem->pcs;
})
Rád bych ale nastavil také formát výsledné ceny.
->setFormat(2, ',', '.');
To mi ale bohužel nefunguje. Nevíte někdo prosím, jak to udělat ?
Díky moc za rady.
- rkor
- Člen | 62
andros napsal(a):
Ahoj,
snažím se vytvořit sloupec, který zobrazí celkovou cenu (počet ks * cena/ks). To řeším takto…
Jednoduše ;-)
$grid->addColumnNumber('totalPrice', 'Celkem')
->setRenderer(function($orderItem):string {
return number_format($orderItem->price * $orderItem->pcs,2,',','.');
})
- andros
- Člen | 145
Díky. Při neděli už mi to nemyslí, tohle mi taky mohlo dojít :)
rkor napsal(a):
andros napsal(a):
Ahoj,
snažím se vytvořit sloupec, který zobrazí celkovou cenu (počet ks * cena/ks). To řeším takto…Jednoduše ;-)
$grid->addColumnNumber('totalPrice', 'Celkem') ->setRenderer(function($orderItem):string { return number_format($orderItem->price * $orderItem->pcs,2,',','.'); })