You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
5.4 KiB
1 lines
5.4 KiB
(function(e,t,n,o){e.api=e.fn.api=function(n){var i,a=e.extend(!0,{},e.api.settings,n),r="function"!=typeof this?this:e("<div/>"),s=a.stateContext?e(a.stateContext):e(r),c="object"==typeof this?e(r):s,l=c.data(a.metadata.action)||a.action||!1,u=a.className,d=a.metadata,p=a.errors;return i={initialize:function(){var r,p,g,m,f,h,y,v=!1,x=(new Date).getTime(),b={},C={},T=a.errors;return a.serializeForm&&e(this).toJSON()!==o&&(b=c.closest("form").toJSON(),e.extend(!0,a.data,b),i.debug("Adding form data to API Request",b)),r=e.proxy(a.beforeSend,c)(a),r===o||r?(l&&(i.debug("Initializing API Request for: ",l),a.api[l]!==o?m=a.api[l]:i.error(T.missingAction)),a.url&&(m=a.url,i.debug("Using specified url: ",m)),m||(i.error(T.missingURL),i.reset()),f=m.match(a.regExpTemplate),f&&(i.debug("Looking for URL variables",f),e.each(f,function(t,r){var s=r.substr(2,r.length-3),l=e.isPlainObject(n.urlData)&&n.urlData[s]!==o?n.urlData[s]:c.data(s)!==o?c.data(s):a.urlData[s];i.verbose("Looking for variable",s,c,c.data(s),a.urlData[s]),l===!1?(i.debug("Removing variable from URL",f),m=m.replace("/"+r,"")):l!==o&&l?m=m.replace(r,l):(i.error(T.missingParameter+s),v=!0)})),v?(i.reset(),o):(g=e.Deferred().always(function(){a.stateContext&&s.removeClass(u.loading),e.proxy(a.complete,c)()}).done(function(t){i.debug("API request successful"),"json"==a.dataType?t.error!==o?e.proxy(a.failure,s)(t.error,a,c):e.isArray(t.errors)?e.proxy(a.failure,s)(t.errors[0],a,c):e.proxy(a.success,s)(t,a,c):e.proxy(a.success,s)(t,a,c)}).fail(function(t,n,r){var c,l=a.errors[n]!==o?a.errors[n]:r;if(t!==o)if(t.readyState!==o&&4==t.readyState){if(200!=t.status&&r!==o&&""!==r)i.error(T.statusMessage+r);else if("error"==n&&"json"==a.dataType)try{c=e.parseJSON(t.responseText),c&&c.error!==o&&(l=c.error)}catch(d){i.error(T.JSONParse)}s.removeClass(u.loading).addClass(u.error),a.errorLength>0&&setTimeout(function(){s.removeClass(u.error)},a.errorLength),i.debug("API Request error:",l),e.proxy(a.failure,s)(l,a,this)}else i.debug("Request Aborted (Most likely caused by page change)")}),e.extend(!0,C,a,{success:function(){},failure:function(){},complete:function(){},type:a.method||a.type,data:h,url:m,beforeSend:a.beforeXHR}),a.stateContext&&s.addClass(u.loading),a.progress&&(i.verbose("Adding progress events"),e.extend(!0,C,{xhr:function(){var n=new t.XMLHttpRequest;return n.upload.addEventListener("progress",function(t){var n;t.lengthComputable&&(n=Math.round(1e4*(t.loaded/t.total))/100+"%",e.proxy(a.progress,s)(n,t))},!1),n.addEventListener("progress",function(t){var n;t.lengthComputable&&(n=Math.round(1e4*(t.loaded/t.total))/100+"%",e.proxy(a.progress,s)(n,t))},!1),n}})),i.verbose("Creating AJAX request with settings: ",C),y=e.ajax(C).always(function(){p=a.loadingLength-((new Date).getTime()-x),a.loadingDelay=0>p?0:p}).done(function(e){var t=this;setTimeout(function(){g.resolveWith(t,[e])},a.loadingDelay)}).fail(function(e,t,n){var o=this;"abort"!=t?setTimeout(function(){g.rejectWith(o,[e,t,n])},a.loadingDelay):s.removeClass(u.error).removeClass(u.loading)}),a.stateContext&&c.data(d.promise,g).data(d.xhr,y),o)):(i.error(T.beforeSend),i.reset(),o)},reset:function(){c.data(d.promise,!1).data(d.xhr,!1),s.removeClass(u.error).removeClass(u.loading),i.error(p.exitConditions)},setting:function(e,t){return t===o?a[e]:(a[e]=t,o)},verbose:function(){a.verbose&&i.debug.apply(this,arguments)},debug:function(){var e=[],t=a.moduleName+": "+arguments[0],n=[].slice.call(arguments,1),o=console.info||console.log||function(){};o=Function.prototype.bind.call(o,console),a.debug&&(e.push(t),o.apply(console,e.concat(n)))},error:function(){var e=[],t=a.moduleName+": "+arguments[0],n=[].slice.call(arguments,1),o=console.warn||console.log||function(){};o=Function.prototype.bind.call(o,console),a.debug&&(e.push(t),e.concat(n),o.apply(console,e.concat(n)))}},i.initialize(),this},e.fn.apiButton=function(t){return e(this).each(function(){var n,o=e(this),i=e(this).selector||"",a=e.isFunction(t)?e.extend(!0,{},e.api.settings,e.fn.apiButton.settings,{stateContext:this,success:t}):e.extend(!0,{},e.api.settings,e.fn.apiButton.settings,{stateContext:this},t);n={initialize:function(){a.context&&""!==i?e(a.context).on(i,"click."+a.namespace,n.click):o.on("click."+a.namespace,n.click)},click:function(){a.filter&&0!==e(this).filter(a.filter).size()||e.proxy(e.api,this)(a)}},n.initialize()}),this},e.api.settings={moduleName:"API Module",namespace:"api",verbose:!0,debug:!0,api:{},beforeSend:function(e){return e},beforeXHR:function(){},success:function(){},complete:function(){},failure:function(){},progress:!1,errors:{missingAction:"API action used but no url was defined",missingURL:"URL not specified for the API action",missingParameter:"Missing an essential URL parameter: ",timeout:"Your request timed out",error:"There was an error with your request",parseError:"There was an error parsing your request",JSONParse:"JSON could not be parsed during error handling",statusMessage:"Server gave an error: ",beforeSend:"The before send function has aborted the request",exitConditions:"API Request Aborted. Exit conditions met"},className:{loading:"loading",error:"error"},metadata:{action:"action",promise:"promise",xhr:"xhr"},regExpTemplate:/\{\$([A-z]+)\}/g,action:!1,url:!1,urlData:!1,serializeForm:!1,stateContext:!1,method:"get",data:{},dataType:"json",cache:!0,loadingLength:200,errorLength:2e3},e.fn.apiButton.settings={filter:".disabled, .loading",context:!1,stateContext:!1}})(jQuery,window,document);
|