| rev | line source | 
| jbe/bsw@0 | 1 --[[-- | 
| jbe/bsw@0 | 2 ui.field.boolean{ | 
| jbe/bsw@0 | 3   ...                        -- generic ui.field.* arguments, as described for ui.autofield{...} | 
| jbe/bsw@0 | 4   style       = style,       -- "radio" or "checkbox", | 
| jbe/bsw@0 | 5   nil_allowed = nil_allowed  -- set to true, if nil is allowed as third value | 
| jbe/bsw@0 | 6 } | 
| jbe/bsw@0 | 7 | 
| jbe/bsw@0 | 8 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 | 9 | 
| jbe/bsw@0 | 10 --]]-- | 
| jbe/bsw@0 | 11 | 
| jbe/bsw@0 | 12 function ui.field.boolean(args) | 
| jbe/bsw@0 | 13   local style = args.style | 
| jbe/bsw@0 | 14   if not style then | 
| jbe/bsw@0 | 15     if args.nil_allowed then | 
| jbe/bsw@0 | 16       style = "radio" | 
| jbe/bsw@0 | 17     else | 
| jbe/bsw@0 | 18       style = "checkbox" | 
| jbe/bsw@0 | 19     end | 
| jbe/bsw@0 | 20   end | 
| jbe/bsw@0 | 21   local extra_args = { fetch_value = true } | 
| jbe/bsw@0 | 22   if not args.readonly and args.style == "radio" then | 
| jbe/bsw@0 | 23     extra_args.disable_label_for_id = true | 
| jbe/bsw@0 | 24   end | 
| jbe/bsw@0 | 25   ui.form_element(args, extra_args, function(args) | 
| jbe/bsw@0 | 26     local value = args.value | 
| jbe/bsw@0 | 27     if value ~= true and value ~= false and value ~= nil then | 
| jbe/bsw@0 | 28       error("Boolean value must be true, false or nil.") | 
| jbe/bsw@0 | 29     end | 
| jbe/bsw@0 | 30     if value == nil then | 
| jbe/bsw@0 | 31       if args.nil_allowed then | 
| jbe/bsw@0 | 32         value = args.default | 
| jbe/bsw@0 | 33       else | 
| jbe/bsw@0 | 34         value = args.default or false | 
| jbe/bsw@0 | 35       end | 
| jbe/bsw@0 | 36     end | 
| jbe/bsw@0 | 37     if args.readonly then | 
| jbe/bsw@0 | 38       ui.tag{ | 
| jbe/bsw@0 | 39         tag     = args.tag, | 
| jbe/bsw@0 | 40         attr    = args.attr, | 
| jbe/bsw@0 | 41         content = format.boolean(value, args.format_options) | 
| jbe/bsw@0 | 42       } | 
| jbe/bsw@0 | 43     elseif style == "radio" then | 
| jbe/bsw@0 | 44       local attr = table.new(args.attr) | 
| jbe/bsw@0 | 45       attr.type  = "radio" | 
| jbe/bsw@0 | 46       attr.name  = args.html_name | 
| jbe/bsw@0 | 47       attr.id    = ui.create_unique_id() | 
| jbe/bsw@0 | 48       attr.value = "1" | 
| jbe/bsw@0 | 49       if value == true then | 
| jbe/bsw@0 | 50         attr.checked = "checked" | 
| jbe/bsw@0 | 51       else | 
| jbe/bsw@0 | 52         attr.checked = nil | 
| jbe/bsw@0 | 53       end | 
| jbe/bsw@0 | 54       ui.container{ | 
| jbe/bsw@0 | 55         attr          = { class = "ui_radio_div" }, | 
| jbe/bsw@0 | 56         label         = args.true_as or "Yes",  -- TODO: localize | 
| jbe/bsw@0 | 57         label_for     = attr.id, | 
| jbe/bsw@0 | 58         label_attr    = { class = "ui_radio_label" }, | 
| jbe/bsw@0 | 59         content_first = true, | 
| jbe/bsw@0 | 60         content       = function() | 
| jbe/bsw@0 | 61           ui.tag{ tag  = "input", attr = attr } | 
| jbe/bsw@0 | 62         end | 
| jbe/bsw@0 | 63       } | 
| jbe/bsw@0 | 64       attr.id    = ui.create_unique_id() | 
| jbe/bsw@0 | 65       attr.value = "0" | 
| jbe/bsw@0 | 66       if value == false then | 
| jbe/bsw@0 | 67         attr.checked = "1" | 
| jbe/bsw@0 | 68       else | 
| jbe/bsw@0 | 69         attr.checked = nil | 
| jbe/bsw@0 | 70       end | 
| jbe/bsw@0 | 71       ui.container{ | 
| jbe/bsw@0 | 72         attr          = { class = "ui_radio_div" }, | 
| jbe/bsw@0 | 73         label         = args.false_as or "No",  -- TODO: localize | 
| jbe/bsw@0 | 74         label_for     = attr.id, | 
| jbe/bsw@0 | 75         label_attr    = { class = "ui_radio_label" }, | 
| jbe/bsw@0 | 76         content_first = true, | 
| jbe/bsw@0 | 77         content       = function() | 
| jbe/bsw@0 | 78           ui.tag{ tag  = "input", attr = attr } | 
| jbe/bsw@0 | 79         end | 
| jbe/bsw@0 | 80       } | 
| jbe/bsw@0 | 81       if args.nil_allowed then | 
| jbe/bsw@0 | 82         attr.id    = ui.create_unique_id() | 
| jbe/bsw@0 | 83         attr.value = "" | 
| jbe/bsw@0 | 84         if value == nil then | 
| jbe/bsw@0 | 85           attr.checked = "1" | 
| jbe/bsw@0 | 86         else | 
| jbe/bsw@0 | 87           attr.checked = nil | 
| jbe/bsw@0 | 88         end | 
| jbe/bsw@0 | 89         ui.container{ | 
| jbe/bsw@0 | 90           attr          = { class = "ui_radio_div" }, | 
| jbe/bsw@0 | 91           label         = args.nil_as or "N/A",  -- TODO: localize | 
| jbe/bsw@0 | 92           label_for     = attr.id, | 
| jbe/bsw@0 | 93           label_attr    = { class = "ui_radio_label" }, | 
| jbe/bsw@0 | 94           content_first = true, | 
| jbe/bsw@0 | 95           content       = function() | 
| jbe/bsw@0 | 96             ui.tag{ tag  = "input", attr = attr } | 
| jbe/bsw@0 | 97           end | 
| jbe/bsw@0 | 98         } | 
| jbe/bsw@0 | 99       end | 
| jbe/bsw@0 | 100       ui.hidden_field{ | 
| jbe/bsw@0 | 101         name = args.html_name .. "__format", value = "boolean" | 
| jbe/bsw@0 | 102       } | 
| jbe/bsw@0 | 103     elseif style == "checkbox" then | 
| jbe/bsw@0 | 104       if args.nil_allowed then | 
| jbe/bsw@0 | 105         error("Checkboxes do not support nil values.") | 
| jbe/bsw@0 | 106       end | 
| jbe/bsw@0 | 107       local attr = table.new(args.attr) | 
| jbe/bsw@0 | 108       attr.type  = "checkbox" | 
| jbe/bsw@0 | 109       attr.name  = args.html_name | 
| jbe/bsw@0 | 110       attr.value = "1" | 
| jbe/bsw@0 | 111       if value then | 
| jbe/bsw@0 | 112         attr.checked = "checked" | 
| jbe/bsw@0 | 113       else | 
| jbe/bsw@0 | 114         attr.checked = nil | 
| jbe/bsw@0 | 115       end | 
| jbe/bsw@0 | 116       ui.tag{ tag = "input", attr = attr } | 
| jbe/bsw@0 | 117       ui.hidden_field{ | 
| jbe/bsw@0 | 118         name = args.html_name .. "__format", | 
| jbe/bsw@0 | 119         value = encode.format_info( | 
| jbe/bsw@0 | 120           "boolean", | 
| jbe/bsw@0 | 121           { true_as = "1", false_as = "" } | 
| jbe/bsw@0 | 122         ) | 
| jbe/bsw@0 | 123       } | 
| jbe/bsw@0 | 124     else | 
| jbe/bsw@0 | 125       error("'style' attribute for ui.field.boolean{...} must be set to \"radio\", \"checkbox\" or nil.") | 
| jbe/bsw@0 | 126     end | 
| jbe/bsw@0 | 127   end) | 
| jbe/bsw@0 | 128 end |