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

Croc
Člen | 270
+
0
-

@PavelJanda Ale já vůbec nemluvím o chybě ohledně Naja. Naju nepoužíváme a už cca rok jedeme vlastním forku datagridu. Popisoval jsem stav předtím a co nás vedlo jít cestou vlastního forku.

Čamo
Člen | 786
+
0
-

Vie mi niekto povedať ako do Ublaboo dostanem Dibi 1:N reláciu a ako nad ňou filtrovať? Ďakujem.

Čamo
Člen | 786
+
0
-

Ako fakt by mi to pomohlo… Teraz to riešim cez vnorene selecty a tíško dúfam, že existuje aj iné riešenie.

Čamo
Člen | 786
+
0
-

Dúfaj ďalej.

Pepino
Člen | 239
+
0
-

@Čamo střílím od boku, ale neslouží k tomu setCondition (https://examples.contributte.org/…eton/filters) ?

Čamo
Člen | 786
+
0
-

@Pepino O to nejde. Problém je že Datagrid berie ako datasource query objekt a Dibi zase 1:N väzby vytvorí až po zavolaní fetchAssoc(‚id‘). A ten fetchAssoc ja nemám ako zavolať. Alebo teda neviem ako.

Pepino
Člen | 239
+
0
-

@Čamo Tak to asi neporadím. Já používám datagrid + doctrine a tam pošlu jako datasource querybuilder který má joiny a pak přes setCondition querybuilderu nastavím filtrování v joinutých tabulkách. Podle mě to tak samo musí fungovat i s použitím dibi.

Čamo
Člen | 786
+
0
-

@Pepino Obávam sa že nie. Používal som tento grid spolu s Nextras/Orm a ano tam to funguje lebo väzby sú definované v ORM, ale Dibi toto nemá. Keby mi to aspoň niekto potvrdil alebo vyvrátil…

Editoval Čamo (22. 7. 2022 10:16)

Čamo
Člen | 786
+
0
-

Prosím vás ako sa robí filtrovanie keď datasource je array?
Mám to teraz takto:

->setFilterSelect($hasAgenciesAll)
				->setCondition(function($datasource, $value) use ($agencies) {
					if( $value == 'all' ) return $datasource;
					$return = [];
					foreach ($datasource as $row) {
						if( $value == 1 && isset($agencies[$row['agency_id']]) ) $return = $row;
						if( $value == 0 || !isset($agencies[$row['agency_id']]) ) $return = $row;
					}
					return $return;
				});

ale dostávam z toho error

PropertyAccessor requires a graph of objects or arrays to operate on, but it found type "integer" while trying to traverse path "id" at property "id"

EDIT

Tak som na to prišiel. Treba proste upraviť to vstupné pole a to sa predáva odkazom takže sa to vlastne prejaví aj na celom datasource.

Editoval Čamo (5. 9. 2022 9:01)

krkabol
Člen | 5
+
0
-

ahoj,
pro vyfiltrované položky (datasource Doctrine) bych chtěl udělat proklik na samostatnou stránku kde se vykreslí jinou Latte šablonou – pro položky tiskneme štítky s čárovým kódem, takže v gridu si krásně vyfiltruje a potom se chce podívat na preview.. A nemohu to vymyslet – addExportCallback() mi sice zpřístupní filtrovaný subset, ale poradili byste mi prosím někdo kudy dál, jak si ho přehodit někam na úroveň presenteru nebo jinak se dostat k tomu abych si filtrovaný set položek zpracoval nezávisle na gridu?

díky předem

dms
Člen | 85
+
0
-

Snad jsem spravne pochopil ale zkusil bych Group akcí a v te udelat redirect s ideckama v get parametru (oddelil bych je carkou pres implode) na pozadovany jiny presenter. V tom pak idecka explodnout a mel bys mit pozadovana data

Melebius
Člen | 16
+
0
-

@PavelJanda Bylo by, prosím, možné opět zpřístupnit dokumentaci? Web ublaboo.org už nefunguje, stránka https://ublaboo.paveljanda.com/datagrid/, avizovaná na GitHubu, hlásí 404 a ještě má problém s certifikátem pro HTTPS…

Pavel Janda
Člen | 973
+
+2
-

Melebius napsal(a):

@PavelJanda Bylo by, prosím, možné opět zpřístupnit dokumentaci? Web ublaboo.org už nefunguje, stránka https://ublaboo.paveljanda.com/datagrid/, avizovaná na GitHubu, hlásí 404 a ještě má problém s certifikátem pro HTTPS…

Ahoj, github.com/dg/ublaboo-datagrid je nějaký davidům starší klon.

Tady je oficiální repozitář: https://github.com/…tte/datagrid
Dokumentace: https://contributte.org/…te/datagrid/
Demo se snippety kódu: https://examples.contributte.org/…id-skeleton/

krkabol
Člen | 5
+
0
-

dms napsal(a):

Snad jsem spravne pochopil ale zkusil bych Group akcí a v te udelat redirect s ideckama v get parametru (oddelil bych je carkou pres implode) na pozadovany jiny presenter. V tom pak idecka explodnout a mel bys mit pozadovana data

@dms díky, vyzkouším

Edit: jede, takže ještě jednou díky!

Editoval krkabol (7. 11. 2022 13:27)

theo
Člen | 57
+
0
-

Narazil jsem na zajímavý problém. Z nějakého důvodu nechci použít CSV export přímo z datagridu (špatně mi escapuje řetězce), takže používám League\Csv jako komponentu pro export do CSV. Funguje pěkně, ale zákazník by si přál, aby se do CSV exportu dostaly jen sloupce, které jsou zapnuté (viditelné). Myslel jsem si, že to udělám skrze $grid->getColumnsVisibility() a nastavení hodnoty 'visible' daného sloupce, ale narazil jsem na to, že tato hodnota vůbec nereflektuje aktuálně nastavenou viditelnost daného sloupce. Chápu význam této vlastnosti špatně, nebo je to chyba? Kde tedy najdu nějaký příznak viditelnosti sloupců? (Podotýkám, že nemám na mysli defaultHide).

Martin Vágovszký
Člen | 13
+
0
-

Zdravím, poradí mi někdo prosím jak udělat editaci řádku datagridu doubleclickem místo tlačítka? Napadlo mě řešit to něják javascriptem, ale třeba je nějáké hezčí řešení o kterém nevím. Díky za radu

igi
Člen | 24
+
0
-

Zdravím, začal jsem používat tuto komponette a musím ho pochválit. Dá se v něm jednoduše použít jako zdroj sql tabulky spojené joinem? Respektive možná to ani nepotřebuji, stačilo by mi aby tam byl i sloupec typu select(to jsem nikde v dokumentaci nenašel), kde by klíč byl cizí klíč a hodnota by byla hodnota z té připojené tabulky. Selectem to chci z důvodu, že by to mělo být editovatelné, takto by to bylo docela pohodlné, že uživatel by si vybral z dostupných jiných hodnot. Jak to prosím jednoduše implementovat? Děkuji.
EDIT: ještě tu mám další problém, nevím jestli je to chyba v gridu nebo dělám něco špatně, ale když jsem přidal možnost inline přidání řádku přesně dle návodu, tak místo toho se mi objevila „komponenta“ pro skrývání sloupců.

Editoval igi (20. 1. 2023 14:42)

tom
Člen | 171
+
0
-

Ahoj,
v ramci datasource mam nektere slouce takove CAST(AES_DECRYPT(u.telefon, 'SALT') AS CHAR(255)) as telefon a kdyz pak pouzivam filtr $grid->addFilterText('telefon', 'Telefon')->setSplitWordsSearch(false); tak mi to nefunguje, protoze misto WHERE (CAST(AES_DECRYPT(u.telefon, 'SALT') AS CHAR(255)) LIKE '%777%') ` se vytvori dotaz `AND (telefon` LIKE ‚%77%‘) `

Jde s tim neco delat? nebo si v ramci stranky musim udelat cely svuj novy filtr?

Diky

Felix
Nette Core | 1180
+
+8
-

👋 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

Pavel Kravčík
Člen | 1178
+
0
-

@Felix: Super práce! Akorát data-provide=datepicker asi není nikde definovaný v JS.

Zkus {input $input, type => date} v šabloně dateFilteru a dateRangeFilteru, funguje to perfektně a bez dalšího JS.

Ozzrel
Generous Backer | 50
+
+1
-

@Felix: Když si potřebuju odchytit Paginator a použiju $grid->getPaginator() tak přestane fungovat ItemsPerPage a další věci.

Sranda je že stačí bdump($grid->getPaginator()); Testováno na skeletonu a stejný výsledek.

Edit: vyřešeno jinak

// Toto nahrazeno:
$grid->getPaginator()->setTemplateFile(__DIR__.'/templates/data_grid_paginator.latte');

// Nedokumentovanou funkcí:
$grid->setCustomPaginatorTemplate(__DIR__.'/templates/data_grid_paginator.latte');

Kdyby někdo potřeboval Bootstrap Paginator:

{*
 * @param Paginator $paginator
 * @param array     $steps
 * @param string    $iconPrefix
 *}

{var $link = [$control->getParent(), link]}

<nav n:if="$paginator->pageCount > 1" aria-label="DataGrid Paginator">
	<ul class="pagination pagination-sm">
		<li n:class="page-item, $paginator->isFirst() ? disabled"><a class="page-link ajax" href="{$link('page!', ['page' => $paginator->page - 1])}"><i n:block="{$iconPrefix}arrow-left" class="{$iconPrefix}arrow-left"></i> {='ublaboo_datagrid.previous'|translate}</a></li>

		{foreach $steps as $step}
				<li n:class="page-item, $step == $paginator->page ? active">
					<a class="page-link ajax" {if $step !== $paginator->page}href="{$link('page!', ['page' => $step])}"{/if}>{$step}</a>
				</li>
			<span n:if="$iterator->nextValue > $step + 1" class="mx-3">&mldr;</span>
		{/foreach}

		<li n:class="page-item, $paginator->isLast() ? disabled"><a class="page-link ajax" href="{$link('page!', ['page' => $paginator->page + 1])}">{='ublaboo_datagrid.next'|translate} <i n:block="{$iconPrefix}arrow-right" class="{$iconPrefix}arrow-right"></i></a></li>
	</ul>
</nav>

Editoval Ozzrel (27. 1. 2023 9:28)

zoool
Člen | 89
+
0
-

Zdravím jak prosím, do status konktrétně do setOptions dám prvek z hodnotou null? Na null mi to nereaguje. Děkuji

Editoval zoool (1. 2. 2023 9:18)

igi
Člen | 24
+
0
-

Zdravím, rád bych jako zdroj pro zobrazení použil něco takového:

Nette\Database\Connection $database;
$database->query('SELECT * FROM tabulka WHERE neco = ?', $nejakaHodnota);

na to by nejspíše mělo být:
contributte/datagrid-nette-database-data-source
zkoušel jsem přes composer stáhnout, ale píše mi to:
Could not find a matching version of package contributte/datagrid-nette-database-data-source. Check the package spelling, your version cons
traint and that the package is available in a stability which matches your minimum-stability (stable)

Zkoušel jsem jestli už to není zahrnuto přímo v datagridu, ale pravděpodobně (pokud to dělám správně) tam není. Poradíte někdo prosím jak na to? Děkuji.

Petr Parolek
Člen | 455
+
0
-

https://packagist.org/…-data-source . Chyba je v readme. Správný název balíčku je ublaboo/datagrid-nette-database-data-source

Editoval Petr Parolek (13. 2. 2023 14:05)

igi
Člen | 24
+
0
-

Petr Parolek napsal(a):

https://packagist.org/…-data-source . Chyba je v readme. Správný název balíčku je ublaboo/datagrid-nette-database-data-source

Díky, bylo to tím.. nakonec jsem si ale uvědomil, že se dá použít i přímo nette database explorer a použít metodu table s přidáním metody where… otázkou co je efektivnější, jestli použití té table nebo použití nette database core a datagrid-nette-database-data-source…

cujan
Člen | 410
+
0
-

Zdravím, potreboval by som pri výpise záznamov ak mám položku schválené ak je v DB hodnota 0 nech sa vypíše napríklad krížik, a ak je tam hodnota 1 nech tam je symbol nejakej fajky, alebo podobne…
dúfam, že som to aspoň trochu zrozumiteľne napísal :D

igi
Člen | 24
+
0
-

Zdravím, používám inline big edit. V podstatě dle příkladu v skeletonu, tj.

$grid->getInlineEdit()->onSubmit[] = function ($id, Nette\Utils\ArrayHash $values): void {
			$this->myModel->someMethod($id, $values['aa'], $values['bb']);
			$this->flashMessage("nejaky text", 'success');
			$this->redrawControl('flashes');
		};

avšak flash zpráva se mi nezobrazí, je potřeba tam ještě něco dalšího nebo v čem mám chybu? Mám tam i action v tom gridu, kde se volá handle metoda přímo v presenteru a tam mi flash zpráva normálně funguje. Děkuji.

Petr Parolek
Člen | 455
+
0
-

igi napsal(a):

Zdravím, používám inline big edit. V podstatě dle příkladu v skeletonu, tj.

$grid->getInlineEdit()->onSubmit[] = function ($id, Nette\Utils\ArrayHash $values): void {
			$this->myModel->someMethod($id, $values['aa'], $values['bb']);
			$this->flashMessage("nejaky text", 'success');
			$this->redrawControl('flashes');
		};

avšak flash zpráva se mi nezobrazí, je potřeba tam ještě něco dalšího nebo v čem mám chybu? Mám tam i action v tom gridu, kde se volá handle metoda přímo v presenteru a tam mi flash zpráva normálně funguje. Děkuji.

Ahoj, zkus otestovat vykreslení flash mimo datagid přímo v presenteru přes signál handle*, zda-li vše funguje správně. Pokud máš datagrid v komponentě, kod má být:

$grid->getInlineEdit()->onSubmit[] = function ($id, Nette\Utils\ArrayHash $values): void {
 			$this->myModel->someMethod($id, $values['aa'], $values['bb']);
 			$this->getPresenter()->flashMessage("nejaky text", 'success');
 			$this->getPresenter()->redrawControl('flashes');
 		};

Editoval Petr Parolek (17. 2. 2023 13:38)

igi
Člen | 24
+
0
-

Petr Parolek napsal(a):

igi napsal(a):

Zdravím, používám inline big edit. V podstatě dle příkladu v skeletonu, tj.

$grid->getInlineEdit()->onSubmit[] = function ($id, Nette\Utils\ArrayHash $values): void {
			$this->myModel->someMethod($id, $values['aa'], $values['bb']);
			$this->flashMessage("nejaky text", 'success');
			$this->redrawControl('flashes');
		};

avšak flash zpráva se mi nezobrazí, je potřeba tam ještě něco dalšího nebo v čem mám chybu? Mám tam i action v tom gridu, kde se volá handle metoda přímo v presenteru a tam mi flash zpráva normálně funguje. Děkuji.

Ahoj, zkus otestovat vykreslení flash mimo datagid přímo v presenteru přes signál handle*, zda-li vše funguje správně. Pokud máš datagrid v komponentě, kod má být:

$grid->getInlineEdit()->onSubmit[] = function ($id, Nette\Utils\ArrayHash $values): void {
 			$this->myModel->someMethod($id, $values['aa'], $values['bb']);
 			$this->getPresenter()->flashMessage("nejaky text", 'success');
 			$this->getPresenter()->redrawControl('flashes');
 		};

Ahoj, zkoušel jsem to, flash zpráva přes handle normálně funguje, ale z toho datagridu to nějak nechce fungovat, ani s tím tvým kódem.Používám Nette 3.1 – jestli to třeba nemá vliv. A pak bych měl ještě jeden dotaz. Když mám v datagridu big inline editaci, kde edituji i id daného řádku, tak vše funguje jen javascript gridu pak neví kterému řádku má schovat tlačíka pro editaci, dá se to nějak jednoduše vyřešit? Ten případ kdy to takto používám opravdu nepotřebuje žádné další id, jedná se o seznam jedinečných zařízení, které každé má své sériové číslo a je právě potřeba možnost editaci jejich sériových čísel.

iru
Člen | 110
+
0
-

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.

Editoval iru (27. 3. 2023 6:00)

akmt
Člen | 20
+
0
-

Ahoj, nenašel jsem tuto informaci ani v dokumentaci, ani v ukázkách, proto se ptám zde:
Umím vytvořit ToolbarButton s odkazem na filtr podle nějakého ze sloupečků Datagridu?
Toto je z dokumentace:
$grid->addToolbarButton('this', 'Button', ['foo' => 'bar']);
ale možnost tam nějak „narvat“ filtr jsem nenašel ani nedokázal odvodit.
Něco jako:
$grid->addToolbarButton('this', 'Show category 10', ['category' => 10]);
Díky za pomoc.

Editoval akmt (10. 4. 2023 19:08)

pp
Člen | 48
+
0
-

Ahoj, peru se tu s problemem kdy mam v gridu sloupec ‚stav‘ ktery chci upravit malou inline editaci. Pole $values je napr. [ 1 ⇒ ‚ano‘, 2 ⇒ ‚ne‘ ].

$grid->addColumnText('stav', 'Stav')
->setEditableCallback(function($id, $value) { .. }
->setEditableInputTypeSelect($values)
->setReplacement($values)

Pokud pouziju tohle tak se ve sloupci zobrazuji spravne hodnoty (ano/ne).
Kdyz vyvolam inline editaci, prepne se na typ select (obsah je v poradku) ale nevybere aktualni hodnotu jako defaultni.
Bez „Replacementu“ je ten vyber defaultni hodnoty OK ale pak mam ve sloupci jek klice.
dik za radu

igi
Člen | 24
+
0
-

Zdravím, nevíte někdo jestli je následující bug nebo vlastnost? Když u nějakého sloupečku použiji filtr, tak funguje. Poté se rozhodnu, že u daného sloupečku filtr nepotřebuji, tak odstraním daný kód filtru. Poté se mi ale objeví chyba session, že daný filtr neexistuje. Jak se toto řeší? Prozatím jsem to vyřešil tak, že jsem natvrdo smazal všechny session. Poté už fungovalo. Děkuji.

radas
Člen | 220
+
0
-

Myslím, že pomůže nastavení

$grid->strictSessionFilterValues = FALSE;

igi
Člen | 24
+
0
-

@radas: díky moc, pomohlo to.
Jinak bych se chtěl zeptat ještě na jednu věc, v dokumentaci to nemůžu najít. Mám v gridu tabulkou kde bych chtěl v jednom sloupečku podbarvovat určité řádky dle hodnoty v jiném sloupci v databázi, ale tuto samotnou hodnotu v gridu zobrazovat nechci. Stejně tak dle této hodnoty bych chtěl v big edit gridu mít různý validační pattern, dá se to prosím nějak jednoduše udělat? Děkuji.

wojtishek
Člen | 1
+
0
-

Snažím se buildnout z next větve assety, ale nemám moc zkušeností s frontend buildery a .docs/assets.md mi nepomohlo. Dokázal by mi s tím někdo pomoci, pls?

Dostal jsem se zatím k:

  • vytvoření package.json
  • vytvoření vite.config.js
  • npm i
  • npm run build

poslední mi končí tímhle:

Could not resolve entry module (./assets/js/main.js).
error during build:
Error: Could not resolve entry module (./assets/js/main.js).

Editoval wojtishek (6. 7. 2023 17:47)

igi
Člen | 24
+
0
-

Zdravím, dá se prosím do item detail dostat nějak jednoduše obsah jiného presenteru? Děkuji.

n.u.r.v.
Člen | 482
+
0
-

Ahoj, chtěl bych se naučit používat tento datagrid abych přestal být závislý jen na nextras-datagrid, který používáme leta, ale již není moc udržovaný…

Akorát nevím jestli půjde to samé, jako jsme dělali v nextras/datagridu, že jsme v Repository měli metodu pro načtení dat z db (psali jsem si vlastní sql dotazy) a ta měla mimo jiné parametry pro order pro řazení (dostávala z datagridu typ a název sloupce podle kterého má řadit) a parametry limit a offset (teď jsem našel že možná tohle půjde pomocí $grid->getPaginator()->getPaginator()->getOffset() a getLength).

Můžete mi prosím poradit jak při kliku v datagridu na řazení získat typ řazení a dle kterého sloupce?

Dále jsem zatím nepřišel na to, jak definovat vlastní hlavičku a patičku tabulky

např. takto:

{define table-open-tag}
    <table id="tblList" class="table">
{/define}

{define table-close-tag}
<tfoot>
<tr>
    <tdcolspan="5">...</td>
    <td>...</td>
</tr>
</tfoot>
    </table>
{/define}

Díky za radu a trpělivost, asi se tu teď budu ptát častěji…

matronator
Člen | 37
+
0
-

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?

Editoval matronator (14. 9. 2023 13:53)

LmErs
Člen | 3
+
0
-

Ahoj, asi jsem slepý ale nemohu přijít na jednu věc (a nemohu to ani nikde dohledat).

Mám tyto dvě tabulky

CREATE TABLE `meetings_points_tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `point` int(11) DEFAULT NULL,
  `task` text NOT NULL,
  `task_anonym` text DEFAULT NULL,
  `datetime` datetime NOT NULL,
  `status` varchar(255) DEFAULT NULL,
  `now` int(2) DEFAULT NULL,
  `continuously` int(2) DEFAULT NULL,
  `custom` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `point` (`point`),
  CONSTRAINT `meetings_points_tasks_ibfk_2` FOREIGN KEY (`point`) REFERENCES `meetings_points` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_czech_ci;
CREATE TABLE `meetings_points_tasks_users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `task` int(11) DEFAULT NULL,
  `user` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user` (`user`),
  KEY `task` (`task`),
  CONSTRAINT `meetings_points_tasks_users_ibfk_2` FOREIGN KEY (`user`) REFERENCES `users` (`id`),
  CONSTRAINT `meetings_points_tasks_users_ibfk_3` FOREIGN KEY (`task`) REFERENCES `meetings_points_tasks` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_czech_ci;

K tomu mám datagrid (jako datasource mám Nextras/Orm):

protected function createComponentTasksGrid($name)
	{
		$grid = new DataGrid($this, $name);
		$grid->setDefaultPerPage(20);
		$grid->setDataSource($this->meetingsPointsTasksFacade->findAllTasksByEntityId($id));

...

$grid->addColumnText('users', 'Řešitelé')
            ->setRenderer(function ($row) {
                $resitele = '';
                foreach ($row->users as $u) {
                    $resitele .= $u->user->getFullName() . ', ';
                }
                return rtrim($resitele, ', ');
            });

        $grid->addFilterSelect('users', 'Řešitelé', ['' => 'Vše'] + $this->usersFacade->findByEntityForForm($id))
            ->setCondition(function ($collection, $value) {
                if (!$value) {
                    return $collection;
                }

                // Vyhledávání v Nextras/Orm
                $qb = $collection->getQueryBuilder();
                $qb->leftJoin('meetings_points_tasks', 'users', 'users', 'users.id')->andWhere('[users.id] = %i', $value)
                    ->andWhere('users.id = %i', $value);
                return $collection;
            });

Vše se zdá, že je korektní a zobrazuje to data tak jak má. Problém je ve chvíli, kdy chci vyhledávat pomocí toho custom filtru users. I když v Tracy vidím, že dotaz proběhl, tak DataGrid na to nijak nereaguje. Zobrazuje stále stejná data.

Nevíte někdo proč? Koukám do toho už několik hodin a na nic jsem nepřišel :(

Mnohokrát děkuji za jakoukoliv odpověď.

mskocik
Člen | 51
+
+1
-

A čo ti vracia $this->meetingsPointsTasksFacade->findAllTasksByEntityId($id)?

EDIT: Btw ten left join sa mi zdá nejaký divný, viď domukentácia:

$builder->joinLeft('[books] AS [b]', '[a.id] = [b.authorId] AND [b.title] = %s', $title);

A btw setCondition() nemusí vraciať kolekciu.

Editoval mskocik (11. 10. 2023 12:16)

LmErs
Člen | 3
+
0
-

mskocik napsal(a):

A čo ti vracia $this->meetingsPointsTasksFacade->findAllTasksByEntityId($id)?

EDIT: Btw ten left join sa mi zdá nejaký divný, viď domukentácia:

$builder->joinLeft('[books] AS [b]', '[a.id] = [b.authorId] AND [b.title] = %s', $title);

A btw setCondition() nemusí vraciať kolekciu.

Moc děkuji za odpověď. Samozřejmě máš pravdu. Ten leftJoin byl špatně. Jen jsem to už neviděl.
Mockrát díky!

raketoplan2005
Člen | 147
+
0
-

Jde prosím nějak rozumně nastavit šířka sloupce? Mám teď sloupec s datetimerange filtrem široký přes půl gridu :-(

Ozzrel
Generous Backer | 50
+
+2
-

setFitContent() nebo addAttributes() a tam si dohodíš co je třeba

adam_frajer
Člen | 14
+
0
-

pp napsal(a):

Ahoj, peru se tu s problemem kdy mam v gridu sloupec ‚stav‘ ktery chci upravit malou inline editaci. Pole $values je napr. [ 1 ⇒ ‚ano‘, 2 ⇒ ‚ne‘ ].

$grid->addColumnText('stav', 'Stav')
->setEditableCallback(function($id, $value) { .. }
->setEditableInputTypeSelect($values)
->setReplacement($values)

Pokud pouziju tohle tak se ve sloupci zobrazuji spravne hodnoty (ano/ne).
Kdyz vyvolam inline editaci, prepne se na typ select (obsah je v poradku) ale nevybere aktualni hodnotu jako defaultni.
Bez „Replacementu“ je ten vyber defaultni hodnoty OK ale pak mam ve sloupci jek klice.
dik za radu

Ahoj, vyřešil jsi to nějak? Já to vyřešil javascriptovým workaroundem, že před načtením scriptu pro grid si uložím hodnotu, co je ve sloupci:

<script>
		var selectedText = null;
		document.addEventListener('click', e => {
			if(e.target.getAttribute('data-datagrid-editable-type') == 'select'){
				selectedText = e.target.innerText
			}
		})
	</script>

A po načtení scriptu si pro option attribut selected podle uložené hodnoty

<script>
		document.addEventListener('click', e => {
			if(e.target.getAttribute('data-datagrid-editable-type') == 'select'){
				selectElement = e.target.firstElementChild;
				var optionToSelect = Array.from(selectElement.options).find(function(option) {
   					return option.text.trim() === selectedText.trim();
				});
				if (optionToSelect) {
    				optionToSelect.setAttribute('selected', 'selected');
				}
			}
		})
	</script>

->setReplacement() nepoužívám

Uvědomoji si, že to není moc dobrý způsob, ale nic jiného mě bohužel nenapadlo… kdyby někdo znal lepší způsob, budu moc vděčný!

tom
Člen | 171
+
0
-

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

iru
Člen | 110
+
0
-

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?

Tomáš Vodička
Člen | 28
+
0
-

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?

s nette/forms 3.1.14 by ti to mělo fungovat, to je kompatibilní i s PHP 8.3 (nette/forms ještě nemá čtyřkovou verzi)