active_scaffold 3.3.3 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +39 -0
- data/README.md +5 -3
- data/app/assets/images/active_scaffold/refresh.png +0 -0
- data/app/assets/javascripts/jquery/active_scaffold.js +182 -91
- data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +14 -16
- data/app/assets/javascripts/jquery/draggable_lists.js +33 -26
- data/app/assets/javascripts/jquery/jquery.editinplace.js +3 -3
- data/app/assets/javascripts/prototype/active_scaffold.js +61 -19
- data/app/assets/stylesheets/active_scaffold_colors.css.scss +4 -0
- data/app/assets/stylesheets/active_scaffold_images.css.scss +3 -0
- data/app/assets/stylesheets/active_scaffold_layout.css +23 -2
- data/app/views/active_scaffold_overrides/_add_existing_form.html.erb +1 -3
- data/app/views/active_scaffold_overrides/_base_form.html.erb +7 -5
- data/app/views/active_scaffold_overrides/_field_search.html.erb +1 -2
- data/app/views/active_scaffold_overrides/_form.html.erb +6 -4
- data/app/views/active_scaffold_overrides/_form_association.html.erb +4 -3
- data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +5 -5
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +8 -6
- data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +3 -2
- data/app/views/active_scaffold_overrides/_list.html.erb +8 -6
- data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +1 -4
- data/app/views/active_scaffold_overrides/_list_pagination.html.erb +4 -4
- data/app/views/active_scaffold_overrides/_list_pagination_links.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +8 -1
- data/app/views/active_scaffold_overrides/_search.html.erb +7 -13
- data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
- data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
- data/app/views/active_scaffold_overrides/render_field_inplace.html.erb +1 -1
- data/app/views/active_scaffold_overrides/row.js.erb +1 -1
- data/config/locales/de.yml +106 -95
- data/config/locales/en.yml +108 -97
- data/config/locales/es.yml +109 -98
- data/config/locales/fr.yml +108 -97
- data/config/locales/hu.yml +109 -98
- data/config/locales/ja.yml +100 -89
- data/config/locales/ru.yml +115 -104
- data/lib/active_scaffold.rb +18 -294
- data/lib/active_scaffold/actions/common_search.rb +50 -17
- data/lib/active_scaffold/actions/core.rb +93 -22
- data/lib/active_scaffold/actions/create.rb +15 -6
- data/lib/active_scaffold/actions/field_search.rb +68 -60
- data/lib/active_scaffold/actions/list.rb +49 -28
- data/lib/active_scaffold/actions/nested.rb +14 -6
- data/lib/active_scaffold/actions/search.rb +36 -35
- data/lib/active_scaffold/actions/show.rb +9 -4
- data/lib/active_scaffold/actions/subform.rb +1 -1
- data/lib/active_scaffold/actions/update.rb +22 -7
- data/lib/active_scaffold/active_record_permissions.rb +125 -118
- data/lib/active_scaffold/attribute_params.rb +84 -66
- data/lib/active_scaffold/bridges.rb +3 -3
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +10 -5
- data/lib/active_scaffold/bridges/cancan.rb +2 -1
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +13 -2
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +11 -6
- data/lib/active_scaffold/bridges/chosen/helpers.rb +2 -2
- data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +45 -29
- data/lib/active_scaffold/bridges/date_picker/ext.rb +11 -6
- data/lib/active_scaffold/bridges/date_picker/helper.rb +5 -1
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +10 -5
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +6 -1
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +12 -11
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +14 -6
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/record_select/helpers.rb +15 -12
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +7 -8
- data/lib/active_scaffold/bridges/tiny_mce.rb +5 -3
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +4 -5
- data/lib/active_scaffold/config/base.rb +4 -0
- data/lib/active_scaffold/config/core.rb +12 -5
- data/lib/active_scaffold/config/delete.rb +0 -2
- data/lib/active_scaffold/config/field_search.rb +1 -4
- data/lib/active_scaffold/config/form.rb +0 -2
- data/lib/active_scaffold/config/list.rb +31 -1
- data/lib/active_scaffold/config/search.rb +0 -3
- data/lib/active_scaffold/config/show.rb +0 -6
- data/lib/active_scaffold/config/subform.rb +1 -0
- data/lib/active_scaffold/configurable.rb +2 -2
- data/lib/active_scaffold/constraints.rb +11 -14
- data/lib/active_scaffold/core.rb +277 -0
- data/lib/active_scaffold/data_structures/action_columns.rb +18 -2
- data/lib/active_scaffold/data_structures/action_link.rb +25 -6
- data/lib/active_scaffold/data_structures/action_links.rb +9 -4
- data/lib/active_scaffold/data_structures/actions.rb +1 -1
- data/lib/active_scaffold/data_structures/column.rb +6 -6
- data/lib/active_scaffold/data_structures/columns.rb +2 -2
- data/lib/active_scaffold/data_structures/nested_info.rb +5 -1
- data/lib/active_scaffold/data_structures/sorting.rb +15 -5
- data/lib/active_scaffold/delayed_setup.rb +30 -0
- data/lib/active_scaffold/engine.rb +25 -0
- data/lib/active_scaffold/extensions/action_view_rendering.rb +1 -1
- data/lib/active_scaffold/extensions/left_outer_joins.rb +61 -21
- data/lib/active_scaffold/extensions/localize.rb +1 -1
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +13 -8
- data/lib/active_scaffold/extensions/paginator_extensions.rb +5 -1
- data/lib/active_scaffold/extensions/reverse_associations.rb +1 -0
- data/lib/active_scaffold/extensions/routing_mapper.rb +1 -1
- data/lib/active_scaffold/extensions/unsaved_record.rb +4 -6
- data/lib/active_scaffold/finder.rb +79 -27
- data/lib/active_scaffold/helpers/association_helpers.rb +48 -18
- data/lib/active_scaffold/helpers/controller_helpers.rb +19 -10
- data/lib/active_scaffold/helpers/form_column_helpers.rb +185 -87
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +2 -1
- data/lib/active_scaffold/helpers/id_helpers.rb +14 -8
- data/lib/active_scaffold/helpers/list_column_helpers.rb +65 -56
- data/lib/active_scaffold/helpers/pagination_helpers.rb +5 -1
- data/lib/active_scaffold/helpers/search_column_helpers.rb +21 -18
- data/lib/active_scaffold/helpers/view_helpers.rb +102 -64
- data/lib/active_scaffold/responds_to_parent.rb +39 -64
- data/lib/active_scaffold/tableless.rb +129 -10
- data/lib/active_scaffold/version.rb +2 -2
- data/test/bridges/bridge_test.rb +1 -1
- data/test/bridges/date_picker_test.rb +2 -2
- data/test/bridges/paperclip_test.rb +10 -8
- data/test/bridges/tiny_mce_test.rb +2 -2
- data/test/company.rb +22 -10
- data/test/config/base_test.rb +1 -1
- data/test/config/core_test.rb +8 -6
- data/test/config/create_test.rb +6 -6
- data/test/config/delete_test.rb +4 -4
- data/test/config/field_search_test.rb +6 -6
- data/test/config/list_test.rb +7 -7
- data/test/config/nested_test.rb +8 -7
- data/test/config/search_test.rb +7 -7
- data/test/config/show_test.rb +5 -5
- data/test/config/subform_test.rb +1 -1
- data/test/config/update_test.rb +5 -4
- data/test/data_structures/action_columns_test.rb +15 -16
- data/test/data_structures/action_link_test.rb +10 -10
- data/test/data_structures/action_links_test.rb +6 -6
- data/test/data_structures/actions_test.rb +4 -4
- data/test/data_structures/association_column_test.rb +4 -4
- data/test/data_structures/column_test.rb +9 -9
- data/test/data_structures/columns_test.rb +7 -7
- data/test/data_structures/error_message_test.rb +2 -4
- data/test/data_structures/set_test.rb +13 -13
- data/test/data_structures/sorting_test.rb +8 -8
- data/test/data_structures/standard_column_test.rb +2 -2
- data/test/data_structures/validation_reflection_test.rb +8 -8
- data/test/data_structures/virtual_column_test.rb +5 -5
- data/test/extensions/active_record_test.rb +1 -1
- data/test/helpers/form_column_helpers_test.rb +5 -5
- data/test/helpers/list_column_helpers_test.rb +2 -1
- data/test/helpers/pagination_helpers_test.rb +1 -1
- data/test/misc/active_record_permissions_test.rb +23 -4
- data/test/misc/attribute_params_test.rb +304 -136
- data/test/misc/calculation_test.rb +55 -0
- data/test/misc/configurable_test.rb +22 -21
- data/test/misc/constraints_test.rb +10 -7
- data/test/misc/convert_numbers_format_test.rb +149 -0
- data/test/misc/finder_test.rb +17 -13
- data/test/misc/lang_test.rb +1 -1
- data/test/misc/tableless_test.rb +18 -0
- data/test/mock_app/app/controllers/addresses_controller.rb +4 -0
- data/test/mock_app/app/controllers/buildings_controller.rb +4 -0
- data/test/mock_app/app/controllers/cars_controller.rb +4 -0
- data/test/mock_app/app/controllers/contacts_controller.rb +4 -0
- data/test/mock_app/app/controllers/floors_controller.rb +6 -0
- data/test/mock_app/app/controllers/people_controller.rb +4 -0
- data/test/mock_app/app/models/address.rb +3 -0
- data/test/mock_app/app/models/building.rb +8 -0
- data/test/mock_app/app/models/car.rb +3 -0
- data/test/mock_app/app/models/contact.rb +3 -0
- data/test/mock_app/app/models/file_model.rb +19 -0
- data/test/mock_app/app/models/floor.rb +8 -0
- data/test/mock_app/app/models/person.rb +11 -0
- data/test/mock_app/config/application.rb +2 -0
- data/test/mock_app/config/environments/test.rb +1 -1
- data/test/mock_app/config/initializers/secret_token.rb +5 -1
- data/test/mock_app/config/routes.rb +1 -1
- data/test/mock_app/db/schema.rb +51 -0
- data/test/model_stub.rb +3 -3
- data/test/test_helper.rb +15 -12
- metadata +51 -50
- data/lib/active_scaffold/extensions/array.rb +0 -7
- data/lib/active_scaffold/extensions/cache_association.rb +0 -16
- data/lib/active_scaffold/extensions/usa_state.rb +0 -46
- data/lib/active_scaffold_env.rb +0 -13
- data/test/extensions/array_test.rb +0 -12
- data/test/mock_app/public/blank.html +0 -33
- data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +0 -2
- data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
- data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
- data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +0 -2
- data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +0 -532
- data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +0 -867
- data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +0 -117
- data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +0 -370
- data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +0 -2
- data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +0 -35
- data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +0 -848
@@ -1,70 +1,45 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
|
8
|
-
|
9
|
-
# the following conditions:
|
10
|
-
#
|
11
|
-
# The above copyright notice and this permission notice shall be
|
12
|
-
# included in all copies or substantial portions of the Software.
|
13
|
-
#
|
14
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
1
|
+
module ActiveScaffold
|
2
|
+
# Module containing the methods useful for child IFRAME to parent window communication
|
3
|
+
module RespondsToParent
|
4
|
+
# Executes the response body as JavaScript in the context of the parent window.
|
5
|
+
# Use this method of you are posting a form to a hidden IFRAME or if you would like
|
6
|
+
# to use IFRAME base RPC.
|
7
|
+
def responds_to_parent(&block)
|
8
|
+
yield
|
21
9
|
|
10
|
+
if performed?
|
11
|
+
# Either pull out a redirect or the request body
|
12
|
+
script = if response.headers['Location']
|
13
|
+
#TODO: erase_redirect_results is missing in rails 3.0
|
14
|
+
"document.location.href = '#{self.class.helpers.escape_javascript location.to_s}'"
|
15
|
+
else
|
16
|
+
response.body || ''
|
17
|
+
end
|
22
18
|
|
23
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
# We're returning HTML instead of JS or XML now
|
34
|
-
response.headers['Content-Type'] = 'text/html; charset=UTF-8'
|
35
|
-
|
36
|
-
# Either pull out a redirect or the request body
|
37
|
-
script = if response.headers['Location']
|
38
|
-
#TODO: erase_redirect_results is missing in rails 3.0 has to be implemented
|
39
|
-
#erase redirect
|
40
|
-
"document.location.href = #{location.to_s.inspect}"
|
41
|
-
else
|
42
|
-
response.body
|
43
|
-
end
|
44
|
-
|
45
|
-
# Escape quotes, linebreaks and slashes, maintaining previously escaped slashes
|
46
|
-
# Suggestions for improvement?
|
47
|
-
script = (script || '').
|
48
|
-
gsub('\\', '\\\\\\').
|
49
|
-
gsub(/\r\n|\r|\n/, '\\n').
|
50
|
-
gsub(/['"]/, '\\\\\&').
|
51
|
-
gsub('</script>','</scr"+"ipt>')
|
19
|
+
# Eval in parent scope and replace document location of this frame
|
20
|
+
# so back button doesn't replay action on targeted forms
|
21
|
+
# loc = document.location to be set after parent is updated for IE
|
22
|
+
# with(window.parent) - pull in variables from parent window
|
23
|
+
# setTimeout - scope the execution in the windows parent for safari
|
24
|
+
# window.eval - legal eval for Opera
|
25
|
+
script = "<html><body><script type='text/javascript' charset='utf-8'>
|
26
|
+
var loc = document.location;
|
27
|
+
with(window.parent) { setTimeout(function() { window.eval('#{self.class.helpers.escape_javascript script}'); window.loc && loc.replace('about:blank'); }, 1) }
|
28
|
+
</script></body></html>"
|
52
29
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
</script></body></html>".html_safe
|
30
|
+
# We're returning HTML instead of JS or XML now
|
31
|
+
response.headers['Content-Type'] = 'text/html; charset=UTF-8'
|
32
|
+
|
33
|
+
# Clear out the previous render to prevent double render and then render
|
34
|
+
if respond_to?(:erase_results, true)
|
35
|
+
erase_results
|
36
|
+
else
|
37
|
+
instance_variable_set(:@_response_body, nil)
|
38
|
+
end
|
39
|
+
|
40
|
+
render :text => script
|
41
|
+
end
|
66
42
|
end
|
43
|
+
alias respond_to_parent responds_to_parent
|
67
44
|
end
|
68
|
-
alias respond_to_parent responds_to_parent
|
69
45
|
end
|
70
|
-
|
@@ -1,13 +1,99 @@
|
|
1
1
|
class ActiveScaffold::Tableless < ActiveRecord::Base
|
2
|
-
class
|
3
|
-
|
2
|
+
class AssociationScope < ActiveRecord::Associations::AssociationScope
|
3
|
+
def column_for(table_name, column_name, alias_tracker = nil)
|
4
|
+
klass = alias_tracker ? alias_tracker.connection.klass : self.klass
|
5
|
+
if table_name == klass.table_name
|
6
|
+
klass.columns_hash[column_name]
|
7
|
+
else
|
8
|
+
super
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
if defined?(ActiveRecord::Associations::AssociationScope::INSTANCE) # rails >= 4.1
|
13
|
+
INSTANCE = respond_to?(:create) ? create : new # create for rails >= 4.2
|
14
|
+
def self.scope(association, connection)
|
15
|
+
INSTANCE.scope association, connection
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Connection < ActiveRecord::ConnectionAdapters::AbstractAdapter
|
21
|
+
attr_reader :klass
|
22
|
+
def initialize(klass, *args)
|
23
|
+
super(nil, *args)
|
24
|
+
@klass = klass
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class Column < ActiveRecord::ConnectionAdapters::Column
|
29
|
+
def initialize(name, default, sql_type = nil, null = true)
|
30
|
+
if defined?(ActiveRecord::ConnectionAdapters::Type) # rails >= 4.2
|
31
|
+
cast_type = ActiveRecord::Base.connection.send :lookup_cast_type, sql_type
|
32
|
+
super(name, default, cast_type, sql_type, null)
|
33
|
+
else # rails < 4.2
|
34
|
+
super
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
module Association
|
40
|
+
def self.included(base)
|
41
|
+
base.alias_method_chain :association_scope, :tableless
|
42
|
+
base.alias_method_chain :target_scope, :tableless
|
43
|
+
end
|
44
|
+
|
45
|
+
def association_scope_with_tableless
|
46
|
+
@association_scope ||= overrided_association_scope if klass < ActiveScaffold::Tableless
|
47
|
+
association_scope_without_tableless
|
48
|
+
end
|
49
|
+
|
50
|
+
def overrided_association_scope
|
51
|
+
if AssociationScope.respond_to?(:scope) # rails >= 4.1
|
52
|
+
AssociationScope.scope(self, klass.connection)
|
53
|
+
else # rails < 4.1
|
54
|
+
AssociationScope.new(self).scope
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def target_scope_with_tableless
|
59
|
+
target_scope_without_tableless.tap do |scope|
|
60
|
+
if klass < ActiveScaffold::Tableless
|
61
|
+
class << scope; include RelationExtension; end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
module CollectionAssociation
|
68
|
+
def self.included(base)
|
69
|
+
base.alias_method_chain :get_records, :tableless if Rails.version >= '4.2'
|
70
|
+
end
|
71
|
+
def get_records_with_tableless
|
72
|
+
klass < ActiveScaffold::Tableless ? scope.to_a : get_records_without_tableless
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
module SingularAssociation
|
77
|
+
def self.included(base)
|
78
|
+
base.alias_method_chain :get_records, :tableless if Rails.version >= '4.2'
|
79
|
+
end
|
80
|
+
def get_records_with_tableless
|
81
|
+
klass < ActiveScaffold::Tableless ? scope.limit(1).to_a : get_records_without_tableless
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
module RelationExtension
|
86
|
+
def conditions
|
87
|
+
@conditions
|
88
|
+
end
|
89
|
+
|
4
90
|
def initialize(klass, table)
|
5
91
|
super
|
6
92
|
@conditions ||= []
|
7
93
|
end
|
8
94
|
|
9
95
|
def initialize_copy(other)
|
10
|
-
@conditions = @conditions.dup
|
96
|
+
@conditions = @conditions.try(:dup) || []
|
11
97
|
super
|
12
98
|
end
|
13
99
|
|
@@ -44,10 +130,9 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
|
|
44
130
|
end
|
45
131
|
end
|
46
132
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
self.abstract_class = true
|
133
|
+
class Relation < ActiveRecord::Relation
|
134
|
+
include RelationExtension
|
135
|
+
end
|
51
136
|
class << self
|
52
137
|
private
|
53
138
|
def relation
|
@@ -55,8 +140,40 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
|
|
55
140
|
end
|
56
141
|
end
|
57
142
|
|
143
|
+
class StatementCache
|
144
|
+
def initialize(key)
|
145
|
+
@key = key
|
146
|
+
end
|
147
|
+
|
148
|
+
def execute(values, model, connection)
|
149
|
+
model.where(@key => values)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
unless Rails.version < '4.2'
|
154
|
+
def self.columns_hash
|
155
|
+
if self < ActiveScaffold::Tableless
|
156
|
+
@columns_hash ||= Hash[self.columns.map { |c| [c.name, c] }]
|
157
|
+
else
|
158
|
+
super
|
159
|
+
end
|
160
|
+
end
|
161
|
+
def self.initialize_find_by_cache
|
162
|
+
self.find_by_statement_cache = Hash.new { |h, k| h[k] = StatementCache.new(k) }
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def self.columns; @columns ||= []; end
|
167
|
+
def self.table_name; @table_name ||= ActiveModel::Naming.plural(self); end
|
168
|
+
def self.table_exists?; true; end
|
169
|
+
self.abstract_class = true
|
170
|
+
|
171
|
+
def self.connection
|
172
|
+
@connection ||= Connection.new(self)
|
173
|
+
end
|
174
|
+
|
58
175
|
def self.column(name, sql_type = nil, options = {})
|
59
|
-
column =
|
176
|
+
column = Column.new(name.to_s, options[:default], sql_type.to_s, options.has_key?(:null) ? options[:null] : true)
|
60
177
|
column.tap { columns << column }
|
61
178
|
end
|
62
179
|
|
@@ -80,11 +197,13 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
|
|
80
197
|
raise 'destroy must be implemented in a Tableless model'
|
81
198
|
end
|
82
199
|
|
83
|
-
def
|
200
|
+
def create_record #:nodoc:
|
84
201
|
run_callbacks(:create) {}
|
85
202
|
end
|
203
|
+
alias_method :create, :create_record # for rails3
|
86
204
|
|
87
|
-
def
|
205
|
+
def update_record(*) #:nodoc:
|
88
206
|
run_callbacks(:update) {}
|
89
207
|
end
|
208
|
+
alias_method :update, :update_record # for rails3
|
90
209
|
end
|
data/test/bridges/bridge_test.rb
CHANGED
@@ -23,7 +23,7 @@ class DatePickerTest < ActionView::TestCase
|
|
23
23
|
def test_form_ui
|
24
24
|
config = ActiveScaffold::Config::Core.new(:company)
|
25
25
|
@record = Company.new
|
26
|
-
assert active_scaffold_input_date_picker(config.columns[:date], :name => 'record[date]', :id => 'record_date')
|
27
|
-
assert active_scaffold_input_date_picker(config.columns[:datetime], :name => 'record[datetime]', :id => 'record_datetime')
|
26
|
+
assert active_scaffold_input_date_picker(config.columns[:date], :name => 'record[date]', :id => 'record_date', :object => @record)
|
27
|
+
assert active_scaffold_input_date_picker(config.columns[:datetime], :name => 'record[datetime]', :id => 'record_datetime', :object => @record)
|
28
28
|
end
|
29
29
|
end
|
@@ -14,9 +14,9 @@ class PaperclipTest < ActionView::TestCase
|
|
14
14
|
def test_initialization_without_paperclip
|
15
15
|
Company.expects(:attachment_definitions)
|
16
16
|
config = PaperclipCore.new(:company)
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
refute config.create.multipart?
|
18
|
+
refute config.update.multipart?
|
19
|
+
refute config.columns.any? {|column| column.form_ui == :paperclip}
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_initialization
|
@@ -26,7 +26,7 @@ class PaperclipTest < ActionView::TestCase
|
|
26
26
|
assert_equal :paperclip, config.columns[:logo].form_ui
|
27
27
|
assert_equal [:delete_logo], config.columns[:logo].params.to_a
|
28
28
|
%w(logo_file_name logo_file_size logo_updated_at logo_content_type).each do |attr|
|
29
|
-
|
29
|
+
refute config.columns._inheritable.include?(attr.to_sym)
|
30
30
|
end
|
31
31
|
assert Company.method_defined?(:delete_logo)
|
32
32
|
assert Company.method_defined?(:'delete_logo=')
|
@@ -48,20 +48,22 @@ class PaperclipTest < ActionView::TestCase
|
|
48
48
|
company = Company.new
|
49
49
|
|
50
50
|
company.stubs(:logo).returns(stub(:file? => true, :original_filename => 'file', :url => '/system/file', :styles => Company.attachment_definitions[:logo]))
|
51
|
-
assert_dom_equal '<a href="/system/file"
|
51
|
+
assert_dom_equal '<a href="/system/file" target="_blank">file</a>', active_scaffold_column_paperclip(company, config.columns[:logo])
|
52
52
|
|
53
53
|
company.stubs(:logo).returns(stub(:file? => true, :original_filename => 'file', :url => '/system/file', :styles => {:thumbnail => '40x40'}))
|
54
|
-
assert_dom_equal '<a href="/system/file"
|
54
|
+
assert_dom_equal '<a href="/system/file" target="_blank"><img src="/system/file" border="0" alt="File"/></a>', active_scaffold_column_paperclip(company, config.columns[:logo])
|
55
55
|
end
|
56
56
|
|
57
57
|
def test_form_ui
|
58
|
+
js, ActiveScaffold.js_framework = ActiveScaffold.js_framework, :jquery
|
58
59
|
config = PaperclipCore.new(:company)
|
59
60
|
@record = Company.new
|
60
61
|
|
61
62
|
@record.stubs(:logo).returns(stub(:file? => true, :original_filename => 'file', :url => '/system/file', :styles => Company.attachment_definitions[:logo]))
|
62
|
-
|
63
|
+
escaped_quote = Rails::VERSION::MAJOR < 4 ? ''' : '''
|
64
|
+
assert_dom_equal %{<div><a href="/system/file" target="_blank">file</a> | <input name="record[delete_logo]" type="hidden" id="record_delete_logo" value="false" /><a href="#" onclick="jQuery(this).prev().val(#{escaped_quote}true#{escaped_quote}); jQuery(this).parent().hide().next().show(); return false;">Remove or Replace file</a></div><div style="display: none"><input name="record[logo]" class="text-input" autocomplete="off" type="file" id="record_logo" /></div>}, active_scaffold_input_paperclip(config.columns[:logo], :name => 'record[logo]', :id => 'record_logo', :object => @record)
|
63
65
|
|
64
66
|
@record.stubs(:logo).returns(stub(:file? => false))
|
65
|
-
assert_dom_equal '<input name="record[logo]" class="text-input" autocomplete="off" type="file" id="record_logo" />', active_scaffold_input_paperclip(config.columns[:logo], :name => 'record[logo]', :id => 'record_logo')
|
67
|
+
assert_dom_equal '<input name="record[logo]" class="text-input" autocomplete="off" type="file" id="record_logo" />', active_scaffold_input_paperclip(config.columns[:logo], :name => 'record[logo]', :id => 'record_logo', :object => @record)
|
66
68
|
end
|
67
69
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
require File.join(File.dirname(__FILE__), '../../lib/active_scaffold/bridges/tiny_mce/helpers')
|
3
2
|
|
4
3
|
class TinyMceTest < ActionView::TestCase
|
5
4
|
include ActiveScaffold::Helpers::ViewHelpers
|
@@ -7,6 +6,7 @@ class TinyMceTest < ActionView::TestCase
|
|
7
6
|
|
8
7
|
def test_includes
|
9
8
|
ActiveScaffold::Bridges::TinyMce.expects(:install?).returns(true)
|
9
|
+
ActiveScaffold.js_framework = :jquery
|
10
10
|
assert ActiveScaffold::Bridges.all_javascripts.include?("tinymce-jquery")
|
11
11
|
end
|
12
12
|
|
@@ -15,7 +15,7 @@ class TinyMceTest < ActionView::TestCase
|
|
15
15
|
@record = Company.new
|
16
16
|
self.expects(:request).returns(stub(:xhr? => true))
|
17
17
|
|
18
|
-
assert_dom_equal
|
18
|
+
assert_dom_equal %{<textarea name=\"record[name]\" class=\"name-input mceEditor\" id=\"record_name\">\n</textarea>\n<script#{' type="text/javascript"' if Rails::VERSION::MAJOR < 4}>\n//<![CDATA[\ntinyMCE.settings = {\"theme\":\"simple\"};tinyMCE.execCommand('mceAddControl', false, 'record_name');\n//]]>\n</script>}, active_scaffold_input_text_editor(config.columns[:name], :name => 'record[name]', :id => 'record_name', :class => 'name-input', :object => @record)
|
19
19
|
end
|
20
20
|
|
21
21
|
protected
|
data/test/company.rb
CHANGED
@@ -9,13 +9,13 @@ class Company < ActiveRecord::Base
|
|
9
9
|
|
10
10
|
def self.columns_hash
|
11
11
|
{
|
12
|
-
'name' =>
|
13
|
-
'date' =>
|
14
|
-
'datetime' =>
|
15
|
-
'logo_file_name' =>
|
16
|
-
'logo_content_type' =>
|
17
|
-
'logo_file_size' =>
|
18
|
-
'logo_updated_at' =>
|
12
|
+
'name' => ColumnMock.new('name', nil, 'varchar(255)'),
|
13
|
+
'date' => ColumnMock.new('date', nil, 'date'),
|
14
|
+
'datetime' => ColumnMock.new('datetime', nil, 'datetime'),
|
15
|
+
'logo_file_name' => ColumnMock.new('logo_file_name', nil, 'varchar(255)'),
|
16
|
+
'logo_content_type' => ColumnMock.new('logo_content_type', nil, 'varchar(255)'),
|
17
|
+
'logo_file_size' => ColumnMock.new('logo_file_size', nil, 'int(11)'),
|
18
|
+
'logo_updated_at' => ColumnMock.new('logo_updated_at', nil, 'datetime'),
|
19
19
|
}
|
20
20
|
end
|
21
21
|
|
@@ -39,15 +39,27 @@ class Company < ActiveRecord::Base
|
|
39
39
|
def self.before_destroy(s=nil)
|
40
40
|
@@before = s
|
41
41
|
end
|
42
|
+
|
43
|
+
if respond_to?(:create_reflection)
|
44
|
+
if method(:create_reflection).arity == 4
|
45
|
+
def self.create_reflection(macro, name, scope, options, active_record)
|
46
|
+
super(macro, name, options, active_record)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
else
|
50
|
+
def self.create_reflection(*args)
|
51
|
+
ActiveRecord::Reflection.create *args
|
52
|
+
end
|
53
|
+
end
|
42
54
|
|
43
55
|
def self.has_many(association_id, options = {})
|
44
|
-
reflection = create_reflection(:has_many, association_id, options, self)
|
56
|
+
reflection = create_reflection(:has_many, association_id, nil, options, self)
|
45
57
|
end
|
46
58
|
def self.has_one(association_id, options = {})
|
47
|
-
reflection = create_reflection(:has_one, association_id, options, self)
|
59
|
+
reflection = create_reflection(:has_one, association_id, nil, options, self)
|
48
60
|
end
|
49
61
|
def self.belongs_to(association_id, options = {})
|
50
|
-
reflection = create_reflection(:belongs_to, association_id, options, self)
|
62
|
+
reflection = create_reflection(:belongs_to, association_id, nil, options, self)
|
51
63
|
end
|
52
64
|
has_many :companies
|
53
65
|
has_one :company
|
data/test/config/base_test.rb
CHANGED
data/test/config/core_test.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
module Config
|
4
|
-
class CoreTest < Test
|
5
|
-
class ModelStubsController < ActionController::Base
|
4
|
+
class CoreTest < MiniTest::Test
|
5
|
+
class ModelStubsController < ActionController::Base
|
6
|
+
include ActiveScaffold::Core
|
7
|
+
end
|
6
8
|
def setup
|
7
9
|
@config = ActiveScaffold::Config::Core.new :model_stub
|
8
10
|
ModelStubsController.instance_variable_set :@active_scaffold_config, @config
|
9
11
|
end
|
10
12
|
|
11
13
|
def test_default_options
|
12
|
-
|
13
|
-
|
14
|
+
refute @config.add_sti_create_links?
|
15
|
+
refute @config.sti_children
|
14
16
|
assert_equal [:create, :list, :search, :update, :delete, :show, :nested, :subform], @config.actions.to_a
|
15
17
|
assert_equal :default, @config.frontend
|
16
18
|
assert_equal :default, @config.theme
|
@@ -20,7 +22,7 @@ module Config
|
|
20
22
|
|
21
23
|
def test_add_sti_children
|
22
24
|
@config.sti_create_links = true
|
23
|
-
|
25
|
+
refute @config.add_sti_create_links?
|
24
26
|
@config.sti_children = [:a]
|
25
27
|
assert @config.add_sti_create_links?
|
26
28
|
end
|
@@ -33,7 +35,7 @@ module Config
|
|
33
35
|
def test_actions
|
34
36
|
assert @config.actions.include?(:create)
|
35
37
|
@config.actions = [:list]
|
36
|
-
|
38
|
+
refute @config.actions.include?(:create)
|
37
39
|
assert_equal [:list], @config.actions.to_a
|
38
40
|
end
|
39
41
|
|