TwiGrid – omlouvám se :-(

uestla
Backer | 799
+
+1
-

Moc se omlouvám za nový datagrid, vážně.

Jmenuje se TwiGrid a je ještě mladý a v rozpuku. Je
to spíše takový experiment s klony.

Zprvu bych chtěl podotknout, že jsem masivně vycházel
z hrachova gridu https://github.com/…ras/datagrid,
přičemž jsem některé věci řešil tak trochu jinak (ale zase ne moc).

Myšlenka nestránkování coby UI antipatternu se mi
moc líbí, chyběly mi ale hromadné akce a jiné (zbytek
níže). Stejně jsem přistupoval také k řešení filtrování
coby sestavení vlastního form. kontajnéru.

Kromě již zmíněných group akcích by můj datagrid měl
mj. podporovat i vícesloupcové primární klíče (když
už je nově umí i NDb).

Nerad u gridů vkládám hodně závislých věcí (js a css)
a dlouho studuji, jak co nastavit, aby to fungovalo – tento
jsem postavil na twitter boostrapu (odtud název TwiGrid),
a základních js knihovnách (jQuery, nette.forms, nette.ajax).

Co se puntičkářství týče, tak se u mě chronicky projevuje
spíše jen v kódu a chování aplikace, čili si hodně zakládám
na 3stavovém sortu – nesnáším, když dám řadit podle urč.
sloupce vzestupně, opětovným kliknutím sestupně, a dalšími
kliky už nemám možnost řazení rušit. Dále jsem si dal záležet
na HTML výstupu – což uznávám, že u gridu není zrovna důležité,
ale minimálně mě to potěší.

Co bych rád v nejbližší době dozapracoval je inline editace,
řešení překladů a řádkové akce.

Závěrem se ještě jednou omlouvám všem – i kdyby měly
být zdrojáky jen inspirací v přístupu k řešení některých
věcí, budu rád. Díky za pozornost a dobrou.


Editoval uestla (29. 5. 2018 14:14)

uestla
Backer | 799
+
0
-

Můj experiment pokračuje. Před chvilkou jsem
doimplementoval řádkové úpravy. Mimochodem nevím,
jestli si toho někdo všiml, ale většina ostatních
datagridů, které podporují řádkové akce, jaksi
pozapomněla na CSRF – já ne, CSRF ochranu jsem
poctivě na odkazy namontoval (v tomto patří čest
snad jen poctivému Griditu).

Jak jsem už v úvodním příspěvku předeslal, měl
by můj datagrid podporovat vícesloupcové primární
klíče. On celkově je hodně spjat s primárními
klíči – parametr callbacku pro hromadnou akci
je pole právě primárních klíčů, stejně tak parametr
callbacku pro akci řádkovou (tedy nikoli řádek
tabulky / entita).

Editoval uestla (3. 1. 2013 22:51)

LeonardoCA
Člen | 296
+
0
-

+1 vícesloupcové primární klíče – taky jsem si všiml, že je skoro nikdo nepodporuje a zrovna dneska jsem dělal ještě trochu obecnější podporu

+1 CSRF – budu se inspirovat

hrach
Člen | 1838
+
0
-

voe :D jestli obslehnes moji fintu na inline-editace tak te dojedu uskrtit :D jinak pekne :)
edit: kdybys byl co k cemu, tak radej mne doprogramuj podporu vice klicu :D

edit 2: asi zpychnu :D :D

t's based on another (and great) datagrid written by @hrach – https://github.com/…ras/datagrid. My datagrid is hugely inspired by this component and its programming ideas and therefore I would like to give this man a maximum credit and respect :-)

edit 3: btw, ja se asi chystam dodelat strankovani pro ty lamy, ktery by se bez nej neobesly :D

Editoval hrach (3. 1. 2013 1:43)

uestla
Backer | 799
+
0
-

