Release 2.5.0 (#4454)

- added command to list users
- corrected wrong german translation
- work contract validations
- prevent error with missing params
- use collapsible, minor UI improvement
- added classes to target menu buttons in custom rules
- disable webpack notifier, incompatible with mac arm
- use explicit menu service to generate menu
- bump to fontawesome 6 and replace restart icon
- change repeat icon for recent activities
- moved user bookmarks (favorites) to top nav
- fix totp seconds window (leeway)
- new migration to fix remaining user preferences with dots in name
- remove duplicate named column in user screen
- unify and added translations
- added missing filter and tags to InvoiceSecurity
This commit is contained in:
Kevin Papst
2023-12-01 11:38:17 +01:00
committed by GitHub
parent 16d4a691f8
commit 02bcd45116
72 changed files with 922 additions and 562 deletions

View File

@@ -1,11 +1,7 @@
{% if is_granted('start_own_timesheet') %}
{% set class = "btn-outline-white" %}
{% if tabler_bundle.isDarkMode() or tabler_bundle.isNavbarOverlapping() %}
{% set class = "btn-dark" %}
{% endif %}
<div class="nav-item d-flex me-sm-3 me-1">
<a href="{{ path('favorites_timesheets') }}" class="btn btn-icon {{ class}} px-0 remote-modal-load" data-modal-title="{{ 'recent.activities'|trans }}" tabindex="-1" aria-label="{{ 'recent.activities'|trans }}">
{{ icon('repeat') }}
<div class="nav-item d-flex me-1 recent-activities">
<a href="{{ path('favorites_timesheets') }}" class="nav-link px-0 remote-modal-load recent-activities-btn" data-modal-title="{{ 'recent.activities'|trans }}" tabindex="-1" aria-label="{{ 'recent.activities'|trans }}">
{{ icon('repeat', true) }}
</a>
</div>
{% endif %}

View File

@@ -4,7 +4,7 @@
{# fake entry, because at least one html template node is needed #}
{% set active_timesheets = [{'id': '000', 'begin': null, 'activity': {'name': ''}, 'project': {'name': '', 'customer': {'name': ''}}}] %}
{% endif %}
<div class="nav-item d-flex me-sm-3 me-1">
<div class="nav-item d-flex me-1 ticktac">
<div class="btn-list">
{% set class = "btn-outline-white" %}
{% if tabler_bundle.isDarkMode() or tabler_bundle.isNavbarOverlapping() %}

View File

@@ -0,0 +1,36 @@
{% set user_shortcuts = user_shortcuts(app.user) %}
{% if user_shortcuts|length > 0 %}
<div class="nav-item dropdown d-flex me-1 user-shortcuts">
<a class="nav-link px-0 user-shortcuts-toggle" href="javascript:void(0);" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="true">
{{ icon('far fa-bookmark', true) }}
</a>
<div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow dropdown-menu-card" data-bs-popper="static">
<div class="card">
<div class="card-header text-nowrap">{{ 'favorite_routes'|trans }}</div>
<div class="card-body user-shortcuts-list scrollable-container p-0 pb-2">
<div class="row overflow-visible g-0">
{% for menu in user_shortcuts %}
{% if not loop.first and loop.index0 % 2 == 0 %}
</div>
<div class="row overflow-visible g-0">
{% endif %}
<div class="text-center pt-3 px-3 col">
<a href="{{ path(menu.route) }}" class="text-decoration-none">
<span class="user-shortcuts-icon rounded-circle mb-2">
<i class="{{ menu.icon|icon }} fs-2"></i>
</span>
</a>
<a href="{{ path(menu.route) }}" class="nav-link">
{{- menu.label|trans -}}
</a>
</div>
{% endfor %}
{% if user_shortcuts|length > 1 and user_shortcuts|length % 2 == 1 %}
<div class="pt-3 px-3 col"></div>
{% endif %}
</div>
</div>
</div>
</div>
</div>
{% endif %}