will_filter 3.1.2 → 3.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +12 -1
- data/.rspec +2 -1
- data/Gemfile.lock +1 -1
- data/app/assets/stylesheets/will_filter/buttons.css.scss +1 -1
- data/app/assets/stylesheets/will_filter/calendar.css.scss +54 -7
- data/app/assets/stylesheets/will_filter/exporter.css.scss +40 -17
- data/app/assets/stylesheets/will_filter/filter.css.scss +169 -144
- data/app/controllers/will_filter/exporter_controller.rb +3 -10
- data/app/views/will_filter/filter/_condition.html.erb +8 -10
- data/app/views/will_filter/filter/_conditions.html.erb +41 -37
- data/app/views/will_filter/filter/_container.html.erb +28 -22
- data/app/views/will_filter/filter/containers/_boolean.html.erb +1 -1
- data/config/will_filter/config.yml +1 -1
- data/lib/generators/will_filter/templates/config.yml +1 -1
- data/lib/will_filter/version.rb +1 -1
- data/spec/config/config_spec.rb +14 -0
- data/spec/extensions/active_record_extension_spec.rb +40 -0
- data/spec/fake_app.rb +57 -0
- data/spec/spec_helper.rb +24 -23
- data/test/.DS_Store +0 -0
- data/test/dummy/.DS_Store +0 -0
- data/test/dummy/config/will_filter/config.yml +1 -1
- data/test/dummy/db/migrate/20110924023807_create_will_filter_filters.rb +19 -0
- metadata +38 -60
- data/test/dummy/.sass-cache/f9cb1ef521115be73f1c61d3d5d64f66c947af63/buttons.css.scssc +0 -0
- data/test/dummy/.sass-cache/f9cb1ef521115be73f1c61d3d5d64f66c947af63/calendar.css.scssc +0 -0
- data/test/dummy/.sass-cache/f9cb1ef521115be73f1c61d3d5d64f66c947af63/exporter.css.scssc +0 -0
- data/test/dummy/.sass-cache/f9cb1ef521115be73f1c61d3d5d64f66c947af63/filter.css.scssc +0 -0
- data/test/dummy/test/functional/welcome_controller_test.rb +0 -9
- data/test/dummy/test/unit/helpers/welcome_helper_test.rb +0 -4
- data/test/fixtures/will_filter/filters.yml +0 -11
- data/test/functional/will_filter/calendar_controller_test.rb +0 -9
- data/test/functional/will_filter/exporter_controller_test.rb +0 -9
- data/test/functional/will_filter/filter_controller_test.rb +0 -9
- data/test/integration/navigation_test.rb +0 -10
- data/test/unit/helpers/will_filter/calendar_helper_test.rb +0 -6
- data/test/unit/helpers/will_filter/exporter_helper_test.rb +0 -6
- data/test/unit/helpers/will_filter/filter_helper_test.rb +0 -6
- data/test/unit/will_filter/filter_test.rb +0 -9
@@ -1,56 +1,60 @@
|
|
1
|
-
|
2
|
-
<%= hidden_field_tag(:
|
3
|
-
<%= hidden_field_tag(:
|
4
|
-
<%= hidden_field_tag(:
|
5
|
-
<%= hidden_field_tag(:
|
6
|
-
<%= hidden_field_tag(:
|
7
|
-
<%= hidden_field_tag(:
|
8
|
-
<%= hidden_field_tag(:
|
9
|
-
|
1
|
+
<div style="margin:0;padding:0;display:inline">
|
2
|
+
<%= hidden_field_tag(:wf_id, wf_filter.id) %>
|
3
|
+
<%= hidden_field_tag(:wf_type, wf_filter.class.name) %>
|
4
|
+
<%= hidden_field_tag(:wf_dirty, "false") %>
|
5
|
+
<%= hidden_field_tag(:wf_submitted, "false") %>
|
6
|
+
<%= hidden_field_tag(:wf_name, wf_filter.name) %>
|
7
|
+
<%= hidden_field_tag(:wf_model, wf_filter.model_class_name) %>
|
8
|
+
<%= hidden_field_tag(:wf_export_format, "") %>
|
9
|
+
<%= hidden_field_tag(:wf_export_fields, "") %>
|
10
|
+
</div>
|
11
|
+
|
10
12
|
<div class="header">
|
11
13
|
<% if wf_filter.show_save_options? %>
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
<div class="end">
|
15
|
+
<%=link_to_function("<span>Save As New...</span>".html_safe, "wfFilter.saveFilter()", :class => "wf_grey_button wf_pcb") %>
|
16
|
+
<%=link_to_function("<span>Update</span>".html_safe, "wfFilter.updateFilter()", :class => "wf_grey_button wf_pcb") %>
|
17
|
+
<%=link_to_function("<span>Delete</span>".html_safe, "wfFilter.deleteFilter()", :class => "wf_grey_button wf_pcb") %>
|
16
18
|
<% if wf_filter.show_export_options? %>
|
17
19
|
<%=link_to_function("<span>Export Data...</span>".html_safe, "wfExporter.show(this)", :class => "wf_grey_button wf_pcb") %>
|
18
20
|
<% end %>
|
19
|
-
|
21
|
+
</div>
|
20
22
|
<% end %>
|
21
|
-
|
23
|
+
<div>
|
22
24
|
<% unless wf_filter.saved_filters.empty? %>
|
23
25
|
<%= select_tag(:wf_key, options_for_select(wf_filter.saved_filters, wf_filter.key), {:onChange=>"wfFilter.loadSavedFilter()"}) %>
|
24
26
|
<% end %>
|
25
|
-
|
27
|
+
</div>
|
26
28
|
</div>
|
27
29
|
|
28
30
|
<div class="body">
|
31
|
+
|
29
32
|
<% if wf_filter.errors[:filter] %>
|
30
33
|
<div class="wf_filter_error">
|
31
34
|
<%= wf_filter.errors[:filter] %>
|
32
35
|
</div>
|
33
36
|
<% end %>
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
38
|
+
<div class="filter_match_type">
|
39
|
+
Match <%= select_tag(:wf_match, options_for_select(wf_filter.match_options, wf_filter.match), {:onChange=>"wfFilter.markDirty()"}) %>
|
40
|
+
of the following conditions:
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<% if wf_filter.size == 0 %>
|
44
|
+
<div class="no_filter_hint">
|
45
|
+
You haven't added any filter conditions, so all of the results were returned.
|
46
|
+
Use the "Add" button in the bottom left corner to add a new condition or select
|
47
|
+
a predefined filter from a drop-down list above.
|
48
|
+
</div>
|
49
|
+
<% else %>
|
50
|
+
<table class="table" cellpadding="0" cellspacing="0">
|
51
|
+
<%
|
52
|
+
0.upto(wf_filter.size-1) do |index|
|
53
|
+
condition = wf_filter.condition_at(index)
|
54
|
+
%>
|
55
|
+
<%= render :partial => "/will_filter/filter/condition", :locals => {:wf_filter => wf_filter, :condition => condition, :index => index}%>
|
56
|
+
<% end %>
|
57
|
+
</table>
|
58
|
+
<% end %>
|
59
|
+
|
56
60
|
</div>
|
@@ -2,30 +2,36 @@
|
|
2
2
|
|
3
3
|
<%= form_tag({}, {:method => :get, :name=>'wf_form', :id => 'wf_form', :class => 'wf_form' }) do %>
|
4
4
|
<div class="wf_container">
|
5
|
-
|
6
|
-
|
5
|
+
<div id="wf_filter_conditions" class="conditions">
|
6
|
+
<%= render :partial=> "/will_filter/filter/conditions", :locals => {:wf_filter => wf_filter} %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="footer">
|
10
|
+
<div class="actions">
|
11
|
+
<small>
|
12
|
+
<%=link_to_function("Toggle Conditions", "wfFilter.toggleDebugger()") %>
|
13
|
+
</small>
|
14
|
+
|
15
|
+
Order:
|
16
|
+
<%= select_tag(:wf_order, options_for_select(wf_filter.condition_options, wf_filter.order), {:onChange=>"markDirty()"}) %>
|
17
|
+
<%= select_tag(:wf_order_type, options_for_select(wf_filter.order_type_options, wf_filter.order_type), {:onChange=>"markDirty()"}) %>
|
18
|
+
Per Page:
|
19
|
+
<%= select_tag(:wf_per_page, options_for_select(wf_filter.per_page_options, wf_filter.per_page.to_s), {:onChange=>"markDirty()"}) %>
|
20
|
+
|
21
|
+
<%=link_to_function("<span>Submit Filter</span>".html_safe, "wfFilter.submit()", :class => "wf_grey_button wf_pcb") %>
|
7
22
|
</div>
|
8
|
-
|
9
|
-
|
10
|
-
<
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
<%= select_tag(:wf_order_type, options_for_select(wf_filter.order_type_options, wf_filter.order_type), {:onChange=>"markDirty()"}) %>
|
16
|
-
Per Page:
|
17
|
-
<%= select_tag(:wf_per_page, options_for_select(wf_filter.per_page_options, wf_filter.per_page.to_s), {:onChange=>"markDirty()"}) %>
|
18
|
-
<%=link_to_function("<span>Submit Filter</span>".html_safe, "wfFilter.submit()", :class => "wf_grey_button wf_pcb") %>
|
19
|
-
</div>
|
20
|
-
<div>
|
21
|
-
<%=link_to_function("<span>+ Add</span>".html_safe, "wfFilter.addCondition()", :class => "wf_grey_button wf_pcb") %>
|
22
|
-
<%=link_to_function("<span>- Clear</span>".html_safe, "wfFilter.removeAllConditions()", :class => "wf_grey_button wf_pcb") %>
|
23
|
-
<span id="wf_loader" class="spinner" style="display:none;"><%=image_tag "will_filter/spinner.gif", {:style=>"vertical-align:middle"} %> Loading...</span>
|
24
|
-
</div>
|
23
|
+
<div>
|
24
|
+
<%=link_to_function("<span>+ Add</span>".html_safe, "wfFilter.addCondition()", :class => "wf_grey_button wf_pcb") %>
|
25
|
+
<%=link_to_function("<span>- Clear</span>".html_safe, "wfFilter.removeAllConditions()", :class => "wf_grey_button wf_pcb") %>
|
26
|
+
|
27
|
+
<span id="wf_loader" class="spinner" style="display:none;">
|
28
|
+
<%=image_tag "will_filter/spinner.gif" %> Loading...
|
29
|
+
</span>
|
25
30
|
</div>
|
31
|
+
</div>
|
26
32
|
|
27
|
-
|
28
|
-
|
29
|
-
|
33
|
+
<div id="wf_debugger" class="debugger" style="display:none;">
|
34
|
+
<%= raw(wf_filter.debug_sql_conditions) %>
|
35
|
+
</div>
|
30
36
|
</div>
|
31
37
|
<% end %>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<div
|
1
|
+
<div class="boolean_container">
|
2
2
|
<%=radio_button_tag("wf_v#{index}_0", '1', (container.value == '1'), :style => 'width:20px', :onChange => 'wfFilter.fieldChanged(this)')%> True
|
3
3
|
|
4
4
|
<%=radio_button_tag("wf_v#{index}_0", '0', (container.value == '0'), :style => 'width:20px', :onChange => 'wfFilter.fieldChanged(this)')%> False
|
data/lib/will_filter/version.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe WillFilter::Config do
|
4
|
+
subject { WillFilter::Config }
|
5
|
+
describe 'operator_order' do
|
6
|
+
context 'by default' do
|
7
|
+
its(:config) {should_not == nil}
|
8
|
+
its(:containers) {should_not == nil}
|
9
|
+
its(:data_types) {should_not == nil}
|
10
|
+
its(:operators) {should_not == nil}
|
11
|
+
its(:operator_order) {should_not == nil}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe WillFilter::ActiveRecordExtension do
|
4
|
+
describe '#filter' do
|
5
|
+
before :all do
|
6
|
+
5.times {|i| User.create(:first_name => "User #{i}")}
|
7
|
+
end
|
8
|
+
|
9
|
+
context "filtering with no params" do
|
10
|
+
it "should return all of the results" do
|
11
|
+
User.filter(:params => {}).total_count.should == User.count
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "filtering with is operator" do
|
16
|
+
it "should return a single result" do
|
17
|
+
User.filter(:params => {:wf_c0 => "first_name", :wf_o0 => "is", :wf_v0_0 => "User 1"}).total_count.should == 1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "filtering with like operator" do
|
22
|
+
it "should return all matched results" do
|
23
|
+
User.filter(:params => {:wf_c0 => "first_name", :wf_o0 => "contains", :wf_v0_0 => "User"}).total_count.should == User.count
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "filtering with ends_with operator" do
|
28
|
+
it "should return all matched results" do
|
29
|
+
User.filter(:params => {:wf_c0 => "first_name", :wf_o0 => "ends_with", :wf_v0_0 => "4"}).total_count.should == 1
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "filtering with starts_with operator" do
|
34
|
+
it "should return all matched results" do
|
35
|
+
User.filter(:params => {:wf_c0 => "first_name", :wf_o0 => "starts_with", :wf_v0_0 => "U"}).total_count.should == User.count
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/spec/fake_app.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'action_controller/railtie'
|
3
|
+
require 'action_view/railtie'
|
4
|
+
|
5
|
+
# database
|
6
|
+
ActiveRecord::Base.configurations = {'test' => {:adapter => 'sqlite3', :database => ':memory:'}}
|
7
|
+
ActiveRecord::Base.establish_connection('test')
|
8
|
+
|
9
|
+
# config
|
10
|
+
app = Class.new(Rails::Application)
|
11
|
+
app.config.secret_token = "3b7cd727ee24e8444053437c36cc66c4"
|
12
|
+
app.config.session_store :cookie_store, :key => "_myapp_session"
|
13
|
+
app.config.active_support.deprecation = :log
|
14
|
+
app.initialize!
|
15
|
+
|
16
|
+
# routes
|
17
|
+
app.routes.draw do
|
18
|
+
resources :users
|
19
|
+
end
|
20
|
+
|
21
|
+
# models
|
22
|
+
class User < ActiveRecord::Base
|
23
|
+
has_many :events
|
24
|
+
has_many :events_users
|
25
|
+
end
|
26
|
+
class Event < ActiveRecord::Base
|
27
|
+
belongs_to :user, :class_name => 'User', :foreign_key => :creator_id
|
28
|
+
has_many :event_users
|
29
|
+
end
|
30
|
+
class EventUser < ActiveRecord::Base
|
31
|
+
belongs_to :event
|
32
|
+
belongs_to :user
|
33
|
+
end
|
34
|
+
|
35
|
+
# controllers
|
36
|
+
class ApplicationController < ActionController::Base; end
|
37
|
+
class UsersController < ApplicationController
|
38
|
+
def index
|
39
|
+
@users = User.filter(:params => params)
|
40
|
+
render :inline => <<-ERB
|
41
|
+
<%= will_filter_tag(@users) %>
|
42
|
+
ERB
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# helpers
|
47
|
+
Object.const_set(:ApplicationHelper, Module.new)
|
48
|
+
|
49
|
+
#migrations
|
50
|
+
class CreateAllTables < ActiveRecord::Migration
|
51
|
+
def self.up
|
52
|
+
Dir["#{File.dirname(__FILE__)}/../test/dummy/db/migrate/*.rb"].each do |f|
|
53
|
+
require f
|
54
|
+
f.split("/").last.gsub('.rb', '').split('_')[1..-1].join('_').camelcase.constantize.up
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,27 +1,28 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require '
|
5
|
-
|
6
|
-
|
7
|
-
# in spec/support/ and its subdirectories.
|
8
|
-
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
require 'rails'
|
4
|
+
require 'kaminari'
|
5
|
+
require 'database_cleaner'
|
6
|
+
require 'will_filter'
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
8
|
+
# Ensure we use 'syck' instead of 'psych' in 1.9.2
|
9
|
+
# RubyGems >= 1.5.0 uses 'psych' on 1.9.2, but
|
10
|
+
# Psych does not yet support YAML 1.1 merge keys.
|
11
|
+
# Merge keys is often used in mongoid.yml
|
12
|
+
# See: http://redmine.ruby-lang.org/issues/show/4300
|
13
|
+
if RUBY_VERSION >= '1.9.2'
|
14
|
+
YAML::ENGINE.yamler = 'syck'
|
15
|
+
end
|
16
|
+
require File.join(File.dirname(__FILE__), 'fake_app')
|
19
17
|
|
20
|
-
|
21
|
-
|
18
|
+
require 'rspec/rails'
|
19
|
+
# Requires supporting files with custom matchers and macros, etc,
|
20
|
+
# in ./support/ and its subdirectories.
|
21
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
RSpec.configure do |config|
|
24
|
+
config.mock_with :rr
|
25
|
+
config.before :all do
|
26
|
+
CreateAllTables.up unless ActiveRecord::Base.connection.table_exists? 'users'
|
27
|
+
end
|
27
28
|
end
|
data/test/.DS_Store
CHANGED
Binary file
|
data/test/dummy/.DS_Store
CHANGED
Binary file
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class CreateWillFilterFilters < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :will_filter_filters do |t|
|
4
|
+
t.string :type
|
5
|
+
t.string :name
|
6
|
+
t.text :data
|
7
|
+
t.integer :user_id
|
8
|
+
t.string :model_class_name
|
9
|
+
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
|
13
|
+
add_index :will_filter_filters, [:user_id]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.down
|
17
|
+
drop_table :will_filter_filters
|
18
|
+
end
|
19
|
+
end
|