examples/forms.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Sun, 04 Apr 2010 16:44:27 +0300
changeset 104 626ff4f83519
parent 70 e43e386c8a33
child 121 75a7d595817c
permissions -rw-r--r--
Update api versions


local form_cid = main.add_category { 'del', 'send' }
local forms = { }

-- public
function insert_form ( form, submit, reject )
	table.insert ( forms, {
			form   = form,
			submit = submit,
			reject = reject,
		} )
	main.add_completion ( form_cid, tostring(#forms) )
	print ( "You have new form. Use /form " .. #forms .. " to fill and submit or cancel it." )
	return #forms
end

main.command ( 'form',
	function ( args )
		local id, action = tonumber (args[1]), args[2]
		if forms[id] then
			local form = forms[id].form
			if action == 'send' then
				forms[id].submit ( form )
			elseif action == 'reject' then
				forms[id].reject ( form )
			elseif action == 'del' then
				main.del_completion ( form_cid, id )
				forms[id] = nil
			elseif action == 'add' then
				form:add( args[3], { value = args[4] } )
			elseif action then
				local fname, value
				if action == 'set' then
					fname = args[3]
					value = args[4]
				else
					fname = action
					value = args[3]
				end
				local field = form:field ( fname )
				if field then
					if value then
						field:value ( value )
					else
						field:clear ()
					end
				else
					-- XXX create?
					print ( 'Field not found: ' .. fname )
				end
			else
				local desc = 'Form ' .. id .. '\n - Type: ' .. form:type ()
				local title, instructions = form:desc ()
				if title then
					desc = desc .. '\n - Title: ' .. title
				end
				if instructions then
					desc = desc .. '\n - Instructions: ' .. instructions
				end

				local fields = 'Fields:'
				for index, field in form:fields () do
					local ftype = field:type ()

					fields = fields .. '\n - '
					
					if field:required () then
						fields = fields .. '* '
					end

					local label, descr = field:desc ()
					if label then
						fields = fields .. label .. ' (' .. ( field:name () or '' ) .. ')'
					else
						fields = fields .. ( field:name () or '<no name>' )
					end
					fields = fields .. ' [' .. ftype .. ']'
					if descr then
						fields = fields .. ': ' .. descr
					end

					if ftype == 'list-single' or ftype == 'list-multi' then
						fields = fields .. '\n   Options:'
						for option, label in field:options () do
							fields = fields .. '\n    * ' .. option .. ' - ' .. label
						end
					end
					
					if ftype == 'list-multi' or ftype == 'text-multi' or ftype == 'jid-multi' then
						fields = fields .. '\n   Values: '
						for vin, value in field:values () do
							fields = fields .. '\n    * ' .. value
						end
					else
						fields = fields .. '\n   Value: ' .. ( field:value () or '' )
					end
				end
				print ( desc .. '\n' .. fields )
			end
		else
			local text = ''
			for id, form in pairs ( forms ) do
				local title = form.form:desc ()
				text = text .. '\n - ' .. id .. ' ' .. ( title or 'Untitled' ) .. ' [' .. form.form:type () .. ']'
			end
			if text ~= '' then
				print ( 'Forms list:' .. text )
			else
				print ( 'No forms' )
			end
		end
	end, true, form_cid )

commands_help['form'] = "[form_id [send | reject | [set | add] fieldname [value]]]\n\nWithout arguments prints form list.\nWith bare form id prints info on that form.\nWhen setting multivalue field, new values are added, not replacing previous.\nWithout value unsets field, multivalue fields lose all their values.\nAdd command allws to append field to form end.\nNote, that form-specific default type will be used."

-- vim: se ts=4: --