util/dataforms.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 04 Apr 2009 16:23:32 +0100
changeset 952 ef648f49e734
parent 951 4b9207949735
child 953 bed748f5dbb1
permissions -rw-r--r--
util.dataforms: Add support for <required/> fields
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
     1
local setmetatable = setmetatable;
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
     2
local pairs, ipairs = pairs, ipairs;
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
     3
local st = require "util.stanza";
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
module "dataforms"
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
local xmlns_forms = 'jabber:x:data';
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
local form_t = {};
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
local form_mt = { __index = form_t };
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
function new(layout)
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
	return setmetatable(layout, form_mt);
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
local form_x_attr = { xmlns = xmlns_forms };
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
function form_t.form(layout, data)
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    19
	local form = st.stanza("x", form_x_attr);
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    20
	if layout.title then
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    21
		form:tag("title"):text(layout.title):up();
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    22
	end
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    23
	if layout.instructions then
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    24
		form:tag("instructions"):text(layout.instructions):up();
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    25
	end
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
	for n, field in ipairs(layout) do
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    27
		local field_type = field.type or "text-single";
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
		-- Add field tag
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    29
		form:tag("field", { type = field_type, var = field.name, label = field.label });
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
		local value = data[field.name];
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
		
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
		-- Add value, depending on type
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
		if field_type == "hidden" then
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
			if type(value) == "table" then
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
				-- Assume an XML snippet
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
				form:add_child(value);
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
			elseif value then
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
				form:text(tostring(value));
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
			end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
		elseif field_type == "boolean" then
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    42
			form:tag("value"):text((value and "1") or "0");
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    43
		elseif field_type == "fixed" then
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
			
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
		elseif field_type == "jid-multi" then
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
			for _, jid in ipairs(value) do
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
				form:tag("value"):text(jid):up();
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
			end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
		elseif field_type == "jid-single" then
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
			form:tag("value"):text(value):up();
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    51
		elseif field_type == "text-single" or field_type == "text-private" then
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    52
			form:tag("value"):text(value):up();
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    53
		elseif field_type == "text-multi" then
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    54
			-- Split into multiple <value> tags, one for each line
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    55
			for line in value:gmatch("([^\r\n]+)\r?\n*") do
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    56
				form:tag("value"):text(line):up();
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    57
			end
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
		end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
		
952
ef648f49e734 util.dataforms: Add support for <required/> fields
Matthew Wild <mwild1@gmail.com>
parents: 951
diff changeset
    60
		if field.required then
ef648f49e734 util.dataforms: Add support for <required/> fields
Matthew Wild <mwild1@gmail.com>
parents: 951
diff changeset
    61
			form:tag("required"):up();
ef648f49e734 util.dataforms: Add support for <required/> fields
Matthew Wild <mwild1@gmail.com>
parents: 951
diff changeset
    62
		end
ef648f49e734 util.dataforms: Add support for <required/> fields
Matthew Wild <mwild1@gmail.com>
parents: 951
diff changeset
    63
		
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
		-- Jump back up to list of fields
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
		form:up();
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
	end
851
b48c7ed3f7f8 util.dataforms: Return the form
Matthew Wild <mwild1@gmail.com>
parents: 845
diff changeset
    67
	return form;
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
function form_t.data(layout, stanza)
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
	
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    74
return _M;
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    77
--[=[
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
Layout:
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
{
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
	title = "MUC Configuration",
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
	instructions = [[Use this form to configure options for this MUC room.]],
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
	{ name = "FORM_TYPE", type = "hidden", required = true };
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
	{ name = "field-name", type = "field-type", required = false };
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    87
}
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    90
--]=]