netzke-basepack 0.7.7 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. data/.travis.yml +15 -10
  2. data/{CHANGELOG.rdoc → CHANGELOG.md} +146 -110
  3. data/LICENSE +7 -1
  4. data/README.md +47 -56
  5. data/Rakefile +5 -5
  6. data/config/before-travis.sh +10 -0
  7. data/javascripts/basepack.js +0 -130
  8. data/javascripts/netzkeremotecombo.js +59 -0
  9. data/lib/netzke/basepack.rb +9 -14
  10. data/lib/netzke/basepack/accordion.rb +45 -0
  11. data/lib/netzke/basepack/active_record.rb +12 -0
  12. data/lib/netzke/basepack/active_record/relation_extensions.rb +27 -0
  13. data/lib/netzke/basepack/columns.rb +309 -0
  14. data/lib/netzke/basepack/data_accessor.rb +22 -12
  15. data/lib/netzke/basepack/data_adapters/abstract_adapter.rb +75 -11
  16. data/lib/netzke/basepack/data_adapters/active_record_adapter.rb +154 -49
  17. data/lib/netzke/basepack/fields.rb +162 -0
  18. data/lib/netzke/basepack/form.rb +136 -0
  19. data/lib/netzke/basepack/{form_panel → form}/javascripts/comma_list_cbg.js +0 -1
  20. data/lib/netzke/basepack/{form_panel/javascripts/form_panel.js → form/javascripts/form.js} +20 -26
  21. data/lib/netzke/basepack/{form_panel → form}/javascripts/n_radio_group.js +0 -1
  22. data/lib/netzke/basepack/{form_panel → form}/javascripts/readonly_mode.js +0 -0
  23. data/lib/netzke/basepack/form/services.rb +115 -0
  24. data/lib/netzke/basepack/{form_panel → form}/stylesheets/readonly_mode.css +0 -0
  25. data/lib/netzke/basepack/grid.rb +355 -0
  26. data/lib/netzke/basepack/{grid_panel → grid}/javascripts/advanced_search.js +1 -1
  27. data/lib/netzke/basepack/{grid_panel → grid}/javascripts/check_column_fix.js +0 -0
  28. data/lib/netzke/basepack/{grid_panel → grid}/javascripts/edit_in_form.js +3 -3
  29. data/lib/netzke/basepack/{grid_panel → grid}/javascripts/event_handling.js +5 -2
  30. data/lib/netzke/basepack/{grid_panel/javascripts/grid_panel.js → grid/javascripts/grid.js} +120 -132
  31. data/lib/netzke/basepack/{grid_panel → grid}/javascripts/misc.js +0 -0
  32. data/lib/netzke/basepack/grid/services.rb +216 -0
  33. data/lib/netzke/basepack/item_persistence.rb +44 -0
  34. data/lib/netzke/basepack/item_persistence/events_plugin.rb +47 -0
  35. data/lib/netzke/basepack/{paging_form_panel.rb → paging_form.rb} +24 -30
  36. data/lib/netzke/basepack/{paging_form_panel/javascripts/paging_form_panel.js → paging_form/javascripts/paging_form.js} +2 -4
  37. data/lib/netzke/basepack/query_builder.rb +44 -73
  38. data/lib/netzke/basepack/query_builder/javascripts/query_builder.js +16 -2
  39. data/lib/netzke/basepack/record_form_window.rb +67 -0
  40. data/lib/netzke/basepack/search_panel.rb +22 -24
  41. data/lib/netzke/basepack/search_panel/javascripts/condition_field.js +2 -2
  42. data/lib/netzke/basepack/search_window.rb +47 -53
  43. data/lib/netzke/basepack/simple_app.rb +10 -13
  44. data/lib/netzke/basepack/simple_app/javascripts/simple_app.js +2 -8
  45. data/lib/netzke/basepack/tab_panel.rb +5 -4
  46. data/lib/netzke/basepack/tab_panel/javascripts/tab_panel.js +5 -5
  47. data/lib/netzke/basepack/version.rb +2 -2
  48. data/lib/netzke/basepack/viewport.rb +16 -0
  49. data/lib/netzke/basepack/window.rb +27 -18
  50. data/lib/netzke/basepack/window/javascripts/window.js +7 -1
  51. data/lib/netzke/basepack/wrap_lazy_loaded.rb +18 -18
  52. data/locales/en.yml +40 -24
  53. data/netzke-basepack.gemspec +51 -82
  54. data/stylesheets/basepack.css +0 -41
  55. data/test/basepack_test_app/Gemfile +9 -46
  56. data/test/basepack_test_app/Gemfile.lock +61 -96
  57. data/test/basepack_test_app/app/components/author_form.rb +8 -5
  58. data/test/basepack_test_app/app/components/author_grid.rb +2 -2
  59. data/test/basepack_test_app/app/components/book_form.rb +34 -31
  60. data/test/basepack_test_app/app/components/book_form_with_defaults.rb +6 -7
  61. data/test/basepack_test_app/app/components/book_form_with_file_upload.rb +10 -0
  62. data/test/basepack_test_app/app/components/book_form_with_nested_attributes.rb +5 -6
  63. data/test/basepack_test_app/app/components/book_grid.rb +19 -8
  64. data/test/basepack_test_app/app/components/book_grid_filtering.rb +4 -7
  65. data/test/basepack_test_app/app/components/book_grid_loader.rb +28 -15
  66. data/test/basepack_test_app/app/components/book_grid_with_custom_columns.rb +45 -21
  67. data/test/basepack_test_app/app/components/book_grid_with_default_values.rb +26 -8
  68. data/test/basepack_test_app/app/components/book_grid_with_excluded_columns.rb +11 -0
  69. data/test/basepack_test_app/app/components/book_grid_with_extra_feedback.rb +2 -2
  70. data/test/basepack_test_app/app/components/book_grid_with_extra_filters.rb +7 -6
  71. data/test/basepack_test_app/app/components/book_grid_with_mass_assignment_security.rb +9 -0
  72. data/test/basepack_test_app/app/components/book_grid_with_nested_attributes.rb +9 -9
  73. data/test/basepack_test_app/app/components/book_grid_with_overridden_columns.rb +5 -3
  74. data/test/basepack_test_app/app/components/book_grid_with_paging.rb +6 -8
  75. data/test/basepack_test_app/app/components/book_grid_with_persistence.rb +6 -4
  76. data/test/basepack_test_app/app/components/book_grid_with_scope.rb +6 -0
  77. data/test/basepack_test_app/app/components/book_grid_with_scoped_authors.rb +10 -7
  78. data/test/basepack_test_app/app/components/book_grid_with_virtual_attributes.rb +21 -13
  79. data/test/basepack_test_app/app/components/book_paging_form.rb +21 -0
  80. data/test/basepack_test_app/app/components/book_query_builder.rb +7 -6
  81. data/test/basepack_test_app/app/components/book_with_custom_primary_key_grid.rb +6 -7
  82. data/test/basepack_test_app/app/components/books_bound_to_author.rb +9 -7
  83. data/test/basepack_test_app/app/components/border_layout_panel_with_persistence.rb +12 -0
  84. data/test/basepack_test_app/app/components/double_book_grid.rb +19 -14
  85. data/test/basepack_test_app/app/components/form_without_model.rb +15 -16
  86. data/test/basepack_test_app/app/components/grid_with_initial_sorting.rb +7 -0
  87. data/test/basepack_test_app/app/components/grid_with_inline_data.rb +7 -0
  88. data/test/basepack_test_app/app/components/paging_form_with_search.rb +2 -2
  89. data/test/basepack_test_app/app/components/panel_with_persistent_regions.rb +35 -0
  90. data/test/basepack_test_app/app/components/query_builder.rb +7 -0
  91. data/test/basepack_test_app/app/components/simple_panel.rb +16 -11
  92. data/test/basepack_test_app/app/components/simple_window.rb +7 -6
  93. data/test/basepack_test_app/app/components/some_accordion.rb +18 -0
  94. data/test/basepack_test_app/app/components/some_auth_app.rb +5 -5
  95. data/test/basepack_test_app/app/components/some_border_layout.rb +20 -20
  96. data/test/basepack_test_app/app/components/some_search_panel.rb +6 -0
  97. data/test/basepack_test_app/app/components/some_simple_app.rb +30 -16
  98. data/test/basepack_test_app/app/components/some_tab_panel.rb +18 -15
  99. data/test/basepack_test_app/app/components/user_form.rb +18 -16
  100. data/test/basepack_test_app/app/components/user_form_with_default_fields.rb +5 -6
  101. data/test/basepack_test_app/app/components/user_grid.rb +11 -6
  102. data/test/basepack_test_app/app/components/user_grid_with_customized_form_fields.rb +5 -3
  103. data/test/basepack_test_app/app/components/window_component_loader.rb +25 -21
  104. data/test/basepack_test_app/app/models/address.rb +0 -26
  105. data/test/basepack_test_app/app/models/author.rb +0 -31
  106. data/test/basepack_test_app/app/models/book.rb +1 -42
  107. data/test/basepack_test_app/app/models/book_with_custom_primary_key.rb +1 -23
  108. data/test/basepack_test_app/app/models/role.rb +0 -21
  109. data/test/basepack_test_app/app/models/user.rb +0 -24
  110. data/test/basepack_test_app/app/views/layouts/components.html.erb +1 -1
  111. data/test/basepack_test_app/config/application.rb +1 -1
  112. data/test/basepack_test_app/config/database.yml.travis +2 -6
  113. data/test/basepack_test_app/config/initializers/netzke.rb +1 -6
  114. data/test/basepack_test_app/db/schema.rb +14 -14
  115. data/test/basepack_test_app/features/accordion_panel.feature +2 -2
  116. data/test/basepack_test_app/features/form_panel.feature +7 -7
  117. data/test/basepack_test_app/features/grid_panel.feature +93 -39
  118. data/test/basepack_test_app/features/grid_panel_with_custom_primary_key.feature +2 -1
  119. data/test/basepack_test_app/features/grid_sorting.feature +30 -6
  120. data/test/basepack_test_app/features/paging_form_panel.feature +7 -7
  121. data/test/basepack_test_app/features/persistent_regions.feature +30 -0
  122. data/test/basepack_test_app/features/search_in_grid.feature +5 -5
  123. data/test/basepack_test_app/features/simple_app.feature +6 -7
  124. data/test/basepack_test_app/features/step_definitions/form_panel_steps.rb +1 -1
  125. data/test/basepack_test_app/features/step_definitions/generic_steps.rb +109 -4
  126. data/test/basepack_test_app/features/step_definitions/grid_panel_steps.rb +8 -10
  127. data/test/basepack_test_app/features/step_definitions/window_steps.rb +27 -0
  128. data/test/basepack_test_app/features/tab_panel.feature +1 -1
  129. data/test/basepack_test_app/features/window.feature +17 -0
  130. data/test/unit/accordion_panel_test.rb +2 -2
  131. data/test/unit/grid_panel_test.rb +4 -4
  132. metadata +57 -83
  133. data/TODO.rdoc +0 -8
  134. data/lib/generators/netzke/basepack_generator.rb +0 -10
  135. data/lib/generators/netzke/templates/assets/ts-checkbox.gif +0 -0
  136. data/lib/generators/netzke/templates/create_netzke_field_lists.rb +0 -18
  137. data/lib/netzke/active_record.rb +0 -20
  138. data/lib/netzke/active_record/attributes.rb +0 -259
  139. data/lib/netzke/active_record/combobox_options.rb +0 -16
  140. data/lib/netzke/active_record/relation_extensions.rb +0 -37
  141. data/lib/netzke/basepack/accordion_panel.rb +0 -39
  142. data/lib/netzke/basepack/action_column.rb +0 -68
  143. data/lib/netzke/basepack/action_column/javascripts/action_column.js +0 -61
  144. data/lib/netzke/basepack/auth_app.rb +0 -159
  145. data/lib/netzke/basepack/basic_app.rb +0 -7
  146. data/lib/netzke/basepack/border_layout_panel.rb +0 -53
  147. data/lib/netzke/basepack/border_layout_panel/javascripts/border_layout_panel.js +0 -40
  148. data/lib/netzke/basepack/data_adapters/data_mapper_adapter.rb +0 -264
  149. data/lib/netzke/basepack/data_adapters/sequel_adapter.rb +0 -260
  150. data/lib/netzke/basepack/form_panel.rb +0 -144
  151. data/lib/netzke/basepack/form_panel/fields.rb +0 -208
  152. data/lib/netzke/basepack/form_panel/javascripts/misc.js +0 -4
  153. data/lib/netzke/basepack/form_panel/services.rb +0 -142
  154. data/lib/netzke/basepack/grid_panel.rb +0 -441
  155. data/lib/netzke/basepack/grid_panel/columns.rb +0 -400
  156. data/lib/netzke/basepack/grid_panel/javascripts/rows-dd.js +0 -281
  157. data/lib/netzke/basepack/grid_panel/record_form_window.rb +0 -41
  158. data/lib/netzke/basepack/grid_panel/services.rb +0 -235
  159. data/lib/netzke/basepack/panel.rb +0 -11
  160. data/lib/netzke/basepack/wrapper.rb +0 -28
  161. data/lib/netzke/data_mapper.rb +0 -18
  162. data/lib/netzke/data_mapper/attributes.rb +0 -273
  163. data/lib/netzke/data_mapper/combobox_options.rb +0 -11
  164. data/lib/netzke/data_mapper/relation_extensions.rb +0 -38
  165. data/lib/netzke/sequel.rb +0 -18
  166. data/lib/netzke/sequel/attributes.rb +0 -274
  167. data/lib/netzke/sequel/combobox_options.rb +0 -10
  168. data/lib/netzke/sequel/relation_extensions.rb +0 -40
  169. data/locales/zh-cn.yml +0 -79
  170. data/test/basepack_test_app/app/components/book_form_with_custom_fields.rb +0 -21
  171. data/test/basepack_test_app/app/components/book_grid_with_column_actions.rb +0 -15
  172. data/test/basepack_test_app/app/components/book_grid_with_defaults.rb +0 -6
  173. data/test/basepack_test_app/app/components/book_paging_form_panel.rb +0 -22
  174. data/test/basepack_test_app/app/components/generic_user_form.rb +0 -12
  175. data/test/basepack_test_app/app/components/simple_accordion.rb +0 -11
  176. data/test/basepack_test_app/app/components/simple_tab_panel.rb +0 -11
  177. data/test/basepack_test_app/app/components/simple_wrapper.rb +0 -7
  178. data/test/basepack_test_app/app/components/some_accordion_panel.rb +0 -22
  179. data/test/basepack_test_app/app/presenters/forms/generic_user.rb +0 -6
  180. data/test/basepack_test_app/app/views/components/loadable_window.html.erb +0 -9
  181. data/test/basepack_test_app/app/views/components/simple_panel.html.erb +0 -1
  182. data/test/basepack_test_app/features/components_in_view.feature +0 -11
  183. data/test/basepack_test_app/features/simple_panel.feature +0 -11
  184. data/test/basepack_test_app/features/validations_in_grid.feature +0 -13
  185. data/test/basepack_test_app/features/virtual_attributes.feature +0 -16
  186. data/test/basepack_test_app/spec/components/form_panel_spec.rb +0 -53
  187. data/test/basepack_test_app/spec/components/grid_panel_spec.rb +0 -10
  188. data/test/basepack_test_app/spec/data_adapter/adapter_spec.rb +0 -68
  189. data/test/basepack_test_app/spec/data_adapter/attributes_spec.rb +0 -56
  190. data/test/basepack_test_app/spec/data_adapter/relation_extensions_spec.rb +0 -125
  191. data/test/basepack_test_app/spec/factories.rb +0 -28
  192. data/test/basepack_test_app/spec/spec_helper.rb +0 -39
