netzke-basepack 0.5.14 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. data/.gitignore +3 -2
  2. data/CHANGELOG.rdoc +15 -0
  3. data/README.rdoc +45 -50
  4. data/Rakefile +8 -8
  5. data/TODO.rdoc +1 -6
  6. data/app/components/netzke/basepack/accordion_panel.rb +37 -0
  7. data/app/components/netzke/basepack/basic_app.rb +267 -0
  8. data/{lib/netzke → app/components/netzke/basepack}/basic_app/statusbar_ext.js +0 -0
  9. data/app/components/netzke/basepack/border_layout_panel.rb +39 -0
  10. data/app/components/netzke/basepack/form_panel.rb +102 -0
  11. data/app/components/netzke/basepack/form_panel/fields.rb +206 -0
  12. data/{lib/netzke → app/components/netzke/basepack}/form_panel/javascripts/netzkefileupload.js +0 -0
  13. data/app/components/netzke/basepack/form_panel/javascripts/pre.js +76 -0
  14. data/{lib/netzke → app/components/netzke/basepack}/form_panel/javascripts/xcheckbox.js +0 -0
  15. data/app/components/netzke/basepack/form_panel/services.rb +99 -0
  16. data/app/components/netzke/basepack/grid_panel.rb +374 -0
  17. data/app/components/netzke/basepack/grid_panel/columns.rb +233 -0
  18. data/app/components/netzke/basepack/grid_panel/javascript.rb +69 -0
  19. data/app/components/netzke/basepack/grid_panel/javascripts/advanced_search.js +96 -0
  20. data/{lib/netzke → app/components/netzke/basepack}/grid_panel/javascripts/edit_in_form.js +5 -4
  21. data/{lib/netzke/grid_panel/javascripts/grid_panel_pre.js → app/components/netzke/basepack/grid_panel/javascripts/pre.js} +17 -37
  22. data/{lib/netzke → app/components/netzke/basepack}/grid_panel/javascripts/rows-dd.js +0 -0
  23. data/app/components/netzke/basepack/grid_panel/multi_edit_form.rb +16 -0
  24. data/app/components/netzke/basepack/grid_panel/record_form_window.rb +36 -0
  25. data/app/components/netzke/basepack/grid_panel/search_window.rb +56 -0
  26. data/app/components/netzke/basepack/grid_panel/services.rb +356 -0
  27. data/app/components/netzke/basepack/panel.rb +11 -0
  28. data/app/components/netzke/basepack/search_panel.rb +59 -0
  29. data/app/components/netzke/basepack/tab_panel.rb +32 -0
  30. data/app/components/netzke/basepack/window.rb +73 -0
  31. data/app/components/netzke/basepack/wrapper.rb +28 -0
  32. data/{lib/app → app}/models/netzke_field_list.rb +1 -1
  33. data/{lib/app → app}/models/netzke_model_attr_list.rb +0 -0
  34. data/{lib/app → app}/models/netzke_persistent_array_auto_model.rb +0 -0
  35. data/config/database.yml +35 -0
  36. data/features/accordion_panel.feature +15 -0
  37. data/features/basic_app.feature +12 -0
  38. data/features/form_panel.feature +40 -0
  39. data/features/grid_panel.feature +62 -0
  40. data/features/search_in_grid.feature +35 -0
  41. data/features/simple_panel.feature +15 -0
  42. data/features/step_definitions/accordion_steps.rb +9 -0
  43. data/features/step_definitions/generic_steps.rb +15 -0
  44. data/features/step_definitions/grid_panel_steps.rb +26 -0
  45. data/features/step_definitions/pickle_steps.rb +100 -0
  46. data/features/step_definitions/web_steps.rb +219 -0
  47. data/features/support/env.rb +66 -0
  48. data/features/support/paths.rb +59 -0
  49. data/features/support/pickle.rb +25 -0
  50. data/features/tab_panel.feature +15 -0
  51. data/features/window.feature +11 -0
  52. data/from_05_to_06.rdoc +2 -0
  53. data/javascripts/basepack.js +54 -2
  54. data/lib/netzke-basepack.rb +38 -25
  55. data/lib/netzke/active_record.rb +12 -4
  56. data/lib/netzke/active_record/attributes.rb +60 -5
  57. data/lib/netzke/active_record/combobox_options.rb +3 -2
  58. data/lib/netzke/active_record/relation_extensions.rb +35 -0
  59. data/lib/netzke/basepack.rb +27 -0
  60. data/lib/netzke/basepack/version.rb +11 -0
  61. data/lib/netzke/basepack/wrap_lazy_loaded.rb +26 -0
  62. data/lib/netzke/data_accessor.rb +60 -32
  63. data/lib/netzke/fields_configurator.rb +5 -9
  64. data/lib/netzke/masquerade_selector.rb +1 -1
  65. data/locale/en.yml +16 -0
  66. data/netzke-basepack.gemspec +298 -0
  67. data/spec/active_record/attributes_spec.rb +14 -0
  68. data/spec/active_record/relation_extensions_spec.rb +44 -0
  69. data/spec/components/form_panel_spec.rb +70 -0
  70. data/spec/components/grid_panel_spec.rb +10 -0
  71. data/spec/factories.rb +9 -0
  72. data/spec/spec_helper.rb +35 -0
  73. data/test/rails_app/.gitignore +4 -0
  74. data/test/rails_app/Gemfile +32 -0
  75. data/test/rails_app/Gemfile.lock +171 -0
  76. data/test/rails_app/README +256 -0
  77. data/test/rails_app/Rakefile +7 -0
  78. data/test/rails_app/app/components/generic_user_form.rb +12 -0
  79. data/test/rails_app/app/components/simple_accordion.rb +11 -0
  80. data/test/rails_app/app/components/simple_basic_app.rb +32 -0
  81. data/test/rails_app/app/components/simple_panel.rb +17 -0
  82. data/test/rails_app/app/components/simple_tab_panel.rb +11 -0
  83. data/test/rails_app/app/components/simple_wrapper.rb +7 -0
  84. data/test/rails_app/app/components/some_border_layout.rb +24 -0
  85. data/test/rails_app/app/components/some_search_panel.rb +34 -0
  86. data/test/rails_app/app/components/some_tab_panel.rb +15 -0
  87. data/test/rails_app/app/components/user_form.rb +21 -0
  88. data/test/rails_app/app/components/user_form_with_default_fields.rb +8 -0
  89. data/test/rails_app/app/components/user_grid.rb +4 -0
  90. data/test/rails_app/app/components/window_component_loader.rb +17 -0
  91. data/test/{app_root/app/controllers/application.rb → rails_app/app/controllers/application_controller.rb} +1 -0
  92. data/test/rails_app/app/controllers/components_controller.rb +6 -0
  93. data/test/rails_app/app/controllers/welcome_controller.rb +5 -0
  94. data/test/rails_app/app/helpers/application_helper.rb +2 -0
  95. data/test/{app_root → rails_app}/app/models/role.rb +0 -0
  96. data/test/rails_app/app/models/user.rb +6 -0
  97. data/test/rails_app/app/presenters/forms/generic_user.rb +6 -0
  98. data/test/rails_app/app/views/layouts/application.html.erb +13 -0
  99. data/test/rails_app/config.ru +4 -0
  100. data/test/rails_app/config/application.rb +45 -0
  101. data/test/rails_app/config/boot.rb +13 -0
  102. data/test/rails_app/config/database.yml +35 -0
  103. data/test/rails_app/config/environment.rb +6 -0
  104. data/test/rails_app/config/environments/development.rb +22 -0
  105. data/test/rails_app/config/environments/production.rb +49 -0
  106. data/test/rails_app/config/environments/test.rb +35 -0
  107. data/test/rails_app/config/initializers/backtrace_silencers.rb +8 -0
  108. data/test/rails_app/config/initializers/inflections.rb +10 -0
  109. data/test/rails_app/config/initializers/mime_types.rb +5 -0
  110. data/test/rails_app/config/initializers/netzke.rb +7 -0
  111. data/test/rails_app/config/initializers/secret_token.rb +7 -0
  112. data/test/rails_app/config/initializers/session_store.rb +8 -0
  113. data/test/rails_app/config/locales/es.yml +12 -0
  114. data/test/rails_app/config/routes.rb +65 -0
  115. data/test/rails_app/db/development_structure.sql +39 -0
  116. data/test/{app_root/db/migrate/20081222035855_create_netzke_preferences.rb → rails_app/db/migrate/20100905214933_create_netzke_preferences.rb} +2 -4
  117. data/test/{app_root/db/migrate/20090423222114_create_users.rb → rails_app/db/migrate/20100914104207_create_users.rb} +4 -1
  118. data/test/{app_root/db/migrate/20090423214303_create_roles.rb → rails_app/db/migrate/20100914104236_create_roles.rb} +2 -0
  119. data/test/rails_app/db/schema.rb +38 -0
  120. data/test/rails_app/db/seeds.rb +20 -0
  121. data/test/rails_app/features/support/paths.rb +47 -0
  122. data/test/{app_root/config/environments/in_memory.rb → rails_app/lib/tasks/.gitkeep} +0 -0
  123. data/test/rails_app/public/404.html +26 -0
  124. data/test/rails_app/public/422.html +26 -0
  125. data/test/rails_app/public/500.html +26 -0
  126. data/test/{app_root/config/environments/mysql.rb → rails_app/public/favicon.ico} +0 -0
  127. data/test/rails_app/public/images/header-deco.gif +0 -0
  128. data/test/rails_app/public/images/rails.png +0 -0
  129. data/test/rails_app/public/javascripts/application.js +2 -0
  130. data/test/rails_app/public/javascripts/controls.js +965 -0
  131. data/test/rails_app/public/javascripts/dragdrop.js +974 -0
  132. data/test/rails_app/public/javascripts/effects.js +1123 -0
  133. data/test/rails_app/public/javascripts/prototype.js +6001 -0
  134. data/test/rails_app/public/javascripts/rails.js +175 -0
  135. data/test/rails_app/public/robots.txt +5 -0
  136. data/test/{app_root/config/environments/postgresql.rb → rails_app/public/stylesheets/.gitkeep} +0 -0
  137. data/test/rails_app/script/rails +6 -0
  138. data/test/rails_app/spec/models/role_spec.rb +5 -0
  139. data/test/rails_app/spec/models/user_spec.rb +5 -0
  140. data/test/rails_app/test/performance/browsing_test.rb +9 -0
  141. data/test/rails_app/test/test_helper.rb +13 -0
  142. data/test/{app_root/config/environments/sqlite.rb → rails_app/vendor/plugins/.gitkeep} +0 -0
  143. data/test/unit/accordion_panel_test.rb +3 -3
  144. data/test/unit/active_record_basepack_test.rb +4 -4
  145. data/test/unit/tab_panel_test.rb +4 -4
  146. metadata +199 -119
  147. data/lib/netzke/accordion_panel.rb +0 -115
  148. data/lib/netzke/active_record/data_accessor.rb +0 -25
  149. data/lib/netzke/attributes_configurator.rb +0 -195
  150. data/lib/netzke/basic_app.rb +0 -368
  151. data/lib/netzke/border_layout_panel.rb +0 -130
  152. data/lib/netzke/configuration_panel.rb +0 -24
  153. data/lib/netzke/form_panel.rb +0 -138
  154. data/lib/netzke/form_panel/form_panel_api.rb +0 -81
  155. data/lib/netzke/form_panel/form_panel_fields.rb +0 -149
  156. data/lib/netzke/form_panel/form_panel_js.rb +0 -163
  157. data/lib/netzke/grid_panel.rb +0 -367
  158. data/lib/netzke/grid_panel/grid_panel_api.rb +0 -364
  159. data/lib/netzke/grid_panel/grid_panel_columns.rb +0 -232
  160. data/lib/netzke/grid_panel/grid_panel_js.rb +0 -73
  161. data/lib/netzke/grid_panel/javascripts/advanced_search.js +0 -65
  162. data/lib/netzke/grid_panel/multi_edit_form.rb +0 -14
  163. data/lib/netzke/grid_panel/record_form_window.rb +0 -50
  164. data/lib/netzke/panel.rb +0 -11
  165. data/lib/netzke/plugins/configuration_tool.rb +0 -121
  166. data/lib/netzke/property_editor.rb +0 -111
  167. data/lib/netzke/property_editor/helper_model.rb +0 -122
  168. data/lib/netzke/search_panel.rb +0 -199
  169. data/lib/netzke/tab_panel.rb +0 -174
  170. data/lib/netzke/table_editor.rb +0 -118
  171. data/lib/netzke/tree_panel.rb +0 -25
  172. data/lib/netzke/window.rb +0 -82
  173. data/lib/netzke/wrapper.rb +0 -42
  174. data/test/app_root/app/models/book.rb +0 -9
  175. data/test/app_root/app/models/category.rb +0 -2
  176. data/test/app_root/app/models/city.rb +0 -3
  177. data/test/app_root/app/models/continent.rb +0 -2
  178. data/test/app_root/app/models/country.rb +0 -3
  179. data/test/app_root/app/models/genre.rb +0 -3
  180. data/test/app_root/app/models/user.rb +0 -3
  181. data/test/app_root/config/boot.rb +0 -114
  182. data/test/app_root/config/database.yml +0 -21
  183. data/test/app_root/config/environment.rb +0 -14
  184. data/test/app_root/config/environments/sqlite3.rb +0 -0
  185. data/test/app_root/config/routes.rb +0 -4
  186. data/test/app_root/db/migrate/20081222033343_create_books.rb +0 -15
  187. data/test/app_root/db/migrate/20081222033440_create_genres.rb +0 -15
  188. data/test/app_root/db/migrate/20081223024935_create_categories.rb +0 -13
  189. data/test/app_root/db/migrate/20081223025635_create_countries.rb +0 -14
  190. data/test/app_root/db/migrate/20081223025653_create_continents.rb +0 -13
  191. data/test/app_root/db/migrate/20081223025732_create_cities.rb +0 -15
  192. data/test/app_root/db/migrate/20090102223630_create_netzke_field_lists.rb +0 -18
  193. data/test/app_root/script/console +0 -7
  194. data/test/app_root/vendor/plugins/acts_as_list/README +0 -23
  195. data/test/app_root/vendor/plugins/acts_as_list/init.rb +0 -3
  196. data/test/app_root/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +0 -256
