| 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@44 | 16 -- TODO: Find better name for "disabled_records" | 
| jbe@44 | 17 | 
| jbe/bsw@0 | 18 function ui.field.select(args) | 
| jbe/bsw@0 | 19   ui.form_element(args, {fetch_value = true}, function(args) | 
| jbe/bsw@0 | 20     local foreign_records = args.foreign_records | 
| jbe/bsw@0 | 21     if type(foreign_records) == "function" then | 
| jbe/bsw@0 | 22       foreign_records = foreign_records(args.record) | 
| jbe/bsw@0 | 23     end | 
| jbe/bsw@0 | 24     if args.readonly then | 
| jbe/bsw@0 | 25       local name | 
| jbe/bsw@0 | 26       for idx, record in ipairs(foreign_records) do | 
| jbe/bsw@0 | 27         if record[args.foreign_id] == args.value then | 
| jbe/bsw@0 | 28           name = record[args.foreign_name] | 
| jbe/bsw@0 | 29           break | 
| jbe/bsw@0 | 30         end | 
| jbe/bsw@0 | 31       end | 
| jbe/bsw@0 | 32       ui.tag{ | 
| jbe/bsw@0 | 33         tag     = args.tag, | 
| jbe/bsw@0 | 34         attr    = args.attr, | 
| jbe/bsw@0 | 35         content = format.string(name, args.format_options) | 
| jbe/bsw@0 | 36       } | 
| jbe/bsw@0 | 37     else | 
| jbe/bsw@0 | 38       local attr = table.new(args.attr) | 
| jbe/bsw@0 | 39       attr.name  = args.html_name | 
| jbe/bsw@0 | 40       ui.tag{ | 
| jbe/bsw@0 | 41         tag     = "select", | 
| jbe/bsw@0 | 42         attr    = attr, | 
| jbe/bsw@0 | 43         content = function() | 
| jbe/bsw@0 | 44           if args.nil_as then | 
| jbe/bsw@0 | 45             ui.tag{ | 
| jbe/bsw@0 | 46               tag     = "option", | 
| jbe/bsw@0 | 47               attr    = { value = "" }, | 
| jbe/bsw@0 | 48               content = format.string( | 
| jbe/bsw@0 | 49                 args.nil_as, | 
| jbe/bsw@0 | 50                 args.format_options | 
| jbe/bsw@0 | 51               ) | 
| jbe/bsw@0 | 52             } | 
| jbe/bsw@0 | 53           end | 
| jbe@75 | 54           local one_selected = false | 
| jbe/bsw@0 | 55           for idx, record in ipairs(foreign_records) do | 
| jbe/bsw@0 | 56             local key = record[args.foreign_id] | 
| jbe@75 | 57             local selected = false | 
| jbe@75 | 58             if not one_selected then | 
| jbe@75 | 59               if args.selected_record == nil then | 
| jbe@75 | 60                 if args.value == key then | 
| jbe@75 | 61                   selected = true | 
| jbe@75 | 62                 end | 
| jbe@75 | 63               else | 
| jbe@75 | 64                 if args.selected_record == record or args.selected_record == key then | 
| jbe@75 | 65                   selected = true | 
| jbe@75 | 66                 end | 
| jbe@75 | 67               end | 
| jbe@75 | 68               one_selected = selected | 
| jbe@75 | 69             end | 
| jbe@75 | 70             local disabled = false | 
| jbe@75 | 71             if args.disabled_records then | 
| jbe@75 | 72               if args.disabled_records[record] or args.disabled_records[key] then | 
| jbe@75 | 73                 disabled = true | 
| jbe@75 | 74               end | 
| jbe@75 | 75             end | 
| jbe/bsw@0 | 76             ui.tag{ | 
| jbe/bsw@0 | 77               tag     = "option", | 
| jbe/bsw@0 | 78               attr    = { | 
| jbe/bsw@0 | 79                 value    = key, | 
| jbe@75 | 80                 disabled = disabled and "disabled" or nil, | 
| jbe@75 | 81                 selected = selected and "selected" or nil | 
| jbe/bsw@0 | 82               }, | 
| jbe/bsw@0 | 83               content = format.string( | 
| jbe/bsw@0 | 84                 record[args.foreign_name], | 
| jbe/bsw@0 | 85                 args.format_options | 
| jbe/bsw@0 | 86               ) | 
| jbe/bsw@0 | 87             } | 
| jbe/bsw@0 | 88           end | 
| jbe/bsw@0 | 89         end | 
| jbe/bsw@0 | 90       } | 
| jbe/bsw@0 | 91     end | 
| jbe/bsw@0 | 92   end) | 
| jbe/bsw@0 | 93 end |