ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- nanuqcz
- Člen | 822
@n3t Díky, tohle mě konečně nakoplo správným směrem. Takže v čem byl problém:
- Kvůli tomu, že pořád používám Nette 2.4, mi composer stáhl Datagrid ve verzi 5.7.4.
- O tom Bower samozřejmě nevěděl, a tak příkazem
bower install ublaboo-datagrid
stáhl nejnovější JS+CSS (pro verzi 6.2.5).
Oprava / úprava instalace pro verzi 5.* tedy spočívá ve stáhnutí staršího bower balíčku:
bower uninstall --save ublaboo-datagrid
bower install --save ublaboo-datagrid@5 happy@1 bootstrap-select font-awesome@4
a úpravě cest k JS+CSS souborům tak, aby pasovaly. Taky doporučuju
downgradovat happy.js
(v nové verzi chybí adresář
dist
), doinstalovat bootstrap-select a natáhnout
font-awesome
(verzi 4, protože s 5 a výše není tato verze
DataGridu v základu kompatibilní).
Oprava suma sumárum v jednom commitu:
https://gitlab.com/…830a984f9049?w=1
Editoval nanuqcz (11. 12. 2019 17:03)
- Failips
- Člen | 54
Ahoj,
mám stránku s tlačítkami, na ktoré keď sa klikne, tak sa cez JS ajaxom zavolá handle metóda v presenteri. Tá vykoná istú akciu a zmenia sa dáta slúžiace na filtrovanie obsahu načítavaného v datasource gridu. Následne sa zavolá $this[‚myGrid‘]->redrawControl() a očakávam, že sa obsah v tabuľkách zmení. K tomu však nedôjde aj napriek domu, že výsledné dáta vo funkcii build sa zmenili (zistené pomocou volania bdump). {control myGrid} nie je obalený v žiadnom snippete ani v snippetArea.
Nevie niekto ako to spojazdniť? Ďakujem :)
- Failips
- Člen | 54
nanuqcz napsal(a):
@Failips Datagrid používám krátce, ale není ta metoda
$this['myGrid']->reload()
? Co pak ten AJAX požadavek vrací prohlížeči za data, když se podíváš do konzole prohlížeče?
Skúšal som aj reload() s rovnakým výsledkom. To isté platilo aj pre obalenie control do snippetu/snippetArea a následným redraw snippetu. V build funkcii boli vždy nové data avšak stránka sa neprekreslila. Nakoniec som prišiel na chybu. Spôsobovalo to volanie handleFunkcie pomocou klasického jQuery AJAXu, a teda keď som ho nahradil Nette AJAXom tak už všetko išlo ako malo. Takže opäť ďalšia chyba z nepozornosti.
- pavelinnuendo
- Člen | 33
Asi mi odpovíte, že je to špatný použití, ale lze při inline editaci nějak zalomit řádek? Respektive mám sloupců víc, než se mi pohodlně vejde na stránku a potřeboval bych je nějak inline editovat, tedy ideálně aby byl záznam na dva řádky. Díky.
- Aleksandr
- Člen | 14
Zdravím mám problém s Datagrid items
nemůžu zobrazit jakýkoliv ItemDetails, přitom AJAX request proběhne a
např. při sortování funguje…
Verze datagridu: 6.2.5
Verze Nette 3.0
Takový nepodstatný detail, co by nic neměl ovlivnit, data si táhám
z API a ne z DB
Druhy nepodstatny detail, v zoufalosti jsem si docesne pustil online knihovny
z DEMA
Presenter:
public function createComponentDatagrid()
{
$grid = new DataGrid;
$grid->setDataSource($this->userManager->getUsers());
//columns
$grid->addColumnNumber('id', 'ID');
$grid->addColumnText('name', 'Jmeno')->setSortable();
$grid->addColumnText('superuser', 'Admin');
$grid->addColumnText('email', 'E-mail');
$grid->addColumnDateTime('lastLoginDate', 'Naposled přihlašen');
$grid->addColumnStatus('state', 'Status');
//filters
$grid->addFilterSelect('state', 'Status', State::ALL);
$grid->addFilterText('name', 'Jmeno');
$grid->setItemsDetail();
$grid->setTemplateFile(__DIR__ . '/../templates/datagrid/item-detail-grid.latte');
return $grid;
}
template pro detail, ostatní věci mi měnit přes {block} jdou, ale detail se jako jedinej nezobrazuje
{extends $originalTemplate}
{block detail}
<button class="btn btn-default btn-secondary btn-sm">Just a button</button>
{/}
template Presentru
{block content}
<div class="container">
<h1 n:block="title" class="text-center">Titulek nefunkcni stranky</h1>
{control datagrid}
</div>
- Aleksandr
- Člen | 14
galab napsal(a):
Aleksandr napsal(a):
Zdravím mám problém s Datagrid items
nemůžu zobrazit jakýkoliv ItemDetails, přitom AJAX request proběhne a např. při sortování funguje…bower update jsi dělal?
Jo zkoušel jsem to tahat i přes bower a nikdy se nic nezmění…ChromeDev konzole je stále bez chyb
- Aleksandr
- Člen | 14
Tak jsem tady s dalším reportem, kdyby někdo prosím dokázal
pomoct…
Stáhnul jsem si playground ukázku z GITu se vším všudy…a pořád mi
nejde zobrazit Detail u row.
V ChromeDevu jsem si prohlížel jaký data vrací online ukázka a můj
localhost s playgroundem
Tohle je localhost s repositařem z playgroundem
{
"_datagrid_toggle_detail": "1",
"_datagrid_name": "grid",
"state": {
"grid-page": null,
"grid-perPage": "100",
"grid-sort": {
"email": "ASC"
},
"grid-filter": null
}
}
{
"_datagrid_toggle_detail": "29",
"_datagrid_name": "grid",
"state": {
"grid-page": null,
"grid-sort": null,
"grid-filter": null
},
"_datagrid_redrawItem_class": "",
"_datagrid_redrawItem_id": 29,
"snippets": {
"snippet-grid-item-29-detail": "\t\t\t\t\t\t\t\t\t\n\n\n\t\t\t\t\t\t\t\t\t\t\t<td colspan=\"5\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"item-detail-content\">\n\t<h3>29 - Beautiful Boar <small>7. 7. 1987 12:30:12</small></h3>\n\n\t<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur vitae diam non enim vestibulum interdum. Nulla quis diam. Integer in sapien. Nullam dapibus fermentum ipsum. Curabitur bibendum justo non orci. Etiam neque. Nullam dapibus fermentum ipsum. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Etiam posuere lacus quis dolor. Aliquam ornare wisi eu metus. Nulla non lectus sed nisl molestie malesuada. Vivamus ac leo pretium faucibus. Aliquam ante. Aliquam erat volutpat.</p>\n\n\t<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur vitae diam non enim vestibulum interdum. Nulla quis diam. Integer in sapien. Nullam dapibus fermentum ipsum. Curabitur bibendum justo non orci. Etiam neque. Nullam dapibus fermentum ipsum. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Etiam posuere lacus quis dolor. Aliquam ornare wisi eu metus. Nulla non lectus sed nisl molestie malesuada. Vivamus ac leo pretium faucibus. Aliquam ante. Aliquam erat volutpat.</p>\n\n\t<button class=\"btn btn-default btn-secondary btn-sm\">Just a button</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n"
}
}
- Aleksandr
- Člen | 14
Ahoj Pavle (@PavelJanda),
mám ještě jeden dotaz. Jak získám id aktulní row, prosím, potřebuji to do actiony.
public function create(): DataGrid
{
$grid = $this->dataGrid->create();
//columns
$grid->addColumnNumber('id', 'ID')
->setSortable();
$grid->addColumnText('name', 'Jméno')
->setSortable()
->setFilterText();
$grid->addColumnText('superuser', 'Admin')
->setSortable();
$grid->addColumnText('email', 'E-mail')
->setSortable()
->setFilterText();
$grid->addColumnDateTime('lastLoginDate', 'Naposled přihlášen')
->setSortable();
$grid->addColumnText('state', 'Status')
->setSortable()
->setReplacement(State::ALL)
->setFilterSelect(State::ALL);
$multiAction = $grid->addMultiAction('subjects', 'Subjekty');
foreach ($userSubjects as $subject) {
$multiAction->addAction($this->getUserSubject($semChciIDaktualniROW), $subject, 'this', ['id']);
}
//sets details for user
$grid->setDataSource($this->userManager->getUsers());
return $grid;
}
- Pavel Janda
- Člen | 977
@Aleksandr Asi si bude# muset udělat vlastní renderer callback, do kterého ti přijde celá row.
https://contributte.org/…columns.html#api
Editoval Pavel Janda (9. 1. 2020 22:24)
- semi
- Člen | 4
Ahoj,
řeším asi něco podobného jako @janvacek
Mám v projektu Nette 3.0, Naja 1.7.0, a snažím se rozchodit Ublaboo
datagrit 6.0.1
dostávám se k chybě
TypeError: naja.addEventListener(...).bind is not a function
Předpokládám, že se to snaží zaregistrovat listener dřív, než je Naja inicializovaná?
- jiri.pudil
- Nette Blogger | 1029
Předpokládám, že se to snaží zaregistrovat listener dřív, než je Naja inicializovaná?
Předně je tam podle mě chyba.
Listenery můžeš registrovat teoreticky kdykoliv, s výjimkou
Beru zpět. Pravda to sice je, ale v datagrid.js se
listenery navěšují v extensioně, ta musí být zaregistrovaná před
inicializací.init
, kterážto událost se vyvolává jen v momentě, kdy se
Naja inicializuje.
Editoval jiri.pudil (15. 1. 2020 13:16)
- TonnyVlcek
- Člen | 31
TL;DR:
Používáte někdo (ideálně na produkci) editovatelný datagrid s 30+
sloupci?
Na projektu kde používáme contributte/datagrid téměř na všechno, přišlo oddělení obchoďáků s iniciativou, které říkají „Excelifikace“. Cílem je spravovat entity s relativně velkým množstvím parametrů v rámci jednoho inline-editovatelného datagridu. Některé sloupce budou potřebovat callback rendery atp…
Než se pustím do nějakého testování a „benchmarků“, tak jsem se chtěl zeptat tady, máte-li s tím někdo zkušenost. Případě nějaké zkušenosti, jak jste se s něčím podobným vypořádali?
Díky moc :)
- Pavel Janda
- Člen | 977
@TonnyVlcek Myslím, že by to nemusel být problém. Dělal jsem
i docela velké gridy, šlo to easy.
Spíš bych se zamyslel nad tím, abyste neměli v rámci kódu
„nepořádek“. Třeba bych factory gridu rozdělil mezí víc factories (na
akce, na sloupce, atd).
Nicméně výkonnostně by to asi neměl být problém. Navíc inline edit
callback se volá pouze pro jednu položku jednoho sloupce, easy..
Spíš zkus obchoďákům říct, ať pošlou pořádnou donation, ať se zas vývoj datagridu pohne. :D Můžeš to obhájit třeba tak, že se opraví nějakej superzávažnej bug, kterej vám hrozně brání v práci. :D
Každopádně, až to budete mít hotovo, poděl se o výsledky benchmarku! Rád se na ně mrknu, pokud to nebude tajné.
Editoval Pavel Janda (17. 1. 2020 10:50)
- TonnyVlcek
- Člen | 31
@PavelJanda
Pecka, díky!
Nějak to zkusím ukecat ;) A dám vědět, jak to nakonec dopadne.
- Failips
- Člen | 54
Ahoj, chceli by sme urobiť ukladanie stavu jednej tabuľky (grid state) per užívateľ. Ide o to, že po prihlásení by užívateľ mal tabuľku v takom rozložení ako ju naposledy zanechal. Pôvodný nápad bol vytiahnuť z gridu jeho stav napr. vo forme JSONu a uložiť to do databáze, následne pri prihlásení a otvorení stránky s touto tabuľkou by sme načítali tieto hodnoty z DB.
Vie niekto o spôsobe, ktorým pri každej zmene rozloženia (filtre, zobrazené stĺpce, max. počet riadkov) dalo získať tieto hodnoty nejakým jednoduchým spôsobom? Vďaka :)
- Pavel Janda
- Člen | 977
@Failips Myslím, že to úplně nesouvisí s datagridem, ale jako nejjednodušší způsob vidím toto: udělal bych si nějaký session handler, který budu umět dobře ovládat (já s oblibou používám https://github.com/…/Handler.php). Těsně před odhlášením uživatele bych vzal jeho data session týkající se datagridu/ů a to bych někam uložil. A po přihlášení bych to zase do session prdnul. Asi bude muset někdo víc zasvěcený říct, jestli je to blbý nápad či nikoliv. :P
- chemikus
- Člen | 47
Ahoj,
prosím pomoc, jsem zoufalý! :-)
Měl jsem funkční administraci pro můj projekt. Používám poslední dostupné Nette 3.0 (staženo přes composer cca 3 týdny zpět). Nainstaloval jsem si tam přes composer ještě pár plug-inů (kdyby/translation a tomaj/nette-bootstrap-form). Vše mi fungovalo v pořádku.
Dnes jsem přes příkaz composer require ublaboo/datagrid
stáhl tenhle DataGrid a po aktualizaci prohlížeče (aniž bych cokoli kdekoli
měnil ve zdrojových souborech) mám následující chybovou hlášku:
Fatal error: Uncaught Error: Class 'App\Bootstrap' not found in C:\xampp\htdocs\admin.deskovia.cz\www\index.php:7 Stack trace: #0 {main} thrown in C:\xampp\htdocs\admin.deskovia.cz\www\index.php on line 7
Což mě teda tak trochu navádí k tomu, že App\Bootstrap nebylo nalezeno, ale Bootstrap.php soubor je v namespace App
<?php
declare(strict_types=1);
namespace App;
use Nette\Configurator;
class Bootstrap {
...
?>
Tak já nevím co mám zle :( Můžete mi prosím někdo hodit pomocné lano, jak zprovoznit DataGrid / nebo odinstalovat, abych měl zas zpět funkční administraci? :)
PS: composer uninstall --save ublaboo/datagrid
nefunguje a
vyhodí hlášku
[Symfony\Component\Console\Exception\CommandNotFoundException] Command "uninstall" is not defined.
- Gappa
- Nette Blogger | 208
@chemikus
Bootstrap se autoloaduje pomocí composeru:
Zkusit tedy dát něco jako composer dump-autoload
? :)
- chemikus
- Člen | 47
Gappa napsal(a):
@chemikus
Bootstrap se autoloaduje pomocí composeru:
Zkusit tedy dát něco jako
composer dump-autoload
? :)
Dobře, napsal jsem do příkazového řádku …
c:\xampp\htdocs\admin.deskovia.cz>composer dump-autoload
napsalo to …
Generating autoload files
A chyba stále stejná :(
Fatal error: Uncaught Error: Class 'App\Bootstrap' not found in C:\xampp\htdocs\admin.deskovia.cz\www\index.php
Co dělám špatně teď? :)
- chemikus
- Člen | 47
Gappa napsal(a):
@chemikus
Pro kontrolu – ta odkazovaná část v composer.json v něm je? :)
Velmi dobrá poznámka :) Když se podívám do composer.json hned v kořenovém adresáři, tak je tam napsáno pouze:
{
"require": {
"ublaboo/datagrid": "^6.2"
}
}
Takže nyní asi soutěžní otázka zní, proč? A jak tam dostat ten zbytek? :)
- Gappa
- Nette Blogger | 208
chemikus napsal(a):
Gappa napsal(a):
@chemikus
Pro kontrolu – ta odkazovaná část v composer.json v něm je? :)
Velmi dobrá poznámka :) Když se podívám do composer.json hned v kořenovém adresáři, tak je tam napsáno pouze:
{ "require": { "ublaboo/datagrid": "^6.2" } }
Takže nyní asi soutěžní otázka zní, proč? A jak tam dostat ten zbytek? :)
Tam je jen a pouze tohle? Nic z nette? Jak se ti ho pak ale podařilo nainstalovat? :)
Btw, možná lepší založit nové vlákno někde na foru, téma se poněkud stočilo od datagridu někam úplně jinam.
- chemikus
- Člen | 47
Tam je jen a pouze tohle? Nic z nette? Jak se ti ho pak ale podařilo nainstalovat? :)
Ano ano, jen a pouze toto. Asi při instalaci dataGrid nějaká chybka. No, nicméně už vím, kde je problém, moc děkuju za pomoc!
Btw, možná lepší založit nové vlákno někde na foru, téma se poněkud stočilo od datagridu někam úplně jinam.
Možná navrhuji smazat všechny moje/tvoje komentáře, ať tím zbytečně nebereme místo?
- Gappa
- Nette Blogger | 208
chemikus napsal(a):
Tam je jen a pouze tohle? Nic z nette? Jak se ti ho pak ale podařilo nainstalovat? :)
Ano ano, jen a pouze toto. Asi při instalaci dataGrid nějaká chybka. No, nicméně už vím, kde je problém, moc děkuju za pomoc!
V tom případě by stálo za to se podělit o příčinu a řešení :)
Btw, možná lepší založit nové vlákno někde na foru, téma se poněkud stočilo od datagridu někam úplně jinam.
Možná navrhuji smazat všechny moje/tvoje komentáře, ať tím zbytečně nebereme místo?
Když už se to podařilo vyřešit, tak už to asi může zůstat – ale jak jsem psal výše, důležité je napsat řešení :)
- Peca
- Člen | 2
Ahoj,
prosím o radu,
existuje nějaká možnost, jak tento kód doplnit o třetí parametr
funkce groupParamUpdate?
$grid->addGroupTextAction("Nazev")->onSelect[] = [$this, 'groupParamUpdate'];
abych se dostal k zavolání např.
groupParamUpdate($ids, $value, $treti_parametr)
Předem díky moc za rady!
- pp
- Člen | 50
Ahoj,
poprosil bych o radu,
V gridu zobrazuju seznam lokalit s atributy ‚latitude‘,
‚longitude‘.
Mam takovou predstavu, abych vyberem jedne lokality a zadanim parametru
‚maxdistance‘ prefiltroval zdroj dat a zobrazil jen ty, ktere spadaji do
kruhu o zadanem polomeru a s vysledkem mohl dal pracovat.
Nabizi se mi k tomu „action“ – tam si zbrazim form k zadani
parametru, vytahnu nova data, nastavim novy datasource a prekreslim grid.
Jenze pak pri jakekoli dalsi filtraci se mi datasource „prepise“ na ten
puvodni (vsechny lokality).
Jak docilit toho, aby se novy datasource stal platnym (treba do resetu
filteru) ?
- Pavel Janda
- Člen | 977
@Aleksandr Vše by mělo být popsáno zde:
Renderer: https://contributte.org/…columns.html#…
Custom filter: https://contributte.org/…filters.html#…
Tímhle vyrenderuješ úplně custom data a aplikuješ úplně custom podmínku pro filtraci nad tím sloupcem.
- Kamil Valenta
- Člen | 815
Mám v gridu sloupec s datem a časem, chci nad ním filtrovat „od – do“:
$grid->addColumnDateTime('timestamp', 'Datum a čas')
->setFormat('d.m.Y H:i')
->setSortable()
->setFilterDateRange();
Funguje to dobře, problém nastane ve chvíli, kdy se mi filtry triggerují
automaticky např. po 3 znacích.
Chci např. do filtru napsat datum „22.01.2020“, ale jakmile zadám
„22.“, ajax vykopne exceptionu, protože
datagrid/src/Utils/DateTimeHelper.php#tryConvertToDate() se pokusí nachroustat
„22.“, což zatím ještě neodpovídá žádnému formátu data, takže to
propadne až na: throw new DataGridDateTimeHelperException();
Takže v důsledku ani nemám možnost to datum dopsat do úplné podoby, ačkoliv bych chtěl :)
Vrátit null místo throw new DataGridDateTimeHelperException() není možné, protože pak to zahučí na volání tuším ->setFormat() on null. Zatím to řeším tak, že místo throw new DataGridDateTimeHelperException() vracím new \DateTime.
Zdá se to být jako možné řešení, ale nevím, zda to nemá někde jiné konsekvence.
Editoval kamil_v (29. 1. 2020 11:55)
- Kamil Valenta
- Člen | 815
@Gappa ano i ne, je mnoho uživatelů (a já je chápu), kteří raději ťuknou do klávesnice, než proklikávají kalendář, je to mnohem rychlejší
- Pavel Janda
- Člen | 977
@Aleksandr Tlačítko se teď zobrazuje jen a pouze v případě, kdy se něco ve filtru vyplněno. Umístění budeš muset upravit asi sám v poděděné šabloně.
- Šaman
- Člen | 2659
Nevím, jestli to tu už někdo řešil, ale zatím hledám marně a stejné problémy jsou i v demu:
- Když kliknu na další stránku, změní se stránka a adresa. Ale když pak použiju jen tlačítko zpět, změní se adresa, ale stránka se nepřekreslí.
- Když jednou změním počet řádků a pak ho vrátím na defaultní, tak
stejně zůstává v adrese
&grid-perPage=20
. Stejně tak když adesu ručně promažu od parametrů, tak nenaskočí defaultní hodnoty, ale znovu se tam objeví.
A mimochodem, stránku http://ublaboo.paveljanda.com/datagrid/
mi Chrome odmítá otevřít kvůli neplatnému certifikátu. Nejspíš se
vynutí https
a ten pak neprojde přes certifikát. Použití
http
v adrese neprojde.
Editoval Šaman (17. 2. 2020 14:13)
- Pavel Janda
- Člen | 977
@Šaman dokumentace již jede na: https://contributte.org/…te/datagrid/
Na https mrknu, mělo by to pak stejně jen přesměrovat na contributte.org. Dík za info
- TonnyVlcek
- Člen | 31
TL;DR:
Po úspěšném zpracování inline editace potřebuji aby datagrid „přeskočil“ a
otevřel editaci pro jiný (třeba následující) řádek.
Rád bych to provedl v jednom requestu a na serveru (tj. bez nutnosti mít
js který třeba provede kliknutí na tlačítko editace).
Procházel jsem callstack a jako nejlepší kandidát se mi zdál callback
onCustomRedraw – provádí se úplně na konci zpracování inlineEditu, a
tak jsem doufal, že tam budu schopný zavolat handle dalšího inlineEditu:
$grid->getInlineEdit()->onCustomRedraw[] = function () {
$this->grid->redrawItem(18);
$this->grid->handleInlineEdit(19);
};
(jen příklad, reálné id řádků bych si odněkud snad vytáhnul)
Výsledek:
https://gifyu.com/image/74L8
Změny se uloží, další řádek je editovatelný, ale původní řádek
zůstane také editovatelný.
Je tohleto správná cesta, a pokud jo, jak donutit původní řádek aby se zavřel? Nebo, napadá někoho lepší způsob jak na to?