Author: Petr Bugyík
Inheritance: extends Grido\Components\Container
Exemple #1
0
 protected function createComponentGridUle($name)
 {
     $grid = new Grid($this, $name);
     $grid->setModel($this->ul->findAll()->where('idVcelnica', $this->getParameter('id')));
     $grid->addColumnText('nazov', 'Názov ula');
     $grid->addActionHref('detail', 'Detail', 'Ul:detail');
 }
 public function createComponentUserMotivationGrid($name)
 {
     try {
         $seasons = [null => null] + $this->seasonService->getSelectSeasons();
         //$users = [null=>null]+$this->userService->getSelectUsers();
     } catch (Exceptions\DataErrorException $ex) {
         $this->handleDataLoad(null, self::LAST_CHANCE_REDIRECT, $ex);
     }
     $grid = new Grid($this, $name);
     $grid->setModel($this->entryService->getEntriesDataSource($this->getUser()->getIdentity()));
     $grid->setPrimaryKey("id");
     //	$grid->addColumnNumber('id', '#')
     //		->cellPrototype->class[] = 'center';
     //	$headerId = $grid->getColumn('id')->headerPrototype;
     //	$headerId->class[] = 'center';
     //	$headerId->rowspan = "2";
     //	$headerId->style['width'] = '0.1%';
     $grid->addColumnText('season', $this->tt("motivationModule.protected.grid.season"))->setSortable()->setFilterSelect($seasons);
     $headerSeas = $grid->getColumn('season')->headerPrototype;
     $headerSeas->class[] = 'center';
     $grid->addColumnText('amount', $this->tt("motivationModule.protected.grid.amount"))->setSortable()->setFilterText();
     $headerAmnt = $grid->getColumn('amount')->headerPrototype;
     $headerAmnt->class[] = 'center';
     $grid->addColumnDate("updated", $this->tt("motivationModule.protected.grid.updated"), self::DATE_FORMAT)->setSortable();
     $headerOd = $grid->getColumn('updated')->headerPrototype;
     $headerOd->class[] = 'center';
     $grid->addColumnText('type', $this->tt("motivationModule.protected.grid.type"))->setSortable()->setReplacement(MotivationEntryType::getOptions())->setFilterSelect([null => null] + MotivationEntryType::getOptions());
     $headerT = $grid->getColumn('type')->headerPrototype;
     $headerT->class[] = 'center';
     $grid->addColumnText('subject', $this->tt("motivationModule.protected.grid.subject"))->setSortable()->setFilterText();
     $headerSubj = $grid->getColumn('subject')->headerPrototype;
     $headerSubj->class[] = 'center';
     $grid->setFilterRenderType($this->filterRenderType);
     $grid->setExport("protected-motivation" . date("Y-m-d H:i:s", time()));
 }
Exemple #3
0
 /**
  * Create grid UI component Grido\Grid
  *
  * @param array|IRepository|Selection $data
  * @param string                      $primaryKey
  * @param integer                     $perPage
  * @param array                       $permanentlyFilter
  *
  * @return Grid
  */
 public function createGrido($data = null, $primaryKey = null, $perPage = null, $permanentlyFilter = [])
 {
     $grid = new Grid();
     // set data model
     if ($data) {
         if ($data instanceof IRepository) {
             $dataModel = new Mepatek\Components\Grido\DataSources\RepositorySource($data);
             $dataModel->setPermanentlyFilter($permanentlyFilter);
         } elseif ($data instanceof Selection) {
             $dataModel = new Grido\DataSources\NetteDatabase($data);
         } else {
             $dataModel = new Grido\DataSources\ArraySource($data);
         }
         $grid->setModel($dataModel);
     } else {
         $dataModel = new Grido\DataSources\ArraySource([]);
         $grid->setModel($dataModel);
     }
     // set primary key
     if ($primaryKey) {
         $grid->setPrimaryKey($primaryKey);
     }
     // set properties of grido
     $grid->filterRenderType = \Grido\Components\Filters\Filter::RENDER_INNER;
     if ($this->translator) {
         $grid->setTranslator($this->translator);
     }
     $grid->getTablePrototype()->class("table table-striped table-hover table-bordered dataTable");
     // set item per page
     if ($perPage) {
         $grid->setDefaultPerPage($perPage);
     }
     return $grid;
 }
