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

Hlava
Člen | 19
+
0
-

Ahoj, strávil jsem celou noc nad tím, proč mi submit u perPage je „button“ a nikoliv „input“. Pak nefunguje automatický submit v datagridu. Asi to nebude s datagridem jako takovým, ale netušíte někdo, proč se mi místo inputu kreslí button? S nette pracuji pár dnů, tak je možné, že mi uniká nějaká základní vlastnost. Díky za odpověď.

radypala
Člen | 6
+
0
-

Ahojte,

robim COUNT nad tabulkou, pricom zgroupujem podla acl_user_id a z neho si urobim aj count ako usage. Len pri strankovani mi vystrankovalo pocet riadkov bez groupu

		$grid->setDataSource( $this->usageModel->getTable()
			->select('report_comparator_usage.acl_user_id, COUNT(*) AS usage, acl_user.*')
			->joinWhere('acl_user', '1=1')
			->group('acl_user_id')
			->order('acl_user_id ASC') );

Original kod v Datagride „API“:https://ublaboo.org/…aSource.html#…

Moja uprava:

	/**
	 * Get count of data
	 * @return int
	 */
	public function getCount()
	{
		try {
			$primary = $this->data_source->getPrimary();
		} catch (\LogicException $e) {
			return $this->data_source->count('*');
		}

		$dataSourceSqlBuilder = $this->data_source->getSqlBuilder();

		if($dataSourceSqlBuilder->getGroup() != '') {
			return $this->data_source->count(
				'DISTINCT '.$dataSourceSqlBuilder->getGroup()
			);
		} else {
			return $this->data_source->count(
				$this->data_source->getName() . '.' . (is_array($primary) ? reset($primary) : $primary)
			);
		}
	}

Zatial funguje, ale podla mna nie je najvhodnejsia, ako by to malo byt spravne (potom pripadne by som to commitol alebo niekto iny na github)?

Hlava
Člen | 19
+
0
-

V případě, že je DataSource Array a je zapnutý filter, tak se paginator nerefreshuje jak má.

je to nad aktuální verzí:

<?php
    public function createComponentTester()
    {
        $grid = new DataGrid();
        for ($i=0;$i<500;$i++) {
            $data[$i]['id'] = $i;
            $data[$i]['anything'] = rand(10,100);
        }
        $grid->setDataSource($data);
        $grid->addColumnText('anything','FilterCol')->setFilterText();
        return $grid;
    }
?>
Hlava
Člen | 19
+
0
-

Teď jsem si všiml, že na to je už pull request. Tak sorry :)

Hlava napsal(a):

V případě, že je DataSource Array a je zapnutý filter, tak se paginator nerefreshuje jak má.

je to nad aktuální verzí:

?>

igor.pocta
Člen | 100
+
0
-

Ahoj,

nenapadá vás co je tohle za chybu? Místo komponenty s gridem mám Server Error. V místě, na které odkazuje laděnka je standardní kód na odkaz, který funguje v celé aplikaci.

Odkaz na screen

sikulam
Člen | 12
+
0
-

@igor.pocta Zkusil bych promazat cache, jinak mě nic nenapadá ;-)

igor.pocta
Člen | 100
+
0
-

sikulam napsal(a):

@igor.pocta Zkusil bych promazat cache, jinak mě nic nenapadá ;-)

To nepomůže, už jsem to zkoušel několikrát… :D

Editoval igor.pocta (22. 3. 2017 22:02)

Petr Parolek
Člen | 455
+
0
-

Ahoj, je prosím v datagidu funkce, po dvojkliku na řádek se zobrazí inline editace?

tomfz6
Člen | 32
+
0
-

Čau všem, neřešil někdo že by šlo měnit také pořadí sloupců? Jako má třeba datatable.js

jan-stanek
Člen | 9
+
0
-

Ahoj,
funguje group action multiselect? V poslední době se mi v některých prohlížečích občas nezobrazí a zmizel i z ukázek na webu.

