Skip to content

Commit 6648115

Browse files
committed
Extract functions in ajax.js
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
1 parent 1c2b611 commit 6648115

1 file changed

Lines changed: 158 additions & 145 deletions

File tree

‎js/src/ajax.js‎

Lines changed: 158 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)