Exemple #4
0
 /**
  * 
  * @return \Grido\Grid
  */
 public function create()
 {
     $grid = new Grid();
     $grid->getTranslator()->setLang('cs');
     $grid->setFilterRenderType(Filter::RENDER_INNER);
     $grid->customization->useTemplateBootstrap();
     return $grid;
 }
 public function create()
 {
     $grid = new Grid();
     $this->translator and $grid->setTranslator($this->translator);
     $grid->setModel($this->getSelection());
     $grid->filterRenderType = Filter::RENDER_INNER;
     $this->setupGrid($grid);
     return $grid;
 }
 protected function createComponentGridCiselnikPodskupina($name)
 {
     $grid = new Grid($this, $name);
     $grid->translator->lang = 'sk';
     $grid->filterRenderType = Filter::RENDER_INNER;
     $grid->setModel($this->ciselnikSkupinaRepository->findAll());
     $grid->addColumnText('nazov', 'nazov');
     $grid->addActionHref('edit', 'Edituj');
     $grid->addActionHref('delete', 'Zmaz');
 }
Exemple #7
0
 /**
  * @param \Grido\Grid $grid
  * @param array $operations
  * @param callback $onSubmit - callback after operation submit
  */
 public function __construct($grid, array $operations, $onSubmit)
 {
     $this->grid = $grid;
     $grid->addComponent($this, self::ID);
     $grid['form'][$grid::BUTTONS]->addSubmit(self::ID, 'OK')->onClick[] = [$this, 'handleOperations'];
     $grid['form']->addContainer(self::ID)->addSelect(self::ID, 'Selected', $operations)->setPrompt('Grido.Selected');
     $grid->onRender[] = function (Grid $grid) {
         $this->addCheckers($grid['form'][Operation::ID]);
     };
     $this->onSubmit[] = $onSubmit;
 }
 protected function createComponentOsobaGrid($name)
 {
     $grid = new Grido\Grid($this, $name);
     $grid->setModel($this->database->table('osoba'));
     $grid->addColumnText('priezvisko', 'Priezvisko')->setFilterText();
     $grid->addColumnText('meno', 'Meno');
     $grid->addColumnText('cisloCrv', 'CRV');
     $grid->addColumnText('vcelstvaJar', 'Pocet jar');
     $grid->addColumnText('vcelstvaJesen', 'pocet jesen');
     $grid->addActionHref('edit', 'Edituj')->setIcon('pencil');
     $grid->addActionHref('delete', 'Zmaž')->setIcon('trash');
 }
Exemple #9
0
 /**
  * @param Context $db
  * @param Selection $selection
  */
 public function __construct(Context $db, Selection $selection)
 {
     parent::__construct();
     $this->db = $db;
     $this->selection = $selection;
     $this->prepare();
 }
Exemple #10
0
 /**
  * @return int
  */
 public function getCountEnd()
 {
     if ($this->countEnd === NULL) {
         $this->countEnd = $this->grid->getCount() > 0 ? min($this->grid->getCount(), $this->getPage() * $this->grid->getPerPage()) : 0;
     }
     return $this->countEnd;
 }
