Loading resources/views/adminGen/contactos/create.blade.php +32 −157 Original line number Diff line number Diff line <x-layout.default> <link rel='stylesheet' type='text/css' href='{{ Vite::asset("resources/css/nice-select2.css") }}'> <script src="/assets/js/file-upload-with-preview.iife.js"></script> <script src="/assets/js/alpine-mask.min.js"></script> <div x-data="crearUsuarios"> <ul class="flex space-x-2 rtl:space-x-reverse"> Loading @@ -18,8 +17,8 @@ <div class="flex items-center justify-between mb-5"> <h5 class="font-semibold text-lg dark:text-white-light">Crear nuevo usuario</h5> </div> <div class="mb-5" x-data="{activeTab: 1}"> <div class="mb-5"> <div class="mb-5" x-data="formHandler()"> <div class="inline-block w-full"> <div class="relative z-[1]"> <div class="bg-primary h-1 absolute ltr:left-0 rtl:right-0 top-[30px] m-auto -z-[1] transition-[width]" :class="{ Loading Loading @@ -115,12 +114,13 @@ </svg> </a> <span class="text-center block mt-2" :class="{'text-primary' : activeTab === 7}">Revisar y enviar</span> <span class="text-center block mt-2" :class="{'text-primary' : activeTab === 7}">Guardar contacto</span> </li> </ul> </div> <div> <form id="FormularioContacto" @submit.prevent="submitForm"> <form action="{{ route('contacto.store') }}" method="POST" enctype="multipart/form-data"> @csrf <div x-show="activeTab === 1"> <div class="grid grid-cols-1 md:grid-cols-1 gap-5"> <div> Loading Loading @@ -172,11 +172,13 @@ <span for="active" class="bg-[#ebedf2] dark:bg-dark block h-full rounded-full before:absolute before:left-1 before:bg-white dark:before:bg-white-dark dark:peer-checked:before:bg-white before:bottom-1 before:w-4 before:h-4 before:rounded-full peer-checked:before:left-7 peer-checked:bg-primary before:transition-all before:duration-300"></span> </label> </div> </div> <div class="grid grid-cols-1 md:grid-cols-2 gap-5"> <div class="mb-5"> <label for="conyuge_id">Conyuge</label> <select id="conyuge_id" name="conyuge_id" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> @foreach($conyuges as $conyuge) <option value="{{ $conyuge->id }}">{{ $conyuge->nombre }}</option> <option value="{{ $conyuge->id }}">{{ $conyuge->nombre . ' ' . $conyuge->ap_paterno . ' ' . $conyuge->ap_materno }}</option> @endforeach </select> </div> Loading @@ -196,6 +198,12 @@ @endforeach </select> </div> <div> <label for="cargo_desc">Descripción del cargo</label> <input id="cargo_desc" name="cargo_desc" type="text" placeholder="Ingresa la descripción del cargo" class="form-input" /> </div> </div> <div class="grid grid-cols-1 md:grid-cols-3 gap-5"> <div class="mb-5"> <label for="caracteristica_id">Caracteristicas</label> <select id="caracteristica_id" name="caracteristica_id" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> Loading @@ -215,8 +223,9 @@ <!-- TODO Intituciones pendientes --> </div> </div> <div class="custom-file-container" data-upload-id="myFirstImage"> <label class="custom-file-label">Subir foto de perfil</label> <div> <label for="foto_perfil">Foto de perfil</label> <input id="foto_perfil" name="foto_perfil" type="file" class="form-input file:py-2 file:px-4 file:border-0 file:font-semibold p-0 file:bg-primary/90 ltr:file:mr-5 rtl:file:ml-5 file:text-white file:hover:bg-primary" accept="image/*"/> </div> <br> </div> Loading Loading @@ -400,89 +409,16 @@ <button type="button" class="btn btn-primary" id="agregarBtnCorreo">Agregar</button> <br> </div> <div x-show="activeTab === 7"> <h3 class="text-lg font-semibold mb-4">Resumen del Formulario</h3> <div class="grid grid-cols-1 md:grid-cols-2 gap-5"> <!-- Datos Personales --> <div> <h4 class="font-semibold">Datos Personales</h4> <p><strong>Nombre:</strong> <span x-text="formData.get('nombre') || 'No proporcionado'"></span></p> <p><strong>Apellido paterno:</strong> <span x-text="formData.get('ap_paterno') || 'No proporcionado'"></span></p> <p><strong>Apellido materno:</strong> <span x-text="formData.get('ap_materno') || 'No proporcionado'"></span></p> <p><strong>Mes cumpleaños:</strong> <span x-text="formData.get('mes_cump') || 'No proporcionado'"></span></p> <p><strong>Día cumpleaños:</strong> <span x-text="formData.get('dia_cump') || 'No proporcionado'"></span></p> <p><strong>Finado:</strong> <span x-text="formData.get('finado') ? 'Sí' : 'No'"></span></p> <p><strong>Conyuge:</strong> <span x-text="formData.get('conyuge_id') || 'No proporcionado'"></span></p> <p><strong>Profesión:</strong> <span x-text="formData.get('profesion_id') || 'No proporcionado'"></span></p> <p><strong>Cargo:</strong> <span x-text="formData.get('cargo_id') || 'No proporcionado'"></span></p> <p><strong>Característica:</strong> <span x-text="formData.get('caracteristica_id') || 'No proporcionado'"></span></p> <p><strong>Subgrupo:</strong> <span x-text="formData.get('subgrupo_id') || 'No proporcionado'"></span></p> </div> <!-- Domicilio Oficial --> <div> <h4 class="font-semibold">Domicilio Oficial</h4> <p><strong>Domicilio oficial:</strong> <span x-text="formData.get('domicilio_oficial') || 'No proporcionado'"></span></p> <p><strong>Código postal oficial:</strong> <span x-text="formData.get('codigo_postal') || 'No proporcionado'"></span></p> <p><strong>Localidad oficial:</strong> <span x-text="formData.get('localidad_oficial') || 'No proporcionado'"></span></p> <p><strong>Municipio oficial:</strong> <span x-text="formData.get('municipio_oficial') || 'No proporcionado'"></span></p> <p><strong>Estado oficial:</strong> <span x-text="formData.get('estado') || 'No proporcionado'"></span></p> <p><strong>País oficial:</strong> <span x-text="formData.get('pais') || 'No proporcionado'"></span></p> </div> <!-- Domicilio Particular --> <div> <h4 class="font-semibold">Domicilio Particular</h4> <p><strong>Domicilio particular:</strong> <span x-text="formData.get('domicilio_par') || 'No proporcionado'"></span></p> <p><strong>Código postal particular:</strong> <span x-text="formData.get('codigo_postal_par') || 'No proporcionado'"></span></p> <p><strong>Localidad particular:</strong> <span x-text="formData.get('localidad_par') || 'No proporcionado'"></span></p> <p><strong>Municipio particular:</strong> <span x-text="formData.get('municipio_par') || 'No proporcionado'"></span></p> <p><strong>Estado particular:</strong> <span x-text="formData.get('estado_par') || 'No proporcionado'"></span></p> <p><strong>País particular:</strong> <span x-text="formData.get('pais_par') || 'No proporcionado'"></span></p> </div> <!-- Teléfonos --> <div> <h4 class="font-semibold">Teléfonos</h4> <template x-for="(telefono, index) in formData.get('telefonos', [])" :key="index"> <div class="mb-2"> <p><strong>Prefijo:</strong> <span x-text="telefono.prefijo || 'No proporcionado'"></span></p> <p><strong>Lada:</strong> <span x-text="telefono.lada || 'No proporcionado'"></span></p> <p><strong>Número:</strong> <span x-text="telefono.numero || 'No proporcionado'"></span></p> <p><strong>Tipo:</strong> <span x-text="telefono.tipo || 'No proporcionado'"></span></p> <p><strong>Estatus:</strong> <span x-text="telefono.estatus || 'No proporcionado'"></span></p> <p><strong>Ext:</strong> <span x-text="telefono.ext || 'No proporcionado'"></span></p> <p><strong>ID Radio:</strong> <span x-text="telefono.id_radio || 'No proporcionado'"></span></p> <p><strong>Observaciones:</strong> <span x-text="telefono.observaciones || 'No proporcionado'"></span></p> </div> </template> </div> <!-- Redes Sociales --> <div> <h4 class="font-semibold">Redes Sociales</h4> <template x-for="(red, index) in formData.get('redes_sociales', [])" :key="index"> <div class="mb-2"> <p><strong>URL:</strong> <span x-text="red.url || 'No proporcionado'"></span></p> <p><strong>Tipo:</strong> <span x-text="red.tipo || 'No proporcionado'"></span></p> </div> </template> </div> <!-- Correos Electrónicos --> <div> <h4 class="font-semibold">Correos Electrónicos</h4> <template x-for="(correo, index) in formData.get('correos', [])" :key="index"> <div class="mb-2"> <p><strong>Correo:</strong> <span x-text="correo.correo || 'No proporcionado'"></span></p> <p><strong>Tipo:</strong> <span x-text="correo.tipo || 'No proporcionado'"></span></p> <h3 class="text-lg font-semibold mb-4">Enviar formulario</h3> <div class="mt-4 p-4 border border-yellow-300 bg-yellow-100 text-yellow-700 rounded"> <p class="mb-2">Por favor, revise toda la información antes de enviar el formulario.</p> <p>Si encuentra algún error, puede regresar y editar la información antes de enviar.</p> </div> </template> </div> </div> <button type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">Enviar</button> <br> <button type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">Guardar contacto</button> </div> <br> </form> </div> <div class="flex justify-between"> Loading Loading @@ -538,44 +474,15 @@ input.placeholder = 'Buscar...'; }); const fileUploadInstance = new FileUploadWithPreview.FileUploadWithPreview('myFirstImage', { images: { baseImage: 'assets/images/file-preview.png', backgroundImage: '', }, text: { chooseFile: 'Subir foto de perfil', browse: 'Seleccionar', clear: 'Eliminar', }, }); document.addEventListener('change', function(event) { const fileInput = document.querySelector('#file-upload-with-preview-myFirstImage'); if (event.target === fileInput) { const files = fileUploadInstance.cachedFileArray; document.getElementById('foto_perfil').addEventListener('change', function() { const file = this.files[0]; const fileType = file.type.split('/')[0]; // Obtiene el tipo de archivo ('image', 'video', etc.) if (files.length > 0) { const file = files[0]; if (file && !file.type.startsWith('image/')) { showToast("Solo se permiten archivos de imagen.", "Error", "error") fileUploadInstance.options.images.baseImage = ''; fileUploadInstance.resetPreviewPanel(); fileInput.value = ''; fileUploadInstance.cachedFileArray = []; } } if (fileType !== 'image') { showToast('Por favor selecciona un archivo de imagen válido.', 'Error', 'error'); this.value = ''; // Limpiar el valor del input para deseleccionar el archivo no válido } }); setTimeout(function() { const fileInput = document.querySelector('#file-upload-with-preview-myFirstImage'); if (fileInput) { fileInput.setAttribute('accept', 'image/*'); } }, 500); }); const agregarBtnTel = document.getElementById('agregarBtnTel'); Loading Loading @@ -655,8 +562,8 @@ newFormGroup.classList.add('grid', 'grid-cols-1', 'md:grid-cols-3', 'gap-5', 'form-group', 'relative'); newFormGroup.innerHTML = ` <div> <label for="id_radio">URL del la red social o página web</label> <input id="id_radio" name="id_radio[]" type="text" class="form-input" /> <label for="red_social">URL del la red social o página web</label> <input id="red_social" name="red_social[]" type="text" class="form-input" /> </div> <div class="mb-5"> <label for="tipo_red_social">Tipo</label> Loading Loading @@ -797,37 +704,5 @@ function showToast(message, heading, icon) { @endforeach @endif }); const contactForm = document.getElementById("FormularioContacto"); let formData = new FormData(contactForm); function formHandler() { return { activeTab: 1, formData: formData, submitForm() { // Guardar datos del formulario en formData this.formData = { name: document.querySelector('#name').value, ap_paterno: document.querySelector('#ap_paterno').value, // Otros campos aquí }; // Cambiar a la pestaña de vista previa this.activeTab = 7; }, logFormData() { formData = new FormData(contactForm); const object = Object.fromEntries(formData); const json = JSON.stringify(object); const telefonosContainer = document.getElementById('dynamicFormContainerTel'); const telefonos = telefonosContainer.querySelectorAll('.grid.grid-cols-1.md\\:grid-cols-9.gap-5.form-group.relative.mb-2'); telefonos.forEach((telefono) => { console.log( telefono.querySelector('input[name="prefijo[]"]').value); }); this.formData = formData; } }; } </script> </x-layout.default> No newline at end of file Loading
resources/views/adminGen/contactos/create.blade.php +32 −157 Original line number Diff line number Diff line <x-layout.default> <link rel='stylesheet' type='text/css' href='{{ Vite::asset("resources/css/nice-select2.css") }}'> <script src="/assets/js/file-upload-with-preview.iife.js"></script> <script src="/assets/js/alpine-mask.min.js"></script> <div x-data="crearUsuarios"> <ul class="flex space-x-2 rtl:space-x-reverse"> Loading @@ -18,8 +17,8 @@ <div class="flex items-center justify-between mb-5"> <h5 class="font-semibold text-lg dark:text-white-light">Crear nuevo usuario</h5> </div> <div class="mb-5" x-data="{activeTab: 1}"> <div class="mb-5"> <div class="mb-5" x-data="formHandler()"> <div class="inline-block w-full"> <div class="relative z-[1]"> <div class="bg-primary h-1 absolute ltr:left-0 rtl:right-0 top-[30px] m-auto -z-[1] transition-[width]" :class="{ Loading Loading @@ -115,12 +114,13 @@ </svg> </a> <span class="text-center block mt-2" :class="{'text-primary' : activeTab === 7}">Revisar y enviar</span> <span class="text-center block mt-2" :class="{'text-primary' : activeTab === 7}">Guardar contacto</span> </li> </ul> </div> <div> <form id="FormularioContacto" @submit.prevent="submitForm"> <form action="{{ route('contacto.store') }}" method="POST" enctype="multipart/form-data"> @csrf <div x-show="activeTab === 1"> <div class="grid grid-cols-1 md:grid-cols-1 gap-5"> <div> Loading Loading @@ -172,11 +172,13 @@ <span for="active" class="bg-[#ebedf2] dark:bg-dark block h-full rounded-full before:absolute before:left-1 before:bg-white dark:before:bg-white-dark dark:peer-checked:before:bg-white before:bottom-1 before:w-4 before:h-4 before:rounded-full peer-checked:before:left-7 peer-checked:bg-primary before:transition-all before:duration-300"></span> </label> </div> </div> <div class="grid grid-cols-1 md:grid-cols-2 gap-5"> <div class="mb-5"> <label for="conyuge_id">Conyuge</label> <select id="conyuge_id" name="conyuge_id" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> @foreach($conyuges as $conyuge) <option value="{{ $conyuge->id }}">{{ $conyuge->nombre }}</option> <option value="{{ $conyuge->id }}">{{ $conyuge->nombre . ' ' . $conyuge->ap_paterno . ' ' . $conyuge->ap_materno }}</option> @endforeach </select> </div> Loading @@ -196,6 +198,12 @@ @endforeach </select> </div> <div> <label for="cargo_desc">Descripción del cargo</label> <input id="cargo_desc" name="cargo_desc" type="text" placeholder="Ingresa la descripción del cargo" class="form-input" /> </div> </div> <div class="grid grid-cols-1 md:grid-cols-3 gap-5"> <div class="mb-5"> <label for="caracteristica_id">Caracteristicas</label> <select id="caracteristica_id" name="caracteristica_id" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> Loading @@ -215,8 +223,9 @@ <!-- TODO Intituciones pendientes --> </div> </div> <div class="custom-file-container" data-upload-id="myFirstImage"> <label class="custom-file-label">Subir foto de perfil</label> <div> <label for="foto_perfil">Foto de perfil</label> <input id="foto_perfil" name="foto_perfil" type="file" class="form-input file:py-2 file:px-4 file:border-0 file:font-semibold p-0 file:bg-primary/90 ltr:file:mr-5 rtl:file:ml-5 file:text-white file:hover:bg-primary" accept="image/*"/> </div> <br> </div> Loading Loading @@ -400,89 +409,16 @@ <button type="button" class="btn btn-primary" id="agregarBtnCorreo">Agregar</button> <br> </div> <div x-show="activeTab === 7"> <h3 class="text-lg font-semibold mb-4">Resumen del Formulario</h3> <div class="grid grid-cols-1 md:grid-cols-2 gap-5"> <!-- Datos Personales --> <div> <h4 class="font-semibold">Datos Personales</h4> <p><strong>Nombre:</strong> <span x-text="formData.get('nombre') || 'No proporcionado'"></span></p> <p><strong>Apellido paterno:</strong> <span x-text="formData.get('ap_paterno') || 'No proporcionado'"></span></p> <p><strong>Apellido materno:</strong> <span x-text="formData.get('ap_materno') || 'No proporcionado'"></span></p> <p><strong>Mes cumpleaños:</strong> <span x-text="formData.get('mes_cump') || 'No proporcionado'"></span></p> <p><strong>Día cumpleaños:</strong> <span x-text="formData.get('dia_cump') || 'No proporcionado'"></span></p> <p><strong>Finado:</strong> <span x-text="formData.get('finado') ? 'Sí' : 'No'"></span></p> <p><strong>Conyuge:</strong> <span x-text="formData.get('conyuge_id') || 'No proporcionado'"></span></p> <p><strong>Profesión:</strong> <span x-text="formData.get('profesion_id') || 'No proporcionado'"></span></p> <p><strong>Cargo:</strong> <span x-text="formData.get('cargo_id') || 'No proporcionado'"></span></p> <p><strong>Característica:</strong> <span x-text="formData.get('caracteristica_id') || 'No proporcionado'"></span></p> <p><strong>Subgrupo:</strong> <span x-text="formData.get('subgrupo_id') || 'No proporcionado'"></span></p> </div> <!-- Domicilio Oficial --> <div> <h4 class="font-semibold">Domicilio Oficial</h4> <p><strong>Domicilio oficial:</strong> <span x-text="formData.get('domicilio_oficial') || 'No proporcionado'"></span></p> <p><strong>Código postal oficial:</strong> <span x-text="formData.get('codigo_postal') || 'No proporcionado'"></span></p> <p><strong>Localidad oficial:</strong> <span x-text="formData.get('localidad_oficial') || 'No proporcionado'"></span></p> <p><strong>Municipio oficial:</strong> <span x-text="formData.get('municipio_oficial') || 'No proporcionado'"></span></p> <p><strong>Estado oficial:</strong> <span x-text="formData.get('estado') || 'No proporcionado'"></span></p> <p><strong>País oficial:</strong> <span x-text="formData.get('pais') || 'No proporcionado'"></span></p> </div> <!-- Domicilio Particular --> <div> <h4 class="font-semibold">Domicilio Particular</h4> <p><strong>Domicilio particular:</strong> <span x-text="formData.get('domicilio_par') || 'No proporcionado'"></span></p> <p><strong>Código postal particular:</strong> <span x-text="formData.get('codigo_postal_par') || 'No proporcionado'"></span></p> <p><strong>Localidad particular:</strong> <span x-text="formData.get('localidad_par') || 'No proporcionado'"></span></p> <p><strong>Municipio particular:</strong> <span x-text="formData.get('municipio_par') || 'No proporcionado'"></span></p> <p><strong>Estado particular:</strong> <span x-text="formData.get('estado_par') || 'No proporcionado'"></span></p> <p><strong>País particular:</strong> <span x-text="formData.get('pais_par') || 'No proporcionado'"></span></p> </div> <!-- Teléfonos --> <div> <h4 class="font-semibold">Teléfonos</h4> <template x-for="(telefono, index) in formData.get('telefonos', [])" :key="index"> <div class="mb-2"> <p><strong>Prefijo:</strong> <span x-text="telefono.prefijo || 'No proporcionado'"></span></p> <p><strong>Lada:</strong> <span x-text="telefono.lada || 'No proporcionado'"></span></p> <p><strong>Número:</strong> <span x-text="telefono.numero || 'No proporcionado'"></span></p> <p><strong>Tipo:</strong> <span x-text="telefono.tipo || 'No proporcionado'"></span></p> <p><strong>Estatus:</strong> <span x-text="telefono.estatus || 'No proporcionado'"></span></p> <p><strong>Ext:</strong> <span x-text="telefono.ext || 'No proporcionado'"></span></p> <p><strong>ID Radio:</strong> <span x-text="telefono.id_radio || 'No proporcionado'"></span></p> <p><strong>Observaciones:</strong> <span x-text="telefono.observaciones || 'No proporcionado'"></span></p> </div> </template> </div> <!-- Redes Sociales --> <div> <h4 class="font-semibold">Redes Sociales</h4> <template x-for="(red, index) in formData.get('redes_sociales', [])" :key="index"> <div class="mb-2"> <p><strong>URL:</strong> <span x-text="red.url || 'No proporcionado'"></span></p> <p><strong>Tipo:</strong> <span x-text="red.tipo || 'No proporcionado'"></span></p> </div> </template> </div> <!-- Correos Electrónicos --> <div> <h4 class="font-semibold">Correos Electrónicos</h4> <template x-for="(correo, index) in formData.get('correos', [])" :key="index"> <div class="mb-2"> <p><strong>Correo:</strong> <span x-text="correo.correo || 'No proporcionado'"></span></p> <p><strong>Tipo:</strong> <span x-text="correo.tipo || 'No proporcionado'"></span></p> <h3 class="text-lg font-semibold mb-4">Enviar formulario</h3> <div class="mt-4 p-4 border border-yellow-300 bg-yellow-100 text-yellow-700 rounded"> <p class="mb-2">Por favor, revise toda la información antes de enviar el formulario.</p> <p>Si encuentra algún error, puede regresar y editar la información antes de enviar.</p> </div> </template> </div> </div> <button type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">Enviar</button> <br> <button type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">Guardar contacto</button> </div> <br> </form> </div> <div class="flex justify-between"> Loading Loading @@ -538,44 +474,15 @@ input.placeholder = 'Buscar...'; }); const fileUploadInstance = new FileUploadWithPreview.FileUploadWithPreview('myFirstImage', { images: { baseImage: 'assets/images/file-preview.png', backgroundImage: '', }, text: { chooseFile: 'Subir foto de perfil', browse: 'Seleccionar', clear: 'Eliminar', }, }); document.addEventListener('change', function(event) { const fileInput = document.querySelector('#file-upload-with-preview-myFirstImage'); if (event.target === fileInput) { const files = fileUploadInstance.cachedFileArray; document.getElementById('foto_perfil').addEventListener('change', function() { const file = this.files[0]; const fileType = file.type.split('/')[0]; // Obtiene el tipo de archivo ('image', 'video', etc.) if (files.length > 0) { const file = files[0]; if (file && !file.type.startsWith('image/')) { showToast("Solo se permiten archivos de imagen.", "Error", "error") fileUploadInstance.options.images.baseImage = ''; fileUploadInstance.resetPreviewPanel(); fileInput.value = ''; fileUploadInstance.cachedFileArray = []; } } if (fileType !== 'image') { showToast('Por favor selecciona un archivo de imagen válido.', 'Error', 'error'); this.value = ''; // Limpiar el valor del input para deseleccionar el archivo no válido } }); setTimeout(function() { const fileInput = document.querySelector('#file-upload-with-preview-myFirstImage'); if (fileInput) { fileInput.setAttribute('accept', 'image/*'); } }, 500); }); const agregarBtnTel = document.getElementById('agregarBtnTel'); Loading Loading @@ -655,8 +562,8 @@ newFormGroup.classList.add('grid', 'grid-cols-1', 'md:grid-cols-3', 'gap-5', 'form-group', 'relative'); newFormGroup.innerHTML = ` <div> <label for="id_radio">URL del la red social o página web</label> <input id="id_radio" name="id_radio[]" type="text" class="form-input" /> <label for="red_social">URL del la red social o página web</label> <input id="red_social" name="red_social[]" type="text" class="form-input" /> </div> <div class="mb-5"> <label for="tipo_red_social">Tipo</label> Loading Loading @@ -797,37 +704,5 @@ function showToast(message, heading, icon) { @endforeach @endif }); const contactForm = document.getElementById("FormularioContacto"); let formData = new FormData(contactForm); function formHandler() { return { activeTab: 1, formData: formData, submitForm() { // Guardar datos del formulario en formData this.formData = { name: document.querySelector('#name').value, ap_paterno: document.querySelector('#ap_paterno').value, // Otros campos aquí }; // Cambiar a la pestaña de vista previa this.activeTab = 7; }, logFormData() { formData = new FormData(contactForm); const object = Object.fromEntries(formData); const json = JSON.stringify(object); const telefonosContainer = document.getElementById('dynamicFormContainerTel'); const telefonos = telefonosContainer.querySelectorAll('.grid.grid-cols-1.md\\:grid-cols-9.gap-5.form-group.relative.mb-2'); telefonos.forEach((telefono) => { console.log( telefono.querySelector('input[name="prefijo[]"]').value); }); this.formData = formData; } }; } </script> </x-layout.default> No newline at end of file