diff --git a/feedback/index.html b/feedback/index.html index 97ae38b..25ff693 100644 --- a/feedback/index.html +++ b/feedback/index.html @@ -341,20 +341,22 @@ // ---- The feedback form ---------------------------------------------------------------- // The n8n form's questions, with the copy corrected. The identity block (name, email, // anonymous tick) and the publish-consent question are gone — do not bring them back. + // None of these questions is compulsory: the form submits with any subset answered, or none. + // The error nodes (.err) and their CSS are kept, but nothing sets them any more. var FIELDS = [ - { id: "finalized", label: "Did you finalize the signup?", type: "select", options: [["yes", "Yes"], ["no", "No"]], required: true }, - { id: "difficulty", label: "How hard was the signup?", type: "select", options: [["easy", "Easy"], ["ok", "OK"], ["hard", "Hard"]], required: true }, - { id: "signup_feedback", label: "What is your feedback on the signup?", type: "textarea", required: true }, - { id: "understood_scale", label: "Did you understand how we ask you to rate your skills? (the 15-point scale)", type: "select", options: [["yes", "Yes"], ["no", "No"]], required: true }, - { id: "scale_feedback", label: "What is your feedback on the 15-point skill scale?", type: "textarea", required: true }, - { id: "almost_stopped", label: "What almost stopped you from signing up?", type: "textarea", required: true, hint: "If nothing did, say so." }, - { id: "broke_or_confused", label: "Did anything break or confuse you?", type: "textarea", required: true }, - { id: "design_shows_work", label: "Do you think our profile design shows what you do well?", type: "select", options: [["yes", "Yes"], ["so-so", "So-so"], ["no", "No"]], required: true }, - { id: "design_feedback", label: "What can we improve about the profile design?", type: "textarea", required: true }, - { id: "will_stay", label: "Will you stay on the platform?", type: "select", options: [["yes", "Yes"], ["no", "No"]], required: true }, - { id: "improve_offer", label: "How can we improve what we offer you?", type: "textarea", required: true }, - { id: "recommend", label: "Would you recommend this platform to a freelance colleague?", type: "select", options: [["yes", "Yes, good idea"], ["maybe", "Maybe"], ["no", "Preferably not"]], required: true }, - { id: "expect_next", label: "What do you expect to happen next — and how soon?", type: "textarea", required: true } + { id: "finalized", label: "Did you finalize the signup?", type: "select", options: [["yes", "Yes"], ["no", "No"]] }, + { id: "difficulty", label: "How hard was the signup?", type: "select", options: [["easy", "Easy"], ["ok", "OK"], ["hard", "Hard"]] }, + { id: "signup_feedback", label: "What is your feedback on the signup?", type: "textarea" }, + { id: "understood_scale", label: "Did you understand how we ask you to rate your skills? (the 15-point scale)", type: "select", options: [["yes", "Yes"], ["no", "No"]] }, + { id: "scale_feedback", label: "What is your feedback on the 15-point skill scale?", type: "textarea" }, + { id: "almost_stopped", label: "What almost stopped you from signing up?", type: "textarea", hint: "If nothing did, say so." }, + { id: "broke_or_confused", label: "Did anything break or confuse you?", type: "textarea" }, + { id: "design_shows_work", label: "Do you think our profile design shows what you do well?", type: "select", options: [["yes", "Yes"], ["so-so", "So-so"], ["no", "No"]] }, + { id: "design_feedback", label: "What can we improve about the profile design?", type: "textarea" }, + { id: "will_stay", label: "Will you stay on the platform?", type: "select", options: [["yes", "Yes"], ["no", "No"]] }, + { id: "improve_offer", label: "How can we improve what we offer you?", type: "textarea" }, + { id: "recommend", label: "Would you recommend this platform to a freelance colleague?", type: "select", options: [["yes", "Yes, good idea"], ["maybe", "Maybe"], ["no", "Preferably not"]] }, + { id: "expect_next", label: "What do you expect to happen next — and how soon?", type: "textarea" } ]; function fieldBlock(spec) { @@ -423,10 +425,15 @@ form.addEventListener("submit", function (ev) { ev.preventDefault(); - var bad = false; + + // Nothing here is compulsory, so there is nothing to validate and nothing to announce. + // The .err nodes and their CSS are kept in place in case a question is ever made + // compulsory again, but nothing here sets them: an empty form submits like any other. + + // Build the body. Only the questions that were answered, and nothing else — no + // name, no email, no identifier, and no empty string for a question left blank. + var body = { form: "feedback" }; FIELDS.forEach(function (spec) { - var holder = form.querySelector('[data-field="' + spec.id + '"]'); - var err = holder.querySelector(".err"); var v = ""; if (spec.type === "radio") { var checked = form.querySelector('input[name="' + spec.id + '"]:checked'); @@ -435,34 +442,7 @@ var ctl = form.querySelector("#fb-" + spec.id); v = ctl ? ctl.value.trim() : ""; } - if (spec.required && !v) { - holder.setAttribute("data-bad", "1"); - err.textContent = "Please answer this before sending."; - err.hidden = false; - bad = true; - } else { - holder.removeAttribute("data-bad"); - err.hidden = true; - } - }); - if (bad) { - line.className = "status state-warn"; - line.textContent = "Some answers are missing — see the notes above."; - var firstBad = form.querySelector('[data-bad="1"] input, [data-bad="1"] textarea, [data-bad="1"] select'); - if (firstBad) firstBad.focus(); - return; - } - - // Build the body. The answers and nothing else — no name, no email, no identifier. - var body = { form: "feedback" }; - FIELDS.forEach(function (spec) { - if (spec.type === "radio") { - var checked = form.querySelector('input[name="' + spec.id + '"]:checked'); - body[spec.id] = checked ? checked.value : ""; - } else { - var ctl = form.querySelector("#fb-" + spec.id); - body[spec.id] = ctl ? ctl.value.trim() : ""; - } + if (v) body[spec.id] = v; }); btn.disabled = true;