{% extends '@!SonataAdmin/standard_layout.html.twig' %}
{% block html_attributes %}{{ parent() }} lang="{{ app.request.locale }}" {% endblock %}
{% set adminCode = '' %}
{% if admin is defined %}
{% set adminCode = admin.getCode | pregreplace('/(.*)\\./', '') %}
{% set cssRoute = 'assets/admin/css/' ~ adminCode ~ '/specific.css' %}
{% set jsRoute = 'assets/admin/js/' ~ adminCode ~ '/specific.js' %}
{% endif %}
{% block stylesheets %}
<link rel="icon" type="image/x-icon" href="{{ asset('assets/img/favicon.png') }}">
{{ parent() }}
<link rel="stylesheet" href="{{ asset('assets/prometeo/css/list-action-toolbar-prometeo.css') }}">
<link rel="stylesheet" href="{{ asset('assets/prometeo/css/modal-nav-prometeo.css') }}">
<link rel="stylesheet" href="{{ asset('assets/prometeo/css/nav-filter-prometeo.css') }}">
<link rel="stylesheet" href="{{ asset('assets/prometeo/css/nav-prometeo.css') }}">
<link rel="stylesheet" href="{{ asset('assets/prometeo/css/model-list-type.css') }}">
<link rel="stylesheet" href="{{ asset('assets/prometeo/css/table-card.css') }}">
<link rel="stylesheet" href="{{ asset('assets/plugins/bootstrap-dialog/css/bootstrap-dialog.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/plugins/bootstrap-dialog/css/bootstrap-dialog.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/plugins/webfonts/uicons-solid-rounded.css') }}">
<link rel="stylesheet" href="{{ asset('assets/plugins/webfonts/uicons-regular-rounded.css') }}">
<link rel="stylesheet" href="{{ asset('assets/plugins/codemirror/lib/codemirror.css') }}">
<link rel="stylesheet" href="{{ asset('assets/css/crl.css') }}?v=260609c901">
{# FIX-260622-001 (C) — Resaltado visual del campo cuya condition_handler fallo. #}
<link rel="stylesheet" href="{{ asset('assets/css/condition-failed.css') }}?v=260622a">
{# FIX-260626-003 — Visual fixes A1: boxed-title sin underline, EmpresaSector ancho contenido, labels min-height, textarea translatable altura controlada. #}
<link rel="stylesheet" href="{{ asset('assets/css/expedion-visual-fixes.css') }}?v=260710a">
<script src="{{ asset('assets/js/expedion-button-relabel.js') }}?v=260710b-tk-da9e8d" defer></script>
{# TK-bca637ac5d79 — indicador visual global de "cargando" durante submits.
Cargado en <head> con defer para instalar delegados antes del primer submit. #}
<script src="{{ asset('assets/js/expedion-loading-indicator.js') }}?v=260929a-tk-162b11" defer></script>
{# TK-056dc9d8fe17 — retira .has-error localmente al corregir un campo,
sin esperar al siguiente round-trip al servidor (que sigue siendo la
fuente de verdad en el proximo submit). #}
<script src="{{ asset('assets/js/expedion-clear-error-onedit.js') }}?v=260929a-tk-056dc9" defer></script>
{% if admin is defined and cssRoute is defined %}
<link rel="stylesheet" href="{{ asset(cssRoute) }}">
{% endif %}
{# FIX-260518-005 — marcado visual de traducciones auto-generadas por ChatGPT.
Doble gate AND: env=dev + APP_TRANS_MARK_AUTO=1. En cualquier otro caso, el
bloque <style> ni se renderiza. Sutil por diseno (emoji 50% opaco + outline
dashed naranja). Si rompe layouts especificos, usar `|trans_raw` en su lugar.
#}
{% if app.environment == 'dev' and app.request.server.get('APP_TRANS_MARK_AUTO') == '1' %}
<style>
[data-trans-src="chatgpt"]::before { content: "🤖 "; opacity: 0.5; font-size: 0.85em; }
[data-trans-src="chatgpt"] { outline: 1px dashed #ff9800; outline-offset: 1px; }
</style>
{% endif %}
{% endblock %}
{% block javascripts %}
{{ parent() }}
{% include 'JS/translations_js.html.twig' %}
{% include 'JS/env_js.html.twig' %}
{% include 'JS/routes_js.html.twig' %}
<script src="{{ asset("assets/plugins/bootstrap-dialog/js/bootstrap-dialog.min.js") }}"></script>
<script src="{{ asset("assets/plugins/codemirror/lib/codemirror.js") }}"></script>
<script src="{{ asset("assets/plugins/codemirror/lib/mode/javascript/javascript.js") }}"></script>
<script src="{{ asset("assets/plugins/codemirror/lib/mode/css/css.js") }}"></script>
<script src="{{ asset("assets/plugins/codemirror/lib/mode/xml/xml.js") }}"></script>
<script src="{{ asset("assets/plugins/codemirror/lib/mode/php/php.js") }}"></script>
<script src="{{ asset('assets/plugins/autonumeric/autonumeric.min.js') }}"></script>
<script src="{{ asset('assets/plugins/autonumeric/autonumeric.functions.js') }}"></script>
<script src="{{ asset("assets/prometeo/js/jquery.functions.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/combos-anidados.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/table-to-card.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/nav-prometeo.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/modal-nav-prometeo.js") }}"></script>
<script src="{{ asset("assets/js/nav-prometeo-crl.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/pre-load-image.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/pre-load-file.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/modal-view-image-original.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/vichuploader-delete.js") }}"></script>
<script src="{{ asset("assets/js/crl.js") }}?v=260608c902"></script>
{# FIX-260622-001 (C) — Lee warning_payload del flashbag y resalta los campos
cuyo condition_handler fallo. Aditivo: si no hay flash, el div no se pinta. #}
{% set _cfp = app.session.flashbag.get('warning_payload') %}
{% if _cfp is not empty %}
{% set _cfp_raw = _cfp[0]|default('{"fields":[]}') %}
<div id="condition-failed-payload" data-field-ids='{{ _cfp_raw|raw }}' style="display:none"></div>
{% endif %}
<script src="{{ asset('assets/js/condition-failed-highlight.js') }}?v=260622a"></script>
{# FIX-260518-011 — gate por existencia para evitar 404 + NotFoundHttpException
en dev.log cuando la entidad no tiene `specific.js` propio. #}
{% if admin is defined and jsRoute is defined and public_asset_exists(jsRoute) %}
<script src="{{ asset(jsRoute) }}"></script>
{% endif %}
<script>
$(function()
{
$("form").on("submit", function()
{
$("form").find("input.numeric").getNumericValues();
});
$("input.percents").setPercent();
$("input.numerics").setNumeric();
$("input.currencies").setCurrency();
$(".codemirror-css").each(function(index, value)
{
CodeMirror.fromTextArea(value, {
lineWrapping: true,
fixedGutter: false,
foldGutter: true,
mode: "css",
theme: "darcula",
lineNumbers: true,
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
});
});
$(".codemirror-js").each(function(index, value)
{
CodeMirror.fromTextArea(value, {
lineWrapping: true,
fixedGutter: false,
foldGutter: true,
mode: "javascript",
theme: "darcula",
lineNumbers: true,
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"]
});
});
$(".codemirror-xml").each(function(index, value)
{
CodeMirror.fromTextArea(value, {
lineWrapping: true,
fixedGutter: false,
foldGutter: true,
mode: "xml",
theme: "darcula",
lineNumbers: true,
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"]
});
});
$(".codemirror-php").each(function(index, value)
{
CodeMirror.fromTextArea(value, {
lineWrapping: true,
fixedGutter: false,
foldGutter: true,
mode: {
name: 'php',
startOpen: true
},
theme: "darcula",
lineNumbers: true,
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"]
});
});
});
</script>
{% endblock %}
{% block admin_lte_skin_class %}
{{ parent() }}
{{ adminCode }}
{% endblock %}
{% block body_attributes %}
{{ parent() }}
{% if admin is defined %}id="{{ admin.code|replace({'.':'_' }) }}"{% endif %}
{% if admin is defined %}data-code="{{ admin.code }}"{% endif %}
{% endblock %}
{% block logo %}
{% apply spaceless %}
<a href="#" class="sidebar-toggle fa5" data-toggle="push-menu"
role="button" title="{{ 'toggle_navigation'|trans({}, 'SonataAdminBundle') }}">
<span class="sr-only">{{ 'toggle_navigation'|trans({}, 'SonataAdminBundle') }}</span>
</a>
{% endapply %}
{% endblock %}
{% block sonata_nav %}
<nav class="navbar navbar-static-top">
{% apply spaceless %}
<a class="logo" href="{{ path('sonata_admin_dashboard') }}">
{% if 'icon' == sonata_config.getOption('logo_content') or 'all' == sonata_config.getOption('logo_content') %}
<img src="{{ asset(sonata_config.logo) }}" alt="{{ sonata_config.title }}">
{% endif %}
{% if 'text' == sonata_config.getOption('logo_content') or 'all' == sonata_config.getOption('logo_content') %}
<span>{{ sonata_config.title }}</span>
{% endif %}
</a>
{% endapply %}
<div class="navbar-left {% if _tab_menu is not empty %} tab-menu {% endif %}">
{% block sonata_breadcrumb %}
{{ parent() }}
{% endblock sonata_breadcrumb %}
</div>
{% block sonata_top_nav_menu %}
{% if app.user and is_granted(sonata_config.getOption('role_admin')) %}
<div class="navbar-custom-menu">
<ul class="nav navbar-nav">
{% block languages %}
{% for locale in locales | split(',') %}
<li><a href="{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params') | merge({ '_locale': locale | trim })) }}">{{ (localesLiteral | split(','))[loop.index0] | trim }}</a></li>
{% endfor %}
{% endblock languages %}
{% block sonata_top_nav_menu_add_block %}
<li class="dropdown sonata-actions manuals menu-links">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<span id="icon-menu-manuales" class="icon-menu fi fi-sr-before-graduation-cap" title="Manuales de Usuario"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a class="link-descarga" target="_blank" href="{{ asset('downloads/20240305MaquetaV1.pdf') }}">
<span class="icon-menu fi fi-sr-before-book-user" title="Maqueta Preco Version 1">Maqueta Preco V.1</span>
</a>
</li>
</ul>
</li>
{% endblock %}
{% block sonata_top_nav_menu_user_block %}
{% endblock %}
</ul>
</div>
{% endif %}
{% endblock %}
</nav>
{% endblock sonata_nav %}
{% block sonata_wrapper %}
{% block sonata_left_side %}
{{ parent() }}
{% endblock sonata_left_side %}
<div class="content-wrapper {% if _tab_menu is not empty %} tab-menu {% endif %}">
{% block sonata_page_content %}
{{ parent() }}
{% endblock sonata_page_content %}
</div>
{% endblock sonata_wrapper %}
{% block sonata_page_content_nav %}
{% if _navbar_title is not empty
or _tab_menu is not empty
or _actions is not empty
or _list_filters_actions is not empty
%}
<div class="content-header__title {% if _tab_menu is not empty %} tab-menu {% endif %}">
{% if _tab_menu is not empty %}
<div class="navbar-left">
{{ _tab_menu|raw }}
</div>
{% endif %}
</div>
<nav id="navbar-prometeo" class="navbar navbar-default {% if action == 'list' %} action-list {% endif %}" role="navigation">
<div class="container-fluid">
{% block tab_menu_navbar_header %}
{% if _navbar_title is not empty %}
<div class="navbar-header"></div>
{% endif %}
{% endblock %}
<div class="navbar-collapse">
{# {% if _tab_menu is not empty %}#}
{# <div class="navbar-left">#}
{# {{ _tab_menu|raw }}#}
{# </div>#}
{# {% endif %}#}
{# {% if admin is defined and action is defined and action == 'list' and admin.listModes|length > 1 %}#}
{# <div class="nav navbar-right btn-group">#}
{# {% for mode, settings in admin.listModes %}#}
{# <a href="{{ admin.generateUrl('list', app.request.query.all|merge({_list_mode: mode})) }}" class="btn btn-default navbar-btn btn-sm{% if admin.getListMode() == mode %} active{% endif %}"><i class="{{ settings.class }}"></i></a>#}
{# {% endfor %}#}
{# </div>#}
{# {% endif %}#}
{% block sonata_admin_content_actions_wrappers %}
{# {% if _actions|replace({ '<li>': '', '</li>': '' })|trim is not empty %}#}
{# <ul class="nav navbar-nav navbar-right">#}
{# {% if _actions|split('</a>')|length > 2 %}#}
{# <li class="dropdown sonata-actions">#}
{# <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ 'link_actions'|trans({}, 'SonataAdminBundle') }} <b class="caret"></b></a>#}
{# <ul class="dropdown-menu" role="menu">#}
{# {{ _actions|raw }}#}
{# </ul>#}
{# </li>#}
{# {% else %}#}
{# {{ _actions|raw }}#}
{# {% endif %}#}
{# </ul>#}
{# {% endif %}#}
{% if action == 'list' %}
<form {# action="{{ app.request.pathinfo }}" method="GET" #}>
{% endif %}
<ul class="nav navbar-nav navbar-left">
{% block navbar_actions_filters_prometeo_left %}
{% if action == 'list' %}
{% include 'navbar_actions_filters_prometeo_left_list.html.twig' %}
{% elseif action == 'show' %}
{% include 'navbar_actions_filters_prometeo_left_show.html.twig' %}
{% else %}
{% include 'navbar_actions_filters_prometeo_left_edit.html.twig' %}
{% endif %}
{% endblock navbar_actions_filters_prometeo_left %}
</ul>
{% if action == 'edit' %}
<ul class="nav navbar-nav navbar-center">
{% include 'navbar_actions_prometeo_center_edit.html.twig' %}
</ul>
{% endif %}
<ul class="nav navbar-nav navbar-right">
{% block navbar_actions_filters_prometeo_right %}
{% if action == 'list' %}
{% include 'navbar_actions_filters_prometeo_right_list.html.twig' %}
{% elseif action == 'show' %}
{% include 'navbar_actions_filters_prometeo_right_show.html.twig' %}
{% else %}
{% include 'navbar_actions_filters_prometeo_right_edit.html.twig' %}
{% endif %}
{% endblock navbar_actions_filters_prometeo_right %}
</ul>
{% if action == 'list' %}
</form>
{% endif %}
{% endblock sonata_admin_content_actions_wrappers %}
{# {% if _list_filters_actions is not empty %}#}
{# {{ _list_filters_actions|raw }}#}
{# {% endif %}#}
</div>
</div>
</nav>
{% endif %}
{% endblock sonata_page_content_nav %}
{% block side_bar_after_nav_content %}
<a href="/es/admin/logout" style="padding-bottom: 1px; margin-bottom: 1px;"><span id="icon-menu-user" class="icon-menu fi fi-sr-before-user" title="{{ 'user_block_logout'|trans({}, 'SonataUserBundle') }}"></span></a>
<a href="{{ path('admin_app_domain_sonatauseruser_edit', {id: app.user.id}) }}" style="padding-top: 1px; margin-top: 1px;" title="Mi Perfil">{{ app.user.username }}</a>
<div class="app-info" style="background-color:#666466; color:#9D9B9B; position: absolute; bottom: 0px; width: 100%; padding: 5px 5px;">
<a href="/info" target="_blank" title="versión {{ appInfoVer }}">
<img src="{{ asset('assets/img/logo.png') }}" alt="{{ sonata_config.title }}" style="height: auto; width: 15px;">
<span class="version" style="border-left: 1px solid; color:#9D9B9B; padding-left: 5px;">V {{ appInfoVer }}</span>
</a>
</div>
{% endblock %}