ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- andros
- Člen | 145
Ahoj,
pokud si v gridu nastavím „setColumnsSummary“ na určitý sloupec a inline edituji řádek, po uložení záznamu se přepočte sum pouze z editovaného řádku a ne ze všech zobrazených sloupců. Nevíte někdo prosím, jak to vyřešit ?
Díky moc.
$grid->setColumnsSummary(['totalPrice']);
- Isigarek
- Člen | 74
Díky za odpověď a ještě nějaká odpověď na předešlí dotaz? Jak nechat všechny nody defaultně otevřené v tree view?
Pavel Janda napsal(a):
@MW @Isigarek Podpora pro bs 4 je ready ve větvi
boostrap-4
. Bohužel se s mergnutím do5.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).
- Pavel Janda
- Člen | 977
@Isigarek Momentálně to nelze. Existuje na to stařičký PR (https://github.com/…ll/236/files). Ten PR by se musel zrefaktořit.
- Vladimír Pospíšil
- Člen | 13
Dobré ráno!
Mám velmi hloupý dotaz. Začal jsem pracovat s gridem a potřebuji vytvořit tree-view, ale nesedí mi poloha sloupců a jejich nadpisů, viz zde:
http://gdermog.rajce.idnes.cz/ruzne/#…
Je to nějaká známá blbost, co dělám? Resp. máte někdo nějaké
vodítko, kde bych mohl problém hledat?
Vřelé díky!
- suwer
- Člen | 33
Vypinam si remeber state kvuli tomu, aby se pri novem pristupu na stranku s datagridem nacetla vychozi konfigurace (strankovani na zacatku a razeni dle default nastaveni) a ne konfigurace ulozena v session. Bohuzel v tu chvili prestane fungovat defaultni skryti vybranych sloupcu. Ve skutecnosti moznost skryvani/zobrazovani sloupcu uplne prestane fungovat.
Jde tohle nejak rozdelit?
- Dark0ne
- Člen | 47
Zdravím,
řeším takovou drobnost, se kterou si ale lámo nějakou chvíli hlavu.
Mám addAction, do kterého mi může a nemusí přijít „exe_id“, ve
chvíli, kdy nepříjde, tak chci, aby se akce pro daný řádek vůbec
nezobrazovala.
Začal jsem to řešit nějak takto
$grid->addAction('exe_id', 'a', 'Execution:detail', ['id' => 'exe_id'])->setRenderer(function ($item) {
if($item->exe_id==null){
return null; //nezobrazim nic - to je ok
}
else {
return null; // zde potrebuji vratit celou akci (tedy funkcni odkaz), bohuzel $this->action mi vrací jen její název
}
});
Díky za rady.
- Zapp3
- Člen | 8
Dark0ne napsal(a):
Zdravím,
řeším takovou drobnost, se kterou si ale lámo nějakou chvíli hlavu.
Mám addAction, do kterého mi může a nemusí přijít „exe_id“, ve chvíli, kdy nepříjde, tak chci, aby se akce pro daný řádek vůbec nezobrazovala.Začal jsem to řešit nějak takto
$grid->addAction('exe_id', 'a', 'Execution:detail', ['id' => 'exe_id'])->setRenderer(function ($item) { if($item->exe_id==null){ return null; //nezobrazim nic - to je ok } else { return null; // zde potrebuji vratit celou akci (tedy funkcni odkaz), bohuzel $this->action mi vrací jen její název } });
Díky za rady.
@Dark0ne
Mělo by stačit
if($item->exe_id)
{
return TRUE;
}
Editoval Zapp3 (19. 4. 2018 12:23)
- Tomáš Vodička
- Člen | 28
Dark0ne napsal(a):
Zdravím,
řeším takovou drobnost, se kterou si ale lámo nějakou chvíli hlavu.
Mám addAction, do kterého mi může a nemusí přijít „exe_id“, ve chvíli, kdy nepříjde, tak chci, aby se akce pro daný řádek vůbec nezobrazovala.Začal jsem to řešit nějak takto
$grid->addAction('exe_id', 'a', 'Execution:detail', ['id' => 'exe_id'])->setRenderer(function ($item) { if($item->exe_id==null){ return null; //nezobrazim nic - to je ok } else { return null; // zde potrebuji vratit celou akci (tedy funkcni odkaz), bohuzel $this->action mi vrací jen její název } });
Díky za rady.
Akce lze skrývat pomocí funkce allowRowsAction()
viz https://ublaboo.org/datagrid/row#…
Editoval Tomáš Vodička (19. 4. 2018 13:08)
- Zapp3
- Člen | 8
Dark0ne napsal(a):
Zapp3 napsal(a):
@Dark0ne
Mělo by stačitif($item->exe_id) { return TRUE; }
True vrací „1“ nikoliv celou akci.
@Dark0ne
Moje chyba, zapomněl jsem napsat že je třeba použít
setRendererCondition() čili:
$grid->addAction('exe_id', 'a', 'Execution:detail', ['id' => 'exe_id'])
->setRendererCondition(function ($item)
{
if($item->exe_id)
{
return true;
}
}
nebo to co navrhuje Tomáš Vodička což je imho asi lepší
- vladimir
- Člen | 11
Ahojte,
začínám si hrát s timhle DataGridem a zatím super, jen bych se chtěl
zeptat, řešil někdo jak snadno zakázat ajaxové volání v rámci
datagridu?
Úplně naivní řešení zrušením reference na nette.ajax.js
rozbije JavaScript celkově (například checkboxy přestanou fungovat), takže
tohle není úplně ta správná cesta, ale co jsem koukal, tak ty ajax třídy
jsou vesměs zadrátované na original_template
.
Díky za nasměrování.
Vl.
- Petr Parolek
- Člen | 455
Ahoj,
@vladimir z jakého důvodu bys chtěl vypnout AJAX? Ten je dnes základ všeho
- FTCP
- Člen | 6
@PavelJanda zdravíčko, byla by možnost zapnutí/vypnutí duplikace paginátoru aby mohl být i nahoře ? Custom templatem jsem to zkoušel, ale je zde jedinný problém, který se mi nepodařilo vyřešit, při změně počtu řádků na stránku se aktualizuje počet stránek pouze v prvním vykresleném paginátoru a v druhém zůstane původní parametr per page i počet stránek, nebo by stačilo přidat možnost v createComponent definovat další snippety k reloadování
Editoval FTCP (10. 5. 2018 8:03)
- kralik
- Člen | 230
Ahoj,
nevíte prosím jak s CSV exportem z datagridu? Narazil jsem na
3 problémy.
Zatím jsem CSV export nepoužíval.
- Lze provést CSV export s verzí Nette 2.3.?
- dostával jsem chybovou hlášku o chybějící class SmartObject, který je ve verzi 2.4.
- nižší verze Ublaboo také nepomohla
- Na verzi Nette 2.4. dostávám tuto chybu
„Cannot read an undeclared column ‚action‘.“
DataGrid
<?php
...
$grid->addColumnText('action', 'Menu')
->setTemplate(__DIR__ . '/templates/Sprava/usMenu.latte');
...
?>
- Jednoduchý výběr sloupců pro export z existujícího datagridu
Když mám již datagrid nadefinovaný mohl bych jednoduše vybrat sloupce pro export.
Nějak takto:
<?php
$grid->addExportCsv('Csv export', 'examples_all.csv')
->setTitle('Csv export')
->setColumns(array('jmeno','prijmeni','email'));
?>
než přes „složitější“ definování znovu každého sloupce
Bohužel nevím jak přidat více sloupců než jen „jmeno“
<?php
$column_name = new Ublaboo\DataGrid\Column\ColumnText($grid, 'jmeno', 'jmeno', 'Jméno');
$grid->addExportCsv('Csv export', 'examples_all.csv')
->setTitle('Csv export')
->setColumns([
$column_name
]);
?>
Moc díky
Editoval kralik (1. 6. 2018 11:18)
- Čamo
- Člen | 798
Prosím Vás vie niekto ako nastavím v dátumových filtroch, začiatok týždňa v kalendári na podnelok? V dokumentácii https://ublaboo.org/datagrid/filter?… je len setFormat()
EDIT: Tak to vyzerá že
->setFilterDateRange()->setAttribute('data-date-week-start', 1);
EDIT2: Alebo skôr prilinkovať
/locales/bootstrap-datetimepicker.cs.min.js
+ $.fn.datepicker.defaults.language = 'cs'
Editoval Čamo (19. 6. 2018 19:35)
- Felix
- Nette Core | 1197
Priprava v5.7.0
Github: https://github.com/…d/issues/680
Pokud vite o nejakem bugu, nebojte se zapojit a poslete PR nebo napiste komentar. Ve verzi v5.x se jiz nebudou objevovat nove veci, vsechen volny cas se investuje do v6.x, ktera bude postavena na PHP 7.1.
- libik
- Člen | 96
Ahoj,
lze nejak pres addToolbarButton definovat rekneme tri buttony, vedouci na stejnou action jen s jinym parametrem v url?
$grid->addToolbarButton('create', 'Vložit odkaz', ['type' => 'link']);
$grid->addToolbarButton('create', 'Vložit stránku', ['type' => 'page']);
$grid->addToolbarButton('create', 'Vložit sekci', ['type' => 'node']);
Totok neprojde. Diky!
- libik
- Člen | 96
Tak si mezitim odpovim :)
$grid->addToolbarButton('whatever', 'Vložit')->setRenderer(function() use ($presenter) { return Html::el('a')->href($presenter->link('create', array('type' => 'node')))->setAttribute('class', 'btn btn-xs btn-outline btn-info')->setHtml(Html::el('span')->setAttribute('class', 'fa fa-plus').' Vložit sekci'); });
- Neo-Mike
- Člen | 22
Zdravím,
děje se mi, že pokud nastavím setRequired na prvek
v addInlineAdd, tak při vyhledávání dojde k vyskočení alert
okna. Pokud před tím přepunu na jiný počet položek v zobrazení gridu na
stránce nebo provedu editaci záznamu, tak vyhledávání funguje jak má. Jak
se tohle dá vyřešit? Díky za rady
- Croc
- Člen | 270
Zdravím, potřeboval bych pomoc s inline add/edit. Vše funguje jak má, jen s použitím selectize právě v inline add/edit bych potřeboval při překreslení či při zobrazení formu vynulovat hodnoty v selectize. Problém je následující:
- Kliknu na tlačítko přidat a správně se mi objeví form na přidání.
- Vyplním 3 znaky do selectize a ten mi dynamicky z DB vyhledá nějaké entity a zobrazí.
- Jednu z nich vyberu a formulář uložím. Entita do datagridu se přidá.
- Kliknu opět na tlačítko přidat a správně se mi objeví form na přidání.
- Kliknu do selectize a ten mi nabídne entitu, kterou jsem vyhledával v kroku 2.
Cílem je, aby v kroku 5 byl selectize opět prázdný. Nejlepší by bylo, kdybych mohl nějkým způsobem před zobrazením formuláře či při překreslení po odeslání selectize pomocí JS vynulovat.
Existuje nějaký způsob jak zavolat custom JS v popsaném případě?
Moc děkuju za odpovědi.
Editoval Croc (19. 8. 2018 18:30)
- Mistrfilda
- Člen | 76
Ahoj,
třeba https://www.npmjs.com/…boo-datagrid nebo https://yarnpkg.com/…boo-datagrid pro custom assety (nejsem si ale jist jestli je to oficialne podporovano :D v dokumentaci se o tom nepise a pak jsem nasel https://github.com/…d/issues/676), ostatní assety (bootstrap, bootstrap datetimepicker) je nutné najít a doinstalovat, seznam je dole v bower.json
Editoval Mistrfilda (24. 8. 2018 19:06)
- MW
- Člen | 626
Mistrfilda napsal(a):
Ahoj,
třeba https://www.npmjs.com/…boo-datagrid nebo https://yarnpkg.com/…boo-datagrid pro custom assety (nejsem si ale jist jestli je to oficialne podporovano :D v dokumentaci se o tom nepise a pak jsem nasel https://github.com/…d/issues/676), ostatní assety (bootstrap, bootstrap datetimepicker) je nutné najít a doinstalovat, seznam je dole v bower.json
Taky jsem hledal, ale jedině Bower teď nainstaluje komplet vč. závislostí. Jinak ručně.
- Jurix
- Člen | 11
MW napsal(a):
Mistrfilda napsal(a):
Ahoj,
třeba https://www.npmjs.com/…boo-datagrid nebo https://yarnpkg.com/…boo-datagrid pro custom assety (nejsem si ale jist jestli je to oficialne podporovano :D v dokumentaci se o tom nepise a pak jsem nasel https://github.com/…d/issues/676), ostatní assety (bootstrap, bootstrap datetimepicker) je nutné najít a doinstalovat, seznam je dole v bower.json
Taky jsem hledal, ale jedině Bower teď nainstaluje komplet vč. závislostí. Jinak ručně.
Bower není pro nové projekty doporučen – je zastaralý. Je to opravdu v současnosti to nejlepší řešení?
- Mistrfilda
- Člen | 76
Ahoj,
jestli chapu spravne, chces do filtru napsat reguralni vyraz, pomoci ktereho se vyfiltruji zaznamy dale? Jesli ano myslim ze by to slo pres „Custom where condition“ – https://ublaboo.org/datagrid/filter
- pavelinnuendo
- Člen | 33
Ahoj, funguje vám boostrap-select při inline editaci celého řádku ve FF? Při přidání nového je vše ok, ale při následné editaci se ve FF select vůbec nezobrazí. Chrome je ok. Updatoval jsem na 5.6, jquery, boostrap na poslední verze, ale v editaci prostě takový select ve FF nevidím, dokud mu neodeberu tu css třídu.
- kajinek32
- Člen | 35
Ahoj,
řeším inline editaci (dle dokumentace tu „malou“ – jednoho pole) a
poté překreslení daného řádku.
Když je editace pole potvrzena, vykoná se custom funkce correctionEdited:
$grid->addColumnNumber('pieces_correction', 'Korekce')
->setEditableCallback([$this, 'correctionEdited'])
->setEditableInputType('number', ['class' => 'form-control input-tiny'])
->setSortable();
V tu chvíli se mi ale zbytek řádku nepřekreslí sám.
Používám ArrayDataSource (získávám data pomocí FetchAll()), zkoušel jsem
tedy dle
rad autora překreslit grid (stačil by i řádek) ručně, tedy
nějak takto:
$grid->getInlineEdit()->onCustomRedraw[] = function() use ($grid) {
$grid->setDataSource($this->db->query('SELECT id,name FROM myTable')->fetchAll());
$grid->redrawControl();
};
jenomže mám pocit, že ten onCustomRedraw[] se volá jen při editaci celého řádku? (Umístil jsem do něj zápis do logu, a nevypsalo se mi do něj nic).
Z funkce correctionEdited zas neumím tomu gridu nastavit RedrawControl, ani mu nastavit znovu DataSource.
public function correctionEdited($id, $value)
{
$toDb = [
'pieces_correction' => $value
];
$this->stockTakingItemModel->editOrAdd($toDb,$id);
}
Jak tedy překreslit jeden řádek?
Díky za radu.
- Jurix
- Člen | 11
Ahojte,
zápasím s formulářem v detailu a nevím co dělám blbě. Po kliku na save
button se vykoná AJAX a v konzoli prohlížeče (v hlavičkách) vidím
správnou hodnotu odeslaného inputu. Ale nedaří se mi tyto hodnoty
formulářových polí vrátit do komponenty.
Abych byl přesnější, metoda v kódu níže nevykoná nic (nevykreslí flash
message, neuloží do DB… prostě nic). Přitom AJAX response je
success – 200.
$container->addSubmit('save', 'Save')
->onClick[] = function($button) use ($grid, $presenter) {
$values = $button->getParent()->getValues();
// tady mi nic nefunguje
};
Netušíte, v čem by mohl být zádrhel?
Díky moc!
- theo
- Člen | 57
Ahoj,
existuje nějaká šance, že by v dohledné době vznikla nějaká verze Datagridu, která by měla jednak podporu pro Bootstrap 4 (vim, že taková už je) a zároveň by měla podporu pro Dibi 4.0? Tam se totiž změnilo Fluent rozhraní (zmizla třída DibiFluent) a mě by se docela hodila, protože umí pěkné nové psí kousky s PostgreSQL, které by se mi opravdu hodily (např. to umí handlovat datový typ JSON). Díky.
Editoval theo (3. 10. 2018 12:33)
- Paradiso
- Člen | 101
Pavel Janda napsal(a):
@romiix.org
$grid->getTemplate()->foo = 'bar'
je možné pracovat s aktuálním záznamem?
představoval jsem si něco, jako:
$grid->setItemsDetail(function($row) {
$foo = new Foo($row);
$grid->getTemplate()->foo = $foo->getResult();
});
$grid->setTemplateFile(__DIR__ . '/../templates/Invoices/detailTemplateGrid.latte');
příklad: mám faktury a při detailu bych potřeboval zobrazovat vypočtené položky, o výpočet se mi stará nějaká třída a nechci to počítat přímo v šabloně, ale potřebuji zachovat funkčnost formuláře
- Paradiso
- Člen | 101
Pavel Janda napsal(a):
@Paradiso Pomohla by třebas metoda
ItemDetail::setTemplateParameters()?
no zapomněl jsem říct jednu podstatnou věc. Pokud nastavím to rozšíření šablony i ten detail, tak v tu chvíli se mi ignoruje ten callback. Takže i když si zkusím:
$grid->setItemsDetail(function($row) {
dump(1); exit;
});
$grid->setTemplateFile(__DIR__ . '/../templates/Invoices/detailTemplateGrid.latte');
tak se vůbec ten dump neprovede a vrátí se výsledek ze šablony. Pokud nepoužiji tu šablonu, tak mi to ten callback bere. Což je právě věc, která mne mate. V podstatě bych potřeboval vědět, jaký callback použít, aby mi to fungovalo. Nebo to chápu špatně?
představuji si, že když bych dal setTemplateParameters mimo callback, tak si tam mohu poslat statická data pro všechny řádky, ale nemohu pracovat s konkrétním řádkem.
- zoool
- Člen | 89
Ahoj dá se nějak vytvořit filtr aby filtroval to zda je pole null či
není? Potřeboval bych filtr select a tam dát tři option
vse, když je pole null a když pole není null
takto to nefunguje
$grid->addFilterSelect(‚aktivni‘, ‚Aktivní:‘, ['' ⇒ ‚All‘,
‚IS NULL‘ ⇒ ‚Aktivní‘, ‚IS NOT NULL‘ ⇒
‚neaktivní‘],‚datum_deinstalace‘);
Děkuji
- Pavel Janda
- Člen | 977
@zoool Udělej si vlastní filtrační callback..
$grid->addFilterText('custom', 'Custom search:', 'name')
->setCondition(function($fluent, $value) {
/**
* The data source is here DibiFluent
* No matter what data source you are using,
* prepared data source will be passed as the first parameter of your callback function
*/
$fluent->where('id > ?', strlen($value));
});
- jikki
- Člen | 73
Ahoj, takto mám udělaný TreeView. Zobrazují se mi šipky na rozbalení u všech položek, i vnořených, i když položka nemá žádného potomka. Poradíte někdo co mám špatně prosím?
<?php
public function createComponentTreeStructure()
{
$grid = $this->myTreeViewFactory->create();
$stock = $this->wh->em->find(Entity\Stock::class, 1);
$qb = $this->wh->em->createQueryBuilder();
$qb->select('e')
->from('\App\Model\Entity\Stock', 'e')
->where('e.parent = :stock')
->setParameter('stock', $stock->id)
;
$qb->getQuery()->getResult();
$grid['grid']->setDataSource($qb);
$grid['grid']->setTreeView(function ($parent)
{
$qb = $this->wh->em->createQueryBuilder();
$qb->select('e')
->from('\App\Model\Entity\Stock', 'e')
->where('e.parent = :parent')
->setParameter('parent', $parent)
;
return $qb->getQuery()->getResult();
}, 'id');
$grid['grid']->addColumnText('stockName', 'Název umístění');
$grid['grid']->addColumnText('parent.stockName', 'Nadřazené umístění');
$grid['grid']->addColumnNumber('id', 'Id');
$grid['grid']->setPagination(false);
return $grid;
}
?>
díky moc
Editoval jikki (19. 10. 2018 7:35)
- cujan
- Člen | 410
@PavelJanda
<?php
<?php
namespace App\DataGrid;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
use Nette,
Ublaboo\DataGrid\DataGrid,
App\Model\NavstevaManager;
/**
* Description of NavstevaDataGridFactory
*
* @author Holub
*/
class NavstevaDataGridFactory {
private $navstevaManager;
public function __construct(NavstevaManager $navstevaManager) {
$this->navstevaManager = $navstevaManager;
}
public function create()
{
$grid = new DataGrid();
$grid->setDataSource($this->navstevaManager->getRecords());
$grid->addColumnDateTime('datumZapisu', 'Dátum zápisu');
$grid->addColumnDateTime('datumNavsteva', 'Dátum návštevy');
$grid->addColumnText('priezvisko', 'Priezvisko','users.priezvisko');
$grid->addColumnDateTime('casPrichod', 'Čas príchodu')-> setFormat ( 'H: i: s' );
$grid->addColumnDateTime('casOdchod', 'Čas odchodu')-> setFormat ( 'H: i: s' );
return $grid;
}
}
?>
Pavel Janda napsal(a):
@cujan Můžeš ukázat factory celého gridu?