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 class="flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between">
<div> <div>
<p class="text-xs font-semibold uppercase tracking-[0.24em] text-brand-600">Platform Control Centre</p> <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> <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>
<div class="flex flex-wrap gap-2"> <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> <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> </div>
</div>
{% set tabs = [ {% set tabs = [
('overview', 'Overview'), ('overview', 'Overview'),
@@ -27,18 +28,38 @@
('wizards', 'Wizards'), ('wizards', 'Wizards'),
('audit-logs', 'Audit Logs') ('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 %} {% for tab_key, tab_label in tabs %}
<a href="/system-admin/dashboard?tab={{ tab_key }}" <button type="button"
data-dashboard-tab="{{ tab_key }}" 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 }} {{ tab_label }}
</a> </button>
{% endfor %} {% endfor %}
</div> </div>
</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> </div>
</details>
<div id="system-admin-dashboard-panel" <div id="system-admin-dashboard-panel"
data-initial-tab="{{ active_tab }}" data-initial-tab="{{ active_tab }}"
@@ -56,10 +77,11 @@
function setActive(tabName) { function setActive(tabName) {
tabs.forEach((tab) => { tabs.forEach((tab) => {
const active = tab.dataset.dashboardTab === tabName; const active = tab.dataset.dashboardTab === tabName;
tab.classList.toggle('bg-white', active); tab.classList.toggle('bg-brand-600', active);
tab.classList.toggle('text-brand-700', active); tab.classList.toggle('text-white', active);
tab.classList.toggle('shadow-soft', active);
tab.classList.toggle('text-slate-600', !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); url.searchParams.set('tab', tabName);
history.pushState({ tab: tabName }, '', url.toString()); history.pushState({ tab: tabName }, '', url.toString());
} }
const mobileMenu = document.getElementById('system-admin-mobile-menu');
if (mobileMenu) mobileMenu.open = false;
} catch (err) { } 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>'; 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) => { tabs.forEach((tab) => {
tab.addEventListener('click', function (event) { tab.addEventListener('click', function () {
event.preventDefault();
loadTab(tab.dataset.dashboardTab, true); loadTab(tab.dataset.dashboardTab, true);
}); });
}); });
+4 -1
View File
@@ -111,7 +111,7 @@
Sidebar is retained only for System Admin users. Sidebar is retained only for System Admin users.
All other authenticated users use the floating top workspace bar on every page. All other authenticated users use the floating top workspace bar on every page.
Existing routes and old sidebar code are kept intact. #} 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 %}"> <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"> <div class="min-h-screen">
{% if use_clean_top_nav %} {% if use_clean_top_nav %}
{% include "ui/templates/components/top_workspace_bar.html" %} {% include "ui/templates/components/top_workspace_bar.html" %}
{% if is_system_admin_user %}
{% include "ui/templates/components/system_admin_navigation_v2.html" %}
{% endif %}
{% else %} {% else %}
<header class="border-b border-slate-200 bg-white/90 backdrop-blur"> <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"> <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>