{"version":3,"sources":["../ts/modules/ajax.ts"],"names":["getURL","url","baseURI","document","URL","AjaxContext","constructor","this","pending","observable_1","ObservableValue","ajax","args","aurl","href","concat","delegate","$","get","getJSON","post","load","dest","selector","data","$dest","deferred","Deferred","type","dataType","then","html","append","parseHTML","find","resolve","ex","console_1","error","reject","method","xhr","apply","newDeferred","promise","always","value","textStatus","jqXHR","errorThrown","cancel","_deferred","Error","exports","Context","QueueAjaxContext","waitTime","retryDelay","retries","queue","queuing_1","AsyncQueue","onRetry","time_1","wait","retval","enqueue","milliseconds","WebService","context","getUrl","baseUrl","attr"],"mappings":"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","file":"ajax.js","sourcesContent":["import { ObservableValue } from 'observable';\r\nimport { wait } from 'time';\r\nimport { Lazy } from 'caching';\r\nimport { error } from 'console';\r\nimport { splitFirst } from 'utilities/string';\r\nimport { AsyncQueue } from 'queuing';\r\nimport * as $ from 'jquery';\r\n\r\nfunction isURL( url: Object ): url is URL {\r\n\treturn url && typeof url[ 'href' ] === 'string';\r\n}\r\n\r\nfunction getURL( url: string|URL, baseURI = document.baseURI ): URL {\r\n\tif( isURL( url ) ) return url;\r\n\telse return new URL( url, baseURI );\r\n}\r\n\r\nexport class AjaxContext {\r\n\tpublic ajax( url: string|URL, ...args: any[] ): AjaxResult {\r\n\t\tconst aurl = url;\r\n\t\tif( aurl && typeof aurl.url === 'string' ) {\r\n\t\t\taurl.url = url = getURL( aurl.url ).href;\r\n\t\t\targs = [ aurl ].concat( args );\r\n\t\t}\r\n\t\treturn this.delegate( $.ajax, url, args );\r\n\t}\r\n\r\n\tpublic get( url: string|URL, ...args: any[] ): AjaxResult {\r\n\t\treturn this.delegate( $.get, url, args );\r\n\t}\r\n\r\n\tpublic getJSON( url: string|URL, ...args: any[] ): AjaxResult {\r\n\t\treturn this.delegate( $.getJSON, url, args );\r\n\t}\r\n\r\n\tpublic post( url: string|URL, ...args: any[] ): AjaxResult {\r\n\t\treturn this.delegate( $.post, url, args );\r\n\t}\r\n\r\n\tpublic load( dest: HTMLElement, url: string|URL, selector?: string, data?: any ): AjaxResult {\r\n\t\tconst $dest = $( dest ),\r\n\t\t\tdeferred = $.Deferred(),\r\n\t\t\tdataType = 'html',\r\n\t\t\ttype = typeof data === 'object' ? 'POST' : 'GET';\r\n\r\n\t\tthis.ajax( getURL( url ).href, { url, type, dataType, data } )\r\n\t\t\t.then( ( html: string ) => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif( selector ) {\r\n\t\t\t\t\t\t$dest.html( $( '
' ).append( $.parseHTML( html ) ).find( selector ) );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$dest.html( html );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdeferred.resolve();\r\n\t\t\t\t} catch( ex ) {\r\n\t\t\t\t\terror( ex );\r\n\t\t\t\t\tdeferred.reject( ex );\r\n\t\t\t\t}\r\n\t\t\t}, ex => { deferred.reject( ex ); } );\r\n\r\n\t\treturn deferred;\r\n\t}\r\n\r\n\tprivate delegate( method: (...args) => JQueryXHR, url: string|URL, args: any[] ) {\r\n\t\tconst xhr: JQueryXHR = method.apply( $, [ getURL( url ).href ].concat( args ) ),\r\n\t\t\tdeferred = this.newDeferred();\r\n\t\tdeferred.promise().always( () => { this.pending.value = false; } );\r\n\t\tthis.pending.value = true;\r\n\t\txhr.then(\r\n\t\t\t( data: T, textStatus: string, jqXHR: JQueryXHR ) => { deferred.resolve( data, textStatus, jqXHR ); },\r\n\t\t\t( jqXHR: JQueryXHR, textStatus: string, errorThrown: any ) => {\r\n\t\t\t\terror( errorThrown || textStatus );\r\n\t\t\t\tdeferred.reject( { jqXHR, textStatus, errorThrown } );\r\n\t\t\t}\r\n\t\t);\r\n\t\treturn deferred;\r\n\t}\r\n\r\n\tpublic cancel() {\r\n\t\tthis.newDeferred();\r\n\t}\r\n\r\n\tprivate newDeferred() {\r\n\t\tif( this._deferred ) {\r\n\t\t\tthis._deferred.reject( new Error( 'New request issued before previous request completed.' ) );\r\n\t\t}\r\n\t\treturn this._deferred = $.Deferred();\r\n\t}\r\n\r\n\tprivate _deferred: JQueryDeferred;\r\n\r\n\tpublic pending = new ObservableValue( false );\r\n}\r\n\r\n// deprecated: use AjaxContext\r\nexport class Context extends AjaxContext {}\r\n\r\nexport class QueueAjaxContext {\r\n\tpublic constructor() {\r\n\t\tthis.queue.onRetry = () => wait( this.retryDelay );\r\n\t}\r\n\r\n\tpublic ajax( url: string|URL, ...args: any[] ): Promise {\r\n\t\tconst retval = this.queue.enqueue( () => ( new AjaxContext ).ajax( url, ...args ), this.retries );\r\n\t\tthis.wait();\r\n\t\treturn retval;\r\n\t}\r\n\r\n\tpublic get( url: string|URL, ...args: any[] ): Promise {\r\n\t\tconst retval = this.queue.enqueue( () => ( new AjaxContext ).get( url, ...args ), this.retries );\r\n\t\tthis.wait();\r\n\t\treturn retval;\r\n\t}\r\n\r\n\tpublic getJSON( url: string|URL, ...args: any[] ): Promise {\r\n\t\tconst retval = this.queue.enqueue( () => ( new AjaxContext ).getJSON( url, ...args ), this.retries );\r\n\t\tthis.wait();\r\n\t\treturn retval;\r\n\t}\r\n\r\n\tpublic post( url: string|URL, ...args: any[] ): Promise {\r\n\t\tconst retval = this.queue.enqueue( () => ( new AjaxContext ).post( url, ...args ), this.retries );\r\n\t\tthis.wait();\r\n\t\treturn retval;\r\n\t}\r\n\r\n\tpublic load( dest: HTMLElement, url: string|URL, selector?: string, data?: any ): Promise {\r\n\t\tconst retval = this.queue.enqueue( () => ( new AjaxContext ).load( dest, url, selector, data ), this.retries );\r\n\t\tthis.wait();\r\n\t\treturn retval;\r\n\t}\r\n\r\n\tpublic wait( milliseconds = this.waitTime ) {\r\n\t\treturn this.queue.enqueue( () => wait( milliseconds ) );\r\n\t}\r\n\r\n\tpublic waitTime = 0;\r\n\tpublic retryDelay = 100;\r\n\tpublic retries = 0;\r\n\r\n\tpublic queue = new AsyncQueue;\r\n}\r\n\r\nexport interface AjaxResult extends PromiseLike {\r\n\tthen( resolve: ( data: T, textStatus: string, jqXHR: JQueryXHR ) => void, reject?: ( jqXHR: JQueryXHR, textStatus: string, errorThrown: any ) => void );\r\n\talways( alwaysCallbacks1: JQueryPromiseCallback, ...alwaysCallbacks2: JQueryPromiseCallback[] );\r\n\treject( ...args: any[] );\r\n}\r\n\r\nexport abstract class WebService {\r\n\tconstructor( context = new AjaxContext ) {\r\n\t\tthis.context = context;\r\n\t}\r\n\r\n\tprotected context: AjaxContext;\r\n\r\n\tpublic static getUrl( url: string|URL ) {\r\n\t\tconst baseUrl = getURL( $( 'html' ).attr( 'data-services-baseurl' ) || '/' );\r\n\t\treturn getURL( url, baseUrl.href );\r\n\t}\r\n\r\n\tpublic cancel() {\r\n\t\tthis.context.cancel();\r\n\t}\r\n\r\n\tpublic get pending() {\r\n\t\treturn this.context.pending;\r\n\t}\r\n}\r\n"]}