Jelikož jsem férovej kluk, přidal jsem do
dema ukázku použití dibi (vedle Nette\Database),
ale hlavně ještě přidal zobrazovátko pokládaných
SQL příkazů, abyste se mohli podívat na náročnost
na databázi co do počtu dotazů. Tedy – zobrazují se
jen při zapnutém javascriptu, ale čert to vem.

Může se zdát přinejmenším pozoruhodné, že se při
filtrování či hromadné akci položí ne jeden, ale dva
dotazy (u obou data sourců). Inu to je daň za nepřesměrování,
kdy první dotaz se pokládá z důvodu vytvoření konzistentního
formuláře, a až poté, kdy se zpracuje coby odeslaný,
se položí nový, filtrující dotaz. Je třeba si to
přiznat na rovinu.

Co se dibi ukázky týče, tak je pěkně vidět, že jak
šablony, tak definici, tak všechno ostatní, je oběma
ukázkám společné (Nette\Database a dibi) – jediné,
co se liší, je loader dat. To ale zase abych byl fér
je v podstatě i u ostatních datagridů, to se musí nechat…

Editoval uestla (10. 2. 2013 20:49)

snake.aas
Člen | 25
+
0
-

Hezké, akorát v demu DIBI nefunguje filtrace podle příjmení a jména

David Ďurika
Člen | 328
+
0
-

dobra praca, co takto sa spojit s hrachom ? pride mi ze chcete viac-menej rovnaku vec…

enumag
Člen | 2118
+
0
-

@uestla, @hrach: Dotaz na vás dva. :-) Když nepoužíváte stránkování, jak řešíte výpis tabulek s mnoha a mnoha záznamy z nichž je ve většině případů potřeba pouze několik prvních? Tahat celou tabulku je blbost, protože by to trvalo moc dlouho. Dotahujete záznamy nějak ajaxem? (Zdrojáky jsem nestudoval.)

David Ďurika
Člen | 328
+
0
-

nie, vypise sa len prvych X zaznamov a ak ti nevihovuju (alebo si hladal nieco ine) tak zacnes filtrovat az kym to nenajdes…

enumag
Člen | 2118
+
0
-

Aha… v tom případě zůstanu u stránkování. :-D Díky.

uestla
Backer | 799
+
0
-

@snake.aas: Děkuji za upozornění, bylo to neimplementovaným
escape handlerem pro LIKE v PDO driveru (který musím v demu
používat kvůli absenci sqlite3 PHP extenze na hostingu), tak
jsem to vyřešil rukama.

@enumag: Moc jsem to asi nepochopil – sám jsi uvedl,
že chces ve většině případů vypsat prvních několik záznamů.
Cokoli dalšího už souvisí s hledáním/filtrováním, ale
jeví se mi to čistě jako otázka přístupu k věci.

enumag
Člen | 2118
+
0
-

@uestla: Souhlasím s tím že ve většině případů hledání a filtrování stačí, přesto mám ale pocit že stránkování někdy může být pro uživatele pohodlnější. Třeba časem změním názor. ;-)

David Ďurika
Člen | 328
+
0
-

@uestla

dobra praca, co takto sa spojit s hrachom ? pride mi ze chcete viac-menej rovnaku vec…

uestla
Backer | 799
+
0
-

@enumag: Naopak zastávám názor, že ve většině
případů je hledání stokrát přívětivější než klikání
na číselné odkazy a hledání očima a říkání si:
„Šmankote, je to na té druhé, nebo až na té třetí
stránce?“.

@achtan: Rád bych tomu, nevěřím ale, že je to
v našich silách.

David Ďurika
Člen | 328
+
0
-

@uestla kde je vôla tam je aj cesta :)
@hrach co ty na to?

bolo by to super keby ste to spojili aby sme sa nemuseli rozhodovat ze kt. pouzijeme… kedze budu dost podobne a rozdieli budu asi len v „drobnostiach“

Milo
Nette Core | 1283
+
0
-

Stránkování taky nemám rád a už jsem po Hrachovo gridu pokukoval. Ale co počet řádků? Od gridu často vyžaduju export do PDF (nebo XLS) a někdy, aby byl export úplný, je jak naschvál potřeba zobrazit 51 řádků a ne 50.

