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

Pavel Janda
Člen | 977
+
0
-

@MW Pokud nepůjde alias, tak callback: https://ublaboo.org/datagrid/column#…

MW
Člen | 626
+
0
-

Pavel Janda napsal(a):

@MW Pokud nepůjde alias, tak callback: https://ublaboo.org/datagrid/column#…

Mohu poprosit o nakopnutí, jak bych mohl upravit ten SUM?
Předpokládám, že mu budu muset místo názvu sloupce podstrčit celé „cena/CONCAT(“1.„,dph)“ .. ale není mě jasné jak.

Moc díky

Editoval MW (24. 1. 2018 20:39)

Pavel Janda
Člen | 977
+
0
-

@MW

$grid->setColumnsSummary(['price'], function($item): float {
	return $item->price * (1 + $item->dph);
})->setRenderer(function($sum): string {
	return 'Cena: ' $sum . ' Kč s DPH';
});
MW
Člen | 626
+
0
-

Díky moc! Už rozumím :)

Karlito
Člen | 18
+
0
-

Ahoj, zkouším ublaboo a narazil jsem na problém s překreslováním jedním řádkem.
Mám normálně columnStatus ano/ne a při změně volám funkci která si do DB zavolá pro danou instanci a tu změní a uloží a pak dávám

$this['moderatorsGrid']->redrawItem($id);

a to mi hodí chybu
Cannot use object of type App\Model\Entities\Moderator as array
ale vůbec nevím kde bych to mohl špatně používat
s

$this['moderatorsGrid']->reload();

to funguje

Dále filter se mi nedaří rozjet nad enitami.
Kod

$grid->addColumnText('user.fullName', 'Uživatel')->setFilterText(['user.fullName']);

mi vrací
Component name must be non-empty alphanumeric string, 'user.fullName' given

Editoval Karlito (28. 1. 2018 15:19)

ZDDorS
Člen | 6
+
0
-

Ahoj,

používám ublaboo datagrid a potřeboval bych získat SQL nebo DQL dotaz, kterým se vytahují z databáze data, a to včetně filtrů a řazení, které si uživatel v datagridu nastavil.
Jde o to, že uživatel si v rozsáhlém datagridu vyfiltruje, co potřebuje, uloží si svůj „pohled“ a ten bude později sloužit k další práci s daty, při které už datagrid nebude figurovat.
Jako zdroj dat používám Doctrine.

Nejblíž k výsledku, jsem se dostal přes $grid->getDataSource()->getQuery()->getSql(), ale to vrací dotaz bez filtrů a řazení. Dokázal byste prosím někdo poradit, jak získat dotaz celý?

Pavel Janda
Člen | 977
+
0
-

@ZDDorS Výsledný dotaz se tvoří až při renderování. Zavěs si event handler do DataGrid::$onRedner, nebo jak se ten event jmenuje. :)

Btw, je jich tam víc.

Editoval Pavel Janda (30. 1. 2018 16:01)

ZDDorS
Člen | 6
+
0
-

Pavel Janda napsal(a):

@ZDDorS Výsledný dotaz se tvoří až při renderování. Zavěs si event handler do DataGrid::$onRedner, nebo jak se ten event jmenuje. :)

Btw, je jich tam víc.

Děkuju za nasměřování. Bohužel to úplně nezabralo. Zkoušel jsem event handler zavěsit na onRender a na onFiltersAssembled, ale to taky ještě vrací dotaz bez filtrů a řazení. Jinou vhodnou událost jsem nenašel.
Zkoušel jsem ve tvém zdrojáku přehodit

		/**
		 * Invoke possible events
		 */
		$this->onRender($this);

až za

			$items = Nette\Utils\Callback::invokeArgs(
				[$this->dataModel, 'filterData'],
				[
					$this->getPaginator(),
					$this->createSorting($this->sort, $this->sort_callback),
					$this->assembleFilters(),
				]
			);

, což by pro mé použití fungovalo tak, jak potřebuju.

