Ahoj,
prvně bych chtěl říct, že tento grid je přímo excelentní :o)
a dále mám menší dotaz:
Mám problém s překladem confirmů u akcí (používám
Kdyby\Translation).
ve slovníku mám
...
confirm:
delete:'Opravdu chcete odstranit roli %name%?'
Ale nevím jak tam poslat ten parametr %name%.
Klasicky přes ->setConfirm('confirm.delete', 'name'); se tam
parametr nedostane. V případě callbacku si můžu zprávu přeložit sám ve
funkci, ale jelikož má grid nastavený translator, tak se pořád snaží
i ten výsledný confirm přeložit sám.
@DavidGrudlDataGrid::setFilter() je násilné nastavení
filtru. Tedy i pokud uživatel změní hodnoty filtru a později přijde na
stejný grid, bude ten filtr nastavený tak, jak chce metoda
setFiter() přesto, že je třeba uloženo něco jiného
v session.
Něco jako DataGrid::setDefaultFilter() by pak nemělo
přepisovat případná data v session. Rozepíšu to potom v dokumentaci, ať
je to jasné.
@TomasG To je bug. Do překladače by se samozřejmě měl hnát jen
ten string s dynamickým placeholderem. Je to fixnuté, zatím v masteru.
Pokud je v confirmation dialogu nastaven callback, měl by vracet již
přeložený string.
když vypnu stránkování $grid->setPagination(FALSE), asi
by se nemusel zobrazovat spodní panel row-grid-bottom, kde
vlastně nic není (a možná by mohl být renderován jako řádek tabulky, aby
byl stejně široký, když tabulka nemá width: 100%)
u aktivování $('.datagrid [data-sortable]') by bylo fajn
přidat option axis: 'y' a taktéž ikonu změnit z
fa-arrows na fa-arrows-v
if (typeof $('.datagrid [data-sortable]').sortable === 'undefined') {
dělá zbytečný dotaz nad DOM, stačí
if (typeof $.fn.sortable === 'undefined') {
ačkoliv dokumentace trošku (a asi nechtě) naznačuje opak, tak
datagrid.js musí být natažen až na konci stránky. Nestálo by
za to ty inicializace nad DOM přesunout do
$(function() { … })?
@DavidGrudl Stránkování: Je tam ještě třeba někde zobrazit
button, který umožní resetování filtru. Přidám do šablony podmínku
(nepoužívám filtry && nepoužívám stránkování ⇒ skryj
patičku).
Zapřemýšlím nad tím řádkem tabulky. Dřív tam byl nějaký problém
ohledně snippetů, ale už to myslím není aktuální.
Díky za poznámky. Do masteru jsem dal pozměněné assety.
@sepo Dobrý nápad. Zatím v masteru, bude v příští verzi. Api:
$grid->addInlineAdd()->setPositionTop();, opětovaného
nastavení renderování dole je docíleno toutéž metodou, akorát
s argumentem FALSE.
Ahoj, prvně bych chtěl poděkovat za parádní DataGrid, je opravdu super.
Chtěl bych se ale zeptat, jakým způsobem zpracováváte chyby vzniklé při
inline editaci/přidávání nové položky přes DataGrid?
Když datagrid umožňuje přidávání/editaci přímo v tabulce, a
vypisovaných dat je málo(cca 3 sloupečky), tak mi přišlo zbytečné
přidávat další stránku jen pro přidávání/editaci záznamů dané
entity.
Jak ale řešíte situaci, kdy na jednom sloupci je nastaven například
unique key, nebo hodnota v jednom sloupci nesmí být větší než hodnota
v druhém sloupci apod.?
Normálně mi z aplikace přijde například vyjímka, kterou bych zpracoval
a vyhodil flash message. Jak ale takovou chybu zobrazit? Zobrazit flash message
nad datagridem? Když bude počet položek na jedné stránce větší, tak
flash message nad datagridem a položka někde dole nebude moc user
friendly.
Zkoušel jsem i hodit formulář do detailu položky, což se mi povedlo,
ale nepřišel jsem už na to, jak tam dostat defaultní hodnoty zobrazované
entity, pokud by to ale šlo, jak bych tam mohl zobrazit tu chybovou
zprávu?
Nebo se na to dívám úplně špatně a měl bych v inline editaci povolit
pouze změnu hodnot, u kterých k takové chybě nedojde?
@darkweaver Nad složitějšími chybovými hláškami jsem zatím
nepřemýšlel. Používají se ale nette forms, takže validační pravidla by
se měla aplikovat již v JS. Ale za jakýkoliv další nápad budu rád.
Na druhou stranu, vyrábění nějaké větší entity přes inline
přidávání záznamů v datagridu mi přijde trochu hardcore.. Ale jak
říkám, nebráním se dalším nápadům, jak takové počiny
zpříjemnit.
Inline přidávání záznamů je momentálně jediná věc, která se
netahá pomocí snippetu. Kdyby se tahala, tak by tam asi šly dostat normální
formulářové ajaxové validace. Zatím jsem nepřišel na způsob, jak toho
docílit v té tabulce. Možná na to ještě přijdu.
Ještě k těm přesouvacím ikonkám – viděl jsem, že teď se ikonka
při přesouvání změní z 🕂 na ↕ což mi ale úplně nedává smysl,
respektive nerozumím, proč mít vůbec pro přesun nahoru/dolů ikonku 🕂
znamenající přesun ve všech směrech?
Určitý problém z hlediska UI je také zobrazení této ikonky v podobě
buttonu, protože to tlačítko není, je to prostě táhlo, viz třeba
použití na https://jqueryui.com/sortable/. Chápu, že důvodem asi je
snaha o jednotný vzhled ikon v sloupci Action, ale toho bych se vůbec
nebál, odstranění tlačítka (obrázek vlevo) na vzhledu neubírá a na
srozumitelnosti určitě přidá (fa fa-arrows-v fa-lg):
@DavidGrudl 2, Souhlasím, že se to nechová jako klasické
tlačítko. Na druhou stranu, značí to nějakou akci – když kliknu
(podržím), něco se stane. Pouze ikonka tak, jak je na screenshotu nalevo, se
mi nezdá tak proaktivní jako napravo.
1, Taky bych s tím souhlasil. Ale obyčejní lidé jsou spíš zvyklí na
symbol té čtyřšipičky, alespoň na mě působí spíš jednoduchým dojmem
„přesunou“, než „Vzít, táhnout – proč to nejde od všech
stran??“..
Udělám s pár lidmi nějaký jednoduchý testing, abych získal náhled ze
strany bfu.
Ještě k těm přesouvacím ikonkám – viděl jsem, že teď se ikonka
při přesouvání změní z 🕂 na ↕ což mi ale úplně nedává smysl,
respektive nerozumím, proč mít vůbec pro přesun nahoru/dolů ikonku 🕂
znamenající přesun ve všech směrech?
Určitý problém z hlediska UI je také zobrazení této ikonky v podobě
buttonu, protože to tlačítko není, je to prostě táhlo, viz třeba
použití na https://jqueryui.com/sortable/. Chápu, že důvodem asi je
snaha o jednotný vzhled ikon v sloupci Action, ale toho bych se vůbec
nebál, odstranění tlačítka (obrázek vlevo) na vzhledu neubírá a na
srozumitelnosti určitě přidá (fa fa-arrows-v fa-lg):
Pavel Janda napsal(a): @DavidGrudl 2, Souhlasím, že se to nechová jako klasické tlačítko.
Na druhou stranu, značí to nějakou akci – když kliknu (podržím), něco
se stane. Pouze ikonka tak, jak je na screenshotu nalevo, se mi nezdá tak
proaktivní jako napravo.
1, Taky bych s tím souhlasil. Ale obyčejní lidé jsou spíš zvyklí na
symbol té čtyřšipičky, alespoň na mě působí spíš jednoduchým dojmem
„přesunou“, než „Vzít, táhnout – proč to nejde od všech
stran??“..
Udělám s pár lidmi nějaký jednoduchý testing, abych získal náhled ze
strany bfu.
Dík za postřehy
Souhlasím s @DavidGrudl. Varianta v levo (táhlo) je více
uživatelsky přívětivá a určitě bych to tak rád viděl. Není tlačítko
jako tlačítko
Zrovna teď jsem to řešil a výsledkem je levé řešení. Ale dát ikonu
dvojšipky na tlačítko by taky šlo. Čtyřšipka mě ani nenapadla a přijde
mi méně jasná.
@tatyalien K tomu bitbucketu: Úplně nevím, co všechno máš
v plánu s tou třídou ExampleFilter, ale v podstatě může
tvoje Repository rovnou implementovat
Ublaboo\DataGrid\DataSource\IDataSource: http://pastebin.com/LLcZ8uDe
Zdravím děkuji za skvělý Datagrid, opravdu vymakaný :-).
Potřeboval jsem do horní části grida vedle ikonek „Nový záznam“ a
„Skrýt sloupce“ přidat ještě jednu mnou definovanou (nějaký odkaz).
Rozšířil jsme si třídu \Ublaboo\DataGrid\DataGrid a přidal metodu
<?phpclassGridextends\Ublaboo\DataGrid\DataGrid{protected$settingButtons;publicfunction__construct($parent,$name){parent::__construct($parent,$name);}/**
* muzes pridat element a zobrazi se v horni casti grida
* @param \Nette\Utils\Html $el
*/publicfunctionaddSettingButtons(\Nette\Utils\Html$el=null){if($el){$this->settingButtons[]=$el;}return$this;}publicfunctionrender(){$this->template->settingButtons=$this->settingButtons;parent::render();}}?>
a v šabloně upravit podmínky nad vykreslením $inlineAdd
přidal toto:
@PavelJanda
Ahoj, díky za nástřel, koukal jsem na to a zkusil to implementovat, ale
dostávám Fatal error: datagrid/src/DataSource/ArrayDataSource.php:221 přitom
ale mám nastavený dataSource na tu repository. Akutalizoval jsem bitbucket, konkrétně:
@tatyalien Co se ti hází za chybu? Kdyžtak mi všechno piš prosím
na gitter. Btw, pokud chceš používat jako datasource tu repositoru, tak
nepiš
$grid->setDataSource($this->exampleRepository->getData());,
ale $grid->setDataSource($this->exampleRepository);.
@tatyalien Co se ti hází za chybu? Kdyžtak mi všechno piš prosím
na gitter. Btw, pokud chceš používat jako datasource tu repositoru, tak
nepiš
$grid->setDataSource($this->exampleRepository->getData());,
ale $grid->setDataSource($this->exampleRepository);.
Ahoj,
napsal jsem ti email, gitter neznám :) tak ať to tu nespamuji.
@PavelJanda Vybral si nejaký multiselect? Kedy ho máš cca na pláne
implementovať? Potrebujem ho a ak by som sa k nemu dostal skôr ako ty, tak
nech pošlem rovno PR s doplnkom ktorý chceš aj ty.
Vďaka!
Je možné použiť vlastné zoradenie riadkov, ktoré neexistujú v DB?
Konkrétne: Ceny produktov sú dynamické a počítajú sa na základe
mnohých parametrov. Nie je problém ich vypísať cez
setRenderer(), ale neviem ich zoradiť podla dodatočne
vypočítanej hodnoty. ->setSortableCallback() mi nefunguje, resp. neviem ako metódu
použiť.
Vydal jsem novou verzi, kvůli změně latte šablony považuji novou verzi
za možný bc break, více v posledním bodu seznamu níže.
Šablony filtrů lze kromě bloků pojmenovaných podle jména filtru
definovat též typem filtrů, tím se aplikuje na všechny filtry stejného
typu ({block filtertype-select}{/block}), docu zde: http://ublaboo.paveljanda.com/datagrid/filter#…
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.
je možné po kliku na tlačítko „save“ překreslit celý dataGrid a
né jenom konkrétní řádek? Zkoušel jsem obalit dataGrid do snippetu a
zavolat $this->redrawControl(), ale poté se zobrazí pouze editovaný
záznam.
do formuláře inline editace bych potřeboval dostat něco jako
$form->addError(‚xx‘). V podstatě zabránit uložení a zobrazit
chybovou hlášku. Je to možné?
rád bych se zeptal zda někdo nemáte slušně udělaný handle na sort
(ukládání seřazených prvků). Trochu s tím zápasim, jakš takš mi to
funguje, ale má to asi 45 řádků a vůbec se mi to nelíbí. Proto se
obracím na ty zkušenější, zda by někdo nenabídl svůj snippet.
@Ripper akurat sme to tiez riesili, najednoduchsie co ma napadlo:
publicfunctionhandleSort($item_id,$prev_id,$next_id){$prevRow=$this->database->table("tabulka")->where("id",$prev_id)->fetch();$newOrderId=$prevRow?$prevRow->position+1:1;$this->database->query("UPDATE tabulka SET position = position + 1 WHERE position >= ?",$newOrderId);$this->database->query("UPDATE tabulka SET position = ? WHERE id = ?",$newOrderId,$item_id);}
Mám dotaz,
pokud používam změnu stavu pro řádek (status), již se mi nezmění css
třída, která v mém případě obarvuje řádek.
Zavolá se onChange[], kde se provede redraw řádku provede se změna stavu, a
pak se vola setRowCallback() kde se změní class prvku na základě stavu, ale
už se neaplikuje redraw řádku.
Jak docílit, aby se změnila i class prvku ?
@pitr82 Hmm, to je trošku trouble. Bohužel, momentálně je v kódu
<tr n:snippet="item-...">, takže se překresluje pouze obsah
elementu <tr>. A obalit <tr> snippetem
nelze, protože samotný snippet vytvoří div a <tbody>
nesmí obsahovat přímo div. :P
Dáš to pls na github do issues? Nějak to vymyslíme.
@sibka dej definici sloupce/filtru pred ty defaultni hodnoty. Je tam
check, aby to spis vyvojare nutilo napsat spravne klice defaultnich hodnot, nez
aby to v tichosti proslo a nic se pak nezobrazilo.
Je aktuálne nejak možné zakomponovať závislé filtre?
Konkrétne by som potreboval, aby sa dalo pri plnení filtrov dalo pristúpiť
k odfiltrovanému datasourcu na základe predošlého vyplnenia. Tzn.
zaškrtnem výrobcu Toyota a ponúkne mi iba autá zodpovedajúce
danému výrobcovi, atď.
Pre nastavenie korektných hodnôt je potrebné mať k dispozícií
aktuálny zoznam odfiltrovaných áut. To by bolo riešiteľné vyňatím
zodpovednej sekvencie z render metódy do novej metódy getRows.
Metóda je dostupné v továrničke a vieme zobrazovať položky na základe
zostávajúcich možností.
Zložitejší problém je, ako aktualizáciu filtra zobraziť. Dalo by sa
pridať snippet pre riadok s filtrami, ale to by spôsobilo nepríjemný
problém pri multiselecte – po označení niektorej položky by sa výber
skryl. To by sa asi dalo riešiť snippetmi na úrovni <ul>
elementov. Je tento prístup správny? Nejaký iný nápad..?
@romiix.org Není. Ale není problém si ho přidat. Prostě přidej
inputu filtru třídu, nebo data atribut a vyrob si nějaké api, kde budeš
předávat data z (pravděpodobně) databáze.
Nic takového ale implementovat neplánuti. Proč:
Je to megajenoduché implementovat s vlastní oblíbenou suggest
knihovnou
Jelikož se všechna data filtrují ajaxově a v reálném čase, přijde
mi suggest zbytečný.
K těm závislým filtrů: Já osobně bych to tady asi řešil spíš
pomocí dalšího formuláře, který by byl nad datagridem a sám bych mu
předával filtrovaný datasource. Ale jak jsi psal, není to problém nějak
ohnout, problém je to ohnout tak, aby ti nezmizel focus z toho pole.
Ahoj,
když dám více gridů za sebe (mám u produktu seznam fotek a seznam
souborů) a používám hromadnou akci – u druhého gridu dám zaškrnout
všechny položky, zaškrtnou se všechny i v prvním gridu + se nezobrazí
button v příslušeném gridu, ale ukáže se v tom předchozím.