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