2014-05-14 13:24:20 +00:00
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
2016-05-23 20:04:57 +00:00
* OctoberCMS : front - end JavaScript framework
2014-05-14 13:24:20 +00:00
* http : //octobercms.com
* === === === === === === === === === === === === === === === === === === === === === === === ===
2017-02-04 19:49:11 +00:00
* Copyright 2017 Alexey Bobkov , Samuel Georges
2014-05-14 13:24:20 +00:00
* === === === === === === === === === === === === === === === === === === === === === === === === * /
2019-09-14 07:29:31 +00:00
/* October CMS JSON Parser */
"use strict" ; ! function ( ) { function a ( e , r , n ) { for ( var t = "" , o = r ; o < e . length ; o ++ ) { if ( n && n === e [ o ] ) return t ; if ( ! n && ( " " === e [ o ] || ":" === e [ o ] ) ) return t ; t += e [ o ] , "\\" === e [ o ] && o + 1 < e . length && ( t += e [ o + 1 ] , o ++ ) } throw new Error ( "Broken JSON syntax near " + t ) } function u ( e , r ) { if ( '"' === e [ r ] || "'" === e [ r ] ) { for ( var n = e [ r ] , t = r + 1 ; t < e . length ; t ++ ) if ( "\\" === e [ t ] ) n += e [ t ] , t + 1 < e . length && ( n += e [ t + 1 ] ) , t ++ ; else { if ( e [ t ] === e [ r ] ) return { originLength : ( n += e [ r ] ) . length , body : n } ; n += e [ t ] } throw new Error ( "Broken JSON string body near " + n ) } if ( "t" === e [ r ] ) { if ( e . indexOf ( "true" , r ) === r ) return { originLength : "true" . length , body : "true" } ; throw new Error ( "Broken JSON boolean body near " + e . substr ( 0 , r + 10 ) ) } if ( "f" === e [ r ] ) { if ( e . indexOf ( "f" , r ) === r ) return { originLength : "false" . length , body : "false" } ; throw new Error ( "Broken JSON boolean body near " + e . substr ( 0 , r + 10 ) ) } if ( "n" === e [ r ] ) { if ( e . indexOf ( "null" , r ) === r ) return { originLength : "null" . length , body : "null" } ; throw new Error ( "Broken JSON boolean body near " + e . substr ( 0 , r + 10 ) ) } if ( "-" === e [ r ] || "+" === e [ r ] || "." === e [ r ] || "0" <= e [ r ] && e [ r ] <= "9" ) { for ( n = "" , t = r ; t < e . length ; t ++ ) { if ( ! ( "-" === e [ t ] || "+" === e [ t ] || "." === e [ t ] || "0" <= e [ t ] && e [ t ] <= "9" ) ) return { originLength : n . length , body : n } ; n += e [ t ] } throw new Error ( "Broken JSON number body near " + n ) } if ( "{" !== e [ r ] && "[" !== e [ r ] ) throw new Error ( "Broken JSON body near " + e . substr ( 0 <= r - 5 ? r - 5 : 0 , 50 ) ) ; var o = [ e [ r ] ] ; for ( n = e [ r ] , t = r + 1 ; t < e . length ; t ++ ) { if ( n += e [ t ] , "\\" === e [ t ] ) t + 1 < e . length && ( n += e [ t + 1 ] ) , t ++ ; else if ( '"' === e [ t ] ) '"' === o [ o . length - 1 ] ? o . pop ( ) : "'" !== o [ o . length - 1 ] && o . push ( e [ t ] ) ; else if ( "'" === e [ t ] ) "'" === o [ o . length - 1 ] ? o . pop ( ) : '"' !== o [ o . length - 1 ] && o . push ( e [ t ] ) ; else if ( '"' !== o [ o . length - 1 ] && "'" !== o [ o . length - 1 ] ) if ( "{" === e [ t ] ) o . push ( "{" ) ; else if ( "}" === e [ t ] ) { if ( "{" !== o [ o . length - 1 ] ) throw new Error ( "Broken JSON " + ( "{" === e [ r ] ? "object" : "array" ) + " body near " + n ) ; o . pop ( ) } else if ( "[" === e [ t ] ) o . push ( "[" ) ; else if ( "]" === e [ t ] ) { if ( "[" !== o [ o . length - 1 ] ) throw new Error ( "Broken JSON " + ( "{" === e [ r ] ? "object" : "array" ) + " body near " + n ) ; o . pop ( ) } if ( ! o . length ) return { originLength : t - r , body : n } } throw new Error ( "Broken JSON " + ( "{" === e [ r ] ? "object" : "array" ) + " body near " + n ) } function s ( e ) { return " " === e || "\n" === e || "\t" === e } void 0 === $ . oc && ( $ . oc = { } ) , $ . oc . JSON = function ( e ) { var r = function e ( r ) { if ( ! ( r = r . trim ( ) ) . length ) throw new Error ( "Broken JSON object." ) ; for ( var n = "" ; r && "," === r [ 0 ] ; ) r = r . substr ( 1 ) ; if ( '"' === r [ 0 ] || "'" === r [ 0 ] ) { if ( r [ r . length - 1 ] !== r [ 0 ] ) throw new Error ( "Invalid string JSON object." ) ; for ( var t = '"' , o = 1 ; o < r . length ; o ++ ) if ( "\\" === r [ o ] ) "'" === r [ o + 1 ] || ( t += r [ o ] ) , t += r [ o + 1 ] , o ++ ; else { if ( r [ o ] === r [ 0 ] ) return t += '"' ; '"' === r [ o ] ? t += '\\"' : t += r [ o ] } throw new Error ( "Invalid string JSON object." ) } if ( "true" === r || "false" === r ) return r ; if ( "null" === r ) return "null" ; var i , f = parseFloat ( r ) ; if ( ! isNaN ( f ) ) return f . toString ( ) ; if ( "{" === r [ 0 ] ) { var l = "needKey" ; for ( n = "{" , o = 1 ; o < r . length ; o ++ ) if ( ! s ( r [ o ] ) ) if ( "needKey" !== l || '"' !== r [ o ] && "'" !== r [ o ] ) { if ( "needKey" === l && "\\" !== ( i = r [ o ] ) [ 0 ] && ( "a" <= i [ 0 ] && i [ 0 ] <= "z" || "A" <= i [ 0 ] && i [ 0 ] <= "Z" || "_" === i [ 0 ] || "0" <= i [ 0 ] && i [ 0 ] <= "9" || "$" === i [ 0 ] || 255 < i . charCodeAt ( 0 ) ) ) { var h ; n += '"' , n += h = a ( r , o ) , n += '"' , o += h . length - 1 , l = "afterKey" } else if ( "afterKey" === l && ":" === r [ o ] ) n += ":" , l = ":" ; else if ( ":" === l ) o = o + ( t = u ( r , o ) ) . originLength - 1 , n += e ( t . body ) , l = "afterBody" ; else if ( "afterBody" === l || "needKey" === l ) { for ( var g = o ; "," === r [ g ] || s ( r [ g ] ) ; ) g ++ ; if ( "}" === r [ g ] && g === r . length - 1 ) { for ( ; "," === n [ n . length - 1 ] ; ) n = n . substr ( 0 , n . length - 1 ) ; return n += "}" } g !== o && "{" !== n && ( n += "," , l = "needKey" , o = g - 1 ) } } else n += '"' + ( h = a ( r , o + 1 , r [ o ] ) ) + '"' , o += h . length , o += 1 , l = "afterKey" ; throw new Error ( "Broken JSON object near " + n ) } if ( "[" === r [ 0 ] ) { for ( n = "[" , l = "needBody" , o = 1 ; o < r . length ; o ++ ) if ( " " !== r [ o ] && "\n" !== r [ o ] && "\t" !== r [ o ] ) if ( "needBody" === l ) { if ( "," === r [ o ] ) { n += "null," ; continue } if ( "]" === r [ o ] && o === r . length - 1 ) return "," === n [ n . length - 1 ] && ( n = n . substr ( 0 , n . length - 1 ) ) , n += "]" ; o = o + ( t = u ( r , o ) ) . originLength - 1 , n += e ( t . body ) , l = "afterBody" } else if ( "afterBody" === l ) if ( "," === r [ o ] ) for ( n += "," , l = "needBody" ; "," === r [ o + 1 ] || s ( r [ o + 1 ] ) ; ) "," === r [ o + 1 ] && ( n += "null," ) , o ++ ; else if ( "]" === r [ o ] && o === r . length - 1 ) return n += "]" ; throw new Error ( "Broken JSON array near " + n ) } } ( e ) ; return JSON . parse ( r ) } } ( ) ;
2017-02-04 19:49:11 +00:00
if ( window . jQuery === undefined ) {
2016-05-23 20:04:57 +00:00
throw new Error ( 'The jQuery library is not loaded. The OctoberCMS framework cannot be initialized.' ) ;
2017-02-04 19:49:11 +00:00
}
if ( window . jQuery . request !== undefined ) {
throw new Error ( 'The OctoberCMS framework is already loaded.' ) ;
}
2014-05-14 13:24:20 +00:00
+ function ( $ ) { "use strict" ;
var Request = function ( element , handler , options ) {
var $el = this . $el = $ ( element ) ;
this . options = options || { } ;
2017-02-04 08:44:53 +00:00
2014-05-14 13:24:20 +00:00
/ *
* Validate handler name
* /
2017-02-04 19:49:11 +00:00
if ( handler === undefined ) {
2014-09-06 03:58:10 +00:00
throw new Error ( 'The request handler name is not specified.' )
2017-02-04 09:03:45 +00:00
}
2014-05-14 13:24:20 +00:00
2017-02-04 09:03:45 +00:00
if ( ! handler . match ( /^(?:\w+\:{2})?on*/ ) ) {
2014-09-06 03:58:10 +00:00
throw new Error ( 'Invalid handler name. The correct handler name format is: "onEvent".' )
2017-02-04 09:03:45 +00:00
}
2014-05-14 13:24:20 +00:00
2015-03-30 01:52:14 +00:00
/ *
* Prepare the options and execute the request
* /
2017-03-19 02:54:21 +00:00
var $form = options . form ? $ ( options . form ) : $el . closest ( 'form' ) ,
2016-01-06 07:48:26 +00:00
$triggerEl = ! ! $form . length ? $form : $el ,
2017-02-04 08:44:53 +00:00
context = { handler : handler , options : options }
2014-05-14 13:24:20 +00:00
2017-02-04 08:44:53 +00:00
$el . trigger ( 'ajaxSetup' , [ context ] )
2014-06-26 06:09:25 +00:00
var _event = jQuery . Event ( 'oc.beforeRequest' )
2016-01-06 07:48:26 +00:00
$triggerEl . trigger ( _event , context )
2014-06-26 06:09:25 +00:00
if ( _event . isDefaultPrevented ( ) ) return
2014-05-14 13:24:20 +00:00
2017-07-28 23:21:49 +00:00
var loading = options . loading !== undefined ? options . loading : null ,
2019-01-25 16:29:49 +00:00
url = options . url !== undefined ? options . url : window . location . href ,
2017-02-04 08:44:53 +00:00
isRedirect = options . redirect !== undefined && options . redirect . length ,
2017-07-27 15:45:26 +00:00
useFlash = options . flash !== undefined ,
useFiles = options . files !== undefined
if ( useFiles && typeof FormData === 'undefined' ) {
console . warn ( 'This browser does not support file uploads via FormData' )
2017-07-28 23:21:49 +00:00
useFiles = false
2017-02-04 09:03:45 +00:00
}
if ( $ . type ( loading ) == 'string' ) {
loading = $ ( loading )
}
2014-05-14 13:24:20 +00:00
2017-07-28 23:21:49 +00:00
/ *
* Request headers
* /
2016-11-17 20:39:54 +00:00
var requestHeaders = {
'X-OCTOBER-REQUEST-HANDLER' : handler ,
'X-OCTOBER-REQUEST-PARTIALS' : this . extractPartials ( options . update )
}
2017-02-04 04:42:43 +00:00
if ( useFlash ) {
2016-11-17 20:39:54 +00:00
requestHeaders [ 'X-OCTOBER-REQUEST-FLASH' ] = 1
}
2017-07-28 23:21:49 +00:00
/ *
* Request data
* /
var requestData ,
inputName ,
data = { }
$ . each ( $el . parents ( '[data-request-data]' ) . toArray ( ) . reverse ( ) , function extendRequest ( ) {
$ . extend ( data , paramToObj ( 'data-request-data' , $ ( this ) . data ( 'request-data' ) ) )
} )
if ( $el . is ( ':input' ) && ! $form . length ) {
inputName = $el . attr ( 'name' )
if ( inputName !== undefined && options . data [ inputName ] === undefined ) {
2017-09-19 21:34:48 +00:00
options . data [ inputName ] = $el . val ( )
2017-07-28 23:21:49 +00:00
}
}
2017-09-19 21:34:48 +00:00
if ( options . data !== undefined && ! $ . isEmptyObject ( options . data ) ) {
$ . extend ( data , options . data )
}
2017-07-28 23:21:49 +00:00
if ( useFiles ) {
2019-06-19 09:59:13 +00:00
requestData = new FormData ( $form . length ? $form . get ( 0 ) : undefined )
2017-07-28 23:21:49 +00:00
if ( $el . is ( ':file' ) && inputName ) {
$ . each ( $el . prop ( 'files' ) , function ( ) {
requestData . append ( inputName , this )
} )
delete data [ inputName ]
}
$ . each ( data , function ( key ) {
requestData . append ( key , this )
} )
}
else {
2017-11-23 15:54:17 +00:00
requestData = [ $form . serialize ( ) , $ . param ( data ) ] . filter ( Boolean ) . join ( '&' )
2017-07-28 23:21:49 +00:00
}
/ *
* Request options
* /
2014-05-14 13:24:20 +00:00
var requestOptions = {
2019-01-25 16:29:49 +00:00
url : url ,
2017-02-15 15:56:43 +00:00
crossDomain : false ,
2019-07-14 20:41:35 +00:00
global : options . ajaxGlobal ,
2014-05-14 13:24:20 +00:00
context : context ,
2016-11-17 20:39:54 +00:00
headers : requestHeaders ,
2014-05-14 13:24:20 +00:00
success : function ( data , textStatus , jqXHR ) {
2014-05-15 04:16:11 +00:00
/ *
* Halt here if beforeUpdate ( ) or data - request - before - update returns false
* /
2014-05-15 04:21:40 +00:00
if ( this . options . beforeUpdate . apply ( this , [ data , textStatus , jqXHR ] ) === false ) return
2015-04-07 21:44:26 +00:00
if ( options . evalBeforeUpdate && eval ( '(function($el, context, data, textStatus, jqXHR) {' + options . evalBeforeUpdate + '}.call($el.get(0), $el, context, data, textStatus, jqXHR))' ) === false ) return
2014-05-15 04:16:11 +00:00
/ *
* Trigger 'ajaxBeforeUpdate' on the form , halt if event . preventDefault ( ) is called
* /
var _event = jQuery . Event ( 'ajaxBeforeUpdate' )
2016-01-06 07:48:26 +00:00
$triggerEl . trigger ( _event , [ context , data , textStatus , jqXHR ] )
2014-05-15 04:16:11 +00:00
if ( _event . isDefaultPrevented ( ) ) return
2017-02-04 04:42:43 +00:00
if ( useFlash && data [ 'X_OCTOBER_FLASH_MESSAGES' ] ) {
$ . each ( data [ 'X_OCTOBER_FLASH_MESSAGES' ] , function ( type , message ) {
requestOptions . handleFlashMessage ( message , type )
} )
}
2014-05-15 04:16:11 +00:00
/ *
* Proceed with the update process
* /
2014-05-14 13:24:20 +00:00
var updatePromise = requestOptions . handleUpdateResponse ( data , textStatus , jqXHR )
2016-05-23 20:04:57 +00:00
updatePromise . done ( function ( ) {
2016-01-06 07:48:26 +00:00
$triggerEl . trigger ( 'ajaxSuccess' , [ context , data , textStatus , jqXHR ] )
2015-04-07 21:44:26 +00:00
options . evalSuccess && eval ( '(function($el, context, data, textStatus, jqXHR) {' + options . evalSuccess + '}.call($el.get(0), $el, context, data, textStatus, jqXHR))' )
2014-05-14 13:24:20 +00:00
} )
return updatePromise
} ,
error : function ( jqXHR , textStatus , errorThrown ) {
var errorMsg ,
updatePromise = $ . Deferred ( )
2015-03-30 01:52:14 +00:00
if ( ( window . ocUnloading !== undefined && window . ocUnloading ) || errorThrown == 'abort' )
2014-05-14 13:24:20 +00:00
return
2014-09-13 07:47:38 +00:00
/ *
* Disable redirects
* /
isRedirect = false
options . redirect = null
2014-05-14 13:24:20 +00:00
/ *
* Error 406 is a "smart error" that returns response object that is
* processed in the same fashion as a successful response .
* /
if ( jqXHR . status == 406 && jqXHR . responseJSON ) {
errorMsg = jqXHR . responseJSON [ 'X_OCTOBER_ERROR_MESSAGE' ]
updatePromise = requestOptions . handleUpdateResponse ( jqXHR . responseJSON , textStatus , jqXHR )
}
/ *
* Standard error with standard response text
* /
else {
errorMsg = jqXHR . responseText ? jqXHR . responseText : jqXHR . statusText
updatePromise . resolve ( )
}
2016-05-23 20:04:57 +00:00
updatePromise . done ( function ( ) {
2014-05-14 13:24:20 +00:00
$el . data ( 'error-message' , errorMsg )
2014-05-15 04:16:11 +00:00
/ *
* Trigger 'ajaxError' on the form , halt if event . preventDefault ( ) is called
* /
var _event = jQuery . Event ( 'ajaxError' )
2016-11-17 20:39:54 +00:00
$triggerEl . trigger ( _event , [ context , errorMsg , textStatus , jqXHR ] )
2014-05-15 04:16:11 +00:00
if ( _event . isDefaultPrevented ( ) ) return
2014-05-14 13:24:20 +00:00
/ *
* Halt here if the data - request - error attribute returns false
* /
2016-11-17 20:39:54 +00:00
if ( options . evalError && eval ( '(function($el, context, errorMsg, textStatus, jqXHR) {' + options . evalError + '}.call($el.get(0), $el, context, errorMsg, textStatus, jqXHR))' ) === false )
2014-05-14 13:24:20 +00:00
return
requestOptions . handleErrorMessage ( errorMsg )
} )
return updatePromise
} ,
2015-04-06 23:14:17 +00:00
complete : function ( data , textStatus , jqXHR ) {
2016-01-06 07:48:26 +00:00
$triggerEl . trigger ( 'ajaxComplete' , [ context , data , textStatus , jqXHR ] )
2015-04-07 21:44:26 +00:00
options . evalComplete && eval ( '(function($el, context, data, textStatus, jqXHR) {' + options . evalComplete + '}.call($el.get(0), $el, context, data, textStatus, jqXHR))' )
2015-04-06 23:14:17 +00:00
} ,
2014-05-14 13:24:20 +00:00
2017-02-04 08:44:53 +00:00
/ *
* Custom function , requests confirmation from the user
* /
handleConfirmMessage : function ( message ) {
var _event = jQuery . Event ( 'ajaxConfirmMessage' )
_event . promise = $ . Deferred ( )
if ( $ ( window ) . triggerHandler ( _event , [ message ] ) !== undefined ) {
_event . promise . done ( function ( ) {
options . confirm = null
new Request ( element , handler , options )
} )
return false
}
if ( _event . isDefaultPrevented ( ) ) return
if ( message ) return confirm ( message )
} ,
2017-02-04 09:03:45 +00:00
/ *
* Custom function , display an error message to the user
* /
handleErrorMessage : function ( message ) {
var _event = jQuery . Event ( 'ajaxErrorMessage' )
$ ( window ) . trigger ( _event , [ message ] )
if ( _event . isDefaultPrevented ( ) ) return
if ( message ) alert ( message )
} ,
/ *
* Custom function , focus fields with errors
* /
handleValidationMessage : function ( message , fields ) {
$triggerEl . trigger ( 'ajaxValidation' , [ context , message , fields ] )
var isFirstInvalidField = true
$ . each ( fields , function focusErrorField ( fieldName , fieldMessages ) {
2017-11-21 20:12:00 +00:00
fieldName = fieldName . replace ( /\.(\w+)/g , '[$1]' )
2017-11-21 23:05:04 +00:00
2017-02-04 09:03:45 +00:00
var fieldElement = $form . find ( '[name="' + fieldName + '"], [name="' + fieldName + '[]"], [name$="[' + fieldName + ']"], [name$="[' + fieldName + '][]"]' ) . filter ( ':enabled' ) . first ( )
if ( fieldElement . length > 0 ) {
var _event = jQuery . Event ( 'ajaxInvalidField' )
$ ( window ) . trigger ( _event , [ fieldElement . get ( 0 ) , fieldName , fieldMessages , isFirstInvalidField ] )
if ( isFirstInvalidField ) {
if ( ! _event . isDefaultPrevented ( ) ) fieldElement . focus ( )
isFirstInvalidField = false
}
}
} )
} ,
2017-02-04 04:42:43 +00:00
/ *
* Custom function , display a flash message to the user
* /
2017-02-04 08:14:26 +00:00
handleFlashMessage : function ( message , type ) { } ,
/ *
* Custom function , redirect the browser to another location
* /
handleRedirectResponse : function ( url ) {
window . location . href = url
} ,
2017-02-04 04:42:43 +00:00
2014-05-14 13:24:20 +00:00
/ *
* Custom function , handle any application specific response values
* Using a promisary object here in case injected assets need time to load
* /
handleUpdateResponse : function ( data , textStatus , jqXHR ) {
/ *
* Update partials and finish request
* /
2016-05-23 20:04:57 +00:00
var updatePromise = $ . Deferred ( ) . done ( function ( ) {
2014-05-14 13:24:20 +00:00
for ( var partial in data ) {
/ *
2015-04-06 23:14:17 +00:00
* If a partial has been supplied on the client side that matches the server supplied key , look up
2014-05-14 13:24:20 +00:00
* it ' s selector and use that . If not , we assume it is an explicit selector reference .
* /
var selector = ( options . update [ partial ] ) ? options . update [ partial ] : partial
2017-02-03 22:21:45 +00:00
if ( $ . type ( selector ) == 'string' && selector . charAt ( 0 ) == '@' ) {
2014-05-14 13:24:20 +00:00
$ ( selector . substring ( 1 ) ) . append ( data [ partial ] ) . trigger ( 'ajaxUpdate' , [ context , data , textStatus , jqXHR ] )
2017-02-03 22:21:45 +00:00
}
else if ( $ . type ( selector ) == 'string' && selector . charAt ( 0 ) == '^' ) {
2014-06-09 22:16:33 +00:00
$ ( selector . substring ( 1 ) ) . prepend ( data [ partial ] ) . trigger ( 'ajaxUpdate' , [ context , data , textStatus , jqXHR ] )
2017-02-03 22:21:45 +00:00
}
else {
2015-04-29 03:13:04 +00:00
$ ( selector ) . trigger ( 'ajaxBeforeReplace' )
2014-05-14 13:24:20 +00:00
$ ( selector ) . html ( data [ partial ] ) . trigger ( 'ajaxUpdate' , [ context , data , textStatus , jqXHR ] )
2015-04-29 03:13:04 +00:00
}
2014-05-14 13:24:20 +00:00
}
/ *
* Wait for . html ( ) method to finish rendering from partial updates
* /
2016-05-23 20:04:57 +00:00
setTimeout ( function ( ) {
2014-05-14 13:24:20 +00:00
$ ( window )
. trigger ( 'ajaxUpdateComplete' , [ context , data , textStatus , jqXHR ] )
. trigger ( 'resize' )
} , 0 )
} )
/ *
* Handle redirect
* /
if ( data [ 'X_OCTOBER_REDIRECT' ] ) {
options . redirect = data [ 'X_OCTOBER_REDIRECT' ]
isRedirect = true
}
2017-02-04 08:14:26 +00:00
if ( isRedirect ) {
requestOptions . handleRedirectResponse ( options . redirect )
}
2014-05-14 13:24:20 +00:00
/ *
2017-02-04 09:03:45 +00:00
* Handle validation
2014-05-14 13:24:20 +00:00
* /
if ( data [ 'X_OCTOBER_ERROR_FIELDS' ] ) {
2017-02-04 09:03:45 +00:00
requestOptions . handleValidationMessage ( data [ 'X_OCTOBER_ERROR_MESSAGE' ] , data [ 'X_OCTOBER_ERROR_FIELDS' ] )
2014-05-14 13:24:20 +00:00
}
/ *
* Handle asset injection
* /
if ( data [ 'X_OCTOBER_ASSETS' ] ) {
2015-04-29 03:13:04 +00:00
assetManager . load ( data [ 'X_OCTOBER_ASSETS' ] , $ . proxy ( updatePromise . resolve , updatePromise ) )
2014-05-14 13:24:20 +00:00
}
2016-11-17 20:39:54 +00:00
else {
2014-05-14 13:24:20 +00:00
updatePromise . resolve ( )
2016-11-17 20:39:54 +00:00
}
2014-05-14 13:24:20 +00:00
return updatePromise
}
}
2017-07-28 23:21:49 +00:00
if ( useFiles ) {
2017-07-27 15:45:26 +00:00
requestOptions . processData = requestOptions . contentType = false
}
2014-05-14 13:24:20 +00:00
/ *
* Allow default business logic to be called from user functions
* /
context . success = requestOptions . success
context . error = requestOptions . error
2015-04-06 23:14:17 +00:00
context . complete = requestOptions . complete
2014-05-14 13:24:20 +00:00
requestOptions = $ . extend ( requestOptions , options )
2017-07-27 15:45:26 +00:00
requestOptions . data = requestData
2014-05-14 13:24:20 +00:00
2017-02-04 09:15:13 +00:00
/ *
* Initiate request
* /
if ( options . confirm && ! requestOptions . handleConfirmMessage ( options . confirm ) ) {
return
}
2014-05-14 13:24:20 +00:00
if ( loading ) loading . show ( )
2017-02-04 08:44:53 +00:00
$ ( window ) . trigger ( 'ajaxBeforeSend' , [ context ] )
$el . trigger ( 'ajaxPromise' , [ context ] )
2014-05-14 13:24:20 +00:00
return $ . ajax ( requestOptions )
2016-05-23 20:04:57 +00:00
. fail ( function ( jqXHR , textStatus , errorThrown ) {
2014-09-28 02:23:18 +00:00
if ( ! isRedirect ) {
$el . trigger ( 'ajaxFail' , [ context , textStatus , jqXHR ] )
}
2017-05-25 17:58:52 +00:00
if ( loading ) loading . hide ( )
2014-05-14 13:24:20 +00:00
} )
2016-05-23 20:04:57 +00:00
. done ( function ( data , textStatus , jqXHR ) {
2014-09-28 02:23:18 +00:00
if ( ! isRedirect ) {
$el . trigger ( 'ajaxDone' , [ context , data , textStatus , jqXHR ] )
}
2017-05-25 17:58:52 +00:00
if ( loading ) loading . hide ( )
2014-05-14 13:24:20 +00:00
} )
2016-05-23 20:04:57 +00:00
. always ( function ( dataOrXhr , textStatus , xhrOrError ) {
2014-05-14 13:24:20 +00:00
$el . trigger ( 'ajaxAlways' , [ context , dataOrXhr , textStatus , xhrOrError ] )
} )
}
Request . DEFAULTS = {
update : { } ,
type : 'POST' ,
beforeUpdate : function ( data , textStatus , jqXHR ) { } ,
2014-05-15 04:16:11 +00:00
evalBeforeUpdate : null ,
2014-05-14 13:24:20 +00:00
evalSuccess : null ,
2015-04-06 23:14:17 +00:00
evalError : null ,
2019-07-14 20:41:35 +00:00
evalComplete : null ,
ajaxGlobal : false
2014-05-14 13:24:20 +00:00
}
/ *
* Internal function , build a string of partials and their update elements .
* /
Request . prototype . extractPartials = function ( update ) {
2014-09-06 03:58:10 +00:00
var result = [ ]
2014-05-14 13:24:20 +00:00
for ( var partial in update )
result . push ( partial )
2014-09-06 03:58:10 +00:00
return result . join ( '&' )
2014-05-14 13:24:20 +00:00
}
// REQUEST PLUGIN DEFINITION
// ============================
var old = $ . fn . request
2016-05-23 20:04:57 +00:00
$ . fn . request = function ( handler , option ) {
2014-05-14 13:24:20 +00:00
var args = arguments
var $this = $ ( this ) . first ( )
var data = {
2014-05-15 04:16:11 +00:00
evalBeforeUpdate : $this . data ( 'request-before-update' ) ,
2014-05-14 13:24:20 +00:00
evalSuccess : $this . data ( 'request-success' ) ,
evalError : $this . data ( 'request-error' ) ,
2015-04-06 23:14:17 +00:00
evalComplete : $this . data ( 'request-complete' ) ,
2019-07-14 20:41:35 +00:00
ajaxGlobal : $this . data ( 'request-ajax-global' ) ,
2014-05-14 13:24:20 +00:00
confirm : $this . data ( 'request-confirm' ) ,
redirect : $this . data ( 'request-redirect' ) ,
loading : $this . data ( 'request-loading' ) ,
2016-11-17 20:39:54 +00:00
flash : $this . data ( 'request-flash' ) ,
2017-07-27 15:45:26 +00:00
files : $this . data ( 'request-files' ) ,
2017-03-19 02:54:21 +00:00
form : $this . data ( 'request-form' ) ,
2019-01-25 16:29:49 +00:00
url : $this . data ( 'request-url' ) ,
2014-05-14 13:24:20 +00:00
update : paramToObj ( 'data-request-update' , $this . data ( 'request-update' ) ) ,
data : paramToObj ( 'data-request-data' , $this . data ( 'request-data' ) )
}
if ( ! handler ) handler = $this . data ( 'request' )
var options = $ . extend ( true , { } , Request . DEFAULTS , data , typeof option == 'object' && option )
return new Request ( $this , handler , options )
}
$ . fn . request . Constructor = Request
2016-05-23 20:04:57 +00:00
$ . request = function ( handler , option ) {
2017-02-06 16:36:57 +00:00
return $ ( document ) . request ( handler , option )
2014-05-14 13:24:20 +00:00
}
// REQUEST NO CONFLICT
// =================
2016-05-23 20:04:57 +00:00
$ . fn . request . noConflict = function ( ) {
2014-05-14 13:24:20 +00:00
$ . fn . request = old
return this
}
// REQUEST DATA-API
// ==============
function paramToObj ( name , value ) {
if ( value === undefined ) value = ''
if ( typeof value == 'object' ) return value
try {
2019-09-14 07:29:31 +00:00
return $ . oc . JSON ( "{" + value + "}" )
2014-11-01 01:00:45 +00:00
}
catch ( e ) {
2014-05-14 13:24:20 +00:00
throw new Error ( 'Error parsing the ' + name + ' attribute value. ' + e )
}
}
2017-07-28 23:21:49 +00:00
$ ( document ) . on ( 'change' , 'select[data-request], input[type=radio][data-request], input[type=checkbox][data-request], input[type=file][data-request]' , function documentOnChange ( ) {
2014-07-27 06:08:08 +00:00
$ ( this ) . request ( )
2014-09-06 03:58:10 +00:00
} )
2014-05-14 13:24:20 +00:00
2016-05-28 03:02:54 +00:00
$ ( document ) . on ( 'click' , 'a[data-request], button[data-request], input[type=button][data-request], input[type=submit][data-request]' , function documentOnClick ( e ) {
e . preventDefault ( )
2014-12-28 02:03:52 +00:00
$ ( this ) . request ( )
2016-05-28 03:02:54 +00:00
if ( $ ( this ) . is ( '[type=submit]' ) )
return false
2014-12-28 02:03:52 +00:00
} )
2014-05-14 13:24:20 +00:00
2016-05-23 20:04:57 +00:00
$ ( document ) . on ( 'keydown' , 'input[type=text][data-request], input[type=submit][data-request], input[type=password][data-request]' , function documentOnKeydown ( e ) {
2019-09-11 11:35:18 +00:00
if ( e . key === 'Enter' ) {
2014-05-14 13:24:20 +00:00
if ( this . dataTrackInputTimer !== undefined )
2014-07-27 06:08:08 +00:00
window . clearTimeout ( this . dataTrackInputTimer )
2014-05-14 13:24:20 +00:00
2014-07-27 06:08:08 +00:00
$ ( this ) . request ( )
2014-09-06 03:58:10 +00:00
return false
2014-05-14 13:24:20 +00:00
}
2014-09-06 03:58:10 +00:00
} )
2014-05-14 13:24:20 +00:00
2018-05-31 02:26:38 +00:00
$ ( document ) . on ( 'input' , 'input[data-request][data-track-input]' , function documentOnKeyup ( e ) {
2014-09-06 03:58:10 +00:00
var
2014-05-14 13:24:20 +00:00
$el = $ ( this ) ,
2014-09-06 03:58:10 +00:00
lastValue = $el . data ( 'oc.lastvalue' )
2014-05-14 13:24:20 +00:00
2016-05-28 03:02:54 +00:00
if ( ! $el . is ( '[type=email],[type=number],[type=password],[type=search],[type=text]' ) )
return
2014-05-14 13:24:20 +00:00
if ( lastValue !== undefined && lastValue == this . value )
return
$el . data ( 'oc.lastvalue' , this . value )
if ( this . dataTrackInputTimer !== undefined )
2014-07-27 06:08:08 +00:00
window . clearTimeout ( this . dataTrackInputTimer )
2014-05-14 13:24:20 +00:00
var interval = $ ( this ) . data ( 'track-input' )
if ( ! interval )
2014-07-27 06:08:08 +00:00
interval = 300
2014-05-14 13:24:20 +00:00
2014-09-06 03:58:10 +00:00
var self = this
2016-05-23 20:04:57 +00:00
this . dataTrackInputTimer = window . setTimeout ( function ( ) {
2019-04-19 16:52:50 +00:00
if ( self . lastDataTrackInputRequest ) {
self . lastDataTrackInputRequest . abort ( ) ;
}
self . lastDataTrackInputRequest = $ ( self ) . request ( ) ;
2014-09-06 03:58:10 +00:00
} , interval )
} )
2014-05-14 13:24:20 +00:00
2016-05-23 20:04:57 +00:00
$ ( document ) . on ( 'submit' , '[data-request]' , function documentOnSubmit ( ) {
2014-07-27 06:08:08 +00:00
$ ( this ) . request ( )
2014-09-06 03:58:10 +00:00
return false
} )
2014-05-14 13:24:20 +00:00
2016-01-06 07:50:24 +00:00
$ ( window ) . on ( 'beforeunload' , function documentOnBeforeUnload ( ) {
2015-03-30 01:52:14 +00:00
window . ocUnloading = true
} )
2014-05-14 13:24:20 +00:00
/ *
* Invent our own event that unifies document . ready with window . ajaxUpdateComplete
2015-04-06 23:14:17 +00:00
*
2014-05-14 13:24:20 +00:00
* $ ( document ) . render ( function ( ) { } )
2016-05-23 20:04:57 +00:00
* $ ( document ) . on ( 'render' , function ( ) { } )
2014-05-14 13:24:20 +00:00
* /
2016-05-23 20:04:57 +00:00
$ ( document ) . ready ( function triggerRenderOnReady ( ) {
2014-05-14 13:24:20 +00:00
$ ( document ) . trigger ( 'render' )
} )
2015-03-30 01:52:14 +00:00
$ ( window ) . on ( 'ajaxUpdateComplete' , function triggerRenderOnAjaxUpdateComplete ( ) {
2014-05-14 13:24:20 +00:00
$ ( document ) . trigger ( 'render' )
} )
$ . fn . render = function ( callback ) {
$ ( document ) . on ( 'render' , callback )
}
2014-06-09 20:47:00 +00:00
} ( window . jQuery ) ;