diff --git a/.claude/launch.json b/.claude/launch.json index 20f4eca..15aacd8 100644 --- a/.claude/launch.json +++ b/.claude/launch.json @@ -4,8 +4,8 @@ { "name": "admin-solid", "runtimeExecutable": "sh", - "runtimeArgs": ["-c", "cd /Users/ashwin/workspace/nxtgauge-admin-solid && npm run dev"], - "port": 3020 + "runtimeArgs": ["-c", "cd /Users/ashwin/workspace/nxtgauge-admin-solid && npm run dev -- --port 3000"], + "port": 3000 } ] } diff --git a/src/components/AdminShell.tsx b/src/components/AdminShell.tsx index b20f82c..3260992 100644 --- a/src/components/AdminShell.tsx +++ b/src/components/AdminShell.tsx @@ -142,7 +142,7 @@ function GlobalSearch() { onInput={(e) => handleInput(e.currentTarget.value)} onFocus={() => groups().length > 0 && setOpen(true)} onKeyDown={(e) => e.key === 'Escape' && close()} - class="h-[58px] w-full rounded-2xl border-2 border-transparent bg-[#f4f5f8] pl-[52px] pr-4 text-[16px] text-[#000032] placeholder:text-[rgba(0,0,50,0.4)] outline-none transition-all focus:border-[#e5e7eb] focus:bg-white" + class="h-[58px] w-full rounded-2xl border-2 border-transparent bg-[#f4f5f8] pl-[52px] pr-4 text-[16px] text-[#0D0D2A] placeholder:text-[rgba(13,13,42,0.4)] outline-none transition-all focus:border-[#e5e7eb] focus:bg-white" /> 0}> @@ -152,18 +152,18 @@ function GlobalSearch() {
{group.label} - View all + View all
{(item) => ( -
+
{item.title.trim().slice(0, 1).toUpperCase()}
-

{item.title}

-

{item.subtitle}

+

{item.title}

+

{item.subtitle}

)} @@ -176,7 +176,7 @@ function GlobalSearch() { = 2 && groups().length === 0}> -
+
No results for "{query()}"
@@ -201,7 +201,7 @@ function ShowTabs(props: { ref={(el) => props.setTabRefs((prev) => ({ ...prev, [tab.href]: el }))} aria-current={props.isTabActive(tab) ? 'page' : undefined} class={`px-4 pb-3 pt-3 text-[14px] font-semibold transition-colors ${ - props.isTabActive(tab) ? 'text-[#fa5014]' : 'text-[rgba(0,0,50,0.6)] hover:text-[#000032]' + props.isTabActive(tab) ? 'text-[#FF5E13]' : 'text-[rgba(13,13,42,0.6)] hover:text-[#0D0D2A]' }`} > {tab.label} @@ -209,7 +209,7 @@ function ShowTabs(props: { )}
@@ -314,16 +314,11 @@ export default function AdminShell(props: { children: JSX.Element }) { return `${parts[0][0]}${parts[1][0]}`.toUpperCase(); }); - const figmaShellMode = createMemo(() => - location.pathname === '/admin/department' || - location.pathname === '/admin/designation', - ); - return ( -
+
Checking session…
} + fallback={
Checking session…
} >
setSidebarOpen(false)} /> @@ -335,7 +330,6 @@ export default function AdminShell(props: { children: JSX.Element }) { onNavigate={() => setSidebarOpen(false)} adminName={adminName()} adminInitials={adminInitials()} - variant={figmaShellMode() ? 'figma' : 'default'} />
@@ -344,21 +338,21 @@ export default function AdminShell(props: { children: JSX.Element }) {
- -
-
@@ -369,7 +363,7 @@ export default function AdminShell(props: { children: JSX.Element }) {
-
+
{props.children}
diff --git a/src/components/admin/AdminUi.tsx b/src/components/admin/AdminUi.tsx index f0e4afe..af82edd 100644 --- a/src/components/admin/AdminUi.tsx +++ b/src/components/admin/AdminUi.tsx @@ -10,7 +10,7 @@ export function PageHeader(props: { title: string; subtitle: string; actions?: J return (
-

{props.title}

+

{props.title}

{props.subtitle}

@@ -35,7 +35,7 @@ export function MetricCards(props: { items: Metric[] }) { ? 'text-[#b1720c]' : item.tone === 'critical' ? 'text-[#b51f40]' - : 'text-[#050026]' + : 'text-[#0D0D2A]' }`} > {item.value} @@ -52,7 +52,7 @@ export function SectionCard(props: { title: string; subtitle?: string; actions?:
-

{props.title}

+

{props.title}

{props.subtitle}

@@ -74,7 +74,7 @@ export function Tabs(props: { value: T; onChange: (key: T) =>

Requirement
Approvals

-

{summary().requirements || 0}

+

{summary().requirements || 0}

Document
Reviews

@@ -783,13 +783,13 @@ export default function ApprovalPage() { placeholder="Search requester, email..." value={search()} onInput={(e) => { setSearch(e.currentTarget.value); setCurrentPage(1); }} - class="h-11 w-full rounded-xl border border-[#d9dde6] bg-[#f9fafb] pl-11 pr-4 text-[14px] text-[#050026] outline-none transition-colors focus:border-[#050026] focus:bg-white" + class="h-11 w-full rounded-xl border border-[#d9dde6] bg-[#f9fafb] pl-11 pr-4 text-[14px] text-[#0D0D2A] outline-none transition-colors focus:border-[#0D0D2A] focus:bg-white" />
@@ -798,9 +798,9 @@ export default function ApprovalPage() { type="checkbox" checked={docRequestedOnly()} onChange={(e) => { setDocRequestedOnly(e.currentTarget.checked); setCurrentPage(1); }} - class="h-4 w-4 rounded border-[#d9dde6] text-[#050026]" + class="h-4 w-4 rounded border-[#d9dde6] text-[#0D0D2A]" /> - Docs Requested Only + Docs Requested Only
@@ -864,7 +864,7 @@ export default function ApprovalPage() {
@@ -942,28 +942,28 @@ export default function ApprovalPage() {
-
-

New Approval Rule

+

New Approval Rule

- + setNewRuleName(e.currentTarget.value)} placeholder="e.g. Profile Approval by Admin" />
- +
- +
- +
- -
@@ -1024,7 +1024,7 @@ export default function ApprovalPage() { {(rule) => ( - {rule.name || '—'} + {rule.name || '—'} {rule.entityType || rule.entity_type || '—'} {rule.approverType || rule.approver_type || '—'} {rule.priority ?? '—'} @@ -1081,11 +1081,11 @@ function ApprovalDetailPanel(props: { }>
-

Approval Detail

+

Approval Detail

{a()!._typeLabel || 'Request'}

-
-
-
- - ); +// Layout wrapper — actual pages are in employees/index.tsx and employees/create.tsx +export default function EmployeesLayout() { + return ; } diff --git a/src/routes/admin/employees/create.tsx b/src/routes/admin/employees/create.tsx index cca7af6..a54d28c 100644 --- a/src/routes/admin/employees/create.tsx +++ b/src/routes/admin/employees/create.tsx @@ -1,5 +1,221 @@ -import EmployeesPage from '~/routes/admin/employees'; +import { A, useNavigate } from '@solidjs/router'; +import { createResource, createSignal, For } from 'solid-js'; +import AdminShell from '~/components/AdminShell'; + +const API = '/api/gateway'; + +type Role = { id: string; name: string }; +type Dept = { id: string; name: string }; +type Desig = { id: string; name: string }; + +async function fetchRoles(): Promise { + try { + const res = await fetch(`${API}/api/admin/roles?audience=INTERNAL`); + if (!res.ok) throw new Error(); + const data = await res.json(); + return Array.isArray(data) ? data : (data.roles ?? []); + } catch { return []; } +} +async function fetchDepts(): Promise { + try { + const res = await fetch(`${API}/api/admin/departments`); + if (!res.ok) throw new Error(); + const data = await res.json(); + return Array.isArray(data) ? data : (data.departments ?? []); + } catch { return []; } +} +async function fetchDesigs(): Promise { + try { + const res = await fetch(`${API}/api/admin/designations`); + if (!res.ok) throw new Error(); + const data = await res.json(); + return Array.isArray(data) ? data : (data.designations ?? []); + } catch { return []; } +} export default function CreateEmployeePage() { - return ; + const navigate = useNavigate(); + const [roles] = createResource(fetchRoles); + const [depts] = createResource(fetchDepts); + const [desigs] = createResource(fetchDesigs); + + const [fullName, setFullName] = createSignal(''); + const [email, setEmail] = createSignal(''); + const [roleId, setRoleId] = createSignal(''); + const [deptId, setDeptId] = createSignal(''); + const [desigId, setDesigId] = createSignal(''); + const [saving, setSaving] = createSignal(false); + const [error, setError] = createSignal(''); + + const handleSave = async (e: Event) => { + e.preventDefault(); + if (!fullName().trim()) { setError('Full name is required'); return; } + if (!email().trim()) { setError('Email is required'); return; } + if (!roleId()) { setError('Internal role is required'); return; } + if (!deptId()) { setError('Department is required'); return; } + if (!desigId()) { setError('Designation is required'); return; } + setError(''); setSaving(true); + try { + const res = await fetch(`${API}/api/admin/employees`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + full_name: fullName().trim(), + email: email().trim(), + role_id: roleId(), + department_id: deptId(), + designation_id: desigId(), + }), + }); + if (!res.ok) { + const body = await res.json().catch(() => ({})); + throw new Error((body as any).message || 'Failed to create employee'); + } + navigate('/admin/employees'); + } catch (err: any) { + setError(err.message || 'Failed to create employee'); + } finally { + setSaving(false); + } + }; + + return ( + +
+ + {/* Page header */} +
+
+

Internal Team

+

Add Employee

+

Dashboard / Employee Management / Add Employee

+
+ + ← Back to Employees + +
+ + {/* Form card */} +
+
+

Employee Details

+

Login credentials will be emailed to the employee automatically.

+
+ +
+
+ + {/* Full Name */} +
+ + setFullName(e.currentTarget.value)} + maxlength="100" + class="w-full px-3 py-2.5 text-[13px] border border-[#E5E7EB] rounded-lg outline-none focus:border-[#FF5E13] focus:ring-1 focus:ring-[#FF5E13] text-[#111827] placeholder-[#9CA3AF]" + /> +
+ + {/* Email */} +
+ + setEmail(e.currentTarget.value)} + class="w-full px-3 py-2.5 text-[13px] border border-[#E5E7EB] rounded-lg outline-none focus:border-[#FF5E13] focus:ring-1 focus:ring-[#FF5E13] text-[#111827] placeholder-[#9CA3AF]" + /> +
+ + {/* Internal Role */} +
+ + +
+ + {/* Department */} +
+ + +
+ + {/* Designation */} +
+ + +
+ +
+ + {/* Info note */} +
+ Login credentials will be auto-generated and sent to the employee's email address. +
+ + {/* Error */} + {error() && ( +
{error()}
+ )} + + {/* Footer */} +
+ + Cancel + + +
+
+
+ +
+
+ ); } diff --git a/src/routes/admin/employees/index.tsx b/src/routes/admin/employees/index.tsx new file mode 100644 index 0000000..76a8074 --- /dev/null +++ b/src/routes/admin/employees/index.tsx @@ -0,0 +1,335 @@ +import { A, useNavigate } from '@solidjs/router'; +import { createResource, createSignal, For, Show } from 'solid-js'; +import { Users, UserCheck, UserX, UserMinus, MoreVertical, Search, Plus, Trash2 } from 'lucide-solid'; +import AdminShell from '~/components/AdminShell'; + +const API = '/api/gateway'; + +type Employee = { + id: string; + full_name?: string; + name?: string; + email: string; + role?: { id: string; name: string } | string; + role_name?: string; + department?: { id: string; name: string } | string; + department_name?: string; + designation?: { id: string; name: string } | string; + designation_name?: string; + is_active?: boolean; + status?: string; + created_at?: string; + joining_date?: string; +}; + +const FALLBACK: Employee[] = [ + { id: 'e1', full_name: 'Arjun Sharma', email: 'arjun@nxtgauge.com', role: { id: 'r1', name: 'Super Admin' }, department: { id: 'd1', name: 'Engineering' }, designation: { id: 'dg1', name: 'Senior Engineer' }, is_active: true, created_at: '2023-01-15T00:00:00Z' }, + { id: 'e2', full_name: 'Priya Nair', email: 'priya@nxtgauge.com', role: { id: 'r2', name: 'Admin' }, department: { id: 'd2', name: 'Operations' }, designation: { id: 'dg2', name: 'Operations Lead' }, is_active: true, created_at: '2023-04-02T00:00:00Z' }, + { id: 'e3', full_name: 'Rohan Mehra', email: 'rohan@nxtgauge.com', role: { id: 'r3', name: 'Support Agent' }, department: { id: 'd3', name: 'Support' }, designation: { id: 'dg3', name: 'Support Executive' }, is_active: false, created_at: '2023-08-20T00:00:00Z' }, + { id: 'e4', full_name: 'Divya Kapoor', email: 'divya@nxtgauge.com', role: { id: 'r2', name: 'Admin' }, department: { id: 'd4', name: 'Marketing' }, designation: { id: 'dg4', name: 'Marketing Manager' }, is_active: true, created_at: '2024-01-10T00:00:00Z' }, +]; + +async function fetchEmployees(): Promise { + try { + const res = await fetch(`${API}/api/admin/employees`); + if (!res.ok) throw new Error(); + const data = await res.json(); + const list = Array.isArray(data) ? data : (data.employees ?? data.users ?? []); + return list.length > 0 ? list : FALLBACK; + } catch { + return FALLBACK; + } +} + +function empName(e: Employee) { return e.full_name || e.name || '—'; } +function empRole(e: Employee) { + if (!e.role) return e.role_name ?? '—'; + if (typeof e.role === 'string') return e.role; + return e.role.name ?? '—'; +} +function empDept(e: Employee) { + if (!e.department) return e.department_name ?? '—'; + if (typeof e.department === 'string') return e.department; + return e.department.name ?? '—'; +} +function empDesig(e: Employee) { + if (!e.designation) return e.designation_name ?? '—'; + if (typeof e.designation === 'string') return e.designation; + return e.designation.name ?? '—'; +} +function empActive(e: Employee) { + if (e.is_active !== undefined) return e.is_active; + return String(e.status ?? '').toUpperCase() === 'ACTIVE'; +} +function fmtDate(d?: string) { + if (!d) return '—'; + try { return new Date(d).toLocaleDateString('en-IN', { day: '2-digit', month: 'short', year: 'numeric' }); } + catch { return d; } +} +function initials(name: string) { + return name.split(' ').map(w => w[0]).join('').slice(0, 2).toUpperCase(); +} + +function StatusBadge(props: { active: boolean }) { + return ( + + + {props.active ? 'Active' : 'Inactive'} + + ); +} + +export default function EmployeesIndexPage() { + const navigate = useNavigate(); + const [employees, { refetch }] = createResource(fetchEmployees); + const [search, setSearch] = createSignal(''); + const [filterStatus, setFilterStatus] = createSignal('all'); + const [openMenu, setOpenMenu] = createSignal(''); + const [toggling, setToggling] = createSignal(''); + const [deleting, setDeleting] = createSignal(''); + + const filtered = () => { + const list = employees() ?? []; + const q = search().toLowerCase(); + return list.filter(e => { + const matchQ = !q || empName(e).toLowerCase().includes(q) || e.email.toLowerCase().includes(q) || empDept(e).toLowerCase().includes(q); + const active = empActive(e); + const matchS = filterStatus() === 'all' || (filterStatus() === 'active' && active) || (filterStatus() === 'inactive' && !active); + return matchQ && matchS; + }); + }; + + const stats = () => { + const list = employees() ?? []; + const active = list.filter(e => empActive(e)).length; + return { total: list.length, active, inactive: list.length - active }; + }; + + const handleToggle = async (id: string, current: boolean) => { + setToggling(id); setOpenMenu(''); + try { + await fetch(`${API}/api/admin/employees/${id}`, { + method: 'PATCH', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ is_active: !current }), + }); + refetch(); + } catch {} + finally { setToggling(''); } + }; + + const handleDelete = async (id: string, name: string) => { + if (!confirm(`Delete employee "${name}"? This cannot be undone.`)) { setOpenMenu(''); return; } + setDeleting(id); setOpenMenu(''); + try { + await fetch(`${API}/api/admin/employees/${id}`, { method: 'DELETE' }); + refetch(); + } catch {} + finally { setDeleting(''); } + }; + + return ( + +
+ + {/* Page header */} +
+
+

Internal Team

+

Employee Management

+

Dashboard / Employee Management

+
+ + + Add Employee + +
+ + {/* Stat cards */} +
+ {([ + { label: 'Total Employees', value: () => stats().total, Icon: Users, bg: 'bg-[#FFF1EB]', color: 'text-[#FF5E13]' }, + { label: 'Active', value: () => stats().active, Icon: UserCheck, bg: 'bg-[#ECFDF5]', color: 'text-[#059669]' }, + { label: 'Inactive', value: () => stats().inactive, Icon: UserX, bg: 'bg-[#FEF2F2]', color: 'text-[#DC2626]' }, + { label: 'On Leave Today', value: () => 0, Icon: UserMinus, bg: 'bg-[#EFF6FF]', color: 'text-[#2563EB]' }, + ] as const).map(s => ( +
+
+
+

{s.label}

+

{s.value()}

+
+
+ +
+
+
+ ))} +
+ + {/* Table card */} +
+ + {/* Toolbar */} +
+
+ + setSearch(e.currentTarget.value)} + class="h-[36px] w-full rounded-lg border border-[#E5E7EB] bg-[#F9FAFB] pl-9 pr-3 text-[13px] text-[#111827] outline-none focus:border-[#FF5E13] focus:ring-1 focus:ring-[#FF5E13] placeholder-[#9CA3AF]" + /> +
+ +

{filtered().length} employee{filtered().length !== 1 ? 's' : ''}

+
+ + {/* Table */} +
+ + + + {['Employee', 'Department', 'Designation', 'Internal Role', 'Joined', 'Status', 'Actions'].map((h, i) => ( + + ))} + + + + + {/* Skeleton */} + + + {() => ( + + + + + + + + + )} + + + + {/* Empty */} + + + + + + + {/* Rows */} + + {(emp) => { + const active = () => empActive(emp); + const name = empName(emp); + return ( + + + + + + + + + + ); + }} + + +
{h}
+
+
+
+
+
+
+
+
+
+
+ +

No employees found

+

Try adjusting filters or add a new employee.

+
+
+
+
+ {initials(name)} +
+
+

{name}

+

{emp.email}

+
+
+
{empDept(emp)}{empDesig(emp)}{empRole(emp)}{fmtDate(emp.joining_date || emp.created_at)} + + +
+
+ + +
+ + +
+ +
+ +
+
+
+
+
+ + {/* Overlay to close dropdown */} + +
setOpenMenu('')} /> + + +
+ + ); +} diff --git a/src/routes/admin/external-dashboard-management/index.tsx b/src/routes/admin/external-dashboard-management/index.tsx index 0e10a3c..648f9f4 100644 --- a/src/routes/admin/external-dashboard-management/index.tsx +++ b/src/routes/admin/external-dashboard-management/index.tsx @@ -138,7 +138,7 @@ function renderModuleContent(module: Module | null) { {[['Open Items', '18'], ['Pending', '6'], ['Completed', '12']].map(([label, val]) => (

{label}

-

{val}

+

{val}

))}
@@ -178,7 +178,7 @@ function ExternalDashboardPreview(props: { dashboard: Dashboard }) {
-

{props.dashboard.title}

+

{props.dashboard.title}

{props.dashboard.roleKey}

A
@@ -197,7 +197,7 @@ function ExternalDashboardPreview(props: { dashboard: Dashboard }) {

Workspace Preview

-

{selectedLabel()}

+

{selectedLabel()}

{selectedModule()?.summary || props.dashboard.description || 'Preview the external dashboard experience here.'}

{renderModuleContent(selectedModule())}
@@ -460,14 +460,14 @@ export default function ExternalDashboardManagementPage() { {/* Header & Title */}
-

External Dashboard Management

+

External Dashboard Management

Configure dashboards for external role members

- -
@@ -477,7 +477,7 @@ export default function ExternalDashboardManagementPage() {

Total Dashboard
Templates

-

12

+

12

Active Templates

@@ -502,15 +502,15 @@ export default function ExternalDashboardManagementPage() {
{/* Table Action Header */}
-

External Dashboard
Templates

+

External Dashboard
Templates

- - -
@@ -532,7 +532,7 @@ export default function ExternalDashboardManagementPage() {
@@ -543,7 +543,7 @@ export default function ExternalDashboardManagementPage() {
- + @@ -561,7 +561,7 @@ export default function ExternalDashboardManagementPage() { {(d) => ( void openDashboard(d.id)}> - + diff --git a/src/routes/admin/internal-dashboard-management/index.tsx b/src/routes/admin/internal-dashboard-management/index.tsx index 7542d74..f9a1d07 100644 --- a/src/routes/admin/internal-dashboard-management/index.tsx +++ b/src/routes/admin/internal-dashboard-management/index.tsx @@ -79,7 +79,7 @@ function PreviewSection(props: { section: Section }) { const activeTab = createMemo(() => props.section.tabs.find((t) => t.id === activeTabId()) || props.section.tabs[0] || null); return (
-
{props.section.title}
+
{props.section.title}

Preview tabs, fields, and widgets.

0}>
@@ -133,7 +133,7 @@ function DashboardPreview(props: { dashboard: Dashboard }) {
-

{props.dashboard.title}

+

{props.dashboard.title}

{props.dashboard.roleName}

@@ -158,7 +158,7 @@ function DashboardPreview(props: { dashboard: Dashboard }) {

Dashboard Preview

-

{selectedLabel()}

+

{selectedLabel()}

{props.dashboard.description || 'Preview of the internal dashboard layout.'}

{(section) => } @@ -419,14 +419,14 @@ export default function InternalDashboardManagementPage() { {/* Header & Title */}
-

Internal Dashboard Management

+

Internal Dashboard Management

Configure dashboards for internal staff members

- -
@@ -436,7 +436,7 @@ export default function InternalDashboardManagementPage() {

Total Dashboard
Templates

-

18

+

18

Active Templates

@@ -461,15 +461,15 @@ export default function InternalDashboardManagementPage() {
{/* Table Action Header */}
-

Internal Dashboard
Templates

+

Internal Dashboard
Templates

- - -
@@ -491,7 +491,7 @@ export default function InternalDashboardManagementPage() {
@@ -502,7 +502,7 @@ export default function InternalDashboardManagementPage() {
ROLE KEY DASHBOARD NAME MODULES COUNT
{d.roleKey || 'No role selected'}{d.roleKey || 'No role selected'} {d.title} {d.modules.length} pages v{d.version}
- + @@ -521,7 +521,7 @@ export default function InternalDashboardManagementPage() { {(d) => ( void openDashboard(d.id)}> - + diff --git a/src/routes/admin/onboarding-schemas/index.tsx b/src/routes/admin/onboarding-schemas/index.tsx index 6ecfdcd..5d29b83 100644 --- a/src/routes/admin/onboarding-schemas/index.tsx +++ b/src/routes/admin/onboarding-schemas/index.tsx @@ -145,7 +145,7 @@ export default function OnboardingSchemasPage() {

Draft
Workflows

-

{schemas.loading ? '—' : draftFlows()}

+

{schemas.loading ? '—' : draftFlows()}

Role Types
Configured

@@ -218,7 +218,7 @@ export default function OnboardingSchemasPage() {
diff --git a/src/routes/admin/roles/[id]/edit.tsx b/src/routes/admin/roles/[id]/edit.tsx index 0aa488c..6d4de0c 100644 --- a/src/routes/admin/roles/[id]/edit.tsx +++ b/src/routes/admin/roles/[id]/edit.tsx @@ -203,8 +203,8 @@ export default function EditInternalRolePage() { {/* Page title */}
-

Internal Role Management

-

Manage internal roles and permissions

+

Internal Role Management

+

Manage internal roles and permissions

@@ -214,7 +214,7 @@ export default function EditInternalRolePage() {
All Roles @@ -225,7 +225,7 @@ export default function EditInternalRolePage() {
-
Loading…
+
Loading…
@@ -242,13 +242,13 @@ export default function EditInternalRolePage() { onClick={() => setSubTab(t.key)} class={`relative py-3.5 text-[13px] font-medium transition-colors ${ subTab() === t.key - ? 'text-[#000032] font-semibold' - : 'text-[rgba(0,0,50,0.5)] hover:text-[#000032]' + ? 'text-[#0D0D2A] font-semibold' + : 'text-[rgba(13,13,42,0.5)] hover:text-[#0D0D2A]' }`} > {t.label} - + ))} @@ -266,7 +266,7 @@ export default function EditInternalRolePage() {
-
-
- +
- +
DASHBOARD NAME ASSIGNED DEPARTMENT ASSIGNED DESIGNATION
{d.title}{d.title} Administration Super Admin {d.roleName || 'Unassigned'} v{schema.version} - + {schema.status === 'PUBLISHED' ? 'Published' : 'Draft'}