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

před 2 měsíci

elring
Člen | 6
+
+1
-

@PavelJanda Hotovo – PR #830

před 2 měsíci

Pavel Janda
Backer | 869
+
0
-

@elring Díky, super, mrknu na to.

před 2 měsíci

suwer
Člen | 33
+
0
-

@PavelJanda @Šaman @galab
Pro multi-column sort to samozrejme dava vetsi smysl. Ale i pristup bez resetu dava smysl, viz. demos.devexpress.com (proste se resetuje prechodem zpet na single-column sort). Chapu, ze zvyk Ublaboo uzivatelu v tom pak hraje zasadni roli. Ja se to nesnazim napadnout, jenom mam jiny pohled na vec, to je cele :-).

@galab
Jenze v tom prikladu se tak chova pouze pro multi-column sort, ale single-column sort umoznuje ASC, DESC porad dokola. Zkus si to datatables.net

@Šaman
Ty priklady byly ilustrativni a je prece jedno, co pak pouzijes za datasource. Vsechno to nakonec na frontendu pouziva JS (Ublaboo, DataTables, ASP.NET GridView, …).

před 2 měsíci

Šaman
Člen | 2349
+
0
-

@suwer: Původně jsem chtěl napsat právě že Ublaboo a Grido to v principu umí i bez JS a ten je jen pro uživatelský komfort.
A že ty JS tabulkovače jsou spíš odlehčené ke zlepšení zobrazení již existující tabulky, protože většinou neslouží k filtrování velkého množství dat (u těch čistě JS by musela zdrojová HTML tabulka obsahovat všechny záznamy, což u rozsáhlých dat většinou nechceš), zatímco plné backendové gridy se naopak snaží mít UI i pro rozsáhle filtrování a složitéjší řazení. Obecně to je sice podobné zadání, ale řeší to jinou potřebu. Ale máš pravdu, že obecně to není důležité.

Co je důležité, že všechny tvoje příklady neumí řazení podle více sloupců.

Editoval Šaman (26. 9. 18:40)

před 2 měsíci

suwer
Člen | 33
+
0
-

Šaman napsal(a):

Co je důležité, že všechny tvoje příklady neumí řazení podle více sloupců.

Na ten, co upozornil @galab (datatables.net), umi multi-column sort, staci pri razeni podrzet Shift. Pro multi-column sort se chova stejne, jako Ublaboo, ale single-column sort umoznuje ASC, DESC porad dokola.

A muj priklad ASP.NET DataGridu (demos.devexpress.com) taky podporuje multi-column sort s jinym pristupem (resetuje prechodem zpet na single-column sort).

Nebo jsem te spatne pochopil :-)

Editoval suwer (28. 9. 9:08)

před 2 měsíci

Šaman
Člen | 2349
+
+1
-

Aha, tak ten shift mě nenapadl, to je zase novinka pro mě. :)
Hele, je to asi jedno a tady jsme offtopic. Evidentně jsme každý vyrostl na jiných gridech, takže nás překvapuje jiné UI.

před měsícem

pp
Člen | 23
+
0
-

Ahoj, poprosil bych o nasmerovani.
Pouzivam nize uvedeny zapis a mam problem, ze pokud vyberu polozku ze seznamu, neaplikuje se filtrace.
Staci ale zmenit pocet zobrazenych zaznamu v paginatoru a pak uz to beha OK.
Kde by mohl byt problem ?

$grid->addColumnText('device_id', 'device')->setAlign('center')->setSortable()
        ->setReplacement($this->deviceManager->getDevice())
                ->setFilterSelect($this->deviceManager->getDevice())
                    ->setAttribute('class', "selectpicker")
                    ->setAttribute('data-live-search', "true")
                    ->setAttribute('title', "Vyberte zařízení z nabídky ...");

Editoval pp (1. 10. 12:30)

před měsícem

jikki
Člen | 42
+
0
-

Ahoj,
když si dám do setFilterSelect nebo groupAction pole, kde hodnoty obsahují tečky, tak vyneredorávní selectu není správně. Chybí tečky nebo čast hodnoty. Dělám něco špatně?

<?php
$arr = ['.a', 'a.', 'a.b', 'a.b.c'];
$grid->addColumnText('test', Test)->setFilterSelect($arr);
$grid->addGroupAction('Test', $arr)->onSelect[] = function (array $ids, $selected) {};
?>