Nenapadá tě prosím ještě nějaká jiná možnost, jak to udělat. Mě totiž ne. :(

sevca79
Člen | 55
+
0
-

Ahoj,
jak prosím udělat aby text na tlačítkách akcí byl dle nějakýho sloupce z datasource??

Mám něco jako seznam zápasů (hráč1, hráč2) a chci u toho seznamu vždy dvě tlačítka s akcema (vyhrál Pavel) (vyhrál Radim)
a na dalším řádku akce třeba (vyhrál Tomáš) (vyhrál Martin)

prostě dle toho co je konkrétním řádku..nechce se mi tam mít na každým řádku (vyhrál hráč1) (vyhrál hráč2)

díky za nakopnutí
–sevča

Pavel Janda
Člen | 977
+
0
-

@ZDDorS Můžeš podědit DataGrid a použít eventy:

$this->dataModel->onBeforeFilter[] = [$this, 'beforeDataModelFilter'];
$this->dataModel->onAfterFilter[] = [$this, 'afterDataModelFilter'];
$this->dataModel->onAfterPaginated[] = [$this, 'afterDataModelPaginated'];
Pavel Janda
Člen | 977
+
+1
-

@sevca79 Použij vlastní renderer u Action. Do textu tlačítka pak dej $item->player1..

Petr Parolek
Člen | 455
+
0
-

Ahoj,

jak mám prosím nahradit mezeru za nedělitelnou mezeru v datu?

Toto mi nefunguje:

<?php
$grid->addColumnDateTime('date', 'Datum')
	->setRenderer(function($item) {
		return str_replace(' ', '&nbsp;', $item->date->format("j. n. Y"));
	});
	//->setFormat('j. n. Y')
?>

EDIT

vyřešenoo

<?php
return str_replace(' ', "\xc2\xa0", $item->date->format("j. n. Y"));
?>

Editoval ppar (31. 1. 2018 16:42)

Pavel Janda
Člen | 977
+
0
-

@ppar To první by fungovalo, kdybys nastavil template escaping na false u toho sloupce.

sevca79
Člen | 55
+
0
-

Ahoj,
ještě jedna věcička u těch mých zápasů..
mám tabulku hřišť, která má mimo jiné dva sloupce pozice v turnaji (first_position_id, second_position_id) – zápas na hřišti je prostě mezi dvěma pozicemi v turnaji
tyto dva sloupce ukazují cizím klíčem do tabulky pozic v turnaji

tabulka pozic v turnaji má strukturu něco jako (id, player_id), takže je jasné, že zase ukazuje do tabulky hráčů

a tabulka hráčů má něco jako (id, jmeno, prijmeni)
a já teď chci udělat z toho jednoho zápasu jeden sloupec, který mi ale bude i umožňovat filtrovat

mám tedy

<?php
$grid->addColumnText('match', 'Zápas', ['first_position_id', 'second_position_id'])
    ->setRenderer(function ($item) {
         //pres refy vytahnu jmeno a prijmeni obou hracu
         return $firstPlayer . " - " . $secondPlayer;
    });

$grid->addFilterText('match', '',
    ['first_position_id.player_id.name', 'first_position_id.player_id.surname',
     'second_position_id.player_id.name', 'second_position_id.player_id.surname'])
?>

ve sloupci se mi normálně zobrazí zápas např. Pavel Novák – Petr Novotný
avšak, když chci něco vyfiltrovat, tak mi to hodí chybovou hlášku

Table alias ‚player_id‘ from chain ‚.second_position_id.player_id‘ is already in use by chain ‚.first_position_id.player_id‘. Please add/change alias for one of them.

jak tam prosím mám hodit ten alias či co??
díky

jAkErCZ
Člen | 322
+
-1
-

Zdravím,
mám takový problém ale absolutně si nevím rady co s tím…

https://ctrlv.cz/…/01/NOhE.png

a kód

<?php
public function createComponentArticleGrid($name) {

        $grid = new DataGrid($this, $name);

       $grid->setPrimaryKey('article_id');

        $grid->setDataSource($this->articleRepository->getArticles());


        $grid->addColumnNumber('article_id', 'id.language')
            ->setSortable();

        $grid->addColumnText('title', 'id.name')
            ->setSortable()
            ->addAttributes(['class' => 'text-center']);


        $grid->addColumnText('url', 'id.mail')
            ->setSortable()
            ->addAttributes(['class' => 'text-center']);


        /** Set item per page list */
        $grid->setItemsPerPageList([self::ITEMS_PER_PAGE], FALSE);  /** Nastavení počtu záznamu na stránce, FALSE zruší možnost vybrat všechny záznamy */

    }
?>

Nevíte někdo kde jsem udělal chybu nebo co dělám špatně? Nikdy jsem s tím to neměl problém a vše fungovalo..

Díky

Editoval jAkErCZ (1. 2. 2018 11:11)

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

@jAkErCZ: Máš to tam napsané. V session máš uloženo nastavení filtru article_id a v gridu ten filter nemáš. Smaž session, vytvoř filtr nebo pravděpodobně máš stejně pojmenovaný filtr ještě někde. Případně nepoužíváš vhosts.

Petr Parolek
Člen | 455
+
0
-

Pavel Janda napsal(a):

@ppar To první by fungovalo, kdybys nastavil template escaping na false u toho sloupce.

Myslíš vytvořit latte soubor pro sloupec? Nebo jak vypnout escape?

Mistrfilda
Člen | 76
+
0
-

@ppar takto:

<?php

$grid->addColumnText('name', 'Label')->setTemplateEscaping(FALSE);

?>

Editoval Mistrfilda (1. 2. 2018 13:06)

Petr Parolek
Člen | 455
+
0
-

díky

sevca79
Člen | 55
+
0
-

Zkusím to ještě jednou, pač hned po mé otázce, se tu nahromadilo pár dalších otázek a odpovědí, tak sem byl možná přehlídnut..

mám tabulku hřišť, která má mimo jiné dva sloupce pozice v turnaji (first_position_id, second_position_id) – zápas na hřišti je prostě mezi dvěma pozicemi v turnaji
tyto dva sloupce ukazují cizím klíčem do tabulky pozic v turnaji

tabulka pozic v turnaji má strukturu něco jako (id, player_id), takže je jasné, že zase ukazuje do tabulky hráčů

a tabulka hráčů má něco jako (id, jmeno, prijmeni)
a já teď chci udělat z toho jednoho zápasu jeden sloupec, který mi ale bude i umožňovat filtrovat

mám tedy

<?php
$grid->addColumnText('match', 'Zápas', ['first_position_id', 'second_position_id'])
    ->setRenderer(function ($item) {
         //pres refy vytahnu jmeno a prijmeni obou hracu
         return $firstPlayer . " - " . $secondPlayer;
    });

$grid->addFilterText('match', '',
    ['first_position_id.player_id.name', 'first_position_id.player_id.surname',
     'second_position_id.player_id.name', 'second_position_id.player_id.surname'])
?>

ve sloupci se mi normálně zobrazí zápas např. Pavel Novák – Petr Novotný
avšak, když chci něco vyfiltrovat, tak mi to hodí chybovou hlášku

Table alias ‚player_id‘ from chain ‚.second_position_id.player_id‘ is already in use by chain ‚.first_position_id.player_id‘. Please add/change alias for one of them.

jak tam prosím mám hodit ten alias či co??
díky

Pavel Janda
Člen | 977
+
0
-

@sevca79 Ukaž, jak vytváříš db query

Editoval Pavel Janda (5. 2. 2018 16:20)

cujan
Člen | 410
+
0
-

Caute, potreboval by som tahat data cez dve tabulky

tabulky:
clenoviaKurzu(id, idKurz, idOsoba)
kurz(id, idNazovKurzu, datumKurzu) idNazovKurzu odkazuje na tabulku
nazovKurzu(id, nazov)

ako zobrazim do stlpca nazvy vsetkych kurzov, pre konkretneho cloveka?
samozrejme vsade su nastaven cudzie kluce…
datumKurzu nemam problem zobrazit…

vdaka

H0w4rd
Člen | 96
+
0
-

Jak udělat sumu sloupce přes všechny stránky (a ne jen na jedné stránce)?
To bude hned to první, co se mi šéf zeptá, až mu ukážu, co všechno tenhle grid umí.

Editoval H0w4rd (10. 2. 2018 10:21)

Petr Parolek
Člen | 455
+
0
-

přes $grid->addAggregationFunction();

Petr Parolek
Člen | 455
+
0
-

Pavel Janda napsal(a):

@H0w4rd DataGrid podporuje složitější agregace. Jako jediná featura datagridu není zdokumentovaná.

$grid->addAggregationFunction(
	new Ublaboo\DataGrid\AggregationFunction\FunctionSum('price', IAggregationFunction::DATA_TYPE_FILTERED)
)

Druhým parameterm konstruktoru třídy FunctionSum určuješ, zda se mají brát v potaz data všechny, nebo jen vyfiltrované výsledky, a nebo pouze jedna stránka.

Můžeš si s tím zkusit pohrát. Všechno je v traitě Ublaboo\DataGrid\AggregationFunction\TDataGridAggregationFunction. FunctionSum je jediná – ukázková – implementace interfacu IAggregationFunction. Můžeš si napsat své a pak je předat datagridu.

@H0w4rd

Taky jsem to nedávno řešil a vyřešil :)

