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

Blujacker
Člen | 89
+
0
-

Hraju si s API-data-source a narazil jsem na problem. API potrebuje, aby mu bylo zaslan seznam sloupcu ktere ma vratit. Pokud se neposle ten seznam tak to vrati prazdny seznam. Slo by nejak Datagrid prizpusobit tomu, aby tento seznam umel predavat api-data-source?

Ve svem starem vlastnim gridu jsem to mel udelane tak, ze pred odeslanim se prosel seznam sloupcu + bylo mozne mimo definovat dalsi default hodnoty (ktere se nezobrazily ale API je muselo vratit protoze byly potreba k vypoctum apod.)

Pavel Janda
Člen | 977
+
+1
-

@Blujacker Když se podíváš na konstruktor třídy ApiDataSource, tak druhý argument je seznam query parametrů, které se posílají při každém requestu na vzdálené API. Stačí takto? :)

Bohužel datasourcy nemají povědomí o datagridu, takže nelze jednoduše proiterovat sloupce, jak píšeš.

Editoval Pavel Janda (19. 5. 2016 11:43)

Blujacker
Člen | 89
+
0
-

@PavelJanda Nakonec jsem to vyresil nehezky tak, ze si predavam $grid do data-source a z toho uz si seznam sloupcu vytahnu z array_keys($grid->columns).

Ale jeste mi neni uplne jasne jak pracovat s parametrem getResponse($params). Je tam klic sort, ale ten je vzdy NULL, protoze se sort() vola az po getResponse() – viz screen http://imgur.com/dK87FJe

Delam neco spatne nebo je to tam nekde prohozene?

Edit: stejne je to s limit(), jedine filter() se vola pred getResponse().

Edit2: Vyreseno, bylo to kvuli tomu, ze getData() si vysledek getResponse() cachuje, stacilo odstranit cache a vyreseno.

Editoval Blujacker (19. 5. 2016 13:37)

Darkling
Člen | 35
+
+1
-

Ahoj,
po přechodu na verzi 4.1 mi přestali fungovat group actions:

<?php
// Tracy
// strtolower() expects parameter 1 to be string, object given
// GroupActionCollection.php:114

$http_ids = $form->getHttpData(Form::DATA_LINE|Form::DATA_KEYS, strtolower($this->datagrid) . '_group_action_item[]');
?>

Plus mě ještě napadlo:

  1. bylo by super mít možnost ::setTranslateOptions() na select group action, stejně jako tomu je u filtrů.
  2. taky by se hodilo ::addGroupMultiSelectAction

Může se pokusit implementovat a poslat PR. Jinak naprosto super grid.

Pavel Janda
Člen | 977
+
0
-

@Blujacker Kde se volá ::getData() před sortěním a limitěním? :-o

Všechny ty cally jdou od DataModel::fitlerData() a tam se to volá postupně. Co udělá ApiDataSource v sortění a limitění je pouze to, že nastaví sám sobě nějaké property a vrátí $this. Neměl by tahat rovnou data.. To až ::getData().. Nebo co přehlížím?

Blujacker
Člen | 89
+
0
-

Pavel Janda napsal(a):

@Blujacker Kde se volá ::getData() před sortěním a limitěním? :-o

Všechny ty cally jdou od DataModel::fitlerData() a tam se to volá postupně. Co udělá ApiDataSource v sortění a limitění je pouze to, že nastaví sám sobě nějaké property a vrátí $this. Neměl by tahat rovnou data.. To až ::getData().. Nebo co přehlížím?

getData se poprve vola ve filter() – https://github.com/…taSource.php#L136 a vysledek se rovnou ulozi do $this->data. A pak kdyz se getData vola znovu zde https://github.com/…ataModel.php#L124 nebo zde https://github.com/…ataModel.php#L121 tak se vrati $this->data a uz se znovu nevola getResponse() s nastavenym sort() a limit() protoze $this->data neni empty.

Snad to chapu dobre..

Blujacker
Člen | 89
+
0
-

Misto fa pouzivam glyphicony pro zobrazovani icon. Koukal jsem, ze existuji pred-definovane zakladni bloky (sort up/down), ale chybi to pro pokrocilejsi icony napr. u zobrazovani / schovavani sloupcu. Ekvivalentni icony se u bootstrapu jmenuji jinak nez u font-awesome a tedy nedojde k jejich zobrazeni. Napr: https://github.com/…tagrid.latte#L85, https://github.com/…tagrid.latte#L91, …

Pavel Janda
Člen | 977
+
0
-

@Darkling v4.1.1

