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

Sami_
Člen | 15
+
0
-

Pavel Janda napsal(a):

Tak to možná zkuste uložit do session, to by mělo být celkem rychlé/snadné řešení.

Stále to samé. Data se načtou na 1 stranu Gridu a jakmile stranu přepnu, všechno zmizí.

Presenter

public function handleTest($data)
{
	$session = $this->getSession(__CLASS__);
	$session->objectsForTable = $this->myService->getObjectsFromData($data);
	$this['importGrid']->setDataSource($session->objectsForTable);
	$this['importGrid']->reload();
}

protected function createComponentImportGrid()
{
	$g = new DataGrid();
	$g->setDataSource($this->getSession(__CLASS__)->objectsForTrade); // inicializováno na []
	$g->addColumnDateTime('timeOpen', 'Čas otevření');
	return $g;
}

Nevím, jestli chyba není někde jinde, ale vůbec mě nenapadá kde

Editoval Sami_ (10. 3. 2021 22:46)

Kamil Valenta
Člen | 758
+
+1
-

Když odstránkuješ, nevykoná se handleTest(), ale jen createComponentImportGrid() a v něm máš

$g->setDataSource([]);

takže je jasné, že se grid vyprázdní.
Dej si tam:

$g = new DataGrid();
$session = $this->getSession(__CLASS__);
$g->setDataSource($session->objectsForTable);
Kamil Valenta
Člen | 758
+
+1
-

Aha, ten příspěvek se změnil. Takže teď:

public function handleTest($data)
{
	$session = $this->getSession(__CLASS__);
	$session->objectsForTable = $this->myService->getObjectsFromData($data);
	//$this['importGrid']->setDataSource($session->objectsForTable);
	$this['importGrid']->reload();
}

protected function createComponentImportGrid()
{
	$g = new DataGrid();
	$g->setDataSource($this->getSession(__CLASS__)->objectsForTable); // inicializováno na []
	$g->addColumnDateTime('timeOpen', 'Čas otevření');
	return $g;
}

Pozor, jednou v session pracuješ s objectsForTable, ale pak saháš na objectsForTrade.

Sami_
Člen | 15
+
+1
-

Kamil Valenta napsal(a):

Když odstránkuješ, nevykoná se handleTest(), ale jen createComponentImportGrid() a v něm máš

$g->setDataSource([]);

takže je jasné, že se grid vyprázdní.
Dej si tam:

$g = new DataGrid();
$session = $this->getSession(__CLASS__);
$g->setDataSource($session->objectsForTable);

Mezitím mi to došlo a akorát jsem to šel opravit tady, už mi to jede! Moc dík za tvoji trpělivost!

jAkErCZ
Člen | 321
+
+1
-

Zdravím,
narazil jsem na divné chování při funkci addFilterSelect . Mám addColumnStatus ve kterém si vypisuji statusy.

"ublaboo/datagrid": "^6.6" - v6.8.1
$grid->addColumnStatus('status', 'Status')->setAlign('center')
               ->addOption('10', 'Založeno')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('20', 'Nabídka odeslána')
               ->setClass('btn-warning')
               ->endOption()
               ->addOption('25', 'Email: 9 věcí čeká')
               ->setClass('btn-secondary')
               ->endOption()
               ->addOption('30', 'Email: 9 věcí odesláno')
               ->setClass('btn-warning')
               ->endOption()
               ->addOption('35', 'Email: Jak si stojíme čeká')
               ->setClass('btn-secondary')
               ->endOption()
               ->addOption('40', 'Email: Jak si stojíme odesláno')
               ->setClass('btn-warning')
               ->endOption()
               ->addOption('50', 'Volání před zaměřením')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('60', 'Zaměření domluveno')
               ->setClass('btn-focus')
               ->endOption()
               ->addOption('70', 'Návrh SOD po zam. odeslán')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('80', 'Volání po zaměření')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('100', 'Smlouva')
               ->setClass('btn-success')
               ->endOption()
               ->addOption('101', 'Smlouva: Záloha uhrazena')
               ->setClass('btn-contract-success')
               ->endOption()
               ->addOption('102', 'Smlouva: Záloha neuhrazena')
               ->setClass('btn-contract-nosuccess')
               ->endOption()
               ->addOption('103', 'Zakázka ve výrobě')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('104', 'Zakázka skladem (BRN)')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('105', 'Zakázka skladem (TCE)')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('110', 'Zakázka dokončena')
               ->setClass('btn-success')
               ->endOption()
               ->addOption('duplicity', 'Duplicitní nabídka')
               ->setClass('btn-danger')
               ->endOption()
               ->addOption('postoped', 'Nabídka odložena')
               ->setClass('btn-primary')
               ->endOption()
               ->addOption('cancel', 'Nezobchodováno')
               ->setClass('btn-danger')
               ->endOption()
               ->onChange[] = [$this, 'changeStatus'];

