mod_adhoc: Add support for commands only executable by global administrators
[prosody.git] / util / dataforms.lua
index f71ceb466a27f3554e94e4125b9fdf1ca663fbdb..ae745e03ed334d08c4ef9d284ce900b69527943f 100644 (file)
@@ -1,6 +1,6 @@
 -- Prosody IM
--- Copyright (C) 2008-2009 Matthew Wild
--- Copyright (C) 2008-2009 Waqas Hussain
+-- Copyright (C) 2008-2010 Matthew Wild
+-- Copyright (C) 2008-2010 Waqas Hussain
 -- 
 -- This project is MIT/X11 licensed. Please see the
 -- COPYING file in the source package for more information.
@@ -23,8 +23,8 @@ function new(layout)
        return setmetatable(layout, form_mt);
 end
 
-function form_t.form(layout, data)
-       local form = st.stanza("x", { xmlns = xmlns_forms, type = "form" });
+function form_t.form(layout, data, formtype)
+       local form = st.stanza("x", { xmlns = xmlns_forms, type = formtype or "form" });
        if layout.title then
                form:tag("title"):text(layout.title):up();
        end
@@ -67,9 +67,25 @@ function form_t.form(layout, data)
                                        form:tag("value"):text(line):up();
                                end
                        elseif field_type == "list-single" then
+                               local has_default = false;
                                for _, val in ipairs(value) do
                                        if type(val) == "table" then
                                                form:tag("option", { label = val.label }):tag("value"):text(val.value):up():up();
+                                               if val.default and (not has_default) then
+                                                       form:tag("value"):text(val.value):up();
+                                                       has_default = true;
+                                               end
+                                       else
+                                               form:tag("option", { label= val }):tag("value"):text(tostring(val)):up():up();
+                                       end
+                               end
+                       elseif field_type == "list-multi" then
+                               for _, val in ipairs(value) do
+                                       if type(val) == "table" then
+                                               form:tag("option", { label = val.label }):tag("value"):text(val.value):up():up();
+                                               if val.default then
+                                                       form:tag("value"):text(val.value):up();
+                                               end
                                        else
                                                form:tag("option", { label= val }):tag("value"):text(tostring(val)):up():up();
                                        end
@@ -93,7 +109,13 @@ function form_t.data(layout, stanza)
        local data = {};
        
        for field_tag in stanza:childtags() do
-               local field_type = field_tag.attr.type;
+               local field_type;
+               for n, field in ipairs(layout) do
+                       if field.name == field_tag.attr.var then
+                               field_type = field.type;
+                               break;
+                       end
+               end
                
                local reader = field_readers[field_type];
                if reader then
@@ -104,7 +126,7 @@ function form_t.data(layout, stanza)
        return data;
 end
 
-field_readers["text-single"] = 
+field_readers["text-single"] =
        function (field_tag)
                local value = field_tag:child_with_name("value");
                if value then
@@ -112,13 +134,24 @@ field_readers["text-single"] =
                end
        end
 
-field_readers["text-private"] = 
+field_readers["text-private"] =
        field_readers["text-single"];
 
 field_readers["jid-single"] =
        field_readers["text-single"];
 
-field_readers["text-multi"] = 
+field_readers["jid-multi"] =
+       function (field_tag)
+               local result = {};
+               for value_tag in field_tag:childtags() do
+                       if value_tag.name == "value" then
+                               result[#result+1] = value_tag[1];
+                       end
+               end
+               return result;
+       end
+
+field_readers["text-multi"] =
        function (field_tag)
                local result = {};
                for value_tag in field_tag:childtags() do
@@ -132,7 +165,18 @@ field_readers["text-multi"] =
 field_readers["list-single"] =
        field_readers["text-single"];
 
-field_readers["boolean"] = 
+field_readers["list-multi"] =
+       function (field_tag)
+               local result = {};
+               for value_tag in field_tag:childtags() do
+                       if value_tag.name == "value" then
+                               result[#result+1] = value_tag[1];
+                       end
+               end
+               return result;
+       end
+
+field_readers["boolean"] =
        function (field_tag)
                local value = field_tag:child_with_name("value");
                if value then
@@ -141,10 +185,10 @@ field_readers["boolean"] =
                        else
                                return false;
                        end
-               end             
+               end
        end
 
-field_readers["hidden"] = 
+field_readers["hidden"] =
        function (field_tag)
                local value = field_tag:child_with_name("value");
                if value then