121 lines
3.1 KiB
PHP
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;
|
|
}
|
|
}
|