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

Pavel Janda
Člen | 977
+
0
-

@BigCharlie Vlastní šablonou to jde. Udělej si normální action nebo column a v šabloně té action všechno pořeš..

chap
Člen | 81
+
+2
-

@PavelJanda – odpoved jsem vzal jako motivaci a poslal PR

MasterPK
Člen | 6
+
0
-

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
+
0
-

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
+
0
-

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.

Rypi
Člen | 38
+
0
-

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?

Editoval Rypi (5. 9. 2017 10:38)

Rypi
Člen | 38
+
0
-

Díky, alespoň vím, že to není moje chyba. Na githubu jsem to nenašel, tak jsem se rovnou zeptal bez procházení celého tématu…

Pavel Janda
Člen | 977
+
0
-

@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
+
0
-

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.“

andros
Člen | 145
+
0
-

Ahoj, snažím se rozchodit ublaboo tree. Vše mi funguje. Jen nemohu nějak přijít na to, jak přečíslovat pořadí po změně ve stromu. Ublaboo mi vrátí item_id, item_prev, item_next, parent_id. Nemáte někdo hotovou funkci, která to řeší ? Díky moc.

radas
Člen | 224
+
0
-

Ahoj, dá se někde jednoduše nastavit, aby MultiSelect filter používal podmínku AND (resp. IN) místo OR? Díky.

Zuben45
Člen | 268
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
+1
-

@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_4
Člen | 13
+
0
-

@PavelJanda díky, multiplier mě nenapadl, je to dobré řešení. Jenom nevím, jak potom datagridu předat parametr $name. Když mám v šabloně třeba {box-{$item->id}}, co patří do toho parametru?

Pavel Janda
Člen | 977
+
0
-

@pavel_4 Ukaž nějaký kód, mrknem na to.

radas
Člen | 224
+
0
-

Ahoj, bude datagrid podporovat Bootstrap 4? Díky.

Pavel Janda
Člen | 977
+
0
-

@radas Jasně, když pošleš PR s podporou bs4 :)
Jak moc se budou lišit classy a struktura html?

radas
Člen | 224
+
0
-

@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
+
0
-

@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
+
0
-

@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
+
0
-

@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)

+
0
-

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
+
0
-

Ahoj @PavelJanda Mohol by si sa pozrieť na už si naozaj neviem pomôcť …

https://forum.nette.org/…boo-onchange

Ďakujem

ryu
Člen | 29
+
0
-

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
+
0
-

@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
+
+1
-

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 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.

Hotovo – PR #580 je připraven.

chap
Člen | 81
+
0
-

Asi jsou teď nějak zaneprázdnění. Já čekám s PR #571 :)

sucho
Člen | 57
+
0
-

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
+
0
-

@sucho: Možná je to úplně mimo, ale nepomohlo by inicializovat grid $grid = new Ubla($this, $name)?

sucho
Člen | 57
+
0
-

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)

ryu
Člen | 29
+
0
-

@uncza Zkusil jsem, ale nedopadlo to moc dobre:

$comp = $this->getComponent("itemStavyGrid");
$grid->addComponent($comp,'itemStavyGrid2');

vrací

Nette\InvalidStateException

Component 'itemStavyGrid' already has a parent.
Pavel Janda
Člen | 977
+
+2
-

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
+
0
-

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.?

+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

@ryu Zajímavá otázka. Mrknu na to v sobotu. Teoreticky by to mohlo nějak fungovat.

ryu
Člen | 29
+
0
-

@PavelJanda Kdybys potřeboval někam hodit zdrojáky, dej mi vědět.

EDIT: Zkusil jsem ted subgrid přesunout do modal dialogu a chová se to úplně stejně. (změna je v tom, že parrent je presenter a ne ten velký grid)

Editoval ryu (13. 10. 2017 12:49)

Petr Parolek
Člen | 455
+
0
-

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
+
0
-

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
+
0
-

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í ?

theo
Člen | 57
+
0
-

@PavelJanda: prosím mohl by jsi se podívat na ten PR#580 od @elring? Rozhodně to není žádný enhancement jak to máš označené, ale je zcela jistě je to bugfix a to docela zásadní. Moc se přimlouvám za jeho brzké kooptování do kódu. Díky!

Pavel Janda
Člen | 977
+
0
-

@theo okie

Označení enhancement nevidím. Ale merged, 5.4.7 :)

Editoval Pavel Janda (20. 10. 2017 14:24)