Editoval ppar (10. 2. 2018 11:34)

raketoplan2005
Člen | 147
+
+1
-

Ahoj,

používám Doctrine a mám dejme tomu entity Dům a Pokoj (kuchyň, obývací pokoj, toaleta, jídelna…). Z entity dům není vazba do pokoje (přistupuje se k tomu zatím vždy jen z druhé strany přes repozitář, případně přes join s WITH pro filtrování), každý pokoj má vazbu na Dům.

Mám grid kde jsou primárně vypsané domy a k nim bych chtěl – v jednom sloupci – vypsat i všechny pokoje, oddělené čárkami.

K tomu bych použil vlastní šablonu sloupce.

1.) Jak nejsnáze dostanu do datasource pro grid ty entity Pokoj pro každý řádek? Budu muset přidat tu vazbu z Domu? Nedá se nějak získat seznam entit které budou v aktuálním view gridu zobrazeny abych si pro ně dotáhl data pro custom render?
2.) Je možné k takovémuto use-case nějak udělat multiselect/checkboxlist filtr?

Díky moc

H0w4rd
Člen | 96
+
0
-

Díky za radu se sumou přes všechny stránky.

Ještě bych se rád zeptal, proč když zakomentuju všechna setFilterText(…), tak mi to hází chybu

Ublaboo\DataGrid\Exception\DataGridFilterNotFoundException
Session filter: Filter [user_id] not found

