Avoid mapping different options to the same ID
Replacing non alphanumeric characters is fragile, e.g. "C++" and "C#" both become "C-". Instead, we can use base64 encoding.
This commit is contained in:
parent
99201c184b
commit
c9061ae66a
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
julia_version = "1.8.2"
|
julia_version = "1.8.2"
|
||||||
manifest_format = "2.0"
|
manifest_format = "2.0"
|
||||||
project_hash = "c18c5eaab58f1afb699d93a8a6f512a73acf8b7c"
|
project_hash = "813d458aeace91ef95ce5c748cf72ad43f943461"
|
||||||
|
|
||||||
[[deps.ArgParse]]
|
[[deps.ArgParse]]
|
||||||
deps = ["Logging", "TextWrap"]
|
deps = ["Logging", "TextWrap"]
|
||||||
|
|
|
@ -4,6 +4,7 @@ authors = ["TEC <contact@tecosaur.net>"]
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
|
||||||
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
|
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
|
||||||
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
|
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
|
||||||
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
|
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
module Surveys
|
module Surveys
|
||||||
|
|
||||||
using Dates
|
using Dates
|
||||||
|
using Base64
|
||||||
using Genie.Renderers.Html
|
using Genie.Renderers.Html
|
||||||
import Base: show, isvalid, isempty
|
import Base: show, isvalid, isempty
|
||||||
|
|
||||||
|
@ -574,13 +575,13 @@ function htmlrender(q::Union{<:Question{RadioSelect}, Question{MultiSelect}},
|
||||||
if nonempty in q.validators "true" else false end),
|
if nonempty in q.validators "true" else false end),
|
||||||
'\n',
|
'\n',
|
||||||
join(map(q.field.options.options |> enumerate) do (i, opt)
|
join(map(q.field.options.options |> enumerate) do (i, opt)
|
||||||
id = string("qn-", q.id, "-", replace(opt.second, r"[^A-Za-z0-9]+" => '-'))
|
id = string("qn-", q.id, "-", base64encode(opt.second))
|
||||||
elem("label",
|
elem("label",
|
||||||
elem("input", :type => type, :id => id,
|
elem("input", :type => type, :id => id,
|
||||||
:name => string(q.id, "[]"), :value => html_escape(opt.second),
|
:name => string(q.id, "[]"), :value => html_escape(opt.second),
|
||||||
:checked => (!ismissing(value) && opt.second ∈ value),
|
:checked => (!ismissing(value) && opt.second ∈ value),
|
||||||
if type == "radio" && q.field.other
|
if type == "radio" && q.field.other
|
||||||
[:oninput => "document.getElementById('$(string("qn-", q.id, "---other-input"))').value = ''"]
|
[:oninput => "document.getElementById('$(string("qn-", q.id, "--other-input"))').value = ''"]
|
||||||
else [] end...) *
|
else [] end...) *
|
||||||
opt.first,
|
opt.first,
|
||||||
:for => id)
|
:for => id)
|
||||||
|
@ -598,10 +599,10 @@ function htmlrender(q::Union{<:Question{RadioSelect}, Question{MultiSelect}},
|
||||||
:id => string("qn-", q.id, "--other"), :value => "",
|
:id => string("qn-", q.id, "--other"), :value => "",
|
||||||
:checked => length(othervals) > 0,
|
:checked => length(othervals) > 0,
|
||||||
if type == "checkbox"
|
if type == "checkbox"
|
||||||
[:oninput => "if (!this.checked) { document.getElementById('$(string("qn-", q.id, "---other-input"))').value = '' }"]
|
[:oninput => "if (!this.checked) { document.getElementById('$(string("qn-", q.id, "--other-input"))').value = '' }"]
|
||||||
else [] end...),
|
else [] end...),
|
||||||
elem("input", :type => "text",
|
elem("input", :type => "text",
|
||||||
:id => string("qn-", q.id, "---other-input"),
|
:id => string("qn-", q.id, "--other-input"),
|
||||||
:class => "other", :placeholder => "Other",
|
:class => "other", :placeholder => "Other",
|
||||||
:name => string(q.id, "[]"), :value => html_escape(join(othervals, ", ")),
|
:name => string(q.id, "[]"), :value => html_escape(join(othervals, ", ")),
|
||||||
:oninput => "document.getElementById('$(string("qn-", q.id, "--other"))').checked = this.value.length > 0"
|
:oninput => "document.getElementById('$(string("qn-", q.id, "--other"))').checked = this.value.length > 0"
|
||||||
|
|
Loading…
Reference in New Issue