Exemple #11
0
 /**
  * @return \Grido\Grid
  */
 protected function createComponentTable()
 {
     $table = new Grid();
     $table->setModel(new ArraySource($this->workerManager->getWorkers()));
     $table->addColumnText('id', 'ID')->getCellPrototype()->width = '40%';
     $table->addColumnText('state', 'State')->setCustomRender(function ($data) {
         $lastCheck = \DateTime::createFromFormat('Y-m-d H:i:s', $data['lastCheck']);
         $lastCheck->modify('+' . ($this->workerManager->getInterval() + 7) . ' second');
         return $lastCheck < new \DateTime() ? 'break' : $data['state'];
     })->getCellPrototype()->width = '20%';
     $table->addColumnText('lastCheck', 'Last check')->getCellPrototype()->width = '30%';
     $table->addColumnText('lastJob', 'Last job')->getCellPrototype()->width = '30%';
     $table->addActionEvent('debug', 'Debug')->onClick[] = $this->tableDebugClick;
     $table->addActionEvent('restart', 'Restart')->onClick[] = $this->tableRestartClick;
     $table->addActionEvent('stop', 'Stop')->onClick[] = $this->tableStopClick;
     return $table;
 }
 /**
  * @inheritdoc
  */
 public function createTemplate($class = NULL)
 {
     $template = parent::createTemplate($class);
     if ($this->templateFileName) {
         $template->setFile($this->templateFileName);
     }
     return $template;
 }
 public function create()
 {
     $grid = new Grid();
     $grid->model = $this->clientFacade->createDSDoctrine();
     $grid->addColumnText('name', 'Name')->setCustomRender(function ($item) {
         $href = $this->linkGenerator->link('Backend:Clients:update', array('id' => $item->id));
         return "<a href ='" . $href . "'>" . $item->name . "</a>";
         /* $el = Html::el('a');
            // $item represents whole row. So you can get here any filed you want.
            $el->setText($item->name);
            $el->addAttributes(array('target'=>"_blank"));
            $el->href = $this->linkGenerator->link(
                'Backend:Clients:product',    // this is how you can generate any link MODULE_NAME:PRESENTER_NAME:ACTION_NAME
                array(
                    // here is a place for path parameters. FE: here you are expecting /admin/<presenter>/<action>[/<id>]
                    // id is a parameter we can set here. FYI [/<id>] means that id is not required parameter, it can be NULL.
                    'id' => $item->id
                )
            );
            return $el;*/
     })->setSortable()->setFilterNumber();
     $grid->addColumnText('product', 'Product')->setCustomRender(function ($item) {
         return $item->product->name;
     })->setSortable()->setFilterText()->setSuggestion();
     $grid->addColumnText('address', 'Address')->setSortable()->setFilterText()->setSuggestion();
     $grid->addActionHref('update', 'Update')->setIcon('pencil');
     $grid->addActionEvent('delete', 'Delete', function ($item) {
         $this->clientFacade->delete($item);
     })->setIcon('trash-o')->setConfirm(function ($item) {
         return "Are you sure you want to delete {$item->name}?";
     });
     return $grid;
 }
 /**
  * Builds listing grid
  *
  * @param string|null $name
  * @return Grid
  * @throws \Grido\Exception
  */
 public function createComponentDataGrid($name = NULL)
 {
     $data = $this->generateDataForGrid();
     $dataGrid = new Grid($this, $name);
     $dataGrid->setRowCallback(function ($row, $tr) {
         /** @var Nette\Utils\Html $tr */
         if (empty($row['translation'])) {
             $tr->attrs['class'][] = 'untranslated';
         }
         return $tr;
     });
     $dataGrid->setFilterRenderType(Filter::RENDER_INNER);
     $dataGrid->setModel(new ArraySource($data));
     $dataGrid->addActionHref('remove', 'Remove', 'remove');
     $dataGrid->setDefaultSort(array('translation' => 'ASC'));
     // Columns
     $catalogueColumn = $dataGrid->addColumnText('catalogue', 'Catalogue');
     $catalogueColumn->setCustomRender(function ($values) {
         return ucfirst($values['catalogue']);
     });
     $catalogueColumn->setFilterSelect($this->getCataloguesInModel($data));
     $catalogueColumn->setSortable();
     $dataGrid->addColumnText('id', 'Code')->setSortable()->setFilterText();
     $translationColumn = $dataGrid->addColumnText('translation', 'Translation');
     $translationColumn->setFilterText();
     $translationColumn->setCustomRender(function ($values) {
         $el = Nette\Utils\Html::el('textarea');
         $el->addAttributes(array('type' => 'text', 'class' => 'text', 'rows' => 1, 'data-translation-control-change-url' => $this->link('saveTranslation!', array('catalogue' => $values['catalogue'], 'code' => $values['id'], 'language' => $this->locale))));
         $el->add(str_replace('|', "|\n", $values['translation']));
         return $el;
     });
     return $dataGrid;
 }