A potom klasicky

$grid->addFilterSelect('status', 'Status:', ['' => 'Všichny statusy', 'Statusy' => $this->projectRepository->getOrderStates()])->setAttribute('class', 'select2');

A problém nastává tehdy jakmile vyfiltruji nějaký status který má ID (10,20,30) tak mi grid vrátí Žádné položky nenalezeny ale když dám F5 a grid se znovu načte z parametry už mi to vrátí všechny statusy odpovídající tomu danému ID. Ale pokud ve filtru vyberu status který má název ( duplicity,postoped,cancel) grid mi normálně vrátí ty řádky aniž bych musel znovu načítat F5.

Proč se tomu tak děje?

Editoval jAkErCZ (11. 3. 2021 10:50)

MW
Člen | 615
+
0
-

Zdravím a prosím o radu.

Mám jako zdroj array.

Potřebuji rozchodit itemsDetail:

$datagrid->setDataSource(array...));

	$datagrid->setItemsPerPageList([20, 50, 100]);

	$datagrid->addColumnText('id', 'ID');
	$datagrid->addColumnText('email', 'E-mail')
		->setSortable()
		->setFilterText();

	$datagrid->setItemsDetail();

	$datagrid->setTemplateFile(__DIR__ . '/Templates/kontakty_template.latte');

	return $datagrid;

kontakty_template.latte

{extends $originalTemplate}

{block detail}
	<p>Lorem ipsum</p>
	<button class="btn btn-default btn-secondary btn-sm">Just a button</button>
{/block}

výsledek po kliknutí na detail:

<tr class="row-item-detail item-detail-grid-grid-id-1 loaded toggled" id="snippet-grid-grid-item-1-detail">
																	</tr>

tedy prázdné

Dělám něco špatně. Vše vč. stránkování, filtru funguje

Edit: pokud to nastavím stejně a jako source je DB, tak to jede. Tedy je nejaký problém assoc array jako datasource ??

Tady jsem našel to bylo i reportované. Víte prosím někdo, jak to opravit?
https://github.com/…d/issues/817

Díky moc!

Editoval MW (29. 3. 2021 19:54)

d@rkWolf
Člen | 163
+
0
-

@MW jo, s array datasource detail nefunguje, taky sem na to narazil, i když mě nefungoval ani s DB, protože používám zajaxovanou celou stránku a s tím to nefunguje vůbec(překreslí to místo jednoho řádku celý grid a nechá jen ten detail-ostatní řádky zmizí)

d@rkWolf
Člen | 163
+
0
-

Nedělal někdo s TreeView a Sortable? Je to funkční? Já furt narážím na problém s řazením, pokud se něco posune mezi úrovněmi(změní se parent). V tu chvíli mi docela pravděpodobně nastavává situace, kdy zanořená položka má stejnou hodnotu pozice jako jiná ve vyšší úrovni a jak je přesunu k sobě, celé se to zblázní.

Není někde nebo nemáte někdo nějakou funkční implementaci? V demo kódu to akorát vyhazuje alert hlášku s id, prevId, nextId pozicemi.