@Blujacker Ale ta metoda ::fitler() se volá až po sortění a limitění.. Je to vidět v té třídě DataModel. Udělá se sort, limit a pak filter. V filtru se rovnou stáhnout data a jakmile se zavolá z DataModelu ->filter()->getData(), tak to getData() vrátí již stáhnutá data..

Leda že bys to někde stahoval ještě jednou. A nebo fakt něco přehlížím.

Pavel Janda
Člen | 977
+
0
-

@Blujacker Odpověděl sis sám… Proměnnou DataGrid::$icon_prefix si změň na ‚glyphicon glyphicon-‘.

Blujacker
Člen | 89
+
0
-

@PavelJanda To jsem udelal na zacatku, ale to nepomuze, protoze v fa se ta icona jmenuje gear ale takova icona v bootstrapu neexistuje, ekvivalent teto icony se jmenuje cog. Takze staci pridat n:block

<i n:block="icon-gear"class="{$icon_prefix}gear"></i>

a vlastni definici do latte do setTemplateFile

{block icon-gear}<span class = "glyphicon glyphicon-cog"></span>{/}

Delam to spravne? Mam zkusit poslat PR?

Blujacker
Člen | 89
+
0
-

@PavelJanda Ja prave koukam do tridy DataModel.php a nejprve se vola filter() na radce 107 a limit / sort se vola potom na radce 116, ne? Nebo uz mozna blbnu.

Editoval Blujacker (20. 5. 2016 12:00)

Pavel Janda
Člen | 977
+
0
-

@Blujacker Jasne, uz jsem v obraze s obojim. :D

Mas pravdu a mas pravdu. Muzes poslat PR na ty ikony? Opravim vecer tn ApiDataSource. Cachovat by se to melo, ale jinde.

FJP
Člen | 124
+
0
-

Nenapadá vás proč se mi ten grid špatně vykresluje? (viz můj poslední příspěvek) (button k akci ke spodnímu gridu se nezobrazuje ani ve verzi 4.1.1)

Editoval FJP (20. 5. 2016 16:21)

Pavel Janda
Člen | 977
+
0
-

@FJP Máš určopes aktuální assety (měnil jsem styly toho buttonu)?

FJP
Člen | 124
+
+1
-

Pavel Janda napsal(a):

@FJP Máš určopes aktuální assety (měnil jsem styly toho buttonu)?

Ha, už vím, kde je chyba:
group_action_submit – je stejný id u více prvků. Když v prvním gridu zakryju $grid->addGroupAction … tak to ve druhém normálně šlape.

Pavel Janda
Člen | 977
+
+1
-

@FJP v4.1.2

FJP
Člen | 124
+
+3
-

díky, chlape ;)

ještě se tam zobrazuje datagrid-per-page-submit se stylama jsem nic nedělal.

Donated za super práci a přístup ;)

kedarus
Člen | 3
+
0
-

Ahoj, jak hodně složité by bylo změnit v inline editaci input třeba na select?

Blujacker
Člen | 89
+
0
-

@PavelJanda PR je tam. Ted jeste koukam na ten ApiDataSource a zda se mi, ze getCount() [DataModel:114] se take vola pred getData() [DataModel:121/124]. Ja mam API navrzene tak, ze jednim volanim ziskam jak vysledek (filter, limit, sort) a zaroven i celkovy pocet vysledku (bez limit). Idealni by tedy bylo kdyby ApiDataSource vedel filter/limit/sort data pred volanim getData() / getCount() – aby se to vsechna data dala ziskat pouze jednim dotazem na API.

Da se tohoto vysledku dosahnout beze zmeny DataModel.php, pripadne jak na to?

Diky moc!

FJP
Člen | 124
+
0
-

Ještě když používám sortable a přetáhnu položku – vyskočí js alert „Internal Server Error“

Pavel Janda
Člen | 977
+
0
-

@FJP V té verzi 4.1.1 (tuším) vyšly i nové styly. Takže jestli jsi s nimi nic nedělal, tak to bude třeba update.

@kedarus Už je na to issue a momentálně je to v milestone 4.2. Jelikož už jsi druhý, kdo se na to ptá, zkusím to stihnout tento víkend.

@Blujacker Kde je ten PR? :-o Zapřemýšlím. Udělám si testovací api, které bude vypadat tak, jak říkáš a prozkoumám možnosti.

Blujacker
Člen | 89
+
+1
-

@PavelJanda Uz jsi ho mergnul :o

paveljanda Merge pull request #233 from jakubvojacek/patch-1
FJP
Člen | 124
+
0
-

Pavel Janda napsal(a):

@FJP V té verzi 4.1.1 (tuším) vyšly i nové styly. Takže jestli jsi s nimi nic nedělal, tak to bude třeba update.