Pavel Janda
Člen | 977
+
0
-

@jan-stanek Tam někdy byl? Asi ho můžeš použít, ale nebudou pro něj existovat styly, tuším.

igor.pocta
Člen | 100
+
0
-

Ahoj,

mám problém s refreshem řádku. Po vytvoření záznamu se mi neobnoví obsah datagridu ani se nic nepředává ve snippetu (kromě flashmessage, která je v onSave). Totožný kód mám i pro editaci, ta ale funguje dobře.

Napadává vás, kde je chybka?

Díky

$grid->addInlineAdd()->onControlAdd[] = function ($container) {
    $container->addSelect('investment', '', $this->investmentFacade->getInvestmentList());
    $container->addSelect('plant', '', $this->employeeFacade->getPlantsList());
    $container->addText('title', '');
    $container->addText('invoiceNr', '');
    $container->addText('deliveryNote', '');
    $container->addSelect('currency', '', ["CZK" => "Kč", "EUR" => "Euro"]);
};

$grid->getInlineAdd()->onSetDefaults[] = function ($container) {
    /** @var Entry $entry */
    $container->setDefaults([
        'title' => (new \DateTime())->format("d.m.y") . " - ",
        'currency' => 'CZK'
    ]);
};

$grid->getInlineAdd()->onSubmit[] = function ($values) {
    // Uložení nového příjmu
    $entry = new Entry;
    try {
        $this->entryFacade->saveEntryForm($entry, $values);
        $this->onSave($this, $entry);
    } catch (ORMException $e) {
        $this->onException($this, $e);
    }
};
Pavel Janda
Člen | 977
+
0
-

@igor.pocta Zkus v tom $grid->getInlineAdd()->onSubmit[] refreshnout grid ($this['grid']->redrawControl))).

igor.pocta
Člen | 100
+
0
-

Pavel Janda napsal(a):

@igor.pocta Zkus v tom $grid->getInlineAdd()->onSubmit[] refreshnout grid ($this['grid']->redrawControl))).

Takhle to funguje. Chceš to do issue? Když v inline-edit to funguje a v inline-add ne? Nebo je to moje chybka?

jan-stanek
Člen | 9
+
0
-

@PavelJanda Díky za vrácení příkladu, chyba tedy bude někde u mne.

EDIT: Vypadá to jako by se u něj jen nezrušilo display: none;, pokud jej ručně odstraním, zbytek už funguje.

EDIT2: Špatně jsem se díval, příklad je tam celou dobu, jen není na stránce group-action, ale overview.

EDIT3: Tak to asi bylo špatným pořadím javascriptů, pořád to ale jde jen ve firefoxu…

Editoval jan-stanek (29. 3. 2017 0:49)

Pavel Janda
Člen | 977
+
0
-

@igor.pocta Přidám zmínku do dokumentace.

jan-stanek
Člen | 9
+
0
-

@PavelJanda Vypadá to, že vše funguje, pokud upravím tuto část:

$(this).on('loaded.bs.select', function(e) {
    $(this).parent().attr('style', 'display:none;');
    return $(this).parent().find('.hidden').removeClass('hidden').addClass('btn-default');
});
return $(this).on('rendered.bs.select', function(e) {
    return $(this).parent().attr('id', id);
});

Takto:

return $(this).on('loaded.bs.select', function(e) {
    $(this).parent().attr('style', 'display:none;');
    $(this).parent().attr('id', id);
    return $(this).parent().find('.hidden').removeClass('hidden').addClass('btn-default');
});

Editoval jan-stanek (30. 3. 2017 1:19)

Blujacker
Člen | 89
+
0
-

@PavelJanda
Ahoj,

da se nejak v addAction predat cely row? Router prijima parameter $article, kteremu normalne predavam parameter jako

<?php
{foreach $modelArticle->getAllArticles() as $article}
	<a n:href="view, article => $article>...</a>
{/foreach}

