util.dataforms: Allow separation of options from values in list fields
[prosody.git] / util / dataforms.lua
index 05846ab3a5b58614df89ba1c779ecc848d096b36..685f3aaf298b2f1f5975f5f85bc0f935320ec263 100644 (file)
@@ -69,10 +69,10 @@ function form_t.form(layout, data, formtype)
                                end
                        elseif field_type == "list-single" then
                                local has_default = false;
-                               for _, val in ipairs(value) do
+                               for _, val in ipairs(field.options or 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
+                                               if value == val.value or field.options and val.default and (not has_default) then
                                                        form:tag("value"):text(val.value):up();
                                                        has_default = true;
                                                end
@@ -80,17 +80,25 @@ function form_t.form(layout, data, formtype)
                                                form:tag("option", { label= val }):tag("value"):text(tostring(val)):up():up();
                                        end
                                end
+                               if field.options and value then
+                                       form:tag("value"):text(value):up();
+                               end
                        elseif field_type == "list-multi" then
-                               for _, val in ipairs(value) do
+                               for _, val in ipairs(field.options or value) do
                                        if type(val) == "table" then
                                                form:tag("option", { label = val.label }):tag("value"):text(val.value):up():up();
-                                               if val.default then
+                                               if not field.options and 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
                                end
+                               if field.options and value then
+                                       for _, val in ipairs(value) do
+                                               form:tag("value"):text(val):up();
+                                       end
+                               end
                        end
                end
 
@@ -118,6 +126,7 @@ local field_readers = {};
 function form_t.data(layout, stanza)
        local data = {};
        local errors = {};
+       local present = {};
 
        for _, field in ipairs(layout) do
                local tag;
@@ -133,6 +142,7 @@ function form_t.data(layout, stanza)
                                errors[field.name] = "Required value missing";
                        end
                else
+                       present[field.name] = true;
                        local reader = field_readers[field.type];
                        if reader then
                                data[field.name], errors[field.name] = reader(tag, field.required);
@@ -140,9 +150,9 @@ function form_t.data(layout, stanza)
                end
        end
        if next(errors) then
-               return data, errors;
+               return data, errors, present;
        end
-       return data;
+       return data, nil, present;
 end
 
 local function simple_text(field_tag, required)