user_id je první sloupec. Předtím byl grid vykreslen se všemi filtry, pokud je ale zakomentuju, hodí to chybu.

EDIT: našel jsem řešení:
$grid->setStrictSessionFilterValues(FALSE);

Editoval H0w4rd (10. 2. 2018 18:17)

petaak
Člen | 2
+
0
-

@H0w4rd (16:13) Myslím, že než jsi filtry odebral tak jsi měl použité filtrování podle user_id. V gridu máš pravděpodobně nastaveno remember_state na true, takže grid si ukládá použité filtry do session aby je při další návštěvě stránky mohl přednastavit. Když jsi teď přišel na stránku, grid se snaží nastavit filtr na user_id, ale ten už jsi mu smazal, proto ta chyba. Řešením je buď smazat session, nebo vrátit do kódu přislušný filtr, na stránce s gridem resetovat filtery a pak je zase odebrat.

Editoval petaak (10. 2. 2018 17:30)

H0w4rd
Člen | 96
+
0
-

Ach jo, když resetuju libovolný filtr, hodí to chybu

Nette\DI\MissingServiceException
Services ‚dataGrid‘ or ‚DataGrid‘ not found.

Přitom ale dám F5 nebo odenteruju stejné url a naběhne to.

U všech sloupců mám setFilterText – úplně nejjednodušeji.