getAllArticles vraci dibi->query('SELECT * from articles')->fetchAll()
?>

Lze neceho podobneho docilit v datagridu? Potreboval bych neco jako:

<?php
$grid->addAction('view', 'View', ':Article:view', ['article' => $row]);
?>

Diky!

Pavel Janda
Člen | 977
+
0
-

@Blujacker Action::addParameters :)

chap
Člen | 81
+
0
-

Ahoj, je prosím nějak jednoduše možné ovlivnit zda se zobrazí statusColumn jen při splnění podmínky (obdoba allowRowsAction). Chtěl bych v tabulce mít možnost volit zda se zobrazí jen v některých řádcích. Nebo ještě lepší, pokud by byla možnost ovlivňovat položky v selectu na základě vlastností řádku (např. pro záznamy, které mají nějak definovaný stavový diagram).

Pavel Janda
Člen | 977
+
0
-

@chap Asi by mělo fungovat toto: Column::setRendererOnCondition(). Pokud je splněna podmínka, použije se renderer callback, jinak defaultní akce, tedy vyrenderování ColumnStatus.

chap
Člen | 81
+
0
-

@PavelJanda paráda díky za hint. Ještě jedna věc mne trochu trápí a to setColumnsSummary … aktuálně zobrazuje sumu nad právě zobrazenými řádky. Je možno nějak jednoduše zobrazit sumu napříč všemi stranami?

Pavel Janda
Člen | 977
+
0
-

@chap Od takovýchto složitějších výpočtů je interface Ublaboo\DataGrid\AggregationFunction\IAggregationFunction. Tím si vytvoříš vlastní sql cally, které se pak zobrazí na výstupu. Jako příklad nechť poslouží tato třída FunctionSum.

jcas
Člen | 1
+
0
-

Ahoj, děkuji za super DG. Je nějaký způsob, jak v itemsDetail vykreslit nějakou komponentu, např. další grid?

chap
Člen | 81
+
0
-

@PavelJanda Super – jen chyběla drobnost pro doctrine … poslal jsem PR. Je vůbec něco co tvůj grid neumí?

Pavel Janda
Člen | 977
+
0
-

@chap Díky za pull requesty!
:D Neumí spousty věcí, které jsem zatím nepotřeboval..

Petr Parolek
Člen | 455
+
0
-

jean_cz napsal(a):

Ahoj,

řeším problém s metodou addAction. Nepřišel jsem na způsob jak předat „action“ s jinými parametry než jsou data ve sloupcích.

Dejme tomu, že chceme zavolat action „print“ z presenteru „Printer“, která přijíma dva parametry id a velikost stránky – Printer:print(12, self::PAGE_SIZE) kde druhý parametr je konstanta a tedy se v datasource nenachází.

Nevěděl by někdo?

Díky.

Pavel Janda napsal(a):

@jean_cz Action zatím neumí přidání „externích“ parametrů. Ale můžeme to přidat, jelikož se po tom ptal i někdo jiný. Mohl bys založit issue pls?

Ahoj, rád bych se zeptal, jestli je tato funkce přidaná do datagridu. Díky moc.

radas
Člen | 220
+
0
-

Ahoj,
myslím že je na to metoda addParameters().

Petr Parolek
Člen | 455
+
+1
-

Pavel Janda napsal(a):

@rumcais1 $grid->addAction('edit', '', 'Users:edit', ['userId' => 'id', 'deleted']) :)

Nakonec vyřešeno přes správně nastavený čtvrtý parametr metody addAction. Díky všem-

kralik
Člen | 230
+
0
-

Ahoj,
měl bych prosbičku k super DG.
Je možné při např. handleDelPolozka nějak provést RESET filtru na gridem?

Pokus si totiž vymažu poslední položku ve tak obdržím chybu, že položka v seznamu pro select option není.

