apotomo 0.1.4 → 1.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +5 -2
- data/Gemfile.lock +70 -21
- data/Rakefile +7 -7
- data/config/routes.rb +3 -3
- data/lib/apotomo/persistence.rb +21 -48
- data/lib/apotomo/rails/view_helper.rb +3 -11
- data/lib/apotomo/request_processor.rb +7 -10
- data/lib/apotomo/transition.rb +2 -2
- data/lib/apotomo/version.rb +1 -1
- data/lib/apotomo/widget.rb +12 -25
- data/lib/apotomo/widget_shortcuts.rb +1 -1
- data/lib/apotomo.rb +6 -0
- data/{generators/widget → lib/generators/apotomo}/USAGE +0 -0
- data/lib/generators/apotomo/templates/view.erb +7 -0
- data/lib/generators/apotomo/templates/view.haml +4 -0
- data/{generators/widget → lib/generators/apotomo}/templates/widget.rb +2 -1
- data/lib/generators/apotomo/templates/widget_test.rb +11 -0
- data/lib/generators/apotomo/widget_generator.rb +19 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/config/application.rb +45 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +26 -0
- data/test/dummy/config/environments/production.rb +49 -0
- data/test/dummy/config/environments/test.rb +35 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/routes.rb +59 -0
- data/test/dummy/tmp/app/cells/mouse_widget.rb +11 -0
- data/test/dummy/tmp/test/widgets/mouse_widget_test.rb +15 -0
- data/test/rails/controller_methods_test.rb +11 -14
- data/test/rails/rails_integration_test.rb +12 -11
- data/test/rails/view_helper_test.rb +4 -27
- data/test/rails/view_methods_test.rb +4 -6
- data/test/rails/widget_generator_test.rb +40 -37
- data/test/support/test_case_methods.rb +34 -7
- data/test/test_helper.rb +12 -24
- data/test/unit/container_test.rb +2 -1
- data/test/unit/event_handler_test.rb +2 -0
- data/test/unit/event_methods_test.rb +4 -3
- data/test/unit/invoke_test.rb +27 -22
- data/test/unit/onfire_integration_test.rb +2 -0
- data/test/unit/persistence_test.rb +51 -90
- data/test/unit/render_test.rb +6 -4
- data/test/unit/request_processor_test.rb +70 -48
- data/test/unit/stateful_widget_test.rb +3 -1
- data/test/unit/transition_test.rb +1 -0
- data/test/unit/widget_shortcuts_test.rb +3 -2
- data/test/unit/widget_test.rb +69 -56
- metadata +57 -34
- data/app/.jeweler_doesnt_like_empty_directories +0 -0
- data/generators/widget/templates/functional_test.rb +0 -8
- data/generators/widget/templates/view.html.erb +0 -2
- data/generators/widget/templates/view.html.haml +0 -3
- data/generators/widget/widget_generator.rb +0 -34
- data/lib/apotomo/test_methods.rb +0 -8
- data/test/support/assertions_helper.rb +0 -13
- data/test/unit/test_methods_test.rb +0 -11
data/Gemfile
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
gem "rails", "~>
|
4
|
-
gem "cells", "3.
|
3
|
+
gem "rails", "~> 3.0.0"
|
4
|
+
gem "cells", :path => "/home/nick/projects/cells"#"3.4.1"
|
5
5
|
gem "onfire"
|
6
6
|
gem "hooks", "~> 0.1.2"
|
7
|
+
|
8
|
+
|
7
9
|
gem "jeweler"
|
8
10
|
|
9
11
|
# for test env:
|
10
12
|
gem "shoulda"
|
11
13
|
gem "mocha"
|
14
|
+
gem 'sqlite3-ruby', '1.2.5', :require => 'sqlite3' # needed in router_test, whatever.
|
data/Gemfile.lock
CHANGED
@@ -1,49 +1,98 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /home/nick/projects/cells
|
3
|
+
specs:
|
4
|
+
cells (3.4.2)
|
5
|
+
|
1
6
|
GEM
|
2
7
|
remote: http://rubygems.org/
|
3
8
|
specs:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
activesupport (=
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
abstract (1.0.0)
|
10
|
+
actionmailer (3.0.0)
|
11
|
+
actionpack (= 3.0.0)
|
12
|
+
mail (~> 2.2.5)
|
13
|
+
actionpack (3.0.0)
|
14
|
+
activemodel (= 3.0.0)
|
15
|
+
activesupport (= 3.0.0)
|
16
|
+
builder (~> 2.1.2)
|
17
|
+
erubis (~> 2.6.6)
|
18
|
+
i18n (~> 0.4.1)
|
19
|
+
rack (~> 1.2.1)
|
20
|
+
rack-mount (~> 0.6.12)
|
21
|
+
rack-test (~> 0.5.4)
|
22
|
+
tzinfo (~> 0.3.23)
|
23
|
+
activemodel (3.0.0)
|
24
|
+
activesupport (= 3.0.0)
|
25
|
+
builder (~> 2.1.2)
|
26
|
+
i18n (~> 0.4.1)
|
27
|
+
activerecord (3.0.0)
|
28
|
+
activemodel (= 3.0.0)
|
29
|
+
activesupport (= 3.0.0)
|
30
|
+
arel (~> 1.0.0)
|
31
|
+
tzinfo (~> 0.3.23)
|
32
|
+
activeresource (3.0.0)
|
33
|
+
activemodel (= 3.0.0)
|
34
|
+
activesupport (= 3.0.0)
|
35
|
+
activesupport (3.0.0)
|
36
|
+
arel (1.0.1)
|
37
|
+
activesupport (~> 3.0.0)
|
38
|
+
builder (2.1.2)
|
39
|
+
erubis (2.6.6)
|
40
|
+
abstract (>= 1.0.0)
|
15
41
|
gemcutter (0.6.1)
|
16
42
|
git (1.2.5)
|
17
43
|
hooks (0.1.2)
|
44
|
+
i18n (0.4.1)
|
18
45
|
jeweler (1.4.0)
|
19
46
|
gemcutter (>= 0.1.0)
|
20
47
|
git (>= 1.2.5)
|
21
48
|
rubyforge (>= 2.0.0)
|
22
49
|
json_pure (1.4.6)
|
50
|
+
mail (2.2.6.1)
|
51
|
+
activesupport (>= 2.3.6)
|
52
|
+
mime-types
|
53
|
+
treetop (>= 1.4.5)
|
54
|
+
mime-types (1.16)
|
23
55
|
mocha (0.9.8)
|
24
56
|
rake
|
25
57
|
onfire (0.1.0)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
58
|
+
polyglot (0.3.1)
|
59
|
+
rack (1.2.1)
|
60
|
+
rack-mount (0.6.13)
|
61
|
+
rack (>= 1.0.0)
|
62
|
+
rack-test (0.5.6)
|
63
|
+
rack (>= 1.0)
|
64
|
+
rails (3.0.0)
|
65
|
+
actionmailer (= 3.0.0)
|
66
|
+
actionpack (= 3.0.0)
|
67
|
+
activerecord (= 3.0.0)
|
68
|
+
activeresource (= 3.0.0)
|
69
|
+
activesupport (= 3.0.0)
|
70
|
+
bundler (~> 1.0.0)
|
71
|
+
railties (= 3.0.0)
|
72
|
+
railties (3.0.0)
|
73
|
+
actionpack (= 3.0.0)
|
74
|
+
activesupport (= 3.0.0)
|
75
|
+
rake (>= 0.8.4)
|
76
|
+
thor (~> 0.14.0)
|
34
77
|
rake (0.8.7)
|
35
78
|
rubyforge (2.0.4)
|
36
79
|
json_pure (>= 1.1.7)
|
37
80
|
shoulda (2.11.3)
|
81
|
+
sqlite3-ruby (1.2.5)
|
82
|
+
thor (0.14.3)
|
83
|
+
treetop (1.4.8)
|
84
|
+
polyglot (>= 0.3.1)
|
85
|
+
tzinfo (0.3.23)
|
38
86
|
|
39
87
|
PLATFORMS
|
40
88
|
ruby
|
41
89
|
|
42
90
|
DEPENDENCIES
|
43
|
-
cells
|
91
|
+
cells!
|
44
92
|
hooks (~> 0.1.2)
|
45
93
|
jeweler
|
46
94
|
mocha
|
47
95
|
onfire
|
48
|
-
rails (~>
|
96
|
+
rails (~> 3.0.0)
|
49
97
|
shoulda
|
98
|
+
sqlite3-ruby (= 1.2.5)
|
data/Rakefile
CHANGED
@@ -11,9 +11,9 @@ desc 'Default: run unit tests.'
|
|
11
11
|
task :default => :test
|
12
12
|
|
13
13
|
desc 'Test the Apotomo plugin.'
|
14
|
-
Rake::TestTask.new(:test) do |t|
|
14
|
+
Rake::TestTask.new(:test) do |t|
|
15
15
|
t.libs << 'test'
|
16
|
-
t.
|
16
|
+
t.test_files = FileList['test/unit/*_test.rb', 'test/rails/*_test.rb']# - ['test/rails/capture_test.rb']
|
17
17
|
t.verbose = true
|
18
18
|
end
|
19
19
|
|
@@ -24,16 +24,16 @@ require 'apotomo/version'
|
|
24
24
|
Jeweler::Tasks.new do |spec|
|
25
25
|
spec.name = "apotomo"
|
26
26
|
spec.version = ::Apotomo::VERSION
|
27
|
-
spec.summary = %{
|
28
|
-
spec.description = "
|
27
|
+
spec.summary = %{Web components for Rails.}
|
28
|
+
spec.description = "Web components for Rails. Event-driven. Clean. Fast. Free optional statefulness included."
|
29
29
|
spec.homepage = "http://apotomo.de"
|
30
30
|
spec.authors = ["Nick Sutterer"]
|
31
31
|
spec.email = "apotonick@gmail.com"
|
32
32
|
|
33
|
-
spec.files = FileList["
|
33
|
+
spec.files = FileList["[A-Z]*", File.join(*%w[{generators,lib,rails,app,config} ** *]).to_s]
|
34
34
|
|
35
|
-
spec.add_dependency 'cells', '~> 3.
|
36
|
-
spec.add_dependency '
|
35
|
+
spec.add_dependency 'cells', '~> 3.4.2'
|
36
|
+
spec.add_dependency 'rails', '>= 3.0.0'
|
37
37
|
spec.add_dependency 'onfire', '>= 0.1.0'
|
38
38
|
spec.add_dependency 'hooks', '~> 0.1.2'
|
39
39
|
end
|
data/config/routes.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
end
|
1
|
+
Rails.application.routes.draw do |map|
|
2
|
+
match ":controller/render_event_response", :to => "#render_event_response", :as => "apotomo_event"
|
3
|
+
end
|
data/lib/apotomo/persistence.rb
CHANGED
@@ -42,59 +42,29 @@ module Apotomo
|
|
42
42
|
end
|
43
43
|
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
field_sep = self.class.field_sep
|
48
|
-
"#{@name}#{field_sep}#{self.class}#{field_sep}#{root? ? @name : parent.name}"
|
45
|
+
def dump_tree
|
46
|
+
collect { |n| [n.class, n.name, n.root? ? nil : n.parent.name] }
|
49
47
|
end
|
50
48
|
|
51
|
-
# Serializes the tree structure.
|
52
|
-
def _dump(depth)
|
53
|
-
inject("") { |str, node| str << node.dump_node << self.class.node_sep }
|
54
|
-
end
|
55
49
|
|
56
50
|
module ClassMethods
|
57
|
-
|
58
|
-
def node_sep; "\n"; end
|
59
|
-
|
60
|
-
# Creates an empty widget instance from <tt>line</tt>.
|
61
|
-
def load_node(line)
|
62
|
-
name, klass, parent = line.split(field_sep)
|
63
|
-
[klass.constantize.new(name, nil), parent]
|
64
|
-
end
|
65
|
-
|
66
|
-
def _load(str)
|
67
|
-
nodes = {}
|
68
|
-
root = nil
|
69
|
-
str.split(node_sep).each do |line|
|
70
|
-
node, parent = load_node(line)
|
71
|
-
nodes[node.name] = node
|
72
|
-
|
73
|
-
if node.name == parent # we're at the root node.
|
74
|
-
root = node and next
|
75
|
-
end
|
76
|
-
|
77
|
-
nodes[parent].add(node)
|
78
|
-
end
|
79
|
-
root
|
80
|
-
end
|
81
|
-
|
51
|
+
# Dump the shit to storage.
|
82
52
|
def freeze_for(storage, root)
|
83
53
|
storage[:apotomo_stateful_branches] = []
|
84
54
|
storage[:apotomo_widget_ivars] = {}
|
85
55
|
|
86
56
|
stateful_branches_for(root).each do |branch|
|
87
57
|
branch.freeze_data_to(storage[:apotomo_widget_ivars]) # save ivars.
|
88
|
-
storage[:apotomo_stateful_branches] <<
|
89
|
-
branch.root! # disconnect from tree.
|
58
|
+
storage[:apotomo_stateful_branches] << branch.dump_tree
|
90
59
|
end
|
91
60
|
end
|
92
61
|
|
93
|
-
|
62
|
+
# Create tree from storage and add branches to root/stateless parents.
|
63
|
+
def thaw_for(controller, storage, root)
|
94
64
|
branches = storage.delete(:apotomo_stateful_branches) || []
|
95
|
-
branches.each do |
|
96
|
-
branch =
|
97
|
-
parent = root.find_widget(
|
65
|
+
branches.each do |data|
|
66
|
+
branch = load_tree(controller, data)
|
67
|
+
parent = root.find_widget(data.first.last) or raise "Couldn't find parent `#{data.first.last}` for `#{branch.name}`"
|
98
68
|
|
99
69
|
parent << branch
|
100
70
|
branch.thaw_data_from(storage.delete(:apotomo_widget_ivars) || {})
|
@@ -102,16 +72,9 @@ module Apotomo
|
|
102
72
|
|
103
73
|
root
|
104
74
|
end
|
105
|
-
|
106
|
-
def thaw_from(storage)
|
107
|
-
root = storage[:apotomo_root]
|
108
|
-
root.thaw_data_from(storage.fetch(:apotomo_widget_ivars, {}))
|
109
|
-
root
|
110
|
-
end
|
111
75
|
|
112
76
|
def frozen_widget_in?(storage)
|
113
|
-
|
114
|
-
branches.present? and branches.first.first.kind_of? Apotomo::StatefulWidget
|
77
|
+
storage[:apotomo_stateful_branches].kind_of? Array
|
115
78
|
end
|
116
79
|
|
117
80
|
def flush_storage(storage)
|
@@ -134,6 +97,16 @@ module Apotomo
|
|
134
97
|
stateful_roots
|
135
98
|
end
|
136
99
|
|
100
|
+
private
|
101
|
+
def load_tree(parent_controller, cold_widgets)
|
102
|
+
root = nil
|
103
|
+
cold_widgets.each do |data|
|
104
|
+
node = data[0].new(parent_controller, data[1], "")
|
105
|
+
root = node and next unless root
|
106
|
+
root.find_widget(data[2]) << node
|
107
|
+
end
|
108
|
+
root
|
109
|
+
end
|
137
110
|
end
|
138
111
|
end
|
139
|
-
end
|
112
|
+
end
|
@@ -22,14 +22,6 @@ module Apotomo
|
|
22
22
|
js_generator.xhr(url_for_event(type, options))
|
23
23
|
end
|
24
24
|
|
25
|
-
# Creates a link that triggers an event via AJAX.
|
26
|
-
# This link will <em>only</em> work in JavaScript-able browsers.
|
27
|
-
#
|
28
|
-
# Note that the link is created using #link_to_remote.
|
29
|
-
def link_to_event(title, type, options={}, html_options={})
|
30
|
-
link_to_remote(title, {:url => url_for_event(type, options)}, html_options)
|
31
|
-
end
|
32
|
-
|
33
25
|
# Creates a form tag that triggers an event via AJAX when submitted.
|
34
26
|
# See StatefulWidget::address_for_event for options.
|
35
27
|
#
|
@@ -49,7 +41,7 @@ module Apotomo
|
|
49
41
|
html_options.reverse_merge! :target => :apotomo_iframe, :multipart => true
|
50
42
|
|
51
43
|
# i hate rails:
|
52
|
-
concat('<iframe id="apotomo_iframe" name="apotomo_iframe" style="display: none;"></iframe>') << form_tag(url_for_event(type, options), html_options, &block)
|
44
|
+
concat('<iframe id="apotomo_iframe" name="apotomo_iframe" style="display: none;"></iframe>'.html_safe) << form_tag(url_for_event(type, options), html_options, &block)
|
53
45
|
end
|
54
46
|
|
55
47
|
# Returns the url to trigger a +type+ event from the currently rendered widget.
|
@@ -62,7 +54,7 @@ module Apotomo
|
|
62
54
|
# #=> http://apotomo.de/mouse/process_event_request?type=paginate&source=mouse&page=2
|
63
55
|
def url_for_event(type, options={})
|
64
56
|
options.reverse_merge! :source => widget_id
|
65
|
-
|
57
|
+
@cell.url_for_event(type, options) # FIXME: don't access @parent_controller but @cell.
|
66
58
|
end
|
67
59
|
|
68
60
|
### TODO: test me.
|
@@ -73,7 +65,7 @@ module Apotomo
|
|
73
65
|
### TODO: test me.
|
74
66
|
### DISCUSS: rename to rendered_children ?
|
75
67
|
def content
|
76
|
-
@rendered_children.collect{|e| e.last}.join("\n")
|
68
|
+
@rendered_children.collect{|e| e.last}.join("\n").html_safe
|
77
69
|
end
|
78
70
|
|
79
71
|
# needs: suppress_javascript
|
@@ -1,20 +1,17 @@
|
|
1
1
|
module Apotomo
|
2
2
|
class RequestProcessor
|
3
|
-
include WidgetShortcuts
|
4
|
-
|
5
3
|
attr_reader :session, :root
|
6
4
|
|
7
5
|
def initialize(controller, session, options={}, has_widgets_blocks=[])
|
8
6
|
@session = session
|
9
7
|
@widgets_flushed = false
|
10
8
|
|
11
|
-
@root =
|
12
|
-
@root.controller = controller
|
9
|
+
@root = Widget.new(controller, 'root', :display)
|
13
10
|
|
14
11
|
attach_stateless_blocks_for(has_widgets_blocks, @root, controller)
|
15
12
|
|
16
13
|
if options[:flush_widgets].blank? and ::Apotomo::StatefulWidget.frozen_widget_in?(session)
|
17
|
-
@root = ::Apotomo::StatefulWidget.thaw_for(session, @root)
|
14
|
+
@root = ::Apotomo::StatefulWidget.thaw_for(controller, session, @root)
|
18
15
|
else
|
19
16
|
#@root = flushed_root
|
20
17
|
|
@@ -27,14 +24,14 @@ module Apotomo
|
|
27
24
|
def attach_stateless_blocks_for(blocks, root, controller)
|
28
25
|
blocks.each do |blk|
|
29
26
|
if blk.arity == 1
|
30
|
-
blk.call(root) and next # fixes misbehaviour in ruby 1.8.
|
27
|
+
#blk.call(root) and next # fixes misbehaviour in ruby 1.8.
|
28
|
+
root.instance_exec(root, &blk) and next
|
31
29
|
end
|
32
|
-
|
33
|
-
|
30
|
+
### FIXME: use Widget.has_widgets func.
|
31
|
+
root.instance_exec(root, controller, &blk)
|
34
32
|
end
|
35
33
|
end
|
36
34
|
|
37
|
-
|
38
35
|
def flushed_root
|
39
36
|
StatefulWidget.flush_storage(session)
|
40
37
|
@widgets_flushed = true
|
@@ -95,4 +92,4 @@ module Apotomo
|
|
95
92
|
options
|
96
93
|
end
|
97
94
|
end
|
98
|
-
end
|
95
|
+
end
|
data/lib/apotomo/transition.rb
CHANGED
@@ -26,7 +26,7 @@ module Apotomo::Transition
|
|
26
26
|
# to the start state.
|
27
27
|
def transition(options)
|
28
28
|
if from = options[:from]
|
29
|
-
class_transitions[from] = options[:to]
|
29
|
+
class_transitions[from.to_s] = options[:to]
|
30
30
|
elsif loop = options[:in]
|
31
31
|
transition :from => loop, :to => loop
|
32
32
|
end
|
@@ -41,6 +41,6 @@ module Apotomo::Transition
|
|
41
41
|
# Returns the next state for <tt>state</tt> or nil. A next state must have been defined
|
42
42
|
# with #transition.
|
43
43
|
def next_state_for(state)
|
44
|
-
self.class.class_transitions[state]
|
44
|
+
self.class.class_transitions[state.to_s]
|
45
45
|
end
|
46
46
|
end
|
data/lib/apotomo/version.rb
CHANGED
data/lib/apotomo/widget.rb
CHANGED
@@ -35,10 +35,6 @@ module Apotomo
|
|
35
35
|
attr_writer :controller
|
36
36
|
attr_accessor :version
|
37
37
|
|
38
|
-
#class << self
|
39
|
-
# include WidgetShortcuts
|
40
|
-
#end
|
41
|
-
|
42
38
|
include TreeNode
|
43
39
|
|
44
40
|
include Onfire
|
@@ -56,30 +52,29 @@ module Apotomo
|
|
56
52
|
self.class.callbacks_for_hook(name).each { |blk| instance_exec(*args, &blk) }
|
57
53
|
end
|
58
54
|
|
59
|
-
|
60
55
|
def add_has_widgets_blocks(*)
|
61
56
|
run_widget_hook(:has_widgets, self)
|
62
57
|
end
|
63
58
|
after_initialize :add_has_widgets_blocks
|
64
59
|
|
65
60
|
|
66
|
-
# Constructor which needs a unique id for the widget and one or multiple start states.
|
67
|
-
|
68
|
-
|
69
|
-
|
61
|
+
# Constructor which needs a unique id for the widget and one or multiple start states.
|
62
|
+
def initialize(parent_controller, id, start_state, opts={})
|
63
|
+
super(parent_controller, opts) # do that as long as cells do need a parent_controller.
|
64
|
+
|
70
65
|
@name = id
|
71
66
|
@start_state = start_state
|
72
67
|
|
73
68
|
@visible = true
|
74
|
-
@version = 0
|
69
|
+
@version = 0 ### DISCUSS: neeed in stateLESS?
|
75
70
|
|
76
|
-
@cell = self
|
71
|
+
@cell = self ### DISCUSS: needed?
|
77
72
|
|
78
73
|
run_hook(:after_initialize, id, start_state, opts)
|
79
74
|
end
|
80
75
|
|
81
76
|
def last_state
|
82
|
-
|
77
|
+
action_name
|
83
78
|
end
|
84
79
|
|
85
80
|
def visible?
|
@@ -93,7 +88,7 @@ module Apotomo
|
|
93
88
|
end
|
94
89
|
|
95
90
|
def unfreezable_ivars
|
96
|
-
[:@childrenHash, :@children, :@parent, :@
|
91
|
+
[:@childrenHash, :@children, :@parent, :@parent_controller, :@_request, :@_config, :@cell, :@invoke_block, :@rendered_children, :@page_updates, :@opts,
|
97
92
|
:@suppress_javascript ### FIXME: implement with ActiveHelper and :locals.
|
98
93
|
|
99
94
|
]
|
@@ -126,13 +121,6 @@ module Apotomo
|
|
126
121
|
end
|
127
122
|
|
128
123
|
|
129
|
-
|
130
|
-
# called in Cell::Base#render_state
|
131
|
-
def dispatch_state(state)
|
132
|
-
send(state, &@invoke_block)
|
133
|
-
end
|
134
|
-
|
135
|
-
|
136
124
|
# Render the view for the current state. Usually called at the end of a state method.
|
137
125
|
#
|
138
126
|
# ==== Options
|
@@ -184,11 +172,10 @@ module Apotomo
|
|
184
172
|
|
185
173
|
options[:locals].reverse_merge!(:rendered_children => rendered_children)
|
186
174
|
|
187
|
-
@controller = controller # that dependency SUCKS.
|
188
175
|
@suppress_js = options[:suppress_js] ### FIXME: implement with ActiveHelper and :locals.
|
189
176
|
|
190
177
|
|
191
|
-
render_view_for(options,
|
178
|
+
render_view_for(options, action_name) # defined in Cell::Base.
|
192
179
|
end
|
193
180
|
|
194
181
|
alias_method :emit, :render
|
@@ -242,7 +229,7 @@ module Apotomo
|
|
242
229
|
end
|
243
230
|
|
244
231
|
def render_children(invoke_options={})
|
245
|
-
|
232
|
+
ActiveSupport::OrderedHash.new.tap do |rendered_children|
|
246
233
|
visible_children.each do |kid|
|
247
234
|
child_state = decide_state_for(kid, invoke_options)
|
248
235
|
logger.debug " #{kid.name} -> #{child_state}"
|
@@ -295,8 +282,8 @@ module Apotomo
|
|
295
282
|
find {|node| node.name.to_s == widget_id.to_s}
|
296
283
|
end
|
297
284
|
|
298
|
-
def
|
299
|
-
|
285
|
+
def url_for_event(*args)
|
286
|
+
parent_controller.url_for_event(*args)
|
300
287
|
end
|
301
288
|
|
302
289
|
alias_method :widget_id, :name
|
@@ -12,7 +12,7 @@ module Apotomo
|
|
12
12
|
#
|
13
13
|
# widget('jquery/tabs', 'panel')
|
14
14
|
def widget(class_name, id, state=:display, *args)
|
15
|
-
object = constant_for(class_name).new(id, state, *args)
|
15
|
+
object = constant_for(class_name).new(parent_controller, id, state, *args)
|
16
16
|
yield object if block_given?
|
17
17
|
object
|
18
18
|
end
|
data/lib/apotomo.rb
CHANGED
@@ -40,6 +40,9 @@ module Apotomo
|
|
40
40
|
yield self
|
41
41
|
end
|
42
42
|
end
|
43
|
+
|
44
|
+
class Engine < Rails::Engine
|
45
|
+
end
|
43
46
|
end
|
44
47
|
|
45
48
|
require 'apotomo/javascript_generator'
|
@@ -49,3 +52,6 @@ require 'apotomo/widget'
|
|
49
52
|
require 'apotomo/stateful_widget'
|
50
53
|
require 'apotomo/container_widget'
|
51
54
|
require 'apotomo/widget_shortcuts'
|
55
|
+
require 'apotomo/rails/controller_methods'
|
56
|
+
|
57
|
+
#require 'apotomo/engine' if defined?(Rails)
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'generators/cells/cell_generator'
|
2
|
+
|
3
|
+
module Apotomo
|
4
|
+
module Generators
|
5
|
+
class WidgetGenerator < Cells::Generators::CellGenerator
|
6
|
+
source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
7
|
+
|
8
|
+
def create_cell_file
|
9
|
+
puts "creating #{file_name}.rb"
|
10
|
+
template 'widget.rb', File.join('app/cells', class_path, "#{file_name}.rb")
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_test
|
14
|
+
@states = actions
|
15
|
+
template 'widget_test.rb', File.join('test/widgets/', "#{file_name}_test.rb")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require "active_model/railtie"
|
4
|
+
require "active_record/railtie"
|
5
|
+
require "action_controller/railtie"
|
6
|
+
require "action_view/railtie"
|
7
|
+
require "action_mailer/railtie"
|
8
|
+
|
9
|
+
Bundler.require
|
10
|
+
#require "dummy"
|
11
|
+
|
12
|
+
module Dummy
|
13
|
+
class Application < Rails::Application
|
14
|
+
# Settings in config/environments/* take precedence over those specified here.
|
15
|
+
# Application configuration should go into files in config/initializers
|
16
|
+
# -- all .rb files in that directory are automatically loaded.
|
17
|
+
|
18
|
+
# Custom directories with classes and modules you want to be autoloadable.
|
19
|
+
# config.autoload_paths += %W(#{config.root}/extras)
|
20
|
+
|
21
|
+
# Only load the plugins named here, in the order given (default is alphabetical).
|
22
|
+
# :all can be used as a placeholder for all plugins not explicitly named.
|
23
|
+
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
24
|
+
|
25
|
+
# Activate observers that should always be running.
|
26
|
+
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
27
|
+
|
28
|
+
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
29
|
+
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
30
|
+
# config.time_zone = 'Central Time (US & Canada)'
|
31
|
+
|
32
|
+
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
33
|
+
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
34
|
+
# config.i18n.default_locale = :de
|
35
|
+
|
36
|
+
# JavaScript files you want as :defaults (application.js is always included).
|
37
|
+
# config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
|
38
|
+
|
39
|
+
# Configure the default encoding used in templates for Ruby 1.9.
|
40
|
+
config.encoding = "utf-8"
|
41
|
+
|
42
|
+
# Configure sensitive parameters which will be filtered from the log file.
|
43
|
+
config.filter_parameters += [:password]
|
44
|
+
end
|
45
|
+
end
|