Vyrendorování vypadá takto. Dá se říct, že ořízne to, co je před první tečkou, pokud tam něco je, včetně tečky.

<option value="0">a</option>
<option value="1"></option>
<option value="2">b</option>
<option value="3">b.c</option>

Mám poslední verzi datagridu, u předchozích jsem si nevšiml.
díky moc

před měsícem

ali
Člen | 314
+
0
-

@jikki Typuju ze to bude delat translator, zkus ho vypnout.

Nebo vkladej hodnoty pres NotTranslate wrapper.

Editoval ali (14. 10. 17:42)

před měsícem

jikki
Člen | 42
+
0
-

ali napsal(a):

@jikki Typuju ze to bude delat translator, zkus ho vypnout.

Nebo vkladej hodnoty pres NotTranslate wrapper.

@ali máš pravdu, dělá to translator. Vypnutí či not translate wrapper pomáhá. Translator ale potřebuji mít zapnutý, tak škoda, že není u GroupAction možnost setTranslateOption jako je u Filtru. Nedaří se mi ten wrapper aplikovat na pole.

Díky za pomoc

Editoval jikki (15. 10. 9:07)

před měsícem

ali
Člen | 314
+
0
-

@jikki

[
    1 => new NotTranslate('prvni'),
    2 => new NotTranslate('druhy'),
];

Editoval ali (15. 10. 11:21)

před 24 dny

Petr Daňa
Člen | 108
+
0
-

Ahoj, díky za super komponentu, aktualizuju jednu historickou aplikaci na Nette 2.4 (časem na 3.0, ale to až později), takže jsem hledal náhradu za Grido :) Potřeboval bych poradit s jednou specialitou, jestli to vůbec nějak půjde, klidně i za cenu hacku přímo v kódu Datagridu (v Gridu jsem to taky tak nakonec musel udělat). A sice mít možnost nastavit, že se vůbec nebudou načítat data, pokud je filtr prázdný. Zkoumal jsem zdrojový kód (verze 5.7.1 pro Nette 2.4), ale ikdybych vytvořil potomka DibiFluentDataSource, abych upravil getData(), tak tam nemám jak zjistit, jestli ten filtr je prázdný nebo ne. Takže jediné, co bych asi aktuálně mohl udělat je upravit přímo DataModel a ve filterData() si přidat podmínku pro volání datasource->getData(). Nebo existuje jiný (a správnější) způsob, jak toho docílit? Díky za pomoc.

EDIT: respektive asi dát rovnou podmínku na začátek filterData() a pokud je filtr prázdný, tak vrátit rovnou prázdné pole.

EDIT2: hm, tak to nefunguje, jsem v koncích :(

Editoval Petr Daňa (20. 10. 22:22)

před 24 dny

Pavel Janda
Backer | 869
+
0
-

@PetrDaňa Ahoj. Možná zkus v presenteru před vyrenderováním datagridu prostě jen zkontrolovat hodnotu persistentní proměnné DataGrid::$filter – když bude prázdná, vyrenderovat jinou šablonu. Jen to jen nápad, nezkoušel jsem to. Ještě se nad tím zamyslím. :)

před 21 dny

Petr Daňa
Člen | 108
+
0
-

@PavelJanda no, zkoušel jsem to vymyslet, ale nepovedlo se, už dlouho jsem v Nette nedělal :-/ Já ten Datagrid renderuju až v šabloně přes {control grid}, takže v presenteru v renderXxx() metodě vlastně ještě není vůbec dostupný.

No, nakonec jsem udělal ten hooodně nepěkný hack knihovny, na který nejsem vůbec pyšný, ale potřebuju se už pohnout dál, tak než přijdu na něco jiného nebo budu mít čas to hacknout “hezčeji” (což se obávám hned tak nebude). Do DataModel jsem přidal public $noFetchingWhenEmptyFilter, v metodě filterData() pak mezi zpracováním filtrů a blokem volání getData() jsem dal tohle:

if ($this->noFetchingWhenEmptyFilter) {
    $emptyFilter = true;
    foreach ($filters as $filter) {
        if ($filter->isValueSet()) {
            $emptyFilter = false;
            break;
        }
    }
    if ($emptyFilter) {
        return array();
    }
}

