engelsystem/resources/views/macros/form.twig

326 lines
16 KiB
Twig

{% macro entry_required() %}
<span class="text-info" title="{{ __('form.required') }}">*</span>
{%- endmacro %}
{% macro info(text) %}
<span class="bi bi-info-circle-fill text-info" data-bs-toggle="tooltip" title="{{ text | e('html_attr') }}"></span>
{%- endmacro %}
{#
Renders an input field wrapped in a DIV with mb-3.
@param {string} name - Will be used as value for "id" and "name" attributes.
@param {string} label - If not empty a "label" element with this text will be rendered.
@param {string} [opt.type="text"] - Optional type of the input field. Defaults to "text".
@param {bool} [opt.hide_label=false] - If true the label will be hidden. This could be useful for screenreders.
Defaults to false.
@param {bool} [opt.required_icon=false] - Whether an asterisk should be displayed after the label
to indicate that this field is mandatory.
Won't be displayed without a label. Defaults to false.
@param {string} [opt.info] - If set an additional info icon will be added to the label with the text as tooltip.
Won't be displayed without a label.
@param {string} [opt.value=""] - Optional value to set. Defaults to empty string.
@param {int} [opt.min_length] - Optional "minlength" attribute value.
@param {int} [opt.max_length] - Optional "maxlength" attribute value.
@param {int|float|string} [opt.min] - Optional "min" attribute value.
@param {int|float|string} [opt.max] - Optional "max" attribute value.
@param {int|float} [opt.step] - Optional "step" attribute value.
@param {string} [opt.autocomplete] - Optional "autocomplete" attribute value.
@param {bool} [opt.required=false] - Whether to add the "required" attribute. Defaults to false.
@param {bool} [opt.disabled=false] - Whether to add the "disabled" attribute. Defaults to false.
@param {bool} [opt.readonly=false] - Whether to add the "readonly" attribute. Defaults to false.
#}
{% macro input(name, label, opt) %}
<div class="mb-3">
{% if label -%}
<label for="{{ name }}" class="form-label {% if opt.hide_label|default(false) %}sr-only{% endif %}">
{{ label }}
{% if opt.required_icon|default(false) %}
{{ _self.entry_required() }}
{% endif %}
{% if opt.info is defined %}
{{ _self.info(opt.info) }}
{% endif %}
</label>
{%- endif %}
<input
type="{{ opt.type|default('text') }}" class="form-control"
id="{{ name }}" name="{{ name }}"
value="{{ opt.value|default('') }}"
{%- if opt.min_length is defined %} minlength="{{ opt.min_length }}"{% endif %}
{%- if opt.max_length is defined %} maxlength="{{ opt.max_length }}"{% endif %}
{%- if opt.min is defined %} min="{{ opt.min }}"{% endif %}
{%- if opt.max is defined %} max="{{ opt.max }}"{% endif %}
{%- if opt.step is defined %} step="{{ opt.step }}"{% endif %}
{%- if opt.autocomplete is defined %} autocomplete="{{ opt.autocomplete }}"{% endif %}
{%- if opt.required|default(false) %}
required
{%- endif -%}
{%- if opt.disabled|default(false) %}
disabled
{%- endif -%}
{%- if opt.readonly|default(false) %}
readonly
{%- endif -%}
>
</div>
{%- endmacro %}
{#
Renders a "number" type input field wrapped in a DIV with mb-3.
Also adds buttons to increment / decrement the value.
@param {string} name - Will be used as value for "id" and "name" attributes.
@param {string} label - If not empty a "label" element with this text will be rendered.
@param {bool} [opt.required_icon=false] - Whether an asterisk should be displayed after the label
to indicate that this field is mandatory.
Won't be displayed without a label. Defaults to false.
@param {string} [opt.info] - If set an additional info icon will be added to the label with the text as tooltip.
Won't be displayed without a label.
@param {string} [opt.value=""] - Optional value to set. Defaults to empty string.
@param {int|float|string} [opt.min] - Optional "min" attribute value.
@param {int|float|string} [opt.max] - Optional "max" attribute value.
@param {int|float} [opt.step] - Optional "step" attribute value.
@param {bool} [opt.required=false] - Whether to add the "required" attribute. Defaults to false.
@param {bool} [opt.disabled=false] - Whether to add the "disabled" attribute. Defaults to false.
@param {bool} [opt.readonly=false] - Whether to add the "readonly" attribute. Defaults to false.
#}
{% macro number(name, label, opt) %}
<div class="mb-3">
{% if label -%}
<label class="form-label" for="{{ name }}">{{ label }}</label>
{% if opt.required_icon|default(false) %}
{{ _self.entry_required() }}
{% endif %}
{% if opt.info is defined %}
{{ _self.info(opt.info) }}
{% endif %}
{%- endif %}
<div class="input-group">
<input
type="number" class="form-control"
id="{{ name }}" name="{{ name }}"
value="{{ opt.value|default('')|escape('html_attr') }}"
{%- if opt.min is defined %} min="{{ opt.min }}"{% endif %}
{%- if opt.max is defined %} max="{{ opt.max }}"{% endif %}
{%- if opt.step is defined %} step="{{ opt.step }}"{% endif %}
{%- if opt.required|default(false) %}
required
{%- endif -%}
{%- if opt.disabled|default(false) %}
disabled
{%- endif -%}
{%- if opt.readonly|default(false) %}
readonly
{%- endif -%}
>
<button class="btn btn-secondary spinner-down" type="button" data-input-id="{{ name }}">
<span class="bi bi-dash-lg"></span>
</button>
<button class="btn btn-secondary spinner-up" type="button" data-input-id="{{ name }}">
<span class="bi bi-plus-lg"></span>
</button>
</div>
</div>
{% endmacro %}
{#
Renders a "textarea" element wrapped in a DIV with mb-3.
Also adds buttons to increment / decrement the value.
@param {string} name - Will be used as value for "id" and "name" attributes.
@param {string} label - If not empty a "label" element with this text will be rendered.
@param {bool} [opt.required_icon=false] - Whether an asterisk should be displayed after the label
to indicate that this field is mandatory.
Won't be displayed without a label. Defaults to false.
@param {bool} [opt.required] - Whether to add the "required" attribute. Defaults to false.
@param {int} [opt.rows=0] - Optional value of the "rows" attriute. Defaults to 0.
@param {string} [opt.value=""] - Optional value to set. Defaults to empty string.
#}
{% macro textarea(name, label, opt) %}
<div class="mb-3">
{% if label -%}
<label class="form-label" for="{{ name }}">{{ label }}</label>
{% if opt.required_icon|default(false) %}
{{ _self.entry_required() }}
{% endif %}
{% if opt.info is defined %}
{{ _self.info(opt.info) }}
{% endif %}
{%- endif %}
<textarea class="form-control" id="{{ name }}" name="{{ name }}"
{%- if opt.required|default(false) %}
required
{%- endif -%}
{%- if opt.rows|default(0) %}
rows="{{ opt.rows }}"
{%- endif -%}
>{{ opt.value|default('') }}</textarea>
</div>
{%- endmacro %}
{#
Renders a select element wrapped in a DIV with mb-3.
@param {string} name - Will be used as value for "id" and "name" attributes.
@param {string} label - If not empty a "label" element with this text will be rendered.
@param {{value, description}} data - Select options. "value" will be the option value, "description" the label.
@param {string} [opt.selected] - Optional value of an option to initially set as "selected".
@param {bool} [opt.required_icon=false] - Whether an asterisk should be displayed after the label
to indicate that this field is mandatory.
Won't be displayed without a label. Defaults to false.
@param {string} [opt.info] - If set an additional info icon will be added to the label with the text as tooltip.
Won't be displayed without a label.
@param {string} [opt.class] - Optional additional CSS classes to be added to the actual "select" element.
@param {bool} [opt.required=false] - Whether to add the "required" attribute. Defaults to false.
@param {bool} [opt.default_option] - If set a default option with the param as label and an empty value will be added.
#}
{% macro select(name, label, data, opt) %}
<div class="mb-3">
{% if label -%}
<label class="form-label" for="{{ name }}">
{{ label }}
{% if opt.required_icon|default(false) %}
{{ _self.entry_required() }}
{% endif %}
{% if opt.info is defined %}
{{ _self.info(opt.info) }}
{% endif %}
</label>
{% endif %}
<select id="{{ name }}" name="{{ name }}"
class="form-control {%- if opt.class is defined %} {{ opt.class }}{% endif %}"
{%- if opt.required|default(false) %}required{%- endif -%}>
{%- if opt.default_option is defined %}
<option value="">{{ opt.default_option }}</option>
{% endif %}
{% for value,decription in data -%}
<option value="{{ value }}"{% if opt.selected is defined and value == opt.selected %} selected{% endif %}>{{ decription }}</option>
{% endfor %}
</select>
</div>
{%- endmacro %}
{#
Renders a Bootstrap checkbox element with mb-3.
@param {string} name - Will be used as value for "id" and "name" attributes.
@param {string} label - Checkbox label
@param {string} [opt.value="1"] - Optional value to set. Defaults to "1".
@param {bool} [opt.checked=false] - Whether to add the "checked" attribute. Defaults to false.
@param {bool} [opt.disabled=false] - Whether to add the "disabled" attribute. Defaults to false.
@param {bool} [opt.raw_label=false] - Whether to use the raw label value (=do not escape). Defaults to false.
@param {string} [opt.info] - If set an additional info icon will be added to the label with the text as tooltip.
@param {string} [opt.class="mb-3"] - CSS classes for the checkbox element. Defaults to "mb-3".
#}
{% macro checkbox(name, label, opt) %}
<div class="form-check {{ opt.class is defined ? opt.class : 'mb-3' }}">
<input class="form-check-input" type="checkbox" id="{{ name }}" name="{{ name }}"
value="{{ opt.value|default('1') }}"
{%- if opt.checked|default(false) %} checked{% endif %}
{%- if opt.disabled|default(false) %} disabled{% endif %}
>
<label class="form-check-label" for="{{ name }}">
{%- if opt.raw_label|default(false) -%}
{{ label|raw }}
{%- else -%}
{{ label }}
{%- endif -%}
{% if opt.info is defined %}
{{ _self.info(opt.info) }}
{% endif %}
</label>
</div>
{%- endmacro %}
{#
Renders a "hidden" type input field.
@param {string} name - Will be used as value for "id" and "name" attributes.
@param {string} value - Field value
#}
{% macro hidden(name, value) %}
<input type="hidden" id="{{ name }}" name="{{ name }}" value="{{ value|escape('html_attr') }}">
{%- endmacro %}
{#
Renders a button.
@param {string} label - Button label
@param {string} [opt.btn_type="secondary"] - Bootstrap button type. Defaults to "secondary".
@param {string} [opt.size] - Optional Bootstrap button size to apply, such as "sm", "lg".
@param {string} [opt.type] - Optional value for the "type" attribute.
@param {string} [opt.name] - Optional value for the "name" attribute.
@param {string} [opt.title] - Optional value for the "title" attribute.
@param {string} [opt.value] - Optional value for the "value" attribute.
Defaults to "1" if only opt.name is provided.
@param {string} [opt.icon_left] - Optional icon to be added before the button label.
Must be a Bootstrap icon class without prefix, such as "info" or "check".
@param {string} [opt.icon_right] - Optional icon to be added after the button label.
Must be a Bootstrap icon class without prefix, such as "info" or "check".
@param {string} [opt.confirm_title] - Optional value for the confirmation title.
@param {string} [opt.confirm_text] - Optional value for the confirmation text.
#}
{% macro button(label, opt) %}
{%- set icon_left = opt.icon_left is defined ? '<span class="bi bi-' ~ opt.icon_left ~ '"></span>' : '' %}
{%- set icon_right = opt.icon_right is defined ? '<span class="bi bi-' ~ opt.icon_right ~ '"></span>' : '' %}
<button
class="btn btn-{{ opt.btn_type|default('secondary') }}
{%- if opt.size is defined %} btn-{{ opt.size }}{% endif %}"
{%- if opt.type is defined %} type="{{ opt.type }}"{% endif %}
{%- if opt.name is defined %} name="{{ opt.name }}"{% endif %}
{%- if opt.title is defined %} title="{{ opt.title }}"{% endif %}
{%- if opt.value is defined or opt.name is defined %} value="{{ opt.value|default('1') }}"{% endif -%}
{%- if opt.confirm_title is defined %} data-confirm_submit_title="{{ opt.confirm_title }}"{% endif -%}
{%- if opt.confirm_text is defined %} data-confirm_submit_text="{{ opt.confirm_text }}"{% endif -%}
{%- if opt.confirm_button_text is defined %}
data-confirm_button_text="{{ icon_left ~ ' ' ~ opt.confirm_button_text ~ ' ' ~ icon_right }}"
{%- endif -%}
>
{{ icon_left|raw }}
{{ label }}
{{ icon_right|raw }}
</button>
{%- endmacro %}
{% macro submit(label, opt) %}
{{ _self.button(label|default(__('form.submit')), {'type': 'submit', 'btn_type': 'primary'}|merge(opt|default({}))) }}
{%- endmacro %}
{% macro delete(label, opt) %}
{{ _self.submit(label|default(' '), {
'icon_left': 'trash',
'title': __('form.delete'),
'name': 'delete',
'btn_type': 'danger',
'confirm_text': __('confirmation.delete')
}|merge(opt|default({}))) }}
{%- endmacro %}
{#
Renders a "checkbox" element that will be styled as switch.
@param {string} name - Will be used as value for "id" and "name" attributes.
@param {string} label - Switch label
@param {string} [opt.value="1"] - Optional value to set. Defaults to "1".
@param {bool} [opt.checked=false] - Whether to add the "checked" attribute. Defaults to false.
@param {bool} [opt.disabled=false] - Whether to add the "disabled" attribute. Defaults to false.
#}
{% macro switch(name, label, opt) %}
<div class="form-check form-switch mb-3">
<input class="form-check-input" type="checkbox" id="{{ name }}" name="{{ name }}"
value="{{ opt.value|default('1') }}"
{%- if opt.checked|default(false) %} checked{% endif %}
{%- if opt.disabled|default(false) %} disabled{% endif %}
>
<label class="form-check-label" for="{{ name }}">{{ label }}</label>
</div>
{%- endmacro %}
{% macro formData(name, default) -%}
{{ session_pop('form-data-' ~ name, default) }}
{%- endmacro %}