Next major version 2 with PHP 8.1, Symfony 6, Tabler UI, 2FA ... (#2902)
This commit is contained in:
@@ -3,8 +3,8 @@
|
||||
<link rel="icon" type="image/png" href="{{ asset('favicon-32x32.png') }}" sizes="32x32">
|
||||
<link rel="apple-touch-icon" href="{{ asset('apple-touch-icon.png') }}">
|
||||
<link rel="manifest" href="{{ asset('manifest.json') }}">
|
||||
<meta name="apple-mobile-web-app-title" content="Kimai 2">
|
||||
<meta name="apple-mobile-web-app-title" content="{{ constant('App\\Constants::SOFTWARE') }}">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="application-name" content="Kimai 2">
|
||||
<meta name="application-name" content="{{ constant('App\\Constants::SOFTWARE') }}">
|
||||
<meta name="msapplication-config" content="{{ asset('browserconfig.xml') }}">
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
{% if logo is not empty %}
|
||||
<img src="{{ logo }}" style="max-width: 300px;">
|
||||
{% elseif company is not empty %}
|
||||
<b>{{ company|raw }}</b>
|
||||
<p>{{ company }}</p>
|
||||
{% elseif tabler_bundle.getLogoUrl() is not empty %}
|
||||
<img alt="{{ get_title() }}" style="max-width: 150px;"
|
||||
src="{% if '://' in tabler_bundle.getLogoUrl() %}{{ tabler_bundle.getLogoUrl() }}{% else %}{{ asset(tabler_bundle.getLogoUrl()) }}{% endif %}">
|
||||
{% else %}
|
||||
{{- get_title('<b>', '</b><br>')|raw -}}
|
||||
<p>{{ get_title('', '<br>')|raw }}</p>
|
||||
{% endif %}
|
||||
|
||||
51
templates/partials/recent-activities.html.twig
Normal file
51
templates/partials/recent-activities.html.twig
Normal file
@@ -0,0 +1,51 @@
|
||||
{% if is_granted('start_own_timesheet') %}
|
||||
{% set favorites = favorite_timesheets(app.user) %}
|
||||
{% if favorites|length > 0 %}
|
||||
{% from 'macros/widgets.html.twig' import label_customer, label_project, label_activity %}
|
||||
{% set class = "btn-outline-white" %}
|
||||
{% if tabler_bundle.isDarkMode() or tabler_bundle.isNavbarOverlapping() %}
|
||||
{% set class = "btn-dark" %}
|
||||
{% endif %}
|
||||
<div class="nav-item dropdown d-none d-md-flex me-3 notifications-menu" data-reload="{{ path('favorites_timesheets') }}">
|
||||
<a href="#" class="btn btn-icon {{ class}} px-0" data-bs-toggle="dropdown" tabindex="-1" aria-label="{{ 'recent.activities'|trans }}">
|
||||
{{ icon('repeat') }}
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-end dropdown-menu-card">
|
||||
<div class="card">
|
||||
<div class="card-header">{{ 'recent.activities'|trans }}</div>
|
||||
<div class="list-group list-group-flush list-group-hoverable menu">
|
||||
{% for favorite in favorites %}
|
||||
{% set entry = favorite.getTimesheet() %}
|
||||
<div class="list-group-item">
|
||||
<div class="row align-items-center">
|
||||
<div class="col text-truncate" >
|
||||
<a class="api-link text-decoration-none text-body d-block"
|
||||
href="{{ path('restart_timesheet', {'id': entry.id}) }}" data-event="kimai.timesheetStart kimai.timesheetUpdate" data-method="PATCH" data-msg-error="timesheet.start.error"
|
||||
data-msg-success="timesheet.start.success">
|
||||
{{ label_activity(entry.activity) }}
|
||||
<div class="d-block text-truncate mt-n1">
|
||||
{{ label_project(entry.project) }}
|
||||
{{ label_customer(entry.project.customer) }}
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
{% if favorite.isFavorite() %}
|
||||
<a href="{{ path('favorites_timesheets_remove', {'id': favorite.timesheet.id}) }}" class="list-group-item-actions show">
|
||||
<i class="text-yellow {{ 'bookmarked'|icon }}"></i>
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="{{ path('favorites_timesheets_add', {'id': favorite.timesheet.id}) }}" class="list-group-item-actions">
|
||||
<i class="{{ 'bookmark'|icon }}"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
27
templates/partials/ticktack.html.twig
Normal file
27
templates/partials/ticktack.html.twig
Normal file
@@ -0,0 +1,27 @@
|
||||
{% set active_timesheets = active_timesheets(app.user) %}
|
||||
{% set hasActiveRecords = active_timesheets is not empty %}
|
||||
{% if not hasActiveRecords %}
|
||||
{# 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-3">
|
||||
<div class="btn-list">
|
||||
{% set class = "btn-outline-white" %}
|
||||
{% if tabler_bundle.isDarkMode() or tabler_bundle.isNavbarOverlapping() %}
|
||||
{% set class = "btn-dark" %}
|
||||
{% endif %}
|
||||
{% set entry = active_timesheets[0] %}
|
||||
<div class="messages-menu" data-api="{{ path('active_timesheet') }}" data-href="{{ path('stop_timesheet', {'id' : '000'}) }}" style="{% if not hasActiveRecords %}display:none{% endif %}">
|
||||
<a data-replacer="url" class="api-link ticktac-running ticktac-stop btn {{ class }}" href="{{ path('stop_timesheet', {'id' : entry.id}) }}" data-event="kimai.timesheetStop kimai.timesheetUpdate" data-method="PATCH" data-msg-error="timesheet.stop.error" data-msg-success="timesheet.stop.success"{% if hasActiveRecords %} accesskey="s"{% endif %}>
|
||||
<i class="icon text-red {{ 'stop-small'|icon(true) }}"></i>
|
||||
<span data-replacer="duration" data-title="true" data-since="{{ entry.begin is null ? '' : entry.begin|date_format(constant('DATE_ISO8601')) }}">{{ entry is iterable ? 0|duration : entry|duration }}</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="messages-menu-empty" style="{% if hasActiveRecords %}display:none{% endif %}">
|
||||
<a href="{{ path('timesheet_create') }}" class="modal-ajax-form ticktac-start btn {{ class }}" accesskey="n">
|
||||
<i class="icon text-green {{ 'start'|icon(true) }}"></i>
|
||||
<span>{{ 0|duration }}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user