@@ -1,14 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'boot')
2
-
3
- Rails::Initializer.run do |config|
4
- config.cache_classes = false
5
- config.whiny_nils = true
6
- config.action_controller.session = { :key => "_myapp_session", :secret => "some very long and secret phrase" }
7
- config.plugin_locators.unshift(
8
- Class.new(Rails::Plugin::Locator) do
9
- def plugins
10
- [Rails::Plugin.new(File.expand_path('.'))]
11
- end
12
- end
13
- ) unless defined?(PluginTestHelper::PluginLocator)
14
- end
File without changes
@@ -1,4 +0,0 @@
1
- ActionController::Routing::Routes.draw do |map|
2
- map.connect ':controller/:action/:id'
3
- map.connect ':controller/:action/:id.:format'
4
- end
@@ -1,15 +0,0 @@
1
- class CreateBooks < ActiveRecord::Migration
2
- def self.up
3
- create_table :books do |t|
4
- t.string :title
5
- t.integer :amount
6
- t.integer :genre_id
7
-
8
- t.timestamps
9
- end
10
- end
11
-
12
- def self.down
13
- drop_table :books
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- class CreateGenres < ActiveRecord::Migration
2
- def self.up
3
- create_table :genres do |t|
4
- t.string :name
5
- t.integer :category_id
6
- t.boolean :popular
7
-
8
- t.timestamps
9
- end
10
- end
11
-
12
- def self.down
13
- drop_table :genres
14
- end
15
- end
@@ -1,13 +0,0 @@
1
- class CreateCategories < ActiveRecord::Migration
2
- def self.up
3
- create_table :categories do |t|
4
- t.string :name
5
-
6
- t.timestamps
7
- end
8
- end
9
-
10
- def self.down
11
- drop_table :categories
12
- end
13
- end
@@ -1,14 +0,0 @@
1
- class CreateCountries < ActiveRecord::Migration
2
- def self.up
3
- create_table :countries do |t|
4
- t.string :name
5
- t.integer :continent_id
6
-
7
- t.timestamps
8
- end
9
- end
10
-
11
- def self.down
12
- drop_table :countries
13
- end
14
- end
@@ -1,13 +0,0 @@
1
- class CreateContinents < ActiveRecord::Migration
2
- def self.up
3
- create_table :continents do |t|
4
- t.string :name
5
-
6
- t.timestamps
7
- end
8
- end
9
-
10
- def self.down
11
- drop_table :continents
12
- end
13
- end
@@ -1,15 +0,0 @@
1
- class CreateCities < ActiveRecord::Migration
2
- def self.up
3
- create_table :cities do |t|
4
- t.string :name
5
- t.integer :population
6
- t.integer :country_id
7
-
8
- t.timestamps
9
- end
10
- end
11
-
12
- def self.down
13
- drop_table :cities
14
- end
15
- end
@@ -1,18 +0,0 @@
1
- class CreateNetzkeFieldLists < ActiveRecord::Migration
2
- def self.up
3
- create_table :netzke_field_lists do |t|
4
- t.string :name
5
- t.text :value
6
- t.string :type
7
- t.string :model_name
8
- t.integer :user_id
9
- t.integer :role_id
10
-
11
- t.timestamps
12
- end
13
- end
14
-
15
- def self.down
16
- drop_table :netzke_field_lists
17
- end
18
- end
@@ -1,7 +0,0 @@
1
- irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
2
- libs = " -r irb/completion"
3
- libs << " -r test/test_helper"
4
- libs << " -r test/console_with_fixtures"
5
- libs << " -r console_app"
6
- libs << " -r console_with_helpers"
7
- exec "#{irb} #{libs} --simple-prompt"
@@ -1,23 +0,0 @@
1
- ActsAsList
2
- ==========
3
-
4
- This acts_as extension provides the capabilities for sorting and reordering a number of objects in a list. The class that has this specified needs to have a +position+ column defined as an integer on the mapped database table.
5
-
6
-
7
- Example
8
- =======
9
-
10
- class TodoList < ActiveRecord::Base
11
- has_many :todo_items, :order => "position"
12
- end
13
-
14
- class TodoItem < ActiveRecord::Base
15
- belongs_to :todo_list
16
- acts_as_list :scope => :todo_list
17
- end
18
-
19
- todo_list.first.move_to_bottom
20
- todo_list.last.move_higher
21
-
22
-
23
- Copyright (c) 2007 David Heinemeier Hansson, released under the MIT license
@@ -1,3 +0,0 @@
1
- $:.unshift "#{File.dirname(__FILE__)}/lib"
2
- require 'active_record/acts/list'
3
- ActiveRecord::Base.class_eval { include ActiveRecord::Acts::List }
@@ -1,256 +0,0 @@
1
- module ActiveRecord
2
- module Acts #:nodoc:
3
- module List #:nodoc:
4
- def self.included(base)
5
- base.extend(ClassMethods)
6
- end
7
-
8
- # This +acts_as+ extension provides the capabilities for sorting and reordering a number of objects in a list.
9
- # The class that has this specified needs to have a +position+ column defined as an integer on
10
- # the mapped database table.
11
- #
12
- # Todo list example:
13
- #
14
- # class TodoList < ActiveRecord::Base
15
- # has_many :todo_items, :order => "position"
16
- # end
17
- #
18
- # class TodoItem < ActiveRecord::Base
19
- # belongs_to :todo_list
20
- # acts_as_list :scope => :todo_list
21
- # end
22
- #
23
- # todo_list.first.move_to_bottom
24
- # todo_list.last.move_higher
25
- module ClassMethods
26
- # Configuration options are:
27
- #
28
- # * +column+ - specifies the column name to use for keeping the position integer (default: +position+)
29
- # * +scope+ - restricts what is to be considered a list. Given a symbol, it'll attach <tt>_id</tt>
30
- # (if it hasn't already been added) and use that as the foreign key restriction. It's also possible
31
- # to give it an entire string that is interpolated if you need a tighter scope than just a foreign key.
32
- # Example: <tt>acts_as_list :scope => 'todo_list_id = #{todo_list_id} AND completed = 0'</tt>
33
- def acts_as_list(options = {})
34
- configuration = { :column => "position", :scope => "1 = 1" }
35
- configuration.update(options) if options.is_a?(Hash)
36
-
37
- configuration[:scope] = "#{configuration[:scope]}_id".intern if configuration[:scope].is_a?(Symbol) && configuration[:scope].to_s !~ /_id$/
38
-
39
- if configuration[:scope].is_a?(Symbol)
40
- scope_condition_method = %(
41
- def scope_condition
42
- if #{configuration[:scope].to_s}.nil?
43
- "#{configuration[:scope].to_s} IS NULL"
44
- else
45
- "#{configuration[:scope].to_s} = \#{#{configuration[:scope].to_s}}"
46
- end
47
- end
48
- )
49
- else
50
- scope_condition_method = "def scope_condition() \"#{configuration[:scope]}\" end"
51
- end
52
-
53
- class_eval <<-EOV
54
- include ActiveRecord::Acts::List::InstanceMethods
55
-
56
- def acts_as_list_class
57
- ::#{self.name}
58
- end
59
-
60
- def position_column
61
- '#{configuration[:column]}'
62
- end
63
-
64
- #{scope_condition_method}
65
-
66
- before_destroy :remove_from_list
67
- before_create :add_to_list_bottom
68
- EOV
69
- end
70
- end
71
-
72
- # All the methods available to a record that has had <tt>acts_as_list</tt> specified. Each method works
73
- # by assuming the object to be the item in the list, so <tt>chapter.move_lower</tt> would move that chapter
74
- # lower in the list of all chapters. Likewise, <tt>chapter.first?</tt> would return +true+ if that chapter is
75
- # the first in the list of all chapters.
76
- module InstanceMethods
77
- # Insert the item at the given position (defaults to the top position of 1).
78
- def insert_at(position = 1)
79
- insert_at_position(position)
80
- end
81
-
82
- # Swap positions with the next lower item, if one exists.
83
- def move_lower
84
- return unless lower_item
85
-
86
- acts_as_list_class.transaction do
87
- lower_item.decrement_position
88
- increment_position
89
- end
90
- end
91
-
92
- # Swap positions with the next higher item, if one exists.
93
- def move_higher
94
- return unless higher_item
95
-
96
- acts_as_list_class.transaction do
97
- higher_item.increment_position
98
- decrement_position
99
- end
100
- end
101
-
102
- # Move to the bottom of the list. If the item is already in the list, the items below it have their
103
- # position adjusted accordingly.
104
- def move_to_bottom
105
- return unless in_list?
106
- acts_as_list_class.transaction do
107
- decrement_positions_on_lower_items
108
- assume_bottom_position
109
- end
110
- end
111
-
112
- # Move to the top of the list. If the item is already in the list, the items above it have their
113
- # position adjusted accordingly.
114
- def move_to_top
115
- return unless in_list?
116
- acts_as_list_class.transaction do
117
- increment_positions_on_higher_items
118
- assume_top_position
119
- end
120
- end
121
-
122
- # Removes the item from the list.
123
- def remove_from_list
124
- if in_list?
125
- decrement_positions_on_lower_items
126
- update_attribute position_column, nil
127
- end
128
- end
129
-
130
- # Increase the position of this item without adjusting the rest of the list.
131
- def increment_position
132
- return unless in_list?
133
- update_attribute position_column, self.send(position_column).to_i + 1
134
- end
135
-
136
- # Decrease the position of this item without adjusting the rest of the list.
137
- def decrement_position
138
- return unless in_list?
139
- update_attribute position_column, self.send(position_column).to_i - 1
140
- end
141
-
142
- # Return +true+ if this object is the first in the list.
143
- def first?
144
- return false unless in_list?
145
- self.send(position_column) == 1
146
- end
147
-
148
- # Return +true+ if this object is the last in the list.
149
- def last?
150
- return false unless in_list?
151
- self.send(position_column) == bottom_position_in_list
152
- end
153
-
154
- # Return the next higher item in the list.
155
- def higher_item
156
- return nil unless in_list?
157
- acts_as_list_class.find(:first, :conditions =>
158
- "#{scope_condition} AND #{position_column} = #{(send(position_column).to_i - 1).to_s}"
159
- )
160
- end
161
-
162
- # Return the next lower item in the list.
163
- def lower_item
164
- return nil unless in_list?
165
- acts_as_list_class.find(:first, :conditions =>
166
- "#{scope_condition} AND #{position_column} = #{(send(position_column).to_i + 1).to_s}"
167
- )
168
- end
169
-
170
- # Test if this record is in a list
171
- def in_list?
172
- !send(position_column).nil?
173
- end
174
-
175
- private
176
- def add_to_list_top
177
- increment_positions_on_all_items
178
- end
179
-
180
- def add_to_list_bottom
181
- self[position_column] = bottom_position_in_list.to_i + 1
182
- end
183
-
184
- # Overwrite this method to define the scope of the list changes
185
- def scope_condition() "1" end
186
-
187
- # Returns the bottom position number in the list.
188
- # bottom_position_in_list # => 2
189
- def bottom_position_in_list(except = nil)
190
- item = bottom_item(except)
191
- item ? item.send(position_column) : 0
192
- end
193
-
194
- # Returns the bottom item
195
- def bottom_item(except = nil)
196
- conditions = scope_condition
197
- conditions = "#{conditions} AND #{self.class.primary_key} != #{except.id}" if except
198
- acts_as_list_class.find(:first, :conditions => conditions, :order => "#{position_column} DESC")
199
- end
200
-
201
- # Forces item to assume the bottom position in the list.
202
- def assume_bottom_position
203
- update_attribute(position_column, bottom_position_in_list(self).to_i + 1)
204
- end
205
-
206
- # Forces item to assume the top position in the list.
207
- def assume_top_position
208
- update_attribute(position_column, 1)
209
- end
210
-
211
- # This has the effect of moving all the higher items up one.
212
- def decrement_positions_on_higher_items(position)
213
- acts_as_list_class.update_all(
214
- "#{position_column} = (#{position_column} - 1)", "#{scope_condition} AND #{position_column} <= #{position}"
215
- )
216
- end
217
-
218
- # This has the effect of moving all the lower items up one.
219
- def decrement_positions_on_lower_items
220
- return unless in_list?
221
- acts_as_list_class.update_all(
222
- "#{position_column} = (#{position_column} - 1)", "#{scope_condition} AND #{position_column} > #{send(position_column).to_i}"
223
- )
224
- end
225
-
226
- # This has the effect of moving all the higher items down one.
227
- def increment_positions_on_higher_items
228
- return unless in_list?
229
- acts_as_list_class.update_all(
230
- "#{position_column} = (#{position_column} + 1)", "#{scope_condition} AND #{position_column} < #{send(position_column).to_i}"
231
- )
232
- end
233
-
234
- # This has the effect of moving all the lower items down one.
235
- def increment_positions_on_lower_items(position)
236
- acts_as_list_class.update_all(
237
- "#{position_column} = (#{position_column} + 1)", "#{scope_condition} AND #{position_column} >= #{position}"
238
- )
239
- end
240
-
241
- # Increments position (<tt>position_column</tt>) of all items in the list.
242
- def increment_positions_on_all_items
243
- acts_as_list_class.update_all(
244
- "#{position_column} = (#{position_column} + 1)", "#{scope_condition}"
245
- )
246
- end
247
-
248
- def insert_at_position(position)
249
- remove_from_list
250
- increment_positions_on_lower_items(position)
251
- self.update_attribute(position_column, position)
252
- end
253
- end
254
- end
255
- end
256
- end