jbe/bsw@0: --[[-- jbe/bsw@0: ui.field.boolean{ jbe/bsw@0: ... -- generic ui.field.* arguments, as described for ui.autofield{...} jbe/bsw@0: style = style, -- "radio" or "checkbox", jbe/bsw@0: nil_allowed = nil_allowed -- set to true, if nil is allowed as third value jbe/bsw@0: } jbe/bsw@0: jbe/bsw@0: This function inserts a field for boolean values in the active slot. For description of the generic field helper arguments, see help for ui.autofield{...}. jbe/bsw@0: jbe/bsw@0: --]]-- jbe/bsw@0: jbe/bsw@0: function ui.field.boolean(args) jbe/bsw@0: local style = args.style jbe/bsw@0: if not style then jbe/bsw@0: if args.nil_allowed then jbe/bsw@0: style = "radio" jbe/bsw@0: else jbe/bsw@0: style = "checkbox" jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: local extra_args = { fetch_value = true } jbe/bsw@0: if not args.readonly and args.style == "radio" then jbe/bsw@0: extra_args.disable_label_for_id = true jbe/bsw@0: end jbe/bsw@0: ui.form_element(args, extra_args, function(args) jbe/bsw@0: local value = args.value jbe/bsw@0: if value ~= true and value ~= false and value ~= nil then jbe/bsw@0: error("Boolean value must be true, false or nil.") jbe/bsw@0: end jbe/bsw@0: if value == nil then jbe/bsw@0: if args.nil_allowed then jbe/bsw@0: value = args.default jbe/bsw@0: else jbe/bsw@0: value = args.default or false jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: if args.readonly then jbe/bsw@0: ui.tag{ jbe/bsw@0: tag = args.tag, jbe/bsw@0: attr = args.attr, jbe/bsw@0: content = format.boolean(value, args.format_options) jbe/bsw@0: } jbe/bsw@0: elseif style == "radio" then jbe/bsw@0: local attr = table.new(args.attr) jbe/bsw@0: attr.type = "radio" jbe/bsw@0: attr.name = args.html_name jbe/bsw@0: attr.id = ui.create_unique_id() jbe/bsw@0: attr.value = "1" jbe/bsw@0: if value == true then jbe/bsw@0: attr.checked = "checked" jbe/bsw@0: else jbe/bsw@0: attr.checked = nil jbe/bsw@0: end jbe/bsw@0: ui.container{ jbe/bsw@0: attr = { class = "ui_radio_div" }, jbe/bsw@0: label = args.true_as or "Yes", -- TODO: localize jbe/bsw@0: label_for = attr.id, jbe/bsw@0: label_attr = { class = "ui_radio_label" }, jbe/bsw@0: content_first = true, jbe/bsw@0: content = function() jbe/bsw@0: ui.tag{ tag = "input", attr = attr } jbe/bsw@0: end jbe/bsw@0: } jbe/bsw@0: attr.id = ui.create_unique_id() jbe/bsw@0: attr.value = "0" jbe/bsw@0: if value == false then jbe/bsw@0: attr.checked = "1" jbe/bsw@0: else jbe/bsw@0: attr.checked = nil jbe/bsw@0: end jbe/bsw@0: ui.container{ jbe/bsw@0: attr = { class = "ui_radio_div" }, jbe/bsw@0: label = args.false_as or "No", -- TODO: localize jbe/bsw@0: label_for = attr.id, jbe/bsw@0: label_attr = { class = "ui_radio_label" }, jbe/bsw@0: content_first = true, jbe/bsw@0: content = function() jbe/bsw@0: ui.tag{ tag = "input", attr = attr } jbe/bsw@0: end jbe/bsw@0: } jbe/bsw@0: if args.nil_allowed then jbe/bsw@0: attr.id = ui.create_unique_id() jbe/bsw@0: attr.value = "" jbe/bsw@0: if value == nil then jbe/bsw@0: attr.checked = "1" jbe/bsw@0: else jbe/bsw@0: attr.checked = nil jbe/bsw@0: end jbe/bsw@0: ui.container{ jbe/bsw@0: attr = { class = "ui_radio_div" }, jbe/bsw@0: label = args.nil_as or "N/A", -- TODO: localize jbe/bsw@0: label_for = attr.id, jbe/bsw@0: label_attr = { class = "ui_radio_label" }, jbe/bsw@0: content_first = true, jbe/bsw@0: content = function() jbe/bsw@0: ui.tag{ tag = "input", attr = attr } jbe/bsw@0: end jbe/bsw@0: } jbe/bsw@0: end jbe/bsw@0: ui.hidden_field{ jbe/bsw@0: name = args.html_name .. "__format", value = "boolean" jbe/bsw@0: } jbe/bsw@0: elseif style == "checkbox" then jbe/bsw@0: if args.nil_allowed then jbe/bsw@0: error("Checkboxes do not support nil values.") jbe/bsw@0: end jbe/bsw@0: local attr = table.new(args.attr) jbe/bsw@0: attr.type = "checkbox" jbe/bsw@0: attr.name = args.html_name jbe/bsw@0: attr.value = "1" jbe/bsw@0: if value then jbe/bsw@0: attr.checked = "checked" jbe/bsw@0: else jbe/bsw@0: attr.checked = nil jbe/bsw@0: end jbe/bsw@0: ui.tag{ tag = "input", attr = attr } jbe/bsw@0: ui.hidden_field{ jbe/bsw@0: name = args.html_name .. "__format", jbe/bsw@0: value = encode.format_info( jbe/bsw@0: "boolean", jbe/bsw@0: { true_as = "1", false_as = "" } jbe/bsw@0: ) jbe/bsw@0: } jbe/bsw@0: else jbe/bsw@0: error("'style' attribute for ui.field.boolean{...} must be set to \"radio\", \"checkbox\" or nil.") jbe/bsw@0: end jbe/bsw@0: end) jbe/bsw@0: end