{"id":299,"date":"2025-12-21T17:50:18","date_gmt":"2025-12-21T23:50:18","guid":{"rendered":"http:\/\/dev.yoiner.com\/?page_id=299"},"modified":"2025-12-21T17:50:18","modified_gmt":"2025-12-21T23:50:18","slug":"return-of-personal-data","status":"publish","type":"page","link":"https:\/\/www.yoiner.com\/es\/return-of-personal-data\/","title":{"rendered":"Devoluci\u00f3n de datos"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><div class=\"data-request-intro\"><p>To request a copy of your personal data or request its deletion, please complete the form below. We will review your request and respond within 30 days.<\/p>\n<\/div><style>.data-request-intro{display:flex;align-items:flex-start;gap:0.6rem}.pdr-info-icon{display:inline-flex;align-items:center;justify-content:center;width:1.6rem;height:1.6rem;flex:0 0 1.6rem;margin-top:0.2rem;color:var(--wp--preset--color-secondary,#005177)}.pdr-intro-text{flex:1}.data-request-success{display:flex;align-items:center;gap:0.6rem;padding:1.2rem 1.4rem;border-radius:8px;background:var(--wp--preset--color-primary,#0073aa);color:var(--wp--preset--color-white,#ffffff);font-size:1rem;margin-top:1rem}.data-request-success p{margin:0}.pdr-success-icon{display:inline-flex;align-items:center;justify-content:center;width:1.6rem;height:1.6rem;flex:0 0 1.6rem;color:currentColor}.pdr-form-message{padding:.6rem 1rem;border-radius:4px;margin-bottom:1rem;background:var(--wp--preset--color-muted,#fff3cd);color:var(--wp--preset--color-contrast,#333);border-left:4px solid var(--wp--preset--color-secondary,#005177)}.pdr-form-message.error{background:#f8d7da;color:#842029;border-left-color:#f5c2c7}.pdr-form-message.success{background:#d1e7dd;color:#0f5132;border-left-color:#a3cfbb}.pdr-submit{display:inline-block;background:var(--wp--preset--color-primary,#27b0ef) !important;color:#fff !important;border:none !important;padding:0.6rem 1rem !important;border-radius:0.3125rem !important;font-weight:700;cursor:pointer;text-align:center;line-height:1;text-decoration:none !important}.pdr-submit:hover{filter:brightness(.95)}.pdr-submit:active{transform:translateY(1px)}.pdr-submit:disabled{opacity:.65;cursor:default}.pdr-spinner{display:inline-block;width:0.9rem;height:0.9rem;border-radius:50%;border:2px solid rgba(255,255,255,0.25);border-top-color:#fff;margin-right:0.5rem;vertical-align:middle;animation:pdr-spin .8s linear infinite}.pdr-submit:disabled .pdr-spinner{opacity:.6}@keyframes pdr-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}<\/style>        <form id=\"pdr-form\" method=\"post\" novalidate>\r\n            <input type=\"hidden\" name=\"action\" value=\"pdr_submit\">\r\n            <input type=\"hidden\" name=\"data_request_nonce\" value=\"755de5a2eb\">\r\n            <p><label>Full name<br><input type=\"text\" name=\"dr_name\" required><\/label><\/p>\r\n            <p><label>Email address<br><input type=\"email\" name=\"dr_email\" required><\/label><\/p>\r\n            <p><label>Request type<br>\r\n                <select name=\"dr_type\">\r\n                    <option value=\"export\">Export my data<\/option>\r\n                    <option value=\"erase\">Erase my data<\/option>\r\n                <\/select>\r\n            <\/label><\/p>\r\n            <p><label><input type=\"checkbox\" name=\"dr_consent\" required> I confirm I am the data subject and authorize this request.<\/label><\/p>\r\n            <p><button type=\"submit\" id=\"pdr-submit\" name=\"dr_submit\" class=\"pdr-submit\">Submit request<\/button><\/p>\r\n        <\/form>\r\n\r\n        <span class=\"pdr-translate-string\" style=\"display:none\">Thank you. A confirmation email has been sent to your address \u2014 please check your inbox (and your spam folder).<\/span><span class=\"pdr-translate-string\" style=\"display:none\">There was an error submitting the request.<\/span><span class=\"pdr-translate-string\" style=\"display:none\">Network error. Please try again.<\/span>\r\n        <script>\r\n        (function(){\r\n            var form = document.getElementById('pdr-form');\r\n            if(!form) return;\r\n            var ajaxUrl = 'https:\/\/www.yoiner.com\/wp-admin\/admin-ajax.php';\r\n            var defaultMessage = 'Thank you. A confirmation email has been sent to your address \u2014 please check your inbox (and your spam folder).';\r\n            var errorMessage = 'There was an error submitting the request.';\r\n            var networkMessage = 'Network error. Please try again.';\r\n            var invalidInputMessage = 'Please provide a valid name and email.';\r\n            var consentMessage = 'Please confirm the consent checkbox to proceed.';\r\n\r\n            function showFormMessage( msg, type ) {\r\n                try {\r\n                    var existing = form.querySelector('.pdr-form-message');\r\n                    if ( existing ) { existing.parentNode.removeChild( existing ); }\r\n                } catch (ex) {}\r\n                var div = document.createElement('div');\r\n                div.className = 'pdr-form-message ' + ( type || 'error' );\r\n                div.innerText = msg;\r\n                \/\/ Accessibility: announce message to assistive tech\r\n                div.setAttribute('role', 'status');\r\n                div.setAttribute('aria-live', 'polite');\r\n                div.setAttribute('tabindex', '-1');\r\n                form.insertBefore( div, form.firstChild );\r\n                try { div.focus(); } catch (e) {}\r\n            }\r\n\r\n            form.addEventListener('submit', function(e){\r\n                e.preventDefault();\r\n                var btn = document.getElementById('pdr-submit');\r\n                \/\/ Remove any existing inline form message so new validation state is clear\r\n                try { var existingMsg = form.querySelector('.pdr-form-message'); if ( existingMsg ) { existingMsg.parentNode.removeChild(existingMsg); } } catch (e) {}\r\n                var nameEl = form.querySelector('input[name=\"dr_name\"]');\r\n                var emailEl = form.querySelector('input[name=\"dr_email\"]');\r\n                var consentEl = form.querySelector('input[name=\"dr_consent\"]');\r\n                function isValidEmail(e){ return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(e); }\r\n                if ( ! nameEl || ! emailEl ) {\r\n                    showFormMessage( errorMessage, 'error' );\r\n                    return;\r\n                }\r\n                if ( nameEl.value.trim() === '' || ! isValidEmail( emailEl.value.trim() ) ) {\r\n                    showFormMessage( invalidInputMessage, 'error' );\r\n                    try { nameEl.focus(); } catch (e) {}\r\n                    return;\r\n                }\r\n                if ( consentEl && ! consentEl.checked ) {\r\n                    showFormMessage( consentMessage, 'error' );\r\n                    try { consentEl.focus(); } catch (e) {}\r\n                    return;\r\n                }\r\n\r\n                \/\/ mark form busy for assistive tech\r\n                form.setAttribute('aria-busy', 'true');\r\n                \/\/ build FormData BEFORE disabling controls so hidden fields (action\/nonce) are included\r\n                var data = new FormData(form);\r\n                \/\/ disable submit and show spinner\r\n                if ( btn ) {\r\n                    btn.disabled = true;\r\n                    if ( ! btn.querySelector('.pdr-spinner') ) {\r\n                        var spinner = document.createElement('span');\r\n                        spinner.className = 'pdr-spinner';\r\n                        spinner.setAttribute('aria-hidden', 'true');\r\n                        btn.insertBefore( spinner, btn.firstChild );\r\n                    }\r\n                }\r\n                \/\/ disable all form controls (after form data is captured)\r\n                var elements = form.querySelectorAll('input,select,textarea,button');\r\n                elements.forEach(function(el){ el.disabled = true; });\r\n                fetch(ajaxUrl, { method: 'POST', credentials: 'same-origin', body: data })\r\n                .then(function(r){ return r.json(); })\r\n                .then(function(json){\r\n                        if(json.success){\r\n                                var msg = (json.data && json.data.message) ? json.data.message : defaultMessage;\r\n                                var wrap = document.createElement('div');\r\n                                wrap.className = 'data-request-success';\r\n                                var iconHTML = '<span class=\"pdr-success-icon\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" focusable=\"false\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" \/><path d=\"M11 16h2v-6h-2v6zm0-8h2v2h-2V8z\" fill=\"currentColor\" \/><\/svg><\/span>';\r\n                                if ( json.data && json.data.html ) {\r\n                                    wrap.innerHTML = iconHTML + json.data.html;\r\n                                } else {\r\n                                    var p = document.createElement('p'); p.innerText = msg;\r\n                                    wrap.innerHTML = iconHTML;\r\n                                    wrap.appendChild(p);\r\n                                }\r\n                                var introEl = document.querySelector('.data-request-intro');\r\n                                if ( introEl ) {\r\n                                    introEl.style.display = 'none';\r\n                                }\r\n                                wrap.setAttribute('tabindex', '-1');\r\n                                wrap.setAttribute('role', 'status');\r\n                                wrap.setAttribute('aria-live', 'polite');\r\n                                form.parentNode.replaceChild(wrap, form);\r\n                                try { wrap.focus(); } catch (e) {}\r\n                            } else {\r\n                        var msg = json.data && json.data.message ? json.data.message : errorMessage;\r\n                        showFormMessage( msg, 'error' );\r\n                        form.removeAttribute('aria-busy');\r\n                        \/\/ remove spinner & re-enable fields\r\n                        try { if ( btn ) { var s = btn.querySelector('.pdr-spinner'); if ( s ) s.parentNode.removeChild(s); btn.disabled = false; } } catch (e) {}\r\n                        var elements_re = form.querySelectorAll('input,select,textarea,button');\r\n                        elements_re.forEach(function(el){ el.disabled = false; });\r\n                    }\r\n                }).catch(function(){\r\n                    showFormMessage( networkMessage, 'error' );\r\n                    form.removeAttribute('aria-busy');\r\n                    try { if ( btn ) { var s2 = btn.querySelector('.pdr-spinner'); if ( s2 ) s2.parentNode.removeChild(s2); btn.disabled = false; } } catch (e) {}\r\n                    var elements_err = form.querySelectorAll('input,select,textarea,button');\r\n                    elements_err.forEach(function(el){ el.disabled = false; });\r\n                });\r\n            });\r\n        })();\r\n        <\/script>\r\n        <\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-299","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.yoiner.com\/es\/wp-json\/wp\/v2\/pages\/299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yoiner.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.yoiner.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.yoiner.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yoiner.com\/es\/wp-json\/wp\/v2\/comments?post=299"}],"version-history":[{"count":1,"href":"https:\/\/www.yoiner.com\/es\/wp-json\/wp\/v2\/pages\/299\/revisions"}],"predecessor-version":[{"id":300,"href":"https:\/\/www.yoiner.com\/es\/wp-json\/wp\/v2\/pages\/299\/revisions\/300"}],"wp:attachment":[{"href":"https:\/\/www.yoiner.com\/es\/wp-json\/wp\/v2\/media?parent=299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}