Files
kimai2/src/Twig/DatatableExtensions.php
2019-10-25 16:21:30 +02:00

121 lines
3.1 KiB
PHP

<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Twig;
use Symfony\Component\HttpFoundation\RequestStack;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class DatatableExtensions extends AbstractExtension
{
/**
* @var RequestStack
*/
protected $requestStack;
/**
* @var array
*/
protected $cookies = [];
/**
* @param RequestStack $requestStack
*/
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}
/**
* {@inheritdoc}
*/
public function getFunctions()
{
return [
new TwigFunction('is_visible_column', [$this, 'isColumnVisible']),
new TwigFunction('is_datatable_configured', [$this, 'isDatatableConfigured']),
];
}
/**
* @param string $dataTable
* @return bool
*/
public function isDatatableConfigured(string $dataTable)
{
$cookie = $this->getVisibilityCookieName($dataTable);
return $this->requestStack->getCurrentRequest()->cookies->has($cookie);
}
/**
* @param string $dataTable
* @return string
*/
protected function getVisibilityCookieName(string $dataTable)
{
return $dataTable . '_visibility';
}
/**
* This is only for datatables, do not use it outside this context.
*
* @param string $dataTable
* @param string $column
* @param array $columns
* @return bool
*/
public function isColumnVisible(string $dataTable, string $column, array $columns)
{
// name handling is spread between here and datatables.html.twig (data_table_column_modal)
$cookie = $this->getVisibilityCookieName($dataTable);
if (!isset($this->cookies[$cookie])) {
$visibility = false;
if ($this->requestStack->getCurrentRequest()->cookies->has($cookie)) {
$visibility = json_decode($this->requestStack->getCurrentRequest()->cookies->get($cookie), true);
}
$this->cookies[$cookie] = $visibility;
}
$values = $this->cookies[$cookie];
if (empty($values) || !is_array($values)) {
return $this->checkInColumDefinition($columns, $column);
}
if (!isset($values[$column])) {
return $this->checkInColumDefinition($columns, $column);
}
if ($values[$column] === false) {
return false;
}
return true;
}
private function checkInColumDefinition(array $columns, string $column)
{
if (array_key_exists($column, $columns)) {
$tmp = $columns[$column];
if (is_array($tmp)) {
$tmp = $tmp['class'];
}
foreach (explode(' ', $tmp) as $class) {
if ($class === 'hidden') {
return false;
}
}
}
return true;
}
}