jbe/bsw@0: --[[-- jbe/bsw@0: ui.field.select{ jbe@75: ... -- generic ui.field.* arguments, as described for ui.autofield{...} poelzi@30: foreign_records = foreign_records, -- list of records to be chosen from, or function returning such a list poelzi@30: foreign_id = foreign_id, -- name of id field in foreign records poelzi@30: foreign_name = foreign_name, -- name of field to be used as name in foreign records poelzi@30: format_options = format_options -- format options for format.string jbe@75: selected_record = selected_record -- id of (or reference to) record which is selected (optional, overrides "value" argument when not nil) jbe@75: 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: } jbe/bsw@0: jbe/bsw@0: 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: jbe/bsw@0: --]]-- jbe/bsw@0: jbe@44: -- TODO: Find better name for "disabled_records" jbe@44: jbe/bsw@0: function ui.field.select(args) jbe/bsw@0: ui.form_element(args, {fetch_value = true}, function(args) jbe/bsw@0: local foreign_records = args.foreign_records jbe/bsw@0: if type(foreign_records) == "function" then jbe/bsw@0: foreign_records = foreign_records(args.record) jbe/bsw@0: end jbe/bsw@0: if args.readonly then jbe/bsw@0: local name jbe/bsw@0: for idx, record in ipairs(foreign_records) do jbe/bsw@0: if record[args.foreign_id] == args.value then jbe/bsw@0: name = record[args.foreign_name] jbe/bsw@0: break jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: ui.tag{ jbe/bsw@0: tag = args.tag, jbe/bsw@0: attr = args.attr, jbe/bsw@0: content = format.string(name, args.format_options) jbe/bsw@0: } jbe/bsw@0: else jbe/bsw@0: local attr = table.new(args.attr) jbe/bsw@0: attr.name = args.html_name jbe/bsw@0: ui.tag{ jbe/bsw@0: tag = "select", jbe/bsw@0: attr = attr, jbe/bsw@0: content = function() jbe/bsw@0: if args.nil_as then jbe/bsw@0: ui.tag{ jbe/bsw@0: tag = "option", jbe/bsw@0: attr = { value = "" }, jbe/bsw@0: content = format.string( jbe/bsw@0: args.nil_as, jbe/bsw@0: args.format_options jbe/bsw@0: ) jbe/bsw@0: } jbe/bsw@0: end jbe@75: local one_selected = false jbe/bsw@0: for idx, record in ipairs(foreign_records) do jbe/bsw@0: local key = record[args.foreign_id] jbe@75: local selected = false jbe@75: if not one_selected then jbe@75: if args.selected_record == nil then jbe@75: if args.value == key then jbe@75: selected = true jbe@75: end jbe@75: else jbe@75: if args.selected_record == record or args.selected_record == key then jbe@75: selected = true jbe@75: end jbe@75: end jbe@75: one_selected = selected jbe@75: end jbe@75: local disabled = false jbe@75: if args.disabled_records then jbe@75: if args.disabled_records[record] or args.disabled_records[key] then jbe@75: disabled = true jbe@75: end jbe@75: end jbe/bsw@0: ui.tag{ jbe/bsw@0: tag = "option", jbe/bsw@0: attr = { jbe/bsw@0: value = key, jbe@75: disabled = disabled and "disabled" or nil, jbe@75: selected = selected and "selected" or nil jbe/bsw@0: }, jbe/bsw@0: content = format.string( jbe/bsw@0: record[args.foreign_name], jbe/bsw@0: args.format_options jbe/bsw@0: ) jbe/bsw@0: } jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: } jbe/bsw@0: end jbe/bsw@0: end) jbe/bsw@0: end