@@ -1,11 +0,0 @@
1
- module Netzke
2
- module DataMapper
3
- module ComboboxOptions
4
- def netzke_combo_options_for(column, query = "")
5
- # NOTE: :order=>[column.to_sym.asc] is necessary as per http://datamapper.org/docs/find.html, Version 1.2.0
6
- values=all(:fields=>[column], :unique=>true, :order=>[column.to_sym.asc])
7
- (query.blank? ? values : values.all(column.to_sym.like => "#{query}%")).map &column.to_sym
8
- end
9
- end
10
- end
11
- end
@@ -1,38 +0,0 @@
1
- module Netzke
2
- module DataMapper
3
- module RelationExtensions
4
-
5
- def extend_with(*params)
6
- scope = params.shift
7
- case scope.class.name
8
- when "Symbol" # model's scope
9
- # In DataMapper case this is just a method
10
- self.send(scope, *params)
11
- when "String" # SQL query or SQL query with params (e.g. ["created_at < ?", 1.day.ago])
12
- raise NotImplementedError.new("This method is unsupported, as DM doen't allow to extend relations with SQL")
13
- when "Array"
14
- self.extend_with(*scope)
15
- when "Hash" # conditions hash
16
- self.all(scope)
17
- when "ActiveSupport::HashWithIndifferentAccess" # conditions hash
18
- self.all(scope)
19
- when "Proc" # receives a relation, must return a relation
20
- scope.call(self)
21
- else
22
- raise ArgumentError, "Wrong parameter type for ActiveRecord::Relation#extend_with"
23
- end
24
- end
25
-
26
- # Non-destructively extends itself whith a hash of double-underscore'd conditions,
27
- # where the last part "__" is MetaWhere operator (which is required), e.g.:
28
- # {:role__name__like => "%admin"}
29
- def extend_with_netzke_conditions(cond)
30
- cond.each_pair.inject(self) do |r, (k,v)|
31
- assoc, method, *operator = k.to_s.split("__")
32
- operator.empty? ? r.where(assoc.to_sym.send(method) => v) : r.where(assoc.to_sym => {method.to_sym.send(operator.last) => v}).joins(assoc.to_sym)
33
- end
34
- end
35
-
36
- end
37
- end
38
- end
data/lib/netzke/sequel.rb DELETED
@@ -1,18 +0,0 @@
1
- require 'netzke/sequel/attributes'
2
- require 'netzke/sequel/combobox_options'
3
- #require 'netzke/sequel/relation_extensions'
4
-
5
- module Netzke
6
- module Sequel
7
- end
8
- end
9
-
10
- if defined? Sequel
11
- # Extend Sequel
12
- Sequel::Model.class_eval do
13
- include ::Netzke::Sequel::Attributes
14
- include ::Netzke::Sequel::ComboboxOptions
15
- include ::Netzke::Sequel::RelationExtensions
16
- end
17
- end
18
-
@@ -1,274 +0,0 @@
1
- module Netzke
2
- module Sequel
3
- module Attributes
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_attribute :netzke_declared_attr
8
- self.netzke_declared_attr = []
9
-
10
- class_attribute :netzke_excluded_attr
11
- self.netzke_excluded_attr = []
12
-
13
- class_attribute :netzke_exposed_attr
14
- self.netzke_exposed_attr = []
15
- end
16
-
17
- def self.included receiver
18
- receiver.extend ClassMethods
19
- end
20
-
21
- module ClassMethods
22
- def data_adapter
23
- @data_adapter = Netzke::Basepack::DataAdapters::AbstractAdapter.adapter_class(self).new(self)
24
- end
25
-
26
- # mostly AR compatible for our purposes ;-)
27
- def columns_hash
28
- db_schema.inject({}){|memo,(k,v)| memo[k.to_s] = v; memo}
29
- end
30
-
31
- def column_names
32
- columns.map &:to_s
33
- end
34
-
35
- # human attribute name
36
- def human_attribute_name attr
37
- I18n.translate(attr, :scope => [:activerecord, :attributes, model_name.downcase.to_sym], :default => attr.to_s.humanize)
38
- end
39
-
40
- # Example:
41
- # netzke_attribute :recent, :type => :boolean, :read_only => true
42
- def netzke_attribute(name, options = {})
43
- name = name.to_s
44
- options[:attr_type] = options.delete(:type) || options.delete(:attr_type) || :string
45
- declared_attrs = self.netzke_declared_attr.dup
46
- # if the attr was declared already, simply merge it with the new options
47
- existing = declared_attrs.detect{ |va| va[:name] == name }
48
- if existing
49
- existing.merge!(options)
50
- else
51
- attr_config = {:name => name}.merge(options)
52
- # if primary_key, insert in front, otherwise append
53
- if name == self.primary_key.to_s
54
- declared_attrs.insert(0, attr_config)
55
- else
56
- declared_attrs << {:name => name}.merge(options)
57
- end
58
- end
59
- self.netzke_declared_attr = declared_attrs
60
- end
61
-
62
- # Exclude attributes from being picked up by grids and forms.
63
- # Accepts an array of attribute names (as symbols).
64
- # Example:
65
- # netzke_expose_attributes :created_at, :updated_at, :crypted_password
66
- def netzke_exclude_attributes(*args)
67
- self.netzke_excluded_attr = args.map(&:to_s)
68
- end
69
-
70
- # Explicitly expose attributes that should be picked up by grids and forms.
71
- # Accepts an array of attribute names (as symbols).
72
- # Takes precedence over <tt>netzke_exclude_attributes</tt>.
73
- # Example:
74
- # netzke_expose_attributes :name, :role__name
75
- def netzke_expose_attributes(*args)
76
- self.netzke_exposed_attr = args.map(&:to_s)
77
- end
78
-
79
- # Returns the attributes that will be picked up by grids and forms.
80
- def netzke_attributes
81
- exposed = netzke_exposed_attributes
82
- exposed ? netzke_attrs_in_forced_order(exposed) : netzke_attrs_in_natural_order
83
- end
84
-
85
- def netzke_attribute_hash
86
- netzke_attributes.inject({}){ |r,a| r.merge(a[:name].to_sym => a) }
87
- end
88
-
89
- def netzke_exposed_attributes
90
- exposed = self.netzke_exposed_attr
91
- if exposed && !exposed.include?(self.primary_key.to_s)
92
- # automatically declare primary key as a netzke attribute
93
- netzke_attribute(self.primary_key.to_s)
94
- exposed.insert(0, self.primary_key.to_s)
95
- end
96
- exposed
97
- end
98
-
99
- private
100
- def netzke_attrs_in_forced_order(attrs)
101
- attrs.collect do |attr_name|
102
- declared = self.netzke_declared_attr.detect { |va| va[:name] == attr_name } || {}
103
- in_columns_hash = columns_hash[attr_name] && {:name => attr_name, :attr_type => columns_hash[attr_name][:type], :default_value => columns_hash[attr_name][:default]} || {} # {:virtual => true} # if nothing found in columns, mark it as "virtual" or not?
104
- if in_columns_hash.empty?
105
- # If not among the model columns, it's either virtual, or an association
106
- merged = association_attr?(attr_name) ? declared.merge!(:name => attr_name) : declared.merge(:virtual => true)
107
- else
108
- # .. otherwise merge with what's declared
109
- merged = in_columns_hash.merge(declared)
110
- end
111
-
112
- # We didn't find it among declared, nor among the model columns, nor does it seem association attribute
113
- merged[:name].nil? && raise(ArgumentError, "Unknown attribute '#{attr_name}' for model #{self.name}", caller)
114
-
115
- merged
116
- end
117
- end
118
-
119
- # Returns netzke attributes in the order of columns in the table, followed by extra declared attributes
120
- # Detects many-to-one association columns and replaces the name of the column with association column name (Netzke style), e.g.:
121
- #
122
- # role_id => role__name
123
- def netzke_attrs_in_natural_order
124
- (
125
- declared_attrs = self.netzke_declared_attr
126
-
127
- column_names.map do |name|
128
- c = {:name => name, :attr_type => columns_hash[name][:type]}
129
-
130
- # If it's named as foreign key of some association, then it's an association column
131
- assoc = all_association_reflections.detect { |a| a[:key].to_s == c[:name] && a[:type] == :many_to_one }
132
- if assoc
133
- candidates = %w{name title label} << assoc[:key].to_s
134
- assoc_class = assoc[:class_name].constantize
135
- assoc_method = candidates.detect{|m| ( assoc_class.instance_methods.map(&:to_s) + column_names).include?(m) }
136
- c[:name] = "#{assoc[:name].to_s}__#{assoc_method}"
137
- c[:attr_type] = assoc_class.columns_hash[assoc_method].try(:[], :type) || :string # when it's an instance method rather than a column, fall back to :string
138
- end
139
-
140
- # auto set up the default value from the column settings
141
- c.merge!(:default_value => columns_hash[name][:default]) if columns_hash[name][:default]
142
-
143
- # if there's a declared attr with the same name, simply merge it with what's taken from the model's columns
144
- if declared = declared_attrs.detect{ |va| va[:name] == c[:name] }
145
- c.merge!(declared)
146
- declared_attrs.delete(declared)
147
- end
148
- c
149
- end +
150
- declared_attrs
151
- ).reject { |attr| self.netzke_excluded_attr.include?(attr[:name]) }
152
- end
153
-
154
- def association_attr?(attr_name)
155
- !!attr_name.index("__") # probably we can't do much better than this, as we don't know at this moment if the associated model has a specific attribute, and we don't really want to find it out
156
- end
157
-
158
- end
159
-
160
- # AR compatibility
161
- def attributes
162
- values
163
- end
164
-
165
- # Transforms a record to array of values according to the passed attributes
166
- def netzke_array(attributes = self.class.netzke_attributes)
167
- res = []
168
- for a in attributes
169
- next if a[:included] == false
170
- res << value_for_attribute(a, a[:nested_attribute])
171
- end
172
- res
173
- end
174
-
175
- # convenience method to convert all netzke attributes of a model to nifty json
176
- def netzke_json
177
- netzke_hash.to_nifty_json
178
- end
179
-
180
- # Accepts both hash and array of attributes
181
- def netzke_hash(attributes = self.class.netzke_attributes)
182
- res = {}
183
- for a in (attributes.is_a?(Hash) ? attributes.values : attributes)
184
- next if a[:included] == false
185
- res[a[:name].to_sym] = self.value_for_attribute(a, a[:nested_attribute])
186
- end
187
- res
188
- end
189
-
190
- # Fetches the value specified by an (association) attribute
191
- # If +through_association+ is true, get the value of the association by provided method, *not* the associated record's id
192
- # E.g., author__name with through_association set to true may return "Vladimir Nabokov", while with through_association set to false, it'll return author_id for the current record
193
- def value_for_attribute(a, through_association = false)
194
- v = if a[:getter]
195
- a[:getter].call(self)
196
- elsif respond_to?("#{a[:name]}")
197
- send("#{a[:name]}")
198
- elsif is_association_attr?(a)
199
- split = a[:name].to_s.split(/\.|__/)
200
- assoc = self.class.association_reflection(split.first.to_sym)
201
- if through_association
202
- split.inject(self) do |r,m| # TODO: do we really need to descend deeper than 1 level?
203
- if r.respond_to?(m)
204
- r.send(m)
205
- else
206
- logger.debug "Netzke::Basepack: Wrong attribute name: #{a[:name]}" unless r.nil?
207
- nil
208
- end
209
- end
210
- else
211
- self.send("#{assoc[:key].to_s}")
212
- end
213
- end
214
-
215
- # need to serialize Date and Time objects with to_s :db for compatibility with client side
216
- # DATETIME fields in database are given as Time by Sequel
217
- v = v.to_s(:db) if [Date, Time].include?(v.class)
218
- v
219
- end
220
-
221
- # Assigns new value to an (association) attribute
222
- def set_value_for_attribute(a, v)
223
- v = v.to_time_in_current_zone if v.is_a?(Date) # convert Date to Time
224
-
225
- if a[:setter]
226
- a[:setter].call(self, v)
227
- elsif respond_to?("#{a[:name]}=")
228
- unless primary_key.to_s == a[:name] && v.blank? # In contrast to ActiveRecord, Sequel doesn't allow setting nil/NULL primary keys
229
- send("#{a[:name]}=", v)
230
- end
231
- elsif is_association_attr?(a)
232
- split = a[:name].to_s.split(/\.|__/)
233
- if a[:nested_attribute]
234
- # We want:
235
- # set_value_for_attribute({:name => :assoc_1__assoc_2__method, :nested_attribute => true}, 100)
236
- # =>
237
- # self.assoc_1.assoc_2.method = 100
238
- split.inject(self) { |r,m| m == split.last ? (r && r.send("#{m}=", v) && r.save) : r.send(m) }
239
- else
240
- if split.size == 2
241
- # search for association and assign it to self
242
- assoc = self.class.association_reflection(split.first.to_sym)
243
- assoc_method = split.last
244
- if assoc
245
- if assoc[:type] == :one_to_one
246
- assoc_instance = self.send(assoc[:name])
247
- if assoc_instance
248
- assoc_instance.send("#{assoc_method}=", v)
249
- assoc_instance.save # what should we do when this fails?..
250
- else
251
- # what should we do in this case?
252
- end
253
- else
254
- self.send("#{assoc[:key]}=", v)
255
- end
256
- else
257
- logger.debug "Netzke::Basepack: Association #{assoc} is not known for class #{self.class.name}"
258
- end
259
- else
260
- logger.debug "Netzke::Basepack: Wrong attribute name: #{a[:name]}"
261
- end
262
- end
263
- end
264
- end
265
-
266
- protected
267
- # Returns true if passed attribute is an "association attribute"
268
- def is_association_attr?(a)
269
- # maybe the check is too simplistic, but will do for now
270
- !!a[:name].to_s.index("__")
271
- end
272
- end
273
- end
274
- end
@@ -1,10 +0,0 @@
1
- module Netzke
2
- module Sequel
3
- module ComboboxOptions
4
- def netzke_combo_options_for(column, query = "")
5
- ds = query.empty? ? self : filter(column.to_sym.ilike("#{query}%"))
6
- ds.select(column.to_sym).distinct.all.map &column.to_sym
7
- end
8
- end
9
- end
10
- end
@@ -1,40 +0,0 @@
1
- module Netzke
2
- module Sequel
3
- module RelationExtensions
4
- def self.included receiver
5
- receiver.class_eval do
6
- def_dataset_method :extend_with do |*params|
7
- scope = params.shift
8
- case scope.class.name
9
- when "Symbol" # model's scope
10
- self.send(scope, *params)
11
- when "String" # SQL query or SQL query with params (e.g. ["created_at < ?", 1.day.ago])
12
- params.empty? ? self.where(scope) : self.where([scope, *params])
13
- when "Array"
14
- self.extend_with(*scope)
15
- when "Hash" # conditions hash
16
- self.where(scope)
17
- when "ActiveSupport::HashWithIndifferentAccess" # conditions hash
18
- self.where(scope)
19
- when "Proc" # receives a relation, must return a relation
20
- scope.call(self)
21
- else
22
- raise ArgumentError, "Wrong parameter type for ActiveRecord::Relation#extend_with"
23
- end
24
- end
25
-
26
- # Non-destructively extends itself whith a hash of double-underscore'd conditions,
27
- # where the last part "__" is MetaWhere operator (which is required), e.g.:
28
- # {:role__name__like => "%admin"}
29
-
30
- def_dataset_method :extend_with_netzke_conditions do |cond|
31
- cond.each_pair.inject(self) do |r, (k,v)|
32
- assoc, method, *operator = k.to_s.split("__")
33
- operator.empty? ? r.where(assoc.to_sym.send(method) => v) : r.where(assoc.to_sym => {method.to_sym.send(operator.last) => v}).joins(assoc.to_sym)
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end
40
- end
data/locales/zh-cn.yml DELETED
@@ -1,79 +0,0 @@
1
- zh-cn:
2
- netzke:
3
- basepack:
4
- grid_panel:
5
- actions:
6
- add: "增加"
7
- edit: "编辑"
8
- del: "删除"
9
- apply: "保存"
10
- add_in_form: "表格添加"
11
- edit_in_form: "表格编辑"
12
- search: "搜索"
13
-
14
- deleted_n_records: "删除了 %{n} 条记录"
15
- cannot_delete: "本用户无权限删除"
16
- confirmation: "确认"
17
- are_you_sure: "确认改操作吗?"
18
-
19
- record_form_window:
20
- actions:
21
- ok: "确定"
22
- cancel: "取消"
23
-
24
- search_window:
25
- title: "高级搜索"
26
- actions:
27
- search: "搜索"
28
- cancel: "取消"
29
-
30
- form_panel:
31
- actions:
32
- edit: "编辑"
33
- edit_tooltip: "编辑"
34
- cancel: "取消"
35
- cancel_tooltip: "取消编辑"
36
- apply: "保存"
37
- apply_tooltip: "保存修改"
38
-
39
- search_panel:
40
- presets: "呈现"
41
- equals: "等于"
42
- greater_than: "大于"
43
- less_than: "小于"
44
- contains: "包含"
45
- matches: "匹配"
46
- date_equals: "On"
47
- before: "之前"
48
- after: "之后"
49
-
50
- paging_form_panel:
51
- actions:
52
- search: "搜索"
53
- search_tooltip: "高级搜索"
54
-
55
- query_builder:
56
- presets: "预设"
57
- preset_saved: "预设成功保存"
58
- preset_deleted: "预设成功删除"
59
- overwrite_confirm: "确定覆盖已存在的预设 '{0}' 吗?"
60
- overwrite_confirm_title: "覆盖已存在预设"
61
- delete_confirm: "确定删除预设 '{0}' 吗?"
62
- delete_confirm_title: "删除预设确认"
63
- actions:
64
- clear_all: "清除"
65
- clear_all_tooltip: "清除所有条件"
66
- reset: "重置"
67
- reset_tooltip: "重置条件值"
68
- save_preset: "保存预设"
69
- save_preset_tooltip: "保存预设"
70
- delete_preset: "删除预设"
71
- delete_preset_tooltip: "删除预设"
72
- apply: "保存"
73
- apply_tooltip: "应用条件"
74
-
75
-
76
- formats:
77
- date: Y-m-d
78
- datetime: Y-m-d H:i:s
79
- time: H:i:s