gehgassi_backend/gehGassi.Web/TS/Core/JQueryExtensions.ts

345 lines
13 KiB
TypeScript

import { EventManager } from "./Events"
import * as Events from "./EventDefinitions"
export function extendJQueryStatic(): void {
//Hilfsfunktion die den ersten Tab aktiviert der einen Fehler beinhaltet
$.showErrorTab = () => {
var found = false;
if ($(".tab-content").find("div.tab-pane.active:has(div.has-error)").length === 0) {
$(".tab-content").find("div.tab-pane:hidden:has(div.has-error)").each((index, tab) => {
found = true;
var id = $(<any>tab).attr("id");
(<any>$("a[href=\"#" + id + "\"]")).tab("show");
});
}
if (!found) {
$(".tab-content").find("div.tab-pane:hidden:has(span.field-validation-error)").each((index, tab) => {
found = true;
var id = $(<any>tab).attr("id");
(<any>$("a[href=\"#" + id + "\"]")).tab("show");
});
}
}
//Setzt Default-Werte für den unobtrusive Validator
$.setupValidator = () => {
$.validator.setDefaults({
ignore: "input[type='hidden']:not('.validateAlways'), .dontValidate"
});
}
/**
* Buchen der Ajax-Fehler und allgemeins Handling!
*/
$(document).ajaxError((e, xhr) => {
var response;
if (xhr.status === 401) {
EventManager.getInstance().publish(Events.Common.unauthorized);
}
if (xhr.status === 402) {
EventManager.getInstance().publish(Events.Common.subscriptionDenied);
}
if (xhr.status === 403) {
EventManager.getInstance().publish(Events.Common.forbidden);
}
if (xhr.status === 451) {
var target = xhr.getResponseHeader("Location");
window.location = <any>target;
}
});
/**
* Markiert Modelstate Errors nachdem die View als Json-String geladen wurde
* @param scrollToFirstError: soll zum ersten Fehler gescrollt werden?
* @returns {}
*/
$.highlightErrors = (scrollToFirstError: boolean = true) => {
$(".field-validation-error").each(function () {
$(this).prev("input").addClass("is-invalid");
});
if (scrollToFirstError) {
if ($(".is-invalid:visible:first").length > 0) {
var top = $(".is-invalid:visible:first").offset().top;
if (top > 200)
top -= 200;
$("html,body").animate(<any>{
scrollTop: top
}, 1000);
}
}
}
/**Nach ganz oben scrollen */
$.scrollToTop = (speed: any = 1000) => {
$("html,body").animate(<any>{
scrollTop: 0
}, speed);
}
/**
* Reset eines forms
* @returns {}
*/
$.resetForm = (formId: string = "") => {
let tag = "form";
if (formId.length > 0) {
tag = formId;
}
$(tag).trigger("reset");
$(tag).find("*").removeClass("is-valid");
$(tag).find("*").removeClass("is-invalid");
$(tag).find("*").removeClass("field-validation-valid");
$(tag).find("*").removeClass("field-validation-error");
}
/**
* Reinitialisiert den Forms und unobtrusive Validator.
* Wichtig nachdem die View als Json-String geladen wurde
* @returns {}
*/
$.reinitializeValidator = (formId: string = "") => {
let tag = "form";
if (formId.length > 0) {
tag = formId;
}
if ($(tag).length > 0) {
$(tag).removeData("validator");
$.validator.unobtrusive.parse(tag);
}
}
/**
* Verhindern, dass die Browser Felder mit Autocomplete befüllen. Insbesondere bei ejautocomplete Feldern
*/
$.randomAutocompleteValue = () => {
var randomicAtomic = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
$("input[type=text]").attr("autocomplete", randomicAtomic);
$("input[type=email]").attr("autocomplete", randomicAtomic);
$("input[type=password]").attr("autocomplete", randomicAtomic);
$("form").each(() => {
$(this).attr("autocomplete", "off");
});
}
/**
* Befüllt ein Formular basierend auf JSON Objekt
* @param form
* @param data
*/
$.populateForm = (form: any, data: any) => {
$.each(data, function (key, value) {
if (value !== null && typeof value === "object") {
this.populateForm(form, value);
}
else {
var ctrl = $("[name=" + key.charAt(0).toUpperCase() + key.slice(1) + "]", form);
switch (ctrl.prop("type")) {
case "radio": case "checkbox":
ctrl.each(function () {
$(this).prop("checked", value);
});
break;
default:
if(typeof value === "number")
ctrl.val(Globalize.formatNumber(value));
else
ctrl.val(value);
}
}
}.bind(this));
}
/**
* Prüft ob ein Element existiert. So lange bis es existiert
* @param selector
*/
$.ensure = (selector:any) => {
var promise = $.Deferred();
var interval = setInterval(() => {
if ($(selector)[0]) {
clearInterval(interval);
promise.resolve();
}
}, 1);
return promise;
};
/**
* Gibt an ob ein Element innerhalb des Sidebars angezeigt wird
*/
$.fn.isInsideSidebar = function (): boolean {
return $(this).parents("#sideBarRight").length === 1;
}
/**
* Gibt an ob ein Element innerhalb des Modul Dialogs angezeigt wird
*/
$.fn.isInsideModuleDialog = function (): boolean {
return $(this).parents("#modalModuleContent").length === 1;
}
/**
* Gibt den Suchtext zurück wenn diese mindestens [len] Zeichen lang ist.
* @param len: wie lange muss der Suchtext mindestens sein
* @returns {}: Suchtext
*/
$.fn.valForSearch = function (len: number = 3): string {
var searchText = $(this).val() as string;
if (searchText.length < len) { searchText = ""; }
return searchText;
};
/**
* Gibt zurück ob eine Suche durchgeführt werden soll.
* Das ist entweder wenn der Text mindestens [len] lang ist, oder aber 0 Zeichen lang (suche löschen)
* @param len: wie lange muss der Suchtext mindestens sein
* @returns {}: true wenn die Suche durchgeführt werden soll, false sonst
*/
$.fn.doSearch = function (len: number = 3): boolean {
var searchText = $(this).val() as string;
if (searchText.length === 0) return true;
if (searchText.length >= len) return true;
return false;
};
/** Überschreiben der normalen remote validation. dies wird für Listen (editorfor) gemacht*/
//$.validator.methods.oldRemote = $.validator.methods.remote;
//$.validator.methods.remote = function (value, element, param, method) {
// if (this.optional(element)) {
// return "dependency-mismatch";
// }
// method = typeof method === "string" && method || "remote";
// var previous = this.previousValue(element, method),
// validator, data, optionDataString;
// if (!this.settings.messages[element.name]) {
// this.settings.messages[element.name] = {};
// }
// previous.originalMessage = previous.originalMessage || this.settings.messages[element.name][method];
// this.settings.messages[element.name][method] = previous.message;
// param = typeof param === "string" && { url: param } || param;
// optionDataString = $.param($.extend({ data: value }, param.data));
// if (previous.old === optionDataString) {
// return previous.valid;
// }
// previous.old = optionDataString;
// validator = this;
// this.startRequest(element);
// data = {};
// data[element.name.substr(element.name.lastIndexOf(".") + 1)] = value;
// $.ajax($.extend(true, {
// mode: "abort",
// port: "validate" + element.name,
// dataType: "json",
// data: data,
// context: validator.currentForm,
// success: function (response) {
// var valid = response === true || response === "true",
// errors, message, submitted;
// validator.settings.messages[element.name][method] = previous.originalMessage;
// if (valid) {
// submitted = validator.formSubmitted;
// validator.resetInternals();
// validator.toHide = validator.errorsFor(element);
// validator.formSubmitted = submitted;
// validator.successList.push(element);
// validator.invalid[element.name] = false;
// validator.showErrors();
// } else {
// errors = {};
// message = response || validator.defaultMessage(element, { method: method, parameters: value });
// errors[element.name] = previous.message = message;
// validator.invalid[element.name] = true;
// validator.showErrors(errors);
// }
// previous.valid = valid;
// validator.stopRequest(element, valid);
// }
// }, param));
// return "pending";
//};
$.validator.addMethod("requiredif", (value, element, params) => {
const form = $(element).closest("form");
const otherElement = $(form).find(`[name='${$(element).data("val-requiredif-other")}']`)[0];
let isOtherSet = false;
if (otherElement && $(otherElement).is(":checkbox")) {
isOtherSet = $(otherElement).prop("checked").toString() === $(element).data("val-requiredif-otherval").toLowerCase();
} else {
isOtherSet = otherElement && $(otherElement).val().toString().toLowerCase() === $(element).data("val-requiredif-otherval").toString().toLowerCase();
}
if (isOtherSet && (value === undefined || value === null || value.length === 0))
return false;
return true;
});
$.validator.unobtrusive.adapters.add("requiredif", [], options => {
options.rules["requiredif"] = {};
options.messages["requiredif"] = options.message;
});
$.validator.addMethod("requiredif-defaultlangauge", (value, element, params) => {
const form = $(element).closest("form");
const otherElement = $(form).find(`[name='${$(element).data("val-requiredif-defaultlangauge-other")}']`)[0];
let isOtherSet = false;
isOtherSet = otherElement && $(otherElement).val().toString().toLowerCase() === $(element).data("val-requiredif-defaultlangauge-otherval").toString().toLowerCase();
if (isOtherSet && (value === undefined || value === null || value.length === 0))
return false;
return true;
});
$.validator.unobtrusive.adapters.add("requiredif-defaultlangauge", [], options => {
options.rules["requiredif-defaultlangauge"] = {};
options.messages["requiredif-defaultlangauge"] = options.message;
});
/**
* Serialisiert ein Form
* @param filter: Optionaler NOT! Filter zum Einschränken der Felder. z.B.: "[id$=_hidden]"
* @param includeDisabled: Sollen elemente mit disabled inkludiert werden
*/
$.fn.serializeWithFilter = function (filter: string = "", includeDisabled: boolean = false): string {
var form;
if (includeDisabled) {
let result: string;
var inputs = $(this).find(":disabled");
inputs.prop("disabled", false);
if (filter.length > 0) {
form = <any>$(this)[0];
result = $(form.elements).not(filter).serialize();
} else {
result = $(this).serialize();
}
inputs.prop("disabled", true);
return result;
} else {
if (filter.length > 0) {
form = <any>$(this)[0];
return $(form.elements).not(filter).serialize();
} else {
return $(this).serialize();
}
}
}
//$.validator.unobtrusive.adapters.add("requiredif", ["other", "otherval"], options => {
// var value = {
// depends() {
// var element = $(options.form).find(`[name='${options.params.other}']`)[0];
// if (element && $(element).is(":checkbox")) {
// return $(element).prop("checked").toString() === options.params.otherval.toLowerCase();
// }
// return element && $(element).val().toString().toLowerCase() === options.params.otherval.toLowerCase();
// }
// }
// options.rules["requiredif"] = { };
// options.messages["requiredif"] = options.message;
//});
}