corkboard 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. data/.env.template +1 -0
  2. data/.gitignore +15 -0
  3. data/.rspec.template +2 -0
  4. data/.rvmrc.template +4 -0
  5. data/.wiprc +0 -0
  6. data/.yardopts +1 -0
  7. data/Gemfile +15 -0
  8. data/Gemfile.lock +223 -0
  9. data/app/assets/images/corkboard/.gitkeep +0 -0
  10. data/corkboard.gemspec +41 -0
  11. data/lib/corkboard/version.rb +1 -1
  12. data/script/rails +8 -0
  13. data/spec/controllers/corkboard/application_controller_spec.rb +7 -0
  14. data/spec/controllers/corkboard/authorizations_controller_spec.rb +26 -0
  15. data/spec/controllers/corkboard/board_controller_spec.rb +29 -0
  16. data/spec/controllers/corkboard/posts_controller_spec.rb +7 -0
  17. data/spec/corkboard/client_spec.rb +52 -0
  18. data/spec/corkboard/clients/instagram_spec.rb +30 -0
  19. data/spec/corkboard/engine_spec.rb +11 -0
  20. data/spec/corkboard/provider_spec.rb +28 -0
  21. data/spec/corkboard/providers/instagram_spec.rb +44 -0
  22. data/spec/corkboard/publishers/mock_spec.rb +12 -0
  23. data/spec/corkboard/publishers/pusher_spec.rb +12 -0
  24. data/spec/corkboard/service/config_spec.rb +12 -0
  25. data/spec/corkboard_spec.rb +136 -0
  26. data/spec/dummy/README.rdoc +261 -0
  27. data/spec/dummy/Rakefile +7 -0
  28. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  29. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  30. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  31. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  32. data/spec/dummy/app/mailers/.gitkeep +0 -0
  33. data/spec/dummy/app/models/.gitkeep +0 -0
  34. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  35. data/spec/dummy/config.ru +4 -0
  36. data/spec/dummy/config/application.rb +65 -0
  37. data/spec/dummy/config/boot.rb +10 -0
  38. data/spec/dummy/config/database.yml +25 -0
  39. data/spec/dummy/config/environment.rb +5 -0
  40. data/spec/dummy/config/environments/development.rb +37 -0
  41. data/spec/dummy/config/environments/production.rb +67 -0
  42. data/spec/dummy/config/environments/test.rb +37 -0
  43. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  44. data/spec/dummy/config/initializers/corkboard.rb +45 -0
  45. data/spec/dummy/config/initializers/inflections.rb +15 -0
  46. data/spec/dummy/config/initializers/jasmine.rb +5 -0
  47. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  48. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  49. data/spec/dummy/config/initializers/session_store.rb +8 -0
  50. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  51. data/spec/dummy/config/locales/en.yml +5 -0
  52. data/spec/dummy/config/routes.rb +3 -0
  53. data/spec/dummy/db/.gitkeep +0 -0
  54. data/spec/dummy/db/migrate/20121212222912_create_corkboard_authorizations.corkboard.rb +18 -0
  55. data/spec/dummy/db/schema.rb +31 -0
  56. data/spec/dummy/lib/assets/.gitkeep +0 -0
  57. data/spec/dummy/log/.gitkeep +0 -0
  58. data/spec/dummy/public/404.html +26 -0
  59. data/spec/dummy/public/422.html +26 -0
  60. data/spec/dummy/public/500.html +25 -0
  61. data/spec/dummy/public/favicon.ico +0 -0
  62. data/spec/dummy/script/rails +6 -0
  63. data/spec/helpers/corkboard/application_helper_spec.rb +7 -0
  64. data/spec/javascripts/fixtures/board.html +3 -0
  65. data/spec/javascripts/helpers/jasmine-jquery.js +340 -0
  66. data/spec/javascripts/spec.css +3 -0
  67. data/spec/javascripts/spec.js +5 -0
  68. data/spec/javascripts/spec_helper.js +41 -0
  69. data/spec/javascripts/specs/corkboard/app/board_spec.js +68 -0
  70. data/spec/javascripts/specs/corkboard/base_spec.js +17 -0
  71. data/spec/javascripts/specs/corkboard/lib/publisher_spec.js +101 -0
  72. data/spec/javascripts/specs/corkboard/lib/weighted_randomizer_spec.js +23 -0
  73. data/spec/javascripts/specs/corkboard_spec.js +45 -0
  74. data/spec/javascripts/support/jasmine.yml +75 -0
  75. data/spec/javascripts/support/jasmine_config.rb +1 -0
  76. data/spec/models/corkboard/authorization_spec.rb +7 -0
  77. data/spec/models/corkboard/post_spec.rb +7 -0
  78. data/spec/models/corkboard/subscription_spec.rb +7 -0
  79. data/spec/requests/authorizations_spec.rb +39 -0
  80. data/spec/requests/board_spec.rb +70 -0
  81. data/spec/routing/authorizations_routing_spec.rb +25 -0
  82. data/spec/routing/board_routing_spec.rb +7 -0
  83. data/spec/routing/posts_routing_spec.rb +15 -0
  84. data/spec/spec_helper.rb +51 -0
  85. data/spec/support/helpers/config_helpers.rb +26 -0
  86. data/spec/support/helpers/controller_helpers.rb +12 -0
  87. data/spec/support/helpers/post_helpers.rb +119 -0
  88. data/vendor/assets/javascripts/jquery.masonry-extensions.js +203 -0
  89. data/vendor/assets/javascripts/jquery.masonry.js +499 -0
  90. data/vendor/assets/javascripts/modernizr.js +821 -0
  91. data/vendor/assets/javascripts/pusher.js +48 -0
  92. metadata +176 -11
