| 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
 |