De facto filtr zůstane zapnutý, potřeboval bych jej resetoval?

Případně dělám chybu v interpretaci DG když si hodnoty pro filtr nahrávám z DB takto. Případně jak to dělat jinak?

<?php
...
 $grid->addFilterSelect('sektorcz', 'Sektor', $data['sek'],'sektor.name');
...
?>

Takto to funguje dokud není ve filtru poslední položka a tu se rozhodnu smazat, poté obdržím chybu.

Moc díky
Tom

Pavel Janda
Člen | 977
+
0
-

@kralik To máš pěkně provzané všechno.. Zkus v tom handleru odebrat filtr, přidat filtr (již s méně položkami) a překreslit grid.

kralik
Člen | 230
+
0
-

mohl bys mě trochu více nakopnout?

Přemýšlel jsem, že bych v handle odebral filtr, při $this->redirect();
Ideální by bylo zjistit,při handlu na smazání, zda je vyfiltrovaná jedna položka a kdyžtak odebrat celý filtr.

Myslíš, že to nějak jde?

Díky

Pavel Janda napsal(a):

@kralik To máš pěkně provzané všechno.. Zkus v tom handleru odebrat filtr, přidat filtr (již s méně položkami) a překreslit grid.

Editoval kralik (18. 4. 2017 14:11)

Pavel Janda
Člen | 977
+
0
-

@kralik Já jsem myslel, že by se to celé provedlo v jednom ajax callu. Zkus pls popsat, jak to máš provázané (řádky tabulky vs položky filtru).

kralik
Člen | 230
+
0
-

Pavel Janda napsal(a):

@kralik Já jsem myslel, že by se to celé provedlo v jednom ajax callu. Zkus pls popsat, jak to máš provázané (řádky tabulky vs položky filtru).

Ahoj,
dal jsem část zdrojového kódu zde na pastebin

Prosím mrkni na to.
Moc díky

skyfall174
Člen | 5
+
0
-

Dobrý den,
narazil jsem na problem, že když udelam redirect např

<?php
	...
	...
	$this->redirect("this", ["some_param"=>"some_val"]);
?>

pak, pokud na stránce je datagrid, on automatický přesměruje na stránku a smaže v url ?some_param=some_val a udelá redirect na stranku bez GET parametru.
Nevite jak by se dalo zakazat automatický přesměrování v datagridu?

Předem děkuji.

Pavel Janda
Člen | 977
+
0
-

@skyfall174 Prosím, pročti si celou diskuzi, už se to řešilo hodněkrát. Jelikož máš k dispozici komponentu, která chce měnit url stránky, musíš to nastavit jako persistentní parametr.

Pavel Janda
Člen | 977
+
0
-

@kralik Je to tak nějak, jak jsem myslel. Zkus v handle metodě odstranit filtr a nastavit ho znovu s aktuálními daty. Potom datagrid překreslit.

kralik
Člen | 230
+
0
-

Pavel Janda napsal(a):

@kralik Je to tak nějak, jak jsem myslel. Zkus v handle metodě odstranit filtr a nastavit ho znovu s aktuálními daty. Potom datagrid překreslit.

Ano to bych přesně chtěl.
Jenže jsem bohužel nepřišel na to jak?

Mohl bys alespoň nastínit jak a nebo odkázat na část dokumentace?

Moc díky

Pavel Janda
Člen | 977
+
0
-

@kralik $grid->removeFilter(), $grid->addFilter()

kralik
Člen | 230
+
0
-

Pavel Janda napsal(a):

@kralik $grid->removeFilter(), $grid->addFilter()

ještě dovol jednu otázku.
V handlu získám přístup ke gridu touto cestou $this->grid->removeFilter()?
Je možné získat takto filtry, které jsou nastaveny např. $this->grid->getFilter()?

Díky

Pavel Janda
Člen | 977
+
0
-