Chtěl jsem to použít místo jsTree, co sem měl dříve, ale asi na něj zase dojde, protože mi teď přesunování připomíná řešení rubikovy kostky :-(

Editoval d@rkWolf (30. 3. 2021 0:19)

MW
Člen | 615
+
0
-

d@rkWolf napsal(a):

@MW jo, s array datasource detail nefunguje, taky sem na to narazil, i když mě nefungoval ani s DB, protože používám zajaxovanou celou stránku a s tím to nefunguje vůbec(překreslí to místo jednoho řádku celý grid a nechá jen ten detail-ostatní řádky zmizí)

Tak hint je skutečně tady:

ArrayDataSource.php line:94

public function filterOne(array $condition): IDataSource
	{
		foreach ($this->data as $item) {
			foreach ($condition as $key => $value) {
				if ($item[$key] =**=**= $value) {
					$this->setData([$item]);
					return $this;
				}
			}
		}
		$this->setData([]);
		return $this;
	}

Je to jiný datový typ. Po odmazání jenoho „=“ to funguje.

H0w4rd
Člen | 94
+
0
-

Nepsal jste někdo prosím export do Excelu, který by bylo možné poskytnout?
Vím, jak na to, ale nechtěl bych vynalézat kolo :)

Nezabýval jste se někdo nějakým lepším nastylováním? Bez urážky, datagrid je skvělý, ale jeho základní vzhled vůbec neoslní. Lidi se rozhodují na základě emocí a vzhled je to, co nejvíc prodává, bohužel.

PS: Při filtrování s nejnovější verzí Nette Forms to hází
Nette\Forms\Container::getValues() invoked but the form is not valid.
viz https://forum.nette.org/…innem-inputu
Prosím přijmi pull request https://github.com/…2813a629c159

Editoval H0w4rd (3. 4. 2021 13:17)

mt
Člen | 2
+
0
-

Zdravim, jak bych se mohl dostat k paginator datum? Mam na jednom projektu velkou databazi a pri nacitani gridu padam na pamet. Potreboval bych tedy implementovat strankovani pro nacitani z databaze. A nevim jak se co nejjednodusseji dostat k paginator datum a co bude pripadne potreba jeste upravit.

Pavel Janda
Člen | 977
+
0
-

@H0w4rd Ahoj!

  1. Nevím o ničem, co by existovalo někde veřejně např. v gistu. Pokud bys export do excelu připravil a zveřejnil jako OS, bylo by to megasuper! Já sám s tím asi moc nepomohu, už jsou to roky, co jsem se o něco podobného snažil. Ale komunita by to, podle mě, moc moc ocenila.
  2. Hodně lidí si styly upravuje, to je jasné. Já už leta používám AdminLTE v nějaké konkrétní verzi, kam datagrid s defaultními styly celkem, myslím, pasuje. Ale už kdysi jsem chtěl připravit styly pro AdminLTE, Material Design, nejnovější Bootstrap a pod. Kdybys vykopnul nějaké téma, cool, super! Budem rádi. Souhlasím, že by to chtělo zase po čase nějaký facelift.

@mt Nejsem si jistý, jestli to správně chápu. Potreboval bych tedy implementovat strankovani pro nacitani z databaze. → tohle se děje, jinak by datagrid fungovat pořádně ani nemohl.. Z databáze se vždy vytahuje max X (třeba 20) položek z databáze. Nebo tím myslíš něco jiného?

mt
Člen | 2
+
0
-

@PavelJanda Uz jsem pokrocil, mam problem s tim ze musim pouzivat pouze sql dotazy a pouzival jsem array datasource. Ted jsem zacal pouzivat Nette database source ale ten ma problemy s parsovanim naseho komplikovaneho postgresql dotazu.Myslim si ze problem je v parsovani selectu v left joinu.

Pavel Janda
Člen | 977
+
0
-

@mt Pokud řešíte nějaký sožitější SQL dotaz, doporučuji poohlédnout se po něčem přímočařejším, paříklad Dibi. Nebo pokud nemáte jinou možnost než použít nette database, můžete zkusit data source, který vám umožní psát přímo SQL.

Petr Parolek
Člen | 455
+
0
-

H0w4rd napsal(a):

Nepsal jste někdo prosím export do Excelu, který by bylo možné poskytnout?
Vím, jak na to, ale nechtěl bych vynalézat kolo :)

Nezabýval jste se někdo nějakým lepším nastylováním? Bez urážky, datagrid je skvělý, ale jeho základní vzhled vůbec neoslní. Lidi se rozhodují na základě emocí a vzhled je to, co nejvíc prodává, bohužel.