Exemple #15
0
 protected function createComponentPages()
 {
     $grid = new Grid();
     $grid->setModel($this->pages->findAll());
     $grid->addColumnText('name', 'Název stránky (Target/SEO)')->setSortable();
     $grid->addColumnText('heading', 'Nadpis')->setSortable();
     $grid->addColumnText('hidden', 'Útržek')->setSortable();
     $grid->addActionHref('editor', 'Upravit')->setIcon('pencil');
     $grid->addActionHref('remove', 'Smazat', 'delete!')->setConfirm("Opravdu chcete smazat tuto stránku?")->setIcon('trash');
     return $grid;
 }
Exemple #16
0
 public function __construct($parent, $name)
 {
     parent::__construct($parent, $name);
     $this->user = $parent->user->getIdentity();
     $this->settings = $this->user->settings;
     $this->setTranslator(new \Grido\Translations\FileTranslator('cs'));
     //$this->setDefaultPerPage($this->settings["table_rows"]);
     $this->tablePrototype = \Nette\Utils\Html::el('table');
     $this->tablePrototype->id($this->getName())->class[] = 'table table-striped table-hover';
     $this->setExport();
 }
Exemple #17
0
 protected function applyFiltering()
 {
     try {
         parent::applyFiltering();
     } catch (InvalidArgumentException $e) {
         $this->filter = [];
         $this->setDefaultFilter([]);
         if ($session = $this->getRememberSession()) {
             $session->remove();
         }
     }
 }
Exemple #18
0
 protected function createComponentGrid($name)
 {
     $grid = new Grid();
     $grid->setModel($this->userModel->findAll());
     $grid->setPrimaryKey('id');
     $grid->addColumnText('username', 'Používateľ')->setSortable()->setFilterText();
     $grid->addColumnText('email', 'E-mail')->setSortable()->setFilterText();
     $grid->addColumnDate('last_login', 'Posledné prihlásenie')->setSortable()->setFilterDate();
     $grid->filterRenderType = $this->filterRenderType;
     $grid->addActionHref('remove', 'Odstrániť užívateľa')->setIcon('minus')->setConfirm(function ($item) {
         return "Ste si istý, že chcete odstrániť užívateľa {$item->username}";
     });
     return $grid;
 }
 protected function setupGrid(Grid $grid)
 {
     $grid->addColumnText('image', 'Image')->setCustomRender(__DIR__ . '/_image.latte')->setSortable()->setFilterText();
     $grid->addColumnText('name', 'Name')->setSortable()->setFilterText()->setSuggestion();
     $grid->addColumnText('price', 'Price')->setSortable()->setFilterNumber();
     $grid->addColumnBoolean('active', 'Active')->setSortable()->setFilterSelect(['' => '', 1 => 'Yes', 0 => 'No']);
     $grid->addActionHref('update', 'Update')->setIcon('pencil');
     $grid->addActionEvent('delete', 'Delete', $this->delete)->setIcon('trash-o')->setConfirm(function ($item) {
         return "Are you sure you want to delete {$item->name}?";
     });
 }
