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

oorac
Člen | 7
+
0
-

Ahoj,

setkal se někdo s následující situací?

Mám nette framework, ublaboo/datagrid a ORM Doctrine. V datagridu mám přes 15 sloupečků, 5 je defaultně zobrazeno a zbytek defaultně skryto. Nicméně, když chci vyfiltrovat dle dataRange a zároveň dle typu položky v rámci filterSelect, tak se mi občas děje to, že server spadne. Server je na gigaserver.cz v rámci klasického webhostingu Easy. Vždy mě to na 10 minut zablokuje a pak to zase funguje dál. Stane se mi to vždy alespoň 1-krát denně. Nesetkal se s tím už někdo?
Tohle je část mého kodu:

$grid = new Datagrid($this, $name);
        $grid->setTranslator($this->translator);
        $grid->setItemsPerPageList([10, 50, 100, 250, 500], false);
        $grid->setColumnsHideable();
        $grid->setDefaultPerPage(10);
        $grid->setStrictSessionFilterValues(false);
        $grid->setTemplateFile(DIR_APP . DS . 'Templates/Datagrid/templates/custom.latte');

        $grid->setDataSource(new DoctrineDataSource($this->queryBuilder, 'id'));
        $grid->setDefaultSort(['accountDate' => 'DESC']);
$grid->addColumnText('type', $this->translator->translate('forms.type'))
            ->setRenderer(function (AllData $allData) {
                return $this->translator->translate('texts.allDataType.' . $allData->getType());
            })
            ->setSortable()
            ->setFilterSelect([
                '' => $this->translator->translate('texts.-all-'),
                AllData::TYPE_CASH_REGISTER_ITEM => $this->translator->translate('texts.allDataType.' . AllData::TYPE_CASH_REGISTER_ITEM),
                AllData::TYPE_SAFE_ITEM => $this->translator->translate('texts.allDataType.' . AllData::TYPE_SAFE_ITEM),
                AllData::TYPE_FIX_ITEM => $this->translator->translate('texts.allDataType.' . AllData::TYPE_FIX_ITEM)
            ])
            ->setCondition(function (QueryBuilder $qb, $value) {
                $qb->andWhere('allData.type = :type')
                    ->setParameter('type', $value);
            });

$grid->addColumnDateTime('accountDate', $this->translator->translate('forms.accountDate'))
            ->setRenderer(function (AllData $allData) {
                return $allData->getAccountDate()?->format('d.m.Y');
            })
            ->setSortable()
            ->setSortableCallback(function (QueryBuilder $qb, $sort) {
                if ($sort['accountDate']) {
                    $qb->addSelect('COALESCE(cri.accountDate, si.accountDate, fi.accountDate) AS HIDDEN orderedDate')
                        ->orderBy('orderedDate', $sort['accountDate']);
                }
            })
            ->setFilterDateRange()
            ->setCondition(function (QueryBuilder $qb, ArrayHash $value) {
                if ($value->offsetExists('from') && empty($value->offsetGet('from'))) {
                    $qb->andWhere('((cri.accountDate <= :dateTo AND cri.id IS NOT NULL) OR
                                    (si.accountDate <= :dateTo AND si.id IS NOT NULL) OR
                                    (fi.accountDate <= :dateTo AND fi.id IS NOT NULL))')
                        ->setParameter('dateTo', new DateTime(str_replace(' ', '', $value->offsetGet('to'))));
                } elseif ($value->offsetExists('to') && empty($value->offsetGet('to'))) {
                    $qb->andWhere('((cri.accountDate >= :dateFrom AND cri.id IS NOT NULL) OR
                                    (si.accountDate >= :dateFrom AND si.id IS NOT NULL) OR
                                    (fi.accountDate >= :dateFrom AND fi.id IS NOT NULL))')
                        ->setParameter('dateFrom', new DateTime(str_replace(' ', '', $value->offsetGet('from'))));
                } elseif ($value->offsetExists('from') && $value->offsetExists('to')) {
                    $qb->andWhere('((cri.accountDate BETWEEN :dateFrom AND :dateTo AND cri.id IS NOT NULL) OR
                                    (si.accountDate BETWEEN :dateFrom AND :dateTo AND si.id IS NOT NULL) OR
                                    (fi.accountDate BETWEEN :dateFrom AND :dateTo AND fi.id IS NOT NULL))')
                        ->setParameter('dateFrom', new DateTime(str_replace(' ', '', $value->offsetGet('from'))))
                        ->setParameter('dateTo', new DateTime(str_replace(' ', '', $value->offsetGet('to'))));
                }
            });