cujan
Člen | 410
+
0
-

Zdravím ako na cudzí kľúč cez dve tabuľky?

sevca79
Člen | 55
+
0
-

ahoj,
tak ještě jednou..nevšim sem si náznaku odpovědi od @PavelJanda a ted zas mezi jeho náznakem a touto zprávou je spousty dalších komentů..takže to rozepíšu znovu a dopodrobněji

mám tabulku hřišť mimo jiné se sloupci a cizími klíčí
hriste (id, first_position_id, second_position_id)
cizí klíče first_position_id a second_position_id ukazují do jedné a té samé tabulky positions.id
oba sloupce jsou tedy definovaný, že mohou být null

v tabulce positions jsou mimo jiné sloupce takovéto
positions (id, player_id) samozřejmě player_id je cizí klíč do tabulky players.id
tady taktéž player_id může být null

a tabulka players (id, jmeno, prijmeni)

ve svém gridu mám takto definovaný sloupec

$grid->addColumnText('match', 'Zápas', ['first_position_id', 'second_position_id'])
    ->setSortable()
    ->setRenderer(function ($item) {
       if (empty($item[BoardsModel::COLUMN_DRAW_POSITION1_ID])) {
            return "";
       }
       $player1jmeno=$item->ref('positions', 'first_position_id')->ref('players', 'player_id')['jmeno'];
       $player1prijmeni=$item->ref('positions', 'first_position_id')->ref('players', 'player_id')['prijmeni'];
       $player2jmeno=$item->ref('positions', 'second_position_id')->ref('players', 'player_id')['jmeno'];
       $player2prijmeni=$item->ref('positions', 'second_position_id')->ref('players', 'player_id')['prijmeni'];

       return $player1jmeno . " " . $player1prijmeni . " - " . $player2jmeno . " " . $player2prijmeni;
    });

$grid->addFilterText('match', '',
    ['first_position_id.player_id.jmeno', 'first_position_id.player_id.prijmeni',
     'second_position_id.player_id.jmeno', 'second_position_id.player_id.prijmeni'])

ve sloupci se mi normálně zobrazí zápas např. Pavel Novák – Petr Novotný
avšak, když chci něco vyfiltrovat, tak mi to hodí chybovou hlášku

Table alias ‚player_id‘ from chain ‚.second_position_id.player_id‘ is already in use by chain ‚.first_position_id.player_id‘. Please add/change alias for one of them.

jak tam prosím mám hodit ten alias či co??

datasource načítám tedy pouze jednoduše pres ntdb
$this->database->table(‚hriste‘);

díky za nějakou nápovědu

H0w4rd
Člen | 96
+
0
-

Sorry ale teď tu asi budem psát dotazy jeden přes druhého :)

Potřebuju nutně vědět, jak javascriptem:

  1. vyvolám refresh gridu (proč: ikonkou vyvolám editaci ve fancyboxu, po zavření chci grid aktualizovat)
  2. zavěsím funkci na událost překreslení gridu (proč: potřebuju znovu zinicializovat nějaké jquery bláboly v buňkách a to se musí znova udělat po překreslení – ajaxComplete znám, ale jak tam poznám, že šlo o grid? případně nějak jinak?)
Pavel Janda
Člen | 977
+
0
-

@H0w4rd
a, Třeba: Udělej si link na custom signal v presenteru a v tom presenteru zavolej $this['grid']->redrawControl().
b, Blbě. :D Zkus to třeba dělat pokaždé, ale jen pokud je na stránce grid?

H0w4rd
Člen | 96
+
0
-

Dík, ale problém je, že když přejdu na jinou stránku a vyvolam redrawControl, grid se vrátí na původní stránku.

