{"id":16421,"date":"2025-10-21T07:03:47","date_gmt":"2025-10-21T11:03:47","guid":{"rendered":"https:\/\/aginova.ufms.br\/?page_id=16421"},"modified":"2025-10-21T08:52:53","modified_gmt":"2025-10-21T12:52:53","slug":"elementor-16421","status":"publish","type":"page","link":"https:\/\/aginova.ufms.br\/en\/elementor-16421\/","title":{"rendered":"TESTE &#8211; pedido registro software"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"16421\" class=\"elementor elementor-16421\">\n\t\t\t\t<div class=\"elementor-element elementor-element-47a8a91 e-flex e-con-boxed e-con e-parent\" data-id=\"47a8a91\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c2b99f4 elementor-widget elementor-widget-html\" data-id=\"c2b99f4\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- Montserrat Font -->\r\n\r\n\r\n\r\n\r\n\r\n\r\n    #registration-form {\r\n        font-family: 'Montserrat', Verdana, sans-serif;\r\n        background-color: #ffffff;\r\n        padding: 30px;\r\n        max-width: 100%;\r\n        margin: 0 auto;\r\n        color: black;\r\n    }\r\n\r\n    #registration-form label {\r\n        display: block;\r\n        margin-top: 10px;\r\n        margin-bottom: 4px;\r\n        font-weight: 600;\r\n        font-size: 0.95rem;\r\n    }\r\n\r\n    #registration-form input {\r\n        width: 100%;\r\n        padding: 8px;\r\n        border: 1px solid #cce0ff;\r\n        border-radius: 4px;\r\n        background: #f9fbff;\r\n        transition: border 0.3s ease;\r\n        font-family: inherit;\r\n    }\r\n\r\n    #registration-form input:focus {\r\n        border-color: #0066cc;\r\n        background-color: #ffffff;\r\n        outline: none;\r\n    }\r\n\r\n    .participant-group {\r\n        background-color: #f2f7ff;\r\n        padding: 15px;\r\n        border-radius: 6px;\r\n        border-left: 4px solid #0066cc;\r\n        margin-bottom: 20px;\r\n    }\r\n\r\n\r\n    #participant-count {\r\n        max-width: 80px;\r\n    }\r\n\r\n    .participant-grid {\r\n        display: grid;\r\n        grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\r\n        gap: 20px;\r\n        margin-top: 30px;\r\n    }\r\n\r\n    #registration-form button[type=\"submit\"] {\r\n        background-color: #004c99;\r\n        color: white;\r\n        font-weight: 600;\r\n        padding: 12px 25px;\r\n        font-size: 1rem;\r\n        border: none;\r\n        border-radius: 6px;\r\n        cursor: pointer;\r\n        margin-top: 20px;\r\n        transition: background-color 0.3s ease;\r\n    }\r\n\r\n    #registration-form button[type=\"submit\"]:hover {\r\n        background-color: #0066cc;\r\n    }\r\n\r\n    @media (max-width: 600px) {\r\n        #registration-form button[type=\"submit\"] {\r\n            width: 100%;\r\n        }\r\n    }\r\n\r\n\r\n\r\n    <label for=\"participant-count\">Quantidade de Autores:<\/label>\r\n    \r\n\r\n    <div id=\"participants-container\" class=\"participant-grid\"><\/div>\r\n\r\n    <button type=\"submit\">Enviar Registro<\/button>\r\n\r\n\r\n\r\n    const fieldValidationRules = {\r\n        name: { label: \"Nome\", pattern: \/^[a-zA-Z\u00c0-\u00ff\\s'-]{2,60}$\/, required: true },\r\n        email: { label: \"Email\", pattern: \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/, required: true },\r\n        phone: { label: \"Telefone\", pattern: \/^(?:(?:\\+55)?\\s?)?(?:\\(?[1-9][0-9]\\)?\\s?)?(?:9\\d{4}|[2-9]\\d{3})\\-?\\d{4}$\/, required: true },\r\n        cep: { label: \"CEP\", pattern: \/^[0-9]{8}$\/, required: true },\r\n        street: { label: \"Rua\", pattern: \/^.{3,100}$\/, required: true },\r\n        number: { label: \"N\u00famero\", pattern: \/^\\d{1,6}$\/, required: true },\r\n        complement: { label: \"Complemento\", pattern: \/^.{0,100}$\/, required: false },\r\n        neighbourhood: { label: \"Bairro\", pattern: \/^.{2,100}$\/, required: true },\r\n        city: { label: \"Cidade\", pattern: \/^[a-zA-Z\u00c0-\u00ff\\s'-]{2,100}$\/, required: true },\r\n        state: { label: \"Estado (UF)\", pattern: \/^[A-Z]{2}$\/, required: true },\r\n        institution: { label: \"Institui\u00e7\u00e3o\", pattern: \/^.{2,100}$\/, required: true },\r\n        course: { label: \"Curso\/Programa\", pattern: \/^.{2,100}$\/, required: true },\r\n        percentage: { label: \"Percentual\", pattern: \/^(100|[1-9]?[0-9])$\/, required: true }\r\n    };\r\n\r\n    const participantsContainer = document.getElementById('participants-container');\r\n    const countInput = document.getElementById('participant-count');\r\n\r\n    countInput.addEventListener('input', () =&gt; {\r\n        const count = parseInt(countInput.value);\r\n        participantsContainer.innerHTML = '';\r\n        if (isNaN(count) || count &lt; 1) return;\r\n\r\n        for (let i = 1; i &lt;= count; i++) {\r\n            const group = document.createElement(&#039;fieldset&#039;);\r\n            group.classList.add(&#039;participant-group&#039;);\r\n            group.innerHTML = `\r\n        <legend>${i}\u00ba Autor<\/legend>\r\n\r\n        <label>Nome:<\/label>\r\n        \r\n\r\n        <label>Percentual de Contribui\u00e7\u00e3o (%):<\/label>\r\n        \r\n\r\n        <label>Email:<\/label>\r\n        \r\n\r\n        <label>Telefone:<\/label>\r\n        \r\n\r\n        <label>CEP:<\/label>\r\n        \r\n\r\n        <label>Rua:<\/label>\r\n        \r\n\r\n        <label>N\u00famero:<\/label>\r\n        \r\n\r\n        <label>Complemento (opcional):<\/label>\r\n        \r\n\r\n        <label>Bairro:<\/label>\r\n        \r\n\r\n        <label>Cidade:<\/label>\r\n        \r\n\r\n        <label>Estado (UF):<\/label>\r\n        \r\n\r\n        <label>Institui\u00e7\u00e3o:<\/label>\r\n        \r\n\r\n        <label>Curso\/Programa:<\/label>\r\n        \r\n      `;\r\n            participantsContainer.appendChild(group);\r\n\r\n            const cepField = group.querySelector(`#cep-${i}`);\r\n            cepField.addEventListener('blur', async () =&gt; {\r\n                const cepVal = cepField.value.replace(\/\\D\/g, '');\r\n                if (\/^[0-9]{8}$\/.test(cepVal)) {\r\n                    try {\r\n                        const res = await fetch(`https:\/\/viacep.com.br\/ws\/${cepVal}\/json\/`);\r\n                        const data = await res.json();\r\n                        if (data.erro) throw new Error(\"CEP n\u00e3o encontrado\");\r\n                        group.querySelector(`#street-${i}`).value = data.logradouro || '';\r\n                        group.querySelector(`#neighbourhood-${i}`).value = data.bairro || '';\r\n                        group.querySelector(`#city-${i}`).value = data.localidade || '';\r\n                        group.querySelector(`#state-${i}`).value = data.uf || '';\r\n                    } catch (e) {\r\n                        alert(`Erro: ${e.message}`);\r\n                    }\r\n                } else {\r\n                    alert(\"CEP inv\u00e1lido. Use 8 n\u00fameros.\");\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    document.getElementById('registration-form').addEventListener('submit', async function (e) {\r\n        e.preventDefault();\r\n\r\n        const formData = new FormData(this);\r\n        const dataObj = {};\r\n        const participants = [];\r\n\r\n        \/\/ Collect number of participants\r\n        const count = parseInt(formData.get('participant-count'));\r\n\r\n        \/\/ For each participant, collect their fields\r\n        for (let i = 1; i &lt;= count; i++) {\r\n            participants.push({\r\n                name: formData.get(`name-${i}`),\r\n                percentage: formData.get(`percentage-${i}`),\r\n                email: formData.get(`email-${i}`),\r\n                phone: formData.get(`phone-${i}`),\r\n                cep: formData.get(`cep-${i}`),\r\n                street: formData.get(`street-${i}`),\r\n                number: formData.get(`number-${i}`),\r\n                complement: formData.get(`complement-${i}`),\r\n                neighbourhood: formData.get(`neighbourhood-${i}`),\r\n                city: formData.get(`city-${i}`),\r\n                state: formData.get(`state-${i}`),\r\n                institution: formData.get(`institution-${i}`),\r\n                course: formData.get(`course-${i}`)\r\n            });\r\n        }\r\n\r\n        dataObj.participants = participants;\r\n\r\n        const URL_LINK = &#039;https:\/\/script.google.com\/macros\/s\/AKfycbwMGqrQW3GWHWkrDYZHe_obEChyMx_ezncsx9-8Gxz41dXPop6hqQe9w6mwi4xGIC53RQ\/exec&#039;;\r\n        try {\r\n            const response = await fetch(URL_LINK, {\r\n                method: &#039;POST&#039;,\r\n                body: JSON.stringify(dataObj),\r\n                headers: { &#039;Content-Type&#039;: &#039;application\/json&#039; }\r\n            });\r\n\r\n            const result = await response.json();\r\n\r\n            if (result.status === &#039;success&#039;) {\r\n                alert(`Registro enviado com sucesso! ID do projeto: ${result.projectId}`);\r\n                this.reset();\r\n                document.getElementById(&#039;participants-container&#039;).innerHTML = &#039;&#039;;\r\n            } else {\r\n                alert(`Erro ao enviar registro: ${result.message}`);\r\n            }\r\n        } catch (error) {\r\n            alert(&#039;Erro na comunica\u00e7\u00e3o com o servidor.&#039;);\r\n            console.error(error);\r\n        }\r\n    });\r\n\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>#registration-form { font-family: &#8216;Montserrat&#8217;, Verdana, sans-serif; background-color: #ffffff; padding: 30px; max-width: 100%; margin: 0 auto; color: black; } #registration-form label { display: block; margin-top: 10px; margin-bottom: 4px; font-weight: 600; font-size: 0.95rem; } #registration-form input { width: 100%; padding: 8px; border: 1px solid #cce0ff; border-radius: 4px; background: #f9fbff; transition: border 0.3s ease; font-family: inherit; } #registration-form [&hellip;]<\/p>\n","protected":false},"author":81995,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ngg_post_thumbnail":0,"footnotes":""},"coauthors":[],"class_list":["post-16421","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/aginova.ufms.br\/en\/wp-json\/wp\/v2\/pages\/16421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aginova.ufms.br\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aginova.ufms.br\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aginova.ufms.br\/en\/wp-json\/wp\/v2\/users\/81995"}],"replies":[{"embeddable":true,"href":"https:\/\/aginova.ufms.br\/en\/wp-json\/wp\/v2\/comments?post=16421"}],"version-history":[{"count":25,"href":"https:\/\/aginova.ufms.br\/en\/wp-json\/wp\/v2\/pages\/16421\/revisions"}],"predecessor-version":[{"id":16454,"href":"https:\/\/aginova.ufms.br\/en\/wp-json\/wp\/v2\/pages\/16421\/revisions\/16454"}],"wp:attachment":[{"href":"https:\/\/aginova.ufms.br\/en\/wp-json\/wp\/v2\/media?parent=16421"}],"wp:term":[{"taxonomy":"author","embeddable":true,"href":"https:\/\/aginova.ufms.br\/en\/wp-json\/wp\/v2\/coauthors?post=16421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}