Activate UIUX V2 navigation for System Admin

This commit is contained in:
A R R R Associates
2026-07-10 21:46:46 +05:30
parent 69b33fa486
commit 79eb45c675
3 changed files with 160 additions and 29 deletions
@@ -5,7 +5,7 @@
<div class="flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between">
<div>
<p class="text-xs font-semibold uppercase tracking-[0.24em] text-brand-600">Platform Control Centre</p>
<h1 class="mt-2 text-2xl font-bold text-slate-900">System Admin Dashboard V2</h1>
<h1 class="mt-2 text-2xl font-bold text-slate-900">System Administration Dashboard</h1>
<p class="mt-1 text-sm text-slate-500">Monitor firm readiness, catalogue health, SMTP, storage, billing readiness, reports, wizards and audit logs.</p>
</div>
<div class="flex flex-wrap gap-2">
@@ -14,6 +14,7 @@
<a href="/platform-billing" class="rounded-xl border border-slate-200 px-4 py-2 text-sm font-semibold text-slate-700 hover:bg-slate-50">Platform Billing</a>
</div>
</div>
</div>
{% set tabs = [
('overview', 'Overview'),
@@ -27,18 +28,38 @@
('wizards', 'Wizards'),
('audit-logs', 'Audit Logs')
] %}
<div class="mt-6 overflow-x-auto">
<div class="flex min-w-max gap-2 rounded-2xl bg-slate-100 p-1">
<div class="hidden rounded-3xl border border-slate-200 bg-white p-2 shadow-soft sm:block">
<div class="flex gap-2 overflow-x-auto" id="system-admin-dashboard-tabs">
{% for tab_key, tab_label in tabs %}
<a href="/system-admin/dashboard?tab={{ tab_key }}"
<button type="button"
data-dashboard-tab="{{ tab_key }}"
class="system-admin-tab rounded-xl px-4 py-2 text-sm font-semibold transition {% if active_tab == tab_key %}bg-white text-brand-700 shadow-soft{% else %}text-slate-600 hover:bg-white hover:text-slate-900{% endif %}">
class="system-admin-tab whitespace-nowrap rounded-2xl px-4 py-2 text-sm font-semibold transition {% if active_tab == tab_key %}bg-brand-600 text-white{% else %}text-slate-600 hover:bg-slate-100{% endif %}">
{{ tab_label }}
</a>
</button>
{% endfor %}
</div>
</div>
<details id="system-admin-mobile-menu" class="group overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-soft sm:hidden">
<summary class="flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-3 text-sm font-semibold text-slate-800">
<span class="inline-flex items-center gap-2">
<svg class="h-5 w-5 group-open:hidden" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path stroke-linecap="round" d="M4 6h16M4 12h16M4 18h16" /></svg>
<svg class="hidden h-5 w-5 group-open:block" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path stroke-linecap="round" d="M6 6l12 12M18 6 6 18" /></svg>
<span>Dashboard Menu</span>
</span>
<span class="text-xs font-medium text-slate-500">Platform dashboard sections</span>
</summary>
<div class="space-y-1 border-t border-slate-100 bg-slate-50/80 p-3">
{% for tab_key, tab_label in tabs %}
<button type="button"
data-dashboard-tab="{{ tab_key }}"
class="system-admin-tab block w-full rounded-xl px-3 py-2.5 text-left text-sm font-semibold transition {% if active_tab == tab_key %}bg-brand-600 text-white{% else %}bg-white text-slate-700 hover:bg-slate-100{% endif %}">
{{ tab_label }}
</button>
{% endfor %}
</div>
</details>
<div id="system-admin-dashboard-panel"
data-initial-tab="{{ active_tab }}"
@@ -56,10 +77,11 @@
function setActive(tabName) {
tabs.forEach((tab) => {
const active = tab.dataset.dashboardTab === tabName;
tab.classList.toggle('bg-white', active);
tab.classList.toggle('text-brand-700', active);
tab.classList.toggle('shadow-soft', active);
tab.classList.toggle('bg-brand-600', active);
tab.classList.toggle('text-white', active);
tab.classList.toggle('text-slate-600', !active);
tab.classList.toggle('bg-white', !active && tab.closest('#system-admin-mobile-menu'));
tab.classList.toggle('hover:bg-slate-100', !active);
});
}
@@ -77,14 +99,15 @@
url.searchParams.set('tab', tabName);
history.pushState({ tab: tabName }, '', url.toString());
}
const mobileMenu = document.getElementById('system-admin-mobile-menu');
if (mobileMenu) mobileMenu.open = false;
} catch (err) {
panel.innerHTML = '<div class="rounded-3xl border border-red-200 bg-red-50 p-6 text-sm text-red-700 shadow-soft">Unable to load this tab. Please refresh the page.</div>';
}
}
tabs.forEach((tab) => {
tab.addEventListener('click', function (event) {
event.preventDefault();
tab.addEventListener('click', function () {
loadTab(tab.dataset.dashboardTab, true);
});
});
+4 -1
View File
@@ -111,7 +111,7 @@
Sidebar is retained only for System Admin users.
All other authenticated users use the floating top workspace bar on every page.
Existing routes and old sidebar code are kept intact. #}
{% set use_clean_top_nav = full_auth and not is_system_admin_user %}
{% set use_clean_top_nav = full_auth %}
<div class="min-h-screen {% if not use_clean_top_nav %}lg:grid lg:grid-cols-[260px_minmax(0,1fr)]{% endif %}">
@@ -404,6 +404,9 @@
<div class="min-h-screen">
{% if use_clean_top_nav %}
{% include "ui/templates/components/top_workspace_bar.html" %}
{% if is_system_admin_user %}
{% include "ui/templates/components/system_admin_navigation_v2.html" %}
{% endif %}
{% else %}
<header class="border-b border-slate-200 bg-white/90 backdrop-blur">
<div class="mx-auto max-w-7xl px-4 py-4 sm:px-6 lg:px-8">
@@ -0,0 +1,105 @@
{#
UI/UX V2 Phase 1F — System Admin workspace navigation.
Presentation only. Existing routes and route-level permissions remain authoritative.
#}
{% set _system_admin_path = request.url.path %}
{% set navigation_aria_label_v2 = 'System administration navigation' %}
{% set navigation_items_v2 = [
{
'label': 'Dashboard',
'url': '/system-admin/dashboard',
'visible': true,
'active': _system_admin_path.startswith('/system-admin/dashboard')
},
{
'label': 'Firms',
'visible': true,
'active': _system_admin_path.startswith('/system-settings/tenants') or _system_admin_path.startswith('/system-settings/branches') or _system_admin_path.startswith('/wizards/system/firm'),
'children': [
{'label': 'Audit Firms', 'url': '/system-settings/tenants', 'active': _system_admin_path.startswith('/system-settings/tenants')},
{'label': 'Branches', 'url': '/system-settings/branches', 'active': _system_admin_path.startswith('/system-settings/branches')},
{'label': 'Create Firm Wizard', 'url': '/wizards/system/firm/new', 'active': _system_admin_path.startswith('/wizards/system/firm')}
]
},
{
'label': 'Catalogue',
'visible': true,
'active': _system_admin_path.startswith('/services/catalogue') or _system_admin_path.startswith('/services/categories') or _system_admin_path.startswith('/services/defaults') or _system_admin_path.startswith('/services/templates') or _system_admin_path.startswith('/services/bulk-imports'),
'children': [
{'label': 'Service Catalogue', 'url': '/services/catalogue', 'active': _system_admin_path == '/services/catalogue'},
{'label': 'Create Catalogue Service', 'url': '/services/catalogue/new', 'active': _system_admin_path.startswith('/services/catalogue/new')},
{'label': 'Service Categories', 'url': '/services/categories', 'active': _system_admin_path.startswith('/services/categories')},
{'label': 'System Default Tasks', 'url': '/services/defaults', 'active': _system_admin_path.startswith('/services/defaults')},
{'label': 'Task Templates', 'url': '/services/templates', 'active': _system_admin_path.startswith('/services/templates')},
{'label': 'Bulk Imports', 'url': '/services/bulk-imports', 'active': _system_admin_path.startswith('/services/bulk-imports')}
]
},
{
'label': 'Platform',
'visible': true,
'active': _system_admin_path.startswith('/domains') or _system_admin_path.startswith('/email/platform-smtp') or _system_admin_path.startswith('/platform-billing') or _system_admin_path.startswith('/marketplace'),
'children': [
{'label': 'Domain Mappings', 'url': '/domains', 'active': _system_admin_path == '/domains'},
{'label': 'Tenant Subdomains', 'url': '/domains/tenant-subdomains', 'active': _system_admin_path.startswith('/domains/tenant-subdomains')},
{'label': 'Firm Domains', 'url': '/domains/firm-domain', 'active': _system_admin_path.startswith('/domains/firm-domain')},
{'label': 'Consultant Domains', 'url': '/domains/consultant-domains', 'active': _system_admin_path.startswith('/domains/consultant-domains')},
{'label': 'DNS Verification', 'url': '/domains/verification', 'active': _system_admin_path.startswith('/domains/verification')},
{'label': 'SSL Status', 'url': '/domains/ssl', 'active': _system_admin_path.startswith('/domains/ssl')},
{'label': 'Platform SMTP', 'url': '/email/platform-smtp', 'active': _system_admin_path.startswith('/email/platform-smtp')},
{'label': 'Platform Billing', 'url': '/platform-billing', 'active': _system_admin_path.startswith('/platform-billing')},
{'label': 'Marketplace', 'url': '/marketplace', 'active': _system_admin_path.startswith('/marketplace')}
]
},
{
'label': 'Operations',
'visible': true,
'active': _system_admin_path.startswith('/documents/storage-nodes') or _system_admin_path.startswith('/documents/branch-storage-dashboard') or _system_admin_path.startswith('/documents/storage-jobs') or _system_admin_path.startswith('/documents/download-requests'),
'children': [
{'label': 'Storage Nodes', 'url': '/documents/storage-nodes', 'active': _system_admin_path.startswith('/documents/storage-nodes')},
{'label': 'Branch Storage Dashboard', 'url': '/documents/branch-storage-dashboard', 'active': _system_admin_path.startswith('/documents/branch-storage-dashboard')},
{'label': 'Storage Jobs', 'url': '/documents/storage-jobs', 'active': _system_admin_path.startswith('/documents/storage-jobs')},
{'label': 'Download Requests', 'url': '/documents/download-requests', 'active': _system_admin_path.startswith('/documents/download-requests')}
]
},
{
'label': 'Firm Operations',
'visible': true,
'active': _system_admin_path.startswith('/clients') or _system_admin_path.startswith('/services') or _system_admin_path.startswith('/employees') or _system_admin_path.startswith('/consultants') or _system_admin_path.startswith('/documents') or _system_admin_path.startswith('/billing') or _system_admin_path.startswith('/notice-cases'),
'children': [
{'label': 'Clients', 'url': '/clients', 'active': _system_admin_path.startswith('/clients')},
{'label': 'Firm Services', 'url': '/services', 'active': _system_admin_path == '/services'},
{'label': 'Engagements', 'url': '/services/engagements', 'active': _system_admin_path.startswith('/services/engagements')},
{'label': 'Employees', 'url': '/employees', 'active': _system_admin_path.startswith('/employees')},
{'label': 'Consultants', 'url': '/consultants', 'active': _system_admin_path.startswith('/consultants')},
{'label': 'Documents', 'url': '/documents', 'active': _system_admin_path == '/documents'},
{'label': 'Billing', 'url': '/billing', 'active': _system_admin_path.startswith('/billing')},
{'label': 'Notice & Cases', 'url': '/notice-cases', 'active': _system_admin_path.startswith('/notice-cases')}
]
},
{
'label': 'Administration',
'visible': true,
'active': _system_admin_path.startswith('/system-settings') or _system_admin_path.startswith('/email/settings'),
'children': [
{'label': 'Settings Dashboard', 'url': '/system-settings', 'active': _system_admin_path == '/system-settings'},
{'label': 'Users', 'url': '/system-settings/users', 'active': _system_admin_path.startswith('/system-settings/users')},
{'label': 'Roles & Permissions', 'url': '/system-settings/rbac/roles', 'active': _system_admin_path.startswith('/system-settings/rbac')},
{'label': 'Financial Years', 'url': '/system-settings/financial-years', 'active': _system_admin_path.startswith('/system-settings/financial-years')},
{'label': 'Branding', 'url': '/system-settings/branding', 'active': _system_admin_path.startswith('/system-settings/branding')},
{'label': 'Firm Email Settings', 'url': '/email/settings', 'active': _system_admin_path.startswith('/email/settings')},
{'label': 'Audit Logs', 'url': '/system-settings/audit-logs', 'active': _system_admin_path.startswith('/system-settings/audit-logs')}
]
},
{
'label': 'Alerts',
'url': '/alerts',
'visible': true,
'active': _system_admin_path.startswith('/alerts'),
'badge': unread_alert_count if unread_alert_count is defined and unread_alert_count > 0 else none
}
] %}
<div class="border-b border-slate-200 bg-white shadow-sm" data-uiux-v2-pilot="system-admin">
{% include "ui/templates/components/navigation_v2.html" %}
{% include "ui/templates/components/mobile_navigation_v2.html" %}
</div>