import { For, Show, createMemo, createSignal, onMount } from 'solid-js'; type CompanyRecord = { id: string; companyCode: string; name: string; registrationNumber: string; industry: string; location: string; joinedOn: string; joinedAt: string; accountStatus: 'ACTIVE' | 'PENDING' | 'SUSPENDED' | 'INACTIVE'; verificationStatus: string; subscriptionType: string; jobPostingsCount: number; totalHires: number; updatedAt: string; }; function StatusBadge(props: { status: CompanyRecord['accountStatus'] }) { const active = () => props.status === 'ACTIVE'; const pending = () => props.status === 'PENDING'; const suspended = () => props.status === 'SUSPENDED'; return ( {props.status.charAt(0) + props.status.slice(1).toLowerCase()} ); } function normalizeStatus(value: unknown): CompanyRecord['accountStatus'] { const key = String(value || '').toUpperCase(); if (key === 'APPROVED' || key === 'ACTIVE') return 'ACTIVE'; if (key === 'PENDING' || key === 'PENDING_REVIEW' || key === 'UNDER_REVIEW') return 'PENDING'; if (key === 'SUSPENDED') return 'SUSPENDED'; return 'INACTIVE'; } export default function CompanyManagementPage() { const [listTab, setListTab] = createSignal<'all' | 'active' | 'pending' | 'view'>('all'); const [detailTab, setDetailTab] = createSignal<'overview' | 'verification' | 'metrics'>('overview'); const [rows, setRows] = createSignal([]); const [isLoading, setIsLoading] = createSignal(false); const [loadError, setLoadError] = createSignal(''); const [selectedCompany, setSelectedCompany] = createSignal(null); const [openMenuId, setOpenMenuId] = createSignal(null); const [search, setSearch] = createSignal(''); const [statusFilter, setStatusFilter] = createSignal<'all' | CompanyRecord['accountStatus']>('all'); const [sortBy, setSortBy] = createSignal<'name_asc' | 'name_desc' | 'joined_desc' | 'joined_asc'>('name_asc'); const [sortMenuOpen, setSortMenuOpen] = createSignal(false); const [filterMenuOpen, setFilterMenuOpen] = createSignal(false); const load = async () => { setIsLoading(true); setLoadError(''); try { const accessToken = typeof sessionStorage !== 'undefined' ? sessionStorage.getItem('nxtgauge_admin_access_token') || '' : ''; const r = await fetch('/api/admin/companies', { headers: { Accept: 'application/json', ...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}), }, credentials: 'include', }); if (!r.ok) throw new Error('Failed to fetch companies'); const data = await r.json().catch(() => []); const mapped: CompanyRecord[] = (Array.isArray(data) ? data : []).map((c: any) => { const joinedAt = String(c.created_at || ''); const status = normalizeStatus(c.status); return { id: String(c.id || ''), companyCode: String(c.id || '').slice(0, 8).toUpperCase() || '—', name: String(c.company_name || c.name || 'Unnamed Company'), registrationNumber: String(c.registration_number || c.gst_number || 'Pending Registration'), industry: String(c.industry || 'Not Specified'), location: String(c.location || c.city || 'Not Specified'), joinedOn: joinedAt ? new Date(joinedAt).toLocaleDateString() : '—', joinedAt, accountStatus: status, verificationStatus: status === 'ACTIVE' ? 'VERIFIED' : 'PENDING', subscriptionType: String(c.subscription_type || 'STANDARD'), jobPostingsCount: Number(c.job_postings_count || 0), totalHires: Number(c.total_hires || 0), updatedAt: String(c.updated_at || c.created_at || ''), }; }); setRows(mapped); } catch (e) { console.error(e); setLoadError('Failed to load companies.'); setRows([]); } finally { setIsLoading(false); } }; onMount(() => void load()); const filteredRows = createMemo(() => { let list = rows(); if (statusFilter() !== 'all') list = list.filter((row) => row.accountStatus === statusFilter()); const query = search().trim().toLowerCase(); if (query) { list = list.filter((row) => row.name.toLowerCase().includes(query) || row.companyCode.toLowerCase().includes(query) || row.registrationNumber.toLowerCase().includes(query) || row.industry.toLowerCase().includes(query), ); } const sorted = [...list]; const mode = sortBy(); sorted.sort((a, b) => { if (mode === 'name_desc') return b.name.localeCompare(a.name); if (mode === 'joined_desc') return (Date.parse(b.joinedAt) || 0) - (Date.parse(a.joinedAt) || 0); if (mode === 'joined_asc') return (Date.parse(a.joinedAt) || 0) - (Date.parse(b.joinedAt) || 0); return a.name.localeCompare(b.name); }); return sorted; }); const exportCsv = () => { const headers = ['Company', 'Code', 'Industry', 'Location', 'Registration', 'Status', 'Joined']; const lines = filteredRows().map((c) => [ c.name, c.companyCode, c.industry, c.location, c.registrationNumber, c.accountStatus, c.joinedOn, ]); const csv = [headers, ...lines] .map((line) => line.map((cell) => `"${String(cell).replace(/"/g, '""')}"`).join(',')) .join('\n'); const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = `companies-${new Date().toISOString().slice(0, 10)}.csv`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }; const openView = (company: CompanyRecord) => { setSelectedCompany(company); setListTab('view'); setOpenMenuId(null); }; return (

Company Management

Manage and monitor all registered companies and their account status.

{([ { key: 'all', label: 'All Companies', action: () => { setListTab('all'); setStatusFilter('all'); } }, { key: 'active', label: 'Active', action: () => { setListTab('active'); setStatusFilter('ACTIVE'); } }, { key: 'pending', label: 'Pending', action: () => { setListTab('pending'); setStatusFilter('PENDING'); } }, { key: 'view', label: 'View Company', action: () => setListTab('view') }, ] as const).map((tab) => ( ))}

No company selected

Click the menu on any company row and choose View Company.

{selectedCompany()!.name}

{selectedCompany()!.companyCode} • Joined {selectedCompany()!.joinedOn}

{(['overview', 'verification', 'metrics'] as const).map((tab, i) => { const labels = ['Overview', 'Verification', 'Metrics']; const active = () => detailTab() === tab; return ( ); })}

Company Profile

{[ { l: 'Industry', v: selectedCompany()!.industry }, { l: 'Location', v: selectedCompany()!.location }, { l: 'Registration', v: selectedCompany()!.registrationNumber }, { l: 'Subscription', v: selectedCompany()!.subscriptionType }, ].map((item) => (
{item.l} {item.v || '—'}
))}

Verification Summary

{[ { l: 'Verification Status', v: selectedCompany()!.verificationStatus }, { l: 'Account Status', v: selectedCompany()!.accountStatus }, { l: 'Last Updated', v: selectedCompany()!.updatedAt ? new Date(selectedCompany()!.updatedAt).toLocaleString() : '—' }, ].map((item) => (
{item.l} {item.v || '—'}
))}

Performance Metrics

{[ { l: 'Job Postings', v: String(selectedCompany()!.jobPostingsCount || 0) }, { l: 'Total Hires', v: String(selectedCompany()!.totalHires || 0) }, ].map((item) => (
{item.l} {item.v}
))}
setSearch(e.currentTarget.value)} style="height:34px;flex:1;border-radius:8px;border:1px solid #E5E7EB;background:white;padding:0 12px;font-size:13px;color:#111827;outline:none" />
{([ { key: 'name_asc', label: 'Name (A-Z)' }, { key: 'name_desc', label: 'Name (Z-A)' }, { key: 'joined_desc', label: 'Joined (Newest)' }, { key: 'joined_asc', label: 'Joined (Oldest)' }, ] as const).map((item) => ( ))}
{([ { key: 'all', label: 'All Status' }, { key: 'ACTIVE', label: 'Active' }, { key: 'PENDING', label: 'Pending' }, { key: 'SUSPENDED', label: 'Suspended' }, { key: 'INACTIVE', label: 'Inactive' }, ] as const).map((item) => ( ))}
{['Company', 'Industry', 'Location', 'Status', 'Joined', 'Actions'].map((h) => ( ))} 0} fallback={ } > {(row) => ( )}
{h}
Loading...
{loadError()}

No companies found

Try changing filters or search.

{row.name}

{row.companyCode}

{row.industry} {row.location} {row.joinedOn}
0}>

Showing 1–{filteredRows().length} of{' '} {filteredRows().length} companies

); }