Sorry moje chyba, nepustil jsem znova bower. Už je to ok. Ale ten server error v alertu je tam pořád při reorderingu.

FJP
Člen | 124
+
0
-

Stalo se vám, že na locale to běží a když to dáte web na hostingu (můj případ forpsi), nefungují hromadné akce?

Pavel Janda
Člen | 977
+
0
-

@FJP Nestalo. Hází ti něco nějakou chybu?

FJP
Člen | 124
+
0
-

Pavel Janda napsal(a):

@FJP Nestalo. Hází ti něco nějakou chybu?

Právě, že nic (v konzoli) – není tam vidět ani, že se něco děje ajaxově.

Nevíš co s tím server errorem v alertu u sortování?

CZechBoY
Člen | 3608
+
0
-

@FJP Hoď mu aspoň exception, server error nic neřekne.

EchoZulu
Člen | 4
+
0
-

Existuje možnost jak v detailu itemu zobrazit více formulářů, případně strom komponent s formuláři?

rumcais1
Člen | 80
+
0
-

Ahoj dá se do linku vložit nějaký vlastní argument něco jako $grid->addColumnLink(‚name‘, ‚Name‘, ‚edit‘, ‚name‘, [‚id‘, ‚surname‘ ⇒ ‚name‘,‚vlastni‘=>1]);

rumcais1
Člen | 80
+
0
-

Zkoušel jsem datagrid s dibi a mssql (sqlsrv driver) šlo by tam přidat do datamodelu instanci na sqlsrv driver (DibiFluentMssqlDataSource)? A nevím jestli nedošlo v novém dibi ke změně tříd. Mně to vypisuje s novým dibi instanceof \Dibi\Drivers\SqlsrvDriver. Diky

romiix.org
Člen | 343
+
0
-

Existuje zabudovaná podpora pre subgridy?

Pavel Janda
Člen | 977
+
0
-

@FJP Můžeš k tomu server erroru poslat nějakou hlášku?

Pavel Janda
Člen | 977
+
0
-

@EchoZulu Jelikož celý datagrid je jeden velký formulář, další formuláře v něm nejsou možné – specifikace html. Co bys tam chtěl přidat?

Pavel Janda
Člen | 977
+
0
-

@rumcais1 http://ublaboo.paveljanda.com/datagrid/column#… Hmmm, musíš to udělat asi přes ColumnText a odkaz v template neb custom renderer. Jeď je tím polem parametrů myšlena změna asociace klíč ⇒ hodnota dat položky.

Pavel Janda
Člen | 977
+
0
-

@romiix.org Že by byl další grid v <td></td>?

romiix.org
Člen | 343
+
0
-

@PavelJanda Nie v <td>, ale v detaile by sa zobrazil nový grid.
Konkrétne: V hlavnom gride si nastavím zoznam cenových hladín a v detaile sa mi zobrazí grid pre s pravidlami pre cenové hladiny. To je vlastne riešiteľné cez vnorenú komponentu už teraz.

Pavel Janda
Člen | 977
+
0
-

@romiix.org Zas to naráží na to, že by se objevil formulář ve formuláři. Asi bude lepší udělat si nějaký gridík, který nebude obsahovat formulář (nebude mít filtr, změnu počtu položek na stránku apod) a ten používat v detailu.

pitr82
Člen | 121
+
0
-

EchoZulu napsal(a):

Existuje možnost jak v detailu itemu zobrazit více formulářů, případně strom komponent s formuláři?

Nehodilo by se ti toto ?

Editoval pitr82 (26. 5. 2016 7:41)

romiix.org
Člen | 343
+
0
-

EchoZulu napsal(a):

Existuje možnost jak v detailu itemu zobrazit více formulářů, případně strom komponent s formuláři?

Používam na to toto.

Pavel Janda
Člen | 977
+
0
-

@pitr82 Můžeš pls fixnout ten link?

pitr82
Člen | 121
+
0
-

@PavelJanda jak nejlépe upravit setFilterDateRange, aby byl počeštěn ?

romiix.org
Člen | 343
+
0
-

Pavel Janda napsal(a):

@romiix.org Zas to naráží na to, že by se objevil formulář ve formuláři. Asi bude lepší udělat si nějaký gridík, který nebude obsahovat formulář (nebude mít filtr, změnu počtu položek na stránku apod) a ten používat v detailu.

Tieto problémy form in form by riešilo oddelenie formulárov do vlastných logických celkov.

  • filter
  • počet položiek
  • hromadné akcie
  • add/edit row

