| rev | 
   line source | 
| 
jbe/bsw@0
 | 
     1 --[[--
 | 
| 
jbe/bsw@0
 | 
     2 ui.field.select{
 | 
| 
jbe@75
 | 
     3   ...                                  -- generic ui.field.* arguments, as described for ui.autofield{...}
 | 
| 
poelzi@30
 | 
     4   foreign_records  = foreign_records,  -- list of records to be chosen from, or function returning such a list
 | 
| 
poelzi@30
 | 
     5   foreign_id       = foreign_id,       -- name of id field in foreign records
 | 
| 
poelzi@30
 | 
     6   foreign_name     = foreign_name,     -- name of field to be used as name in foreign records
 | 
| 
poelzi@30
 | 
     7   format_options   = format_options    -- format options for format.string
 | 
| 
jbe@75
 | 
     8   selected_record  = selected_record   -- id of (or reference to) record which is selected (optional, overrides "value" argument when not nil)
 | 
| 
jbe@75
 | 
     9   disabled_records = disabled_records  -- table with ids of (or references to) records that should be disabled (stored as table keys mapped to true)
 | 
| 
jbe/bsw@0
 | 
    10 }
 | 
| 
jbe/bsw@0
 | 
    11 
 | 
| 
jbe/bsw@0
 | 
    12 This function inserts a select field in the active slot. For description of the generic field helper arguments, see help for ui.autofield{...}.
 | 
| 
jbe/bsw@0
 | 
    13 
 | 
| 
jbe/bsw@0
 | 
    14 --]]--
 | 
| 
jbe/bsw@0
 | 
    15 
 | 
| 
jbe/bsw@0
 | 
    16 function ui.field.select(args)
 | 
| 
jbe/bsw@0
 | 
    17   ui.form_element(args, {fetch_value = true}, function(args)
 | 
| 
jbe/bsw@0
 | 
    18     local foreign_records = args.foreign_records
 | 
| 
jbe/bsw@0
 | 
    19     if type(foreign_records) == "function" then
 | 
| 
jbe/bsw@0
 | 
    20       foreign_records = foreign_records(args.record)
 | 
| 
jbe/bsw@0
 | 
    21     end
 | 
| 
jbe/bsw@0
 | 
    22     if args.readonly then
 | 
| 
jbe/bsw@0
 | 
    23       local name
 | 
| 
jbe/bsw@0
 | 
    24       for idx, record in ipairs(foreign_records) do
 | 
| 
jbe/bsw@0
 | 
    25         if record[args.foreign_id] == args.value then
 | 
| 
jbe/bsw@0
 | 
    26           name = record[args.foreign_name]
 | 
| 
jbe/bsw@0
 | 
    27           break
 | 
| 
jbe/bsw@0
 | 
    28         end
 | 
| 
jbe/bsw@0
 | 
    29       end
 | 
| 
jbe/bsw@0
 | 
    30       ui.tag{
 | 
| 
jbe/bsw@0
 | 
    31         tag     = args.tag,
 | 
| 
jbe/bsw@0
 | 
    32         attr    = args.attr, 
 | 
| 
jbe/bsw@0
 | 
    33         content = format.string(name, args.format_options)
 | 
| 
jbe/bsw@0
 | 
    34       }
 | 
| 
jbe/bsw@0
 | 
    35     else
 | 
| 
jbe/bsw@0
 | 
    36       local attr = table.new(args.attr)
 | 
| 
jbe/bsw@0
 | 
    37       attr.name  = args.html_name
 | 
| 
jbe/bsw@0
 | 
    38       ui.tag{
 | 
| 
jbe/bsw@0
 | 
    39         tag     = "select",
 | 
| 
jbe/bsw@0
 | 
    40         attr    = attr,
 | 
| 
jbe/bsw@0
 | 
    41         content = function()
 | 
| 
jbe/bsw@0
 | 
    42           if args.nil_as then
 | 
| 
jbe/bsw@0
 | 
    43             ui.tag{
 | 
| 
jbe/bsw@0
 | 
    44               tag     = "option",
 | 
| 
jbe/bsw@0
 | 
    45               attr    = { value = "" },
 | 
| 
jbe/bsw@0
 | 
    46               content = format.string(
 | 
| 
jbe/bsw@0
 | 
    47                 args.nil_as,
 | 
| 
jbe/bsw@0
 | 
    48                 args.format_options
 | 
| 
jbe/bsw@0
 | 
    49               )
 | 
| 
jbe/bsw@0
 | 
    50             }
 | 
| 
jbe/bsw@0
 | 
    51           end
 | 
| 
jbe@75
 | 
    52           local one_selected = false
 | 
| 
jbe/bsw@0
 | 
    53           for idx, record in ipairs(foreign_records) do
 | 
| 
jbe/bsw@0
 | 
    54             local key = record[args.foreign_id]
 | 
| 
jbe@75
 | 
    55             local selected = false
 | 
| 
jbe@75
 | 
    56             if not one_selected then
 | 
| 
jbe@75
 | 
    57               if args.selected_record == nil then
 | 
| 
jbe@75
 | 
    58                 if args.value == key then
 | 
| 
jbe@75
 | 
    59                   selected = true
 | 
| 
jbe@75
 | 
    60                 end
 | 
| 
jbe@75
 | 
    61               else
 | 
| 
jbe@75
 | 
    62                 if args.selected_record == record or args.selected_record == key then
 | 
| 
jbe@75
 | 
    63                   selected = true
 | 
| 
jbe@75
 | 
    64                 end
 | 
| 
jbe@75
 | 
    65               end
 | 
| 
jbe@75
 | 
    66               one_selected = selected
 | 
| 
jbe@75
 | 
    67             end
 | 
| 
jbe@75
 | 
    68             local disabled = false
 | 
| 
jbe@75
 | 
    69             if args.disabled_records then
 | 
| 
jbe@75
 | 
    70               if args.disabled_records[record] or args.disabled_records[key] then
 | 
| 
jbe@75
 | 
    71                 disabled = true
 | 
| 
jbe@75
 | 
    72               end
 | 
| 
jbe@75
 | 
    73             end
 | 
| 
jbe/bsw@0
 | 
    74             ui.tag{
 | 
| 
jbe/bsw@0
 | 
    75               tag     = "option",
 | 
| 
jbe/bsw@0
 | 
    76               attr    = {
 | 
| 
jbe/bsw@0
 | 
    77                 value    = key,
 | 
| 
jbe@75
 | 
    78                 disabled = disabled and "disabled" or nil,
 | 
| 
jbe@75
 | 
    79                 selected = selected and "selected" or nil
 | 
| 
jbe/bsw@0
 | 
    80               },
 | 
| 
jbe/bsw@0
 | 
    81               content = format.string(
 | 
| 
jbe/bsw@0
 | 
    82                 record[args.foreign_name],
 | 
| 
jbe/bsw@0
 | 
    83                 args.format_options
 | 
| 
jbe/bsw@0
 | 
    84               )
 | 
| 
jbe/bsw@0
 | 
    85             }
 | 
| 
jbe/bsw@0
 | 
    86           end
 | 
| 
jbe/bsw@0
 | 
    87         end
 | 
| 
jbe/bsw@0
 | 
    88       }
 | 
| 
jbe/bsw@0
 | 
    89     end
 | 
| 
jbe/bsw@0
 | 
    90   end)
 | 
| 
jbe/bsw@0
 | 
    91 end
 |