Exemple #20
0
 /**
  * @param $name
  * @return Grid
  * @throws \Grido\Exception
  */
 protected function createComponentGrid($name)
 {
     $grid = new Grid($this, $name);
     $grid->translator->lang = 'cs';
     $fluent = $this->searchRepository->getAll();
     $grid->model = $fluent;
     $grid->addColumnText('term', 'Hledaný termín')->setSortable()->setFilterText();
     $grid->getColumn('term')->headerPrototype->style['width'] = '75%';
     $grid->addColumnNumber('count', 'Počet hledání')->setSortable();
     $grid->getColumn('term')->headerPrototype->style['width'] = '25%';
     $grid->setDefaultPerPage(50);
     $grid->filterRenderType = $this->filterRenderType;
     $grid->setExport();
     return $grid;
 }
 protected function createComponentInterpretList($name)
 {
     $grid = new Grid($this, $name);
     $grid->setModel($this->interpreti->findAll());
     $grid->addColumnText("nazev", "Interpret")->setCustomRender(function ($item) {
         return !$item->interpret_id ? Html::el('b')->setText($item->nazev) : $item->nazev;
     })->setSortable()->setFilterText()->setSuggestion();
     $grid->addColumnText("alias", "Alias pro")->setColumn(function ($item) {
         return isset($item->interpret->nazev) ? $item->interpret->nazev : null;
     });
     $grid->addFilterCheck('interpret_id', 'Jen aliasy');
     $grid->addColumnText("desc", "Popis")->setCustomRender(function ($item) {
         return Strings::truncate($item->desc, 256);
     });
     $grid->addActionHref('edit', 'Editovat', 'editor')->setIcon('pencil');
     $grid->addActionHref('delete', 'Smazat', 'delete!')->setIcon('trash')->setConfirm('Opravdu chcete smazat tohoto interpreta?');
     //Set face for grid
     $gridTemplate = __DIR__ . "/../templates/components/Grid.latte";
     if (file_exists($gridTemplate)) {
         $grid->setTemplateFile($gridTemplate);
     }
     return $grid;
 }
 protected function setupGrid(Grid $grid)
 {
     $grid->addColumnText('name', 'Name')->setSortable()->setFilterText()->setSuggestion();
     $grid->addColumnEmail('email', 'Email')->setSortable()->setFilterText()->setSuggestion();
     $grid->addColumnText('role', 'Role')->setSortable()->setFilterText()->setSuggestion();
     $grid->addActionHref('update', 'Update')->setIcon('pencil');
     $grid->addActionEvent('delete', 'Delete', $this->delete)->setIcon('trash-o')->setConfirm(function ($item) {
         return "Are you sure you want to delete {$item->name}?";
     });
 }
 protected function createComponentGridHorninaObrazok($name)
 {
     $grid = new Grid($this, $name);
     $grid->translator->lang = 'sk';
     $grid->filterRenderType = Filter::RENDER_INNER;
     $grid->setModel($this->horninaObrazokRepository->findAll());
     $grid->addColumnText('nazov', 'nazov');
     $grid->addColumnText('popis', 'popis');
     $grid->addColumnText('nazovSuboru', 'Subor');
     $grid->addColumnText('idHornina', 'Hornina')->setColumn(function ($item) {
         return $item->hornina->nazov;
     });
     $grid->addActionHref('delete', 'Zmaz');
 }
Exemple #24
0
 protected function createComponentGridUle($name)
 {
     $grid = new Grid($this, $name);
     $grid->setModel($this->ul->findAll());
     $grid->addColumnText('nazov', 'Názov úľa');
     $grid->addColumnText('idCiselnikTypUla', 'typ ula')->setColumn(function ($item) {
         return $item->ciselnikTypUla->nazov;
     });
     $grid->addActionHref('detail', 'Detail');
     $grid->addActionHref('delete', 'Zmaz');
 }
Exemple #25
0
 public function createComponentUsersGrid($name)
 {
     $groupId = $this->getParameter('groupId');
     $grid = new Grid($this, $name);
     $grid->setModel($this->userModel->findAll($groupId));
     $grid->addColumnText('username', 'Užívateľ')->setSortable()->setFilterText();
     $grid->addColumnText('email', 'Email-ová adresa')->setSortable()->setFilterText();
     $grid->addColumnNumber('last_login', 'Posledné prihlásenie')->setSortable();
     $grid->filterRenderType = $this->filterRenderType;
     $grid->hasActions(false);
 }