Dá se to s tímhle gridem?

enumag
Člen | 2118
+
0
-

@uestla: Samozřejmě souhlasím, nechci uživateli nabídnout jen stránkování. Chci aby měl k dispozici různé nástroje (včetně třeba hledání) s tím že by měl mít možnost měnit i #prvků/stránka.

David Ďurika
Člen | 328
+
0
-

Milo napsal(a):

Stránkování taky nemám rád a už jsem po Hrachovo gridu pokukoval. Ale co počet řádků? Od gridu často vyžaduju export do PDF (nebo XLS) a někdy, aby byl export úplný, je jak naschvál potřeba zobrazit 51 řádků a ne 50.

Dá se to s tímhle gridem?

nechapem co ma strankovanie v gride spolocne s exportom… pri ecporte ti grid doda dataSource a ty si s tym v exporte urobis co potrebujes…

Milo
Nette Core | 1283
+
0
-

achtan napsal(a):
nechapem co ma strankovanie v gride spolocne s exportom… pri ecporte ti grid doda dataSource a ty si s tym v exporte urobis co potrebujes…

Stránkování nic, píšu o počtu řádků. Dejme tomu, že chci do XLS dostat výpis všech faktur od 3/2012 do 6/2012. Podle toho si nastavím filtr. Když bude ale počet řádků větší než maximum co grid zobrazí, nedostanou se mi do exportu všechny.

Grid by měl minimálně signalizovat, že existuje víc řádků vyhovující danému filtru. Ještě lépe by měl vypsat jejich počet a ideálně dát možnost k tomu zobrazit je.

David Ďurika
Člen | 328
+
0
-

Milo napsal(a):

Stránkování nic, píšu o počtu řádků. Dejme tomu, že chci do XLS dostat výpis všech faktur od 3/2012 do 6/2012. Podle toho si nastavím filtr. Když bude ale počet řádků větší než maximum co grid zobrazí, nedostanou se mi do exportu všechny.

ale ano dostanu! ako som pisal s gridu dostanes len datasource (bez limitu)

Grid by měl minimálně signalizovat, že existuje víc řádků vyhovující danému filtru. Ještě lépe by měl vypsat jejich počet a ideálně dát možnost k tomu zobrazit je.

hej to co pises je pravda… to by tam malo by dajako zvyraznene… ale to je potom uz iba krocik od toho aby tam pribudlo strankovanie… ze ano

Milo
Nette Core | 1283
+
0
-

achtan napsal(a):
ale ano dostanu! ako som pisal s gridu dostanes len datasource (bez limitu)

Pak to ale budou jiná data. Čekal bych, že v exportu bude to, co vidím na webu.

hej to co pises je pravda… to by tam malo by dajako zvyraznene… ale to je potom uz iba krocik od toho aby tam pribudlo strankovanie… ze ano

Tady nejde o stránkování, ale o indikaci, že to co vidím není vše, a o způsobu jak se k tomu dostat. Cool by bylo, kdyby při rolování dolů data přibývala (ala FB timeline).

Grid, který se řídí pravidlem „chceš míň řádků ⇒ filtruj detailněji“ nenajde uplatnění tam, kde je potřeba se dostat ke všem výsledkům.

Každopádně tento i hrachův grid jsou pěkný, nechci je nijak hanit. Jen se ptám, jestli je do nich snadné dopasovat to, co poptávám.

hrach
Člen | 1838
+
0
-

Muj grid neimplementuje Paginator a ani nebude, nicmene, jak obecne ke vsemu, uz ted dava prosto ho samozrejme pouzivat a hodlam to jeste vylepsit. + to bude v demu.

uestla
Backer | 799
+
0
-

