adva 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. checksums.yaml +4 -4
  2. data/adva.gemspec +3 -0
  3. data/app/assets/config/manifest.js +6 -0
  4. data/app/assets/javascripts/adva_cms/ckeditor.js.erb +12 -0
  5. data/app/assets/javascripts/adva_cms/concat_main_menus.js +13 -0
  6. data/app/assets/javascripts/adva_cms/jquery.table_tree.js +704 -0
  7. data/app/assets/javascripts/adva_cms.js +7 -0
  8. data/app/assets/javascripts/ckeditor/config.js.erb +94 -0
  9. data/app/assets/stylesheets/adva_cms/admin/common.scss +15 -1
  10. data/app/assets/stylesheets/adva_cms/admin/projection.scss +2 -5
  11. data/app/assets/stylesheets/adva_cms/admin/sidebar.scss +30 -9
  12. data/app/assets/stylesheets/adva_cms/admin.scss +1 -1
  13. data/app/controllers/admin/base_controller.rb +10 -24
  14. data/app/controllers/admin/page/articles_controller.rb +8 -27
  15. data/app/controllers/admin/page/categories_controller.rb +6 -9
  16. data/app/controllers/admin/page/links_controller.rb +6 -9
  17. data/app/controllers/admin/sections_controller.rb +7 -9
  18. data/app/controllers/admin/sites_controller.rb +9 -12
  19. data/app/controllers/admin/users_controller.rb +6 -9
  20. data/app/controllers/articles_controller.rb +30 -52
  21. data/app/controllers/base_controller.rb +8 -8
  22. data/app/controllers/password_controller.rb +3 -5
  23. data/app/controllers/session_controller.rb +3 -5
  24. data/app/helpers/activities_helper.rb +9 -20
  25. data/app/helpers/admin/base_helper.rb +4 -22
  26. data/app/helpers/base_helper.rb +1 -1
  27. data/app/helpers/content_helper.rb +7 -5
  28. data/app/helpers/resource_helper.rb +4 -5
  29. data/app/helpers/users_helper.rb +1 -1
  30. data/app/models/activity.rb +3 -0
  31. data/app/models/article.rb +0 -11
  32. data/app/models/category.rb +3 -3
  33. data/app/models/content.rb +10 -39
  34. data/app/models/link.rb +0 -1
  35. data/app/models/password_mailer.rb +6 -9
  36. data/app/models/section.rb +6 -7
  37. data/app/models/site.rb +0 -2
  38. data/app/models/user.rb +1 -2
  39. data/app/views/activity_notifier/new_content_notification.html.erb +5 -5
  40. data/app/views/admin/activities/_activities.html.erb +4 -4
  41. data/app/views/admin/activities/_comment.html.erb +21 -21
  42. data/app/views/admin/activities/_content.html.erb +4 -3
  43. data/app/views/admin/activities/_topic.html.erb +5 -5
  44. data/app/views/admin/install/confirmation.html.erb +3 -3
  45. data/app/views/admin/install/index.html.erb +14 -14
  46. data/app/views/admin/page/articles/_form.html.erb +28 -25
  47. data/app/views/admin/page/articles/_options.html.erb +3 -4
  48. data/app/views/admin/page/articles/edit.html.erb +3 -3
  49. data/app/views/admin/page/articles/new.html.erb +4 -4
  50. data/app/views/admin/page/categories/edit.html.erb +9 -9
  51. data/app/views/admin/page/categories/index.html.erb +16 -16
  52. data/app/views/admin/page/categories/new.html.erb +5 -3
  53. data/app/views/admin/page/contents/index.html.erb +3 -18
  54. data/app/views/admin/page/links/_form.html.erb +17 -17
  55. data/app/views/admin/page/links/_options.html.erb +16 -19
  56. data/app/views/admin/page/links/edit.html.erb +3 -3
  57. data/app/views/admin/page/links/new.html.erb +3 -3
  58. data/app/views/admin/sections/_form.html.haml +5 -5
  59. data/app/views/admin/sections/edit.html.haml +2 -2
  60. data/app/views/admin/sections/index.html.erb +18 -18
  61. data/app/views/admin/sections/new.html.erb +15 -13
  62. data/app/views/admin/sections/settings/_page.html.haml +4 -6
  63. data/app/views/admin/shared/_header.html.erb +5 -4
  64. data/app/views/admin/shared/_section_tree.html.erb +2 -2
  65. data/app/views/admin/sites/_email_notifications.html.erb +6 -7
  66. data/app/views/admin/sites/_form.html.erb +7 -7
  67. data/app/views/admin/sites/_recent_users.html.erb +4 -2
  68. data/app/views/admin/sites/_unapproved_comments.html.erb +1 -1
  69. data/app/views/admin/sites/index.html.erb +1 -1
  70. data/app/views/admin/sites/new.html.erb +2 -2
  71. data/app/views/admin/sites/show.html.erb +7 -8
  72. data/app/views/admin/users/edit.html.erb +1 -1
  73. data/app/views/admin/users/index.html.erb +10 -10
  74. data/app/views/admin/users/new.html.erb +1 -1
  75. data/app/views/admin/users/show.html.erb +7 -7
  76. data/app/views/layouts/admin.html.haml +3 -5
  77. data/app/views/layouts/login.html.erb +1 -1
  78. data/app/views/password/edit.html.erb +12 -5
  79. data/app/views/password/new.html.erb +7 -7
  80. data/app/views/password_mailer/reset_password_email.html.erb +21 -1
  81. data/app/views/password_mailer/updated_password_email.html.erb +3 -1
  82. data/app/views/session/new.html.erb +9 -9
  83. data/app/views/shared/_flash.html.erb +2 -2
  84. data/app/views/shared/_sidebar.html.erb +2 -2
  85. data/config/initializers/ckeditor.rb +61 -0
  86. data/config/initializers/menus.rb +1 -1
  87. data/config/initializers/time_format.rb +2 -0
  88. data/lib/adva/authenticate_user.rb +193 -0
  89. data/lib/{active_record → adva}/belongs_to_author.rb +4 -4
  90. data/lib/adva/event.rb +34 -0
  91. data/lib/adva/extensible_forms.rb +285 -0
  92. data/lib/{has_options.rb → adva/has_options.rb} +5 -7
  93. data/lib/adva/has_permalink.rb +36 -0
  94. data/lib/adva/version.rb +1 -1
  95. data/lib/adva.rb +10 -36
  96. data/lib/rails_ext/action_controller/event_helper.rb +1 -1
  97. data/lib/rails_ext.rb +0 -9
  98. data/vendor/gems/cacheable_flash/.gitignore +8 -0
  99. data/vendor/gems/cacheable_flash/Gemfile +8 -0
  100. data/vendor/gems/cacheable_flash/README.md +35 -0
  101. data/vendor/gems/cacheable_flash/Rakefile +4 -0
  102. data/vendor/gems/cacheable_flash/bin/console +15 -0
  103. data/vendor/gems/cacheable_flash/bin/setup +8 -0
  104. data/vendor/gems/cacheable_flash/cacheable_flash.gemspec +38 -0
  105. data/vendor/gems/cacheable_flash/lib/cacheable_flash/controller.rb +29 -0
  106. data/vendor/gems/cacheable_flash/lib/cacheable_flash/javascript.js +19 -0
  107. data/vendor/gems/cacheable_flash/lib/cacheable_flash/middleware.rb +30 -0
  108. data/vendor/gems/cacheable_flash/lib/cacheable_flash/version.rb +5 -0
  109. data/vendor/gems/cacheable_flash/lib/cacheable_flash.rb +12 -0
  110. data/vendor/gems/simple_taggable/lib/tag_list.rb +1 -1
  111. data/vendor/gems/tags/lib/menu.rb +1 -1
  112. data/vendor/gems/tags/lib/tags/tag.rb +1 -1
  113. metadata +72 -145
  114. data/app/assets/javascripts/adva_cms/admin/jquery.admin.js +0 -23
  115. data/app/assets/javascripts/adva_cms/admin/jquery.article.js +0 -22
  116. data/app/assets/javascripts/adva_cms/admin/jquery.cached_pages.js +0 -14
  117. data/app/assets/javascripts/adva_cms/admin/jquery.table_tree.js +0 -7
  118. data/app/assets/javascripts/adva_cms/application.js +0 -13
  119. data/app/assets/javascripts/adva_cms/base.js +0 -4
  120. data/app/assets/javascripts/adva_cms/cookie.js +0 -49
  121. data/app/assets/javascripts/adva_cms/jquery/jquery-lowpro.js +0 -224
  122. data/app/assets/javascripts/adva_cms/jquery/jquery.qtip.js +0 -2085
  123. data/app/assets/javascripts/adva_cms/jquery/jquery.table_tree.js +0 -307
  124. data/app/assets/javascripts/adva_cms/jquery/jquery.tablednd_0_5.js +0 -386
  125. data/app/assets/javascripts/adva_cms/jquery.common.js +0 -41
  126. data/app/assets/javascripts/adva_cms/jquery.dates.js +0 -51
  127. data/app/assets/javascripts/adva_cms/jquery.flash.js +0 -59
  128. data/app/assets/javascripts/adva_cms/jquery.roles.js +0 -25
  129. data/app/assets/javascripts/adva_cms/json.js +0 -139
  130. data/app/controllers/admin/base_account_controller.rb +0 -13
  131. data/app/controllers/admin/install_controller.rb +0 -61
  132. data/app/controllers/admin/plugins_controller.rb +0 -38
  133. data/app/helpers/meta_tags_helper.rb +0 -30
  134. data/app/models/account.rb +0 -7
  135. data/app/models/event.rb +0 -34
  136. data/app/views/admin/articles/_meta_tags.html.erb +0 -7
  137. data/app/views/admin/cached_pages/_filter.html.erb +0 -8
  138. data/app/views/admin/cached_pages/destroy.js.erb +0 -18
  139. data/app/views/admin/cached_pages/index.html.erb +0 -26
  140. data/app/views/admin/plugins/_form.html.erb +0 -11
  141. data/app/views/admin/plugins/index.html.erb +0 -16
  142. data/app/views/admin/plugins/show.html.erb +0 -43
  143. data/app/views/admin/shared/_language_select.html.erb +0 -6
  144. data/app/views/admin/shared/_section_summary.html.erb +0 -23
  145. data/app/views/admin/sites/_meta_tags.html.erb +0 -15
  146. data/app/views/layouts/default.html.erb +0 -38
  147. data/app/views/layouts/simple.html.erb +0 -22
  148. data/app/views/shared/_footer.html.erb +0 -4
  149. data/app/views/shared/messages/insufficient_permissions.html.erb +0 -4
  150. data/config/initializers/article.rb +0 -8
  151. data/config/initializers/has_options.rb +0 -2
  152. data/config/initializers/has_permalink.rb +0 -2
  153. data/config/initializers/site.rb +0 -8
  154. data/config/locales/en.yml +0 -1319
  155. data/lib/action_controller/authenticate_anonymous.rb +0 -69
  156. data/lib/action_controller/authenticate_user.rb +0 -203
  157. data/lib/core_ext.rb +0 -7
  158. data/lib/extensible_forms.rb +0 -284
  159. data/lib/has_permalink.rb +0 -33
  160. data/lib/login/helper_integration.rb +0 -11
  161. data/lib/login/mail_config.rb +0 -39
  162. data/lib/rails_ext/action_controller/cacheable_flash.rb +0 -30
  163. data/lib/rails_ext/action_controller/content_for_assignments.rb +0 -106
  164. data/lib/rails_ext/action_controller/page_caching.rb +0 -23
  165. data/lib/rails_ext/action_controller/responds_to_parent.rb +0 -46
  166. data/lib/rails_ext/active_record/exists.rb +0 -5
  167. data/lib/rails_ext/active_record/sti_instantiation.rb +0 -35
  168. data/lib/rails_ext/active_record/sticky_changes.rb +0 -30
  169. data/lib/rails_ext/railties/plugin.rb +0 -58
  170. data/lib/rails_ext/railties/plugin_configuration.rb +0 -72
  171. data/lib/registry.rb +0 -49
  172. data/lib/tasks/translation.rake +0 -69
  173. data/lib/time_hacks.rb +0 -57
  174. data/lib/webrat_patch.rb +0 -11
  175. data/test/meta_tags_test.rb +0 -42
  176. data/vendor/gems/has_counter/.gitignore +0 -17
  177. data/vendor/gems/has_counter/Gemfile +0 -4
  178. data/vendor/gems/has_counter/LICENSE +0 -22
  179. data/vendor/gems/has_counter/MIT-LICENSE +0 -20
  180. data/vendor/gems/has_counter/README.markdown +0 -64
  181. data/vendor/gems/has_counter/README.md +0 -29
  182. data/vendor/gems/has_counter/Rakefile +0 -2
  183. data/vendor/gems/has_counter/db/migrate/20080601194338_create_counters_table.rb.rb +0 -13
  184. data/vendor/gems/has_counter/has_counter.gemspec +0 -17
  185. data/vendor/gems/has_counter/lib/active_record/has_counter.rb +0 -67
  186. data/vendor/gems/has_counter/lib/counter.rb +0 -23
  187. data/vendor/gems/has_counter/lib/has_counter/version.rb +0 -3
  188. data/vendor/gems/has_counter/lib/has_counter.rb +0 -4
  189. data/vendor/gems/has_counter/spec/has_counter.sqlite3.db +0 -0
  190. data/vendor/gems/has_counter/spec/has_counter_spec.rb +0 -55
  191. data/vendor/gems/has_counter/spec/spec_helper.rb +0 -117
  192. data/vendor/gems/has_filter/.gitignore +0 -17
  193. data/vendor/gems/has_filter/Gemfile +0 -4
  194. data/vendor/gems/has_filter/LICENSE +0 -22
  195. data/vendor/gems/has_filter/README.md +0 -29
  196. data/vendor/gems/has_filter/Rakefile +0 -2
  197. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_add.png +0 -0
  198. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_button_left.png +0 -0
  199. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_button_right.png +0 -0
  200. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_remove.png +0 -0
  201. data/vendor/gems/has_filter/app/assets/javascripts/has_filter/filter.js +0 -35
  202. data/vendor/gems/has_filter/app/assets/javascripts/has_filter/jquery.filter.js +0 -23
  203. data/vendor/gems/has_filter/app/assets/stylesheets/has_filter/alternate/filter.scss +0 -102
  204. data/vendor/gems/has_filter/app/assets/stylesheets/has_filter/filter.scss +0 -100
  205. data/vendor/gems/has_filter/app/helpers/filter_helper.rb +0 -3
  206. data/vendor/gems/has_filter/has_filter.gemspec +0 -17
  207. data/vendor/gems/has_filter/init.rb +0 -3
  208. data/vendor/gems/has_filter/lib/has_filter/active_record/act_macro.rb +0 -102
  209. data/vendor/gems/has_filter/lib/has_filter/filter/base.rb +0 -67
  210. data/vendor/gems/has_filter/lib/has_filter/filter/categorized.rb +0 -24
  211. data/vendor/gems/has_filter/lib/has_filter/filter/chain.rb +0 -45
  212. data/vendor/gems/has_filter/lib/has_filter/filter/set.rb +0 -80
  213. data/vendor/gems/has_filter/lib/has_filter/filter/state.rb +0 -25
  214. data/vendor/gems/has_filter/lib/has_filter/filter/tagged.rb +0 -22
  215. data/vendor/gems/has_filter/lib/has_filter/filter/text.rb +0 -55
  216. data/vendor/gems/has_filter/lib/has_filter/filter.rb +0 -17
  217. data/vendor/gems/has_filter/lib/has_filter/version.rb +0 -3
  218. data/vendor/gems/has_filter/lib/has_filter.rb +0 -22
  219. data/vendor/gems/has_filter/test/db/setup.rb +0 -45
  220. data/vendor/gems/has_filter/test/db/test.sqlite3.db +0 -0
  221. data/vendor/gems/has_filter/test/fixtures.rb +0 -15
  222. data/vendor/gems/has_filter/test/has_filter/filter_chain_test.rb +0 -41
  223. data/vendor/gems/has_filter/test/has_filter/filter_scopes_test.rb +0 -102
  224. data/vendor/gems/has_filter/test/has_filter/filter_tags_test.rb +0 -113
  225. data/vendor/gems/has_filter/test/has_filter/integration.rb +0 -15
  226. data/vendor/gems/has_filter/test/has_filter/scopes_test.rb +0 -48
  227. data/vendor/gems/has_filter/test/log/test.log +0 -34346
  228. data/vendor/gems/has_filter/test/models.rb +0 -23
  229. data/vendor/gems/has_filter/test/templates/has_filter/test/index.html.erb +0 -5
  230. data/vendor/gems/has_filter/test/test_helper.rb +0 -66
  231. data/vendor/gems/xss_terminate/.gitignore +0 -17
  232. data/vendor/gems/xss_terminate/Gemfile +0 -4
  233. data/vendor/gems/xss_terminate/LICENSE +0 -22
  234. data/vendor/gems/xss_terminate/MIT-LICENSE +0 -20
  235. data/vendor/gems/xss_terminate/README +0 -94
  236. data/vendor/gems/xss_terminate/README.md +0 -29
  237. data/vendor/gems/xss_terminate/Rakefile +0 -23
  238. data/vendor/gems/xss_terminate/lib/html5lib_sanitize.rb +0 -2453
  239. data/vendor/gems/xss_terminate/lib/rails_sanitize.rb +0 -8
  240. data/vendor/gems/xss_terminate/lib/xss_terminate/version.rb +0 -3
  241. data/vendor/gems/xss_terminate/lib/xss_terminate.rb +0 -141
  242. data/vendor/gems/xss_terminate/tasks/xss_terminate_tasks.rake +0 -7
  243. data/vendor/gems/xss_terminate/test/models/comment.rb +0 -5
  244. data/vendor/gems/xss_terminate/test/models/entry.rb +0 -7
  245. data/vendor/gems/xss_terminate/test/models/message.rb +0 -3
  246. data/vendor/gems/xss_terminate/test/models/person.rb +0 -5
  247. data/vendor/gems/xss_terminate/test/models/review.rb +0 -5
  248. data/vendor/gems/xss_terminate/test/schema.rb +0 -34
  249. data/vendor/gems/xss_terminate/test/setup_test.rb +0 -16
  250. data/vendor/gems/xss_terminate/test/xss_terminate_test.rb +0 -50
  251. data/vendor/gems/xss_terminate/xss_terminate.gemspec +0 -17
  252. /data/lib/tasks/{adva_cms.rake → adva.rake} +0 -0