Nemůže být trochu problém, pokud na stránce bude víc než jeden grid?
Koukám, že třeba linkům pro sortování se dává id=„datagrid-sort-nazev_sloupce“, takže když budu mít 2 gridy se stejnými sloupci, bude to asi dělat paseku.

Editoval H0w4rd (12. 2. 2018 21:08)

Jiří Nápravník
Člen | 710
+
0
-

Zdravím,
přešel jsem na tento datagrid, vypadá velmi dobře, díky za něj!

Nemohu však najít, zda je možné řadit i podle sloupce, který nevykresluji. Mám v entitě atribut position. Podle něj bych chtěl řadit, ale opravdu jej nechci vykreslovat, protože uživatele nezajímá. Je nějaká možnost?

romiix.org
Člen | 343
+
0
-

Riešim to predvoleným skrytím stĺpca. Nie je to ideálne, ale ide to.

Jiří Nápravník napsal(a):
Nemohu však najít, zda je možné řadit i podle sloupce, který nevykresluji. Mám v entitě atribut position. Podle něj bych chtěl řadit, ale opravdu jej nechci vykreslovat, protože uživatele nezajímá. Je nějaká možnost?

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

Ahoj @PavelJanda,

mám komponentu grid a v ní nějakou funkčnost a odkazy. Trait TLink mi přijde, že se chová nestandardně v produkčním režimu oproti debugu. Jasně, že ty odkazy jsou špatně zapsány, ale v debug režimu to projde bez chyby a ta se objeví až na ostré (po nasazení :)).

$grid->addAction('detail', '', 'Acquirer:detail', ['id' => 'id']) – funguje dobře acquirer/detail
$grid->addAction('detail', '', NULL, ['id' => 'id']) – funguje dobře v debug režimu acquirer/detail
$grid->addAction('detail', '', NULL, ['id' => 'id']) – produkční generuje pouze #

Editoval Pavel Kravčík (14. 2. 2018 9:16)

Pavel Janda
Člen | 977
+
0
-

@PavelKravčík Tak to je hodně divné.. Mohl bys zkusit udělat sandbox-like appku, kde bude toto fungování ukázané a nahrát nějak na github?
Nemůže být problém v jiné verzi datagridu na produkci?

sevca79
Člen | 55
+
0
-

ahoj,
tak napotřetí to tu zkouším, pač sem zas byl přeskočen a možná nevšimnut :) kopíruju zprávu co sem psal už výše a na kterou ještě výše byla už nějaká reakce, avšak nedotažená dokonce… :(

tak ještě jednou..nevšim sem si náznaku odpovědi od @PavelJanda a ted zas mezi jeho náznakem a touto zprávou je spousty dalších komentů..takže to rozepíšu znovu a dopodrobněji

mám tabulku hřišť mimo jiné se sloupci a cizími klíčí
hriste (id, first_position_id, second_position_id)
cizí klíče first_position_id a second_position_id ukazují do jedné a té samé tabulky positions.id
oba sloupce jsou tedy definovaný, že mohou být null

v tabulce positions jsou mimo jiné sloupce takovéto
positions (id, player_id) samozřejmě player_id je cizí klíč do tabulky players.id
tady taktéž player_id může být null

a tabulka players (id, jmeno, prijmeni)

ve svém gridu mám takto definovaný sloupec

$grid->addColumnText('match', 'Zápas', ['first_position_id', 'second_position_id'])
    ->setSortable()
    ->setRenderer(function ($item) {
       if (empty($item[BoardsModel::COLUMN_DRAW_POSITION1_ID])) {
            return "";
       }
       $player1jmeno=$item->ref('positions', 'first_position_id')->ref('players', 'player_id')['jmeno'];
       $player1prijmeni=$item->ref('positions', 'first_position_id')->ref('players', 'player_id')['prijmeni'];
       $player2jmeno=$item->ref('positions', 'second_position_id')->ref('players', 'player_id')['jmeno'];
       $player2prijmeni=$item->ref('positions', 'second_position_id')->ref('players', 'player_id')['prijmeni'];

       return $player1jmeno . " " . $player1prijmeni . " - " . $player2jmeno . " " . $player2prijmeni;
    });

$grid->addFilterText('match', '',
    ['first_position_id.player_id.jmeno', 'first_position_id.player_id.prijmeni',
     'second_position_id.player_id.jmeno', 'second_position_id.player_id.prijmeni'])

ve sloupci se mi normálně zobrazí zápas např. Pavel Novák – Petr Novotný
avšak, když chci něco vyfiltrovat, tak mi to hodí chybovou hlášku

Table alias ‚player_id‘ from chain ‚.second_position_id.player_id‘ is already in use by chain ‚.first_position_id.player_id‘. Please add/change alias for one of them.

jak tam prosím mám hodit ten alias či co??

datasource načítám tedy pouze jednoduše pres ntdb

$this->database->table(‘hriste’);

díky za nějakou nápovědu

Pavel Janda
Člen | 977
+
0
-

@sevca79 Být tebou, udělám si view, kde to budeš mít smysluplně pospojované a jako data source použiješ to view.
Taky můžeš zkusit napsat vlastní filtrační podmínky. :)

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

