webmcp

annotate framework/env/ui/multiselect.lua @ 0:9fdfb27f8e67

Version 1.0.0
author jbe/bsw
date Sun Oct 25 12:00:00 2009 +0100 (2009-10-25)
parents
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

Impressum / About Us