EVOLUTION-MANAGER
Edit File: crear-lotaip.js
var contenedor_archivoslotaip = []; var pertenece = ""; var orden_pertenece = ""; const datos = window.appData.mesanio; var sorts = []; function agregar_mes(select) { var mes = select.value; var meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"] if (meses.includes(mes)) document.getElementById("mes").value = mes; mesanio_seleccionados(); } function agregar_anio(select) { var anio = select.value; var anio_actual = obtenerAno(); if (anio >= 2000 && anio <= anio_actual) document.getElementById("anio").value = anio; mesanio_seleccionados(); } function obtenerAno() { var d = new Date(); var n = d.getFullYear(); return n; } function comprobar(a, m) { for (x of datos) { if (a == x.anios && m == x.mes) { return true; } } return false; } new Sortable(documentos_cargados, { handle: '.mostrar-archivos', animation: 150, ghostClass: 'background-class', store: { set: function (sortable) { // Obtener el nuevo orden de los IDs de los elementos sorts = sortable.toArray(); // Actualizar el contador en contenedor_archivoslotaip según el nuevo orden sorts.forEach((filename, index) => { // Buscar el archivo en contenedor_archivoslotaip y actualizar su contador for (let i = 0; i < contenedor_archivoslotaip.length; i++) { if (contenedor_archivoslotaip[i][0].name === filename) { contenedor_archivoslotaip[i][2] = index // Actualizar el contador basado en el nuevo orden (index + 1 para empezar desde 1) break; // Salir del bucle una vez que se encuentra y se actualiza el archivo } } }); } } }); function mesanio_seleccionados() { const anio = document.getElementById("anio").value; const anios = document.getElementById("anio"); const mes = document.getElementById("mes").value; const mess = document.getElementById("mes"); if (anio != "" && mes != "") { if (comprobar(anio, mes)) { Swal.fire({ icon: "error", title: "Oops...", text: "Ya existe una lotaip con ese año y mes!" }); if (!anios.classList.contains("errors") || !mess.classList.contains("errors")) { anios.classList.add("errors"); mess.classList.add("errors"); } } else { if (anios.classList.contains("errors") || mess.classList.contains("errors")) { anios.classList.remove("errors") mess.classList.remove("errors"); } } } } //resetear inputs const anio = document.getElementById('anio'); const mes = document.getElementById('mes'); anio.addEventListener('input', function () { anio.value = ""; }); mes.addEventListener('input', function () { mes.value = ""; }); //Generar literales const generador = document.getElementById("generar_literales"); generador.addEventListener("click", () => { const lotaip = document.getElementById("lotaip"); if (lotaip.value == "2023") { llenar_option(); } else { Swal.fire({ icon: "error", title: "Oops...", text: "Debe seleccionar la lotaip vigente" }); } }); function llenar_option() { const lotaip_vigente = window.appData.lotaipvigente; var agregar_literal = document.getElementById("contenedor-literales"); if (agregar_literal.hasChildNodes()) { mensaje_de_alerta("warning", "Ya existen literales generados", "2500"); } else { agregar_literal.innerHTML = ""; var literal = ""; for (var x = 0; x < lotaip_vigente.length; x++) { literal = `<div class="literal-opc" id="` + lotaip_vigente[x]["orden"] + `"> <p style="text-align: justify;">`+ lotaip_vigente[x]["titulo"] + `</p> <div class="botto-modal-open modificador-open" onclick="mostrar_ventana('`+ lotaip_vigente[x]["titulo"] + `', '` + lotaip_vigente[x]["orden"] + `');">Subir archivos</div> <h5 class="archivos-cargados" id="cargados-`+ lotaip_vigente[x]["orden"] + `">0/4</h5> </div>`; agregar_literal.innerHTML += literal; } } } //ventana flotante function mostrar_ventana(titulo, orden) { pertenece = titulo; orden_pertenece = orden; // Filtrar y ordenar los archivos que pertenecen a la orden especificada const archivosOrdenados = contenedor_archivoslotaip .filter(fileEntry => fileEntry[1] === orden) .sort((a, b) => a[2] - b[2]); // Ordenar por el contador (posición [2]) // Mostrar los archivos ordenados archivosOrdenados.forEach(fileEntry => { const filename = fileEntry[0].name; const filetype = getFileType(filename); fileshow(filename, filetype, orden_pertenece); // Mostrar el archivo en la ventana }); document.getElementById("vista-actual").innerHTML = titulo; const modal = document.getElementById("ventana-mod-1"); modal.classList.add("show"); } function cerrar_ventana() { document.getElementById("cargar").value = ""; document.getElementById("documentos_cargados").innerHTML = `<h3 class="subidos-exito">Documentos subidos</h3>`; var modal = document.getElementById("ventana-mod-1"); modal.classList.remove("show"); } // var documentos = []; const input = document.getElementById("cargar"); const show_archivos = document.getElementById("documentos_cargados"); const progressBar = document.getElementById('progressBar'); // Función para generar un nombre único para el archivo function generateUniqueFilename(filename) { const timestamp = Date.now(); // Obtiene el tiempo actual en milisegundos const fileExtension = filename.split('.').pop(); const baseName = filename.replace(`.${fileExtension}`, ''); return `${baseName}_${timestamp}.${fileExtension}`; } // Función para leer y manejar el archivo function handleFileRead(file, orden_pertenece) { const reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onprogress = (e) => updateProgressBar(e); reader.onload = (e) => { resetProgressBar(); fileshow(file.name, getFileType(file.name), orden_pertenece); }; reader.onerror = () => { resetProgressBar(); mensaje_de_alerta("error", "Error al cargar el archivo", "3000"); }; } // Función para actualizar la barra de progreso function updateProgressBar(e) { const porcentaje = Math.round((e.loaded / e.total) * 100); progressBar.style.width = porcentaje + '%'; progressBar.innerHTML = porcentaje + "%"; } // Función para restablecer la barra de progreso function resetProgressBar() { progressBar.classList.remove('progressBarshow'); progressBar.style.width = '0%'; } // Función para obtener la extensión del archivo function getFileType(filename) { return filename.split('.').pop(); } //Resetear el el input function resetInput() { input.value = ""; } // Función para verificar y manejar el archivo function handleFileUpload(e) { if (!e.target.files[0]) { input.value = ""; return; } const file = e.target.files[0]; const originalFilename = file.name; const filetype = getFileType(originalFilename); const uniqueFilename = generateUniqueFilename(originalFilename); let lp = contenedor_archivoslotaip.filter(file => file[1] === orden_pertenece).length; if (lp >= 4) { input.value = ""; mensaje_de_alerta("error", "Solo puede subir cuatro archivos", "3000"); return; } let contador = lp + 1; const uniqueFile = new File([file], uniqueFilename, { type: file.type }); contenedor_archivoslotaip.push([uniqueFile, orden_pertenece, contador]); progressBar.classList.add('progressBarshow'); handleFileRead(uniqueFile, orden_pertenece); resetInput(); } // Event Listener para el input de archivos input.addEventListener("change", handleFileUpload); const fileshow = (filename, filetype, orden_pertenece) => { const show = document.createElement("div"); show.classList.add("mostrar-archivos"); show.setAttribute('data-id', filename); show.id = filename; const left = document.createElement("div"); left.classList.add("left"); const span = document.createElement("span"); span.classList.add("tipo-archivo"); span.innerHTML = filetype; left.append(span); const titulo = document.createElement("h3"); titulo.innerHTML = filename; left.append(titulo); show.append(left); const right = document.createElement("div"); right.setAttribute('onclick', 'borrar_archivo("' + filename + '", "' + orden_pertenece + '")'); right.classList.add("right"); show.append(right); const equis = document.createElement("span"); equis.innerHTML = "×"; right.append(equis); show_archivos.append(show); controlar_orden(filename, orden_pertenece); } function borrar_archivo(nombre, pertenece_a) { var contador = 0; var numeracion = 0; // Itera sobre el array en orden inverso for (var x = contenedor_archivoslotaip.length - 1; x >= 0; x--) { if (contenedor_archivoslotaip[x][1] == pertenece_a) { contador++; } // Verifica y elimina el archivo correspondiente if (contenedor_archivoslotaip[x][0].name == nombre && contenedor_archivoslotaip[x][1] == pertenece_a) { contenedor_archivoslotaip.splice(x, 1); contador--; // Disminuye el contador ya que eliminaste un archivo } } // Actualiza la numeración de orden numeracion = 1; for (var x = 0; x < contenedor_archivoslotaip.length; x++) { if (contenedor_archivoslotaip[x][1] == pertenece_a) { contenedor_archivoslotaip[x][2] = numeracion; numeracion++; } } // Elimina el elemento visual correspondiente document.getElementById(nombre).remove(); // Actualiza el contador de documentos var cant_documentos = document.getElementById("cargados-" + pertenece_a); // Si se ha eliminado un archivo y no hay 4 archivos, elimina la clase "completado" if (contador < 4) { cant_documentos.classList.remove("completado"); } cant_documentos.innerHTML = contador + "/4"; } function controlar_orden(id, valor) { var cantidad = 0; if (contenedor_archivoslotaip.length > 0) { for (var x = 0; x < contenedor_archivoslotaip.length; x++) { if (contenedor_archivoslotaip[x][1] == valor) cantidad++; } } var cant_documentos = document.getElementById("cargados-" + valor); if (cantidad == 4) cant_documentos.classList.add("completado"); else cant_documentos.classList.remove("completado"); cant_documentos.innerHTML = cantidad + "/4"; } function mensaje_de_alerta(icon, title, timer) { Swal.fire({ position: "top-end", icon: icon, title: title, showConfirmButton: false, timer: timer }); } document.getElementById("crear-lotaip").addEventListener("submit", (event) => { event.preventDefault(); var anio = document.getElementById("anio").value; var mes = document.getElementById("mes").value; var lotaip_vigente = document.getElementById("lotaip").value; var archivos_lotaip = contenedor_archivoslotaip.length; if (anio != "" && mes != "" && lotaip_vigente != "") { const loadingModal = document.getElementById('loadingModal'); loadingModal.style.display = 'block'; $.ajaxSetup({ headers: { "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content') } }); if (contenedor_archivoslotaip.length > 0 || contenedor_archivoslotaip.length === 0) { if (contenedor_archivoslotaip.length % 4 === 0) { var formData = new FormData(); formData.append('anio', anio); formData.append('mes', mes); formData.append('lotapvigente', lotaip_vigente); for (var x = 0; x < contenedor_archivoslotaip.length; x++) { formData.append('documentos[]', contenedor_archivoslotaip[x][0]); formData.append('idlotaipvigente[]', contenedor_archivoslotaip[x][1]); formData.append('orden[]', contenedor_archivoslotaip[x][2]); } $.ajax({ url: "/administrador/crud-lotaip/crear-lotaip", method: "POST", enctype: "multipart/form-data", data: formData, processData: false, contentType: false, success: function (response) { if (response.success) { loadingModal.style.display = 'none'; datos.push({ 'anios': anio, 'mes': mes }); document.getElementById("anio").value = ""; document.getElementById("mes").value = ""; document.getElementById("lotaip").selectedIndex = 0; document.getElementById("sel1").selectedIndex = 0; document.getElementById("meses").selectedIndex = 0; contenedor_archivoslotaip = []; pertenece = ""; orden_pertenece = ""; document.getElementById("contenedor-literales").innerHTML = ""; mensaje_de_alerta("success", response.message, "3000"); } else { loadingModal.style.display = 'none'; if (response.error_validacion) { let mensajes = ''; for (const campo in response.error_validacion) { if (response.error_validacion.hasOwnProperty(campo)) { mensajes += response.error_validacion[campo].join(', ') + ' '; } } mensaje_de_alerta("error", mensajes.trim(), "10000"); } if (response.error) { mensaje_de_alerta("error", response.error, "10000"); } } }, error: function (xhr) { loadingModal.style.display = 'none'; var message = JSON.parse(xhr.responseText); mensaje_de_alerta("error", message.message, "10000"); } }); } else { loadingModal.style.display = 'none'; mensaje_de_alerta("error", "Si sube archivos de uno o varios literales debo completarlos 4/4", "10000"); } } } });