# HG changeset patch # User jbe # Date 1340145302 -7200 # Node ID faedbc8615e09d43a811e0756526b8a1e94c956a # Parent 74efa44a0a4ddd7c8e753ca840a04e80683acc66 Allow particular records to be selected and/or disabled in ui.field.select{...}, even if they share the same key, and never select more than one record diff -r 74efa44a0a4d -r faedbc8615e0 framework/env/ui/field/select.lua --- a/framework/env/ui/field/select.lua Fri Jun 15 22:10:39 2012 +0200 +++ b/framework/env/ui/field/select.lua Wed Jun 20 00:35:02 2012 +0200 @@ -1,11 +1,12 @@ --[[-- ui.field.select{ - ... -- generic ui.field.* arguments, as described for ui.autofield{...} + ... -- generic ui.field.* arguments, as described for ui.autofield{...} foreign_records = foreign_records, -- list of records to be chosen from, or function returning such a list foreign_id = foreign_id, -- name of id field in foreign records foreign_name = foreign_name, -- name of field to be used as name in foreign records format_options = format_options -- format options for format.string - disabled_records = disabled_records -- table of record keys that should be disabled (NOTE: Preliminary. Argument name may change in future releases.) + selected_record = selected_record -- id of (or reference to) record which is selected (optional, overrides "value" argument when not nil) + disabled_records = disabled_records -- table with ids of (or references to) records that should be disabled (stored as table keys mapped to true) } This function inserts a select field in the active slot. For description of the generic field helper arguments, see help for ui.autofield{...}. @@ -50,14 +51,34 @@ ) } end + local one_selected = false for idx, record in ipairs(foreign_records) do local key = record[args.foreign_id] + local selected = false + if not one_selected then + if args.selected_record == nil then + if args.value == key then + selected = true + end + else + if args.selected_record == record or args.selected_record == key then + selected = true + end + end + one_selected = selected + end + local disabled = false + if args.disabled_records then + if args.disabled_records[record] or args.disabled_records[key] then + disabled = true + end + end ui.tag{ tag = "option", attr = { value = key, - disabled = ((args.disabled_records and args.disabled_records[key] and "1" ) or nil), - selected = ((key == args.value) and "selected" or nil) + disabled = disabled and "disabled" or nil, + selected = selected and "selected" or nil }, content = format.string( record[args.foreign_name],