templates/ubicacion/index.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block stylesheets %}
  3.     <link rel="stylesheet" href="{{ asset('plugins/datatables-bs4/css/dataTables.bootstrap4.min.css') }}">
  4.     <link rel="stylesheet" href="{{ asset('plugins/datatables-responsive/css/responsive.bootstrap4.min.css') }}">
  5.     <link rel="stylesheet" href="{{ asset('plugins/datatables-buttons/css/buttons.bootstrap4.min.css') }}">
  6.     <style>
  7.         td.descripcion {
  8.             max-width: 300px !important;
  9.             text-overflow: ellipsis;
  10.             white-space: nowrap;
  11.             overflow: hidden;
  12.         }
  13.     </style>
  14. {% endblock %}
  15. {% block title %} - Áreas{% endblock %}
  16. {% block body %}
  17.     <div class="content-wrapper">
  18.         {% for label, messages in app.flashes %}
  19.             {% for message in messages %}
  20.                 <div class="alert alert-{{ label }} alert-dismissible fade show" role="alert">
  21.                     {{ message }}
  22.                     <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
  23.                 </div>
  24.             {% endfor %}
  25.         {% endfor %}
  26.         <section class="content-header">
  27.             <div class="card">
  28.                 <div class="card-header">
  29.                     <h1 class="card-title">Ubicación</h1>
  30.                     <div class="card-tools">
  31.                         <ol class="breadcrumb float-sm-right">
  32.                             <li class="breadcrumb-item">Lista</li>
  33.                             <li class="breadcrumb-item active">Ubicaciones</li>
  34.                         </ol>
  35.                     </div>
  36.                 </div>
  37.             </div>
  38.         </section>
  39.         <section class="content">
  40.             <div class="card">
  41.                 <div class="card-header">
  42.                     <div class="row">
  43.                         {# {{ form_start(form, {'attr': {'class': 'form-inline col-md-auto', 'id': 'form_unidad_filtro'}}) }}
  44.                         {{ form_row(form.filtro) }}
  45.                         {% if form.unidad is defined %}
  46.                             {{ form_row(form.unidad) }}
  47.                         {% endif %}
  48.                         {{ form_end(form) }} #}
  49.                         <div class="col text-right">
  50.                             <button id="descargar_excel" type="button" class="btn btn-outline-success mr-2" onclick="descargarExcel()">
  51.                                 <i class="fas fa-file-excel mr-2"></i> Descargar
  52.                             </button>
  53.                             {% if nivel <= 2 %}
  54.                                 <a href="{{ path('app_ubicacion_new') }}" class="btn btn-outline-success">
  55.                                     <i class="fas fa-file mr-2"></i> Agregar Ubicación
  56.                                 </a>
  57.                             {% endif %}
  58.                         </div>
  59.                     </div>
  60.                 </div>
  61.                 <div class="card-body">
  62.                     <table class="table table-striped w-100" id="table-ubicacion">
  63.                         <thead>
  64.                         <tr>
  65.                             <th>ID</th>
  66.                             <th>Ubicación</th>
  67.                             <th>Unidad</th>
  68.                             <th class="text-center">Estatus</th>
  69.                             <th class="text-center">Acciones</th>
  70.                         </tr>
  71.                         </thead>
  72.                         <tbody>
  73.                         {% for ubicacion in ubicacions %}
  74.                             <tr id="idUbi-{{ ubicacion.idUbi }}">
  75.                                 <td class="id">{{ ubicacion.idUbi }}</td>
  76.                                 <td class="area">{{ ubicacion.area }}</td>
  77.                                 <td class="unidad">{{ ubicacion.unidad}}</td>
  78.                                 <td class="activo">
  79.                                     {% if ubicacion.activo == 1 %}
  80.                                         <span class="badge bg-gradient-primary d-block">Activo</span>
  81.                                     {% elseif ubicacion.activo == 0 %}
  82.                                         <span class="badge bg-gradient-yellow d-block">Inactivo</span>
  83.                                     {% endif %}
  84.                                 </td>
  85.                                 <td class="text-center">
  86.                                     <a href="#editar-ubicacion" class="btn" onclick="editarInforUbicacion('{{ path('app_ubicacion_show', {'idUbi': ubicacion.idUbi}) }}')" data-toggle="modal"><i class="fas fa-eye"></i></a>
  87.                                     {% if nivel <= 2 %}
  88.                                         <a href="#editar-ubicacion" class="btn" onclick="editarInforUbicacion('{{ path('app_ubicacion_edit', {'idUbi': ubicacion.idUbi}) }}')" data-toggle="modal"><i class="fas fa-pen"></i></a>
  89.                                     {% endif %}
  90.                                     {% if nivel in [2] %}
  91.                                         <button type="button" onclick="confirmDelete('{{ path('app_ubicacion_delete', {'idUbi': ubicacion.idUbi}) }}', '{{ csrf_token('delete' ~ ubicacion.idUbi) }}')" class="btn btn-link text-danger p-0" title="Eliminar equipo">
  92.                                             <i class="fas fa-trash-alt"></i>
  93.                                         </button>
  94.                                     {% endif %}
  95.                                 </td>
  96.                             </tr>
  97.                         {% else %}
  98.                             <tr>
  99.                                 <td colspan="5">No records found</td>
  100.                             </tr>
  101.                         {% endfor %}
  102.                         </tbody>
  103.                     </table>
  104.                 </div>
  105.             </div>
  106.         </section>
  107.     </div>
  108.     <div class="modal fade" id="confirmDeleteModal" tabindex="-1" role="dialog" aria-labelledby="confirmDeleteModalLabel" aria-hidden="true">
  109.         <div class="modal-dialog" role="document">
  110.             <div class="modal-content">
  111.                 <div class="modal-header">
  112.                     <h5 class="modal-title" id="confirmDeleteModalLabel">Confirmar Eliminación</h5>
  113.                     <button type="button" class="close" data-dismiss="modal" aria-label="Cerrar">
  114.                         <span aria-hidden="true">&times;</span>
  115.                     </button>
  116.                 </div>
  117.                 <div class="modal-body">
  118.                     ¿Estás seguro de que deseas eliminar este registro?
  119.                 </div>
  120.                 <div class="modal-footer">
  121.                     <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
  122.                     <!-- Botón para confirmar eliminación -->
  123.                     <form id="deleteForm" method="post">
  124.                         <input type="hidden" name="_token" id="csrfToken" value="">
  125.                         <button type="submit" class="btn btn-danger">Eliminar</button>
  126.                     </form>
  127.                 </div>
  128.             </div>
  129.         </div>
  130.     </div>
  131.     <div class="modal hide" id="editar-ubicacion"></div>
  132. {% endblock %}
  133. {% block javascripts %}
  134.     <script src="{{ asset('plugins/datatables/jquery.dataTables.min.js') }}"></script>
  135.     <script src="{{ asset('plugins/datatables-bs4/js/dataTables.bootstrap4.min.js') }}"></script>
  136.     <script src="{{ asset('plugins/datatables-responsive/js/dataTables.responsive.min.js') }}"></script>
  137.     <script src="{{ asset('plugins/datatables-responsive/js/responsive.bootstrap4.min.js') }}"></script>
  138.     <script src="{{ asset('plugins/datatables-buttons/js/dataTables.buttons.min.js') }}"></script>
  139.     <script src="{{ asset('plugins/datatables-buttons/js/buttons.bootstrap4.min.js') }}"></script>
  140.     <script src="{{ asset('plugins/jszip/jszip.min.js') }}"></script>
  141.     <script src="{{ asset('plugins/pdfmake/pdfmake.min.js') }}"></script>
  142.     <script src="{{ asset('plugins/pdfmake/vfs_fonts.js') }}"></script>
  143.     <script src="{{ asset('plugins/datatables-buttons/js/buttons.html5.min.js') }}"></script>
  144.     <script src="{{ asset('plugins/datatables-buttons/js/buttons.print.min.js') }}"></script>
  145.     <script src="{{ asset('plugins/datatables-buttons/js/buttons.colVis.min.js') }}"></script>
  146.     <script type="text/javascript">
  147.         // Menú lateral
  148.         $("#catalogo").addClass("menu-open");
  149.         $("#catalogo").find('.nav-link:first').addClass("active");
  150.         $("#ubicacion").addClass("active");
  151.         $(function () {
  152.             // Inicialización del DataTable
  153.             $('#table-ubicacion').DataTable({
  154.                 "aaSorting": [],
  155.                 orderCellsTop: true,
  156.                 "pageLength": 10,
  157.                 "scrollX": true,
  158.                 "bLengthChange": true,
  159.                 language: {
  160.                     url: 'https://cdn.datatables.net/plug-ins/1.10.22/i18n/Spanish.json'
  161.                 }
  162.             });
  163.             // Filtro de unidad
  164.             /*{% if form.unidad is defined %}
  165.             $("#unidad_filtro_unidad").on('change', function () {
  166.                 aplicarFiltro();
  167.             });
  168.             {% endif %}*/
  169.         });
  170.         // Función para editar información de una ubicación
  171.         function editarInforUbicacion(url) {
  172.             $('#editar-ubicacion').load(url, function () {
  173.                 // Configuración del modal
  174.                 $("#editar-ubicacion").on('hide.bs.modal', function () {
  175.                     $(this).html('Cargando');
  176.                 });
  177.                 $(".modal-dialog").draggable;
  178.                 editarInforUbicacionAjax(url)
  179.             });
  180.         }
  181.         function editarInforUbicacionAjax(url){
  182.             let send = $("#btn_ubicacion_guardar");
  183.             $('#btn_ubicacion_guardar').on('click', function () {
  184.                 let formData = new FormData(document.getElementById("form-editar-ubicacion"));
  185.                 $.ajax({
  186.                     type: "POST",
  187.                     url: url,
  188.                     data: formData, // Adjuntar los campos del formulario enviado.
  189.                     dataType: "json",
  190.                     cache: false,
  191.                     contentType: false,
  192.                     processData: false,
  193.                     beforeSend: function () {
  194.                         send.text("Actualizando "); // Para input de tipo button
  195.                         send.append("<i class='fa fa-spinner fa-spin' style='font-size:16px'></i>");
  196.                         send.prop("disabled", true);
  197.                     },
  198.                     success: function (data) {
  199.                         let datos = data;
  200.                         let row = $('#idUbi-' + datos.idUbi);
  201.                         row.find('.area').html(datos.area);
  202.                         row.find('.unidad').html(datos.unidad.getNombre);
  203.                         //row.find('.activo').html(datos.activo);
  204.                         if (datos.activo === "Activo") {
  205.                             row.find('.activo').html('<div class="badge bg-gradient-primary d-block">' + datos.activo + '</div>');
  206.                         }
  207.                         if(datos.activo === "Inactivo") {
  208.                             row.find('.activo').html('<div class="badge bg-gradient-yellow d-block">' + datos.activo + '</div>');
  209.                         }
  210.                         closeModal('editar-ubicacion');
  211.                         alertMessage(0, data.mensaje)
  212.                     },
  213.                     error: function (data, text, error) {
  214.                         let datos = data.responseJSON;
  215.                         $("#editar-ubicacion").html(datos.form);
  216.                         editarInforUbicacionAjax(url);
  217.                     },
  218.                     complete: function (data) {
  219.                         // Se ejecuta al termino de la petición
  220.                     }
  221.                 });
  222.                 return false; // Evitar ejecutar el submit del formulario.
  223.             });
  224.         }
  225.         <!-- Actualizar tabla de bitácora -->
  226.         function actualizarUbicacion(data) {
  227.             $("#table-ubicacion").dataTable().fnClearTable();
  228.             $("#table-ubicacion").dataTable().fnDestroy();
  229.             var edit = "";
  230.             var html = "";
  231.             $.each(data, function (key, ubicacion) {
  232.                 if (nivel in [2]){ {# modificar #}
  233.                     edit = '&nbsp;|&nbsp;<a href="#editar-ubicacion" onclick="editarInforUbicacion(\'' + ubicacion.editar + '\')" data-toggle="modal"><i class="fas fa-pen"></i></a>';
  234.                 }
  235.                 html += '<tr id="idUbi' + ubicacion.idUbi + '">' +
  236.                     '<td>' + ubicacion.area + '</td>' +
  237.                     '<td>' + ubicacion.unidad + '</td>' +
  238.                     '<td class="activo">' + ubicacion.activo + '</td>' +
  239.                     '<td class="text-right">' +
  240.                     '<a href="' + ubicacion.ver + '"><i class="fas fa-eye"></i></a>' + edit +
  241.                     '</td>' +
  242.                     '</tr>';
  243.             });
  244.             $("#table-ubicacion").find($("tbody")).html(html);
  245.             $('#table-ubicacion').DataTable({
  246.                 "aaSorting": [],
  247.                 orderCellsTop: true,
  248.                 {# Define un valor predeterminado para LengthChange #}
  249.                 "pageLength": 10,
  250.                 "scrollX": true,
  251.                 {# sDom: 'lrtip', #}
  252.                 "bLengthChange" : true,
  253.                 language: {
  254.                     url: 'https://cdn.datatables.net/plug-ins/1.10.22/i18n/Spanish.json'
  255.                 },
  256.             });
  257.         }
  258.         function cambiarEstatus(url, accion) {
  259.             $.ajax({
  260.                 url: url,
  261.                 dataType: "json",
  262.                 cache: false,
  263.                 contentType: false,
  264.                 processData: false,
  265.                 success: function (data) {
  266.                     let datos = data;
  267.                     let row = $('#idUbi-'+ datos.idUbi);
  268.                     if (accion === "Activo"){
  269.                         row.find('.activo').html('<div class="badge bg-gradient-primary d-block">' + datos.activo + '</div>');
  270.                     } else {
  271.                         row.find('.activo').html('<div class="badge bg-gradient-yellow d-block">' + datos.activo + '</div>');
  272.                     }
  273.                     //alertMessage(0, datos.mensaje);
  274.                 },
  275.                 error: function (data, text, error) {
  276.                     alertMessage(1, error);
  277.                 },
  278.                 complete: function (data) {
  279.                     // Se ejecuta al termino de la petición
  280.                 }
  281.             });
  282.         }
  283.         function aplicarFiltro() {
  284.             $("#table-otro").find($("tbody")).html("<tr><td colspan='8' class='text-center'><i class='fas fa-spinner fa-pulse'></i></td></tr>");
  285.             let formData = new FormData(document.getElementById("form_unidad_filtro"));
  286.             $.ajax({
  287.                 type: "POST",
  288.                 url: '{{ path('app_ubicacion_index') }}',
  289.                 data: formData, // Adjuntar los campos del formulario enviado.
  290.                 dataType: "html",
  291.                 cache: false,
  292.                 contentType: false,
  293.                 processData: false,
  294.                 success: function (data) {
  295.                     let datos = jQuery.parseJSON(data);
  296.                     console.log(datos);
  297.                     actualizarOtro(datos);
  298.                 },
  299.                 error: function (data, text, error) {
  300.                     let datos = jQuery.parseJSON(data.responseText);
  301.                     console.log(datos);
  302.                 }
  303.             });
  304.         }
  305.         function descargarExcel() {
  306.             let btn = $("#descargar_excel");
  307.             
  308.             let formElement = document.getElementById("form_unidad_filtro");
  309.             let formData = new FormData();
  310.             if (formElement) {
  311.                 formData = new FormData(formElement);
  312.             }
  313.             
  314.             $.ajax({
  315.                 type: "POST",
  316.                 url: '{{ path('app_reporte_ubicacion_excel') }}',
  317.                 data: formData, // Adjuntar los campos del formulario enviado.
  318.                 cache: false,
  319.                 contentType: false,
  320.                 processData: false,
  321.                 xhrFields: {
  322.                     responseType: 'blob'
  323.                 },
  324.                 beforeSend: function () {
  325.                     btn.prop('disabled', true);
  326.                     btn.html("<i class='fas fa-spinner fa-pulse'></i> Descargar");
  327.                 },
  328.                 success: function (data) {
  329.                     let a = document.createElement('a');
  330.                     a.href = window.URL.createObjectURL(data);
  331.                     a.download = "Ubicaciones-Área.xlsx"
  332.                     a.click();
  333.                 },
  334.                 complete: function () {
  335.                     btn.prop('disabled', false);
  336.                     btn.html("<i class='fas fa-file-excel mr-2'></i> Descargar");
  337.                 }
  338.             });
  339.         }
  340.     </script>
  341.     <script>
  342.         function confirmDelete(actionUrl, csrfToken) {
  343.             // Configura la acción del formulario en el modal
  344.             const deleteForm = document.getElementById('deleteForm');
  345.             deleteForm.action = actionUrl;
  346.             // Configura el token CSRF
  347.             document.getElementById('csrfToken').value = csrfToken;
  348.             // Muestra el modal
  349.             $('#confirmDeleteModal').modal('show');
  350.         }
  351.     </script>
  352. {% endblock %}