{# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #}
{% use '@EasyAdmin/symfony-form-themes/bootstrap_5_layout.html.twig' %}
{% block form_start %}
{% if form.vars.errors|length > 0 and 'ea_crud' in form.vars.block_prefixes|default([]) %}
{{ form_errors(form, {attr: { class: 'global-invalid-feedback' }}) }}
{% endif %}
{{ parent() }}
{% if ea.request.query.get('referrer') %}
<input type="hidden" name="referrer" value="{{ ea.request.query.get('referrer') }}">
{% endif %}
{% endblock form_start %}
{% block form_end %}
{% if not render_rest is defined or render_rest %}
{{ form_rest(form) }}
{% endif %}
</form>
{% endblock %}
{% block form_errors %}
{% if errors|length > 0 %}
{% for error in errors %}
<div class="{{ attr.class|default('') }} invalid-feedback d-block">{{ error.message }}</div>
{% endfor %}
{% endif %}
{% endblock form_errors %}
{# Widgets #}
{% block form_widget_simple -%}
{% if type is not defined or type not in ['file', 'hidden'] %}
{%- set attr = attr|merge({class: (attr.class|default(''))|trim}) -%}
{% endif %}
{%- if type is defined and (type == 'range' or type == 'color') %}
{# Attribute "required" is not supported #}
{%- set required = false -%}
{% endif %}
{{- parent() -}}
{%- endblock form_widget_simple %}
{% block datetime_widget %}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' form-inline')|trim}) %}
<div class="datetime-widget datetime-widget-datetime">
{{- parent() -}}
</div>
{% endblock datetime_widget %}
{% block date_widget -%}
<div class="datetime-widget datetime-widget-date">
{{- parent() -}}
</div>
{%- endblock date_widget %}
{% block time_widget -%}
<div class="datetime-widget datetime-widget-time">
{{- parent() -}}
</div>
{%- endblock time_widget %}
{% block file_widget -%}
{% if vich|default(false) %}
{%- set type = type|default('file') -%}
{{- block('form_widget_simple') -}}
{% else %}
{{- block('form_widget_simple') -}}
{% endif %}
{%- endblock %}
{# Rows #}
{% block form_row %}
{% set row_attr = row_attr|merge({
class: row_attr.class|default('') ~ ' form-group'
}) %}
{% set field = form.vars.ea_vars.field %}
<div class="{{ field.columns ?? field.defaultColumns ?? '' }}">
<div {% with { attr: row_attr } %}{{ block('attributes') }}{% endwith %}>
{{- form_label(form) -}}
<div class="form-widget">
{% set has_prepend_html = field.prepend_html|default(null) is not null %}
{% set has_append_html = field.append_html|default(null) is not null %}
{% set has_input_groups = has_prepend_html or has_append_html %}
{% if has_input_groups %}<div class="input-group">{% endif %}
{% if has_prepend_html %}
<div class="input-group-prepend">
<span class="input-group-text">{{ field.prepend_html|raw }}</span>
</div>
{% endif %}
{{ form_widget(form) }}
{% if has_append_html %}
<span class="input-group-text">{{ field.append_html|raw }}</span>
{% endif %}
{% if has_input_groups %}</div>{% endif %}
{% if field.help ?? false %}
<small class="form-text form-help">{{ field.help|trans(label_translation_parameters, translation_domain)|raw }}</small>
{% elseif form.vars.help ?? false %}
<small class="form-text form-help">{{ form.vars.help|trans(form.vars.help_translation_parameters, form.vars.translation_domain)|raw }}</small>
{% endif %}
{{- form_errors(form) -}}
</div>
</div>
</div>
{# if a field doesn't define its columns explicitly, insert a fill element to make the field take the entire row space #}
{% if field.columns|default(null) is null %}
<div class="flex-fill"></div>
{% endif %}
{% endblock form_row %}
{% block choice_widget_collapsed %}
{% if 'ea-autocomplete' == attr['data-ea-widget']|default(false) %}
{% set attr = attr|merge({
'data-ea-i18n-no-results-found': 'autocomplete.no-results-found'|trans({}, 'EasyAdminBundle'),
'data-ea-i18n-no-more-results': 'autocomplete.no-more-results'|trans({}, 'EasyAdminBundle'),
'data-ea-i18n-loading-more-results': 'autocomplete.loading-more-results'|trans({}, 'EasyAdminBundle'),
}) %}
{% endif %}
{{ parent() }}
{% endblock choice_widget_collapsed %}
{% block collection_row %}
{% if prototype is defined and not prototype.rendered %}
{% set row_attr = row_attr|merge({ 'data-prototype': form_row(prototype) }) %}
{% endif %}
{% set row_attr = row_attr|merge({
'data-ea-collection-field': 'true',
'data-entry-is-complex': form.vars.ea_vars.field and form.vars.ea_vars.field.customOptions.get('entryIsComplex') ? 'true' : 'false',
'data-allow-add': allow_add ? 'true' : 'false',
'data-allow-delete': allow_delete ? 'true' : 'false',
'data-num-items': form.children is empty ? 0 : max(form.children|keys) + 1,
'data-form-type-name-placeholder': prototype is defined ? prototype.vars.name : '',
}) %}
{{ block('form_row') }}
{% endblock collection_row %}
{% block collection_widget %}
{# the "is iterable" check is needed because if an object implements __toString() and
returns an empty string, "is empty" returns true even if it's not a collection #}
{% set isEmptyCollection = value is null or (value is iterable and value is empty) %}
{% set is_array_field = 'EasyCorp\\Bundle\\EasyAdminBundle\\Field\\ArrayField' == form.vars.ea_vars.field.fieldFqcn ?? false %}
<div class="ea-form-collection-items">
{% if isEmptyCollection %}
{{ block('empty_collection') }}
{% elseif is_array_field %}
{{ block('form_widget') }}
{% else %}
<div class="accordion">
{{ block('form_widget') }}
</div>
{% endif %}
</div>
{% if isEmptyCollection or form.vars.prototype is defined %}
{% set attr = attr|merge({'data-empty-collection': block('empty_collection') }) %}
{% endif %}
{% if allow_add|default(false) and not disabled %}
<button type="button" class="btn btn-link field-collection-add-button">
<i class="fa fa-plus pr-1"></i>
{{ 'action.add_new_item'|trans({}, 'EasyAdminBundle') }}
</button>
{% endif %}
{% endblock collection_widget %}
{% block collection_entry_row %}
{% set is_array_field = 'EasyCorp\\Bundle\\EasyAdminBundle\\Field\\ArrayField' == form_parent(form).vars.ea_vars.field.fieldFqcn ?? false %}
{% set is_complex = form_parent(form).vars.ea_vars.field.customOptions.get('entryIsComplex') ?? false %}
{% set allows_deleting_items = form_parent(form).vars.allow_delete|default(false) %}
{% set render_expanded = form_parent(form).vars.ea_vars.field.customOptions.get('renderExpanded') ?? false %}
{% set delete_item_button %}
<button type="button" class="btn btn-link btn-link-danger field-collection-delete-button"
title="{{ 'action.remove_item'|trans({}, 'EasyAdminBundle') }}">
<i class="far fa-trash-alt"></i>
</button>
{% endset %}
<div class="field-collection-item {{ is_complex ? 'field-collection-item-complex' }} {{ not form.vars.valid ? 'is-invalid' }}">
{% if is_array_field|default(false) %}
{{ form_label(form) }}
{{ form_widget(form) }}
{% if allows_deleting_items and not disabled %}
{{ delete_item_button }}
{% endif %}
{% else %}
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button {{ render_expanded ? '' : 'collapsed' }}" type="button" data-bs-toggle="collapse" data-bs-target="#{{ id }}-contents">
<i class="fas fw fa-chevron-right form-collection-item-collapse-marker"></i>
{{ value|ea_as_string }}
</button>
{% if allows_deleting_items and not disabled %}
{{ delete_item_button }}
{% endif %}
</h2>
<div id="{{ id }}-contents" class="accordion-collapse collapse {{ render_expanded ? 'show' }}">
<div class="accordion-body">
<div class="row">
{{ form_widget(form) }}
</div>
</div>
</div>
</div>
{% endif %}
</div>
{% endblock collection_entry_row %}
{% block form_widget_compound %}
<div class="form-widget-compound">
{% if 'collection' in block_prefixes %}
{# the "is iterable" check is needed because if an object implements __toString() and
returns an empty string, "is empty" returns true even if it's not a collection #}
{% set isEmptyCollection = value is null or (value is iterable and value is empty) %}
{% if isEmptyCollection %}
{{ block('empty_collection') }}
{% endif %}
{% if isEmptyCollection or form.vars.prototype is defined %}
{% set attr = attr|merge({'data-empty-collection': block('empty_collection') }) %}
{% endif %}
{% endif %}
{{ parent() }}
</div>
{% endblock form_widget_compound %}
{% block button_row -%}
<div class="form-group field-{{ block_prefixes|slice(-2)|first }} {{ ea.field.css_class|default('') }}">
{{- form_widget(form) -}}
</div>
{%- endblock button_row %}
{# Labels #}
{% block form_label -%}
{% if label is same as(false) -%}
{# don't display anything, not even an empty <label> element; if you want to not display
any label contents but keep the form layout, use an empty string as the field label #}
{%- else -%}
{%- if compound is defined and compound -%}
{%- set element = 'legend' -%}
{%- set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' col-form-label')|trim}) -%}
{%- else -%}
{%- set label_attr = label_attr|merge({for: id, class: (label_attr.class|default('') ~ ' form-control-label')|trim}) -%}
{%- endif -%}
{% if required -%}
{% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' required')|trim}) %}
{%- endif -%}
{% if label is same as('') -%}
{# don't process the label; this is used to not display any label content
but render an empty <label> element keep the form layout #}
{%- elseif label is null -%}
{%- if label_format is not empty -%}
{% set label = label_format|replace({
'%name%': name,
'%id%': id,
}) %}
{%- else -%}
{% set label = name|humanize %}
{%- endif -%}
{%- endif -%}
<{{ element|default('label') }}{% if label_attr %}{% with { attr: label_attr } %}{{ block('attributes') }}{% endwith %}{% endif %}>
{%- if translation_domain is same as(false) -%}
{%- if label_html|default(false) is same as(false) -%}
{{- label -}}
{%- else -%}
{{- label|raw -}}
{%- endif -%}
{%- else -%}
{%- if label_html|default(false) is same as(false) -%}
{{- label|trans(label_translation_parameters, translation_domain) -}}
{%- else -%}
{{- label|trans(label_translation_parameters, translation_domain)|raw -}}
{%- endif -%}
{%- endif -%}
</{{ element|default('label') }}>
{%- endif -%}
{%- endblock form_label %}
{# Errors #}
{% block empty_collection %}
<div class="empty collection-empty">
{{ include(ea.templatePath('label/empty')) }}
</div>
{% endblock empty_collection %}
{% block vich_file_row %}
{% set force_error = true %}
{{ block('form_row') }}
{% endblock %}
{% block vich_file_widget %}
<div class="ea-vich-file">
{% if download_uri|default('') is not empty %}
{% set file_extension = download_uri|split('.')|last %}
{% set extension_icons = {
'gif': 'fa-file-image-o',
'jpg': 'fa-file-image-o',
'pdf': 'fa-file-pdf-o',
'png': 'fa-file-image-o',
'zip': 'fa-file-archive-o'
} %}
<a class="ea-vich-file-name" href="{{ asset_helper is same as(true) ? asset(download_uri) : download_uri }}">
<i class="fa fa-fw {{ extension_icons[file_extension] ?? 'fa-file-o' }}"></i>
{%- if download_label|default(false) -%}
{{ download_label|trans({}, 'VichUploaderBundle') }}
{%- else -%}
{{ download_uri|split('/')|last ?: 'download'|trans({}, 'VichUploaderBundle') }}
{%- endif -%}
</a>
{% endif %}
{% set file_upload_js %}
var newFile = document.getElementById('{{ form.file.vars.id }}').files[0];
var fileSizeInMegabytes = newFile.size > 1024 * 1024;
var fileSize = fileSizeInMegabytes ? newFile.size / (1024 * 1024) : newFile.size / 1024;
document.getElementById('{{ form.file.vars.id }}_new_file_name').innerText = newFile.name + ' (' + fileSize.toFixed(2) + ' ' + (fileSizeInMegabytes ? 'MB' : 'KB') + ')';
{% endset %}
<div class="ea-vich-file-actions">
{# the container element is needed to allow customizing the <input type="file" /> #}
<div class="btn btn-secondary input-file-container">
<i class="fa fa-fw fa-upload"></i> {{ 'action.choose_file'|trans({}, 'EasyAdminBundle') }}
{{ form_widget(form.file, { 'attr': { 'onchange': file_upload_js }, vich: true}) }}
</div>
{% if form.delete is defined %}
{{ form_row(form.delete) }}
{% endif %}
</div>
<div class="small" id="{{ form.file.vars.id }}_new_file_name"></div>
</div>
{% endblock %}
{% block vich_image_row %}
{% set force_error = true %}
{{ block('form_row') }}
{% endblock %}
{% block vich_image_widget %}
{% set formTypeOptions = ea_vars.field.formTypeOptions|default('') %}
<div class="ea-vich-image">
{% if image_uri|default('') is not empty %}
{% if download_uri|default('') is empty %}
<div class="ea-lightbox-thumbnail">
{% if formTypeOptions.imagine_pattern is defined and formTypeOptions.imagine_pattern is not empty %}
<img style="cursor: initial" src="{{ (asset_helper is same as(true) ? asset(image_uri) : image_uri)|ea_apply_filter_if_exists('imagine_filter', formTypeOptions.imagine_pattern) }}">
{% else %}
<img style="cursor: initial" src="{{ asset_helper is same as(true) ? asset(image_uri) : image_uri }}">
{% endif %}
</div>
{% else %}
{% set _lightbox_id = 'ea-lightbox-' ~ id %}
<a href="#" class="ea-lightbox-thumbnail" data-ea-lightbox-content-selector="#{{ _lightbox_id }}">
{% if formTypeOptions.imagine_pattern is defined and formTypeOptions.imagine_pattern is not empty %}
<img src="{{ (asset_helper is same as(true) ? asset(download_uri) : download_uri)|ea_apply_filter_if_exists('imagine_filter', formTypeOptions.imagine_pattern) }}">
{% else %}
<img src="{{ asset_helper is same as(true) ? asset(download_uri) : download_uri }}">
{% endif %}
</a>
<div id="{{ _lightbox_id }}" class="ea-lightbox">
{% if formTypeOptions.imagine_pattern is defined and formTypeOptions.imagine_pattern is not empty %}
<img src="{{ (asset_helper is same as(true) ? asset(download_uri) : download_uri)|ea_apply_filter_if_exists('imagine_filter', formTypeOptions.imagine_pattern) }}">
{% else %}
<img src="{{ asset_helper is same as(true) ? asset(download_uri) : download_uri }}">
{% endif %}
</div>
{% endif %}
{% endif %}
{% set file_upload_js %}
var newFile = document.getElementById('{{ form.file.vars.id }}').files[0];
var fileSizeInMegabytes = newFile.size > 1024 * 1024;
var fileSize = fileSizeInMegabytes ? newFile.size / (1024 * 1024) : newFile.size / 1024;
document.getElementById('{{ form.file.vars.id }}_new_file_name').innerText = newFile.name + ' (' + fileSize.toFixed(2) + ' ' + (fileSizeInMegabytes ? 'MB' : 'KB') + ')';
{% endset %}
<div class="ea-vich-image-actions">
{# the container element is needed to allow customizing the <input type="file" /> #}
<div class="btn btn-secondary input-file-container">
<i class="fa fa-fw fa-upload"></i> {{ 'action.choose_file'|trans({}, 'EasyAdminBundle') }}
{{ form_widget(form.file, { 'attr': { 'onchange': file_upload_js }, vich: true}) }}
</div>
{% if form.delete is defined %}
{{ form_row(form.delete) }}
{% endif %}
</div>
<div class="small" id="{{ form.file.vars.id }}_new_file_name"></div>
</div>
{% endblock %}
{% block ea_crud_rest %}
{{ form_rest(form) }}
{% endblock ea_crud_rest %}
{# EasyAdmin form type #}
{% block ea_crud_widget %}
{% for field in form %}
{{ form_row(field) }}
{% endfor %}
{% endblock ea_crud_widget %}
{# TODO: remove this when "form panels" are removed #}
{% block ea_crud_widget_panels %}
{% deprecated 'The "ea_crud_widget_panels" block is deprecated because the form layout building logic has been revamped. Check "ea_crud_widget" block in `form_theme.html.page` for more details.' %}
{{ block('ea_crud_widget_fieldsets') }}
{% endblock ea_crud_widget_panels %}
{% block ea_crud_widget_fieldsets %}
{% deprecated 'The "ea_crud_widget_fieldsets" block is deprecated because the form layout building logic has been revamped. Check "ea_crud_widget" block in `form_theme.html.page` for more details.' %}
{% for fieldset_name, fieldset_config in field.vars.ea_crud_form.form_fieldsets|filter(fieldset_config => not fieldset_config.form_tab or fieldset_config.form_tab == tab_name) %}
{% set fieldset_has_header = fieldset_config.label|default(false) or fieldset_config.icon|default(false) or fieldset_config.help|default(false) %}
{% set collapsible = fieldset_config.collapsible %}
{% set collapsed = fieldset_config.collapsed %}
<div class="{{ fieldset_config.css_class ?? '' }}">
<fieldset class="form-fieldset">
{% if fieldset_has_header %}
<div class="form-fieldset-header {{ collapsible ? 'collapsible' }} {{ fieldset_config.help|default(false) is not empty ? 'with-help' }}">
<div class="form-fieldset-title">
<a {% if not collapsible %}
href="#" class="not-collapsible"
{% else %}
href="#content-{{ fieldset_name }}" data-bs-toggle="collapse"
class="form-fieldset-collapse {{ collapsed ? 'collapsed' }}"
aria-expanded="{{ collapsed ? 'false' : 'true' }}" aria-controls="content-{{ fieldset_name }}"
{% endif %}
>
{% if collapsible %}
<i class="fas fw fa-chevron-right form-fieldset-collapse-marker"></i>
{% endif %}
{% if fieldset_config.icon|default(false) %}
<i class="form-fieldset-icon {{ fieldset_config.icon }}"></i>
{% endif %}
{{ fieldset_config.label|trans|raw }}
</a>
{% if fieldset_config.help|default(false) %}
<div class="form-fieldset-help">{{ fieldset_config.help|trans|raw }}</div>
{% endif %}
</div>
</div>
{% endif %}
<div id="content-{{ fieldset_name }}" class="form-fieldset-body {{ not fieldset_has_header ? 'without-header' }} {{ collapsible ? 'collapse' }} {{ not collapsed ? 'show'}}">
<div class="row">
{% for field in form|filter(field => 'hidden' not in field.vars.block_prefixes and field.vars.ea_crud_form.form_fieldset == fieldset_name) %}
{% if not field.vars.ea_crud_form.form_tab or field.vars.ea_crud_form.form_tab == tab_name %}
{{ form_row(field) }}
{% endif %}
{% endfor %}
</div>
</div>
</fieldset>
</div>
{% else %}
{% macro recursiveFieldsetForm(form) %}
{% for field in form|filter(field => 'hidden' not in field.vars.block_prefixes and ((field.vars.ea_crud_form.form_tab is defined and not field.vars.ea_crud_form.form_tab) or field.vars.ea_crud_form.form_tabs is defined)) %}
{% if field.vars.ea_crud_form.form_tabs is defined %}
{# If the field is a nested CRUD form then only render its children #}
{{ _self.recursiveFieldsetForm(field) }}
{% else %}
{# Render all other fields #}
{{ form_row(field) }}
{% endif %}
{% endfor %}
{% endmacro %}
{{ _self.recursiveFieldsetForm(form) }}
{% endfor %}
{% endblock ea_crud_widget_fieldsets %}
{# EasyAdminAutocomplete form type #}
{% block ea_autocomplete_widget %}
{{ form_widget(form.autocomplete, { attr: attr|merge({ required: required }) }) }}
{% endblock ea_autocomplete_widget %}
{% block ea_autocomplete_inner_label %}
{% set name = form_parent(form).vars.name %}
{{ block('form_label') }}
{% endblock ea_autocomplete_inner_label %}
{# EasyAdmin's CodeEditor form type #}
{% block ea_code_editor_widget %}
{{ form_widget(form, { attr: attr|merge({
'data-ea-code-editor-field': 'true',
'data-language': form.vars.ea_vars.field.customOptions.get('language'),
'data-tab-size': form.vars.ea_vars.field.customOptions.get('tabSize'),
'data-indent-with-tabs': form.vars.ea_vars.field.customOptions.get('indentWithTabs') ? 'true' : 'false',
'data-show-line-numbers': form.vars.ea_vars.field.customOptions.get('showLineNumbers') ? 'true' : 'false',
'data-number-of-rows': form.vars.ea_vars.field.customOptions.get('numOfRows'),
}) }) }}
{% endblock ea_code_editor_widget %}
{# EasyAdmin's TextEditor form type #}
{% block ea_text_editor_widget %}
{{ form_widget(form, { attr: attr|merge({
class: 'ea-text-editor-content d-none',
'data-number-of-rows': form.vars.ea_vars.field.customOptions.get('numOfRows')|default(5),
'data-trix-editor-config': form.vars.ea_vars.field.customOptions.get('trixEditorConfig')|default(null)|json_encode,
}) }) }}
<div class="ea-text-editor-wrapper">
<trix-editor input="{{ id }}" class="trix-content"></trix-editor>
</div>
{% endblock ea_text_editor_widget %}
{# EasyAdminSection form type #}
{% block ea_form_row_row %}
<div class="{{ form.vars.row_attr.class }}"></div>
{% endblock %}
{% block ea_form_column_group_open_row %}
{# if columns are inside tabs, don't add a '.row' element because the tab pane already opens it #}
{% if not form.vars.ea_is_inside_tab|default(false) %}
<div class="row">
{% endif %}
{% endblock ea_form_column_group_open_row %}
{% block ea_form_column_group_close_row %}
{# if columns are inside tabs, we don't add a '.row' element because
the tab pane already opens it; so, don't close it here #}
{% if not form.vars.ea_is_inside_tab|default(false) %}
</div>
{% endif %}
{% endblock ea_form_column_group_close_row %}
{% block ea_form_column_open_row %}
{% set field = form.vars.ea_vars.field %}
{% set field_icon = field.getCustomOption('icon') %}
{% set column_has_title = field_icon != null or field.label != false or field.label != null or field.label != '' or field.help != null %}
<div class="form-column {{ not column_has_title ? 'form-column-no-header' }} {{ field.cssClass }}">
{% if column_has_title %}
<div class="form-column-title">
<div class="form-column-title-content">
{% if field_icon %}<i class="form-column-icon fa fa-fw fa-{{ field_icon }}"></i>{% endif %}
{% if field.label %}{{ field.label|default('')|trans(domain = ea.i18n.translationDomain)|raw }}{% endif %}
</div>
{% if field.help %}
<div class="form-column-help">{{ field.help|trans(domain = ea.i18n.translationDomain)|raw }}</div>
{% endif %}
</div>
{% endif %}
{% endblock ea_form_column_open_row %}
{% block ea_form_column_close_row %}
</div>
{% endblock ea_form_column_close_row %}
{% block ea_form_fieldset_open_row %}
{% set fieldset_has_header = form.vars.label or ea_icon or ea_help %}
<div class="form-fieldset {{ not fieldset_has_header ? 'form-fieldset-no-header' }} {{ ea_css_class }}">
<fieldset>
{% if fieldset_has_header %}
<div class="form-fieldset-header {{ ea_is_collapsible ? 'collapsible' }} {{ ea_help is not empty ? 'with-help' }}">
<div class="form-fieldset-title">
{% set fieldset_title_contents %}
{% if ea_is_collapsible %}
<i class="fas fw fa-chevron-right form-fieldset-collapse-marker"></i>
{% endif %}
{% if ea_icon %}
<i class="form-fieldset-icon {{ ea_icon }}"></i>
{% endif %}
{{ form.vars.label|trans|raw }}
{% endset %}
{% if ea_is_collapsible %}
<a href="#content-{{ form.vars.name }}" data-bs-toggle="collapse"
class="form-fieldset-title-content form-fieldset-collapse {{ ea_is_collapsed ? 'collapsed' }}"
aria-expanded="{{ ea_is_collapsed ? 'false' : 'true' }}" aria-controls="content-{{ form.vars.name }}">
{{ fieldset_title_contents|raw }}
</a>
{% else %}
<span class="not-collapsible form-fieldset-title-content">
{{ fieldset_title_contents|raw }}
</span>
{% endif %}
{% if ea_help %}
<div class="form-fieldset-help">{{ ea_help|trans|raw }}</div>
{% endif %}
</div>
</div>
{% endif %}
<div id="content-{{ form.vars.name }}" class="form-fieldset-body {{ not fieldset_has_header ? 'without-header' }} {{ ea_is_collapsible ? 'collapse' }} {{ not ea_is_collapsed ? 'show'}}">
<div class="row">
{% endblock ea_form_fieldset_open_row %}
{% block ea_form_fieldset_close_row %}
</div>
</div>
</fieldset>
</div>
{% endblock ea_form_fieldset_close_row %}
{% block ea_form_tablist_row %}
{% set tab_id_option_name = constant('EasyCorp\\Bundle\\EasyAdminBundle\\Field\\FormField::OPTION_TAB_ID') %}
{% set tab_is_active_option_name = constant('EasyCorp\\Bundle\\EasyAdminBundle\\Field\\FormField::OPTION_TAB_IS_ACTIVE') %}
{% set tab_error_count_option_name = constant('EasyCorp\\Bundle\\EasyAdminBundle\\Field\\FormField::OPTION_TAB_ERROR_COUNT') %}
{% set field = form.vars.ea_vars.field %}
<div class="nav-tabs-custom form-tabs-tablist">
<ul class="nav nav-tabs">
{% for tab in field.getCustomOption('tabs') %}
<li class="nav-item">
<a class="nav-link {% if tab.getCustomOption(tab_is_active_option_name) %}active{% endif %}" href="#{{ tab.getCustomOption(tab_id_option_name) }}" id="tablist-{{ tab.getCustomOption(tab_id_option_name) }}" data-bs-toggle="tab">
{%- if tab.getCustomOption('icon')|default(false) -%}
<i class="tab-nav-item-icon fa-fw {{ tab.getCustomOption('icon') }}"></i>
{%- endif -%}
{{ tab.label|trans(domain = ea.i18n.translationDomain)|raw }}
{% set tab_error_count = tab.getCustomOption(tab_error_count_option_name) %}
{%- if tab_error_count > 0 -%}
<span class="badge badge-danger" title="{{ 'form.tab.error_badge_title'|trans({'%count%': tab_error_count}, 'EasyAdminBundle') }}">
{{- tab_error_count -}}
</span>
{%- endif -%}
</a>
</li>
{% endfor %}
</ul>
</div>
{% endblock ea_form_tablist_row %}
{% block ea_form_tabpane_group_open_row %}
<div class="nav-tabs-custom form-tabs-content">
<div class="tab-content">
{% endblock ea_form_tabpane_group_open_row %}
{% block ea_form_tabpane_group_close_row %}
</div>
</div>
{% endblock ea_form_tabpane_group_close_row %}
{% block ea_form_tabpane_open_row %}
{% set tab_is_active_option_name = constant('EasyCorp\\Bundle\\EasyAdminBundle\\Field\\FormField::OPTION_TAB_IS_ACTIVE') %}
{% set field = form.vars.ea_vars.field %}
<div id="{{ ea_tab_id }}" class="tab-pane {% if field.getCustomOption(tab_is_active_option_name) %}active{% endif %} {{ ea_css_class }}" {% for key, value in form.vars.attr %}{{ key }}={{ value|e('html_attr') }}{% endfor %}>
{% if ea_help %}
<div class="content-header-help tab-help">
{{ ea_help|trans(domain = ea.i18n.translationDomain)|raw }}
</div>
{% endif %}
<div class="row">
{% endblock ea_form_tabpane_open_row %}
{% block ea_form_tabpane_close_row %}
</div>
</div>
{% endblock ea_form_tabpane_close_row %}
{# EasyAdminFilters form type #}
{% block ea_filters_widget %}
{% set applied_filters = ea.request.query.all()['filters']|default([])|keys %}
{% for field in form %}
<div class="col-12">
<div class="filter-field px-3" data-filter-property="{{ field.vars.name }}">
<div class="filter-heading" id="filter-heading-{{ loop.index }}">
<input type="checkbox" class="filter-checkbox" {% if field.vars.name in applied_filters %}checked{% endif %}>
<a data-bs-toggle="collapse" href="#filter-content-{{ loop.index }}" aria-expanded="{{ field.vars.name in applied_filters ? 'true' : 'false' }}" aria-controls="filter-content-{{ loop.index }}"
{% for name, value in field.vars.label_attr|default([]) %}{{ name }}="{{ value|e('html_attr') }}" {% endfor %}>
{{ field.vars.label|default(field.vars.name|humanize)|trans(domain = ea.i18n.translationDomain) }}
</a>
</div>
<div id="filter-content-{{ loop.index }}" class="filter-content collapse {% if field.vars.name in applied_filters %}show{% endif %}" aria-labelledby="filter-heading-{{ loop.index }}">
<div class="form-widget">
{{ form_widget(field) }}
</div>
</div>
</div>
</div>
{% endfor %}
{% endblock ea_filters_widget %}
{% block comparison_widget %}
{{ form_widget(form, { attr: form.vars.attr|merge({'data-ea-comparison-id': form.vars.id}) }) }}
{% endblock comparison_widget %}
{% block ea_numeric_filter_widget %}
<div class="form-widget-compound">
{{ form_row(form.comparison) }}
{{ form_row(form.value) }}
<div data-ea-value2-of-comparison-id="{{ form.comparison.vars.id }}" class="{{ form.comparison.vars.value != 'between' ? 'd-none' }}">
{{ form_row(form.value2) }}
</div>
</div>
{{- form_errors(form) -}}
{% endblock ea_numeric_filter_widget %}
{% block ea_datetime_filter_widget %}
{{ block('ea_numeric_filter_widget') }}
{% endblock ea_datetime_filter_widget %}
{% block ea_fileupload_widget %}
<div class="ea-fileupload">
<div class="input-group">
{% set placeholder = t('action.choose_file', {}, 'EasyAdminBundle') %}
{% set title = '' %}
{% set filesLabel = 'files'|trans({}, 'EasyAdminBundle') %}
{% if currentFiles %}
{% if multiple %}
{% set placeholder = currentFiles|length ~ ' ' ~ filesLabel %}
{% else %}
{% set placeholder = (currentFiles|first).filename %}
{% set title = (currentFiles|first).mTime|date %}
{% endif %}
{% endif %}
<div class="custom-file">
{{ form_widget(form.file, { attr: form.file.vars.attr|merge({ placeholder: placeholder, title: title, 'data-files-label': filesLabel, class: 'd-none' }) }) }}
{{ form_label(form.file, placeholder, { label_attr: { class: 'custom-file-label' }}) }}
</div>
<div class="input-group-text">
{%- if currentFiles -%}
{% if multiple %}
{{ (currentFiles|reduce((carry, file) => carry + file.size))|ea_filesize }}
{% else %}
{{ (currentFiles|first).size|ea_filesize }}
{% endif %}
{%- endif -%}
{% if allow_delete %}
<label class="btn ea-fileupload-delete-btn {{ currentFiles is empty ? 'd-none' }}" for="{{ form.delete.vars.id }}">
<i class="fa fa-trash-o"></i>
</label>
{% endif %}
<label class="btn" for="{{ form.file.vars.id }}">
<i class="fa fa-folder-open-o"></i>
</label>
</div>
</div>
{% if multiple and currentFiles %}
<div class="form-control fileupload-list">
<table class="fileupload-table">
<tbody>
{% for file in currentFiles %}
<tr>
<td>
{% if download_path %}<a href="{{ asset(download_path ~ file.filename) }}">{% endif %}
<span title="{{ file.mTime|date }}">
<i class="fa fa-file-o"></i> {{ file.filename }}
</span>
{% if download_path %}</a>{% endif %}
</td>
<td class="text-right file-size">{{ file.size|ea_filesize }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{% if allow_delete %}
<div class="d-none">{{ form_widget(form.delete, { label: false }) }}</div>
{% endif %}
</div>
{{ form_errors(form.file) }}
{% endblock %}
{% block TODO_ea_fileupload_widget %}
{% set placeholder = '' %}
{% set title = '' %}
{% set filesLabel = 'files'|trans({}, 'EasyAdminBundle') %}
{% if currentFiles %}
{% if multiple %}
{% set placeholder = currentFiles|length ~ ' ' ~ filesLabel %}
{% else %}
{% set placeholder = (currentFiles|first).filename %}
{% set title = (currentFiles|first).mTime|date %}
{% endif %}
{% endif %}
<div class="ea-fileupload">
<div class="input-group">
{{ form_widget(form.file, { attr: form.file.vars.attr|merge({ placeholder: placeholder, title: title, 'data-files-label': filesLabel, class: 'form-control' }) }) }}
{% if currentFiles %}
<span class="input-group-text">
{% if multiple %}
{{ (currentFiles|reduce((carry, file) => carry + file.size))|ea_filesize }}
{% else %}
{{ (currentFiles|first).size|ea_filesize }}
{% endif %}
</span>
{% endif %}
{% if currentFiles and allow_delete %}
<button class="btn ea-fileupload-delete-btn">
<i class="fa fa-trash-o"></i>
</button>
{% endif %}
{% if currentFiles %}
<button class="btn">
<i class="fa fa-folder-open-o"></i>
</button>
{% endif %}
</div>
{% if multiple and currentFiles %}
<div class="form-control fileupload-list">
<table class="fileupload-table">
<tbody>
{% for file in currentFiles %}
<tr>
<td>
{% if download_path %}<a href="{{ asset(download_path ~ file.filename) }}">{% endif %}
<span title="{{ file.mTime|date }}">
<i class="fa fa-file-o"></i> {{ file.filename }}
</span>
{% if download_path %}</a>{% endif %}
</td>
<td class="text-right file-size">{{ file.size|ea_filesize }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{% if allow_delete %}
<div class="d-none">{{ form_widget(form.delete, { label: false }) }}</div>
{% endif %}
</div>
{{ form_errors(form.file) }}
{% endblock %}
{% block ea_slug_widget %}
{% set attr = attr|merge({
'data-ea-slug-field': '',
'data-target': target|split('|')|map(name => form.parent.children[name].vars.id)|json_encode
}) %}
{% if attr['data-confirm-text'] is defined %}
{% set attr = attr|merge({
'data-confirm-text': attr['data-confirm-text']|trans
}) %}
{% endif %}
<div class="input-group">
{{ block('form_widget') }}
<button type="button" class="btn">
<i class="fas fa-lock fa-fw"></i>
</button>
</div>
{% endblock %}