Děkuji za případnou radu.

Editoval oorac (29. 1. 8:41)

ryvova
Člen | 9
+
0
-

Ahoj,

nedaří se mi udělat inline editaci položky typu datetime tak aby se dalo vybírat z datepickeru, nebyl by někde nějaký příklad? V dokumentaci ani ve vzorových příkladech jsem na datetime nenašla.

Dík za každý tip.

radas
Člen | 224
+
0
-

Doporučuji vytvořit nativní formulářový prvek přes addDateTime().

Editoval radas (19. 2. 12:18)

d@rkWolf
Člen | 167
+
0
-

@Felix jsou někde zkompilované minifikované assety k té NEXT verzi? Ve složce assets je tuna .ts souborů – nevím, k čemu jsou a co s nimi. NPM nepoužívám, roky používám u webů Webloader, protože mi zkompiluje SASS, zminifikuje CSS/JS a to vše udělá i na obyčejném hostingu(kde rozhodně nehrozí, že mě nechají připojit na terminál a něco tam spouštět), takže když si nějaký klient vyžádá u několik let starého webu změnu barvy z červené na modrou, přihlásím se PSPadem na FTP, upravím příslušný CSS či SCSS soubor a smažu minifikovaný CSS, práce na pár minut. Místo, abych trávil půl dne stahováním webu na localhost, úpravou souborů, spouštěním kompilace přes NPM a pak to zas nahrával na web a ještě někde přepisoval nějakou verzi nebo url souboru kvůli cache prohlížečů.

U aktuální verze Datagridu jsem si prostě všechny potřebné CSS a JS stáhl, hodil do příslušné složky a přidal do webloaderu, ale to s těmi TS asi fungovat nebude.

Pavel Janda
Člen | 977
+
0
-

DataGrid::setDataSource(new ApiDataSource(…))

matronator napsal(a):

Pavel Janda napsal(a):

A ještě jedna věc: přibyl nový datasource: ApiDataSource. Je experimentální a netestoval jsem ho. Pokud ho někdo využije, piště, co přidat/zlepšit. Moc tam toho asi nebude. ApiDataSource prostě forwarduje filtrování, sortění a pod na remote api.

Sorry, vim že je to starý příspěvek, ale mám dotaz k tomu ApiDataSource. Chci přidat filtr, který nebude filtrovat v databázi, ale pošle tu zadanou hodnotu na remote API a z té se mi pak vrátí objekt, ze kterého bych chtěl vytáhnout jednu property a tu následně použít pro filtrování výsledků datagridu.

Je tam asi víc věcí, které mi teď ještě nejsou úplně jasné jak udělat, ale prvně jsem se zasekl na tom, že když chci zavolat $grid->setFilterText(function ($dataSource, $item)), tak jak mám nastavit tomu $dataSource URL té API, která u ApiDataSource lze nastavit pouze v konstruktoru?

Pavel Janda
Člen | 977
+
0
-

Tree view nemá pagination, nedávalo mi to smysl přidávat… :)

tom napsal(a):

Ahoj, funguje vam setPagination pripadne setDefaultPerPage pro TreeView? Me se tam strankovani neukazuje

Pavel Janda
Člen | 977
+
+1
-

Od toho je větev next, za pár chvil budeme mergovat do masteru. Z té pak vznikne po otestování verze 7 – bez jQuery a komplet přepsaným JS. Navrhuji vzít zatím pro testovací účely tuto verzi

iru napsal(a):

iru napsal(a):

Felix napsal(a):

👋 Pripravujeme novou verzi datagridu. S podporou PHP 8, bootstrap 5 a prepsanym javascriptem. Postupne muzete testovat v next vetvi.

https://github.com/…id/pull/1060
https://github.com/…ton/pull/168

