Edit file File name : stats.html.twig Content :{% extends 'user/layout.html.twig' %} {% import "macros/widgets.html.twig" as widgets %} {% import "macros/charts.html.twig" as charts %} {% block stylesheets %} {{ parent() }} {{ encore_entry_link_tags('chart') }} {% endblock %} {% block head %} {{ parent() }} {{ encore_entry_script_tags('chart') }} {% endblock %} {% block profile_navbar %} {{ _self.about_me(user, stats, firstTimesheet) }} {% endblock %} {% block profile_intro %}{% endblock %} {% block profile_content %} {{ _self.profile_box_horizontal(user, stats) }} {% if workMonths is empty %} {{ widgets.nothing_found() }} {% endif %} {% set monthRoute = null %} {% set canSeeReport = user.enabled and is_granted('view_reporting') and (app.user.id == user.id or is_granted('view_other_timesheet')) %} {%- if canSeeReport -%} {% set monthRoute = path('report_user_month', {'user': user.id, 'date': '__MONTH__'}) %} {% endif %} {{ charts.bar_javascript({'footer': 'footer', 'label': 'tooltip', 'onclick': {'url': monthRoute, 'replacer': {'__MONTH__': 'month'}}}) }} {% for year in workMonths.years|reverse %} {% embed '@AdminLTE/Widgets/box-widget.html.twig' %} {% import "macros/charts.html.twig" as charts %} {% block box_title %}{{ year }}{% endblock %} {% block box_tools %} {%- if canSeeReport -%} <a class="btn btn-default btn-sm" href="{{ path('report_user_year', {'user': user.id, 'date': year ~ '-01-01'}) }}"><i class="{{ 'reporting'|icon }}"></i></a> {% endif %} {% endblock %} {% block box_body %} {% set dataset = [] %} {% for month in workMonths.year(year) %} {% set monthDate = create_date(year ~ '-' ~ month.date.format('m') ~ '-01') %} {% set dataset = dataset|merge([{'value': month.duration|chart_duration, 'tooltip': month.duration|duration, 'footer': ('label.billable'|trans ~ ': ' ~ month.billableDuration|duration), 'month': monthDate|report_date}]) %} {% endfor %} {{ charts.bar_chart('userProfileChart'~year, month_names(), [dataset], {}) }} {% endblock %} {% endembed %} {% endfor %} {% if user.teams is not empty and (is_granted('teams', user) or is_granted('view_team_member', user)) %} {% embed '@AdminLTE/Widgets/box-widget.html.twig' %} {% import "macros/widgets.html.twig" as widgets %} {% block box_title %}{{ 'label.my_teams'|trans }}{% endblock %} {% block box_body %} {{ widgets.team_list(user.teams) }} {% endblock %} {% endembed %} {% endif %} {% endblock %} {% block javascripts %} {{ parent() }} <script type="text/javascript"> document.addEventListener('kimai.initialized', function() { KimaiReloadPageWidget.create('kimai.teamUpdate', true); }); </script> {% endblock %} {% macro about_me(user, stats, firstTimesheet) %} {% embed '@AdminLTE/Widgets/box-widget.html.twig' %} {% import "macros/widgets.html.twig" as widgets %} {% block box_title %} <a href="mailto:{{ user.email }}" title="{{ 'label.email'|trans }}">{{ widgets.icon('mail') }}</a> <span data-toggle="tooltip" title="{{ 'label.id'|trans }}: {{ user.id }}">{{ 'profile.about_me'|trans }}</span> {% endblock %} {% block box_body %} <p> <strong>{{ 'label.username'|trans }}</strong><br> {{ user.username }} </p> {% if user.accountNumber is not empty %} <p> <strong>{{ 'label.account_number'|trans }}</strong><br> {{ user.accountNumber }} </p> {% endif %} <p> <strong>{{ 'profile.first_entry'|trans }}</strong><br> {% if firstTimesheet is not null %} {{ firstTimesheet|date_short }} {% else %} – {% endif %} </p> <p> <strong>{{ 'profile.registration_date'|trans }}</strong><br> {{ user.registeredAt|date_short }} </p> {% if is_granted('hourly-rate', user) and user.preferenceValue('hourly_rate') is not null %} <p> <strong>{{ 'label.hourlyRate'|trans }}</strong><br> {{ user.preferenceValue('hourly_rate') }} </p> {% endif %} {% endblock %} {% endembed %} {% endmacro %} {% macro profile_box_horizontal(user, stats) %} {% import "@AdminLTE/Macros/default.html.twig" as macro %} {% import "macros/widgets.html.twig" as widgets %} {% set color = config('theme.chart.background_color') %} {% set event = trigger('user.profile_background', {'color': color, 'font': color|font_contrast, 'user': user, 'image': null}) %} {% set config = event.payload %} <div class="box box-widget widget-user box-user-profile"> <div class="widget-user-header" style="{% if config.image is not null %}background: url('{{ config.image }}') center center;{% else %}background-color: {{ config.color }}{% endif %}"> <h3 class="widget-user-username" style="color: {{ config.font }}"> {{ widgets.username(user) }} {% if user.displayName != user.username %} ({{ user.username }}) {% endif %} </h3> <h5 class="widget-user-desc" style="color: {{ config.font }}">{{ user.title }}</h5> </div> <div class="widget-user-image"> {{ widgets.user_avatar(user) }} </div> <div class="box-footer"> {% if stats is not null %} {% set seeOwnRate = is_granted('view_rate_own_timesheet') %} {% set columnLength = seeOwnRate ? 3 : 6 %} <div class="row"> <div class="col-sm-{{ columnLength }} border-right"> <div class="description-block"> <h5 class="description-header">{{ stats.durationThisMonth|duration }}</h5> <span class="description-text">{{ 'stats.durationMonth'|trans }}</span> </div> </div> {% if seeOwnRate %} <div class="col-sm-{{ columnLength }} border-right"> <div class="description-block"> <h5 class="description-header">{{ stats.rateThisMonthBillable|money }}</h5> <span class="description-text">{{ 'stats.amountMonth'|trans }}</span> </div> </div> {% endif %} <div class="col-sm-{{ columnLength }} border-right"> <div class="description-block"> <h5 class="description-header">{{ stats.durationTotal|duration }}</h5> <span class="description-text">{{ 'stats.durationTotal'|trans }}</span> </div> </div> {% if seeOwnRate %} <div class="col-sm-{{ columnLength }} border-right"> <div class="description-block"> <h5 class="description-header">{{ stats.rateTotalBillable|money }}</h5> <span class="description-text">{{ 'stats.amountTotal'|trans }}</span> </div> </div> {% endif %} </div> {% endif %} </div> </div> {% endmacro %} Save