webmcp
view framework/env/ui/link.lua @ 2:72860d232f32
Version 1.0.2
Fixed bug with explicit garbage collection (requests > 256kB caused an error)
Views prefixed with an underscore can't be called externally
ui.paginate now displays the last page, if the selected page number is too high.
Fixed bug with explicit garbage collection (requests > 256kB caused an error)
Views prefixed with an underscore can't be called externally
ui.paginate now displays the last page, if the selected page number is too high.
author | jbe/bsw |
---|---|
date | Thu Dec 10 12:00:00 2009 +0100 (2009-12-10) |
parents | 9fdfb27f8e67 |
children | 5e32ef998acf |
line source
1 --[[--
2 ui.link{
3 external = external, -- external URL
4 static = static, -- URL relative to the static file directory
5 module = module, -- module name
6 view = view, -- view name
7 action = action, -- action name
8 id = id, -- optional id to be passed to the view or action to select a particular data record
9 params = params, -- optional parameters to be passed to the view or action
10 routing = routing, -- optional routing information for action links, as described for ui.form{...}
11 text = text, -- link text
12 content = content -- alternative name for 'text' option, preferred for functions
13 }
15 This function inserts a link into the active slot. It may be either an internal application link ('module' given and 'view' or 'action' given), or a link to an external web page ('external' given), or a link to a file in the static file directory of the application ('static' given).
17 --]]--
19 function ui.link(args)
20 local args = args or {}
21 local content = args.text or args.content -- TODO: decide which argument name to use
22 assert(content, "ui.link{...} needs a text.")
23 local function wrapped_content()
24 -- TODO: icon/image
25 if type(content) == "function" then
26 content()
27 else
28 slot.put(encode.html(content))
29 end
30 end
31 if args.action then
32 local form_attr = table.new(args.form_attr)
33 local form_id
34 if form_attr.id then
35 form_id = form_attr.id
36 else
37 form_id = ui.create_unique_id()
38 end
39 local quoted_form_id = encode.json(form_id)
40 form_attr.id = form_id
41 local a_attr = table.new(args.attr)
42 a_attr.href = "#"
43 a_attr.onclick =
44 "var f = document.getElementById(" .. quoted_form_id .. "); if (! f.onsubmit || f.onsubmit() != false) { f.submit() };"
45 ui.form{
46 external = args.external,
47 module = args.module or request.get_module(),
48 action = args.action,
49 id = args.id,
50 params = args.params,
51 routing = args.routing,
52 attr = form_attr,
53 content = function()
54 ui.submit{ text = args.text, attr = args.submit_attr }
55 end
56 }
57 ui.script{
58 type = "text/javascript",
59 script = (
60 "document.getElementById(" ..
61 quoted_form_id ..
62 ").style.display = 'none'; document.write(" ..
63 encode.json(
64 slot.use_temporary(
65 function()
66 ui.tag{
67 tag = "a",
68 attr = a_attr,
69 content = wrapped_content
70 }
71 end
72 )
73 ) ..
74 ");"
75 )
76 }
77 else
78 -- TODO: support content function
79 local a_attr = table.new(args.attr)
80 a_attr.href = encode.url{
81 external = args.external,
82 static = args.static,
83 module = args.module or request.get_module(),
84 view = args.view,
85 id = args.id,
86 params = args.params,
87 }
88 return ui.tag{ tag = "a", attr = a_attr, content = wrapped_content }
89 end
90 end