{% extends '@!SonataTranslation/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() }}
{# CSS para readmore con elipsis - solo primera línea #}
<style>
.sonata-readmore {
display: -webkit-box !important;
-webkit-line-clamp: 1 !important;
-webkit-box-orient: vertical !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
cursor: help !important;
word-wrap: break-word !important;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
<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/more-info.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="//code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css">
<link rel="stylesheet" href="{{ asset('assets/plugins/fontawesome-610/css/all.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/plugins/webfonts/uicons-solid-rounded.css') }}">
<link rel="stylesheet" href="{{ asset('assets/plugins/codemirror/lib/codemirror.css') }}">
{% if admin is defined and cssRoute is defined %}
<link rel="stylesheet" href="{{ asset(cssRoute) }}">
{% 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/twig/twig.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/table-to-card.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/nav-prometeo.js") }}"></script>
<script src="{{ asset("assets/js/nav-prometeo-perseo.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/modal-view-file-original.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/vichuploader-delete.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/combos-anidados.js") }}"></script>
<script src="{{ asset("assets/prometeo/js/slider.js") }}"></script>
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="{{ asset("assets/js/perseo.js") }}"></script>
{% if admin is defined and jsRoute is defined %}
<script src="{{ asset(jsRoute) }}"></script>
{% endif %}
<script type="text/javascript">
$(function(){
$("form").on("submit", function()
{
$("form").find("input.numeric").getNumericValues();
});
$("input.percents").setPercent();
$("input.numerics").setNumeric();
$("input.currencies").setCurrency();
$("input.grams").setGram();
$(".codemirror-twig").each(function(index, value)
{
CodeMirror.fromTextArea(value, {
lineWrapping: true,
fixedGutter: false,
foldGutter: true,
mode: "twig",
theme: "darcula",
lineNumbers: true,
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"]
});
});
{#setInterval(function ()#}
{#{#}
{# {% if object is defined %}#}
{# let id = "{{ object.id }}";#}
{# let action = id ? "edit":"create";#}
{# let username = "{{ app.user.username }}";#}
{# let admin = "{{ app.request.attributes.get('_sonata_admin') }}";#}
{# let data = $("section.content form").serialize();#}
{# // reescribir parte de error, para que no muestre nada.#}
{# AjaxUtils.ajaxCall("{{ path('app_api_autosaveapi_autosave') }}", {#}
{# user: username,#}
{# admin: admin,#}
{# action: action,#}
{# id: id,#}
{# data: data#}
{# }, null, "POST");#}
{# {% endif %}#}
{#}, {{ autoSaveTime }});#}
});
</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 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
or (admin is defined and admin.hasRoute('export') and admin.hasAccess('export') and export_formats|default(admin.exportFormats) | length)
%}
<div class="content-header__title">
{% 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' %}
{% else %}
{% include 'navbar_actions_filters_prometeo_left_edit.html.twig' %}
{% endif %}
{% endblock navbar_actions_filters_prometeo_left %}
</ul>
<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' %}
{% 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 sonata_wrapper %}
<div id="loading-spinner" style="display:none; position:fixed; top:50%; left:50%; transform:translate(-50%, -50%); z-index:9999;">
<div style="border:4px solid #f3f3f3; border-top:4px solid #3498db; border-radius:50%; width:50px; height:50px; animation:spin 1s linear infinite;"></div>
</div>
{{ parent() }}
<script type="text/javascript">
loadNavPrometeo($("body"));
// Deshabilitar readmore completamente
if (window.Admin && window.Admin.setup_readmore_elements) {
window.Admin.setup_readmore_elements = function() {
// No hacer nada - readmore deshabilitado
};
}
// Spinner de carga
$('#loading-spinner').css('display', 'flex');
$(window).on('load', function() {
$('#loading-spinner').fadeOut();
});
// Aplicar popover a elementos con clase sonata-readmore
$(document).ready(function() {
$('.sonata-readmore').each(function() {
var $el = $(this);
var fullText = $el.text();
// Añadir popover con Bootstrap (el CSS ya está aplicado)
$el.popover({
trigger: 'hover',
placement: 'top',
container: 'body',
html: true,
content: '<div style="max-width: 400px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">' + fullText + '</div>'
});
});
});
// $parent = $("body");
// if ($parent.find(".filter-to-navbar-left").html() !== undefined) {
// if ($parent.find("#action-create").length === 1) {
// $parent.find('#action-create').after('<li id="filter-search">' + $parent.find('.filter-to-navbar-left').html() + '</li>');
// } else {
// if($parent.find("nav.navbar form > ul.navbar-left").length) {
// $parent.find("nav.navbar form > ul.navbar-left").prepend('<li id="filter-search" class="filter-search-margin-left">' + $parent.find('.filter-to-navbar-left').html() + '</li>');
// }
// else
// {
// $parent.find("#modal-navbar-prometeo form > ul.navbar-left").prepend('<li id="filter-search" class="filter-search-margin-left">' + $parent.find('.filter-to-navbar-left').html() + '</li>');
// }
// }
// }
//
// $parent.find('#filter-search > div.filter-field-busqueda').append('<span class="fa fa-search pull-right"></span>');
// $parent.find('.filter-to-navbar-left').remove();
//
// $parent.find('.filter-to-navbar-right').each(function (index, value) {
// // Destruimos lo Select2
// var $select = $(value).find('select');
// $select.each(function (i, item) {
// $(item).select2('destroy');
// });
//
// $parent.find('#action-export').before('<li id="' + $(value).data('id') + '" data-order="' + $(value).data('order') + '">' + $(value).html() + '</li>');
// $(value).remove();
// });
//
// $parent.find('#action-export').attr('data-order', 999998);
// $parent.find('#show-filters').attr('data-order', 999999).find('span').removeClass('fa-caret-down').addClass('fa-chevron-down');
//
// $parent.find('nav ul.navbar-right').each(function () {
// $(this).html($(this).children('li').sort(function (a, b) {
// return ($(b).data('order')) < ($(a).data('order')) ? 1 : -1;
// }));
// });
//
// $parent.find('.content-header__filters-container .prometeo-filters').each(function () {
// $(this).html($(this).find('.filter').sort(function (a, b) {
// return ($(b).data('order')) < ($(a).data('order')) ? 1 : -1;
// }));
// });
//
// // Creamos los Select2
// $select = $parent.find("nav ul.navbar-right select");
// $select.each(function (i, item) {
// $(item).select2();
// });
//
// var $select = $parent.find(".content-header__filters-container .prometeo-filters select");
// $select.each(function (i, item) {
// $(item).select2("destroy");
// });
//
// $select = $parent.find(".content-header__filters-container .prometeo-filters select");
// $select.each(function (i, item) {
// $(item).select2();
// });
//
// if ($parent.find(".prometeo-filters .filter:not(.no-filter-visible)").length === 1) {
// $parent.find("#show-filters > a").attr("title", "No hay Filtros");
// $parent.find("#show-filters").addClass("opacity5");
// $parent.find(".content-header__filters-container").addClass("hide");
// }
//
// if ($parent.find('.prometeo-filters .filter:not(.no-filter-visible)').length > 1) {
// $parent.find('#show-filters').on('click', function () {
// if ($parent.find('.prometeo-filters .filter').length > 0) {
// if ($(this).hasClass('open')) {
// $(this).removeClass('open');
// $parent.find('.sonata-filters-box').hide();
// $parent.find('.sonata-filters-box .prometeo-filters div').hide();
// } else {
// $(this).addClass('open');
// $parent.find('.sonata-filters-box').show();
// $parent.find('.sonata-filters-box .prometeo-filters div').show();
// }
// }
// });
// }
//
// $(".sonata-filters-box").hide();
// $parent.find(".prometeo-filters .filter:not(.button-filter-submit)").each(function(index, value)
// {
// if($(value).css("display") !== "none")
// {
// $(".sonata-filters-box").show();
// return false;
// }
// });
</script>
{% endblock sonata_wrapper %}
{% block side_bar_after_nav_content %}
<a href="{{ path('app_logout') }}"><img id="icon-menu-user" class="icon-menu" title="Logout">{{ app.user.username }}</a>
{% endblock %}