diff --git a/src/EventSubscriber/MenuSubscriber.php b/src/EventSubscriber/MenuSubscriber.php index 13f8d8ce..186f3c96 100644 --- a/src/EventSubscriber/MenuSubscriber.php +++ b/src/EventSubscriber/MenuSubscriber.php @@ -69,13 +69,13 @@ class MenuSubscriber implements EventSubscriberInterface if ($auth->isGranted('view_own_timesheet')) { $menu->addItem( - new MenuItemModel('timesheet', 'menu.timesheet', 'timesheet', [], 'far fa-clock') + new MenuItemModel('timesheet', 'menu.timesheet', 'timesheet', [], 'fas fa-clock') ); } if ($auth->isGranted('view_invoice')) { $menu->addItem( - new MenuItemModel('invoice', 'menu.invoice', 'invoice', [], 'far fa-file-alt') + new MenuItemModel('invoice', 'menu.invoice', 'invoice', [], 'fas fa-file-invoice') ); } diff --git a/src/Twig/DatatableExtensions.php b/src/Twig/DatatableExtensions.php new file mode 100644 index 00000000..1af42e0b --- /dev/null +++ b/src/Twig/DatatableExtensions.php @@ -0,0 +1,98 @@ +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 + * @return bool + */ + public function isColumnVisible(string $dataTable, string $column) + { + // 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 true; + } + + if (isset($values[$column]) && $values[$column] === false) { + return false; + } + + return true; + } +} diff --git a/src/Twig/Extensions.php b/src/Twig/Extensions.php index b7df3cb2..0ec9667c 100644 --- a/src/Twig/Extensions.php +++ b/src/Twig/Extensions.php @@ -14,7 +14,6 @@ use App\Entity\Timesheet; use App\Utils\Duration; use App\Utils\LocaleSettings; use NumberFormatter; -use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Intl\Intl; use Twig\Extension\AbstractExtension; use Twig\TwigFilter; @@ -29,17 +28,14 @@ class Extensions extends AbstractExtension * @var LocaleSettings */ protected $localeSettings; - /** * @var string */ protected $locale; - /** * @var Duration */ protected $durationFormatter; - /** * @var NumberFormatter */ @@ -49,16 +45,6 @@ class Extensions extends AbstractExtension */ protected $moneyFormatter; - /** - * @var RequestStack - */ - protected $requestStack; - - /** - * @var array - */ - protected $cookies = []; - /** * @var string[] */ @@ -88,7 +74,7 @@ class Extensions extends AbstractExtension 'start-small' => 'fas fa-play-circle', 'stop' => 'fas fa-stop', 'stop-small' => 'far fa-stop-circle', - 'timesheet' => 'far fa-clock', + 'timesheet' => 'fas fa-clock', 'trash' => 'far fa-trash-alt', 'user' => 'fas fa-user', 'visibility' => 'far fa-eye', @@ -110,12 +96,10 @@ class Extensions extends AbstractExtension ]; /** - * @param RequestStack $requestStack * @param LocaleSettings $localeSettings */ - public function __construct(RequestStack $requestStack, LocaleSettings $localeSettings) + public function __construct(LocaleSettings $localeSettings) { - $this->requestStack = $requestStack; $this->localeSettings = $localeSettings; $this->durationFormatter = new Duration(); } @@ -142,8 +126,6 @@ class Extensions extends AbstractExtension { return [ new TwigFunction('locales', [$this, 'getLocales']), - new TwigFunction('is_visible_column', [$this, 'isColumnVisible']), - new TwigFunction('is_datatable_configured', [$this, 'isDatatableConfigured']), new TwigFunction('class_name', [$this, 'getClassName']), ]; } @@ -161,61 +143,6 @@ class Extensions extends AbstractExtension return get_class($object); } - /** - * @param string $dataTable - * @param string $size - * @return bool - */ - public function isDatatableConfigured(string $dataTable, string $size) - { - $cookie = $this->getVisibilityCookieName($dataTable, $size); - - return $this->requestStack->getCurrentRequest()->cookies->has($cookie); - } - - /** - * @param string $dataTable - * @param string $size - * @return string - */ - public function getVisibilityCookieName(string $dataTable, string $size) - { - return $dataTable . '_visibility' . $size; - } - - /** - * This is only for datatables, do not use it outside this context. - * - * @param string $dataTable - * @param string $column - * @param string $size - * @return bool - */ - public function isColumnVisible(string $dataTable, string $column, string $size) - { - // name handling is spread between here and datatables.html.twig (data_table_column_modal) - $cookie = $this->getVisibilityCookieName($dataTable, $size); - - 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 true; - } - - if (isset($values[$column]) && $values[$column] === false) { - return false; - } - - return true; - } - /** * Transforms seconds into a duration string. * diff --git a/src/Twig/TitleExtension.php b/src/Twig/TitleExtension.php new file mode 100644 index 00000000..d0aa9c57 --- /dev/null +++ b/src/Twig/TitleExtension.php @@ -0,0 +1,57 @@ +translator = $translator; + } + + /** + * {@inheritdoc} + */ + public function getFunctions() + { + return [ + new TwigFunction('get_title', [$this, 'generateTitle']), + ]; + } + + /** + * @param null|string $prefix + * @param string $delimiter + * @return string + */ + public function generateTitle(?string $prefix = null, string $delimiter = ' – ') + { + return ($prefix ?? '') . 'Kimai' . $delimiter . $this->translator->trans('time_tracking', [], 'messages'); + } +} diff --git a/templates/base.html.twig b/templates/base.html.twig index 67478b6a..b0a394b1 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -32,7 +32,7 @@ {% endblock %} {% block title %} - {{ 'browser.title'|trans }} + {{- get_title() -}} {% endblock %} {% block page_subtitle %}{% endblock %} diff --git a/templates/bundles/FOSUserBundle/Registration/confirmed.html.twig b/templates/bundles/FOSUserBundle/Registration/confirmed.html.twig index a63f131d..8b611193 100644 --- a/templates/bundles/FOSUserBundle/Registration/confirmed.html.twig +++ b/templates/bundles/FOSUserBundle/Registration/confirmed.html.twig @@ -1,7 +1,7 @@ {% extends '@AdminLTE/FOSUserBundle/Registration/confirmed.html.twig' %} {% block logo_login %}{% include 'partials/logo_login.html.twig' %}{% endblock %} -{% block title %}{{ 'browser.title'|trans }}{% endblock %} +{% block title %}{{- get_title() -}}{% endblock %} {% block head %} {{ parent() }} diff --git a/templates/bundles/FOSUserBundle/Registration/register.html.twig b/templates/bundles/FOSUserBundle/Registration/register.html.twig index 74deca46..b80e04a2 100644 --- a/templates/bundles/FOSUserBundle/Registration/register.html.twig +++ b/templates/bundles/FOSUserBundle/Registration/register.html.twig @@ -1,7 +1,7 @@ {% extends '@AdminLTE/FOSUserBundle/Registration/register.html.twig' %} {% block logo_login %}{% include 'partials/logo_login.html.twig' %}{% endblock %} -{% block title %}{{ 'browser.title'|trans }}{% endblock %} +{% block title %}{{- get_title() -}}{% endblock %} {% block head %} {{ parent() }} diff --git a/templates/bundles/FOSUserBundle/Resetting/request.html.twig b/templates/bundles/FOSUserBundle/Resetting/request.html.twig index e766ef08..baa6fe25 100644 --- a/templates/bundles/FOSUserBundle/Resetting/request.html.twig +++ b/templates/bundles/FOSUserBundle/Resetting/request.html.twig @@ -1,7 +1,7 @@ {% extends '@AdminLTE/FOSUserBundle/Resetting/request.html.twig' %} {% block logo_login %}{% include 'partials/logo_login.html.twig' %}{% endblock %} -{% block title %}{{ 'browser.title'|trans }}{% endblock %} +{% block title %}{{- get_title() -}}{% endblock %} {% block head %} {{ parent() }} diff --git a/templates/bundles/FOSUserBundle/Security/login.html.twig b/templates/bundles/FOSUserBundle/Security/login.html.twig index 2929aa77..5b36d83f 100644 --- a/templates/bundles/FOSUserBundle/Security/login.html.twig +++ b/templates/bundles/FOSUserBundle/Security/login.html.twig @@ -1,7 +1,7 @@ {% extends '@AdminLTE/FOSUserBundle/Security/login.html.twig' %} {% block logo_login %}{% include 'partials/logo_login.html.twig' %}{% endblock %} -{% block title %}{{ 'browser.title'|trans }}{% endblock %} +{% block title %}{{- get_title() -}}{% endblock %} {% block login_box_icon %} diff --git a/templates/bundles/FOSUserBundle/layout.html.twig b/templates/bundles/FOSUserBundle/layout.html.twig index 9b783c76..fa41c894 100644 --- a/templates/bundles/FOSUserBundle/layout.html.twig +++ b/templates/bundles/FOSUserBundle/layout.html.twig @@ -1,7 +1,7 @@ {% extends '@AdminLTE/FOSUserBundle/layout.html.twig' %} {% block logo_login %}{% include 'partials/logo_login.html.twig' %}{% endblock %} -{% block title %}{{ 'browser.title'|trans }}{% endblock %} +{% block title %}{{- get_title() -}}{% endblock %} {% block head %} {{ parent() }} diff --git a/templates/macros/datatables.html.twig b/templates/macros/datatables.html.twig index 7f4fa374..3e760347 100644 --- a/templates/macros/datatables.html.twig +++ b/templates/macros/datatables.html.twig @@ -12,7 +12,7 @@ {% for title, class in entries %} {% if 'alwaysVisible' not in class %}