import { A } from '@solidjs/router'; import { createResource, createSignal, createMemo, Show, For } from 'solid-js'; import AdminShell from '~/components/AdminShell'; const API = '/api/gateway'; type Department = { id: string; name?: string; departmentName?: string; }; type Designation = { id: string; name: string; departmentId?: string; departmentName?: string; department?: string; description?: string; is_archived?: boolean; status?: string; }; async function loadDesignations(): Promise { try { const res = await fetch(`${API}/api/admin/designations`); if (!res.ok) throw new Error('Failed to load'); const data = await res.json(); return Array.isArray(data) ? data : (data.designations ?? []); } catch { return []; } } async function loadDepartments(): Promise { try { const res = await fetch(`${API}/api/admin/departments`); if (!res.ok) throw new Error('Failed to load'); const data = await res.json(); return Array.isArray(data) ? data : (data.departments ?? []); } catch { return []; } } function deptDisplay(item: Designation): string { return item.departmentName || item.department || '—'; } function deptName(d: Department): string { return d.departmentName || d.name || d.id; } function isArchived(item: Designation): boolean { if (item.is_archived !== undefined) return item.is_archived; if (item.status !== undefined) { const s = String(item.status).toUpperCase(); return s === 'ARCHIVED' || s === '2'; } return false; } export default function DesignationPage() { const [designations, { refetch }] = createResource(loadDesignations); const [departments] = createResource(loadDepartments); // tabs const [tab, setTab] = createSignal<'active' | 'archived'>('active'); // create form const [showCreate, setShowCreate] = createSignal(false); const [createName, setCreateName] = createSignal(''); const [createDeptId, setCreateDeptId] = createSignal(''); const [createDesc, setCreateDesc] = createSignal(''); const [creating, setCreating] = createSignal(false); const [createError, setCreateError] = createSignal(''); // inline edit const [editingId, setEditingId] = createSignal(''); const [editName, setEditName] = createSignal(''); const [editDeptId, setEditDeptId] = createSignal(''); const [editDesc, setEditDesc] = createSignal(''); const [saving, setSaving] = createSignal(false); const [editError, setEditError] = createSignal(''); // row busy / errors const [deleting, setDeleting] = createSignal(''); const [actionError, setActionError] = createSignal(''); const filtered = createMemo(() => { const all = designations() ?? []; return tab() === 'archived' ? all.filter((d) => isArchived(d)) : all.filter((d) => !isArchived(d)); }); // ---------- CREATE ---------- const handleCreate = async (e: Event) => { e.preventDefault(); if (!createName().trim() || !createDeptId()) return; setCreating(true); setCreateError(''); try { const res = await fetch(`${API}/api/admin/designations`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: createName().trim(), department_id: createDeptId(), description: createDesc().trim(), }), }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error((err as any).message || 'Failed to create'); } setCreateName(''); setCreateDeptId(''); setCreateDesc(''); setShowCreate(false); setTab('active'); refetch(); } catch (err: any) { setCreateError(err.message || 'Failed to create designation'); } finally { setCreating(false); } }; // ---------- INLINE EDIT ---------- const startEdit = (item: Designation) => { setEditingId(item.id); setEditName(item.name); setEditDeptId(item.departmentId ?? ''); setEditDesc(item.description ?? ''); setEditError(''); }; const cancelEdit = () => { setEditingId(''); setEditError(''); }; const handleUpdate = async (id: string) => { if (!editName().trim()) return; setSaving(true); setEditError(''); try { const res = await fetch(`${API}/api/admin/designations/${id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: editName().trim(), department_id: editDeptId(), description: editDesc().trim(), }), }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error((err as any).message || 'Failed to update'); } setEditingId(''); refetch(); } catch (err: any) { setEditError(err.message || 'Failed to update designation'); } finally { setSaving(false); } }; // ---------- DELETE ---------- const handleDelete = async (id: string, name: string) => { if (!confirm(`Delete designation "${name}"?`)) return; setDeleting(id); setActionError(''); try { const res = await fetch(`${API}/api/admin/designations/${id}`, { method: 'DELETE', }); if (!res.ok) throw new Error('Failed to delete'); refetch(); } catch (err: any) { setActionError(err.message || 'Failed to delete designation'); } finally { setDeleting(''); } }; return ( {/* Header */}

Designations

Manage job designations

{/* Create form */}
setCreateName(e.currentTarget.value)} />