@@ -1,100 +0,0 @@
1
- #filters {
2
- min-width: 320px;
3
- position: relative;
4
- padding-top: 15px;
5
- }
6
- #filters .set {
7
- position: relative;
8
- white-space: nowrap;
9
- padding: 0;
10
- margin-bottom: 2px;
11
- background-color: #e8e8e8;
12
- }
13
- #filters .set fieldset {
14
- display: none;
15
- vertical-align: middle;
16
- padding: 0;
17
- }
18
- #filters .selected_filter,
19
- #filters .set .selected {
20
- display: inline-block;
21
- }
22
- #filters .set select {
23
- vertical-align: middle;
24
- }
25
- #filters .set input[type=text] {
26
- width: 50px;
27
- padding: 1px 5px 2px 5px;
28
- font-size: 0.9em;
29
- vertical-align: middle;
30
- }
31
- #filters .set input[type=checkbox] {
32
- vertical-align: middle;
33
- }
34
- #filters .set label {
35
- display: inline;
36
- margin: -2px 0 2px 0;
37
- font-weight: normal;
38
- font-size: 0.85em;
39
- vertical-align: baseline;
40
- }
41
- #filters .set .controls {
42
- display: inline-block;
43
- position: absolute;
44
- right: 4px;
45
- top: 3px;
46
- width: 36px;
47
- height: 18px;
48
- }
49
- #filters .set .controls a {
50
- display: inline-block;
51
- float: right;
52
- overflow: hidden;
53
- width: 18px;
54
- height: 18px;
55
- outline: 0px;
56
- text-indent: 18px;
57
- }
58
- #filters .set .controls a.filter_add {
59
- background: image_url("has_filter/filter_add.png") left top;
60
- }
61
- #filters .set .controls a.filter_remove {
62
- background: image_url("has_filter/filter_remove.png") left top;
63
- }
64
- #filters .set:first-child .controls a.filter_remove {
65
- display: none;
66
- text-indent: 20px;
67
- }
68
- #filters .set .controls a.filter_add {
69
- /* margin-right: 4px;*/
70
- }
71
- #filters .set .controls a.filter_remove {
72
- /* margin-left: -4px;*/
73
- }
74
- #filters div.submit {
75
- height: 18px;
76
- padding: 0;
77
- padding-left: 16px;
78
- margin-right: 2px;
79
- background: image_url("has_filter/filter_button_left.png") repeat-x left top;
80
- vertical-align: top;
81
- }
82
-
83
- #filters div.submit button {
84
- display: block;
85
- float: right;
86
- padding: 0px 16px 0px 0px;
87
- margin-right: -2px;
88
- border: 0;
89
- background: image_url("has_filter/filter_button_right.png") repeat-x right top;
90
- font-size: 11px;
91
- height: 20px;
92
- color: #555;
93
- outline: none;
94
- text-decoration: none;
95
- }
96
-
97
- #filters div.submit button:hover {
98
- color: #333;
99
- cursor: pointer;
100
- }
@@ -1,3 +0,0 @@
1
- module FilterHelper
2
- include HasFilter::Helper
3
- end
@@ -1,17 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/has_filter/version', __FILE__)
3
-
4
- Gem::Specification.new do |gem|
5
- gem.authors = ["Micah Geisel"]
6
- gem.email = ["micah@botandrose.com"]
7
- gem.description = %q{TODO: Write a gem description}
8
- gem.summary = %q{TODO: Write a gem summary}
9
- gem.homepage = ""
10
-
11
- gem.files = `git ls-files`.split($\)
12
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
- gem.name = "has_filter"
15
- gem.require_paths = ["lib"]
16
- gem.version = HasFilter::VERSION
17
- end
@@ -1,3 +0,0 @@
1
- # register_javascript_expansion :admin => %w( has_filter/jquery.filter )
2
- # register_stylesheet_expansion :admin => %w( has_filter/filter )
3
- # register_stylesheet_expansion :admin_alternate => %w( has_filter/alternate/filter )
@@ -1,102 +0,0 @@
1
- # Heavily inspired by Noel Rappin's "More Named Scope Awesomeness"
2
- # http://www.pathf.com/blogs/2008/06/more-named-scope-awesomeness/
3
-
4
- module HasFilter
5
- # # raised when filter_by is called with an attribute that has not been
6
- # # whitelisted for being filtered
7
- # class IllegalAttributeAccessError < ActiveRecordError
8
- # attr_reader :attribute
9
- # def initialize(attribute)
10
- # @attribute = attribute
11
- # super "Tried to filter by #{attribute.inspect}. This attribute has not been whitelisted for filtering."
12
- # end
13
- # end
14
-
15
- module ActiveRecord
16
- module ActMacro
17
- def has_filter(*filters)
18
- return if has_filter?
19
- include InstanceMethods
20
- extend ClassMethods
21
-
22
- class_attribute :filter_chain
23
- self.filter_chain = ::HasFilter::Filter::Chain.build(self, filters)
24
-
25
- scopes = { # FIXME make these extensible
26
- :is => ["=" ],
27
- :is_not => ["<>"],
28
- :contains => ["LIKE", "%%%s%"],
29
- :does_not_contain => ["NOT LIKE", "%%%s%"],
30
- :starts_with => ["LIKE", "%s%" ],
31
- :does_not_start_with => ["NOT LIKE", "%s%" ],
32
- :ends_with => ["LIKE", "%%%s" ],
33
- :does_not_end_with => ["NOT LIKE", "%%%s" ] }
34
- # FIXME add these
35
- # created_before, created_after
36
- # updated_before, updated_after
37
-
38
- scopes.each do |name, scope|
39
- scope name, lambda { |column, value| filter_scope(column, Array(value), *scope) }
40
- end
41
-
42
- scope :contains_all, contains_all_scope
43
- scope :categorized, categorized_scope
44
- end
45
-
46
- def filtered(filters)
47
- scope = scope(:find).blank? ? self : scoped(scope(:find))
48
- filter_chain.select(filters).scope(scope)
49
- end
50
-
51
- def has_filter?
52
- included_modules.include? HasFilter::ActiveRecord::InstanceMethods
53
- end
54
- end
55
-
56
- module ClassMethods
57
- protected
58
- def contains_all_scope
59
- lambda { |column, values|
60
- values = values.split(' ') if values.is_a?(String)
61
- values.map! { |value| "%#{value}%" }
62
- { :conditions => [(["#{column} LIKE ?"] * values.size).join(' AND '), *values] }
63
- }
64
- end
65
-
66
- def categorized_scope
67
- lambda { |*ids|
68
- { :select => "#{table_name}.*, COUNT(*) AS count",
69
- :joins => { :categorizations => :category },
70
- :conditions => ["#{reflect_on_association(:categories).table_name}.id IN(?)", ids],
71
- :group => "#{table_name}.id HAVING count >= #{ids.size}" }
72
- }
73
- end
74
-
75
- def filter_scope(column, values, operator, format = nil)
76
- query = (["#{column} #{operator} ?"] * values.size)
77
- # FIXME why did we have .map($:downcase) here ?
78
- values = values.map{ |value| format ? format % value : value } # .map(&:downcase)
79
- scope = { :conditions => [query.join(' OR '), *values] }
80
- translated?(column) ? merge_globalization_scope(scope) : scope
81
- end
82
-
83
- def translated?(column)
84
- # FIXME really should be in globalize
85
- respond_to?(:globalize_options) && globalize_options[:translated_attributes].include?(column.to_sym)
86
- end
87
-
88
- def merge_globalization_scope(scope)
89
- if scope.has_key?(:conditions)
90
- scope[:conditions][0] += " AND current = ?"
91
- scope[:conditions] << true
92
- scope.merge!(:joins => :globalize_translations, :group => "#{self.table_name}.id")
93
- else
94
- scope.merge!(:joins => :globalize_translations, :group => "#{self.table_name}.id", :conditions => ['current = ?', true])
95
- end
96
- end
97
- end
98
-
99
- module InstanceMethods
100
- end
101
- end
102
- end
@@ -1,67 +0,0 @@
1
- module HasFilter
2
- module Filter
3
- class Base
4
- class_attribute :scopes, :priority
5
- attr_accessor :set, :options
6
- delegate :view, :to => :set
7
-
8
- class << self
9
- def build(*args)
10
- [new(*args)]
11
- end
12
- end
13
-
14
- def initialize(options = {})
15
- @options = options
16
- end
17
-
18
- def attribute
19
- @options[:attribute] if @options
20
- end
21
-
22
- def matches?(name)
23
- type == name
24
- end
25
-
26
- def select(selected)
27
- @selected = selected
28
- end
29
-
30
- def selected
31
- @selected ||= {}
32
- end
33
-
34
- def selected?
35
- set.selected?(type)
36
- end
37
-
38
- def type
39
- @type ||= self.class.name.demodulize.underscore.to_sym
40
- end
41
-
42
- def to_field_set_tag(options = {})
43
- view.capture do
44
- options.reverse_merge! :id => "filter_#{type}_#{set.index}", :class => "filter filter_#{attribute || type}"
45
- options[:class] += ' selected' if selected?
46
- view.field_set_tag(nil, options.slice(:id, :class, :label)) do
47
- to_form_fields(options).join("\n")
48
- end
49
- end
50
- end
51
-
52
- def filter_select_option
53
- [I18n.t(type, :scope => :'has_filter.filters', :default => type.to_s.gsub('_', ' ')), type]
54
- end
55
-
56
- protected
57
-
58
- def form_field_name(*keys)
59
- "filters[]" + keys.map { |key| "[#{key}]" }.join
60
- end
61
-
62
- def form_field_id(*keys)
63
- "filter" + keys.map { |key| "_#{key}" }.join + "_#{set.index}"
64
- end
65
- end
66
- end
67
- end
@@ -1,24 +0,0 @@
1
- module HasFilter
2
- module Filter
3
- class Categorized < Base
4
- self.priority = 4
5
- self.scopes = [:categories]
6
-
7
- def to_form_fields(options = {})
8
- options[:categories].blank? ? [] : [categories_select_tag(options)]
9
- end
10
-
11
- def scope(target)
12
- target.categorized(*selected)
13
- end
14
-
15
- protected
16
-
17
- def categories_select_tag(options = {})
18
- categories = options[:categories].map { |c| [c.title, c.id] }
19
- options = view.options_for_select(categories, selected)
20
- view.select_tag(form_field_name(:categorized, nil), options, :id => form_field_id(:categorized, :id))
21
- end
22
- end
23
- end
24
- end
@@ -1,45 +0,0 @@
1
- # A filter chain is a collection of filter sets. A filter set hold individual
2
- # filters of which only one can be active/selected at a time.
3
-
4
- module HasFilter
5
- module Filter
6
- class Chain < Array
7
- class << self
8
- def build(owner, *args)
9
- new owner, Set.build(*args)
10
- end
11
- end
12
-
13
- attr_reader :owner, :view
14
-
15
- def initialize(owner, *sets)
16
- @owner = owner
17
- concat sets.each { |set| set.chain = self }
18
- end
19
-
20
- def select(params)
21
- params ||= []
22
- adjust_size(params)
23
- each { |set| set.select(params[set.index]) }
24
- self
25
- end
26
-
27
- def scope(target = nil)
28
- inject(target || owner) { |target, set| set.scope(target) }
29
- end
30
-
31
- def to_form_fields(view, options = {})
32
- @view = view
33
- map { |set| set.to_field_set_tag(options) }
34
- end
35
-
36
- protected
37
-
38
- def adjust_size(params)
39
- size = [params.size, 1].max
40
- replace (1..size).map { first.dup }
41
- each_with_index { |set, index| set.index = index }
42
- end
43
- end
44
- end
45
- end
@@ -1,80 +0,0 @@
1
- module HasFilter
2
- module Filter
3
- class Set < Array
4
- attr_accessor :chain, :index, :selected
5
- delegate :view, :to => :chain
6
-
7
- class << self
8
- def build(filters)
9
- new filters.map { |filter|
10
- case filter
11
- when Hash
12
- filter.map { |type, args| Filter.build(type, args) }
13
- when Symbol
14
- Filter.build(filter)
15
- end
16
- }.flatten
17
- end
18
- end
19
-
20
- def initialize(filters)
21
- concat filters.each { |f| f.set = self }
22
- sort!
23
- end
24
-
25
- def initialize_copy(orig)
26
- super
27
- replace orig.map { |f| f.dup }.each { |f| f.set = self }
28
- end
29
-
30
- def sort!
31
- head = self.reject { |f| !f.is_a?(Text) }
32
- replace head + (self - head).sort { |a, b| a.priority <=> b.priority }
33
- end
34
-
35
- def select(params)
36
- params ||= { :selected => first.attribute || first.type }
37
- @selected = params[:selected].to_sym
38
- find_filter(selected).select(params[selected]) if @selected
39
- end
40
-
41
- def selected?(name)
42
- selected == name
43
- end
44
-
45
- def first?
46
- index == 0
47
- end
48
-
49
- def scope(target)
50
- selected ? find_filter(selected).scope(target) : target
51
- end
52
-
53
- def to_field_set_tag(options = {})
54
- view.capture do
55
- view.field_set_tag(nil, :class => 'set') do
56
- tag = filter_select_tag(view) + "\n"
57
- tag << map { |filter| filter.to_field_set_tag(options.dup) }.join("\n")
58
- tag << view.content_tag(:span, :class => 'controls') do
59
- view.content_tag(:a, '+', :href => '#', :class => 'filter_add') +
60
- view.content_tag(:a, '-', :href => '#', :class => 'filter_remove')
61
- end
62
- tag
63
- end
64
- end
65
- end
66
-
67
- protected
68
-
69
- def find_filter(type)
70
- # FIXME ask the filter instead: filter.matches?(type) or something
71
- detect { |filter| filter.matches?(type) }
72
- end
73
-
74
- def filter_select_tag(view)
75
- options = view.options_for_select(map(&:filter_select_option), selected)
76
- view.select_tag :'filters[][selected]', options, :id => "selected_filter_#{index}", :class => 'selected_filter'
77
- end
78
- end
79
- end
80
- end
@@ -1,25 +0,0 @@
1
- module HasFilter
2
- module Filter
3
- class State < Base
4
- self.priority = 3
5
- self.scopes = [:state]
6
-
7
- def to_form_fields(options = {})
8
- @options[:states].map { |state| state_tag(state) }
9
- end
10
-
11
- def scope(target)
12
- # FIXME assert that state is a valid state!
13
- selected.inject(target) { |target, state| target.send(state) }
14
- end
15
-
16
- protected
17
-
18
- def state_tag(state)
19
- id = form_field_id(:state, state)
20
- view.check_box_tag(form_field_name(:state, nil), state, selected.include?(state), :id => id) +
21
- view.label_tag(id, I18n.t(state, :scope => :'has_filter.states', :default => state.to_s))
22
- end
23
- end
24
- end
25
- end
@@ -1,22 +0,0 @@
1
- module HasFilter
2
- module Filter
3
- class Tagged < Base
4
- self.priority = 2
5
- self.scopes = [:tagged]
6
-
7
- def to_form_fields(options = {})
8
- [query_tag]
9
- end
10
-
11
- def scope(target)
12
- target.tagged(selected)
13
- end
14
-
15
- protected
16
-
17
- def query_tag
18
- view.text_field_tag(form_field_name(:tagged), selected, :id => form_field_id(:tagged, :query))
19
- end
20
- end
21
- end
22
- end
@@ -1,55 +0,0 @@
1
- module HasFilter
2
- module Filter
3
- class Text < Base
4
- self.priority = 1
5
- self.scopes = [:contains, :starts_with, :ends_with, :is]
6
-
7
- class << self
8
- def build(args)
9
- Array(args[:attributes]).map { |attribute| new(:attribute => attribute) }
10
- end
11
- end
12
-
13
- def matches?(name)
14
- attribute == name
15
- end
16
-
17
- def selected?
18
- set.selected?(attribute)
19
- end
20
-
21
- def to_field_set_tag(options = {})
22
- options[:id] = "filter_#{attribute}_#{set.index}"
23
- super
24
- end
25
-
26
- def to_form_fields(options = {})
27
- [scopes_select_tag, query_input_tag]
28
- end
29
-
30
- def scope(target)
31
- # FIXME assert that scope is contained in self.scopes
32
- scope, query = selected.values_at(:scope, :query)
33
- query.blank? ? target : target.send(scope, attribute, query)
34
- end
35
-
36
- def filter_select_option
37
- [I18n.t(attribute, :scope => :'has_filter.filters', :default => attribute.to_s.gsub('_', ' ')), attribute]
38
- end
39
-
40
- protected
41
-
42
- def scopes_select_tag
43
- options = self.class.scopes.map do |scope|
44
- [I18n.t(scope, :scope => :'has_filter.scopes', :default => scope.to_s.gsub('_', ' ')), scope]
45
- end
46
- options = view.options_for_select(options, selected[:scope].try(:to_sym))
47
- view.select_tag(form_field_name(attribute, :scope), options, :id => form_field_id(attribute, :scope))
48
- end
49
-
50
- def query_input_tag
51
- view.text_field_tag(form_field_name(attribute, :query), selected[:query], :id => form_field_id(attribute, :query))
52
- end
53
- end
54
- end
55
- end
@@ -1,17 +0,0 @@
1
- require_dependency 'has_filter/filter/base'
2
- require_dependency 'has_filter/filter/categorized'
3
- require_dependency 'has_filter/filter/chain'
4
- require_dependency 'has_filter/filter/set'
5
- require_dependency 'has_filter/filter/state'
6
- require_dependency 'has_filter/filter/tagged'
7
- require_dependency 'has_filter/filter/text'
8
-
9
- module HasFilter
10
- module Filter
11
- class << self
12
- def build(type, *args)
13
- HasFilter::Filter.const_get(type.to_s.classify).build(*args)
14
- end
15
- end
16
- end
17
- end
@@ -1,3 +0,0 @@
1
- module HasFilter
2
- VERSION = "0.0.1"
3
- end
@@ -1,22 +0,0 @@
1
- require "has_filter/version"
2
- require 'has_filter/filter'
3
- require 'has_filter/active_record/act_macro'
4
-
5
- module HasFilter
6
- module Helper
7
- def filter_for(klass, options = {})
8
- form_tag(options.delete(:url) || request.path, :method => :get, :id => 'filters', :class => 'filters') do
9
- klass.filter_chain.to_form_fields(self, options).join(raw("\n")) +
10
- content_tag(:div, :class => 'submit') do
11
- content_tag(:button, I18n.t(:'filter.submit.value', :default => 'Apply'))
12
- end
13
- end
14
- end
15
- end
16
-
17
- class Engine < Rails::Engine
18
- end
19
- end
20
-
21
- ActiveRecord::Base.send :extend, HasFilter::ActiveRecord::ActMacro
22
- ActionController::Base.send :helper, HasFilter::Helper
@@ -1,45 +0,0 @@
1
- begin
2
- ActiveRecord::Base.connection
3
- rescue ActiveRecord::ConnectionNotEstablished => e
4
-
5
- dir_name = File.dirname(__FILE__)
6
- log_file = "#{dir_name}/../log/test.log"
7
- db_file = "#{dir_name}/test.sqlite3.db"
8
-
9
- FileUtils.rm(db_file) if File.exists?(db_file)
10
- FileUtils.mkdir_p(File.dirname(log_file)) unless File.exists?(File.dirname(log_file))
11
-
12
- ActiveRecord::Base.logger = Logger.new log_file
13
- ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :dbfile => db_file
14
- end
15
-
16
- ActiveRecord::Migration.verbose = false
17
- ActiveRecord::Schema.define(:version => 20090126133510) do
18
- create_table "has_filter_articles", :force => true do |t|
19
- t.string :title
20
- t.string :body
21
- t.integer :published
22
- t.integer :approved
23
- t.string :cached_tag_list
24
- end unless ActiveRecord::Base.connection.table_exists?('has_filter_articles')
25
-
26
- create_table "has_filter_categories", :force => true do |t|
27
- t.string :title
28
- end unless ActiveRecord::Base.connection.table_exists?('has_filter_categories')
29
-
30
- create_table "has_filter_categorizations", :force => true do |t|
31
- t.integer :category_id
32
- t.integer :has_filter_article_id
33
- end unless ActiveRecord::Base.connection.table_exists?('has_filter_categorizations')
34
-
35
- create_table :tags, :force => true do |t|
36
- t.column :name, :string
37
- end unless ActiveRecord::Base.connection.table_exists?('tags')
38
-
39
- create_table :taggings, :force => true do |t|
40
- t.column :tag_id, :integer
41
- t.column :taggable_id, :integer
42
- t.column :taggable_type, :string
43
- t.column :created_at, :datetime
44
- end unless ActiveRecord::Base.connection.table_exists?('taggings')
45
- end
@@ -1,15 +0,0 @@
1
- HasFilterArticle.destroy_all
2
- HasFilterCategory.destroy_all
3
- HasFilterCategorization.destroy_all
4
-
5
- first = HasFilterArticle.create! :title => 'first', :body => 'first', :published => 1, :approved => 0, :tag_list => 'foo bar baz'
6
- second = HasFilterArticle.create! :title => 'second', :body => 'second', :published => 1, :approved => 1, :tag_list => 'foo bar'
7
- third = HasFilterArticle.create! :title => 'third', :body => 'third', :published => 0, :approved => 0, :tag_list => 'foo'
8
- third = HasFilterArticle.create! :title => 'UPCASE', :body => 'UPCASE', :published => 0, :approved => 0, :tag_list => 'upcase'
9
-
10
- foo = HasFilterCategory.create! :title => 'has_filter foo'
11
- bar = HasFilterCategory.create! :title => 'has_filter bar'
12
-
13
- first.categories << foo << bar
14
- second.categories << foo
15
-