a v DataGridu jsem dal jako public $dataModel, abych se přes něj v mém presenteru dostal na ten příznak. No, snad bude čas to vymyslet jinak, ale bez úpravy kódu v knihovně to s největší pravděpodobností nepůjde.

EDIT:
Tak jsem to alespoň mírně upravil, v DataGrid jsem vrátil zpět ten field na protected a udělal public setter

public function setNoFetchingWhenEmptyFilter($enable = true) {
    $this->dataModel->noFetchingWhenEmptyFilter = $enable;
}

Editoval Petr Daňa (24. 10. 21:19)

před 13 dny

n3t
Člen | 10
+
0
-

Ahoj, existuje někde funkční příklad s setItemsDetailForm? Zkoušel jsem vše možné, ale nejsem schopen to rozběhnout. Nefunguje mi ani příklad z dokumentace:

public function createComponentGrid($name)
{
  $grid = new DataGrid($this, $name);
  $grid->setDataSource($this->database->table('test')->order('id DESC'));
  $grid->setTemplateFile(__DIR__ . '/../templates/Test/grid.latte');

  $grid->addColumnText('name', 'company.grid.name');

  $presenter = $this;
  $grid->setItemsDetail();

  $grid->setItemsDetailForm(function(Nette\Forms\Container $container) use ($grid, $presenter) {
      $container->addHidden('id');
      $container->addText('name');

      $container->addSubmit('save', 'Save')
          ->onClick[] = function($button) use ($grid, $presenter) {
               $values = $button->getParent()->getValues();
               $presenter['grid']->redrawItem($values->id);
          };
  });

  return $grid;
}

a grid.latte

{extends $originalTemplate}

{block detail}
    <h2>{$item->name}</h2>

    <p>Lorem ipsum ...</p>

    {formContainer items_detail_form}
        {input id, value => $item->id}
        {input name, value => $item->name}
        {input save}
    {/formContainer}

Končí chybou

Nette\MemberAccessException
Call to undefined method Nette\Forms\Container::getControl(), did you mean getControls()?

Pokud vynechám z šablony formContainer, detail funguje, já bych ale v detailu rád editační formulář.

V dokumentaci je navíc použito {formContainer items_detail_form-$item->id}, to mi ale zas končí chybou Component with name '2' does not exist.

Používám Nette 3.0, DataGrid 6.2.3. S Nette začínám, tak prosím pomalu na mně :) Dík za nasměrování.

před 13 dny

jval
Člen | 35
+
0
-

Zdravím, je možné setConfirmation poslat do modalu místo klasického JS promptu?

Díky

před 12 dny

n3t
Člen | 10
+
0
-

@jval – To by šlo udělat na straně klienta javascriptem – nahradit standardní window.confirm svojí funkcí.

window.confirm = function(msg) {
// Vlastní dialog
}

Např. pro bootstrap ukázka zde

před 11 dny

jval
Člen | 35
+
0
-

@n3t nakonec jsem to vyřešil tak, že tlačítko pro smazání posílám na handleConfirm a v modalu tlačítko teprve na handleDelete. Děkuji

Ale mám ještě jeden dotaz. Mám v gridu sloupec s počtem dětí ke každé škole.

$grid->addColumnNumber('childs', 'Dětí')->setRenderer(function ($item) {
            return $item->related('user', 'company_id')->count();
        })->setAlign('center');

a pokud chci použít na tento sloupec summary.

$grid->setColumnsSummary(['childs']);

laděnka hlásí Cannot read an undeclared column ‘childs’.

Editoval jval (2. 11. 12:14)

před 9 dny

strunc
Člen | 7
+
0
-

Ahoj, trápím se už několik hodin možná triviální záležitostí v Ublaboo datagridu. Potřebuji v pravidelných časových intervalech načíst Ajaxem aktuální data z DB. Resp. mi jde hlavně o jeden sloupec aby se jeho data měnila podle aktuálního stavu v DB. Jako zdroj dat pro datagrid používám dataSource.
Zkusil jsem si pridal do sablony s datagridem takovy JavaScript, sice Ajaxové požadavky běží bez chyby, ale datagrid na změny v DB nereaguje.

setInterval(function () {
        if ($('.datagrid').length) {
            return $.nette.ajax({
                type: 'GET',
                url: $('.datagrid').first().data('refresh-state')
            });
        }
    }, 1000);

Používám verzi 5.7.0, Nette 2.4.
Prosím o nasměrování, už fakt nevím jak na to.
Děkuji.