Problém nastáva pri checkboxoch pri hromadných akciách. Toto by bolo riešiteľné asi iba cez JS – checkboxy by boli v riadkoch mimo formulára, ale nastavovali by sa nimi hidden inputy v samostatnom formuláre hromadných akcií, ktoré by sa aj odosielali.

To, že detail by aktuálne nemal obsahovať formulár, je reálne dosť veľký problém.

@PavelJanda Čo myslíš?

Editoval romiix.org (25. 5. 2016 10:16)

Pavel Janda
Člen | 977
+
0
-

@romiix.org Přesně proto, že existují hromadné akce, to nelze vyřešit jednoduše. A nechci to nějak očůrávat přes JS.

Možná by šla vytvořit nějaká továrnička, která by naplňovala form v detailu. Ale jak definovat tlačítka, která znamenají submit formuláře v detailu? Jak to má datargid poznat?

_rasel^
Člen | 59
+
0
-

Ahojte, mám zopár otázok:

  1. Viete mi prosím poradiť prečo sa mi v datagride pri hromadných akciách nezobrazí možnosť pre vybranú akciu a tlačidlo pre vykonanie? Skúšal som aj na inom projekte/prehliadačoch, či niekde nerobím nejakú chybu, ale neviem kde by mohol byť pes zakopaný…
  2. Ak sa edituje viacero riadkov v inline móde (viacero je ich otvorených na úpravu), tak po kliknutí na „Save“ na prvom riadku sa riadky ukladajú vždy od posledného.
  3. Je možné $container->setDefaults naplniť foreachom?

addInlineEdit je jednoduchý:

$grid->addInlineEdit()->onControlAdd[] = function($container) {
    foreach ($this->stlpce as $stlpec) {
        $container->addText($stlpec->column_name, '');
    }
};

… ale vôbec netuším ako vložiť foreach do tohto, aby to fungovalo.

$grid->getInlineEdit()->onSetDefaults[] = function($container, $item) {
	$container->setDefaults([
		'id' => $item->id,
		'name' => $item->name,
		'inserted' => $item->inserted->format('j. n. Y'),
		'link' => $item->name,
	]);
};

Editoval _rasel^ (25. 5. 2016 15:48)

Pavel Janda
Člen | 977
+
0
-

@_rasel^
1, Protože máš něco blbě ve scriptech. Buď ti chybí netteForms.js, nebo to načítáš pozdě, nebo něco v tom smyslu. Koukni se do konzole, jak je červená..

2, Hodíš prosím issue na github?

3, Je. Použij v té anonymní funkci instanci datagridu a zeptej na se všechny sloupce: DataGrid::getColumns().

_rasel^
Člen | 59
+
0
-

@PavelJanda

  1. použil som jquery.nette.forms.js namiesto netteForms.js netušil som, že to nie je do isté, ďakujem :)
  2. hodím.
  3. skúsim sa s tým popasovať, nie som v tom až tak doma.
Pavel Janda
Člen | 977
+
+2
-

Nová verze – v4.2.0

Mart78
Člen | 31
+
0
-

Mohl by mi někdo prosím poradit jak předat datagridu pole? V metodě která zpracovává formulář vygeneruji pole které má kolem 100 řádků, to chci poté vypsat datagridem v jiném pohledu. Zkoušel jsem předávat pomocí session, jako persistentní parametr, jako privátní parametr presenteru, ale vždy funguje maximální prvotní zobrazení, při snaze o seřazení gridem to píše že je pole nulové nebo nedefinované. Ani u té session to nejde, což nechápu.

/** @var  Nette\Http\SessionSection */
private $seasonSection;

public function __construct(Nette\Http\Session $session)
{
    $this->seasonSection = $session->getSection('mySection');
}

	public function testFormSucceeded(Form $form, $values)
	{
		// vytvoreni pole

		$this->seasonSection->items = $items;
	    $this->setView('list');
	}

public function createComponentListGrid($name)
{
    $grid = new DataGrid($this, $name);
    $grid->setDataSource($this->seasonSection->items);
    $grid->setPagination(false);
    $grid->addColumnNumber('id', 'ID');
    $grid->addColumnText('name', 'Name');
}
Pavel Janda
Člen | 977
+
0
-

@Mart78 Nebylo by lepší použít alespoň třeba sqlite?

Mart78
Člen | 31
+
0
-

Asi máš pravdu, bude se s tím i lépe pracovat. Teď se omlouvám za OT, ale vzal jsem sqlite databázi a model z CD-collection příkladu a zkusil vypsat datagridem, a hlásí to nepochopitelnou chybu že tabulka „albums“ neexistuje, zajímavý že v příkladu to funguje.