ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- Pavel Janda
- Člen | 977
:) Díky!
Okey, pokud by se ti to nepovedlo, zařadím to do roadmapy, jen se k tomu
nedostanu asi úplně hned. Uvidíme.
- Roman Halaxa
- Člen | 60
Ahoj,
měl bych dotaz. Jak jednoduše vymažu všechny filtry programaticky?
Use case:
pokud uživatel příjde z presenteru xyz, nechat filtry co jsou zapamatované,
jinak smazat a zobrazit grid bez filtru.
Vím že je můžu mazat jednotlivě metodou removeFilter(), ale jde to jednodušeji? Hrabu se ve zdrojáku a nemůžu nic takového najít.
- jikki
- Člen | 73
Ahoj lidi,
v datagridu chci používat ty nové happy-inputs 2.x instalované z NPM. Nicméně zlobí to.
Při načtení stránky se happy inputy nezobrazí. Zobrazí se a fungují až poté co stránkuji.
<link rel="stylesheet" type="text/css" href="{$basePath}/node_modules/happy-inputs/src/happy.css">
<script src="{$basePath}/node_modules/happy-inputs/src/nomodule-es5-fallback.js"></script>
<script>
var happy = new Happy;
happy.init();
</script>
Došel jsem do fáze kdy se mi zobrazovaly i při načtení, zobrazily se
i při stránkování, ale nebylo možné je zaškrtnout.
Také se mi povedla varianta, kdy se zobrazovaly při načtení stránky, ale
při stránkování zmizly.
Nejvtipnější byla varianta kdy se mi zobrazovaly při načtení i při
stránkování, ale nešly zaškrtnou na všech stránkách :)
Poradí někdo co dělám špatně?
Děkuji
EDIT: zjistil jsem, že to funguje správně, když block s JS dám nakonec <body>.
Editoval jikki (2. 10. 2020 11:33)
- marky_v
- Člen | 1
Ahoj, mám dotaz. Nefunguje mi funkce setRendererOnCondition na sloupci columnStatus, callbacky v ní se vůbec nezavolají. Na jiných sloupcích to funguje normálně. Čím to může být? Nebo dělám něco špatně?
$this->addColumnStatus('state', "Stav")
->addOption('active', "aktivní")
->setClass('btn-primary')
->endOption()
->addOption('closed', "uzavřená")
->setClass('btn-danger')
->endOption()
->setRendererOnCondition(function () {return 'xxx';}, function () {return true;})
->onChange[] = [$this, 'changeState'];
Díky.
- Zdeno1981
- Člen | 115
Ahoj,
začal jsem používat tento doplněk a nevím jestli jsem to někde
přehlédnul, je nějaká možnost jak si upravit třídy u tabulky?
potřeboval bych vyhodit třídu: table-striped table-bordered
a přidat table-light tak aby nám to grafický ladilo
s ostatními tabulky v systému.
- kralik
- Člen | 230
Ahoj,
rád bych se zeptal.
přešel jsem na Nette v3.0.6 a datagrid v6.2.28 a bohužel dostávám
chybu.
Na stařsím Nette v2.4.x jsem si předávat ID přes URDL do datagridu. To mi
teď již nejde.
Přes url jsem si předal ID takto
https://localhost/…/uzivatele/9
Componenta datagridu
...
$urlId = (int) $this->request->getParameter('id');
...
if($urlId > 0) {
$grid->setDefaultFilter(['id' => $urlId]);
}
DataGrid bez ID v URL funguje v pořádku. Jakmile přidám do URL ID dostanu chybu.
TypeError
explode() expects parameter 2 to be string, integer given
Údajně problém zde:
Ublaboo\DataGrid\DataSource\NetteDatabaseTableDataSource
Hledám problém už asi 3 hodiny a nemůžu na to přijít.
Mooc díky za radu
- Zdeno1981
- Člen | 115
Ahoj,
chci se zeptat, jakým způsobem můžu zarovnat text v th vlevo u datumu? který se zarovnává vpravo.
aktuálně to mám takto:
$grid->addColumnDateTime('date', 'training.date')
->addCellAttributes(['class' => 'text-left'])
->setFilterDate()
->setAttribute('type', 'date')
->setTemplate(__DIR__ . '/../templates/trainingEmployees/grid.date.latte');
Třída se tam sice vloží ale výsledek je takový, že třída text-left je vložená před původní třidu text-right.
Editoval Zdeno1981 (22. 10. 2020 12:14)
- Pavel Janda
- Člen | 977
@Zdeno1981 setAlign dělá zarovnání obojího. Nevím, jestli to jde separátně, myslím, že ne.
- pp
- Člen | 50
Ahoj,
pouzivam tento datagrid se zdrojem dat NetteDatabaseDataSource.
Bohuzel jsem nenalezl v dokumentaci jak se v tom pripade odkazovat na
propojene tabulky – predpokladam ze ref a
related lze pouzit pouze u Nette Database Explorer (to ale
kvuli slozitejsimu dotazu s JOINy nemuzu pouzit).
Query mam ted zadanou takto (otazka zda ty JOINy s tabulkou c resp. d musi byt hned pri definici datasource) protoze by se pouzily az na vyzadani (viz DOTAZ 3)
$query = 'SELECT a.*,c.essid,d.system_cfg,d.modified AS system_cfg_modified FROM `ubnt_sta` a
INNER JOIN ( SELECT `lastip`, MAX(`modified`) AS max_modified FROM `ubnt_sta` GROUP BY `lastip` ) b
ON a.lastip = b.lastip AND b.max_modified = a.`modified`
LEFT JOIN `ubnt_ap` c
ON a.ap_ip = c.deviceIP
LEFT JOIN `ubnt_cfg` d
ON a.lastip = d.lastip'
;
Pokud si ale zobrazim napr. ItemDetail tak se prida ke query „WHERE id = ‚123‘“ a koncim na
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous
Pokud se pokusim upresnit ve sloupci
$grid->addColumnText('id', 'ID', 'a.id') nebo $grid->addColumnText('id', 'ID', 'ubnt_sta.id')
koncim :
Cannot read an undeclared column 'a.id', did you mean 'id'?
Kudy na to ?
2. DOTAZ
lze mit u kazdeho radku ItemDetail vicekrat (s ruznou sablonou) ? (napr. pro
zobrazeni poznamek, konfigurace atd)
3. DOTAZ
Jak na bunku v gridu navazat rozsirujici dotaz se zobrazenim vysledku prave
v ItemDetail popr. v POPUP okne – napr. najetim mysi na polozku spustit
vyhledani v DB a dotazeni hodnot. Mohl by mi nekdo poskytnout nejakou kostru
mozneho reseni. Dekuji
- pesMamlas
- Člen | 8
Ahoj
jedu na Nette 2.4.4 (DataGrid 5.7) projekt a snažím se rozchodit paginator a itemdetail.Bohužel jsem u obou pohořel:
Paginator:
Nastavení mám následující:
$grid->setPagination(TRUE);
$grid->setItemsPerPageList([10, 20, 50, 100, 1000], TRUE);
$grid->setDefaultPerPage(100);
Zobrazí dropdown s hodnotami, ale při změně se nic nezmění (ani AJAX neprojde).
Item Detail
U itemdetailu se zobrazí button, při najetí se zobrazí „dataTable-id=21&SEQ=23do=dataTable-getItemDetail“. Při kliknutí projde AJAX (Tracy), ale nic se nezobrazí. (*id je záznam a SEQ je předek záznamu pro potřeby editace)
$grid->setItemsDetail()->setTitle('Info');
$grid->setTemplateFile(__DIR__ . '\templates\CustomTemplates\dataGridTemplates\item_detail.latte');
{extends $original_template}
{block detail}
<p>Lorem ipsum ...</p>
{/block}
Můžete mě prosím trošku nakopnout?
Díky moc
- martin28
- Člen | 40
AHoj, prosim jak to resite?
Pouzivam tento datagrid a super jen jsem na zacatku sveho projektu a casto menim sloupce. Jde o to ze kdyz si nejaky uzivatel filtruje nebo srovnava podle uvedeneho sloupce, ktery ja pak odeberu tak mu to spadne- Jasny je to ulozeny v session a proste se podle toho hleda. Staci pak vymazat cookies ale to asi nejde psat zakaznikum. Nebo pak staci vymazat atresar /temp? Dekuji Martin
- jikki
- Člen | 73
Ahojte lidi,
měl bych 2 dotazy:
- lze nějak nastavit, aby konkrétní sloupce nebylo možné skrýt a jiné ano? pokud povolím $grid->setColumnsHideable(); tak se dají skrývat všechny. Nicméně hodila by se možnost, aby se skrývání dalo povolit pouze pro určité sloupce.
- tlačítko s ozubeným kolečkem pro zobrazení/skrytí sloupců zobrazí nabídku sloupců. Při každém kliknutí nabídka zmizí. Lze to udělat tak, aby nabídka zůstala zobrazená dokud se neklikne mimo? tedy chování stejné jako filter multiselect.
Děkuji
- dTTb
- Člen | 30
@PavelJanda V dokumentaci https://contributte.org/…columns.html#… asi chybi hranate zavorky, je tam
$grid->setDefaultSort('id' => 'DESC', FALSE);
misto
$grid->setDefaultSort(['id' => 'DESC'], FALSE);
- Gogokt
- Člen | 15
Zdravím,
mám dva dotazy:
- při small line edit jak kontrolovat vstup uživatele (isRequired atd.) ideálně na straně prohlížeče.
- Nezobrazují se mi flashMessage při zpracování handle metod. Vím asi
proč ale nevím jak řešit.
Mám použité Nittro a předpokládám, že to buje v té ajaxizaci.
public function columnNameEdited($id,$value){
$this->flashMessage("Uloženo", 'success');
if ($this->isAjax()) {
$this->redrawControl('flashes');
$this['uzivateleGrid']->reload();
} else {
$this->redirect('this');
}
}
Děkuji za pomoc…
- Roman Halaxa
- Člen | 60
Ahoj,
měl bych asi jednu připomínku k dokumentaci. Možná by nebylo od věci uvést u inline add, že při použití array datasource je nutné při překreslení znovu získat datasource? Alespoň myslím že tomu tak je. Vždycky hledám proč se mi to nechce překreslit a pak si na to vzpomenu :D Jestli je jiná cesta budu rád když se podělíte. Díky
- Pavel Janda
- Člen | 977
@RomanHalaxa Pošleš pls pr na github? :) Máme tam adresář s dokumentací: https://github.com/…master/.docs Dííky
- Roman Halaxa
- Člen | 60
@PavelJanda máš ho tam
Beru zpet, nemáš. Musim zjistit jak se to dělá :D :D
EDIT 2 : tak snad
Editoval Roman Halaxa (27. 11. 2020 14:34)
- pavelinnuendo
- Člen | 33
Ahoj, prosím, lze nějak nastavit focus na jiný sloupec (než první) při editaci záznamu?
- Roman Halaxa
- Člen | 60
Ahoj. Narazil jsem že při překreslení gridu (inline edit/add) se znovu nevyhodnocuje allowRowsAction ani setClass. Je to tak zamýšlené nebo mám něco špatně? Děkuju.
- Pavel Janda
- Člen | 977
@RomanHalaxa To určitě zamýšlené není. Mohl bys, prosím, připravit jednoduchou ukázku tohoto bugu s nějakou sqlite třeba pomocí tohoto sandboxu? Díky moc!
- Pavel Janda
- Člen | 977
@pavelinnuendo Aktuálně nejde. Ale byla by to super featura! Můžeš poslat PR, rádi ho mergneme. :)
- Šaman
- Člen | 2659
Ahoj. Je možné nastavit někde defaultní zarovnání sloupců? Chci mít
všechno vlevo, pokud neurčím jinak. Teď se mi datumy a čísla zarovnávají
vpravo. Je to protected
hodnota nastavená přímo ve třídě
s definicí sloupce, takže mě nenapadá moc jak to upravit globálně.
A nastavovat setAlign('left')
u každého sloupce s datumem
není ani čisté (továrna na grid se o vykreslení nemá moc starat) ani
pohodlné.
Díky.
- Pavel Janda
- Člen | 977
@Šaman Globálně to nejde, ale můžeš si třeba odchytit event
DataGrid::$onColumnAdd a pro sloupce typu ColumnDateTime nad tím rovnou volat
setAlign(left)
.
- pavelinnuendo
- Člen | 33
Pavel Janda napsal(a):
@pavelinnuendo Aktuálně nejde. Ale byla by to super featura! Můžeš poslat PR, rádi ho mergneme. :)
ok, rozumím. Spíše jsem myslel, zda by to šlo nějak jednodušeji javascriptem (tam jsem úplně nejslabší). Ale pokud bychom se bavili o pull requestu, měla by to nastavovat metoda na gridu nebo na sloupci?
- Šaman
- Člen | 2659
Pavel Janda napsal(a):
@Šaman Globálně to nejde, ale můžeš si třeba odchytit event DataGrid::$onColumnAdd a pro sloupce typu ColumnDateTime nad tím rovnou volat
setAlign(left)
.
Díky, tohle funguje (umístěné v továrně).
$grid->onColumnAdd[] = function($key, Column $column) {
$column->setAlign('left');
};
Ale měl jsem teď zásek na formátování. Mám v tabulce textový sloupec
action
(tabula logování uživatelských akcí). A v tabulce
bylo dost rozhozené formátování, dokud jsem nezjistil, že
col-action
má natvrdo nastavenou šířku už v CSS v assetech.
Nebylo by lepší si pro sloupce typu Column\Action
přidat
unikátní třídu a jen tu formátovat? Naštěstí pomohl stejný postup,
přidat si pro tento případ unikátní třídu a té vynutit
width: inherit;
a white-space: inherit;
$grid->onColumnAdd[] = function($key, Column $column) {
if ($key === 'action' and !($column instanceof Action)) {
$column->addCellAttributes(['class' => 'col-text-action']);
}
};
Editoval Šaman (16. 12. 2020 19:03)
- Pavel Janda
- Člen | 977
@tom subgridy – co přesně tím myslíš? Máš pls ukázku? Nicméně grid v políčku gridu by asi měl jít udělat..
To druhé jde, viz https://contributte.org/…/export.html
- Gappa
- Nette Blogger | 208
jAkErCZ napsal(a):
Mám dotaz když používám funkci addExportCsv jak si vymezím aby mi to třeba vyexportovalo vždy jen aktuální měsíc?
Díky
https://contributte.org/…/export.html#…
K tomu by měla sloužit metoda
$grid->addExportCsvFiltered()
, ta bude exportovat jen to, co je
vidět. Nebo to předat jako parametr metodě
$grid->addExportCsv()
.
- turbo80
- Člen | 50
Ahoj,
mam na vas otazku.
Chtel bych si predelat setConfirmation aby se nezobrazoval Confirm z js
confirm();, ale aby se zobrazoval treba http://bootboxjs.com
Vsem dekuji za radu.
Editoval turbo80 (9. 1. 2021 21:30)
- petak23
- Člen | 16
Ahojte,
mám jeden konkrétny dotaz.
Datagrid mám nainštalovaný cez npm. Vo svojom projekte používam webpack.
Ako správne naimportovať js súbory, aby datagrid fungoval? Skúšal som
všeličo, aj som prešiel toto fórum a viem že sa to tu už naškrtlo, ale
neviem si rady, a stále končím pri chybovej hláške:
Uncaught Error: Include Naja.js or nette.ajax for datagrids to work!
Ako to má byť správne?
Tu je package.json:
...
"dependencies": {
"@fortawesome/fontawesome-free": "^5.15.0",
"assets-webpack-plugin": "^5.1.2",
"axios": "^0.21.1",
"bootstrap": "^4.5.3",
"bootstrap-vue": "^2.21.1",
"jquery": "^3.5.1",
"lodash": "^4.17.20",
"naja": "^2.1.1",
"nette-forms": "^3.1.0",
"ublaboo-datagrid": "^6.4.1",
"vue": "^2.6.12"
},
...
a súbor main.js:
import jquery from 'jquery';
import 'bootstrap/dist/js/bootstrap.bundle';
import naja from 'naja';
document.addEventListener('DOMContentLoaded', naja.initialize.bind(naja));
import datagrid from 'ublaboo-datagrid/assets/datagrid.js';
import netteForms from 'nette-forms';
netteForms.initOnLoad();
window.Nette = netteForms;
import 'ublaboo-datagrid/assets/datagrid-instant-url-refresh.js';
import 'ublaboo-datagrid/assets/datagrid-spinners.js';
Ďakujem za pomoc.
- jiri.pudil
- Nette Blogger | 1029
Ako to má byť správne?
Já si pořád myslím, že by v principu mělo fungovat tohle, tzn. nejlépe použít ProvidePlugin. A doufat, že to nerozbije například nějaká následná minifikace, což si myslím mohl být případ i toho odkazovaného vlákna.
Update: nebyl to případ odkazovaného vlákna. ProvidePlugin
zdá se funguje, ale musí se mu napovědět, aby providoval defaultní
export:
new webpack.ProvidePlugin({
naja: ['naja', 'default'],
});
Editoval jiri.pudil (15. 1. 2021 11:20)
- pp
- Člen | 50
Ahoj,
nejaky cas prochazim diskuze a snazim se zjistit jaky ‚datasource‘ je pro
muj projekt pri pouziti tohoto datagridu nejvhodnejsi.
Jde o to, ze se snazim propojit nekolik tabulek (kazda ma nekolik desitek tisic
zaznamu) a pri tom v nich pouzivat agregacni funkce. V tabulkach pribyvaji
aktualnejsi polozky a ja potrebuju pro propojeni pouzit vzdy ty
nejaktualnejsi – proto ty subselecty s MAX(modified).
Momentalne mi funguje takovyto dotaz – mam to v DIBI/Fluent ale porad si
nejsem jisty, jesli to neni mozne zapsat jinak, lepe, rychleji treba pres
DatabaseExplorer nebo jiny datasource.
DISTINCT sta.id, sta.lastip, sta.ap_ip, sta.modified, mgcust.customer_id, mgcust.name, mgcust.address
FROM `ubnt_sta` sta
INNER JOIN (
SELECT `lastip`, MAX(`modified`) AS sta_max_modified
FROM `ubnt_sta`
GROUP BY `lastip`
) sub_sta ON sta.lastip = sub_sta.lastip AND sub_sta.sta_max_modified = sta.`modified`
INNER JOIN (
SELECT ap1.`deviceIp`, ap1.`modified`
FROM `ubnt_ap` ap1
INNER JOIN (
SELECT `deviceIp`, MAX(`modified`) AS max_modified
FROM `ubnt_ap`
GROUP BY `deviceIp`
) ap2 ON ap1.deviceIp = ap2.deviceIp AND ap1.`modified` = ap2.max_modified
) ap ON sta.ap_ip = ap.deviceIp
LEFT JOIN `mg_customer` mgcust
ON mgcust.`ip_nat2` = sta.`lastip` AND mgcust.`state` = 3
- Šaman
- Člen | 2659
Ve starém projektu ještě stále používám Grido a LeanMapper (nad Dibi) a tam mám úplně stejné Datasource pro složitější tabulky. Sám jsem nečekal, co všechno se dá z Dibi vymáčknout za komplexní dotazy.
Teď už sice používám Datagrid a DatabaseExplorer, ale zas nemám ty složité tabulky, takže jsem zatím nezkoušel psát vlastní Datasource. Imho jde spiš o to co používáš běžně – zapsat to půjde. I kdyby v nejhorším samotnou Nette Core Db.
- petak23
- Člen | 16
jiri.pudil napsal(a):
Já si pořád myslím, že by v principu mělo fungovat tohle, tzn. nejlépe použít ProvidePlugin. A doufat, že to nerozbije například nějaká následná minifikace, což si myslím mohl být případ i toho odkazovaného vlákna.
Update: nebyl to případ odkazovaného vlákna.
ProvidePlugin
zdá se funguje, ale musí se mu napovědět, aby providoval defaultní export:new webpack.ProvidePlugin({ naja: ['naja', 'default'], });
Ďakujem pomohlo to.
- Ivorius
- Nette Blogger | 119
Rád bych dostal resetovací tlačítko (odkaz) filtrace také nahoru nad výpis tabulky – někam k filtrovacím políčkům. Zkusil jsem tedy nasimulovat chování resetovacího tlačítka takto
$grid->addToolbarButton('dataGrid-resetFilter!', 'reset filtru')
->setRendererOnCondition(
function () {
return Html::el('span'); //nothing
},
function () use ($grid) {
return !$grid->isFilterActive();
})
->setClass('ajax btn btn-danger btn-sm reset-filter');
Bohužel při odeslání filtračního formuláře se to nevykreslí, protože se neodesílá snippet kde by byl ten toolbar. Napadá někoho řešení jak dostat resetovací tlačítko nahoru?
Editoval Ivorius (17. 1. 2021 20:38)
- pp
- Člen | 50
Děkuji za reakci @Šaman @dTTb @PavelJanda.
Prozatím jsem neměl potřebu řešit ORM, ale ten nový LeanMapper
vyzkouším. S DatabaseExplorerem (což pokud dobře chápu je aktuálně
podporovaný a perspektivní přístup – i když tady v Datagridu příjdu
o ten hezký fluent zápis) jsem si na těchto složitějších dotazech
vylámal zuby, ale je pravda, že přes view by to mohlo mohlo být
řešitelný.
Na druhou stranu jedná se mi teď o optimalizaci odezvy a už jen použití
view mi na mých datech prodloužilo zpracování o cca 20% (interně tomu
nerozumím ale prakticky je to tak). Takže v tomto případě asi zůstávám
u Dibi.
Existují ještě nějaká best-practice jak dosáhnout co nejrychlejšího
načtení dat a stránkovaní v Datagridu? Samotný SQL dotaz zadaný přímo
přes PMA je výrazně rychlejší. V MySQL používám cachovaní, na úrovní
Nette taky. Díky všem.
Editoval pp (18. 1. 2021 9:26)