active_scaffold 3.2.17 → 3.2.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (246) hide show
  1. data/CHANGELOG +5 -1
  2. metadata +17 -261
  3. data/app/assets/images/active_scaffold/add.png +0 -0
  4. data/app/assets/images/active_scaffold/arrow_down.png +0 -0
  5. data/app/assets/images/active_scaffold/arrow_up.png +0 -0
  6. data/app/assets/images/active_scaffold/close.png +0 -0
  7. data/app/assets/images/active_scaffold/close_touch.png +0 -0
  8. data/app/assets/images/active_scaffold/config.png +0 -0
  9. data/app/assets/images/active_scaffold/cross.png +0 -0
  10. data/app/assets/images/active_scaffold/gears.png +0 -0
  11. data/app/assets/images/active_scaffold/indicator-small.gif +0 -0
  12. data/app/assets/images/active_scaffold/indicator.gif +0 -0
  13. data/app/assets/images/active_scaffold/magnifier.png +0 -0
  14. data/app/assets/javascripts/active_scaffold.js.erb +0 -19
  15. data/app/assets/javascripts/jquery/active_scaffold.js +0 -1113
  16. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +0 -24
  17. data/app/assets/javascripts/jquery/draggable_lists.js +0 -27
  18. data/app/assets/javascripts/jquery/jquery.editinplace.js +0 -743
  19. data/app/assets/javascripts/jquery/tiny_mce_bridge.js +0 -7
  20. data/app/assets/javascripts/prototype/active_scaffold.js +0 -1107
  21. data/app/assets/javascripts/prototype/dhtml_history.js +0 -870
  22. data/app/assets/javascripts/prototype/form_enhancements.js +0 -117
  23. data/app/assets/javascripts/prototype/rico_corner.js +0 -370
  24. data/app/assets/javascripts/prototype/tiny_mce_bridge.js +0 -7
  25. data/app/assets/stylesheets/active_scaffold-ie.css.scss +0 -54
  26. data/app/assets/stylesheets/active_scaffold.css.scss +0 -14
  27. data/app/assets/stylesheets/active_scaffold_colors.css.scss +0 -395
  28. data/app/assets/stylesheets/active_scaffold_extensions.css.erb +0 -2
  29. data/app/assets/stylesheets/active_scaffold_images.css.scss +0 -40
  30. data/app/assets/stylesheets/active_scaffold_layout.css +0 -936
  31. data/app/assets/stylesheets/blue-theme.css +0 -74
  32. data/config/locales/de.yml +0 -125
  33. data/config/locales/en.yml +0 -127
  34. data/config/locales/es.yml +0 -128
  35. data/config/locales/fr.yml +0 -131
  36. data/config/locales/hu.yml +0 -126
  37. data/config/locales/ja.yml +0 -126
  38. data/config/locales/ru.yml +0 -135
  39. data/frontends/default/views/_action_group.html.erb +0 -24
  40. data/frontends/default/views/_add_existing_form.html.erb +0 -30
  41. data/frontends/default/views/_base_form.html.erb +0 -53
  42. data/frontends/default/views/_create_form.html.erb +0 -8
  43. data/frontends/default/views/_create_form_on_list.html.erb +0 -6
  44. data/frontends/default/views/_field_search.html.erb +0 -32
  45. data/frontends/default/views/_form.html.erb +0 -28
  46. data/frontends/default/views/_form_association.html.erb +0 -17
  47. data/frontends/default/views/_form_association_footer.html.erb +0 -47
  48. data/frontends/default/views/_form_attribute.html.erb +0 -23
  49. data/frontends/default/views/_form_hidden_attribute.html.erb +0 -7
  50. data/frontends/default/views/_form_messages.html.erb +0 -5
  51. data/frontends/default/views/_horizontal_subform.html.erb +0 -22
  52. data/frontends/default/views/_horizontal_subform_footer.html.erb +0 -0
  53. data/frontends/default/views/_horizontal_subform_header.html.erb +0 -11
  54. data/frontends/default/views/_horizontal_subform_record.html.erb +0 -43
  55. data/frontends/default/views/_human_conditions.html.erb +0 -1
  56. data/frontends/default/views/_list.html.erb +0 -18
  57. data/frontends/default/views/_list_actions.html.erb +0 -15
  58. data/frontends/default/views/_list_calculations.html.erb +0 -16
  59. data/frontends/default/views/_list_column_headings.html.erb +0 -12
  60. data/frontends/default/views/_list_header.html.erb +0 -10
  61. data/frontends/default/views/_list_inline_adapter.html.erb +0 -21
  62. data/frontends/default/views/_list_messages.html.erb +0 -28
  63. data/frontends/default/views/_list_pagination.html.erb +0 -11
  64. data/frontends/default/views/_list_pagination_links.html.erb +0 -9
  65. data/frontends/default/views/_list_record.html.erb +0 -13
  66. data/frontends/default/views/_list_record_columns.html.erb +0 -8
  67. data/frontends/default/views/_list_with_header.html.erb +0 -36
  68. data/frontends/default/views/_messages.html.erb +0 -10
  69. data/frontends/default/views/_refresh_list.js.erb +0 -1
  70. data/frontends/default/views/_render_field.js.erb +0 -20
  71. data/frontends/default/views/_row.html.erb +0 -1
  72. data/frontends/default/views/_search.html.erb +0 -34
  73. data/frontends/default/views/_search_attribute.html.erb +0 -10
  74. data/frontends/default/views/_show.html.erb +0 -8
  75. data/frontends/default/views/_show_columns.html.erb +0 -15
  76. data/frontends/default/views/_update_actions.html.erb +0 -9
  77. data/frontends/default/views/_update_calculations.js.erb +0 -4
  78. data/frontends/default/views/_update_form.html.erb +0 -6
  79. data/frontends/default/views/_update_messages.js.erb +0 -2
  80. data/frontends/default/views/_vertical_subform.html.erb +0 -12
  81. data/frontends/default/views/_vertical_subform_record.html.erb +0 -43
  82. data/frontends/default/views/action_confirmation.html.erb +0 -13
  83. data/frontends/default/views/add_existing.js.erb +0 -14
  84. data/frontends/default/views/add_existing_form.html.erb +0 -5
  85. data/frontends/default/views/create.html.erb +0 -5
  86. data/frontends/default/views/delete.html.erb +0 -13
  87. data/frontends/default/views/destroy.js.erb +0 -26
  88. data/frontends/default/views/edit_associated.js.erb +0 -12
  89. data/frontends/default/views/field_search.html.erb +0 -5
  90. data/frontends/default/views/form_messages.js.erb +0 -1
  91. data/frontends/default/views/list.html.erb +0 -1
  92. data/frontends/default/views/on_action_update.js.erb +0 -22
  93. data/frontends/default/views/on_create.js.erb +0 -38
  94. data/frontends/default/views/on_mark.js.erb +0 -6
  95. data/frontends/default/views/on_update.js.erb +0 -29
  96. data/frontends/default/views/refresh_list.js.erb +0 -2
  97. data/frontends/default/views/render_field.js.erb +0 -1
  98. data/frontends/default/views/row.js.erb +0 -2
  99. data/frontends/default/views/search.html.erb +0 -5
  100. data/frontends/default/views/show.html.erb +0 -5
  101. data/frontends/default/views/update.html.erb +0 -8
  102. data/frontends/default/views/update_column.js.erb +0 -15
  103. data/frontends/default/views/update_row.js.erb +0 -1
  104. data/lib/active_scaffold.rb +0 -373
  105. data/lib/active_scaffold/actions/common_search.rb +0 -22
  106. data/lib/active_scaffold/actions/core.rb +0 -203
  107. data/lib/active_scaffold/actions/create.rb +0 -139
  108. data/lib/active_scaffold/actions/delete.rb +0 -74
  109. data/lib/active_scaffold/actions/field_search.rb +0 -78
  110. data/lib/active_scaffold/actions/list.rb +0 -208
  111. data/lib/active_scaffold/actions/mark.rb +0 -89
  112. data/lib/active_scaffold/actions/nested.rb +0 -244
  113. data/lib/active_scaffold/actions/search.rb +0 -48
  114. data/lib/active_scaffold/actions/show.rb +0 -61
  115. data/lib/active_scaffold/actions/subform.rb +0 -23
  116. data/lib/active_scaffold/actions/update.rb +0 -156
  117. data/lib/active_scaffold/active_record_permissions.rb +0 -135
  118. data/lib/active_scaffold/attribute_params.rb +0 -200
  119. data/lib/active_scaffold/bridges.rb +0 -61
  120. data/lib/active_scaffold/bridges/ancestry.rb +0 -5
  121. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +0 -39
  122. data/lib/active_scaffold/bridges/bitfields.rb +0 -6
  123. data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +0 -37
  124. data/lib/active_scaffold/bridges/calendar_date_select.rb +0 -24
  125. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +0 -66
  126. data/lib/active_scaffold/bridges/cancan.rb +0 -15
  127. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +0 -127
  128. data/lib/active_scaffold/bridges/carrierwave.rb +0 -12
  129. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +0 -31
  130. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge_helpers.rb +0 -10
  131. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +0 -45
  132. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +0 -17
  133. data/lib/active_scaffold/bridges/country_helper.rb +0 -9
  134. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +0 -358
  135. data/lib/active_scaffold/bridges/date_picker.rb +0 -23
  136. data/lib/active_scaffold/bridges/date_picker/ext.rb +0 -63
  137. data/lib/active_scaffold/bridges/date_picker/helper.rb +0 -180
  138. data/lib/active_scaffold/bridges/dragonfly.rb +0 -9
  139. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +0 -34
  140. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge_helpers.rb +0 -10
  141. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +0 -27
  142. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +0 -16
  143. data/lib/active_scaffold/bridges/file_column.rb +0 -11
  144. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +0 -46
  145. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +0 -57
  146. data/lib/active_scaffold/bridges/file_column/form_ui.rb +0 -34
  147. data/lib/active_scaffold/bridges/file_column/list_ui.rb +0 -26
  148. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +0 -43
  149. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +0 -9
  150. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +0 -15
  151. data/lib/active_scaffold/bridges/paperclip.rb +0 -12
  152. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +0 -27
  153. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +0 -16
  154. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +0 -36
  155. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +0 -24
  156. data/lib/active_scaffold/bridges/record_select.rb +0 -11
  157. data/lib/active_scaffold/bridges/record_select/helpers.rb +0 -92
  158. data/lib/active_scaffold/bridges/semantic_attributes.rb +0 -5
  159. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +0 -20
  160. data/lib/active_scaffold/bridges/shared/date_bridge.rb +0 -209
  161. data/lib/active_scaffold/bridges/tiny_mce.rb +0 -17
  162. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +0 -46
  163. data/lib/active_scaffold/config/base.rb +0 -75
  164. data/lib/active_scaffold/config/core.rb +0 -236
  165. data/lib/active_scaffold/config/create.rb +0 -32
  166. data/lib/active_scaffold/config/delete.rb +0 -32
  167. data/lib/active_scaffold/config/field_search.rb +0 -79
  168. data/lib/active_scaffold/config/form.rb +0 -64
  169. data/lib/active_scaffold/config/list.rb +0 -247
  170. data/lib/active_scaffold/config/mark.rb +0 -30
  171. data/lib/active_scaffold/config/nested.rb +0 -42
  172. data/lib/active_scaffold/config/search.rb +0 -73
  173. data/lib/active_scaffold/config/show.rb +0 -31
  174. data/lib/active_scaffold/config/subform.rb +0 -35
  175. data/lib/active_scaffold/config/update.rb +0 -33
  176. data/lib/active_scaffold/configurable.rb +0 -29
  177. data/lib/active_scaffold/constraints.rb +0 -171
  178. data/lib/active_scaffold/data_structures/action_columns.rb +0 -142
  179. data/lib/active_scaffold/data_structures/action_link.rb +0 -185
  180. data/lib/active_scaffold/data_structures/action_links.rb +0 -191
  181. data/lib/active_scaffold/data_structures/actions.rb +0 -45
  182. data/lib/active_scaffold/data_structures/bridge.rb +0 -22
  183. data/lib/active_scaffold/data_structures/column.rb +0 -401
  184. data/lib/active_scaffold/data_structures/columns.rb +0 -75
  185. data/lib/active_scaffold/data_structures/error_message.rb +0 -24
  186. data/lib/active_scaffold/data_structures/nested_info.rb +0 -171
  187. data/lib/active_scaffold/data_structures/set.rb +0 -61
  188. data/lib/active_scaffold/data_structures/sorting.rb +0 -167
  189. data/lib/active_scaffold/engine.rb +0 -4
  190. data/lib/active_scaffold/extensions/action_controller_rendering.rb +0 -20
  191. data/lib/active_scaffold/extensions/action_controller_rescueing.rb +0 -7
  192. data/lib/active_scaffold/extensions/action_view_rendering.rb +0 -115
  193. data/lib/active_scaffold/extensions/active_record_offset.rb +0 -12
  194. data/lib/active_scaffold/extensions/array.rb +0 -7
  195. data/lib/active_scaffold/extensions/cache_association.rb +0 -16
  196. data/lib/active_scaffold/extensions/localize.rb +0 -10
  197. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +0 -12
  198. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +0 -7
  199. data/lib/active_scaffold/extensions/paginator_extensions.rb +0 -26
  200. data/lib/active_scaffold/extensions/reverse_associations.rb +0 -64
  201. data/lib/active_scaffold/extensions/routing_mapper.rb +0 -48
  202. data/lib/active_scaffold/extensions/to_label.rb +0 -8
  203. data/lib/active_scaffold/extensions/unsaved_associated.rb +0 -61
  204. data/lib/active_scaffold/extensions/unsaved_record.rb +0 -20
  205. data/lib/active_scaffold/extensions/usa_state.rb +0 -46
  206. data/lib/active_scaffold/finder.rb +0 -399
  207. data/lib/active_scaffold/helpers/association_helpers.rb +0 -42
  208. data/lib/active_scaffold/helpers/controller_helpers.rb +0 -94
  209. data/lib/active_scaffold/helpers/form_column_helpers.rb +0 -322
  210. data/lib/active_scaffold/helpers/human_condition_helpers.rb +0 -64
  211. data/lib/active_scaffold/helpers/id_helpers.rb +0 -131
  212. data/lib/active_scaffold/helpers/list_column_helpers.rb +0 -374
  213. data/lib/active_scaffold/helpers/pagination_helpers.rb +0 -62
  214. data/lib/active_scaffold/helpers/search_column_helpers.rb +0 -257
  215. data/lib/active_scaffold/helpers/show_column_helpers.rb +0 -44
  216. data/lib/active_scaffold/helpers/view_helpers.rb +0 -398
  217. data/lib/active_scaffold/marked_model.rb +0 -38
  218. data/lib/active_scaffold/paginator.rb +0 -136
  219. data/lib/active_scaffold/responds_to_parent.rb +0 -70
  220. data/lib/active_scaffold/tableless.rb +0 -83
  221. data/lib/active_scaffold/version.rb +0 -9
  222. data/lib/active_scaffold_env.rb +0 -13
  223. data/lib/generators/active_scaffold/USAGE +0 -29
  224. data/lib/generators/active_scaffold/active_scaffold_generator.rb +0 -21
  225. data/lib/generators/active_scaffold_controller/USAGE +0 -19
  226. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +0 -29
  227. data/lib/generators/active_scaffold_controller/templates/controller.rb +0 -4
  228. data/lib/generators/active_scaffold_controller/templates/helper.rb +0 -2
  229. data/public/blank.html +0 -33
  230. data/shoulda_macros/macros.rb +0 -136
  231. data/vendor/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  232. data/vendor/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  233. data/vendor/assets/images/ui-bg_flat_10_000000_40x100.png +0 -0
  234. data/vendor/assets/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  235. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  236. data/vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  237. data/vendor/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  238. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  239. data/vendor/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  240. data/vendor/assets/images/ui-icons_222222_256x240.png +0 -0
  241. data/vendor/assets/images/ui-icons_228ef1_256x240.png +0 -0
  242. data/vendor/assets/images/ui-icons_ef8c08_256x240.png +0 -0
  243. data/vendor/assets/images/ui-icons_ffd27a_256x240.png +0 -0
  244. data/vendor/assets/images/ui-icons_ffffff_256x240.png +0 -0
  245. data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +0 -1276
  246. data/vendor/assets/stylesheets/jquery-ui.css +0 -568
