jbe/bsw@0: --[[-- jbe/bsw@0: ui.form_element( jbe/bsw@0: args, -- external arguments jbe/bsw@0: { -- options for this function call jbe/bsw@0: fetch_value = fetch_value_flag, -- true causes automatic determination of args.value, if nil jbe/bsw@0: fetch_record = fetch_record_flag, -- true causes automatic determination of args.record, if nil jbe/bsw@0: disable_label_for_id = disable_label_for_id_flag, -- true suppresses automatic setting of args.attr.id for a HTML label_for reference jbe/bsw@0: }, jbe/bsw@0: function(args) jbe/bsw@0: ... -- program code jbe/bsw@0: end jbe/bsw@0: ) jbe/bsw@0: jbe/bsw@0: This function helps other form helpers by preprocessing arguments passed to the helper, e.g. fetching a value from a record stored in a state-table of the currently active slot. jbe/bsw@0: jbe/bsw@0: --]]-- jbe/bsw@0: jbe/bsw@0: -- TODO: better documentation jbe/bsw@0: jbe/bsw@0: function ui.form_element(args, extra_args, func) jbe/bsw@0: local args = table.new(args) jbe/bsw@0: if extra_args then jbe/bsw@0: for key, value in pairs(extra_args) do jbe/bsw@0: args[key] = value jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: local slot_state = slot.get_state_table() jbe/bsw@0: args.html_name = args.html_name or args.name jbe/bsw@0: if args.fetch_value then jbe/bsw@0: if args.value == nil then jbe/bsw@0: if not args.record and slot_state then jbe/bsw@0: args.record = slot_state.form_record jbe/bsw@0: end jbe/bsw@0: if args.record then jbe/bsw@0: args.value = args.record[args.name] jbe/bsw@0: end jbe/bsw@0: else jbe/bsw@0: args.value = nihil.lower(args.value) jbe/bsw@0: end jbe/bsw@0: elseif args.fetch_record then jbe/bsw@0: if not args.record and slot_state then jbe/bsw@0: args.record = slot_state.form_record jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: if jbe/bsw@0: args.html_name and jbe/bsw@0: not args.readonly and jbe/bsw@0: slot_state.form_readonly == false jbe/bsw@0: then jbe/bsw@0: args.readonly = false jbe/bsw@0: local prefix jbe/bsw@0: if args.html_name_prefix == nil then jbe/bsw@0: prefix = slot_state.html_name_prefix jbe/bsw@0: else jbe/bsw@0: prefix = args.html_name_prefix jbe/bsw@0: end jbe/bsw@0: if prefix then jbe/bsw@0: args.html_name = prefix .. args.html_name jbe/bsw@0: end jbe/bsw@0: else jbe/bsw@0: args.readonly = true jbe/bsw@0: end jbe/bsw@0: if args.label then jbe/bsw@0: if not args.disable_label_for_id then jbe/bsw@0: if not args.attr then jbe/bsw@0: args.attr = { id = ui.create_unique_id() } jbe/bsw@0: elseif not args.attr.id then jbe/bsw@0: args.attr.id = ui.create_unique_id() jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: if not args.label_attr then jbe/bsw@0: args.label_attr = { class = "ui_field_label" } jbe/bsw@0: elseif not args.label_attr.class then jbe/bsw@0: args.label_attr.class = "ui_field_label" jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: ui.container{ jbe/bsw@0: auto_args = args, jbe/bsw@0: content = function() return func(args) end jbe/bsw@0: } jbe/bsw@0: end