{"id":26274,"date":"2025-06-04T10:37:13","date_gmt":"2025-06-04T03:37:13","guid":{"rendered":"https:\/\/adraindonesia.org\/?page_id=26274"},"modified":"2026-03-23T20:48:04","modified_gmt":"2026-03-23T13:48:04","slug":"complaints-form","status":"publish","type":"page","link":"https:\/\/adraindonesia.org\/id\/complaints-form\/","title":{"rendered":"Complaints Form"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"26274\" class=\"elementor elementor-26274\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-61b01fc e-flex e-con-boxed e-con e-parent\" data-id=\"61b01fc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-93776d1 adra-complaint-form elementor-button-align-stretch elementor-widget elementor-widget-form\" data-id=\"93776d1\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;button_width&quot;:&quot;100&quot;,&quot;step_type&quot;:&quot;number_text&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}\" data-widget_type=\"form.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<form class=\"elementor-form\" method=\"post\" name=\"Complaints via ADRA Website\" aria-label=\"Complaints via ADRA Website\">\n\t\t\t<input type=\"hidden\" name=\"post_id\" value=\"26274\"\/>\n\t\t\t<input type=\"hidden\" name=\"form_id\" value=\"93776d1\"\/>\n\t\t\t<input type=\"hidden\" name=\"referer_title\" value=\"Complaints Form\" \/>\n\n\t\t\t\t\t\t\t<input type=\"hidden\" name=\"queried_id\" value=\"26274\"\/>\n\t\t\t\n\t\t\t<div class=\"elementor-form-fields-wrapper elementor-labels-above\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-select elementor-field-group elementor-column elementor-field-group-field_61c8449 elementor-col-50 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-field_61c8449\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tJenis Komplain\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field elementor-select-wrapper remove-before \">\n\t\t\t<div class=\"select-caret-down-wrapper\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-caret-down\" viewBox=\"0 0 571.4 571.4\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M571 393Q571 407 561 418L311 668Q300 679 286 679T261 668L11 418Q0 407 0 393T11 368 36 357H536Q550 357 561 368T571 393Z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t\t<select name=\"form_fields[field_61c8449]\" id=\"form-field-field_61c8449\" class=\"elementor-field-textual elementor-size-lg\" required=\"required\">\n\t\t\t\t\t\t\t\t\t<option value=\"\">Pilih Jenis Komplain <\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"1. Permintaan Informasi umum\">1. Permintaan Informasi umum<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"2. Bantuan\/Dukungan Proyek\">2. Bantuan\/Dukungan Proyek<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"3. Saran dan ketidakpuasan \">3. Saran dan ketidakpuasan <\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"4. Apresiasi atas bantuan\">4. Apresiasi atas bantuan<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"5. Keluhan atas bantuan\/layanan\">5. Keluhan atas bantuan\/layanan<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"6. Dugaan pelanggaran kode etik atau kebijakan\">6. Dugaan pelanggaran kode etik atau kebijakan<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"7. Isu perlindungan\">7. Isu perlindungan<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"8. Keamanan dan keselamatan\">8. Keamanan dan keselamatan<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"9. Lainnya\">9. Lainnya<\/option>\n\t\t\t\t\t\t\t<\/select>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-select elementor-field-group elementor-column elementor-field-group-field_51f6614 elementor-col-50 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-field_51f6614\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tTujuan Komplain\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field elementor-select-wrapper remove-before \">\n\t\t\t<div class=\"select-caret-down-wrapper\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-caret-down\" viewBox=\"0 0 571.4 571.4\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M571 393Q571 407 561 418L311 668Q300 679 286 679T261 668L11 418Q0 407 0 393T11 368 36 357H536Q550 357 561 368T571 393Z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t\t<select name=\"form_fields[field_51f6614]\" id=\"form-field-field_51f6614\" class=\"elementor-field-textual elementor-size-lg\" required=\"required\">\n\t\t\t\t\t\t\t\t\t<option value=\"\">Tujuan Komplain <\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"1. Program dan Proyek\">1. Program dan Proyek<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"3. Manajemen ADRA Indonesia\">3. Manajemen ADRA Indonesia<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"4. Staff ADRA Indonesia\">4. Staff ADRA Indonesia<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"5. Lainnya\">5. Lainnya<\/option>\n\t\t\t\t\t\t\t<\/select>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-hidden elementor-field-group elementor-column elementor-field-group-unique_token elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"hidden\" name=\"form_fields[unique_token]\" id=\"form-field-unique_token\" class=\"elementor-field elementor-size-lg  elementor-field-textual\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-message elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-message\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tPesan\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t<textarea class=\"elementor-field-textual elementor-field  elementor-size-lg\" name=\"form_fields[message]\" id=\"form-field-message\" rows=\"4\" placeholder=\"Isi Komplain Pesan\" required=\"required\"><\/textarea>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-html elementor-field-group elementor-column elementor-field-group-field_ece0263 elementor-col-100\">\n\t\t\t\t\tJika Anda bersedia dihubungi, silakan isi form Nama, Email, atau Nomor Telepon.<br>\nJika tidak mau dihubungi dan tetap anonim, Anda bisa langsung mengirimkan pesan Anda dengan klik tombol KIRIM. \t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-fullname elementor-col-30\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-fullname\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tNama\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[fullname]\" id=\"form-field-fullname\" class=\"elementor-field elementor-size-lg  elementor-field-textual\" placeholder=\"(opsional)\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-40\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-email\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tEmail\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"email\" name=\"form_fields[email]\" id=\"form-field-email\" class=\"elementor-field elementor-size-lg  elementor-field-textual\" placeholder=\"(opsional)\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-tel elementor-field-group elementor-column elementor-field-group-phone elementor-col-30\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-phone\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tTelpon\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t<input size=\"1\" type=\"tel\" name=\"form_fields[phone]\" id=\"form-field-phone\" class=\"elementor-field elementor-size-lg  elementor-field-textual\" placeholder=\"(opsional)\" pattern=\"[0-9()#&amp;+*-=.]+\" title=\"Only numbers and phone characters (#, -, *, etc) are accepted.\">\n\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons\">\n\t\t\t\t\t<button class=\"elementor-button elementor-size-sm\" type=\"submit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">KIRIM<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/form>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-171a47a elementor-widget elementor-widget-html\" data-id=\"171a47a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\r\n(function(){\r\n  \/\/ --- Token generator: 4 chars (crypto-safe) ---\r\n  function makeToken(){\r\n    const alphabet = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; \/\/ 32 chars, no I,O,0,1\r\n    const arr = new Uint8Array(4);\r\n    try { crypto.getRandomValues(arr); } catch(e) { for(let i=0;i<4;i++) arr[i]=Math.floor(Math.random()*256); }\r\n    let s = '';\r\n    for (let i=0;i<4;i++) s += alphabet[arr[i] % alphabet.length];\r\n    return s; \/\/ 4 chars\r\n  }\r\n\r\n  \/\/ --- candidate selectors for hidden token field ---\r\n  function candidates(){\r\n    return [\r\n      'input[name=\"unique_token\"]',\r\n      'input[id=\"unique_token\"]',\r\n      'input[name*=\"unique_token\"]',\r\n      'input[id*=\"unique_token\"]',\r\n      'input[data-field-id=\"unique_token\"]',\r\n      'input[data-elementor-field=\"unique_token\"]',\r\n      'input[name*=\"token\"]',\r\n      'input[id*=\"token\"]'\r\n    ];\r\n  }\r\n\r\n  \/\/ find hidden input inside optional scope (form) then document\r\n  function findHidden(scope){\r\n    const scopes = scope ? [scope, document] : [document];\r\n    for (const sc of scopes){\r\n      for (const s of candidates()){\r\n        const el = sc.querySelector(s);\r\n        if (el) return el;\r\n      }\r\n    }\r\n    const all = (scope || document).querySelectorAll('input[type=\"hidden\"]');\r\n    for (const i of all){\r\n      const n = (i.name||'').toLowerCase(), id = (i.id||'').toLowerCase();\r\n      if (n.includes('unique') || id.includes('unique') || n.includes('token') || id.includes('token')) return i;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  \/\/ ensure hidden input exists and has token. returns token or null.\r\n  function ensureTokenOnForm(form){\r\n    let hidden = findHidden(form);\r\n    if (!hidden){\r\n      hidden = document.createElement('input');\r\n      hidden.type = 'hidden';\r\n      hidden.name = 'unique_token';\r\n      hidden.id = 'unique_token';\r\n      form.appendChild(hidden);\r\n    }\r\n    if (!hidden.value || hidden.value.trim() === '') hidden.value = makeToken();\r\n    return hidden.value;\r\n  }\r\n\r\n  \/\/ target subject selectors (inputs or textareas)\r\n  function findSubjectField(form){\r\n    if (!form) form = document;\r\n    const sel = [\r\n      'input[name=\"subject\"]',\r\n      'input[name*=\"subject\"]',\r\n      'input[id=\"subject\"]',\r\n      'input[id*=\"subject\"]',\r\n      'input[placeholder*=\"subject\"]',\r\n      'textarea[name=\"subject\"]',\r\n      'textarea[name*=\"subject\"]',\r\n      'textarea[id=\"subject\"]',\r\n      'textarea[id*=\"subject\"]'\r\n    ];\r\n    for (const s of sel){\r\n      const el = form.querySelector(s);\r\n      if (el) return el;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  \/\/ append token to subject cleanly: remove prior [T:...] then add new\r\n  function appendTokenToSubject(form, token){\r\n    const subj = findSubjectField(form);\r\n    if (!subj || typeof subj.value !== 'string') return;\r\n    subj.value = subj.value.replace(\/\\s*\\[T:[A-Z0-9]{2,8}\\]\\s*$\/i, '');\r\n    subj.value = subj.value.trim() + ' [T:' + token + ']';\r\n  }\r\n\r\n  \/\/ Submit listener: ensure token and update subject right before submit\r\n  document.addEventListener('submit', function(ev){\r\n    try {\r\n      const form = ev.target;\r\n      if (!(form instanceof HTMLFormElement)) return;\r\n      const token = ensureTokenOnForm(form);\r\n      appendTokenToSubject(form, token);\r\n      \/\/ no blocking. setting value is synchronous and sufficient.\r\n    } catch(e){}\r\n  }, true);\r\n\r\n  \/\/ Fill as soon as possible for forms that render earlier (best-effort)\r\n  function initFill(){ \r\n    const forms = document.querySelectorAll('form');\r\n    for (const f of forms){\r\n      \/\/ only fill if form seems to have hidden or subject\r\n      if (findHidden(f) || findSubjectField(f)){\r\n        ensureTokenOnForm(f);\r\n      }\r\n    }\r\n    \/\/ also try document-level hidden\r\n    ensureTokenOnForm(document);\r\n  }\r\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initFill);\r\n  else initFill();\r\n\r\n  \/\/ fallback repeated attempts for async renderers (Elementor). stops automatically.\r\n  const maxAttempts = 25;\r\n  let attempts = 0;\r\n  const interval = setInterval(function(){\r\n    attempts++;\r\n    initFill();\r\n    if (attempts >= maxAttempts) clearInterval(interval);\r\n  }, 200);\r\n\r\n  \/\/ mutation observer: detect new forms added and fill once\r\n  const mo = new MutationObserver(function(muts){\r\n    for (const m of muts){\r\n      for (const n of m.addedNodes){\r\n        if (n instanceof HTMLElement){\r\n          if (n.querySelector && n.querySelector('form')) {\r\n            const forms = n.querySelectorAll('form');\r\n            for (const f of forms) ensureTokenOnForm(f);\r\n          }\r\n          if (n.tagName === 'FORM') ensureTokenOnForm(n);\r\n        }\r\n      }\r\n    }\r\n  });\r\n  try { mo.observe(document.documentElement || document, { childList: true, subtree: true }); }\r\n  catch(e){}\r\n\r\n  \/\/ Expose debug helper in dev console if needed (disabled by default)\r\n  window.__ensureUniqueToken = function(form){\r\n    return ensureTokenOnForm(form || document);\r\n  };\r\n})();\r\n<\/script>\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":"","protected":false},"author":9,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-26274","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/adraindonesia.org\/id\/wp-json\/wp\/v2\/pages\/26274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adraindonesia.org\/id\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/adraindonesia.org\/id\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/adraindonesia.org\/id\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/adraindonesia.org\/id\/wp-json\/wp\/v2\/comments?post=26274"}],"version-history":[{"count":217,"href":"https:\/\/adraindonesia.org\/id\/wp-json\/wp\/v2\/pages\/26274\/revisions"}],"predecessor-version":[{"id":27138,"href":"https:\/\/adraindonesia.org\/id\/wp-json\/wp\/v2\/pages\/26274\/revisions\/27138"}],"wp:attachment":[{"href":"https:\/\/adraindonesia.org\/id\/wp-json\/wp\/v2\/media?parent=26274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}