Exemple #26
0
 /**
  * @return \Grido\Grid
  */
 protected function createComponentTable()
 {
     $table = new Grid();
     $table->setModel(new ArraySource($this->getFiles()));
     $table->addColumnText('id', 'Link')->setSortable()->getCellPrototype()->width = '70%';
     $table->addColumnDate('date', 'Date', 'Y.m.d H:i:s')->setSortable()->getCellPrototype()->width = '30%';
     $event = $table->addActionEvent('show', 'Show');
     $event->onClick[] = $this->handleShow;
     $event = $table->addActionEvent('delete', 'Delete');
     $event->getElementPrototype()->class[] = 'ajax';
     $event->onClick[] = $this->handleDelete;
     $event->setConfirm(function () {
         return 'Really delete?';
     });
     return $table;
 }
 protected function createComponentGridHornina($name)
 {
     $grid = new Grid($this, $name);
     $grid->translator->lang = 'sk';
     $grid->filterRenderType = Filter::RENDER_INNER;
     $grid->setModel($this->horninaRepository->findAll());
     $grid->addColumnText('nazov', 'nazov');
     $grid->addColumnText('idCiselnikSkupina', 'Skupina')->setColumn(function ($item) {
         return $item->ciselnikSkupina->nazov;
     });
     $grid->addColumnText('idCiselnikFarba', 'Farba')->setColumn(function ($item) {
         return $item->ciselnikFarba->nazov;
     });
     $grid->addColumnText('idCiselnikPodskupina', 'Podskupina')->setColumn(function ($item) {
         return $item->ciselnikPodskupina->nazov;
     });
     $grid->addActionHref('edit', 'Detail');
 }
 protected function createComponentSearchGrid($name)
 {
     if ($this->groupsOutput) {
         $grid = new Grid($this, $name);
         $grid->setModel($this->groupsOutput);
         $grid->setPrimaryKey('id');
         $grid->addColumnText('name', 'Názov')->setSortable();
         $grid->addColumnText('desc', 'Popis')->setSortable();
         $grid->addColumnNumber('pocet', 'Počet ľudí')->setSortable();
         //            $operation = array('join' => 'Pripojiť sa', 'leave' => 'Odísť');
         //            $grid->setOperation($operation, $this->handleOperations)
         //                ->setConfirm('delete', 'Are you sure you want to delete %i items?');
         $grid->filterRenderType = $this->filterRenderType;
     }
 }
Exemple #29
0
 /**
  * @param  string $message
  * @return string
  */
 protected function translate($message)
 {
     return call_user_func_array(array($this->grid->getTranslator(), "translate"), func_get_args());
 }
