pasosdeJesus/sivel2_gen

View on GitHub
app/javascript/controllers/enviar_ficha_caso_controller.js

Summary

Maintainability
F
3 days
Test Coverage
import { Controller } from "@hotwired/stimulus"

// Conecta con data-controller="sivel2-gen--enviar-ficha-caso"
export default class extends Controller {
  static targets = ["idcaso"]

  connect() {
    document.getElementById("capa-cargando").style.display = 'none';
    console.log("Conexion de controlador enviar ficha caso establecida")
    const pestanias = document.querySelectorAll('.fichacambia');
    pestanias.forEach(function(pestania) {
      pestania.setAttribute('data-enviar-ficha-caso-target', pestania.id);
      pestania.setAttribute('data-action', 'click->sivel2-gen--enviar-ficha-caso#cambiarficha');
    });

    const pestanaActiva = localStorage.getItem('pestanaActiva');
    if (pestanaActiva != null) {
      pestanias.forEach(function(pestania) {
        if (pestania.id == pestanaActiva) {
          pestania.classList.add('active');
          const atributoId = pestania.getAttribute('data-bs-target');
          const atributo = document.querySelector(atributoId);
          if (atributo) {
            atributo.classList.add('show', 'active');
          }
        } else {
          pestania.classList.remove('active');
          const atributoId = pestania.getAttribute('data-bs-target');
          const atributo = document.querySelector(atributoId);
          if (atributo) {
            atributo.classList.remove('show', 'active');
          }
        }
      });
      localStorage.removeItem('pestanaActiva');
    }
  }

