Release 2.1.0 (#4321)
* fix deprecations * remove unused config * replace invalid annotation type with attribute * use AsDoctrineListener to fix deprecation * new ModifiedSubscriber to support custom logic and fix deprecation * removed inheritdoc comment * new ModifiedSubscriber to support custom logic and fix deprecation * cleanup event dispatcher interface * re-order annotation params * one more doctrine based deprecation * fix query to count active timesheets * link to "all times" to identify active timesheets * link icon instead of text * fix "skin" translation in wizard * use duration filter to show duration * added login link command and controller * bump tabler theme to 1.0 * added wizard to force password reset by user * allow to configure that new accounts need to reset their password * prevent uploading twig templates by default * bump composer packages * enable sandbox and basic security measures for custom twig templates for invoice and export * bump to symfony 6.3.5 * allow to export single user reports to excel * removed broken method to reload twig cache * added api parameter to fetch user collection fully serialized * allow to replace or append description via timesheet batch update * show api username above form
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
{{ column|date_weekday }}
|
||||
</th>
|
||||
{% endblock %}
|
||||
{% block upper_left %} {% endblock %}
|
||||
{% block column_classes_project -%}
|
||||
{% if column.date is weekend(user) %} weekend{% endif %}{% if column.date is today %} today{% endif %}
|
||||
{%- endblock %}
|
||||
|
||||
@@ -17,10 +17,12 @@
|
||||
<table class="table table-hover dataTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th>{% block upper_left %}{{ user.displayName }}{% endblock %}</th>
|
||||
<th class="text-center reportDataTypeTitle">{{ dataTypeTitle|trans }}</th>
|
||||
{% for column in period.dateTimes %}
|
||||
{% block period_name %}{% endblock %}
|
||||
{% block period_name %}
|
||||
<th>{{ column|date_short }}</th>
|
||||
{% endblock %}
|
||||
{% set columns = columns + 1 %}
|
||||
{% set dateKey = column|report_date %}
|
||||
{% set totalsDuration = totalsDuration|merge({(dateKey): 0}) %}
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
{{ widgets.username(user) }}
|
||||
{% endif %}
|
||||
{{ form_widget(form.sumType) }}
|
||||
{% from '@theme/components/buttons.html.twig' import submit_button %}
|
||||
{{ submit_button('download', {'attr': {'formaction': path(export_route)}, 'icon': 'download', 'combined': false}, 'primary') }}
|
||||
{% endblock %}
|
||||
|
||||
{% block report %}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
</a>
|
||||
</th>
|
||||
{% endblock %}
|
||||
{% block upper_left %} {% endblock %}
|
||||
{% block column_classes_project %}{% endblock %}
|
||||
{% block column_classes_activity %}{% endblock %}
|
||||
{% block column_classes_total %}{% endblock %}
|
||||
|
||||
8
templates/reporting/report_by_user_year_export.html.twig
Normal file
8
templates/reporting/report_by_user_year_export.html.twig
Normal file
@@ -0,0 +1,8 @@
|
||||
{% embed 'reporting/report_by_user_data.html.twig' %}
|
||||
{% block period_name %}
|
||||
<th>{{ column|month_name }} {{ column|date_format('Y') }}</th>
|
||||
{% endblock %}
|
||||
{% block column_classes_project %}{% endblock %}
|
||||
{% block column_classes_activity %}{% endblock %}
|
||||
{% block column_classes_total %}{% endblock %}
|
||||
{% endembed %}
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block login_form %}
|
||||
|
||||
<p>
|
||||
{{ 'resetting.check_email'|trans({'%tokenLifetime%': tokenLifetime})|nl2br }}
|
||||
{{ 'resetting.check_email'|trans({'%tokenLifetime%': tokenLifetime|duration})|nl2br }}
|
||||
</p>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@@ -22,7 +22,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="form-fieldset pb-0">
|
||||
<fieldset class="form-fieldset pb-0 h-100">
|
||||
{{ form_row(form.replaceDescription) }}
|
||||
{{ form_row(form.description) }}
|
||||
</fieldset>
|
||||
<fieldset class="form-fieldset pb-0 h-100">
|
||||
{{ form_row(form.replaceTags) }}
|
||||
{{ form_row(form.tags) }}
|
||||
</fieldset>
|
||||
|
||||
@@ -13,7 +13,11 @@
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="d-flex">
|
||||
{{ 'api_password.intro'|trans }}
|
||||
<div class="me-auto">
|
||||
<p>{{ 'api_password.intro'|trans }}</p>
|
||||
|
||||
<p>{{ 'username'|trans }}: {{ user.userIdentifier }}</p>
|
||||
</div>
|
||||
|
||||
<div class="ms-auto">
|
||||
<a class="btn btn-icon" target="_blank" href="{{ path('api.swagger_ui') }}" data-toggle="tooltip" title="Swagger API Docs">{{ icon('documentation', true) }}</a>
|
||||
|
||||
@@ -7,12 +7,14 @@
|
||||
<div class="card-body">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
{% if not url is empty %}<a href="{{ url }}">{% endif %}
|
||||
<span class="bg-{{ options.color|default('green') }} text-white avatar">
|
||||
<i class="{{ options.icon|icon(true, options.icon) }}"></i>
|
||||
</span>
|
||||
{% if not url is empty %}</a>{% endif %}
|
||||
</div>
|
||||
<div class="col">
|
||||
{% if not url is empty %}<a href="{{ url }}">{% endif %}
|
||||
|
||||
<div class="font-weight-medium">
|
||||
{{ title|trans }}
|
||||
</div>
|
||||
@@ -21,7 +23,6 @@
|
||||
{{ data }}
|
||||
{% endblock %}
|
||||
</div>
|
||||
{% if not url is empty %}</a>{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -20,11 +20,13 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block wizard_progress_bar %}
|
||||
{{ progress_bar({current: percent, max: 100, min: 0}) }}
|
||||
{% if percent is defined and percent is not null %}
|
||||
{{ progress_bar({current: percent, max: 100, min: 0}) }}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block wizard_previous_button %}
|
||||
{% if previous is defined %}
|
||||
{% if previous is defined and previous is not null %}
|
||||
{{ button(false, { title : 'Previous'|trans({}, 'TablerBundle'), combined: true, url: path('wizard', {'wizard': previous}) }, 'link') }}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -33,7 +35,7 @@
|
||||
{% if form is defined %}
|
||||
{{ submit_button(false, { title : 'Next'|trans({}, 'TablerBundle'), combined: true }, 'primary') }}
|
||||
{% else %}
|
||||
{% if next is defined %}
|
||||
{% if next is defined and next is not null %}
|
||||
{{ button(false, { title : 'Next'|trans({}, 'TablerBundle'), combined: true, url: path('wizard', {'wizard': next}) }, 'primary') }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
14
templates/wizard/password.html.twig
Normal file
14
templates/wizard/password.html.twig
Normal file
@@ -0,0 +1,14 @@
|
||||
{% extends 'wizard/layout.html.twig' %}
|
||||
|
||||
{% block wizard_content %}
|
||||
<div class="card-body text-center py-4 p-sm-6">
|
||||
<h1 class="mt-2">{{ 'wizard.password.title'|trans({}, 'wizard') }}</h1>
|
||||
<p class="text-body-secondary">{{ 'wizard.password.description'|trans({}, 'wizard') }}</p>
|
||||
</div>
|
||||
<div class="hr-text hr-text-center hr-text-spaceless">{{ 'wizard.separator'|trans({}, 'wizard') }}</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
{{ form_rest(form) }}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user