0
0
mirror of https://github.com/kevinpapst/kimai2.git synced 2024-10-31 06:08:11 +00:00
kevinpapst_kimai2/templates/calendar/user.html.twig
2023-09-17 22:32:01 +02:00

219 lines
11 KiB
Twig

{% extends 'base.html.twig' %}
{% import "macros/widgets.html.twig" as widgets %}
{% block main %}
<div class="row">
{% set hasTwoColumns = (config.dragDropAmount > 0 and dragAndDrop is not empty and (dragAndDrop|filter(s => s.entries|length > 0)|length > 0)) or form is not null %}
{% if hasTwoColumns %}
<div class="col-md-4 col-lg-3 d-none d-md-block order-last">
{% if form is not null %}
{% embed '@theme/embeds/card.html.twig' %}
{% block box_body %}
{{ form_start(form) }}
{% if form.user is defined %}
{{ form_row(form.user) }}
{% endif %}
{{ form_rest(form) }}
{{ form_end(form) }}
{% endblock %}
{% endembed %}
{% endif %}
{% for source in dragAndDrop|filter(s => s.entries|length > 0) %}
{% embed '@theme/embeds/card.html.twig' %}
{% block box_title %}{{ source.title|trans({}, source.translationDomain) }}{% endblock %}
{% block box_body_class %}drag-and-drop-source p-0{% endblock %}
{% block box_body %}
<div class="list-group list-group-flush external-events" data-method="{{ source.method }}" data-route="{{ path(source.route, source.routeParams) }}" data-route-replacer="{{ source.routeReplacer|json_encode|e('html_attr') }}">
{% for entry in source.entries|slice(0, config.dragDropAmount) %}
<div class="p-1 ps-2 list-group-item external-event draggable" data-entry="{{ entry.data|json_encode|e('html_attr') }}"{% if entry.project is not null %} data-toggle="tooltip" title="{{ entry.project.customer.name }}"{% endif %}>
<div class="row align-items-center">
<div class="col text-truncate">
{% if source.blockInclude is not null and entry.blockName is not null and block(entry.blockName, source.blockInclude) is defined %}
{{ block(entry.blockName, source.blockInclude) }}
{% else %}
<span class="d-block text-body-secondary text-truncate mt-n1">{{ entry.title }}</span>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}
{% endembed %}
{% endfor %}
</div>
{% endif %}
<div class="col-xs-12 {% if hasTwoColumns %}col-md-8 col-lg-9 col-print-12{% endif %}">
{% embed '@theme/embeds/card.html.twig' %}
{% block box_body_class %}p-0{% endblock %}
{% block box_body %}
<div id="timesheet_calendar"></div>
{% endblock %}
{% endembed %}
</div>
</div>
{% endblock %}
{% block stylesheets %}
{{ parent() }}
{{ encore_entry_link_tags('calendar') }}
{% endblock %}
{% block head %}
{{ parent() }}
{{ encore_entry_script_tags('calendar') }}
{% endblock %}
{% block javascripts %}
{% set calendarSelector = 'timesheet_calendar' %}
{% set createParams = '' %}
{% set createRoute = 'timesheet_create' %}
{% set editRoute = 'timesheet_edit' %}
{% set canCreate = is_granted('create_own_timesheet') %}
{% set canEdit = is_granted('edit_own_timesheet') %}
{% set canEditExported = is_granted('edit_exported_timesheet') %}
{% set isForeignEdit = false %}
{% if user != app.user %}
{% set isForeignEdit = true %}
{% set createParams = 'user=' ~ user.id ~ '&' %}
{% set createRoute = 'admin_timesheet_create' %}
{% set editRoute = 'admin_timesheet_edit' %}
{% set canCreate = is_granted('create_other_timesheet') %}
{% set canEdit = is_granted('edit_other_timesheet') %}
{% endif %}
{{ parent() }}
<script>
{# using var, so it can be re-used in the different scopes #}
var calendar = null;
const reloader = function() { calendar.reloadEvents(); };
document.addEventListener('kimai.timesheetUpdate', reloader);
document.addEventListener('kimai.timesheetDelete', reloader);
document.addEventListener('kimai.initialized', function(event) {
const kimai = event.detail.kimai;
let calendarOptions = {
dragdrop: {
container: '.external-events',
items: '.external-event',
},
initialView: '{{ app.user.getPreferenceValue('calendar_initial_view') }}',
translations: {
customer: '{{ 'customer'|trans }}',
project: '{{ 'project'|trans }}',
activity: '{{ 'activity'|trans }}',
},
permissions: {
edit: {% if canEdit %}true{% else %}false{% endif %},
edit_exported: {% if canEditExported %}true{% else %}false{% endif %},
create: {% if canCreate %}true{% else %}false{% endif %},
edit_begin: {% if can_edit_begin %}true{% else %}false{% endif %},
edit_end: {% if can_edit_end %}true{% else %}false{% endif %},
edit_duration: {% if can_edit_duration %}true{% else %}false{% endif %},
punch: {% if is_punch_mode %}true{% else %}false{% endif %},
},
icons: {
next: '{{ 'right'|icon(true) }}',
previous: '{{ 'left'|icon(true) }}',
nextYear: '{{ 'right2'|icon(true) }}',
previousYear: '{{ 'left2'|icon(true) }}',
},
{% if google is not null %}
googleCalendarApiKey: '{{ google.apiKey }}',
{% endif %}
patterns: {
title: '{{ config.entryTitlePattern }}',
},
defaultStartTime: {% if defaultStartTime is null %}null{% else %}'{{ defaultStartTime }}'{% endif %},
now: '{{ now|date_format('c') }}',
{# see https://github.com/kimai/kimai/issues/2155 #}
timezone: '{{ app.user.timezone == 'UTC' ? 'GMT' : app.user.timezone }}',
eventSources: [
{
id: 'kimaiUserTimeSource',
type: 'timesheet',
url: '{{ path('get_timesheets', {'user': user.id, 'size': 1000, 'full': 'true', 'begin': '__FROM__', 'end': '__TO__'})|raw }}',
options: {
color: '{{ config('theme.calendar.background_color') }}',
},
}
{% if google is not null %}
{% for source in google.sources %}
,
{
id: 'googleCompanyCalendar{{ loop.index }}',
type: '{{ source.typeName }}',
options: {
googleCalendarId: '{{ source.uri }}',
name: '{{ source.id }}',
color: '{{ source.color }}',
textColor: '{{ source.color|font_contrast }}',
}
}
{% endfor %}
{% endif %}
{% for source in sources %}
,
{
id: '{{ source.id }}{{ loop.index }}',
type: '{{ source.typeName }}',
url: '{{ source.uri|raw }}',
options: {...{{ source.options|json_encode|raw }}, ...{
color: '{{ source.color }}',
textColor: '{{ source.color|font_contrast }}',
}}
}
{% endfor %}
],
url: {
update: (timesheetId) => {
return '{{ path('patch_timesheet', {id: 1}) }}'.replace('1', timesheetId);
},
create: (start, end) => {
let createUrl = '{{ path(createRoute) }}' + '?{{ createParams|raw }}';
if (end !== undefined) {
createUrl += 'from=' + start + '&to=' + end;
} else {
createUrl += 'begin=' + start;
}
return createUrl;
},
edit: (timesheetId) => {
return '{{ path(editRoute, {id: '-XX-'}) }}'.replace('-XX-', timesheetId);
},
actions: (timesheetId) => {
return '{{ path('get_timesheet_actions', {id: 1, 'view': 'calendar', 'locale': (app.request.locale)}) }}'.replace('1', timesheetId);
},
},
preparePayloadForUpdate: (data) => {
{% if isForeignEdit %}
data.user = {{ user.id }};
{% endif %}
return data;
},
};
calendar = new KimaiCalendar(
kimai,
document.getElementById('{{ calendarSelector }}'),
Object.assign({}, calendarOptions, {{ config|json_encode|raw }})
);
calendar.render();
document.querySelector('.fc-today-button').classList.remove('btn-icon');
document.querySelector('.fc-header-toolbar').classList.toggle('row');
document.querySelector('.fc-header-toolbar').classList.add('p-3');
const toolbar = document.querySelectorAll('.fc-header-toolbar .fc-toolbar-chunk');
toolbar[0].parentElement.classList.add('p-3');
toolbar[0].classList.add('col-md-4', 'col-6', 'mb-1', 'text-start', 'order-xs-1');
toolbar[1].classList.add('col-md-4', 'col-12', 'mb-1', 'text-center', 'order-3');
toolbar[2].classList.add('col-md-4', 'col-6', 'mb-1', 'text-end', 'order-md-4', 'order-xs-2');
KimaiReloadPageWidget.create('kimai.systemConfigUpdate', true);
});
</script>
{% endblock %}