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