diff --git a/asm_app/src/App.tsx b/asm_app/src/App.tsx index 04f8cb1..3311afa 100644 --- a/asm_app/src/App.tsx +++ b/asm_app/src/App.tsx @@ -48,6 +48,7 @@ import IssueList from './pages/IssueList'; import IssueDetail from './pages/IssueDetail'; import MaintenanceTeamList from './pages/MaintenanceTeamList'; import MaintenanceTeamDetail from './pages/MaintenanceTeamDetail'; +import UserProfilePage from './pages/UserProfilePage'; // Layout with Sidebar and Header const LayoutWithSidebar: React.FC<{ children: React.ReactNode }> = ({ children }) => { @@ -251,6 +252,12 @@ const App: React.FC = () => { } /> + + + + } /> + {/* Default redirect */} } /> diff --git a/asm_app/src/components/Header.tsx b/asm_app/src/components/Header.tsx index 1c8a149..ac85560 100644 --- a/asm_app/src/components/Header.tsx +++ b/asm_app/src/components/Header.tsx @@ -16,20 +16,52 @@ const Header: React.FC = ({ userEmail }) => { const { language, changeLanguage } = useLanguage(); const { t } = useTranslation(); - const handleLogout = () => { + // const handleLogout = () => { + // localStorage.removeItem('user'); + // localStorage.removeItem('sid'); + // navigate('/login'); + // }; + + const handleLogout = async () => { localStorage.removeItem('user'); localStorage.removeItem('sid'); - navigate('/login'); + + try { + const csrfToken = document.cookie + .split('; ') + .find(row => row.startsWith('X-Frappe-CSRF-Token=')) + ?.split('=')[1] || ''; + + // Step 1: Kill server-side session in Redis + await fetch('/api/method/frappe.auth.logout', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Frappe-CSRF-Token': csrfToken, + }, + credentials: 'include', + }); + + // Step 2: Clear Frappe web session cookies fully + await fetch('/?cmd=web_logout', { + credentials: 'include', + }); + + } catch (err) { + console.error('Logout error:', err); + } finally { + window.location.href = '/asm_app/login'; + } }; return (
{/* User Email (optional, can be shown on hover or always) */} - {userEmail && ( + {/* {userEmail && (
{userEmail}
- )} + )} */} {/* Notification Bell */}
diff --git a/asm_app/src/components/Sidebar.tsx b/asm_app/src/components/Sidebar.tsx index dd5b5b7..c9c476f 100644 --- a/asm_app/src/components/Sidebar.tsx +++ b/asm_app/src/components/Sidebar.tsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react'; -import { Link, useLocation } from 'react-router-dom'; +import React, { useEffect, useState } from 'react'; +import { Link, useLocation, useNavigate } from 'react-router-dom'; import { useLanguage } from '../contexts/LanguageContext'; import { useTranslation } from 'react-i18next'; import { @@ -14,7 +14,9 @@ import { Users, ShoppingCart, FileText, - HelpCircle + HelpCircle, + UserCircle + } from 'lucide-react'; interface SidebarLink { @@ -32,9 +34,12 @@ interface SidebarProps { const Sidebar: React.FC = ({ userEmail }) => { const [isCollapsed, setIsCollapsed] = useState(false); const location = useLocation(); + const navigate = useNavigate(); const { isRTL } = useLanguage(); const { t } = useTranslation(); - + + const [userFullName, setUserFullName] = useState(''); + // Get base URL for assets (handles both dev and production) // BASE_URL in Vite already includes trailing slash in production, but not in dev const baseUrl = import.meta.env.BASE_URL || '/'; @@ -50,6 +55,51 @@ const Sidebar: React.FC = ({ userEmail }) => { ? `${baseUrl}sidebar-background.jpg${imageVersion}` : `${baseUrl}/sidebar-background.jpg${imageVersion}`; + // ✅ Fetch user full name on mount + useEffect(() => { + const fetchUserFullName = async () => { + try { + // First get the logged-in user + const userResponse = await fetch('/api/method/frappe.auth.get_logged_user', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include' + }); + const userData = await userResponse.json(); + const userEmail = userData.message; + + if (userEmail) { + // Then fetch the user's full name + const fullNameResponse = await fetch(`/api/resource/User/${encodeURIComponent(userEmail)}?fields=["full_name"]`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include' + }); + const fullNameData = await fullNameResponse.json(); + + if (fullNameData.data?.full_name) { + setUserFullName(fullNameData.data.full_name); + } else { + // Fallback to email if full name not found + setUserFullName(userEmail); + } + } + } catch (error) { + console.error('Error fetching user full name:', error); + // Fallback to email prop if API fails + if (userEmail) { + setUserFullName(userEmail); + } + } + }; + + fetchUserFullName(); + }, [userEmail]); + // Role-based visibility logic // const isMaintenanceManagerKASH = userEmail === 'maintenancemanager-kash@gmail.com'; // const isMaintenanceManagerTH = userEmail === 'maintenancemanager-th@gmail.com'; @@ -219,6 +269,13 @@ const Sidebar: React.FC = ({ userEmail }) => { const isActive = (path: string) => { return location.pathname === path; }; + + // ✅ Handle User Profile click + const handleUserProfileClick = () => { + navigate('/user-profile'); + }; + + return (
= ({ userEmail }) => { {/* User Info & Version (Bottom) */}
- {!isCollapsed && userEmail && ( + {/* {!isCollapsed && userEmail && (
{t('sidebar.loggedInAs')}
{userEmail} -
+
*/} + + {!isCollapsed && (userFullName || userEmail) && ( +
+
+ {t('sidebar.loggedInAs')}
+
+ {userFullName || userEmail} +
+ + {/* ✅ User Profile Button */} + +
+ )} + + {/* Collapsed state - just show icon button */} + {isCollapsed && ( + )} {!isCollapsed && ( diff --git a/asm_app/src/pages/AssetDetail.tsx b/asm_app/src/pages/AssetDetail.tsx index 8f46397..8c64a9a 100644 --- a/asm_app/src/pages/AssetDetail.tsx +++ b/asm_app/src/pages/AssetDetail.tsx @@ -60,6 +60,8 @@ const AssetDetail: React.FC = () => { custom_support_plan: '', custom_spare_parts: [], custom_total_spare_parts_amount: 0, + custom_moh_supervisor:'', + custom_team_leader: '', is_existing_asset: true, __islocal: false, }); @@ -430,6 +432,8 @@ const AssetDetail: React.FC = () => { location: asset.location || '', custom_manufacturer: asset.custom_manufacturer || '', department: asset.department || '', + custom_moh_supervisor: asset.custom_moh_supervisor || '', + custom_team_leader: asset.custom_team_leader || '', custom_asset_type: asset.custom_asset_type || '', custom_manufacturing_year: asset.custom_manufacturing_year || '', custom_model: asset.custom_model || '', @@ -3043,6 +3047,21 @@ const handlePPMPlan = async () => { className="w-full px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:bg-gray-100 dark:disabled:bg-gray-700 bg-white dark:bg-gray-700 text-gray-900 dark:text-white" />
+ setFormData({ ...formData, custom_moh_supervisor: val })} + disabled={isFieldDisabled('custom_moh_supervisor')} + /> + + setFormData({ ...formData, custom_team_leader: val })} + disabled={isFieldDisabled('custom_team_leader')} + /> { { key: 'asset_name', label: t('commonFields.assetName'), default: true }, { key: 'custom_serial_number', label: t('commonFields.serialNumber'), default: true }, { key: 'company', label: t('commonFields.company'), default: true }, + { key: 'custom_site', label: 'Site Name', default: false }, { key: 'location', label: t('commonFields.location'), default: true }, { key: 'department', label: t('commonFields.department'), default: false }, { key: 'custom_device_status', label: t('commonFields.deviceStatus'), default: true }, @@ -413,6 +414,7 @@ const AssetList: React.FC = () => { // Filter states const [filterAssetId, setFilterAssetId] = useState(''); const [filterCompany, setFilterCompany] = useState(''); + const [filterSite, setFilterSite] = useState(''); const [filterManufacturer, setFilterManufacturer] = useState(''); const [filterSupplier, setFilterSupplier] = useState(''); const [filterLocation, setFilterLocation] = useState(''); @@ -450,6 +452,7 @@ const AssetList: React.FC = () => { const count = [ filterAssetId, filterCompany, + filterSite, filterLocation, filterDepartment, filterModality, @@ -464,6 +467,7 @@ const AssetList: React.FC = () => { }, [ filterAssetId, filterCompany, + filterSite, filterLocation, filterDepartment, filterModality, @@ -479,6 +483,7 @@ const AssetList: React.FC = () => { const filters: Record = {}; if (filterAssetId) filters['name'] = filterAssetId; if (filterCompany) filters['company'] = filterCompany; + if (filterSite) filters['custom_site'] = filterSite; if (filterManufacturer) filters['custom_manufacturer'] = filterManufacturer; if (filterSupplier) filters['supplier'] = filterSupplier; if (filterLocation) filters['location'] = filterLocation; @@ -511,13 +516,13 @@ const AssetList: React.FC = () => { if (page !== 0) { setPage(0); } - }, [filterAssetId, filterCompany, filterManufacturer, filterSupplier, filterLocation, filterDepartment, filterModality, + }, [filterAssetId, filterCompany, filterSite, filterManufacturer, filterSupplier, filterLocation, filterDepartment, filterModality, filterDeviceStatus, filterAssetName, filterSerialNumber, searchTerm]); // ✅ Clear selection when filters/page change useEffect(() => { setSelectedRows(new Set()); - }, [filterAssetId, filterCompany, filterManufacturer, filterSupplier, filterLocation, filterDepartment, filterModality, + }, [filterAssetId, filterCompany, filterSite, filterManufacturer, filterSupplier, filterLocation, filterDepartment, filterModality, filterDeviceStatus, filterAssetName, filterSerialNumber, searchTerm, page]); // Debounce functions @@ -564,6 +569,7 @@ const AssetList: React.FC = () => { filters: { filterAssetId, filterCompany, + filterSite, filterLocation, filterDepartment, filterModality, @@ -588,6 +594,7 @@ const AssetList: React.FC = () => { const f = preset.filters; setFilterAssetId(f.filterAssetId || ''); setFilterCompany(f.filterCompany || ''); + setFilterSite(f.filterSite || ''); setFilterLocation(f.filterLocation || ''); setFilterDepartment(f.filterDepartment || ''); setFilterModality(f.filterModality || ''); @@ -868,6 +875,7 @@ const AssetList: React.FC = () => { const handleClearFilters = () => { setFilterAssetId(''); setFilterCompany(''); + setFilterSite(''); setFilterManufacturer(''); setFilterSupplier(''); setFilterLocation(''); @@ -884,7 +892,7 @@ const AssetList: React.FC = () => { if (serialNumberDebounceRef.current) clearTimeout(serialNumberDebounceRef.current); }; - const hasActiveFilters = filterAssetId || filterCompany || filterManufacturer || filterSupplier || + const hasActiveFilters = filterAssetId || filterCompany || filterSite || filterManufacturer || filterSupplier || filterLocation || filterDepartment || filterModality || filterDeviceStatus || filterAssetName || filterSerialNumber || searchTerm; @@ -1062,6 +1070,17 @@ const AssetList: React.FC = () => { )} + {filterSite && ( + + Site: {filterSite} + + + )} {filterAssetName && ( Name: {filterAssetName} @@ -1324,6 +1343,27 @@ const AssetList: React.FC = () => { )}
+ {/* Site Name - NEW FILTER */} +
+ setFilterSite(val)} + placeholder="Select Site" + disabled={false} + compact={true} + /> + {filterSite && ( + + )} +
+ {/* Device Status */}
{/* Location */} -
+
{
{/* Department */} -
+
{
{/* Modality */} -
+
{
{/* Manufacturer */} -
+
{
{/* Supplier */} -
+
{ + const navigate = useNavigate(); + + // State + const [loading, setLoading] = useState(true); + const [saving, setSaving] = useState(false); + const [isSystemManager, setIsSystemManager] = useState(false); + const [changingPassword, setChangingPassword] = useState(false); + const [profile, setProfile] = useState(null); + const [error, setError] = useState(null); + + // Form state + const [formData, setFormData] = useState({ + first_name: '', + middle_name: '', + last_name: '', + role_profile_name: '', + custom_user_id : '', + }); + + // Password change state + const [showPasswordSection, setShowPasswordSection] = useState(false); + const [passwordData, setPasswordData] = useState({ + old_password: '', + new_password: '', + confirm_password: '', + }); + const [showOldPassword, setShowOldPassword] = useState(false); + const [showNewPassword, setShowNewPassword] = useState(false); + const [showConfirmPassword, setShowConfirmPassword] = useState(false); + + // Fetch user profile and check role on mount + useEffect(() => { + const loadProfile = async () => { + try { + setLoading(true); + + // NEW: Check if user is System Manager + const roleResponse = await fetch('/api/method/asset_lite.api.user_roles.check_has_role', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + body: JSON.stringify({ + roles: 'System Manager' + }) + }); + const roleData = await roleResponse.json(); + const isSysManager = roleData.message?.has_role || false; + setIsSystemManager(isSysManager); + console.log('Is System Manager:', isSysManager); + + // Fetch profile data + const data = await fetchCurrentUserProfile(); + + // Debug: Log everything + console.log('Full profile data:', JSON.stringify(data, null, 2)); + console.log('role_profile_name:', data.role_profile_name); + console.log('All keys:', Object.keys(data)); + + setProfile(data); + setFormData({ + first_name: data.first_name || '', + middle_name: data.middle_name || '', + last_name: data.last_name || '', + role_profile_name: data.role_profile_name || '', + custom_user_id: data.custom_user_id || '', + }); + + // Debug: Log formData after setting + console.log('FormData role_profile_name:', data.role_profile_name || ''); + + } catch (err) { + const errorMsg = err instanceof Error ? err.message : 'Failed to load profile'; + setError(errorMsg); + toast.error(errorMsg, { + position: "top-right", + autoClose: 5000, + icon: + }); + } finally { + setLoading(false); + } + }; + + loadProfile(); + }, []); + + // Handle form input changes + const handleInputChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; + setFormData(prev => ({ ...prev, [name]: value })); + }; + + // Handle password input changes + const handlePasswordChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; + setPasswordData(prev => ({ ...prev, [name]: value })); + }; + + // Save profile changes + const handleSaveProfile = async () => { + if (!profile?.email) return; + + try { + setSaving(true); + + const updateData: UpdateUserProfileData = { + first_name: formData.first_name, + middle_name: formData.middle_name, + last_name: formData.last_name, + role_profile_name: formData.role_profile_name, + }; + + const updatedProfile = await updateUserProfile(profile.email, updateData); + setProfile(prev => prev ? { ...prev, ...updatedProfile } : updatedProfile); + + toast.success('Profile updated successfully!', { + position: "top-right", + autoClose: 3000, + icon: + }); + } catch (err) { + const errorMsg = err instanceof Error ? err.message : 'Failed to update profile'; + toast.error(errorMsg, { + position: "top-right", + autoClose: 5000, + icon: + }); + } finally { + setSaving(false); + } + }; + + // Change password + const handleChangePassword = async () => { + // Validation + if (!passwordData.old_password) { + toast.error('Please enter your current password', { + position: "top-right", + autoClose: 3000, + icon: + }); + return; + } + + if (!passwordData.new_password) { + toast.error('Please enter a new password', { + position: "top-right", + autoClose: 3000, + icon: + }); + return; + } + + if (passwordData.new_password.length < 8) { + toast.error('Password must be at least 8 characters long', { + position: "top-right", + autoClose: 3000, + icon: + }); + return; + } + + if (passwordData.new_password !== passwordData.confirm_password) { + toast.error('New passwords do not match', { + position: "top-right", + autoClose: 3000, + icon: + }); + return; + } + + try { + setChangingPassword(true); + + await changeUserPassword(passwordData.new_password, passwordData.old_password); + + toast.success('Password changed successfully!', { + position: "top-right", + autoClose: 3000, + icon: + }); + + // Clear password fields + setPasswordData({ + old_password: '', + new_password: '', + confirm_password: '', + }); + setShowPasswordSection(false); + } catch (err) { + const errorMsg = err instanceof Error ? err.message : 'Failed to change password'; + toast.error(errorMsg, { + position: "top-right", + autoClose: 5000, + icon: + }); + } finally { + setChangingPassword(false); + } + }; + + // Loading state + if (loading) { + return ( +
+
+ +

Loading profile...

+
+
+ ); + } + + // Error state + if (error && !profile) { + return ( +
+
+

+ + Error Loading Profile +

+

{error}

+ +
+
+ ); + } + + return ( +
+ + + {/* Header */} +
+
+ +
+ + +
+ +
+ {/* Left Column - Profile Card */} +
+
+ {/* Profile Header */} +
+
+ {profile?.user_image ? ( + Profile + ) : ( + + )} +
+

{profile?.full_name || 'User'}

+

{profile?.email}

+
+ + {/* Profile Stats */} +
+
+ +
+

Username

+

+ {profile?.username || '-'} +

+
+
+ +
+ +
+

Role Profile

+

+ {profile?.role_profile_name || '-'} +

+
+
+ +
+ +
+

Status

+

+ {profile?.enabled ? 'Active' : 'Inactive'} +

+
+
+
+ + {/* User Roles */} + {/* {profile?.roles && profile.roles.length > 0 && ( +
+

+ Assigned Roles +

+
+ {profile.roles.map((role, index) => ( + + {role.role} + + ))} +
+
+ )} */} +
+
+ + {/* Right Column - Edit Forms */} +
+ {/* Basic Information */} +
+

+ + Basic Information +

+ +
+ {/* Email (Read-only) */} +
+ +
+ + +
+
+ + {/* Full Name (Read-only) */} +
+ + +
+ + {/* First Name */} +
+ + +
+ + {/* Middle Name */} +
+ + +
+ + {/* Last Name */} +
+ + +
+ +
+ + +
+ + {/* Role Profile */} + {/*
+ setFormData(prev => ({ ...prev, role_profile_name: val }))} + placeholder="Select Role Profile" + disabled={false} + /> +
*/} + + {/* Role Profile - Only System Manager can edit */} +
+ setFormData(prev => ({ ...prev, role_profile_name: val }))} + placeholder="Select Role Profile" + disabled={!isSystemManager} + /> +
+
+
+ + {/* Password Section */} +
+
+

+ + Change Password +

+ +
+ + {showPasswordSection ? ( +
+ {/* Current Password */} +
+ +
+ + +
+
+ + {/* New Password */} +
+ +
+ + +
+ {passwordData.new_password && passwordData.new_password.length < 8 && ( +

Password must be at least 8 characters

+ )} +
+ + {/* Confirm New Password */} +
+ +
+ + +
+ {passwordData.confirm_password && passwordData.new_password !== passwordData.confirm_password && ( +

Passwords do not match

+ )} + {passwordData.confirm_password && passwordData.new_password === passwordData.confirm_password && passwordData.new_password.length >= 8 && ( +

+ Passwords match +

+ )} +
+ + {/* Change Password Button */} +
+ +
+
+ ) : ( +
+ +

Click "Change Password" to update your password

+
+ )} +
+
+
+
+ ); +}; + +export default UserProfilePage; \ No newline at end of file diff --git a/asm_app/src/pages/WorkOrderDetail.tsx b/asm_app/src/pages/WorkOrderDetail.tsx index 9b134a4..7b2f255 100644 --- a/asm_app/src/pages/WorkOrderDetail.tsx +++ b/asm_app/src/pages/WorkOrderDetail.tsx @@ -439,7 +439,7 @@ const WorkOrderDetail: React.FC = () => { try { setIsLoadingAsset(true); const response = await apiService.apiCall( - `/api/resource/Asset?filters=[["custom_serial_number","=","${serialNumber}"]]&fields=["name","asset_name","company","department","custom_serial_number","custom_asset_type","custom_manufacturer","supplier","custom_site_contractor","custom_subcontractor","custom_model","custom_service_agreement","custom_service_coverage","custom_start_date","custom_end_date","custom_total_amount","custom_site"]&limit=1` + `/api/resource/Asset?filters=[["custom_serial_number","=","${serialNumber}"]]&fields=["name","asset_name","company","department","custom_serial_number","custom_asset_type","custom_manufacturer","supplier","custom_site_contractor","custom_subcontractor","custom_model","custom_service_agreement","custom_service_coverage","custom_start_date","custom_end_date","custom_total_amount","custom_site","custom_team_leader","custom_moh_supervisor"]&limit=1` ); if (response?.data && response.data.length > 0) { return response.data[0]; @@ -483,6 +483,8 @@ const WorkOrderDetail: React.FC = () => { custom_start_date: formatDateForInput(assetData.custom_start_date) || '', custom_end_date: formatDateForInput(assetData.custom_end_date) || '', custom_total_amount: assetData.custom_total_amount || 0, + custom_assigned_supervisor: assetData.custom_team_leader || '', + custom_moh_supervisor: assetData.custom_moh_supervisor || '', })); }; @@ -569,6 +571,9 @@ const WorkOrderDetail: React.FC = () => { custom_subcontractor: searchParams.get('subcontractor') || '', company: searchParams.get('company') || '', site_name: searchParams.get('site_name') || '', + // Supervisor fields from URL params (mapped from Asset) + custom_assigned_supervisor: searchParams.get('team_leader') || '', + custom_moh_supervisor: searchParams.get('moh_supervisor') || '', }; setFormData(prev => ({ ...prev, @@ -758,36 +763,35 @@ useEffect(() => { }, [isNewWorkOrder]); // Function to call assign_supervisor_or_technician API before workflow action - // This mirrors Frappe's before_workflow_action client script behavior - const callBeforeWorkflowAction = async (action: string): Promise<{ assigned_to: string | null } | null> => { - if (!workOrderName || isNewWorkOrder) return null; + // const callBeforeWorkflowAction = async (action: string): Promise<{ assigned_to: string | null } | null> => { + // if (!workOrderName || isNewWorkOrder) return null; - // Only call for specific actions that need assignment - const actionsNeedingAssignment = ['Apply', 'Send For Repair']; - if (!actionsNeedingAssignment.includes(action)) { - return null; - } + // // Only call for specific actions that need assignment + // const actionsNeedingAssignment = ['Apply', 'Send For Repair']; + // if (!actionsNeedingAssignment.includes(action)) { + // return null; + // } - try { - const response = await apiService.apiCall( - `/api/method/assign_supervisor_or_technician`, - { - method: 'POST', - body: JSON.stringify({ - work_order: workOrderName, - action: action, - asset_type: formData.asset_type || workOrder?.asset_type || '' - }) - } - ); + // try { + // const response = await apiService.apiCall( + // `/api/method/assign_supervisor_or_technician`, + // { + // method: 'POST', + // body: JSON.stringify({ + // work_order: workOrderName, + // action: action, + // asset_type: formData.asset_type || workOrder?.asset_type || '' + // }) + // } + // ); - return response?.message || null; - } catch (err) { - console.error('Error in before_workflow_action:', err); - // Don't block workflow action if this fails, just log it - return null; - } - }; + // return response?.message || null; + // } catch (err) { + // console.error('Error in before_workflow_action:', err); + // // Don't block workflow action if this fails, just log it + // return null; + // } + // }; // Workflow action handler const handleWorkflowAction = async (action: string, nextState?: string) => { @@ -804,19 +808,9 @@ useEffect(() => { const loadingToastId = toast.loading(`Applying action "${action}"...`, { position: "top-right" }); - - // Call before_workflow_action logic (assign supervisor/technician) - // This mirrors Frappe's before_workflow_action client script - const assignmentResult = await callBeforeWorkflowAction(action); - - if (assignmentResult?.assigned_to) { - toast.info(`Assigned to: ${assignmentResult.assigned_to}`, { - position: "top-right", - autoClose: 4000, - icon: - }); - } - + + // NOTE: Supervisor/Technician assignment is now handled when Asset is selected + const success = await applyAction(action, nextState); // Dismiss loading toast diff --git a/asm_app/src/pages/WorkOrderList.tsx b/asm_app/src/pages/WorkOrderList.tsx index 76098a1..3304afe 100644 --- a/asm_app/src/pages/WorkOrderList.tsx +++ b/asm_app/src/pages/WorkOrderList.tsx @@ -339,6 +339,7 @@ const WorkOrderList: React.FC = () => { { key: 'asset_name', label: t('commonFields.assetName'), default: true }, { key: 'work_order_type', label: t('commonFields.workOrderType'), default: true }, { key: 'company', label: t('commonFields.company'), default: true }, + { key: 'site_name', label: t('commonFields.siteName') || 'Site Name', default: true }, { key: 'department', label: t('commonFields.department'), default: true }, { key: 'repair_status', label: t('commonFields.status'), default: true }, { key: 'custom_priority_', label: t('commonFields.priority'), default: true }, @@ -381,6 +382,7 @@ const WorkOrderList: React.FC = () => { const [filterAsset, setFilterAsset] = useState(''); const [filterType, setFilterType] = useState(''); const [filterCompany, setFilterCompany] = useState(''); + const [filterSiteName, setFilterSiteName] = useState(''); const [filterStatus, setFilterStatus] = useState(''); const [filterSerialNumber, setFilterSerialNumber] = useState(''); const [filterManufacturer, setFilterManufacturer] = useState(''); @@ -406,10 +408,12 @@ const WorkOrderList: React.FC = () => { const company = searchParams.get('company'); const priority = searchParams.get('priority'); const status = searchParams.get('status'); + const siteName = searchParams.get('site_name'); if (company) setFilterCompany(company); if (priority) setFilterPriority(priority); if (status) setFilterStatus(status); + if (siteName) setFilterSiteName(siteName); }, [searchParams]); // ✅ Load asset filter from URL on mount @@ -434,6 +438,7 @@ const WorkOrderList: React.FC = () => { filterAsset, filterType, filterCompany, + filterSiteName, filterStatus, filterSerialNumber, filterManufacturer, @@ -447,6 +452,7 @@ const WorkOrderList: React.FC = () => { filterAsset, filterType, filterCompany, + filterSiteName, filterStatus, filterSerialNumber, filterManufacturer, @@ -461,6 +467,7 @@ const WorkOrderList: React.FC = () => { if (filterAsset) filters['asset'] = filterAsset; if (filterType) filters['work_order_type'] = filterType; if (filterCompany) filters['company'] = filterCompany; + if (filterSiteName) filters['site_name'] = filterSiteName; if (filterStatus) filters['repair_status'] = filterStatus; if (filterSerialNumber) filters['custom_serial_number'] = ['like', `%${filterSerialNumber}%`]; if (filterManufacturer) filters['custom_manufacturer'] = filterManufacturer; @@ -472,7 +479,8 @@ const WorkOrderList: React.FC = () => { filters, limit, page * limit, - 'creation desc', + // 'creation desc', + 'modified desc', permissionFilters ); @@ -490,13 +498,13 @@ const WorkOrderList: React.FC = () => { if (page !== 0) { setPage(0); } - }, [filterWorkOrderId, filterAsset, filterType, filterCompany, filterStatus, + }, [filterWorkOrderId, filterAsset, filterType, filterCompany, filterSiteName, filterStatus, filterSerialNumber, filterManufacturer, filterSupplier, filterDepartment, filterPriority]); // Clear selection when filters/page change useEffect(() => { setSelectedRows(new Set()); - }, [filterWorkOrderId, filterAsset, filterType, filterCompany, filterStatus, + }, [filterWorkOrderId, filterAsset, filterType, filterCompany, filterSiteName, filterStatus, filterSerialNumber, filterManufacturer, filterSupplier, filterDepartment, filterPriority, page]); // Debounce function for serial number @@ -532,6 +540,7 @@ const WorkOrderList: React.FC = () => { filterAsset, filterType, filterCompany, + filterSiteName, filterStatus, filterSerialNumber, filterManufacturer, @@ -555,6 +564,7 @@ const WorkOrderList: React.FC = () => { setFilterAsset(f.filterAsset || ''); setFilterType(f.filterType || ''); setFilterCompany(f.filterCompany || ''); + setFilterSiteName(f.filterSiteName || ''); setFilterStatus(f.filterStatus || ''); setFilterSerialNumber(f.filterSerialNumber || ''); setTempSerialNumber(f.filterSerialNumber || ''); @@ -780,6 +790,7 @@ const WorkOrderList: React.FC = () => { setFilterAsset(''); setFilterType(''); setFilterCompany(''); + setFilterSiteName(''); setFilterStatus(''); setFilterSerialNumber(''); setTempSerialNumber(''); @@ -789,8 +800,9 @@ const WorkOrderList: React.FC = () => { setFilterPriority(''); // ✅ Clear URL params when clearing all filters - if (searchParams.has('asset')) { + if (searchParams.has('asset') || searchParams.has('site_name')) { searchParams.delete('asset'); + searchParams.delete('site_name'); setSearchParams(searchParams); } @@ -798,7 +810,7 @@ const WorkOrderList: React.FC = () => { }; const hasActiveFilters = filterWorkOrderId || filterAsset || filterType || filterCompany || - filterStatus || filterSerialNumber || filterManufacturer || + filterSiteName || filterStatus || filterSerialNumber || filterManufacturer || filterSupplier || filterDepartment || filterPriority; const formatDate = (dateString?: string) => { @@ -1034,6 +1046,14 @@ const WorkOrderList: React.FC = () => { )} + {filterSiteName && ( + + Site: {filterSiteName} + + + )} {filterStatus && ( Status: {filterStatus} @@ -1237,6 +1257,27 @@ const WorkOrderList: React.FC = () => { )}
+ {/* Site Name */} +
+ setFilterSiteName(val)} + placeholder="Select Site" + disabled={false} + compact={true} + /> + {filterSiteName && ( + + )} +
+ {/* Status */}
{/* Manufacturer */} -
+
{
{/* Supplier */} -
+
{
{/* Department */} -
+
{ )} - + {/*
{workOrder.name}
{workOrder.creation ? new Date(workOrder.creation).toLocaleDateString() : ''}
+ */} + + +
{workOrder.name}
+
+ {formatDate(workOrder.modified)} +
+
{workOrder.asset_name || '-'}
{workOrder.asset || ''}
diff --git a/asm_app/src/services/assetService.ts b/asm_app/src/services/assetService.ts index ebf7ad5..6a97323 100644 --- a/asm_app/src/services/assetService.ts +++ b/asm_app/src/services/assetService.ts @@ -3,6 +3,8 @@ import API_CONFIG from '../config/api'; // Asset Interfaces export interface Asset { + custom_team_leader: string; + custom_moh_supervisor: string; name: string; asset_name: string; company: string; diff --git a/asm_app/src/services/userProfileService.ts b/asm_app/src/services/userProfileService.ts new file mode 100644 index 0000000..371260c --- /dev/null +++ b/asm_app/src/services/userProfileService.ts @@ -0,0 +1,190 @@ +import apiService from './apiService'; + +export interface UserProfile { + custom_user_id: string; + name: string; + email: string; + first_name: string; + middle_name?: string; + last_name?: string; + full_name: string; + role_profile_name?: string; + username?: string; + language?: string; + time_zone?: string; + user_image?: string; + enabled: number; + roles: Array<{ + role: string; + }>; +} + +export interface UpdateUserProfileData { + first_name?: string; + middle_name?: string; + last_name?: string; + role_profile_name?: string; + new_password?: string; + custom_user_id?: string; +} + +/** + * Fetch current logged-in user's profile + */ +export const fetchCurrentUserProfile = async (): Promise => { + try { + // First get the current user's email + const sessionResponse = await fetch('/api/method/frappe.auth.get_logged_user', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + }); + + const sessionData = await sessionResponse.json(); + const userEmail = sessionData.message; + + if (!userEmail) { + throw new Error('No user logged in'); + } + + // Use frappe.client.get which returns all fields including role_profile_name + const response = await fetch('/api/method/frappe.client.get', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + body: JSON.stringify({ + doctype: 'User', + name: userEmail, + }), + }); + + const result = await response.json(); + + // Debug: Log the response + console.log('frappe.client.get response:', result); + console.log('role_profile_name:', result.message?.role_profile_name); + + if (result.message) { + const userData = result.message as UserProfile; + + // Roles are included in the response as a child table + if (!userData.roles) { + userData.roles = []; + } + + return userData; + } + + throw new Error('Failed to fetch user profile'); + } catch (error) { + console.error('Error fetching user profile:', error); + throw error; + } +}; + +/** + * Update user profile + */ +export const updateUserProfile = async ( + userEmail: string, + data: UpdateUserProfileData +): Promise => { + try { + const response = await fetch(`/api/resource/User/${encodeURIComponent(userEmail)}`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + body: JSON.stringify(data), + }); + + const result = await response.json(); + + if (!response.ok) { + throw new Error(result.exc || result.message || 'Failed to update profile'); + } + + return result.data as UserProfile; + } catch (error) { + console.error('Error updating user profile:', error); + throw error; + } +}; + +/** + * Change user password using Frappe's update_password method + */ +export const changeUserPassword = async ( + newPassword: string, + oldPassword?: string +): Promise<{ message: string }> => { + try { + const response = await fetch('/api/method/frappe.core.doctype.user.user.update_password', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + body: JSON.stringify({ + new_password: newPassword, + old_password: oldPassword, + }), + }); + + const result = await response.json(); + + if (!response.ok) { + // Parse error message + let errorMsg = 'Failed to change password'; + if (result.exc) { + // Try to extract meaningful error from exception + if (result.exc.includes('Incorrect Old Password')) { + errorMsg = 'Incorrect old password'; + } else if (result.exc.includes('Password cannot be same')) { + errorMsg = 'New password cannot be the same as old password'; + } else if (result._server_messages) { + try { + const messages = JSON.parse(result._server_messages); + errorMsg = JSON.parse(messages[0]).message || errorMsg; + } catch (e) { + // Use default error + } + } + } + throw new Error(errorMsg); + } + + return { message: 'Password changed successfully' }; + } catch (error) { + console.error('Error changing password:', error); + throw error; + } +}; + +/** + * Fetch role profiles for dropdown + */ +export const fetchRoleProfiles = async (): Promise> => { + try { + const response = await apiService.apiCall( + `/api/resource/Role Profile?fields=["name"]&limit_page_length=100` + ); + + return response?.data || []; + } catch (error) { + console.error('Error fetching role profiles:', error); + return []; + } +}; + +export default { + fetchCurrentUserProfile, + updateUserProfile, + changeUserPassword, + fetchRoleProfiles, +}; \ No newline at end of file diff --git a/asm_ui_app/public/asm_app/assets/index-BIWpBVtY.js b/asm_ui_app/public/asm_app/assets/index-BIWpBVtY.js new file mode 100644 index 0000000..a7129a9 --- /dev/null +++ b/asm_ui_app/public/asm_app/assets/index-BIWpBVtY.js @@ -0,0 +1,1735 @@ +var Lk=Object.defineProperty,Dk=Object.defineProperties;var Pk=Object.getOwnPropertyDescriptors;var Zu=Object.getOwnPropertySymbols;var Gb=Object.prototype.hasOwnProperty,Zb=Object.prototype.propertyIsEnumerable;var rc=(e,t)=>(t=Symbol[e])?t:Symbol.for("Symbol."+e),Rk=e=>{throw TypeError(e)};var ig=(e,t,r)=>t in e?Lk(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,ne=(e,t)=>{for(var r in t||(t={}))Gb.call(t,r)&&ig(e,r,t[r]);if(Zu)for(var r of Zu(t))Zb.call(t,r)&&ig(e,r,t[r]);return e},Se=(e,t)=>Dk(e,Pk(t));var gn=(e,t)=>{var r={};for(var s in e)Gb.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&Zu)for(var s of Zu(e))t.indexOf(s)<0&&Zb.call(e,s)&&(r[s]=e[s]);return r};var Fk=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Kn=(e,t,r)=>ig(e,typeof t!="symbol"?t+"":t,r);var le=(e,t,r)=>new Promise((s,i)=>{var d=p=>{try{f(r.next(p))}catch(g){i(g)}},c=p=>{try{f(r.throw(p))}catch(g){i(g)}},f=p=>p.done?s(p.value):Promise.resolve(p.value).then(d,c);f((r=r.apply(e,t)).next())}),Zl=function(e,t){this[0]=e,this[1]=t},lg=(e,t,r)=>{var s=(c,f,p,g)=>{try{var x=r[c](f),y=(f=x.value)instanceof Zl,v=x.done;Promise.resolve(y?f[0]:f).then(k=>y?s(c==="return"?c:"next",f[1]?{done:k.done,value:k.value}:k,p,g):p({value:k,done:v})).catch(k=>s("throw",k,p,g))}catch(k){g(k)}},i=c=>d[c]=f=>new Promise((p,g)=>s(c,f,p,g)),d={};return r=r.apply(e,t),d[rc("asyncIterator")]=()=>d,i("next"),i("throw"),i("return"),d},og=e=>{var t=e[rc("asyncIterator")],r=!1,s,i={};return t==null?(t=e[rc("iterator")](),s=d=>i[d]=c=>t[d](c)):(t=t.call(e),s=d=>i[d]=c=>{if(r){if(r=!1,d==="throw")throw c;return c}return r=!0,{done:!1,value:new Zl(new Promise(f=>{var p=t[d](c);p instanceof Object||Rk("Object expected"),f(p)}),1)}}),i[rc("iterator")]=()=>i,s("next"),"throw"in t?s("throw"):i.throw=d=>{throw d},"return"in t&&s("return"),i},qb=(e,t,r)=>(t=e[rc("asyncIterator")])?t.call(e):(e=e[rc("iterator")](),t={},r=(s,i)=>(i=e[s])&&(t[s]=d=>new Promise((c,f,p)=>(d=i.call(e,d),p=d.done,Promise.resolve(d.value).then(g=>c({value:g,done:p}),f)))),r("next"),r("return"),t);var wD=Fk(Ye=>{(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const d of i)if(d.type==="childList")for(const c of d.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&s(c)}).observe(document,{childList:!0,subtree:!0});function r(i){const d={};return i.integrity&&(d.integrity=i.integrity),i.referrerPolicy&&(d.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?d.credentials="include":i.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function s(i){if(i.ep)return;i.ep=!0;const d=r(i);fetch(i.href,d)}})();function t_(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var cg={exports:{}},Rd={};var Yb;function Ik(){if(Yb)return Rd;Yb=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function r(s,i,d){var c=null;if(d!==void 0&&(c=""+d),i.key!==void 0&&(c=""+i.key),"key"in i){d={};for(var f in i)f!=="key"&&(d[f]=i[f])}else d=i;return i=d.ref,{$$typeof:e,type:s,key:c,ref:i!==void 0?i:null,props:d}}return Rd.Fragment=t,Rd.jsx=r,Rd.jsxs=r,Rd}var Xb;function zk(){return Xb||(Xb=1,cg.exports=Ik()),cg.exports}var a=zk(),dg={exports:{}},Gt={};var Jb;function Bk(){if(Jb)return Gt;Jb=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),d=Symbol.for("react.consumer"),c=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),x=Symbol.for("react.lazy"),y=Symbol.for("react.activity"),v=Symbol.iterator;function k(F){return F===null||typeof F!="object"?null:(F=v&&F[v]||F["@@iterator"],typeof F=="function"?F:null)}var T={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},N=Object.assign,S={};function A(F,D,H){this.props=F,this.context=D,this.refs=S,this.updater=H||T}A.prototype.isReactComponent={},A.prototype.setState=function(F,D){if(typeof F!="object"&&typeof F!="function"&&F!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,F,D,"setState")},A.prototype.forceUpdate=function(F){this.updater.enqueueForceUpdate(this,F,"forceUpdate")};function C(){}C.prototype=A.prototype;function O(F,D,H){this.props=F,this.context=D,this.refs=S,this.updater=H||T}var P=O.prototype=new C;P.constructor=O,N(P,A.prototype),P.isPureReactComponent=!0;var B=Array.isArray;function V(){}var z={H:null,A:null,T:null,S:null},U=Object.prototype.hasOwnProperty;function J(F,D,H){var Z=H.ref;return{$$typeof:e,type:F,key:D,ref:Z!==void 0?Z:null,props:H}}function de(F,D){return J(F.type,D,F.props)}function ye(F){return typeof F=="object"&&F!==null&&F.$$typeof===e}function ie(F){var D={"=":"=0",":":"=2"};return"$"+F.replace(/[=:]/g,function(H){return D[H]})}var he=/\/+/g;function ve(F,D){return typeof F=="object"&&F!==null&&F.key!=null?ie(""+F.key):D.toString(36)}function me(F){switch(F.status){case"fulfilled":return F.value;case"rejected":throw F.reason;default:switch(typeof F.status=="string"?F.then(V,V):(F.status="pending",F.then(function(D){F.status==="pending"&&(F.status="fulfilled",F.value=D)},function(D){F.status==="pending"&&(F.status="rejected",F.reason=D)})),F.status){case"fulfilled":return F.value;case"rejected":throw F.reason}}throw F}function ee(F,D,H,Z,K){var ue=typeof F;(ue==="undefined"||ue==="boolean")&&(F=null);var Le=!1;if(F===null)Le=!0;else switch(ue){case"bigint":case"string":case"number":Le=!0;break;case"object":switch(F.$$typeof){case e:case t:Le=!0;break;case x:return Le=F._init,ee(Le(F._payload),D,H,Z,K)}}if(Le)return K=K(F),Le=Z===""?"."+ve(F,0):Z,B(K)?(H="",Le!=null&&(H=Le.replace(he,"$&/")+"/"),ee(K,D,H,"",function(Fe){return Fe})):K!=null&&(ye(K)&&(K=de(K,H+(K.key==null||F&&F.key===K.key?"":(""+K.key).replace(he,"$&/")+"/")+Le)),D.push(K)),1;Le=0;var Ne=Z===""?".":Z+":";if(B(F))for(var We=0;We>>1,ae=ee[fe];if(0>>1;fei(H,Q))Zi(K,H)?(ee[fe]=K,ee[Z]=Q,fe=Z):(ee[fe]=H,ee[D]=Q,fe=D);else if(Zi(K,Q))ee[fe]=K,ee[Z]=Q,fe=Z;else break e}}return q}function i(ee,q){var Q=ee.sortIndex-q.sortIndex;return Q!==0?Q:ee.id-q.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;e.unstable_now=function(){return d.now()}}else{var c=Date,f=c.now();e.unstable_now=function(){return c.now()-f}}var p=[],g=[],x=1,y=null,v=3,k=!1,T=!1,N=!1,S=!1,A=typeof setTimeout=="function"?setTimeout:null,C=typeof clearTimeout=="function"?clearTimeout:null,O=typeof setImmediate!="undefined"?setImmediate:null;function P(ee){for(var q=r(g);q!==null;){if(q.callback===null)s(g);else if(q.startTime<=ee)s(g),q.sortIndex=q.expirationTime,t(p,q);else break;q=r(g)}}function B(ee){if(N=!1,P(ee),!T)if(r(p)!==null)T=!0,V||(V=!0,ie());else{var q=r(g);q!==null&&me(B,q.startTime-ee)}}var V=!1,z=-1,U=5,J=-1;function de(){return S?!0:!(e.unstable_now()-Jee&&de());){var fe=y.callback;if(typeof fe=="function"){y.callback=null,v=y.priorityLevel;var ae=fe(y.expirationTime<=ee);if(ee=e.unstable_now(),typeof ae=="function"){y.callback=ae,P(ee),q=!0;break t}y===r(p)&&s(p),P(ee)}else s(p);y=r(p)}if(y!==null)q=!0;else{var F=r(g);F!==null&&me(B,F.startTime-ee),q=!1}}break e}finally{y=null,v=Q,k=!1}q=void 0}}finally{q?ie():V=!1}}}var ie;if(typeof O=="function")ie=function(){O(ye)};else if(typeof MessageChannel!="undefined"){var he=new MessageChannel,ve=he.port2;he.port1.onmessage=ye,ie=function(){ve.postMessage(null)}}else ie=function(){A(ye,0)};function me(ee,q){z=A(function(){ee(e.unstable_now())},q)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(ee){ee.callback=null},e.unstable_forceFrameRate=function(ee){0>ee||125fe?(ee.sortIndex=Q,t(g,ee),r(p)===null&&ee===r(g)&&(N?(C(z),z=-1):N=!0,me(B,Q-fe))):(ee.sortIndex=ae,t(p,ee),T||k||(T=!0,V||(V=!0,ie()))),ee},e.unstable_shouldYield=de,e.unstable_wrapCallback=function(ee){var q=v;return function(){var Q=v;v=q;try{return ee.apply(this,arguments)}finally{v=Q}}}})(hg)),hg}var e1;function Hk(){return e1||(e1=1,fg.exports=Uk()),fg.exports}var mg={exports:{}},Ur={};var t1;function $k(){if(t1)return Ur;t1=1;var e=Hf();function t(p){var g="https://react.dev/errors/"+p;if(1ae||(n.current=fe[ae],fe[ae]=null,ae--)}function H(n,l){ae++,fe[ae]=n.current,n.current=l}var Z=F(null),K=F(null),ue=F(null),Le=F(null);function Ne(n,l){switch(H(ue,l),H(K,n),H(Z,null),l.nodeType){case 9:case 11:n=(n=l.documentElement)&&(n=n.namespaceURI)?gb(n):0;break;default:if(n=l.tagName,l=l.namespaceURI)l=gb(l),n=pb(l,n);else switch(n){case"svg":n=1;break;case"math":n=2;break;default:n=0}}D(Z),H(Z,n)}function We(){D(Z),D(K),D(ue)}function Fe(n){n.memoizedState!==null&&H(Le,n);var l=Z.current,u=pb(l,n.type);l!==u&&(H(K,n),H(Z,u))}function tt(n){K.current===n&&(D(Z),D(K)),Le.current===n&&(D(Le),Md._currentValue=Q)}var ft,Dt;function Ve(n){if(ft===void 0)try{throw Error()}catch(u){var l=u.stack.trim().match(/\n( *(at )?)/);ft=l&&l[1]||"",Dt=-1)":-1_||be[m]!==Me[_]){var Ze=` +`+be[m].replace(" at new "," at ");return n.displayName&&Ze.includes("")&&(Ze=Ze.replace("",n.displayName)),Ze}while(1<=m&&0<=_);break}}}finally{At=!1,Error.prepareStackTrace=u}return(u=n?n.displayName||n.name:"")?Ve(u):""}function He(n,l){switch(n.tag){case 26:case 27:case 5:return Ve(n.type);case 16:return Ve("Lazy");case 13:return n.child!==l&&l!==null?Ve("Suspense Fallback"):Ve("Suspense");case 19:return Ve("SuspenseList");case 0:case 15:return jt(n.type,!1);case 11:return jt(n.type.render,!1);case 1:return jt(n.type,!0);case 31:return Ve("Activity");default:return""}}function oe(n){try{var l="",u=null;do l+=He(n,u),u=n,n=n.return;while(n);return l}catch(m){return` +Error generating stack: `+m.message+` +`+m.stack}}var we=Object.prototype.hasOwnProperty,Ie=e.unstable_scheduleCallback,ot=e.unstable_cancelCallback,bt=e.unstable_shouldYield,qe=e.unstable_requestPaint,Ue=e.unstable_now,ht=e.unstable_getCurrentPriorityLevel,wt=e.unstable_ImmediatePriority,Mt=e.unstable_UserBlockingPriority,Ft=e.unstable_NormalPriority,je=e.unstable_LowPriority,it=e.unstable_IdlePriority,vt=e.log,Bt=e.unstable_setDisableYieldValue,De=null,ct=null;function ut(n){if(typeof vt=="function"&&Bt(n),ct&&typeof ct.setStrictMode=="function")try{ct.setStrictMode(De,n)}catch(l){}}var Nt=Math.clz32?Math.clz32:et,Rt=Math.log,ia=Math.LN2;function et(n){return n>>>=0,n===0?32:31-(Rt(n)/ia|0)|0}var pe=256,ze=262144,st=4194304;function Ut(n){var l=n&42;if(l!==0)return l;switch(n&-n){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return n&261888;case 262144:case 524288:case 1048576:case 2097152:return n&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return n&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return n}}function la(n,l,u){var m=n.pendingLanes;if(m===0)return 0;var _=0,w=n.suspendedLanes,R=n.pingedLanes;n=n.warmLanes;var X=m&134217727;return X!==0?(m=X&~w,m!==0?_=Ut(m):(R&=X,R!==0?_=Ut(R):u||(u=X&~n,u!==0&&(_=Ut(u))))):(X=m&~w,X!==0?_=Ut(X):R!==0?_=Ut(R):u||(u=m&~n,u!==0&&(_=Ut(u)))),_===0?0:l!==0&&l!==_&&(l&w)===0&&(w=_&-_,u=l&-l,w>=u||w===32&&(u&4194048)!==0)?l:_}function va(n,l){return(n.pendingLanes&~(n.suspendedLanes&~n.pingedLanes)&l)===0}function ar(n,l){switch(n){case 1:case 2:case 4:case 8:case 64:return l+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function tn(){var n=st;return st<<=1,(st&62914560)===0&&(st=4194304),n}function Bn(n){for(var l=[],u=0;31>u;u++)l.push(n);return l}function Gr(n,l){n.pendingLanes|=l,l!==268435456&&(n.suspendedLanes=0,n.pingedLanes=0,n.warmLanes=0)}function Zs(n,l,u,m,_,w){var R=n.pendingLanes;n.pendingLanes=u,n.suspendedLanes=0,n.pingedLanes=0,n.warmLanes=0,n.expiredLanes&=u,n.entangledLanes&=u,n.errorRecoveryDisabledLanes&=u,n.shellSuspendCounter=0;var X=n.entanglements,be=n.expirationTimes,Me=n.hiddenUpdates;for(u=R&~u;0=Ai),jo=" ",B0=!1;function U0(n,l){switch(n){case"keyup":return sn.indexOf(l.keyCode)!==-1;case"keydown":return l.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Qc(n){return n=n.detail,typeof n=="object"&&"data"in n?n.data:null}var Oi=!1;function Tn(n,l){switch(n){case"compositionend":return Qc(l);case"keypress":return l.which!==32?null:(B0=!0,jo);case"textInput":return n=l.data,n===jo&&B0?null:n;default:return null}}function Mi(n,l){if(Oi)return n==="compositionend"||!ko&&U0(n,l)?(n=Es(),Ga=Xs=Hn=null,Oi=!1,n):null;switch(n){case"paste":return null;case"keypress":if(!(l.ctrlKey||l.altKey||l.metaKey)||l.ctrlKey&&l.altKey){if(l.char&&1=l)return{node:u,offset:l-n};n=m}e:{for(;u;){if(u.nextSibling){u=u.nextSibling;break e}u=u.parentNode}u=void 0}u=To(u)}}function Eo(n,l){return n&&l?n===l?!0:n&&n.nodeType===3?!1:l&&l.nodeType===3?Eo(n,l.parentNode):"contains"in n?n.contains(l):n.compareDocumentPosition?!!(n.compareDocumentPosition(l)&16):!1:!1}function El(n){n=n!=null&&n.ownerDocument!=null&&n.ownerDocument.defaultView!=null?n.ownerDocument.defaultView:window;for(var l=Ni(n.document);l instanceof n.HTMLIFrameElement;){try{var u=typeof l.contentWindow.location.href=="string"}catch(m){u=!1}if(u)n=l.contentWindow;else break;l=Ni(n.document)}return l}function As(n){var l=n&&n.nodeName&&n.nodeName.toLowerCase();return l&&(l==="input"&&(n.type==="text"||n.type==="search"||n.type==="tel"||n.type==="url"||n.type==="password")||l==="textarea"||n.contentEditable==="true")}var Co=jn&&"documentMode"in document&&11>=document.documentMode,Os=null,Ao=null,Cl=null,Ri=!1;function G0(n,l,u){var m=u.window===u?u.document:u.nodeType===9?u:u.ownerDocument;Ri||Os==null||Os!==Ni(m)||(m=Os,"selectionStart"in m&&As(m)?m={start:m.selectionStart,end:m.selectionEnd}:(m=(m.ownerDocument&&m.ownerDocument.defaultView||window).getSelection(),m={anchorNode:m.anchorNode,anchorOffset:m.anchorOffset,focusNode:m.focusNode,focusOffset:m.focusOffset}),Cl&&Pi(Cl,m)||(Cl=m,m=Mu(Ao,"onSelect"),0>=R,_-=R,Je=1<<32-Nt(l)+_|u<<_|m,yt=w+n}else Je=1<Xt?(na=Ot,Ot=null):na=Ot.sibling;var ua=Re(Te,Ot,Oe[Xt],Xe);if(ua===null){Ot===null&&(Ot=na);break}n&&Ot&&ua.alternate===null&&l(Te,Ot),_e=w(ua,_e,Xt),da===null?Pt=ua:da.sibling=ua,da=ua,Ot=na}if(Xt===Oe.length)return u(Te,Ot),Kt&&Lt(Te,Xt),Pt;if(Ot===null){for(;XtXt?(na=Ot,Ot=null):na=Ot.sibling;var nl=Re(Te,Ot,ua.value,Xe);if(nl===null){Ot===null&&(Ot=na);break}n&&Ot&&nl.alternate===null&&l(Te,Ot),_e=w(nl,_e,Xt),da===null?Pt=nl:da.sibling=nl,da=nl,Ot=na}if(ua.done)return u(Te,Ot),Kt&&Lt(Te,Xt),Pt;if(Ot===null){for(;!ua.done;Xt++,ua=Oe.next())ua=Ke(Te,ua.value,Xe),ua!==null&&(_e=w(ua,_e,Xt),da===null?Pt=ua:da.sibling=ua,da=ua);return Kt&&Lt(Te,Xt),Pt}for(Ot=m(Ot);!ua.done;Xt++,ua=Oe.next())ua=$e(Ot,Te,Xt,ua.value,Xe),ua!==null&&(n&&ua.alternate!==null&&Ot.delete(ua.key===null?Xt:ua.key),_e=w(ua,_e,Xt),da===null?Pt=ua:da.sibling=ua,da=ua);return n&&Ot.forEach(function(Mk){return l(Te,Mk)}),Kt&&Lt(Te,Xt),Pt}function Aa(Te,_e,Oe,Xe){if(typeof Oe=="object"&&Oe!==null&&Oe.type===N&&Oe.key===null&&(Oe=Oe.props.children),typeof Oe=="object"&&Oe!==null){switch(Oe.$$typeof){case k:e:{for(var Pt=Oe.key;_e!==null;){if(_e.key===Pt){if(Pt=Oe.type,Pt===N){if(_e.tag===7){u(Te,_e.sibling),Xe=_(_e,Oe.props.children),Xe.return=Te,Te=Xe;break e}}else if(_e.elementType===Pt||typeof Pt=="object"&&Pt!==null&&Pt.$$typeof===U&&Bl(Pt)===_e.type){u(Te,_e.sibling),Xe=_(_e,Oe.props),cd(Xe,Oe),Xe.return=Te,Te=Xe;break e}u(Te,_e);break}else l(Te,_e);_e=_e.sibling}Oe.type===N?(Xe=Qs(Oe.props.children,Te.mode,Xe,Oe.key),Xe.return=Te,Te=Xe):(Xe=Pl(Oe.type,Oe.key,Oe.props,null,Te.mode,Xe),cd(Xe,Oe),Xe.return=Te,Te=Xe)}return R(Te);case T:e:{for(Pt=Oe.key;_e!==null;){if(_e.key===Pt)if(_e.tag===4&&_e.stateNode.containerInfo===Oe.containerInfo&&_e.stateNode.implementation===Oe.implementation){u(Te,_e.sibling),Xe=_(_e,Oe.children||[]),Xe.return=Te,Te=Xe;break e}else{u(Te,_e);break}else l(Te,_e);_e=_e.sibling}Xe=rd(Oe,Te.mode,Xe),Xe.return=Te,Te=Xe}return R(Te);case U:return Oe=Bl(Oe),Aa(Te,_e,Oe,Xe)}if(me(Oe))return Ct(Te,_e,Oe,Xe);if(ie(Oe)){if(Pt=ie(Oe),typeof Pt!="function")throw Error(s(150));return Oe=Pt.call(Oe),It(Te,_e,Oe,Xe)}if(typeof Oe.then=="function")return Aa(Te,_e,au(Oe),Xe);if(Oe.$$typeof===O)return Aa(Te,_e,K0(Te,Oe),Xe);ru(Te,Oe)}return typeof Oe=="string"&&Oe!==""||typeof Oe=="number"||typeof Oe=="bigint"?(Oe=""+Oe,_e!==null&&_e.tag===6?(u(Te,_e.sibling),Xe=_(_e,Oe),Xe.return=Te,Te=Xe):(u(Te,_e),Xe=Do(Oe,Te.mode,Xe),Xe.return=Te,Te=Xe),R(Te)):u(Te,_e)}return function(Te,_e,Oe,Xe){try{od=0;var Pt=Aa(Te,_e,Oe,Xe);return Bo=null,Pt}catch(Ot){if(Ot===zo||Ot===eu)throw Ot;var da=Br(29,Ot,null,Te.mode);return da.lanes=Xe,da.return=Te,da}finally{}}}var Hl=ix(!0),lx=ix(!1),Ui=!1;function Rh(n){n.updateQueue={baseState:n.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Fh(n,l){n=n.updateQueue,l.updateQueue===n&&(l.updateQueue={baseState:n.baseState,firstBaseUpdate:n.firstBaseUpdate,lastBaseUpdate:n.lastBaseUpdate,shared:n.shared,callbacks:null})}function Hi(n){return{lane:n,tag:0,payload:null,callback:null,next:null}}function $i(n,l,u){var m=n.updateQueue;if(m===null)return null;if(m=m.shared,(ga&2)!==0){var _=m.pending;return _===null?l.next=l:(l.next=_.next,_.next=l),m.pending=l,l=Dl(n),zi(n,null,u),l}return Ds(n,m,l,u),Dl(n)}function dd(n,l,u){if(l=l.updateQueue,l!==null&&(l=l.shared,(u&4194048)!==0)){var m=l.lanes;m&=n.pendingLanes,u|=m,l.lanes=u,an(n,u)}}function Ih(n,l){var u=n.updateQueue,m=n.alternate;if(m!==null&&(m=m.updateQueue,u===m)){var _=null,w=null;if(u=u.firstBaseUpdate,u!==null){do{var R={lane:u.lane,tag:u.tag,payload:u.payload,callback:null,next:null};w===null?_=w=R:w=w.next=R,u=u.next}while(u!==null);w===null?_=w=l:w=w.next=l}else _=w=l;u={baseState:m.baseState,firstBaseUpdate:_,lastBaseUpdate:w,shared:m.shared,callbacks:m.callbacks},n.updateQueue=u;return}n=u.lastBaseUpdate,n===null?u.firstBaseUpdate=l:n.next=l,u.lastBaseUpdate=l}var zh=!1;function ud(){if(zh){var n=Io;if(n!==null)throw n}}function fd(n,l,u,m){zh=!1;var _=n.updateQueue;Ui=!1;var w=_.firstBaseUpdate,R=_.lastBaseUpdate,X=_.shared.pending;if(X!==null){_.shared.pending=null;var be=X,Me=be.next;be.next=null,R===null?w=Me:R.next=Me,R=be;var Ze=n.alternate;Ze!==null&&(Ze=Ze.updateQueue,X=Ze.lastBaseUpdate,X!==R&&(X===null?Ze.firstBaseUpdate=Me:X.next=Me,Ze.lastBaseUpdate=be))}if(w!==null){var Ke=_.baseState;R=0,Ze=Me=be=null,X=w;do{var Re=X.lane&-536870913,$e=Re!==X.lane;if($e?(ra&Re)===Re:(m&Re)===Re){Re!==0&&Re===Fo&&(zh=!0),Ze!==null&&(Ze=Ze.next={lane:0,tag:X.tag,payload:X.payload,callback:null,next:null});e:{var Ct=n,It=X;Re=l;var Aa=u;switch(It.tag){case 1:if(Ct=It.payload,typeof Ct=="function"){Ke=Ct.call(Aa,Ke,Re);break e}Ke=Ct;break e;case 3:Ct.flags=Ct.flags&-65537|128;case 0:if(Ct=It.payload,Re=typeof Ct=="function"?Ct.call(Aa,Ke,Re):Ct,Re==null)break e;Ke=y({},Ke,Re);break e;case 2:Ui=!0}}Re=X.callback,Re!==null&&(n.flags|=64,$e&&(n.flags|=8192),$e=_.callbacks,$e===null?_.callbacks=[Re]:$e.push(Re))}else $e={lane:Re,tag:X.tag,payload:X.payload,callback:X.callback,next:null},Ze===null?(Me=Ze=$e,be=Ke):Ze=Ze.next=$e,R|=Re;if(X=X.next,X===null){if(X=_.shared.pending,X===null)break;$e=X,X=$e.next,$e.next=null,_.lastBaseUpdate=$e,_.shared.pending=null}}while(!0);Ze===null&&(be=Ke),_.baseState=be,_.firstBaseUpdate=Me,_.lastBaseUpdate=Ze,w===null&&(_.shared.lanes=0),qi|=R,n.lanes=R,n.memoizedState=Ke}}function ox(n,l){if(typeof n!="function")throw Error(s(191,n));n.call(l)}function cx(n,l){var u=n.callbacks;if(u!==null)for(n.callbacks=null,n=0;nw?w:8;var R=ee.T,X={};ee.T=X,nm(n,!1,l,u);try{var be=_(),Me=ee.S;if(Me!==null&&Me(X,be),be!==null&&typeof be=="object"&&typeof be.then=="function"){var Ze=_4(be,m);gd(n,l,Ze,Mn(n))}else gd(n,l,m,Mn(n))}catch(Ke){gd(n,l,{then:function(){},status:"rejected",reason:Ke},Mn())}finally{q.p=w,R!==null&&X.types!==null&&(R.types=X.types),ee.T=R}}function T4(){}function am(n,l,u,m){if(n.tag!==5)throw Error(s(476));var _=Ux(n).queue;Bx(n,_,l,Q,u===null?T4:function(){return Hx(n),u(m)})}function Ux(n){var l=n.memoizedState;if(l!==null)return l;l={memoizedState:Q,baseState:Q,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ri,lastRenderedState:Q},next:null};var u={};return l.next={memoizedState:u,baseState:u,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ri,lastRenderedState:u},next:null},n.memoizedState=l,n=n.alternate,n!==null&&(n.memoizedState=l),l}function Hx(n){var l=Ux(n);l.next===null&&(l=n.alternate.memoizedState),gd(n,l.next.queue,{},Mn())}function rm(){return Er(Md)}function $x(){return er().memoizedState}function Wx(){return er().memoizedState}function E4(n){for(var l=n.return;l!==null;){switch(l.tag){case 24:case 3:var u=Mn();n=Hi(u);var m=$i(l,n,u);m!==null&&(mn(m,l,u),dd(m,l,u)),l={cache:Mh()},n.payload=l;return}l=l.return}}function C4(n,l,u){var m=Mn();u={lane:m,revertLane:0,gesture:null,action:u,hasEagerState:!1,eagerState:null,next:null},hu(n)?Gx(l,u):(u=ed(n,l,u,m),u!==null&&(mn(u,n,m),Zx(u,l,m)))}function Vx(n,l,u){var m=Mn();gd(n,l,u,m)}function gd(n,l,u,m){var _={lane:m,revertLane:0,gesture:null,action:u,hasEagerState:!1,eagerState:null,next:null};if(hu(n))Gx(l,_);else{var w=n.alternate;if(n.lanes===0&&(w===null||w.lanes===0)&&(w=l.lastRenderedReducer,w!==null))try{var R=l.lastRenderedState,X=w(R,u);if(_.hasEagerState=!0,_.eagerState=X,xr(X,R))return Ds(n,l,_,0),Pa===null&&Ll(),!1}catch(be){}finally{}if(u=ed(n,l,_,m),u!==null)return mn(u,n,m),Zx(u,l,m),!0}return!1}function nm(n,l,u,m){if(m={lane:2,revertLane:Rm(),gesture:null,action:m,hasEagerState:!1,eagerState:null,next:null},hu(n)){if(l)throw Error(s(479))}else l=ed(n,u,m,2),l!==null&&mn(l,n,2)}function hu(n){var l=n.alternate;return n===Zt||l!==null&&l===Zt}function Gx(n,l){Ho=iu=!0;var u=n.pending;u===null?l.next=l:(l.next=u.next,u.next=l),n.pending=l}function Zx(n,l,u){if((u&4194048)!==0){var m=l.lanes;m&=n.pendingLanes,u|=m,l.lanes=u,an(n,u)}}var pd={readContext:Er,use:cu,useCallback:qa,useContext:qa,useEffect:qa,useImperativeHandle:qa,useLayoutEffect:qa,useInsertionEffect:qa,useMemo:qa,useReducer:qa,useRef:qa,useState:qa,useDebugValue:qa,useDeferredValue:qa,useTransition:qa,useSyncExternalStore:qa,useId:qa,useHostTransitionStatus:qa,useFormState:qa,useActionState:qa,useOptimistic:qa,useMemoCache:qa,useCacheRefresh:qa};pd.useEffectEvent=qa;var qx={readContext:Er,use:cu,useCallback:function(n,l){return Yr().memoizedState=[n,l===void 0?null:l],n},useContext:Er,useEffect:Ox,useImperativeHandle:function(n,l,u){u=u!=null?u.concat([n]):null,uu(4194308,4,Px.bind(null,l,n),u)},useLayoutEffect:function(n,l){return uu(4194308,4,n,l)},useInsertionEffect:function(n,l){uu(4,2,n,l)},useMemo:function(n,l){var u=Yr();l=l===void 0?null:l;var m=n();if($l){ut(!0);try{n()}finally{ut(!1)}}return u.memoizedState=[m,l],m},useReducer:function(n,l,u){var m=Yr();if(u!==void 0){var _=u(l);if($l){ut(!0);try{u(l)}finally{ut(!1)}}}else _=l;return m.memoizedState=m.baseState=_,n={pending:null,lanes:0,dispatch:null,lastRenderedReducer:n,lastRenderedState:_},m.queue=n,n=n.dispatch=C4.bind(null,Zt,n),[m.memoizedState,n]},useRef:function(n){var l=Yr();return n={current:n},l.memoizedState=n},useState:function(n){n=Jh(n);var l=n.queue,u=Vx.bind(null,Zt,l);return l.dispatch=u,[n.memoizedState,u]},useDebugValue:em,useDeferredValue:function(n,l){var u=Yr();return tm(u,n,l)},useTransition:function(){var n=Jh(!1);return n=Bx.bind(null,Zt,n.queue,!0,!1),Yr().memoizedState=n,[!1,n]},useSyncExternalStore:function(n,l,u){var m=Zt,_=Yr();if(Kt){if(u===void 0)throw Error(s(407));u=u()}else{if(u=l(),Pa===null)throw Error(s(349));(ra&127)!==0||gx(m,l,u)}_.memoizedState=u;var w={value:u,getSnapshot:l};return _.queue=w,Ox(xx.bind(null,m,w,n),[n]),m.flags|=2048,Wo(9,{destroy:void 0},px.bind(null,m,w,u,l),null),u},useId:function(){var n=Yr(),l=Pa.identifierPrefix;if(Kt){var u=yt,m=Je;u=(m&~(1<<32-Nt(m)-1)).toString(32)+u,l="_"+l+"R_"+u,u=lu++,0<\/script>",w=w.removeChild(w.firstChild);break;case"select":w=typeof m.is=="string"?R.createElement("select",{is:m.is}):R.createElement("select"),m.multiple?w.multiple=!0:m.size&&(w.size=m.size);break;default:w=typeof m.is=="string"?R.createElement(_,{is:m.is}):R.createElement(_)}}w[Y]=l,w[te]=m;e:for(R=l.child;R!==null;){if(R.tag===5||R.tag===6)w.appendChild(R.stateNode);else if(R.tag!==4&&R.tag!==27&&R.child!==null){R.child.return=R,R=R.child;continue}if(R===l)break e;for(;R.sibling===null;){if(R.return===null||R.return===l)break e;R=R.return}R.sibling.return=R.return,R=R.sibling}l.stateNode=w;e:switch(Ar(w,_,m),_){case"button":case"input":case"select":case"textarea":m=!!m.autoFocus;break e;case"img":m=!0;break e;default:m=!1}m&&si(l)}}return Ia(l),ym(l,l.type,n===null?null:n.memoizedProps,l.pendingProps,u),null;case 6:if(n&&l.stateNode!=null)n.memoizedProps!==m&&si(l);else{if(typeof m!="string"&&l.stateNode===null)throw Error(s(166));if(n=ue.current,us(l)){if(n=l.stateNode,u=l.memoizedProps,m=null,_=oa,_!==null)switch(_.tag){case 27:case 5:m=_.memoizedProps}n[Y]=l,n=!!(n.nodeValue===u||m!==null&&m.suppressHydrationWarning===!0||hb(n.nodeValue,u)),n||Rs(l,!0)}else n=Lu(n).createTextNode(m),n[Y]=l,l.stateNode=n}return Ia(l),null;case 31:if(u=l.memoizedState,n===null||n.memoizedState!==null){if(m=us(l),u!==null){if(n===null){if(!m)throw Error(s(318));if(n=l.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(s(557));n[Y]=l}else ei(),(l.flags&128)===0&&(l.memoizedState=null),l.flags|=4;Ia(l),n=!1}else u=sd(),n!==null&&n.memoizedState!==null&&(n.memoizedState.hydrationErrors=u),n=!0;if(!n)return l.flags&256?(Cn(l),l):(Cn(l),null);if((l.flags&128)!==0)throw Error(s(558))}return Ia(l),null;case 13:if(m=l.memoizedState,n===null||n.memoizedState!==null&&n.memoizedState.dehydrated!==null){if(_=us(l),m!==null&&m.dehydrated!==null){if(n===null){if(!_)throw Error(s(318));if(_=l.memoizedState,_=_!==null?_.dehydrated:null,!_)throw Error(s(317));_[Y]=l}else ei(),(l.flags&128)===0&&(l.memoizedState=null),l.flags|=4;Ia(l),_=!1}else _=sd(),n!==null&&n.memoizedState!==null&&(n.memoizedState.hydrationErrors=_),_=!0;if(!_)return l.flags&256?(Cn(l),l):(Cn(l),null)}return Cn(l),(l.flags&128)!==0?(l.lanes=u,l):(u=m!==null,n=n!==null&&n.memoizedState!==null,u&&(m=l.child,_=null,m.alternate!==null&&m.alternate.memoizedState!==null&&m.alternate.memoizedState.cachePool!==null&&(_=m.alternate.memoizedState.cachePool.pool),w=null,m.memoizedState!==null&&m.memoizedState.cachePool!==null&&(w=m.memoizedState.cachePool.pool),w!==_&&(m.flags|=2048)),u!==n&&u&&(l.child.flags|=8192),yu(l,l.updateQueue),Ia(l),null);case 4:return We(),n===null&&Bm(l.stateNode.containerInfo),Ia(l),null;case 10:return ti(l.type),Ia(l),null;case 19:if(D(Qa),m=l.memoizedState,m===null)return Ia(l),null;if(_=(l.flags&128)!==0,w=m.rendering,w===null)if(_)yd(m,!1);else{if(Ya!==0||n!==null&&(n.flags&128)!==0)for(n=l.child;n!==null;){if(w=su(n),w!==null){for(l.flags|=128,yd(m,!1),n=w.updateQueue,l.updateQueue=n,yu(l,n),l.subtreeFlags=0,n=u,u=l.child;u!==null;)td(u,n),u=u.sibling;return H(Qa,Qa.current&1|2),Kt&&Lt(l,m.treeForkCount),l.child}n=n.sibling}m.tail!==null&&Ue()>ku&&(l.flags|=128,_=!0,yd(m,!1),l.lanes=4194304)}else{if(!_)if(n=su(w),n!==null){if(l.flags|=128,_=!0,n=n.updateQueue,l.updateQueue=n,yu(l,n),yd(m,!0),m.tail===null&&m.tailMode==="hidden"&&!w.alternate&&!Kt)return Ia(l),null}else 2*Ue()-m.renderingStartTime>ku&&u!==536870912&&(l.flags|=128,_=!0,yd(m,!1),l.lanes=4194304);m.isBackwards?(w.sibling=l.child,l.child=w):(n=m.last,n!==null?n.sibling=w:l.child=w,m.last=w)}return m.tail!==null?(n=m.tail,m.rendering=n,m.tail=n.sibling,m.renderingStartTime=Ue(),n.sibling=null,u=Qa.current,H(Qa,_?u&1|2:u&1),Kt&&Lt(l,m.treeForkCount),n):(Ia(l),null);case 22:case 23:return Cn(l),Uh(),m=l.memoizedState!==null,n!==null?n.memoizedState!==null!==m&&(l.flags|=8192):m&&(l.flags|=8192),m?(u&536870912)!==0&&(l.flags&128)===0&&(Ia(l),l.subtreeFlags&6&&(l.flags|=8192)):Ia(l),u=l.updateQueue,u!==null&&yu(l,u.retryQueue),u=null,n!==null&&n.memoizedState!==null&&n.memoizedState.cachePool!==null&&(u=n.memoizedState.cachePool.pool),m=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(m=l.memoizedState.cachePool.pool),m!==u&&(l.flags|=2048),n!==null&&D(zl),null;case 24:return u=null,n!==null&&(u=n.memoizedState.cache),l.memoizedState.cache!==u&&(l.flags|=2048),ti(nr),Ia(l),null;case 25:return null;case 30:return null}throw Error(s(156,l.tag))}function D4(n,l){switch(Za(l),l.tag){case 1:return n=l.flags,n&65536?(l.flags=n&-65537|128,l):null;case 3:return ti(nr),We(),n=l.flags,(n&65536)!==0&&(n&128)===0?(l.flags=n&-65537|128,l):null;case 26:case 27:case 5:return tt(l),null;case 31:if(l.memoizedState!==null){if(Cn(l),l.alternate===null)throw Error(s(340));ei()}return n=l.flags,n&65536?(l.flags=n&-65537|128,l):null;case 13:if(Cn(l),n=l.memoizedState,n!==null&&n.dehydrated!==null){if(l.alternate===null)throw Error(s(340));ei()}return n=l.flags,n&65536?(l.flags=n&-65537|128,l):null;case 19:return D(Qa),null;case 4:return We(),null;case 10:return ti(l.type),null;case 22:case 23:return Cn(l),Uh(),n!==null&&D(zl),n=l.flags,n&65536?(l.flags=n&-65537|128,l):null;case 24:return ti(nr),null;case 25:return null;default:return null}}function yy(n,l){switch(Za(l),l.tag){case 3:ti(nr),We();break;case 26:case 27:case 5:tt(l);break;case 4:We();break;case 31:l.memoizedState!==null&&Cn(l);break;case 13:Cn(l);break;case 19:D(Qa);break;case 10:ti(l.type);break;case 22:case 23:Cn(l),Uh(),n!==null&&D(zl);break;case 24:ti(nr)}}function bd(n,l){try{var u=l.updateQueue,m=u!==null?u.lastEffect:null;if(m!==null){var _=m.next;u=_;do{if((u.tag&n)===n){m=void 0;var w=u.create,R=u.inst;m=w(),R.destroy=m}u=u.next}while(u!==_)}}catch(X){wa(l,l.return,X)}}function Gi(n,l,u){try{var m=l.updateQueue,_=m!==null?m.lastEffect:null;if(_!==null){var w=_.next;m=w;do{if((m.tag&n)===n){var R=m.inst,X=R.destroy;if(X!==void 0){R.destroy=void 0,_=l;var be=u,Me=X;try{Me()}catch(Ze){wa(_,be,Ze)}}}m=m.next}while(m!==w)}}catch(Ze){wa(l,l.return,Ze)}}function by(n){var l=n.updateQueue;if(l!==null){var u=n.stateNode;try{cx(l,u)}catch(m){wa(n,n.return,m)}}}function vy(n,l,u){u.props=Wl(n.type,n.memoizedProps),u.state=n.memoizedState;try{u.componentWillUnmount()}catch(m){wa(n,l,m)}}function vd(n,l){try{var u=n.ref;if(u!==null){switch(n.tag){case 26:case 27:case 5:var m=n.stateNode;break;case 30:m=n.stateNode;break;default:m=n.stateNode}typeof u=="function"?n.refCleanup=u(m):u.current=m}}catch(_){wa(n,l,_)}}function Is(n,l){var u=n.ref,m=n.refCleanup;if(u!==null)if(typeof m=="function")try{m()}catch(_){wa(n,l,_)}finally{n.refCleanup=null,n=n.alternate,n!=null&&(n.refCleanup=null)}else if(typeof u=="function")try{u(null)}catch(_){wa(n,l,_)}else u.current=null}function _y(n){var l=n.type,u=n.memoizedProps,m=n.stateNode;try{e:switch(l){case"button":case"input":case"select":case"textarea":u.autoFocus&&m.focus();break e;case"img":u.src?m.src=u.src:u.srcSet&&(m.srcset=u.srcSet)}}catch(_){wa(n,n.return,_)}}function bm(n,l,u){try{var m=n.stateNode;ak(m,n.type,u,l),m[te]=l}catch(_){wa(n,n.return,_)}}function wy(n){return n.tag===5||n.tag===3||n.tag===26||n.tag===27&&Qi(n.type)||n.tag===4}function vm(n){e:for(;;){for(;n.sibling===null;){if(n.return===null||wy(n.return))return null;n=n.return}for(n.sibling.return=n.return,n=n.sibling;n.tag!==5&&n.tag!==6&&n.tag!==18;){if(n.tag===27&&Qi(n.type)||n.flags&2||n.child===null||n.tag===4)continue e;n.child.return=n,n=n.child}if(!(n.flags&2))return n.stateNode}}function _m(n,l,u){var m=n.tag;if(m===5||m===6)n=n.stateNode,l?(u.nodeType===9?u.body:u.nodeName==="HTML"?u.ownerDocument.body:u).insertBefore(n,l):(l=u.nodeType===9?u.body:u.nodeName==="HTML"?u.ownerDocument.body:u,l.appendChild(n),u=u._reactRootContainer,u!=null||l.onclick!==null||(l.onclick=nn));else if(m!==4&&(m===27&&Qi(n.type)&&(u=n.stateNode,l=null),n=n.child,n!==null))for(_m(n,l,u),n=n.sibling;n!==null;)_m(n,l,u),n=n.sibling}function bu(n,l,u){var m=n.tag;if(m===5||m===6)n=n.stateNode,l?u.insertBefore(n,l):u.appendChild(n);else if(m!==4&&(m===27&&Qi(n.type)&&(u=n.stateNode),n=n.child,n!==null))for(bu(n,l,u),n=n.sibling;n!==null;)bu(n,l,u),n=n.sibling}function ky(n){var l=n.stateNode,u=n.memoizedProps;try{for(var m=n.type,_=l.attributes;_.length;)l.removeAttributeNode(_[0]);Ar(l,m,u),l[Y]=n,l[te]=u}catch(w){wa(n,n.return,w)}}var ii=!1,lr=!1,wm=!1,Ny=typeof WeakSet=="function"?WeakSet:Set,br=null;function P4(n,l){if(n=n.containerInfo,$m=Bu,n=El(n),As(n)){if("selectionStart"in n)var u={start:n.selectionStart,end:n.selectionEnd};else e:{u=(u=n.ownerDocument)&&u.defaultView||window;var m=u.getSelection&&u.getSelection();if(m&&m.rangeCount!==0){u=m.anchorNode;var _=m.anchorOffset,w=m.focusNode;m=m.focusOffset;try{u.nodeType,w.nodeType}catch(It){u=null;break e}var R=0,X=-1,be=-1,Me=0,Ze=0,Ke=n,Re=null;t:for(;;){for(var $e;Ke!==u||_!==0&&Ke.nodeType!==3||(X=R+_),Ke!==w||m!==0&&Ke.nodeType!==3||(be=R+m),Ke.nodeType===3&&(R+=Ke.nodeValue.length),($e=Ke.firstChild)!==null;)Re=Ke,Ke=$e;for(;;){if(Ke===n)break t;if(Re===u&&++Me===_&&(X=R),Re===w&&++Ze===m&&(be=R),($e=Ke.nextSibling)!==null)break;Ke=Re,Re=Ke.parentNode}Ke=$e}u=X===-1||be===-1?null:{start:X,end:be}}else u=null}u=u||{start:0,end:0}}else u=null;for(Wm={focusedElem:n,selectionRange:u},Bu=!1,br=l;br!==null;)if(l=br,n=l.child,(l.subtreeFlags&1028)!==0&&n!==null)n.return=l,br=n;else for(;br!==null;){switch(l=br,w=l.alternate,n=l.flags,l.tag){case 0:if((n&4)!==0&&(n=l.updateQueue,n=n!==null?n.events:null,n!==null))for(u=0;u title"))),Ar(w,m,u),w[Y]=n,St(w),m=w;break e;case"link":var R=Ab("link","href",_).get(m+(u.href||""));if(R){for(var X=0;XAa&&(R=Aa,Aa=It,It=R);var Te=Tl(X,It),_e=Tl(X,Aa);if(Te&&_e&&($e.rangeCount!==1||$e.anchorNode!==Te.node||$e.anchorOffset!==Te.offset||$e.focusNode!==_e.node||$e.focusOffset!==_e.offset)){var Oe=Ke.createRange();Oe.setStart(Te.node,Te.offset),$e.removeAllRanges(),It>Aa?($e.addRange(Oe),$e.extend(_e.node,_e.offset)):(Oe.setEnd(_e.node,_e.offset),$e.addRange(Oe))}}}}for(Ke=[],$e=X;$e=$e.parentNode;)$e.nodeType===1&&Ke.push({element:$e,left:$e.scrollLeft,top:$e.scrollTop});for(typeof X.focus=="function"&&X.focus(),X=0;Xu?32:u,ee.T=null,u=Cm,Cm=null;var w=Xi,R=ui;if(hr=0,Yo=Xi=null,ui=0,(ga&6)!==0)throw Error(s(331));var X=ga;if(ga|=4,Py(w.current),My(w,w.current,R,u),ga=X,Sd(0,!1),ct&&typeof ct.onPostCommitFiberRoot=="function")try{ct.onPostCommitFiberRoot(De,w)}catch(be){}return!0}finally{q.p=_,ee.T=m,Qy(n,l)}}function tb(n,l,u){l=h(u,l),l=om(n.stateNode,l,2),n=$i(n,l,2),n!==null&&(Gr(n,2),zs(n))}function wa(n,l,u){if(n.tag===3)tb(n,n,u);else for(;l!==null;){if(l.tag===3){tb(l,n,u);break}else if(l.tag===1){var m=l.stateNode;if(typeof l.type.getDerivedStateFromError=="function"||typeof m.componentDidCatch=="function"&&(Yi===null||!Yi.has(m))){n=h(u,n),u=ay(2),m=$i(l,u,2),m!==null&&(ry(u,m,l,n),Gr(m,2),zs(m));break}}l=l.return}}function Lm(n,l,u){var m=n.pingCache;if(m===null){m=n.pingCache=new I4;var _=new Set;m.set(l,_)}else _=m.get(l),_===void 0&&(_=new Set,m.set(l,_));_.has(u)||(jm=!0,_.add(u),n=$4.bind(null,n,l,u),l.then(n,n))}function $4(n,l,u){var m=n.pingCache;m!==null&&m.delete(l),n.pingedLanes|=n.suspendedLanes&u,n.warmLanes&=~u,Pa===n&&(ra&u)===u&&(Ya===4||Ya===3&&(ra&62914560)===ra&&300>Ue()-wu?(ga&2)===0&&Xo(n,0):Sm|=u,qo===ra&&(qo=0)),zs(n)}function ab(n,l){l===0&&(l=tn()),n=Zn(n,l),n!==null&&(Gr(n,l),zs(n))}function W4(n){var l=n.memoizedState,u=0;l!==null&&(u=l.retryLane),ab(n,u)}function V4(n,l){var u=0;switch(n.tag){case 31:case 13:var m=n.stateNode,_=n.memoizedState;_!==null&&(u=_.retryLane);break;case 19:m=n.stateNode;break;case 22:m=n.stateNode._retryCache;break;default:throw Error(s(314))}m!==null&&m.delete(l),ab(n,u)}function G4(n,l){return Ie(n,l)}var Cu=null,Ko=null,Dm=!1,Au=!1,Pm=!1,Ki=0;function zs(n){n!==Ko&&n.next===null&&(Ko===null?Cu=Ko=n:Ko=Ko.next=n),Au=!0,Dm||(Dm=!0,q4())}function Sd(n,l){if(!Pm&&Au){Pm=!0;do for(var u=!1,m=Cu;m!==null;){if(n!==0){var _=m.pendingLanes;if(_===0)var w=0;else{var R=m.suspendedLanes,X=m.pingedLanes;w=(1<<31-Nt(42|n)+1)-1,w&=_&~(R&~X),w=w&201326741?w&201326741|1:w?w|2:0}w!==0&&(u=!0,ib(m,w))}else w=ra,w=la(m,m===Pa?w:0,m.cancelPendingCommit!==null||m.timeoutHandle!==-1),(w&3)===0||va(m,w)||(u=!0,ib(m,w));m=m.next}while(u);Pm=!1}}function Z4(){rb()}function rb(){Au=Dm=!1;var n=0;Ki!==0&&nk()&&(n=Ki);for(var l=Ue(),u=null,m=Cu;m!==null;){var _=m.next,w=nb(m,l);w===0?(m.next=null,u===null?Cu=_:u.next=_,_===null&&(Ko=u)):(u=m,(n!==0||(w&3)!==0)&&(Au=!0)),m=_}hr!==0&&hr!==5||Sd(n),Ki!==0&&(Ki=0)}function nb(n,l){for(var u=n.suspendedLanes,m=n.pingedLanes,_=n.expirationTimes,w=n.pendingLanes&-62914561;0X)break;var Ze=be.transferSize,Ke=be.initiatorType;Ze&&mb(Ke)&&(be=be.responseEnd,R+=Ze*(be title"):null)}function _k(n,l,u){if(u===1||l.itemProp!=null)return!1;switch(n){case"meta":case"title":return!0;case"style":if(typeof l.precedence!="string"||typeof l.href!="string"||l.href==="")break;return!0;case"link":if(typeof l.rel!="string"||typeof l.href!="string"||l.href===""||l.onLoad||l.onError)break;switch(l.rel){case"stylesheet":return n=l.disabled,typeof l.precedence=="string"&&n==null;default:return!0}case"script":if(l.async&&typeof l.async!="function"&&typeof l.async!="symbol"&&!l.onLoad&&!l.onError&&l.src&&typeof l.src=="string")return!0}return!1}function Mb(n){return!(n.type==="stylesheet"&&(n.state.loading&3)===0)}function wk(n,l,u,m){if(u.type==="stylesheet"&&(typeof m.media!="string"||matchMedia(m.media).matches!==!1)&&(u.state.loading&4)===0){if(u.instance===null){var _=ec(m.href),w=l.querySelector(Ad(_));if(w){l=w._p,l!==null&&typeof l=="object"&&typeof l.then=="function"&&(n.count++,n=Fu.bind(n),l.then(n,n)),u.state.loading|=4,u.instance=w,St(w);return}w=l.ownerDocument||l,m=Eb(m),(_=Jn.get(_))&&Jm(m,_),w=w.createElement("link"),St(w);var R=w;R._p=new Promise(function(X,be){R.onload=X,R.onerror=be}),Ar(w,"link",m),u.instance=w}n.stylesheets===null&&(n.stylesheets=new Map),n.stylesheets.set(u,l),(l=u.state.preload)&&(u.state.loading&3)===0&&(n.count++,u=Fu.bind(n),l.addEventListener("load",u),l.addEventListener("error",u))}}var Qm=0;function kk(n,l){return n.stylesheets&&n.count===0&&zu(n,n.stylesheets),0Qm?50:800)+l);return n.unsuspend=u,function(){n.unsuspend=null,clearTimeout(m),clearTimeout(_)}}:null}function Fu(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)zu(this,this.stylesheets);else if(this.unsuspend){var n=this.unsuspend;this.unsuspend=null,n()}}}var Iu=null;function zu(n,l){n.stylesheets=null,n.unsuspend!==null&&(n.count++,Iu=new Map,l.forEach(Nk,n),Iu=null,Fu.call(n))}function Nk(n,l){if(!(l.state.loading&4)){var u=Iu.get(n);if(u)var m=u.get(null);else{u=new Map,Iu.set(n,u);for(var _=n.querySelectorAll("link[data-precedence],style[data-precedence]"),w=0;w<_.length;w++){var R=_[w];(R.nodeName==="LINK"||R.getAttribute("media")!=="not all")&&(u.set(R.dataset.precedence,R),m=R)}m&&u.set(null,m)}_=l.instance,R=_.getAttribute("data-precedence"),w=u.get(R)||m,w===m&&u.set(null,_),u.set(R,_),this.count++,m=Fu.bind(this),_.addEventListener("load",m),_.addEventListener("error",m),w?w.parentNode.insertBefore(_,w.nextSibling):(n=n.nodeType===9?n.head:n,n.insertBefore(_,n.firstChild)),l.state.loading|=4}}var Md={$$typeof:O,Provider:null,Consumer:null,_currentValue:Q,_currentValue2:Q,_threadCount:0};function jk(n,l,u,m,_,w,R,X,be){this.tag=1,this.containerInfo=n,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=Bn(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Bn(0),this.hiddenUpdates=Bn(null),this.identifierPrefix=m,this.onUncaughtError=_,this.onCaughtError=w,this.onRecoverableError=R,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=be,this.incompleteTransitions=new Map}function Lb(n,l,u,m,_,w,R,X,be,Me,Ze,Ke){return n=new jk(n,l,u,R,be,Me,Ze,Ke,X),l=1,w===!0&&(l|=24),w=Br(3,null,null,l),n.current=w,w.stateNode=n,l=Mh(),l.refCount++,n.pooledCache=l,l.refCount++,w.memoizedState={element:m,isDehydrated:u,cache:l},Rh(w),n}function Db(n){return n?(n=Ks,n):Ks}function Pb(n,l,u,m,_,w){_=Db(_),m.context===null?m.context=_:m.pendingContext=_,m=Hi(l),m.payload={element:u},w=w===void 0?null:w,w!==null&&(m.callback=w),u=$i(n,m,l),u!==null&&(mn(u,n,l),dd(u,n,l))}function Rb(n,l){if(n=n.memoizedState,n!==null&&n.dehydrated!==null){var u=n.retryLane;n.retryLane=u!==0&&utypeof e=="string",Id=()=>{let e,t;const r=new Promise((s,i)=>{e=s,t=i});return r.resolve=e,r.reject=t,r},s1=e=>e==null?"":""+e,Zk=(e,t,r)=>{e.forEach(s=>{t[s]&&(r[s]=t[s])})},qk=/###/g,i1=e=>e&&e.indexOf("###")>-1?e.replace(qk,"."):e,l1=e=>!e||Wt(e),Vd=(e,t,r)=>{const s=Wt(t)?t.split("."):t;let i=0;for(;i{const{obj:s,k:i}=Vd(e,t,Object);if(s!==void 0||t.length===1){s[i]=r;return}let d=t[t.length-1],c=t.slice(0,t.length-1),f=Vd(e,c,Object);for(;f.obj===void 0&&c.length;)d=`${c[c.length-1]}.${d}`,c=c.slice(0,c.length-1),f=Vd(e,c,Object),f!=null&&f.obj&&typeof f.obj[`${f.k}.${d}`]!="undefined"&&(f.obj=void 0);f.obj[`${f.k}.${d}`]=r},Yk=(e,t,r,s)=>{const{obj:i,k:d}=Vd(e,t,Object);i[d]=i[d]||[],i[d].push(r)},xf=(e,t)=>{const{obj:r,k:s}=Vd(e,t);if(r&&Object.prototype.hasOwnProperty.call(r,s))return r[s]},Xk=(e,t,r)=>{const s=xf(e,r);return s!==void 0?s:xf(t,r)},r_=(e,t,r)=>{for(const s in t)s!=="__proto__"&&s!=="constructor"&&(s in e?Wt(e[s])||e[s]instanceof String||Wt(t[s])||t[s]instanceof String?r&&(e[s]=t[s]):r_(e[s],t[s],r):e[s]=t[s]);return e},nc=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var Jk={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const Kk=e=>Wt(e)?e.replace(/[&<>"'\/]/g,t=>Jk[t]):e;class Qk{constructor(t){this.capacity=t,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(t){const r=this.regExpMap.get(t);if(r!==void 0)return r;const s=new RegExp(t);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(t,s),this.regExpQueue.push(t),s}}const e3=[" ",",","?","!",";"],t3=new Qk(20),a3=(e,t,r)=>{t=t||"",r=r||"";const s=e3.filter(c=>t.indexOf(c)<0&&r.indexOf(c)<0);if(s.length===0)return!0;const i=t3.getRegExp(`(${s.map(c=>c==="?"?"\\?":c).join("|")})`);let d=!i.test(e);if(!d){const c=e.indexOf(r);c>0&&!i.test(e.substring(0,c))&&(d=!0)}return d},zg=(e,t,r=".")=>{if(!e)return;if(e[t])return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;const s=t.split(r);let i=e;for(let d=0;d-1&&pe==null?void 0:e.replace("_","-"),r3={type:"logger",log(e){this.output("log",e)},warn(e){this.output("warn",e)},error(e){this.output("error",e)},output(e,t){var r,s;(s=(r=console==null?void 0:console[e])==null?void 0:r.apply)==null||s.call(r,console,t)}};class yf{constructor(t,r={}){this.init(t,r)}init(t,r={}){this.prefix=r.prefix||"i18next:",this.logger=t||r3,this.options=r,this.debug=r.debug}log(...t){return this.forward(t,"log","",!0)}warn(...t){return this.forward(t,"warn","",!0)}error(...t){return this.forward(t,"error","")}deprecate(...t){return this.forward(t,"warn","WARNING DEPRECATED: ",!0)}forward(t,r,s,i){return i&&!this.debug?null:(Wt(t[0])&&(t[0]=`${s}${this.prefix} ${t[0]}`),this.logger[r](t))}create(t){return new yf(this.logger,ne({prefix:`${this.prefix}:${t}:`},this.options))}clone(t){return t=t||this.options,t.prefix=t.prefix||this.prefix,new yf(this.logger,t)}}var $s=new yf;class $f{constructor(){this.observers={}}on(t,r){return t.split(" ").forEach(s=>{this.observers[s]||(this.observers[s]=new Map);const i=this.observers[s].get(r)||0;this.observers[s].set(r,i+1)}),this}off(t,r){if(this.observers[t]){if(!r){delete this.observers[t];return}this.observers[t].delete(r)}}emit(t,...r){this.observers[t]&&Array.from(this.observers[t].entries()).forEach(([i,d])=>{for(let c=0;c{for(let c=0;c-1&&this.options.ns.splice(r,1)}getResource(t,r,s,i={}){var g,x;const d=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,c=i.ignoreJSONStructure!==void 0?i.ignoreJSONStructure:this.options.ignoreJSONStructure;let f;t.indexOf(".")>-1?f=t.split("."):(f=[t,r],s&&(Array.isArray(s)?f.push(...s):Wt(s)&&d?f.push(...s.split(d)):f.push(s)));const p=xf(this.data,f);return!p&&!r&&!s&&t.indexOf(".")>-1&&(t=f[0],r=f[1],s=f.slice(2).join(".")),p||!c||!Wt(s)?p:zg((x=(g=this.data)==null?void 0:g[t])==null?void 0:x[r],s,d)}addResource(t,r,s,i,d={silent:!1}){const c=d.keySeparator!==void 0?d.keySeparator:this.options.keySeparator;let f=[t,r];s&&(f=f.concat(c?s.split(c):s)),t.indexOf(".")>-1&&(f=t.split("."),i=r,r=f[1]),this.addNamespaces(r),o1(this.data,f,i),d.silent||this.emit("added",t,r,s,i)}addResources(t,r,s,i={silent:!1}){for(const d in s)(Wt(s[d])||Array.isArray(s[d]))&&this.addResource(t,r,d,s[d],{silent:!0});i.silent||this.emit("added",t,r,s)}addResourceBundle(t,r,s,i,d,c={silent:!1,skipCopy:!1}){let f=[t,r];t.indexOf(".")>-1&&(f=t.split("."),i=s,s=r,r=f[1]),this.addNamespaces(r);let p=xf(this.data,f)||{};c.skipCopy||(s=JSON.parse(JSON.stringify(s))),i?r_(p,s,d):p=ne(ne({},p),s),o1(this.data,f,p),c.silent||this.emit("added",t,r,s)}removeResourceBundle(t,r){this.hasResourceBundle(t,r)&&delete this.data[t][r],this.removeNamespaces(r),this.emit("removed",t,r)}hasResourceBundle(t,r){return this.getResource(t,r)!==void 0}getResourceBundle(t,r){return r||(r=this.options.defaultNS),this.getResource(t,r)}getDataByLanguage(t){return this.data[t]}hasLanguageSomeTranslations(t){const r=this.getDataByLanguage(t);return!!(r&&Object.keys(r)||[]).find(i=>r[i]&&Object.keys(r[i]).length>0)}toJSON(){return this.data}}var n_={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,r,s,i){return e.forEach(d=>{var c,f;t=(f=(c=this.processors[d])==null?void 0:c.process(t,r,s,i))!=null?f:t}),t}};const s_=Symbol("i18next/PATH_KEY");function n3(){const e=[],t=Object.create(null);let r;return t.get=(s,i)=>{var d;return(d=r==null?void 0:r.revoke)==null||d.call(r),i===s_?e:(e.push(i),r=Proxy.revocable(s,t),r.proxy)},Proxy.revocable(Object.create(null),t).proxy}function Bg(e,t){var s;const{[s_]:r}=e(n3());return r.join((s=t==null?void 0:t.keySeparator)!=null?s:".")}const d1={},gg=e=>!Wt(e)&&typeof e!="boolean"&&typeof e!="number";class bf extends $f{constructor(t,r={}){super(),Zk(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],t,this),this.options=r,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=$s.create("translator")}changeLanguage(t){t&&(this.language=t)}exists(t,r={interpolation:{}}){const s=ne({},r);if(t==null)return!1;const i=this.resolve(t,s);if((i==null?void 0:i.res)===void 0)return!1;const d=gg(i.res);return!(s.returnObjects===!1&&d)}extractFromKey(t,r){let s=r.nsSeparator!==void 0?r.nsSeparator:this.options.nsSeparator;s===void 0&&(s=":");const i=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator;let d=r.ns||this.options.defaultNS||[];const c=s&&t.indexOf(s)>-1,f=!this.options.userDefinedKeySeparator&&!r.keySeparator&&!this.options.userDefinedNsSeparator&&!r.nsSeparator&&!a3(t,s,i);if(c&&!f){const p=t.match(this.interpolator.nestingRegexp);if(p&&p.length>0)return{key:t,namespaces:Wt(d)?[d]:d};const g=t.split(s);(s!==i||s===i&&this.options.ns.indexOf(g[0])>-1)&&(d=g.shift()),t=g.join(i)}return{key:t,namespaces:Wt(d)?[d]:d}}translate(t,r,s){let i=typeof r=="object"?ne({},r):r;if(typeof i!="object"&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),typeof i=="object"&&(i=ne({},i)),i||(i={}),t==null)return"";typeof t=="function"&&(t=Bg(t,ne(ne({},this.options),i))),Array.isArray(t)||(t=[String(t)]);const d=i.returnDetails!==void 0?i.returnDetails:this.options.returnDetails,c=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,{key:f,namespaces:p}=this.extractFromKey(t[t.length-1],i),g=p[p.length-1];let x=i.nsSeparator!==void 0?i.nsSeparator:this.options.nsSeparator;x===void 0&&(x=":");const y=i.lng||this.language,v=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if((y==null?void 0:y.toLowerCase())==="cimode")return v?d?{res:`${g}${x}${f}`,usedKey:f,exactUsedKey:f,usedLng:y,usedNS:g,usedParams:this.getUsedParamsDetails(i)}:`${g}${x}${f}`:d?{res:f,usedKey:f,exactUsedKey:f,usedLng:y,usedNS:g,usedParams:this.getUsedParamsDetails(i)}:f;const k=this.resolve(t,i);let T=k==null?void 0:k.res;const N=(k==null?void 0:k.usedKey)||f,S=(k==null?void 0:k.exactUsedKey)||f,A=["[object Number]","[object Function]","[object RegExp]"],C=i.joinArrays!==void 0?i.joinArrays:this.options.joinArrays,O=!this.i18nFormat||this.i18nFormat.handleAsObject,P=i.count!==void 0&&!Wt(i.count),B=bf.hasDefaultValue(i),V=P?this.pluralResolver.getSuffix(y,i.count,i):"",z=i.ordinal&&P?this.pluralResolver.getSuffix(y,i.count,{ordinal:!1}):"",U=P&&!i.ordinal&&i.count===0,J=U&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${V}`]||i[`defaultValue${z}`]||i.defaultValue;let de=T;O&&!T&&B&&(de=J);const ye=gg(de),ie=Object.prototype.toString.apply(de);if(O&&de&&ye&&A.indexOf(ie)<0&&!(Wt(C)&&Array.isArray(de))){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const he=this.options.returnedObjectHandler?this.options.returnedObjectHandler(N,de,Se(ne({},i),{ns:p})):`key '${f} (${this.language})' returned an object instead of string.`;return d?(k.res=he,k.usedParams=this.getUsedParamsDetails(i),k):he}if(c){const he=Array.isArray(de),ve=he?[]:{},me=he?S:N;for(const ee in de)if(Object.prototype.hasOwnProperty.call(de,ee)){const q=`${me}${c}${ee}`;B&&!T?ve[ee]=this.translate(q,Se(ne({},i),{defaultValue:gg(J)?J[ee]:void 0,joinArrays:!1,ns:p})):ve[ee]=this.translate(q,Se(ne({},i),{joinArrays:!1,ns:p})),ve[ee]===q&&(ve[ee]=de[ee])}T=ve}}else if(O&&Wt(C)&&Array.isArray(T))T=T.join(C),T&&(T=this.extendTranslation(T,t,i,s));else{let he=!1,ve=!1;!this.isValidLookup(T)&&B&&(he=!0,T=J),this.isValidLookup(T)||(ve=!0,T=f);const ee=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&ve?void 0:T,q=B&&J!==T&&this.options.updateMissing;if(ve||he||q){if(this.logger.log(q?"updateKey":"missingKey",y,g,f,q?J:T),c){const F=this.resolve(f,Se(ne({},i),{keySeparator:!1}));F&&F.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let Q=[];const fe=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo==="fallback"&&fe&&fe[0])for(let F=0;F{var K;const Z=B&&H!==T?H:ee;this.options.missingKeyHandler?this.options.missingKeyHandler(F,g,D,Z,q,i):(K=this.backendConnector)!=null&&K.saveMissing&&this.backendConnector.saveMissing(F,g,D,Z,q,i),this.emit("missingKey",F,g,D,T)};this.options.saveMissing&&(this.options.saveMissingPlurals&&P?Q.forEach(F=>{const D=this.pluralResolver.getSuffixes(F,i);U&&i[`defaultValue${this.options.pluralSeparator}zero`]&&D.indexOf(`${this.options.pluralSeparator}zero`)<0&&D.push(`${this.options.pluralSeparator}zero`),D.forEach(H=>{ae([F],f+H,i[`defaultValue${H}`]||J)})}):ae(Q,f,J))}T=this.extendTranslation(T,t,i,k,s),ve&&T===f&&this.options.appendNamespaceToMissingKey&&(T=`${g}${x}${f}`),(ve||he)&&this.options.parseMissingKeyHandler&&(T=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${g}${x}${f}`:f,he?T:void 0,i))}return d?(k.res=T,k.usedParams=this.getUsedParamsDetails(i),k):T}extendTranslation(t,r,s,i,d){var p,g;if((p=this.i18nFormat)!=null&&p.parse)t=this.i18nFormat.parse(t,ne(ne({},this.options.interpolation.defaultVariables),s),s.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!s.skipInterpolation){s.interpolation&&this.interpolator.init(Se(ne({},s),{interpolation:ne(ne({},this.options.interpolation),s.interpolation)}));const x=Wt(t)&&(((g=s==null?void 0:s.interpolation)==null?void 0:g.skipOnVariables)!==void 0?s.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let y;if(x){const k=t.match(this.interpolator.nestingRegexp);y=k&&k.length}let v=s.replace&&!Wt(s.replace)?s.replace:s;if(this.options.interpolation.defaultVariables&&(v=ne(ne({},this.options.interpolation.defaultVariables),v)),t=this.interpolator.interpolate(t,v,s.lng||this.language||i.usedLng,s),x){const k=t.match(this.interpolator.nestingRegexp),T=k&&k.length;y(d==null?void 0:d[0])===k[0]&&!s.context?(this.logger.warn(`It seems you are nesting recursively key: ${k[0]} in key: ${r[0]}`),null):this.translate(...k,r),s)),s.interpolation&&this.interpolator.reset()}const c=s.postProcess||this.options.postProcess,f=Wt(c)?[c]:c;return t!=null&&(f!=null&&f.length)&&s.applyPostProcessor!==!1&&(t=n_.handle(f,t,r,this.options&&this.options.postProcessPassResolved?ne({i18nResolved:Se(ne({},i),{usedParams:this.getUsedParamsDetails(s)})},s):s,this)),t}resolve(t,r={}){let s,i,d,c,f;return Wt(t)&&(t=[t]),t.forEach(p=>{if(this.isValidLookup(s))return;const g=this.extractFromKey(p,r),x=g.key;i=x;let y=g.namespaces;this.options.fallbackNS&&(y=y.concat(this.options.fallbackNS));const v=r.count!==void 0&&!Wt(r.count),k=v&&!r.ordinal&&r.count===0,T=r.context!==void 0&&(Wt(r.context)||typeof r.context=="number")&&r.context!=="",N=r.lngs?r.lngs:this.languageUtils.toResolveHierarchy(r.lng||this.language,r.fallbackLng);y.forEach(S=>{var A,C;this.isValidLookup(s)||(f=S,!d1[`${N[0]}-${S}`]&&((A=this.utils)!=null&&A.hasLoadedNamespace)&&!((C=this.utils)!=null&&C.hasLoadedNamespace(f))&&(d1[`${N[0]}-${S}`]=!0,this.logger.warn(`key "${i}" for languages "${N.join(", ")}" won't get resolved as namespace "${f}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),N.forEach(O=>{var V;if(this.isValidLookup(s))return;c=O;const P=[x];if((V=this.i18nFormat)!=null&&V.addLookupKeys)this.i18nFormat.addLookupKeys(P,x,O,S,r);else{let z;v&&(z=this.pluralResolver.getSuffix(O,r.count,r));const U=`${this.options.pluralSeparator}zero`,J=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(v&&(r.ordinal&&z.indexOf(J)===0&&P.push(x+z.replace(J,this.options.pluralSeparator)),P.push(x+z),k&&P.push(x+U)),T){const de=`${x}${this.options.contextSeparator||"_"}${r.context}`;P.push(de),v&&(r.ordinal&&z.indexOf(J)===0&&P.push(de+z.replace(J,this.options.pluralSeparator)),P.push(de+z),k&&P.push(de+U))}}let B;for(;B=P.pop();)this.isValidLookup(s)||(d=B,s=this.getResource(O,S,B,r))}))})}),{res:s,usedKey:i,exactUsedKey:d,usedLng:c,usedNS:f}}isValidLookup(t){return t!==void 0&&!(!this.options.returnNull&&t===null)&&!(!this.options.returnEmptyString&&t==="")}getResource(t,r,s,i={}){var d;return(d=this.i18nFormat)!=null&&d.getResource?this.i18nFormat.getResource(t,r,s,i):this.resourceStore.getResource(t,r,s,i)}getUsedParamsDetails(t={}){const r=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],s=t.replace&&!Wt(t.replace);let i=s?t.replace:t;if(s&&typeof t.count!="undefined"&&(i.count=t.count),this.options.interpolation.defaultVariables&&(i=ne(ne({},this.options.interpolation.defaultVariables),i)),!s){i=ne({},i);for(const d of r)delete i[d]}return i}static hasDefaultValue(t){const r="defaultValue";for(const s in t)if(Object.prototype.hasOwnProperty.call(t,s)&&r===s.substring(0,r.length)&&t[s]!==void 0)return!0;return!1}}class u1{constructor(t){this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=$s.create("languageUtils")}getScriptPartFromCode(t){if(t=t0(t),!t||t.indexOf("-")<0)return null;const r=t.split("-");return r.length===2||(r.pop(),r[r.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(r.join("-"))}getLanguagePartFromCode(t){if(t=t0(t),!t||t.indexOf("-")<0)return t;const r=t.split("-");return this.formatLanguageCode(r[0])}formatLanguageCode(t){if(Wt(t)&&t.indexOf("-")>-1){let r;try{r=Intl.getCanonicalLocales(t)[0]}catch(s){}return r&&this.options.lowerCaseLng&&(r=r.toLowerCase()),r||(this.options.lowerCaseLng?t.toLowerCase():t)}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}isSupportedCode(t){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}getBestMatchFromCodes(t){if(!t)return null;let r;return t.forEach(s=>{if(r)return;const i=this.formatLanguageCode(s);(!this.options.supportedLngs||this.isSupportedCode(i))&&(r=i)}),!r&&this.options.supportedLngs&&t.forEach(s=>{if(r)return;const i=this.getScriptPartFromCode(s);if(this.isSupportedCode(i))return r=i;const d=this.getLanguagePartFromCode(s);if(this.isSupportedCode(d))return r=d;r=this.options.supportedLngs.find(c=>{if(c===d)return c;if(!(c.indexOf("-")<0&&d.indexOf("-")<0)&&(c.indexOf("-")>0&&d.indexOf("-")<0&&c.substring(0,c.indexOf("-"))===d||c.indexOf(d)===0&&d.length>1))return c})}),r||(r=this.getFallbackCodes(this.options.fallbackLng)[0]),r}getFallbackCodes(t,r){if(!t)return[];if(typeof t=="function"&&(t=t(r)),Wt(t)&&(t=[t]),Array.isArray(t))return t;if(!r)return t.default||[];let s=t[r];return s||(s=t[this.getScriptPartFromCode(r)]),s||(s=t[this.formatLanguageCode(r)]),s||(s=t[this.getLanguagePartFromCode(r)]),s||(s=t.default),s||[]}toResolveHierarchy(t,r){const s=this.getFallbackCodes((r===!1?[]:r)||this.options.fallbackLng||[],t),i=[],d=c=>{c&&(this.isSupportedCode(c)?i.push(c):this.logger.warn(`rejecting language code not found in supportedLngs: ${c}`))};return Wt(t)&&(t.indexOf("-")>-1||t.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&d(this.formatLanguageCode(t)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&d(this.getScriptPartFromCode(t)),this.options.load!=="currentOnly"&&d(this.getLanguagePartFromCode(t))):Wt(t)&&d(this.formatLanguageCode(t)),s.forEach(c=>{i.indexOf(c)<0&&d(this.formatLanguageCode(c))}),i}}const f1={zero:0,one:1,two:2,few:3,many:4,other:5},h1={select:e=>e===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class s3{constructor(t,r={}){this.languageUtils=t,this.options=r,this.logger=$s.create("pluralResolver"),this.pluralRulesCache={}}addRule(t,r){this.rules[t]=r}clearCache(){this.pluralRulesCache={}}getRule(t,r={}){const s=t0(t==="dev"?"en":t),i=r.ordinal?"ordinal":"cardinal",d=JSON.stringify({cleanedCode:s,type:i});if(d in this.pluralRulesCache)return this.pluralRulesCache[d];let c;try{c=new Intl.PluralRules(s,{type:i})}catch(f){if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),h1;if(!t.match(/-|_/))return h1;const p=this.languageUtils.getLanguagePartFromCode(t);c=this.getRule(p,r)}return this.pluralRulesCache[d]=c,c}needsPlural(t,r={}){let s=this.getRule(t,r);return s||(s=this.getRule("dev",r)),(s==null?void 0:s.resolvedOptions().pluralCategories.length)>1}getPluralFormsOfKey(t,r,s={}){return this.getSuffixes(t,s).map(i=>`${r}${i}`)}getSuffixes(t,r={}){let s=this.getRule(t,r);return s||(s=this.getRule("dev",r)),s?s.resolvedOptions().pluralCategories.sort((i,d)=>f1[i]-f1[d]).map(i=>`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${i}`):[]}getSuffix(t,r,s={}){const i=this.getRule(t,s);return i?`${this.options.prepend}${s.ordinal?`ordinal${this.options.prepend}`:""}${i.select(r)}`:(this.logger.warn(`no plural rule found for: ${t}`),this.getSuffix("dev",r,s))}}const m1=(e,t,r,s=".",i=!0)=>{let d=Xk(e,t,r);return!d&&i&&Wt(r)&&(d=zg(e,r,s),d===void 0&&(d=zg(t,r,s))),d},pg=e=>e.replace(/\$/g,"$$$$");class g1{constructor(t={}){var r;this.logger=$s.create("interpolator"),this.options=t,this.format=((r=t==null?void 0:t.interpolation)==null?void 0:r.format)||(s=>s),this.init(t)}init(t={}){t.interpolation||(t.interpolation={escapeValue:!0});const{escape:r,escapeValue:s,useRawValueToEscape:i,prefix:d,prefixEscaped:c,suffix:f,suffixEscaped:p,formatSeparator:g,unescapeSuffix:x,unescapePrefix:y,nestingPrefix:v,nestingPrefixEscaped:k,nestingSuffix:T,nestingSuffixEscaped:N,nestingOptionsSeparator:S,maxReplaces:A,alwaysFormat:C}=t.interpolation;this.escape=r!==void 0?r:Kk,this.escapeValue=s!==void 0?s:!0,this.useRawValueToEscape=i!==void 0?i:!1,this.prefix=d?nc(d):c||"{{",this.suffix=f?nc(f):p||"}}",this.formatSeparator=g||",",this.unescapePrefix=x?"":y||"-",this.unescapeSuffix=this.unescapePrefix?"":x||"",this.nestingPrefix=v?nc(v):k||nc("$t("),this.nestingSuffix=T?nc(T):N||nc(")"),this.nestingOptionsSeparator=S||",",this.maxReplaces=A||1e3,this.alwaysFormat=C!==void 0?C:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const t=(r,s)=>(r==null?void 0:r.source)===s?(r.lastIndex=0,r):new RegExp(s,"g");this.regexp=t(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=t(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=t(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(t,r,s,i){var k;let d,c,f;const p=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},g=T=>{if(T.indexOf(this.formatSeparator)<0){const C=m1(r,p,T,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(C,void 0,s,Se(ne(ne({},i),r),{interpolationkey:T})):C}const N=T.split(this.formatSeparator),S=N.shift().trim(),A=N.join(this.formatSeparator).trim();return this.format(m1(r,p,S,this.options.keySeparator,this.options.ignoreJSONStructure),A,s,Se(ne(ne({},i),r),{interpolationkey:S}))};this.resetRegExp();const x=(i==null?void 0:i.missingInterpolationHandler)||this.options.missingInterpolationHandler,y=((k=i==null?void 0:i.interpolation)==null?void 0:k.skipOnVariables)!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:T=>pg(T)},{regex:this.regexp,safeValue:T=>this.escapeValue?pg(this.escape(T)):pg(T)}].forEach(T=>{for(f=0;d=T.regex.exec(t);){const N=d[1].trim();if(c=g(N),c===void 0)if(typeof x=="function"){const A=x(t,d,i);c=Wt(A)?A:""}else if(i&&Object.prototype.hasOwnProperty.call(i,N))c="";else if(y){c=d[0];continue}else this.logger.warn(`missed to pass in variable ${N} for interpolating ${t}`),c="";else!Wt(c)&&!this.useRawValueToEscape&&(c=s1(c));const S=T.safeValue(c);if(t=t.replace(d[0],S),y?(T.regex.lastIndex+=c.length,T.regex.lastIndex-=d[0].length):T.regex.lastIndex=0,f++,f>=this.maxReplaces)break}}),t}nest(t,r,s={}){let i,d,c;const f=(p,g)=>{var N;const x=this.nestingOptionsSeparator;if(p.indexOf(x)<0)return p;const y=p.split(new RegExp(`${x}[ ]*{`));let v=`{${y[1]}`;p=y[0],v=this.interpolate(v,c);const k=v.match(/'/g),T=v.match(/"/g);(((N=k==null?void 0:k.length)!=null?N:0)%2===0&&!T||T.length%2!==0)&&(v=v.replace(/'/g,'"'));try{c=JSON.parse(v),g&&(c=ne(ne({},g),c))}catch(S){return this.logger.warn(`failed parsing options string in nesting for key ${p}`,S),`${p}${x}${v}`}return c.defaultValue&&c.defaultValue.indexOf(this.prefix)>-1&&delete c.defaultValue,p};for(;i=this.nestingRegexp.exec(t);){let p=[];c=ne({},s),c=c.replace&&!Wt(c.replace)?c.replace:c,c.applyPostProcessor=!1,delete c.defaultValue;const g=/{.*}/.test(i[1])?i[1].lastIndexOf("}")+1:i[1].indexOf(this.formatSeparator);if(g!==-1&&(p=i[1].slice(g).split(this.formatSeparator).map(x=>x.trim()).filter(Boolean),i[1]=i[1].slice(0,g)),d=r(f.call(this,i[1].trim(),c),c),d&&i[0]===t&&!Wt(d))return d;Wt(d)||(d=s1(d)),d||(this.logger.warn(`missed to resolve ${i[1]} for nesting ${t}`),d=""),p.length&&(d=p.reduce((x,y)=>this.format(x,y,s.lng,Se(ne({},s),{interpolationkey:i[1].trim()})),d.trim())),t=t.replace(i[0],d),this.regexp.lastIndex=0}return t}}const i3=e=>{let t=e.toLowerCase().trim();const r={};if(e.indexOf("(")>-1){const s=e.split("(");t=s[0].toLowerCase().trim();const i=s[1].substring(0,s[1].length-1);t==="currency"&&i.indexOf(":")<0?r.currency||(r.currency=i.trim()):t==="relativetime"&&i.indexOf(":")<0?r.range||(r.range=i.trim()):i.split(";").forEach(c=>{if(c){const[f,...p]=c.split(":"),g=p.join(":").trim().replace(/^'+|'+$/g,""),x=f.trim();r[x]||(r[x]=g),g==="false"&&(r[x]=!1),g==="true"&&(r[x]=!0),isNaN(g)||(r[x]=parseInt(g,10))}})}return{formatName:t,formatOptions:r}},p1=e=>{const t={};return(r,s,i)=>{let d=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(d=Se(ne({},d),{[i.interpolationkey]:void 0}));const c=s+JSON.stringify(d);let f=t[c];return f||(f=e(t0(s),i),t[c]=f),f(r)}},l3=e=>(t,r,s)=>e(t0(r),s)(t);class o3{constructor(t={}){this.logger=$s.create("formatter"),this.options=t,this.init(t)}init(t,r={interpolation:{}}){this.formatSeparator=r.interpolation.formatSeparator||",";const s=r.cacheInBuiltFormats?p1:l3;this.formats={number:s((i,d)=>{const c=new Intl.NumberFormat(i,ne({},d));return f=>c.format(f)}),currency:s((i,d)=>{const c=new Intl.NumberFormat(i,Se(ne({},d),{style:"currency"}));return f=>c.format(f)}),datetime:s((i,d)=>{const c=new Intl.DateTimeFormat(i,ne({},d));return f=>c.format(f)}),relativetime:s((i,d)=>{const c=new Intl.RelativeTimeFormat(i,ne({},d));return f=>c.format(f,d.range||"day")}),list:s((i,d)=>{const c=new Intl.ListFormat(i,ne({},d));return f=>c.format(f)})}}add(t,r){this.formats[t.toLowerCase().trim()]=r}addCached(t,r){this.formats[t.toLowerCase().trim()]=p1(r)}format(t,r,s,i={}){const d=r.split(this.formatSeparator);if(d.length>1&&d[0].indexOf("(")>1&&d[0].indexOf(")")<0&&d.find(f=>f.indexOf(")")>-1)){const f=d.findIndex(p=>p.indexOf(")")>-1);d[0]=[d[0],...d.splice(1,f)].join(this.formatSeparator)}return d.reduce((f,p)=>{var y;const{formatName:g,formatOptions:x}=i3(p);if(this.formats[g]){let v=f;try{const k=((y=i==null?void 0:i.formatParams)==null?void 0:y[i.interpolationkey])||{},T=k.locale||k.lng||i.locale||i.lng||s;v=this.formats[g](f,T,ne(ne(ne({},x),i),k))}catch(k){this.logger.warn(k)}return v}else this.logger.warn(`there was no format function for ${g}`);return f},t)}}const c3=(e,t)=>{e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)};class d3 extends $f{constructor(t,r,s,i={}){var d,c;super(),this.backend=t,this.store=r,this.services=s,this.languageUtils=s.languageUtils,this.options=i,this.logger=$s.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=i.maxParallelReads||10,this.readingCalls=0,this.maxRetries=i.maxRetries>=0?i.maxRetries:5,this.retryTimeout=i.retryTimeout>=1?i.retryTimeout:350,this.state={},this.queue=[],(c=(d=this.backend)==null?void 0:d.init)==null||c.call(d,s,i.backend,i)}queueLoad(t,r,s,i){const d={},c={},f={},p={};return t.forEach(g=>{let x=!0;r.forEach(y=>{const v=`${g}|${y}`;!s.reload&&this.store.hasResourceBundle(g,y)?this.state[v]=2:this.state[v]<0||(this.state[v]===1?c[v]===void 0&&(c[v]=!0):(this.state[v]=1,x=!1,c[v]===void 0&&(c[v]=!0),d[v]===void 0&&(d[v]=!0),p[y]===void 0&&(p[y]=!0)))}),x||(f[g]=!0)}),(Object.keys(d).length||Object.keys(c).length)&&this.queue.push({pending:c,pendingCount:Object.keys(c).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(d),pending:Object.keys(c),toLoadLanguages:Object.keys(f),toLoadNamespaces:Object.keys(p)}}loaded(t,r,s){const i=t.split("|"),d=i[0],c=i[1];r&&this.emit("failedLoading",d,c,r),!r&&s&&this.store.addResourceBundle(d,c,s,void 0,void 0,{skipCopy:!0}),this.state[t]=r?-1:2,r&&s&&(this.state[t]=0);const f={};this.queue.forEach(p=>{Yk(p.loaded,[d],c),c3(p,t),r&&p.errors.push(r),p.pendingCount===0&&!p.done&&(Object.keys(p.loaded).forEach(g=>{f[g]||(f[g]={});const x=p.loaded[g];x.length&&x.forEach(y=>{f[g][y]===void 0&&(f[g][y]=!0)})}),p.done=!0,p.errors.length?p.callback(p.errors):p.callback())}),this.emit("loaded",f),this.queue=this.queue.filter(p=>!p.done)}read(t,r,s,i=0,d=this.retryTimeout,c){if(!t.length)return c(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:t,ns:r,fcName:s,tried:i,wait:d,callback:c});return}this.readingCalls++;const f=(g,x)=>{if(this.readingCalls--,this.waitingReads.length>0){const y=this.waitingReads.shift();this.read(y.lng,y.ns,y.fcName,y.tried,y.wait,y.callback)}if(g&&x&&i{this.read.call(this,t,r,s,i+1,d*2,c)},d);return}c(g,x)},p=this.backend[s].bind(this.backend);if(p.length===2){try{const g=p(t,r);g&&typeof g.then=="function"?g.then(x=>f(null,x)).catch(f):f(null,g)}catch(g){f(g)}return}return p(t,r,f)}prepareLoading(t,r,s={},i){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),i&&i();Wt(t)&&(t=this.languageUtils.toResolveHierarchy(t)),Wt(r)&&(r=[r]);const d=this.queueLoad(t,r,s,i);if(!d.toLoad.length)return d.pending.length||i(),null;d.toLoad.forEach(c=>{this.loadOne(c)})}load(t,r,s){this.prepareLoading(t,r,{},s)}reload(t,r,s){this.prepareLoading(t,r,{reload:!0},s)}loadOne(t,r=""){const s=t.split("|"),i=s[0],d=s[1];this.read(i,d,"read",void 0,void 0,(c,f)=>{c&&this.logger.warn(`${r}loading namespace ${d} for language ${i} failed`,c),!c&&f&&this.logger.log(`${r}loaded namespace ${d} for language ${i}`,f),this.loaded(t,c,f)})}saveMissing(t,r,s,i,d,c={},f=()=>{}){var p,g,x,y,v;if((g=(p=this.services)==null?void 0:p.utils)!=null&&g.hasLoadedNamespace&&!((y=(x=this.services)==null?void 0:x.utils)!=null&&y.hasLoadedNamespace(r))){this.logger.warn(`did not save key "${s}" as the namespace "${r}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(s==null||s==="")){if((v=this.backend)!=null&&v.create){const k=Se(ne({},c),{isUpdate:d}),T=this.backend.create.bind(this.backend);if(T.length<6)try{let N;T.length===5?N=T(t,r,s,i,k):N=T(t,r,s,i),N&&typeof N.then=="function"?N.then(S=>f(null,S)).catch(f):f(null,N)}catch(N){f(N)}else T(t,r,s,i,f,k)}!t||!t[0]||this.store.addResource(t[0],r,s,i)}}}const x1=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let t={};if(typeof e[1]=="object"&&(t=e[1]),Wt(e[1])&&(t.defaultValue=e[1]),Wt(e[2])&&(t.tDescription=e[2]),typeof e[2]=="object"||typeof e[3]=="object"){const r=e[3]||e[2];Object.keys(r).forEach(s=>{t[s]=r[s]})}return t},interpolation:{escapeValue:!0,format:e=>e,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),y1=e=>{var t,r;return Wt(e.ns)&&(e.ns=[e.ns]),Wt(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),Wt(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),((r=(t=e.supportedLngs)==null?void 0:t.indexOf)==null?void 0:r.call(t,"cimode"))<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),typeof e.initImmediate=="boolean"&&(e.initAsync=e.initImmediate),e},qu=()=>{},u3=e=>{Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(r=>{typeof e[r]=="function"&&(e[r]=e[r].bind(e))})};class Gd extends $f{constructor(t={},r){if(super(),this.options=y1(t),this.services={},this.logger=$s,this.modules={external:[]},u3(this),r&&!this.isInitialized&&!t.isClone){if(!this.options.initAsync)return this.init(t,r),this;setTimeout(()=>{this.init(t,r)},0)}}init(t={},r){this.isInitializing=!0,typeof t=="function"&&(r=t,t={}),t.defaultNS==null&&t.ns&&(Wt(t.ns)?t.defaultNS=t.ns:t.ns.indexOf("translation")<0&&(t.defaultNS=t.ns[0]));const s=x1();this.options=ne(ne(ne({},s),this.options),y1(t)),this.options.interpolation=ne(ne({},s.interpolation),this.options.interpolation),t.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=t.keySeparator),t.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=t.nsSeparator),typeof this.options.overloadTranslationOptionHandler!="function"&&(this.options.overloadTranslationOptionHandler=s.overloadTranslationOptionHandler);const i=g=>g?typeof g=="function"?new g:g:null;if(!this.options.isClone){this.modules.logger?$s.init(i(this.modules.logger),this.options):$s.init(null,this.options);let g;this.modules.formatter?g=this.modules.formatter:g=o3;const x=new u1(this.options);this.store=new c1(this.options.resources,this.options);const y=this.services;y.logger=$s,y.resourceStore=this.store,y.languageUtils=x,y.pluralResolver=new s3(x,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==s.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),g&&(!this.options.interpolation.format||this.options.interpolation.format===s.interpolation.format)&&(y.formatter=i(g),y.formatter.init&&y.formatter.init(y,this.options),this.options.interpolation.format=y.formatter.format.bind(y.formatter)),y.interpolator=new g1(this.options),y.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},y.backendConnector=new d3(i(this.modules.backend),y.resourceStore,y,this.options),y.backendConnector.on("*",(k,...T)=>{this.emit(k,...T)}),this.modules.languageDetector&&(y.languageDetector=i(this.modules.languageDetector),y.languageDetector.init&&y.languageDetector.init(y,this.options.detection,this.options)),this.modules.i18nFormat&&(y.i18nFormat=i(this.modules.i18nFormat),y.i18nFormat.init&&y.i18nFormat.init(this)),this.translator=new bf(this.services,this.options),this.translator.on("*",(k,...T)=>{this.emit(k,...T)}),this.modules.external.forEach(k=>{k.init&&k.init(this)})}if(this.format=this.options.interpolation.format,r||(r=qu),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const g=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);g.length>0&&g[0]!=="dev"&&(this.options.lng=g[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(g=>{this[g]=(...x)=>this.store[g](...x)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(g=>{this[g]=(...x)=>(this.store[g](...x),this)});const f=Id(),p=()=>{const g=(x,y)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),f.resolve(y),r(x,y)};if(this.languages&&!this.isInitialized)return g(null,this.t.bind(this));this.changeLanguage(this.options.lng,g)};return this.options.resources||!this.options.initAsync?p():setTimeout(p,0),f}loadResources(t,r=qu){var d,c;let s=r;const i=Wt(t)?t:this.language;if(typeof t=="function"&&(s=t),!this.options.resources||this.options.partialBundledLanguages){if((i==null?void 0:i.toLowerCase())==="cimode"&&(!this.options.preload||this.options.preload.length===0))return s();const f=[],p=g=>{if(!g||g==="cimode")return;this.services.languageUtils.toResolveHierarchy(g).forEach(y=>{y!=="cimode"&&f.indexOf(y)<0&&f.push(y)})};i?p(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(x=>p(x)),(c=(d=this.options.preload)==null?void 0:d.forEach)==null||c.call(d,g=>p(g)),this.services.backendConnector.load(f,this.options.ns,g=>{!g&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),s(g)})}else s(null)}reloadResources(t,r,s){const i=Id();return typeof t=="function"&&(s=t,t=void 0),typeof r=="function"&&(s=r,r=void 0),t||(t=this.languages),r||(r=this.options.ns),s||(s=qu),this.services.backendConnector.reload(t,r,d=>{i.resolve(),s(d)}),i}use(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return t.type==="backend"&&(this.modules.backend=t),(t.type==="logger"||t.log&&t.warn&&t.error)&&(this.modules.logger=t),t.type==="languageDetector"&&(this.modules.languageDetector=t),t.type==="i18nFormat"&&(this.modules.i18nFormat=t),t.type==="postProcessor"&&n_.addPostProcessor(t),t.type==="formatter"&&(this.modules.formatter=t),t.type==="3rdParty"&&this.modules.external.push(t),this}setResolvedLanguage(t){if(!(!t||!this.languages)&&!(["cimode","dev"].indexOf(t)>-1)){for(let r=0;r-1)&&this.store.hasLanguageSomeTranslations(s)){this.resolvedLanguage=s;break}}!this.resolvedLanguage&&this.languages.indexOf(t)<0&&this.store.hasLanguageSomeTranslations(t)&&(this.resolvedLanguage=t,this.languages.unshift(t))}}changeLanguage(t,r){this.isLanguageChangingTo=t;const s=Id();this.emit("languageChanging",t);const i=f=>{this.language=f,this.languages=this.services.languageUtils.toResolveHierarchy(f),this.resolvedLanguage=void 0,this.setResolvedLanguage(f)},d=(f,p)=>{p?this.isLanguageChangingTo===t&&(i(p),this.translator.changeLanguage(p),this.isLanguageChangingTo=void 0,this.emit("languageChanged",p),this.logger.log("languageChanged",p)):this.isLanguageChangingTo=void 0,s.resolve((...g)=>this.t(...g)),r&&r(f,(...g)=>this.t(...g))},c=f=>{var x,y;!t&&!f&&this.services.languageDetector&&(f=[]);const p=Wt(f)?f:f&&f[0],g=this.store.hasLanguageSomeTranslations(p)?p:this.services.languageUtils.getBestMatchFromCodes(Wt(f)?[f]:f);g&&(this.language||i(g),this.translator.language||this.translator.changeLanguage(g),(y=(x=this.services.languageDetector)==null?void 0:x.cacheUserLanguage)==null||y.call(x,g)),this.loadResources(g,v=>{d(v,g)})};return!t&&this.services.languageDetector&&!this.services.languageDetector.async?c(this.services.languageDetector.detect()):!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(c):this.services.languageDetector.detect(c):c(t),s}getFixedT(t,r,s){const i=(d,c,...f)=>{let p;typeof c!="object"?p=this.options.overloadTranslationOptionHandler([d,c].concat(f)):p=ne({},c),p.lng=p.lng||i.lng,p.lngs=p.lngs||i.lngs,p.ns=p.ns||i.ns,p.keyPrefix!==""&&(p.keyPrefix=p.keyPrefix||s||i.keyPrefix);const g=this.options.keySeparator||".";let x;return p.keyPrefix&&Array.isArray(d)?x=d.map(y=>(typeof y=="function"&&(y=Bg(y,ne(ne({},this.options),c))),`${p.keyPrefix}${g}${y}`)):(typeof d=="function"&&(d=Bg(d,ne(ne({},this.options),c))),x=p.keyPrefix?`${p.keyPrefix}${g}${d}`:d),this.t(x,p)};return Wt(t)?i.lng=t:i.lngs=t,i.ns=r,i.keyPrefix=s,i}t(...t){var r;return(r=this.translator)==null?void 0:r.translate(...t)}exists(...t){var r;return(r=this.translator)==null?void 0:r.exists(...t)}setDefaultNamespace(t){this.options.defaultNS=t}hasLoadedNamespace(t,r={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const s=r.lng||this.resolvedLanguage||this.languages[0],i=this.options?this.options.fallbackLng:!1,d=this.languages[this.languages.length-1];if(s.toLowerCase()==="cimode")return!0;const c=(f,p)=>{const g=this.services.backendConnector.state[`${f}|${p}`];return g===-1||g===0||g===2};if(r.precheck){const f=r.precheck(this,c);if(f!==void 0)return f}return!!(this.hasResourceBundle(s,t)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||c(s,t)&&(!i||c(d,t)))}loadNamespaces(t,r){const s=Id();return this.options.ns?(Wt(t)&&(t=[t]),t.forEach(i=>{this.options.ns.indexOf(i)<0&&this.options.ns.push(i)}),this.loadResources(i=>{s.resolve(),r&&r(i)}),s):(r&&r(),Promise.resolve())}loadLanguages(t,r){const s=Id();Wt(t)&&(t=[t]);const i=this.options.preload||[],d=t.filter(c=>i.indexOf(c)<0&&this.services.languageUtils.isSupportedCode(c));return d.length?(this.options.preload=i.concat(d),this.loadResources(c=>{s.resolve(),r&&r(c)}),s):(r&&r(),Promise.resolve())}dir(t){var i,d;if(t||(t=this.resolvedLanguage||(((i=this.languages)==null?void 0:i.length)>0?this.languages[0]:this.language)),!t)return"rtl";try{const c=new Intl.Locale(t);if(c&&c.getTextInfo){const f=c.getTextInfo();if(f&&f.direction)return f.direction}}catch(c){}const r=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],s=((d=this.services)==null?void 0:d.languageUtils)||new u1(x1());return t.toLowerCase().indexOf("-latn")>1?"ltr":r.indexOf(s.getLanguagePartFromCode(t))>-1||t.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(t={},r){const s=new Gd(t,r);return s.createInstance=Gd.createInstance,s}cloneInstance(t={},r=qu){const s=t.forkResourceStore;s&&delete t.forkResourceStore;const i=Se(ne(ne({},this.options),t),{isClone:!0}),d=new Gd(i);if((t.debug!==void 0||t.prefix!==void 0)&&(d.logger=d.logger.clone(t)),["store","services","language"].forEach(f=>{d[f]=this[f]}),d.services=ne({},this.services),d.services.utils={hasLoadedNamespace:d.hasLoadedNamespace.bind(d)},s){const f=Object.keys(this.store.data).reduce((p,g)=>(p[g]=ne({},this.store.data[g]),p[g]=Object.keys(p[g]).reduce((x,y)=>(x[y]=ne({},p[g][y]),x),p[g]),p),{});d.store=new c1(f,i),d.services.resourceStore=d.store}return t.interpolation&&(d.services.interpolator=new g1(i)),d.translator=new bf(d.services,i),d.translator.on("*",(f,...p)=>{d.emit(f,...p)}),d.init(i,r),d.translator.options=i,d.translator.backendConnector.services.utils={hasLoadedNamespace:d.hasLoadedNamespace.bind(d)},d}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const Sr=Gd.createInstance();Sr.createInstance;Sr.dir;Sr.init;Sr.loadResources;Sr.reloadResources;Sr.use;Sr.changeLanguage;Sr.getFixedT;Sr.t;Sr.exists;Sr.setDefaultNamespace;Sr.hasLoadedNamespace;Sr.loadNamespaces;Sr.loadLanguages;const f3=(e,t,r,s)=>{var d,c,f,p;const i=[r,ne({code:t},s||{})];if((c=(d=e==null?void 0:e.services)==null?void 0:d.logger)!=null&&c.forward)return e.services.logger.forward(i,"warn","react-i18next::",!0);no(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),(p=(f=e==null?void 0:e.services)==null?void 0:f.logger)!=null&&p.warn?e.services.logger.warn(...i):console!=null&&console.warn&&console.warn(...i)},b1={},i_=(e,t,r,s)=>{no(r)&&b1[r]||(no(r)&&(b1[r]=new Date),f3(e,t,r,s))},l_=(e,t)=>()=>{if(e.isInitialized)t();else{const r=()=>{setTimeout(()=>{e.off("initialized",r)},0),t()};e.on("initialized",r)}},Ug=(e,t,r)=>{e.loadNamespaces(t,l_(e,r))},v1=(e,t,r,s)=>{if(no(r)&&(r=[r]),e.options.preload&&e.options.preload.indexOf(t)>-1)return Ug(e,r,s);r.forEach(i=>{e.options.ns.indexOf(i)<0&&e.options.ns.push(i)}),e.loadLanguages(t,l_(e,s))},h3=(e,t,r={})=>!t.languages||!t.languages.length?(i_(t,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:t.languages}),!0):t.hasLoadedNamespace(e,{lng:r.lng,precheck:(s,i)=>{if(r.bindI18n&&r.bindI18n.indexOf("languageChanging")>-1&&s.services.backendConnector.backend&&s.isLanguageChangingTo&&!i(s.isLanguageChangingTo,e))return!1}}),no=e=>typeof e=="string",m3=e=>typeof e=="object"&&e!==null,g3=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,p3={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},x3=e=>p3[e],y3=e=>e.replace(g3,x3);let Hg={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:y3};const b3=(e={})=>{Hg=ne(ne({},Hg),e)},v3=()=>Hg;let o_;const _3=e=>{o_=e},w3=()=>o_,k3={type:"3rdParty",init(e){b3(e.options.react),_3(e)}},N3=j.createContext();class j3{constructor(){this.usedNamespaces={}}addUsedNamespaces(t){t.forEach(r=>{this.usedNamespaces[r]||(this.usedNamespaces[r]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var xg={exports:{}},yg={};var _1;function S3(){if(_1)return yg;_1=1;var e=Hf();function t(y,v){return y===v&&(y!==0||1/y===1/v)||y!==y&&v!==v}var r=typeof Object.is=="function"?Object.is:t,s=e.useState,i=e.useEffect,d=e.useLayoutEffect,c=e.useDebugValue;function f(y,v){var k=v(),T=s({inst:{value:k,getSnapshot:v}}),N=T[0].inst,S=T[1];return d(function(){N.value=k,N.getSnapshot=v,p(N)&&S({inst:N})},[y,k,v]),i(function(){return p(N)&&S({inst:N}),y(function(){p(N)&&S({inst:N})})},[y]),c(k),k}function p(y){var v=y.getSnapshot;y=y.value;try{var k=v();return!r(y,k)}catch(T){return!0}}function g(y,v){return v()}var x=typeof window=="undefined"||typeof window.document=="undefined"||typeof window.document.createElement=="undefined"?g:f;return yg.useSyncExternalStore=e.useSyncExternalStore!==void 0?e.useSyncExternalStore:x,yg}var w1;function T3(){return w1||(w1=1,xg.exports=S3()),xg.exports}var E3=T3();const C3=(e,t)=>no(t)?t:m3(t)&&no(t.defaultValue)?t.defaultValue:Array.isArray(e)?e[e.length-1]:e,A3={t:C3,ready:!1},O3=()=>()=>{},Va=(e,t={})=>{var J,de,ye;const{i18n:r}=t,{i18n:s,defaultNS:i}=j.useContext(N3)||{},d=r||s||w3();d&&!d.reportNamespaces&&(d.reportNamespaces=new j3),d||i_(d,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const c=j.useMemo(()=>{var ie;return ne(ne(ne({},v3()),(ie=d==null?void 0:d.options)==null?void 0:ie.react),t)},[d,t]),{useSuspense:f,keyPrefix:p}=c,g=i||((J=d==null?void 0:d.options)==null?void 0:J.defaultNS),x=no(g)?[g]:g||["translation"],y=j.useMemo(()=>x,x);(ye=(de=d==null?void 0:d.reportNamespaces)==null?void 0:de.addUsedNamespaces)==null||ye.call(de,y);const v=j.useRef(0),k=j.useCallback(ie=>{if(!d)return O3;const{bindI18n:he,bindI18nStore:ve}=c,me=()=>{v.current+=1,ie()};return he&&d.on(he,me),ve&&d.store.on(ve,me),()=>{he&&he.split(" ").forEach(ee=>d.off(ee,me)),ve&&ve.split(" ").forEach(ee=>d.store.off(ee,me))}},[d,c]),T=j.useRef(),N=j.useCallback(()=>{if(!d)return A3;const ie=!!(d.isInitialized||d.initializedStoreOnce)&&y.every(Q=>h3(Q,d,c)),he=t.lng||d.language,ve=v.current,me=T.current;if(me&&me.ready===ie&&me.lng===he&&me.keyPrefix===p&&me.revision===ve)return me;const q={t:d.getFixedT(he,c.nsMode==="fallback"?y:y[0],p),ready:ie,lng:he,keyPrefix:p,revision:ve};return T.current=q,q},[d,y,p,c,t.lng]),[S,A]=j.useState(0),{t:C,ready:O}=E3.useSyncExternalStore(k,N,N);j.useEffect(()=>{if(d&&!O&&!f){const ie=()=>A(he=>he+1);t.lng?v1(d,t.lng,y,ie):Ug(d,y,ie)}},[d,t.lng,y,O,f,S]);const P=d||{},B=j.useRef(null),V=j.useRef(),z=ie=>{const he=Object.getOwnPropertyDescriptors(ie);he.__original&&delete he.__original;const ve=Object.create(Object.getPrototypeOf(ie),he);if(!Object.prototype.hasOwnProperty.call(ve,"__original"))try{Object.defineProperty(ve,"__original",{value:ie,writable:!1,enumerable:!1,configurable:!1})}catch(me){}return ve},U=j.useMemo(()=>{const ie=P,he=ie==null?void 0:ie.language;let ve=ie;ie&&(B.current&&B.current.__original===ie?V.current!==he?(ve=z(ie),B.current=ve,V.current=he):ve=B.current:(ve=z(ie),B.current=ve,V.current=he));const me=[C,ve,O];return me.t=C,me.i18n=ve,me.ready=O,me},[C,P,O,P.resolvedLanguage,P.language,P.languages]);if(d&&f&&!O)throw new Promise(ie=>{const he=()=>ie();t.lng?v1(d,t.lng,y,he):Ug(d,y,he)});return U},{slice:M3,forEach:L3}=[];function D3(e){return L3.call(M3.call(arguments,1),t=>{if(t)for(const r in t)e[r]===void 0&&(e[r]=t[r])}),e}function P3(e){return typeof e!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(r=>r.test(e))}const k1=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,R3=function(e,t){const s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},i=encodeURIComponent(t);let d=`${e}=${i}`;if(s.maxAge>0){const c=s.maxAge-0;if(Number.isNaN(c))throw new Error("maxAge should be a Number");d+=`; Max-Age=${Math.floor(c)}`}if(s.domain){if(!k1.test(s.domain))throw new TypeError("option domain is invalid");d+=`; Domain=${s.domain}`}if(s.path){if(!k1.test(s.path))throw new TypeError("option path is invalid");d+=`; Path=${s.path}`}if(s.expires){if(typeof s.expires.toUTCString!="function")throw new TypeError("option expires is invalid");d+=`; Expires=${s.expires.toUTCString()}`}if(s.httpOnly&&(d+="; HttpOnly"),s.secure&&(d+="; Secure"),s.sameSite)switch(typeof s.sameSite=="string"?s.sameSite.toLowerCase():s.sameSite){case!0:d+="; SameSite=Strict";break;case"lax":d+="; SameSite=Lax";break;case"strict":d+="; SameSite=Strict";break;case"none":d+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return s.partitioned&&(d+="; Partitioned"),d},N1={create(e,t,r,s){let i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};r&&(i.expires=new Date,i.expires.setTime(i.expires.getTime()+r*60*1e3)),s&&(i.domain=s),document.cookie=R3(e,t,i)},read(e){const t=`${e}=`,r=document.cookie.split(";");for(let s=0;s-1&&(i=window.location.hash.substring(window.location.hash.indexOf("?")));const c=i.substring(1).split("&");for(let f=0;f0&&c[f].substring(0,p)===t&&(r=c[f].substring(p+1))}}return r}},z3={name:"hash",lookup(e){var i;let{lookupHash:t,lookupFromHashIndex:r}=e,s;if(typeof window!="undefined"){const{hash:d}=window.location;if(d&&d.length>2){const c=d.substring(1);if(t){const f=c.split("&");for(let p=0;p0&&f[p].substring(0,g)===t&&(s=f[p].substring(g+1))}}if(s)return s;if(!s&&r>-1){const f=d.match(/\/([a-zA-Z-]*)/g);return Array.isArray(f)?(i=f[typeof r=="number"?r:0])==null?void 0:i.replace("/",""):void 0}}}return s}};let sc=null;const j1=()=>{if(sc!==null)return sc;try{if(sc=typeof window!="undefined"&&window.localStorage!==null,!sc)return!1;const e="i18next.translate.boo";window.localStorage.setItem(e,"foo"),window.localStorage.removeItem(e)}catch(e){sc=!1}return sc};var B3={name:"localStorage",lookup(e){let{lookupLocalStorage:t}=e;if(t&&j1())return window.localStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupLocalStorage:r}=t;r&&j1()&&window.localStorage.setItem(r,e)}};let ic=null;const S1=()=>{if(ic!==null)return ic;try{if(ic=typeof window!="undefined"&&window.sessionStorage!==null,!ic)return!1;const e="i18next.translate.boo";window.sessionStorage.setItem(e,"foo"),window.sessionStorage.removeItem(e)}catch(e){ic=!1}return ic};var U3={name:"sessionStorage",lookup(e){let{lookupSessionStorage:t}=e;if(t&&S1())return window.sessionStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupSessionStorage:r}=t;r&&S1()&&window.sessionStorage.setItem(r,e)}},H3={name:"navigator",lookup(e){const t=[];if(typeof navigator!="undefined"){const{languages:r,userLanguage:s,language:i}=navigator;if(r)for(let d=0;d0?t:void 0}},$3={name:"htmlTag",lookup(e){let{htmlTag:t}=e,r;const s=t||(typeof document!="undefined"?document.documentElement:null);return s&&typeof s.getAttribute=="function"&&(r=s.getAttribute("lang")),r}},W3={name:"path",lookup(e){var i;let{lookupFromPathIndex:t}=e;if(typeof window=="undefined")return;const r=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(r)?(i=r[typeof t=="number"?t:0])==null?void 0:i.replace("/",""):void 0}},V3={name:"subdomain",lookup(e){var i,d;let{lookupFromSubdomainIndex:t}=e;const r=typeof t=="number"?t+1:1,s=typeof window!="undefined"&&((d=(i=window.location)==null?void 0:i.hostname)==null?void 0:d.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i));if(s)return s[r]}};let c_=!1;try{document.cookie,c_=!0}catch(e){}const d_=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];c_||d_.splice(1,1);const G3=()=>({order:d_,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:e=>e});class u_{constructor(t){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(t,r)}init(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=t,this.options=D3(r,this.options||{},G3()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=i=>i.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=s,this.addDetector(F3),this.addDetector(I3),this.addDetector(B3),this.addDetector(U3),this.addDetector(H3),this.addDetector($3),this.addDetector(W3),this.addDetector(V3),this.addDetector(z3)}addDetector(t){return this.detectors[t.name]=t,this}detect(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,r=[];return t.forEach(s=>{if(this.detectors[s]){let i=this.detectors[s].lookup(this.options);i&&typeof i=="string"&&(i=[i]),i&&(r=r.concat(i))}}),r=r.filter(s=>s!=null&&!P3(s)).map(s=>this.options.convertDetectedLanguage(s)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?r:r.length>0?r[0]:null}cacheUserLanguage(t){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;r&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(t)>-1||r.forEach(s=>{this.detectors[s]&&this.detectors[s].cacheUserLanguage(t,this.options)}))}}u_.type="languageDetector";const Z3={dashboard:"Dashboard",assets:"Assets",workOrders:"Work Orders",maintenance:"Asset Maintenance",ppm:"PPM",logout:"Logout",login:"Login",email:"Email",password:"Password",submit:"Submit",cancel:"Cancel",save:"Save",delete:"Delete",deleting:"Deleting...",edit:"Edit",create:"Create",search:"Search",filter:"Filter",export:"Export",import:"Import",loading:"Loading...",noData:"No data available",error:"Error",success:"Success",darkMode:"Dark Mode",lightMode:"Light Mode",language:"Language",english:"English",arabic:"Arabic",backToDashboard:"Back to Dashboard"},q3={title:"Seera-ASM",loggedInAs:"Logged in as:",version:"Seera-ASM v1.0",inventory:"Inventory",ppmPlanner:"PPM Planner",maintenanceCalendar:"Maintenance Calendar",activeMap:"Active Map",maintenanceTeam:"Maintenance Team",procurement:"Procurement",sla:"Service Level Agreement (SLA)",support:"Support"},Y3={title:"Seera-ASM",subtitle:"Asset Management System",signIn:"Sign in to continue",emailPlaceholder:"Enter your email",passwordPlaceholder:"Enter your password",loginFailed:"Login failed. Please check your credentials.",demoLogin:"Demo Login"},X3={title:"Dashboard",loading:"Loading dashboard...",totalAssets:"TOTAL NO. OF ASSETS",openWorkOrders:"OPEN WORK ORDERS",workOrdersInProgress:"WORK ORDERS IN PROGRESS",completedWorkOrders:"COMPLETED WORK ORDERS",totalWorkOrders:"TOTAL WORK ORDERS",overdueWorkOrders:"OVERDUE WORK ORDERS",upTime:"Up Time",downTime:"Down Time",workOrderStatus:"Work Order Status",workOrderByType:"Work Order by Type",maintenanceByAsset:"Maintenance by Asset",assigneesStatus:"Assignees Status",maintenanceFrequency:"Maintenance Frequency",maintenanceLogs:"MAINTENANCE LOGS",assetUptime:"Asset Uptime",avgResponseTime:"Avg Response Time",maintenanceEfficiency:"Maintenance Efficiency",overdueMaintenance:"Overdue Maintenance",upDownTimeChart:"Up & Down Time Chart",ppmStatus:"PPM Status"},J3={assetId:"Asset ID",assetName:"Asset Name",serialNumber:"Serial Number",company:"Company/Hospital",location:"Location",department:"Department",deviceStatus:"Device Status",modality:"Modality",manufacturer:"Manufacturer",supplier:"Supplier",assetCategory:"Asset Category",purchaseDate:"Purchase Date",purchaseAmount:"Purchase Amount",availableForUseDate:"Available For Use Date",createdOn:"Created On",modifiedOn:"Modified On",createdBy:"Created By",modifiedBy:"Modified By",workOrderId:"Work Order ID",workOrderType:"Type",status:"Status",priority:"Priority",description:"Description",assignedTo:"Assigned To",scheduledDate:"Scheduled Date",completedDate:"Completed Date",hospital:"Hospital",assetType:"Asset Type",siteName:"Site Name",assignedSupervisor:"Assigned Supervisor",assignedContractor:"Assigned Contractor",serialNumberShort:"Serial",departmentShort:"Dept",manufacturerShort:"Mfr",workOrderIdShort:"WO ID",assetShort:"Asset",typeShort:"Type",nameShort:"Name",pmId:"PM ID",name:"Name"},K3={assetId:"Asset ID",hospital:"Hospital",name:"Name",serial:"Serial",status:"Status",location:"Location",dept:"Dept",modality:"Modality",mfr:"Mfr",supplier:"Supplier",workOrderId:"WO ID",asset:"Asset",type:"Type",priority:"Priority",allHospitals:"All Hospitals",allModalities:"All Modalities",filterByCompany:"Filter by Company",allManufacturers:"All Manufacturers"},Q3={addNew:"Add New",searchPlaceholder:"Search...",noResults:"No results found",showing:"Showing",of:"of",results:"results",selectAll:"Select All",deselectAll:"Deselect All",selected:"selected",actions:"Actions",view:"View",edit:"Edit",delete:"Delete",duplicate:"Duplicate",export:"Export",print:"Print",filters:"Filters",clearFilters:"Clear filters",applyFilters:"Apply Filters",columns:"Columns",exportSelected:"Export Selected",exportAllOnPage:"Export All on Page",exportAllWithFilters:"Export All with Filters",exportFormat:"Export Format",csv:"CSV",excel:"Excel",exporting:"Exporting...",exportComplete:"Export Complete",close:"Close",loading:"Loading...",refresh:"Refresh",deselectAllTitle:"Deselect all",selectAllTitle:"Select all",typeToSearch:"Type to search...",enterFilterName:"Enter filter name",enterFilterNameExample:"Enter filter name (e.g., 'Open High Priority')",allStatuses:"All Statuses",noIssuesFound:"No issues found",createFirstIssue:"Create your first issue",saveFilterPreset:"Save Filter Preset",saveFilter:"Save Filter",filtering:"Filtering...",noMaintenanceTeamsFound:"No maintenance teams found",createFirstTeam:"Create your first team",all:"All",tryAdjustingFilters:"Try adjusting your search or filters",getStartedCreateFirst:"Get started by creating your first PPM Planner",noMaintenanceLogsFound:"No maintenance logs found",createFirstMaintenanceLog:"Create your first maintenance log",total:"Total",noPPMSchedulesFound:"No PPM schedules found",createFirstPPMSchedule:"Create your first PPM schedule"},eN={title:"Assets",addAsset:"Add New Asset",assetDetails:"Asset Details",assetInformation:"Asset Information",newAsset:"New Asset",duplicateAsset:"Duplicate Asset",fromAsset:"From Asset",creatingFromAsset:"Creating Work Order from Asset",assetInfoPrefilled:"Asset information prefilled from",pleaseSelectWorkOrderType:"Please select a Work Order type and add any additional details",loadingAssetDetails:"Loading asset details...",pleaseEnterAssetName:"Please enter an Asset Name",pleaseSelectCategory:"Please select a Category",assetDuplicatedSuccessfully:"Asset duplicated successfully!",assetCreatedSuccessfully:"Asset created successfully!",assetUpdatedSuccessfully:"Asset updated successfully!",sourceAssetNotFound:"Source Asset Not Found",assetNotFoundMessage:"The asset you're trying to duplicate could not be found.",backToAssetsList:"Back to Assets List",newAssetDetails:"New Asset Details",noAssetsFound:"No assets found",createFirstAsset:"Create your first asset"},tN={title:"Work Orders",addWorkOrder:"Add New Work Order",workOrderDetails:"Work Order Details",newWorkOrder:"New Work Order",duplicateWorkOrder:"Duplicate Work Order",createFromAsset:"Create Work Order from Asset"},aN={title:"Asset Maintenance",maintenanceLogs:"Maintenance Logs",maintenanceDetails:"Maintenance Details",addMaintenance:"Add New Maintenance",maintenanceTeam:"Maintenance Team",newMaintenanceTeam:"New Maintenance Team",teamId:"Team ID",teamName:"Team Name",managerEmail:"Manager Email",managerName:"Manager Name",expertise:"Expertise",selectTeam:"Select Team",viewDetails:"View Details",editTeam:"Edit Team",duplicateTeam:"Duplicate Team",deleteTeam:"Delete Team",selectHospital:"Select Hospital",selectExpertise:"Select Expertise",selectManager:"Select Manager",enterTeamName:"Enter Team Name",teamInformation:"Team Information",selectUser:"Select User",selectRole:"Select Role",totalMembers:"Total Members",teamSummary:"Team Summary",addFirstMember:"Add First Member",manager:"Maintenance Manager"},rN={title:"PPM",ppmDetails:"PPM Details",addPPM:"Add New PPM",periodicity:"Periodicity",dueDate:"Due Date",manageSchedules:"Manage PM Schedules",pmId:"PM ID",name:"Name",manufacturer:"Manufacturer"},nN={title:"Export",whatToExport:"What to Export",selectedRows:"Selected Rows",currentPage:"Current Page",allWithFilters:"All with Filters",exportSelected:"Export {count} selected",exportPage:"Export {count} on current page",exportAll:"Export all {count}",columnsToExport:"Columns to Export",selectAll:"Select All",selectDefault:"Select Default",exporting:"Exporting...",exportingSelected:"Exporting {count} selected row(s)",exportingPage:"Exporting {count} row(s) from current page",exportingAll:"Exporting all {count} row(s)",selected:"selected",rows:"rows"},sN={title:"Items",itemDetails:"Item Details",newItem:"New Item",addItem:"Add New Item",itemId:"Item ID",itemCode:"Item Code",itemName:"Item Name",itemGroup:"Item Group",stockUOM:"Stock UOM",partDescription:"Part Description",brand:"Brand",valuationRate:"Valuation Rate",openingStock:"Opening Stock",lastCalibrationDate:"Last Calibration Date",nextCalibrationDate:"Next Calibration Date",selectItem:"Select Item",selectItemGroup:"Select Item Group",selectHospital:"Select Hospital",viewDetails:"View Details",editItem:"Edit Item",duplicateItem:"Duplicate Item",deleteItem:"Delete Item",basicInformation:"Basic Information",stockInformation:"Stock Information",isStockItem:"Is Stock Item",balanceQty:"Balance Qty",calibrationInformation:"Calibration Information",additionalInformation:"Additional Information",refreshBalanceQty:"Refresh Balance Qty",warrantyMonths:"Warranty (Months)"},iN={title:"Issues",issueDetails:"Issue Details",newIssue:"New Issue",addIssue:"Add New Issue",issueId:"Issue ID",subject:"Subject",raisedBy:"Raised By",contact:"Contact",issueType:"Issue Type",openingDate:"Opening Date",resolutionDate:"Resolution Date",resolvedBy:"Resolved By",firstRespondedOn:"First Responded On",resolutionDetails:"Resolution Details",selectIssue:"Select Issue",allPriorities:"All Priorities",allCompanies:"All Companies",viewDetails:"View Details",editIssue:"Edit Issue",deleteIssue:"Delete Issue",enterSubject:"Enter issue subject",selectPriority:"Select priority",selectIssueType:"Select issue type",describeIssue:"Describe the issue in detail...",contactInformation:"Contact Information",createNewIssue:"Create a new support issue",resolution:"Resolution",describeResolution:"Describe how the issue was resolved...",selectCompany:"Select company",statusInformation:"Status Information",currentStatus:"Current Status",timeline:"Timeline"},lN={title:"Users",userDetails:"User Details",newUser:"New User",addUser:"Add New User",searchUsers:"Search users...",manageUsers:"Manage user accounts and permissions",noUsersFound:"No users found",tryAdjustingSearch:"Try adjusting your search terms.",noUsersAvailable:"No users available.",backToDashboard:"Back to Dashboard"},oN={title:"Events",eventDetails:"Event Details",newEvent:"New Event",addEvent:"Add New Event",upcomingEvents:"Upcoming Events",eventsFromFrappe:"Events from your Frappe backend",noEventsFound:"No events found",noEventsScheduled:"No events are currently scheduled.",refreshEvents:"Refresh Events"},cN={common:Z3,sidebar:q3,login:Y3,dashboard:X3,commonFields:J3,filters:K3,listPages:Q3,assets:eN,workOrders:tN,maintenance:aN,ppm:rN,exportModal:nN,items:sN,issues:iN,users:lN,events:oN},dN={dashboard:"لوحة التحكم",assets:"الأصول",workOrders:"أوامر العمل",maintenance:"صيانة الأصول",ppm:"الصيانة الوقائية",logout:"تسجيل الخروج",login:"تسجيل الدخول",email:"البريد الإلكتروني",password:"كلمة المرور",submit:"إرسال",cancel:"إلغاء",save:"حفظ",delete:"حذف",edit:"تعديل",create:"إنشاء",search:"بحث",filter:"تصفية",export:"تصدير",import:"استيراد",loading:"جاري التحميل...",noData:"لا توجد بيانات",error:"خطأ",success:"نجح",darkMode:"الوضع الداكن",lightMode:"الوضع الفاتح",language:"اللغة",english:"الإنجليزية",arabic:"العربية"},uN={title:"أصول سيرا",loggedInAs:"تم تسجيل الدخول كـ:",version:"أصول سيرا نظام إدارة الأصول الإصدار 1.0"},fN={title:"أصول سيرا",subtitle:"نظام إدارة الأصول",signIn:"قم بتسجيل الدخول للمتابعة",emailPlaceholder:"أدخل بريدك الإلكتروني",passwordPlaceholder:"أدخل كلمة المرور",loginFailed:"فشل تسجيل الدخول. يرجى التحقق من بيانات الاعتماد الخاصة بك.",demoLogin:"تسجيل دخول تجريبي"},hN={title:"لوحة التحكم",loading:"جاري تحميل لوحة التحكم...",totalAssets:"إجمالي عدد الأصول",openWorkOrders:"أوامر العمل المفتوحة",workOrdersInProgress:"أوامر العمل قيد التنفيذ",completedWorkOrders:"أوامر العمل المكتملة",totalWorkOrders:"إجمالي أوامر العمل",overdueWorkOrders:"أوامر العمل المتأخرة",upTime:"وقت التشغيل",downTime:"وقت التوقف",workOrderStatus:"حالة أمر العمل",workOrderByType:"أمر العمل حسب النوع",maintenanceByAsset:"الصيانة حسب الأصل",assigneesStatus:"حالة المكلفين",maintenanceFrequency:"تكرار الصيانة",maintenanceLogs:"سجلات الصيانة",assetUptime:"وقت تشغيل الأصل",avgResponseTime:"متوسط وقت الاستجابة",maintenanceEfficiency:"كفاءة الصيانة",overdueMaintenance:"صيانة متأخرة",upDownTimeChart:"مخطط وقت التشغيل والتوقف",ppmStatus:"حالة الصيانة الوقائية"},mN={assetId:"معرف الأصل",assetName:"اسم الأصل",serialNumber:"الرقم التسلسلي",company:"الشركة/المستشفى",location:"الموقع",department:"القسم",deviceStatus:"حالة الجهاز",modality:"الطريقة",manufacturer:"الشركة المصنعة",supplier:"المورد",assetCategory:"فئة الأصل",purchaseDate:"تاريخ الشراء",purchaseAmount:"مبلغ الشراء",availableForUseDate:"تاريخ التوفر للاستخدام",createdOn:"تم الإنشاء في",modifiedOn:"تم التعديل في",createdBy:"تم الإنشاء بواسطة",modifiedBy:"تم التعديل بواسطة",workOrderId:"معرف أمر العمل",workOrderType:"النوع",status:"الحالة",priority:"الأولوية",description:"الوصف",assignedTo:"مكلف إلى",scheduledDate:"التاريخ المجدول",completedDate:"تاريخ الإكمال"},gN={addNew:"إضافة جديد",searchPlaceholder:"بحث...",noResults:"لم يتم العثور على نتائج",showing:"عرض",of:"من",results:"نتائج",selectAll:"تحديد الكل",deselectAll:"إلغاء تحديد الكل",selected:"محدد",actions:"الإجراءات",view:"عرض",edit:"تعديل",delete:"حذف",duplicate:"نسخ",export:"تصدير",print:"طباعة",filters:"المرشحات",clearFilters:"مسح المرشحات",applyFilters:"تطبيق المرشحات",columns:"الأعمدة",exportSelected:"تصدير المحدد",exportAllOnPage:"تصدير الكل في الصفحة",exportAllWithFilters:"تصدير الكل مع المرشحات",exportFormat:"تنسيق التصدير",csv:"CSV",excel:"Excel",exporting:"جاري التصدير...",exportComplete:"اكتمل التصدير",close:"إغلاق",loading:"جاري التحميل...",refresh:"تحديث"},pN={title:"الأصول",addAsset:"إضافة أصل جديد",assetDetails:"تفاصيل الأصل"},xN={title:"أوامر العمل",addWorkOrder:"إضافة أمر عمل جديد",workOrderDetails:"تفاصيل أمر العمل",newWorkOrder:"أمر عمل جديد",duplicateWorkOrder:"نسخ أمر العمل",createFromAsset:"إنشاء أمر عمل من الأصل"},yN={title:"صيانة الأصول",maintenanceLogs:"سجلات الصيانة",maintenanceDetails:"تفاصيل الصيانة",addMaintenance:"إضافة صيانة جديدة"},bN={title:"الصيانة الوقائية",ppmDetails:"تفاصيل الصيانة الوقائية",addPPM:"إضافة صيانة وقائية جديدة"},vN={title:"تصدير",whatToExport:"ما الذي سيتم تصديره",selectedRows:"الصفوف المحددة",currentPage:"الصفحة الحالية",allWithFilters:"الكل مع المرشحات",exportSelected:"تصدير {count} محدد",exportPage:"تصدير {count} في الصفحة الحالية",exportAll:"تصدير الكل {count}",columnsToExport:"الأعمدة للتصدير",selectAll:"تحديد الكل",selectDefault:"تحديد الافتراضي",exporting:"جاري التصدير...",exportingSelected:"جاري تصدير {count} صف(وف) محدد(ة)",exportingPage:"جاري تصدير {count} صف(وف) من الصفحة الحالية",exportingAll:"جاري تصدير جميع {count} صف(وف)",selected:"محدد",rows:"صفوف"},_N={common:dN,sidebar:uN,login:fN,dashboard:hN,commonFields:mN,listPages:gN,assets:pN,workOrders:xN,maintenance:yN,ppm:bN,exportModal:vN},zt={BASE_URL:"https://imanrdh-seeraasm.seeraarabia.com",ENDPOINTS:{USER_DETAILS:"/api/method/asset_lite.api.custom_api.get_user_details",DOCTYPE_RECORDS:"/api/method/asset_lite.api.custom_api.get_doctype_records",DASHBOARD_STATS:"/api/method/asset_lite.api.custom_api.get_dashboard_stats",DASHBOARD_NUMBER_CARDS:"/api/method/asset_lite.api.dashboard_api.get_number_cards",DASHBOARD_LIST_CHARTS:"/api/method/asset_lite.api.dashboard_api.list_dashboard_charts",DASHBOARD_CHART_DATA:"/api/method/asset_lite.api.dashboard_api.get_dashboard_chart_data",DASHBOARD_REPAIR_COST:"/api/method/asset_lite.api.dashboard_api.get_repair_cost_by_item",KYC_DETAILS:"/api/method/asset_lite.api.custom_api.get_kyc_details",GET_ASSETS:"/api/method/asset_lite.api.asset_api.get_assets",GET_ASSET_DETAILS:"/api/method/asset_lite.api.asset_api.get_asset_details",CREATE_ASSET:"/api/method/asset_lite.api.asset_api.create_asset",UPDATE_ASSET:"/api/method/asset_lite.api.asset_api.update_asset",DELETE_ASSET:"/api/method/asset_lite.api.asset_api.delete_asset",GET_ASSET_FILTERS:"/api/method/asset_lite.api.asset_api.get_asset_filters",GET_ASSET_STATS:"/api/method/asset_lite.api.asset_api.get_asset_stats",SEARCH_ASSETS:"/api/method/asset_lite.api.asset_api.search_assets",SUBMIT_ASSET:"/api/method/asset_lite.api.asset_api.submit_asset",CANCEL_ASSET:"/api/method/asset_lite.api.asset_api.cancel_asset",GET_WORK_ORDERS:"/api/method/asset_lite.api.work_order_api.get_work_orders",GET_WORK_ORDER_DETAILS:"/api/method/asset_lite.api.work_order_api.get_work_order_details",CREATE_WORK_ORDER:"/api/method/asset_lite.api.work_order_api.create_work_order",UPDATE_WORK_ORDER:"/api/method/asset_lite.api.work_order_api.update_work_order",DELETE_WORK_ORDER:"/api/method/asset_lite.api.work_order_api.delete_work_order",UPDATE_WORK_ORDER_STATUS:"/api/method/asset_lite.api.work_order_api.update_work_order_status",GET_ASSET_MAINTENANCE_LOGS:"/api/method/asset_lite.api.asset_maintenance_api.get_asset_maintenance_logs",GET_ASSET_MAINTENANCE_LOG_DETAILS:"/api/method/asset_lite.api.asset_maintenance_api.get_asset_maintenance_log_details",CREATE_ASSET_MAINTENANCE_LOG:"/api/method/asset_lite.api.asset_maintenance_api.create_asset_maintenance_log",UPDATE_ASSET_MAINTENANCE_LOG:"/api/method/asset_lite.api.asset_maintenance_api.update_asset_maintenance_log",DELETE_ASSET_MAINTENANCE_LOG:"/api/method/asset_lite.api.asset_maintenance_api.delete_asset_maintenance_log",UPDATE_MAINTENANCE_STATUS:"/api/method/asset_lite.api.asset_maintenance_api.update_maintenance_status",GET_MAINTENANCE_LOGS_BY_ASSET:"/api/method/asset_lite.api.asset_maintenance_api.get_maintenance_logs_by_asset",GET_OVERDUE_MAINTENANCE_LOGS:"/api/method/asset_lite.api.asset_maintenance_api.get_overdue_maintenance_logs",GET_ASSET_MAINTENANCES:"/api/method/asset_lite.api.ppm_api.get_asset_maintenances",GET_ASSET_MAINTENANCE_DETAILS:"/api/method/asset_lite.api.ppm_api.get_asset_maintenance_details",CREATE_ASSET_MAINTENANCE:"/api/method/asset_lite.api.ppm_api.create_asset_maintenance",UPDATE_ASSET_MAINTENANCE:"/api/method/asset_lite.api.ppm_api.update_asset_maintenance",DELETE_ASSET_MAINTENANCE:"/api/method/asset_lite.api.ppm_api.delete_asset_maintenance",GET_MAINTENANCE_TASKS:"/api/method/asset_lite.api.ppm_api.get_maintenance_tasks",GET_SERVICE_COVERAGE:"/api/method/asset_lite.api.ppm_api.get_service_coverage",GET_MAINTENANCES_BY_ASSET:"/api/method/asset_lite.api.ppm_api.get_maintenances_by_asset",GET_ACTIVE_SERVICE_CONTRACTS:"/api/method/asset_lite.api.ppm_api.get_active_service_contracts",LOGIN:"/api/method/login",LOGOUT:"/api/method/logout",CSRF_TOKEN:"/api/method/frappe.sessions.get_csrf_token",UPLOAD_FILE:"/api/method/upload_file",GET_USER_PERMISSIONS:"/api/method/asset_lite.api.userperm_api.get_user_permissions",GET_PERMISSION_FILTERS:"/api/method/asset_lite.api.userperm_api.get_permission_filters",GET_ALLOWED_VALUES:"/api/method/asset_lite.api.userperm_api.get_allowed_values",CHECK_DOCUMENT_ACCESS:"/api/method/asset_lite.api.userperm_api.check_document_access",GET_CONFIGURED_DOCTYPES:"/api/method/asset_lite.api.userperm_api.get_configured_doctypes",GET_USER_DEFAULTS:"/api/method/asset_lite.api.userperm_api.get_user_defaults"},DEFAULT_HEADERS:{"Content-Type":"application/json",Accept:"application/json"},TIMEOUT:parseInt("60000")};class wN{constructor(){Kn(this,"baseURL");Kn(this,"endpoints");Kn(this,"defaultHeaders");Kn(this,"timeout");this.baseURL=zt.BASE_URL,this.endpoints=zt.ENDPOINTS,this.defaultHeaders=zt.DEFAULT_HEADERS,this.timeout=zt.TIMEOUT}getCSRFToken(){return le(this,null,function*(){try{if(typeof window!="undefined"&&window.csrf_token)return window.csrf_token;if(!localStorage.getItem("user"))return null;const r=yield fetch(`${this.baseURL}${this.endpoints.CSRF_TOKEN}`,{method:"GET",headers:{Accept:"application/json"},credentials:"include"});return r.ok&&(yield r.json()).message||null}catch(t){return null}})}apiCall(s){return le(this,arguments,function*(t,r={}){const i=`${this.baseURL}${t}`,d=ne({method:"GET",headers:ne(ne({},this.defaultHeaders),r.headers)},r),c=yield this.getCSRFToken();c&&(d.headers["X-Frappe-CSRF-Token"]=c);try{const f=new AbortController,p=setTimeout(()=>f.abort(),this.timeout),g=yield fetch(i,Se(ne({},d),{signal:f.signal}));if(clearTimeout(p),!g.ok){const y=yield g.json().catch(()=>({}));throw new Kl(y.error||`HTTP error! status: ${g.status}`,g.status)}const x=yield g.json();return x.message!==void 0?x.message:x}catch(f){throw f instanceof Error?(console.error("API call failed:",f),new Kl(f.message)):f}})}login(t){return le(this,null,function*(){const r=new FormData;r.append("usr",t.email),r.append("pwd",t.password);const s=`${this.baseURL}${this.endpoints.LOGIN}`;try{const i=new AbortController,d=setTimeout(()=>i.abort(),this.timeout),c=yield fetch(s,{method:"POST",headers:{Accept:"application/json"},body:r,credentials:"include",signal:i.signal});if(clearTimeout(d),!c.ok){const p=yield c.json().catch(()=>({})),g="Invalid credentials. Please try again.";throw new Kl(g,c.status)}const f=yield c.json();return typeof f.message=="string"&&f.message==="Logged In"?{message:{full_name:f.full_name,user_id:f.user||f.email,home_page:f.home_page,sid:f.sid}}:f.message&&typeof f.message=="object"?{message:f.message}:f.full_name||f.user?{message:f}:{message:f}}catch(i){throw i instanceof Error?new Kl("Login failed. Please try again."):i}})}logout(){return le(this,null,function*(){yield this.apiCall(this.endpoints.LOGOUT,{method:"POST"})})}getUserDetails(t){return le(this,null,function*(){const r=t?`?user_id=${t}`:"";return this.apiCall(`${this.endpoints.USER_DETAILS}${r}`)})}getDoctypeRecords(t,r,s,i=20,d=0){return le(this,null,function*(){const c=new URLSearchParams({doctype:t,limit:i.toString(),offset:d.toString()});return r&&c.append("filters",JSON.stringify(r)),s&&c.append("fields",JSON.stringify(s)),this.apiCall(`${this.endpoints.DOCTYPE_RECORDS}?${c}`)})}getDashboardStats(){return le(this,null,function*(){return this.apiCall(this.endpoints.DASHBOARD_STATS)})}getNumberCards(){return le(this,null,function*(){return this.apiCall(this.endpoints.DASHBOARD_NUMBER_CARDS)})}listDashboardCharts(t=!0){return le(this,null,function*(){const r=new URLSearchParams({public_only:t?"1":"0"});return this.apiCall(`${this.endpoints.DASHBOARD_LIST_CHARTS}?${r}`)})}getDashboardChartData(t,r){return le(this,null,function*(){const s=new URLSearchParams({chart_name:t});return r&&s.append("report_filters",JSON.stringify(r)),this.apiCall(`${this.endpoints.DASHBOARD_CHART_DATA}?${s}`)})}getKycDetails(){return le(this,null,function*(){return this.apiCall(this.endpoints.KYC_DETAILS)})}uploadFile(t){return le(this,null,function*(){const r=new FormData;return r.append("file",t.file),r.append("doctype",t.doctype),r.append("docname",t.docname),r.append("fieldname",t.fieldname),this.apiCall(this.endpoints.UPLOAD_FILE,{method:"POST",headers:{},body:r})})}getUserPermissions(t){return le(this,null,function*(){const r=t?`?user=${encodeURIComponent(t)}`:"";return this.apiCall(`${this.endpoints.GET_USER_PERMISSIONS}${r}`)})}getPermissionFilters(t,r){return le(this,null,function*(){const s=new URLSearchParams({target_doctype:t});return r&&s.append("user",r),this.apiCall(`${this.endpoints.GET_PERMISSION_FILTERS}?${s}`)})}getAllowedValues(t,r){return le(this,null,function*(){const s=new URLSearchParams({allow_doctype:t});return r&&s.append("user",r),this.apiCall(`${this.endpoints.GET_ALLOWED_VALUES}?${s}`)})}checkDocumentAccess(t,r,s){return le(this,null,function*(){const i=new URLSearchParams({doctype:t,docname:r});return s&&i.append("user",s),this.apiCall(`${this.endpoints.CHECK_DOCUMENT_ACCESS}?${i}`)})}getConfiguredDoctypes(){return le(this,null,function*(){return this.apiCall(this.endpoints.GET_CONFIGURED_DOCTYPES)})}getUserDefaults(t){return le(this,null,function*(){const r=t?`?user=${encodeURIComponent(t)}`:"";return this.apiCall(`${this.endpoints.GET_USER_DEFAULTS}${r}`)})}isAuthenticated(){return!!localStorage.getItem("frappe_session_id")}getSessionId(){return localStorage.getItem("frappe_session_id")}setSessionId(t){localStorage.setItem("frappe_session_id",t)}}class Kl extends Error{constructor(r,s,i){super(r);Kn(this,"status");Kn(this,"code");this.name="ApiError",this.status=s,this.code=i}}const rt=new wN,kN=Object.freeze(Object.defineProperty({__proto__:null,ApiError:Kl,default:rt},Symbol.toStringTag,{value:"Module"}));function NN(e){return le(this,null,function*(){try{const t=yield rt.getDoctypeRecords("Translation",{language:e},["source_text","translated_text","context"],1e4,0),r={};return t.records&&t.records.length>0&&t.records.forEach(s=>{const i=s.source_text,d=s.translated_text||i;if(s.context){const c=`${s.context}.${i}`;r[c]=d}else i.includes("."),r[i]=d}),r}catch(t){return console.error("Error fetching translations from Frappe:",t),{}}})}function jN(e){const t={};return Object.keys(e).forEach(r=>{if(r.includes(".")){const s=r.split(".");let i=t;for(let d=0;d0&&Sr.addResourceBundle("en","translation",t,!0,!0);const r=yield T1("ar");Object.keys(r).length>0&&Sr.addResourceBundle("ar","translation",r,!0,!0),console.log("✓ Translations loaded from Frappe")}catch(e){console.warn("⚠ Could not load translations from Frappe, using static translations:",e)}})}Sr.on("initialized",()=>{vf()});var E1="popstate";function SN(e={}){function t(s,i){let{pathname:d,search:c,hash:f}=s.location;return $g("",{pathname:d,search:c,hash:f},i.state&&i.state.usr||null,i.state&&i.state.key||"default")}function r(s,i){return typeof i=="string"?i:a0(i)}return EN(t,r,null,e)}function $a(e,t){if(e===!1||e===null||typeof e=="undefined")throw new Error(t)}function Fn(e,t){if(!e){typeof console!="undefined"&&console.warn(t);try{throw new Error(t)}catch(r){}}}function TN(){return Math.random().toString(36).substring(2,10)}function C1(e,t){return{usr:e.state,key:e.key,idx:t}}function $g(e,t,r=null,s){return Se(ne({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?jc(t):t),{state:r,key:t&&t.key||s||TN()})}function a0({pathname:e="/",search:t="",hash:r=""}){return t&&t!=="?"&&(e+=t.charAt(0)==="?"?t:"?"+t),r&&r!=="#"&&(e+=r.charAt(0)==="#"?r:"#"+r),e}function jc(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substring(r),e=e.substring(0,r));let s=e.indexOf("?");s>=0&&(t.search=e.substring(s),e=e.substring(0,s)),e&&(t.pathname=e)}return t}function EN(e,t,r,s={}){let{window:i=document.defaultView,v5Compat:d=!1}=s,c=i.history,f="POP",p=null,g=x();g==null&&(g=0,c.replaceState(Se(ne({},c.state),{idx:g}),""));function x(){return(c.state||{idx:null}).idx}function y(){f="POP";let S=x(),A=S==null?null:S-g;g=S,p&&p({action:f,location:N.location,delta:A})}function v(S,A){f="PUSH";let C=$g(N.location,S,A);g=x()+1;let O=C1(C,g),P=N.createHref(C);try{c.pushState(O,"",P)}catch(B){if(B instanceof DOMException&&B.name==="DataCloneError")throw B;i.location.assign(P)}d&&p&&p({action:f,location:N.location,delta:1})}function k(S,A){f="REPLACE";let C=$g(N.location,S,A);g=x();let O=C1(C,g),P=N.createHref(C);c.replaceState(O,"",P),d&&p&&p({action:f,location:N.location,delta:0})}function T(S){return CN(S)}let N={get action(){return f},get location(){return e(i,c)},listen(S){if(p)throw new Error("A history only accepts one active listener");return i.addEventListener(E1,y),p=S,()=>{i.removeEventListener(E1,y),p=null}},createHref(S){return t(i,S)},createURL:T,encodeLocation(S){let A=T(S);return{pathname:A.pathname,search:A.search,hash:A.hash}},push:v,replace:k,go(S){return c.go(S)}};return N}function CN(e,t=!1){let r="http://localhost";typeof window!="undefined"&&(r=window.location.origin!=="null"?window.location.origin:window.location.href),$a(r,"No window.location.(origin|href) available to create URL");let s=typeof e=="string"?e:a0(e);return s=s.replace(/ $/,"%20"),!t&&s.startsWith("//")&&(s=r+s),new URL(s,r)}function f_(e,t,r="/"){return AN(e,t,r,!1)}function AN(e,t,r,s){let i=typeof t=="string"?jc(t):t,d=xi(i.pathname||"/",r);if(d==null)return null;let c=h_(e);ON(c);let f=null;for(let p=0;f==null&&p{let x={relativePath:g===void 0?c.path||"":g,caseSensitive:c.caseSensitive===!0,childrenIndex:f,route:c};if(x.relativePath.startsWith("/")){if(!x.relativePath.startsWith(s)&&p)return;$a(x.relativePath.startsWith(s),`Absolute route path "${x.relativePath}" nested under path "${s}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),x.relativePath=x.relativePath.slice(s.length)}let y=hi([s,x.relativePath]),v=r.concat(x);c.children&&c.children.length>0&&($a(c.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${y}".`),h_(c.children,t,v,y,p)),!(c.path==null&&!c.index)&&t.push({path:y,score:IN(y,c.index),routesMeta:v})};return e.forEach((c,f)=>{var p;if(c.path===""||!((p=c.path)!=null&&p.includes("?")))d(c,f);else for(let g of m_(c.path))d(c,f,!0,g)}),t}function m_(e){let t=e.split("/");if(t.length===0)return[];let[r,...s]=t,i=r.endsWith("?"),d=r.replace(/\?$/,"");if(s.length===0)return i?[d,""]:[d];let c=m_(s.join("/")),f=[];return f.push(...c.map(p=>p===""?d:[d,p].join("/"))),i&&f.push(...c),f.map(p=>e.startsWith("/")&&p===""?"/":p)}function ON(e){e.sort((t,r)=>t.score!==r.score?r.score-t.score:zN(t.routesMeta.map(s=>s.childrenIndex),r.routesMeta.map(s=>s.childrenIndex)))}var MN=/^:[\w-]+$/,LN=3,DN=2,PN=1,RN=10,FN=-2,A1=e=>e==="*";function IN(e,t){let r=e.split("/"),s=r.length;return r.some(A1)&&(s+=FN),t&&(s+=DN),r.filter(i=>!A1(i)).reduce((i,d)=>i+(MN.test(d)?LN:d===""?PN:RN),s)}function zN(e,t){return e.length===t.length&&e.slice(0,-1).every((s,i)=>s===t[i])?e[e.length-1]-t[t.length-1]:0}function BN(e,t,r=!1){let{routesMeta:s}=e,i={},d="/",c=[];for(let f=0;f{if(x==="*"){let T=f[v]||"";c=d.slice(0,d.length-T.length).replace(/(.)\/+$/,"$1")}const k=f[v];return y&&!k?g[x]=void 0:g[x]=(k||"").replace(/%2F/g,"/"),g},{}),pathname:d,pathnameBase:c,pattern:e}}function UN(e,t=!1,r=!0){Fn(e==="*"||!e.endsWith("*")||e.endsWith("/*"),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,"/*")}".`);let s=[],i="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(c,f,p)=>(s.push({paramName:f,isOptional:p!=null}),p?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return e.endsWith("*")?(s.push({paramName:"*"}),i+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?i+="\\/*$":e!==""&&e!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,t?void 0:"i"),s]}function HN(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return Fn(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function xi(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,s=e.charAt(r);return s&&s!=="/"?null:e.slice(r)||"/"}var $N=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,WN=e=>$N.test(e);function VN(e,t="/"){let{pathname:r,search:s="",hash:i=""}=typeof e=="string"?jc(e):e,d;if(r)if(WN(r))d=r;else{if(r.includes("//")){let c=r;r=r.replace(/\/\/+/g,"/"),Fn(!1,`Pathnames cannot have embedded double slashes - normalizing ${c} -> ${r}`)}r.startsWith("/")?d=O1(r.substring(1),"/"):d=O1(r,t)}else d=t;return{pathname:d,search:qN(s),hash:YN(i)}}function O1(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(i=>{i===".."?r.length>1&&r.pop():i!=="."&&r.push(i)}),r.length>1?r.join("/"):"/"}function bg(e,t,r,s){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(s)}]. Please separate it out to the \`to.${r}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function GN(e){return e.filter((t,r)=>r===0||t.route.path&&t.route.path.length>0)}function lp(e){let t=GN(e);return t.map((r,s)=>s===t.length-1?r.pathname:r.pathnameBase)}function op(e,t,r,s=!1){let i;typeof e=="string"?i=jc(e):(i=ne({},e),$a(!i.pathname||!i.pathname.includes("?"),bg("?","pathname","search",i)),$a(!i.pathname||!i.pathname.includes("#"),bg("#","pathname","hash",i)),$a(!i.search||!i.search.includes("#"),bg("#","search","hash",i)));let d=e===""||i.pathname==="",c=d?"/":i.pathname,f;if(c==null)f=r;else{let y=t.length-1;if(!s&&c.startsWith("..")){let v=c.split("/");for(;v[0]==="..";)v.shift(),y-=1;i.pathname=v.join("/")}f=y>=0?t[y]:"/"}let p=VN(i,f),g=c&&c!=="/"&&c.endsWith("/"),x=(d||c===".")&&r.endsWith("/");return!p.pathname.endsWith("/")&&(g||x)&&(p.pathname+="/"),p}var hi=e=>e.join("/").replace(/\/\/+/g,"/"),ZN=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),qN=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,YN=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function XN(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}function JN(e){return e.map(t=>t.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var g_=["POST","PUT","PATCH","DELETE"];new Set(g_);var KN=["GET",...g_];new Set(KN);var Sc=j.createContext(null);Sc.displayName="DataRouter";var Wf=j.createContext(null);Wf.displayName="DataRouterState";j.createContext(!1);var p_=j.createContext({isTransitioning:!1});p_.displayName="ViewTransition";var QN=j.createContext(new Map);QN.displayName="Fetchers";var ej=j.createContext(null);ej.displayName="Await";var as=j.createContext(null);as.displayName="Navigation";var u0=j.createContext(null);u0.displayName="Location";var ks=j.createContext({outlet:null,matches:[],isDataRoute:!1});ks.displayName="Route";var cp=j.createContext(null);cp.displayName="RouteError";function tj(e,{relative:t}={}){$a(Tc(),"useHref() may be used only in the context of a component.");let{basename:r,navigator:s}=j.useContext(as),{hash:i,pathname:d,search:c}=f0(e,{relative:t}),f=d;return r!=="/"&&(f=d==="/"?r:hi([r,d])),s.createHref({pathname:f,search:c,hash:i})}function Tc(){return j.useContext(u0)!=null}function Gs(){return $a(Tc(),"useLocation() may be used only in the context of a component."),j.useContext(u0).location}var x_="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function y_(e){j.useContext(as).static||j.useLayoutEffect(e)}function xa(){let{isDataRoute:e}=j.useContext(ks);return e?mj():aj()}function aj(){$a(Tc(),"useNavigate() may be used only in the context of a component.");let e=j.useContext(Sc),{basename:t,navigator:r}=j.useContext(as),{matches:s}=j.useContext(ks),{pathname:i}=Gs(),d=JSON.stringify(lp(s)),c=j.useRef(!1);return y_(()=>{c.current=!0}),j.useCallback((p,g={})=>{if(Fn(c.current,x_),!c.current)return;if(typeof p=="number"){r.go(p);return}let x=op(p,JSON.parse(d),i,g.relative==="path");e==null&&t!=="/"&&(x.pathname=x.pathname==="/"?t:hi([t,x.pathname])),(g.replace?r.replace:r.push)(x,g.state,g)},[t,r,d,i,e])}j.createContext(null);function fl(){let{matches:e}=j.useContext(ks),t=e[e.length-1];return t?t.params:{}}function f0(e,{relative:t}={}){let{matches:r}=j.useContext(ks),{pathname:s}=Gs(),i=JSON.stringify(lp(r));return j.useMemo(()=>op(e,JSON.parse(i),s,t==="path"),[e,i,s,t])}function rj(e,t){return b_(e,t)}function b_(e,t,r,s,i){var C;$a(Tc(),"useRoutes() may be used only in the context of a component.");let{navigator:d}=j.useContext(as),{matches:c}=j.useContext(ks),f=c[c.length-1],p=f?f.params:{},g=f?f.pathname:"/",x=f?f.pathnameBase:"/",y=f&&f.route;{let O=y&&y.path||"";v_(g,!y||O.endsWith("*")||O.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${g}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. + +Please change the parent to .`)}let v=Gs(),k;if(t){let O=typeof t=="string"?jc(t):t;$a(x==="/"||((C=O.pathname)==null?void 0:C.startsWith(x)),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${x}" but pathname "${O.pathname}" was given in the \`location\` prop.`),k=O}else k=v;let T=k.pathname||"/",N=T;if(x!=="/"){let O=x.replace(/^\//,"").split("/");N="/"+T.replace(/^\//,"").split("/").slice(O.length).join("/")}let S=f_(e,{pathname:N});Fn(y||S!=null,`No routes matched location "${k.pathname}${k.search}${k.hash}" `),Fn(S==null||S[S.length-1].route.element!==void 0||S[S.length-1].route.Component!==void 0||S[S.length-1].route.lazy!==void 0,`Matched leaf route at location "${k.pathname}${k.search}${k.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let A=oj(S&&S.map(O=>Object.assign({},O,{params:Object.assign({},p,O.params),pathname:hi([x,d.encodeLocation?d.encodeLocation(O.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:O.pathname]),pathnameBase:O.pathnameBase==="/"?x:hi([x,d.encodeLocation?d.encodeLocation(O.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:O.pathnameBase])})),c,r,s,i);return t&&A?j.createElement(u0.Provider,{value:{location:ne({pathname:"/",search:"",hash:"",state:null,key:"default"},k),navigationType:"POP"}},A):A}function nj(){let e=hj(),t=XN(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,s="rgba(200,200,200, 0.5)",i={padding:"0.5rem",backgroundColor:s},d={padding:"2px 4px",backgroundColor:s},c=null;return console.error("Error handled by React Router default ErrorBoundary:",e),c=j.createElement(j.Fragment,null,j.createElement("p",null,"💿 Hey developer 👋"),j.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",j.createElement("code",{style:d},"ErrorBoundary")," or"," ",j.createElement("code",{style:d},"errorElement")," prop on your route.")),j.createElement(j.Fragment,null,j.createElement("h2",null,"Unexpected Application Error!"),j.createElement("h3",{style:{fontStyle:"italic"}},t),r?j.createElement("pre",{style:i},r):null,c)}var sj=j.createElement(nj,null),ij=class extends j.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!=="idle"&&e.revalidation==="idle"?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error!==void 0?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error("React Router caught the following error during render",e)}render(){return this.state.error!==void 0?j.createElement(ks.Provider,{value:this.props.routeContext},j.createElement(cp.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function lj({routeContext:e,match:t,children:r}){let s=j.useContext(Sc);return s&&s.static&&s.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(s.staticContext._deepestRenderedBoundaryId=t.route.id),j.createElement(ks.Provider,{value:e},r)}function oj(e,t=[],r=null,s=null,i=null){if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let d=e,c=r==null?void 0:r.errors;if(c!=null){let x=d.findIndex(y=>y.route.id&&(c==null?void 0:c[y.route.id])!==void 0);$a(x>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(c).join(",")}`),d=d.slice(0,Math.min(d.length,x+1))}let f=!1,p=-1;if(r)for(let x=0;x=0?d=d.slice(0,p+1):d=[d[0]];break}}}let g=r&&s?(x,y)=>{var v,k,T;s(x,{location:r.location,params:(T=(k=(v=r.matches)==null?void 0:v[0])==null?void 0:k.params)!=null?T:{},unstable_pattern:JN(r.matches),errorInfo:y})}:void 0;return d.reduceRight((x,y,v)=>{let k,T=!1,N=null,S=null;r&&(k=c&&y.route.id?c[y.route.id]:void 0,N=y.route.errorElement||sj,f&&(p<0&&v===0?(v_("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),T=!0,S=null):p===v&&(T=!0,S=y.route.hydrateFallbackElement||null)));let A=t.concat(d.slice(0,v+1)),C=()=>{let O;return k?O=N:T?O=S:y.route.Component?O=j.createElement(y.route.Component,null):y.route.element?O=y.route.element:O=x,j.createElement(lj,{match:y,routeContext:{outlet:x,matches:A,isDataRoute:r!=null},children:O})};return r&&(y.route.ErrorBoundary||y.route.errorElement||v===0)?j.createElement(ij,{location:r.location,revalidation:r.revalidation,component:N,error:k,children:C(),routeContext:{outlet:null,matches:A,isDataRoute:!0},onError:g}):C()},null)}function dp(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function cj(e){let t=j.useContext(Sc);return $a(t,dp(e)),t}function dj(e){let t=j.useContext(Wf);return $a(t,dp(e)),t}function uj(e){let t=j.useContext(ks);return $a(t,dp(e)),t}function up(e){let t=uj(e),r=t.matches[t.matches.length-1];return $a(r.route.id,`${e} can only be used on routes that contain a unique "id"`),r.route.id}function fj(){return up("useRouteId")}function hj(){var s;let e=j.useContext(cp),t=dj("useRouteError"),r=up("useRouteError");return e!==void 0?e:(s=t.errors)==null?void 0:s[r]}function mj(){let{router:e}=cj("useNavigate"),t=up("useNavigate"),r=j.useRef(!1);return y_(()=>{r.current=!0}),j.useCallback((c,...f)=>le(null,[c,...f],function*(i,d={}){Fn(r.current,x_),r.current&&(typeof i=="number"?yield e.navigate(i):yield e.navigate(i,ne({fromRouteId:t},d)))}),[e,t])}var M1={};function v_(e,t,r){!t&&!M1[e]&&(M1[e]=!0,Fn(!1,r))}j.memo(gj);function gj({routes:e,future:t,state:r,unstable_onError:s}){return b_(e,void 0,r,s,t)}function Wg({to:e,replace:t,state:r,relative:s}){$a(Tc()," may be used only in the context of a component.");let{static:i}=j.useContext(as);Fn(!i," must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.");let{matches:d}=j.useContext(ks),{pathname:c}=Gs(),f=xa(),p=op(e,lp(d),c,s==="path"),g=JSON.stringify(p);return j.useEffect(()=>{f(JSON.parse(g),{replace:t,state:r,relative:s})},[f,g,s,t,r]),null}function fa(e){$a(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function pj({basename:e="/",children:t=null,location:r,navigationType:s="POP",navigator:i,static:d=!1,unstable_useTransitions:c}){$a(!Tc(),"You cannot render a inside another . You should never have more than one in your app.");let f=e.replace(/^\/*/,"/"),p=j.useMemo(()=>({basename:f,navigator:i,static:d,unstable_useTransitions:c,future:{}}),[f,i,d,c]);typeof r=="string"&&(r=jc(r));let{pathname:g="/",search:x="",hash:y="",state:v=null,key:k="default"}=r,T=j.useMemo(()=>{let N=xi(g,f);return N==null?null:{location:{pathname:N,search:x,hash:y,state:v,key:k},navigationType:s}},[f,g,x,y,v,k,s]);return Fn(T!=null,` is not able to match the URL "${g}${x}${y}" because it does not start with the basename, so the won't render anything.`),T==null?null:j.createElement(as.Provider,{value:p},j.createElement(u0.Provider,{children:t,value:T}))}function xj({children:e,location:t}){return rj(Vg(e),t)}function Vg(e,t=[]){let r=[];return j.Children.forEach(e,(s,i)=>{if(!j.isValidElement(s))return;let d=[...t,i];if(s.type===j.Fragment){r.push.apply(r,Vg(s.props.children,d));return}$a(s.type===fa,`[${typeof s.type=="string"?s.type:s.type.name}] is not a component. All component children of must be a or `),$a(!s.props.index||!s.props.children,"An index route cannot have child routes.");let c={id:s.props.id||d.join("-"),caseSensitive:s.props.caseSensitive,element:s.props.element,Component:s.props.Component,index:s.props.index,path:s.props.path,middleware:s.props.middleware,loader:s.props.loader,action:s.props.action,hydrateFallbackElement:s.props.hydrateFallbackElement,HydrateFallback:s.props.HydrateFallback,errorElement:s.props.errorElement,ErrorBoundary:s.props.ErrorBoundary,hasErrorBoundary:s.props.hasErrorBoundary===!0||s.props.ErrorBoundary!=null||s.props.errorElement!=null,shouldRevalidate:s.props.shouldRevalidate,handle:s.props.handle,lazy:s.props.lazy};s.props.children&&(c.children=Vg(s.props.children,d)),r.push(c)}),r}var uf="get",ff="application/x-www-form-urlencoded";function Vf(e){return typeof HTMLElement!="undefined"&&e instanceof HTMLElement}function yj(e){return Vf(e)&&e.tagName.toLowerCase()==="button"}function bj(e){return Vf(e)&&e.tagName.toLowerCase()==="form"}function vj(e){return Vf(e)&&e.tagName.toLowerCase()==="input"}function _j(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function wj(e,t){return e.button===0&&(!t||t==="_self")&&!_j(e)}function Gg(e=""){return new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,r)=>{let s=e[r];return t.concat(Array.isArray(s)?s.map(i=>[r,i]):[[r,s]])},[]))}function kj(e,t){let r=Gg(e);return t&&t.forEach((s,i)=>{r.has(i)||t.getAll(i).forEach(d=>{r.append(i,d)})}),r}var Yu=null;function Nj(){if(Yu===null)try{new FormData(document.createElement("form"),0),Yu=!1}catch(e){Yu=!0}return Yu}var jj=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function vg(e){return e!=null&&!jj.has(e)?(Fn(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${ff}"`),null):e}function Sj(e,t){let r,s,i,d,c;if(bj(e)){let f=e.getAttribute("action");s=f?xi(f,t):null,r=e.getAttribute("method")||uf,i=vg(e.getAttribute("enctype"))||ff,d=new FormData(e)}else if(yj(e)||vj(e)&&(e.type==="submit"||e.type==="image")){let f=e.form;if(f==null)throw new Error('Cannot submit a + +
+
+ +
+ + + + + + + + + + + + + + + ${Ft} + +
Asset IDAsset NameSerial NumberDue DatePeriodicityMaintenance TypeAssigned ToStatus
+
+ +
+ Summary: ${wt.length} planned maintenance entries for the next 5 years +
+
+ + + `),Mt.document.close()}catch(oe){console.error("Error fetching PPM Plan:",oe),alert("Failed to load PPM Plan. Please try again.")}}),Ve=()=>le(null,null,function*(){if(!e||i){alert("Please save the asset first to view Asset History");return}try{const oe=yield rt.apiCall(`/api/resource/Asset/${e}`),we=(oe==null?void 0:oe.data)||{},Ie=yield rt.apiCall(`/api/resource/Work_Order?filters=[["asset","=","${e}"]]&fields=["name","work_order_type","repair_status","creation","total_repair_cost"]`),ot=(Ie==null?void 0:Ie.data)||[],bt=yield rt.apiCall(`/api/resource/Asset Maintenance?filters=[["asset_name","=","${e}"]]&fields=["name","maintenance_team","custom_type_of_maintenance"]`),qe=(bt==null?void 0:bt.data)||[];let Ue=[],ht=[];for(const et of qe){const pe=yield rt.apiCall(`/api/resource/Asset Maintenance/${et.name}`),ze=(pe==null?void 0:pe.data)||{};ze.asset_maintenance_tasks&&(ht=[...ht,...ze.asset_maintenance_tasks.map(Ut=>Se(ne({},Ut),{maintenance_id:et.name}))]);const st=yield rt.apiCall(`/api/resource/Asset Maintenance Log?filters=[["asset_maintenance","=","${et.name}"]]&fields=["name","maintenance_status","assign_to_name","maintenance_type","due_date","completion_date","periodicity","actions_performed"]&order_by=completion_date desc`);Ue=[...Ue,...(st==null?void 0:st.data)||[]]}const wt=Ue.filter(et=>et.maintenance_status==="Completed"),Mt=Ue.filter(et=>et.maintenance_status!=="Completed"),Ft={};Ue.forEach(et=>{Ft[et.maintenance_status]=(Ft[et.maintenance_status]||0)+1});const je=we.custom_spare_parts||[],it={};je.forEach(et=>{const pe=et.work_order||"Unassigned";it[pe]||(it[pe]=[]),it[pe].push(et)});const vt=window.open("","_blank");if(!vt)return;const Bt=ot.length>0?ot.map((et,pe)=>{const ze=et.repair_status==="Completed"?"bg-green-100 text-green-800":et.repair_status==="Work In Progress"?"bg-yellow-100 text-yellow-800":"bg-gray-100 text-gray-800";return` + + ${et.name} + ${et.work_order_type||"-"} + ${et.repair_status||"-"} + ${parseFloat(et.total_repair_cost||0).toFixed(2)} ر.س + ${et.creation?new Date(et.creation).toLocaleDateString():"-"} + + `}).join(""):'No Work Orders Found';let De="";Object.keys(it).length>0?Object.keys(it).forEach(et=>{De+=` +
+
+ Work Order: + ${et} +
+ + + + + + + + + + + ${it[et].map((pe,ze)=>` + + + + + + + `).join("")} + +
Item NameQuantityCostAmount
${pe.item_code||"-"}${pe.qty||0}${pe.rate||0} ر.س${pe.amount||0} ر.س
+
+ `}):De='

No Spare Parts Used

';const ct=qe.length>0?qe.map(et=>` +
+
+
+

Maintenance ID

+

${et.name}

+
+
+

Type

+

${et.custom_type_of_maintenance||"-"}

+
+
+
+

Maintenance Team

+

${et.maintenance_team||"-"}

+
+
+ `).join(""):'

No Maintenance Records Found

',ut=ht.length>0?ht.map((et,pe)=>` + + ${et.assign_to_name||"-"} + ${et.periodicity||"-"} + ${et.next_due_date||"-"} + ${et.maintenance_id||"-"} + + `).join(""):'No Maintenance Tasks Found',Nt=Object.keys(Ft).length>0?Object.entries(Ft).map(([et,pe])=>` +
+ ${et} + ${pe} +
+ `).join(""):'

No Data

',Rt=wt.length>0?wt.map((et,pe)=>` + + ${et.name} + ${et.assign_to_name||"-"} + ${et.maintenance_type||"-"} + ${et.due_date||"-"} + ${et.completion_date||"-"} + ${et.periodicity||"-"} + ${et.actions_performed||"-"} + + `).join(""):'No Completed Maintenance Logs',ia=Mt.length>0?Mt.map((et,pe)=>{const ze=et.maintenance_status==="Planned"?"bg-blue-100 text-blue-800":"bg-yellow-100 text-yellow-800";return` + + ${et.name} + ${et.assign_to_name||"-"} + ${et.maintenance_type||"-"} + ${et.due_date||"-"} + ${et.periodicity||"-"} + ${et.maintenance_status||"-"} + ${et.actions_performed||"-"} + + `}).join(""):'No Pending/Planned Maintenance Logs';vt.document.write(` + + + + Asset History - ${e} + - + +
diff --git a/asm_ui_app/www/asm_app.html b/asm_ui_app/www/asm_app.html index ae03b83..f354cbc 100644 --- a/asm_ui_app/www/asm_app.html +++ b/asm_ui_app/www/asm_app.html @@ -7,8 +7,8 @@ Seera Arabia - Asset Management System - - + +