245 lines
7.1 KiB
TypeScript
245 lines
7.1 KiB
TypeScript
import { Tab } from "@syncfusion/ej2-navigations";
|
|
import { getInstance } from "@syncfusion/ej2-base";
|
|
|
|
export const millisecondsPerDay = 1000 * 60 * 60 * 24;
|
|
|
|
/**
|
|
* Errechnet die Zeitspanne in Tagen zwischen 2 Datumswerten
|
|
* @param {type} a: Datum 1
|
|
* @param {type} b: Datum 2
|
|
* @returns Zeitspanne in Tagen
|
|
*/
|
|
export function dateDiffInDays(a: Date, b: Date): number {
|
|
|
|
var utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
|
|
var utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
|
|
|
|
return Math.floor((utc2 - utc1) / millisecondsPerDay);
|
|
}
|
|
|
|
/**
|
|
* Errechnet die Zeitspanne zwischen 2 Datumswerten in Jahren
|
|
* @param a: Datum 1
|
|
* @param b: Datum 2
|
|
* @returns Zeitspanne in Jahren
|
|
*/
|
|
export function dateDiffInYears(a: Date, b: Date): number {
|
|
return Math.floor((b.getFullYear() - a.getFullYear()));
|
|
}
|
|
|
|
/**
|
|
* Entlädt ein Modul
|
|
* @param {type} moduleName: Name des Moduls
|
|
*/
|
|
export function destroyModule(moduleName: string): void {
|
|
try {
|
|
var result = delete window[moduleName];
|
|
window[moduleName] = null;
|
|
} catch (e) {
|
|
window[moduleName] = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Ist Sommerzeit aktiv?
|
|
* @param {type} t Datum
|
|
* @returns true wenn Sommerzeit, false sonst
|
|
*/
|
|
export function isDst(t: Date): boolean {
|
|
var jan = new Date(t.getFullYear(), 0, 1);
|
|
var jul = new Date(t.getFullYear(), 6, 1);
|
|
return Math.min(jan.getTimezoneOffset(), jul.getTimezoneOffset()) === t.getTimezoneOffset();
|
|
}
|
|
|
|
/**
|
|
* Voranstellen von 0 wenn nötig
|
|
* @param {type} num Nummer
|
|
* @param {type} size Anzahl Stellen
|
|
* @returns
|
|
*/
|
|
function pad(num: number, size: number): string {
|
|
var s = "000000000" + num;
|
|
return s.substr(s.length - size);
|
|
}
|
|
|
|
/**
|
|
* Gibt die Timezone als Offset in Stunden zurück
|
|
* @returns Timezone als Offset in Stunden
|
|
*/
|
|
export function getTimezoneOffsetInHours(): string {
|
|
var offset = new Date().getTimezoneOffset();
|
|
if (isDst(new Date())) {
|
|
offset -= (offset < 0 ? -60 : 60);
|
|
}
|
|
var minutes = Math.abs(offset);
|
|
var hours = Math.floor(minutes / 60);
|
|
minutes = minutes % 60;
|
|
var prefix = offset < 0 ? "+" : "-";
|
|
return prefix + pad(hours, 2) + ":" + pad(minutes, 2);
|
|
}
|
|
|
|
export function toUtcDate(dateToConvert: Date): Date {
|
|
var offset = new Date().getTimezoneOffset();
|
|
if (isDst(new Date())) {
|
|
offset -= (offset < 0 ? -60 : 60);
|
|
}
|
|
var minutes = offset;
|
|
if(minutes < 0)
|
|
return new Date(dateToConvert.getTime() + (minutes * 60000));
|
|
else if (minutes > 0)
|
|
return new Date(dateToConvert.getTime() - (minutes * 60000));
|
|
else
|
|
return dateToConvert;
|
|
}
|
|
|
|
/**
|
|
* Fügt an der Stelle des Cursors eines Feldes den angegebenen Text ein
|
|
* @param id: ID des Feldes in welches der Text eingefügt werden soll
|
|
* @param value: Text der eingefügt werden soll.
|
|
*/
|
|
export function insertAtCaret(id: string, value: string) {
|
|
var field = $("#" + id);
|
|
|
|
if (field === null || field === undefined) { return null; }
|
|
|
|
return field.each(function (i) {
|
|
var self = this as HTMLTextAreaElement;
|
|
if (self.selectionStart || self.selectionStart === 0) {
|
|
//For browsers like Firefox and Webkit based
|
|
var startPos = self.selectionStart;
|
|
var endPos = self.selectionEnd;
|
|
var scrollTop = self.scrollTop;
|
|
self.value = self.value.substring(0, startPos) + value + self.value.substring(endPos, self.value.length);
|
|
self.focus();
|
|
self.selectionStart = startPos + value.length;
|
|
self.selectionEnd = startPos + value.length;
|
|
self.scrollTop = scrollTop;
|
|
} else {
|
|
self.value += value;
|
|
self.focus();
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
/**
|
|
* Verzügert die Ausführung einer Funktion um X Millisekunden bis keine Interaktion mehr stattfindet
|
|
* Beispiel: Suchbox die erst sucht wenn kein Input mehr stattfindet
|
|
* @param fn: Funktion bzw. Callback
|
|
* @param delay: Anzahl Millisekunden
|
|
* @param immediate: wenn true, Funktion gleich ausführen und dann warten, ansonsten warten und dann ausführen
|
|
*/
|
|
export function debounce(fn: any, delay: number, immediate:boolean = false): any {
|
|
var timer: any;
|
|
return function () {
|
|
var context = this, args = arguments;
|
|
var later = function () {
|
|
timer = null;
|
|
if (!immediate) fn.apply(context, args);
|
|
};
|
|
var callNow = immediate && !timer;
|
|
|
|
clearTimeout(timer);
|
|
timer = setTimeout(later, delay);
|
|
if (callNow) fn.apply(context, args);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Async Sleep Funktion
|
|
* @param msec Zeit in Millisekunden
|
|
*/
|
|
export async function sleep(msec) {
|
|
return new Promise(resolve => setTimeout(resolve, msec));
|
|
}
|
|
|
|
/**
|
|
* Zeigt den ersten Tab syncfusion mit einem Fehler an
|
|
*/
|
|
export function showErrorTab(): void {
|
|
const errorFound = $(".field-validation-error").first();
|
|
if (errorFound !== undefined && errorFound !== null && errorFound.length > 0) {
|
|
var parent = errorFound.closest(".e-item[role='tabpanel']");
|
|
while (parent !== undefined && parent !== null && parent.length > 0) {
|
|
var id = parent.attr("aria-labelledby");
|
|
var tab = $(`#${id}`);
|
|
var tabContainerElement = tab.closest(".e-control.e-tab");
|
|
var tabContainer = <Tab>getInstance(tabContainerElement[0], Tab);
|
|
tabContainer.select(tab[0]);
|
|
parent = tab.closest(".e-item[role='tabpanel']");
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Hilfsfunktion für FIDO
|
|
* @param thing
|
|
* @param name
|
|
*/
|
|
export function coerceToArrayBuffer (thing:any, name?:any):any {
|
|
if (typeof thing === "string") {
|
|
// base64url to base64
|
|
thing = thing.replace(/-/g, "+").replace(/_/g, "/");
|
|
|
|
// base64 to Uint8Array
|
|
var str = window.atob(thing);
|
|
var bytes = new Uint8Array(str.length);
|
|
for (var i = 0; i < str.length; i++) {
|
|
bytes[i] = str.charCodeAt(i);
|
|
}
|
|
thing = bytes;
|
|
}
|
|
|
|
// Array to Uint8Array
|
|
if (Array.isArray(thing)) {
|
|
thing = new Uint8Array(thing);
|
|
}
|
|
|
|
// Uint8Array to ArrayBuffer
|
|
if (thing instanceof Uint8Array) {
|
|
thing = thing.buffer;
|
|
}
|
|
|
|
// error if none of the above worked
|
|
if (!(thing instanceof ArrayBuffer)) {
|
|
throw new TypeError(`could not coerce '${name}' to ArrayBuffer`);
|
|
}
|
|
|
|
return thing;
|
|
};
|
|
|
|
/**
|
|
* Hilfsfunktion für FIDO
|
|
* @param thing
|
|
*/
|
|
export function coerceToBase64Url(thing:any):any {
|
|
// Array or ArrayBuffer to Uint8Array
|
|
if (Array.isArray(thing)) {
|
|
thing = Uint8Array.from(thing);
|
|
}
|
|
|
|
if (thing instanceof ArrayBuffer) {
|
|
thing = new Uint8Array(thing);
|
|
}
|
|
|
|
// Uint8Array to base64
|
|
if (thing instanceof Uint8Array) {
|
|
var str = "";
|
|
var len = thing.byteLength;
|
|
|
|
for (var i = 0; i < len; i++) {
|
|
str += String.fromCharCode(thing[i]);
|
|
}
|
|
thing = window.btoa(str);
|
|
}
|
|
|
|
if (typeof thing !== "string") {
|
|
throw new Error("could not coerce to string");
|
|
}
|
|
|
|
// base64 to base64url
|
|
// NOTE: "=" at the end of challenge is optional, strip it off here
|
|
thing = thing.replace(/\+/g, "-").replace(/\//g, "_").replace(/=*$/g, "");
|
|
|
|
return thing;
|
|
}; |