ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- Pavel Janda
- Člen | 977
@BigCharlie Vlastní šablonou to jde. Udělej si normální action nebo column a v šabloně té action všechno pořeš..
- MasterPK
- Člen | 6
Mám jeden hloupý dotaz, ale nikde v dokumentaci ani na foru jsem nenašel
řešení. Vytvářím v presenteru Datagrid, vše funguje jak má, dokonce
i styl tabulky odpovídá šabloně, ale nemůžu přijít na to jak nastavit
styl výběru a tlačítka, kolik se zobrazí položek na jedné stránce.
Jediné co jsem našel je
$grid->setItemsPerPageList([1, 100, 9090, 2]);
což je výčet
položek.
Děkuji za odpověď.
- Rypi
- Člen | 38
Ahoj, zkouším tento nový grid a narazil jsem na jeden problém…
Mám grid s filtrováním, editací (asi není důležité) a inline přidáváním nových položek. Při přidávání jsem si některé pole definoval jako povinné (setRequired). Problém je v tom, že když změním filtr (například vyberu ze seznamu), tak mi vyskočí hláška, že jsem nevyplnil to povinné pole. A to i v případě, že jsem inline editaci ani neotevřel. Pokud otevřu editaci a pole vyplním, tak filtrování funguje.
Jinak musím poděkovat za super datagrid (když grido je mrtvé). Ještě jsem neprozkoumal všechno, ale vypadá to velmi dobře. :)
- iguana007
- Člen | 970
Rypi napsal(a):
Ahoj, zkouším tento nový grid a narazil jsem na jeden problém…
Mám grid s filtrováním, editací (asi není důležité) a inline přidáváním nových položek. Při přidávání jsem si některé pole definoval jako povinné (setRequired). Problém je v tom, že když změním filtr (například vyberu ze seznamu), tak mi vyskočí hláška, že jsem nevyplnil to povinné pole. A to i v případě, že jsem inline editaci ani neotevřel. Pokud otevřu editaci a pole vyplním, tak filtrování funguje.
Jinak musím poděkovat za super datagrid (když grido je mrtvé). Ještě jsem neprozkoumal všechno, ale vypadá to velmi dobře. :)
A jak se mohlo stat, ze povinne pole mas u nekterych zaznamu prazdne? Podle mne se jedna spise o problem v logice tve aplikace nez u datagridu.
- Pavel Janda
- Člen | 977
@Rypi Chápu. Kdyžtak je nějaký progress vidět v PR https://github.com/…rid/pull/570#…
Editoval Pavel Janda (5. 9. 2017 11:09)
- iguana007
- Člen | 970
Rypi napsal(a):
To prázdné pole je ve skrytem řádku pro přidání nového záznamu. Jak by také mohlo být vyplněné, když nechci nic přidávat, ale jen filtrovat současné záznamy?
Aha, no puvodne si psal, ze problem je s formularem na editaci, nikoli na pridavani: „Pokud otevřu editaci a pole vyplním, tak filtrování funguje.“
- Zuben45
- Člen | 268
Zdravím, narazil jsem na zajímavou věc. V datagridu používám Doctrine DataSource a pokud mám:
namespace App\Entity\Web\Actions;
...
class Line extends Object
{
...
/**
* @ORM\OneToOne(targetEntity="App\Entity\Products\Category")
* @ORM\JoinColumn(name="PRODUCT_ID", referencedColumnName="OID$CENKTGK08")
*/
protected $category;
}
tak když chci v datagridu property z category, tak to vrací null, ovšem pokud změním namespace Category na stejný jak má entita Line a nastavím targetEntity na Category, tak vše funguje jak má.
Zajímovostí ještě je, že pokud si vytáhnu ty property zvlášť třeba do dumpu, tak poté dostanu i do datagridu :)
Nemáte nějaké tipy a triky na toto ? Díky
EDIT: Tak jsem nakonec zjistil že mi to blbne jen když dám addColumnText a pak v addInlineAdd/Edit je místo něho select :)
Editoval Zuben45 (14. 9. 2017 14:17)
- kralik
- Člen | 230
Ahoj,
prosím používáte někdo tree-view na data-source nette/database?
Spíše by se mi hodil takový sub-datagrid.
Rád bych toto použil pro zobrazení doplňujících informací o uživateli (věk, skupina, pracovní zařazení, ap.)
Prosím o radu jak by se to mohlo zrealizovat.
Moc díky
Tom
Editoval kralik (15. 9. 2017 10:54)
- sevca79
- Člen | 55
ahoj,
jen asi taková jednoduchá pitomůstka, ale nemůžu na ní přijít..
používám v gridu setRowCallback na zobrazení řádku v jiné barvě, ale
já bych chtěl ještě přihodit nejen červenou barvu, ale i celý řádek
obalit nějakým textem, resp. přidat „title“
$this->setRowCallback(function($item, $tr) {
if ($item['peoplesCount']>20) {
$tr->addClass('color-red');
}
});
toto mi normálně funguje, ale rád bych přidal něco jako
$tr->addAttributes(['title' => 'pozor hodne lidi']);
avšak toto mi už title do TR nepřihodí..
jde prosím nějak jednoduše tohoto dosáhnout?? děkuji
- theo
- Člen | 57
elring napsal(a):
@elring Nemám k dispozici testovací postgre, mohl by jeden z vás poslat případně PR? :) Třeba s novým
DibiFluentPostgreDataSource
?Já ten PR klidně udělám. Už jsem ho měl i připravený. Je to jen nahrazení escapování pomocí dibi helperu za
$column = '[' . $column . ']'
. Jen nevím, jestli to dávat do speciální verze pro Postgres. V podstatě by to mělo být společné pro všechny db. Musel bych to ale otestovat na mysql…Ale samostatný
DibiFluentPostgreDataSource
by měl výhodu, že by se tam ve filtrování dalo propašovat nahrazení LIKE za iLIKE, což je opravdu specialita Postgresu pro case insensitive hledání… To je ale asi na jiný PR :)
@elring, @PavelJanda: Díky za objasnění i za vyřešení
problému. Velmi by se mi líbilo, kdyby se tahle oprava objevila tam, kde má
být (tj. podle všeho v Datagridu). DibiFluentPostgresDataSource
s ILIKE
místo LIKE
by byl naprosto skvělý a hodně
by pomohl i mě. Pokud to máte připraveno na PR, moc prosím a přimlouvám
se za jeho začlenění do Datagridu. Děkuji.
- Petr Parolek
- Člen | 455
Ahoj, nikde jsem nenašel zadávání data i času pomocí datetime picker. Nechyvbí vám tato nikomu taková šikovná funkce v JS?
Díky za info.
- pavel_4
- Člen | 13
Zdravím, chci se zeptat na jednu možnost použití a nikde jsem to nenašel, jestli to vůbec půjde.
Jde o to, že potřebuji v jedné šabloně vykreslovat více gridů
najednou a předem nevím kolik jich bude, teda vím, ale počet bude prostě
proměnlivý, takže vykreslování bude v nějakém cyklu. Každý grid ale
musí mít jiný datasource. Jak to tedy vyřešit? Zatím jsem si podědil
třídu DataGrid a v metodě render nastavuji datasource, což je ale špatně.
Ve výsledku mám v šabloně například xxGrid:first
a v render
metodě pak nastavení datasource.
Problém je, že se gridy sice načtou správně, ale není možné s nimi
cokoliv dělat, nefunguje reload, group actions apod. Vždy je v konzoli
Ublaboo\DataGrid\Exception\DataGridException: You have to set a data source first.
protože se datasource nastavuje až v té metodě render. Existuje na to
nějaké řešení? Díky.
Editoval pavel_4 (3. 10. 2017 9:01)
- Pavel Janda
- Člen | 977
@pavel_4 Můžeš použít
Nette\Application\UI\Multiplier
, můžeš v cyklu sám přidat
datagridy do stromu komponent a můžeš si udělat vlastní komponenty, které
budou dělat podobné věci. Těch cest je vícero.. Zkus mrknout na ten
Multiplier
– easy továrna na komponenty, najdeš
v nette docu.
- Pavel Janda
- Člen | 977
@radas Jasně, když pošleš PR s podporou bs4 :)
Jak moc se budou lišit classy a struktura html?
- radas
- Člen | 224
@PavelJanda Nějaké classy se jmenují jinak (např. u <label>, jiné je potřeba přidat ke stávajícím). Myslím, že to nebude až tak složité. Klidně si s tím pohraju. Máš nějaký nápad, jak to implementovat? Šablony jsou teď jedny. Spousta HTML kódu se generuje v třídách. Jestli to všechno ifovat uvnitř nebo jak a kde definovat, kterou verzi BS bude programátor chtít využívat?
Editoval radas (3. 10. 2017 15:17)
- Pavel Janda
- Člen | 977
@radas Hmm, zajímavá otázka. Nevím. Nějaké nápady? Držet dvě šablony není moc praktické a ifovat se mi také moc nelíbí. Lze to vyřešit jinak? Kdo by udržoval dvě vývojové větve? A má smysl dělat dvě vývojové větve jen kvůli BS?
2, Jeden z budoucích plánů: Implementovat víc „témat“. AdminLTE, BS3, BS4, Material a další. Už proto by bylo cool vyčlenit někam vedle theme-related věci.
- radas
- Člen | 224
@PavelJanda Mi se třeba líbí, jak to má vyřešeno Symfony s Twigem na formulářích. Tam je na všechno blok a kterýkoliv blok si může programátor v šabloně předefinovat.
- manwe
- Člen | 44
@PavelJanda Ahoj, nevis co muze zpusobovat tohle chovani itemDetailu?
https://gfycat.com/…Amazonparrot
Nemel bych tam mit zadne svoje extra styly… proste se to nacte, zobrazi, nacez to zmizne (detailu se nastavi display: none), a az po opetovnem kliku na ocicko se radek zobrazi…
HTML vypada po nacteni takto
https://i.imgur.com/5bFHmJJ.png
Editoval raddy668 (4. 10. 2017 9:28)
- Martin Krejčíček
- Člen | 2
Ahoj. Měl jsem problém s více gridy na jedné stránce. Při inline editaci mi zmizeli všechny editační tlačítka (fa fa-pencil) a po editaci se mi vrátili jen do editované tabulky. Je to standardní chování?
Vyřešil jsem to změnou v souboru datagrid.js.
Původní řádky:
$.nette.ext('datagrid.after_inline_edit', {
success: function(payload) {
var grid;
grid = $('.datagrid-' + payload._datagrid_name);
if (payload._datagrid_inline_edited) {
grid.find('tr[data-id=' + payload._datagrid_inline_edited + '] > td').addClass('edited');
return grid.find('.datagrid-inline-edit-trigger').removeClass('hidden');
} else if (payload._datagrid_inline_edit_cancel) {
return grid.find('.datagrid-inline-edit-trigger').removeClass('hidden');
}
}
});
Na:
$.nette.ext('datagrid.after_inline_edit', {
success: function(payload) {
var grid;
grid = $('.datagrid-' + payload._datagrid_name);
if (payload._datagrid_inline_edited) {
grid.find('tr[data-id=' + payload._datagrid_inline_edited + '] > td').addClass('edited');
return $('.datagrid-inline-edit-trigger').removeClass('hidden');
} else if (payload._datagrid_inline_edit_cancel) {
return $('.datagrid-inline-edit-trigger').removeClass('hidden');
}
}
});
(vyjmul jsem grid.find a smazal třídu hidden všem)
Má původní řešení nějaký zásadní účel o který v tomto případě přijdu?
- Gavrilo
- Člen | 46
Ahoj @PavelJanda Mohol by si sa pozrieť na už si naozaj neviem pomôcť …
https://forum.nette.org/…boo-onchange
Ďakujem
- ryu
- Člen | 29
Ahoj, zasekl jsem se na podivné trivalitě – nejde mi v item detail používat komponenty.
v šabloně pro detail mám:
{control itemStavyGrid}
a v presenteru potom
public function createComponentItemStavyGrid($name)
{
.
.
.
}
Jinde funguje jak má, ale pokud zobrazím detail,
dostanu: Component with name 'itemStavyGrid' does not exist
Přehlédl jsem něco?
- uncza
- Člen | 2
@ryu vyzkoušej něco jako:
$grid->addComponent($tvojeKomponenta, 'jmenoKomponenty')
Jinak doporučuju zkouknout přednášku Honzy Tvrdíka o komponentách
- elring
- Člen | 6
theo napsal(a):
elring napsal(a):
@elring Nemám k dispozici testovací postgre, mohl by jeden z vás poslat případně PR? :) Třeba s novým
DibiFluentPostgreDataSource
?Já ten PR klidně udělám. Už jsem ho měl i připravený. Je to jen nahrazení escapování pomocí dibi helperu za
$column = '[' . $column . ']'
. Jen nevím, jestli to dávat do speciální verze pro Postgres. V podstatě by to mělo být společné pro všechny db. Musel bych to ale otestovat na mysql…Ale samostatný
DibiFluentPostgreDataSource
by měl výhodu, že by se tam ve filtrování dalo propašovat nahrazení LIKE za iLIKE, což je opravdu specialita Postgresu pro case insensitive hledání… To je ale asi na jiný PR :)@elring, @PavelJanda: Díky za objasnění i za vyřešení problému. Velmi by se mi líbilo, kdyby se tahle oprava objevila tam, kde má být (tj. podle všeho v Datagridu).
DibiFluentPostgresDataSource
sILIKE
místoLIKE
by byl naprosto skvělý a hodně by pomohl i mě. Pokud to máte připraveno na PR, moc prosím a přimlouvám se za jeho začlenění do Datagridu. Děkuji.
Hotovo – PR #580 je připraven.
- sucho
- Člen | 57
Zdravím @PavelJanda snažím sa použiť $grid->setSortable();
a funkciu $grid->setSortableHandler()
chcem nastaviť
aby bola v control nie v Presentri
$grid->setSortableHandler('grid:rowSort!');
URL ale potom nedostáva názov componenty ale undefined
?do=grid-rowSort&undefined-item_id=12&undefined-prev_id=11&undefined-next_id=10
k hodnote sa nemôžem dostať nijakým spôsobom
public function handleRowSort($item_id, $prev_id, $next_id)
{
dump($item_id); // handle
dump($this->getParameter('item_id')); // control
dump($this->getParent()->getParameter('item_id')); // presenter
exit;
}
podal som už aj issue https://github.com/…d/issues/581
Editoval sucho (11. 10. 2017 7:23)
- Pavel Kravčík
- Člen | 1195
@sucho: Možná je to úplně mimo, ale nepomohlo by inicializovat
grid $grid = new Ubla($this, $name)
?
- sucho
- Člen | 57
Pavel Kravčík napsal(a):
@sucho: Možná je to úplně mimo, ale nepomohlo by inicializovat grid
$grid = new Ubla($this, $name)
?
už som objavil problém
je aktualizovaný template a je tam pridané
data-sortable-parent-path="{$control->getSortableParentPath()}"
a ja mám v administrácii vlastný templat kôli material designu
Editoval sucho (11. 10. 2017 8:13)
- Pavel Janda
- Člen | 977
Páni, tady to jede. :) Sobotu věnuji opensourcu.. Vynasnažím se pomergovat pár pull-requestů a resolvnou nějaké issues. Pokud budete mít nějaké dotazy, v sobotu budu online a duchem v ublaboo.
- radas
- Člen | 224
Ahoj @PavelJanda,
narazil jsem na problém, kdy chci datagrid použít uvnitř formuláře (mám
zkrátka obsáhlý formulář rozdělený do několika záložek, jsou ten jen
divy, přepínané javascriptem). Na jedné z těch záložek chci zobrazit
nějaký datagrid, který nemá řazení ani filtrování. V podstatě jen
obyčejná tabulka. Problém je ten, že i tak se grid vykreslí jako
formulář, viz obrázek, což samozřejmě způsobí problém
s odesláním původního formuláře, přepíše se hidden _do. Šlo by to
nějak udělat, aby se ten <form> generoval jen když je skutečně
potřeba? Tzn. používá se řazení, filtrování, inline editace apod.?
- Martin Krejčíček
- Člen | 2
Zdravím.
Mám problém s inline editací, když mám dataSource omezeno přes Where na
jinou tabulku:
$grid->setPrimaryKey('id_bank');
$grid->setDataSource($this->db->table('bank')->where(':contact_bank.id_contact = ?', $this->idContact)->order('id_bank DESC'));
Háže mi to chybu id_bank is ambiguous, což je logické při tomto dotazu:
SELECT bank.*, contact_bank.id_contact
FROM bank
LEFT JOIN contact_bank ON bank.id_bank = contact_bank.id_bank
WHERE (contact_bank.id_contact = '5') AND id_bank = '2'
Jak dostanu do where „bank.id_bank“?
Odpovím si sám, je tam nepovinný parametr při volání „addInlineEdit()“:
$grid->addInlineEdit('bank.id_bank')
Omlouvám se za zbytečný dotaz.
Editoval Martin Krejčíček (13. 10. 2017 14:48)
- ryu
- Člen | 29
Narazil jsem na jednu záludnost. Když je v datagridu použita inline editace, nebo přidávání a zároveň jsou sloupce skrývatelné, může dojít k situaci, kdy uživatel klepne na přidat, ale nevidí žádné inputy.
Chtělo by při editaci a přidávání automaticky zapnout sloupce které mají být editovatelné/mají input. Nebo aspoň všechny.
- ryu
- Člen | 29
@PavelJanda Ahoj, je možné, aby fungoval inlineAdd na „subgridu“ který je součástí itemDetail jiného (většího) gridu a dělám jen něco blbě, nebo to ani fungovat nemá a mám se vydat jinou cestou?
Jelikož tomu subgridu potřebuju předat ID položky pro kterou má vytáhnout data, celý grid se vlastně sestavuje až v přepsané metodě render() – tam se nastavuje i zpracování inlineAdd a myslím že tady je jádro pudla, protože po odeslání formuláře se vlastně volá komponenta, která není načtená (itemDetail je sbalený).
Momentálně mi to po odeslání vyhodí „Component with name ‚cancel‘ does not exist.“
- Pavel Janda
- Člen | 977
@ryu Zajímavá otázka. Mrknu na to v sobotu. Teoreticky by to mohlo nějak fungovat.
- Petr Parolek
- Člen | 455
Ahoj,
nedaří se mi udělat akci:
<?php
$grid->addAction('edit', 'Upravit','',['id','some_parameter'=>$this->presenter->getParameter("id")])
->setIcon('pencil');
?>
Tracy mi vrací:
Kdyby\Doctrine\MemberAccessException
Cannot read an undeclared property App\Model\Entities\SomeEntity::$5.
Jak mám prosím vytvořit akci v datagridu nezávisle na strukuře tabulky v DB? Díky moc.
EDIT:
Akorát mě napadl strašně kostrbatý způsob:
<?php
$grid->addAction('editPayment', 'Upravit')
->setRenderer(function($item) {
$link = $this->presenter->link("Some:editSomething",[$item->id,'some_parameter'=>$this->presenter->getParameter("some_parameter")]);
return '<a href="'.$link.'" class="btn btn-xs btn-default"><span class="fa fa-pencil"></span> Upravit</a>'; });
?>
Ví někdo lepší způsob? Díky
Editoval ppar (17. 10. 2017 13:39)
- chap
- Člen | 81
ppar napsal(a):
Takto by to neslo? Pak to tahani parametru pres presenter … mozna by slo resit lepe … predanim parametru pri vytovreni gridu … ale nevim jak to mas reseno.
$grid->addAction('edit', 'Upravit','Some:editSomething',['id','some_parameter'=>$this->presenter->getParameter("id")])
->setIcon('pencil');
Editoval chap (17. 10. 2017 23:57)
- David Kocur
- Člen | 1
Ahoj,
je nějaká možnost udělat při group action výběr celého filterovaného
výsledku bez ohledu na stránkování ?
- Pavel Janda
- Člen | 977
@theo okie
Označení enhancement nevidím. Ale merged, 5.4.7 :)
Editoval Pavel Janda (20. 10. 2017 14:24)