修訂 | 46 (tree) |
---|---|
時間 | 2008-02-14 23:00:45 |
作者 | junkikuchi |
updated.
@@ -11,7 +11,7 @@ | ||
11 | 11 | 'd'=>nil, 'a'=>10, 'b'=>'a b c', 'c'=>['a', 2, 1] |
12 | 12 | ) |
13 | 13 | |
14 | - assert_equal('a=10&b=a+b+c&c=1&c=2&c=a&d=', q.to_s) | |
14 | + assert_equal('a=10&b=a+b+c&c=1&c=2&c=a&d', q.to_s) | |
15 | 15 | |
16 | 16 | assert_equal('10', q['a']) |
17 | 17 | assert_equal('a b c', q['b']) |
@@ -24,7 +24,7 @@ | ||
24 | 24 | def test_decode |
25 | 25 | q = Tenarai::CGI::Query.decode('d=&a=10&b=a+b+c&c=a&c=1&c=2&c=a') |
26 | 26 | |
27 | - assert_equal('a=10&b=a+b+c&c=1&c=2&c=a&c=a&d=', q.to_s) | |
27 | + assert_equal('a=10&b=a+b+c&c=1&c=2&c=a&c=a&d', q.to_s) | |
28 | 28 | |
29 | 29 | assert_equal('10', q['a']) |
30 | 30 | assert_equal('a b c', q['b']) |
@@ -45,7 +45,7 @@ | ||
45 | 45 | q['c'] = 2 |
46 | 46 | q['c'] = [3, 4] |
47 | 47 | |
48 | - assert_equal('a=10&b=a+b+c&c=1&c=2&c=2&c=3&c=4&c=a&d=', q.to_s) | |
48 | + assert_equal('a=10&b=a+b+c&c=1&c=2&c=2&c=3&c=4&c=a&d', q.to_s) | |
49 | 49 | |
50 | 50 | assert_equal('10', q['a']) |
51 | 51 | assert_equal('a b c', q['b']) |
@@ -365,6 +365,38 @@ | ||
365 | 365 | :row => {}, |
366 | 366 | :relation => {'view' => 'view:resource.admin'}, |
367 | 367 | }, |
368 | + | |
369 | + { | |
370 | + :name => 'session.user.content.view.widget.html.admin.panel', | |
371 | + :class => 'Widget::Panel', | |
372 | + :row => {}, | |
373 | + :relation => {'view' => 'view:resource.admin'}, | |
374 | + :preference => { | |
375 | + 'box.size.width' => '100px', | |
376 | + 'box.size.height' => '100px', | |
377 | + 'box.padding.padding_left' => '10px', | |
378 | + 'box.padding.padding_top' => '10px', | |
379 | + 'box.padding.padding_right' => '10px', | |
380 | + 'box.padding.padding_bottom' => '10px', | |
381 | + 'box.background.background_color' => 'gray', | |
382 | + } | |
383 | + }, | |
384 | + | |
385 | + { | |
386 | + :name => 'session.user.content.view.widget.html.admin.panel.panel', | |
387 | + :class => 'Widget::Panel', | |
388 | + :row => {}, | |
389 | + :relation => {'view' => 'view:resource.admin'}, | |
390 | + :preference => { | |
391 | + 'box.size.width' => '80px', | |
392 | + 'box.size.height' => '80px', | |
393 | + 'box.margin.margin_left' => '10px', | |
394 | + 'box.margin.margin_top' => '10px', | |
395 | + 'box.margin.margin_right' => '10px', | |
396 | + 'box.margin.margin_bottom' => '10px', | |
397 | + 'box.background.background_color' => 'green', | |
398 | + } | |
399 | + }, | |
368 | 400 | ], |
369 | 401 | } |
370 | 402 |
@@ -27,8 +27,12 @@ | ||
27 | 27 | |
28 | 28 | include Enumerable |
29 | 29 | |
30 | - def initialize(query={}) | |
31 | - @query = query | |
30 | + #def initialize(query={}) | |
31 | + # @query = query | |
32 | + #end | |
33 | + # | |
34 | + def initialize | |
35 | + @query = {} | |
32 | 36 | end |
33 | 37 | |
34 | 38 | def [](key) |
@@ -68,7 +72,7 @@ | ||
68 | 72 | @query.sort.inject([]) do |ret, (key, val)| |
69 | 73 | if val.is_a?(Array) |
70 | 74 | val.each do |v| |
71 | - if v.nil? | |
75 | + if v.empty? | |
72 | 76 | ret << key |
73 | 77 | else |
74 | 78 | ret << "%s=%s" % [key, CGI.encode(v)] |
@@ -75,7 +79,7 @@ | ||
75 | 79 | end |
76 | 80 | end |
77 | 81 | else |
78 | - if val.nil? | |
82 | + if val.empty? | |
79 | 83 | ret << key |
80 | 84 | else |
81 | 85 | ret << "%s=%s" % [key, CGI.encode(val)] |
@@ -33,10 +33,16 @@ | ||
33 | 33 | attr_reader :request |
34 | 34 | attr_reader :response |
35 | 35 | |
36 | - def url | |
37 | - ['', name].join('/') | |
36 | + def _build_url(param, res, query) | |
37 | + url = [nil, name, res].join('/') | |
38 | + url += '?' + query.to_s unless query.empty? | |
39 | + url | |
38 | 40 | end |
39 | 41 | |
42 | + def url(*param) | |
43 | + _build_url([], param) | |
44 | + end | |
45 | + | |
40 | 46 | def dispatch(model, param, request, response) |
41 | 47 | begin |
42 | 48 | @model = model |
@@ -43,29 +49,51 @@ | ||
43 | 49 | @request = request |
44 | 50 | @response = response |
45 | 51 | |
46 | - widget.path.each do |r| | |
47 | - r.init(self, *(param.shift || '').split(',')) | |
48 | - end | |
49 | - | |
50 | 52 | method = (@request.method || 'get').downcase |
53 | + ws, rs = {}, {} | |
51 | 54 | |
52 | 55 | if method == 'get' |
53 | 56 | @request.query |
54 | 57 | else |
55 | 58 | @request.query.merge(@request.content) |
56 | - end.inject({}) do |ws, (key, val)| | |
57 | - if /id(\d+):(.+)/.match(key) | |
58 | - wid = $1 | |
59 | + end.each do |key, val| | |
60 | + case key | |
61 | + when /id(\d+):(.+)/ | |
62 | + wid = $1.to_i | |
59 | 63 | key = $2 |
64 | + ws[wid] ||= {} | |
65 | + ws[wid][key] = val | |
66 | + when /id(\d+)/ | |
67 | + wid = $1.to_i | |
68 | + key = nil | |
69 | + rs[wid] ||= {} | |
70 | + rs[wid] = val | |
71 | + end | |
72 | + end | |
73 | + | |
74 | + widget.path.each do |r| | |
75 | + if param.empty? | |
76 | + if rs.key?(r.id) | |
77 | + r.init(self, *rs.delete(r.id).split(',')) | |
78 | + else | |
79 | + r.init(self) | |
80 | + end | |
60 | 81 | else |
61 | - #wid = primary_key | |
82 | + r.init(self, *(param.shift || '').split(',')) | |
62 | 83 | end |
84 | + end | |
63 | 85 | |
64 | - ws[wid] ||= {} | |
65 | - ws[wid][key] = val | |
86 | + rs.inject({}) do |ret, (wid, val)| | |
87 | + w = @model['widget'].fetch(wid) | |
88 | + ret[w] = val unless w.nil? | |
89 | + ret | |
90 | + end.sort do |(aw, aval), (bw, bval)| | |
91 | + aw.min <=> bw.min | |
92 | + end.each do |w, val| | |
93 | + w.init(self, *val.split(',')) | |
94 | + end | |
66 | 95 | |
67 | - ws | |
68 | - end.each do |wid, query| | |
96 | + ws.each do |wid, query| | |
69 | 97 | if w = @model['widget'].fetch(wid) |
70 | 98 | w.__send__(method, self, query) |
71 | 99 | end |
@@ -1,17 +0,0 @@ | ||
1 | -# | |
2 | -# Copyright (C) 2007 Jun Kikuchi <kikuchi@bonnou.com> | |
3 | -# | |
4 | - | |
5 | -class Widget | |
6 | - class Model < Widget | |
7 | - extend Tenarai::ClassLoader | |
8 | - | |
9 | - def url(params={}) | |
10 | - if parent.nil? | |
11 | - model.url(params) | |
12 | - else | |
13 | - parent.url(params) | |
14 | - end | |
15 | - end | |
16 | - end | |
17 | -end |
@@ -2,17 +2,17 @@ | ||
2 | 2 | # Copyright (C) 2007 Jun Kikuchi <kikuchi@bonnou.com> |
3 | 3 | # |
4 | 4 | |
5 | -Tenarai::ClassLoader.load_class('Widget::Content') | |
5 | +Tenarai::ClassLoader.load_class('Widget') | |
6 | 6 | |
7 | 7 | class Widget |
8 | - class Panel < Widget | |
8 | + class Panel < ::Widget | |
9 | 9 | extend Tenarai::ClassLoader |
10 | 10 | |
11 | 11 | preference_css 'box' |
12 | 12 | |
13 | - def render_body(xml) | |
13 | + def render_html(xml, builder) | |
14 | 14 | xml.tag('div', 'id' => html_id) do |div| |
15 | - super(div) | |
15 | + super(div, builder) | |
16 | 16 | end |
17 | 17 | end |
18 | 18 | end |
@@ -38,8 +38,8 @@ | ||
38 | 38 | ) |
39 | 39 | end |
40 | 40 | |
41 | - def url(*param) | |
42 | - super('') | |
41 | + def build_url(param) | |
42 | + nil | |
43 | 43 | end |
44 | 44 | |
45 | 45 | def render_html(xml, builder) |
@@ -4,7 +4,7 @@ | ||
4 | 4 | |
5 | 5 | class Widget |
6 | 6 | module YUI |
7 | - class ResetFontsGrids < Widget | |
7 | + class ResetFontsGrids < ::Widget | |
8 | 8 | extend Tenarai::ClassLoader |
9 | 9 | |
10 | 10 | preference 'yui' do |yui| |
@@ -6,7 +6,7 @@ | ||
6 | 6 | |
7 | 7 | class Widget |
8 | 8 | class User |
9 | - class Logout < Widget | |
9 | + class Logout < ::Widget | |
10 | 10 | extend Tenarai::ClassLoader |
11 | 11 | |
12 | 12 | preference_css 'box' |
@@ -16,10 +16,11 @@ | ||
16 | 16 | end |
17 | 17 | |
18 | 18 | def render_html(xml, builder) |
19 | - query = Tenarai::CGI::Query.new(html_id('logout') => nil) | |
20 | - | |
21 | 19 | xml.tag('div', 'id' => html_id) do |div| |
22 | - div.tag('a', 'href' => url + '?' + query.to_s).text('logout') | |
20 | + div.tag( | |
21 | + 'a', | |
22 | + 'href' => url do |query| query[html_id('logout')] = nil end | |
23 | + ).text('logout') | |
23 | 24 | end |
24 | 25 | end |
25 | 26 | end |
@@ -6,7 +6,7 @@ | ||
6 | 6 | |
7 | 7 | class Widget |
8 | 8 | class User |
9 | - class LoginForm < Widget | |
9 | + class LoginForm < ::Widget | |
10 | 10 | extend Tenarai::ClassLoader |
11 | 11 | |
12 | 12 | preference_css 'box' |
@@ -138,8 +138,8 @@ | ||
138 | 138 | self.class.fetch_resource(self) |
139 | 139 | end |
140 | 140 | |
141 | - def url(*param) | |
142 | - resource.url(*param) | |
141 | + def url(*param, &block) | |
142 | + resource.url(*param, &block) | |
143 | 143 | end |
144 | 144 | |
145 | 145 | def init(service, *param) |
@@ -4,7 +4,7 @@ | ||
4 | 4 | |
5 | 5 | Tenarai::ClassLoader.load_class('Widget') |
6 | 6 | |
7 | -class Resource < Widget | |
7 | +class Resource < ::Widget | |
8 | 8 | extend Tenarai::ClassLoader |
9 | 9 | |
10 | 10 | attr_reader :content |
@@ -14,22 +14,38 @@ | ||
14 | 14 | @content = service.model[self.class.name.split('::').pop.downcase].fetch(id) |
15 | 15 | end |
16 | 16 | |
17 | - def url(*param) | |
18 | - [ | |
19 | - if resource.nil? | |
20 | - @service.url | |
17 | + def build_url(param) | |
18 | + if param.empty? | |
19 | + if @content | |
20 | + @content.id | |
21 | 21 | else |
22 | - resource.url | |
23 | - end, | |
24 | - if param.empty? | |
25 | - if @content | |
26 | - @content.id | |
27 | - else | |
28 | - nil | |
29 | - end | |
30 | - else | |
31 | - param.join(',') | |
22 | + nil | |
32 | 23 | end |
33 | - ].join('/') | |
24 | + else | |
25 | + param | |
26 | + end | |
34 | 27 | end |
28 | + | |
29 | + def _build_url(param, _resource, _query) | |
30 | + _param = [build_url(param)].join(',') | |
31 | + | |
32 | + if view.path.size == 1 | |
33 | + #_resource.unshift(_param) | |
34 | + _query[html_id] = _param | |
35 | + else | |
36 | + _query[html_id] = _param | |
37 | + end | |
38 | + | |
39 | + if resource.nil? | |
40 | + @service | |
41 | + else | |
42 | + resource | |
43 | + end._build_url([], _resource, _query) | |
44 | + end | |
45 | + | |
46 | + def url(*param, &block) | |
47 | + query = Tenarai::CGI::Query.new | |
48 | + block.call(query) if block_given? | |
49 | + _build_url(param, [], query) | |
50 | + end | |
35 | 51 | end |