webmcp
view framework/env/ui/multiselect.lua @ 6:5cba83b3f411
Version 1.0.6
Bugfix: class_prototype:add_reference{...} uses now qualified names in SQL queries to allow JOINs
Fixes in the documentation of slot.put_into and trace.debug
Bugfix: class_prototype:add_reference{...} uses now qualified names in SQL queries to allow JOINs
Fixes in the documentation of slot.put_into and trace.debug
| author | jbe/bsw | 
|---|---|
| date | Fri Jan 22 12:00:00 2010 +0100 (2010-01-22) | 
| parents | 9fdfb27f8e67 | 
| children | 81dfcfd960ed | 
 line source
     1 --[[--
     2 ui.multiselect{
     3   name               = name,                -- HTML name ('html_name' is NOT a valid argument for this function)
     4   container_attr     = container_attr,      -- extra HTML attributes for the container (div) enclosing field and label
     5   attr               = attr,                -- extra HTML attributes for the field
     6   label              = label,               -- text to be used as label for the input field
     7   label_attr         = label_attr,          -- extra HTML attributes for the label
     8   readonly           = readonly_flag        -- set to true, to force read-only mode
     9   foreign_records    = foreign_records,     -- list of records to be chosen from, or function returning such a list
    10   foreign_id         = foreign_id,          -- name of id field in foreign records
    11   foreign_name       = foreign_name,        -- name of field to be used as name in foreign records
    12   selected_ids       = selected_ids,        -- list of ids of currently selected foreign records
    13   connecting_records = connecting_records,  -- list of connection entries, determining which foreign records are currently selected
    14   own_id             = own_id,              -- TODO documentation needed
    15   own_reference      = own_reference,       -- name of foreign key field in connecting records, which references the main record
    16   foreign_reference  = foreign_reference,   -- name of foreign key field in connecting records, which references foreign records
    17   format_options     = format_options       -- format options for format.string
    18 }
    20 This function inserts a select field with possibility of multiple selections in the active slot. This function does not reside within ui.field.*, because multiple selections are not stored within a field of a record, but within a different SQL table. Note that 'html_name' is NOT a valid argument to this function. For description of the generic field helper arguments, see help for ui.autofield{...}.
    22 --]]--
    24 function ui.multiselect(args)
    25   local style = args.style or "checkbox"
    26   local extra_args = { fetch_record = true }
    27   if not args.readonly and args.style == "checkbox" then
    28     extra_args.disable_label_for_id = true
    29   end
    30   ui.form_element(args, extra_args, function(args)
    31     local foreign_records = args.foreign_records
    32     if type(foreign_records) == "function" then
    33       foreign_records = foreign_records(args.record)
    34     end
    35     local connecting_records = args.connecting_records
    36     if type(connecting_records) == "function" then
    37       connecting_records = connecting_records(args.record)
    38     end
    39     local select_hash = {}
    40     if args.selected_ids then
    41       for idx, selected_id in ipairs(args.selected_ids) do
    42         select_hash[selected_id] = true
    43       end
    44     elseif args.own_reference then
    45       for idx, connecting_record in ipairs(args.connecting_records) do
    46         if connecting_record[args.own_reference] == args.record[args.own_id] then
    47           select_hash[connecting_record[args.foreign_reference]] = true
    48         end
    49       end
    50     else
    51       for idx, connecting_record in ipairs(args.connecting_records) do
    52         select_hash[connecting_record[args.foreign_reference]] = true
    53       end
    54     end
    55     local attr = table.new(args.attr)
    56     if not attr.class then
    57       attr.class = "ui_multi_selection"
    58     end
    59     if args.readonly then
    60       ui.tag{
    61         tag     = "ul",
    62         attr    = attr,
    63         content = function()
    64           for idx, record in ipairs(foreign_records) do
    65             if select_hash[record[args.foreign_id]] then
    66               ui.tag{
    67                 tag     = "li",
    68                 content = format.string(
    69                   record[args.foreign_name],
    70                   args.format_options
    71                 )
    72               }
    73             end
    74           end
    75         end
    76       }
    77     elseif style == "select" then
    78       attr.name     = args.name
    79       attr.multiple = "multiple"
    80       ui.tag{
    81         tag     = "select",
    82         attr    = attr,
    83         content = function()
    84           if args.nil_as then
    85             ui.tag{
    86               tag     = "option",
    87               attr    = { value = "" },
    88               content = format.string(
    89                 args.nil_as,
    90                 args.format_options
    91               )
    92             }
    93           end
    94           for idx, record in ipairs(foreign_records) do
    95             local key = record[args.foreign_id]
    96             local selected = select_hash[key]
    97             ui.tag{
    98               tag     = "option",
    99               attr    = {
   100                 value    = key,
   101                 selected = (selected and "selected" or nil)
   102               },
   103               content = format.string(
   104                 record[args.foreign_name],
   105                 args.format_options
   106               )
   107             }
   108           end
   109         end
   110       }
   111     elseif style == "checkbox" then
   112       attr.type = "checkbox"
   113       attr.name = args.name
   114       for idx, record in ipairs(foreign_records) do
   115         local key = record[args.foreign_id]
   116         local selected = select_hash[key]
   117         attr.id   = ui.create_unique_id()
   118         attr.value = key
   119         attr.checked = selected and "checked" or nil
   120         ui.container{
   121           label = format.string(
   122             record[args.foreign_name],
   123             args.format_options
   124           ),
   125           attr          = { class = "ui_checkbox_div" },
   126           label_for     = attr.id,
   127           label_attr    = { class = "ui_checkbox_label" },
   128           content_first = true,
   129           content       = function()
   130             ui.tag{ tag  = "input", attr = attr }
   131           end
   132         }
   133       end
   134     else
   135       error("'style' attribute for ui.multiselect{...} must be set to \"select\", \"checkbox\" or nil.")
   136     end
   137   end)
   138 end
