$(document).ready(function () { InitAjaxForms(); }); class LocalizedAjaxStrings { private _locale: 'ru' | 'en' = 'ru' private _strings = { messages: { success: { 'ru': 'Успешное выполнение', 'en': 'Completion successful' } } } constructor() { this._locale = $('.page-wrapper').data('lang') || 'ru' } public get getSuccessMessage(): string { return this._strings.messages.success[this._locale] } } function InitAjaxForms() { let ajaxFormSelector = '.ajax-form'; $(ajaxFormSelector).each(InitAjaxForm); function InitAjaxForm(index, form) { AjaxFormInitializer.init(form); } } function InitAjaxForm(formId) { let form = $("#" + formId); AjaxFormInitializer.init(form); } class AjaxFormInitializer { public static init(form) { let ajaxFormMessageSelector = '.ajax-form__message'; let ajaxFormSuccessMessageSelector = '.success-message'; let ajaxFormErrorMessageSelector = '.error-message'; let ajaxMsgContainer = $(form).next(ajaxFormMessageSelector); let isMessageContainer = ajaxMsgContainer.length > 0; let beforeSubmitCallback = $(form).attr("before-submit"); let successMessage = $(form).attr("success-msg"); let showReplyMsg = $(form).attr("show-reply-msg") || false; let disableButtonAfterSubmit = $(form).attr("disable-after-submit"); let reloadAfterSubmit = $(form).attr("reload-after-submit"); let localizedAjaxStrings = new LocalizedAjaxStrings() let options = { beforeSubmit: function (formData, jqForm, options) { $(':input[type="submit"]', form).prop('disabled', true); document.dispatchEvent(new CustomEvent(FieldStatusEvents.Pending, {detail: form})); if (beforeSubmitCallback) { return getFunction(beforeSubmitCallback, ["formData", "jqForm", "options"]).apply(form, arguments); } }, success: function (responseText, statusText, xhr) { ShowMessage(true, responseText); $(form).trigger('ajax-form-success', [responseText, statusText, xhr, form]); document.dispatchEvent(new CustomEvent(FieldStatusEvents.Success, {detail: form})); }, error: function (responseText, statusText, xhr, form) { ShowMessage(false, responseText); $(form).trigger("ajax-form-error", [responseText, statusText, xhr, form]); document.dispatchEvent(new CustomEvent(FieldStatusEvents.Error, {detail: form})); }, complete: function (responseText, statusText, xhr) { if (!disableButtonAfterSubmit) { $(':input[type="submit"]', form).prop('disabled', false); } if (reloadAfterSubmit) { location.reload(); } $(form).trigger('ajax-form-completed', [responseText, statusText, xhr, form]); }, }; ($(form)).ajaxForm(options); function ShowMessage(isSuccess, responseText) { if (isMessageContainer) { ShowMessageInContainer(isSuccess); } else { if (isSuccess) { if (!successMessage) { successMessage = localizedAjaxStrings.getSuccessMessage; } if (showReplyMsg) { MessageShower.showSuccess(responseText); } else { MessageShower.showSuccess(successMessage); } } else { MessageShower.showErrorBadUserInput(responseText); } } } function ShowMessageInContainer(isSuccessResult) { if (isSuccessResult) { $(ajaxFormSuccessMessageSelector, ajaxMsgContainer).removeClass('hidden'); } else { $(ajaxFormErrorMessageSelector, ajaxMsgContainer).removeClass('hidden'); } } } }; //stolen from https://github.com/aspnet/jquery-ajax-unobtrusive/blob/master/src/jquery.unobtrusive-ajax.js function getFunction(code, argNames) { let fn = window as any, parts = (code || "").split("."); while (fn && parts.length) { fn = fn[parts.shift()]; } if (typeof (fn) === "function") { return fn; } argNames.push(code); return Function.constructor.apply(null, argNames); }