@PavelJanda: Tak pokud se vyplní třetí parametr – funguje to dobře. Ale jen je to trochu matoucí to chování v debug režimu a pak v produkci.

Composer webproject + require ublaboo. Když v boostrapu vypneš debugMode tak se ten link vygeneruje.
https://github.com/…ublaboo-test

sevca79
Člen | 55
+
0
-

Ahoj,
mám tu takové dvě otázky v jedné
jak prosím ošetřit doubleClick na action?? nechci, aby se mi handler provedl víckrát..
chtěl sem to udělat tak, že přidám do action nějakou třídu např. doubleClickDisable

$grid->addActionCallback('paid', '')
    ->setIcon('dollar')
    ->setTitle('Zaplatit')
    ->setClass('btn btn-xs btn-success doubleClickDisable ajax')
    ->onClick[] = [$this, 'handlePaid'];

a v javascriptu mít někde definované něco jako

$('body').on('click', '.doubleClickDisable', function (e) {
    //tady ten double click nejak osetrit
    console.log("double click pres body");
});
//nebo
$('.doubleClickDisable').on('click', function (e) {
    //nebo tadz ten double click osetrit
    console.log("double click primo");
});

avšak ten první jquery přes body se neprovede vůbec a ten druhý pouze jednou, avšak podruhý (když to ajaxově překreslím) se už neprovede

bo jak mám nějak ošetřit aby když uživatel dvojklikne na akci se provedlo pouze jednou..

děkuji

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

@sevca79: Ošetři tohle v handleru – je to výhodnější. Pokud si otevřu dvě záložky – stejně je Ti takhle konhrola k ničemu. :)

public function disable($id)
{
	$entity = $this->repository->getById($id);

	if($entity->active)
	{
		$entity->active = 0;
	}
	else
	{
		// ošetření - např. flashMessage, že akce se již nedá provést
	}
}
sevca79
Člen | 55
+
0
-

dvě záložky otevřené už je chyba uživatele..dvojklik sice taky, ale občas prostě někdo ten dvojklik udělá…
já bych to radši dělal přes jquery, kde bych si s tim ještě trošku graficky pohrál, že bych např. to tlačítko zatmavil, jako, že už bylo zmáčknuto a pod…
ale vůbec nechápu proč to přes jquery a body nefunguje..pač každej jinej odkaz, kterýmu nastavim tento class, mimo grid funguje bez problému :(

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

A co když bude jedna záložka a mezitím se interně změní stav a ty nezmáčkneš F5, než budeš operaci provádět (tj. mám ten tab otevřený 20 minut). :) Každopádně to asi bude stačit přidat do nějakého ajax extension.

sevca79
Člen | 55
+
0
-

