| rev | line source | 
| jbe/bsw@0 | 1 --[[-- | 
| jbe/bsw@0 | 2 ui.form{ | 
| jbe/bsw@0 | 3   record    = record,     -- optional record to be used | 
| jbe/bsw@0 | 4   read_only = read_only,  -- set to true, if form should be read-only (no submit button) | 
| jbe/bsw@0 | 5   external  = external,   -- external URL to be used as HTML form action | 
| jbe/bsw@0 | 6   module    = module,     -- module name to be used for HTML form action | 
| jbe/bsw@0 | 7   view      = view,       -- view name   to be used for HTML form action | 
| jbe/bsw@0 | 8   action    = action,     -- action name to be used for HTML form action | 
| jbe/bsw@0 | 9   routing = { | 
| jbe/bsw@0 | 10     default = {           -- default routing for called action | 
| jbe/bsw@0 | 11       mode   = mode,      -- "forward" or "redirect" | 
| jbe/bsw@0 | 12       module = module,    -- optional module name, defaults to current module | 
| jbe/bsw@0 | 13       view   = view,      -- view name | 
| jbe/bsw@0 | 14       id     = id,        -- optional id to be passed to the view | 
| jbe/bsw@0 | 15       params = params     -- optional params to be passed to the view | 
| jbe/bsw@0 | 16     }, | 
| jbe/bsw@0 | 17     ok    = { ... },      -- routing when "ok"    is returned by the called action | 
| jbe/bsw@0 | 18     error = { ... },      -- routing when "error" is returned by the called action | 
| jbe/bsw@0 | 19     ...   = { ... }       -- routing when "..."   is returned by the called action | 
| jbe/bsw@0 | 20   } | 
| jbe/bsw@0 | 21   content = function() | 
| jbe/bsw@0 | 22     ...                   -- code creating the contents of the form | 
| jbe/bsw@0 | 23   end | 
| jbe/bsw@0 | 24 } | 
| jbe/bsw@0 | 25 | 
| jbe/bsw@0 | 26 This functions creates a web form, which encloses the content created by the given 'content' function. When a 'record' is given, ui.field.* helper functions will be able to automatically determine field values by using the given record. If 'read_only' is set to true, then a call of ui.submit{...} will be ignored, and ui.field.* helper functions will behave differently. | 
| jbe/bsw@0 | 27 | 
| jbe/bsw@0 | 28 --]]-- | 
| jbe/bsw@0 | 29 | 
| jbe/bsw@0 | 30 function ui.form(args) | 
| jbe/bsw@0 | 31   local args = args or {} | 
| jbe/bsw@0 | 32   local slot_state = slot.get_state_table() | 
| jbe/bsw@0 | 33   local old_record   = slot_state.form_record | 
| jbe/bsw@0 | 34   local old_readonly = slot_state.form_readonly | 
| jbe/bsw@0 | 35   slot_state.form_record = args.record | 
| jbe/bsw@0 | 36   if args.readonly then | 
| jbe/bsw@0 | 37     slot_state.form_readonly = true | 
| jbe/bsw@0 | 38     ui.container{ attr = args.attr, content = args.content } | 
| jbe/bsw@0 | 39   else | 
| jbe/bsw@0 | 40     slot_state.form_readonly = false | 
| jbe/bsw@0 | 41     local params = table.new(args.params) | 
| jbe/bsw@0 | 42     local routing_default_given = false | 
| jbe/bsw@0 | 43     if args.routing then | 
| jbe/bsw@0 | 44       for status, settings in pairs(args.routing) do | 
| jbe/bsw@0 | 45         if status == "default" then | 
| jbe/bsw@0 | 46           routing_default_given = true | 
| jbe/bsw@0 | 47         end | 
| jbe/bsw@0 | 48         local module = settings.module or args.module or request.get_module() | 
| jbe/bsw@0 | 49         assert(settings.mode, "No mode specified in routing entry.") | 
| jbe/bsw@0 | 50         assert(settings.view, "No view specified in routing entry.") | 
| jbe/bsw@0 | 51         params["_webmcp_routing." .. status .. ".mode"]   = settings.mode | 
| jbe/bsw@0 | 52         params["_webmcp_routing." .. status .. ".module"] = module | 
| jbe/bsw@0 | 53         params["_webmcp_routing." .. status .. ".view"]   = settings.view | 
| jbe/bsw@0 | 54         params["_webmcp_routing." .. status .. ".id"]     = settings.id | 
| jbe/bsw@0 | 55         if settings.params then | 
| jbe/bsw@0 | 56           for key, value in pairs(settings.params) do | 
| jbe/bsw@0 | 57             params["_webmcp_routing." .. status .. ".params." .. key] = value | 
| jbe/bsw@0 | 58           end | 
| jbe/bsw@0 | 59         end | 
| jbe/bsw@0 | 60       end | 
| jbe/bsw@0 | 61     end | 
| jbe/bsw@0 | 62     if not routing_default_given then | 
| jbe/bsw@0 | 63       params["_webmcp_routing.default.mode"]   = "forward" | 
| jbe/bsw@0 | 64       params["_webmcp_routing.default.module"] = request.get_module() | 
| jbe/bsw@0 | 65       params["_webmcp_routing.default.view"]   = request.get_view() | 
| jbe/bsw@0 | 66     end | 
| jbe/bsw@0 | 67     params._webmcp_csrf_secret = request.get_csrf_secret() | 
| jbe/bsw@0 | 68     local attr = table.new(args.attr) | 
| jbe/bsw@0 | 69     attr.action = encode.url{ | 
| jbe/bsw@0 | 70       external  = args.external, | 
| jbe/bsw@0 | 71       module    = args.module or request.get_module(), | 
| jbe/bsw@0 | 72       view      = args.view, | 
| jbe/bsw@0 | 73       action    = args.action, | 
| jbe/bsw@0 | 74     } | 
| jbe/bsw@0 | 75     attr.method = args.method and string.upper(args.method) or "POST" | 
| jbe/bsw@0 | 76     if slot_state.form_opened then | 
| jbe/bsw@0 | 77       error("Cannot open a non-readonly form inside a non-readonly form.") | 
| jbe/bsw@0 | 78     end | 
| jbe/bsw@0 | 79     slot_state.form_opened = true | 
| jbe/bsw@0 | 80     ui.tag { | 
| jbe/bsw@0 | 81       tag     = "form", | 
| jbe/bsw@0 | 82       attr    = attr, | 
| jbe/bsw@0 | 83       content = function() | 
| jbe/bsw@0 | 84         if args.id then | 
| jbe/bsw@0 | 85           ui.hidden_field{ name = "_webmcp_id", value = args.id } | 
| jbe/bsw@0 | 86         end | 
| jbe/bsw@0 | 87         for key, value in pairs(params) do | 
| jbe/bsw@0 | 88           ui.hidden_field{ name = key, value = value } | 
| jbe/bsw@0 | 89         end | 
| jbe/bsw@0 | 90         if args.content then | 
| jbe/bsw@0 | 91           args.content() | 
| jbe/bsw@0 | 92         end | 
| jbe/bsw@0 | 93       end | 
| jbe/bsw@0 | 94     } | 
| jbe/bsw@0 | 95     slot_state.form_opened = false | 
| jbe/bsw@0 | 96   end | 
| jbe/bsw@0 | 97   slot_state.form_readonly = old_readonly | 
| jbe/bsw@0 | 98   slot_state.form_record   = old_record | 
| jbe/bsw@0 | 99 end |