@kralik
1, Klidně můžeš přistupoval ke gridu jako k normální komponentě (je to asi jednodušší): $this['grid'].
2, Se koukni do kódu, tě nekousne. :) DataGrid::getFilter($key).

FTCP
Člen | 6
+
0
-

@PavelJanda
Dobré den
Chtěl bych navázat na problém od @radypala (16.3. 8:58) s funkcí getCount() a problémem s paginací při groupování, jestli by jsi se na to koukl prosím.

kralik
Člen | 230
+
0
-

Pavel Janda napsal(a):

@kralik
1, Klidně můžeš přistupoval ke gridu jako k normální komponentě (je to asi jednodušší): $this['grid'].
2, Se koukni do kódu, tě nekousne. :) DataGrid::getFilter($key).

Ahoj,
stále se nějak nemohu dostat na to abych vymazat(resetoval) filtr.
zkouším to takto

<?php
/* HANDLE */
..
// zkouším toto
$this['gridLinky']->removeFilter('sektorcz');
// nebo toto
$this['gridLinky']->setFilter(array('sektorcz' => ''));

$this->redirect('linky');
?>

Bohužel stejně nemohu vysněného efektu docílit.

V laděnce vidím toto:

<?php
 ...\www\bubaci\vendor\others\Ublaboo\src\DataGrid.php:1457	source  Ublaboo\DataGrid\DataGrid->setFilterContainerDefaults(arguments)
$container

Nette\Forms\Container #01

$values

array (2)
linkacz => ""
sektorcz => "IT"
?>

Určitě to dělám špatně. Bohužel nevím co.

Moc díky

Pavel Janda
Člen | 977
+
0
-

@FTCP Nekoukal. Můžeš poslat PR s testy. :)

Pavel Janda
Člen | 977
+
0
-

@kralik Ještě ti možná zůstaly vyfiltrované hodnoty v session. Je tam na to nastavovátko, něco jako DataGrid::$strict_session_values. Zkus pohledat. Kontroluje hodnoty filtru a potom podle nastavovátka buď vyhodí exception nebo nedělá nic.

kralik
Člen | 230
+
0
-

Pavel Janda napsal(a):

@kralik Ještě ti možná zůstaly vyfiltrované hodnoty v session. Je tam na to nastavovátko, něco jako DataGrid::$strict_session_values. Zkus pohledat. Kontroluje hodnoty filtru a potom podle nastavovátka buď vyhodí exception nebo nedělá nic.

Filtr zůstaval nastavený v session.
Takto smažu filtr v session.

<?php
...
/* V HANDLE linkaDel */
$this['gridLinky']->deleteSesssionData('sektorcz');
...
?>

Poté již grid chybu nehlásí.

Ještě mě napadá je možné získat v handlu informace z gridu kolik je vyfiltrovaných položek?
Kdyby ano, tak bych si nastavil, že smažu data z Session pouze pokud pří použití filtru jen jedna položka.

Díky

Pavel Janda
Člen | 977
+
0
-

@kralik Spíš bych být tebou změnil ty public static $strict_session_filter_values na false. Ať se o to nemusíš starat.

kralik
Člen | 230
+
0
-

Pavel Janda napsal(a):

@kralik Spíš bych být tebou změnil ty public static $strict_session_filter_values na false. Ať se o to nemusíš starat.

Přesně, to je to co jsem celou dobu hledal :-)

Moc díky

nocturne32
Člen | 21
+
0
-

Zdravím.
Procházel jsem si tu příspěvky i dokumentaci, ale pořád mi to není jasné.
Rád bych se zeptal, jestli jde v ItemsDetail udělat nový výběr podle ID záznamu. Případně jak by to bylo vypadalo? Dokázal jsem vybrat pouze podle staticky daného ID.

Pavel Janda
Člen | 977
+
0
-

@nocturne32 Úplně nerozumím tomu, co myslíš tím novým výběrem. Můžeš popsat trošku víc polopatě tvůj myšlenkový pochod?