templates/equipo/index.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% form_theme form 'bootstrap_4_layout.html.twig' %}
  3. {% block stylesheets %}
  4.     <link rel="stylesheet" href="{{ asset('plugins/datatables-bs4/css/dataTables.bootstrap4.min.css') }}">
  5.     <link rel="stylesheet" href="{{ asset('plugins/datatables-responsive/css/responsive.bootstrap4.min.css') }}">
  6.     <link rel="stylesheet" href="{{ asset('plugins/datatables-buttons/css/buttons.bootstrap4.min.css')}}">
  7.     <link rel="stylesheet" href="{{ asset('plugins/toastr/toastr.min.css') }}">
  8.     <style>
  9.         td.descripcion {
  10.             max-width: 300px !important;
  11.             text-overflow: ellipsis;
  12.             white-space: nowrap;
  13.             overflow: hidden;
  14.         }
  15.         label {
  16.             margin-right: 1rem;
  17.         }
  18.     </style>
  19. {% endblock %}
  20. {% block title %} - Eq. cómputo{% endblock %}
  21. {% block body %}
  22.     <div class="content-wrapper">
  23.         <!-- Content Header (Page header) -->
  24.         <section class="content-header">
  25.             <div class="card">
  26.                 <div class="card-header">
  27.                     <h1 class="card-title">Equipos de Cómputo</h1>
  28.                     <div class="card-tools">
  29.                         <ol class="breadcrumb float-sm-right">
  30.                             <li class="breadcrumb-item">Inicio</li>
  31.                             <li class="breadcrumb-item active">Equipos</li>
  32.                         </ol>
  33.                     </div>
  34.                 </div>
  35.             </div>
  36.         </section>
  37.         <!-- Main content -->
  38.         <section class="content">
  39.             <!-- Default box -->
  40.             <div class="card">
  41.                 {% if not unidadActiva and (rol == 3 or rol == 4) %}
  42.                     <div class="alert alert-warning alert-dismissible fade show" role="alert">
  43.                         En este momento no tiene privilegios para editar sus inventarios, si lo requiere, por favor solicítelo al Administrador.
  44.                         <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  45.                             <span aria-hidden="true">&times;</span>
  46.                         </button>
  47.                     </div>
  48.                 {% endif %}
  49.                 <div class="card-header">
  50.                     <div class="row">
  51.                         <div class="col">
  52.                             {{ form_start(form, {'attr': {'class': 'col-md-auto', 'id': 'form_unidad_filtro'}}) }}
  53.                             <div class="d-flex justify-content-start flex-wrap align-items-center gap-2">
  54.                                 {{ form_row(form.filtro) }}
  55.                             {% if form.unidad is defined %}
  56.                                 {{ form_row(form.unidad) }}
  57.                             {% endif %}
  58.                             {{ form_end(form) }}
  59.                             </div>
  60.                         </div>
  61.                     </div>
  62.                     <div class="row">
  63.                         <div class="col">
  64.                             <div class="col-md-12 d-flex justify-content-start flex-wrap align-items-center gap-2">
  65.                                 <a href="#" id="enviar" class="btn bg-blue">Aplicar filtro</a>
  66.                                 <button id="descargar_excel" type="button" class="btn btn-outline-success" onclick="descargarExcel()"><i class="fas fa-file-excel"></i> Descargar</button>
  67.                                 <button id="descargar_pdf" type="button" class="btn btn-outline-danger" onclick="descargarPDF()"><i class="fas fa-file-pdf"></i> Formato CE-1</button>
  68.                                 {% if nivel == 1 and unidadActiva %}
  69.                                     <a href="{{ path('app_equipo_new') }}" class="btn btn-outline-success"><i class="fas fa-plus-circle"></i> Agregar</a>
  70.                                 {% endif %}
  71.                             </div>
  72.                         </div>
  73.                     </div>
  74.                 </div>
  75.                 <div class="card-body">
  76.                     <table class="table table-striped w-100" id="table-equipo">
  77.                         <thead>
  78.                         <tr>
  79.                             <th>Marbete</th>
  80.                             <th>Descripción</th>
  81.                             <th>Host</th>
  82.                             <th>Marca</th>
  83.                             <th>Modelo</th>
  84.                             <th>Uso</th>
  85.                             <th>Estatus</th>
  86.                             <th>Emhv</th>
  87.                             <th>Unidad</th>
  88.                             <th>Usuario</th>
  89.                             <th>Ubicación</th>
  90.                             <th>Acciones</th>
  91.                         </tr>
  92.                         </thead>
  93.                         <tbody>
  94.                         {% set filteredEquipos = equipos|filter(equipo => equipo.estatus != 5) %}
  95.                         {% if filteredEquipos is not empty %}
  96.                             {% for equipo in filteredEquipos %}
  97.                                 <tr id="idEqu-{{ equipo.idEqu }}">
  98.                                     <td class="marbete">{{ equipo.marbete }}</td>
  99.                                     <td class="descripcion">{{ equipo.descripcion }}</td>
  100.                                     <td class="hostname">{{ equipo.hostname }}</td>
  101.                                     <td class="marca">{{ equipo.idMarca.marca }}</td>
  102.                                     <td class="modelo">{{ equipo.modelo }}</td>
  103.                                     <td class="uso">
  104.                                         {% if equipo.uso == 1 %}
  105.                                             <span>Educativo</span>
  106.                                         {% elseif equipo.uso == 2 %}
  107.                                             <span>Docente</span>
  108.                                         {% elseif equipo.uso == 3 %}
  109.                                             <span>Administrativo</span>
  110.                                         {% endif %}
  111.                                     </td>
  112.                                     <td class="estatus">
  113.                                         {% if equipo.estatus == 1 %}
  114.                                             <span class="badge bg-gradient-green d-block">En operación</span>
  115.                                         {% elseif equipo.estatus == 2 %}
  116.                                             <span class="badge bg-gradient-orange d-block">Descompuesto</span>
  117.                                         {% elseif equipo.estatus == 3 %}
  118.                                             <span class="badge bg-gradient-primary d-block">Sin instalar</span>
  119.                                         {% elseif equipo.estatus == 4 %}
  120.                                             <span class="badge bg-gradient-yellow d-block">En proceso de baja</span>
  121.                                         {% elseif equipo.estatus == 5 %}
  122.                                             <span class="badge bg-gradient-danger d-block">Baja</span>
  123.                                         {% endif %}
  124.                                     </td>
  125.                                     <td class="emhv">
  126.                                         {% if equipo.emhv == 1 %}
  127.                                             <span class="badge bg-gradient-green d-block">Cumple</span>
  128.                                         {% elseif equipo.emhv == 0 %}
  129.                                             <span class="badge bg-gradient-orange d-block">No Cumple</span>
  130.                                         {% endif %}
  131.                                     </td>
  132.                                     <td class="unidad">{{ equipo.unidad.nombre }}</td>
  133.                                     <td class="usuario">{% if equipo.usuario.nombre is defined %}{{ equipo.usuario.nombre }}{% endif %} {% if equipo.usuario.papellido is defined %}{{ equipo.usuario.papellido }}{% endif %} {% if equipo.usuario.sapellido is defined %}{{ equipo.usuario.sapellido }}{% endif %}</td>
  134.                                     <td class="ubicacion">{% if equipo.unidad.idUni is defined %}{{ equipo.unidad.idUni|slice(3, 3) }} - {{ equipo.ubicacion}}{% endif %}</td> {# area #}
  135.                                     <td class="text-right">
  136.                                         {# <button class="btn btn-sm" style="background-color: transparent; border: none;" onclick="descargarPDF1('{{ equipo.idEqu }}')">
  137.                                             <i class="fas fa-file-pdf" style="color: red;">dpdf</i>
  138.                                         </button>
  139.                                         | #}
  140.                                         <!-- Botón para descargar PDF de resguardatario -->
  141.                                         <a href="#" onclick="postPdfRequest('{{ equipo.idEqu }}'); return false;" title="Generar resguardatario">
  142.                                             <i class="fas fa-file-pdf mr-2"></i>
  143.                                         </a>
  144.                                         &nbsp;
  145.                                         <a href="javascript: void(0)" data-id="{{ equipo.idEqu }}" class="btn-redirect" title="Ver equipo"><i class="fas fa-eye"></i></a>
  146.                                         {% if nivel in [1, 2] and unidadActiva%}
  147.                                             &nbsp;&nbsp;
  148.                                             <a href="#editar-equipo" onclick="editarInfoEquipo('{{ path('app_equipo_edit', {'idEqu': equipo.idEqu}) }}')" data-toggle="modal" title="Editar equipo"><i class="fas fa-pen"></i></a>
  149.                                             {# &nbsp;&nbsp;
  150.                                             <a href="#editar-equiporefaccion" onclick="editarInfoEquipoRefaccion('{{ path('app_equipo_editrefaccion', {'idEqu': equipo.idEqu}) }}')" data-toggle="modal" title="Agregar refacción"><i class="fas fa-solid fa-business-time"></i></a> #}
  151.                                         {% endif %}
  152.                                         {% if nivel in [1, 2] and not unidadActiva%}
  153.                                             &nbsp;&nbsp;
  154.                                             <a href="#editar-equiporesguardo" onclick="editarInfoEquipoResguardo('{{ path('app_equipo_edit_resguardo', {'idEqu': equipo.idEqu}) }}')" data-toggle="modal" title="Editar equipo"><i class="fas fa-pen"></i></a>
  155.                                         {% endif %}
  156.                                         {% if nivel in [2] %}
  157.                                             &nbsp;&nbsp;
  158.                                             <!-- Botón para mostrar el modal de confirmación -->
  159.                                             <button type="button" onclick="confirmDelete('{{ path('app_equipo_delete', {'idEqu': equipo.idEqu}) }}', '{{ csrf_token('delete' ~ equipo.idEqu) }}')" class="btn btn-link text-danger p-0" title="Eliminar equipo">
  160.                                                 <i class="fas fa-trash-alt"></i>
  161.                                             </button>
  162.                                         {% endif %}
  163.                                     </td>
  164.                                 </tr>
  165.                             {% endfor %}
  166.                         {% endif %}
  167.                         </tbody>
  168.                     </table>
  169.                 </div>
  170.                 <!-- /.card-body -->
  171.             </div>
  172.             <!-- /.card -->
  173.         </section>
  174.         <!-- /.content -->
  175.     </div>
  176.     <div class="modal fade" id="confirmDeleteModal" tabindex="-1" role="dialog" aria-labelledby="confirmDeleteModalLabel" aria-hidden="true">
  177.         <div class="modal-dialog" role="document">
  178.             <div class="modal-content">
  179.                 <div class="modal-header">
  180.                     <h5 class="modal-title" id="confirmDeleteModalLabel">Confirmar Eliminación</h5>
  181.                     <button type="button" class="close" data-dismiss="modal" aria-label="Cerrar">
  182.                         <span aria-hidden="true">&times;</span>
  183.                     </button>
  184.                 </div>
  185.                 <div class="modal-body">
  186.                     ¿Estás seguro de que deseas eliminar este registro?
  187.                 </div>
  188.                 <div class="modal-footer">
  189.                     <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
  190.                     <!-- Botón para confirmar eliminación -->
  191.                     <form id="deleteForm" method="post">
  192.                         <input type="hidden" name="_token" id="csrfToken" value="">
  193.                         <button type="submit" class="btn btn-danger">Eliminar</button>
  194.                     </form>
  195.                 </div>
  196.             </div>
  197.         </div>
  198.     </div>
  199.     <div class="modal hide" id="editar-equipo"></div>
  200.     <div class="modal hide" id="editar-equiporefaccion"></div>
  201.     <div class="modal hide" id="editar-equiporesguardo"></div>
  202. {% endblock %}
  203. {% block javascripts %}
  204.     <script src="{{ asset('plugins/datatables/jquery.dataTables.min.js') }}"></script>
  205.     <script src="{{ asset('plugins/datatables-bs4/js/dataTables.bootstrap4.min.js') }}"></script>
  206.     <script src="{{ asset('plugins/datatables-responsive/js/dataTables.responsive.min.js') }}"></script>
  207.     <script src="{{ asset('plugins/datatables-responsive/js/responsive.bootstrap4.min.js') }}"></script>
  208.     <script src="{{ asset('plugins/datatables-buttons/js/dataTables.buttons.min.js') }}"></script>
  209.     <script src="{{ asset('plugins/datatables-buttons/js/buttons.bootstrap4.min.js') }}"></script>
  210.     <script src="{{ asset('plugins/jszip/jszip.min.js') }}"></script>
  211.     <script src="{{ asset('plugins/pdfmake/pdfmake.min.js') }}"></script>
  212.     <script src="{{ asset('plugins/pdfmake/vfs_fonts.js') }}"></script>
  213.     <script src="{{ asset('plugins/datatables-buttons/js/buttons.html5.min.js') }}"></script>
  214.     <script src="{{ asset('plugins/datatables-buttons/js/buttons.print.min.js') }}"></script>
  215.     <script src="{{ asset('plugins/datatables-buttons/js/buttons.colVis.min.js') }}"></script>
  216.     <script src="{{ asset('plugins/toastr/toastr.min.js') }}"></script>
  217.     <script src="https://cdn.jsdelivr.net/gh/mgalante/jquery.redirect@master/jquery.redirect.js"></script>
  218.     <script type="text/javascript">
  219.         // Menu lateral
  220.         $("#catalogo").addClass("menu-open");
  221.         $("#catalogo").find('.nav-link:first').addClass("active");
  222.         $("#computo").addClass("active");
  223.         $(function () {
  224.             // DataTable
  225.             $('#table-equipo').DataTable({
  226.                 "aaSorting": [],
  227.                 orderCellsTop: true,
  228.                 {# Define un valor predeterminado para LengthChange #}
  229.                 "pageLength": 50,
  230.                 "scrollX": true,
  231.                 {# sDom: 'lrtip', #}
  232.                 "bLengthChange" : true,
  233.                 language: {
  234.                     url: 'https://cdn.datatables.net/plug-ins/1.10.22/i18n/Spanish.json'
  235.                 },
  236.             });
  237.             {% if form.unidad is defined %}
  238.                 $("#enviar").on('click', function () {
  239.                     aplicarFiltro();
  240.                 });
  241.             {% endif %}
  242.         });
  243.         // Se envia el valor del id_equ
  244.         function postPdfRequest(idEqu) {
  245.             const form = document.createElement('form');
  246.             form.method = 'POST';
  247.             form.action = '{{ path('app_resguardo_equipo_pdf') }}';
  248.             form.target = '_blank';
  249.             const input = document.createElement('input');
  250.             input.type = 'hidden';
  251.             input.name = 'idEqu';
  252.             input.value = idEqu;
  253.             form.appendChild(input);
  254.             document.body.appendChild(form);
  255.             form.submit();
  256.         }
  257.         function aplicarFiltro() {
  258.             $("#table-equipo").find($("tbody")).html("<tr><td colspan='12' class='text-center'><i class='fas fa-spinner fa-pulse'></i></td></tr>");
  259.             let formData = new FormData(document.getElementById("form_unidad_filtro"));
  260.             $.ajax({
  261.                 type: "POST",
  262.                 url: '{{ path('app_equipo_index') }}',
  263.                 data: formData, // Adjuntar los campos del formulario enviado.
  264.                 dataType: "html",
  265.                 cache: false,
  266.                 contentType: false,
  267.                 processData: false,
  268.                 success: function (data) {
  269.                     let datos = jQuery.parseJSON(data);
  270.                     actualizarEquipo(datos);
  271.                 },
  272.                 error: function (data, text, error) {
  273.                     let datos = jQuery.parseJSON(data.responseText);
  274.                 }
  275.             });
  276.         }
  277.         function descargarExcel() {
  278.             let btn = $("#descargar_excel");
  279.             let formData = new FormData(document.getElementById("form_unidad_filtro"));
  280.             $.ajax({
  281.                 type: "POST",
  282.                 url: '{{ path('app_reporte_equipo_excel') }}',
  283.                 data: formData, // Adjuntar los campos del formulario enviado.
  284.                 cache: false,
  285.                 contentType: false,
  286.                 processData: false,
  287.                 xhrFields: {
  288.                     responseType: 'blob'
  289.                 },
  290.                 beforeSend: function () {
  291.                     btn.prop('disabled', true);
  292.                     btn.html("<i class='fas fa-spinner fa-pulse'></i> Descargar");
  293.                 },
  294.                 success: function (data) {
  295.                     let a = document.createElement('a');
  296.                     a.href = window.URL.createObjectURL(data);
  297.                     a.download = "ReporteEquipoCómputo.xlsx"
  298.                     a.click();
  299.                 },
  300.                 complete: function () {
  301.                     btn.prop('disabled', false);
  302.                     btn.html("<i class='fas fa-file-excel mr-2'></i> Descargar");
  303.                 },
  304.                 error: function (xhr) {
  305.                     toastr.warning(xhr?.statusText); 
  306.                 },
  307.             });
  308.         }
  309.         function descargarPDF() {
  310.             {% if form.unidad is defined %}
  311.             if ($("#unidad_filtro_unidad").val() === "") {
  312.                 toastr.warning('Se debe seleccionar una Unidad administrativa');
  313.                 return false;
  314.             }
  315.             {% endif %}
  316.             let btn = $("#descargar_pdf");
  317.             let formData = new FormData(document.getElementById("form_unidad_filtro"));
  318.             $.ajax({
  319.                 type: "POST",
  320.                 url: '{{ path('app_reporte_equipo_pdf') }}',
  321.                 data: formData, // Adjuntar los campos del formulario enviado.
  322.                 cache: false,
  323.                 contentType: false,
  324.                 processData: false,
  325.                 xhrFields: {
  326.                     responseType: 'blob'
  327.                 },
  328.                 beforeSend: function () {
  329.                     btn.prop('disabled', true);
  330.                     btn.html("<i class='fas fa-spinner fa-pulse'></i> Formato CE-1");
  331.                 },
  332.                 success: function (data) {
  333.                     let a = document.createElement('a');
  334.                     a.href = window.URL.createObjectURL(data);
  335.                     a.download = "ReporteEquipoCómputo.pdf"
  336.                     a.click();
  337.                 },
  338.                 complete: function () {
  339.                     btn.prop('disabled', false);
  340.                     btn.html("<i class='fas fa-file-pdf mr-2'></i> Formato CE-1");
  341.                 },
  342.                 error: function (xhr) {
  343.                     toastr.warning(xhr?.statusText); 
  344.                 },
  345.             });
  346.         }
  347.         function descargarPDF1(idEquipo) {
  348.             let btn = $("#descargar_pdf");
  349.             let formData = new FormData();
  350.             formData.append('idEquipo', idEquipo); // Agregar el idEquipo al FormData
  351.             $.ajax({
  352.                 type: "POST",
  353.                 url: '{{ path('app_resguardo_equipo_pdf') }}',
  354.                 data: formData,
  355.                 cache: false,
  356.                 contentType: false,
  357.                 processData: false,
  358.                 beforeSend: function () {
  359.                     btn.prop('disabled', true);
  360.                     btn.html("<i class='fas fa-spinner fa-pulse'></i> Formato CE-1");
  361.                 },
  362.                 success: function (response) {
  363.                     if (response.success) {
  364.                         // Descargar el PDF utilizando el enlace proporcionado
  365.                         window.location.href = response.pdfUrl;
  366.                     } else {
  367.                         alert('Error al generar el PDF. Por favor, intenta nuevamente.');
  368.                     }
  369.                 },
  370.                 error: function (xhr, status, error) {
  371.                     alert('Se produjo un error al intentar generar el PDF. Por favor, intenta nuevamente.');
  372.                 },
  373.                 complete: function () {
  374.                     btn.prop('disabled', false);
  375.                     btn.html("<i class='fas fa-file-pdf mr-2'></i> Formato CE-1");
  376.                 }
  377.             });
  378.         }
  379.         function editarInfoEquipo(url){
  380.             $('#editar-equipo').load(url, function ()
  381.             {
  382.                 // configuración del Modal
  383.                 $("#editar-equipo").on('hide.bs.modal', function () {
  384.                     $(this).html('Cargando');
  385.                 });
  386.                 $(".modal-dialog").draggable;
  387.                 editarInfoEquipoAjax(url)
  388.             })
  389.         }
  390.         function editarInfoEquipoResguardo(url){
  391.             $('#editar-equiporesguardo').load(url, function ()
  392.             {
  393.                 // configuración del Modal
  394.                 $("#editar-equiporesguardo").on('hide.bs.modal', function () {
  395.                     $(this).html('Cargando');
  396.                 });
  397.                 $(".modal-dialog").draggable;
  398.                 editarInfoEquipoResguardoAjax(url)
  399.             })
  400.         }
  401.         function editarInfoEquipoRefaccion(url){
  402.             $('#editar-equiporefaccion').load(url, function ()
  403.             {
  404.                 // configuración del Modal
  405.                 $("#editar-equiporefaccion").on('hide.bs.modal', function () {
  406.                     $(this).html('Cargando');
  407.                 });
  408.                 $(".modal-dialog").draggable;
  409.                 editarInfoEquipoRefaccionAjax(url)
  410.             })
  411.         }
  412.         function editarInfoEquipoResguardoAjax(url){
  413.             let send = $("#btn_equipo_guardar");
  414.             $('#btn_equipo_guardar').on('click', function () {
  415.                 let formData = new FormData(document.getElementById("form-editar-equipo"));
  416.                 $.ajax({
  417.                     type: "POST",
  418.                     url: url,
  419.                     data: formData, // Adjuntar los campos del formulario enviado.
  420.                     dataType: "json",
  421.                     cache: false,
  422.                     contentType: false,
  423.                     processData: false,
  424.                     beforeSend: function () {
  425.                         send.text("Actualizando "); // Para input de tipo button
  426.                         send.append("<i class='fa fa-spinner fa-spin' style='font-size:16px'></i>");
  427.                         send.prop("disabled", true);
  428.                     },
  429.                     success: function (data) {
  430.                         let datos = data;
  431.                         let row = $('#idEqu' + datos.idEqu);
  432.                         row.find('.marbete').html(datos.marbete);
  433.                         row.find('.descripcion').html(datos.descripcion);
  434.                         row.find('.hostname').html(datos.hostname);
  435.                         row.find('.marca').html(datos.marca);
  436.                         row.find('.modelo').html(datos.modelo);
  437.                         /*row.find('.serie').html(datos.serie);
  438.                         row.find('.tipo').html(datos.tipo);
  439.                         row.find('.uso').html(datos.uso);*/
  440.                         //row.find('.uso').html(datos.unidad.getNombre);
  441.                         //row.find('.activo').html(datos.estatus);+
  442.                         if (datos.estatus === "En operacion") {
  443.                             row.find('.estatus').html('<div class="badge bg-gradient-green d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  444.                         }
  445.                         if(datos.estatus === "Descompuesto") {
  446.                             row.find('.estatus').html('<div class="badge bg-gradient-orange d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  447.                         }
  448.                         if (datos.estatus === "Sin instalar") {
  449.                             row.find('.estatus').html('<div class="badge bg-gradient-primary d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  450.                         }
  451.                         if(datos.estatus === "En proceso de baja") {
  452.                             row.find('.estatus').html('<div class="badge bg-gradient-yellow d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  453.                         }
  454.                         if(datos.estatus === "Baja") {
  455.                             row.find('.estatus').html('<div class="badge bg-gradient-danger d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  456.                         }
  457.                         row.find('.emhv').html(datos.emhv);
  458.                         row.find('.usuario').html(datos.usuario);
  459.                         row.find('.ubicacion').html(datos.ubicacion);
  460.                         closeModal('editar-equiporesguardo');
  461.                     },
  462.                     error: function (data, text, error) {
  463.                         let datos = data.responseJSON;
  464.                         $("#editar-equiporesguardo").html(datos.form);
  465.                         editarInfoEquipoResguardoAjax(url);
  466.                     },
  467.                     complete: function (data) {
  468.                         // Se ejecuta al termino de la petición
  469.                     }
  470.                 });
  471.                 return false; // Evitar ejecutar el submit del formulario.
  472.             });
  473.         }
  474.         function editarInfoEquipoRefaccionAjax(url){
  475.             let send = $("#btn_equipo_guardar");
  476.             $('#btn_equipo_guardar').on('click', function () {
  477.                 let formData = new FormData(document.getElementById("form-editar-equipo"));
  478.                 $.ajax({
  479.                     type: "POST",
  480.                     url: url,
  481.                     data: formData, // Adjuntar los campos del formulario enviado.
  482.                     dataType: "json",
  483.                     cache: false,
  484.                     contentType: false,
  485.                     processData: false,
  486.                     beforeSend: function () {
  487.                         send.text("Actualizando "); // Para input de tipo button
  488.                         send.append("<i class='fa fa-spinner fa-spin' style='font-size:16px'></i>");
  489.                         send.prop("disabled", true);
  490.                     },
  491.                     success: function (data) {
  492.                         let datos = data;
  493.                         let row = $('#idEqu-' + datos.idEqu);
  494.                         row.find('.marbete').html(datos.marbete);
  495.                         row.find('.descripcion').html(datos.descripcion);
  496.                         row.find('.hostname').html(datos.hostname);
  497.                         row.find('.marca').html(datos.marca);
  498.                         row.find('.modelo').html(datos.modelo);
  499.                         /*row.find('.serie').html(datos.serie);
  500.                         row.find('.tipo').html(datos.tipo);
  501.                         row.find('.uso').html(datos.uso);*/
  502.                         //row.find('.uso').html(datos.unidad.getNombre);
  503.                         //row.find('.activo').html(datos.estatus);
  504.                         if (datos.estatus === "En operacion") {
  505.                             row.find('.estatus').html('<div class="badge bg-gradient-green d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  506.                         }
  507.                         if(datos.estatus === "Descompuesto") {
  508.                             row.find('.estatus').html('<div class="badge bg-gradient-orange d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  509.                         }
  510.                         if (datos.estatus === "Sin instalar") {
  511.                             row.find('.estatus').html('<div class="badge bg-gradient-primary d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  512.                         }
  513.                         if(datos.estatus === "En proceso de baja") {
  514.                             row.find('.estatus').html('<div class="badge bg-gradient-yellow d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  515.                         }
  516.                         if(datos.estatus === "Baja") {
  517.                             row.find('.estatus').html('<div class="badge bg-gradient-danger d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  518.                         }
  519.                         row.find('.emhv').html(datos.emhv);
  520.                         row.find('.usuario').html(datos.usuario);
  521.                         row.find('.ubicacion').html(datos.ubicacion);
  522.                         closeModal('editar-equiporefaccion');
  523.                     },
  524.                     error: function (data, text, error) {
  525.                         let datos = data.responseJSON;
  526.                         $("#editar-equiporefaccion").html(datos.form);
  527.                         editarInfoEquipoRefaccionAjax(url);
  528.                     },
  529.                     complete: function (data) {
  530.                         // Se ejecuta al termino de la petición
  531.                     }
  532.                 });
  533.                 return false; // Evitar ejecutar el submit del formulario.
  534.             });
  535.         }
  536.         <!-- Actualizar tabla de bitácora -->
  537.         function actualizarEquipo(data) {
  538.             $("#table-equipo").dataTable().fnClearTable();
  539.             $("#table-equipo").dataTable().fnDestroy();
  540.             var edit = "";
  541.             var downpdf = "";
  542.             var html = "";
  543.             $.each(data, function (key, equipo) {
  544.                 {# Para edición del equipo #}
  545.                 if (('{{ nivel }}' === '1' || '{{ nivel }}' === '2') && {{ unidadActiva ? 'true' : 'false' }}) {
  546.                     edit = '&nbsp;&nbsp;<a href="#editar-equipo" onclick="editarInfoEquipo(\'' + equipo.editar + '\')" data-toggle="modal" title="Modificar equipo"><i class="fas fa-pen"></i></a>';
  547.                 }
  548.                 {# Solo para edición de estatus y reguardatario #}
  549.                 if (('{{ nivel }}' === '1' || '{{ nivel }}' === '2') && {{ unidadActiva ? 'false' : 'true' }}) {
  550.                     edit = '&nbsp;&nbsp;<a href="#editar-equiporesguardo" onclick="editarInfoEquipoResguardo(\'' + equipo.editar_resguardo + '\')" data-toggle="modal" title="Modificar equipo"><i class="fas fa-pen"></i></a>';
  551.                 }
  552.                 html +=
  553.                     '<tr id="idEqu-' + equipo.idEqu + '">' +
  554.                         '<td class="marbete">' + equipo.marbete + '</td>' +
  555.                         '<td class="descripcion">' + equipo.descripcion + '</td>' +
  556.                         '<td class="hostname">' + equipo.hostname + '</td>' +
  557.                         '<td class="marca">' + equipo.marca + '</td>' +
  558.                         '<td class="modelo">' + equipo.modelo + '</td>' +
  559.                         '<td class="uso">' + equipo.uso + '</td>' +
  560.                         '<td class="estatus">' + equipo.estatus + '</td>' +
  561.                         '<td class="emhv">' + equipo.emhv + '</td>' +
  562.                         '<td class="unidad">' + equipo.unidad + '</td>' +
  563.                         '<td class="usuario">' + equipo.usuario + '</td>' +
  564.                         '<td class="ubicacion">' + equipo.ubicacion + '</td>' +
  565.                         '<td class="text-right">' +
  566.                             '<a href="#" onclick="postPdfRequest(' + equipo.idEqu + '); return false;" title="Generar resguardatario">' +
  567.                             '<i class="fas fa-file-pdf mr-2"></i>' +
  568.                             '</a>' +
  569.                             '<a href="javascript: void(0)" data-id="' + equipo.idEqu + '" class="btn-redirect" title="Ver equipo"><i class="fas fa-eye"></i></a>' +
  570.                             edit +
  571.                         '</td>' +
  572.                     '</tr>';
  573.                 //cambiarEstatus('estatus/' + equipo.idEqu, 'estatus');
  574.             });
  575.             $("#table-equipo").find($("tbody")).html(html);
  576.             $('#table-equipo').DataTable({
  577.                 "aaSorting": [],
  578.                 orderCellsTop: true,
  579.                 {# Define un valor predeterminado para LengthChange #}
  580.                 "pageLength": 50,
  581.                 "scrollX": true,
  582.                 {# sDom: 'lrtip', #}
  583.                 "bLengthChange" : true,
  584.                 language: {
  585.                     url: 'https://cdn.datatables.net/plug-ins/1.10.22/i18n/Spanish.json'
  586.                 },
  587.             });
  588.         }
  589.         function actualizarEquipoResguardo(data) {
  590.             $("#table-equipo").dataTable().fnClearTable();
  591.             $("#table-equipo").dataTable().fnDestroy();
  592.             var edit = "";
  593.             var downpdf = "";
  594.             var html = "";
  595.             $.each(data, function (key, equipo) {
  596.                 {# Para edición del equipo #}
  597.                 if (('{{ nivel }}' === '1' || '{{ nivel }}' === '2') && {{ unidadActiva ? 'true' : 'false' }}) {
  598.                     edit = '&nbsp;&nbsp;<a href="#editar-equipo" onclick="editarInfoEquipo(\'' + equipo.editar + '\')" data-toggle="modal" title="Modificar equipo"><i class="fas fa-pen"></i></a>';
  599.                 }
  600.                 {# Solo para edición de estatus y reguardatario #}
  601.                 if (('{{ nivel }}' === '1' || '{{ nivel }}' === '2') && {{ unidadActiva ? 'false' : 'true' }}) {
  602.                     edit = '&nbsp;&nbsp;<a href="#editar-equiporesguardo" onclick="editarInfoEquipoResguardo(\'' + equipo.editar_resguardo + '\')" data-toggle="modal" title="Modificar equipo"><i class="fas fa-pen"></i></a>';
  603.                 }
  604.                 html +=
  605.                     '<tr id="idEqu-' + equipo.idEqu + '">' +
  606.                     '<td class="marbete">' + equipo.marbete + '</td>' +
  607.                     '<td class="descripcion">' + equipo.descripcion + '</td>' +
  608.                     '<td class="hostname">' + equipo.hostname + '</td>' +
  609.                     '<td class="marca">' + equipo.marca + '</td>' +
  610.                     '<td class="modelo">' + equipo.modelo + '</td>' +
  611.                     '<td class="uso">' + equipo.uso + '</td>' +
  612.                     '<td class="estatus">' + equipo.estatus + '</td>' +
  613.                     '<td class="emhv">' + equipo.emhv + '</td>' +
  614.                     '<td class="unidad">' + equipo.unidad + '</td>' +
  615.                     '<td class="usuario">' + equipo.usuario + '</td>' +
  616.                     '<td class="ubicacion">' + equipo.ubicacion + '</td>' +
  617.                     '<td class="text-right">' +
  618.                     '<a href="#" onclick="postPdfRequest(' + equipo.idEqu + '); return false;" title="Generar resguardatario">' +
  619.                     '<i class="fas fa-file-pdf mr-2"></i>' +
  620.                     '</a>' +
  621.                     '<a href="javascript: void(0)" data-id="' + equipo.idEqu + '" class="btn-redirect" title="Ver equipo"><i class="fas fa-eye"></i></a>' +
  622.                     edit +
  623.                     '</td>' +
  624.                     '</tr>';
  625.                 //cambiarEstatus('estatus/' + equipo.idEqu, 'estatus');
  626.             });
  627.             $("#table-equipo").find($("tbody")).html(html);
  628.             $('#table-equipo').DataTable({
  629.                 "aaSorting": [],
  630.                 orderCellsTop: true,
  631.                 {# Define un valor predeterminado para LengthChange #}
  632.                 "pageLength": 50,
  633.                 "scrollX": true,
  634.                 {# sDom: 'lrtip', #}
  635.                 "bLengthChange" : true,
  636.                 language: {
  637.                     url: 'https://cdn.datatables.net/plug-ins/1.10.22/i18n/Spanish.json'
  638.                 },
  639.             });
  640.         }
  641.         <!-- Actualizar tabla de bitácora -->
  642.         function actualizarEquipoRefaccion(data) {
  643.             $("#table-equipo").dataTable().fnClearTable();
  644.             $("#table-equipo").dataTable().fnDestroy();
  645.             var edit = "";
  646.             var html = "";
  647.             $.each(data, function (key, equipo) {
  648.                 {# Para edición del equipo #}
  649.                 if (('{{ nivel }}' === '1' || '{{ nivel }}' === '2') && {{ unidadActiva ? 'true' : 'false' }}) {
  650.                     edit = '&nbsp;&nbsp;<a href="#editar-equipo" onclick="editarInfoEquipo(\'' + equipo.editar + '\')" data-toggle="modal" title="Modificar equipo"><i class="fas fa-pen"></i></a>';
  651.                 }
  652.                 {# Solo para edición de estatus y reguardatario #}
  653.                 if (('{{ nivel }}' === '1' || '{{ nivel }}' === '2') && {{ unidadActiva ? 'false' : 'true' }}) {
  654.                     edit = '&nbsp;&nbsp;<a href="#editar-equiporesguardo" onclick="editarInfoEquipoResguardo(\'' + equipo.editar_resguardo + '\')" data-toggle="modal" title="Modificar equipo"><i class="fas fa-pen"></i></a>';
  655.                 }
  656.                 html +=
  657.                     '<tr id="idEqu-' + equipo.idEqu + '">' +
  658.                     '<td class="marbete">' + equipo.marbete + '</td>' +
  659.                     '<td class="descripcion">' + equipo.descripcion + '</td>' +
  660.                     '<td class="hostname">' + equipo.hostname + '</td>' +
  661.                     '<td class="marca">' + equipo.marca + '</td>' +
  662.                     '<td class="modelo">' + equipo.modelo + '</td>' +
  663.                     '<td class="uso">' + equipo.uso + '</td>' +
  664.                     '<td class="estatus">' + equipo.estatus + '</td>' +
  665.                     '<td class="emhv">' + equipo.emhv + '</td>' +
  666.                     '<td class="unidad">' + equipo.unidad + '</td>' +
  667.                     '<td class="usuario">' + equipo.usuario + '</td>' +
  668.                     '<td class="ubicacion">' + equipo.ubicacion + '</td>' +
  669.                     '<td class="text-right">' +
  670.                     '<a href="#" onclick="postPdfRequest(' + equipo.idEqu + '); return false;" title="Generar resguardatario">' +
  671.                     '<i class="fas fa-file-pdf mr-2"></i>' +
  672.                     '</a>' +
  673.                     '<a href="javascript: void(0)" data-id="' + equipo.idEqu + '" class="btn-redirect" title="Ver equipo"><i class="fas fa-eye"></i></a>' +
  674.                     edit +
  675.                     '</td>' +
  676.                     '</tr>';
  677.                 //cambiarEstatus('estatus/' + equipo.idEqu, 'estatus');
  678.             });
  679.             $("#table-equipo").find($("tbody")).html(html);
  680.             $('#table-equipo').DataTable({
  681.                 "aaSorting": [],
  682.                 orderCellsTop: true,
  683.                 {# Define un valor predeterminado para LengthChange #}
  684.                 "pageLength": 50,
  685.                 "scrollX": true,
  686.                 {# sDom: 'lrtip', #}
  687.                 "bLengthChange" : true,
  688.                 language: {
  689.                     url: 'https://cdn.datatables.net/plug-ins/1.10.22/i18n/Spanish.json'
  690.                 },
  691.             });
  692.         }
  693.         function cambiarEstatus(url, accion) {
  694.             $.ajax({
  695.                 url: url,
  696.                 dataType: "json",
  697.                 cache: false,
  698.                 contentType: false,
  699.                 processData: false,
  700.                 success: function (data) {
  701.                     let datos = data;
  702.                     let row = $('#idEqu'+ datos.idEqu);
  703.                     if (datos.estatus === "En operacion") {
  704.                         row.find('.estatus').html('<div class="badge bg-gradient-green d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  705.                     }
  706.                     if(datos.estatus === "Descompuesto") {
  707.                         row.find('.estatus').html('<div class="badge bg-gradient-orange d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  708.                     }
  709.                     if (datos.estatus === "Sin instalar") {
  710.                         row.find('.estatus').html('<div class="badge bg-gradient-primary d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  711.                     }
  712.                     if(datos.estatus === "En proceso de baja") {
  713.                         row.find('.estatus').html('<div class="badge bg-gradient-yellow d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  714.                     }
  715.                     if(datos.estatus === "Baja") {
  716.                         row.find('.estatus').html('<div class="badge bg-gradient-danger d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  717.                     }
  718.                     //alertMessage(0, datos.mensaje);
  719.                 },
  720.                 error: function (data, text, error) {
  721.                     alertMessage(1, error);
  722.                 },
  723.                 complete: function (data) {
  724.                     // Se ejecuta al termino de la petición
  725.                 }
  726.             });
  727.         }
  728.     </script>
  729.     <script>
  730.         $(function () {
  731.             $(document).on('click', '.btn-redirect', function(){
  732.                 let data = $(this).attr('data-id');
  733.                 $.redirect("{{ path('app_equipo_show') }}", {idEqu: data}, "POST", "_self");
  734.             });
  735.         });
  736.     </script>
  737.     <script>
  738.         function confirmDelete(actionUrl, csrfToken) {
  739.             // Configura la acción del formulario en el modal
  740.             const deleteForm = document.getElementById('deleteForm');
  741.             deleteForm.action = actionUrl;
  742.             // Configura el token CSRF
  743.             document.getElementById('csrfToken').value = csrfToken;
  744.             // Muestra el modal
  745.             $('#confirmDeleteModal').modal('show');
  746.         }
  747.     </script>
  748. {% endblock %}