Rád bych uvedl na pravou míru diskutovaný
export, stránkování, apod., abychom se tu
nějak moc nepoprali – současný stav je takový
(a v čem je tento přístup odlišný oproti
ostatním gridům), že nic jako DataSource
v tom původním slova smyslu neexistuje. Existuje
metoda vracející data na základě předaných
parametrů (řazení a filtry), a to hned v okamžiku
zavolání – tedy žádné dodatečné zlimitnění, apod.
V současné chvíli je limit natvrdo zadrátován,
čímž při výše zmíněném požadovaném exportu
celého výsledku samozřejmě narazíme. Otázkou je,
jak rozumně tohle vyřešit…

Osobně bych se inspiroval např. u Admineru,
kde se po twitterovsku (nevím, kdo s tím přišel
jako první – autorovi se omlouvám) přisouvají
další a další záznamy podobně jako v timelině twitteru
(tedy nechtěl bych to dát na scrollování, ale na
tlačítko). Další možnost by byla rozšířit hromadné
akce, ale to už by chtělo fištróna a toho nemám.

Editoval uestla (5. 1. 2013 0:12)

uestla
Backer | 799
+
0
-

Přiznejme si, že demo bylo takové nijaké,
výpis dat z jedné tabulky spojený s nějakým
tím formátováním (aby se neřeklo), to už
dnes nikoho neoslní. Přidal jsem tedy trochu
režie, jméno a příjmení uživatelů jsem spojil
dohromady, přidal jsem údaj o státě z boční tabulky.

Také je nyní možné při změně filtrů a řazení
se ve stejném stavu přepnout do jiného datasourcu
při zachování kritérií a prohlédnout si, jak
se změní (popravdě se moc nemění) pokládané
dotazy.

Editoval uestla (10. 2. 2013 20:50)

David Ďurika
Člen | 328
+
0
-

uestla napsal(a):
Otázkou je,
jak rozumně tohle vyřešit…

Osobně bych se inspiroval např. u Admineru,
kde se po twitterovsku (nevím, kdo s tím přišel
jako první – autorovi se omlouvám) přisouvají
další a další záznamy podobně jako v timelině twitteru
(tedy nechtěl bych to dát na scrollování, ale na
tlačítko). Další možnost by byla rozšířit hromadné
akce, ale to už by chtělo fištróna a toho nemám.

co takto dat na spodok (alebo niekam kde sa to bude hodit) tabulky selectBox s moznostami:

  • zobrazit 20 zaznamov
  • zobrazit 50 zaznamov
  • zobrazit 100 zaznamov
  • zobrazit vsetky zaznami

nieco v tom zmysle…

uestla
Backer | 799
+
0
-

Po delší odmlce se opět hlásím – přidendal
jsem podporu pro překlady (což ovšem nese pouze
navěšení translatoru na formulář a do šablony,
čili žádný světoborný počin).

Dále jsem se pokusil implementovat timeline
chování, což prosím berte zatím jako experimentální,
chová se to teď tak nějak divně, nicméně vyzkoušet
si to můžete. V zápatí datagridové tabulky přibyla
3 tlačítka pro přisunutí dalších záznamů, zobrazení
všech, a anulování čítače.

Hlavní nevýhody, se kterými jaksi nejsem moc spokojen,
jsou neustálé zvyšování čítače „stránek“ při dalším
a dalším klikání na šipečku „načíst další“ i po načtení
již všech záznamů, a další – což možná nemusí až
tak vadit – jsem po změně filtrů automaticky anuloval čítač.

Jako poznámku si dovolím uvést, že jelikož má
demo databáze několik tisíc záznamů, nastavil jsem
pro prezentační účely limit i pro zobrazení všech
záznamů, proto se tomu prosím nedivte.

@Milo: Teď už mohu odpovědět na tvoji otázku.
V tuto chvíli je možné zobrazit všechny záznamy
odpovídající filtru. Pak už můžeš všechny záznamy
označit (klikem do prvního řádku záhlaví nebo přímo
na hromadný checkbox) a vše exportovat (coby
vlastní hromadnou akci). Přisouvání dalších a dalších
záznamů (resp. počet nově přisunutých) je plně
v tvojí režii.

