// assets/js/utils/helpers.js const Helpers = { formatDate: (dateString) => { return new Date(dateString).toLocaleDateString("id-ID", { year: "numeric", month: "long", day: "numeric", }); }, formatDateShort: (dateString) => { return new Date(dateString).toLocaleDateString("id-ID", { year: "numeric", month: "short", day: "numeric", }); }, formatDateTime: (dateString) => { return new Date(dateString).toLocaleString("id-ID", { year: "numeric", month: "long", day: "numeric", hour: "2-digit", minute: "2-digit", }); }, validateEmail: (email) => { const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return re.test(email); }, validatePhone: (phone) => { const re = /^(08|62)[0-9]{9,12}$/; return re.test(phone); }, checkPasswordStrength: (password) => { let strength = 0; if (password.length >= 8) strength++; if (password.match(/[a-z]+/)) strength++; if (password.match(/[A-Z]+/)) strength++; if (password.match(/[0-9]+/)) strength++; if (password.match(/[$@#&!]+/)) strength++; if (password.length < 8) { return ""; } else if (strength <= 2) { return "weak"; } else if (strength <= 4) { return "medium"; } else { return "strong"; } }, debounce: (func, wait) => { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; }, truncateText: (text, maxLength) => { if (text.length <= maxLength) return text; return text.substring(0, maxLength) + "..."; }, getStatusBadgeClass: (status) => { const statusClasses = { unclaimed: "bg-blue-500/20 text-blue-400 border border-blue-500/50", verified: "bg-green-500/20 text-green-400 border border-green-500/50", pending_claim: "bg-yellow-500/20 text-yellow-400 border border-yellow-500/50", case_closed: "bg-slate-500/20 text-slate-400 border border-slate-500/50", expired: "bg-red-500/20 text-red-400 border border-red-500/50", active: "bg-green-500/20 text-green-400 border border-green-500/50", blocked: "bg-red-500/20 text-red-400 border border-red-500/50", pending: "bg-yellow-500/20 text-yellow-400 border border-yellow-500/50", approved: "bg-green-500/20 text-green-400 border border-green-500/50", rejected: "bg-red-500/20 text-red-400 border border-red-500/50", }; return ( statusClasses[status] || "bg-slate-500/20 text-slate-400 border border-slate-500/50" ); }, getRoleBadgeClass: (role) => { const roleClasses = { admin: "bg-red-500/20 text-red-400 border border-red-500/50", manager: "bg-yellow-500/20 text-yellow-400 border border-yellow-500/50", user: "bg-blue-500/20 text-blue-400 border border-blue-500/50", }; return ( roleClasses[role] || "bg-slate-500/20 text-slate-400 border border-slate-500/50" ); }, getInitials: (name) => { if (!name) return "?"; return name.charAt(0).toUpperCase(); }, showConfirm: (message) => { return confirm(message); }, };