Jak prosím nainstaluji? Mám:

	"require": {
		"php": ">= 8.0",
		"nette/application": "^4.0",
		"nette/bootstrap": "^3.2 || ^4.0",
		"nette/caching": "^3.2 || ^4.0",
		"nette/database": "^4.0",
		"nette/di": "^3.2 || ^4.0",
		"nette/forms": "^4.0",
		"nette/http": "^4.0",
		"nette/mail": "^4.0",
		"nette/php-generator": "^4.0",
		"nette/robot-loader": "^4.0",
		"nette/safe-stream": "^3.0",
		"nette/security": "^4.0",
		"nette/utils": "^4.0",
		"latte/latte": "^3.0",
		"tracy/tracy": "^2.10 || ^3.0",
		"ublaboo/datagrid": "dev-next"
	},
	"require-dev": {
		"nette/tester": "^2.0"
	},
	"autoload": {
		"psr-4": {
			"App\\": "app/"
		}
	},
	"minimum-stability": "dev"
}
C:\..........>composer update
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires ublaboo/datagrid dev-next -> satisfiable by ublaboo/datagrid[dev-next].
    - ublaboo/datagrid dev-next requires nette/forms ^3.1.3 -> found nette/forms[v3.1.3, ..., v3.1.x-dev] but it conflicts with your root composer.json require (^4.0).

Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.

Na serveru mám PHP 8.2, Pokusila jsem se změnit nette/forms ze 4 na 3.1, ale to zase nefungovalo s PHP 8.2. Tak nevím, jak se k tomu datagridu dostat. Když jsem měla Nette 3.2 a PHP 7.2, nefungovalo, tak jsem přešla na nette 4, ale zase mi to nejde :-(
Composer pro nette4 jsem sestavila viz: https://github.com/…ommit/master
Děkuji.

Stále bych ten datagrid chtěla používat a nedaří se mi ho nainstalovat, Nevíte prosím někdo jak zprovoznit na PHP 8 a nette4?

Pavel Janda
Člen | 977
+
0
-

Yes, po/před mergnutí větve next do masteru budeme přidávt lokální build assetů, no worries. Slyším potřeby cca 10k firem v čr, které npm nepoužívají.

d@rkWolf napsal(a):

@Felix jsou někde zkompilované minifikované assety k té NEXT verzi? Ve složce assets je tuna .ts souborů – nevím, k čemu jsou a co s nimi. NPM nepoužívám, roky používám u webů Webloader, protože mi zkompiluje SASS, zminifikuje CSS/JS a to vše udělá i na obyčejném hostingu(kde rozhodně nehrozí, že mě nechají připojit na terminál a něco tam spouštět), takže když si nějaký klient vyžádá u několik let starého webu změnu barvy z červené na modrou, přihlásím se PSPadem na FTP, upravím příslušný CSS či SCSS soubor a smažu minifikovaný CSS, práce na pár minut. Místo, abych trávil půl dne stahováním webu na localhost, úpravou souborů, spouštěním kompilace přes NPM a pak to zas nahrával na web a ještě někde přepisoval nějakou verzi nebo url souboru kvůli cache prohlížečů.

U aktuální verze Datagridu jsem si prostě všechny potřebné CSS a JS stáhl, hodil do příslušné složky a přidal do webloaderu, ale to s těmi TS asi fungovat nebude.

Editoval Pavel Janda (13. 3. 9:22)

Taps
Člen | 168
+
0
-

Zdravím,
používám

$grid->addColumnDateTime('datumPlan', 'Datum')->setSortable()->setFilterDateRange();

a potřeboval bych poradit, jak datepicker převést do češtiny. Zkoušel jsem i níže uvedený kod, ale čeština v datepickeru mi funguje jen pokud se nacházím na první straně výpisu

		<script>
			$(document).ready(function()
			{
			  $(':text[data-provide="datepicker"]').datepicker(
			  {
			    language: 'cs'
			  });
			});
		</script>

Dále pak mám dotaz zda existuje nějaká možnost jak tlačítko pro resetování umístit nahoru nad tabulku?

Děkuji

radas
Člen | 224
+
+1
-

Přidej si za setFilterDateRange() ještě ->addAttribute(‚data-date-language‘, ‚cs‘).

lukyn
Člen | 18
+
0
-

Zdravím…
čistá instalace Nette 3.2.3 a datagrid. Při napojení k databázi se objeví chyba:
Unexpected ‚{else}‘, expecting </a> for element started on line 11 at column 3 (in ‚…/templates/data_grid_paginator.latte‘ on line 12 at column 2)

Nevíte, kde může být chyba ?

Editoval lukyn (14. 6. 14:02)

Infanticide0
Člen | 99
+
0
-

v data_grid_paginator.latte na řádku 12, Latte narazilo na {else} tam, kde čeká konec tagu <a>.

{if $paginator->isFirst()}
	<a class="first btn btn-sm {$btnSecondaryClass} disabled"> TADY
{else}
	<a class="btn btn-sm {$btnSecondaryClass} ajax" href="{$link('page!', ['page' => $paginator->page - 1])}" rel="prev"> TADY
{/if}
vojtech.sejkora
Člen | 2
+
0
-

Infanticide0 napsal(a):

v data_grid_paginator.latte na řádku 12, Latte narazilo na {else} tam, kde čeká konec tagu <a>.

{if $paginator->isFirst()}
	<a class="first btn btn-sm {$btnSecondaryClass} disabled"> TADY
{else}
	<a class="btn btn-sm {$btnSecondaryClass} ajax" href="{$link('page!', ['page' => $paginator->page - 1])}" rel="prev"> TADY
{/if}

A jak se to da opravit? Kdyz jsem pridal </a> z te casti za {/if}, tak mi to pise

Cannot redeclare block 'icon-arrow-left' (in '.../templates/data_grid_paginator.latte' on line 13 at column 123)

Nemluvě o tom, že se to instaluje pres composer, takze jakakoliv uprava se mi zase zmeni

David Grudl
Nette Core | 8199
+
+1
-

Zkus v konfiguračním souboru vypnout strictParsing

vojtech.sejkora
Člen | 2
+
0
-

David Grudl napsal(a):

Zkus v konfiguračním souboru vypnout strictParsing

Díky to mi ten problem vyresilo :)

