templates/equipo/modal.html.twig line 1

Open in your IDE?
  1. {% block stylesheets %}
  2.     <link href="{{ asset('plugins/select2/css/select2.min.css') }}" rel="stylesheet" />
  3.     <style>
  4.         fieldset
  5.         {
  6.             border: 1px solid #bbbbbb !important;
  7.             margin: 0;
  8.             min-width: 0;
  9.             padding: 10px;
  10.             position: relative;
  11.             border-radius:4px;
  12.             background-color:#f5f5f5;
  13.         }
  14.         legend
  15.         {
  16.             font-size: 15px;
  17.             font-weight: bold;
  18.             margin-bottom: 0;
  19.             width: 35%;
  20.             border: 1px solid #bbbbbb;
  21.             border-radius: 4px;
  22.             padding: 5px 5px 5px 10px;
  23.             background-color: #cecece;
  24.         }
  25.         label {
  26.             font-size: 14px;
  27.             color: #5C5A5A;
  28.         }
  29.         .select2-selection.is-invalid {
  30.             border-color: #dc3545 !important;
  31.         }
  32.         .select2-selection.is-invalid:focus {
  33.             box-shadow: 0 0 0 0.2rem rgba(220,53,69,.25) !important;
  34.         }
  35.         .custom-invalid-message {
  36.              color: #dc3545; /* Rojo Bootstrap */
  37.              font-size: 0.875em;
  38.              margin-top: 5px;
  39.          }
  40.     </style>
  41. {% endblock %}
  42. {# Plantilla de Twig #}
  43. {% form_theme form 'bootstrap_4_layout.html.twig' %}
  44. <!-- Modal with form -->
  45. <!-- div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true" -->
  46. <div class="modal-dialog modal-lg" role="document">
  47.     <div class="modal-content p-4">
  48.         <div class="modal-header">
  49.             <div class = 'tituloEquipo'><h5 class="modal-title" id="exampleModalLabel"><b>Modificación <small class="text-secondary"> de Equipo de cómputo <strong class="text-primary">#{{ equipo.idEqu }}</strong></small></b></h5></div>
  50.             <div class = 'tituloSolicitudes'></div>
  51.             <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  52.                 <span aria-hidden="true">&times;</span>
  53.             </button>
  54.         </div>
  55.         <div class="modal-body">
  56.             <div class="card-body">
  57.                 <div class= 'infoEquipo'>
  58.                     {{ form_start(form, {'attr': {'class': 'form-horizontal', 'id': 'form-editar-equipo'}}) }}
  59.                     {# Datos del equipo #}
  60.                     <fieldset>
  61.                         <legend>Identificación del equipo</legend>
  62.                         <div class="control-group">
  63.                             <div class="row" >
  64.                                 <div class="col-lg">{{ form_row(form.marbete,{
  65.                                         'attr': {
  66.                                             'hidden': false,
  67.                                         }}) }}
  68.                                 </div>
  69.                                 <div class="col-lg">{{ form_row(form.idMarca) }}</div>
  70.                                 <div class="col-lg">{{ form_row(form.modelo) }}</div>
  71.                                 <div class="col-lg">{{ form_row(form.serie) }}</div>
  72.                             </div>
  73.                             <div class="row" disabled>
  74.                                 <div class="col-lg">{{ form_row(form.descripcion) }}</div>
  75.                             </div>
  76.                         </div>
  77.                         <br>
  78.                     </fieldset>
  79.                     <br>
  80.                     {# Hardware #}
  81.                     <fieldset>
  82.                         <legend>Hardware</legend>
  83.                         <div class="row">
  84.                             <div class="col-lg">{{ form_row(form.procesador) }}</div>
  85.                             <div class="col-lg">{{ form_row(form.nucleos) }}</div>
  86.                             <div class="col-lg">{{ form_row(form.cpuVelocidad) }}</div>
  87.                             <div class="col-lg">{{ form_row(form.ram)}} </div>
  88.                         </div>
  89.                         <div class="row">
  90.                             <div class="col-lg">{{ form_row(form.ip) }}</div>
  91.                             <div class="col-lg">{{ form_row(form.mac) }}</div>
  92.                             <div class="col-lg">{{ form_row(form.ssd) }}</div>
  93.                             <div class="col-lg">{{ form_row(form.hhd) }}</div>
  94.                         </div>
  95.                         <div class = "row">
  96.                             <div class="col-lg">{{ form_row(form.idMaterial) }}</div>
  97.                             <div class="col-lg">{{ form_row(form.color) }}</div>
  98.                         </div>
  99.                         <div class="row" disabled>
  100.                             <div class="col-lg">{{ form_row(form.allinone) }}</div>
  101.                             <div class="col-lg">{{ form_row(form.actualizable) }}</div>
  102.                         </div>
  103.                     </fieldset>
  104.                     <br>
  105.                     {# Perifericos #}
  106.                     <fieldset>
  107.                         {# Monitor #}
  108.                         <legend>Monitor</legend>
  109.                         <div class="row">
  110.                             <div class="col-lg">{{ form_row(form.monitorMarbete) }}</div>
  111.                             <div class="col-lg">{{ form_row(form.monitorMarca) }}</div>
  112.                             <div class="col-lg">{{ form_row(form.monitorModelo) }}</div>
  113.                         </div>
  114.                         <div class="row">
  115.                             <div class="col-lg">{{ form_row(form.monitorSerie) }}</div>
  116.                             <div class="col-lg">{{ form_row(form.monitorTipo) }}</div>
  117.                             <div class="col-lg">{{ form_row(form.monitorPulgadas) }}</div>
  118.                         </div>
  119.                     </fieldset>
  120.                     <br>
  121.                     <fieldset>
  122.                         {# Teclado #}
  123.                         <legend>Teclado</legend>
  124.                         <div class="row">
  125.                             <div class="col-lg">{{ form_row(form.tecladoMarca) }}</div>
  126.                             <div class="col-lg">{{ form_row(form.tecladoModelo) }}</div>
  127.                             <div class="col-lg">{{ form_row(form.tecladoSerie) }}</div>
  128.                         </div>
  129.                     </fieldset>
  130.                     <br>
  131.                     <fieldset>
  132.                         {# Mouse #}
  133.                         <legend>Mouse</legend>
  134.                         <div class="row">
  135.                             <div class="col-lg">{{ form_row(form.mouseMarca) }}</div>
  136.                             <div class="col-lg">{{ form_row(form.mouseModelo) }}</div>
  137.                             <div class="col-lg">{{ form_row(form.mouseSerie) }}</div>
  138.                         </div>
  139.                     </fieldset>
  140.                     <br>
  141.                     {# Estatus y resguardo #}
  142.                     <fieldset>
  143.                         <legend>Estatus y resguardo</legend>
  144.                         <div class="row">
  145.                             <div class="col-lg">{{ form_row(form.estatus) }}</div>
  146.                             <div class="col-lg">{{ form_row(form.uso) }}</div>
  147.                             <div class="col-lg">{{ form_row(form.idUso) }}</div>
  148.                         </div>
  149.                         <div class="row">
  150.                             <div class="col-lg">{{ form_row(form.funcion) }}</div>
  151.                             <div class="col-lg">{{ form_row(form.funcionDescripcion) }}</div>
  152.                         </div>
  153.                         <div class="row">
  154.                             <div class="col-lg">{{ form_row(form.usuario) }}</div>
  155.                             {# <div class="col-lg">{{ form_row(form.emhv) }}</div> #}
  156.                             <div class="col-lg">{{ form_row(form.ubicacion) }}</div>
  157.                             {% if form.unidad is defined %}
  158.                                 <div class="col-lg">{{ form_row(form.unidad) }}</div>
  159.                             {% endif %}
  160.                         </div>
  161.                         <div class= "row">
  162.                             <div class="col-lg">{{ form_row(form.piso) }}</div>
  163.                             <div class="col-lg">{{ form_row(form.seccionAula) }}</div>
  164.                             <div class="col-lg">{{ form_row(form.numPuertaCubi) }}</div>
  165.                         </div>
  166.                     </fieldset>
  167.                     <br>
  168.                     <div class="row">
  169.                         <div class="col text-center">
  170.                             <button class="btn btn-outline-success" id="btn_equipo_guardar">{{ button_label|default('Guardar') }}</button>
  171.                         </div>
  172.                         <div class="col text-center">
  173.                             <button type="button" class="btn btn-outline-primary" data-dismiss="modal" aria-label="Close">
  174.                                 Cancelar
  175.                             </button>
  176.                         </div>
  177.                     </div>
  178.                     {{ form_end(form) }}
  179.                 </div>
  180.                 <div class="infoSolicitudes"></div>
  181.                 <div class="btnCerrar"></div>
  182.             </div>
  183.         </div>
  184.     </div>
  185. </div>
  186. <!-- /div -->
  187. {% block javascripts %}
  188.     <script src="{{ asset('plugins/jquery/jquery.min.js') }}"></script>
  189.     <script src="{{ asset('plugins/select2/js/select2.min.js') }}"></script>
  190.     <script>
  191.         $(document).ready(function () {
  192.             $('.search-marca').each(function(index, element) {
  193.                 if (!$(element).is('[readonly]')) {  // Only initialize if NOT readonly
  194.                     $(element).select2({
  195.                         placeholder: 'Seleccione una marca',
  196.                         allowClear: true
  197.                     });
  198.                 } else {
  199.                     let id = $(element).val();
  200.                     let text = $(element).find('option:selected').text();
  201.                     let option = new Option(text, id, true, true);
  202.                     $(element).prop('readonly', 'readonly');
  203.                     $(element).next('.select2').find('.select2-selection').addClass('select2-disabled');
  204.                     $(element).append(option).trigger('change');
  205.                 }
  206.             });
  207.             $('.search-material').select2({
  208.                 placeholder: 'Seleccione un material',
  209.                 allowClear: true
  210.             });
  211.             comportamientoCampos(document.getElementById('equipo_allinone').checked)
  212.         })
  213.         document.getElementById('equipo_allinone').addEventListener('click', function(event) {
  214.             comportamientoCampos(event.target.checked);
  215.         })
  216.         function editarInfoEquipoAjax(url){
  217.             let send = $("#btn_equipo_guardar");
  218.             $('#btn_equipo_guardar').on('click', function (e) {
  219.                 let formData = new FormData(document.getElementById("form-editar-equipo"));
  220.                 let dataObj = Object.fromEntries(formData.entries());
  221.                 let form = document.getElementById("form-editar-equipo");
  222.                 console.log(form);
  223.                 let hasError = false;
  224.                 let labels = document.querySelectorAll("label");
  225.                 // Validar monitorMarca
  226.                 let monitorMarca = $(`#${labels[25].getAttribute("for")}`);
  227.                 if($(`#${labels[25].getAttribute("for")}`).val() === '' && document.getElementById('equipo_allinone').checked === false){
  228.                     $(`#${labels[25].getAttribute("for")}`).addClass('is-invalid');
  229.                     e.preventDefault();
  230.                     let select = document.querySelector(`#${labels[25].getAttribute("for")}`);
  231. // Obtener el contenedor select2 generado
  232.                     let select2Container = select.nextElementSibling;
  233.                     let selection = select2Container.querySelector('.select2-selection');
  234. // Agregar clase de error
  235.                     selection.classList.add('is-invalid');
  236.                     let existingMessage = labels[25].querySelector('.custom-invalid-message');
  237.                     if (!existingMessage) {
  238.                         let message = document.createElement('span');
  239.                         message.className = 'custom-invalid-message'; // clase para poder identificarlo y evitar duplicados
  240.                         // Agregar el HTML interno
  241.                         message.innerHTML = `
  242.                             <span class="invalid-feedback d-block">
  243.                                 <span class="d-block">
  244.                                     <span class="form-error-icon badge badge-danger text-uppercase">Error</span>
  245.                                     <span class="form-error-message">El campo "Marca" no debe estar vacío.</span>
  246.                                 </span>
  247.                             </span>
  248.                         `;
  249.                         labels[25].appendChild(message);
  250.                     }
  251.                     return false;
  252.                 }
  253.                 var html = "";
  254.                 var btnCerrar = "";
  255.                 var tituloE= "";
  256.                 $.ajax({
  257.                     type: "POST",
  258.                     url: url,
  259.                     data: formData, // Adjuntar los campos del formulario enviado.
  260.                     dataType: "json",
  261.                     cache: false,
  262.                     contentType: false,
  263.                     processData: false,
  264.                     beforeSend: function () {
  265.                         send.text("Actualizando "); // Para input de tipo button
  266.                         send.append("<i class='fa fa-spinner fa-spin' style='font-size:16px'></i>");
  267.                         send.prop("disabled", true);
  268.                     },
  269.                     success: function (data) {
  270.                         let datos = data;
  271.                         let row = $('#idEqu-' + datos.idEqu);
  272.                         row.find('.marbete').html(datos.marbete);
  273.                         row.find('.descripcion').html(datos.descripcion);
  274.                         row.find('.marca').html(datos.marca);
  275.                         row.find('.modelo').html(datos.modelo);
  276.                         /*row.find('.serie').html(datos.serie);
  277.                         row.find('.tipo').html(datos.tipo);
  278.                         row.find('.uso').html(datos.uso);*/
  279.                         //row.find('.uso').html(datos.unidad.getNombre);
  280.                         //row.find('.activo').html(datos.estatus);
  281.                         if (datos.estatus === "En operacion") {
  282.                             row.find('.estatus').html('<div class="badge bg-gradient-green d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  283.                         }
  284.                         if(datos.estatus === "Descompuesto") {
  285.                             row.find('.estatus').html('<div class="badge bg-gradient-orange d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  286.                         }
  287.                         if (datos.estatus === "Sin instalar") {
  288.                             row.find('.estatus').html('<div class="badge bg-gradient-primary d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  289.                         }
  290.                         if(datos.estatus === "En proceso de baja") {
  291.                             row.find('.estatus').html('<div class="badge bg-gradient-yellow d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  292.                         }
  293.                         if(datos.estatus === "Baja") {
  294.                             row.find('.estatus').html('<div class="badge bg-gradient-danger d-block" style="width: 8rem;">' + datos.estatus + '</div>');
  295.                         }
  296.                         row.find('.emhv').html(datos.emhv);
  297.                         row.find('.usuario').html(datos.usuario);
  298.                         row.find('.ubicacion').html(datos.ubicacion);
  299.                         if(datos.solicitudes.idSolicitud === 0){
  300.                             $('#editar-equipo').removeClass('show');
  301.                             $('#editar-equipo').fadeOut();
  302.                             $('body').removeClass('modal-open');
  303.                             $('.modal-backdrop').remove();
  304.                         }else{
  305.                             $('.infoEquipo').html('').fadeOut();
  306.                             $('.tituloEquipo').html('').fadeOut();
  307.                             tituloE = `<h5 class="modal-title" id="exampleModalLabel"><b>Modificación  <small class="text-secondary">de Usuario a las solicitudes</small></b></h5>`;
  308.                             html += `<p>Se a modificado el usuario de las siguientes solicitudes que pertenecen al marbete: <strong>${datos.marbete}</strong></p><br>
  309.                                     <table class="table table-hover">
  310.                                         <thead>
  311.                                             <tr><th>Número de solicitud</th><th>Estatus</th><th>Usuario anterior</th><th>Usuario nuevo</th></tr>
  312.                                         </thead>
  313.                                         <tbody>`;
  314.                             for(let i = 0; i < datos.solicitudes.length; i++){
  315.                                 html += `
  316.                                         <tr><td>${datos.solicitudes[i].idSolicitud}</td>
  317.                                         <td>${datos.solicitudes[i].estatus}</td>
  318.                                         <td>${datos.solicitudes[i].usuAnterior}</td>
  319.                                         <td>${datos.solicitudes[i].usuNuevo}</td></tr>
  320.                                     `;
  321.                             }
  322.                             html += `</tbody>
  323.                                             </table>`;
  324.                             btnCerrar = `
  325.                                         <div class="row">
  326.                                             <div class="col" style="text-align: right;">
  327.                                                 <button type="button" class="btn btn-outline-primary" data-dismiss="modal" aria-label="Close">
  328.                                                     Cerrar
  329.                                                 </button>
  330.                                             </div>
  331.                                         </div>
  332.                                     `;
  333.                             $(".tituloSolicitudes").html(tituloE);
  334.                             $(".infoSolicitudes").html(html);
  335.                             $(".btnCerrar").html(btnCerrar);
  336.                         }
  337.                     },
  338.                     error: function (data, text, error) {
  339.                         let datos = data.responseJSON;
  340.                         $("#editar-equipo").html(datos.form);
  341.                         editarInfoEquipoAjax(url);
  342.                     },
  343.                     complete: function (data) {
  344.                         // Se ejecuta al termino de la petición
  345.                     }
  346.                 });
  347.                 return false; // Evitar ejecutar el submit del formulario.
  348.             });
  349.         }
  350.         function comportamientoCampos(status){
  351.             if(status) {
  352.                 document.getElementById('equipo_monitorMarbete').readOnly = true;
  353.                 document.getElementById('equipo_monitorMarca').disabled = true;
  354.                 document.getElementById('equipo_monitorModelo').readOnly = true;
  355.                 document.getElementById('equipo_monitorSerie').readOnly = true;
  356.                 document.getElementById('equipo_monitorTipo').readOnly = true;
  357.                 document.getElementById('equipo_monitorPulgadas').readOnly = true;
  358.             } else {
  359.                 document.getElementById('equipo_monitorMarbete').readOnly = false;
  360.                 document.getElementById('equipo_monitorMarca').disabled = false;
  361.                 document.getElementById('equipo_monitorMarca').required = true;
  362.                 document.getElementById('equipo_monitorModelo').readOnly = false;
  363.                 document.getElementById('equipo_monitorSerie').readOnly = false;
  364.                 document.getElementById('equipo_monitorTipo').readOnly = false;
  365.                 document.getElementById('equipo_monitorPulgadas').readOnly = false;
  366.             }
  367.         }
  368.         function validacionCampo(id){
  369.             console.log(id);
  370.         }
  371.     </script>
  372. {% endblock %}