extjs-mvc 0.1.16 → 0.1.17
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/VERSION +1 -1
- data/lib/extjs/component.rb +48 -0
- data/lib/extjs/data/store.rb +65 -0
- data/lib/extjs-mvc.rb +6 -1
- data/lib/helpers/component.rb +35 -0
- data/lib/helpers/store.rb +7 -0
- data/lib/mvc.rb +8 -5
- metadata +6 -4
- data/lib/action_view/helpers/component.rb +0 -57
- data/lib/action_view/helpers/store.rb +0 -48
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.17
|
@@ -0,0 +1,48 @@
|
|
1
|
+
##
|
2
|
+
# @class ExtJS::Component
|
3
|
+
#
|
4
|
+
class ExtJS::Component
|
5
|
+
attr_accessor :config
|
6
|
+
def initialize(controller, params)
|
7
|
+
@config = params.extract_options!
|
8
|
+
@controller = controller
|
9
|
+
|
10
|
+
@config[:items] = [] if config[:items].nil?
|
11
|
+
|
12
|
+
if container = @config.delete(:container)
|
13
|
+
container.add(self)
|
14
|
+
end
|
15
|
+
@partial_config = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def apply(params)
|
19
|
+
@config.merge!(params)
|
20
|
+
end
|
21
|
+
|
22
|
+
def add(*config)
|
23
|
+
options = config.extract_options!
|
24
|
+
if !options.keys.empty?
|
25
|
+
if url = options.delete(:partial)
|
26
|
+
# rendering a partial, cache the config until partial calls #add method. @see else.
|
27
|
+
@partial_config = options
|
28
|
+
return @controller.render(:partial => url, :locals => {:container => self})
|
29
|
+
else
|
30
|
+
options.merge!(@partial_config) unless @partial_config.nil?
|
31
|
+
@config[:items] << options
|
32
|
+
end
|
33
|
+
elsif !config.empty? && config.first.kind_of?(ExtJS::Component)
|
34
|
+
cmp = config.first
|
35
|
+
cmp.apply(@partial_config) unless @partial_config.nil?
|
36
|
+
@config[:items] << cmp.config
|
37
|
+
end
|
38
|
+
@partial_config = nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def render
|
42
|
+
# If there are any listeners attached in json, we have to get rid of double-quotes in order to expose
|
43
|
+
# the javascript object.
|
44
|
+
# eg: "listeners":"SomeController.listeners.grid" -> {"listeners":SomeController.listeners.grid, ...}
|
45
|
+
json = @config.to_json.gsub(/\"listeners\":\s?\"([a-zA-Z\.\[\]\(\)]+)\"/, '"listeners":\1')
|
46
|
+
"Ext.ComponentMgr.create(#{json});"
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
##
|
2
|
+
# ExtJS::Data::Store
|
3
|
+
#
|
4
|
+
module ExtJS::Data
|
5
|
+
class Store
|
6
|
+
def initialize(params)
|
7
|
+
options = params.extract_options!
|
8
|
+
options[:format] = 'json' if options[:format].nil?
|
9
|
+
|
10
|
+
@config = options[:config]
|
11
|
+
|
12
|
+
@format = options[:format]
|
13
|
+
@proxy = options[:proxy] || 'http'
|
14
|
+
@writer = options[:writer]
|
15
|
+
@type = (@proxy === 'direct' ? @proxy : @format).capitalize
|
16
|
+
@controller = "#{options[:controller].to_s.capitalize}Controller".constantize
|
17
|
+
@model = ((options[:model]) ? options[:model] : @controller.controller_name.singularize).camelize.constantize
|
18
|
+
|
19
|
+
# Merge Reader/Proxy config
|
20
|
+
@config.merge!(@controller.extjs_reader(@model))
|
21
|
+
@config.merge!(@controller.extjs_proxy(options))
|
22
|
+
|
23
|
+
# Set storeId implicitly based upon Model name if not set explicitly
|
24
|
+
@config["storeId"] = @model.to_s.downcase unless @config["storeId"]
|
25
|
+
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# pre-load a store with data. Not yet tested. In theory, this *should* work.
|
29
|
+
#
|
30
|
+
def load(*params)
|
31
|
+
#@config["loadData"] = @model.all(params).collect {|rec| rec.to_record }
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# renders the configured store
|
36
|
+
# @param {Boolean} script_tag [true] Not yet implemented. Always renders <script></script> tags.
|
37
|
+
def render(script_tag = true)
|
38
|
+
script = ''
|
39
|
+
# ugly hack for DirectProxy API. Have to add an Ext.onReady() after the Store constructor to set API
|
40
|
+
if @proxy === 'direct'
|
41
|
+
auto_load = @config.delete("autoLoad")
|
42
|
+
cname = @controller.capitalize
|
43
|
+
script = "Ext.onReady(function() { var s = Ext.StoreMgr.get('#{@config["storeId"]}');"
|
44
|
+
if (@options["directFn"])
|
45
|
+
script += "s.proxy.directFn = #{cname}.#{@config["directFn"]};"
|
46
|
+
else
|
47
|
+
script += "s.proxy.setApi({create:#{cname}.#{@config["api"]["create"]},read:#{cname}.#{@config["api"]["read"]},update:#{cname}.#{@config["api"]["update"]},destroy:#{cname}.#{@config["api"]["destroy"]}});"
|
48
|
+
end
|
49
|
+
if auto_load
|
50
|
+
script += "s.load();"
|
51
|
+
end
|
52
|
+
script += "});"
|
53
|
+
end
|
54
|
+
|
55
|
+
if @writer # <-- ugly hack because 3.0.1 can't deal with Writer as config-param
|
56
|
+
json = @config.to_json
|
57
|
+
json[json.length-1] = ','
|
58
|
+
json += "writer:new Ext.data.#{@format.capitalize}Writer(#{@writer.to_json})}"
|
59
|
+
"<script>new Ext.data.#{@type}Store(#{json});#{script}</script>"
|
60
|
+
else
|
61
|
+
"<script>new Ext.data.#{@type}Store(#{@config.to_json});#{script}</script>"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/extjs-mvc.rb
CHANGED
@@ -10,9 +10,14 @@ module ExtJS
|
|
10
10
|
if defined?(ActiveRecord)
|
11
11
|
require 'active_record/model'
|
12
12
|
end
|
13
|
+
require 'extjs/component'
|
14
|
+
require 'extjs/data/store'
|
15
|
+
|
13
16
|
require 'action_view/helpers/component'
|
14
|
-
require 'action_controller/controller'
|
15
17
|
require 'action_view/helpers/store'
|
18
|
+
|
19
|
+
require 'action_controller/controller'
|
20
|
+
|
16
21
|
end
|
17
22
|
end
|
18
23
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
##
|
2
|
+
# ExtJS::Helpers::Component
|
3
|
+
#
|
4
|
+
module ExtJS::Helpers
|
5
|
+
module Component
|
6
|
+
##
|
7
|
+
# add class-var @@extjs_on_ready
|
8
|
+
def self.included(controller)
|
9
|
+
controller.class_eval do
|
10
|
+
@@onready_queue = []
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def extjs_component(*params)
|
15
|
+
ExtJS::Component.new(self, params)
|
16
|
+
end
|
17
|
+
|
18
|
+
##
|
19
|
+
# Adds a script or ExtJS::Component instance to on_ready queue. The queue is emptied and rendered to
|
20
|
+
# <script></script> via #extjs_render
|
21
|
+
#
|
22
|
+
def extjs_onready(*params)
|
23
|
+
params.each do |cmp|
|
24
|
+
@@onready_queue << cmp
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Empties the on_ready queue. Renders within <script></script> tags
|
30
|
+
#
|
31
|
+
def extjs_render
|
32
|
+
"<script>\nExt.onReady(function() {\n\t#{@@onready_queue.collect {|cmp| (cmp.kind_of?(ExtJS::Component)) ? cmp.render : cmp}.join("\n\t")}\n });\n</script>"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/mvc.rb
CHANGED
@@ -10,10 +10,13 @@ module ExtJS
|
|
10
10
|
if defined?(ActiveRecord)
|
11
11
|
require 'active_record/model'
|
12
12
|
end
|
13
|
-
require '
|
14
|
-
require '
|
15
|
-
require 'action_view/helpers/component'
|
16
|
-
end
|
17
|
-
end
|
13
|
+
require 'extjs/component'
|
14
|
+
require 'extjs/data/store'
|
18
15
|
|
16
|
+
require 'helpers/component'
|
17
|
+
require 'helpers/store'
|
19
18
|
|
19
|
+
require 'action_controller/controller'
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extjs-mvc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Scott
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-05 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -39,11 +39,13 @@ files:
|
|
39
39
|
- Rakefile
|
40
40
|
- VERSION
|
41
41
|
- lib/action_controller/controller.rb
|
42
|
-
- lib/action_view/helpers/component.rb
|
43
|
-
- lib/action_view/helpers/store.rb
|
44
42
|
- lib/active_record/model.rb
|
45
43
|
- lib/dm/model.rb
|
46
44
|
- lib/extjs-mvc.rb
|
45
|
+
- lib/extjs/component.rb
|
46
|
+
- lib/extjs/data/store.rb
|
47
|
+
- lib/helpers/component.rb
|
48
|
+
- lib/helpers/store.rb
|
47
49
|
- lib/mvc.rb
|
48
50
|
- test/mvc_test.rb
|
49
51
|
- test/test_helper.rb
|
@@ -1,57 +0,0 @@
|
|
1
|
-
module ExtJS::Helpers
|
2
|
-
module Component
|
3
|
-
def extjs_component(*params)
|
4
|
-
ExtJS::Component.new(self, params.extract_options!)
|
5
|
-
end
|
6
|
-
|
7
|
-
def extjs_onready(*params)
|
8
|
-
output = ''
|
9
|
-
params.each do |cmp|
|
10
|
-
output += (cmp.kind_of?(ExtJS::Component)) ? cmp.render : cmp
|
11
|
-
end
|
12
|
-
"<script>Ext.onReady(function() { #{output} });</script>"
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class ExtJS::Component
|
19
|
-
attr_accessor :config
|
20
|
-
def initialize(controller, config)
|
21
|
-
@controller = controller
|
22
|
-
@config = config
|
23
|
-
@config[:items] = [] if config[:items].nil?
|
24
|
-
|
25
|
-
if container = @config.delete(:container)
|
26
|
-
container.add(self)
|
27
|
-
end
|
28
|
-
@partial_config = nil
|
29
|
-
end
|
30
|
-
|
31
|
-
def apply(params)
|
32
|
-
@config.merge!(params)
|
33
|
-
end
|
34
|
-
|
35
|
-
def add(*config)
|
36
|
-
options = config.extract_options!
|
37
|
-
if !options.keys.empty?
|
38
|
-
if url = options.delete(:partial)
|
39
|
-
# rendering a partial, cache the config until partial calls #add method. @see else.
|
40
|
-
@partial_config = options
|
41
|
-
return @controller.render(:partial => url, :locals => {:container => self})
|
42
|
-
else
|
43
|
-
options.merge!(@partial_config) unless @partial_config.nil?
|
44
|
-
@config[:items] << options
|
45
|
-
end
|
46
|
-
elsif !config.empty? && config.first.kind_of?(ExtJS::Component)
|
47
|
-
cmp = config.first
|
48
|
-
cmp.apply(@partial_config) unless @partial_config.nil?
|
49
|
-
@config[:items] << cmp.config
|
50
|
-
end
|
51
|
-
@partial_config = nil
|
52
|
-
end
|
53
|
-
|
54
|
-
def render
|
55
|
-
"Ext.ComponentMgr.create(#{@config.to_json});"
|
56
|
-
end
|
57
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
module ExtJS::Helpers
|
2
|
-
module Store
|
3
|
-
def extjs_store(params)
|
4
|
-
params[:format] = 'json' if params[:format].nil?
|
5
|
-
params[:proxy] = 'http' if params[:proxy].nil?
|
6
|
-
|
7
|
-
controller = "#{params[:controller].to_s.capitalize}Controller".constantize
|
8
|
-
model = ((params[:model]) ? params[:model] : params[:controller].singularize).capitalize.constantize
|
9
|
-
|
10
|
-
reader = controller.extjs_reader(model)
|
11
|
-
proxy = controller.extjs_proxy(params)
|
12
|
-
|
13
|
-
params[:config]["storeId"] = model.to_s.downcase if params[:config]["storeId"].nil?
|
14
|
-
params[:config].merge!(reader)
|
15
|
-
params[:config].merge!(proxy)
|
16
|
-
|
17
|
-
type = (params[:proxy] === 'direct' ? params[:proxy] : params[:format]).capitalize
|
18
|
-
|
19
|
-
script = ''
|
20
|
-
# ugly hack for DirectProxy API. Have to add an Ext.onReady() after the Store constructor to set API
|
21
|
-
if params[:proxy] === 'direct'
|
22
|
-
auto_load = params[:config].delete("autoLoad")
|
23
|
-
cname = params[:controller].capitalize
|
24
|
-
script = "Ext.onReady(function() { var s = Ext.StoreMgr.get('#{params[:config]["storeId"]}');"
|
25
|
-
if (params[:config]["directFn"])
|
26
|
-
script += "s.proxy.directFn = #{cname}.#{params[:config]["directFn"]};"
|
27
|
-
else
|
28
|
-
script += "s.proxy.setApi({create:#{cname}.#{params[:config]["api"]["create"]},read:#{cname}.#{params[:config]["api"]["read"]},update:#{cname}.#{params[:config]["api"]["update"]},destroy:#{cname}.#{params[:config]["api"]["destroy"]}});"
|
29
|
-
end
|
30
|
-
if auto_load
|
31
|
-
script += "s.load();"
|
32
|
-
end
|
33
|
-
script += "});"
|
34
|
-
end
|
35
|
-
|
36
|
-
if params[:config]["writer"] # <-- ugly hack because 3.0.1 can't deal with Writer as config-param
|
37
|
-
writer = params[:config].delete("writer")
|
38
|
-
json = params[:config].to_json
|
39
|
-
json[json.length-1] = ','
|
40
|
-
json += "writer:new Ext.data.#{params[:format].capitalize}Writer(#{writer.to_json})}"
|
41
|
-
"new Ext.data.#{type}Store(#{json});#{script}"
|
42
|
-
else
|
43
|
-
"new Ext.data.#{type}Store(#{params[:config].to_json});#{script}"
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|