Editoval uestla (10. 2. 2013 20:51)

uestla
Backer | 799
+
0
-

Snad vás z mých sloupků nebolí hlava, ale:
Přidal jsem filtr pro datum narození tvořený
dvěma inputy – čímž jsem chtěl demonstrovat
hrachovu super myšlenku nezávislosti filtrů
na sloupcích gridu. Přidám sice sloupec,
ale filtrovací form container přijme dva inputy
(což pochopitelně v šabloně přizpůsobím).
Co se datagridu týče, ten jsem obohatil o možnost
nastavení defaultního filtru (využito právě
u datumu narození).

Co se počtu dotazů týče, pokládá se jich malinko
víc – nikoli však z důvodu neefektivnosti,
ale např. jeden dotaz padne na zjištění všech
využitých zemí (pro selectbox filtr. formu),
jeden zase pro zjištění min. a max. data narození
coby výchozího filtru. Čili ne všechny
zobrazované dotazy přímo souvisejí s načítáním
dat, berte to prosím na vědomí.

Jen bych ještě co se jiného přístupu týče
doplnil, že (výše už jsem to zmínil) při
načítání dat jsou dopředu známy všechny
informace ohledně řazení, filtrů a nyní nově
i čítač stránky, čili je možné data načíst
naráz. Co je ale nevýhoda je, že kvůli tomu
nezjistím, zda jsem už na poslední stránce,
resp. kolik stránek ještě zbývá. Z toho důvodu
pokud postupným přisouváním dalších a dalších
záznamů dorazím na poslední stránku, tlačítko
nezmizí a bude pořád zvyšovat čítač, až přeteče
integer a to zapříčiní zobrazení všech záznamů
(alespoň tedy v demu – chování si může určit
každý svoje).

Editoval uestla (10. 2. 2013 20:52)

uestla
Backer | 799
+
0
-

Svůj monolog ještě rozšířím – po několika
všemožných fixech jsem přidal možnost (nikoli
povinnost) nastavit počet všech záznamů (před
závěrečným zlimitněním), čímž je pak možno
v timelině detekovat přisunutí posledních
záznamů. Pokud celkový počet nenastavíme,
bude se grid chovat stejně jako je popsáno výše.

LeonardoCA
Člen | 296
+
0
-

uestla napsal(a):
Z toho důvodu
pokud postupným přisouváním dalších a dalších
záznamů dorazím na poslední stránku, tlačítko
nezmizí a bude pořád zvyšovat čítač, až přeteče
integer a to zapříčiní zobrazení všech záznamů

