webmcp

annotate framework/env/ui/field/select.lua @ 75:faedbc8615e0

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
author jbe
date Wed Jun 20 00:35:02 2012 +0200 (2012-06-20)
parents 9b93943e2e6e
children a6a00add617b
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

Impressum / About Us