61 lines
1.6 KiB
JavaScript
61 lines
1.6 KiB
JavaScript
export function esc(s) {
|
|
return String(s ?? '')
|
|
.replace(/&/g, '&')
|
|
.replace(/</g, '<')
|
|
.replace(/>/g, '>')
|
|
.replace(/"/g, '"');
|
|
}
|
|
|
|
/** Rufnummer für href="tel:…" (Ziffern, höchstens ein führendes +). */
|
|
export function telHref(raw) {
|
|
const t = String(raw ?? '').trim();
|
|
if (!t) return '';
|
|
const digitsPlus = t.replace(/[^\d+]/g, '');
|
|
if (!digitsPlus) return '';
|
|
const normalized = digitsPlus.startsWith('+')
|
|
? '+' + digitsPlus.slice(1).replace(/\+/g, '')
|
|
: digitsPlus.replace(/\+/g, '');
|
|
return `tel:${normalized}`;
|
|
}
|
|
|
|
export function formatDateTime(iso) {
|
|
try {
|
|
return new Date(iso).toLocaleString('de-DE');
|
|
} catch {
|
|
return '—';
|
|
}
|
|
}
|
|
|
|
export function formatDeSyncDateTime(iso) {
|
|
if (!iso) return '—';
|
|
try {
|
|
return new Date(iso).toLocaleString('de-DE', {
|
|
day: 'numeric',
|
|
month: 'numeric',
|
|
year: 'numeric',
|
|
hour: '2-digit',
|
|
minute: '2-digit',
|
|
second: '2-digit',
|
|
});
|
|
} catch {
|
|
return '—';
|
|
}
|
|
}
|
|
|
|
export function extrasName(m) {
|
|
const x = m?.extras;
|
|
if (!x || typeof x !== 'object') return '';
|
|
return String(x.Name || '').trim();
|
|
}
|
|
|
|
/** Anzeige Dauer aus gespeicherten Sekunden (TeamViewer start/end). */
|
|
export function formatRemoteDurationDe(totalSec) {
|
|
if (totalSec == null || totalSec < 0) return '';
|
|
const n = Math.floor(Number(totalSec));
|
|
const m = Math.floor(n / 60);
|
|
const s = n % 60;
|
|
if (m === 0) return `${s} Sek.`;
|
|
if (s === 0) return `${m} Min.`;
|
|
return `${m} Min. ${s} Sek.`;
|
|
}
|