PS: Při filtrování s nejnovější verzí Nette Forms to hází
Nette\Forms\Container::getValues() invoked but the form is not valid.
viz https://forum.nette.org/…innem-inputu
Prosím přijmi pull request https://github.com/…2813a629c159

Ahoj, můžeš se inspirrat např. tu https://github.com/…tService.php

svatekr@gmail.com
Člen | 1
+
0
-

Ublaboo je mi moc sympatické. Zkouším co umí. Do svého cvičného projektu jsem chtěl vložit sloupec s hodnocením hvězdičkama. Kdyby to někoho zajímalo, vymyslel jsem to takto:

$grid->addColumnText('vote', 'Hlasování')
    ->addCellAttributes(['width' => '15%'])
    ->setRenderer(function (Katalog $item) use ($voteSelectFacade) {
        $rating = $voteSelectFacade->getRate($item->getId());
        $rates = [1, 2, 3, 4, 5];
        foreach ($rates as $rate) {
            $highLight = $rate <= $rating ? ' text-warning' : '';
            $farFas = $rate <= $rating ? 'fas' : 'far';
            $i[$rate] = Html::el('i', ['class' => $farFas . ' fa-star' . $highLight]);

            $el[$rate] = Html::el('a', ['class' => 'ajax'])
                ->href($this->link("Vote!", $item->getId(), $rate))
                ->setHtml($i[$rate]);
        }

        return Html::el('div')

K tomu ještě nějaké styly:

<style>
    .col-vote a .far, .col-vote a .fas {
        color: gray;
    }
    .col-vote a:hover .far, .col-vote a:hover .fas {
        font-weight: 900;
        color: #ffda6a !important;
    }
</style>

Výsledek je k vidění na http://katalogy.rudolfsvatek.cz. Případné kritické komentáře ohledně SEO katalogů přezíravě ignoruji ;-) – jde spíš o cvičný projekt, kde zkouším spojení Nette, Doctrine2 a Ublaboo.

Editoval svatekr@gmail.com (11. 4. 2021 20:12)

theo
Člen | 57
+
0
-

Snažím se provést update aplikace na současnou verzi Datagridu a narazil jsem na tento problém:

V minulosti bylo možné nastavit přes setDefaultPerPage() metodou výchozí počet položek na stránku. Jedna z možností která tam byla (a zákazník na ni bohužel trvá) je i hodnota all pro zobrazení všech hodnot najednou. Bohužel deklarace této metody se změnila na setDefaultPerPage(int $count), což je sice hezké z hlediska předvidatelnosti hodnot a typové kontroly, ale prakticky to znemožňuje nastavit hodnotu all. Přitom ve zbytku kódu tato logika zůstala zachována, neboť v $itemsPerPageList zůstala ve výčtu výchozích hodnot.

Je to doopravdy rozbité (tak to aspoň podle mě vypadá), nebo jsem jen nepochopil jak to použít?

jikki
Člen | 73
+
0
-

Ahoj,

na předchozí stránce jsem se dočetl, že Ublaboo 6.8.0 by mělo již fungovat s Nette/Forms 3.1.3. Dělal jsem update z 6.2.x na 6.8.0, zkoušel jsme i poslední 6.8.1. Ale při filtrování stále vyhazuje varování:

User Warning
Nette\Forms\Container::getValues() invoked but the form is not valid.

Je tam nějaké jiné řešení, než se vrátit v Nette/Forms 3.0.x ?

Díky moc

jikki
Člen | 73
+
0
-

jikki napsal(a):

Ahoj,

na předchozí stránce jsem se dočetl, že Ublaboo 6.8.0 by mělo již fungovat s Nette/Forms 3.1.3. Dělal jsem update z 6.2.x na 6.8.0, zkoušel jsme i poslední 6.8.1. Ale při filtrování stále vyhazuje varování:

User Warning
Nette\Forms\Container::getValues() invoked but the form is not valid.

Je tam nějaké jiné řešení, než se vrátit v Nette/Forms 3.0.x ?

Díky moc

Ahoj,

Nedalo mi to a znova si s tím hraji. Updatoval jsem vše na poslední verzi Nette/Forms 3.1.3 a Ublaboo 6.8.1.
Zjistil jsem, že filtrování mi v některých tabulkách funguje a jiných ne. Rozdíl byl InlineAdd. Pokud má tabulka InlineAdd, tak filtrování háže výše zmíněnou chybu. Bez InlineAdd funguje filtr v pořádku.
Snad to pomůže autorům udělat opravu.

Díky moc

d@rkWolf
Člen | 163
+
0
-

Zdravím – dá se nějak zablokovat sortování pro určitý řádek v Tree View? Potřeboval bych, aby byla 1.pozice neměnná, aby s ní nešlo hýbat, ani nic dostat před ni. Totálně mi to narušuje fungování systému, protože posunutí čehokoliv nad(nebo pod? jak chcete) „kořen stromu“ je absurdní.

Pavel Janda
Člen | 977
+
0
-

@jikki Mohl bys, pls, poslat PR? Díky

jikki
Člen | 73
+
0
-

Pavel Janda napsal(a):

@jikki Mohl bys, pls, poslat PR? Díky

@PavelJanda Zdá se že PR někdo už vydal a to tak, že potlačil zobrazení toho warningu.

MW
Člen | 615
+
0
-

Zdravím, prosím o radu.

pokud gridu nastavím defaultFilter

$datagrid->setDefaultFilter(['rokdokl' => date('Y')], false);

Tak grid naskočí s defaultním filtrem, ale tlačítkem „Resetovat filter“ se tato hodnota nesmaže ani s parametrem false.

Jak na to prosím? Filtry jinak fungují.

Díky!

dTTb
Člen | 30
+
0
-

Ahoj, narazil sem na drobny bug. Pokud mam jako datasource array/ArrayHash tak big inline editing nefunguje – po kliku na edit tlacitko se v odpovedi neposle cast snippets, cimz nedojde k vykresleni edit formu…
Pri zmene datasource na Nette\Database\Table\Selection editace funguje normalne.

Testovano na ublaboo/datagrid v6.6.1 a v6.7.1.

Pavel Janda
Člen | 977
+
0
-

@dTTb Mohl bys, pls, poslat PR? Díkes! 👍

dTTb
Člen | 30
+
+1
-

@PavelJanda Kdyz prijdu na to jak to fixnout, tak jo.

TJ00
Člen | 1
+
0
-

Zdravím, snažím se v gridu, který má datasource array, přidat ItemsDetail, ale nic se neděje – ani žádný error.

př.:

$grid->setDataSource([['id' => 1, 'text' => 'TEST']]);

$grid->addColumnText('text', 'Text');

$grid->setItemsDetail(function() { return 'Lorem Ipsum'; });

Mohl by to být bug?

pp
Člen | 48
+
0
-

Ahoj, potreboval bych v gridu pouzit rozsirene filtrace.
Jednak potrebuju filtrovat pomoci zavisleho selectu
(napr. pro vyber adresniho mista – mesto ⇒ ulice ⇒ cp)
a pomoci gps souradnic z mapy.
Asi bych si poradil se samostatnym formularem ale nevim jak to zakomponovat do filtracniho zahlavi datagridu.
Muzu poprosit neco pro inspiraci?
diky

Editoval pp (5. 7. 2021 19:09)

petak23
Člen | 16
+
0
-

Ahojte,
chcem sa opýtať ako je to s balíkom datagrid-nette-database-data-source. Chcem rozbehnúť jeden projekt a mám tam php 8.0.

1. Nefunguje mi balíček: composer require contributte/datagrid-nette-database-data-source aj napriek tomu, že z oficiálnej stránky je tam smerované. Vyhadzuje mi to:

[InvalidArgumentException]
  Could not find a matching version of package contributte/datagrid-nette-database-data-source. Check the package spelling, your version constraint and that the package is available in a stability which match
  es your minimum-stability (dev)

2. Paradoxne balíček: composer require ublaboo/datagrid-nette-database-data-source funguje ale vyhadzuje mi to chybu:

Problem 1
    - ublaboo/datagrid-nette-database-data-source[v1.1.0, ..., v1.1.1] require nette/application ^2.3|^2.4 -> found nette/application[v2.3.0, ..., v2.4.x-dev] but it conflicts with your root composer.json require (^3.0.6).
    - Root composer.json requires ublaboo/datagrid-nette-database-data-source ^1.1 -> satisfiable by ublaboo/datagrid-nette-database-data-source[v1.1.0, v1.1.1].

Čo je teda správne? A ako nainštalovať balík datagrid-nette-database-data-source na php8.0? Ide to vôbec? V dokumentácii je php: ^7.2
Preistotu prikladám aj composer.json(Na konci mám minimum-stability: dev, ale ani stable nefungovalo…):

{
	"name": "nette/web-project",
	"description": "Nette: Standard Web Project",
	"keywords": ["nette"],
	"type": "project",
	"license": ["MIT", "BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
	"require": {
		"php": ">= 7.2",
		"nette/application": "^3.0.6",
		"nette/bootstrap": "^3.0",
		"nette/caching": "^3.0",
		"nette/database": "^3.0",
		"nette/di": "^3.0",
		"nette/finder": "^2.5",
		"nette/forms": "^3.0",
		"nette/http": "^3.0",
		"nette/mail": "^3.0",
		"nette/robot-loader": "^3.0",
		"nette/security": "^3.0",
		"nette/utils": "^3.0",
		"latte/latte": "^2.5",
		"tracy/tracy": "^2.6",
		"mdanter/ecc": "^1.0",
		"dg/adminer-custom": "^1.28",
		"ublaboo/datagrid": "^6.9"
	},
	"require-dev": {
		"nette/tester": "^2.3"
	},
	"autoload": {
		"classmap": ["app/Bootstrap.php"]
	},
	"minimum-stability": "dev"
}
piskotek
Člen | 32
+
0
-

Ahoj,
řešil někdo potřebu mít „předdotaz“ pro datagrid + elastic?
Př: X uživatelů bude mít přístup k různým věcem z jednoho indexu v elasticu a potřebuju na základě user ID, jejich práv, a odeslaného formuláře s dotazem (mimo datagrid) zobrazit výsek z indexu (cca 300 tis položek v indexu). Řešil někdo něco takového? Nějaký nástřel jak na to? Díky

HonzaN
Člen | 64
+
+1
-

Zdravím, jak to vypadá s podporou Bootstrapu 5 ?

pp
Člen | 48
+
0
-

Ahoj,
muzu nejak pri vytvareni datagridu prednastavit predvybrane hodnoty pro
setFilterMultiSelect() ?
nebo aspon lze pridat atribut data-actions-box pro zobrazeni voleb selectAll/deselectAll ?
Zda se ze
setAttribute('data-actions-box', true)
mi nefunguje.
Popr. jak nahradit ‚bootstrap-select‘ za ‚select2‘ ?

Editoval pp (3. 9. 2021 21:28)

Tomas8698
Člen | 109
+
0
-

Zdravím, chcem sa spytat da sa riesit sortovanie v datagride na čisla? Skusal som pouzit setSortable() ale nefungovalo to na cisla teda fungovalo mi iba na od najvecsieho. Dakujem za odpoved :)

Editoval Tomas8698 (10. 11. 2021 21:54)

jikki
Člen | 73
+
+1
-

Ahoj,

začal jsem používat naju místo nette.ajax. Datagrid funguje, jediné co zlobí je zobrazení stromu. Rozbalení na nejvyšší úrovni hodí js chybu. Rozbalení vnořené úrovně už načte znova celou stránku. Nevíte prosím někdo co s tím?

Uncaught TypeError: naja.load is not a function
    at dataGridLoad (datagrid.js:91)
    at success (datagrid.js:671)
    at EventTarget.<anonymous> (datagrid.js:28)
    at EventTarget.makeRequest (Naja.ts:150)

Mám přes composer
ublaboo/datagrid": "^6.9

A přes NPM
„ublaboo-datagrid“: „^6.7.1“
„naja“: „^2.1.5“,

Děkuji

bortomar
Člen | 7
+
0
-

Zdravím, pokouším se zprovoznit víceúrovňový TreeView. Ajaxové requesty mi fungují u první úrvoně, ale jakmile kliknu na zobrazení potomků na druhé úrovni, neproběhne ajax ale běžný request, přičemž se refreshne stránka a všechny řádky se tudíž uzavřou. Nevíte, kde by mohl být problém? Díky.

Edit: Zapomněl jsem zmínit, že používám Naju. Při použití nette.ajax to funguje.

Editoval bortomar (19. 11. 2021 12:12)

jikki
Člen | 73
+
0
-

Ahoj,

používám bootstrap-dark-4 místo originálního bootstrap 4. Používá se stejně jako originál bootstrap 4, jen má vestavěný dark mode, umí se i přepínat automaticky podle nastavení systému.

Datagrid sice použává bootstrap styly, ale v souboru datagrid.css má několik tříd nastavenou barvu pozadí na bílou nebo světle šedou. Při přepnutí na tmavým režime kdy se stránka přebarví do tmava datagrid stále svítí bíle. Upravil jsem v bootstrap.css čtyři řádky, kde jsem zrušil nastavení pozadí na bílou. A to stačilo to na to, aby se i datagrid přebarvil do tmava, musím říct, že vypadá skvělé i tmavý. Pokud by měl někdo zájem, tak pošlu pull request.

Dále by mě zajímalo, zda je v plánu updade, který přidá podporu bootstrap 5. Bylo by to fajn a rád pomohu.

Díky moc

kralik
Člen | 230
+
+1
-

Ahoj,
zkouším datagrid 6.9. na Nette 3.1, bohužel obdržím chybu.

Ublaboo\DataGrid\Exception\DataGridFilterNotFoundException
Session filter: Filter [_grid_per_page] not found

Zatím jsem nenašel v čem je problém.

Předem díky za radu

lubos
Člen | 22
+
0
-

Umíme v DataGrid změnit třídění při nastavování filtru v setCondition ?

$grid->addColumnDateTime('dt_market', 'na trh')
	->setSortable()
	->setFilterSelect(['1'=>'vyjde', '2'=>'vyšlo', '0'=>'vše'], 'dt_market')
		->setCondition(function($fluent, $value) {
			if ($value==1) {
				$fluent->where('dt_market >= CURDATE()')
				// tady vnutit třídění: order('dt_market ASC');
			} else if ($value==2) {
				$fluent->where('dt_market <= CURDATE()');
				// tady vnutit třídění: order('dt_market DESC');
			}
		});
dTTb
Člen | 30
+
-1
-
if ($value==1) {
	$fluent->where('dt_market >= CURDATE()')->order('dt_market ASC');
}

nefunguje?

lubos
Člen | 22
+
0
-

kdepak nefunguje ;)

theo
Člen | 57
+
0
-

Ahoj,

existuje nějaký způsob jak si určit, ve kterém místě (pod)dotazu se bude provádět omezení počtu výsledků (LIMIT/OFFSET)?
Používám Dibi DataSource nad PostgreSQL a potřeboval bych, aby LIMIT/OFFSET klauzule byla uvnitř poddotazu, což je šikovný způsob jak zrychlit stránkování na konci velkého objemu dat.

Například místo dotazu

SELECT d.dil,
d.cislo_dilu,
d.typ_dilu,
d.datum AS datum_montaze,
t.nazev AS nazev_typu_dilu,
u.uzivatel,
u.jmeno AS namontoval
FROM dily d
LEFT JOIN typy_dilu t USING (typ_dilu)
LEFT JOIN uzivatele u USING (uzivatel)
ORDER BY d.datum
LIMIT 25
OFFSET 136875;

ve kterém se nejprve k tabulce díly (která je obrovská) připojí potřebné sloupce z ostatních tabulek a to vše se následně seřadí a omezí by měl dotaz vypadat jako:

SELECT d.dil,
d.cislo_dilu,
d.typ_dilu,
d.datum AS datum_montaze,
t.nazev AS nazev_typu_dilu,
u.uzivatel,
u.jmeno AS namontoval
FROM (
	SELECT *
	FROM dily
	ORDER BY d.datum
	LIMIT 25
	OFFSET 136875
) d
LEFT JOIN typy_dilu t USING (typ_dilu)
LEFT JOIN uzivatele u USING (uzivatel);

To vede k tomu, že se nejdříve vše seřadí podle data a omezí a pak se k tomu teprve připojí potřebná data z ostatních tabulek, což je mnohem rychlejší než předchozí postup.

Přes Dibi fluent rozhraní se mi to nepodařilo zprovoznit a nedaří se mi to ani s pomocí definice DataSource jako databázového dotazu (a s pomocí metody toFluent() z něj udělám DibiFluentDataSource), kde si LIMIT a OFFSET nahradím s pomocí modifikátoru %lmt a %ofs.

Chvíli to vypadalo, že by cesta mohla vést přes callback onRender, ve kterém bych upravil nastavil DataSource, který by měl již nastavená omezení, ale ani to mi moc nepomohlo.

Tuší někdo jak dostat do definice datového zdroje výše zmíněnou podobu dotazu tak, aby byla navázána na řazení a stránkování?

Pavel Janda
Člen | 977
+
+1
-

@theo Mělo by to jít celkem dobře. Kdysi jsem řešil něco trošku podobného – nehodil se mi žádný existující data source – potřeboval jsem tahat data z elasticu, ale přitom něco dotahovat z mysql. A count volat vůbec úplně jinak.

Můžeš si pro tenhle kokrétní grid podědit buď DibiFluentDataSource nebo rovnou FilterableDataSource a potřebné metody si dopsat sám. Například v ::getCount() vůbec nebudeš řešit nějaké joiny ani vložené selecty, vrátíš tam select count(id) from dily. Tím máš optimalizaci č. 1. A tak postupuješ dál. :) Makes sense?