Exemple #30
0
 protected function createComponentSongList($name)
 {
     $grid = new Grido\Grid($this, $name);
     $grid->setModel($this->songy);
     $grid->addColumnDate("datum", "Datum", "d.m.y")->setSortable();
     $grid->addColumnText("interpret_name", "Interpret")->setCustomRender(function ($item) {
         $template = $this->createTemplate();
         $template->setFile(__DIR__ . "/../templates/components/Grid/interpret.latte");
         $template->song = $item;
         return $template;
     })->setSortable()->setFilterText()->setSuggestion();
     $grid->addColumnText("name", "Song")->setCustomRender(function ($item) {
         $template = $this->createTemplate();
         $template->setFile(__DIR__ . "/../templates/components/Grid/song.latte");
         $template->song = $item;
         return $template;
     })->setSortable()->setFilterText()->setSuggestion();
     $filter = array('' => 'Všechny');
     $filter = \Nette\Utils\Arrays::mergeTree($filter, $this->zanry->getList());
     $grid->addColumnText("zanr_id", "Žánr")->setCustomRender(function ($item) {
         return $item->zanr ? $item->zanr->name : null;
     })->setFilterSelect($filter);
     $grid->addColumnText("zadatel", "Přidal(a)")->setCustomRender(function ($item) {
         $template = $this->createTemplate();
         $template->setFile(__DIR__ . "/../templates/components/Grid/zadatel.latte");
         $template->song = $item;
         return $template;
     })->setSortable()->setFilterText()->setSuggestion();
     $statuses = array('' => 'Všechny', 'approved' => 'Zařazené', 'rejected' => 'Vyřazené', 'waiting' => 'Čekající');
     $grid->addColumnText("status", "Status")->setCustomRender(function ($item) {
         $status = $item->status;
         $revizor = $item->revisor ? $item->ref("user", "revisor")->username : "******";
         switch ($status) {
             case "approved":
                 return Html::el("span", array("class" => "label label-success", "title" => "Schválil(a) " . $revizor))->setText("Zařazen");
             case "waiting":
                 return Html::el("span", array("class" => "label label-warning", "title" => "Čeká ve frontě ke schválení"))->setText("Čeká");
             case "rejected":
                 return Html::el("span", array("class" => "label label-danger", "title" => "Zamítl(a) " . $revizor))->setText("Vyřazen");
             default:
                 return Html::el("i")->setText("Neznámý");
         }
     })->setSortable()->setFilterSelect($statuses);
     $grid->addColumnText("vzkaz", "Vzkaz DJovi")->setCustomRender(function ($item) {
         $elm = Html::el("span");
         if ($item->private_vzkaz) {
             if (!$this->user->isAllowed("privateMsg", "view") && $this->user->id != $item->user_id) {
                 $elm->addAttributes(array("class" => "msg-hidden", "title" => "Tento vzkaz je určen pouze pro DJe"));
                 $elm->setText("Soukromý vzkaz");
                 return $elm;
             }
             $elm->addAttributes(array("class" => "msg-private", "title" => "Tento vzkaz je určen pouze pro DJe"));
             $elm->setText($item->vzkaz);
         } else {
             return $item->vzkaz;
         }
         return $elm;
     });
     $myLikes = $this->songList->getMyLikes($this->user);
     $grid->addColumnText("likes", "")->setCustomRender(function ($item) use($myLikes) {
         $likes = count($item->related('song_likes'));
         $isLiked = isset($myLikes[$item->id]) ?: false;
         $el = Html::el('a')->addAttributes(['class' => 'like' . ($isLiked ? ' liked' : '')]);
         $el->add(Html::el('i')->addAttributes(['class' => 'glyphicon glyphicon-heart']));
         $el->add(Html::el()->setText(' ' . $likes));
         $el->href($this->link('like!', ['id' => $item->id]));
         return $el;
     });
     if ($this->user->isAllowed("song", "approve")) {
         $grid->addActionHref("approve", "")->setIcon("ok")->setElementPrototype(Html::el("a", array("class" => "btn btn-success", "data-toggle" => "modal", "data-target" => ".modal")));
     }
     if ($this->user->isAllowed("song", "reject")) {
         $grid->addActionHref("reject", "")->setIcon("remove")->setElementPrototype(Html::el("a", array("class" => "btn btn-danger", "data-toggle" => "modal", "data-target" => ".modal")));
     }
     if ($this->user->isAllowed("song", "play")) {
         $grid->addActionHref("play", "")->setDisable(function ($item) {
             if ($item->link) {
                 return false;
             }
             return true;
         })->setIcon("play")->setElementPrototype(Html::el("a", array("class" => "btn btn-info", "data-toggle" => "modal", "data-target" => ".modal")));
     }
     if ($this->user->isAllowed("song", "edit")) {
         $grid->addActionHref("edit", "", "admin:song:editor")->setIcon("pencil")->setElementPrototype(Html::el("a", array("class" => "btn btn-default", "target" => "_blank")));
     }
     $grid->setFilterRenderType(\Grido\Components\Filters\Filter::RENDER_OUTER);
     $grid->setDefaultSort(array("datum" => "DESC"));
     //Set face for grid
     $gridTemplate = __DIR__ . "/../templates/components/Grid.latte";
     if (file_exists($gridTemplate)) {
         $grid->setTemplateFile($gridTemplate);
     }
     return $grid;
 }