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