Čamo
Člen | 798
+
0
-

Zdravím, prosím vás vie mi niekto povedať či je možné pre filterText nastaviť delay aby sa javascript nespustil hneď pri keypress evente ale počkal požadovaný počet milisekúnd? V dokumentácii nič nevidím ani ide mi nič nenašepkáva.
Díky.

Čamo
Člen | 798
+
0
-

Hmmm to vyzerá že nič také tam nieje. Ale mohlo by byť.

pista5
Člen | 66
+
0
-

Zdravim,
resit tu jednu vec, s kterou si nevim rady… vse jsem nainstaloval, CSS a JS jsem si vzal z vendor/ublaboo/datagrid/assets
Mam tam Bootstrap 5 a nette.ajax.js

V URL se mi ale po kazde akci zobrazuji parametry…

/?grid-perPage=20&grid-filter[email]=in

na demoverzi se to vsak nedeje??
https://examples.contributte.org/…id-skeleton/

Cim to prosim muze byt?

Kamil Valenta
Člen | 798
+
0
-

@pista5 startuješ někde v JS nette.init()
?

oorac
Člen | 7
+
0
-

Ahoj, jak je to prosím s ublaboo/datagrid v PHP verzi 8.2? Je to kompatibilní? Nefunguje tam paginator kvůli latte compilaci.

{if $paginator->isLast()}
		<a class="first btn btn-sm {$btnSecondaryClass} disabled">{='ublaboo_datagrid.next'|translate}<i n:block = "icon-arrow-right" class="{$iconPrefix}arrow-right"></i></a>
	{else}
		<a class="btn btn-sm {$btnSecondaryClass} ajax" href="{$link('page!', ['page' => $paginator->page + 1])}" rel="next">{='ublaboo_datagrid.next'|translate}
	{/if}

Unexpected ‚{/if‘, expecting </a> for element started on line 30 at column 3 (in ‚…/templates/data_grid_paginator.latte‘ on line 31 at column 2)

Poradí někdo co s tím? Zatím jsem si to fixnul na tvrdo v šabloně, ale vím, že to není správně.

Editoval oorac (Včera 8:54)

Kamil Valenta
Člen | 798
+
0
-

@oorac o 6 příspěvků výše na téže stránce…

pista5
Člen | 66
+
0
-

Kamil Valenta napsal(a):

@pista5 startuješ někde v JS nette.init()
?

Ano… a v Tracy i vidim, ze pozadavek byl AJAXovy