extjs-mvc 0.2.5 → 0.2.6
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/README.rdoc +6 -0
- data/VERSION +1 -1
- data/lib/extjs/component.rb +1 -1
- data/lib/extjs/data/store.rb +1 -1
- data/lib/extjs-mvc.rb +4 -3
- data/lib/model/active_record.rb +44 -0
- data/lib/model/base.rb +118 -0
- data/lib/model/data_mapper.rb +55 -0
- data/lib/model/mongo_mapper.rb +49 -0
- data/test/model_test.rb +20 -0
- metadata +6 -5
- data/lib/model/active_record/model.rb +0 -90
- data/lib/model/dm/model.rb +0 -98
- data/lib/model/mongo_mapper/model.rb +0 -102
data/README.rdoc
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
= mvc
|
2
2
|
|
3
|
+
|
3
4
|
A collection of helpers, MVC mixins and PORs (plain-old-ruby-object) to assist with auto-generating ExtJS javascript component definitions.
|
4
5
|
|
5
6
|
|
@@ -23,6 +24,11 @@ fields with will be used to render the <tt>Ext.data.Record.create</tt> field-def
|
|
23
24
|
include ExtJS::Model
|
24
25
|
|
25
26
|
extjs_fields :exclude => [:password, :password_confirmation]
|
27
|
+
# OR
|
28
|
+
extjs_fields :name, :description
|
29
|
+
# OR
|
30
|
+
extjs_fields :name, :description, :parent => [:name, :date]
|
31
|
+
# this would configure associated columns with names like "parent__name" and "parent__date")
|
26
32
|
end
|
27
33
|
|
28
34
|
In script/console
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.6
|
data/lib/extjs/component.rb
CHANGED
data/lib/extjs/data/store.rb
CHANGED
@@ -57,7 +57,7 @@ module ExtJS::Data
|
|
57
57
|
if @writer # <-- ugly hack because 3.0.1 can't deal with Writer as config-param
|
58
58
|
json = @config.to_json
|
59
59
|
json[json.length-1] = ','
|
60
|
-
json += "writer:new Ext.data.#{@format.capitalize}Writer(#{@writer.to_json})}"
|
60
|
+
json += "\"writer\":new Ext.data.#{@format.capitalize}Writer(#{@writer.to_json})}"
|
61
61
|
"<script>new #{@type}(#{json});#{script}</script>"
|
62
62
|
else
|
63
63
|
"<script>new #{@type}(#{@config.to_json});#{script}</script>"
|
data/lib/extjs-mvc.rb
CHANGED
@@ -7,14 +7,15 @@ module ExtJS
|
|
7
7
|
cattr_accessor :message_property
|
8
8
|
cattr_accessor :root
|
9
9
|
|
10
|
+
require 'model/base'
|
10
11
|
|
11
12
|
# Detect orm, include appropriate mixin.
|
12
13
|
if defined?(ActiveRecord)
|
13
|
-
require 'model/active_record
|
14
|
+
require 'model/active_record'
|
14
15
|
elsif defined?(DataMapper)
|
15
|
-
require 'model/
|
16
|
+
require 'model/data_mapper'
|
16
17
|
elsif defined?(MongoMapper)
|
17
|
-
require 'model/mongo_mapper
|
18
|
+
require 'model/mongo_mapper'
|
18
19
|
end
|
19
20
|
|
20
21
|
# Rails-style Array#extract_options! used heavily
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module ExtJS
|
2
|
+
module Model
|
3
|
+
module ClassMethods
|
4
|
+
|
5
|
+
def extjs_primary_key
|
6
|
+
self.primary_key
|
7
|
+
end
|
8
|
+
|
9
|
+
def extjs_column_names
|
10
|
+
self.column_names
|
11
|
+
end
|
12
|
+
|
13
|
+
def extjs_columns_hash
|
14
|
+
self.columns_hash
|
15
|
+
end
|
16
|
+
|
17
|
+
def extjs_render_column(col)
|
18
|
+
type = col.type
|
19
|
+
case type
|
20
|
+
when :datetime || :date || :time || :timestamp
|
21
|
+
type = :date
|
22
|
+
when :text
|
23
|
+
type = :string
|
24
|
+
when :integer
|
25
|
+
type = :int
|
26
|
+
end
|
27
|
+
{:name => col.name, :allowBlank => (col.primary) ? true : col.null, :type => type}
|
28
|
+
end
|
29
|
+
|
30
|
+
def extjs_associations
|
31
|
+
if @extjs_associations.nil?
|
32
|
+
@extjs_associations = {}
|
33
|
+
self.reflections.keys.each do |key|
|
34
|
+
assn = self.reflections[key]
|
35
|
+
type = (assn.macro === :has_many) ? :many : assn.macro
|
36
|
+
@extjs_associations[key.to_sym] = {:name => key, :type => type}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
@extjs_associations
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
data/lib/model/base.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
module ExtJS
|
2
|
+
module Model
|
3
|
+
|
4
|
+
def self.included(model)
|
5
|
+
model.send(:extend, ClassMethods)
|
6
|
+
model.send(:include, InstanceMethods)
|
7
|
+
model.class_eval do
|
8
|
+
cattr_accessor :extjs_record_fields
|
9
|
+
end
|
10
|
+
model.extjs_record_fields = []
|
11
|
+
end
|
12
|
+
|
13
|
+
##
|
14
|
+
# InstanceMethods
|
15
|
+
#
|
16
|
+
module InstanceMethods
|
17
|
+
|
18
|
+
def to_record
|
19
|
+
pk = self.class.extjs_primary_key
|
20
|
+
assns = self.class.extjs_associations
|
21
|
+
|
22
|
+
data = {pk => self.send(pk)}
|
23
|
+
self.class.extjs_record_fields.each do |f|
|
24
|
+
if refl = assns[f]
|
25
|
+
if refl[:type] === :belongs_to
|
26
|
+
assn = self.send(f)
|
27
|
+
data[f] = (assn) ? assn.to_record : {} # <-- a thing was requested, give emtpy thing.
|
28
|
+
elsif refl[:type] === :many
|
29
|
+
data[f] = self.send(f).collect {|r| r.to_record} #CAREFUL!!!!!!!!!!!!1
|
30
|
+
end
|
31
|
+
elsif f.is_a? Array
|
32
|
+
value = self
|
33
|
+
f.each do |method|
|
34
|
+
value = value.send(method)
|
35
|
+
break if value.nil?
|
36
|
+
end
|
37
|
+
data[f.join('__')] = value
|
38
|
+
else
|
39
|
+
data[f] = self.send(f)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
data
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# ClassMethods
|
48
|
+
#
|
49
|
+
module ClassMethods
|
50
|
+
##
|
51
|
+
# render AR columns to Ext.data.Record.create format
|
52
|
+
# eg: {name:'foo', type: 'string'}
|
53
|
+
#
|
54
|
+
def extjs_record
|
55
|
+
|
56
|
+
if self.extjs_record_fields.empty?
|
57
|
+
self.extjs_record_fields = self.extjs_column_names
|
58
|
+
end
|
59
|
+
|
60
|
+
pk = self.extjs_primary_key
|
61
|
+
columns = self.extjs_columns_hash
|
62
|
+
associations = self.extjs_associations
|
63
|
+
|
64
|
+
return {
|
65
|
+
"fields" => self.extjs_record_fields.collect {|f|
|
66
|
+
if columns[f.to_sym] || columns[f.to_s]
|
67
|
+
field = self.extjs_render_column(columns[f.to_sym] || columns[f.to_s])
|
68
|
+
field[:dateFormat] = "c" if field[:type] === :date # <-- ugly hack for date
|
69
|
+
field
|
70
|
+
elsif assn = associations[f]
|
71
|
+
field = {:name => f, :allowBlank => true, :type => 'auto'}
|
72
|
+
elsif f.is_a? Array
|
73
|
+
field = {:name => f.join('__'), :type => 'auto'}
|
74
|
+
else # property is a method?
|
75
|
+
field = {:name => f, :allowBlank => true, :type => 'auto'}
|
76
|
+
end
|
77
|
+
},
|
78
|
+
"idProperty" => pk
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
82
|
+
def extjs_fields(*params)
|
83
|
+
options = params.extract_options!
|
84
|
+
if !options.keys.empty?
|
85
|
+
if excludes = options.delete(:exclude)
|
86
|
+
self.extjs_record_fields = self.extjs_column_names.reject {|c| excludes.find {|ex| c === ex.to_s}}.collect {|c| c}
|
87
|
+
elsif only = options.delete(:only)
|
88
|
+
self.extjs_record_fields = only
|
89
|
+
end
|
90
|
+
self.extjs_record_fields.concat(process_association_fields(options))
|
91
|
+
elsif params.empty?
|
92
|
+
return self.extjs_record_fields
|
93
|
+
end
|
94
|
+
|
95
|
+
self.extjs_record_fields.concat(params) if !params.empty?
|
96
|
+
|
97
|
+
#Append primary key if it's not included
|
98
|
+
# I don't think we want to automatically include :id
|
99
|
+
# Chris
|
100
|
+
#self.extjs_record_fields << self.primary_key.to_sym if !self.extjs_record_fields.include?(self.primary_key.to_sym)
|
101
|
+
end
|
102
|
+
|
103
|
+
##
|
104
|
+
# Prepare the config for fields with '.' in their names
|
105
|
+
#
|
106
|
+
def process_association_fields(options)
|
107
|
+
results = []
|
108
|
+
options.each do |assoc, fields|
|
109
|
+
fields.each do |field|
|
110
|
+
results << [assoc, field]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
results
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module ExtJS
|
2
|
+
module Model
|
3
|
+
module ClassMethods
|
4
|
+
|
5
|
+
def extjs_primary_key
|
6
|
+
self.key.first.name
|
7
|
+
end
|
8
|
+
|
9
|
+
def extjs_column_names
|
10
|
+
self.properties.collect {|p| p.name.to_s }
|
11
|
+
end
|
12
|
+
|
13
|
+
def extjs_columns_hash
|
14
|
+
if @extjs_columns_hash.nil?
|
15
|
+
@extjs_columns_hash = {}
|
16
|
+
self.properties.each do |p|
|
17
|
+
@extjs_columns_hash[p.name] = p
|
18
|
+
end
|
19
|
+
end
|
20
|
+
@extjs_columns_hash
|
21
|
+
end
|
22
|
+
|
23
|
+
def extjs_render_column(col)
|
24
|
+
pk = self.key.first
|
25
|
+
type = ((col.type.respond_to?(:primitive)) ? col.type.primitive : col.type).to_s
|
26
|
+
case type
|
27
|
+
when "DateTime", "Date", "Time"
|
28
|
+
type = :date
|
29
|
+
when "String"
|
30
|
+
type = :string
|
31
|
+
when "Float"
|
32
|
+
type = :float
|
33
|
+
when "Integer", "BigDecimal"
|
34
|
+
type = :int
|
35
|
+
else
|
36
|
+
type = "auto"
|
37
|
+
end
|
38
|
+
{:name => col.name.to_s, :type => type, :allowBlank => (col === pk) ? true : col.nullable? }
|
39
|
+
end
|
40
|
+
|
41
|
+
def extjs_associations
|
42
|
+
if @extjs_associations.nil?
|
43
|
+
@extjs_associations = {}
|
44
|
+
self.relationships.keys.each do |key|
|
45
|
+
assn = self.relationships[key]
|
46
|
+
type = (assn.options[:max].nil? && assn.options[:min].nil?) ? :belongs_to : (assn.options[:max] > 1) ? :many : nil
|
47
|
+
@extjs_associations[key.to_sym] = {:name => key, :type => type}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
@extjs_associations
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module ExtJS
|
2
|
+
module Model
|
3
|
+
##
|
4
|
+
# ClassMethods
|
5
|
+
#
|
6
|
+
module ClassMethods
|
7
|
+
|
8
|
+
def extjs_primary_key
|
9
|
+
"id"
|
10
|
+
end
|
11
|
+
|
12
|
+
def extjs_column_names
|
13
|
+
self.column_names
|
14
|
+
end
|
15
|
+
|
16
|
+
def extjs_columns_hash
|
17
|
+
self.keys
|
18
|
+
end
|
19
|
+
|
20
|
+
def extjs_associations
|
21
|
+
if @extjs_associations.nil?
|
22
|
+
@extjs_associations = {}
|
23
|
+
self.associations.keys.each do |key|
|
24
|
+
@extjs_associations[key.to_sym] = {:name => key, :type => self.associations[key].type}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
@extjs_associations
|
28
|
+
end
|
29
|
+
|
30
|
+
def extjs_render_column(col)
|
31
|
+
type = col.type.to_s
|
32
|
+
case type
|
33
|
+
when "DateTime", "Date", "Time"
|
34
|
+
type = :date
|
35
|
+
when "String"
|
36
|
+
type = :string
|
37
|
+
when "Float"
|
38
|
+
type = :float
|
39
|
+
when "Integer", "BigDecimal"
|
40
|
+
type = :int
|
41
|
+
else
|
42
|
+
type = "auto"
|
43
|
+
end
|
44
|
+
{:name => col.name, :type => type, :allowBlank => (col.name === '_id') ? true : (col.options[:required] === true) ? false : true }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
data/test/model_test.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestParent < ActiveRecord::Base
|
4
|
+
|
5
|
+
end
|
6
|
+
|
7
|
+
class TestModel < ActiveRecord::Base
|
8
|
+
include ExtJS::Model
|
9
|
+
belongs_to :test_parent
|
10
|
+
|
11
|
+
#for the EXT Store configuration
|
12
|
+
extjs_fields :name, :test_parent => [:name]
|
13
|
+
end
|
14
|
+
|
15
|
+
class ModelTest < Test::Unit::TestCase
|
16
|
+
def test_field_list_for_associations
|
17
|
+
assert_equal [[:test_parent, :name], :name, :id], TestModel.extjs_fields
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
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.2.
|
4
|
+
version: 0.2.6
|
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-
|
12
|
+
date: 2009-11-17 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -45,9 +45,10 @@ files:
|
|
45
45
|
- lib/extjs/data/store.rb
|
46
46
|
- lib/helpers/component.rb
|
47
47
|
- lib/helpers/store.rb
|
48
|
-
- lib/model/active_record
|
49
|
-
- lib/model/
|
50
|
-
- lib/model/
|
48
|
+
- lib/model/active_record.rb
|
49
|
+
- lib/model/base.rb
|
50
|
+
- lib/model/data_mapper.rb
|
51
|
+
- lib/model/mongo_mapper.rb
|
51
52
|
- test/component_test.rb
|
52
53
|
- test/controller_test.rb
|
53
54
|
- test/model_test.rb
|
@@ -1,90 +0,0 @@
|
|
1
|
-
module ExtJS
|
2
|
-
module Model
|
3
|
-
def self.included(model)
|
4
|
-
model.send(:extend, ClassMethods)
|
5
|
-
model.send(:include, InstanceMethods)
|
6
|
-
model.class_eval do
|
7
|
-
cattr_accessor :extjs_record_fields
|
8
|
-
end
|
9
|
-
model.extjs_record_fields = []
|
10
|
-
end
|
11
|
-
|
12
|
-
##
|
13
|
-
# InstanceMethods
|
14
|
-
#
|
15
|
-
module InstanceMethods
|
16
|
-
def to_record
|
17
|
-
data = {self.class.primary_key => self.send(self.class.primary_key)}
|
18
|
-
self.class.extjs_record_fields.each do |f|
|
19
|
-
if refl = self.class.reflections[f]
|
20
|
-
if refl.macro === :belongs_to
|
21
|
-
assn = self.send(f)
|
22
|
-
data[f] = (assn) ? assn.to_record : {} # <-- a thing was requested, give emtpy thing.
|
23
|
-
elsif refl.macro === :has_many
|
24
|
-
#data[f] = self.send(f).collect {|r| r.to_record} CAREFUL!!!!!!!!!!!!1
|
25
|
-
end
|
26
|
-
else
|
27
|
-
data[f] = self.send(f)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
data
|
31
|
-
end
|
32
|
-
end
|
33
|
-
##
|
34
|
-
# ClassMethods
|
35
|
-
#
|
36
|
-
module ClassMethods
|
37
|
-
##
|
38
|
-
# Defines the subset of AR columns used to create Ext.data.Record def'n.
|
39
|
-
# @param {Array/Hash} list-of-fields to include, :only, or :exclude
|
40
|
-
#
|
41
|
-
def extjs_fields(*params)
|
42
|
-
options = params.extract_options!
|
43
|
-
if !options.keys.empty?
|
44
|
-
if options[:exclude]
|
45
|
-
self.extjs_record_fields = self.columns.reject {|c| options[:exclude].find {|ex| c.name.to_sym === ex}}.collect {|c| c.name.to_sym}
|
46
|
-
end
|
47
|
-
elsif !params.empty?
|
48
|
-
self.extjs_record_fields = params
|
49
|
-
else
|
50
|
-
self.extjs_record_fields
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
##
|
55
|
-
# render AR columns to Ext.data.Record.create format
|
56
|
-
# eg: {name:'foo', type: 'string'}
|
57
|
-
#
|
58
|
-
def extjs_record
|
59
|
-
if self.extjs_record_fields.empty?
|
60
|
-
self.extjs_record_fields = self.columns.collect {|c| c.name.to_sym }
|
61
|
-
self.extjs_record_fields.concat(self.reflect_on_all_associations.collect {|assn| assn.name})
|
62
|
-
end
|
63
|
-
|
64
|
-
return {
|
65
|
-
"fields" => self.extjs_record_fields.collect {|f|
|
66
|
-
if col = self.columns_hash[f.to_s]
|
67
|
-
type = col.type
|
68
|
-
case col.type
|
69
|
-
when :datetime || :date || :time || :timestamp
|
70
|
-
type = :date
|
71
|
-
when :text
|
72
|
-
type = :string
|
73
|
-
when :integer
|
74
|
-
type = :int
|
75
|
-
end
|
76
|
-
field = {:name => col.name, :allowBlank => (col.primary) ? true : col.null, :type => type}
|
77
|
-
field[:dateFormat] = "c" if col.type === :datetime || col.type === :date # <-- ugly hack for date
|
78
|
-
field
|
79
|
-
elsif self.reflections[f]
|
80
|
-
assn = self.reflections[f]
|
81
|
-
field = {:name => assn.name, :allowBlank => true, :type => 'auto'}
|
82
|
-
end
|
83
|
-
},
|
84
|
-
"idProperty" => self.primary_key
|
85
|
-
}
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
data/lib/model/dm/model.rb
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
module ExtJS
|
2
|
-
module Model
|
3
|
-
def self.included(model)
|
4
|
-
model.send(:extend, ClassMethods)
|
5
|
-
model.send(:include, InstanceMethods)
|
6
|
-
model.class_eval do
|
7
|
-
cattr_accessor :extjs_record_fields
|
8
|
-
end
|
9
|
-
model.extjs_record_fields = []
|
10
|
-
end
|
11
|
-
|
12
|
-
##
|
13
|
-
# InstanceMethods
|
14
|
-
#
|
15
|
-
module InstanceMethods
|
16
|
-
def to_record
|
17
|
-
properties = self.class.properties
|
18
|
-
pk = self.class.key.first.name
|
19
|
-
|
20
|
-
data = {pk => self.send(pk)}
|
21
|
-
self.class.extjs_record_fields.each do |f|
|
22
|
-
if refl = self.class.relationships[f]
|
23
|
-
if refl.options[:max].nil? && refl.options[:min].nil? # belongs_to
|
24
|
-
assn = self.send(f)
|
25
|
-
data[f] = (assn) ? assn.to_record : {} # <-- a thing was requested, give emtpy thing.
|
26
|
-
elsif refl.options[:max] > 1
|
27
|
-
data[f] = self.send(f).collect {|r| r.to_record} #CAREFUL!!!!!!!!!!!!1
|
28
|
-
end
|
29
|
-
else
|
30
|
-
data[f] = self.send(f)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
data
|
34
|
-
end
|
35
|
-
end
|
36
|
-
##
|
37
|
-
# ClassMethods
|
38
|
-
#
|
39
|
-
module ClassMethods
|
40
|
-
##
|
41
|
-
# Defines the subset of AR columns used to create Ext.data.Record def'n.
|
42
|
-
# @param {Array/Hash} list-of-fields to include, :only, or :exclude
|
43
|
-
#
|
44
|
-
def extjs_fields(*params)
|
45
|
-
options = params.extract_options!
|
46
|
-
if !options.keys.empty?
|
47
|
-
if options[:exclude]
|
48
|
-
self.extjs_record_fields = self.properties.reject {|p| options[:exclude].find {|ex| p.name === ex}}.collect {|p| p.name}
|
49
|
-
end
|
50
|
-
elsif !params.empty?
|
51
|
-
self.extjs_record_fields = params
|
52
|
-
else
|
53
|
-
self.extjs_record_fields
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
##
|
58
|
-
# render AR columns to Ext.data.Record.create format
|
59
|
-
# eg: {name:'foo', type: 'string'}
|
60
|
-
#
|
61
|
-
def extjs_record
|
62
|
-
if self.extjs_record_fields.empty?
|
63
|
-
self.extjs_record_fields = self.properties.collect {|p| p.name}
|
64
|
-
end
|
65
|
-
|
66
|
-
pk = self.key.first
|
67
|
-
|
68
|
-
return {
|
69
|
-
"fields" => self.extjs_record_fields.collect {|f|
|
70
|
-
if self.properties.has_property?(f)
|
71
|
-
col = self.properties[f]
|
72
|
-
type = ((col.type.respond_to?(:primitive)) ? col.type.primitive : col.type).to_s
|
73
|
-
case type
|
74
|
-
when "DateTime", "Date", "Time"
|
75
|
-
type = :date
|
76
|
-
when "String"
|
77
|
-
type = :string
|
78
|
-
when "Float"
|
79
|
-
type = :float
|
80
|
-
when "Integer", "BigDecimal"
|
81
|
-
type = :int
|
82
|
-
end
|
83
|
-
field = {:name => col.name, :allowBlank => (col === pk) ? true : col.nullable?, :type => type}
|
84
|
-
field[:dateFormat] = "c" if type === :date # <-- ugly hack for date
|
85
|
-
field
|
86
|
-
elsif assn = self.relationships[f]
|
87
|
-
field = {:name => f, :allowBlank => true, :type => 'auto'}
|
88
|
-
else # property is a method?
|
89
|
-
field = {:name => f, :allowBlank => true, :type => 'auto'}
|
90
|
-
end
|
91
|
-
},
|
92
|
-
"idProperty" => pk.name
|
93
|
-
}
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
@@ -1,102 +0,0 @@
|
|
1
|
-
module ExtJS
|
2
|
-
module Model
|
3
|
-
|
4
|
-
def self.included(model)
|
5
|
-
model.send(:extend, ClassMethods)
|
6
|
-
model.send(:include, InstanceMethods)
|
7
|
-
model.class_eval do
|
8
|
-
cattr_accessor :extjs_record_fields
|
9
|
-
end
|
10
|
-
model.extjs_record_fields = []
|
11
|
-
end
|
12
|
-
|
13
|
-
##
|
14
|
-
# InstanceMethods
|
15
|
-
#
|
16
|
-
module InstanceMethods
|
17
|
-
def to_record
|
18
|
-
properties = self.class.column_names
|
19
|
-
pk = "id"
|
20
|
-
|
21
|
-
data = {pk => self.send(pk)}
|
22
|
-
self.class.extjs_record_fields.each do |f|
|
23
|
-
if refl = self.class.associations[f]
|
24
|
-
if refl.type === :belongs_to
|
25
|
-
assn = self.send(f)
|
26
|
-
data[f] = (assn) ? assn.to_record : {} # <-- a thing was requested, give emtpy thing.
|
27
|
-
elsif refl.type === :many
|
28
|
-
data[f] = self.send(f).collect {|r| r.to_record} #CAREFUL!!!!!!!!!!!!1
|
29
|
-
end
|
30
|
-
else
|
31
|
-
data[f] = self.send(f)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
data
|
35
|
-
end
|
36
|
-
end
|
37
|
-
##
|
38
|
-
# ClassMethods
|
39
|
-
#
|
40
|
-
module ClassMethods
|
41
|
-
##
|
42
|
-
# Defines the subset of AR columns used to create Ext.data.Record def'n.
|
43
|
-
# @param {Array/Hash} list-of-fields to include, :only, or :exclude
|
44
|
-
#
|
45
|
-
def extjs_fields(*params)
|
46
|
-
options = params.extract_options!
|
47
|
-
if !options.keys.empty?
|
48
|
-
if options[:exclude]
|
49
|
-
self.extjs_record_fields = self.column_names.reject {|p| options[:exclude].find {|ex| p === ex.to_s}}.collect {|p| p}
|
50
|
-
end
|
51
|
-
elsif !params.empty?
|
52
|
-
self.extjs_record_fields = params
|
53
|
-
else
|
54
|
-
self.extjs_record_fields
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
##
|
59
|
-
# render AR columns to Ext.data.Record.create format
|
60
|
-
# eg: {name:'foo', type: 'string'}
|
61
|
-
#
|
62
|
-
def extjs_record
|
63
|
-
if self.extjs_record_fields.empty?
|
64
|
-
self.extjs_record_fields = self.column_names
|
65
|
-
end
|
66
|
-
|
67
|
-
pk = "_id"
|
68
|
-
|
69
|
-
return {
|
70
|
-
"fields" => self.extjs_record_fields.collect {|f|
|
71
|
-
if self.keys[f]
|
72
|
-
|
73
|
-
col = self.keys[f]
|
74
|
-
type = col.type.to_s
|
75
|
-
case type
|
76
|
-
when "DateTime", "Date", "Time"
|
77
|
-
type = :date
|
78
|
-
when "String"
|
79
|
-
type = :string
|
80
|
-
when "Float"
|
81
|
-
type = :float
|
82
|
-
when "Integer", "BigDecimal"
|
83
|
-
type = :int
|
84
|
-
else
|
85
|
-
type = "auto"
|
86
|
-
end
|
87
|
-
field = {:name => col.name, :allowBlank => (col.name === pk) ? true : !col.options[:required] === true, :type => type}
|
88
|
-
field[:dateFormat] = "c" if type === :date # <-- ugly hack for date
|
89
|
-
field
|
90
|
-
elsif assn = self.associations[f.to_sym]
|
91
|
-
field = {:name => f, :allowBlank => true, :type => 'auto'}
|
92
|
-
else # property is a method?
|
93
|
-
field = {:name => f, :allowBlank => true, :type => 'auto'}
|
94
|
-
end
|
95
|
-
},
|
96
|
-
"idProperty" => "id"
|
97
|
-
}
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|