| rev | line source | 
| jbe/bsw@0 | 1 --[[-- | 
| jbe/bsw@0 | 2 ui.autofield{ | 
| jbe/bsw@0 | 3   name           = name,               -- field name (also used by default as HTML name) | 
| jbe/bsw@0 | 4   html_name      = html_name,          -- explicit HTML name to be used instead of 'name' | 
| jbe/bsw@0 | 5   value          = nihil.lift(value),  -- initial value, nil causes automatic lookup of value, use nihil.lift(nil) for nil | 
| jbe/bsw@0 | 6   container_attr = container_attr,     -- extra HTML attributes for the container (div) enclosing field and label | 
| jbe/bsw@0 | 7   attr           = attr,               -- extra HTML attributes for the field | 
| jbe/bsw@0 | 8   label          = label,              -- text to be used as label for the input field | 
| jbe/bsw@0 | 9   label_attr     = label_attr,         -- extra HTML attributes for the label | 
| jbe/bsw@0 | 10   readonly       = readonly_flag       -- set to true, to force read-only mode | 
| jbe/bsw@0 | 11   record         = record,             -- record to be used, defaults to record given to ui.form{...} | 
| jbe/bsw@0 | 12   ...                                  -- extra arguments for applicable ui.field.* helpers | 
| jbe/bsw@0 | 13 } | 
| jbe/bsw@0 | 14 | 
| jbe/bsw@0 | 15 This function automatically selects a ui.field.* helper to be used for a field of a record. | 
| jbe/bsw@0 | 16 | 
| jbe/bsw@0 | 17 --]]-- | 
| jbe/bsw@0 | 18 | 
| jbe/bsw@0 | 19 function ui.autofield(args) | 
| jbe/bsw@0 | 20   local args = table.new(args) | 
| jbe/bsw@0 | 21   assert(args.name, "ui.autofield{...} needs a field 'name'.") | 
| jbe/bsw@0 | 22   if not args.record then | 
| jbe/bsw@0 | 23     local slot_state = slot.get_state_table() | 
| jbe/bsw@0 | 24     if not slot_state then | 
| jbe/bsw@0 | 25       error("ui.autofield{...} was called without an explicit record to be used, and is also not called inside a form.") | 
| jbe/bsw@0 | 26     elseif not slot_state.form_record then | 
| jbe/bsw@0 | 27       error("ui.autofield{...} was called without an explicit record to be used, and the form does not have a record assigned either.") | 
| jbe/bsw@0 | 28     else | 
| jbe/bsw@0 | 29       args.record = slot_state.form_record | 
| jbe/bsw@0 | 30     end | 
| jbe/bsw@0 | 31   end | 
| jbe/bsw@0 | 32   local class = args.record._class | 
| jbe/bsw@0 | 33   assert(class, "Used ui.autofield{...} on a record with no class information stored in the '_class' attribute.") | 
| jbe/bsw@0 | 34   local fields, field_info, ui_field_type, ui_field_options | 
| jbe/bsw@0 | 35   fields = class.fields | 
| jbe/bsw@0 | 36   if fields then | 
| jbe/bsw@0 | 37     field_info = fields[args.name] | 
| jbe/bsw@0 | 38   end | 
| jbe/bsw@0 | 39   if field_info then | 
| jbe/bsw@0 | 40     ui_field_type    = field_info.ui_field_type | 
| jbe/bsw@0 | 41     ui_field_options = table.new(field_info.ui_field_options) | 
| jbe/bsw@0 | 42   end | 
| jbe/bsw@0 | 43   if not ui_field_type then | 
| jbe/bsw@0 | 44     ui_field_type = "text" | 
| jbe/bsw@0 | 45   end | 
| jbe/bsw@0 | 46   if not ui_field_options then | 
| jbe/bsw@0 | 47     ui_field_options = {} | 
| jbe/bsw@0 | 48   end | 
| jbe/bsw@0 | 49   local ui_field_func = ui.field[ui_field_type] | 
| jbe/bsw@0 | 50   if not ui_field_func then | 
| jbe/bsw@0 | 51     error(string.format("Did not find ui.field helper of type %q.", ui_field_type)) | 
| jbe/bsw@0 | 52   end | 
| jbe/bsw@0 | 53   for key, value in pairs(ui_field_options) do | 
| jbe/bsw@0 | 54     if args[key] == nil then | 
| jbe/bsw@0 | 55       args[key] = value | 
| jbe/bsw@0 | 56     end | 
| jbe/bsw@0 | 57   end | 
| jbe/bsw@0 | 58   return ui_field_func(args) | 
| jbe/bsw@0 | 59 end |