0
0
Fork 0
mirror of https://github.com/kevinpapst/kimai2.git synced 2025-01-10 19:47:35 +00:00
kevinpapst_kimai2/templates/form/blocks.html.twig
2024-11-25 20:46:34 +01:00

453 lines
21 KiB
Twig

{# added for the team project form, to show divider for the customer name between all projects #}
{% block choice_widget_expanded -%}
{%- if '-inline' in label_attr.class|default('') -%}
{%- for child in form %}
{{- form_widget(child, {
parent_label_class: label_attr.class|default(''),
translation_domain: choice_translation_domain,
}) -}}
{% endfor -%}
{%- else -%}
<div {{ block('widget_container_attributes') }}>
{% if form.vars.choices|length != form.children|length %}
{% for name, choices in form.vars.choices %}
<fieldset class="form-fieldset">
<legend>{{ name }}</legend>
{% for key, choice in choices %}
{{- form_widget(form[key]) -}}
{{- form_label(form[key]) -}}
{% endfor %}
</fieldset>
{% endfor %}
{% else %}
{%- for child in form %}
{{- form_widget(child, {
parent_label_class: label_attr.class|default(''),
translation_domain: choice_translation_domain,
}) -}}
{% endfor -%}
{% endif %}
</div>
{%- endif -%}
{%- endblock choice_widget_expanded %}
{% block _quick_entry_form_rows_entry_timesheets_entry_widget %}
{{ form_row(form.duration, {row_attr: {class: 'p-0'}}) }}
{%- endblock %}
{% block quick_entry_week_row %}
<tr{% with {attr: row_attr|merge({class: (row_attr.class|default('') ~ ' form-group qe-entry-week-row' ~ (not valid ? ' is-invalid'))|trim})} %}{{ block('attributes') }}{% endwith %}>
<td>
{{ form_row(form.project, {row_attr: {class: 'p-0'}}) }}
</td>
<td>
{{ form_row(form.activity, {row_attr: {class: 'p-0'}}) }}
</td>
{% for timesheet in form.timesheets %}
<td class="text-center{% if timesheet.vars.data.begin is weekend %} weekend{% endif %}{% if timesheet.vars.data.begin is today %} today{% endif %}">
{{ form_widget(timesheet) }}
</td>
{% endfor %}
<td class="text-nowrap text-center total qe-totals-row"></td>
</tr>
{% endblock %}
{% block _team_edit_form_members_entry_user_widget %}
{# this will convert the select box into a hidden field, which are exchangeable from an HTML perspective #}
{%- set type = 'hidden' -%}
{{ block('form_widget_simple') }}
{% endblock %}
{% block _team_edit_form_members_entry_teamlead_widget %}
{% set attr = attr|merge({'class' : 'form-selectgroup-input '}) %}
<input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
{% endblock %}
{% block _team_edit_form_members_widget %}
<p>{{ 'team.configure_teamlead.help'|trans }}</p>
{{ form_widget(form, {row_attr: {class: 'mb-1'}}) }}
{% endblock %}
{% block team_member_row %}
{{ form_widget(form) }}
{% endblock %}
{% block team_member_widget %}
{% import 'macros/widgets.html.twig' as widgets%}
{% set data = {} %}
{% set user = null %}
{% if form.vars.data is not null and form.vars.data.user is not null %}
{% set user = form.vars.data.user %}
{% set data = {id: user.id, color: user.color|colorize(user.displayName), title: user.title, username: user.userIdentifier, alias: user.alias, initials: user.initials, accountnumber: user.accountNumber, display: user.displayName} %}
{% endif %}
<div class="row mb-1"{% for key, value in data %} data-{{ key }}="{{ value }}"{% endfor %}>
<div class="col-xs-12">
<label class="form-selectgroup-item flex-fill">
{{ form_widget(form.teamlead) }}
<div class="form-selectgroup-label d-flex align-items-center p-3">
<div class="me-3">
<span class="form-selectgroup-check"></span>
</div>
<div class="form-selectgroup-label-content d-flex align-items-center me-2">
{% if user is not null %}
{{ widgets.user_avatar(form.vars.data.user) }}
{% else %}
{{ widgets.avatar('__INITIALS__', '__COLOR__', '__DISPLAY__') }}
{% endif %}
</div>
<div class="form-selectgroup-label-content d-flex align-items-center">
<div class="text-start">
<div class="font-weight-medium">
{% if user is not null %}
{{ form.vars.data.user.displayName }}
{% else %}
__DISPLAY__
{% endif %}
{{ form_widget(form.user) }}
{{ form_errors(form.user) }}
</div>
{% if user is not null %}
<div class="text-body-secondary">{{- form.vars.data.user.title -}}</div>
{% else %}
<div class="text-body-secondary">__TITLE__</div>
{% endif %}
</div>
</div>
<div class="ms-auto">
<a href="#" class="btn btn-icon remove-member">{{ icon('trash', true) }}</a>
</div>
</div>
</label>
</div>
</div>
{% endblock team_member_widget %}
{% block date_widget -%}
{% set format = locale_format('date') %}
{% set jsFormat = format|js_format %}
{% set attr = attr|merge({'pattern': format|pattern, 'autocomplete': 'off', 'data-datepicker': 'on', 'data-format': jsFormat, 'placeholder': jsFormat}) -%}
<div class="input-group">
<div class="input-group-text">
<a href="#" data-form-widget="date-now" data-format="{{ jsFormat }}" data-target="{{ id }}">{{ icon('calendar') }}</a>
</div>
{{- block('form_widget_simple') -}}
{% if not required %}
<span class="input-group-text">
<a href="javascript: void(0)" class="link-secondary fs-5" onclick="document.getElementById('{{ id }}').value = ''">
{{ icon('cancel') }}
</a>
</span>
{% endif %}
</div>
{%- endblock date_widget %}
{% block time_widget -%}
{%- set user_format = format -%}
{%- set format = locale_format('time') -%}
{%- set jsFormat = format|js_format -%}
{%- set attr = attr|merge({'pattern': format|pattern, 'autocomplete': 'off', 'data-timepicker': 'on', 'data-format': jsFormat, 'placeholder': jsFormat}) -%}
<div class="input-group">
<div class="input-group-text">
<a href="#" data-form-widget="date-now" data-format="{{ jsFormat }}" data-target="{{ id }}">{{ icon('calendar') }}</a>
</div>
{{ block('form_widget_simple') }}
{% set time_presets = form_time_presets(app.user.timezone) %}
{% if time_presets|length > 0 and form.vars.disabled is same as (false) %}
<button type="button" class="input-group-text dropdown-toggle btn-duration-preset" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
<div class="dropdown-menu dropdown-menu-end pre-scrollable">
<div class="dropdown-menu-columns">
{% for index in [0, 1, 2, 3] %}
<div class="dropdown-menu-column" style="min-width: 4rem">
{% for value in time_presets %}
{% set value = value|date_format(user_format) %}
{% if loop.index0 % 4 == index %}
<a class="dropdown-item justify-content-center" href="#" data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{{ value }}" data-event="change">{{ value }}</a>
{% endif %}
{% endfor %}
</div>
{% endfor %}
</div>
</div>
{% endif %}
</div>
{%- endblock time_widget %}
{% block daterange_widget %}
{% set format = locale_format('date')|js_format %}
{% set attr = attr|merge({'data-daterangepicker': 'on', 'autocomplete': 'off', 'data-format': format, 'placeholder': format ~ attr['data-separator'] ~ format}) -%}
<div class="input-group">
{% if ranges is defined %}
<button type="button" class="input-group-text dropdown-toggle btn-duration-preset" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
<div class="dropdown-menu dropdown-menu-start pre-scrollable">
{% for title, range in ranges %}
<a class="dropdown-item" href="#" data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{% if range[0] is not null %}{{ range[0]|format_date('short', rangeFormat) }}{{ attr['data-separator'] }}{{ range[1]|format_date('short', rangeFormat) }}{% endif %}" data-event="change keyup">{{ title|trans({}, 'daterangepicker') }}</a>
{% endfor %}
</div>
{% endif %}
{{ block('form_widget_simple') }}
</div>
{% endblock daterange_widget %}
{% block duration_widget %}
<div class="duration-widget">
{% if (form.vars.duration_presets is defined and form.vars.duration_presets is not empty) and (form.vars.disabled is same as (false)) %}
<div class="input-group">
{% if form.vars.icon is defined and form.vars.icon is not null %}
<div class="input-group-text">
{{ icon(form.vars.icon) }}
</div>
{% endif %}
{{ block('form_widget_simple') }}
{% if form.vars.toggle is defined and form.vars.toggle %}
<div class="input-group-text">
<a href="#" id="{{ form.vars.id }}_toggle" class="text-success">{{ icon('link') }}</a>
</div>
{% endif %}
<button type="button" class="input-group-text dropdown-toggle btn-duration-preset" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
<div class="dropdown-menu dropdown-menu-end pre-scrollable">
<div class="dropdown-menu-columns">
{% for index in [0, 1, 2, 3] %}
<div class="dropdown-menu-column" style="min-width: 4rem">
{% for value in form.vars.duration_presets %}
{% if loop.index0 % 4 == index %}
<a class="dropdown-item justify-content-center" href="#" data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{{ value }}" data-event="change">{{ value }}</a>
{% endif %}
{% endfor %}
</div>
{% endfor %}
</div>
</div>
</div>
{% else %}
{% if icon is defined and icon is not empty %}
<div class="input-group">
<div class="input-group-text">
{{ icon(icon) }}
</div>
{{ block('form_widget_simple') }}
</div>
{% else %}
{{ block('form_widget_simple') }}
{% endif %}
{% endif %}
</div>
{% endblock duration_widget %}
{% block date_time_widget -%}
<div {{ block('widget_container_attributes') }}>
<div class="row">
<div class="col-sm-6">
{{- form_widget(form.date, { datetime: true } ) -}}
{{- form_errors(form.date) -}}
</div>
<div class="col-sm-6">
{{- form_widget(form.time, { datetime: true } ) -}}
{{- form_errors(form.time) -}}
</div>
</div>
</div>
{%- endblock date_time_widget %}
{% block text_widget -%}
{% if icon is not empty %}
<div class="input-group">
<div class="input-group-text">
{{ icon(icon) }}
</div>
{{ block('form_widget_simple') }}
</div>
{% else %}
{{ block('form_widget_simple') }}
{% endif %}
{%- endblock text_widget %}
{% block mail_widget -%}
<div class="input-group">
<div class="input-group-text">
{{ icon('mail') }}
</div>
{{ block('email_widget') }}
</div>
{%- endblock mail_widget %}
{# user password fields, search for "secret" block_prefix #}
{% block secret_widget -%}
<div class="input-group">
<div class="input-group-text">
{{ icon('password') }}
</div>
{{ block('password_widget') }}
</div>
{%- endblock secret_widget %}
{% block yearpicker_widget -%}
{% set yearInt = year|date_format('Y') %}
<div class="btn-group">
<a class="btn btn-left btn-icon" href="#" data-toggle="tooltip" data-placement="top" title="{{ previousYear|date_short }}"
data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{{ previousYear|report_date }}" data-event="change">
{{ icon('left') }}
</a>
{% if show_range %}
<a class="btn" href="#" onclick="return false;">
<span id="{{ form.vars.id }}_month_name">{{ year|date_short }} &ndash; {{ nextYear|date_short }}</span>
</a>
{% else %}
<button type="button" class="btn btn-default dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ yearInt }}
</button>
<ul class="dropdown-menu dropdown-menu-start pre-scrollable">
{% for i in (yearInt - 5)..(yearInt + 5) %}
{% set tmpYear = report_date(i) %}
<li><a href="#" data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{{ tmpYear|report_date }}" data-event="change" class="dropdown-item">{{ tmpYear|date_format('Y') }}</a></li>
{% endfor %}
</ul>
{% endif %}
<a class="btn btn-right btn-icon" href="#" data-toggle="tooltip" data-placement="top" title="{{ nextYear|date_short }}"
data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{{ nextYear|report_date }}" data-event="change">
{{ icon('right') }}
</a>
</div>
{%- set required = false -%}
<input type="hidden" {{ block('widget_attributes') }} value="{{ value }}" />
{%- endblock yearpicker_widget %}
{% block monthpicker_widget -%}
<div class="btn-group">
<a class="btn btn-left btn-icon" href="#" data-toggle="tooltip" data-placement="top" title="{{ previousMonth|month_name(true) }}"
data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{{ previousMonth|report_date }}" data-event="change">
{{ icon('left') }}
</a>
<a class="btn" href="#" onclick="return false;">
<span id="{{ form.vars.id }}_month_name">{{ month|month_name(true) }}</span>
</a>
<a class="btn btn-right btn-icon" href="#" data-toggle="tooltip" data-placement="top" title="{{ nextMonth|month_name(true) }}"
data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{{ nextMonth|report_date }}" data-event="change">
{{ icon('right') }}
</a>
</div>
{%- set required = false -%}
<input type="hidden" {{ block('widget_attributes') }} value="{{ value }}" />
{%- endblock monthpicker_widget %}
{% block weekpicker_widget -%}
<div class="btn-group week-picker-btn-group {{ attr.class ?? '' }}">
<a class="btn btn-left btn-icon" href="#" data-toggle="tooltip" data-placement="top" title="{{ 'stats.workingTimeWeek'|trans({'%week%': previousWeek|date_format('W')}) }}"
data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{{ previousWeek|report_date }}" data-event="change">
{{ icon('left') }}
</a>
<a class="btn btn-default" href="#" onclick="return false;">
<span id="{{ form.vars.id }}_week_number" data-toggle="tooltip" data-placement="top" title="{{ 'stats.workingTimeWeek'|trans({'%week%': week|date_format('W')}) }}">
{{ week|month_name(true) }}
&ndash;
{{ 'stats.workingTimeWeekShort'|trans({'%week%': week|date_format('W')}) }}
</span>
</a>
<a class="btn btn-right btn-icon" href="#" data-toggle="tooltip" data-placement="top" title="{{ 'stats.workingTimeWeek'|trans({'%week%': nextWeek|date_format('W')}) }}"
data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{{ nextWeek|report_date }}" data-event="change">
{{ icon('right') }}
</a>
</div>
{%- set required = false -%}
<input type="hidden" {{ block('widget_attributes') }} value="{{ value }}" />
{%- endblock weekpicker_widget %}
{% block tags_widget %}
{% if form.vars.choices is defined %}
{{ block('choice_widget_collapsed') }}
{% else %}
{{ block('form_widget_simple') }}
{% endif %}
{% endblock tags_widget %}
{% block report_sum_widget %}
<div class="dropdown"{% if form.vars.choices|length <= 1 %} style="display: none"{% endif %}>
<button type="button" class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ icon('display', true) }}
</button>
<ul class="dropdown-menu checkbox-menu">
{% for option in form.children %}
<li class="dropdown-item">
{{ form_widget(option) }}
</li>
{% endfor %}
</ul>
</div>
{% endblock report_sum_widget %}
{# customer phone/fax, search for "phone" block_prefix #}
{% block phone_widget -%}
<div class="input-group">
<div class="input-group-text">
{{ icon(attr.icon ?? 'phone') }}
</div>
{{ block('tel_widget') }}
</div>
{%- endblock phone_widget %}
{% block money_widget -%}
{%- set prepend = not (money_pattern starts with '{{') -%}
{%- set append = not (money_pattern ends with '}}') -%}
{%- if prepend or append -%}
<div class="input-group">
{%- if prepend -%}
<div class="input-group-text">{{ money_pattern|form_encode_currency }}</div>
{%- endif -%}
{{- block('form_widget_simple') -}}
{%- if append -%}
<div class="input-group-text">{{ money_pattern|form_encode_currency }}</div>
{%- endif -%}
</div>
{%- else -%}
{{- block('form_widget_simple') -}}
{%- endif -%}
{%- endblock money_widget %}
{# customer homepage, search for "homepage" block_prefix #}
{% block homepage_widget -%}
<div class="input-group">
{% if '://' not in value %}
<div class="input-group-text">https://</div>
{% endif %}
{{ block('url_widget') }}
</div>
{%- endblock homepage_widget %}
{%- block form_errors -%}
{%- if errors|length > 0 -%}
{%- for error in errors -%}
<div class="invalid-feedback d-block{% if form is rootform and loop.last %} mb-3{% endif %}">{{ error.message }}</div>
{%- endfor -%}
{%- endif %}
{%- endblock form_errors %}
{%- block meta_fields_collection_row -%}
<div{% with {attr: row_attr|merge({class: (row_attr.class|default(form.parent.vars.name ~ '_row_' ~ form.vars.name))|trim})} %}{{ block('attributes') }}{% endwith %}>
{{- form_widget(form) -}}
</div>
{%- endblock meta_fields_collection_row %}
{%- block meta_fields_collection_widget -%}
{% for meta in form|sort((a, b) => a.vars.data.order <=> b.vars.data.order) %}
{{ form_row(meta.value, {'row_attr': {'class': 'mb-3 ' ~ form.parent.vars.name ~ '_row_' ~ form.vars.name ~ '_' ~ meta.vars.name}}) }}
{% endfor %}
{%- endblock meta_fields_collection_widget %}
{% block form_help_content -%}
{%- if help_translation_domain is defined and help_translation_domain is not null -%}
{%- set translation_domain = help_translation_domain -%}
{%- endif -%}
{# following copied from form_div_layout.html.twig #}
{%- if translation_domain is same as(false) -%}
{%- if help_html is same as(false) -%}
{{- help -}}
{%- else -%}
{{- help|raw -}}
{%- endif -%}
{%- else -%}
{%- if help_html is same as(false) -%}
{{- help|trans(help_translation_parameters, translation_domain) -}}
{%- else -%}
{{- help|trans(help_translation_parameters, translation_domain)|raw -}}
{%- endif -%}
{%- endif -%}
{%- endblock form_help_content %}