diff --git a/cosiap_frontend/src/api.js b/cosiap_frontend/src/api.js index 603a0e0ceb0b0ce0482088cb59b671452ddf7916..63b9f2eed48b7e8fdaf7c0bf04b83deffafc5f04 100644 --- a/cosiap_frontend/src/api.js +++ b/cosiap_frontend/src/api.js @@ -162,7 +162,8 @@ const api = { }, }, formatos: { - get: () => ax.get('api/plantillas') + get: () => ax.get('api/plantillas'), + getById: (id) => ax.get(`api/plantillas/download/${id}`,{ responseType: 'blob' }) } }; diff --git a/cosiap_frontend/src/components/common/utility/RenderElemento.jsx b/cosiap_frontend/src/components/common/utility/RenderElemento.jsx index 62ef2d121f95059abd9db2b3c1acbd5cd059d175..e6b4abeae40cf6e2c054f50c5211c76b9094851a 100644 --- a/cosiap_frontend/src/components/common/utility/RenderElemento.jsx +++ b/cosiap_frontend/src/components/common/utility/RenderElemento.jsx @@ -1,7 +1,8 @@ import '@/components/modalidades/Modalidad.css' +import api from "@/api"; export const renderElemento = (seccionId, elemento, handleInputChange, handleCheckboxChange) => { - const { tipo, opciones, id, nombre } = elemento; + const { tipo, opciones, id, nombre, formato } = elemento; const handleChange = (e) => { const valor = e.target.value; @@ -9,6 +10,48 @@ export const renderElemento = (seccionId, elemento, handleInputChange, handleChe handleInputChange(seccionId, id, valor); }; + const handleDownload = async (elemento, formato) => { + try { + // Realiza la petición al backend para obtener el archivo + const response = await api.formatos.getById(formato, { + responseType: 'blob', // Esto asegura que obtengas los datos como un archivo binario + }); + + // Verifica si el tipo de contenido es correcto + const contentType = response.headers['content-type']; + console.log('Content Type:', contentType); // Para depuración + + if (contentType !== 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') { + throw new Error('Tipo de archivo inesperado'); + } + + // Crea un Blob a partir de los datos recibidos + const blob = new Blob([response.data], { type: contentType }); + + // Crea un URL para el archivo descargado + const url = window.URL.createObjectURL(blob); + + // Crea un enlace temporal + const link = document.createElement('a'); + link.href = url; + link.setAttribute('download', `${elemento.nombre}_formato.docx`); // Cambia a .docx + + // Añadir el enlace al cuerpo del documento para que sea visible en el navegador + document.body.appendChild(link); + + // En lugar de hacer clic en el enlace, solo configuramos el enlace + link.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window })); + + // Dejar el enlace en el DOM para que sea visible + // document.body.removeChild(link); // No eliminar el enlace si deseas que la descarga sea visible + + // Revoca el URL del blob para liberar memoria + window.URL.revokeObjectURL(url); + } catch (error) { + console.error('Error al descargar el formato:', error); + } + }; + switch (tipo) { case "texto_corto": @@ -74,18 +117,26 @@ export const renderElemento = (seccionId, elemento, handleInputChange, handleChe ))} ); - case "documento": + case "documento": return ( - handleInputChange(seccionId, id, e.target.files[0])} - /> +