  requiereGuardar() {
    // Si las fechas de creación y actualización son la misma debe ser
    // un caso nuevo que requiere validarse y guardarse así no tenga ediciones
    let created_at = document.querySelector('input#caso_created_at').value
    let updated_at = document.querySelector('input#caso_updated_at').value
    let c = new Date(created_at)
    let u = new Date(updated_at)
    let diffechas = Math.abs(c-u)
    // Si el caso inicialmente no es válido debe validarse y guardarse
    let inicialmente_valido = document.querySelector(
      'input#caso_bitacora_inicialmente_valido').value
    // Si tiene cambios (excepto en controles para crear actividad)
    // debe validarse y guardarse
    let cambios = Msip__Motor.calcularCambiosParaBitacora()
    return ( Object.keys(cambios).length > 0 || diffechas < 1000 ||
      inicialmente_valido != 'true');
  }
  cambiarficha(){
    if(event.target.dataset.enviarFichaCasoTarget == 'actos-pestana'){
      document.getElementById("capa-cargando").style.display = 'flex';
      if(this.requiereGuardar()){
        let casoId = this.idcasoTarget.value
        let puntoMontaje = window.puntoMontaje
        let url = puntoMontaje + 'casos/' + casoId + '/guardar_y_editar'
        let datosFormulario = new FormData(document.querySelector('form'));
        let objetoFormulario = Object.fromEntries(datosFormulario);
        for (let [key, value] of datosFormulario.entries()) {
          let coincidencia = key.match(/^caso\[(.+?)\]$/);
          if (coincidencia) {
            let ruta = coincidencia[1].split(/\]\[|\[|\]/).filter(p => p !== "");
            let actual = objetoFormulario;

            for (let i = 0; i < ruta.length; i++) {
              if (i === ruta.length - 1) {
                actual[ruta[i]] = value;
              } else {
                if (!actual[ruta[i]]) {
                  actual[ruta[i]] = (ruta[i + 1].match(/^\d+$/) ? [] : {});
                }
                actual = actual[ruta[i]];
              }
            }
          }
        }

        let datosCaso = { caso: objetoFormulario };
        fetch(url, {
          method: 'PATCH',
          headers: {
            'X-CSRF-Token': Rails.csrfToken(),
            'Content-Type': 'application/json'
          },
          body: JSON.stringify(datosCaso)
        }).then(response => {
          if (response.ok) {
            localStorage.setItem('pestanaActiva', 'actos-pestana');
            window.location = puntoMontaje + 'casos/' + casoId + '/edita';
          } else {
            document.getElementById("capa-cargando").style.display = 'none';
          }
        });

      }
      else{
        console.log("No requiere guardar caso")
        document.getElementById("capa-cargando").style.display = 'none';
      }
    }
    const campo_presponsables_acto = document.querySelector('#caso_acto_presponsable_id');
    const campo_presponsables_actocol = document.querySelector('#caso_actocolectivo_presponsable_id');
    const campo_victimas_acto = document.querySelector('#caso_acto_persona_id');
    const campo_victimascol_acto = document.querySelector('#caso_actocolectivo_grupoper_id');
    actualizarPresponsables(campo_presponsables_acto)
    actualizarPresponsables(campo_presponsables_actocol)
    actualizarVictimas(campo_victimas_acto)
    // Si funciona el otro enfoque ya no es necesario
    //actualizarGruposper(campo_victimascol_acto)

    function actualizarPresponsables(s) {
      if (s == null) {
        return
      }
      var sel = s.value;
      var cadena = '';
      var campo = document.querySelectorAll('#presponsables .control-group:not([style="display: none;"])');

      campo.forEach(function(v) {
        var id = v.querySelector('select[data-actualiza="presponsable"]').value;
        cadena += "<option value='" + id + "'";
        if (id === sel) {
          cadena += ' selected';
        }
        var tx = v.querySelector('select[data-actualiza="presponsable"] option[value="' + id + '"]').textContent;
        cadena += ">" + tx + "</option>";
      });

      s.innerHTML = cadena;
    }

    function actualizarVictimas(s) {
      var sel = s.value;
      var cadena = '';
      var sinid = 0;
      var marcosTurbo = document.querySelectorAll('#victimas_frame turbo-frame[id^="victima"]');
      marcosTurbo.forEach(function(frame) {
        var inputId = frame.querySelector('input[id^="caso_victima_attributes_"][id$="_persona_attributes_id"]');
        var id = inputId ? inputId.value : '';
        var inputNombre = frame.querySelector('input[id^="caso_victima_attributes_"][id$="_persona_attributes_nombres"]');
        var nom = inputNombre ? inputNombre.value : '';
        var inputApellido = frame.querySelector('input[id^="caso_victima_attributes_"][id$="_persona_attributes_apellidos"]');
        var ap = inputApellido ? inputApellido.value : '';
        cadena += "<option value='" + id + "'";
        var tx;
        if (nom === 'N' && ap === 'N') {
          sinid += 1;
          tx = "PERSONA SIN IDENTIFICAR " + sinid;
        } else {
          tx = (nom + " " + ap).trim();
        }
        cadena += ">" + tx + "</option>"; 
      });
      s.innerHTML = cadena;
    }

    function actualizarGruposper(s) {
      var sel = s.value;
      var cadena = '';
      var campo = document.querySelectorAll('#victimascolectivas .control-group[style!="display: none;"]');
      campo.each(function(k, v) {
        var id = $(v).find('div').filter(function() {
          return this.attributes.class.value.match(/caso_victimacolectiva[_0-9]*grupoper_id/);
        }).find('input').val();
        if (typeof id === 'undefined') {
          id = $(v).find('div').filter(function() {
            return this.attributes.class.value.match(/grupoper_id/);
          }).find('input').val();
        }
        cadena += "<option value='" + id + "'";
        if (id === sel) {
          cadena += ' selected';
        }
        var nom = $(v).find('div').filter(function() {
          return this.attributes.class.value.match(/caso_victimacolectiva[_0-9]*grupoper_nombre/);
        }).find('input').val();
        if (typeof nom === 'undefined') {
          nom = $(v).find('div').filter(function() {
            return this.attributes.class.value.match(/grupoper_nombre/);
          }).find('input').val();
        }
        var tx = nom.trim();
        cadena += ">" + tx + "</option>";
      });
      s.innerHTML = cadena;
    };
  }

}