examples/x_data.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Sat, 28 Mar 2009 19:43:12 +0200
changeset 67 d33ca5572e91
parent 66 542f61e113cb
permissions -rw-r--r--
Fully object forms interface (untested)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
-- DATA FORMS (XEP-0004)
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
-- library
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
     6
local form_field = require 'form_field'
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
     8
--
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    10
local F = { }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    11
local M = { }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    12
M.__index = M
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    14
-- form.new       -- new form
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    15
-- form.parse     -- parse existing form -- according to form type!
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    16
-- form:type      -- get type
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    17
-- form:desc      -- get title, instructions
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    18
-- form:format    -- format form -- according to form type!
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    19
-- form:fields    -- iterator, returns field objects
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    20
-- form:add       -- create field
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    21
-- form:field     -- get field
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    22
-- ?? form:del    -- delete field
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    23
-- field.new      -- create field
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    24
-- field:index    -- get index
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    25
-- field:type     -- get type
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    26
-- field:name     -- get var
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    27
-- field:desc     -- get label, desc
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    28
-- field:value    -- get/set value
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    29
-- field:values   -- get values
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    30
-- field:clear    -- clear value
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    31
-- field:options  -- get options
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    32
-- field:required -- get required
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    33
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    34
-- form    may have 'fixed' fields and should be ordered
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    35
-- submit  must not have 'fixed' fields and may be not ordered
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    36
-- cancel  must not have anything
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    37
-- result  should not have 'fixed', may be not ordered and can contain reported/item... multiple instances.
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    38
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    39
function F.new ( args )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    40
	local form  = {
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    41
		xmlns        = 'jabber:x:data',
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    42
		ftype        = args.type or 'form',
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    43
		title        = args.title,
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    44
		instructions = args.instructions,
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    45
		f            = { },
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    46
	}
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    47
	setmetatable ( form, M )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    48
	return form
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    51
function F.parse ( x )
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
	local title = x:child ( 'title' )
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
	if title then
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    54
		title = title:value ()
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
	end
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    56
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
	local instructions = x:child ( 'instructions' )
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
	if instructions then
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    59
		instructions = instructions:value ()
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
	end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    62
	local f = F.new { type = x:attribute ( 'type' ), title = title, instructions = instructions }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    63
66
542f61e113cb Modularization, I
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    64
	local field = x:child ()
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
	while field do
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    66
		local name = field:name ()
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    67
		if name == 'field' then
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
			local ftype = field:attribute ( 'type' ) or 'text-single'
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    69
			local var   = field:attribute ( 'var' )
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
			local r = {
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
				type  = ftype,
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
				label = field:attribute ( 'label' ),
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
			}
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
			local desc = field:child ( 'desc' )
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
			if desc then
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    77
				r.desc = desc:value ()
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
			end
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    79
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
			if field:child ( 'required' ) then
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
				r.required = true
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
			end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
			if ftype == 'jid-multi' or ftype == 'list-multi' or ftype == 'text-multi' or ftype == 'list-single' then
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
				local values  = { }
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
				local options = { }
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
66
542f61e113cb Modularization, I
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    88
				local item = field:child ()
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
				while item do
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
					local name = item:name ()
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
					if name == 'value' then
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
						table.insert ( values, item:value () )
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
					elseif name == 'option' then
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    94
						options[item:child( 'value' ):value ()] = item:attribute ( 'label' ) or ''
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
					end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
					item = item:next ()
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
				end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
				if ftype == 'list-single' then
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
					local value = field:child ( 'value' )
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   101
					if value then
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
						r.value = value:value ()
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
					end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
				else
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
					r.value = values
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
				end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
				if ftype == 'list-multi' or ftype == 'list-single' then
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
					r.options = options
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   110
				end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   111
			else
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   112
				local value = field:child ( 'value' )
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   113
				if value then
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   114
					r.value = value:value ()
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   115
				end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   116
			end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   118
			f:add ( var, r )
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
		end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
		field = field:next ()
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
	end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
	return f
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   127
function M.type ( form )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   128
	return form.ftype
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   129
end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   130
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   131
function M.desc ( form )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   132
	return form.title, form.instructions
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   135
function M.format ( form, root, format_as )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   136
	local ft = format_as or form:type ()
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   137
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   138
	root.x = { xmlns = 'jabber:x:data', type = ft }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   139
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   140
	if ft == 'cancel' then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   141
		return root
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   142
	end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   143
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   144
	if ft == 'form' then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   145
		local title, instructions = form:desc ()
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   146
		if title then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   147
			root.x.title = { title }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   148
		end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   149
		if instructions then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   150
			root.x.instructions = { instructions }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   151
		end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   152
	end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   153
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   154
	local fields = { }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   155
	for i, field in form:fields () do
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   156
		local ftype = field:type ()
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   157
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   158
		local options, label, desc, required
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   159
		if ft == 'form' then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   160
			label, desc = field:desc ()
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   161
			if desc then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   162
				desc = { desc }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   163
			end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   164
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   165
			if field:required () then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   166
				required = { }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   167
			end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   168
		
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   169
			for option, label in field:options () do
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   170
				table.insert ( options, { label = label, value = { option } } )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   171
			end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   172
		end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   173
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   174
		local value
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   175
		if ftype == 'list-multi' or ftype == 'text-multi' or ftype == 'jid-multi' then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   176
			if ft == 'form' then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   177
				for option, label in field:options () do
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   178
					table.insert ( options, { label = label, value = { option } } )
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
				end
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   180
			end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   181
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   182
			value = { }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   183
			for j, v in ipairs ( field.value ) do
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   184
				table.insert ( value, { v } )
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   185
			end
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   186
		else
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   187
			value = { field:value () }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   188
		end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   189
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   190
		if ftype ~= 'fixed' or ft == 'form' then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   191
			table.insert ( fields, {
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   192
					type   = ftype,
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   193
					var    = field:name (),
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   194
					label  = label,
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   195
					desc   = desc,
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   196
					value  = value,
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   197
					option = options
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   198
				} )
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   199
		end
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   200
	end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   201
	root.x.field = fields
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   202
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   203
	return root
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   204
end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   205
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   206
function M.fields ( form )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   207
	return ipairs ( form.f )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   208
end
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   209
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   210
function M.add ( form, var, fld )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   211
	fld.var   = var
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   212
	fld.index = #form.f + 1 -- XXX
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   213
	local obj = form_field.new ( fld )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   214
	table.insert ( form.f, obj )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   215
	form.f[var] = obj
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   216
	return obj
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   217
end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   218
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   219
function M.field ( form, var )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   220
	-- works well on indices
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   221
	return form.f[var]
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   222
end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   223
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   224
return F
49
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   225
95f3bf77c598 Forms in modular way
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   226
-- vim: se ts=4: --