webmcp

annotate framework/env/ui/multiselect.lua @ 412:7d43be9afa56

Improved memory cleanup in case of out-of-memory errors (PQnotifies and PQunescapeBytea)
author jbe
date Fri Jan 08 03:10:33 2016 +0100 (2016-01-08)
parents 81dfcfd960ed
children
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
poelzi@35 5 container2_attr = container2_attr, -- extra HTML attributes for the container (div) of the real element (in checkbox case only)
jbe/bsw@0 6 attr = attr, -- extra HTML attributes for the field
jbe/bsw@0 7 label = label, -- text to be used as label for the input field
jbe/bsw@0 8 label_attr = label_attr, -- extra HTML attributes for the label
jbe/bsw@0 9 readonly = readonly_flag -- set to true, to force read-only mode
jbe/bsw@0 10 foreign_records = foreign_records, -- list of records to be chosen from, or function returning such a list
jbe/bsw@0 11 foreign_id = foreign_id, -- name of id field in foreign records
jbe/bsw@0 12 foreign_name = foreign_name, -- name of field to be used as name in foreign records
jbe/bsw@0 13 selected_ids = selected_ids, -- list of ids of currently selected foreign records
jbe/bsw@0 14 connecting_records = connecting_records, -- list of connection entries, determining which foreign records are currently selected
jbe/bsw@0 15 own_id = own_id, -- TODO documentation needed
jbe/bsw@0 16 own_reference = own_reference, -- name of foreign key field in connecting records, which references the main record
jbe/bsw@0 17 foreign_reference = foreign_reference, -- name of foreign key field in connecting records, which references foreign records
jbe/bsw@0 18 format_options = format_options -- format options for format.string
jbe/bsw@0 19 }
jbe/bsw@0 20
jbe/bsw@0 21 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 22
jbe/bsw@0 23 --]]--
jbe/bsw@0 24
jbe/bsw@0 25 function ui.multiselect(args)
jbe/bsw@0 26 local style = args.style or "checkbox"
jbe/bsw@0 27 local extra_args = { fetch_record = true }
jbe/bsw@0 28 if not args.readonly and args.style == "checkbox" then
jbe/bsw@0 29 extra_args.disable_label_for_id = true
jbe/bsw@0 30 end
jbe/bsw@0 31 ui.form_element(args, extra_args, function(args)
jbe/bsw@0 32 local foreign_records = args.foreign_records
jbe/bsw@0 33 if type(foreign_records) == "function" then
jbe/bsw@0 34 foreign_records = foreign_records(args.record)
jbe/bsw@0 35 end
jbe/bsw@0 36 local connecting_records = args.connecting_records
jbe/bsw@0 37 if type(connecting_records) == "function" then
jbe/bsw@0 38 connecting_records = connecting_records(args.record)
jbe/bsw@0 39 end
jbe/bsw@0 40 local select_hash = {}
jbe/bsw@0 41 if args.selected_ids then
jbe/bsw@0 42 for idx, selected_id in ipairs(args.selected_ids) do
jbe/bsw@0 43 select_hash[selected_id] = true
jbe/bsw@0 44 end
jbe/bsw@0 45 elseif args.own_reference then
jbe/bsw@0 46 for idx, connecting_record in ipairs(args.connecting_records) do
jbe/bsw@0 47 if connecting_record[args.own_reference] == args.record[args.own_id] then
jbe/bsw@0 48 select_hash[connecting_record[args.foreign_reference]] = true
jbe/bsw@0 49 end
jbe/bsw@0 50 end
jbe/bsw@0 51 else
jbe/bsw@0 52 for idx, connecting_record in ipairs(args.connecting_records) do
jbe/bsw@0 53 select_hash[connecting_record[args.foreign_reference]] = true
jbe/bsw@0 54 end
jbe/bsw@0 55 end
jbe/bsw@0 56 local attr = table.new(args.attr)
jbe/bsw@0 57 if not attr.class then
jbe/bsw@0 58 attr.class = "ui_multi_selection"
jbe/bsw@0 59 end
jbe/bsw@0 60 if args.readonly then
jbe/bsw@0 61 ui.tag{
jbe/bsw@0 62 tag = "ul",
jbe/bsw@0 63 attr = attr,
jbe/bsw@0 64 content = function()
jbe/bsw@0 65 for idx, record in ipairs(foreign_records) do
jbe/bsw@0 66 if select_hash[record[args.foreign_id]] then
jbe/bsw@0 67 ui.tag{
jbe/bsw@0 68 tag = "li",
jbe/bsw@0 69 content = format.string(
jbe/bsw@0 70 record[args.foreign_name],
jbe/bsw@0 71 args.format_options
jbe/bsw@0 72 )
jbe/bsw@0 73 }
jbe/bsw@0 74 end
jbe/bsw@0 75 end
jbe/bsw@0 76 end
jbe/bsw@0 77 }
jbe/bsw@0 78 elseif style == "select" then
jbe/bsw@0 79 attr.name = args.name
jbe/bsw@0 80 attr.multiple = "multiple"
jbe/bsw@0 81 ui.tag{
jbe/bsw@0 82 tag = "select",
jbe/bsw@0 83 attr = attr,
jbe/bsw@0 84 content = function()
jbe/bsw@0 85 if args.nil_as then
jbe/bsw@0 86 ui.tag{
jbe/bsw@0 87 tag = "option",
jbe/bsw@0 88 attr = { value = "" },
jbe/bsw@0 89 content = format.string(
jbe/bsw@0 90 args.nil_as,
jbe/bsw@0 91 args.format_options
jbe/bsw@0 92 )
jbe/bsw@0 93 }
jbe/bsw@0 94 end
jbe/bsw@0 95 for idx, record in ipairs(foreign_records) do
jbe/bsw@0 96 local key = record[args.foreign_id]
jbe/bsw@0 97 local selected = select_hash[key]
jbe/bsw@0 98 ui.tag{
jbe/bsw@0 99 tag = "option",
jbe/bsw@0 100 attr = {
jbe/bsw@0 101 value = key,
jbe/bsw@0 102 selected = (selected and "selected" or nil)
jbe/bsw@0 103 },
jbe/bsw@0 104 content = format.string(
jbe/bsw@0 105 record[args.foreign_name],
jbe/bsw@0 106 args.format_options
jbe/bsw@0 107 )
jbe/bsw@0 108 }
jbe/bsw@0 109 end
jbe/bsw@0 110 end
jbe/bsw@0 111 }
jbe/bsw@0 112 elseif style == "checkbox" then
jbe/bsw@0 113 attr.type = "checkbox"
jbe/bsw@0 114 attr.name = args.name
jbe/bsw@0 115 for idx, record in ipairs(foreign_records) do
jbe/bsw@0 116 local key = record[args.foreign_id]
jbe/bsw@0 117 local selected = select_hash[key]
jbe/bsw@0 118 attr.id = ui.create_unique_id()
jbe/bsw@0 119 attr.value = key
jbe/bsw@0 120 attr.checked = selected and "checked" or nil
jbe/bsw@0 121 ui.container{
jbe/bsw@0 122 label = format.string(
jbe/bsw@0 123 record[args.foreign_name],
jbe/bsw@0 124 args.format_options
jbe/bsw@0 125 ),
poelzi@35 126 attr = args.container2_attr or { class = "ui_checkbox_div" },
jbe/bsw@0 127 label_for = attr.id,
poelzi@35 128 label_attr = args.label_attr or { class = "ui_checkbox_label" },
jbe/bsw@0 129 content_first = true,
jbe/bsw@0 130 content = function()
jbe/bsw@0 131 ui.tag{ tag = "input", attr = attr }
jbe/bsw@0 132 end
jbe/bsw@0 133 }
jbe/bsw@0 134 end
jbe/bsw@0 135 else
jbe/bsw@0 136 error("'style' attribute for ui.multiselect{...} must be set to \"select\", \"checkbox\" or nil.")
jbe/bsw@0 137 end
jbe/bsw@0 138 end)
jbe/bsw@0 139 end

Impressum / About Us