@@ -1029,6 +1029,11 module ApplicationHelper | |||||
1029 | content_tag(:a, name, {:href => '#', :onclick => "#{function}; return false;"}.merge(html_options)) |
|
1029 | content_tag(:a, name, {:href => '#', :onclick => "#{function}; return false;"}.merge(html_options)) | |
1030 | end |
|
1030 | end | |
1031 |
|
1031 | |||
|
1032 | # Helper to render JSON in views | |||
|
1033 | def raw_json(arg) | |||
|
1034 | arg.to_json.to_s.gsub('/', '\/').html_safe | |||
|
1035 | end | |||
|
1036 | ||||
1032 | def back_url |
|
1037 | def back_url | |
1033 | url = params[:back_url] |
|
1038 | url = params[:back_url] | |
1034 | if url.nil? && referer = request.env['HTTP_REFERER'] |
|
1039 | if url.nil? && referer = request.env['HTTP_REFERER'] |
@@ -1,12 +1,12 | |||||
1 | <%= javascript_tag do %> |
|
1 | <%= javascript_tag do %> | |
2 |
var operatorLabels = <%= raw Query.operators_labels |
|
2 | var operatorLabels = <%= raw_json Query.operators_labels %>; | |
3 |
var operatorByType = <%= raw Query.operators_by_filter_type |
|
3 | var operatorByType = <%= raw_json Query.operators_by_filter_type %>; | |
4 |
var availableFilters = <%= raw query.available_filters_as |
|
4 | var availableFilters = <%= raw_json query.available_filters_as_json %>; | |
5 |
var labelDayPlural = |
|
5 | var labelDayPlural = <%= raw_json l(:label_day_plural) %>; | |
6 | $(document).ready(function(){ |
|
6 | $(document).ready(function(){ | |
7 | initFilters(); |
|
7 | initFilters(); | |
8 | <% query.filters.each do |field, options| %> |
|
8 | <% query.filters.each do |field, options| %> | |
9 |
addFilter("<%= field %>", <%= raw query.operator_for(field) |
|
9 | addFilter("<%= field %>", <%= raw_json query.operator_for(field) %>, <%= raw_json query.values_for(field) %>); | |
10 | <% end %> |
|
10 | <% end %> | |
11 | }); |
|
11 | }); | |
12 | <% end %> |
|
12 | <% end %> |
@@ -163,9 +163,9 function buildFilterRow(field, operator, values) { | |||||
163 | case "date": |
|
163 | case "date": | |
164 | case "date_past": |
|
164 | case "date_past": | |
165 | tr.find('td.values').append( |
|
165 | tr.find('td.values').append( | |
166 |
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" |
|
166 | '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" /></span>' + | |
167 |
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" |
|
167 | ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" /></span>' + | |
168 |
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" |
|
168 | ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" /> '+labelDayPlural+'</span>' | |
169 | ); |
|
169 | ); | |
170 | $('#values_'+fieldId+'_1').val(values[0]).datepicker(datepickerOptions); |
|
170 | $('#values_'+fieldId+'_1').val(values[0]).datepicker(datepickerOptions); | |
171 | $('#values_'+fieldId+'_2').val(values[1]).datepicker(datepickerOptions); |
|
171 | $('#values_'+fieldId+'_2').val(values[1]).datepicker(datepickerOptions); | |
@@ -174,15 +174,15 function buildFilterRow(field, operator, values) { | |||||
174 | case "string": |
|
174 | case "string": | |
175 | case "text": |
|
175 | case "text": | |
176 | tr.find('td.values').append( |
|
176 | tr.find('td.values').append( | |
177 |
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="30" class="value" |
|
177 | '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="30" class="value" /></span>' | |
178 | ); |
|
178 | ); | |
179 | $('#values_'+fieldId).val(values[0]); |
|
179 | $('#values_'+fieldId).val(values[0]); | |
180 | break; |
|
180 | break; | |
181 | case "integer": |
|
181 | case "integer": | |
182 | case "float": |
|
182 | case "float": | |
183 | tr.find('td.values').append( |
|
183 | tr.find('td.values').append( | |
184 |
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="6" class="value" |
|
184 | '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="6" class="value" /></span>' + | |
185 |
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="6" class="value" |
|
185 | ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="6" class="value" /></span>' | |
186 | ); |
|
186 | ); | |
187 | $('#values_'+fieldId+'_1').val(values[0]); |
|
187 | $('#values_'+fieldId+'_1').val(values[0]); | |
188 | $('#values_'+fieldId+'_2').val(values[1]); |
|
188 | $('#values_'+fieldId+'_2').val(values[1]); |
@@ -273,4 +273,12 class QueriesControllerTest < ActionController::TestCase | |||||
273 | assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :set_filter => 1, :query_id => nil |
|
273 | assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :set_filter => 1, :query_id => nil | |
274 | assert_nil Query.find_by_id(1) |
|
274 | assert_nil Query.find_by_id(1) | |
275 | end |
|
275 | end | |
|
276 | ||||
|
277 | def test_backslash_should_be_escaped_in_filters | |||
|
278 | @request.session[:user_id] = 2 | |||
|
279 | get :new, :subject => 'foo/bar' | |||
|
280 | assert_response :success | |||
|
281 | assert_template 'new' | |||
|
282 | assert_include 'addFilter("subject", "=", ["foo\/bar"]);', response.body | |||
|
283 | end | |||
276 | end |
|
284 | end |
General Comments 0
You need to be logged in to leave comments.
Login now