Commit 00299ccc37e71f5a8f31b510c1f5b617aa9dfca0
1 parent
f9ed0cce
Exists in
master
and in
27 other branches
rails3: fix integration tests
Showing
12 changed files
with
413 additions
and
16 deletions
Show diff stats
app/helpers/application_helper.rb
| @@ -678,7 +678,7 @@ module ApplicationHelper | @@ -678,7 +678,7 @@ module ApplicationHelper | ||
| 678 | lightbox_link_to '<span class="icon-menu-search"></span>'+ _('Search'), { | 678 | lightbox_link_to '<span class="icon-menu-search"></span>'+ _('Search'), { |
| 679 | :controller => 'search', | 679 | :controller => 'search', |
| 680 | :action => 'popup', | 680 | :action => 'popup', |
| 681 | - :category_path => (@category ? @category.explode_path : []) }, | 681 | + :category_path => (@category ? @category.explode_path : nil)}, |
| 682 | :id => 'open_search' | 682 | :id => 'open_search' |
| 683 | end | 683 | end |
| 684 | end | 684 | end |
| @@ -1073,7 +1073,7 @@ module ApplicationHelper | @@ -1073,7 +1073,7 @@ module ApplicationHelper | ||
| 1073 | links.push(_('New content') => colorbox_options({:href => url_for({:controller => 'cms', :action => 'new', :profile => current_user.login, :cms => true})})) | 1073 | links.push(_('New content') => colorbox_options({:href => url_for({:controller => 'cms', :action => 'new', :profile => current_user.login, :cms => true})})) |
| 1074 | end | 1074 | end |
| 1075 | 1075 | ||
| 1076 | - link_to(content_tag(:span, _('Contents'), :class => 'icon-menu-articles'), {:controller => "search", :action => 'contents', :category_path => ''}, :id => 'submenu-contents') + | 1076 | + link_to(content_tag(:span, _('Contents'), :class => 'icon-menu-articles'), {:controller => "search", :action => 'contents', :category_path => nil}, :id => 'submenu-contents') + |
| 1077 | link_to(content_tag(:span, _('Contents menu')), '#', :onclick => "toggleSubmenu(this,'',#{j links.to_json}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-contents-trigger') | 1077 | link_to(content_tag(:span, _('Contents menu')), '#', :onclick => "toggleSubmenu(this,'',#{j links.to_json}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-contents-trigger') |
| 1078 | end | 1078 | end |
| 1079 | alias :browse_contents_menu :search_contents_menu | 1079 | alias :browse_contents_menu :search_contents_menu |
app/models/category.rb
| 1 | class Category < ActiveRecord::Base | 1 | class Category < ActiveRecord::Base |
| 2 | 2 | ||
| 3 | - attr_accessible :name, :parent_id, :display_color, :display_in_menu, :image_builder, :environment | 3 | + attr_accessible :name, :parent_id, :display_color, :display_in_menu, :image_builder, :environment, :parent |
| 4 | 4 | ||
| 5 | SEARCHABLE_FIELDS = { | 5 | SEARCHABLE_FIELDS = { |
| 6 | :name => 10, | 6 | :name => 10, |
app/views/layouts/_javascript.html.erb
| @@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
| 3 | 'jquery-ui-1.8.2.custom.min', 'jquery.scrollTo', 'jquery.form.js', 'jquery-validation/jquery.validate', | 3 | 'jquery-ui-1.8.2.custom.min', 'jquery.scrollTo', 'jquery.form.js', 'jquery-validation/jquery.validate', |
| 4 | 'jquery.cookie', 'jquery.ba-bbq.min.js', 'reflection', 'jquery.tokeninput', | 4 | 'jquery.cookie', 'jquery.ba-bbq.min.js', 'reflection', 'jquery.tokeninput', |
| 5 | 'add-and-join', 'report-abuse', 'catalog', 'manage-products', | 5 | 'add-and-join', 'report-abuse', 'catalog', 'manage-products', |
| 6 | -'jquery-ui-timepicker-addon', 'application.js', :cache => 'cache-general' %> | 6 | +'jquery-ui-timepicker-addon', 'application.js', 'rails.js', :cache => 'cache-general' %> |
| 7 | 7 | ||
| 8 | <% language = FastGettext.locale %> | 8 | <% language = FastGettext.locale %> |
| 9 | <% %w{messages methods}.each do |type| %> | 9 | <% %w{messages methods}.each do |type| %> |
config/routes.rb
| @@ -125,7 +125,7 @@ Noosfero::Application.routes.draw do | @@ -125,7 +125,7 @@ Noosfero::Application.routes.draw do | ||
| 125 | # cache stuff - hack | 125 | # cache stuff - hack |
| 126 | match 'public/:action/:id', :controller => 'public' | 126 | match 'public/:action/:id', :controller => 'public' |
| 127 | 127 | ||
| 128 | - match ':profile/*page/versions', :controller => 'content_viewer', :action => 'article_versions', :profile => /#{Noosfero.identifier_format}/, :conditions => { :if => lambda { |env| !Domain.hosting_profile_at(env[:host]) } } | 128 | + match ':profile/*page/versions', :controller => 'content_viewer', :action => 'article_versions', :profile => /#{Noosfero.identifier_format}/, :constraints => EnvironmentDomainConstraint.new |
| 129 | match '*page/versions', :controller => 'content_viewer', :action => 'article_versions' | 129 | match '*page/versions', :controller => 'content_viewer', :action => 'article_versions' |
| 130 | 130 | ||
| 131 | # match requests for profiles that don't have a custom domain | 131 | # match requests for profiles that don't have a custom domain |
| @@ -0,0 +1,398 @@ | @@ -0,0 +1,398 @@ | ||
| 1 | +(function($, undefined) { | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * Unobtrusive scripting adapter for jQuery | ||
| 5 | + * https://github.com/rails/jquery-ujs | ||
| 6 | + * | ||
| 7 | + * Requires jQuery 1.7.0 or later. | ||
| 8 | + * | ||
| 9 | + * Released under the MIT license | ||
| 10 | + * | ||
| 11 | + */ | ||
| 12 | + | ||
| 13 | + // Cut down on the number of issues from people inadvertently including jquery_ujs twice | ||
| 14 | + // by detecting and raising an error when it happens. | ||
| 15 | + if ( $.rails !== undefined ) { | ||
| 16 | + $.error('jquery-ujs has already been loaded!'); | ||
| 17 | + } | ||
| 18 | + | ||
| 19 | + // Shorthand to make it a little easier to call public rails functions from within rails.js | ||
| 20 | + var rails; | ||
| 21 | + var $document = $(document); | ||
| 22 | + | ||
| 23 | + $.rails = rails = { | ||
| 24 | + // Link elements bound by jquery-ujs | ||
| 25 | + linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote], a[data-disable-with]', | ||
| 26 | + | ||
| 27 | + // Button elements bound by jquery-ujs | ||
| 28 | + buttonClickSelector: 'button[data-remote]', | ||
| 29 | + | ||
| 30 | + // Select elements bound by jquery-ujs | ||
| 31 | + inputChangeSelector: 'select[data-remote], input[data-remote], textarea[data-remote]', | ||
| 32 | + | ||
| 33 | + // Form elements bound by jquery-ujs | ||
| 34 | + formSubmitSelector: 'form', | ||
| 35 | + | ||
| 36 | + // Form input elements bound by jquery-ujs | ||
| 37 | + formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type])', | ||
| 38 | + | ||
| 39 | + // Form input elements disabled during form submission | ||
| 40 | + disableSelector: 'input[data-disable-with], button[data-disable-with], textarea[data-disable-with]', | ||
| 41 | + | ||
| 42 | + // Form input elements re-enabled after form submission | ||
| 43 | + enableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled', | ||
| 44 | + | ||
| 45 | + // Form required input elements | ||
| 46 | + requiredInputSelector: 'input[name][required]:not([disabled]),textarea[name][required]:not([disabled])', | ||
| 47 | + | ||
| 48 | + // Form file input elements | ||
| 49 | + fileInputSelector: 'input[type=file]', | ||
| 50 | + | ||
| 51 | + // Link onClick disable selector with possible reenable after remote submission | ||
| 52 | + linkDisableSelector: 'a[data-disable-with]', | ||
| 53 | + | ||
| 54 | + // Make sure that every Ajax request sends the CSRF token | ||
| 55 | + CSRFProtection: function(xhr) { | ||
| 56 | + var token = $('meta[name="csrf-token"]').attr('content'); | ||
| 57 | + if (token) xhr.setRequestHeader('X-CSRF-Token', token); | ||
| 58 | + }, | ||
| 59 | + | ||
| 60 | + // making sure that all forms have actual up-to-date token(cached forms contain old one) | ||
| 61 | + refreshCSRFTokens: function(){ | ||
| 62 | + var csrfToken = $('meta[name=csrf-token]').attr('content'); | ||
| 63 | + var csrfParam = $('meta[name=csrf-param]').attr('content'); | ||
| 64 | + $('form input[name="' + csrfParam + '"]').val(csrfToken); | ||
| 65 | + }, | ||
| 66 | + | ||
| 67 | + // Triggers an event on an element and returns false if the event result is false | ||
| 68 | + fire: function(obj, name, data) { | ||
| 69 | + var event = $.Event(name); | ||
| 70 | + obj.trigger(event, data); | ||
| 71 | + return event.result !== false; | ||
| 72 | + }, | ||
| 73 | + | ||
| 74 | + // Default confirm dialog, may be overridden with custom confirm dialog in $.rails.confirm | ||
| 75 | + confirm: function(message) { | ||
| 76 | + return confirm(message); | ||
| 77 | + }, | ||
| 78 | + | ||
| 79 | + // Default ajax function, may be overridden with custom function in $.rails.ajax | ||
| 80 | + ajax: function(options) { | ||
| 81 | + return $.ajax(options); | ||
| 82 | + }, | ||
| 83 | + | ||
| 84 | + // Default way to get an element's href. May be overridden at $.rails.href. | ||
| 85 | + href: function(element) { | ||
| 86 | + return element.attr('href'); | ||
| 87 | + }, | ||
| 88 | + | ||
| 89 | + // Submits "remote" forms and links with ajax | ||
| 90 | + handleRemote: function(element) { | ||
| 91 | + var method, url, data, elCrossDomain, crossDomain, withCredentials, dataType, options; | ||
| 92 | + | ||
| 93 | + if (rails.fire(element, 'ajax:before')) { | ||
| 94 | + elCrossDomain = element.data('cross-domain'); | ||
| 95 | + crossDomain = elCrossDomain === undefined ? null : elCrossDomain; | ||
| 96 | + withCredentials = element.data('with-credentials') || null; | ||
| 97 | + dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); | ||
| 98 | + | ||
| 99 | + if (element.is('form')) { | ||
| 100 | + method = element.attr('method'); | ||
| 101 | + url = element.attr('action'); | ||
| 102 | + data = element.serializeArray(); | ||
| 103 | + // memoized value from clicked submit button | ||
| 104 | + var button = element.data('ujs:submit-button'); | ||
| 105 | + if (button) { | ||
| 106 | + data.push(button); | ||
| 107 | + element.data('ujs:submit-button', null); | ||
| 108 | + } | ||
| 109 | + } else if (element.is(rails.inputChangeSelector)) { | ||
| 110 | + method = element.data('method'); | ||
| 111 | + url = element.data('url'); | ||
| 112 | + data = element.serialize(); | ||
| 113 | + if (element.data('params')) data = data + "&" + element.data('params'); | ||
| 114 | + } else if (element.is(rails.buttonClickSelector)) { | ||
| 115 | + method = element.data('method') || 'get'; | ||
| 116 | + url = element.data('url'); | ||
| 117 | + data = element.serialize(); | ||
| 118 | + if (element.data('params')) data = data + "&" + element.data('params'); | ||
| 119 | + } else { | ||
| 120 | + method = element.data('method'); | ||
| 121 | + url = rails.href(element); | ||
| 122 | + data = element.data('params') || null; | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + options = { | ||
| 126 | + type: method || 'GET', data: data, dataType: dataType, | ||
| 127 | + // stopping the "ajax:beforeSend" event will cancel the ajax request | ||
| 128 | + beforeSend: function(xhr, settings) { | ||
| 129 | + if (settings.dataType === undefined) { | ||
| 130 | + xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script); | ||
| 131 | + } | ||
| 132 | + return rails.fire(element, 'ajax:beforeSend', [xhr, settings]); | ||
| 133 | + }, | ||
| 134 | + success: function(data, status, xhr) { | ||
| 135 | + element.trigger('ajax:success', [data, status, xhr]); | ||
| 136 | + }, | ||
| 137 | + complete: function(xhr, status) { | ||
| 138 | + element.trigger('ajax:complete', [xhr, status]); | ||
| 139 | + }, | ||
| 140 | + error: function(xhr, status, error) { | ||
| 141 | + element.trigger('ajax:error', [xhr, status, error]); | ||
| 142 | + }, | ||
| 143 | + crossDomain: crossDomain | ||
| 144 | + }; | ||
| 145 | + | ||
| 146 | + // There is no withCredentials for IE6-8 when | ||
| 147 | + // "Enable native XMLHTTP support" is disabled | ||
| 148 | + if (withCredentials) { | ||
| 149 | + options.xhrFields = { | ||
| 150 | + withCredentials: withCredentials | ||
| 151 | + }; | ||
| 152 | + } | ||
| 153 | + | ||
| 154 | + // Only pass url to `ajax` options if not blank | ||
| 155 | + if (url) { options.url = url; } | ||
| 156 | + | ||
| 157 | + var jqxhr = rails.ajax(options); | ||
| 158 | + element.trigger('ajax:send', jqxhr); | ||
| 159 | + return jqxhr; | ||
| 160 | + } else { | ||
| 161 | + return false; | ||
| 162 | + } | ||
| 163 | + }, | ||
| 164 | + | ||
| 165 | + // Handles "data-method" on links such as: | ||
| 166 | + // <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a> | ||
| 167 | + handleMethod: function(link) { | ||
| 168 | + var href = rails.href(link), | ||
| 169 | + method = link.data('method'), | ||
| 170 | + target = link.attr('target'), | ||
| 171 | + csrfToken = $('meta[name=csrf-token]').attr('content'), | ||
| 172 | + csrfParam = $('meta[name=csrf-param]').attr('content'), | ||
| 173 | + form = $('<form method="post" action="' + href + '"></form>'), | ||
| 174 | + metadataInput = '<input name="_method" value="' + method + '" type="hidden" />'; | ||
| 175 | + | ||
| 176 | + if (csrfParam !== undefined && csrfToken !== undefined) { | ||
| 177 | + metadataInput += '<input name="' + csrfParam + '" value="' + csrfToken + '" type="hidden" />'; | ||
| 178 | + } | ||
| 179 | + | ||
| 180 | + if (target) { form.attr('target', target); } | ||
| 181 | + | ||
| 182 | + form.hide().append(metadataInput).appendTo('body'); | ||
| 183 | + form.submit(); | ||
| 184 | + }, | ||
| 185 | + | ||
| 186 | + /* Disables form elements: | ||
| 187 | + - Caches element value in 'ujs:enable-with' data store | ||
| 188 | + - Replaces element text with value of 'data-disable-with' attribute | ||
| 189 | + - Sets disabled property to true | ||
| 190 | + */ | ||
| 191 | + disableFormElements: function(form) { | ||
| 192 | + form.find(rails.disableSelector).each(function() { | ||
| 193 | + var element = $(this), method = element.is('button') ? 'html' : 'val'; | ||
| 194 | + element.data('ujs:enable-with', element[method]()); | ||
| 195 | + element[method](element.data('disable-with')); | ||
| 196 | + element.prop('disabled', true); | ||
| 197 | + }); | ||
| 198 | + }, | ||
| 199 | + | ||
| 200 | + /* Re-enables disabled form elements: | ||
| 201 | + - Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`) | ||
| 202 | + - Sets disabled property to false | ||
| 203 | + */ | ||
| 204 | + enableFormElements: function(form) { | ||
| 205 | + form.find(rails.enableSelector).each(function() { | ||
| 206 | + var element = $(this), method = element.is('button') ? 'html' : 'val'; | ||
| 207 | + if (element.data('ujs:enable-with')) element[method](element.data('ujs:enable-with')); | ||
| 208 | + element.prop('disabled', false); | ||
| 209 | + }); | ||
| 210 | + }, | ||
| 211 | + | ||
| 212 | + /* For 'data-confirm' attribute: | ||
| 213 | + - Fires `confirm` event | ||
| 214 | + - Shows the confirmation dialog | ||
| 215 | + - Fires the `confirm:complete` event | ||
| 216 | + | ||
| 217 | + Returns `true` if no function stops the chain and user chose yes; `false` otherwise. | ||
| 218 | + Attaching a handler to the element's `confirm` event that returns a `falsy` value cancels the confirmation dialog. | ||
| 219 | + Attaching a handler to the element's `confirm:complete` event that returns a `falsy` value makes this function | ||
| 220 | + return false. The `confirm:complete` event is fired whether or not the user answered true or false to the dialog. | ||
| 221 | + */ | ||
| 222 | + allowAction: function(element) { | ||
| 223 | + var message = element.data('confirm'), | ||
| 224 | + answer = false, callback; | ||
| 225 | + if (!message) { return true; } | ||
| 226 | + | ||
| 227 | + if (rails.fire(element, 'confirm')) { | ||
| 228 | + answer = rails.confirm(message); | ||
| 229 | + callback = rails.fire(element, 'confirm:complete', [answer]); | ||
| 230 | + } | ||
| 231 | + return answer && callback; | ||
| 232 | + }, | ||
| 233 | + | ||
| 234 | + // Helper function which checks for blank inputs in a form that match the specified CSS selector | ||
| 235 | + blankInputs: function(form, specifiedSelector, nonBlank) { | ||
| 236 | + var inputs = $(), input, valueToCheck, | ||
| 237 | + selector = specifiedSelector || 'input,textarea', | ||
| 238 | + allInputs = form.find(selector); | ||
| 239 | + | ||
| 240 | + allInputs.each(function() { | ||
| 241 | + input = $(this); | ||
| 242 | + valueToCheck = input.is('input[type=checkbox],input[type=radio]') ? input.is(':checked') : input.val(); | ||
| 243 | + // If nonBlank and valueToCheck are both truthy, or nonBlank and valueToCheck are both falsey | ||
| 244 | + if (!valueToCheck === !nonBlank) { | ||
| 245 | + | ||
| 246 | + // Don't count unchecked required radio if other radio with same name is checked | ||
| 247 | + if (input.is('input[type=radio]') && allInputs.filter('input[type=radio]:checked[name="' + input.attr('name') + '"]').length) { | ||
| 248 | + return true; // Skip to next input | ||
| 249 | + } | ||
| 250 | + | ||
| 251 | + inputs = inputs.add(input); | ||
| 252 | + } | ||
| 253 | + }); | ||
| 254 | + return inputs.length ? inputs : false; | ||
| 255 | + }, | ||
| 256 | + | ||
| 257 | + // Helper function which checks for non-blank inputs in a form that match the specified CSS selector | ||
| 258 | + nonBlankInputs: function(form, specifiedSelector) { | ||
| 259 | + return rails.blankInputs(form, specifiedSelector, true); // true specifies nonBlank | ||
| 260 | + }, | ||
| 261 | + | ||
| 262 | + // Helper function, needed to provide consistent behavior in IE | ||
| 263 | + stopEverything: function(e) { | ||
| 264 | + $(e.target).trigger('ujs:everythingStopped'); | ||
| 265 | + e.stopImmediatePropagation(); | ||
| 266 | + return false; | ||
| 267 | + }, | ||
| 268 | + | ||
| 269 | + // replace element's html with the 'data-disable-with' after storing original html | ||
| 270 | + // and prevent clicking on it | ||
| 271 | + disableElement: function(element) { | ||
| 272 | + element.data('ujs:enable-with', element.html()); // store enabled state | ||
| 273 | + element.html(element.data('disable-with')); // set to disabled state | ||
| 274 | + element.bind('click.railsDisable', function(e) { // prevent further clicking | ||
| 275 | + return rails.stopEverything(e); | ||
| 276 | + }); | ||
| 277 | + }, | ||
| 278 | + | ||
| 279 | + // restore element to its original state which was disabled by 'disableElement' above | ||
| 280 | + enableElement: function(element) { | ||
| 281 | + if (element.data('ujs:enable-with') !== undefined) { | ||
| 282 | + element.html(element.data('ujs:enable-with')); // set to old enabled state | ||
| 283 | + element.removeData('ujs:enable-with'); // clean up cache | ||
| 284 | + } | ||
| 285 | + element.unbind('click.railsDisable'); // enable element | ||
| 286 | + } | ||
| 287 | + | ||
| 288 | + }; | ||
| 289 | + | ||
| 290 | + if (rails.fire($document, 'rails:attachBindings')) { | ||
| 291 | + | ||
| 292 | + $.ajaxPrefilter(function(options, originalOptions, xhr){ if ( !options.crossDomain ) { rails.CSRFProtection(xhr); }}); | ||
| 293 | + | ||
| 294 | + $document.delegate(rails.linkDisableSelector, 'ajax:complete', function() { | ||
| 295 | + rails.enableElement($(this)); | ||
| 296 | + }); | ||
| 297 | + | ||
| 298 | + $document.delegate(rails.linkClickSelector, 'click.rails', function(e) { | ||
| 299 | + var link = $(this), method = link.data('method'), data = link.data('params'), metaClick = e.metaKey || e.ctrlKey; | ||
| 300 | + if (!rails.allowAction(link)) return rails.stopEverything(e); | ||
| 301 | + | ||
| 302 | + if (!metaClick && link.is(rails.linkDisableSelector)) rails.disableElement(link); | ||
| 303 | + | ||
| 304 | + if (link.data('remote') !== undefined) { | ||
| 305 | + if (metaClick && (!method || method === 'GET') && !data) { return true; } | ||
| 306 | + | ||
| 307 | + var handleRemote = rails.handleRemote(link); | ||
| 308 | + // response from rails.handleRemote() will either be false or a deferred object promise. | ||
| 309 | + if (handleRemote === false) { | ||
| 310 | + rails.enableElement(link); | ||
| 311 | + } else { | ||
| 312 | + handleRemote.error( function() { rails.enableElement(link); } ); | ||
| 313 | + } | ||
| 314 | + return false; | ||
| 315 | + | ||
| 316 | + } else if (link.data('method')) { | ||
| 317 | + rails.handleMethod(link); | ||
| 318 | + return false; | ||
| 319 | + } | ||
| 320 | + }); | ||
| 321 | + | ||
| 322 | + $document.delegate(rails.buttonClickSelector, 'click.rails', function(e) { | ||
| 323 | + var button = $(this); | ||
| 324 | + if (!rails.allowAction(button)) return rails.stopEverything(e); | ||
| 325 | + | ||
| 326 | + rails.handleRemote(button); | ||
| 327 | + return false; | ||
| 328 | + }); | ||
| 329 | + | ||
| 330 | + $document.delegate(rails.inputChangeSelector, 'change.rails', function(e) { | ||
| 331 | + var link = $(this); | ||
| 332 | + if (!rails.allowAction(link)) return rails.stopEverything(e); | ||
| 333 | + | ||
| 334 | + rails.handleRemote(link); | ||
| 335 | + return false; | ||
| 336 | + }); | ||
| 337 | + | ||
| 338 | + $document.delegate(rails.formSubmitSelector, 'submit.rails', function(e) { | ||
| 339 | + var form = $(this), | ||
| 340 | + remote = form.data('remote') !== undefined, | ||
| 341 | + blankRequiredInputs = rails.blankInputs(form, rails.requiredInputSelector), | ||
| 342 | + nonBlankFileInputs = rails.nonBlankInputs(form, rails.fileInputSelector); | ||
| 343 | + | ||
| 344 | + if (!rails.allowAction(form)) return rails.stopEverything(e); | ||
| 345 | + | ||
| 346 | + // skip other logic when required values are missing or file upload is present | ||
| 347 | + if (blankRequiredInputs && form.attr("novalidate") == undefined && rails.fire(form, 'ajax:aborted:required', [blankRequiredInputs])) { | ||
| 348 | + return rails.stopEverything(e); | ||
| 349 | + } | ||
| 350 | + | ||
| 351 | + if (remote) { | ||
| 352 | + if (nonBlankFileInputs) { | ||
| 353 | + // slight timeout so that the submit button gets properly serialized | ||
| 354 | + // (make it easy for event handler to serialize form without disabled values) | ||
| 355 | + setTimeout(function(){ rails.disableFormElements(form); }, 13); | ||
| 356 | + var aborted = rails.fire(form, 'ajax:aborted:file', [nonBlankFileInputs]); | ||
| 357 | + | ||
| 358 | + // re-enable form elements if event bindings return false (canceling normal form submission) | ||
| 359 | + if (!aborted) { setTimeout(function(){ rails.enableFormElements(form); }, 13); } | ||
| 360 | + | ||
| 361 | + return aborted; | ||
| 362 | + } | ||
| 363 | + | ||
| 364 | + rails.handleRemote(form); | ||
| 365 | + return false; | ||
| 366 | + | ||
| 367 | + } else { | ||
| 368 | + // slight timeout so that the submit button gets properly serialized | ||
| 369 | + setTimeout(function(){ rails.disableFormElements(form); }, 13); | ||
| 370 | + } | ||
| 371 | + }); | ||
| 372 | + | ||
| 373 | + $document.delegate(rails.formInputClickSelector, 'click.rails', function(event) { | ||
| 374 | + var button = $(this); | ||
| 375 | + | ||
| 376 | + if (!rails.allowAction(button)) return rails.stopEverything(event); | ||
| 377 | + | ||
| 378 | + // register the pressed submit button | ||
| 379 | + var name = button.attr('name'), | ||
| 380 | + data = name ? {name:name, value:button.val()} : null; | ||
| 381 | + | ||
| 382 | + button.closest('form').data('ujs:submit-button', data); | ||
| 383 | + }); | ||
| 384 | + | ||
| 385 | + $document.delegate(rails.formSubmitSelector, 'ajax:beforeSend.rails', function(event) { | ||
| 386 | + if (this == event.target) rails.disableFormElements($(this)); | ||
| 387 | + }); | ||
| 388 | + | ||
| 389 | + $document.delegate(rails.formSubmitSelector, 'ajax:complete.rails', function(event) { | ||
| 390 | + if (this == event.target) rails.enableFormElements($(this)); | ||
| 391 | + }); | ||
| 392 | + | ||
| 393 | + $(function(){ | ||
| 394 | + rails.refreshCSRFTokens(); | ||
| 395 | + }); | ||
| 396 | + } | ||
| 397 | + | ||
| 398 | +})( jQuery ); |
test/integration/assigning_validator_organizations_to_regions_test.rb
| @@ -10,8 +10,8 @@ class AssigningValidatorOrganizationsToRegionsTest < ActionController::Integrati | @@ -10,8 +10,8 @@ class AssigningValidatorOrganizationsToRegionsTest < ActionController::Integrati | ||
| 10 | org2 = Organization.create!(:name => 'Organization two', :identifier => 'org2') | 10 | org2 = Organization.create!(:name => 'Organization two', :identifier => 'org2') |
| 11 | 11 | ||
| 12 | Region.destroy_all | 12 | Region.destroy_all |
| 13 | - region1 = Region.create!(:name => "Region 1", :environment_id => env.id) | ||
| 14 | - region2 = Region.create!(:name => "Region 2", :environment_id => env.id) | 13 | + region1 = create(Region, :name => "Region 1", :environment_id => env.id) |
| 14 | + region2 = create(Region, :name => "Region 2", :environment_id => env.id) | ||
| 15 | 15 | ||
| 16 | login('ze', 'test') | 16 | login('ze', 'test') |
| 17 | 17 |
test/integration/blocks_test.rb
| @@ -46,7 +46,7 @@ class BlocksTest < ActionController::IntegrationTest | @@ -46,7 +46,7 @@ class BlocksTest < ActionController::IntegrationTest | ||
| 46 | block = blog_on_article_block_bootstrap | 46 | block = blog_on_article_block_bootstrap |
| 47 | p = block.owner | 47 | p = block.owner |
| 48 | b = block.article | 48 | b = block.article |
| 49 | - f = fast_create(Folder, :name => 'Folder1', :profile_id => p.id) | 49 | + f = Folder.create!(:name => 'Folder1', :profile => p) |
| 50 | b.parent = f | 50 | b.parent = f |
| 51 | b.save! | 51 | b.save! |
| 52 | get "/profile/#{block.owner.identifier}" | 52 | get "/profile/#{block.owner.identifier}" |
test/integration/categories_menu_test.rb
| @@ -32,8 +32,10 @@ class CategoriesMenuTest < ActionController::IntegrationTest | @@ -32,8 +32,10 @@ class CategoriesMenuTest < ActionController::IntegrationTest | ||
| 32 | end | 32 | end |
| 33 | 33 | ||
| 34 | should 'cache the categories menu' do | 34 | should 'cache the categories menu' do |
| 35 | - ActionView::Base.any_instance.expects(:cache).with(Environment.default.id.to_s + "_categories_menu") | 35 | + ActionController::Base.perform_caching = true |
| 36 | + HomeController.any_instance.expects(:fragment_cache_key).with(Environment.default.id.to_s + "_categories_menu").returns('dir') | ||
| 36 | get '/' | 37 | get '/' |
| 38 | + ActionController::Base.perform_caching = false | ||
| 37 | end | 39 | end |
| 38 | 40 | ||
| 39 | end | 41 | end |
test/integration/enable_disable_features_test.rb
| @@ -4,7 +4,6 @@ class EnableDisableFeaturesTest < ActionController::IntegrationTest | @@ -4,7 +4,6 @@ class EnableDisableFeaturesTest < ActionController::IntegrationTest | ||
| 4 | all_fixtures | 4 | all_fixtures |
| 5 | 5 | ||
| 6 | def test_enable_features | 6 | def test_enable_features |
| 7 | - uses_host 'anhetegua.net' | ||
| 8 | login 'ze', 'test' | 7 | login 'ze', 'test' |
| 9 | 8 | ||
| 10 | get '/admin/features' | 9 | get '/admin/features' |
test/integration/manage_documents_test.rb
| @@ -83,7 +83,7 @@ class ManageDocumentsTest < ActionController::IntegrationTest | @@ -83,7 +83,7 @@ class ManageDocumentsTest < ActionController::IntegrationTest | ||
| 83 | get '/myprofile/myuser/cms' | 83 | get '/myprofile/myuser/cms' |
| 84 | assert_response :success | 84 | assert_response :success |
| 85 | 85 | ||
| 86 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/myuser/cms/destroy/#{article.id}", :onclick => /confirm/ } | 86 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/myuser/cms/destroy/#{article.id}", 'data-confirm' => /Are you sure/ } |
| 87 | post "/myprofile/myuser/cms/destroy/#{article.id}" | 87 | post "/myprofile/myuser/cms/destroy/#{article.id}" |
| 88 | 88 | ||
| 89 | assert_response :redirect | 89 | assert_response :redirect |
test/integration/routing_test.rb
| @@ -258,16 +258,14 @@ class RoutingTest < ActionController::IntegrationTest | @@ -258,16 +258,14 @@ class RoutingTest < ActionController::IntegrationTest | ||
| 258 | 258 | ||
| 259 | should 'have route to versions of an article' do | 259 | should 'have route to versions of an article' do |
| 260 | 260 | ||
| 261 | - assert_routing('/ze/work/free-software/versions', :controller => 'content_viewer', :action => 'article_versions', :profile => 'ze', :page => ['work', "free-software"]) | 261 | + assert_routing('/ze/work/free-software/versions', :controller => 'content_viewer', :action => 'article_versions', :profile => 'ze', :page => 'work/free-software') |
| 262 | end | 262 | end |
| 263 | 263 | ||
| 264 | should 'have route to versions of an article if profile has domain' do | 264 | should 'have route to versions of an article if profile has domain' do |
| 265 | user = create_user('testuser').person | 265 | user = create_user('testuser').person |
| 266 | domain = Domain.create!(:name => 'example.com', :owner => user) | 266 | domain = Domain.create!(:name => 'example.com', :owner => user) |
| 267 | 267 | ||
| 268 | - ActionController::TestRequest.any_instance.expects(:host).returns('www.example.com') | ||
| 269 | - | ||
| 270 | - assert_routing('/work/free-software/versions', :controller => 'content_viewer', :action => 'article_versions', :page => [ 'work', 'free-software'] ) | 268 | + assert_routing('http://www.example.com/work/free-software/versions', :controller => 'content_viewer', :action => 'article_versions', :page => 'work/free-software') |
| 271 | end | 269 | end |
| 272 | 270 | ||
| 273 | 271 |
test/integration/tiny_mce_languages_test.rb
| @@ -12,7 +12,7 @@ class TinyMceLanguagesTest < ActionController::IntegrationTest | @@ -12,7 +12,7 @@ class TinyMceLanguagesTest < ActionController::IntegrationTest | ||
| 12 | 12 | ||
| 13 | def assert_exists_tinymce_language_file(file) | 13 | def assert_exists_tinymce_language_file(file) |
| 14 | filename = Rails.root.join("public", "javascripts", "tinymce", "jscripts", "tiny_mce", file) | 14 | filename = Rails.root.join("public", "javascripts", "tinymce", "jscripts", "tiny_mce", file) |
| 15 | - assert(File.exists?(filename), filename + " must exist") | 15 | + assert(File.exists?(filename), "#{filename} must exist") |
| 16 | end | 16 | end |
| 17 | 17 | ||
| 18 | 18 |