před 9 dny

jval
Člen | 35
+
+1
-

@strunc A nestačilo by volat tím ajaxem url ?do=reload s tím, že v presentru by jsi měl

public function handleReload(){
    $this['grid']->reload();
}

před 9 dny

n3t
Člen | 10
+
0
-

K výše popsanému problému s setItemsDetailForm – jedná se o chybu v dokumentaci.
Následující změna v šabloně funguje:

{extends $originalTemplate}

{block detail}
    <h2>{$item->name}</h2>

    <p>Lorem ipsum ...</p>

    {formContainer items_detail_form}
        {formContainer items_detail_form_$item->id}
            {input id, value => $item->id}
            {input name, value => $item->name}
            {input save}
        {/formContainer}
    {/formContainer}

Editoval n3t (5. 11. 2:25)

před 8 dny

strunc
Člen | 7
+
+1
-

jval napsal(a):

@strunc A nestačilo by volat tím ajaxem url ?do=reload s tím, že v presentru by jsi měl

public function handleReload(){
  $this['grid']->reload();
}

Moc dekuju, krasne to takhle funguje presne podle Tve rady.

před 8 dny

Pavel Janda
Backer | 869
+
0
-

@n3t Poslal bys, prosím, pr fix docs? Díky moc!

před 8 dny

n3t
Člen | 10
+
0
-

@PavelJanda už se stalo :)

před 8 dny

n3t
Člen | 10
+
+1
-

@PavelJanda aha, tak až teď, včera jsem commitoval jinam :)

před 7 dny

n3t
Člen | 10
+
0
-

Tak jsem ještě narazil na jednu skrytou zradu s ItemsDetailForm, pokud se používá nějaká validace, je potřeba Submit buttonu nastavit Scope, jinak se validuje i vše ostatní (např. u mně to byl InlineAdd):

$grid->setItemsDetailForm(function(Nette\Forms\Container $container) use ($grid, $presenter) {
    $container->addHidden('id');
    $container->addText('name');

    $container->addSubmit('save', 'Save')
        ->setValidationScope([$container])
        ->onClick[] = function($button) use ($grid, $presenter) {
             $values = $button->getParent()->getValues();
             $presenter['grid']->redrawItem($values->id);
        };
});

Mám to taky doplnit do dokumentace (je to možná trochu specialita…)?

před 6 dny

Pavel Janda
Backer | 869
+
0
-

@n3t Yes, doplň, prosím! Díky

před 5 dny

n3t
Člen | 10
+
0
-

@PavelJanda poslal jsem PR

před 5 dny

n3t
Člen | 10
+
0
-

Tak ještě na jednu věc jsem narazil. Šablona tak jak je napsaná nefunguje se selecty, nenastaví správné option selected.
Jediný způsob na který jsem přišel je tento, ale nevím, jestli je to správně, popř. to nelze řešit lépe:

{formContainer items_detail_form}
    {formContainer items_detail_form_$item->id}
        {php $_form->setDefaults($item)}
        {input id}
        {input name}
        {input save}
    {/formContainer}
{/formContainer}

před 4 hodinami

flamengo
Člen | 125
+
0
-

Ahoj, řeším banální případ a nějak se nemůžu pohnout z místa. Potřebuji, aby mi grid držel proměnnou, protože ho načítám Ajaxem. Proměnnou potřebuji mít ve stránkování, filtrování, sortingu atd. Zkusil jsme persistentní proměnnou, ale asi to celé chápu nějak špatně, protože v odkazech pro stránkování atd. se mi proměnná pokus neobjeví.

class MojeKomponenta extends Control
{

    protected $model;

    protected $dataGridFactory;

    /** @persistent */
    public $pokus;


    public function __construct($model, $dataGridFactory)
    {
        $this->model = $model;
        $this->dataGridFactory = $dataGridFactory;
        $this->pokus = 'nastaveno';
    }

    public function createComponentGrid()
    {
        $grid = $this->dataGridFactory->create($this);
        $grid->setDataSource($this->model->getAll());
        $grid->addColumnText('name', 'Name');
        return $grid;
    }
}

Předem díky moc za nasměrování, určitě to bude jako vždy nějaká blbost.

Editoval flamengo (Dnes 18:41)

Stránky: Prev 1 … 30 31 32 RSS tématu