will_filter 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.loadpath +12 -0
- data/.project +18 -0
- data/CHANGELOG.rdoc +1 -0
- data/Gemfile +32 -0
- data/Gemfile.lock +73 -0
- data/LICENSE +18 -0
- data/README.rdoc +74 -0
- data/Rakefile +54 -0
- data/VERSION +1 -0
- data/app/controllers/application_controller.rb +27 -0
- data/app/controllers/will_filter/calendar_controller.rb +31 -0
- data/app/controllers/will_filter/exporter_controller.rb +122 -0
- data/app/controllers/will_filter/filter_controller.rb +107 -0
- data/app/helpers/application_helper.rb +26 -0
- data/app/models/will_filter/filter.rb +694 -0
- data/app/views/layouts/application.html.erb +11 -0
- data/app/views/will_filter/calendar/_annual.html.erb +14 -0
- data/app/views/will_filter/calendar/_month.html.erb +39 -0
- data/app/views/will_filter/calendar/_quarter.html.erb +15 -0
- data/app/views/will_filter/calendar/index.html.erb +52 -0
- data/app/views/will_filter/common/_actions_bar.html.erb +5 -0
- data/app/views/will_filter/common/_results_table.html.erb +129 -0
- data/app/views/will_filter/common/_scripts.html.erb +10 -0
- data/app/views/will_filter/exporter/export.html.erb +11 -0
- data/app/views/will_filter/exporter/index.html.erb +47 -0
- data/app/views/will_filter/filter/_condition.html.erb +30 -0
- data/app/views/will_filter/filter/_conditions.html.erb +56 -0
- data/app/views/will_filter/filter/_container.html.erb +31 -0
- data/app/views/will_filter/filter/containers/_blank.html.erb +1 -0
- data/app/views/will_filter/filter/containers/_boolean.html.erb +5 -0
- data/app/views/will_filter/filter/containers/_date.html.erb +12 -0
- data/app/views/will_filter/filter/containers/_date_range.html.erb +20 -0
- data/app/views/will_filter/filter/containers/_date_time.html.erb +12 -0
- data/app/views/will_filter/filter/containers/_date_time_range.html.erb +20 -0
- data/app/views/will_filter/filter/containers/_list.html.erb +7 -0
- data/app/views/will_filter/filter/containers/_numeric_range.html.erb +13 -0
- data/app/views/will_filter/filter/containers/_text.html.erb +7 -0
- data/app/views/will_filter/filter/index.html.erb +4 -0
- data/config/application.rb +45 -0
- data/config/boot.rb +6 -0
- data/config/database.yml +22 -0
- data/config/environment.rb +13 -0
- data/config/environments/development.rb +26 -0
- data/config/environments/production.rb +49 -0
- data/config/environments/test.rb +38 -0
- data/config/routes.rb +64 -0
- data/config/will_filter/config.yml +97 -0
- data/config.ru +4 -0
- data/db/development.sqlite3 +0 -0
- data/db/migrate/20090730070119_create_will_filter_tables.rb +19 -0
- data/db/seeds.rb +7 -0
- data/db/test.sqlite3 +0 -0
- data/doc/README_FOR_APP +2 -0
- data/examples/README +1 -0
- data/lib/application_helper.rb +45 -0
- data/lib/core_ext/active_record/base.rb +44 -0
- data/lib/core_ext/array.rb +34 -0
- data/lib/core_ext/object.rb +34 -0
- data/lib/generators/will_filter/templates/config.yml +97 -0
- data/lib/generators/will_filter/templates/create_will_filter_tables.rb +19 -0
- data/lib/generators/will_filter/will_filter_generator.rb +24 -0
- data/lib/tasks/.gitkeep +0 -0
- data/lib/tasks/will_filter_tasks.rake +32 -0
- data/lib/will_filter/calendar.rb +168 -0
- data/lib/will_filter/common_methods.rb +49 -0
- data/lib/will_filter/config.rb +104 -0
- data/lib/will_filter/containers/boolean.rb +43 -0
- data/lib/will_filter/containers/date.rb +51 -0
- data/lib/will_filter/containers/date_range.rb +56 -0
- data/lib/will_filter/containers/date_time.rb +50 -0
- data/lib/will_filter/containers/date_time_range.rb +64 -0
- data/lib/will_filter/containers/filter_list.rb +59 -0
- data/lib/will_filter/containers/list.rb +56 -0
- data/lib/will_filter/containers/nil.rb +45 -0
- data/lib/will_filter/containers/numeric.rb +52 -0
- data/lib/will_filter/containers/numeric_delimited.rb +50 -0
- data/lib/will_filter/containers/numeric_range.rb +60 -0
- data/lib/will_filter/containers/single_date.rb +57 -0
- data/lib/will_filter/containers/text.rb +45 -0
- data/lib/will_filter/containers/text_delimited.rb +51 -0
- data/lib/will_filter/engine.rb +11 -0
- data/lib/will_filter/filter_condition.rb +59 -0
- data/lib/will_filter/filter_container.rb +73 -0
- data/lib/will_filter/filter_exception.rb +27 -0
- data/lib/will_filter.rb +15 -0
- data/pkg/will_filter-0.1.0.gem +0 -0
- data/pkg/will_filter-0.1.1.gem +0 -0
- data/public/404.html +26 -0
- data/public/422.html +26 -0
- data/public/500.html +26 -0
- data/public/favicon.ico +0 -0
- data/public/robots.txt +5 -0
- data/public/will_filter/images/buttons.png +0 -0
- data/public/will_filter/images/calendar.png +0 -0
- data/public/will_filter/images/clock.png +0 -0
- data/public/will_filter/images/close.gif +0 -0
- data/public/will_filter/images/results_table_th_active.gif +0 -0
- data/public/will_filter/images/sort_arrow_all.gif +0 -0
- data/public/will_filter/images/sort_bg.gif +0 -0
- data/public/will_filter/images/spinner.gif +0 -0
- data/public/will_filter/javascripts/will_filter.js +568 -0
- data/public/will_filter/javascripts/will_filter_prototype_effects.js +15 -0
- data/public/will_filter/stylesheets/will_filter.css +168 -0
- data/script/rails +6 -0
- data/test/functional/models/will_filter/filter_test.rb +297 -0
- data/test/performance/browsing_test.rb +9 -0
- data/test/test_helper.rb +71 -0
- data/uninstall.rb +24 -0
- data/will_filter.gemspec +7 -0
- metadata +208 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
<table class="wf_calendar_cells" cellpadding="0" cellspacing="0" style="border:1px black #ccc;">
|
2
|
+
<tr>
|
3
|
+
<% WillFilter::Calendar.days.each_with_index do |day, index| %>
|
4
|
+
<td style="text-align:center;color:grey;font-size:10px;font-weight:bold;">
|
5
|
+
<%= day %>
|
6
|
+
</td>
|
7
|
+
<% end %>
|
8
|
+
</tr>
|
9
|
+
<tr>
|
10
|
+
<% index = 0 %>
|
11
|
+
<% current_date = calendar.start_date %>
|
12
|
+
|
13
|
+
<% while current_date <= calendar.end_date do %>
|
14
|
+
<% if current_date.wday == 0 %>
|
15
|
+
</tr><tr>
|
16
|
+
<% end %>
|
17
|
+
|
18
|
+
<% 0.upto(6) do |i| %>
|
19
|
+
<td style="text-align:center; vertical-align: middle;">
|
20
|
+
<% if current_date.wday == i and current_date <= calendar.end_date
|
21
|
+
today = (current_date==Date.today) ? "today" : ""
|
22
|
+
selected = (current_date == calendar.selected_date.to_date and current_date!=Date.today) ? "selected" : ""
|
23
|
+
selected = "" # for now
|
24
|
+
|
25
|
+
set_date = calendar.show_time? ? "" : "wfCalendar.setDate();"
|
26
|
+
%>
|
27
|
+
<center>
|
28
|
+
<div id="wf_calendar_cell_<%=current_date.year%>_<%=current_date.month%>_<%=current_date.day%>" class="wf_calendar_date_cell <%=today%> <%=selected%>" onClick="wfCalendar.selectDateValue(this, '<%=current_date%>'); <%=set_date%>">
|
29
|
+
<%=current_date.day %>
|
30
|
+
</div>
|
31
|
+
</center>
|
32
|
+
<% current_date += 1.day %>
|
33
|
+
<% index += 1 %>
|
34
|
+
<% end %>
|
35
|
+
</td>
|
36
|
+
<% end %>
|
37
|
+
<% end %>
|
38
|
+
</tr>
|
39
|
+
</table>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<table class="wf_calendar_table" cellpadding="0" cellspacing="0">
|
2
|
+
<tr>
|
3
|
+
<% 0.upto(3) do |m| %>
|
4
|
+
<% if m % 2 == 0 %>
|
5
|
+
</tr><tr>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<td valign="top">
|
9
|
+
<% next_cal = calendar.move(m.months) %>
|
10
|
+
<div class="wf_calendar_title"><%=next_cal.title %></div>
|
11
|
+
<%= render :partial => "month", :locals => {:calendar => next_cal} %>
|
12
|
+
</td>
|
13
|
+
<% end %>
|
14
|
+
</tr>
|
15
|
+
</table>
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<div style="font-size:12px;font-weight:bold;">
|
2
|
+
<div style="float:right; padding-right:2px;">
|
3
|
+
<% if @calendar.mode == 'month' %>
|
4
|
+
<%=link_to_function("« expand".html_safe, "wfCalendar.changeMode('quarter', #{@calendar.show_time?})", :style => "font-size:10px; padding-bottom: 3px")%>
|
5
|
+
<% elsif @calendar.mode == 'quarter' %>
|
6
|
+
<%=link_to_function("« expand".html_safe, "wfCalendar.changeMode('annual', #{@calendar.show_time?})", :style => "font-size:10px; padding-bottom: 3px")%>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<%=link_to_function(image_tag("/wf/images/close.gif", :title=>"Close"), "wfCalendar.hide()")%>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
Calendar
|
13
|
+
</div>
|
14
|
+
<div class="wf_calendar_container">
|
15
|
+
<% form_tag({:controller => "/will_filter/calendar"}, {:method => :get, :id => "wf_calendar_form"}) do %>
|
16
|
+
<%= hidden_field_tag :wf_calendar_start_date, @calendar.start_date.strftime("%Y/%m/%d") %>
|
17
|
+
<%= hidden_field_tag :wf_calendar_selected_date, @calendar.selected_date.strftime("%Y/%m/%d") %>
|
18
|
+
<%= hidden_field_tag :wf_calendar_mode, @calendar.mode %>
|
19
|
+
<%= hidden_field_tag :wf_calendar_show_time, @calendar.show_time? %>
|
20
|
+
|
21
|
+
<div style="padding:5px;text-align:center; margin-bottom:5px; border-bottom: 1px solid #ccc;">
|
22
|
+
|
23
|
+
<%=link_to_function("«".html_safe, "wfCalendar.goToStartDate('#{@calendar.previous_start_date}')", :style=>"font-size:16px;")%>
|
24
|
+
|
25
|
+
<% if @calendar.mode != 'annual' %>
|
26
|
+
<%= select_tag("month", options_for_select(WillFilter::Calendar.month_options, @calendar.month), {:id => "wf_calendar_month", :onChange=>"wfCalendar.goToStartDate('')"}) %>
|
27
|
+
<% end %>
|
28
|
+
<%= select_tag("year", options_for_select(WillFilter::Calendar.year_options, @calendar.year), {:id => "wf_calendar_year",:onChange=>"wfCalendar.goToStartDate('')"}) %>
|
29
|
+
|
30
|
+
<%=link_to_function("»".html_safe, "wfCalendar.goToStartDate('#{@calendar.next_start_date}')", :style=>"font-size:16px;")%>
|
31
|
+
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<%= render :partial => @calendar.mode, :locals => {:calendar => @calendar} %>
|
35
|
+
|
36
|
+
<% if @calendar.show_time? %>
|
37
|
+
<div style="text-align:center; margin-top:10px; padding:5px; border-top:1px solid #ccc;">
|
38
|
+
<div style="margin:5px;">
|
39
|
+
Time:
|
40
|
+
<%= select_tag("wf_calendar_hour", options_for_select(WillFilter::Calendar.hour_options, @calendar.hour)) %>
|
41
|
+
:
|
42
|
+
<%= select_tag("wf_calendar_minute", options_for_select(WillFilter::Calendar.minute_options, @calendar.minute)) %>
|
43
|
+
:
|
44
|
+
<%= select_tag("wf_calendar_second", options_for_select(WillFilter::Calendar.second_options, @calendar.second)) %>
|
45
|
+
</div>
|
46
|
+
<%=link_to_function("<span>Set Date and Time</span>".html_safe, "wfCalendar.setDateTime()", :class => "wf_grey_button wf_pcb") %>
|
47
|
+
<%=link_to_function("<span>Cancel</span>".html_safe, "wfCalendar.hide()", :class => "wf_grey_button wf_pcb") %>
|
48
|
+
</div>
|
49
|
+
<% end %>
|
50
|
+
|
51
|
+
<% end %>
|
52
|
+
</div>
|
@@ -0,0 +1,129 @@
|
|
1
|
+
<table class='wf_paginator' style="margin-top:10px; margin-bottom:10px;">
|
2
|
+
<tr>
|
3
|
+
<td style='text-align:left'>
|
4
|
+
<%= will_paginate(results) %>
|
5
|
+
</td>
|
6
|
+
<td style='text-align:right'>
|
7
|
+
<%= page_entries_info(results) %>
|
8
|
+
</td>
|
9
|
+
</tr>
|
10
|
+
</table>
|
11
|
+
|
12
|
+
<table class='wf_results_table'>
|
13
|
+
<thead>
|
14
|
+
<tr>
|
15
|
+
<%
|
16
|
+
opts[:columns].each_with_index do |column, index|
|
17
|
+
if column.is_a?(Array)
|
18
|
+
key = column.first
|
19
|
+
elsif column.is_a?(Hash)
|
20
|
+
key = column[:key] || "key_#{index}"
|
21
|
+
else
|
22
|
+
key = column
|
23
|
+
end
|
24
|
+
|
25
|
+
style = ""
|
26
|
+
sort_direction = filter.column_sorted?(key) ? filter.order_type : "asc"
|
27
|
+
sort_direction_click = filter.column_sorted?(key) ? (sort_direction == "asc" ? "desc" : "asc") : "asc"
|
28
|
+
column_title = filter.condition_title_for(key)
|
29
|
+
the_class_name = key.to_s
|
30
|
+
the_class_name << " sortable" if filter.contains_column?(key)
|
31
|
+
the_class_name << " current_sort" if filter.column_sorted?(key)
|
32
|
+
the_class_name << " #{sort_direction}"
|
33
|
+
|
34
|
+
style << "width:15px" if key == :checkbox
|
35
|
+
%>
|
36
|
+
<th class="<%= the_class_name %>" style="<%=style%>">
|
37
|
+
<div class="table_head_container">
|
38
|
+
<% if filter.contains_column?(key) %>
|
39
|
+
<div class="sort_control">
|
40
|
+
<%= link_to "", filter.serialize_to_params(:wf_order => key, :wf_order_type => 'asc'), :title => "sort by #{key} ascending", :class => 'up' %>
|
41
|
+
<%= link_to "", filter.serialize_to_params(:wf_order => key, :wf_order_type => 'desc'), :title => "sort by #{key} descending", :class => 'down' %>
|
42
|
+
</div>
|
43
|
+
|
44
|
+
<%= link_to column_title, filter.serialize_to_params(:wf_order => key, :wf_order_type => sort_direction_click), :class => "sort_link" %>
|
45
|
+
<% elsif key == :checkbox %>
|
46
|
+
<%= check_box_tag("wf_check_all", "", false, :onClick => "wfCheckAll(this)") %>
|
47
|
+
<% else %>
|
48
|
+
<%= column_title %>
|
49
|
+
<% end %>
|
50
|
+
</div>
|
51
|
+
</th>
|
52
|
+
<% end %>
|
53
|
+
</tr>
|
54
|
+
</thead>
|
55
|
+
|
56
|
+
<tbody>
|
57
|
+
<% results.each_with_index do |obj, index| %>
|
58
|
+
<tr class='data_row <%=(index % 2 == 0) ? "wf_row_even" : "wf_row_odd"%>'>
|
59
|
+
<% opts[:columns].each_with_index do |column, column_index| %>
|
60
|
+
<%
|
61
|
+
style = 'padding:3px;'
|
62
|
+
if column.is_a?(Array)
|
63
|
+
key = column.first
|
64
|
+
if column.second.is_a?(Proc)
|
65
|
+
value = column.second.call(obj)
|
66
|
+
else
|
67
|
+
value = column.second.to_s
|
68
|
+
end
|
69
|
+
style << column.last if column.size > 2
|
70
|
+
|
71
|
+
elsif column.is_a?(Hash)
|
72
|
+
key = column[:key] || "key_#{column_index}"
|
73
|
+
if column[:value]
|
74
|
+
value = column[:value]
|
75
|
+
value = value.call(obj) if value.is_a?(Proc)
|
76
|
+
else
|
77
|
+
value = obj.send(key)
|
78
|
+
end
|
79
|
+
style << column[:style] if column[:style]
|
80
|
+
|
81
|
+
else
|
82
|
+
key = column
|
83
|
+
value = obj.send(key)
|
84
|
+
end
|
85
|
+
|
86
|
+
style << "padding-left:10px;" if key == :checkbox
|
87
|
+
%>
|
88
|
+
<td style='<%=style%>' <%= " class='current_sort'" if filter.column_sorted?(key) %>>
|
89
|
+
<% if key == :checkbox %>
|
90
|
+
<%= check_box_tag("#{value}[]", obj.id, false, :id => "wf_check_#{index}", :onClick => "wfVerifyTrigger(this)") %>
|
91
|
+
|
92
|
+
<% elsif value.is_a?(Hash) %>
|
93
|
+
<% value.each do |key, value| %>
|
94
|
+
<strong><%=key%>:</strong> <%= value %>;
|
95
|
+
<% end %>
|
96
|
+
|
97
|
+
<% elsif value.is_a?(Time) %>
|
98
|
+
<%= value.strftime("%m/%d/%Y %l:%M:%S") %>
|
99
|
+
|
100
|
+
<% elsif value.is_a?(Date) %>
|
101
|
+
<%= value.strftime("%m/%d/%Y") %>
|
102
|
+
|
103
|
+
<% else %>
|
104
|
+
<%= value.to_s %>
|
105
|
+
<% end %>
|
106
|
+
</td>
|
107
|
+
<% end %>
|
108
|
+
</tr>
|
109
|
+
<% end %>
|
110
|
+
</tbody>
|
111
|
+
</table>
|
112
|
+
|
113
|
+
<script>
|
114
|
+
function wfVerifyTrigger(check) {
|
115
|
+
if (!check.checked) {
|
116
|
+
var check_all = document.getElementById("wf_check_all");
|
117
|
+
check_all.checked = false;
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
function wfCheckAll(trigger) {
|
122
|
+
var index = 0;
|
123
|
+
var check = document.getElementById("wf_check_" + index);
|
124
|
+
while (check) {
|
125
|
+
check.checked = trigger.checked;
|
126
|
+
check = document.getElementById("wf_check_" + (++index));
|
127
|
+
}
|
128
|
+
}
|
129
|
+
</script>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<%= stylesheet_link_tag("/will_filter/stylesheets/will_filter.css") -%>
|
2
|
+
<%= javascript_include_tag("/will_filter/javascripts/will_filter.js") -%>
|
3
|
+
|
4
|
+
<% if WillFilter::Config.effects_options[:enabled] %>
|
5
|
+
<%= javascript_include_tag(WillFilter::Config.effects_options[:script_path]) -%>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<script>
|
9
|
+
initializeWillFilter();
|
10
|
+
</script>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
5
|
+
<title>Filter Export Data Table</title>
|
6
|
+
<%=will_filter_scripts_tag %>
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
<%= will_filter_table_tag(@wf_filter.results, :columns => @wf_filter.fields) %>
|
10
|
+
</body>
|
11
|
+
</html>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<div style="font-size:12px;font-weight:bold;">
|
2
|
+
<div style="float:right; padding-right:2px;">
|
3
|
+
<%=link_to_function(image_tag("/will_filter/images/close.gif", :title=>"Close"), "wfExporter.hide()")%>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
Exporter
|
7
|
+
</div>
|
8
|
+
<div class="wf_exporter_container">
|
9
|
+
<table style="width:100%" cellpadding="0px" cellspacing="0px;">
|
10
|
+
<tr>
|
11
|
+
<td>
|
12
|
+
<input type="checkbox" id="wf_fld_all" onClick="wfExporter.selectAllFields(this);" style="width:20px;">
|
13
|
+
</td>
|
14
|
+
<td>
|
15
|
+
<b>Name</b>
|
16
|
+
</td>
|
17
|
+
<td>
|
18
|
+
<b>Type</b>
|
19
|
+
</td>
|
20
|
+
</tr>
|
21
|
+
<tr>
|
22
|
+
<td colspan="3">
|
23
|
+
<hr style="width:100%">
|
24
|
+
</td>
|
25
|
+
</tr><% @wf_filter.model_class.columns.each_with_index do |col, index| %>
|
26
|
+
<tr>
|
27
|
+
<td>
|
28
|
+
<input type="checkbox" id="wf_fld_chk_<%=index%>" onClick="wfExporter.selectField(this);" style="width:20px;"><input type="hidden" id="wf_fld_name_<%=index%>" value="<%=col.name%>">
|
29
|
+
</td>
|
30
|
+
<td>
|
31
|
+
<%=col.name %>
|
32
|
+
</td>
|
33
|
+
<td>
|
34
|
+
<%=col.type %>
|
35
|
+
</td>
|
36
|
+
</tr>
|
37
|
+
<% end %>
|
38
|
+
</table>
|
39
|
+
<hr>
|
40
|
+
<div style="text-align:center; width:100%; padding:3px;">
|
41
|
+
Format: <%= select_tag("wf_export_format_selector", options_for_select(@wf_filter.export_formats, @wf_filter.format)) %>
|
42
|
+
</div>
|
43
|
+
<div style="text-align:center; width:100%; padding:3px;">
|
44
|
+
<%=link_to_function("<span>Export</span>".html_safe, "wfExporter.exportFilter()", :class => "wf_grey_button wf_pcb") %>
|
45
|
+
<%=link_to_function("<span>Cancel</span>".html_safe, "wfExporter.hide()", :class => "wf_grey_button wf_pcb") %>
|
46
|
+
</div>
|
47
|
+
</div>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<% if wf_filter.errors[index] %>
|
2
|
+
<tr>
|
3
|
+
<td colspan="2">
|
4
|
+
</td>
|
5
|
+
<td>
|
6
|
+
<div class="wf_condition_error">
|
7
|
+
<%= wf_filter.errors[index] %>
|
8
|
+
</div>
|
9
|
+
</td>
|
10
|
+
<td>
|
11
|
+
</td>
|
12
|
+
</tr>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<tr>
|
16
|
+
<td class="wf_condition" style="padding:2px;">
|
17
|
+
<%= select_tag "wf_c#{index}", options_for_select(wf_filter.condition_options, condition.key.to_s), {:class=>"wf_input", :style=>"width:100%;", :onChange=>"wfFilter.updateConditionAt('#{index}')"} %>
|
18
|
+
</td>
|
19
|
+
<td class="wf_operator" style="padding:2px;">
|
20
|
+
<%= select_tag "wf_o#{index}", options_for_select(wf_filter.operator_options_for(condition.key), condition.operator.to_s), {:class=>"wf_input", :style=>"width:100%;", :onChange=>"wfFilter.updateConditionAt('#{index}')"} %>
|
21
|
+
</td>
|
22
|
+
<td class="wf_values" style="padding:2px;">
|
23
|
+
<%= render :partial => "/will_filter/filter/containers/#{condition.container.template_name}", :locals => {:container => condition.container, :index => index} %>
|
24
|
+
</td>
|
25
|
+
<td class="wf_condition_actions" style="padding:0px;">
|
26
|
+
<%=link_to_function("<span>-</span>".html_safe, "wfFilter.removeConditionAt('#{index}')", :class => "wf_grey_button wf_pcb") %>
|
27
|
+
<%=link_to_function("<span>+</span>".html_safe, "wfFilter.addConditionAfter('#{index}')", :class => "wf_grey_button wf_pcb") %>
|
28
|
+
</td>
|
29
|
+
</tr>
|
30
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
<%= hidden_field_tag(:wf_id, wf_filter.id) %>
|
2
|
+
<%= hidden_field_tag(:wf_type, wf_filter.class.name) %>
|
3
|
+
<%= hidden_field_tag(:wf_dirty, "false") %>
|
4
|
+
<%= hidden_field_tag(:wf_submitted, "false") %>
|
5
|
+
<%= hidden_field_tag(:wf_name, wf_filter.name) %>
|
6
|
+
<%= hidden_field_tag(:wf_model, wf_filter.model_class_name) %>
|
7
|
+
<%= hidden_field_tag(:wf_export_format, "") %>
|
8
|
+
<%= hidden_field_tag(:wf_export_fields, "") %>
|
9
|
+
|
10
|
+
<div class="wf_header">
|
11
|
+
<% if wf_filter.show_save_options? %>
|
12
|
+
<div style="float:right;">
|
13
|
+
<%=link_to_function("<span>Save As New...</span>".html_safe, "wfFilter.saveFilter()", :class => "wf_grey_button wf_pcb") %>
|
14
|
+
<%=link_to_function("<span>Update</span>".html_safe, "wfFilter.updateFilter()", :class => "wf_grey_button wf_pcb") %>
|
15
|
+
<%=link_to_function("<span>Delete</span>".html_safe, "wfFilter.deleteFilter()", :class => "wf_grey_button wf_pcb") %>
|
16
|
+
<% if wf_filter.show_export_options? %>
|
17
|
+
<%=link_to_function("<span>Export Data...</span>".html_safe, "wfExporter.show(this)", :class => "wf_grey_button wf_pcb") %>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
<% end %>
|
21
|
+
<div style="font-weight:bold; font-size:18px;">
|
22
|
+
<% unless wf_filter.saved_filters.empty? %>
|
23
|
+
<%= select_tag(:wf_key, options_for_select(wf_filter.saved_filters, wf_filter.key), {:onChange=>"wfFilter.loadSavedFilter()"}) %>
|
24
|
+
<% end %>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<div class="wf_container_panel">
|
29
|
+
<% if wf_filter.errors[:filter] %>
|
30
|
+
<div class="wf_filter_error">
|
31
|
+
<%= wf_filter.errors[:filter] %>
|
32
|
+
</div>
|
33
|
+
<% end %>
|
34
|
+
|
35
|
+
<div style="padding:5px">
|
36
|
+
Match <%= select_tag(:wf_match, options_for_select(wf_filter.match_options, wf_filter.match), {:onChange=>"wfFilter.markDirty()"}) %>
|
37
|
+
of the following conditions:
|
38
|
+
</div>
|
39
|
+
|
40
|
+
<% if wf_filter.size == 0 %>
|
41
|
+
<div style="font-style:italic; padding:5px; color: black">
|
42
|
+
You haven't added any filter conditions, so all of the results were returned.
|
43
|
+
Use the "Add" button in the bottom left corner to add a new condition or select
|
44
|
+
a predefined filter from a drop-down list above.
|
45
|
+
</div>
|
46
|
+
<% else %>
|
47
|
+
<table class="wf_conditions_table" cellpadding="0" cellspacing="0">
|
48
|
+
<%
|
49
|
+
0.upto(wf_filter.size-1) do |index|
|
50
|
+
condition = wf_filter.condition_at(index)
|
51
|
+
%>
|
52
|
+
<%= render :partial => "/will_filter/filter/condition", :locals => {:wf_filter => wf_filter, :condition => condition, :index => index}%>
|
53
|
+
<% end %>
|
54
|
+
</table>
|
55
|
+
<% end %>
|
56
|
+
</div>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<%=will_filter_scripts_tag %>
|
2
|
+
|
3
|
+
<%= form_tag({}, {:method => :get, :name=>'wf_form', :id => 'wf_form', :class => 'wf_form' }) do %>
|
4
|
+
<div class="wf_container">
|
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="wf_footer">
|
10
|
+
<div style="float:right">
|
11
|
+
<%=link_to_function("Toggle Conditions", "wfFilter.toggleDebugger()", :style=>"font-size:9px") %>
|
12
|
+
|
13
|
+
Order:
|
14
|
+
<%= select_tag(:wf_order, options_for_select(wf_filter.condition_options, wf_filter.order), {:onChange=>"markDirty()"}) %>
|
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/images/spinner.gif", {:style=>"vertical-align:middle"} %> Loading...</span>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
|
27
|
+
<div id="wf_debugger" class="wf_debugger" style="display:none;">
|
28
|
+
<%= wf_filter.debug_sql_conditions %>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<div style='vertical-align:middle; text-align:left; padding-top:4px;'>
|
2
|
+
<input type='radio' style='width:20px' name='wf_v<%=index%>_0' id='wf_v<%=index%>_0' onChange='wfFilter.fieldChanged(this)' value='1' <%='checked' if container.value == '1' %>> True
|
3
|
+
|
4
|
+
<input type='radio' style='width:20px' name='wf_v<%=index%>_0' id='wf_v<%=index%>_0' onChange='wfFilter.fieldChanged(this)' value='0' <%='checked' if container.value == '0' %>> False
|
5
|
+
</div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<table class='wf_values_table' cellspacing='0px' cellpadding='0px'>
|
2
|
+
<tr>
|
3
|
+
<td width='99%'>
|
4
|
+
<input type='text' style='width:99%;' class='wf_input' name='wf_v<%=index%>_0' id='wf_v<%=index%>_0' onChange='wfFilter.fieldChanged(this)' value='<%=container.sanitized_value%>'>
|
5
|
+
</td>
|
6
|
+
<td width='1%'>
|
7
|
+
<a href="#" onclick="wfCalendar.selectDate('wf_v<%=index%>_0', this); return false;">
|
8
|
+
<img align="top" title="select date" border="0" class="wf_calendar_trigger" src="/will_filter/images/calendar.png" />
|
9
|
+
</a>
|
10
|
+
</td>
|
11
|
+
</tr>
|
12
|
+
</table>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<table class='wf_values_table' cellspacing='0px' cellpadding='0px'>
|
2
|
+
<tr>
|
3
|
+
<td width='49%'>
|
4
|
+
<input type='text' style='width:99%;' class='wf_input' name='wf_v<%=index%>_0' id='wf_v<%=index%>_0' onChange='wfFilter.fieldChanged(this)' value='<%=container.sanitized_value(0)%>'>
|
5
|
+
</td>
|
6
|
+
<td width='1%'>
|
7
|
+
<a href="#" onclick="wfCalendar.selectDate('wf_v<%=index%>_0', this); return false;">
|
8
|
+
<img align="top" title="select date" border="0" class="wf_calendar_trigger" src="/will_filter/images/calendar.png" />
|
9
|
+
</a>
|
10
|
+
</td>
|
11
|
+
<td width='49%'>
|
12
|
+
<input type='text' style='width:99%;' class='wf_input' name='wf_v<%=index%>_1' id='wf_v<%=index%>_1' onChange='wfFilter.fieldChanged(this)' value='<%=container.sanitized_value(1)%>'>
|
13
|
+
</td>
|
14
|
+
<td width='1%'>
|
15
|
+
<a href="#" onclick="wfCalendar.selectDate('wf_v<%=index%>_1', this); return false;">
|
16
|
+
<img align="top" title="select date" border="0" class="wf_calendar_trigger" src="/will_filter/images/calendar.png" />
|
17
|
+
</a>
|
18
|
+
</td>
|
19
|
+
</tr>
|
20
|
+
</table>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<table class='wf_values_table' cellspacing='0px' cellpadding='0px'>
|
2
|
+
<tr>
|
3
|
+
<td width='99%'>
|
4
|
+
<input type='text' style='width:99%;' class='wf_input' name='wf_v<%=index%>_0' id='wf_v<%=index%>_0' onChange='wfFilter.fieldChanged(this)' value='<%=container.sanitized_value%>'>
|
5
|
+
</td>
|
6
|
+
<td width='1%'>
|
7
|
+
<a href="#" onclick="wfCalendar.selectDateTime('wf_v<%=index%>_0', this); return false;">
|
8
|
+
<img align="top" title="select date & time" border="0" class="wf_calendar_trigger" src="/will_filter/images/clock.png" />
|
9
|
+
</a>
|
10
|
+
</td>
|
11
|
+
</tr>
|
12
|
+
</table>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<table class='wf_values_table' cellspacing='0px' cellpadding='0px'>
|
2
|
+
<tr>
|
3
|
+
<td width='49%'>
|
4
|
+
<input type='text' style='width:99%;' class='wf_input' name='wf_v<%=index%>_0' id='wf_v<%=index%>_0' onChange='wfFilter.fieldChanged(this)' value='<%=container.sanitized_value(0)%>'>
|
5
|
+
</td>
|
6
|
+
<td width='1%'>
|
7
|
+
<a href="#" onclick="wfCalendar.selectDateTime('wf_v<%=index%>_0', this); return false;">
|
8
|
+
<img align="top" title="select start date & time" border="0" class="wf_calendar_trigger" src="/will_filter/images/clock.png" />
|
9
|
+
</a>
|
10
|
+
</td>
|
11
|
+
<td width='49%'>
|
12
|
+
<input type='text' style='width:99%;' class='wf_input' name='wf_v<%=index%>_1' id='wf_v<%=index%>_1' onChange='wfFilter.fieldChanged(this)' value='<%=container.sanitized_value(1)%>'>
|
13
|
+
</td>
|
14
|
+
<td width='1%'>
|
15
|
+
<a href="#" onclick="wfCalendar.selectDateTime('wf_v<%=index%>_1', this); return false;">
|
16
|
+
<img align="top" title="select end date & time" border="0" class="wf_calendar_trigger" src="/will_filter/images/clock.png" />
|
17
|
+
</a>
|
18
|
+
</td>
|
19
|
+
</tr>
|
20
|
+
</table>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<select style='width:100%' class='wf_input' name='wf_v<%=index%>_0' id='wf_v<%=index%>_0' onChange='wfFilter.fieldChanged(this)'>
|
2
|
+
<% container.options.each do |option| %>
|
3
|
+
<option <%= "selected" if option.last == container.value %> value="<%=option.last%>">
|
4
|
+
<%=option.first%>
|
5
|
+
</option>
|
6
|
+
<% end %>
|
7
|
+
</select>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<table class='wf_values_table' cellspacing='0px' cellpadding='0px'>
|
2
|
+
<tr>
|
3
|
+
<td width='49%'>
|
4
|
+
<input type='text' style='width:99%;' class='wf_input' name='wf_v<%=index%>_0' id='wf_v<%=index%>_0' onChange='wfFilter.fieldChanged(this)' value='<%=container.sanitized_value(0)%>'>
|
5
|
+
</td>
|
6
|
+
<td width='2%'>
|
7
|
+
|
8
|
+
</td>
|
9
|
+
<td width='49%'>
|
10
|
+
<input type='text' style='width:99%;' class='wf_input' name='wf_v<%=index%>_1' id='wf_v<%=index%>_1' onChange='wfFilter.fieldChanged(this)' value='<%=container.sanitized_value(1)%>'>
|
11
|
+
</td>
|
12
|
+
</tr>
|
13
|
+
</table>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<table class='wf_values_table' cellspacing='0px' cellpadding='0px'>
|
2
|
+
<tr>
|
3
|
+
<td width='99%'>
|
4
|
+
<input type='text' style='width:99%;' class='wf_input' name='wf_v<%=index%>_0' id='wf_v<%=index%>_0' onChange='wfFilter.fieldChanged(this)' value='<%=container.sanitized_value%>'>
|
5
|
+
</td>
|
6
|
+
</tr>
|
7
|
+
</table>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require 'rails/all'
|
4
|
+
require 'pp'
|
5
|
+
|
6
|
+
# If you have a Gemfile, require the gems listed there, including any gems
|
7
|
+
# you've limited to :test, :development, or :production.
|
8
|
+
Bundler.require(:default, Rails.env) if defined?(Bundler)
|
9
|
+
|
10
|
+
module WillFilter
|
11
|
+
class Application < Rails::Application
|
12
|
+
# Settings in config/environments/* take precedence over those specified here.
|
13
|
+
# Application configuration should go into files in config/initializers
|
14
|
+
# -- all .rb files in that directory are automatically loaded.
|
15
|
+
|
16
|
+
# Custom directories with classes and modules you want to be autoloadable.
|
17
|
+
# config.autoload_paths += %W(#{config.root}/extras)
|
18
|
+
|
19
|
+
# Only load the plugins named here, in the order given (default is alphabetical).
|
20
|
+
# :all can be used as a placeholder for all plugins not explicitly named.
|
21
|
+
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
22
|
+
|
23
|
+
# Activate observers that should always be running.
|
24
|
+
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
25
|
+
|
26
|
+
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
27
|
+
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
28
|
+
# config.time_zone = 'Central Time (US & Canada)'
|
29
|
+
|
30
|
+
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
31
|
+
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
32
|
+
# config.i18n.default_locale = :de
|
33
|
+
|
34
|
+
# JavaScript files you want as :defaults (application.js is always included).
|
35
|
+
# config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
|
36
|
+
|
37
|
+
# Configure the default encoding used in templates for Ruby 1.9.
|
38
|
+
config.encoding = "utf-8"
|
39
|
+
|
40
|
+
# Configure sensitive parameters which will be filtered from the log file.
|
41
|
+
config.filter_parameters += [:password]
|
42
|
+
config.session_store :active_record_store
|
43
|
+
config.secret_token = 'ba8e7d52f10084c758887c56815e894f32aef79496ecb2ed9ab9458a0bd37b33d6d2bace4a2c1cd828e4aaf347a5b23fe1c9c14ef11c7c9ad950207022902003'
|
44
|
+
end
|
45
|
+
end
|
data/config/boot.rb
ADDED
data/config/database.yml
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# SQLite version 3.x
|
2
|
+
# gem install sqlite3
|
3
|
+
development:
|
4
|
+
adapter: sqlite3
|
5
|
+
database: db/development.sqlite3
|
6
|
+
pool: 5
|
7
|
+
timeout: 5000
|
8
|
+
|
9
|
+
# Warning: The database defined as "test" will be erased and
|
10
|
+
# re-generated from your development database when you run "rake".
|
11
|
+
# Do not set this db to the same as development or production.
|
12
|
+
test:
|
13
|
+
adapter: sqlite3
|
14
|
+
database: db/test.sqlite3
|
15
|
+
pool: 5
|
16
|
+
timeout: 5000
|
17
|
+
|
18
|
+
production:
|
19
|
+
adapter: sqlite3
|
20
|
+
database: db/production.sqlite3
|
21
|
+
pool: 5
|
22
|
+
timeout: 5000
|