templates/base.html.twig line 1

  1. {# templates/base.html.twig #}
  2. {% set settings = platform_settings() %}
  3. <!DOCTYPE html>
  4. <html>
  5.     <head>
  6.         <meta charset="UTF-8" />
  7.         <title>{% block title %}Editorial Tu Libro!{% endblock %}</title>
  8.         {# <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"/> #}
  9.         <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
  10.         <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
  11.         <script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
  12.         <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
  13.         <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
  14.         <!-- Script de Alexis -->
  15.         <!-- <script src="https://code.jquery.com/jquery-3.7.1.js" integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" crossorigin="anonymous"></script> -->
  16.         <link href="https://cdn.jsdelivr.net/npm/alertifyjs@1.11.0/build/css/alertify.min.css" rel="stylesheet"/>
  17.         <script src="https://cdn.jsdelivr.net/npm/alertifyjs@1.11.0/build/alertify.min.js"></script>
  18.         <!-- Datatables -->
  19.         <link href="https://cdn.datatables.net/v/dt/dt-1.13.5/b-2.4.0/b-colvis-2.4.0/b-html5-2.4.0/b-print-2.4.0/datatables.min.css" rel="stylesheet"/>
  20.         <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
  21.         <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
  22.         <script src="https://cdn.datatables.net/v/dt/dt-1.13.5/b-2.4.0/b-colvis-2.4.0/b-html5-2.4.0/b-print-2.4.0/datatables.min.js"></script>
  23.         <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
  24.         <script src="https://cdn.datatables.net/plug-ins/1.11.2/sorting/datetime-moment.js"></script>
  25.         <script src="https://cdn.datatables.net/plug-ins/1.13.5/sorting/date-eu.js"></script>
  26.         <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/cookie-bar/cookiebar-latest.min.js?forceLang=es&theme=minimal&tracking=1&thirdparty=1"></script>
  27.         <script>
  28.             {% block dt_conf_columnDefs %}
  29.                 var columnDefs_g = [];
  30.                 var order_g = [];
  31.                 var buttons_g = [];
  32.                 var disable_button_pdf = false;
  33.             {% endblock %}
  34.         </script>
  35.         <style>
  36.             @import url('https://fonts.googleapis.com/css?family=Montserrat:100,200,300,400,500,600,700,800,900');
  37.             @import url('https://fonts.googleapis.com/css2?family=Amatic+SC:wght@400;700&display=swap');
  38.         </style>
  39.         <link rel="stylesheet" href="{{asset('css/styles.min.css')}}">
  40.         {% block stylesheets %}{% endblock %}
  41.     </head>
  42.     <body>
  43.          <nav class="navbar navbar-expand-lg navbar-light bg-light justify-content-center">
  44.             <a class="navbar-brand" href="{{ path('home') }}">
  45.                 <img src="{{asset('images/logo_editorial_tu_libro.jpg')}}">
  46.             </a>
  47.             <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
  48.                 <span class="navbar-toggler-icon"></span>
  49.             </button>
  50.             <div class="collapse navbar-collapse justify-content-end" id="navbarSupportedContent">
  51.                 <ul class="nav navbar-nav">
  52.                     <li><a class="nav-link" href="{{ path('home') }}">Inicio</a></li>
  53.                     {% if app.user == false %}
  54.                     <li><a class="nav-link" href="{{ path('app_login') }}" title="Si ya estás registrado puedes logearte">Identificarse</a></li>
  55.                     {% if settings.allowregister == 1 %}
  56.                     <li><a class="nav-link" href="{{ path('register') }}" title="Si entras la primera vez debes registrarte">Registrarse</a></li>
  57.                     {% endif %}
  58.                     {% else %}
  59.                     {% if is_granted('ROLE_ADMIN') or is_granted('ROLE_USER') %}
  60.                     <li><a class="nav-link" href="{{ path('user_index') }}">Panel de usuario</a></li>
  61.                     {% endif %}
  62.                     {% if is_granted('ROLE_ADMIN') %}
  63.                     <li class="nav-item dropdown">
  64.                         <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Administración</a>
  65.                         <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
  66.                             <!-- <a class="dropdown-item" href="{{ path('admin_index') }}">Panel de Administración</a> -->
  67.                             <a class="dropdown-item" href="{{ path('users') }}">Usuarios</a>
  68.                             <a class="dropdown-item" href="{{ path('contents') }}">Contenidos</a>
  69.                             <a class="dropdown-item" href="{{ path('licenses') }}">Licencias</a>
  70.                             <a class="dropdown-item" href="{{ path('gifts') }}">Canjeables</a>
  71.                             <a class="dropdown-item" href="{{ path('logs') }}">Informe de registros</a>
  72.                             {% if is_granted('ROLE_SUPER_ADMIN') %}
  73.                                 <a class="dropdown-item" href="{{ path('changesettings') }}">Configuración del entorno</a>
  74.                                 <a class="dropdown-item" href="{{ path('reset_policy') }}">Reiniciar politicas de privacidad</a>
  75.                             {% endif %}
  76.                         </div>
  77.                     </li>
  78.                     {% endif %}
  79.                     <!--
  80.                     <li class="nav-item dropdown">
  81.                         <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ app.user.email }}</a>
  82.                         <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
  83.                             <a class="dropdown-item" href="/profile">Mi perfil</a>
  84.                             <a class="dropdown-item" href="/logout">Desconectar</a>
  85.                         </div>
  86.                     </li>
  87.                     -->
  88.                     <li><a class="nav-link" href="/logout">Cerrar sesión</a></li>
  89.                     {% endif %}
  90.                 </ul>
  91.             </div>
  92.         </nav>
  93.         {% block homebanner %} {% endblock %}
  94.         <div id="main-content" class="container">
  95.             <div class="row">
  96.                 <div class="col-md-12">
  97.                     {% for flashType, flashMessage in app.flashes() %}
  98.                         <div class="alert alert-{{ flashType }}">
  99.                             {{  flashMessage[0] | raw | replace({"The presented password is invalid." : "Credenciales incorrectas."})}}
  100.                         </div>
  101.                     {% endfor %}
  102.                 </div>
  103.                 {% block body %}
  104.                 {% endblock %}
  105.             </div>
  106.         </div>
  107.         <!-- Modal -->
  108.         <div class="modal fade bd-example-modal-lg" id="launchmodal" tabindex="-1" role="dialog" aria-labelledby="launchmodalLabel" aria-hidden="true">
  109.             <div class="modal-dialog modal-xl" role="document">
  110.                 <div class="modal-content">
  111.                     <div class="modal-header">
  112.                         <h5 class="modal-title" id="modaltitle"></h5>
  113.                         <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  114.                             <span aria-hidden="true">&times;</span>
  115.                         </button>
  116.                     </div>
  117.                     <div class="modal-body" id="modalcontent"></div>
  118.                 </div>
  119.             </div>
  120.         </div>
  121.         <a href="#" onclick="document.cookie='cookiebar=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/'; setupCookieBar(); return false;">.</a>
  122.         <footer id="main-footer">
  123.             <div class="container">
  124.                 <div id="info" class="row">
  125.                     <div class="col-md-6">
  126.                         <h3>Nosotros</h3>
  127.                         <div>
  128.                             <div>
  129.                                 <div>
  130.                                     <img src="{{asset('images/logo_editorial_tu_libro_blanco.png')}}" style="height: 75px; margin-right: 1em;">
  131.                                 </div>
  132.                                 <div>
  133.                                     <p>TuLibrodeFP es una editorial creada en el a&ntilde;o 2012. <strong>Son ya m&aacute;s de 800</strong>&nbsp;centros de toda Espa&ntilde;a con m&aacute;s de 1.800 profesores, quienes siguen alguno de nuestros libros de FP</p>
  134.                                 </div>
  135.                             </div>
  136.                         </div>
  137.                     </div>
  138.                     <div class="col-md-3">
  139.                         <div>
  140.                             <ul class="menu">
  141.                                 <li><a href="https://www.editorialtulibro.es/">INICIO</a></li>
  142.                                 <li><a href="https://www.editorialtulibro.es/profesores/">PROFESOR@S</a></li>
  143.                                 <li><a href="https://www.editorialtulibro.es/libros-de-fol-eie-iaee-alumnos/">ALUMN@S</a></li>
  144.                                 <li><a href="http://libreria.tulibrodefp.es">TIENDA ONLINE</a></li>
  145.                                 <li><a href="https://www.editorialtulibro.es/nosotros/">NOSOTROS</a></li>
  146.                                 <li><a href="https://www.editorialtulibro.es/contacto-profesores/">CONTACTO</a></li>
  147.                             </ul>
  148.                         </div>
  149.                     </div>
  150.                     <div class="col-md-3">
  151.                         <h3>CONTACTO</h3>
  152.                         <div>
  153.                             <div class="phones">
  154.                                 <i class="fa fa-phone"></i>
  155.                                 <div>96 119 48 18 <br />Opci&oacute;n 2 Profesores<br />Opci&oacute;n 1 Pedidos</div>
  156.                             </div>
  157.                             <div class="emails">
  158.                                 <div><i class="fa fa-envelope"></i><a href="mailto:infoprofes@editorialtulibro.es">infoprofes@editorialtulibro.es</a></div>
  159.                                 <div><i class="fa fa-envelope"></i><a href="mailto:infoalumnos@editorialtulibro.es">infoalumnos@editorialtulibro.es</a></div>
  160.                             </div>
  161.                         </div>
  162.                     </div>
  163.                 </div>
  164.             </div>
  165.             <div id="disclaimers">
  166.                 <div class="container text-center">
  167.                     <a href="http://www.editorialtulibro.es/politica-privacidad/">Pol&iacute;tica de privacidad</a>
  168.                     | <a href="http://www.editorialtulibro.es/aviso-legal/">Aviso legal</a>
  169.                     | <a href="http://www.editorialtulibro.es/condiciones-generales-contratacion-servicios-editoriales/">Condiciones de contrataci&oacute;n servicios editoriales</a>
  170.                 </div>
  171.             </div>
  172.             <div id="copyright" class="">
  173.                 <div class="container text-center">
  174.                     <p>&copy; 2022 todos los derechos reservados. <a href="//www.editorialtulibro.es/tulibrodefp/">TuLibrodeFP</a>. &mdash; <a href="https://www.editorialtulibro.es/politica-privacidad/" rel="privacy-policy">Pol&iacute;tica de privacidad</a></p>
  175.                 </div>
  176.             </div>
  177.         </footer>
  178.         <script>
  179.             var table;
  180.             $(document).ready(function() {
  181.                 $('.launchermodal').click(function(event) {
  182.                     document.getElementById('modaltitle').innerHTML= $(this).attr('data-title');
  183.                     //$('#modaltitle').text($(this).attr('data-title'));
  184.                     document.getElementById('modalcontent').innerHTML= $(this).attr('data-content');
  185.                     //$('#modalcontent').text($(this).attr('data-content'));
  186.                 });
  187.                 var language =
  188.                 {
  189.                     "processing": "Procesando...",
  190.                     "lengthMenu": "Mostrar _MENU_ registros",
  191.                     "zeroRecords": "No se encontraron resultados",
  192.                     "emptyTable": "Ningún dato disponible en esta tabla",
  193.                     "infoEmpty": "Mostrando registros del 0 al 0 de un total de 0 registros",
  194.                     "infoFiltered": "(filtrado de un total de _MAX_ registros)",
  195.                     "search": "Buscar:",
  196.                     "infoThousands": ",",
  197.                     "loadingRecords": "Cargando...",
  198.                     "paginate":
  199.                     {
  200.                         "first": "Primero",
  201.                         "last": "Último",
  202.                         "next": "Siguiente",
  203.                         "previous": "Anterior"
  204.                     },
  205.                     "aria":
  206.                     {
  207.                         "sortAscending": ": Activar para ordenar la columna de manera ascendente",
  208.                         "sortDescending": ": Activar para ordenar la columna de manera descendente"
  209.                     },
  210.                     "buttons":
  211.                     {
  212.                         "copy": "Copiar",
  213.                         "colvis": "Visibilidad",
  214.                         "collection": "Colección",
  215.                         "colvisRestore": "Restaurar visibilidad",
  216.                         "copyKeys": "Presione ctrl o u2318 + C para copiar los datos de la tabla al portapapeles del sistema. <br /> <br /> Para cancelar, haga clic en este mensaje o presione escape.",
  217.                         "copySuccess":
  218.                         {
  219.                             "1": "Copiada 1 fila al portapapeles",
  220.                             "_": "Copiadas %ds fila al portapapeles"
  221.                         },
  222.                         "copyTitle": "Copiar al portapapeles",
  223.                         "csv": "CSV",
  224.                         "excel": "Excel",
  225.                         "pageLength":
  226.                         {
  227.                             "-1": "Mostrar todas las filas",
  228.                             "_": "Mostrar %d filas"
  229.                         },
  230.                         "pdf": "PDF",
  231.                         "print": "Imprimir",
  232.                         "renameState": "Cambiar nombre",
  233.                         "updateState": "Actualizar",
  234.                         "createState": "Crear Estado",
  235.                         "removeAllStates": "Remover Estados",
  236.                         "removeState": "Remover",
  237.                         "savedStates": "Estados Guardados",
  238.                         "stateRestore": "Estado %d"
  239.                     },
  240.                     "autoFill":
  241.                     {
  242.                         "cancel": "Cancelar",
  243.                         "fill": "Rellene todas las celdas con <i>%d</i>",
  244.                         "fillHorizontal": "Rellenar celdas horizontalmente",
  245.                         "fillVertical": "Rellenar celdas verticalmentemente"
  246.                     },
  247.                     "decimal": ",",
  248.                     "searchBuilder":
  249.                     {
  250.                         "add": "Añadir condición",
  251.                         "button":
  252.                         {
  253.                             "0": "Constructor de búsqueda",
  254.                             "_": "Constructor de búsqueda (%d)"
  255.                         },
  256.                         "clearAll": "Borrar todo",
  257.                         "condition": "Condición",
  258.                         "conditions":
  259.                         {
  260.                             "date":
  261.                             {
  262.                                 "after": "Despues",
  263.                                 "before": "Antes",
  264.                                 "between": "Entre",
  265.                                 "empty": "Vacío",
  266.                                 "equals": "Igual a",
  267.                                 "notBetween": "No entre",
  268.                                 "notEmpty": "No Vacio",
  269.                                 "not": "Diferente de"
  270.                             },
  271.                             "number":
  272.                             {
  273.                                 "between": "Entre",
  274.                                 "empty": "Vacio",
  275.                                 "equals": "Igual a",
  276.                                 "gt": "Mayor a",
  277.                                 "gte": "Mayor o igual a",
  278.                                 "lt": "Menor que",
  279.                                 "lte": "Menor o igual que",
  280.                                 "notBetween": "No entre",
  281.                                 "notEmpty": "No vacío",
  282.                                 "not": "Diferente de"
  283.                             },
  284.                             "string":
  285.                             {
  286.                                 "contains": "Contiene",
  287.                                 "empty": "Vacío",
  288.                                 "endsWith": "Termina en",
  289.                                 "equals": "Igual a",
  290.                                 "notEmpty": "No Vacio",
  291.                                 "startsWith": "Empieza con",
  292.                                 "not": "Diferente de",
  293.                                 "notContains": "No Contiene",
  294.                                 "notStartsWith": "No empieza con",
  295.                                 "notEndsWith": "No termina con"
  296.                             },
  297.                             "array":
  298.                             {
  299.                                 "not": "Diferente de",
  300.                                 "equals": "Igual",
  301.                                 "empty": "Vacío",
  302.                                 "contains": "Contiene",
  303.                                 "notEmpty": "No Vacío",
  304.                                 "without": "Sin"
  305.                             }
  306.                         },
  307.                         "data": "Data",
  308.                         "deleteTitle": "Eliminar regla de filtrado",
  309.                         "leftTitle": "Criterios anulados",
  310.                         "logicAnd": "Y",
  311.                         "logicOr": "O",
  312.                         "rightTitle": "Criterios de sangría",
  313.                         "title":
  314.                         {
  315.                             "0": "Constructor de búsqueda",
  316.                             "_": "Constructor de búsqueda (%d)"
  317.                         },
  318.                         "value": "Valor"
  319.                     },
  320.                     "searchPanes":
  321.                     {
  322.                         "clearMessage": "Borrar todo",
  323.                         "collapse":
  324.                         {
  325.                             "0": "Paneles de búsqueda",
  326.                             "_": "Paneles de búsqueda (%d)"
  327.                         },
  328.                         "count": "{total}",
  329.                         "countFiltered": "{shown} ({total})",
  330.                         "emptyPanes": "Sin paneles de búsqueda",
  331.                         "loadMessage": "Cargando paneles de búsqueda",
  332.                         "title": "Filtros Activos - %d",
  333.                         "showMessage": "Mostrar Todo",
  334.                         "collapseMessage": "Colapsar Todo"
  335.                     },
  336.                     "select":
  337.                     {
  338.                         "cells":
  339.                         {
  340.                             "1": "1 celda seleccionada",
  341.                             "_": "%d celdas seleccionadas"
  342.                         },
  343.                         "columns":
  344.                         {
  345.                             "1": "1 columna seleccionada",
  346.                             "_": "%d columnas seleccionadas"
  347.                         },
  348.                         "rows":
  349.                         {
  350.                             "1": "1 fila seleccionada",
  351.                             "_": "%d filas seleccionadas"
  352.                         }
  353.                     },
  354.                     "thousands": ".",
  355.                     "datetime":
  356.                     {
  357.                         "previous": "Anterior",
  358.                         "next": "Proximo",
  359.                         "hours": "Horas",
  360.                         "minutes": "Minutos",
  361.                         "seconds": "Segundos",
  362.                         "unknown": "-",
  363.                         "amPm":[
  364.                             "AM",
  365.                             "PM"
  366.                         ],
  367.                         "months":
  368.                         {
  369.                             "0": "Enero",
  370.                             "1": "Febrero",
  371.                             "2": "Marzo",
  372.                             "3": "Abril",
  373.                             "4": "Mayo",
  374.                             "5": "Junio",
  375.                             "6": "Julio",
  376.                             "7": "Agosto",
  377.                             "8": "Septiembre",
  378.                             "9": "Octubre",
  379.                             "10": "Noviembre",
  380.                             "11": "Diciembre"
  381.                         },
  382.                         "weekdays":
  383.                         [
  384.                             "Dom",
  385.                             "Lun",
  386.                             "Mar",
  387.                             "Mie",
  388.                             "Jue",
  389.                             "Vie",
  390.                             "Sab"
  391.                         ]
  392.                     },
  393.                     "editor":
  394.                     {
  395.                         "close": "Cerrar",
  396.                         "create":
  397.                         {
  398.                             "button": "Nuevo",
  399.                             "title": "Crear Nuevo Registro",
  400.                             "submit": "Crear"
  401.                         },
  402.                         "edit":
  403.                         {
  404.                             "button": "Editar",
  405.                             "title": "Editar Registro",
  406.                             "submit": "Actualizar"
  407.                         },
  408.                         "remove":
  409.                         {
  410.                             "button": "Eliminar",
  411.                             "title": "Eliminar Registro",
  412.                             "submit": "Eliminar",
  413.                             "confirm":
  414.                             {
  415.                                 "1": "¿Está seguro que desea eliminar 1 fila?",
  416.                                 "_": "¿Está seguro que desea eliminar %d filas?"
  417.                             }
  418.                         },
  419.                         "error":
  420.                         {
  421.                             "system": "Ha ocurrido un error en el sistema (<a target=\"\\\"rel=\"\\nofollow\"href=\"\\\">Más información&lt;\\/a&gt;).</a>"
  422.                         },
  423.                         "multi":
  424.                         {
  425.                             "title": "Múltiples Valores",
  426.                             "info": "Los elementos seleccionados contienen diferentes valores para este registro. Para editar y establecer todos los elementos de este registro con el mismo valor, hacer click o tap aquí, de lo contrario conservarán sus valores individuales.",
  427.                             "restore": "Deshacer Cambios",
  428.                             "noMulti": "Este registro puede ser editado individualmente, pero no como parte de un grupo."
  429.                         }
  430.                     },
  431.                     "info": "Mostrando _START_ a _END_ de _TOTAL_ registros",
  432.                     "stateRestore":
  433.                     {
  434.                         "creationModal":
  435.                         {
  436.                             "button": "Crear",
  437.                             "name": "Nombre:",
  438.                             "order": "Clasificación",
  439.                             "paging": "Paginación",
  440.                             "search": "Busqueda",
  441.                             "select": "Seleccionar",
  442.                             "columns":
  443.                             {
  444.                                 "search": "Búsqueda de Columna",
  445.                                 "visible": "Visibilidad de Columna"
  446.                             },
  447.                             "title": "Crear Nuevo Estado",
  448.                             "toggleLabel": "Incluir:"
  449.                         },
  450.                         "emptyError": "El nombre no puede estar vacio",
  451.                         "removeConfirm": "¿Seguro que quiere eliminar este %s?",
  452.                         "removeError": "Error al eliminar el registro",
  453.                         "removeJoiner": "y",
  454.                         "removeSubmit": "Eliminar",
  455.                         "renameButton": "Cambiar Nombre",
  456.                         "renameLabel": "Nuevo nombre para %s",
  457.                         "duplicateError": "Ya existe un Estado con este nombre.",
  458.                         "emptyStates": "No hay Estados guardados",
  459.                         "removeTitle": "Remover Estado",
  460.                         "renameTitle": "Cambiar Nombre Estado"
  461.                     }
  462.                 };
  463.                 buttons_g.push(
  464.                         {
  465.                             extend: 'copy',
  466.                             text: '<i class="fas fa-solid fa-clipboard"></i> Copiar datos',
  467.                             key: {
  468.                                 key: 'c',
  469.                                 altKey: true
  470.                             },
  471.                             attr:  {
  472.                                 title: 'Copiar',
  473.                                 class: 'btn btn-info'
  474.                             }
  475.                         },
  476.                         {
  477.                             extend: 'csv',
  478.                             fieldSeparator: ';',
  479.                             text: '<i class="fas fa-solid fa-file-csv"></i> CSV',
  480.                             key: {
  481.                                 key: 'd',
  482.                                 altKey: true
  483.                             },
  484.                             attr:  {
  485.                                 title: 'Exportar a CSV',
  486.                                 class: 'btn btn-info'
  487.                             }
  488.                         },
  489.                         {
  490.                             extend: 'excel',
  491.                             text: '<i class="fas fa-solid fa-file-excel"></i> Excel',
  492.                             key: {
  493.                                 key: 'e',
  494.                                 altKey: true
  495.                             },
  496.                             attr:  {
  497.                                 title: 'Exportar a Excel',
  498.                                 class: 'btn btn-info'
  499.                             }
  500.                         },
  501.                         {
  502.                             extend: 'print',
  503.                             text: '<i class="fas fa-solid fa-print"></i> Imprimir',
  504.                             key: {
  505.                                 key: 'i',
  506.                                 altKey: true
  507.                             },
  508.                             attr:  {
  509.                                 title: 'Imprimir',
  510.                                 class: 'btn btn-info'
  511.                             }
  512.                         }
  513.                 );
  514.                 if (!disable_button_pdf){
  515.                 buttons_g.push({
  516.                             extend: 'pdf',
  517.                             text: '<i class="fas fa-solid fa-file-pdf"></i> PDF',
  518.                             key: {
  519.                                 key: 'p',
  520.                                 altKey: true
  521.                             },
  522.                             attr:  {
  523.                                 title: 'Exportar a PDF',
  524.                                 class: 'btn btn-info'
  525.                             }
  526.                         });
  527.                 }
  528.                 $('#table').on('init.dt', function(){
  529.                     var dt = $(this).DataTable();
  530.                     var searchTermOperator = 'AND';
  531.                     $('#table_filter label input').on('input', function () {
  532.                         var searchTerm = this.value.trim();
  533.                         var searchTerms = searchTerm.split(/\s+/);
  534.                         var query = '';
  535.                         searchTerms.forEach(function (term, index) {
  536.                             if (index > 0) {
  537.                                 query += searchTermOperator + ' '; // Operador lógico AND o OR
  538.                             }
  539.                             query += term;
  540.                         });
  541.                         dt.search(query).draw();
  542.                     });
  543.                     // Evento de selección del operador lógico (AND o OR)
  544.                     //$('input[name="search-operator"]').on('change', function () {
  545.                     //    searchTermOperator = $(this).val();
  546.                     //});
  547.                 });
  548.                 table = new DataTable('#table', {
  549.                     language: language,
  550.                     dom: 'Bfrtip',
  551.                     columnDefs: columnDefs_g,
  552.                     buttons: buttons_g,
  553.                     order: order_g,
  554.                 });
  555.             });
  556.             // Intento de aviso cierre de ventana/pestaña
  557.             {% if app.user == true %}
  558.                 {% if not is_granted('ROLE_ADMIN') %}
  559.                     // Función para agregar un evento cross-browser
  560.                     function addEvent(obj, evt, fn) {
  561.                         if (obj.addEventListener) {
  562.                             obj.addEventListener(evt, fn, false);
  563.                         } else if (obj.attachEvent) {
  564.                             obj.attachEvent('on' + evt, fn);
  565.                         }
  566.                     }
  567.                     // Función para mostrar confirmación al salir de la página
  568.                     function confirmLogout() {
  569.                         localStorage.setItem("Evento_Close_X_Navegador", "true");
  570.                         closable = true;
  571.                         alertify.alert()
  572.                             .setting({
  573.                                 'label':'Ok',
  574.                                 'message': 'Recuerda cerrar la sesión de libros digitales antes de cerrar la ventana, y así evitar futuros bloqueos de acceso.' ,
  575.                             })
  576.                             .setHeader('¡Alerta!')
  577.                             .show();
  578.                     }
  579.                     // Agregar el evento 'mouseout' al documento
  580.                     addEvent(document, 'mouseout', function(event) {
  581.                         event = event || window.event;
  582.                         var y = event.clientY;
  583.                         var from = event.relatedTarget || event.toElement;
  584.                         // Comprobar si el usuario está saliendo de la página
  585.                         if (!from || from.nodeName === 'HTML') {
  586.                             // Verificar si ya se mostró la confirmación
  587.                             var leftWindow = localStorage.getItem('Evento_Close_X_Navegador');
  588.                             leftWindow = false;
  589.                             if (!leftWindow && y < 2) {
  590.                                 // Mostrar la confirmación solo si no se ha mostrado antes y el cursor está en la parte superior de la página
  591.                                 confirmLogout();
  592.                                 localStorage.setItem('Evento_Close_X_Navegador', 'true');
  593.                             }
  594.                         }
  595.                     });
  596.                 {% endif %}
  597.             {% endif %}
  598.             // Desactivamos la validación de actividad (cierre de sesión desde cliente)
  599.             {% if 1 == 2 %}
  600.                 {% if app.user == true %}
  601.                     // Cierre de sesión tras 30 minutos de inactividad.
  602.                     function verificarActividad() {
  603.                         timeNow = new Date().getTime();
  604.                         time = (timeNow - timeStart)/1000;
  605.                         if (time > (30 * 60)) { // 30 minutos
  606.                             fetch(window.location.origin+'/logout');
  607.                             document.getElementById('timeoutmodal').remove();
  608.                             clearInterval(intervalo);
  609.                             mostrarModal("La sesión se ha cerrado por inactividad.");
  610.                         } else if (time > (25 * 60)) { // 25 minutos
  611.                             message = 'Si no cierras este aviso, la sesión se cerrará en 5 minutos por inactividad.';
  612.                             if (document.getElementById('timeoutmodal') == undefined) {
  613.                                 mostrarModal(message);
  614.                             } else {
  615.                                 if (document.getElementById('timeoutmodal').style.display == "none") {
  616.                                     mostrarModal(message);
  617.                                 }
  618.                             }
  619.                         }
  620.                     }
  621.                     var intervalo = setInterval(verificarActividad, 5000);
  622.                     let timeStart = new Date().getTime();
  623.                     verificarActividad();
  624.                     //document.addEventListener("mousemove", resetTimer);
  625.                     document.addEventListener("click", resetTimer);
  626.                     //document.addEventListener("keypress", resetTimer);
  627.                     function resetTimer() {
  628.                         timeStart = new Date().getTime();
  629.                     }
  630.                     // Función para crear y mostrar la ventana modal
  631.                     function mostrarModal(modalMessage) {
  632.                         // Crear elementos HTML para la ventana modal y su contenido
  633.                         var modal = document.createElement("div");
  634.                         modal.id="timeoutmodal";
  635.                         modal.style.display = "none";
  636.                         modal.style.position = "fixed";
  637.                         modal.style.top = "0";
  638.                         modal.style.left = "0";
  639.                         modal.style.width = "100%";
  640.                         modal.style.height = "100%";
  641.                         modal.style.backgroundColor = "rgba(0, 0, 0, 0.7)";
  642.                         modal.style.zIndex = "1";
  643.                         var modalContent = document.createElement("div");
  644.                         modalContent.style.backgroundColor = "#fff";
  645.                         modalContent.style.borderRadius = "5px";
  646.                         modalContent.style.textAlign = "center";
  647.                         modalContent.style.padding = "20px";
  648.                         modalContent.style.position = "absolute";
  649.                         modalContent.style.top = "50%";
  650.                         modalContent.style.left = "50%";
  651.                         modalContent.style.transform = "translate(-50%, -50%)";
  652.                         var message = document.createElement("p");
  653.                         message.textContent = modalMessage;
  654.                         var btnOk = document.createElement("button");
  655.                         btnOk.style.padding = "10px 20px";
  656.                         btnOk.style.backgroundColor = "#007bff";
  657.                         btnOk.style.color = "#fff";
  658.                         btnOk.style.border = "none";
  659.                         btnOk.style.cursor = "pointer";
  660.                         btnOk.textContent = "OK";
  661.                         btnOk.addEventListener("click", cerrarModal.bind(null, modal));
  662.                         // Agregar elementos al DOM
  663.                         modalContent.appendChild(message);
  664.                         modalContent.appendChild(btnOk);
  665.                         modal.appendChild(modalContent);
  666.                         document.body.appendChild(modal);
  667.                         // Mostrar la ventana modal
  668.                         modal.style.display = "block";
  669.                     }
  670.                     // Función para cerrar la ventana modal
  671.                     function cerrarModal(modal) {
  672.                         modal.remove();
  673.                         //modal.style.display = "none";
  674.                     }
  675.                 {% endif %}
  676.             {% endif %}
  677.         </script>
  678.         {% block javascripts %}
  679.         {% endblock %}
  680.     </body>
  681. </html>