templates/bundles/SonataAdminBundle/standard_layout.html.twig line 1

Open in your IDE?
  1. {% extends '@!SonataAdmin/standard_layout.html.twig' %}
  2. {% block html_attributes %}{{ parent() }} lang="{{ app.request.locale }}" {% endblock %}
  3. {% set adminCode = '' %}
  4. {% if admin is defined %}
  5.     {% set adminCode = admin.getCode | pregreplace('/(.*)\\./', '') %}
  6.     {% set cssRoute = 'assets/admin/css/' ~ adminCode ~ '/specific.css' %}
  7.     {% set jsRoute = 'assets/admin/js/' ~ adminCode ~ '/specific.js' %}
  8. {% endif %}
  9. {% block stylesheets %}
  10.     <link rel="icon" type="image/x-icon" href="{{ asset('assets/img/favicon.png') }}">
  11.     {{ parent() }}
  12.     <link rel="stylesheet" href="{{ asset('assets/prometeo/css/list-action-toolbar-prometeo.css') }}">
  13.     <link rel="stylesheet" href="{{ asset('assets/prometeo/css/modal-nav-prometeo.css') }}">
  14.     <link rel="stylesheet" href="{{ asset('assets/prometeo/css/nav-filter-prometeo.css') }}">
  15.     <link rel="stylesheet" href="{{ asset('assets/prometeo/css/nav-prometeo.css') }}">
  16.     <link rel="stylesheet" href="{{ asset('assets/prometeo/css/model-list-type.css') }}">
  17.     <link rel="stylesheet" href="{{ asset('assets/prometeo/css/table-card.css') }}">
  18.     <link rel="stylesheet" href="{{ asset('assets/plugins/bootstrap-dialog/css/bootstrap-dialog.min.css') }}">
  19.     <link rel="stylesheet" href="{{ asset('assets/plugins/bootstrap-dialog/css/bootstrap-dialog.min.css') }}">
  20.     <link rel="stylesheet" href="{{ asset('assets/plugins/webfonts/uicons-solid-rounded.css') }}">
  21.     <link rel="stylesheet" href="{{ asset('assets/plugins/webfonts/uicons-regular-rounded.css') }}">
  22.     <link rel="stylesheet" href="{{ asset('assets/plugins/codemirror/lib/codemirror.css') }}">
  23.     <link rel="stylesheet" href="{{ asset('assets/css/crl.css') }}?v=260609c901">
  24.     {# FIX-260622-001 (C) — Resaltado visual del campo cuya condition_handler fallo. #}
  25.     <link rel="stylesheet" href="{{ asset('assets/css/condition-failed.css') }}?v=260622a">
  26.     {# FIX-260626-003 — Visual fixes A1: boxed-title sin underline, EmpresaSector ancho contenido, labels min-height, textarea translatable altura controlada. #}
  27.     <link rel="stylesheet" href="{{ asset('assets/css/expedion-visual-fixes.css') }}?v=260710a">
  28.     <script src="{{ asset('assets/js/expedion-button-relabel.js') }}?v=260710b-tk-da9e8d" defer></script>
  29.     {# TK-bca637ac5d79 — indicador visual global de "cargando" durante submits.
  30.        Cargado en <head> con defer para instalar delegados antes del primer submit. #}
  31.     <script src="{{ asset('assets/js/expedion-loading-indicator.js') }}?v=260929a-tk-162b11" defer></script>
  32.     {# TK-056dc9d8fe17 — retira .has-error localmente al corregir un campo,
  33.        sin esperar al siguiente round-trip al servidor (que sigue siendo la
  34.        fuente de verdad en el proximo submit). #}
  35.     <script src="{{ asset('assets/js/expedion-clear-error-onedit.js') }}?v=260929a-tk-056dc9" defer></script>
  36.     {% if admin is defined and cssRoute is defined %}
  37.         <link rel="stylesheet" href="{{ asset(cssRoute) }}">
  38.     {% endif %}
  39.     {# FIX-260518-005 — marcado visual de traducciones auto-generadas por ChatGPT.
  40.        Doble gate AND: env=dev + APP_TRANS_MARK_AUTO=1. En cualquier otro caso, el
  41.        bloque <style> ni se renderiza. Sutil por diseno (emoji 50% opaco + outline
  42.        dashed naranja). Si rompe layouts especificos, usar `|trans_raw` en su lugar.
  43.     #}
  44.     {% if app.environment == 'dev' and app.request.server.get('APP_TRANS_MARK_AUTO') == '1' %}
  45.         <style>
  46.             [data-trans-src="chatgpt"]::before { content: "🤖 "; opacity: 0.5; font-size: 0.85em; }
  47.             [data-trans-src="chatgpt"]         { outline: 1px dashed #ff9800; outline-offset: 1px; }
  48.         </style>
  49.     {% endif %}
  50. {% endblock %}
  51. {% block javascripts %}
  52.     {{ parent() }}
  53.     {% include 'JS/translations_js.html.twig' %}
  54.     {% include 'JS/env_js.html.twig' %}
  55.     {% include 'JS/routes_js.html.twig' %}
  56.     <script src="{{ asset("assets/plugins/bootstrap-dialog/js/bootstrap-dialog.min.js") }}"></script>
  57.     <script src="{{ asset("assets/plugins/codemirror/lib/codemirror.js") }}"></script>
  58.     <script src="{{ asset("assets/plugins/codemirror/lib/mode/javascript/javascript.js") }}"></script>
  59.     <script src="{{ asset("assets/plugins/codemirror/lib/mode/css/css.js") }}"></script>
  60.     <script src="{{ asset("assets/plugins/codemirror/lib/mode/xml/xml.js") }}"></script>
  61.     <script src="{{ asset("assets/plugins/codemirror/lib/mode/php/php.js") }}"></script>
  62.     <script src="{{ asset('assets/plugins/autonumeric/autonumeric.min.js') }}"></script>
  63.     <script src="{{ asset('assets/plugins/autonumeric/autonumeric.functions.js') }}"></script>
  64.     <script src="{{ asset("assets/prometeo/js/jquery.functions.js") }}"></script>
  65.     <script src="{{ asset("assets/prometeo/js/combos-anidados.js") }}"></script>
  66.     <script src="{{ asset("assets/prometeo/js/table-to-card.js") }}"></script>
  67.     <script src="{{ asset("assets/prometeo/js/nav-prometeo.js") }}"></script>
  68.     <script src="{{ asset("assets/prometeo/js/modal-nav-prometeo.js") }}"></script>
  69.     <script src="{{ asset("assets/js/nav-prometeo-crl.js") }}"></script>
  70.     <script src="{{ asset("assets/prometeo/js/pre-load-image.js") }}"></script>
  71.     <script src="{{ asset("assets/prometeo/js/pre-load-file.js") }}"></script>
  72.     <script src="{{ asset("assets/prometeo/js/modal-view-image-original.js") }}"></script>
  73.     <script src="{{ asset("assets/prometeo/js/vichuploader-delete.js") }}"></script>
  74.     <script src="{{ asset("assets/js/crl.js") }}?v=260608c902"></script>
  75.     {# FIX-260622-001 (C) — Lee warning_payload del flashbag y resalta los campos
  76.        cuyo condition_handler fallo. Aditivo: si no hay flash, el div no se pinta. #}
  77.     {% set _cfp = app.session.flashbag.get('warning_payload') %}
  78.     {% if _cfp is not empty %}
  79.         {% set _cfp_raw = _cfp[0]|default('{"fields":[]}') %}
  80.         <div id="condition-failed-payload" data-field-ids='{{ _cfp_raw|raw }}' style="display:none"></div>
  81.     {% endif %}
  82.     <script src="{{ asset('assets/js/condition-failed-highlight.js') }}?v=260622a"></script>
  83.     {# FIX-260518-011 — gate por existencia para evitar 404 + NotFoundHttpException
  84.        en dev.log cuando la entidad no tiene `specific.js` propio. #}
  85.     {% if admin is defined and jsRoute is defined and public_asset_exists(jsRoute) %}
  86.         <script src="{{ asset(jsRoute) }}"></script>
  87.     {% endif %}
  88.     <script>
  89.         $(function()
  90.         {
  91.             $("form").on("submit", function()
  92.             {
  93.                 $("form").find("input.numeric").getNumericValues();
  94.             });
  95.             $("input.percents").setPercent();
  96.             $("input.numerics").setNumeric();
  97.             $("input.currencies").setCurrency();
  98.             $(".codemirror-css").each(function(index, value)
  99.             {
  100.                 CodeMirror.fromTextArea(value, {
  101.                     lineWrapping: true,
  102.                     fixedGutter: false,
  103.                     foldGutter: true,
  104.                     mode: "css",
  105.                     theme: "darcula",
  106.                     lineNumbers: true,
  107.                     gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
  108.                 });
  109.             });
  110.             $(".codemirror-js").each(function(index, value)
  111.             {
  112.                 CodeMirror.fromTextArea(value, {
  113.                     lineWrapping: true,
  114.                     fixedGutter: false,
  115.                     foldGutter: true,
  116.                     mode: "javascript",
  117.                     theme: "darcula",
  118.                     lineNumbers: true,
  119.                     gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"]
  120.                 });
  121.             });
  122.             $(".codemirror-xml").each(function(index, value)
  123.             {
  124.                 CodeMirror.fromTextArea(value, {
  125.                     lineWrapping: true,
  126.                     fixedGutter: false,
  127.                     foldGutter: true,
  128.                     mode: "xml",
  129.                     theme: "darcula",
  130.                     lineNumbers: true,
  131.                     gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"]
  132.                 });
  133.             });
  134.             $(".codemirror-php").each(function(index, value)
  135.             {
  136.                 CodeMirror.fromTextArea(value, {
  137.                     lineWrapping: true,
  138.                     fixedGutter: false,
  139.                     foldGutter: true,
  140.                     mode: {
  141.                         name: 'php',
  142.                         startOpen: true
  143.                     },
  144.                     theme: "darcula",
  145.                     lineNumbers: true,
  146.                     gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"]
  147.                 });
  148.             });
  149.         });
  150.     </script>
  151. {% endblock %}
  152. {% block admin_lte_skin_class %}
  153.     {{ parent() }}
  154.     {{ adminCode }}
  155. {% endblock %}
  156. {% block body_attributes %}
  157.     {{ parent() }}
  158.     {% if admin is defined %}id="{{ admin.code|replace({'.':'_' }) }}"{% endif %}
  159.     {% if admin is defined %}data-code="{{ admin.code }}"{% endif %}
  160. {% endblock %}
  161. {% block logo %}
  162.     {% apply spaceless %}
  163.         <a href="#" class="sidebar-toggle fa5" data-toggle="push-menu"
  164.            role="button" title="{{ 'toggle_navigation'|trans({}, 'SonataAdminBundle') }}">
  165.             <span class="sr-only">{{ 'toggle_navigation'|trans({}, 'SonataAdminBundle') }}</span>
  166.         </a>
  167.     {% endapply %}
  168. {% endblock %}
  169. {% block sonata_nav %}
  170.     <nav class="navbar navbar-static-top">
  171.         {% apply spaceless %}
  172.             <a class="logo" href="{{ path('sonata_admin_dashboard') }}">
  173.                 {% if 'icon' == sonata_config.getOption('logo_content') or 'all' == sonata_config.getOption('logo_content') %}
  174.                     <img src="{{ asset(sonata_config.logo) }}" alt="{{ sonata_config.title }}">
  175.                 {% endif %}
  176.                 {% if 'text' == sonata_config.getOption('logo_content') or 'all' == sonata_config.getOption('logo_content') %}
  177.                     <span>{{ sonata_config.title }}</span>
  178.                 {% endif %}
  179.             </a>
  180.         {% endapply %}
  181.         <div class="navbar-left {% if _tab_menu is not empty %} tab-menu {% endif %}">
  182.             {% block sonata_breadcrumb %}
  183.                 {{ parent() }}
  184.             {% endblock sonata_breadcrumb %}
  185.         </div>
  186.         {% block sonata_top_nav_menu %}
  187.             {% if app.user and is_granted(sonata_config.getOption('role_admin')) %}
  188.                 <div class="navbar-custom-menu">
  189.                     <ul class="nav navbar-nav">
  190.                         {% block languages %}
  191.                             {% for locale in locales | split(',') %}
  192.                                 <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>
  193.                             {% endfor %}
  194.                         {% endblock languages %}
  195.                         {% block sonata_top_nav_menu_add_block %}
  196.                             <li class="dropdown sonata-actions manuals menu-links">
  197.                                 <a href="#" class="dropdown-toggle" data-toggle="dropdown">
  198.                                     <span id="icon-menu-manuales" class="icon-menu fi fi-sr-before-graduation-cap" title="Manuales de Usuario"></span>
  199.                                 </a>
  200.                                 <ul class="dropdown-menu" role="menu">
  201.                                     <li>
  202.                                         <a class="link-descarga" target="_blank" href="{{ asset('downloads/20240305MaquetaV1.pdf') }}">
  203.                                             <span class="icon-menu fi fi-sr-before-book-user" title="Maqueta Preco Version 1">Maqueta Preco V.1</span>
  204.                                         </a>
  205.                                     </li>
  206.                                 </ul>
  207.                             </li>
  208.                         {% endblock %}
  209.                         {% block sonata_top_nav_menu_user_block %}
  210.                         {% endblock %}
  211.                     </ul>
  212.                 </div>
  213.             {% endif %}
  214.         {% endblock %}
  215.     </nav>
  216. {% endblock sonata_nav %}
  217. {% block sonata_wrapper %}
  218.     {% block sonata_left_side %}
  219.         {{ parent() }}
  220.     {% endblock sonata_left_side %}
  221.     <div class="content-wrapper {% if _tab_menu is not empty %} tab-menu {% endif %}">
  222.         {% block sonata_page_content %}
  223.             {{ parent() }}
  224.         {% endblock sonata_page_content %}
  225.     </div>
  226. {% endblock sonata_wrapper %}
  227. {% block sonata_page_content_nav %}
  228.         {% if _navbar_title is not empty
  229.             or _tab_menu is not empty
  230.             or _actions is not empty
  231.             or _list_filters_actions is not empty
  232.         %}
  233.             <div class="content-header__title {% if _tab_menu is not empty %} tab-menu {% endif %}">
  234.                 {% if _tab_menu is not empty %}
  235.                     <div class="navbar-left">
  236.                         {{ _tab_menu|raw }}
  237.                     </div>
  238.                 {% endif %}
  239.             </div>
  240.             <nav id="navbar-prometeo" class="navbar navbar-default {% if action == 'list' %} action-list {% endif %}" role="navigation">
  241.                 <div class="container-fluid">
  242.                     {% block tab_menu_navbar_header %}
  243.                         {% if _navbar_title is not empty %}
  244.                             <div class="navbar-header"></div>
  245.                         {% endif %}
  246.                     {% endblock %}
  247.                     <div class="navbar-collapse">
  248.                         {#                    {% if _tab_menu is not empty %}#}
  249.                         {#                        <div class="navbar-left">#}
  250.                         {#                            {{ _tab_menu|raw }}#}
  251.                         {#                        </div>#}
  252.                         {#                    {% endif %}#}
  253.                         {#                    {% if admin is defined and action is defined and action == 'list' and admin.listModes|length > 1 %}#}
  254.                         {#                        <div class="nav navbar-right btn-group">#}
  255.                         {#                            {% for mode, settings in admin.listModes %}#}
  256.                         {#                                <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>#}
  257.                         {#                            {% endfor %}#}
  258.                         {#                        </div>#}
  259.                         {#                    {% endif %}#}
  260.                         {% block sonata_admin_content_actions_wrappers %}
  261.                             {#                        {% if _actions|replace({ '<li>': '', '</li>': '' })|trim is not empty %}#}
  262.                             {#                            <ul class="nav navbar-nav navbar-right">#}
  263.                             {#                                {% if _actions|split('</a>')|length > 2 %}#}
  264.                             {#                                    <li class="dropdown sonata-actions">#}
  265.                             {#                                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ 'link_actions'|trans({}, 'SonataAdminBundle') }} <b class="caret"></b></a>#}
  266.                             {#                                        <ul class="dropdown-menu" role="menu">#}
  267.                             {#                                            {{ _actions|raw }}#}
  268.                             {#                                        </ul>#}
  269.                             {#                                    </li>#}
  270.                             {#                                {% else %}#}
  271.                             {#                                    {{ _actions|raw }}#}
  272.                             {#                                {% endif %}#}
  273.                             {#                            </ul>#}
  274.                             {#                        {% endif %}#}
  275.                             {% if action == 'list' %}
  276.                                 <form {# action="{{ app.request.pathinfo }}" method="GET" #}>
  277.                             {% endif %}
  278.                             <ul class="nav navbar-nav navbar-left">
  279.                                 {% block navbar_actions_filters_prometeo_left %}
  280.                                     {% if action == 'list' %}
  281.                                         {% include 'navbar_actions_filters_prometeo_left_list.html.twig' %}
  282.                                     {% elseif action == 'show' %}
  283.                                         {% include 'navbar_actions_filters_prometeo_left_show.html.twig' %}
  284.                                     {% else %}
  285.                                         {% include 'navbar_actions_filters_prometeo_left_edit.html.twig' %}
  286.                                     {% endif %}
  287.                                 {% endblock navbar_actions_filters_prometeo_left %}
  288.                             </ul>
  289.                             {% if action == 'edit' %}
  290.                                 <ul class="nav navbar-nav navbar-center">
  291.                                     {% include 'navbar_actions_prometeo_center_edit.html.twig' %}
  292.                                 </ul>
  293.                             {% endif %}
  294.                             <ul class="nav navbar-nav navbar-right">
  295.                                 {% block navbar_actions_filters_prometeo_right %}
  296.                                     {% if action == 'list' %}
  297.                                         {% include 'navbar_actions_filters_prometeo_right_list.html.twig' %}
  298.                                     {% elseif action == 'show' %}
  299.                                         {% include 'navbar_actions_filters_prometeo_right_show.html.twig' %}
  300.                                     {% else %}
  301.                                         {% include 'navbar_actions_filters_prometeo_right_edit.html.twig' %}
  302.                                     {% endif %}
  303.                                 {% endblock navbar_actions_filters_prometeo_right %}
  304.                             </ul>
  305.                             {% if action == 'list' %}
  306.                                 </form>
  307.                             {% endif %}
  308.                         {% endblock sonata_admin_content_actions_wrappers %}
  309.                         {#                    {% if _list_filters_actions is not empty %}#}
  310.                         {#                        {{ _list_filters_actions|raw }}#}
  311.                         {#                    {% endif %}#}
  312.                     </div>
  313.                 </div>
  314.             </nav>
  315.         {% endif %}
  316.     {% endblock sonata_page_content_nav %}
  317.     {% block side_bar_after_nav_content %}
  318.         <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>
  319.         <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>
  320.         <div class="app-info" style="background-color:#666466; color:#9D9B9B; position: absolute; bottom: 0px; width: 100%; padding: 5px 5px;">
  321.             <a href="/info" target="_blank" title="versión {{ appInfoVer }}">
  322.                 <img src="{{ asset('assets/img/logo.png') }}" alt="{{ sonata_config.title }}" style="height: auto; width: 15px;">
  323.                 <span class="version" style="border-left: 1px solid; color:#9D9B9B; padding-left: 5px;">V {{ appInfoVer }}</span>
  324.             </a>
  325.         </div>
  326.     {% endblock %}