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