K zobrazen( všech záznanamů? Jinak řečemp to způsobí při dostatečném počtu záznamů pád serveru nebo uživatelova prohlížeče, podle toho kdo vydrží víc… (A k tomu jednou pokud bude knihovna používaná určitě dojde)- Chtělo by to i limit pro maximální počet záznamů když už.

uestla
Backer | 799
+
0
-

@LeonardoCA: Což je v podstatě to, co je
právě z důvodů, které zde popisuješ, použito
demu. Je to již na každého zodpovědnosti,
nicméně zvážím, jestli tam to tlačítko vůbec
nechávat, resp. zda možnost stránky pro bezlimit
nezrušit…

pepakriz
Člen | 246
+
0
-

Pokud jsem něco nepřehlédl, tak při načítání dalších záznamů se posílá ajaxem celý grid znovu. To by šlo vyřešit lépe. Viz https://github.com/…ette.ajax.js#….

uestla
Backer | 799
+
0
-

Mám to v poznámkách, až doladím ostatní
(ne)funkčnost, pustím se do toho. Díky!

uestla
Backer | 799
+
0
-

Od timeline jsem nakonec upustil, bylo s ní
více starostí, než užitku. Od minule se toho
navenek moc nezměnilo, ale vězte, že co šlo,
to se nyní inicializuje či zjišťuje líně,
ať už počet dat, nebo sestavení formuláře.

Nechť vám slouží…

uestla
Backer | 799
+
0
-

Po delší odmlce hlásím změny – jelikož je grid jeden
velký formulář, bylo nutné vyřešit validaci pouze dílčích
containerů, a to se mi podařilo, jak na serveru, tak
na klientovi.

Další maličkosti nebudu zmiňovat, co se dema týče, nechal
jsem tam pouze Nette\Database. Enjoy.

uestla
Backer | 799
+
0
-

Přepsal jsem examples.

uestla
Backer | 799
+
0
-

Po několika větších BC breacích a zásadnějších úpravách jsem vydal verzi 0.9.3.

Reloecc
Člen | 15
+
0
-

Ahoj, jak nejsnadněji TwiGrid naučit filtraci/sortování podle sloupců, která mají jiná jména, než jména sloupců v databázi?

Příkladem: více tabulek v jednom gridu (user.name, book.name), nebo jeden sloupec zobrazený vícekrát (name1, name2, name3)

Přehlížím nějakou snadnou cestu, nebo je nutné editovat střeva TwiGridu?
Díky..

uestla
Backer | 799
+
0
-

Jelikož do databáze (nebo jinam) sahá náš dataLoader callback, je na nás, na jaké sloupce či co nakonec bude sahat.

Čili sloupce si pojmenuju podle svého a v loaderu správně namapuji:

$grid->addColumn('user_name')->setSortable();
$grid->addColumn('book_name')->setSortable();

$grid->setDataLoader(function ($grid, $columns, $filters, $order) {

	// ...

	foreach ($order as $column => $desc) {
		switch ($column) {
			case 'user_name':
				$column = 'user.name';
				break;

			case 'book_name':
				$column = 'book.name';
				break;
		}

		$db->order($column . ($desc ? ' DESC' : ''));
	}

	// ...

});

Stejně při filtrování…

uestla
Backer | 799
+
0
-

Před 48 sekundami jsem přidal možnost řazení podle více sloupců – stačí při klikání na záhlaví držet Ctrl.

Enjoy

Re4DeR
Člen | 71
+
0
-

nějak mi to nefunguje ma macu (chrome)

uestla
Backer | 799
+
0
-

Díky za report. Mohl bys to prosím zkusit znovu?

o5
Člen | 416
+
0
-

uestla napsal(a):

Díky za report. Mohl bys to prosím zkusit znovu?

Jiz funguje :) BTW: Pekne sis s multisortem vyhral.

Re4DeR
Člen | 71
+
0
-

jj jiz funguje a fakt hezke :)

sikovne by bylo kdyby slo ulozit zeditovany radek ctrl+enter ( jako to ma treba adminer).

Editoval Re4DeR (9. 6. 2013 1:09)

uestla
Backer | 799
+
0
-

Na uložení inline editovaného řádku by měl postačit samotný Enter

Re4DeR
Člen | 71
+
0
-

ty jo :(. to se moc omlouvám. nejak me to nenapadlo .
moc hezke!

Semik
Backer | 135
+
0
-

Bylo by možné podle více sloupců řadit standardně i bez Ctrl ?

uestla napsal(a):

Před 48 sekundami jsem přidal možnost řazení podle více sloupců – stačí při klikání na záhlaví držet Ctrl.

Enjoy

uestla
Backer | 799
+
0
-

To se obávám, že by nebylo moc šťastné – těžko by se pak resetovalo řazení…

Semik
Backer | 135
+
0
-

Rozumím. Jsem však v situaci kdy nepoužívám AJAX a Ctrl tak otevírá odkaz na nový panel.

uestla napsal(a):

To se obávám, že by nebylo moc šťastné – těžko by se pak resetovalo řazení…

uestla
Backer | 799
+
0
-

Je to pravda, nakonec jsem vyměnil držení Ctrl za samostatný odkaz (+).

Semik
Backer | 135
+
0
-

To je vončo milá Tončo :-) Služebníček :-)

uestla napsal(a):

Je to pravda, nakonec jsem vyměnil držení Ctrl za samostatný odkaz (+).