trellis 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/Manifest.txt +6 -181
- data/examples/crud_components/source/crud_components.rb +0 -1
- data/examples/examples.txt +32 -30
- data/examples/flickr/source/flickr.rb +0 -4
- data/examples/hangman/source/hangman.rb +1 -2
- data/examples/hilo/html/guess.xhtml +2 -2
- data/examples/hilo/source/hilo.rb +6 -6
- data/examples/routing/source/routing.rb +50 -0
- data/examples/stateful_counters/source/stateful_counters.rb +9 -4
- data/lib/trellis/{core_components.rb → component_library/core_components.rb} +48 -398
- data/lib/trellis/component_library/grid.rb +311 -0
- data/lib/trellis/{jquery.rb → component_library/jquery.rb} +0 -0
- data/lib/trellis/component_library/object_editor.rb +110 -0
- data/lib/trellis/trellis.rb +162 -52
- data/lib/trellis/utils.rb +9 -3
- data/lib/trellis/version.rb +1 -1
- data/tasks/rspec.rake +2 -1
- data/test/application_spec.rb +55 -30
- data/test/component_spec.rb +95 -81
- data/test/core_extensions_spec.rb +34 -2
- data/test/default_router_spec.rb +91 -0
- data/test/fixtures/application_spec_applications.rb +91 -3
- data/test/page_spec.rb +18 -8
- data/test/router_spec.rb +49 -49
- metadata +8 -185
- data/.git/COMMIT_EDITMSG +0 -1
- data/.git/HEAD +0 -1
- data/.git/config +0 -9
- data/.git/description +0 -1
- data/.git/hooks/applypatch-msg.sample +0 -15
- data/.git/hooks/commit-msg.sample +0 -24
- data/.git/hooks/post-commit.sample +0 -8
- data/.git/hooks/post-receive.sample +0 -15
- data/.git/hooks/post-update.sample +0 -8
- data/.git/hooks/pre-applypatch.sample +0 -14
- data/.git/hooks/pre-commit.sample +0 -18
- data/.git/hooks/pre-rebase.sample +0 -169
- data/.git/hooks/prepare-commit-msg.sample +0 -36
- data/.git/hooks/update.sample +0 -107
- data/.git/index +0 -0
- data/.git/info/exclude +0 -6
- data/.git/logs/HEAD +0 -1
- data/.git/logs/refs/heads/master +0 -1
- data/.git/logs/refs/remotes/origin/master +0 -1
- data/.git/objects/01/2368d4dd3162ed570e6c1423ecb07a6a35f8c0 +0 -0
- data/.git/objects/02/238c88c522b88e71529495460cc5c2c8abe110 +0 -0
- data/.git/objects/07/03d3b123189f1da72d3889d9340e681841c96d +0 -0
- data/.git/objects/0b/3935fdbf3ce8d37e6cb2a6ec94edaccb1c58dc +0 -0
- data/.git/objects/0f/ecd1ad35f280c874ce070b7a97a4c1f86ace54 +0 -0
- data/.git/objects/12/61911b063b7e6883c5e9db7ab4396183f6f2b5 +0 -0
- data/.git/objects/13/0b7e2d214ec198d07aeed5b462597670ce85ad +0 -0
- data/.git/objects/13/214d40f02b63f1233fd7881b1df9bb75d9c0a7 +0 -0
- data/.git/objects/14/7522bdc96af0b578935d81c1a7347b40573940 +0 -0
- data/.git/objects/16/a7fde706fe92b3548254d29722f5ca311ce63b +0 -2
- data/.git/objects/16/fe580663cc29d141bf416dff5bf21bf4ea42a3 +0 -0
- data/.git/objects/17/2d55806918bafb4e701515edb27147a4ef6498 +0 -0
- data/.git/objects/17/686ef1882ed6c3c07b781fab18739b1c5e48bd +0 -0
- data/.git/objects/17/824053c41a2cb523303e20cac42f66f9ca2134 +0 -0
- data/.git/objects/18/68448c5f88bc73b2fef6b8f3aa75b663013a3a +0 -1
- data/.git/objects/1a/6d9051dc4c7db10bdcf5e17c5cb717b072d30a +0 -0
- data/.git/objects/1a/8bdb445fb5668dcd1309cb9de5dedf846c822f +0 -0
- data/.git/objects/1b/6fa67b70358fdb82eabcd7ef3bc46d518d0426 +0 -0
- data/.git/objects/1c/f6510ed08a274fb3292d40557cebb3e7090767 +0 -0
- data/.git/objects/1d/e661ce11d5335e5dd7968ef5698e2eb164eb52 +0 -0
- data/.git/objects/1e/301ee672d6040e734af6d0a5491185129d7b67 +0 -0
- data/.git/objects/21/2201d46200f13d23d8199bd4a7ecc9165205b3 +0 -0
- data/.git/objects/22/f687370babdf38d224d2a9ff039707e8d0aac1 +0 -0
- data/.git/objects/24/202d2de95dc31f5f1802e629a16ad45b723267 +0 -0
- data/.git/objects/25/4c5b6b8d211d8b9f07310fd342fd7b078a81af +0 -0
- data/.git/objects/25/5832653fde9e9748855347fe7bce013aa0a6c7 +0 -0
- data/.git/objects/25/806945c89b4b5adb8c8676c308e4653361109c +0 -5
- data/.git/objects/26/cb8deaca28bf275769cbb71b88e53a44adb9ca +0 -0
- data/.git/objects/2e/1c13fb5f154f89cccd4c645540a2ec8ee0f57a +0 -0
- data/.git/objects/2f/437425b2c085bb529379e409d6b4bc7f9f9fba +0 -0
- data/.git/objects/2f/7cf4a25937b71f3de52e70c7a47cb2f7da07ea +0 -0
- data/.git/objects/31/31bdbbac6e6e7e24fd6ea84332461f67e6e5b6 +0 -0
- data/.git/objects/32/02e02de478263912b729283eabc7cdab8a8037 +0 -0
- data/.git/objects/32/839ed9baa8c800d9033655d1ee995499825fb5 +0 -0
- data/.git/objects/34/2e479c61796125b0e025b483401ec12f3c5824 +0 -2
- data/.git/objects/36/7acb017aebab3f627a5208c25885c21fa7fdbb +0 -0
- data/.git/objects/38/12910d2e2a8e6eeb79a399d20751675d3fbe77 +0 -0
- data/.git/objects/38/3fe1e1a07537db6e0f39c6005b7b4e40fa5ccd +0 -0
- data/.git/objects/39/5ef328bc94df9191f4d80a77503a5be9f1f673 +0 -0
- data/.git/objects/39/dc76dc096fdf737e9f4f7062b78cbf4ab9628f +0 -0
- data/.git/objects/3b/09eb196140b471556ed4c3987c0bc739733617 +0 -0
- data/.git/objects/3b/9f97f1bf55834832a92bab1ab900918dc49570 +0 -0
- data/.git/objects/40/5ffd3925b39dd905638ec24640dd8efa27cc1b +0 -0
- data/.git/objects/42/4a5f37c6fe3a7cac54b0f85688c1cce7da9cdf +0 -0
- data/.git/objects/44/9e23363d4e20da6a67be7ab78fc610b4e9852a +0 -0
- data/.git/objects/48/90bb5d241cecaa30b28148c920b833056c7508 +0 -0
- data/.git/objects/4c/558c43676410a2c0a7d5c7b94fca18923a9af1 +0 -0
- data/.git/objects/4f/bf572175dd5245104679ff8f676f6a34466c29 +0 -0
- data/.git/objects/53/8583edf00c9f656b32149a0e69e030371737c5 +0 -0
- data/.git/objects/5b/8a2c4bf7bb56ae199414096dbda21fd4b8cd63 +0 -0
- data/.git/objects/5c/9fe8ff998d56dc076657ef88ee9f784ec160f9 +0 -0
- data/.git/objects/5f/8441f9d3507587940f31af04dd9fd5911d2812 +0 -0
- data/.git/objects/61/4f2752550e63b793e31dcf98b5ea26c32eb0be +0 -0
- data/.git/objects/65/801b0fabdfd673861dbb2ac134d438ab2cc5e4 +0 -3
- data/.git/objects/66/2746dffaddbcd311f4ac070b5b9bddcd8894a7 +0 -0
- data/.git/objects/69/1ed3b65603a0d0dabfb66720e7163664be78f5 +0 -0
- data/.git/objects/69/3dc3b6037df8c1c8dfda916d649e7975481124 +0 -0
- data/.git/objects/69/67538427b3a371b33c01c72726ac7e67a04c39 +0 -0
- data/.git/objects/69/6cd6c3508e2adcc68829497884ff3d4b774dc2 +0 -0
- data/.git/objects/69/6ee93917040308ccd0bfc245d63c1cbeb23dae +0 -0
- data/.git/objects/6a/3ac317746a8a2cfc88f3580bbd2b03dc0d50b5 +0 -0
- data/.git/objects/6d/6ba435839a65b96cb3f7584a40dd3767a0990f +0 -0
- data/.git/objects/6f/32c190a651a82caeefeb55eb797fc5daf05426 +0 -0
- data/.git/objects/71/fecbce1bec36eaf4de655763d4bb7ceffc991d +0 -0
- data/.git/objects/72/01d78a9e90347fd2f7790f9e8665587791d853 +0 -0
- data/.git/objects/73/6c97d6a551363ba4a4956408ba228fcab7f91f +0 -0
- data/.git/objects/75/3264271e935e18f4eada49aa1818c6fb9e6abb +0 -0
- data/.git/objects/75/cc7d390b4a565495cbdc5a08d4479e7e8dbfeb +0 -0
- data/.git/objects/76/7c0c96f68b9ccec34ae538045a63bbe4f97d3e +0 -0
- data/.git/objects/7b/47fe9b1ab9f2692b9706054de706430089ecd4 +0 -0
- data/.git/objects/7c/73144ef6847d1bc2315aee0925c0e5cf5c09d1 +0 -0
- data/.git/objects/7d/9c177c155386606aa1024d5cb020a097eea64a +0 -0
- data/.git/objects/7d/e9a3296007c09ba9b7bc1802e1c5d9ad1d5dbb +0 -0
- data/.git/objects/7e/b73d408147c8d84881109189a9724292abcb8d +0 -0
- data/.git/objects/82/0e3bf5449a8f6b8eb637a653dcb2dc387b393c +0 -0
- data/.git/objects/83/a10ce96763cb30d0b81425e9372f89c52f4c9f +0 -0
- data/.git/objects/83/bdb801e78444d59225f83cf2f336f114cd23cf +0 -0
- data/.git/objects/85/24e583e822abc18b1ffdd0aa356c9c079b5548 +0 -0
- data/.git/objects/88/b46cc8de5237897d4ba5023d3efdc83fec4f7c +0 -0
- data/.git/objects/89/5eea66474f48a2cbf643ad0ef266fd26f9d2a3 +0 -0
- data/.git/objects/8a/539c5fc35d5b770d67241d2ccb6c6855df6a43 +0 -0
- data/.git/objects/8a/82cdbfb20cc58fdffe4e13b70b55977deb92c6 +0 -0
- data/.git/objects/8b/2b537442e4ac8719ffa71b3ae0c707133df06f +0 -0
- data/.git/objects/8c/2a45f0c81284a081f8d7980e9a54210a9dd52c +0 -0
- data/.git/objects/8e/10355b4ab312450031966107ef6a65b13833ee +0 -0
- data/.git/objects/90/f6c76767ae725f15fa6790dcb6afd1719fa0e2 +0 -0
- data/.git/objects/92/92b696aba9840c089241c68d4c6ca14be38a64 +0 -2
- data/.git/objects/93/e03faa6906892434fa9f2ad230c4ececc64055 +0 -0
- data/.git/objects/93/eca2e28d80fda45d327fdfc6c39ae690af41cd +0 -0
- data/.git/objects/95/92fe63bd5403654730cdec76cbf116ef83bbff +0 -0
- data/.git/objects/96/bc6dd471c1c188a2eb4308bcc3ca4e6c8faac8 +0 -0
- data/.git/objects/96/d855221a9ff4fba57d2b70680b57bd5115cfde +0 -0
- data/.git/objects/97/4ec92b2b9eb01a73fb57dc78d463cafdda69a7 +0 -0
- data/.git/objects/97/b7ec01ebe089832a0972d20b0a40d54456985c +0 -2
- data/.git/objects/97/fa6aaae4cfc7654feb39971e7aee5c41ed1679 +0 -1
- data/.git/objects/98/18351c6685a1df5d23686e6346d11d261cc6f0 +0 -0
- data/.git/objects/98/3d3b7e55cbbce2f2a52c6e6d830a5dca7b4d42 +0 -0
- data/.git/objects/a2/e551049a5388112c21e7f3a4a720bf720601fa +0 -0
- data/.git/objects/a3/7066bea4fae90d34761a3ebb3f8a348d94eba1 +0 -0
- data/.git/objects/a6/c99619145d1b9b75aa15ca04fbe4db0b2ee79b +0 -0
- data/.git/objects/aa/e2234d0a8c1485096c7a7de039eceb4e019e13 +0 -0
- data/.git/objects/b0/3b52f4269c9719e02ecd6caabd8aff5adf3aac +0 -0
- data/.git/objects/b1/50dbbd89f825302a9e82d8fdd66f238b8e6fc4 +0 -0
- data/.git/objects/b4/545fbe393aaa18f1c48de4d9f68f64ebf09ddc +0 -0
- data/.git/objects/b6/8691404e088692929d40b988b993f815d76756 +0 -0
- data/.git/objects/b7/daa3d844ef5f5cd917084e48edd82e67f8f476 +0 -0
- data/.git/objects/bf/4232281dba5a0f17e8b5c16b9cbd0f52274fa8 +0 -0
- data/.git/objects/bf/9b84d10f19188beffe5ee99e6f5af035ba77d3 +0 -2
- data/.git/objects/c0/06e664b306145de804f74ab27550d62a92f58a +0 -1
- data/.git/objects/c2/2806b16775f66453012d085d21fb8698521ea9 +0 -0
- data/.git/objects/c2/7f6559350f7adb19d43742b55b2f91d07b6550 +0 -0
- data/.git/objects/c3/833df21ed674a77374fd40ed931f900134d38b +0 -0
- data/.git/objects/c3/b9da021eb76abad0b17ad6c4be75595e41a7e6 +0 -0
- data/.git/objects/c5/ca6b7e3561ea88aba1712aabb984d1167787f1 +0 -0
- data/.git/objects/c6/39f65e1f43c75b7f57c5ab28623d295dfb2afd +0 -0
- data/.git/objects/c8/6f05fa5539f8e69e94850d1cd917919ff581be +0 -0
- data/.git/objects/cb/5e499c8dcc6f2901014a08e74f04b7a4bd6596 +0 -0
- data/.git/objects/cc/1289d25eeee6ba31b4e406372cb9abf969fc6f +0 -0
- data/.git/objects/cc/784e1b49111c42fa7eae10ad0e788186e672d1 +0 -0
- data/.git/objects/cc/bcae254dad515d7ef01a461980544e4483c41e +0 -0
- data/.git/objects/ce/bfadad3a7c17148998e04275e6d0d1cf1b2e1e +0 -0
- data/.git/objects/ce/f3335522abdc47a2c94be70455dcfaa9a51a27 +0 -0
- data/.git/objects/cf/6add7ea568d3d90d6a1f8afb0898b0119b14ff +0 -0
- data/.git/objects/d0/719abd196033fec0e4cbe2af68a26ca435389c +0 -0
- data/.git/objects/d1/ce63ff0eaec4dba419e5547f99195dfb9b5b20 +0 -0
- data/.git/objects/d2/c3feb3c74b892cca0049c0aced6ce786a784c8 +0 -0
- data/.git/objects/d7/8a91da13413419da71b539a3c6c7df4d8a2458 +0 -0
- data/.git/objects/d8/c7bed2b1357d54b6935536a8a51a3c73d535b4 +0 -0
- data/.git/objects/da/c3a1277ccb4806011e33eb32c5609cc45c46f2 +0 -0
- data/.git/objects/dc/3f920f4b937d0e2ac512f0bb31d477624c46d5 +0 -0
- data/.git/objects/dc/6c389abf5bd0d7b9be2a6bb6af90738a410e59 +0 -0
- data/.git/objects/df/07c423309f39c4d5570b0fad65dff23af654ae +0 -0
- data/.git/objects/e2/93a5c9e2257b9f3fcb8fa5d5c8147a2f07ba1b +0 -0
- data/.git/objects/e4/8464df56bf487e96e21ea99487330266dae3c9 +0 -0
- data/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
- data/.git/objects/e8/0c13a1d1f62756fb9f1e4fb9f7512e5b8c5816 +0 -0
- data/.git/objects/e9/b8ade2125b2615ddc4c8043940c40ed36215c9 +0 -0
- data/.git/objects/ed/59a7599a81ef7ea7c230c3332345a3484febf8 +0 -0
- data/.git/objects/f0/d2a74226877e9a28af814d0d3727e4a3487439 +0 -0
- data/.git/objects/f0/f3ba7264f1d8e60eb93a907092af98fdc248e4 +0 -0
- data/.git/objects/f1/cdcc7ff2dc6298318523b2c4e425f515a58bf7 +0 -3
- data/.git/objects/f4/45c96f406f4d2f9839b3fe2fe8bc7f943ab469 +0 -0
- data/.git/objects/f7/eef7ce0a650d6f0c85dc4982f481da7bd44362 +0 -0
- data/.git/objects/f9/0abf96c5059ce1ba115f73bc9cf33e4663b3e1 +0 -0
- data/.git/objects/f9/cf7ae572eaebbd63f809f16a5ef14b9c679790 +0 -0
- data/.git/objects/fc/300df53fe2c9467210e2fd4c2f34e1c9c7c89a +0 -0
- data/.git/objects/fc/45546596ab8debc4c9f49a7abc7fc14a7bcc7f +0 -4
- data/.git/objects/fc/68d89167f69614eda17bd56dfccb4355d818e6 +0 -0
- data/.git/objects/fc/e4c02bb132e73b3cb957da182db7b75a47c242 +0 -0
- data/.git/objects/fe/be283da7f326344013f1fc847c12c8f29ab6ef +0 -0
- data/.git/refs/heads/master +0 -1
- data/.git/refs/remotes/origin/master +0 -1
- data/.gitignore +0 -5
- data/README.txt +0 -156
- data/examples/simplest/html/start.xhtml +0 -0
- data/website/index.html +0 -124
- data/website/index.txt +0 -119
- data/website/javascripts/rounded_corners_lite.inc.js +0 -285
- data/website/stylesheets/screen.css +0 -138
- data/website/template.html.erb +0 -48
@@ -37,29 +37,38 @@ module Trellis
|
|
37
37
|
render do |tag|
|
38
38
|
source = tag.attr['tid']
|
39
39
|
context = tag.attr['context']
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
path = (tag.globals.page.path.nil? || tag.globals.page.path.empty?) ? nil : tag.globals.page.path
|
41
|
+
class_name = tag.globals.page.class.name
|
42
|
+
target_page = tag.attr['page'] || path || class_name
|
43
|
+
|
43
44
|
if context
|
44
45
|
value = tag.locals.instance_eval(context) || tag.globals.instance_eval(context)
|
45
46
|
end
|
46
|
-
|
47
|
+
|
47
48
|
if source
|
48
49
|
if context
|
49
|
-
id = "#{source}_#{value}"
|
50
|
-
href =
|
50
|
+
id = "#{source}_#{value}"
|
51
|
+
href = DefaultRouter.to_uri(:page => target_page,
|
52
|
+
:event => 'select',
|
53
|
+
:source => source,
|
54
|
+
:value => value)
|
51
55
|
else
|
52
56
|
id = "#{source}"
|
53
|
-
href =
|
57
|
+
href = DefaultRouter.to_uri(:page => target_page,
|
58
|
+
:event => 'select',
|
59
|
+
:source => source)
|
54
60
|
end
|
55
61
|
else
|
56
62
|
if context
|
57
|
-
id = "action_link_#{value}"
|
58
|
-
href =
|
63
|
+
id = "action_link_#{value}"
|
64
|
+
href = DefaultRouter.to_uri(:page => target_page,
|
65
|
+
:event => 'select',
|
66
|
+
:value => value)
|
59
67
|
else
|
60
68
|
id = "action_link"
|
61
|
-
href =
|
62
|
-
|
69
|
+
href = DefaultRouter.to_uri(:page => target_page,
|
70
|
+
:event => 'select')
|
71
|
+
end
|
63
72
|
end
|
64
73
|
|
65
74
|
builder = Builder::XmlMarkup.new
|
@@ -119,23 +128,28 @@ module Trellis
|
|
119
128
|
unless name.include?('.')
|
120
129
|
value = tag.locals.send(name.to_sym) || tag.globals.send(name.to_sym)
|
121
130
|
else
|
122
|
-
|
123
|
-
|
124
|
-
value = target.send(method.to_sym) if target
|
125
|
-
end
|
131
|
+
value = tag.locals.instance_eval(name) || tag.globals.instance_eval(name)
|
132
|
+
end
|
126
133
|
value
|
127
134
|
end
|
128
135
|
end
|
136
|
+
|
137
|
+
class Eval < Trellis::Component
|
138
|
+
render do |tag|
|
139
|
+
expression = tag.attr['expression']
|
140
|
+
tag.locals.instance_eval(expression) || tag.globals.instance_eval(expression) if expression
|
141
|
+
end
|
142
|
+
end
|
129
143
|
|
130
144
|
#
|
131
|
-
#
|
145
|
+
# page link should take parameters for pages that have a custom route
|
132
146
|
#
|
133
147
|
class PageLink < Trellis::Component
|
134
148
|
render do |tag|
|
135
149
|
url_root = tag.globals.page.class.url_root
|
136
150
|
page_name = tag.attr['tpage']
|
137
151
|
id = tag.attr['tid'] || page_name
|
138
|
-
href =
|
152
|
+
href = DefaultRouter.to_uri(:url_root => url_root, :page => page_name)
|
139
153
|
contents = tag.expand
|
140
154
|
builder = Builder::XmlMarkup.new
|
141
155
|
builder.a(contents, "href" => href, "id" => "page_link_#{id}")
|
@@ -172,27 +186,11 @@ module Trellis
|
|
172
186
|
#
|
173
187
|
class If < Trellis::Component
|
174
188
|
render do |tag|
|
175
|
-
# resolve the ${} variables
|
176
|
-
test = Utils.expand_properties_in_tag(tag.attr['test'], tag)
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
global = tag.globals.instance_eval(test)
|
181
|
-
|
182
|
-
result = false
|
183
|
-
if local
|
184
|
-
result = local
|
185
|
-
elsif global
|
186
|
-
result = global
|
187
|
-
end
|
188
|
-
|
189
|
-
content = ''
|
190
|
-
if result
|
191
|
-
content << tag.expand
|
192
|
-
else
|
193
|
-
# find the else tag and expand it
|
194
|
-
end
|
195
|
-
content
|
189
|
+
# resolve the ${} variables
|
190
|
+
test = Utils.expand_properties_in_tag(tag.attr['test'], tag)
|
191
|
+
value = tag.locals.instance_eval(test) || tag.globals.instance_eval(test)
|
192
|
+
result = !value ? false : value
|
193
|
+
tag.expand if result
|
196
194
|
end
|
197
195
|
end
|
198
196
|
|
@@ -202,25 +200,10 @@ module Trellis
|
|
202
200
|
class Unless < Trellis::Component
|
203
201
|
render do |tag|
|
204
202
|
# resolve the ${} variables
|
205
|
-
test = Utils.expand_properties_in_tag(tag.attr['test'], tag)
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
result = false
|
211
|
-
if local
|
212
|
-
result = !local
|
213
|
-
elsif global
|
214
|
-
result = !global
|
215
|
-
end
|
216
|
-
|
217
|
-
content = ''
|
218
|
-
if result
|
219
|
-
content << tag.expand
|
220
|
-
else
|
221
|
-
# find the else tag and expand it
|
222
|
-
end
|
223
|
-
content
|
203
|
+
test = Utils.expand_properties_in_tag(tag.attr['test'], tag)
|
204
|
+
value = tag.locals.instance_eval(test) || tag.globals.instance_eval(test)
|
205
|
+
result = !value ? false : value
|
206
|
+
tag.expand unless result
|
224
207
|
end
|
225
208
|
end
|
226
209
|
|
@@ -246,8 +229,12 @@ module Trellis
|
|
246
229
|
form_name = tag.attr['tid']
|
247
230
|
on_behalf = tag.attr['on_behalf']
|
248
231
|
method = tag.attr['method'] || 'GET'
|
249
|
-
tag.locals.form_name = form_name
|
250
|
-
|
232
|
+
tag.locals.form_name = form_name
|
233
|
+
target_page = tag.globals.page.class.name
|
234
|
+
href = Trellis::DefaultRouter.to_uri(:url_root => url_root,
|
235
|
+
:page => target_page,
|
236
|
+
:event => "submit",
|
237
|
+
:source => "#{(on_behalf ? on_behalf : form_name)}")
|
251
238
|
builder = Builder::XmlMarkup.new
|
252
239
|
builder.form("name" => form_name, "action" => href, "method" => method) do |form|
|
253
240
|
form << tag.expand
|
@@ -380,10 +367,10 @@ module Trellis
|
|
380
367
|
if !literal
|
381
368
|
resolved_value = ''
|
382
369
|
unless value.include?('.')
|
383
|
-
resolved_value = tag.
|
370
|
+
resolved_value = tag.globals.send(value.to_sym)
|
384
371
|
else
|
385
372
|
target_name, method = value.split('.')
|
386
|
-
target = tag.
|
373
|
+
target = tag.globals.send(target_name.to_sym)
|
387
374
|
resolved_value = target.send(method.to_sym)
|
388
375
|
end
|
389
376
|
attrs['value'] = resolved_value
|
@@ -517,343 +504,6 @@ module Trellis
|
|
517
504
|
|
518
505
|
# TODO: Need radio button group and a standalone radio button
|
519
506
|
|
520
|
-
|
521
|
-
#
|
522
|
-
#
|
523
|
-
#
|
524
|
-
class Grid < Trellis::Component
|
525
|
-
is_stateful
|
526
|
-
|
527
|
-
tag_name "grid"
|
528
|
-
|
529
|
-
attr_accessor :source
|
530
|
-
field :page_position, :persistent => true
|
531
|
-
attr_reader :properties
|
532
|
-
attr_reader :commands
|
533
|
-
attr_reader :counter_method
|
534
|
-
attr_reader :counter_method_arguments
|
535
|
-
attr_reader :retrieve_block
|
536
|
-
attr_reader :sort_properties
|
537
|
-
field :sorted_by, :persistent => true
|
538
|
-
field :sort_direction, :persistent => true, :default_value => :ascending
|
539
|
-
|
540
|
-
def initialize
|
541
|
-
@properties = []
|
542
|
-
@sort_properties = []
|
543
|
-
@commands = []
|
544
|
-
end
|
545
|
-
|
546
|
-
# must be called before rendering
|
547
|
-
def columns(*syms)
|
548
|
-
syms.each do |sym|
|
549
|
-
@properties << sym
|
550
|
-
end
|
551
|
-
end
|
552
|
-
|
553
|
-
def add_command(options=[])
|
554
|
-
# extract options
|
555
|
-
name = options[:name] if options
|
556
|
-
page = options[:page] if options
|
557
|
-
context = options[:context] if options
|
558
|
-
image = options[:image] if options
|
559
|
-
|
560
|
-
@commands << lambda do |tag, object|
|
561
|
-
tid = tag.attr['tid']
|
562
|
-
value = object.send(context.to_sym)
|
563
|
-
url_root = tag.globals.page.class.url_root
|
564
|
-
page = tag.globals.page.class.name unless page
|
565
|
-
|
566
|
-
href = "#{url_root}/#{page}.#{name}_#{tid}/#{value}"
|
567
|
-
|
568
|
-
%{
|
569
|
-
<a href="#{href}">
|
570
|
-
<img src='#{image}'/>
|
571
|
-
</a>
|
572
|
-
}
|
573
|
-
end
|
574
|
-
end
|
575
|
-
|
576
|
-
def sort_by_all_except(*syms)
|
577
|
-
@sort_properties = @properties.reject { |property| syms.includes?(property)}
|
578
|
-
end
|
579
|
-
|
580
|
-
def sort_by(*syms)
|
581
|
-
unless syms.first == :all
|
582
|
-
@sort_properties = syms
|
583
|
-
else
|
584
|
-
@sort_properties = @properties
|
585
|
-
end
|
586
|
-
end
|
587
|
-
|
588
|
-
def size_accessor(symbol, args)
|
589
|
-
@counter_method, @counter_method_arguments = symbol, args
|
590
|
-
end
|
591
|
-
|
592
|
-
def retrieve_method(&block)
|
593
|
-
@retrieve_block = block
|
594
|
-
end
|
595
|
-
|
596
|
-
# event handlers
|
597
|
-
|
598
|
-
def on_page(page)
|
599
|
-
@page_position = page.to_i # must use the cohersion built in capabilities
|
600
|
-
end
|
601
|
-
|
602
|
-
def on_sort(property)
|
603
|
-
to_sym = property.to_sym
|
604
|
-
if @sort_properties.include?(to_sym)
|
605
|
-
if @sorted_by != to_sym
|
606
|
-
@sorted_by = to_sym
|
607
|
-
else
|
608
|
-
@sort_direction = @sort_direction == :ascending ? :descending : :ascending
|
609
|
-
end
|
610
|
-
end
|
611
|
-
end
|
612
|
-
|
613
|
-
render do |tag|
|
614
|
-
url_root = tag.globals.page.class.url_root
|
615
|
-
# get the page object
|
616
|
-
page = tag.globals.page
|
617
|
-
# get the tag properties
|
618
|
-
tid = tag.attr['tid']
|
619
|
-
rows_per_page = tag.attr['rows_per_page'] || 3
|
620
|
-
# get the instance of the component from the page
|
621
|
-
grid = page.send("grid_#{tid}")
|
622
|
-
# get the properties or columns
|
623
|
-
properties = grid.properties
|
624
|
-
# get the sort properties
|
625
|
-
sort_properties = grid.sort_properties
|
626
|
-
# current page
|
627
|
-
current_page = grid.page_position || 1
|
628
|
-
# sort information
|
629
|
-
sorted_by = grid.sorted_by
|
630
|
-
sort_direction = grid.sort_direction
|
631
|
-
commands = grid.commands
|
632
|
-
# get the source from either the tag or the component instance itself
|
633
|
-
source = tag.attr['source'] || grid.source
|
634
|
-
# get the array or collection that we can iterate over
|
635
|
-
iterator = tag.locals.send(source.to_sym) || tag.globals.send(source.to_sym)
|
636
|
-
|
637
|
-
builder = Builder::XmlMarkup.new
|
638
|
-
|
639
|
-
# build the table
|
640
|
-
builder.div(:class => "t-data-grid") {
|
641
|
-
|
642
|
-
# configure pagination
|
643
|
-
#TODO need to implement page ranging
|
644
|
-
range = tag.attr['page_range'] || 5
|
645
|
-
available_rows = 0
|
646
|
-
unless grid.counter_method
|
647
|
-
available_rows = iterator.length
|
648
|
-
else
|
649
|
-
unless grid.counter_method_arguments
|
650
|
-
available_rows = iterator.send(grid.counter_method)
|
651
|
-
else
|
652
|
-
available_rows = iterator.send(grid.counter_method, grid.counter_method_arguments)
|
653
|
-
end
|
654
|
-
end
|
655
|
-
|
656
|
-
# configure the pager
|
657
|
-
pager = Paginator.new(available_rows, rows_per_page) do |offset, per_page|
|
658
|
-
rows = nil
|
659
|
-
unless grid.retrieve_method
|
660
|
-
if sorted_by
|
661
|
-
iterator = iterator.sort_by { |row| row.send(sorted_by) }
|
662
|
-
iterator.reverse! if sort_direction == :descending
|
663
|
-
end
|
664
|
-
rows = iterator[offset, per_page]
|
665
|
-
else
|
666
|
-
rows = grid.retrieve_method.call
|
667
|
-
end
|
668
|
-
rows
|
669
|
-
end
|
670
|
-
|
671
|
-
# get the current page from the pager
|
672
|
-
rows = pager.page(current_page)
|
673
|
-
|
674
|
-
# render the pager control if necessary
|
675
|
-
unless pager.number_of_pages < 2
|
676
|
-
builder.div(:class => "t-data-grid-pager") {
|
677
|
-
# loop over the pages
|
678
|
-
(1..pager.number_of_pages).each do |page_num|
|
679
|
-
if page_num == current_page
|
680
|
-
builder.span("#{page_num}", :class => "current")
|
681
|
-
else
|
682
|
-
builder.a("#{page_num}", :href => "#{url_root}/#{page.class.name}.page_grid#{tid}/#{page_num}", :title => "Go to page #{page_num}")
|
683
|
-
end
|
684
|
-
end
|
685
|
-
}
|
686
|
-
end
|
687
|
-
|
688
|
-
# build the html
|
689
|
-
builder.table(:class => "t-data-grid") {
|
690
|
-
# header
|
691
|
-
builder.thead {
|
692
|
-
builder.tr {
|
693
|
-
properties.each_index { |index|
|
694
|
-
property = properties[index]
|
695
|
-
field_name = property.to_s.humanize
|
696
|
-
|
697
|
-
if properties.length == index + 1
|
698
|
-
css_class = "#{field_name} t-last"
|
699
|
-
elsif index == 0
|
700
|
-
css_class = "#{field_name} t-first"
|
701
|
-
else
|
702
|
-
css_class = "#{field_name}"
|
703
|
-
end
|
704
|
-
|
705
|
-
sort_image = 'sortable.png'
|
706
|
-
if property == sorted_by
|
707
|
-
if sort_direction == :ascending
|
708
|
-
sort_image = 'sort-desc.png'
|
709
|
-
elsif sort_direction == :descending
|
710
|
-
sort_image = 'sort-asc.png'
|
711
|
-
end
|
712
|
-
end
|
713
|
-
|
714
|
-
unless sort_properties.include?(property)
|
715
|
-
builder.th(field_name, :class => css_class)
|
716
|
-
else
|
717
|
-
builder.th(:class => css_class) {
|
718
|
-
builder.a(field_name, :href => "#{url_root}/#{page.class.name}.sort_grid#{tid}/#{property}")
|
719
|
-
builder.a(:href => "#{url_root}/#{page.class.name}.sort_grid#{tid}/#{property}") {
|
720
|
-
builder.img(:alt => "[Sortable]", :class => "t-sort-icon", :id => "#{property}:sort", :src => "#{url_root}/images/#{sort_image}", :name => "#{property}:sort")
|
721
|
-
}
|
722
|
-
}
|
723
|
-
end
|
724
|
-
}
|
725
|
-
# add columns for commands
|
726
|
-
if commands && !commands.empty?
|
727
|
-
(1..commands.size).each do
|
728
|
-
builder.th
|
729
|
-
end
|
730
|
-
end
|
731
|
-
}
|
732
|
-
}
|
733
|
-
|
734
|
-
# body
|
735
|
-
builder.tbody {
|
736
|
-
# data
|
737
|
-
index = 0
|
738
|
-
rows.each do |item|
|
739
|
-
if (rows.last_item_number - rows.first_item_number) == index + 1
|
740
|
-
css_class = "t-last"
|
741
|
-
elsif index == 0
|
742
|
-
css_class = "t-first"
|
743
|
-
else
|
744
|
-
css_class = nil
|
745
|
-
end
|
746
|
-
index = index + 1
|
747
|
-
|
748
|
-
if css_class
|
749
|
-
builder.tr(:class => css_class) {
|
750
|
-
properties.each { |property|
|
751
|
-
field_value = item.send(property)
|
752
|
-
builder.td("#{field_value}", :class => "#{property}")
|
753
|
-
}
|
754
|
-
# add columns for commands
|
755
|
-
if commands && !commands.empty?
|
756
|
-
commands.each { |command|
|
757
|
-
builder.td { |td| td << command.call(tag, item)}
|
758
|
-
}
|
759
|
-
end
|
760
|
-
}
|
761
|
-
else
|
762
|
-
builder.tr {
|
763
|
-
properties.each { |property|
|
764
|
-
field_value = item.send(property)
|
765
|
-
builder.td("#{field_value}", :class => "#{property}")
|
766
|
-
}
|
767
|
-
# add columns for commands
|
768
|
-
if commands && !commands.empty?
|
769
|
-
commands.each { |command|
|
770
|
-
builder.td { |td| td << command.call(tag, item)}
|
771
|
-
}
|
772
|
-
end
|
773
|
-
}
|
774
|
-
end
|
775
|
-
end if rows
|
776
|
-
}
|
777
|
-
}
|
778
|
-
}
|
779
|
-
end
|
780
|
-
end
|
781
|
-
|
782
|
-
class ObjectEditor < Trellis::Component
|
783
|
-
is_stateful
|
784
|
-
|
785
|
-
depends_on :form, :submit
|
786
|
-
|
787
|
-
field :model, :persistent => true
|
788
|
-
attr_reader :retrieve_block
|
789
|
-
attr_reader :properties
|
790
|
-
attr_accessor :submit_text
|
791
|
-
attr_reader :submit_block
|
792
|
-
|
793
|
-
def initialize
|
794
|
-
@properties = []
|
795
|
-
end
|
796
|
-
|
797
|
-
# must be called before rendering
|
798
|
-
def fields(*syms)
|
799
|
-
syms.each do |sym|
|
800
|
-
@properties << sym
|
801
|
-
end
|
802
|
-
end
|
803
|
-
|
804
|
-
def on_submit(&block)
|
805
|
-
# populate the object with values from the session
|
806
|
-
if page.params
|
807
|
-
properties.each do |property|
|
808
|
-
value = page.params[property.to_sym]
|
809
|
-
@model.instance_variable_set("@#{property}".to_sym, value)
|
810
|
-
end
|
811
|
-
end
|
812
|
-
if block_given?
|
813
|
-
@submit_block = block
|
814
|
-
else
|
815
|
-
@submit_block.call(@model)
|
816
|
-
end
|
817
|
-
end
|
818
|
-
|
819
|
-
render do |tag|
|
820
|
-
url_root = tag.globals.page.class.url_root
|
821
|
-
# get the page object
|
822
|
-
page = tag.globals.page
|
823
|
-
# get the tag properties
|
824
|
-
tid = tag.attr['tid']
|
825
|
-
# get the instance of the component from the page
|
826
|
-
editor = page.send("object_editor_#{tid}")
|
827
|
-
# get the properties or columns
|
828
|
-
properties = editor.properties
|
829
|
-
# get the source from either the tag or the component instance itself
|
830
|
-
source = tag.attr['model'] || editor.model
|
831
|
-
submit_text = tag.attr['submit_text'] || editor.submit_text || "Submit"
|
832
|
-
|
833
|
-
builder = Builder::XmlMarkup.new
|
834
|
-
|
835
|
-
# the editor encloses a form
|
836
|
-
form = tag.render("form", "tid" => "form_#{tid}", "method" => "post", "on_behalf" => "object_editor#{tid}") do
|
837
|
-
builder.div(:class => "t-beaneditor") {
|
838
|
-
properties.each { |property|
|
839
|
-
field_name = property.to_s.humanize
|
840
|
-
field_value = source.send(property)
|
841
|
-
builder.div(:class => "t-beaneditor-row") {
|
842
|
-
builder.label(field_name, :for => property, :id => "#{property}:label")
|
843
|
-
builder.input(:id => property, :name => property, :type => "text", :value => field_value)
|
844
|
-
builder.img(:alt => "[Error]", :class => "t-error-icon t-invisible", :id => "#{property}:icon", :src => "#{url_root}/images/field-error-marker.gif", :name => "#{property}:icon")
|
845
|
-
}
|
846
|
-
} if source
|
847
|
-
builder.div(:class => "t-beaneditor-row") {
|
848
|
-
builder << tag.render("submit", "tid" => "submit", "name" => "whats_the_name", "value" => submit_text)
|
849
|
-
}
|
850
|
-
}
|
851
|
-
end
|
852
|
-
form
|
853
|
-
end
|
854
|
-
|
855
|
-
end
|
856
|
-
|
857
507
|
class Div < Trellis::Component
|
858
508
|
render do |tag|
|
859
509
|
attrs = tag.attr.exclude_keys('id', 'title')
|