11 lines
No EOL
16 KiB
JavaScript
11 lines
No EOL
16 KiB
JavaScript
/*
|
|
* # Fomantic UI - 2.9.3
|
|
* https://github.com/fomantic/Fomantic-UI
|
|
* https://fomantic-ui.com/
|
|
*
|
|
* Copyright 2023 Contributors
|
|
* Released under the MIT license
|
|
* https://opensource.org/licenses/MIT
|
|
*
|
|
*/
|
|
!function(P,j,n){"use strict";function C(e){return null!==e&&e===e.window}function E(e){return"function"==typeof e&&"number"!=typeof e.nodeType}j=void 0!==j&&j.Math===Math?j:globalThis,P.fn.api=function(x){var A,e=E(this)?P(j):P(this),k=Date.now(),S=[],T=x,w="string"==typeof T,D=[].slice.call(arguments,1),O=function(e,t){var r;return 0<=[j,n].indexOf(e)?r=P(e):0===(r=P(t.document).find(e)).length&&(r=t.frameElement?O(e,t.parent):j),r};return e.each(function(){var a,n,r,e,i,o,s=P.isPlainObject(x)?P.extend(!0,{},P.fn.api.settings,x):P.extend({},P.fn.api.settings),f=s.regExp,t=s.namespace,u=s.metadata,c=s.selector,d=s.error,l=s.className,p="."+t,g="module-"+t,m=P(this),v=m.closest(c.form),b=s.stateContext?O(s.stateContext,j):m,h=this,y=b[0],R=m.data(g),q={initialize:function(){w||(o=s.data,q.bind.events()),q.instantiate()},instantiate:function(){q.verbose("Storing instance of module",q),R=q,m.data(g,R)},destroy:function(){q.verbose("Destroying previous module for",h),m.removeData(g).off(p)},bind:{events:function(){var e=q.get.event();e?(q.verbose("Attaching API events to element",e),m.on(e+p,q.event.trigger)):"now"===s.on&&(q.debug("Querying API endpoint immediately"),q.query())}},decode:{json:function(e){if(void 0!==e&&"string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}},read:{cachedResponse:function(e){var t;if(void 0!==j.Storage)return t=sessionStorage.getItem(e+q.get.normalizedData()),q.debug("Using cached response",e,s.data,t),q.decode.json(t);q.error(d.noStorage)}},write:{cachedResponse:function(e,t){void 0===j.Storage?q.error(d.noStorage):(P.isPlainObject(t)&&(t=JSON.stringify(t)),sessionStorage.setItem(e+q.get.normalizedData(),t),q.verbose("Storing cached response for url",e,s.data,t))}},query:function(){if(q.is.disabled())q.debug("Element is disabled API request aborted");else{if(q.is.loading()){if(!s.interruptRequests)return void q.debug("Cancelling request, previous request is still pending");q.debug("Interrupting previous request"),q.abort()}if(s.defaultData&&P.extend(!0,s.urlData,q.get.defaultData()),s.serializeForm&&(s.data=q.add.formData(o||s.data)),!1===(n=q.get.settings()))return q.cancelled=!0,void q.error(d.beforeSend);if(q.cancelled=!1,(r=q.get.templatedURL())||q.is.mocked()){if((r=q.add.urlData(r))||q.is.mocked()){if(n.url=s.base+r,a=P.extend(!0,{},s,{type:s.method||s.type,data:e,url:s.base+r,beforeSend:s.beforeXHR,success:function(){},failure:function(){},complete:function(){}}),q.debug("Querying URL",a.url),q.verbose("Using AJAX settings",a),"local"===s.cache&&q.read.cachedResponse(r))return q.debug("Response returned from local cache"),q.request=q.create.request(),void q.request.resolveWith(y,[q.read.cachedResponse(r)]);s.throttle?s.throttleFirstRequest||q.timer?(q.debug("Throttling request",s.throttle),clearTimeout(q.timer),q.timer=setTimeout(function(){q.timer&&delete q.timer,q.debug("Sending throttled request",e,a.method),q.send.request()},s.throttle)):(q.debug("Sending request",e,a.method),q.send.request(),q.timer=setTimeout(function(){},s.throttle)):(q.debug("Sending request",e,a.method),q.send.request())}}else q.error(d.missingURL)}},should:{removeError:function(){return!0===s.hideError||"auto"===s.hideError&&!q.is.form()}},is:{disabled:function(){return 0<m.filter(c.disabled).length},expectingJSON:function(){return"json"===s.dataType||"jsonp"===s.dataType},form:function(){return m.is("form")||b.is("form")},mocked:function(){return s.mockResponse||s.mockResponseAsync||s.response||s.responseAsync},input:function(){return m.is("input")},loading:function(){return!!q.request&&"pending"===q.request.state()},abortedRequest:function(e){return e&&void 0!==e.readyState&&0===e.readyState?(q.verbose("XHR request determined to be aborted"),!0):(q.verbose("XHR request was not aborted"),!1)},validResponse:function(e){return q.is.expectingJSON()&&E(s.successTest)?(q.debug("Checking JSON returned success",s.successTest,e),s.successTest(e)?(q.debug("Response passed success test",e),!0):(q.debug("Response failed success test",e),!1)):(q.verbose("Response is not JSON, skipping validation",s.successTest,e),!0)}},was:{cancelled:function(){return q.cancelled||!1},successful:function(){return q.request&&"resolved"===q.request.state()},failure:function(){return q.request&&"rejected"===q.request.state()},complete:function(){return q.request&&("resolved"===q.request.state()||"rejected"===q.request.state())}},add:{urlData:function(o,a){var e,t;return o&&(e=o.match(f.required),t=o.match(f.optional),a=a||s.urlData,e&&(q.debug("Looking for required URL variables",e),P.each(e,function(e,t){var r=-1!==t.indexOf("$")?t.slice(2,-1):t.slice(1,-1),n=P.isPlainObject(a)&&void 0!==a[r]?a[r]:void 0!==m.data(r)?m.data(r):void 0!==b.data(r)?b.data(r):a[r];if(void 0===n)return q.error(d.requiredParameter,r,o),o=!1;q.verbose("Found required variable",r,n),n=s.encodeParameters?q.get.urlEncodedValue(n):n,o=o.replace(t,n)})),t&&(q.debug("Looking for optional URL variables",e),P.each(t,function(e,t){var r=-1!==t.indexOf("$")?t.slice(3,-1):t.slice(2,-1),n=P.isPlainObject(a)&&void 0!==a[r]?a[r]:void 0!==m.data(r)?m.data(r):void 0!==b.data(r)?b.data(r):a[r];o=void 0!==n?(q.verbose("Optional variable Found",r,n),o.replace(t,n)):(q.verbose("Optional variable not found",r),-1!==o.indexOf("/"+t)?o.replace("/"+t,""):o.replace(t,""))}))),o},formData:function(r){var e,n,u,c,d,l={},t="formdata"===s.serializeForm;return r=r||o||s.data,e=P.isPlainObject(r),t?(l=new FormData(v[0]),s.processData=void 0!==s.processData&&s.processData,s.contentType=void 0!==s.contentType&&s.contentType):(n=v.serializeArray(),u={},c={},d=function(e,t,r){return e[t]=r,e},P.each(P('input[type="file"]',v),function(e,r){P.each(P(r)[0].files,function(e,t){n.push({name:r.name,value:t})})}),P.each(n,function(e,t){if(f.validate.test(t.name)){var r="checkbox"===P('[name="'+t.name+'"]',v).attr("type"),n=parseFloat(t.value),o=r&&"on"===t.value||"true"===t.value||(String(n)===t.value?n:"false"!==t.value&&t.value),a=t.name.match(f.key)||[],i=t.name.replace(/\[]$/,"");i in u?Array.isArray(c[i])?c[i].push(o):c[i]=[c[i],o]:(u[i]=0,c[i]=o),-1===i.indexOf("[]")&&(o=c[i]);for(;0<a.length;){var s=a.pop();""!==s||Array.isArray(o)?f.fixed.test(s)?o=d([],s,o):f.named.test(s)&&(o=d({},s,o)):o=d([],u[i]++,o)}l=P.extend(!0,l,o)}})),r=e?(q.debug("Extending existing data with form data",r,l),t?(P.each(Object.keys(r),function(e,t){l.append(t,r[t])}),l):P.extend(!0,{},r,l)):(q.debug("Adding form data",l),l)}},send:{request:function(){q.set.loading(),q.request=q.create.request(),q.is.mocked()?q.mockedXHR=q.create.mockedXHR():q.xhr=q.create.xhr(),s.onRequest.call(y,q.request,q.xhr)}},event:{trigger:function(e){q.query(),"submit"!==e.type&&"click"!==e.type||e.preventDefault()},xhr:{always:function(){},done:function(e,t,r){var n=this,o=Date.now()-i,o=s.loadingDuration-o,a=!!E(s.onResponse)&&(q.is.expectingJSON()&&!s.rawResponse?s.onResponse.call(n,P.extend(!0,{},e)):s.onResponse.call(n,e)),o=0<o?o:0;a&&(q.debug("Modified API response in onResponse callback",s.onResponse,a,e),e=a),0<o&&q.debug("Response completed early delaying state change by",o),setTimeout(function(){q.is.validResponse(e)?q.request.resolveWith(n,[e,r]):q.request.rejectWith(n,[r,"invalid"])},o)},fail:function(e,t,r){var n=this,o=Date.now()-i,o=s.loadingDuration-o;0<(o=0<o?o:0)&&q.debug("Response completed early delaying state change by",o),setTimeout(function(){q.is.abortedRequest(e)?q.request.rejectWith(n,[e,"aborted",r]):q.request.rejectWith(n,[e,"error",t,r])},o)}},request:{done:function(e,t){q.debug("Successful API Response",e),"local"===s.cache&&r&&(q.write.cachedResponse(r,e),q.debug("Saving server response locally",q.cache)),s.onSuccess.call(y,e,m,t)},complete:function(e,t){var r,n;q.was.successful()?(n=e,r=t):n=q.get.responseFromXHR(r=e),q.remove.loading(),s.onComplete.call(y,n,m,r)},fail:function(e,t,r){var n=q.get.responseFromXHR(e),o=q.get.errorFromRequest(n,t,r);if("aborted"===t)return q.debug("XHR Aborted (Most likely caused by page navigation or CORS Policy)",t,r),s.onAbort.call(y,t,m,e),!0;"invalid"===t?q.debug("JSON did not pass success test. A server-side error has most likely occurred",n):"error"===t&&void 0!==e&&(q.debug("XHR produced a server error",t,r),(e.status<200||300<=e.status)&&void 0!==r&&""!==r&&q.error(d.statusMessage+r,a.url),s.onError.call(y,o,m,e)),s.errorDuration&&"aborted"!==t&&(q.debug("Adding error state"),q.set.error(),q.should.removeError()&&setTimeout(function(){q.remove.error()},s.errorDuration)),q.debug("API Request failed",o,e),s.onFailure.call(y,n,m,e)}}},create:{request:function(){return P.Deferred().always(q.event.request.complete).done(q.event.request.done).fail(q.event.request.fail)},mockedXHR:function(){var e=s.mockResponse||s.response,t=s.mockResponseAsync||s.responseAsync,r=P.Deferred().always(q.event.xhr.complete).done(q.event.xhr.done).fail(q.event.xhr.fail);return e?(e=E(e)?(q.debug("Using specified synchronous callback",e),e.call(y,n)):(q.debug("Using settings specified response",e),e),r.resolveWith(y,[e,!1,{responseText:e}])):E(t)&&(e=function(e){q.debug("Async callback returned response",e),e?r.resolveWith(y,[e,!1,{responseText:e}]):r.rejectWith(y,[{responseText:e},!1,!1])},q.debug("Using specified async response callback",t),t.call(y,n,e)),r},xhr:function(){var e=P.ajax(a).always(q.event.xhr.always).done(q.event.xhr.done).fail(q.event.xhr.fail);return q.verbose("Created server request",e,a),e}},set:{error:function(){q.verbose("Adding error state to element",b),b.addClass(l.error)},loading:function(){q.verbose("Adding loading state to element",b),b.addClass(l.loading),i=Date.now()}},remove:{error:function(){q.verbose("Removing error state from element",b),b.removeClass(l.error)},loading:function(){q.verbose("Removing loading state from element",b),b.removeClass(l.loading)}},get:{normalizedData:function(){return"string"==typeof s.data?s.data:JSON.stringify(s.data,Object.keys(s.data).sort())},responseFromXHR:function(e){return!!P.isPlainObject(e)&&(q.is.expectingJSON()?q.decode.json(e.responseText):e.responseText)},errorFromRequest:function(e,t,r){return P.isPlainObject(e)&&void 0!==e.error?e.error:void 0!==s.error[t]?s.error[t]:r},request:function(){return q.request||!1},xhr:function(){return q.xhr||!1},settings:function(){var e=s.beforeSend.call(m,s);return e&&(void 0!==e.success&&(q.debug("Legacy success callback detected",e),q.error(d.legacyParameters,e.success),e.onSuccess=e.success),void 0!==e.failure&&(q.debug("Legacy failure callback detected",e),q.error(d.legacyParameters,e.failure),e.onFailure=e.failure),void 0!==e.complete&&(q.debug("Legacy complete callback detected",e),q.error(d.legacyParameters,e.complete),e.onComplete=e.complete)),void 0===e&&q.error(d.noReturnedValue),!1===e?e:void 0!==e?P.extend(!0,{},e):P.extend(!0,{},s)},urlEncodedValue:function(e){var t=j.decodeURIComponent(e),r=j.encodeURIComponent(e);return t!==e?(q.debug("URL value is already encoded, avoiding double encoding",e),e):(q.verbose("Encoding value using encodeURIComponent",e,r),r)},defaultData:function(){var e={};return C(h)||(q.is.input()?e.value=m.val():q.is.form()||(e.text=m.text())),e},event:function(){return C(h)||"now"===s.on?(q.debug("API called without element, no events attached"),!1):"auto"===s.on?m.is("input")?void 0!==h.oninput?"input":void 0!==h.onpropertychange?"propertychange":"keyup":m.is("form")?"submit":"click":s.on},templatedURL:function(e){if(e=e||s.action||m.data(u.action)||!1,r=s.url||m.data(u.url)||!1)return q.debug("Using specified url",r),r;if(e){if(q.debug("Looking up url for action",e,s.api),void 0===s.api[e]&&!q.is.mocked())return void q.error(d.missingAction,s.action,s.api);r=s.api[e]}else q.is.form()&&(r=m.attr("action")||b.attr("action")||!1,q.debug("No url or action specified, defaulting to form action",r));return r}},abort:function(){var e=q.get.xhr();e&&"resolved"!==e.state()&&(q.debug("Cancelling API request"),e.abort())},reset:function(){q.remove.error(),q.remove.loading()},setting:function(e,t){if(q.debug("Changing setting",e,t),P.isPlainObject(e))P.extend(!0,s,e);else{if(void 0===t)return s[e];P.isPlainObject(s[e])?P.extend(!0,s[e],t):s[e]=t}},internal:function(e,t){if(P.isPlainObject(e))P.extend(!0,q,e);else{if(void 0===t)return q[e];q[e]=t}},debug:function(){!s.silent&&s.debug&&(s.performance?q.performance.log(arguments):(q.debug=Function.prototype.bind.call(console.info,console,s.name+":"),q.debug.apply(console,arguments)))},verbose:function(){!s.silent&&s.verbose&&s.debug&&(s.performance?q.performance.log(arguments):(q.verbose=Function.prototype.bind.call(console.info,console,s.name+":"),q.verbose.apply(console,arguments)))},error:function(){s.silent||(q.error=Function.prototype.bind.call(console.error,console,s.name+":"),q.error.apply(console,arguments))},performance:{log:function(e){var t,r;s.performance&&(r=(t=Date.now())-(k||t),k=t,S.push({Name:e[0],Arguments:[].slice.call(e,1)||"","Execution Time":r})),clearTimeout(q.performance.timer),q.performance.timer=setTimeout(function(){q.performance.display()},500)},display:function(){var e=s.name+":",r=0;k=!1,clearTimeout(q.performance.timer),P.each(S,function(e,t){r+=t["Execution Time"]}),e+=" "+r+"ms",0<S.length&&(console.groupCollapsed(e),console.table?console.table(S):P.each(S,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),S=[]}},invoke:function(n,e,t){var o,a,r,i=R;return e=e||D,t=t||h,"string"==typeof n&&void 0!==i&&(n=n.split(/[ .]/),o=n.length-1,P.each(n,function(e,t){var r=e!==o?t+n[e+1].charAt(0).toUpperCase()+n[e+1].slice(1):n;if(P.isPlainObject(i[r])&&e!==o)i=i[r];else{if(void 0!==i[r])return a=i[r],!1;{if(!P.isPlainObject(i[t])||e===o)return void 0!==i[t]?a=i[t]:q.error(d.method,n),!1;i=i[t]}}})),E(a)?r=a.apply(t,e):void 0!==a&&(r=a),Array.isArray(A)?A.push(r):void 0!==A?A=[A,r]:void 0!==r&&(A=r),a}};w?(void 0===R&&q.initialize(),q.invoke(T)):(void 0!==R&&R.invoke("destroy"),q.initialize())}),void 0!==A?A:this},P.api=P.fn.api,P.api.settings={name:"API",namespace:"api",debug:!1,verbose:!1,performance:!0,api:{},cache:!0,interruptRequests:!0,on:"auto",stateContext:!1,loadingDuration:0,hideError:"auto",errorDuration:2e3,encodeParameters:!0,action:!1,url:!1,base:"",urlData:{},defaultData:!0,serializeForm:!1,throttle:0,throttleFirstRequest:!0,method:"get",data:{},dataType:"json",mockResponse:!1,mockResponseAsync:!1,response:!1,responseAsync:!1,rawResponse:!0,beforeSend:function(e){return e},beforeXHR:function(e){},onRequest:function(e,t){},onResponse:!1,onSuccess:function(e,t){},onComplete:function(e,t){},onFailure:function(e,t){},onError:function(e,t){},onAbort:function(e,t){},successTest:!1,error:{beforeSend:"The before send function has aborted the request",error:"There was an error with your request",exitConditions:"API Request Aborted. Exit conditions met",JSONParse:"JSON could not be parsed during error handling",legacyParameters:"You are using legacy API success callback names",method:"The method you called is not defined",missingAction:"API action used but no url was defined",missingURL:"No URL specified for api event",noReturnedValue:"The beforeSend callback must return a settings object, beforeSend ignored.",noStorage:"Caching responses locally requires session storage",parseError:"There was an error parsing your request",requiredParameter:"Missing a required URL parameter: ",statusMessage:"Server gave an error: ",timeout:"Your request timed out"},regExp:{required:/{\$*[\da-z]+}/gi,optional:/{\/\$*[\da-z]+}/gi,validate:/^[_a-z][\w-]*(?:\[[\w-]*])*$/i,key:/[\w-]+|(?=\[])/gi,push:/^$/,fixed:/^\d+$/,named:/^[\w-]+$/i},className:{loading:"loading",error:"error"},selector:{disabled:".disabled",form:"form"},metadata:{action:"action",url:"url"}}}(jQuery,window,document); |