adva 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (251) 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/time_format.rb +2 -0
  87. data/lib/adva/authenticate_user.rb +193 -0
  88. data/lib/{active_record → adva}/belongs_to_author.rb +4 -4
  89. data/lib/adva/event.rb +34 -0
  90. data/lib/adva/extensible_forms.rb +285 -0
  91. data/lib/{has_options.rb → adva/has_options.rb} +5 -7
  92. data/lib/adva/has_permalink.rb +36 -0
  93. data/lib/adva/version.rb +1 -1
  94. data/lib/adva.rb +10 -36
  95. data/lib/rails_ext/action_controller/event_helper.rb +1 -1
  96. data/lib/rails_ext.rb +0 -9
  97. data/vendor/gems/cacheable_flash/.gitignore +8 -0
  98. data/vendor/gems/cacheable_flash/Gemfile +8 -0
  99. data/vendor/gems/cacheable_flash/README.md +35 -0
  100. data/vendor/gems/cacheable_flash/Rakefile +4 -0
  101. data/vendor/gems/cacheable_flash/bin/console +15 -0
  102. data/vendor/gems/cacheable_flash/bin/setup +8 -0
  103. data/vendor/gems/cacheable_flash/cacheable_flash.gemspec +38 -0
  104. data/vendor/gems/cacheable_flash/lib/cacheable_flash/controller.rb +29 -0
  105. data/vendor/gems/cacheable_flash/lib/cacheable_flash/javascript.js +19 -0
  106. data/vendor/gems/cacheable_flash/lib/cacheable_flash/middleware.rb +30 -0
  107. data/vendor/gems/cacheable_flash/lib/cacheable_flash/version.rb +5 -0
  108. data/vendor/gems/cacheable_flash/lib/cacheable_flash.rb +12 -0
  109. data/vendor/gems/simple_taggable/lib/tag_list.rb +1 -1
  110. data/vendor/gems/tags/lib/menu.rb +1 -1
  111. data/vendor/gems/tags/lib/tags/tag.rb +1 -1
  112. metadata +71 -144
  113. data/app/assets/javascripts/adva_cms/admin/jquery.admin.js +0 -23
  114. data/app/assets/javascripts/adva_cms/admin/jquery.article.js +0 -22
  115. data/app/assets/javascripts/adva_cms/admin/jquery.cached_pages.js +0 -14
  116. data/app/assets/javascripts/adva_cms/admin/jquery.table_tree.js +0 -7
  117. data/app/assets/javascripts/adva_cms/application.js +0 -13
  118. data/app/assets/javascripts/adva_cms/base.js +0 -4
  119. data/app/assets/javascripts/adva_cms/cookie.js +0 -49
  120. data/app/assets/javascripts/adva_cms/jquery/jquery-lowpro.js +0 -224
  121. data/app/assets/javascripts/adva_cms/jquery/jquery.qtip.js +0 -2085
  122. data/app/assets/javascripts/adva_cms/jquery/jquery.table_tree.js +0 -307
  123. data/app/assets/javascripts/adva_cms/jquery/jquery.tablednd_0_5.js +0 -386
  124. data/app/assets/javascripts/adva_cms/jquery.common.js +0 -41
  125. data/app/assets/javascripts/adva_cms/jquery.dates.js +0 -51
  126. data/app/assets/javascripts/adva_cms/jquery.flash.js +0 -59
  127. data/app/assets/javascripts/adva_cms/jquery.roles.js +0 -25
  128. data/app/assets/javascripts/adva_cms/json.js +0 -139
  129. data/app/controllers/admin/base_account_controller.rb +0 -13
  130. data/app/controllers/admin/install_controller.rb +0 -61
  131. data/app/controllers/admin/plugins_controller.rb +0 -38
  132. data/app/helpers/meta_tags_helper.rb +0 -30
  133. data/app/models/account.rb +0 -7
  134. data/app/models/event.rb +0 -34
  135. data/app/views/admin/articles/_meta_tags.html.erb +0 -7
  136. data/app/views/admin/cached_pages/_filter.html.erb +0 -8
  137. data/app/views/admin/cached_pages/destroy.js.erb +0 -18
  138. data/app/views/admin/cached_pages/index.html.erb +0 -26
  139. data/app/views/admin/plugins/_form.html.erb +0 -11
  140. data/app/views/admin/plugins/index.html.erb +0 -16
  141. data/app/views/admin/plugins/show.html.erb +0 -43
  142. data/app/views/admin/shared/_language_select.html.erb +0 -6
  143. data/app/views/admin/shared/_section_summary.html.erb +0 -23
  144. data/app/views/admin/sites/_meta_tags.html.erb +0 -15
  145. data/app/views/layouts/default.html.erb +0 -38
  146. data/app/views/layouts/simple.html.erb +0 -22
  147. data/app/views/shared/_footer.html.erb +0 -4
  148. data/app/views/shared/messages/insufficient_permissions.html.erb +0 -4
  149. data/config/initializers/article.rb +0 -8
  150. data/config/initializers/has_options.rb +0 -2
  151. data/config/initializers/has_permalink.rb +0 -2
  152. data/config/initializers/site.rb +0 -8
  153. data/config/locales/en.yml +0 -1319
  154. data/lib/action_controller/authenticate_anonymous.rb +0 -69
  155. data/lib/action_controller/authenticate_user.rb +0 -203
  156. data/lib/core_ext.rb +0 -7
  157. data/lib/extensible_forms.rb +0 -284
  158. data/lib/has_permalink.rb +0 -33
  159. data/lib/login/helper_integration.rb +0 -11
  160. data/lib/login/mail_config.rb +0 -39
  161. data/lib/rails_ext/action_controller/cacheable_flash.rb +0 -30
  162. data/lib/rails_ext/action_controller/content_for_assignments.rb +0 -106
  163. data/lib/rails_ext/action_controller/page_caching.rb +0 -23
  164. data/lib/rails_ext/action_controller/responds_to_parent.rb +0 -46
  165. data/lib/rails_ext/active_record/exists.rb +0 -5
  166. data/lib/rails_ext/active_record/sti_instantiation.rb +0 -35
  167. data/lib/rails_ext/active_record/sticky_changes.rb +0 -30
  168. data/lib/rails_ext/railties/plugin.rb +0 -58
  169. data/lib/rails_ext/railties/plugin_configuration.rb +0 -72
  170. data/lib/registry.rb +0 -49
  171. data/lib/tasks/translation.rake +0 -69
  172. data/lib/time_hacks.rb +0 -57
  173. data/lib/webrat_patch.rb +0 -11
  174. data/test/meta_tags_test.rb +0 -42
  175. data/vendor/gems/has_counter/.gitignore +0 -17
  176. data/vendor/gems/has_counter/Gemfile +0 -4
  177. data/vendor/gems/has_counter/LICENSE +0 -22
  178. data/vendor/gems/has_counter/MIT-LICENSE +0 -20
  179. data/vendor/gems/has_counter/README.markdown +0 -64
  180. data/vendor/gems/has_counter/README.md +0 -29
  181. data/vendor/gems/has_counter/Rakefile +0 -2
  182. data/vendor/gems/has_counter/db/migrate/20080601194338_create_counters_table.rb.rb +0 -13
  183. data/vendor/gems/has_counter/has_counter.gemspec +0 -17
  184. data/vendor/gems/has_counter/lib/active_record/has_counter.rb +0 -67
  185. data/vendor/gems/has_counter/lib/counter.rb +0 -23
  186. data/vendor/gems/has_counter/lib/has_counter/version.rb +0 -3
  187. data/vendor/gems/has_counter/lib/has_counter.rb +0 -4
  188. data/vendor/gems/has_counter/spec/has_counter.sqlite3.db +0 -0
  189. data/vendor/gems/has_counter/spec/has_counter_spec.rb +0 -55
  190. data/vendor/gems/has_counter/spec/spec_helper.rb +0 -117
  191. data/vendor/gems/has_filter/.gitignore +0 -17
  192. data/vendor/gems/has_filter/Gemfile +0 -4
  193. data/vendor/gems/has_filter/LICENSE +0 -22
  194. data/vendor/gems/has_filter/README.md +0 -29
  195. data/vendor/gems/has_filter/Rakefile +0 -2
  196. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_add.png +0 -0
  197. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_button_left.png +0 -0
  198. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_button_right.png +0 -0
  199. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_remove.png +0 -0
  200. data/vendor/gems/has_filter/app/assets/javascripts/has_filter/filter.js +0 -35
  201. data/vendor/gems/has_filter/app/assets/javascripts/has_filter/jquery.filter.js +0 -23
  202. data/vendor/gems/has_filter/app/assets/stylesheets/has_filter/alternate/filter.scss +0 -102
  203. data/vendor/gems/has_filter/app/assets/stylesheets/has_filter/filter.scss +0 -100
  204. data/vendor/gems/has_filter/app/helpers/filter_helper.rb +0 -3
  205. data/vendor/gems/has_filter/has_filter.gemspec +0 -17
  206. data/vendor/gems/has_filter/init.rb +0 -3
  207. data/vendor/gems/has_filter/lib/has_filter/active_record/act_macro.rb +0 -102
  208. data/vendor/gems/has_filter/lib/has_filter/filter/base.rb +0 -67
  209. data/vendor/gems/has_filter/lib/has_filter/filter/categorized.rb +0 -24
  210. data/vendor/gems/has_filter/lib/has_filter/filter/chain.rb +0 -45
  211. data/vendor/gems/has_filter/lib/has_filter/filter/set.rb +0 -80
  212. data/vendor/gems/has_filter/lib/has_filter/filter/state.rb +0 -25
  213. data/vendor/gems/has_filter/lib/has_filter/filter/tagged.rb +0 -22
  214. data/vendor/gems/has_filter/lib/has_filter/filter/text.rb +0 -55
  215. data/vendor/gems/has_filter/lib/has_filter/filter.rb +0 -17
  216. data/vendor/gems/has_filter/lib/has_filter/version.rb +0 -3
  217. data/vendor/gems/has_filter/lib/has_filter.rb +0 -22
  218. data/vendor/gems/has_filter/test/db/setup.rb +0 -45
  219. data/vendor/gems/has_filter/test/db/test.sqlite3.db +0 -0
  220. data/vendor/gems/has_filter/test/fixtures.rb +0 -15
  221. data/vendor/gems/has_filter/test/has_filter/filter_chain_test.rb +0 -41
  222. data/vendor/gems/has_filter/test/has_filter/filter_scopes_test.rb +0 -102
  223. data/vendor/gems/has_filter/test/has_filter/filter_tags_test.rb +0 -113
  224. data/vendor/gems/has_filter/test/has_filter/integration.rb +0 -15
  225. data/vendor/gems/has_filter/test/has_filter/scopes_test.rb +0 -48
  226. data/vendor/gems/has_filter/test/log/test.log +0 -34346
  227. data/vendor/gems/has_filter/test/models.rb +0 -23
  228. data/vendor/gems/has_filter/test/templates/has_filter/test/index.html.erb +0 -5
  229. data/vendor/gems/has_filter/test/test_helper.rb +0 -66
  230. data/vendor/gems/xss_terminate/.gitignore +0 -17
  231. data/vendor/gems/xss_terminate/Gemfile +0 -4
  232. data/vendor/gems/xss_terminate/LICENSE +0 -22
  233. data/vendor/gems/xss_terminate/MIT-LICENSE +0 -20
  234. data/vendor/gems/xss_terminate/README +0 -94
  235. data/vendor/gems/xss_terminate/README.md +0 -29
  236. data/vendor/gems/xss_terminate/Rakefile +0 -23
  237. data/vendor/gems/xss_terminate/lib/html5lib_sanitize.rb +0 -2453
  238. data/vendor/gems/xss_terminate/lib/rails_sanitize.rb +0 -8
  239. data/vendor/gems/xss_terminate/lib/xss_terminate/version.rb +0 -3
  240. data/vendor/gems/xss_terminate/lib/xss_terminate.rb +0 -141
  241. data/vendor/gems/xss_terminate/tasks/xss_terminate_tasks.rake +0 -7
  242. data/vendor/gems/xss_terminate/test/models/comment.rb +0 -5
  243. data/vendor/gems/xss_terminate/test/models/entry.rb +0 -7
  244. data/vendor/gems/xss_terminate/test/models/message.rb +0 -3
  245. data/vendor/gems/xss_terminate/test/models/person.rb +0 -5
  246. data/vendor/gems/xss_terminate/test/models/review.rb +0 -5
  247. data/vendor/gems/xss_terminate/test/schema.rb +0 -34
  248. data/vendor/gems/xss_terminate/test/setup_test.rb +0 -16
  249. data/vendor/gems/xss_terminate/test/xss_terminate_test.rb +0 -50
  250. data/vendor/gems/xss_terminate/xss_terminate.gemspec +0 -17
  251. /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
-