webmcp
annotate framework/env/ui/multiselect.lua @ 2:72860d232f32
Version 1.0.2
Fixed bug with explicit garbage collection (requests > 256kB caused an error)
Views prefixed with an underscore can't be called externally
ui.paginate now displays the last page, if the selected page number is too high.
Fixed bug with explicit garbage collection (requests > 256kB caused an error)
Views prefixed with an underscore can't be called externally
ui.paginate now displays the last page, if the selected page number is too high.
author | jbe/bsw |
---|---|
date | Thu Dec 10 12:00:00 2009 +0100 (2009-12-10) |
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 |