@@ -775,166 +775,179 @@ window.AJAX = {
775775 $ ( document ) . off ( 'submit' , 'form' ) . on ( 'submit' , 'form' , window . AJAX . requestHandler ) ;
776776 callback ( ) ;
777777 }
778- }
779- } ;
780-
781- /**
782- * Here we register a function that will remove the onsubmit event from all
783- * forms that will be handled by the generic page loader. We then save this
784- * event handler in the "jQuery data", so that we can fire it up later in
785- * window.AJAX.requestHandler().
786- *
787- * See bug #3583316
788- */
789- window . AJAX . registerOnload ( 'functions.js' , function ( ) {
790- // Registering the onload event for functions.js
791- // ensures that it will be fired for all pages
792- $ ( 'form' ) . not ( '.ajax' ) . not ( '.disableAjax' ) . each ( function ( ) {
793- if ( $ ( this ) . attr ( 'onsubmit' ) ) {
794- $ ( this ) . data ( 'onsubmit' , this . onsubmit ) . attr ( 'onsubmit' , '' ) ;
795- }
796- } ) ;
778+ } ,
797779
798- var $pageContent = $ ( '#page_content' ) ;
799780 /**
800- * Workaround for passing submit button name,value on ajax form submit
801- * by appending hidden element with submit button name and value.
781+ * Here we register a function that will remove the onsubmit event from all
782+ * forms that will be handled by the generic page loader. We then save this
783+ * event handler in the "jQuery data", so that we can fire it up later in
784+ * window.AJAX.requestHandler().
785+ *
786+ * See bug #3583316
802787 */
803- $pageContent . on ( 'click' , 'form input[type=submit]' , function ( ) {
804- var buttonName = $ ( this ) . attr ( 'name' ) ;
805- if ( typeof buttonName === 'undefined' ) {
806- return ;
807- }
808- $ ( this ) . closest ( 'form' ) . append ( $ ( '<input>' , {
809- 'type' : 'hidden' ,
810- 'name' : buttonName ,
811- 'value' : $ ( this ) . val ( )
812- } ) ) ;
813- } ) ;
788+ removeSubmitEvents : function ( ) {
789+ // Registering the onload event for functions.js
790+ // ensures that it will be fired for all pages
791+ $ ( 'form' ) . not ( '.ajax' ) . not ( '.disableAjax' ) . each ( function ( ) {
792+ if ( $ ( this ) . attr ( 'onsubmit' ) ) {
793+ $ ( this ) . data ( 'onsubmit' , this . onsubmit ) . attr ( 'onsubmit' , '' ) ;
794+ }
795+ } ) ;
796+
797+ var $pageContent = $ ( '#page_content' ) ;
798+ /**
799+ * Workaround for passing submit button name,value on ajax form submit
800+ * by appending hidden element with submit button name and value.
801+ */
802+ $pageContent . on ( 'click' , 'form input[type=submit]' , function ( ) {
803+ var buttonName = $ ( this ) . attr ( 'name' ) ;
804+ if ( typeof buttonName === 'undefined' ) {
805+ return ;
806+ }
807+ $ ( this ) . closest ( 'form' ) . append ( $ ( '<input>' , {
808+ 'type' : 'hidden' ,
809+ 'name' : buttonName ,
810+ 'value' : $ ( this ) . val ( )
811+ } ) ) ;
812+ } ) ;
813+
814+ /**
815+ * Attach event listener to events when user modify visible
816+ * Input,Textarea and select fields to make changes in forms
817+ */
818+ $pageContent . on (
819+ 'keyup change' ,
820+ 'form.lock-page textarea, ' +
821+ 'form.lock-page input[type="text"], ' +
822+ 'form.lock-page input[type="number"], ' +
823+ 'form.lock-page select' ,
824+ { value : 1 } ,
825+ window . AJAX . lockPageHandler
826+ ) ;
827+ $pageContent . on (
828+ 'change' ,
829+ 'form.lock-page input[type="checkbox"], ' +
830+ 'form.lock-page input[type="radio"]' ,
831+ { value : 2 } ,
832+ window . AJAX . lockPageHandler
833+ ) ;
834+ /**
835+ * Reset lock when lock-page form reset event is fired
836+ * Note: reset does not bubble in all browser so attach to
837+ * form directly.
838+ */
839+ $ ( 'form.lock-page' ) . on ( 'reset' , function ( ) {
840+ window . AJAX . resetLock ( ) ;
841+ } ) ;
842+ } ,
814843
815844 /**
816- * Attach event listener to events when user modify visible
817- * Input,Textarea and select fields to make changes in forms
845+ * Page load event handler
846+ * @return { function }
818847 */
819- $pageContent . on (
820- 'keyup change' ,
821- 'form.lock-page textarea, ' +
822- 'form.lock-page input[type="text"], ' +
823- 'form.lock-page input[type="number"], ' +
824- 'form.lock-page select' ,
825- { value :1 } ,
826- window . AJAX . lockPageHandler
827- ) ;
828- $pageContent . on (
829- 'change' ,
830- 'form.lock-page input[type="checkbox"], ' +
831- 'form.lock-page input[type="radio"]' ,
832- { value :2 } ,
833- window . AJAX . lockPageHandler
834- ) ;
848+ loadEventHandler : function ( ) {
849+ return function ( ) {
850+ var menuContent = $ ( '<div></div>' )
851+ . append ( $ ( '#server-breadcrumb' ) . clone ( ) )
852+ . append ( $ ( '#topmenucontainer' ) . clone ( ) )
853+ . html ( ) ;
854+
855+ // set initial state reload
856+ var initState = ( 'state' in window . history && window . history . state !== null ) ;
857+ var initURL = $ ( '#selflink' ) . find ( '> a' ) . attr ( 'href' ) || location . href ;
858+ var state = {
859+ url : initURL ,
860+ menu : menuContent
861+ } ;
862+ history . replaceState ( state , null ) ;
863+
864+ $ ( window ) . on ( 'popstate' , function ( event ) {
865+ var initPop = ( ! initState && location . href === initURL ) ;
866+ initState = true ;
867+ // check if popstate fired on first page itself
868+ if ( initPop ) {
869+ return ;
870+ }
871+ var state = event . originalEvent . state ;
872+ if ( state && state . menu ) {
873+ window . AJAX . $msgbox = Functions . ajaxShowMessage ( ) ;
874+ var params = 'ajax_request=true' + window . CommonParams . get ( 'arg_separator' ) + 'ajax_page_request=true' ;
875+ var url = state . url || location . href ;
876+ $ . get ( url , params , window . AJAX . responseHandler ) ;
877+ // TODO: Check if sometimes menu is not retrieved from server,
878+ // Not sure but it seems menu was missing only for printview which
879+ // been removed lately, so if it's right some dead menu checks/fallbacks
880+ // may need to be removed from this file and Header.php
881+ // window.AJAX.handleMenu.replace(event.originalEvent.state.menu);
882+ }
883+ } ) ;
884+ } ;
885+ } ,
886+
835887 /**
836- * Reset lock when lock-page form reset event is fired
837- * Note: reset does not bubble in all browser so attach to
838- * form directly.
888+ * Gracefully handle fatal server errors (e.g: 500 - Internal server error)
889+ * @return {function }
839890 */
840- $ ( 'form.lock-page' ) . on ( 'reset' , function ( ) {
841- window . AJAX . resetLock ( ) ;
842- } ) ;
843- } ) ;
891+ getFatalErrorHandler : function ( ) {
892+ return function ( event , request ) {
893+ if ( window . AJAX . debug ) {
894+ // eslint-disable-next-line no-console
895+ console . log ( 'AJAX error: status=' + request . status + ', text=' + request . statusText ) ;
896+ }
897+ // Don't handle aborted requests
898+ if ( request . status !== 0 || request . statusText !== 'abort' ) {
899+ var details = '' ;
900+ var state = request . state ( ) ;
901+
902+ if (
903+ 'responseJSON' in request &&
904+ 'isErrorResponse' in request . responseJSON &&
905+ request . responseJSON . isErrorResponse
906+ ) {
907+ Functions . ajaxShowMessage (
908+ '<div class="alert alert-danger" role="alert">' +
909+ Functions . escapeHtml ( request . responseJSON . error ) +
910+ '</div>' ,
911+ false
912+ ) ;
913+ window . AJAX . active = false ;
914+ window . AJAX . xhr = null ;
844915
845- /**
846- * Page load event handler
847- */
848- $ ( function ( ) {
849- var menuContent = $ ( '<div></div>' )
850- . append ( $ ( '#server-breadcrumb' ) . clone ( ) )
851- . append ( $ ( '#topmenucontainer' ) . clone ( ) )
852- . html ( ) ;
853-
854- // set initial state reload
855- var initState = ( 'state' in window . history && window . history . state !== null ) ;
856- var initURL = $ ( '#selflink' ) . find ( '> a' ) . attr ( 'href' ) || location . href ;
857- var state = {
858- url : initURL ,
859- menu : menuContent
860- } ;
861- history . replaceState ( state , null ) ;
862-
863- $ ( window ) . on ( 'popstate' , function ( event ) {
864- var initPop = ( ! initState && location . href === initURL ) ;
865- initState = true ;
866- // check if popstate fired on first page itself
867- if ( initPop ) {
868- return ;
869- }
870- var state = event . originalEvent . state ;
871- if ( state && state . menu ) {
872- window . AJAX . $msgbox = Functions . ajaxShowMessage ( ) ;
873- var params = 'ajax_request=true' + window . CommonParams . get ( 'arg_separator' ) + 'ajax_page_request=true' ;
874- var url = state . url || location . href ;
875- $ . get ( url , params , window . AJAX . responseHandler ) ;
876- // TODO: Check if sometimes menu is not retrieved from server,
877- // Not sure but it seems menu was missing only for printview which
878- // been removed lately, so if it's right some dead menu checks/fallbacks
879- // may need to be removed from this file and Header.php
880- // window.AJAX.handleMenu.replace(event.originalEvent.state.menu);
881- }
882- } ) ;
916+ return ;
917+ }
918+
919+ if ( request . status !== 0 ) {
920+ details += '<div>' + Functions . escapeHtml ( Functions . sprintf ( Messages . strErrorCode , request . status ) ) + '</div>' ;
921+ }
922+ details += '<div>' + Functions . escapeHtml ( Functions . sprintf ( Messages . strErrorText , request . statusText + ' (' + state + ')' ) ) + '</div>' ;
923+ if ( state === 'rejected' || state === 'timeout' ) {
924+ details += '<div>' + Functions . escapeHtml ( Messages . strErrorConnection ) + '</div>' ;
925+ }
926+ Functions . ajaxShowMessage (
927+ '<div class="alert alert-danger" role="alert">' +
928+ Messages . strErrorProcessingRequest +
929+ details +
930+ '</div>' ,
931+ false
932+ ) ;
933+ window . AJAX . active = false ;
934+ window . AJAX . xhr = null ;
935+ }
936+ } ;
937+ }
938+ } ;
939+
940+ window . AJAX . registerOnload ( 'functions.js' , function ( ) {
941+ window . AJAX . removeSubmitEvents ( ) ;
883942} ) ;
884943
944+ $ ( window . AJAX . loadEventHandler ( ) ) ;
945+
885946/**
886947 * Attach a generic event handler to clicks
887948 * on pages and submissions of forms
888949 */
889950$ ( document ) . on ( 'click' , 'a' , window . AJAX . requestHandler ) ;
890951$ ( document ) . on ( 'submit' , 'form' , window . AJAX . requestHandler ) ;
891952
892- /**
893- * Gracefully handle fatal server errors
894- * (e.g: 500 - Internal server error)
895- */
896- $ ( document ) . on ( 'ajaxError' , function ( event , request ) {
897- if ( window . AJAX . debug ) {
898- // eslint-disable-next-line no-console
899- console . log ( 'AJAX error: status=' + request . status + ', text=' + request . statusText ) ;
900- }
901- // Don't handle aborted requests
902- if ( request . status !== 0 || request . statusText !== 'abort' ) {
903- var details = '' ;
904- var state = request . state ( ) ;
905-
906- if (
907- 'responseJSON' in request &&
908- 'isErrorResponse' in request . responseJSON &&
909- request . responseJSON . isErrorResponse
910- ) {
911- Functions . ajaxShowMessage (
912- '<div class="alert alert-danger" role="alert">' +
913- Functions . escapeHtml ( request . responseJSON . error ) +
914- '</div>' ,
915- false
916- ) ;
917- window . AJAX . active = false ;
918- window . AJAX . xhr = null ;
919-
920- return ;
921- }
922-
923- if ( request . status !== 0 ) {
924- details += '<div>' + Functions . escapeHtml ( Functions . sprintf ( Messages . strErrorCode , request . status ) ) + '</div>' ;
925- }
926- details += '<div>' + Functions . escapeHtml ( Functions . sprintf ( Messages . strErrorText , request . statusText + ' (' + state + ')' ) ) + '</div>' ;
927- if ( state === 'rejected' || state === 'timeout' ) {
928- details += '<div>' + Functions . escapeHtml ( Messages . strErrorConnection ) + '</div>' ;
929- }
930- Functions . ajaxShowMessage (
931- '<div class="alert alert-danger" role="alert">' +
932- Messages . strErrorProcessingRequest +
933- details +
934- '</div>' ,
935- false
936- ) ;
937- window . AJAX . active = false ;
938- window . AJAX . xhr = null ;
939- }
940- } ) ;
953+ $ ( document ) . on ( 'ajaxError' , window . AJAX . getFatalErrorHandler ( ) ) ;
0 commit comments