@@ -0,0 +1,70 @@
1
+ require "spec_helper"
2
+
3
+ describe "Board", :js => false do
4
+ before do
5
+ Corkboard.publish!([example_post(:instagram)])
6
+ end
7
+
8
+ describe "GET corkboard/board#show" do
9
+ context "when the authentication requirement for 'board' is :disallow!" do
10
+ it "raises an exception" do
11
+ with_config(:authentication, { :board => :disallow! }) do
12
+ expect { visit corkboard.board_path }
13
+ .to raise_error(Corkboard::ActionForbidden)
14
+ end
15
+ end
16
+ end
17
+
18
+ context "when the authentication requirement for 'board' is nil" do
19
+ it "is successful" do
20
+ with_config(:authentication, { :board => nil }) do
21
+ visit corkboard.board_path
22
+
23
+ expect(page).to have_css('article#corkboard')
24
+ expect(page).to have_css('nav.corkboard.filters')
25
+ expect(page).to have_css('ul.corkboard.posts')
26
+ end
27
+ end
28
+ end
29
+
30
+ context "given an authenticated User" do
31
+ before do
32
+ Corkboard::ApplicationController.any_instance
33
+ .stub(:authenticate!).and_return(true)
34
+ end
35
+
36
+ it "is successful" do
37
+ with_config(:authentication, { :board => :authenticate! }) do
38
+ visit corkboard.board_path
39
+
40
+ expect(page).to have_css('article#corkboard')
41
+ expect(page).to have_css('nav.corkboard.filters')
42
+ expect(page).to have_css('ul.corkboard.posts')
43
+ end
44
+ end
45
+ end
46
+
47
+ context "when presentation framework is nil" do
48
+ it "renders with the default DOM" do
49
+ with_config(:presentation, { :framework => nil }) do
50
+ visit corkboard.board_path
51
+
52
+ expect(page).to have_css('nav.corkboard.filters > ul')
53
+ expect(page).to have_css('nav.corkboard.filters > ul > li:first-child.active')
54
+ expect(page).to_not have_css('nav.corkboard.filters > ul[class]')
55
+ end
56
+ end
57
+ end
58
+
59
+ context "when presentation framework is :bootstrap" do
60
+ it "renders with the Bootstrap-enabled DOM" do
61
+ with_config(:presentation, { :framework => :bootstrap }) do
62
+ visit corkboard.board_path
63
+
64
+ expect(page).to have_css('nav.corkboard.filters > ul.btn-group')
65
+ expect(page).to have_css('nav.corkboard.filters > ul > li.active.btn')
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe "Routing for Authorizations" do
4
+ it "maps GET ':mount_point/auth' to #index" do
5
+ expect(:get => '/auth').to route_to('corkboard/authorizations#index')
6
+ end
7
+
8
+ it "maps GET ':mount_point/auth/:provider/callback' to #create" do
9
+ expect(:get => '/auth/example/callback').to route_to('corkboard/authorizations#create', {
10
+ :provider => 'example'
11
+ })
12
+ end
13
+
14
+ it "maps POST ':mount_point/auth/:provider/callback' to #create" do
15
+ expect(:post => '/auth/example/callback').to route_to('corkboard/authorizations#create', {
16
+ :provider => 'example'
17
+ })
18
+ end
19
+
20
+ it "maps DELETE ':mount_point/auth/:provider' to #destroy" do
21
+ expect(:delete => '/auth/example').to route_to('corkboard/authorizations#destroy', {
22
+ :provider => 'example'
23
+ })
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe "Routing for Board" do
4
+ it "maps GET ':mount_point' to #show" do
5
+ expect(:get => '/').to route_to('corkboard/board#show')
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ describe "Routing for Posts" do
4
+ it "maps GET ':mount_point/posts/:provider/callback' to #create" do
5
+ expect(:get => '/posts/example/callback').to route_to('corkboard/posts#create', {
6
+ :provider => 'example'
7
+ })
8
+ end
9
+
10
+ it "maps POST ':mount_point/posts/:provider/callback' to #create" do
11
+ expect(:post => '/posts/example/callback').to route_to('corkboard/posts#create', {
12
+ :provider => 'example'
13
+ })
14
+ end
15
+ end
@@ -0,0 +1,51 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV["RAILS_ENV"] ||= 'test'
3
+ require File.expand_path("../dummy/config/environment", __FILE__)
4
+ require 'rspec/rails'
5
+ require 'rspec/autorun'
6
+ require 'capybara/rspec'
7
+ require 'ffaker'
8
+ require 'mock_redis'
9
+
10
+ # Requires supporting ruby files with custom matchers and macros, etc,
11
+ # in spec/support/ and its subdirectories.
12
+ Dir[Rails.root.join("../support/**/*.rb")].each {|f| require f}
13
+
14
+ Capybara.register_driver :firefox do |app|
15
+ Capybara::Selenium::Driver.new(app, :browser => :firefox)
16
+ end
17
+
18
+ Capybara.javascript_driver = (ENV['CAPYBARA_JS'] || :webkit).intern
19
+
20
+ RSpec.configure do |config|
21
+ config.include Capybara::RSpecMatchers
22
+ config.include Support::ConfigHelpers
23
+ config.include Support::ControllerHelpers
24
+ config.include Support::PostHelpers
25
+
26
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
27
+ # examples within a transaction, remove the following line or assign false
28
+ # instead of true.
29
+ config.use_transactional_fixtures = true
30
+
31
+ # If true, the base class of anonymous controllers will be inferred
32
+ # automatically. This will be the default behavior in future versions of
33
+ # rspec-rails.
34
+ config.infer_base_class_for_anonymous_controllers = false
35
+
36
+ # Run specs in random order to surface order dependencies. If you find an
37
+ # order dependency and want to debug it, you can fix the order by providing
38
+ # the seed, which is printed after each run.
39
+ # --seed 1234
40
+ config.order = "random"
41
+
42
+ config.before(:suite) do
43
+ Corkboard.publisher(:mock)
44
+ end
45
+
46
+ config.before(:each, :type => :controller) { @routes = Corkboard::Engine.routes }
47
+ config.before(:each, :type => :routing) { @routes = Corkboard::Engine.routes }
48
+ config.before(:each) do
49
+ Corkboard.redis = MockRedis.new
50
+ end
51
+ end
@@ -0,0 +1,26 @@
1
+ module Support
2
+ module ConfigHelpers
3
+ def with_config(method, value)
4
+ Corkboard.send(method, value)
5
+ yield
6
+ ensure
7
+ # NOTE: capturing and resetting-to the original (above) resulted in
8
+ # intermittent failures. Using defaults here is more stable, but
9
+ # will require maintenance (in the event that the defaults change).
10
+ Corkboard.send(method, send(:"defaults_for_#{method}"))
11
+ end
12
+
13
+ def defaults_for_authentication
14
+ { :admin => :disallow!, :board => nil }
15
+ end
16
+
17
+ def defaults_for_presentation
18
+ {
19
+ :title => 'Corkboard',
20
+ :description => 'Corkboard',
21
+ :framework => :bootstrap,
22
+ :weights => { :s => 10, :m => 3, :l => 1 }
23
+ }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,12 @@
1
+ module Support
2
+ module ControllerHelpers
3
+ extend ActiveSupport::Concern
4
+
5
+ # Wrap `ActionController::TestCase::Behavior` actions with routing fixes
6
+ # for engine development.
7
+ def process(*args)
8
+ args[1] = (args[1] || {}).merge({ :use_route => :corkboard })
9
+ super(*args)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,119 @@
1
+ module Support
2
+ module PostHelpers
3
+ def example_post(service)
4
+ send(:"example_post_for_#{service}")
5
+ end
6
+
7
+ def example_post_for_instagram
8
+ Instagram.new.to_mash
9
+ end
10
+
11
+ class Instagram
12
+ def to_hash
13
+ {
14
+ "id" => post_id,
15
+ "link" => post_url,
16
+ "tags" => tags,
17
+ "caption" => {
18
+ "created_time" => timestamp,
19
+ "text" => Faker::Lorem.sentence,
20
+ "from" => {
21
+ "id" => user_id,
22
+ "username" => user_name,
23
+ "full_name" => full_name,
24
+ "profile_picture" => image_url
25
+ },
26
+ "id"=>"340900468247837201"
27
+ },
28
+ "images" => {
29
+ "low_resolution" => {
30
+ "url" => image_url,
31
+ "width" => 306,
32
+ "height" => 306
33
+ },
34
+ "standard_resolution" => {
35
+ "url" => image_url,
36
+ "width" => 612,
37
+ "height" => 612
38
+ },
39
+ "thumbnail" => {
40
+ "url" => image_url,
41
+ "width" => 150,
42
+ "height" => 150
43
+ }
44
+ },
45
+ "location" => {
46
+ "id" => location_id,
47
+ "name" => location_name,
48
+ "latitude" => location_lat,
49
+ "longitude" => location_lng
50
+ },
51
+ "user" => {
52
+ "id" => user_id,
53
+ "username" => user_name,
54
+ "full_name" => full_name,
55
+ "bio" => "",
56
+ "website" => "",
57
+ "profile_picture" => image_url
58
+ }
59
+ }
60
+ end
61
+
62
+ def to_json
63
+ JSON.dump(to_hash)
64
+ end
65
+
66
+ def to_mash
67
+ Hashie::Mash.new(to_hash)
68
+ end
69
+
70
+ def image_url
71
+ @image_url ||= Faker::Internet.http_url
72
+ end
73
+
74
+ def location_id
75
+ @location_id ||= "1234567"
76
+ end
77
+
78
+ def location_name
79
+ @location_name ||= Faker::Address.city
80
+ end
81
+
82
+ def location_lat
83
+ @location_lat ||= Faker::Geolocation.lat
84
+ end
85
+
86
+ def location_lng
87
+ @location_lng ||= Faker::Geolocation.lng
88
+ end
89
+
90
+ def post_id
91
+ @post_id ||= "123456789123456789_12345678"
92
+ end
93
+
94
+ def post_url
95
+ @post_url ||= Faker::Internet.http_url
96
+ end
97
+
98
+ def tags
99
+ @tags ||= Faker::Lorem.words
100
+ end
101
+
102
+ def timestamp
103
+ @timestamp ||= 1.day.ago.to_i
104
+ end
105
+
106
+ def user_id
107
+ @user_id ||= "0987654321"
108
+ end
109
+
110
+ def user_name
111
+ @user_name ||= Faker::Internet.user_name
112
+ end
113
+
114
+ def full_name
115
+ @full_name ||= Faker::Name.name
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,203 @@
1
+ (function($) {
2
+ var Modernizr = window.Modernizr;
3
+
4
+ // helper function
5
+ var capitalize = function( str ) {
6
+ return str.charAt(0).toUpperCase() + str.slice(1);
7
+ };
8
+
9
+ // ========================= getStyleProperty by kangax ===============================
10
+ // http://perfectionkills.com/feature-testing-css-properties/
11
+
12
+ var prefixes = 'Moz Webkit O Ms'.split(' ');
13
+
14
+ var getStyleProperty = function( propName ) {
15
+ var style = document.documentElement.style,
16
+ prefixed;
17
+
18
+ // test standard property first
19
+ if ( typeof style[propName] === 'string' ) {
20
+ return propName;
21
+ }
22
+
23
+ // capitalize
24
+ propName = capitalize( propName );
25
+
26
+ // test vendor specific properties
27
+ for ( var i=0, len = prefixes.length; i < len; i++ ) {
28
+ prefixed = prefixes[i] + propName;
29
+ if ( typeof style[ prefixed ] === 'string' ) {
30
+ return prefixed;
31
+ }
32
+ }
33
+ };
34
+
35
+ var transformProp = getStyleProperty('transform'),
36
+ transitionProp = getStyleProperty('transitionProperty');
37
+
38
+ // ========================= isoTransform ===============================
39
+ /**
40
+ * provides hooks for .css({ scale: value, translate: [x, y] })
41
+ * Progressively enhanced CSS transforms
42
+ * Uses hardware accelerated 3D transforms for Safari
43
+ * or falls back to 2D transforms.
44
+ */
45
+
46
+ if ( Modernizr.csstransforms ) {
47
+ // i.e. transformFnNotations.scale(0.5) >> 'scale3d( 0.5, 0.5, 1)'
48
+ var transformFnNotations = Modernizr.csstransforms3d ?
49
+ { // 3D transform functions
50
+ translate : function ( position ) {
51
+ return 'translate3d(' + position[0] + 'px, ' + position[1] + 'px, 0) ';
52
+ },
53
+ scale : function ( scale ) {
54
+ return 'scale3d(' + scale + ', ' + scale + ', 1) ';
55
+ }
56
+ } :
57
+ { // 2D transform functions
58
+ translate : function ( position ) {
59
+ return 'translate(' + position[0] + 'px, ' + position[1] + 'px) ';
60
+ },
61
+ scale : function ( scale ) {
62
+ return 'scale(' + scale + ') ';
63
+ }
64
+ }
65
+ ;
66
+
67
+ var setIsoTransform = function ( elem, name, value ) {
68
+ // unpack current transform data
69
+ var data = $.data( elem, 'isoTransform' ) || {},
70
+ newData = {},
71
+ fnName,
72
+ transformObj = {},
73
+ transformValue;
74
+
75
+ // i.e. newData.scale = 0.5
76
+ newData[ name ] = value;
77
+ // extend new value over current data
78
+ $.extend( data, newData );
79
+
80
+ for ( fnName in data ) {
81
+ transformValue = data[ fnName ];
82
+ transformObj[ fnName ] = transformFnNotations[ fnName ]( transformValue );
83
+ }
84
+
85
+ // get proper order
86
+ // ideally, we could loop through this give an array, but since we only have
87
+ // a couple transforms we're keeping track of, we'll do it like so
88
+ var translateFn = transformObj.translate || '',
89
+ scaleFn = transformObj.scale || '',
90
+ // sorting so translate always comes first
91
+ valueFns = translateFn + scaleFn;
92
+
93
+ // set data back in elem
94
+ $.data( elem, 'isoTransform', data );
95
+
96
+ // set name to vendor specific property
97
+ elem.style[ transformProp ] = valueFns;
98
+ };
99
+
100
+ // ==================== scale ===================
101
+ $.cssNumber.scale = true;
102
+
103
+ $.cssHooks.scale = {
104
+ set: function( elem, value ) {
105
+ // uncomment this bit if you want to properly parse strings
106
+ // if ( typeof value === 'string' ) {
107
+ // value = parseFloat( value );
108
+ // }
109
+ setIsoTransform( elem, 'scale', value );
110
+ },
111
+ get: function( elem, computed ) {
112
+ var transform = $.data( elem, 'isoTransform' );
113
+ return transform && transform.scale ? transform.scale : 1;
114
+ }
115
+ };
116
+
117
+ $.fx.step.scale = function( fx ) {
118
+ $.cssHooks.scale.set( fx.elem, fx.now+fx.unit );
119
+ };
120
+
121
+ // ==================== translate ===================
122
+ $.cssNumber.translate = true;
123
+
124
+ $.cssHooks.translate = {
125
+ set: function( elem, value ) {
126
+
127
+ // uncomment this bit if you want to properly parse strings
128
+ // if ( typeof value === 'string' ) {
129
+ // value = value.split(' ');
130
+ // }
131
+ //
132
+ // var i, val;
133
+ // for ( i = 0; i < 2; i++ ) {
134
+ // val = value[i];
135
+ // if ( typeof val === 'string' ) {
136
+ // val = parseInt( val );
137
+ // }
138
+ // }
139
+
140
+ setIsoTransform( elem, 'translate', value );
141
+ },
142
+
143
+ get: function( elem, computed ) {
144
+ var transform = $.data( elem, 'isoTransform' );
145
+ return transform && transform.translate ? transform.translate : [ 0, 0 ];
146
+ }
147
+ };
148
+
149
+ }
150
+
151
+ // ========================= get transition-end event ===============================
152
+ var transitionEndEvent, transitionDurProp;
153
+
154
+ if ( Modernizr.csstransitions ) {
155
+ transitionEndEvent = {
156
+ WebkitTransitionProperty: 'webkitTransitionEnd', // webkit
157
+ MozTransitionProperty: 'transitionend',
158
+ OTransitionProperty: 'oTransitionEnd otransitionend',
159
+ transitionProperty: 'transitionend'
160
+ }[ transitionProp ];
161
+
162
+ transitionDurProp = getStyleProperty('transitionDuration');
163
+ }
164
+
165
+
166
+ var hideStyle = { opacity: 0, zoom: 0.001 };
167
+ var showStyle = { opacity: 1, zoom: 1 };
168
+
169
+ if(Modernizr.csstransforms && Modernizr.csstransitions) {
170
+ hideStyle = { opacity: 0, scale: 0.001 };
171
+ showStyle = { opacity: 1, scale: 1 };
172
+ }
173
+
174
+ // ====================== Filtering ======================
175
+ $.Mason.prototype.filter = function(items, selector, callback) {
176
+ var filtered = items.filter(selector);
177
+ var hiddenClass = 'hidden',
178
+ hiddenSelector = '.' + hiddenClass,
179
+ $hiddenItems = items.filter(hiddenSelector),
180
+ $itemsToShow = $hiddenItems,
181
+ $itemsToHide;
182
+
183
+ if(selector !== '*') {
184
+ $itemsToShow = $hiddenItems.filter(selector);
185
+ $itemsToHide = items.not(hiddenSelector).not(selector).addClass(hiddenClass);
186
+ this.styleQueue.push({ $el: $itemsToHide, style: hideStyle });
187
+
188
+ $itemsToHide.each(function() {
189
+ var item = $(this);
190
+ item.data('_originalDimensions') || item.data('_originalDimensions', {
191
+ width : item.width(),
192
+ height : item.height()
193
+ });
194
+ });
195
+ }
196
+
197
+ this.styleQueue.push({ $el: $itemsToShow, style: showStyle });
198
+ $itemsToShow.removeClass(hiddenClass);
199
+
200
+ this.reload();
201
+ return filtered;
202
+ };
203
+ })(jQuery);