Add consultant dashboard ajax tabs v1

This commit is contained in:
A R R R Associates
2026-07-06 11:36:12 +05:30
parent dcb352d6c3
commit 4a2af8f9d1
9 changed files with 465 additions and 120 deletions
+102 -12
View File
@@ -1330,8 +1330,79 @@ async def consultant_profile_submit(request: Request, csrf_token: str = Form(...
db.close()
CONSULTANT_PORTAL_TABS = {
"overview": "modules/consultants/templates/consultants/portal_partials/overview.html",
"assigned-work": "modules/consultants/templates/consultants/portal_partials/assigned_work.html",
"clients": "modules/consultants/templates/consultants/portal_partials/clients.html",
"documents": "modules/consultants/templates/consultants/portal_partials/documents.html",
"clarifications": "modules/consultants/templates/consultants/portal_partials/clarifications.html",
"requests": "modules/consultants/templates/consultants/portal_partials/service_requests.html",
"reports": "modules/consultants/templates/consultants/portal_partials/reports.html",
}
def _consultant_empty_payload() -> dict:
return {
"links": [],
"active_links": [],
"comments": [],
"recent_firm_messages": [],
"recent_consultant_replies": [],
"managed_clients": [],
"workspace": None,
"workspace_alerts": [],
"service_requests": [],
"open_service_requests": [],
"pending_service_requests": [],
"conversion_requests": [],
"pending_conversions": [],
"due_items": [],
"overdue_items": [],
"workspace_summary": {
"workspace": None,
"managed_clients_used": 0,
"managed_clients_limit": None,
"managed_clients_remaining": None,
"usage_percent": 0,
},
"work_board": {"columns": {}, "column_options": [], "total_tasks": 0, "service_requests": []},
"document_centre": {"engagement_documents": [], "permanent_documents": [], "total": 0},
"stats": {
"linked_clients": 0,
"communication_enabled_clients": 0,
"due_date_enabled_clients": 0,
"pending_clarifications": 0,
"consultant_replies": 0,
"upcoming_due": 0,
"overdue": 0,
"open_service_requests": 0,
"pending_service_requests": 0,
"pending_conversions": 0,
"converted_clients": 0,
"managed_clients": 0,
"prospects": 0,
"referred_to_firm": 0,
},
}
def _build_consultant_portal_payload(db, consultant) -> dict:
payload = consultant_dashboard_payload(db, consultant=consultant)
try:
payload["work_board"] = get_consultant_work_board(db, consultant=consultant)
except Exception:
payload["work_board"] = {"columns": {}, "column_options": [], "total_tasks": 0, "service_requests": []}
try:
payload["document_centre"] = get_consultant_document_centre(db, consultant=consultant)
except Exception:
payload["document_centre"] = {"engagement_documents": [], "permanent_documents": [], "total": 0}
return payload
@portal_router.get("/dashboard")
def consultant_dashboard(request: Request):
def consultant_dashboard(request: Request, tab: str = "overview"):
db = CommonSessionLocal()
try:
user = get_current_user(request, db=db)
@@ -1341,17 +1412,8 @@ def consultant_dashboard(request: Request):
return _redirect_denied()
tenant_id = int(getattr(user, "tenant_id", 0) or 0)
consultant = get_consultant_by_user(db, tenant_id=tenant_id, user_id=user.id)
if not consultant:
return _render(
request,
"modules/consultants/templates/consultants/portal_dashboard.html",
db,
user,
title="Consultant Portal",
consultant=None,
payload={"links": [], "active_links": [], "comments": [], "managed_clients": [], "workspace": None, "workspace_summary": {"workspace": None, "managed_clients_used": 0, "managed_clients_limit": None, "managed_clients_remaining": None, "usage_percent": 0}, "stats": {"linked_clients": 0, "managed_clients": 0, "prospects": 0, "referred_to_firm": 0, "pending_clarifications": 0, "upcoming_due": 0, "overdue": 0}},
)
payload = consultant_dashboard_payload(db, consultant=consultant)
active_tab = tab if tab in CONSULTANT_PORTAL_TABS else "overview"
payload = _build_consultant_portal_payload(db, consultant) if consultant else _consultant_empty_payload()
return _render(
request,
"modules/consultants/templates/consultants/portal_dashboard.html",
@@ -1360,6 +1422,34 @@ def consultant_dashboard(request: Request):
title="Consultant Portal",
consultant=consultant,
payload=payload,
active_tab=active_tab,
)
finally:
db.close()
@portal_router.get("/dashboard/tab/{tab_name}")
def consultant_dashboard_tab(request: Request, tab_name: str):
db = CommonSessionLocal()
try:
user = get_current_user(request, db=db)
if not user:
return RedirectResponse(url="/login", status_code=303)
if not (_has_perm(db, user, "consultants.portal.view") or _is_consultant(db, user)):
return _redirect_denied()
tenant_id = int(getattr(user, "tenant_id", 0) or 0)
consultant = get_consultant_by_user(db, tenant_id=tenant_id, user_id=user.id)
active_tab = tab_name if tab_name in CONSULTANT_PORTAL_TABS else "overview"
payload = _build_consultant_portal_payload(db, consultant) if consultant else _consultant_empty_payload()
return _render(
request,
CONSULTANT_PORTAL_TABS[active_tab],
db,
user,
title="Consultant Portal",
consultant=consultant,
payload=payload,
active_tab=active_tab,
)
finally:
db.close()