diff --git a/web/app/assets/javascripts/application.js b/web/app/assets/javascripts/application.js index 03ccbd2a7..d9ca26642 100644 --- a/web/app/assets/javascripts/application.js +++ b/web/app/assets/javascripts/application.js @@ -10,6 +10,7 @@ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD // GO AFTER THE REQUIRES BELOW. // +//= require bugsnag //= require bind-polyfill //= require jquery //= require jquery.monkeypatch diff --git a/web/app/assets/javascripts/checkout_order.js b/web/app/assets/javascripts/checkout_order.js index 70f5171a0..168b965d6 100644 --- a/web/app/assets/javascripts/checkout_order.js +++ b/web/app/assets/javascripts/checkout_order.js @@ -185,7 +185,7 @@ displayTax(effectiveQuantity, unitTax, 1.99 + unitTax) } else { - + checkoutUtils.configureRecurly() var pricing = context.recurly.Pricing(); pricing.plan_code = gon.recurly_tax_estimate_jam_track_plan; pricing.resolved = false; diff --git a/web/app/assets/javascripts/checkout_utils.js.coffee b/web/app/assets/javascripts/checkout_utils.js.coffee index 7f61f0fb8..4570bd052 100644 --- a/web/app/assets/javascripts/checkout_utils.js.coffee +++ b/web/app/assets/javascripts/checkout_utils.js.coffee @@ -8,6 +8,7 @@ class CheckoutUtils @rest = new context.JK.Rest(); @cookie_name = "preserve_billing" @lastPurchaseResponse = null + @configuredRecurly = false init: () => @@ -54,5 +55,10 @@ class CheckoutUtils return carts[0].product_info.free + configureRecurly: () => + unless @configuredRecurly + context.recurly.configure(gon.global.recurly_public_api_key) + @configuredRecurly = true + # global instance context.JK.CheckoutUtilsInstance = new CheckoutUtils() \ No newline at end of file diff --git a/web/app/assets/javascripts/corp/corporate.js b/web/app/assets/javascripts/corp/corporate.js index 989e7bb85..5d6e33bfa 100644 --- a/web/app/assets/javascripts/corp/corporate.js +++ b/web/app/assets/javascripts/corp/corporate.js @@ -1,3 +1,4 @@ +//= require bugsnag //= require jquery //= require jquery.queryparams //= require AAA_Log diff --git a/web/app/assets/javascripts/landing/landing.js b/web/app/assets/javascripts/landing/landing.js index 19034e53c..de23401db 100644 --- a/web/app/assets/javascripts/landing/landing.js +++ b/web/app/assets/javascripts/landing/landing.js @@ -1,3 +1,4 @@ +//= require bugsnag //= require bind-polyfill //= require jquery //= require jquery.monkeypatch diff --git a/web/app/assets/javascripts/web/web.js b/web/app/assets/javascripts/web/web.js index a2a2c58d2..89f49d6fe 100644 --- a/web/app/assets/javascripts/web/web.js +++ b/web/app/assets/javascripts/web/web.js @@ -1,3 +1,4 @@ +//= require bugsnag //= require bind-polyfill //= require jquery //= require jquery.monkeypatch diff --git a/web/app/views/layouts/application.html.erb b/web/app/views/layouts/application.html.erb index f97aca179..8c5742678 100644 --- a/web/app/views/layouts/application.html.erb +++ b/web/app/views/layouts/application.html.erb @@ -23,10 +23,6 @@ <%= stylesheet_link_tag "client/search", media: "all" %> <%= stylesheet_link_tag "client/ftue", media: "all" %> <%= stylesheet_link_tag "client/createSession", media: "all" %> - <% if bugsnag? %> - - - <% end %> <%= include_gon %> <%= csrf_meta_tags %> diff --git a/web/app/views/layouts/client.html.erb b/web/app/views/layouts/client.html.erb index 033716248..6c234aba7 100644 --- a/web/app/views/layouts/client.html.erb +++ b/web/app/views/layouts/client.html.erb @@ -8,10 +8,6 @@ <%= stylesheet_link_tag "client/client", media: "all" %> - <% if bugsnag? %> - - - <% end %> <%= include_gon %> <%= javascript_include_tag "application" %> <%= csrf_meta_tags %> diff --git a/web/app/views/layouts/corporate.html.erb b/web/app/views/layouts/corporate.html.erb index 5269a3781..1d1f31f41 100644 --- a/web/app/views/layouts/corporate.html.erb +++ b/web/app/views/layouts/corporate.html.erb @@ -5,10 +5,6 @@ <%= stylesheet_link_tag "corp/corporate", :media => "all" %> - <% if bugsnag? %> - - - <% end %> <%= include_gon(:init => true) %> <%= javascript_include_tag "corp/corporate" %> <%= csrf_meta_tags %> diff --git a/web/app/views/layouts/landing.html.erb b/web/app/views/layouts/landing.html.erb index 51f1deab4..54a316d1d 100644 --- a/web/app/views/layouts/landing.html.erb +++ b/web/app/views/layouts/landing.html.erb @@ -8,10 +8,6 @@ <%= stylesheet_link_tag "landing/landing", media: "all" %> - <% if bugsnag? %> - - - <% end %> <%= include_gon(:init => true) %> <%= csrf_meta_tags %> diff --git a/web/app/views/layouts/minimal.html.erb b/web/app/views/layouts/minimal.html.erb index a4ab7f0d4..411b792c5 100644 --- a/web/app/views/layouts/minimal.html.erb +++ b/web/app/views/layouts/minimal.html.erb @@ -8,10 +8,6 @@ <%= stylesheet_link_tag "minimal/minimal", media: "all" %> - <% if bugsnag? %> - - - <% end %> <%= include_gon(:init => true) %> <%= csrf_meta_tags %> diff --git a/web/app/views/layouts/web.html.erb b/web/app/views/layouts/web.html.erb index dfc3916de..9a8965853 100644 --- a/web/app/views/layouts/web.html.erb +++ b/web/app/views/layouts/web.html.erb @@ -8,10 +8,6 @@ <%= stylesheet_link_tag "web/web", media: "all" %> - <% if bugsnag? %> - - - <% end %> <%= include_gon(:init => true) %> <%= csrf_meta_tags %> diff --git a/web/app/views/shared/_facebook_sdk.html.slim b/web/app/views/shared/_facebook_sdk.html.slim index f1ba82ae2..ff6de72df 100644 --- a/web/app/views/shared/_facebook_sdk.html.slim +++ b/web/app/views/shared/_facebook_sdk.html.slim @@ -1 +1 @@ -script src="https://apis.google.com/js/platform.js" async defer \ No newline at end of file +script src="https://apis.google.com/js/platform.js" async="async" defer="defer" \ No newline at end of file diff --git a/web/app/views/shared/_google_nocaptcha.html.slim b/web/app/views/shared/_google_nocaptcha.html.slim index c0df3c331..c804c37b7 100644 --- a/web/app/views/shared/_google_nocaptcha.html.slim +++ b/web/app/views/shared/_google_nocaptcha.html.slim @@ -1 +1 @@ -script src="https://www.google.com/recaptcha/api.js" async defer \ No newline at end of file +script src="https://www.google.com/recaptcha/api.js" async="async" defer="defer" \ No newline at end of file diff --git a/web/app/views/shared/_recurly.html.slim b/web/app/views/shared/_recurly.html.slim index d22bdabbd..7f566e136 100644 --- a/web/app/views/shared/_recurly.html.slim +++ b/web/app/views/shared/_recurly.html.slim @@ -1,4 +1 @@ -script src="https://js.recurly.com/v3/recurly.js" - -javascript: - recurly.configure(gon.global.recurly_public_api_key) \ No newline at end of file +script src="https://js.recurly.com/v3/recurly.js" async="async" defer="defer" \ No newline at end of file diff --git a/web/config/initializers/gon.rb b/web/config/initializers/gon.rb index f82a4a1d7..587a89626 100644 --- a/web/config/initializers/gon.rb +++ b/web/config/initializers/gon.rb @@ -19,4 +19,5 @@ Gon.global.estimate_taxes = Rails.application.config.estimate_taxes Gon.global.web_performance_timing_enabled = Rails.application.config.web_performance_timing_enabled Gon.global.jamtrack_landing_bubbles_enabled = Rails.application.config.jamtrack_landing_bubbles_enabled Gon.global.jamtrack_browser_bubbles_enabled = Rails.application.config.jamtrack_browser_bubbles_enabled +Gon.global.bugsnag_key = Rails.application.config.bugsnag_key Gon.global.env = Rails.env diff --git a/web/vendor/assets/javascripts/bugsnag.js b/web/vendor/assets/javascripts/bugsnag.js new file mode 100644 index 000000000..0bdefaadb --- /dev/null +++ b/web/vendor/assets/javascripts/bugsnag.js @@ -0,0 +1,10 @@ +// 2.4.8 http://d2wy8f7a9ursnm.cloudfront.net/bugsnag-2.4.8.min.js + + +// START COPY/PASTE FROM BUGSNAG CDN +!function(a,b){function c(a,b){try{if("function"!=typeof a)return a;if(!a.bugsnag){var c=e();a.bugsnag=function(d){if(b&&b.eventHandler&&(u=d),v=c,!y){var e=a.apply(this,arguments);return v=null,e}try{return a.apply(this,arguments)}catch(f){throw l("autoNotify",!0)&&(x.notifyException(f,null,null,"error"),s()),f}finally{v=null}},a.bugsnag.bugsnag=a.bugsnag}return a.bugsnag}catch(d){return a}}function d(){B=!1}function e(){var a=document.currentScript||v;if(!a&&B){var b=document.scripts||document.getElementsByTagName("script");a=b[b.length-1]}return a}function f(a){var b=e();b&&(a.script={src:b.src,content:l("inlineScript",!0)?b.innerHTML:""})}function g(b){var c=l("disableLog"),d=a.console;void 0===d||void 0===d.log||c||d.log("[Bugsnag] "+b)}function h(b,c,d){if(d>=5)return encodeURIComponent(c)+"=[RECURSIVE]";d=d+1||1;try{if(a.Node&&b instanceof a.Node)return encodeURIComponent(c)+"="+encodeURIComponent(r(b));var e=[];for(var f in b)if(b.hasOwnProperty(f)&&null!=f&&null!=b[f]){var g=c?c+"["+f+"]":f,i=b[f];e.push("object"==typeof i?h(i,g,d):encodeURIComponent(g)+"="+encodeURIComponent(i))}return e.join("&")}catch(j){return encodeURIComponent(c)+"="+encodeURIComponent(""+j)}}function i(a,b){if(null==b)return a;a=a||{};for(var c in b)if(b.hasOwnProperty(c))try{a[c]=b[c].constructor===Object?i(a[c],b[c]):b[c]}catch(d){a[c]=b[c]}return a}function j(a,b){a+="?"+h(b)+"&ct=img&cb="+(new Date).getTime();var c=new Image;c.src=a}function k(a){var b={},c=/^data\-([\w\-]+)$/;if(a)for(var d=a.attributes,e=0;e\n";var f=[];try{for(var h=arguments.callee.caller.caller;h&&f.length"}return a.nodeName}}function s(){z+=1,a.setTimeout(function(){z-=1})}function t(a,b,c){var d=a[b],e=c(d);a[b]=e}var u,v,w,x={},y=!0,z=0,A=10;x.noConflict=function(){return a.Bugsnag=b,x},x.refresh=function(){A=10},x.notifyException=function(a,b,c,d){b&&"string"!=typeof b&&(c=b,b=void 0),c||(c={}),f(c),n({name:b||a.name,message:a.message||a.description,stacktrace:p(a)||o(),file:a.fileName||a.sourceURL,lineNumber:a.lineNumber||a.line,columnNumber:a.columnNumber?a.columnNumber+1:void 0,severity:d||"warning"},c)},x.notify=function(b,c,d,e){n({name:b,message:c,stacktrace:o(),file:a.location.toString(),lineNumber:1,severity:e||"warning"},d)};var B="complete"!==document.readyState;document.addEventListener?(document.addEventListener("DOMContentLoaded",d,!0),a.addEventListener("load",d,!0)):a.attachEvent("onload",d);var C,D=/^[0-9a-f]{32}$/i,E=/function\s*([\w\-$]+)?\s*\(/i,F="https://notify.bugsnag.com/",G=F+"js",H="2.4.8",I=document.getElementsByTagName("script"),J=I[I.length-1];if(a.atob){if(a.ErrorEvent)try{0===new a.ErrorEvent("test").colno&&(y=!1)}catch(K){}}else y=!1;if(l("autoNotify",!0)){t(a,"onerror",function(b){return function(c,d,e,g,h){var i=l("autoNotify",!0),j={};!g&&a.event&&(g=a.event.errorCharacter),f(j),v=null,i&&!z&&n({name:h&&h.name||"window.onerror",message:c,file:d,lineNumber:e,columnNumber:g,stacktrace:h&&p(h)||o(),severity:"error"},j),b&&b(c,d,e,g,h)}});var L=function(a){return function(b,d){if("function"==typeof b){b=c(b);var e=Array.prototype.slice.call(arguments,2);return a(function(){b.apply(this,e)},d)}return a(b,d)}};t(a,"setTimeout",L),t(a,"setInterval",L),a.requestAnimationFrame&&t(a,"requestAnimationFrame",function(a){return function(b){return a(c(b))}}),a.setImmediate&&t(a,"setImmediate",function(a){return function(){var b=Array.prototype.slice.call(arguments);return b[0]=c(b[0]),a.apply(this,b)}}),"EventTarget Window Node ApplicationCache AudioTrackList ChannelMergerNode CryptoOperation EventSource FileReader HTMLUnknownElement IDBDatabase IDBRequest IDBTransaction KeyOperation MediaController MessagePort ModalWindow Notification SVGElementInstance Screen TextTrack TextTrackCue TextTrackList WebSocket WebSocketWorker Worker XMLHttpRequest XMLHttpRequestEventTarget XMLHttpRequestUpload".replace(/\w+/g,function(b){var d=a[b]&&a[b].prototype;d&&d.hasOwnProperty&&d.hasOwnProperty("addEventListener")&&(t(d,"addEventListener",function(a){return function(b,d,e,f){try{d&&d.handleEvent&&(d.handleEvent=c(d.handleEvent,{eventHandler:!0}))}catch(h){g(h)}return a.call(this,b,c(d,{eventHandler:!0}),e,f)}}),t(d,"removeEventListener",function(a){return function(b,d,e,f){return a.call(this,b,d,e,f),a.call(this,b,c(d),e,f)}}))})}a.Bugsnag=x,"function"==typeof define&&define.amd?define([],function(){return x}):"object"==typeof module&&"object"==typeof module.exports&&(module.exports=x)}(window,window.Bugsnag); +// END COPY/PASTE FROM BUGSNAG CDN + + +// manual code: make sure Bugsnag has it's API KEY +window.Bugsnag.apiKey = gon.global.bugsnag_key \ No newline at end of file