a jak se tadyto dá řešit?? když se to změní interně či někdo jinej někde jinde?? přes nějaký websockety?? či nějak jinak??

jinak to jquery bylo tím, že tam byla i třída ajax, která to jquery nějak zakazovala či co..Když sem ji vyhodil pryč, tak už to jquery fungovalo..

Takže sem to udělal tak, že sem ajax vyhodil a vyřeším to snad nějak, že ten ajax zavolám až v tom jquery (není to moc prasečina? bo je to normální řešení??)

např. nějak takto

$('body').on('click', '.gridDoubleClickDisable', function (e) {
    e.preventDefault();

		//ziskani kam sem to chtel poslat
    var href=$(this).attr('href');

		//zatim jednoduse vyresen nemoznost doubleclick - jinak trosku sloziteji :)
    $(this).hide();

		//a poslani ajaxove
    $.nette.ajax({url: href});
});

Editoval sevca79 (16. 2. 2018 14:11)

raketoplan2005
Člen | 147
+
0
-

Ahoj,

od svého minulého dotazu jsem pokročil a udělal jsem nakonec tu asociaci obousměrnou a vlastní šablonu buňky kde se to concatuje + jeden join navíc jen pro filtrování.

Nicméně otázku na jednosměrné asociace bych měl stále – dá se prosím nějak v datagridu pracovat s Doctrine QueryBuilderem který vrátí pole, protože je do jeho výsledku přijoinovaná i entita bez asociace z té primární (asociace tam je ale pouze jednosměrná)?

Děkuji

H0w4rd
Člen | 96
+
0
-

Problém – u addGroupAction se vůbec neaplikuje setClass ani setAttribute.

$grid->addGroupAction(„Smazat“)->setClass(„form-control input-sm ggghhhjjj“)->onSelect[] = [$this, „deleteMultiple“];

r2294743
Člen | 16
+
0
-

@PavelJanda Řeším takový problém – je nějaká možnost předávaných proměnných do šablony?

Vytvářím komponentu, která vypadá nějak takto.

public function createComponentSuggestions($name)
{
    $grid = new DataGrid($this, $name);

    $grid->setDataSource($this->facade->getAllSuggestions());
    $grid->addColumnText('text', '');

    $grid->setTemplateFile(__DIR__ . '/templates/Vote/datagrid.latte');

}

/templates/Vote/datagrid.latte

{extends $original_template}

{define col-text}

    <div class="widget" >
        <div class="panel-body">
            <div class="row">
                <div class="col-md-1 col-sm-1 text-center">
                    <i class="fas fa-heart circle"></i>
                </div>
                    <p>{$item->text}</p>
                </div>
            </div>
        </div>
    </div>

{/define}

Editoval r2294743 (4. 3. 2018 0:27)

H0w4rd
Člen | 96
+
0
-

ppar napsal(a):

Pavel Janda napsal(a):

@H0w4rd DataGrid podporuje složitější agregace. Jako jediná featura datagridu není zdokumentovaná.

$grid->addAggregationFunction(
	new Ublaboo\DataGrid\AggregationFunction\FunctionSum('price', IAggregationFunction::DATA_TYPE_FILTERED)
)

Druhým parameterm konstruktoru třídy FunctionSum určuješ, zda se mají brát v potaz data všechny, nebo jen vyfiltrované výsledky, a nebo pouze jedna stránka.

Můžeš si s tím zkusit pohrát. Všechno je v traitě Ublaboo\DataGrid\AggregationFunction\TDataGridAggregationFunction. FunctionSum je jediná – ukázková – implementace interfacu IAggregationFunction. Můžeš si napsat své a pak je předat datagridu.

@H0w4rd

Taky jsem to nedávno řešil a vyřešil :)

Je to řešitelné pro Nette Database?
Hází mi to error:

Ublaboo\DataGrid\Exception\DataGridException
Used DataSource has to implement IAggregatable for aggegations to work

Data source je klasicky Nette\Database\Table\Selection.

Editoval H0w4rd (4. 3. 2018 11:13)