karlosek
Člen | 1
+
0
-

Ahoj, asi jsem našel chybku. Pokud použiju řazení na jednom sloupci, který mi dá dotaz přes 3 tabulky, tak nemůžu použít filtrování textu na sloupci, který má stejný název v některé z těch tabulek.
...WHERE (("name" ILIKE '%d%'))...
Ambiguous column: 7 ERROR: column reference "name" is ambiguous
Potřeboval bych asi něco jako
...WHERE (( "public"."table"."name" ILIKE '%d%'))...
Nebo to lze nějak parametrem nastavit?

Díky

Zdeno1981
Člen | 114
+
0
-

Ahoj @PavelJanda
chci se zeptat, jestli se chystá podpora pro BS5

Pavel Janda
Člen | 977
+
+1
-

@Zdeno1981 Ahoj, já ji nechystám, bo se mi líbí současná verze. :P Ale nebudu se bránit PR se styly a templatou 👍

kralik
Člen | 230
+
0
-

Ahoj,
je možné nějak zalomit text?
Potřeboval bych text ve slouci,který je moc dlouhý, zobrazit na více řádcích uvnitř buňky.

$grid->addColumnText('popis', 'Popis')
                    ->addCellAttributes(['width' => '15%'])
...

Toto nefunguje.

Moc díky

Petr Parolek
Člen | 455
+
0
-

POZOR na BC break ve verzi 6.9.3

		$inlineAdd->onSubmit[] = function (ArrayHash $values): void {
			bdump($values);
			$this->flashMessage('Record was added!', 'success');
			$this->redrawControl('flashes');
		};

předtím byl typeint Nette\Utils\ArrayHash a nyní je typehint array

Petr Parolek
Člen | 455
+
+1
-

Petr Parolek napsal(a):

POZOR na BC break ve verzi 6.9.3

		$inlineAdd->onSubmit[] = function (ArrayHash $values): void {
			bdump($values);
			$this->flashMessage('Record was added!', 'success');
			$this->redrawControl('flashes');
		};

předtím byl typeint Nette\Utils\ArrayHash a nyní je typehint array

@PavelJanda díky za opravu ve verzi 6.9.4.

jAkErCZ
Člen | 321
+
0
-

Ahoj všem,
je nějaká možnost jak v datagridu obarvit daný řádek? Třeba pokud v db je neaktivní bude červený a pokud je aktivní bude zelený?

Díky všem za rady.