@@ -1,185 +0,0 @@
1
- module ActiveScaffold::DataStructures
2
- class ActionLink
3
- # provides a quick way to set any property of the object from a hash
4
- def initialize(action, options = {})
5
- # set defaults
6
- self.action = action
7
- self.label = action
8
- self.confirm = false
9
- self.type = :collection
10
- self.inline = true
11
- self.method = :get
12
- self.crud_type = :delete if [:destroy].include?(action.try(:to_sym))
13
- self.crud_type = :create if [:create, :new].include?(action.try(:to_sym))
14
- self.crud_type = :update if [:edit, :update].include?(action.try(:to_sym))
15
- self.crud_type ||= :read
16
- self.parameters = {}
17
- self.html_options = {}
18
- self.column = nil
19
- self.image = nil
20
- self.dynamic_parameters = nil
21
-
22
- # apply quick properties
23
- options.each_pair do |k, v|
24
- setter = "#{k}="
25
- self.send(setter, v) if self.respond_to? setter
26
- end
27
- end
28
-
29
- # the action-path for this link. what page to request? this is required!
30
- attr_accessor :action
31
-
32
- # the controller for this action link. if nil, the current controller should be assumed.
33
- attr_writer :controller
34
-
35
- def controller
36
- @controller = @controller.call if @controller.is_a?(Proc)
37
- @controller
38
- end
39
-
40
- def static_controller?
41
- !(@controller.is_a?(Proc) || (@controller == :polymorph))
42
- end
43
-
44
- # a hash of request parameters
45
- attr_accessor :parameters
46
-
47
- # a block for dynamic_parameters
48
- attr_accessor :dynamic_parameters
49
-
50
- # the RESTful method
51
- attr_accessor :method
52
-
53
- # what string to use to represent this action
54
- attr_writer :label
55
- def label
56
- @label.is_a?(Symbol) ? as_(@label) : @label
57
- end
58
-
59
- # image to use {:name => 'arrow.png', :size => '16x16'}
60
- attr_accessor :image
61
-
62
- # if the action requires confirmation
63
- def confirm=(value)
64
- @dhtml_confirm = nil if value
65
- @confirm = value
66
- end
67
- def confirm(label = '')
68
- @confirm.is_a?(String) ? @confirm : as_(@confirm, :label => label)
69
- end
70
- def confirm?
71
- !!@confirm
72
- end
73
-
74
- # if the action uses a DHTML based (i.e. 2-phase) confirmation
75
- attr_accessor :dhtml_confirm
76
- def dhtml_confirm=(value)
77
- @confirm = nil if value
78
- @dhtml_confirm = value
79
- end
80
- def dhtml_confirm?
81
- !!@dhtml_confirm
82
- end
83
-
84
- # what method to call on the controller to see if this action_link should be visible
85
- # if method return false, link will be disabled
86
- # note that this is only the UI part of the security. to prevent URL hax0rz, you also need security on requests (e.g. don't execute update method unless authorized).
87
- attr_writer :security_method
88
- def security_method
89
- @security_method || "#{self.action}_authorized?"
90
- end
91
-
92
- def security_method_set?
93
- !!@security_method
94
- end
95
-
96
- # enable it to refresh the parent row when the view is closed
97
- attr_accessor :refresh_on_close
98
-
99
- # what method to call on the controller to see if this action_link should be visible
100
- # if method return true, link won't be displayed
101
- attr_accessor :ignore_method
102
-
103
- # the crud type of the (eventual?) action. different than :method, because this crud action may not be imminent.
104
- # this is used to determine record-level authorization (e.g. record.authorized_for?(:crud_type => link.crud_type).
105
- # options are :create, :read, :update, and :delete
106
- attr_accessor :crud_type
107
-
108
- # an "inline" link is inserted into the existing page
109
- # exclusive with popup? and page?
110
- def inline=(val)
111
- @inline = (val == true)
112
- self.popup = self.page = false if @inline
113
- end
114
- def inline?; @inline end
115
-
116
- # a "popup" link displays in a separate (browser?) window. this will eventually take arguments.
117
- # exclusive with inline? and page?
118
- def popup=(val)
119
- @popup = (val == true)
120
- if @popup
121
- self.inline = self.page = false
122
-
123
- # the :method parameter doesn't mix with the :popup parameter
124
- # when/if we start using DHTML popups, we can bring :method back
125
- self.method = nil
126
- end
127
- end
128
- def popup?; @popup end
129
-
130
- # a "page" link displays by reloading the current page
131
- # exclusive with inline? and popup?
132
- def page=(val)
133
- @page = (val == true)
134
- if @page
135
- self.inline = self.popup = false
136
-
137
- # when :method is defined, ActionView adds an onclick to use a form ...
138
- # so it's best to just empty out :method whenever possible.
139
- # we only ever need to know @method = :get for things that default to POST.
140
- # the only things that default to POST are forms and ajax calls.
141
- # when @page = true, we don't use ajax.
142
- self.method = nil if method == :get
143
- end
144
- end
145
- def page?; @page end
146
-
147
- # where the result of this action should insert in the display.
148
- # for :type => :collection, supported values are:
149
- # :top
150
- # :bottom
151
- # :replace (for updating the entire table)
152
- # false (no attempt at positioning)
153
- # for :type => :member, supported values are:
154
- # :before
155
- # :replace
156
- # :after
157
- # false (no attempt at positioning)
158
- attr_writer :position
159
- def position
160
- return @position unless @position.nil? or @position == true
161
- return :replace if self.type == :member
162
- return :top if self.type == :collection
163
- raise "what should the default position be for #{self.type}?"
164
- end
165
-
166
- # what type of link this is. currently supported values are :collection and :member.
167
- attr_accessor :type
168
-
169
- # html options for the link
170
- attr_accessor :html_options
171
-
172
- # nested action_links are referencing a column
173
- attr_accessor :column
174
-
175
- # indicates that this a nested_link
176
- def nested_link?
177
- @column || (parameters && parameters[:named_scope])
178
- end
179
-
180
- # Internal use: generated eid for this action_link
181
- attr_accessor :eid
182
-
183
-
184
- end
185
- end
@@ -1,191 +0,0 @@
1
- module ActiveScaffold::DataStructures
2
- class ActionLinks
3
- include Enumerable
4
-
5
- def initialize
6
- @set = []
7
- @name = :root
8
- end
9
-
10
- # adds an ActionLink, creating one from the arguments if need be
11
- def add(action, options = {})
12
- link = if action.is_a?(ActiveScaffold::DataStructures::ActionLink) || action.is_a?(ActiveScaffold::DataStructures::ActionLinks)
13
- action
14
- else
15
- ActiveScaffold::DataStructures::ActionLink.new(action, options)
16
- end
17
- # NOTE: this duplicate check should be done by defining the comparison operator for an Action data structure
18
- existing = find_duplicate(link)
19
- unless existing
20
- # That s for backwards compatibility if we are in root of action_links
21
- # we have to move actionlink into members or collection subgroup
22
- group = (name == :root ? subgroup(link.type, link.type) : self)
23
- group.add_to_set(link)
24
- link
25
- else
26
- existing
27
- end
28
- end
29
- alias_method :<<, :add
30
-
31
- def add_to_set(link)
32
- @set << link
33
- end
34
-
35
- # adds a link to a specific group
36
- # groups are represented as a string separated by a dot
37
- # eg member.crud
38
- def add_to_group(link, group = nil)
39
- add_to = root
40
- add_to = group.split('.').inject(root){|group, group_name| group.send(group_name)} if group
41
- add_to << link unless link.nil?
42
- end
43
-
44
- # finds an ActionLink by matching the action
45
- def [](val)
46
- links = []
47
- @set.each do |item|
48
- if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
49
- collected = item[val]
50
- links << collected unless collected.nil?
51
- else
52
- links << item if item.action == val.to_s
53
- end
54
- end
55
- links.first
56
- end
57
-
58
- def find_duplicate(link)
59
- links = []
60
- @set.each do |item|
61
- if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
62
- collected = item.find_duplicate(link)
63
- links << collected unless collected.nil?
64
- else
65
- links << item if item.action == link.action and item.static_controller? && item.controller == link.controller and item.parameters == link.parameters
66
- end
67
- end
68
- links.first
69
- end
70
-
71
- def delete(val)
72
- self.each({:include_set => true}) do |link, set|
73
- if link.action == val.to_s
74
- set.delete_if {|item| item.is_a?(ActiveScaffold::DataStructures::ActionLink) && item.action == val.to_s}
75
- end
76
- end
77
- end
78
-
79
- def delete_group(name)
80
- @set.each do |group|
81
- if group.name == name
82
- @set.delete_if {|item| item.is_a?(ActiveScaffold::DataStructures::ActionLinks) && item.name == name}
83
- else
84
- group.delete_group(name)
85
- end if group.is_a?(ActiveScaffold::DataStructures::ActionLinks)
86
- end
87
- end
88
-
89
- # iterates over the links, possibly by type
90
- def each(options = {}, &block)
91
- @set.each {|item|
92
- if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
93
- item.each(options, &block)
94
- else
95
- if options[:include_set]
96
- yield item, @set
97
- else
98
- yield item
99
- end
100
- end
101
- }
102
- end
103
-
104
- def collect_by_type(type = nil)
105
- links = []
106
- subgroup(type).each(type) {|link| links << link}
107
- links
108
- end
109
-
110
- def traverse(controller, options = {}, &block)
111
- traverse_method = options.delete(:reverse).nil? ? :each : :reverse_each
112
- options[:level] ||= -1
113
- options[:level] += 1
114
- first_action = true
115
- @set.send(traverse_method) do |link|
116
- if link.is_a?(ActiveScaffold::DataStructures::ActionLinks)
117
- unless link.empty?
118
- yield(link, nil, {:node => :start_traversing, :first_action => first_action, :level => options[:level]})
119
- link.traverse(controller,options, &block)
120
- yield(link, nil, {:node => :finished_traversing, :first_action => first_action, :level => options[:level]})
121
- first_action = false
122
- end
123
- elsif controller.nil? || !skip_action_link(controller, link, *(Array(options[:for])))
124
- security_method = link.security_method_set? || controller.respond_to?(link.security_method)
125
- authorized = if security_method
126
- controller.send(link.security_method, *(Array(options[:for])))
127
- else
128
- options[:for].nil? ? true : options[:for].authorized_for?(:crud_type => link.crud_type, :action => link.action)
129
- end
130
- next unless authorized || link.type == :member
131
- yield(self, link, {:authorized => authorized, :first_action => first_action, :level => options[:level]})
132
- first_action = false
133
- end
134
- end
135
- options[:level] -= 1
136
- end
137
-
138
- def collect
139
- @set
140
- end
141
-
142
- def empty?
143
- @set.size == 0
144
- end
145
-
146
- def subgroup(name, label = nil)
147
- group = self if name == self.name
148
- group ||= @set.find do |item|
149
- name == item.name if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
150
- end
151
-
152
- if group.nil?
153
- group = ActiveScaffold::DataStructures::ActionLinks.new
154
- group.label = label || name
155
- group.name = name
156
- add_to_set group
157
- end
158
- group
159
- end
160
-
161
- attr_writer :label
162
- def label
163
- as_(@label) if @label
164
- end
165
-
166
- def method_missing(name, *args, &block)
167
- class_eval %{
168
- def #{name}
169
- @#{name} ||= subgroup('#{name}'.to_sym)
170
- yield @#{name} if block_given?
171
- @#{name}
172
- end
173
- }
174
- send(name, &block)
175
- end
176
-
177
- attr_accessor :name
178
-
179
- protected
180
-
181
- def skip_action_link(controller, link, *args)
182
- !link.ignore_method.nil? && controller.respond_to?(link.ignore_method) && controller.send(link.ignore_method, *args)
183
- end
184
-
185
- # called during clone or dup. makes the clone/dup deeper.
186
- def initialize_copy(from)
187
- @set = []
188
- from.instance_variable_get('@set').each { |link| @set << link.clone }
189
- end
190
- end
191
- end
@@ -1,45 +0,0 @@
1
- class ActiveScaffold::DataStructures::Actions
2
- include Enumerable
3
-
4
- def initialize(*args)
5
- @set = []
6
- self.add *args
7
- end
8
-
9
- def exclude(*args)
10
- args.collect! { |a| a.to_sym } # symbolize the args
11
- @set.reject! { |m| args.include? m } # reject all actions specified
12
- end
13
-
14
- def add(*args)
15
- args.each { |arg| @set << arg.to_sym unless @set.include? arg.to_sym }
16
- end
17
- alias_method :<<, :add
18
-
19
- def each
20
- @set.each {|item| yield item}
21
- end
22
-
23
- def include?(val)
24
- super val.to_sym
25
- end
26
-
27
- # swaps one element in the list with the other.
28
- # accepts arguments in any order. it just figures out which one is in the list and which one is not.
29
- def swap(one, two)
30
- if include? one
31
- exclude one
32
- add two
33
- else
34
- exclude two
35
- add one
36
- end
37
- end
38
-
39
- protected
40
-
41
- # called during clone or dup. makes the clone/dup deeper.
42
- def initialize_copy(from)
43
- @set = from.instance_variable_get('@set').clone
44
- end
45
- end
@@ -1,22 +0,0 @@
1
- module ActiveScaffold::DataStructures
2
- class Bridge
3
- def self.install
4
- raise(RunTimeError, "install not defined for bridge #{name}")
5
- end
6
-
7
- # by convention and default, use the bridge name as the required constant for installation
8
- def self.install?
9
- Object.const_defined? name.demodulize
10
- end
11
-
12
- def self.run
13
- install if install?
14
- end
15
-
16
- def self.stylesheets
17
- end
18
-
19
- def self.javascripts
20
- end
21
- end
22
- end
@@ -1,401 +0,0 @@
1
- module ActiveScaffold::DataStructures
2
- class Column
3
- include ActiveScaffold::Configurable
4
-
5
- attr_reader :active_record_class
6
-
7
- # this is the name of the getter on the ActiveRecord model. it is the only absolutely required attribute ... all others will be inferred from this name.
8
- attr_accessor :name
9
-
10
- # Whether to enable inplace editing for this column. Currently works for text columns, in the List.
11
- attr_reader :inplace_edit
12
- def inplace_edit=(value)
13
- self.clear_link if value
14
- @inplace_edit = value
15
- end
16
-
17
- # Whether this column set is collapsed by default in contexts where collapsing is supported
18
- attr_accessor :collapsed
19
-
20
- # Whether to enable add_existing for this column
21
- attr_accessor :allow_add_existing
22
-
23
- # Any extra parameters this particular column uses. This is for create/update purposes.
24
- def params
25
- # lazy initialize
26
- @params ||= Set.new
27
- end
28
-
29
- # the display-name of the column. this will be used, for instance, as the column title in the table and as the field name in the form.
30
- # if left alone it will utilize human_attribute_name which includes localization
31
- attr_writer :label
32
- def label
33
- as_(@label) || active_record_class.human_attribute_name(name.to_s)
34
- end
35
-
36
- # a textual description of the column and its contents. this will be displayed with any associated form input widget, so you may want to consider adding a content example.
37
- attr_writer :description
38
- def description
39
- if @description
40
- @description
41
- else
42
- I18n.t name, :scope => [:activerecord, :description, active_record_class.to_s.underscore.to_sym], :default => ''
43
- end
44
- end
45
-
46
- # this will be /joined/ to the :name for the td's class attribute. useful if you want to style columns on different ActiveScaffolds the same way, but the columns have different names.
47
- attr_accessor :css_class
48
-
49
- # whether the field is required or not. used on the form for visually indicating the fact to the user.
50
- # TODO: move into predicate
51
- attr_writer :required
52
- def required?
53
- @required
54
- end
55
-
56
- attr_reader :update_columns
57
-
58
- # update dependent columns after value change in form
59
- # update_columns = :name
60
- # update_columns = [:name, :age]
61
- def update_columns=(column_names)
62
- @update_columns = Array(column_names)
63
- end
64
-
65
- # send all the form instead of only new value when this column change
66
- cattr_accessor :send_form_on_update_column
67
- attr_accessor :send_form_on_update_column
68
-
69
- # column to be updated in a form when this column changes
70
- def update_column=(column_name)
71
- ActiveSupport::Deprecation.warn "Use update_columns= instead of update_column="
72
- self.update_columns = column_name
73
- end
74
-
75
- # send all the form instead of only new value when this column change
76
- cattr_accessor :send_form_on_update_column
77
- attr_accessor :send_form_on_update_column
78
-
79
- # sorting on a column can be configured four ways:
80
- # sort = true default, uses intelligent sorting sql default
81
- # sort = false sometimes sorting doesn't make sense
82
- # sort = {:sql => ""} define your own sql for sorting. this should be result in a sortable value in SQL. ActiveScaffold will handle the ascending/descending.
83
- # sort = {:method => ""} define ruby-side code for sorting. this is SLOW with large recordsets!
84
- def sort=(value)
85
- if value.is_a? Hash
86
- value.assert_valid_keys(:sql, :method)
87
- @sort = value
88
- else
89
- @sort = value ? true : false # force true or false
90
- end
91
- end
92
-
93
- def sort
94
- self.initialize_sort if @sort === true
95
- @sort
96
- end
97
-
98
- def sortable?
99
- sort != false && !sort.nil?
100
- end
101
-
102
- # a configuration helper for the self.sort property. simply provides a method syntax instead of setter syntax.
103
- def sort_by(options)
104
- self.sort = options
105
- end
106
-
107
- # supported options:
108
- # * for association columns
109
- # * :select - displays a simple <select> or a collection of checkboxes to (dis)associate records
110
- attr_writer :form_ui
111
- def form_ui
112
- @form_ui
113
- end
114
-
115
- attr_writer :list_ui
116
- def list_ui
117
- @list_ui || @form_ui
118
- end
119
-
120
- attr_writer :search_ui
121
- def search_ui
122
- @search_ui || @form_ui || (@association && !polymorphic_association? ? :select : nil)
123
- end
124
-
125
- # a place to store dev's column specific options
126
- attr_accessor :options
127
- def options
128
- @options ||= {}
129
- end
130
-
131
- def link
132
- @link = @link.call(self) if @link.is_a? Proc
133
- @link
134
- end
135
-
136
- # associate an action_link with this column
137
- def set_link(action, options = {})
138
- if action.is_a?(ActiveScaffold::DataStructures::ActionLink) || (action.is_a? Proc)
139
- @link = action
140
- else
141
- options[:label] ||= self.label
142
- options[:position] ||= :after unless options.has_key?(:position)
143
- options[:type] ||= :member
144
- @link = ActiveScaffold::DataStructures::ActionLink.new(action, options)
145
- end
146
- end
147
-
148
- # set an action_link to nested list or inline form in this column
149
- def autolink?
150
- @autolink
151
- end
152
-
153
- # this should not only delete any existing link but also prevent column links from being automatically added by later routines
154
- def clear_link
155
- @link = nil
156
- @autolink = false
157
- end
158
-
159
- # define a calculation for the column. anything that ActiveRecord::Calculations::ClassMethods#calculate accepts will do.
160
- attr_accessor :calculate
161
-
162
- # get whether to run a calculation on this column
163
- def calculation?
164
- !(@calculate == false or @calculate.nil?)
165
- end
166
-
167
- # a collection of associations to pre-load when finding the records on a page
168
- attr_reader :includes
169
- def includes=(value)
170
- @includes = case value
171
- when Array then value
172
- else [value] # automatically convert to an array
173
- end
174
- end
175
-
176
- # a collection of columns to load when eager loading is disabled, if it's nil all columns will be loaded
177
- attr_accessor :select_columns
178
-
179
- # describes how to search on a column
180
- # search = true default, uses intelligent search sql
181
- # search = "CONCAT(a, b)" define your own sql for searching. this should be the "left-side" of a WHERE condition. the operator and value will be supplied by ActiveScaffold.
182
- # search = [:a, :b] searches in both fields
183
- def search_sql=(value)
184
- @search_sql = (value == true || value.is_a?(Proc)) ? value : Array(value)
185
- end
186
- def search_sql
187
- self.initialize_search_sql if @search_sql === true
188
- @search_sql
189
- end
190
- def searchable?
191
- search_sql != false && search_sql != nil
192
- end
193
-
194
- # to modify the default order of columns
195
- attr_accessor :weight
196
-
197
- # to set how many associated records a column with plural association must show in list
198
- cattr_accessor :associated_limit
199
- @@associated_limit = 3
200
- attr_accessor :associated_limit
201
-
202
- # whether the number of associated records must be shown or not
203
- cattr_accessor :associated_number
204
- @@associated_number = true
205
- attr_writer :associated_number
206
- def associated_number?
207
- @associated_number
208
- end
209
-
210
- # whether a blank row must be shown in the subform
211
- cattr_accessor :show_blank_record
212
- @@show_blank_record = true
213
- attr_writer :show_blank_record
214
- def show_blank_record?(associated)
215
- if @show_blank_record
216
- return false unless self.association.klass.authorized_for?(:crud_type => :create)
217
- self.plural_association? or (self.singular_association? and associated.blank?)
218
- end
219
- end
220
-
221
- # methods for automatic links in singular association columns
222
- cattr_accessor :actions_for_association_links
223
- @@actions_for_association_links = [:new, :edit, :show]
224
- attr_accessor :actions_for_association_links
225
-
226
- cattr_accessor :association_form_ui
227
- @@association_form_ui = nil
228
-
229
- # ----------------------------------------------------------------- #
230
- # the below functionality is intended for internal consumption only #
231
- # ----------------------------------------------------------------- #
232
-
233
- # the ConnectionAdapter::*Column object from the ActiveRecord class
234
- attr_reader :column
235
-
236
- # the association from the ActiveRecord class
237
- attr_reader :association
238
- def singular_association?
239
- self.association and [:has_one, :belongs_to].include? self.association.macro
240
- end
241
- def plural_association?
242
- self.association and [:has_many, :has_and_belongs_to_many].include? self.association.macro
243
- end
244
- def through_association?
245
- self.association and self.association.options[:through]
246
- end
247
- def polymorphic_association?
248
- self.association and self.association.options.has_key? :polymorphic and self.association.options[:polymorphic]
249
- end
250
- def readonly_association?
251
- if self.association
252
- if self.association.options.has_key? :readonly
253
- self.association.options[:readonly]
254
- else
255
- self.through_association?
256
- end
257
- end
258
- end
259
-
260
- # an interpreted property. the column is virtual if it isn't from the active record model or any associated models
261
- def virtual?
262
- column.nil? && association.nil?
263
- end
264
-
265
- attr_writer :number
266
- def number?
267
- @number
268
- end
269
-
270
- # this is so that array.delete and array.include?, etc., will work by column name
271
- def ==(other) #:nodoc:
272
- # another column
273
- if other.respond_to? :name and other.class == self.class
274
- self.name == other.name.to_sym
275
- # a string or symbol
276
- elsif other.respond_to? :to_sym
277
- self.name == other.to_sym rescue false # catch "interning empty string"
278
- # unknown
279
- else
280
- self.eql? other
281
- end
282
- end
283
-
284
- # instantiation is handled internally through the DataStructures::Columns object
285
- def initialize(name, active_record_class) #:nodoc:
286
- self.name = name.to_sym
287
- @tableless = active_record_class < ActiveScaffold::Tableless
288
- @column = active_record_class.columns_hash[self.name.to_s]
289
- @association = active_record_class.reflect_on_association(self.name)
290
- @autolink = !@association.nil?
291
- @active_record_class = active_record_class
292
- @table = active_record_class.table_name
293
- @associated_limit = self.class.associated_limit
294
- @associated_number = self.class.associated_number
295
- @show_blank_record = self.class.show_blank_record
296
- @send_form_on_update_column = self.class.send_form_on_update_column
297
- @actions_for_association_links = self.class.actions_for_association_links.clone if @association
298
-
299
- self.number = @column.try(:number?)
300
- @options = {:format => :i18n_number} if self.number?
301
- @form_ui = :checkbox if @column and @column.type == :boolean
302
- @form_ui = :textarea if @column and @column.type == :text
303
- @allow_add_existing = true
304
- @form_ui = self.class.association_form_ui if @association && self.class.association_form_ui
305
-
306
- # default all the configurable variables
307
- self.css_class = ''
308
- self.required = active_record_class.validators_on(self.name).any? do |val|
309
- ActiveModel::Validations::PresenceValidator === val or (
310
- ActiveModel::Validations::InclusionValidator === val and not val.options[:allow_nil] and not val.options[:allow_blank]
311
- )
312
- end
313
- self.sort = true
314
- self.search_sql = true
315
-
316
- @weight = estimate_weight
317
-
318
- self.includes = (association and not polymorphic_association?) ? [association.name] : []
319
- end
320
-
321
- # just the field (not table.field)
322
- def field_name
323
- return nil if virtual?
324
- @field_name ||= column ? @active_record_class.connection.quote_column_name(column.name) : association.foreign_key
325
- end
326
-
327
- def <=>(other_column)
328
- order_weight = self.weight <=> other_column.weight
329
- order_weight != 0 ? order_weight : self.name.to_s <=> other_column.name.to_s
330
- end
331
-
332
- def number_to_native(value)
333
- return value if value.blank? || !value.is_a?(String)
334
- native = '.' # native ruby separator
335
- format = {:separator => '', :delimiter => ''}.merge! I18n.t('number.format', :default => {})
336
- specific = case self.options[:format]
337
- when :currency
338
- I18n.t('number.currency.format', :default => nil)
339
- when :size
340
- I18n.t('number.human.format', :default => nil)
341
- when :percentage
342
- I18n.t('number.percentage.format', :default => nil)
343
- end
344
- format.merge! specific unless specific.nil?
345
- unless format[:separator].blank? || !value.include?(format[:separator]) && value.include?(native) && (format[:delimiter] != native || value !~ /\.\d{3}$/)
346
- value.gsub(/[^0-9\-#{format[:separator]}]/, '').gsub(format[:separator], native)
347
- else
348
- value
349
- end
350
- end
351
-
352
- protected
353
-
354
- def initialize_sort
355
- if self.virtual?
356
- # we don't automatically enable method sorting for virtual columns because it's slow, and we expect fewer complaints this way.
357
- self.sort = false
358
- else
359
- if column && !@tableless
360
- self.sort = {:sql => self.field}
361
- else
362
- self.sort = false
363
- end
364
- end
365
- end
366
-
367
- def initialize_search_sql
368
- self.search_sql = unless self.virtual?
369
- if association.nil?
370
- self.field.to_s unless @tableless
371
- elsif !self.polymorphic_association?
372
- [association.klass.quoted_table_name, association.klass.quoted_primary_key].join('.') unless association.klass < ActiveScaffold::Tableless
373
- end
374
- end
375
- end
376
-
377
- # the table name from the ActiveRecord class
378
- attr_reader :table
379
-
380
- # the table.field name for this column, if applicable
381
- def field
382
- @field ||= [@active_record_class.quoted_table_name, field_name].join('.')
383
- end
384
-
385
- def estimate_weight
386
- if singular_association?
387
- 400
388
- elsif plural_association?
389
- 500
390
- elsif [:created_at, :updated_at].include?(self.name)
391
- 600
392
- elsif [:name, :label, :title].include?(self.name)
393
- 100
394
- elsif required?
395
- 200
396
- else
397
- 300
398
- end
399
- end
400
- end
401
- end