webmcp
annotate framework/env/ui/multiselect.lua @ 6:5cba83b3f411
Version 1.0.6
Bugfix: class_prototype:add_reference{...} uses now qualified names in SQL queries to allow JOINs
Fixes in the documentation of slot.put_into and trace.debug
Bugfix: class_prototype:add_reference{...} uses now qualified names in SQL queries to allow JOINs
Fixes in the documentation of slot.put_into and trace.debug
| author | jbe/bsw | 
|---|---|
| date | Fri Jan 22 12:00:00 2010 +0100 (2010-01-22) | 
| parents | 9fdfb27f8e67 | 
| children | 81dfcfd960ed | 
| rev | line source | 
|---|---|
| jbe/bsw@0 | 1 --[[-- | 
| jbe/bsw@0 | 2 ui.multiselect{ | 
| jbe/bsw@0 | 3 name = name, -- HTML name ('html_name' is NOT a valid argument for this function) | 
| jbe/bsw@0 | 4 container_attr = container_attr, -- extra HTML attributes for the container (div) enclosing field and label | 
| jbe/bsw@0 | 5 attr = attr, -- extra HTML attributes for the field | 
| jbe/bsw@0 | 6 label = label, -- text to be used as label for the input field | 
| jbe/bsw@0 | 7 label_attr = label_attr, -- extra HTML attributes for the label | 
| jbe/bsw@0 | 8 readonly = readonly_flag -- set to true, to force read-only mode | 
| jbe/bsw@0 | 9 foreign_records = foreign_records, -- list of records to be chosen from, or function returning such a list | 
| jbe/bsw@0 | 10 foreign_id = foreign_id, -- name of id field in foreign records | 
| jbe/bsw@0 | 11 foreign_name = foreign_name, -- name of field to be used as name in foreign records | 
| jbe/bsw@0 | 12 selected_ids = selected_ids, -- list of ids of currently selected foreign records | 
| jbe/bsw@0 | 13 connecting_records = connecting_records, -- list of connection entries, determining which foreign records are currently selected | 
| jbe/bsw@0 | 14 own_id = own_id, -- TODO documentation needed | 
| jbe/bsw@0 | 15 own_reference = own_reference, -- name of foreign key field in connecting records, which references the main record | 
| jbe/bsw@0 | 16 foreign_reference = foreign_reference, -- name of foreign key field in connecting records, which references foreign records | 
| jbe/bsw@0 | 17 format_options = format_options -- format options for format.string | 
| jbe/bsw@0 | 18 } | 
| jbe/bsw@0 | 19 | 
| jbe/bsw@0 | 20 This function inserts a select field with possibility of multiple selections in the active slot. This function does not reside within ui.field.*, because multiple selections are not stored within a field of a record, but within a different SQL table. Note that 'html_name' is NOT a valid argument to this function. For description of the generic field helper arguments, see help for ui.autofield{...}. | 
| jbe/bsw@0 | 21 | 
| jbe/bsw@0 | 22 --]]-- | 
| jbe/bsw@0 | 23 | 
| jbe/bsw@0 | 24 function ui.multiselect(args) | 
| jbe/bsw@0 | 25 local style = args.style or "checkbox" | 
| jbe/bsw@0 | 26 local extra_args = { fetch_record = true } | 
| jbe/bsw@0 | 27 if not args.readonly and args.style == "checkbox" then | 
| jbe/bsw@0 | 28 extra_args.disable_label_for_id = true | 
| jbe/bsw@0 | 29 end | 
| jbe/bsw@0 | 30 ui.form_element(args, extra_args, function(args) | 
| jbe/bsw@0 | 31 local foreign_records = args.foreign_records | 
| jbe/bsw@0 | 32 if type(foreign_records) == "function" then | 
| jbe/bsw@0 | 33 foreign_records = foreign_records(args.record) | 
| jbe/bsw@0 | 34 end | 
| jbe/bsw@0 | 35 local connecting_records = args.connecting_records | 
| jbe/bsw@0 | 36 if type(connecting_records) == "function" then | 
| jbe/bsw@0 | 37 connecting_records = connecting_records(args.record) | 
| jbe/bsw@0 | 38 end | 
| jbe/bsw@0 | 39 local select_hash = {} | 
| jbe/bsw@0 | 40 if args.selected_ids then | 
| jbe/bsw@0 | 41 for idx, selected_id in ipairs(args.selected_ids) do | 
| jbe/bsw@0 | 42 select_hash[selected_id] = true | 
| jbe/bsw@0 | 43 end | 
| jbe/bsw@0 | 44 elseif args.own_reference then | 
| jbe/bsw@0 | 45 for idx, connecting_record in ipairs(args.connecting_records) do | 
| jbe/bsw@0 | 46 if connecting_record[args.own_reference] == args.record[args.own_id] then | 
| jbe/bsw@0 | 47 select_hash[connecting_record[args.foreign_reference]] = true | 
| jbe/bsw@0 | 48 end | 
| jbe/bsw@0 | 49 end | 
| jbe/bsw@0 | 50 else | 
| jbe/bsw@0 | 51 for idx, connecting_record in ipairs(args.connecting_records) do | 
| jbe/bsw@0 | 52 select_hash[connecting_record[args.foreign_reference]] = true | 
| jbe/bsw@0 | 53 end | 
| jbe/bsw@0 | 54 end | 
| jbe/bsw@0 | 55 local attr = table.new(args.attr) | 
| jbe/bsw@0 | 56 if not attr.class then | 
| jbe/bsw@0 | 57 attr.class = "ui_multi_selection" | 
| jbe/bsw@0 | 58 end | 
| jbe/bsw@0 | 59 if args.readonly then | 
| jbe/bsw@0 | 60 ui.tag{ | 
| jbe/bsw@0 | 61 tag = "ul", | 
| jbe/bsw@0 | 62 attr = attr, | 
| jbe/bsw@0 | 63 content = function() | 
| jbe/bsw@0 | 64 for idx, record in ipairs(foreign_records) do | 
| jbe/bsw@0 | 65 if select_hash[record[args.foreign_id]] then | 
| jbe/bsw@0 | 66 ui.tag{ | 
| jbe/bsw@0 | 67 tag = "li", | 
| jbe/bsw@0 | 68 content = format.string( | 
| jbe/bsw@0 | 69 record[args.foreign_name], | 
| jbe/bsw@0 | 70 args.format_options | 
| jbe/bsw@0 | 71 ) | 
| jbe/bsw@0 | 72 } | 
| jbe/bsw@0 | 73 end | 
| jbe/bsw@0 | 74 end | 
| jbe/bsw@0 | 75 end | 
| jbe/bsw@0 | 76 } | 
| jbe/bsw@0 | 77 elseif style == "select" then | 
| jbe/bsw@0 | 78 attr.name = args.name | 
| jbe/bsw@0 | 79 attr.multiple = "multiple" | 
| jbe/bsw@0 | 80 ui.tag{ | 
| jbe/bsw@0 | 81 tag = "select", | 
| jbe/bsw@0 | 82 attr = attr, | 
| jbe/bsw@0 | 83 content = function() | 
| jbe/bsw@0 | 84 if args.nil_as then | 
| jbe/bsw@0 | 85 ui.tag{ | 
| jbe/bsw@0 | 86 tag = "option", | 
| jbe/bsw@0 | 87 attr = { value = "" }, | 
| jbe/bsw@0 | 88 content = format.string( | 
| jbe/bsw@0 | 89 args.nil_as, | 
| jbe/bsw@0 | 90 args.format_options | 
| jbe/bsw@0 | 91 ) | 
| jbe/bsw@0 | 92 } | 
| jbe/bsw@0 | 93 end | 
| jbe/bsw@0 | 94 for idx, record in ipairs(foreign_records) do | 
| jbe/bsw@0 | 95 local key = record[args.foreign_id] | 
| jbe/bsw@0 | 96 local selected = select_hash[key] | 
| jbe/bsw@0 | 97 ui.tag{ | 
| jbe/bsw@0 | 98 tag = "option", | 
| jbe/bsw@0 | 99 attr = { | 
| jbe/bsw@0 | 100 value = key, | 
| jbe/bsw@0 | 101 selected = (selected and "selected" or nil) | 
| jbe/bsw@0 | 102 }, | 
| jbe/bsw@0 | 103 content = format.string( | 
| jbe/bsw@0 | 104 record[args.foreign_name], | 
| jbe/bsw@0 | 105 args.format_options | 
| jbe/bsw@0 | 106 ) | 
| jbe/bsw@0 | 107 } | 
| jbe/bsw@0 | 108 end | 
| jbe/bsw@0 | 109 end | 
| jbe/bsw@0 | 110 } | 
| jbe/bsw@0 | 111 elseif style == "checkbox" then | 
| jbe/bsw@0 | 112 attr.type = "checkbox" | 
| jbe/bsw@0 | 113 attr.name = args.name | 
| jbe/bsw@0 | 114 for idx, record in ipairs(foreign_records) do | 
| jbe/bsw@0 | 115 local key = record[args.foreign_id] | 
| jbe/bsw@0 | 116 local selected = select_hash[key] | 
| jbe/bsw@0 | 117 attr.id = ui.create_unique_id() | 
| jbe/bsw@0 | 118 attr.value = key | 
| jbe/bsw@0 | 119 attr.checked = selected and "checked" or nil | 
| jbe/bsw@0 | 120 ui.container{ | 
| jbe/bsw@0 | 121 label = format.string( | 
| jbe/bsw@0 | 122 record[args.foreign_name], | 
| jbe/bsw@0 | 123 args.format_options | 
| jbe/bsw@0 | 124 ), | 
| jbe/bsw@0 | 125 attr = { class = "ui_checkbox_div" }, | 
| jbe/bsw@0 | 126 label_for = attr.id, | 
| jbe/bsw@0 | 127 label_attr = { class = "ui_checkbox_label" }, | 
| jbe/bsw@0 | 128 content_first = true, | 
| jbe/bsw@0 | 129 content = function() | 
| jbe/bsw@0 | 130 ui.tag{ tag = "input", attr = attr } | 
| jbe/bsw@0 | 131 end | 
| jbe/bsw@0 | 132 } | 
| jbe/bsw@0 | 133 end | 
| jbe/bsw@0 | 134 else | 
| jbe/bsw@0 | 135 error("'style' attribute for ui.multiselect{...} must be set to \"select\", \"checkbox\" or nil.") | 
| jbe/bsw@0 | 136 end | 
| jbe/bsw@0 | 137 end) | 
| jbe/bsw@0 | 138 end |