jbe/bsw@0: --[[-- jbe/bsw@0: ui.autofield{ jbe/bsw@0: name = name, -- field name (also used by default as HTML name) jbe/bsw@0: html_name = html_name, -- explicit HTML name to be used instead of 'name' jbe/bsw@0: value = nihil.lift(value), -- initial value, nil causes automatic lookup of value, use nihil.lift(nil) for nil jbe/bsw@0: container_attr = container_attr, -- extra HTML attributes for the container (div) enclosing field and label jbe/bsw@0: attr = attr, -- extra HTML attributes for the field jbe/bsw@0: label = label, -- text to be used as label for the input field jbe/bsw@0: label_attr = label_attr, -- extra HTML attributes for the label jbe/bsw@0: readonly = readonly_flag -- set to true, to force read-only mode jbe/bsw@0: record = record, -- record to be used, defaults to record given to ui.form{...} jbe/bsw@0: ... -- extra arguments for applicable ui.field.* helpers jbe/bsw@0: } jbe/bsw@0: jbe/bsw@0: This function automatically selects a ui.field.* helper to be used for a field of a record. jbe/bsw@0: jbe/bsw@0: --]]-- jbe/bsw@0: jbe/bsw@0: function ui.autofield(args) jbe/bsw@0: local args = table.new(args) jbe/bsw@0: assert(args.name, "ui.autofield{...} needs a field 'name'.") jbe/bsw@0: if not args.record then jbe/bsw@0: local slot_state = slot.get_state_table() jbe/bsw@0: if not slot_state then jbe/bsw@0: error("ui.autofield{...} was called without an explicit record to be used, and is also not called inside a form.") jbe/bsw@0: elseif not slot_state.form_record then jbe/bsw@0: 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: else jbe/bsw@0: args.record = slot_state.form_record jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: local class = args.record._class jbe/bsw@0: assert(class, "Used ui.autofield{...} on a record with no class information stored in the '_class' attribute.") jbe/bsw@0: local fields, field_info, ui_field_type, ui_field_options jbe/bsw@0: fields = class.fields jbe/bsw@0: if fields then jbe/bsw@0: field_info = fields[args.name] jbe/bsw@0: end jbe/bsw@0: if field_info then jbe/bsw@0: ui_field_type = field_info.ui_field_type jbe/bsw@0: ui_field_options = table.new(field_info.ui_field_options) jbe/bsw@0: end jbe/bsw@0: if not ui_field_type then jbe/bsw@0: ui_field_type = "text" jbe/bsw@0: end jbe/bsw@0: if not ui_field_options then jbe/bsw@0: ui_field_options = {} jbe/bsw@0: end jbe/bsw@0: local ui_field_func = ui.field[ui_field_type] jbe/bsw@0: if not ui_field_func then jbe/bsw@0: error(string.format("Did not find ui.field helper of type %q.", ui_field_type)) jbe/bsw@0: end jbe/bsw@0: for key, value in pairs(ui_field_options) do jbe/bsw@0: if args[key] == nil then jbe/bsw@0: args[key] = value jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: return ui_field_func(args) jbe/bsw@0: end