20 local form_t = {}; |
20 local form_t = {}; |
21 local form_mt = { __index = form_t }; |
21 local form_mt = { __index = form_t }; |
22 |
22 |
23 function new(layout) |
23 function new(layout) |
24 return setmetatable(layout, form_mt); |
24 return setmetatable(layout, form_mt); |
|
25 end |
|
26 |
|
27 function from_stanza(stanza) |
|
28 local layout = { |
|
29 title = stanza:get_child_text("title"); |
|
30 instructions = stanza:get_child_text("instructions"); |
|
31 }; |
|
32 for tag in stanza:childtags("field") do |
|
33 local field = { |
|
34 name = tag.attr.var; |
|
35 label = tag.attr.label; |
|
36 type = tag.attr.type; |
|
37 required = tag:get_child("required") and true or nil; |
|
38 value = tag:get_child_text("value"); |
|
39 }; |
|
40 layout[#layout+1] = field; |
|
41 if field.type then |
|
42 local value = {}; |
|
43 if field.type:match"list%-" then |
|
44 for tag in tag:childtags("option") do |
|
45 value[#value+1] = { label = tag.attr.label, value = tag:get_child_text("value") }; |
|
46 end |
|
47 for tag in tag:childtags("value") do |
|
48 value[#value+1] = { label = tag.attr.label, value = tag:get_text(), default = true }; |
|
49 end |
|
50 elseif field.type:match"%-multi" then |
|
51 for tag in tag:childtags("value") do |
|
52 value[#value+1] = tag.attr.label and { label = tag.attr.label, value = tag:get_text() } or tag:get_text(); |
|
53 end |
|
54 if field.type == "text-multi" then |
|
55 field.value = t_concat(value, "\n"); |
|
56 else |
|
57 field.value = value; |
|
58 end |
|
59 end |
|
60 end |
|
61 end |
|
62 return new(layout); |
25 end |
63 end |
26 |
64 |
27 function form_t.form(layout, data, formtype) |
65 function form_t.form(layout, data, formtype) |
28 local form = st.stanza("x", { xmlns = xmlns_forms, type = formtype or "form" }); |
66 local form = st.stanza("x", { xmlns = xmlns_forms, type = formtype or "form" }); |
29 if layout.title then |
67 if layout.title then |